chore: refacto
This commit is contained in:
@@ -3,52 +3,20 @@ package db
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"gestion/models"
|
||||
)
|
||||
|
||||
// DaySchedule représente les horaires de livraison pour un jour de la semaine
|
||||
type DaySchedule struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
OpenTime string `json:"open_time"` // ex: "09:00"
|
||||
CloseTime string `json:"close_time"` // ex: "20:00"
|
||||
}
|
||||
|
||||
// DeliverySchedule représente les horaires de livraison pour chaque jour
|
||||
type DeliverySchedule struct {
|
||||
Monday DaySchedule `json:"monday"`
|
||||
Tuesday DaySchedule `json:"tuesday"`
|
||||
Wednesday DaySchedule `json:"wednesday"`
|
||||
Thursday DaySchedule `json:"thursday"`
|
||||
Friday DaySchedule `json:"friday"`
|
||||
Saturday DaySchedule `json:"saturday"`
|
||||
Sunday DaySchedule `json:"sunday"`
|
||||
}
|
||||
|
||||
// DefaultDeliverySchedule retourne un planning de livraison par défaut (tous les jours, 9h-20h)
|
||||
func DefaultDeliverySchedule() DeliverySchedule {
|
||||
day := DaySchedule{Enabled: true, OpenTime: "09:00", CloseTime: "20:00"}
|
||||
return DeliverySchedule{
|
||||
func DefaultDeliverySchedule() models.DeliverySchedule {
|
||||
day := models.DaySchedule{Enabled: true, OpenTime: "09:00", CloseTime: "20:00"}
|
||||
return models.DeliverySchedule{
|
||||
Monday: day, Tuesday: day, Wednesday: day, Thursday: day,
|
||||
Friday: day, Saturday: day, Sunday: day,
|
||||
}
|
||||
}
|
||||
|
||||
// PostalZone représente une zone de livraison avec un minimum de commande
|
||||
type PostalZone struct {
|
||||
Name string `json:"name"`
|
||||
MinAmount float64 `json:"min_amount"`
|
||||
Codes []string `json:"codes"`
|
||||
}
|
||||
|
||||
// PointsTier représente un palier du barème de points
|
||||
// Si Max == 0, il n'y a pas de borne supérieure (illimité)
|
||||
type PointsTier struct {
|
||||
Min float64 `json:"min"`
|
||||
Max float64 `json:"max"` // 0 = illimité
|
||||
Points int `json:"points"`
|
||||
}
|
||||
|
||||
// CalcPointsFromTiers retourne le nombre de points correspondant au total selon les paliers
|
||||
func CalcPointsFromTiers(total float64, tiers []PointsTier) int {
|
||||
func CalcPointsFromTiers(total float64, tiers []models.PointsTier) int {
|
||||
for _, t := range tiers {
|
||||
if total >= t.Min && (t.Max == 0 || total <= t.Max) {
|
||||
return t.Points
|
||||
@@ -57,44 +25,25 @@ func CalcPointsFromTiers(total float64, tiers []PointsTier) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
// PointsPool représente un type de point personnalisable par l'admin
|
||||
// Pool[0] → colonne `point`, Pool[1] → colonne `point_zipette`
|
||||
type PointsPool struct {
|
||||
Key string `json:"key"` // identifiant interne (ex: "pool_0")
|
||||
Name string `json:"name"` // nom affiché (ex: "Cannabis", "Accessoires")
|
||||
Categories []string `json:"categories"` // catégories de produits assignées à ce pool
|
||||
Tiers []PointsTier `json:"tiers"` // barème de points
|
||||
}
|
||||
|
||||
// AppSettings contient les paramètres globaux de l'application
|
||||
type AppSettings struct {
|
||||
PenaltiesEnabled bool `json:"penalties_enabled"`
|
||||
ShowAmendeScore bool `json:"show_amende_score"` // afficher le score d'amendes aux clients/cabine
|
||||
PointsEnabled bool `json:"points_enabled"` // afficher/activer le système de points
|
||||
PointsPools []PointsPool `json:"points_pools"` // types de points personnalisés
|
||||
ReferralEnabled bool `json:"referral_enabled"` // activer/désactiver le système de parrainage
|
||||
CryptoPaymentEnabled bool `json:"crypto_payment_enabled"` // activer/désactiver le paiement crypto
|
||||
CryptoOnly bool `json:"crypto_only"` // forcer le paiement crypto uniquement (pas d'espèces)
|
||||
NowPaymentsAPIKey string `json:"nowpayments_api_key"` // clé API NowPayments
|
||||
NowPaymentsIPNSecret string `json:"nowpayments_ipn_secret"` // secret IPN NowPayments
|
||||
NowPaymentsCurrencies []string `json:"nowpayments_currencies"` // cryptos acceptées (ex: ["btc","eth","ltc"])
|
||||
DeliverySchedule DeliverySchedule `json:"delivery_schedule"` // horaires de livraison par jour
|
||||
PostalZones []PostalZone `json:"postal_zones"` // zones de livraison avec minimum de commande
|
||||
}
|
||||
|
||||
// DefaultSettings retourne les paramètres par défaut
|
||||
func DefaultSettings() AppSettings {
|
||||
return AppSettings{
|
||||
func DefaultSettings() models.AppSettings {
|
||||
return models.AppSettings{
|
||||
PenaltiesEnabled: true,
|
||||
ShowAmendeScore: true,
|
||||
PointsEnabled: true,
|
||||
ReferralEnabled: true,
|
||||
PointsPools: []PointsPool{
|
||||
PenaltyTiers: []models.PenaltyTier{
|
||||
{MinCancel: 0, Amount: 20},
|
||||
{MinCancel: 1, Amount: 50},
|
||||
{MinCancel: 2, Amount: 100},
|
||||
{MinCancel: 3, Amount: 150},
|
||||
},
|
||||
PointsEnabled: true,
|
||||
ReferralEnabled: true,
|
||||
PointsPools: []models.PointsPool{
|
||||
{
|
||||
Key: "pool_0",
|
||||
Name: "Pool 1",
|
||||
Categories: []string{},
|
||||
Tiers: []PointsTier{
|
||||
Tiers: []models.PointsTier{
|
||||
{Min: 30, Max: 50, Points: 1},
|
||||
{Min: 60, Max: 150, Points: 2},
|
||||
{Min: 160, Max: 300, Points: 3},
|
||||
@@ -106,15 +55,19 @@ func DefaultSettings() AppSettings {
|
||||
Key: "pool_1",
|
||||
Name: "Pool 2",
|
||||
Categories: []string{},
|
||||
Tiers: []PointsTier{
|
||||
Tiers: []models.PointsTier{
|
||||
{Min: 30, Max: 100, Points: 1},
|
||||
{Min: 110, Max: 200, Points: 2},
|
||||
{Min: 210, Max: 0, Points: 3},
|
||||
},
|
||||
},
|
||||
},
|
||||
DeliveryMode: models.DeliveryModeConfig{
|
||||
Mode: "single",
|
||||
CategoryRoutes: []models.CategoryRoute{},
|
||||
},
|
||||
DeliverySchedule: DefaultDeliverySchedule(),
|
||||
PostalZones: []PostalZone{
|
||||
PostalZones: []models.PostalZone{
|
||||
{Name: "Zone 30€", MinAmount: 30, Codes: []string{"44000", "44100", "44200", "44300"}},
|
||||
{Name: "Zone 50€", MinAmount: 50, Codes: []string{
|
||||
"44400", "44880", "44120", "44230", "44115",
|
||||
@@ -128,7 +81,7 @@ func DefaultSettings() AppSettings {
|
||||
}
|
||||
|
||||
// GetSettings récupère les paramètres depuis la DB
|
||||
func (d *Database) GetSettings() (AppSettings, error) {
|
||||
func (d *Database) GetSettings() (models.AppSettings, error) {
|
||||
settings := DefaultSettings()
|
||||
|
||||
rows, err := d.Query(`SELECT key, value FROM app_settings`)
|
||||
@@ -150,7 +103,7 @@ func (d *Database) GetSettings() (AppSettings, error) {
|
||||
case "points_enabled":
|
||||
settings.PointsEnabled = value == "true"
|
||||
case "points_pools":
|
||||
var pools []PointsPool
|
||||
var pools []models.PointsPool
|
||||
if err := json.Unmarshal([]byte(value), &pools); err == nil {
|
||||
settings.PointsPools = pools
|
||||
}
|
||||
@@ -170,22 +123,31 @@ func (d *Database) GetSettings() (AppSettings, error) {
|
||||
settings.NowPaymentsCurrencies = currencies
|
||||
}
|
||||
case "delivery_schedule":
|
||||
var sched DeliverySchedule
|
||||
var sched models.DeliverySchedule
|
||||
if err := json.Unmarshal([]byte(value), &sched); err == nil {
|
||||
settings.DeliverySchedule = sched
|
||||
}
|
||||
case "postal_zones":
|
||||
var zones []PostalZone
|
||||
var zones []models.PostalZone
|
||||
if err := json.Unmarshal([]byte(value), &zones); err == nil {
|
||||
settings.PostalZones = zones
|
||||
}
|
||||
case "telegram_bot_token":
|
||||
settings.TelegramBotToken = value
|
||||
case "telegram_bot_username":
|
||||
settings.TelegramBotUsername = value
|
||||
case "delivery_mode":
|
||||
var mode models.DeliveryModeConfig
|
||||
if err := json.Unmarshal([]byte(value), &mode); err == nil {
|
||||
settings.DeliveryMode = mode
|
||||
}
|
||||
}
|
||||
}
|
||||
return settings, rows.Err()
|
||||
}
|
||||
|
||||
// UpdateSettings sauvegarde les paramètres dans la DB
|
||||
func (d *Database) UpdateSettings(s AppSettings) error {
|
||||
func (d *Database) UpdateSettings(s models.AppSettings) error {
|
||||
boolStr := func(b bool) string {
|
||||
if b {
|
||||
return "true"
|
||||
@@ -194,7 +156,7 @@ func (d *Database) UpdateSettings(s AppSettings) error {
|
||||
}
|
||||
|
||||
if s.PointsPools == nil {
|
||||
s.PointsPools = []PointsPool{}
|
||||
s.PointsPools = []models.PointsPool{}
|
||||
}
|
||||
// S'assurer que chaque pool a des slices non-nil
|
||||
for i := range s.PointsPools {
|
||||
@@ -202,7 +164,7 @@ func (d *Database) UpdateSettings(s AppSettings) error {
|
||||
s.PointsPools[i].Categories = []string{}
|
||||
}
|
||||
if s.PointsPools[i].Tiers == nil {
|
||||
s.PointsPools[i].Tiers = []PointsTier{}
|
||||
s.PointsPools[i].Tiers = []models.PointsTier{}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,13 +210,24 @@ func (d *Database) UpdateSettings(s AppSettings) error {
|
||||
pairs = append(pairs, [2]string{"delivery_schedule", string(schedJSON)})
|
||||
|
||||
if s.PostalZones == nil {
|
||||
s.PostalZones = []PostalZone{}
|
||||
s.PostalZones = []models.PostalZone{}
|
||||
}
|
||||
zonesJSON, err := json.Marshal(s.PostalZones)
|
||||
if err != nil {
|
||||
return fmt.Errorf("erreur sérialisation postal_zones: %w", err)
|
||||
}
|
||||
pairs = append(pairs, [2]string{"postal_zones", string(zonesJSON)})
|
||||
pairs = append(pairs, [2]string{"telegram_bot_token", s.TelegramBotToken})
|
||||
pairs = append(pairs, [2]string{"telegram_bot_username", s.TelegramBotUsername})
|
||||
|
||||
if s.DeliveryMode.CategoryRoutes == nil {
|
||||
s.DeliveryMode.CategoryRoutes = []models.CategoryRoute{}
|
||||
}
|
||||
deliveryModeJSON, err := json.Marshal(s.DeliveryMode)
|
||||
if err != nil {
|
||||
return fmt.Errorf("erreur sérialisation delivery_mode: %w", err)
|
||||
}
|
||||
pairs = append(pairs, [2]string{"delivery_mode", string(deliveryModeJSON)})
|
||||
|
||||
for _, p := range pairs {
|
||||
if _, err = tx.Exec(upsert, p[0], p[1]); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user