aditya.siregar 09c9a4d59d update
2025-04-10 11:21:08 +07:00

150 lines
4.7 KiB
Go

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