feat(services): EAN 13 generation
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user