package repository import ( "github.com/wmms/wmms/internal/model" "github.com/wmms/wmms/pkg/database" ) type MasterDataRepository struct{} func NewMasterDataRepository() *MasterDataRepository { return &MasterDataRepository{} } func (r *MasterDataRepository) ListCategories(organizationID int64) ([]model.MaterialCategory, error) { rows, err := database.DB.Query(`SELECT id, organization_id, code, name, parent_id, status FROM material_categories WHERE organization_id = ? ORDER BY code`, organizationID) if err != nil { return nil, err } defer rows.Close() items := make([]model.MaterialCategory, 0) for rows.Next() { var item model.MaterialCategory if err := rows.Scan(&item.ID, &item.OrganizationID, &item.Code, &item.Name, &item.ParentID, &item.Status); err != nil { return nil, err } items = append(items, item) } return items, rows.Err() } func (r *MasterDataRepository) CreateCategory(item *model.MaterialCategory) error { result, err := database.DB.Exec(`INSERT INTO material_categories (organization_id, code, name, parent_id, status) VALUES (?, ?, ?, ?, ?)`, item.OrganizationID, item.Code, item.Name, item.ParentID, item.Status) if err != nil { return err } item.ID, err = result.LastInsertId() return err } func (r *MasterDataRepository) UpdateCategory(item *model.MaterialCategory) error { _, err := database.DB.Exec(`UPDATE material_categories SET name = ?, parent_id = ?, status = ? WHERE id = ? AND organization_id = ?`, item.Name, item.ParentID, item.Status, item.ID, item.OrganizationID) return err } func (r *MasterDataRepository) ListUnits(organizationID int64) ([]model.Unit, error) { rows, err := database.DB.Query(`SELECT id, organization_id, code, name, precision_scale, status FROM units WHERE organization_id = ? ORDER BY code`, organizationID) if err != nil { return nil, err } defer rows.Close() items := make([]model.Unit, 0) for rows.Next() { var item model.Unit if err := rows.Scan(&item.ID, &item.OrganizationID, &item.Code, &item.Name, &item.PrecisionScale, &item.Status); err != nil { return nil, err } items = append(items, item) } return items, rows.Err() } func (r *MasterDataRepository) CreateUnit(item *model.Unit) error { result, err := database.DB.Exec(`INSERT INTO units (organization_id, code, name, precision_scale, status) VALUES (?, ?, ?, ?, ?)`, item.OrganizationID, item.Code, item.Name, item.PrecisionScale, item.Status) if err != nil { return err } item.ID, err = result.LastInsertId() return err } func (r *MasterDataRepository) UpdateUnit(item *model.Unit) error { _, err := database.DB.Exec(`UPDATE units SET name = ?, precision_scale = ?, status = ? WHERE id = ? AND organization_id = ?`, item.Name, item.PrecisionScale, item.Status, item.ID, item.OrganizationID) return err } func (r *MasterDataRepository) ListCodeRules(organizationID int64) ([]model.CodeRule, error) { rows, err := database.DB.Query(`SELECT cr.id, cr.organization_id, cr.category_id, c.code, c.name, cr.prefix, cr.sequence_length, cr.next_sequence, cr.status FROM code_rules cr JOIN material_categories c ON c.id = cr.category_id WHERE cr.organization_id = ? ORDER BY c.code`, organizationID) if err != nil { return nil, err } defer rows.Close() items := make([]model.CodeRule, 0) for rows.Next() { var item model.CodeRule if err := rows.Scan(&item.ID, &item.OrganizationID, &item.CategoryID, &item.CategoryCode, &item.CategoryName, &item.Prefix, &item.SequenceLength, &item.NextSequence, &item.Status); err != nil { return nil, err } items = append(items, item) } return items, rows.Err() } func (r *MasterDataRepository) CreateCodeRule(item *model.CodeRule) error { result, err := database.DB.Exec(`INSERT INTO code_rules (organization_id, category_id, prefix, sequence_length, next_sequence, status) VALUES (?, ?, ?, ?, ?, ?)`, item.OrganizationID, item.CategoryID, item.Prefix, item.SequenceLength, item.NextSequence, item.Status) if err != nil { return err } item.ID, err = result.LastInsertId() return err } func (r *MasterDataRepository) UpdateCodeRule(item *model.CodeRule) error { _, err := database.DB.Exec(`UPDATE code_rules SET prefix = ?, sequence_length = ?, status = ? WHERE id = ? AND organization_id = ?`, item.Prefix, item.SequenceLength, item.Status, item.ID, item.OrganizationID) return err }