150 lines
4.7 KiB
Go
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,
|
|
}
|
|
}
|