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"}, } }