diff --git a/handlers/contract.go b/handlers/contract.go index 4485194..8aacbd7 100644 --- a/handlers/contract.go +++ b/handlers/contract.go @@ -62,6 +62,8 @@ func GenerateContract(c *fiber.Ctx) error { ReceiptMinimumAmount: 10, EventName: "Event name", SponsoringHeader: templates.ImageSponsoringHeaderBase64, + BarcodeFormat: "ean13", + BarcodePrefix: "1", }) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ diff --git a/services/templater.go b/services/templater.go index c0a7cdf..eba649f 100644 --- a/services/templater.go +++ b/services/templater.go @@ -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 } diff --git a/templates/contract/de.html b/templates/contract/de.html index f8bd4ec..f8dc751 100644 --- a/templates/contract/de.html +++ b/templates/contract/de.html @@ -56,7 +56,7 @@