package services import ( "bytes" "encoding/base64" "errors" "html/template" "image/png" "math" "strconv" "git.odit.services/lfk/document-server/models" "github.com/boombuler/barcode" "github.com/boombuler/barcode/ean" ) type Templater interface { Execute(template *template.Template, data interface{}) (string, error) StringToTemplate(templateString string) (*template.Template, error) } type DefaultTemplater struct { } type ContractTemplateOptions struct { Runners []models.Runner `json:"runners"` CurrencySymbol string `json:"currency_symbol"` Disclaimer string `json:"disclaimer"` ReceiptMinimumAmount int `json:"receipt_minimum_amount"` EventName string `json:"event_name"` SponsoringHeader string `json:"base_url"` } func idToEan13(id int) (string, error) { multiply := [2]int{1, 3} idStr := strconv.Itoa(id) if len(idStr) > 12 { return "", errors.New("id too long") } for len(idStr) < 12 { idStr = "0" + idStr } total := 0 for i, char := range idStr { num, err := strconv.Atoi(string(char)) if err != nil { return "", err } total += num * multiply[i%2] } checkSum := (int(math.Ceil(float64(total)/10)) * 10) - total return idStr + strconv.Itoa(checkSum), nil } func (t *DefaultTemplater) GenerateBarcode(code int) (string, error) { encodedEan, err := idToEan13(code) eanCode, err := ean.Encode(encodedEan) if err != nil { return "", err } scaledCode, err := barcode.Scale(eanCode, 100, 50) if err != nil { return "", err } var buf bytes.Buffer err = png.Encode(&buf, scaledCode) if err != nil { return "", err } return base64.StdEncoding.EncodeToString(buf.Bytes()), nil } func (t *DefaultTemplater) StringToTemplate(templateString string) (*template.Template, error) { return template.New("template").Funcs(template.FuncMap{ "barcode": t.GenerateBarcode, }).Parse(templateString) } func (t *DefaultTemplater) Execute(baseTemplate *template.Template, data interface{}) (string, error) { resultBuffer := new(bytes.Buffer) err := baseTemplate.Execute(resultBuffer, data) if err != nil { return "", err } return resultBuffer.String(), nil }