Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -13,7 +13,7 @@ import (
|
||||
// Rule tables:
|
||||
// - mk_pricing_rule: the "scope" (filters) to which multipliers/roundings apply.
|
||||
// - mk_pricex: per-currency multipliers (base + 1..6).
|
||||
// - mk_priceroll: per-currency rounding step (ceil to step).
|
||||
// - mk_priceroll: per-currency rounding steps for wholesale (1-5) and retail (6+).
|
||||
|
||||
func EnsurePricingRuleTables(pg *sql.DB) error {
|
||||
stmts := []string{
|
||||
@@ -58,10 +58,15 @@ CREATE TABLE IF NOT EXISTS mk_priceroll (
|
||||
rule_id UUID NOT NULL REFERENCES mk_pricing_rule(id) ON DELETE CASCADE,
|
||||
currency TEXT NOT NULL CHECK (currency IN ('TRY','USD','EUR')),
|
||||
step NUMERIC(18,6) NOT NULL DEFAULT 0,
|
||||
wholesale_step NUMERIC(18,6) NOT NULL DEFAULT 0,
|
||||
retail_step NUMERIC(18,6) NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
PRIMARY KEY (rule_id, currency)
|
||||
)`,
|
||||
`ALTER TABLE mk_priceroll ADD COLUMN IF NOT EXISTS wholesale_step NUMERIC(18,6) NOT NULL DEFAULT 0`,
|
||||
`ALTER TABLE mk_priceroll ADD COLUMN IF NOT EXISTS retail_step NUMERIC(18,6) NOT NULL DEFAULT 0`,
|
||||
`UPDATE mk_priceroll SET wholesale_step = step, retail_step = step WHERE step <> 0 AND wholesale_step = 0 AND retail_step = 0`,
|
||||
`CREATE INDEX IF NOT EXISTS ix_mk_priceroll_currency ON mk_priceroll (currency)`,
|
||||
}
|
||||
for _, s := range stmts {
|
||||
@@ -90,32 +95,35 @@ type PricingRuleRow struct {
|
||||
IsActive bool `json:"is_active"`
|
||||
|
||||
// multipliers/rolls are per currency
|
||||
TryBase float64 `json:"try_base"`
|
||||
Try1 float64 `json:"try1"`
|
||||
Try2 float64 `json:"try2"`
|
||||
Try3 float64 `json:"try3"`
|
||||
Try4 float64 `json:"try4"`
|
||||
Try5 float64 `json:"try5"`
|
||||
Try6 float64 `json:"try6"`
|
||||
TryStep float64 `json:"try_step"`
|
||||
TryBase float64 `json:"try_base"`
|
||||
Try1 float64 `json:"try1"`
|
||||
Try2 float64 `json:"try2"`
|
||||
Try3 float64 `json:"try3"`
|
||||
Try4 float64 `json:"try4"`
|
||||
Try5 float64 `json:"try5"`
|
||||
Try6 float64 `json:"try6"`
|
||||
TryWholesaleStep float64 `json:"try_wholesale_step"`
|
||||
TryRetailStep float64 `json:"try_retail_step"`
|
||||
|
||||
UsdBase float64 `json:"usd_base"`
|
||||
Usd1 float64 `json:"usd1"`
|
||||
Usd2 float64 `json:"usd2"`
|
||||
Usd3 float64 `json:"usd3"`
|
||||
Usd4 float64 `json:"usd4"`
|
||||
Usd5 float64 `json:"usd5"`
|
||||
Usd6 float64 `json:"usd6"`
|
||||
UsdStep float64 `json:"usd_step"`
|
||||
UsdBase float64 `json:"usd_base"`
|
||||
Usd1 float64 `json:"usd1"`
|
||||
Usd2 float64 `json:"usd2"`
|
||||
Usd3 float64 `json:"usd3"`
|
||||
Usd4 float64 `json:"usd4"`
|
||||
Usd5 float64 `json:"usd5"`
|
||||
Usd6 float64 `json:"usd6"`
|
||||
UsdWholesaleStep float64 `json:"usd_wholesale_step"`
|
||||
UsdRetailStep float64 `json:"usd_retail_step"`
|
||||
|
||||
EurBase float64 `json:"eur_base"`
|
||||
Eur1 float64 `json:"eur1"`
|
||||
Eur2 float64 `json:"eur2"`
|
||||
Eur3 float64 `json:"eur3"`
|
||||
Eur4 float64 `json:"eur4"`
|
||||
Eur5 float64 `json:"eur5"`
|
||||
Eur6 float64 `json:"eur6"`
|
||||
EurStep float64 `json:"eur_step"`
|
||||
EurBase float64 `json:"eur_base"`
|
||||
Eur1 float64 `json:"eur1"`
|
||||
Eur2 float64 `json:"eur2"`
|
||||
Eur3 float64 `json:"eur3"`
|
||||
Eur4 float64 `json:"eur4"`
|
||||
Eur5 float64 `json:"eur5"`
|
||||
Eur6 float64 `json:"eur6"`
|
||||
EurWholesaleStep float64 `json:"eur_wholesale_step"`
|
||||
EurRetailStep float64 `json:"eur_retail_step"`
|
||||
}
|
||||
|
||||
type PricingRuleSaveItem struct {
|
||||
@@ -135,32 +143,35 @@ type PricingRuleSaveItem struct {
|
||||
|
||||
IsActive bool `json:"is_active"`
|
||||
|
||||
TryBase float64 `json:"try_base"`
|
||||
Try1 float64 `json:"try1"`
|
||||
Try2 float64 `json:"try2"`
|
||||
Try3 float64 `json:"try3"`
|
||||
Try4 float64 `json:"try4"`
|
||||
Try5 float64 `json:"try5"`
|
||||
Try6 float64 `json:"try6"`
|
||||
TryStep float64 `json:"try_step"`
|
||||
TryBase float64 `json:"try_base"`
|
||||
Try1 float64 `json:"try1"`
|
||||
Try2 float64 `json:"try2"`
|
||||
Try3 float64 `json:"try3"`
|
||||
Try4 float64 `json:"try4"`
|
||||
Try5 float64 `json:"try5"`
|
||||
Try6 float64 `json:"try6"`
|
||||
TryWholesaleStep float64 `json:"try_wholesale_step"`
|
||||
TryRetailStep float64 `json:"try_retail_step"`
|
||||
|
||||
UsdBase float64 `json:"usd_base"`
|
||||
Usd1 float64 `json:"usd1"`
|
||||
Usd2 float64 `json:"usd2"`
|
||||
Usd3 float64 `json:"usd3"`
|
||||
Usd4 float64 `json:"usd4"`
|
||||
Usd5 float64 `json:"usd5"`
|
||||
Usd6 float64 `json:"usd6"`
|
||||
UsdStep float64 `json:"usd_step"`
|
||||
UsdBase float64 `json:"usd_base"`
|
||||
Usd1 float64 `json:"usd1"`
|
||||
Usd2 float64 `json:"usd2"`
|
||||
Usd3 float64 `json:"usd3"`
|
||||
Usd4 float64 `json:"usd4"`
|
||||
Usd5 float64 `json:"usd5"`
|
||||
Usd6 float64 `json:"usd6"`
|
||||
UsdWholesaleStep float64 `json:"usd_wholesale_step"`
|
||||
UsdRetailStep float64 `json:"usd_retail_step"`
|
||||
|
||||
EurBase float64 `json:"eur_base"`
|
||||
Eur1 float64 `json:"eur1"`
|
||||
Eur2 float64 `json:"eur2"`
|
||||
Eur3 float64 `json:"eur3"`
|
||||
Eur4 float64 `json:"eur4"`
|
||||
Eur5 float64 `json:"eur5"`
|
||||
Eur6 float64 `json:"eur6"`
|
||||
EurStep float64 `json:"eur_step"`
|
||||
EurBase float64 `json:"eur_base"`
|
||||
Eur1 float64 `json:"eur1"`
|
||||
Eur2 float64 `json:"eur2"`
|
||||
Eur3 float64 `json:"eur3"`
|
||||
Eur4 float64 `json:"eur4"`
|
||||
Eur5 float64 `json:"eur5"`
|
||||
Eur6 float64 `json:"eur6"`
|
||||
EurWholesaleStep float64 `json:"eur_wholesale_step"`
|
||||
EurRetailStep float64 `json:"eur_retail_step"`
|
||||
}
|
||||
|
||||
func ListPricingRules(ctx context.Context, pg *sql.DB) ([]PricingRuleRow, error) {
|
||||
@@ -188,7 +199,8 @@ SELECT
|
||||
COALESCE(tx.m4, 0)::float8 AS try4,
|
||||
COALESCE(tx.m5, 0)::float8 AS try5,
|
||||
COALESCE(tx.m6, 0)::float8 AS try6,
|
||||
COALESCE(tr.step, 0)::float8 AS try_step,
|
||||
COALESCE(NULLIF(tr.wholesale_step, 0), tr.step, 0)::float8 AS try_wholesale_step,
|
||||
COALESCE(NULLIF(tr.retail_step, 0), tr.step, 0)::float8 AS try_retail_step,
|
||||
|
||||
COALESCE(ux.base_mult, 0)::float8 AS usd_base,
|
||||
COALESCE(ux.m1, 0)::float8 AS usd1,
|
||||
@@ -197,7 +209,8 @@ SELECT
|
||||
COALESCE(ux.m4, 0)::float8 AS usd4,
|
||||
COALESCE(ux.m5, 0)::float8 AS usd5,
|
||||
COALESCE(ux.m6, 0)::float8 AS usd6,
|
||||
COALESCE(ur.step, 0)::float8 AS usd_step,
|
||||
COALESCE(NULLIF(ur.wholesale_step, 0), ur.step, 0)::float8 AS usd_wholesale_step,
|
||||
COALESCE(NULLIF(ur.retail_step, 0), ur.step, 0)::float8 AS usd_retail_step,
|
||||
|
||||
COALESCE(ex.base_mult, 0)::float8 AS eur_base,
|
||||
COALESCE(ex.m1, 0)::float8 AS eur1,
|
||||
@@ -206,7 +219,8 @@ SELECT
|
||||
COALESCE(ex.m4, 0)::float8 AS eur4,
|
||||
COALESCE(ex.m5, 0)::float8 AS eur5,
|
||||
COALESCE(ex.m6, 0)::float8 AS eur6,
|
||||
COALESCE(er.step, 0)::float8 AS eur_step
|
||||
COALESCE(NULLIF(er.wholesale_step, 0), er.step, 0)::float8 AS eur_wholesale_step,
|
||||
COALESCE(NULLIF(er.retail_step, 0), er.step, 0)::float8 AS eur_retail_step
|
||||
FROM mk_pricing_rule r
|
||||
LEFT JOIN mk_pricex tx ON tx.rule_id = r.id AND tx.currency='TRY'
|
||||
LEFT JOIN mk_pricex ux ON ux.rule_id = r.id AND ux.currency='USD'
|
||||
@@ -240,9 +254,9 @@ ORDER BY r.created_at DESC;
|
||||
pq.Array(&r.BrandGroupSec),
|
||||
&r.IsActive,
|
||||
|
||||
&r.TryBase, &r.Try1, &r.Try2, &r.Try3, &r.Try4, &r.Try5, &r.Try6, &r.TryStep,
|
||||
&r.UsdBase, &r.Usd1, &r.Usd2, &r.Usd3, &r.Usd4, &r.Usd5, &r.Usd6, &r.UsdStep,
|
||||
&r.EurBase, &r.Eur1, &r.Eur2, &r.Eur3, &r.Eur4, &r.Eur5, &r.Eur6, &r.EurStep,
|
||||
&r.TryBase, &r.Try1, &r.Try2, &r.Try3, &r.Try4, &r.Try5, &r.Try6, &r.TryWholesaleStep, &r.TryRetailStep,
|
||||
&r.UsdBase, &r.Usd1, &r.Usd2, &r.Usd3, &r.Usd4, &r.Usd5, &r.Usd6, &r.UsdWholesaleStep, &r.UsdRetailStep,
|
||||
&r.EurBase, &r.Eur1, &r.Eur2, &r.Eur3, &r.Eur4, &r.Eur5, &r.Eur6, &r.EurWholesaleStep, &r.EurRetailStep,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -357,33 +371,35 @@ ON CONFLICT (rule_id, currency) DO UPDATE SET
|
||||
`, id, cur, base, m1, m2, m3, m4, m5, m6)
|
||||
return err
|
||||
}
|
||||
upsertRoll := func(cur string, step float64) error {
|
||||
upsertRoll := func(cur string, wholesaleStep, retailStep float64) error {
|
||||
_, err := tx.ExecContext(ctx, `
|
||||
INSERT INTO mk_priceroll (rule_id, currency, step, created_at, updated_at)
|
||||
VALUES ($1,$2,$3,now(),now())
|
||||
INSERT INTO mk_priceroll (rule_id, currency, step, wholesale_step, retail_step, created_at, updated_at)
|
||||
VALUES ($1,$2,$3,$4,$5,now(),now())
|
||||
ON CONFLICT (rule_id, currency) DO UPDATE SET
|
||||
step=EXCLUDED.step,
|
||||
wholesale_step=EXCLUDED.wholesale_step,
|
||||
retail_step=EXCLUDED.retail_step,
|
||||
updated_at=now()
|
||||
`, id, cur, step)
|
||||
`, id, cur, wholesaleStep, wholesaleStep, retailStep)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := upsertX("TRY", item.TryBase, item.Try1, item.Try2, item.Try3, item.Try4, item.Try5, item.Try6); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if err := upsertRoll("TRY", item.TryStep); err != nil {
|
||||
if err := upsertRoll("TRY", item.TryWholesaleStep, item.TryRetailStep); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if err := upsertX("USD", item.UsdBase, item.Usd1, item.Usd2, item.Usd3, item.Usd4, item.Usd5, item.Usd6); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if err := upsertRoll("USD", item.UsdStep); err != nil {
|
||||
if err := upsertRoll("USD", item.UsdWholesaleStep, item.UsdRetailStep); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if err := upsertX("EUR", item.EurBase, item.Eur1, item.Eur2, item.Eur3, item.Eur4, item.Eur5, item.Eur6); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if err := upsertRoll("EUR", item.EurStep); err != nil {
|
||||
if err := upsertRoll("EUR", item.EurWholesaleStep, item.EurRetailStep); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user