diff --git a/pkg/dashboard.go b/pkg/dashboard.go
index b1ff83c..bde7ae5 100644
--- a/pkg/dashboard.go
+++ b/pkg/dashboard.go
@@ -8,6 +8,7 @@ import (
"math"
"net/http"
"strings"
+ "time"
)
const (
@@ -60,7 +61,7 @@ func ServeDashboard(w http.ResponseWriter, r *http.Request, _ httprouter.Params)
conn := getConn(r)
dashboard := &DashboardPage{
Filters: filters,
- Chart: buildDashboardChart(r.Context(), conn, company, periodStart, periodEnd, filters.Period.Selected),
+ Chart: buildDashboardChart(r.Context(), conn, locale, company, periodStart, periodEnd, filters.Period.Selected),
}
rows := conn.MustQuery(r.Context(), fmt.Sprintf(`
select to_price(0, decimal_digits) as sales
@@ -173,17 +174,23 @@ func (form *dashboardFilterForm) Parse(r *http.Request) error {
return nil
}
-func buildDashboardChart(ctx context.Context, conn *Conn, company *Company, periodStart string, periodEnd string, selectedPeriod string) template.HTML {
+func buildDashboardChart(ctx context.Context, conn *Conn, locale *Locale, company *Company, periodStart string, periodEnd string, selectedPeriod string) template.HTML {
group := "yyyymmdd"
+ dateFormat := "02/01/2006"
switch selectedPeriod {
case YearPeriod, YesteryearPeriod:
group = "yyyymm"
+ dateFormat = "01/2006"
}
rows := conn.MustQuery(ctx, fmt.Sprintf(`
select date
- , 0 as sales
+ , to_date(date::text, '%[3]s')
+ , 0 as sales
+ , to_price(0, $2) as sales_price
, coalesce(invoice.total, 0) as income
+ , to_price(coalesce(invoice.total, 0), $2) as income_price
, coalesce(expense.total, 0) as expenses
+ , to_price(coalesce(expense.total, 0), $2) as expenses_price
from (
select to_char(date.invoice_date, '%[3]s')::integer as date
, sum(total)::integer as total
@@ -200,14 +207,18 @@ func buildDashboardChart(ctx context.Context, conn *Conn, company *Company, peri
group by date
) as expense using (date)
order by date
- `, periodStart, periodEnd, group), company.Id)
+ `, periodStart, periodEnd, group), company.Id, company.DecimalDigits)
defer rows.Close()
type value struct {
- date int
- sales float64
- income float64
- expenses float64
+ index int
+ date time.Time
+ sales float64
+ salesPrice string
+ income float64
+ incomePrice string
+ expenses float64
+ expensesPrice string
}
var values []value
var max = 0.
@@ -216,7 +227,7 @@ func buildDashboardChart(ctx context.Context, conn *Conn, company *Company, peri
var sales int
var income int
var expenses int
- if err := rows.Scan(&v.date, &sales, &income, &expenses); err != nil {
+ if err := rows.Scan(&v.index, &v.date, &sales, &v.salesPrice, &income, &v.incomePrice, &expenses, &v.expensesPrice); err != nil {
panic(err)
}
v.sales = float64(sales)
@@ -251,13 +262,15 @@ func buildDashboardChart(ctx context.Context, conn *Conn, company *Company, peri
writePolyline(func(v value) float64 { return v.income })
writePolyline(func(v value) float64 { return v.expenses })
- writeCircle := func(i int, v float64) {
- sb.WriteString(fmt.Sprintf("", float64(i)/dataPoints*width, height-v/max*height))
+ writeCircle := func(i int, time time.Time, p string, v float64) {
+ price := formatPrice(p, locale.Language, locale.CurrencyPattern, company.DecimalDigits, company.CurrencySymbol)
+ date := time.Format(dateFormat)
+ sb.WriteString(fmt.Sprintf("%s\n%s", float64(i)/dataPoints*width, height-v/max*height, date, price))
}
for i, v := range values {
- writeCircle(i, v.sales)
- writeCircle(i, v.income)
- writeCircle(i, v.expenses)
+ writeCircle(i, v.date, v.salesPrice, v.sales)
+ writeCircle(i, v.date, v.incomePrice, v.income)
+ writeCircle(i, v.date, v.expensesPrice, v.expenses)
}
sb.WriteString("")
return template.HTML(sb.String())