package partner_settings import ( "enaklo-pos-be/internal/common/mycontext" "enaklo-pos-be/internal/entity" "enaklo-pos-be/internal/repository" "encoding/json" "github.com/pkg/errors" ) type PartnerSettingsService interface { GetSettings(ctx mycontext.Context, partnerID int64) (*entity.PartnerSettings, error) UpdateSettings(ctx mycontext.Context, settings *entity.PartnerSettings) error GetPaymentMethods(ctx mycontext.Context, partnerID int64) ([]entity.PartnerPaymentMethod, error) AddPaymentMethod(ctx mycontext.Context, method *entity.PartnerPaymentMethod) error UpdatePaymentMethod(ctx mycontext.Context, method *entity.PartnerPaymentMethod) error DeletePaymentMethod(ctx mycontext.Context, id int64, partnerID int64) error ReorderPaymentMethods(ctx mycontext.Context, partnerID int64, methodIDs []int64) error GetBusinessHours(ctx mycontext.Context, partnerID int64) (*entity.BusinessHoursSetting, error) UpdateBusinessHours(ctx mycontext.Context, partnerID int64, hours *entity.BusinessHoursSetting) error } type partnerSettingsService struct { settingsRepo repository.PartnerSettingsRepository } func NewPartnerSettingsService(settingsRepo repository.PartnerSettingsRepository) PartnerSettingsService { return &partnerSettingsService{ settingsRepo: settingsRepo, } } func (s *partnerSettingsService) GetSettings(ctx mycontext.Context, partnerID int64) (*entity.PartnerSettings, error) { return s.settingsRepo.GetByPartnerID(ctx, partnerID) } func (s *partnerSettingsService) UpdateSettings(ctx mycontext.Context, settings *entity.PartnerSettings) error { if settings == nil { return errors.New("settings cannot be nil") } // Validate tax percentage if settings.TaxEnabled && (settings.TaxPercentage < 0 || settings.TaxPercentage > 100) { return errors.New("tax percentage must be between 0 and 100") } return s.settingsRepo.Upsert(ctx, settings) } func (s *partnerSettingsService) GetPaymentMethods(ctx mycontext.Context, partnerID int64) ([]entity.PartnerPaymentMethod, error) { return s.settingsRepo.GetPaymentMethods(ctx, partnerID) } func (s *partnerSettingsService) AddPaymentMethod(ctx mycontext.Context, method *entity.PartnerPaymentMethod) error { if method == nil { return errors.New("payment method cannot be nil") } method.ID = 0 return s.settingsRepo.UpsertPaymentMethod(ctx, method) } func (s *partnerSettingsService) UpdatePaymentMethod(ctx mycontext.Context, method *entity.PartnerPaymentMethod) error { if method == nil { return errors.New("payment method cannot be nil") } if method.ID <= 0 { return errors.New("invalid payment method ID") } return s.settingsRepo.UpsertPaymentMethod(ctx, method) } func (s *partnerSettingsService) DeletePaymentMethod(ctx mycontext.Context, id int64, partnerID int64) error { if id <= 0 { return errors.New("invalid payment method ID") } return s.settingsRepo.DeletePaymentMethod(ctx, id, partnerID) } func (s *partnerSettingsService) ReorderPaymentMethods(ctx mycontext.Context, partnerID int64, methodIDs []int64) error { if len(methodIDs) == 0 { return errors.New("method IDs cannot be empty") } return s.settingsRepo.UpdatePaymentMethodOrder(ctx, partnerID, methodIDs) } // GetBusinessHours retrieves parsed business hours for a partner func (s *partnerSettingsService) GetBusinessHours(ctx mycontext.Context, partnerID int64) (*entity.BusinessHoursSetting, error) { settings, err := s.settingsRepo.GetByPartnerID(ctx, partnerID) if err != nil { return nil, err } // Create default hours if not set if settings.BusinessHours == "" { defaultHours := createDefaultBusinessHours() return defaultHours, nil } var hours entity.BusinessHoursSetting if err := json.Unmarshal([]byte(settings.BusinessHours), &hours); err != nil { return nil, errors.Wrap(err, "failed to parse business hours") } return &hours, nil } func (s *partnerSettingsService) UpdateBusinessHours(ctx mycontext.Context, partnerID int64, hours *entity.BusinessHoursSetting) error { if hours == nil { return errors.New("business hours cannot be nil") } settings, err := s.settingsRepo.GetByPartnerID(ctx, partnerID) if err != nil { return err } // Serialize hours to JSON hoursJSON, err := json.Marshal(hours) if err != nil { return errors.Wrap(err, "failed to serialize business hours") } settings.BusinessHours = string(hoursJSON) return s.settingsRepo.Upsert(ctx, settings) } func createDefaultBusinessHours() *entity.BusinessHoursSetting { defaultDay := entity.DayHours{ Open: "08:00", Close: "22:00", } return &entity.BusinessHoursSetting{ Monday: defaultDay, Tuesday: defaultDay, Wednesday: defaultDay, Thursday: defaultDay, Friday: defaultDay, Saturday: defaultDay, Sunday: defaultDay, } }