cargo-platform/internal/importers/cost_component_group/importer.go
teguh nugroho dc28c6f6fc
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
cost_component
2026-08-22 11:36:50 +07:00

119 lines
2.8 KiB
Go

package cost_component_group
import (
"cargo-erp-backend/internal/domain"
"cargo-erp-backend/pkg/helpers"
"cargo-erp-backend/pkg/importer"
"fmt"
"strconv"
"strings"
"time"
"github.com/oklog/ulid/v2"
"gorm.io/gorm"
)
type CostComponentGroupImportHandler struct {
UserData domain.User
Helper helpers.HelperInterface
}
func NewCostComponentGroupImportHandler(userData domain.User, helper helpers.HelperInterface) importer.ImportHandler {
return &CostComponentGroupImportHandler{
UserData: userData,
Helper: helper,
}
}
func (h *CostComponentGroupImportHandler) ValidateRow(row []string, rowNumber int) (importer.RowData, []error) {
var errors []error
if len(row) < 4 {
errors = append(errors, fmt.Errorf("row must have 4 columns: name, code, inc, value"))
return nil, errors
}
name := strings.TrimSpace(row[0])
if name == "" {
errors = append(errors, fmt.Errorf("name is required"))
} else if len(name) < 2 {
errors = append(errors, fmt.Errorf("name must be at least 2 characters"))
} else if len(name) > 255 {
errors = append(errors, fmt.Errorf("name must be at most 255 characters"))
}
code := strings.TrimSpace(row[1])
if code == "" {
errors = append(errors, fmt.Errorf("code is required"))
}
incStr := strings.TrimSpace(row[2])
var inc int32
if incStr != "" {
parsed, err := strconv.ParseInt(incStr, 10, 32)
if err != nil {
errors = append(errors, fmt.Errorf("inc must be a valid integer"))
} else {
inc = int32(parsed)
}
}
value := strings.TrimSpace(row[3])
if len(errors) > 0 {
return nil, errors
}
now := time.Now()
id := ulid.Make().String()
group := &domain.CostComponentGroup{
ID: id,
Name: &name,
Code: &code,
Inc: &inc,
Value: &value,
MerchantID: h.UserData.MerchantID,
CreatedBy: &h.UserData.ID,
CreatedOn: &now,
UpdatedBy: &h.UserData.ID,
UpdatedOn: &now,
}
return group, nil
}
func (h *CostComponentGroupImportHandler) GetDataString(data importer.RowData) string {
group := data.(*domain.CostComponentGroup)
name := ""
if group.Name != nil {
name = *group.Name
}
code := ""
if group.Code != nil {
code = *group.Code
}
return fmt.Sprintf("%s, %s", name, code)
}
func (h *CostComponentGroupImportHandler) IsDuplicate(db *gorm.DB, data importer.RowData) bool {
group := data.(*domain.CostComponentGroup)
var count int64
db.Model(&domain.CostComponentGroup{}).
Where("UPPER(name) = ? AND UPPER(code) = ?",
strings.ToUpper(*group.Name), strings.ToUpper(*group.Code)).
Count(&count)
return count > 0
}
func (h *CostComponentGroupImportHandler) GetTemplateHeaders() []string {
return []string{"name", "code", "inc", "value"}
}
func (h *CostComponentGroupImportHandler) GetTemplateRows() [][]string {
return [][]string{
{"Component A", "CA", "1", "10000"},
{"Component B", "CB", "2", "20000"},
{"Component C", "CC", "3", "30000"},
}
}