feat(services): Support for multiple barcode formats 🥳
This commit is contained in:
		@@ -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;">
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user