feat(services): Support for multiple barcode formats 🥳
This commit is contained in:
parent
8812bf2410
commit
62f04f7d1c
@ -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{
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -56,7 +56,7 @@
|
||||
</div>
|
||||
<div class="column">
|
||||
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
|
||||
src="data:image/png;base64,{{ barcode .ID }}" />
|
||||
src="data:image/png;base64,{{ barcode .ID $.BarcodeFormat $.BarcodePrefix }}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="columns" style="padding-top: 1rem;">
|
||||
|
@ -55,7 +55,7 @@
|
||||
</div>
|
||||
<div class="column">
|
||||
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
|
||||
src="data:image/png;base64,{{ barcode .ID}}" />
|
||||
src="data:image/png;base64,{{ barcode .ID $.BarcodeFormat $.BarcodePrefix }}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="columns" style="padding-top: 1rem;">
|
||||
|
Loading…
x
Reference in New Issue
Block a user