feat(services): Support for multiple barcode formats 🥳
This commit is contained in:
@@ -6,12 +6,13 @@ import (
|
||||
"errors"
|
||||
"html/template"
|
||||
"image/png"
|
||||
"math"
|
||||
"strconv"
|
||||
|
||||
"git.odit.services/lfk/document-server/models"
|
||||
"github.com/boombuler/barcode"
|
||||
"github.com/boombuler/barcode/code128"
|
||||
"github.com/boombuler/barcode/ean"
|
||||
"github.com/boombuler/barcode/qr"
|
||||
)
|
||||
|
||||
type Templater interface {
|
||||
@@ -29,38 +30,57 @@ type ContractTemplateOptions struct {
|
||||
ReceiptMinimumAmount int `json:"receipt_minimum_amount"`
|
||||
EventName string `json:"event_name"`
|
||||
SponsoringHeader string `json:"base_url"`
|
||||
BarcodeFormat string `json:"barcode_format"`
|
||||
BarcodePrefix string `json:"barcode_prefix"`
|
||||
}
|
||||
|
||||
func idToEan13(id int) (string, error) {
|
||||
multiply := [2]int{1, 3}
|
||||
func idToEan13(id int, prefix string) (string, error) {
|
||||
idStr := strconv.Itoa(id)
|
||||
|
||||
if len(idStr) > 12 {
|
||||
return "", errors.New("id too long")
|
||||
}
|
||||
for len(idStr) < 12 {
|
||||
|
||||
for len(idStr) < 11 {
|
||||
idStr = "0" + idStr
|
||||
}
|
||||
idStr = prefix + idStr
|
||||
|
||||
total := 0
|
||||
for i, char := range idStr {
|
||||
num, err := strconv.Atoi(string(char))
|
||||
return idStr, nil
|
||||
}
|
||||
|
||||
func (t *DefaultTemplater) GenerateBarcode(code int, format string, prefix string) (string, error) {
|
||||
var generatedCode barcode.Barcode
|
||||
var err error
|
||||
|
||||
switch format {
|
||||
case "ean13":
|
||||
encodedEan, err := idToEan13(code, prefix)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
total += num * multiply[i%2]
|
||||
generatedCode, err = ean.Encode(encodedEan)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
break
|
||||
case "code128":
|
||||
generatedCode, err = code128.Encode(prefix + strconv.Itoa(code))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
break
|
||||
case "qr":
|
||||
generatedCode, err = qr.Encode(prefix+strconv.Itoa(code), qr.M, qr.Numeric)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
break
|
||||
default:
|
||||
return "", errors.New("unknown barcode format")
|
||||
}
|
||||
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)
|
||||
scaledCode, err := barcode.Scale(generatedCode, 1000, 500)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user