feat(services): EAN 13 generation

This commit is contained in:
2024-12-03 17:34:11 +01:00
parent 323c0b0ff9
commit 8812bf2410
7 changed files with 84 additions and 12 deletions

View File

@@ -2,13 +2,21 @@ 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 {
@@ -23,10 +31,59 @@ type ContractTemplateOptions struct {
SponsoringHeader string `json:"base_url"`
}
func (t *DefaultTemplater) Execute(template *template.Template, data interface{}) (string, error) {
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 := template.Execute(resultBuffer, data)
err := baseTemplate.Execute(resultBuffer, data)
if err != nil {
return "", err
}