From 9b1f58d7832de45a8ab7e2390c536d804401f90e Mon Sep 17 00:00:00 2001 From: ahmadafriadi Date: Fri, 27 Jun 2025 13:34:54 +0700 Subject: [PATCH] Update Auto Generate SKU --- modules/auth/service/jwt.go | 2 +- modules/inventory/handler/product_handler.go | 15 ++++++++++++ modules/inventory/models/colour.go | 2 +- modules/inventory/repository/product__repo.go | 23 +++++++++++++++++++ modules/inventory/service/inventory_logic.go | 22 ++++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 modules/inventory/service/inventory_logic.go diff --git a/modules/auth/service/jwt.go b/modules/auth/service/jwt.go index 3c75278..3cb74fc 100644 --- a/modules/auth/service/jwt.go +++ b/modules/auth/service/jwt.go @@ -11,7 +11,7 @@ func GenerateJWT(userID uint, role string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "role": role, - "exp": time.Now().Add(time.Hour * 1).Unix(), // expired dalam 1 jam + "exp": time.Now().Add(time.Hour * 24).Unix(), // expired dalam 1 jam } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) diff --git a/modules/inventory/handler/product_handler.go b/modules/inventory/handler/product_handler.go index 5037cbb..400af3b 100644 --- a/modules/inventory/handler/product_handler.go +++ b/modules/inventory/handler/product_handler.go @@ -4,6 +4,7 @@ import ( "BE-MiniERP/database" "BE-MiniERP/modules/inventory/models" "BE-MiniERP/modules/inventory/repository" + "BE-MiniERP/modules/inventory/service" "strconv" "github.com/gofiber/fiber/v2" @@ -32,9 +33,23 @@ func (h *ProductHandler) Create(c *fiber.Ctx) error { if err := c.BodyParser(&input); err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid input"}) } + + // Jika hanya terima ID, lakukan preload relasi + if err := h.Repo.PreloadRelations(&input); err != nil { + return c.Status(400).JSON(fiber.Map{"error": "Failed to preload relations"}) + } + + // Generate SKU + sku, err := service.GenerateSKU(&input) + if err != nil { + return c.Status(400).JSON(fiber.Map{"error": "Failed to generate SKU: " + err.Error()}) + } + input.SKU = sku + if err := h.Repo.Create(&input); err != nil { return c.Status(500).JSON(fiber.Map{"error": "Failed to create product"}) } + return c.JSON(input) } diff --git a/modules/inventory/models/colour.go b/modules/inventory/models/colour.go index bc9e79f..f58e295 100644 --- a/modules/inventory/models/colour.go +++ b/modules/inventory/models/colour.go @@ -4,7 +4,7 @@ import "time" type Colour struct { ID uint `gorm:"primaryKey" json:"id"` - Code string `json:"code"` + Code string `gorm:"not null;unique" json:"code"` Name string `gorm:"not null" json:"name"` Hex string `json:"hex"` // Hexadecimal color code CreatedAt time.Time diff --git a/modules/inventory/repository/product__repo.go b/modules/inventory/repository/product__repo.go index 370d41b..85fb3e1 100644 --- a/modules/inventory/repository/product__repo.go +++ b/modules/inventory/repository/product__repo.go @@ -3,6 +3,8 @@ package repository import ( "BE-MiniERP/modules/inventory/models" + "fmt" + "gorm.io/gorm" ) @@ -36,3 +38,24 @@ func (r *ProductRepository) Update(id uint, product *models.Product) error { func (r *ProductRepository) Delete(id uint) error { return r.DB.Delete(&models.Product{}, id).Error } + +func (r *ProductRepository) PreloadRelations(product *models.Product) error { + // Collection + if err := r.DB.First(&product.Collection, product.CollectionID).Error; err != nil { + return fmt.Errorf("collection not found: %w", err) + } + // Category + if err := r.DB.First(&product.Category, product.CategoryID).Error; err != nil { + return fmt.Errorf("category not found: %w", err) + } + // Colour + if err := r.DB.First(&product.Colour, product.ColourID).Error; err != nil { + return fmt.Errorf("colour not found: %w", err) + } + // Size + if err := r.DB.First(&product.Size, product.SizeID).Error; err != nil { + return fmt.Errorf("size not found: %w", err) + } + + return nil +} diff --git a/modules/inventory/service/inventory_logic.go b/modules/inventory/service/inventory_logic.go new file mode 100644 index 0000000..f859367 --- /dev/null +++ b/modules/inventory/service/inventory_logic.go @@ -0,0 +1,22 @@ +package service + +import ( + "BE-MiniERP/modules/inventory/models" + "fmt" +) + +func GenerateSKU(product *models.Product) (string, error) { + if product.Collection.Code == "" || + product.Category.Code == "" || + product.Colour.Code == "" || + product.Size.Code == "" { + return "", fmt.Errorf("missing code from one or more components") + } + + return fmt.Sprintf("%s-%s-%s-%s", + product.Collection.Code, + product.Category.Code, + product.Colour.Code, + product.Size.Code, + ), nil +}