- internal/be: emulator kartice (TCP listener za L-PFR mock)
- /v/: javna stranica za verifikaciju fiskalnog računa (QR kod)
- /servis/{id}/fiskalni-racun: štampa fiskalnog računa
- Podešavanja fiskalizacije: BE status/reset, proširen UI
- Korisnik: polja ime i prezime (model, DB, handler, admin profil)
- Fisk server: ažuriran receipt.py i server.py
- Koncept.md, Magacin.md: dokumentacija
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"net/http"
|
|
)
|
|
|
|
// FiskalVlPodaci su podaci dekodirani iz vl parametra QR koda.
|
|
type FiskalVlPodaci struct {
|
|
InvoiceNumber string `json:"n"`
|
|
InvoiceCounter string `json:"ic"`
|
|
DateTime string `json:"t"`
|
|
TotalAmount float64 `json:"a"`
|
|
TIN string `json:"c"`
|
|
Company string `json:"co"`
|
|
Store string `json:"lo"`
|
|
Address string `json:"ad"`
|
|
City string `json:"g"`
|
|
District string `json:"di"`
|
|
InvoiceType string `json:"it"`
|
|
TransactionType string `json:"tr"`
|
|
TaxItems []FiskalTaxItem `json:"tx"`
|
|
Payments []FiskalPayment `json:"pm"`
|
|
Cashier string `json:"ca"`
|
|
BuyerID string `json:"bi"`
|
|
Items []FiskalItem `json:"items"`
|
|
}
|
|
|
|
type FiskalTaxItem struct {
|
|
Label string `json:"label"`
|
|
CategoryName string `json:"categoryName"`
|
|
Rate float64 `json:"rate"`
|
|
Base float64 `json:"base"`
|
|
Amount float64 `json:"amount"`
|
|
}
|
|
|
|
type FiskalPayment struct {
|
|
Type string `json:"type"`
|
|
Amount float64 `json:"amount"`
|
|
}
|
|
|
|
type FiskalItem struct {
|
|
Name string `json:"name"`
|
|
Quantity float64 `json:"quantity"`
|
|
UnitPrice float64 `json:"unitPrice"`
|
|
TotalAmount float64 `json:"totalAmount"`
|
|
Labels []string `json:"labels"`
|
|
}
|
|
|
|
type fiskalVerifikacijaPodaci struct {
|
|
Podaci *FiskalVlPodaci
|
|
Greska string
|
|
JeFiskalni bool
|
|
}
|
|
|
|
func (h *Handler) FiskalVerifikacija(w http.ResponseWriter, r *http.Request) {
|
|
vl := r.URL.Query().Get("vl")
|
|
|
|
podaci := &fiskalVerifikacijaPodaci{}
|
|
|
|
if vl == "" {
|
|
podaci.Greska = "Nedostaje vl parametar."
|
|
h.renderujStandalone(w, "fiskal_verifikacija", podaci)
|
|
return
|
|
}
|
|
|
|
decoded, err := base64.StdEncoding.DecodeString(vl)
|
|
if err != nil {
|
|
// proba RawStdEncoding (bez paddinga) i URLEncoding
|
|
decoded, err = base64.RawStdEncoding.DecodeString(vl)
|
|
if err != nil {
|
|
podaci.Greska = "Neispravan QR kod."
|
|
h.renderujStandalone(w, "fiskal_verifikacija", podaci)
|
|
return
|
|
}
|
|
}
|
|
|
|
var vlPodaci FiskalVlPodaci
|
|
if err := json.Unmarshal(decoded, &vlPodaci); err != nil {
|
|
podaci.Greska = "Neispravan format podataka."
|
|
h.renderujStandalone(w, "fiskal_verifikacija", podaci)
|
|
return
|
|
}
|
|
|
|
podaci.Podaci = &vlPodaci
|
|
podaci.JeFiskalni = vlPodaci.InvoiceType != "Copy" &&
|
|
vlPodaci.InvoiceType != "Training" &&
|
|
vlPodaci.InvoiceType != "Proforma"
|
|
|
|
h.renderujStandalone(w, "fiskal_verifikacija", podaci)
|
|
}
|