package main
import (
"html/template"
"net/http"
"strconv"
)
var formTemplate = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Investment Calculator</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h1>Investment Calculator</h1>
<form method="post">
<div class="mb-3">
<label for="maas" class="form-label">Monthly Salary</label>
<input type="number" step="0.0001" class="form-control" id="maas" name="maas" value="{{.Maas}}" required>
</div>
<div class="mb-3">
<label for="yatirimOrani" class="form-label">Investment Ratio (as a decimal)</label>
<input type="number" step="0.0001" class="form-control" id="yatirimOrani" name="yatirimOrani" value="{{.YatirimOrani}}" required>
</div>
<div class="mb-3">
<label for="aylikFaizOrani" class="form-label">Monthly Interest Rate (as a decimal)</label>
<input type="number" step="0.0001" class="form-control" id="aylikFaizOrani" name="aylikFaizOrani" value="{{.AylikFaizOrani}}" required>
</div>
<div class="mb-3">
<label for="yillikZamOrani" class="form-label">Annual Raise Rate (as a decimal)</label>
<input type="number" step="0.0001" class="form-control" id="yillikZamOrani" name="yillikZamOrani" value="{{.YillikZamOrani}}" required>
</div>
<div class="mb-3">
<label for="hedefBakiye" class="form-label">Target Balance</label>
<input type="number" step="0.0001" class="form-control" id="hedefBakiye" name="hedefBakiye" value="{{.HedefBakiye}}" required>
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="mevcutBirikimVar" name="mevcutBirikimVar" {{if .MevcutBirikimVar}}checked{{end}}>
<label class="form-check-label" for="mevcutBirikimVar">Do you have existing savings?</label>
</div>
<div class="mb-3">
<label for="mevcutBirikim" class="form-label">Existing Savings</label>
<input type="number" step="0.0001" class="form-control" id="mevcutBirikim" name="mevcutBirikim" value="{{.MevcutBirikim}}">
</div>
<button type="submit" class="btn btn-primary">Calculate</button>
</form>
</div>
</body>
</html>
`
var resultTemplate = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Investment Result</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h1>Investment Result</h1>
<p>Total Savings: ${{printf "%.2f" .Total}}</p>
<p>Cost: ${{printf "%.2f" .Maliyet}}</p>
<p>Months: {{printf "%.0f" .Ay}}</p>
<p>Monthly Salary: ${{printf "%.0f" .Maas}}</p>
<p>Existing Savings: ${{printf "%.2f" .MevcutBirim}}</p>
<form action="/" method="get">
<button type="submit" class="btn btn-primary">New Calculation</button>
</form>
</div>
</body>
</html>
`
type FormData struct {
Maas float64
YatirimOrani float64
AylikFaizOrani float64
YillikZamOrani float64
HedefBakiye float64
MevcutBirikimVar bool
MevcutBirikim float64
}
var lastCalculation FormData
func getiriAylik(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
tmpl := template.Must(template.New("index").Parse(formTemplate))
tmpl.Execute(w, lastCalculation)
} else if r.Method == "POST" {
r.ParseForm()
maas, _ := strconv.ParseFloat(r.Form.Get("maas"), 64)
yatirimOrani, _ := strconv.ParseFloat(r.Form.Get("yatirimOrani"), 64)
aylikFaizOrani, _ := strconv.ParseFloat(r.Form.Get("aylikFaizOrani"), 64)
yillikZamOrani, _ := strconv.ParseFloat(r.Form.Get("yillikZamOrani"), 64)
hedefBakiye, _ := strconv.ParseFloat(r.Form.Get("hedefBakiye"), 64)
var mevcutBirikim float64
if r.Form.Get("mevcutBirikimVar") == "on" {
mevcutBirikim, _ = strconv.ParseFloat(r.Form.Get("mevcutBirikim"), 64)
}
var aylikYatirilan, total, ay, maliyet float64 = 0, mevcutBirikim, 0, 0
for total < hedefBakiye {
for i := 0; i < 12; i++ {
aylikYatirilan = maas * yatirimOrani
maliyet += aylikYatirilan
total = aylikYatirilan + (total * (1 + aylikFaizOrani))
ay++
if total > hedefBakiye {
break
}
}
maas = maas // Maaş artışı olmadığı için maaş değerini aynen kullanıyoruz.
aylikYatirilan = 0
}
lastCalculation = FormData{
Maas: maas, // Stringi doğrudan kullanıyoruz.
YatirimOrani: yatirimOrani,
AylikFaizOrani: aylikFaizOrani,
YillikZamOrani: yillikZamOrani,
HedefBakiye: hedefBakiye,
MevcutBirikimVar: r.Form.Get("mevcutBirikimVar") == "on",
MevcutBirikim: mevcutBirikim,
}
result := struct {
Total float64
Maliyet float64
Ay float64
Maas float64
MevcutBirim float64
}{
Total: total,
Maliyet: maliyet,
Ay: ay,
Maas: maas,
MevcutBirim: mevcutBirikim,
}
tmpl := template.Must(template.New("result").Parse(resultTemplate))
tmpl.Execute(w, result)
}
}
func main() {
http.HandleFunc("/", getiriAylik)
http.ListenAndServe(":8080", nil)
}
calıştırmak için
go run main.go