update
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user