Files
mercado.clube67.com/backend/models/RaffleDiscount.js
T

58 lines
1.6 KiB
JavaScript

'use strict'
const { query, execute, queryOne } = require('../database/postgres')
class RaffleDiscount {
static listByRaffle(raffleId) {
return query(
`SELECT id, min_qty, discount_pct, active
FROM raffle_discounts
WHERE raffle_id = $1
ORDER BY min_qty ASC`,
[raffleId]
)
}
// Returns the best (highest) active discount for the given quantity
static getBestForQty(raffleId, qty) {
return queryOne(
`SELECT id, min_qty, discount_pct
FROM raffle_discounts
WHERE raffle_id = $1 AND min_qty <= $2 AND active = TRUE
ORDER BY discount_pct DESC
LIMIT 1`,
[raffleId, qty]
)
}
// Returns the next discount tier above current qty (for "buy X more" hint)
static getNextTier(raffleId, qty) {
return queryOne(
`SELECT id, min_qty, discount_pct
FROM raffle_discounts
WHERE raffle_id = $1 AND min_qty > $2 AND active = TRUE
ORDER BY min_qty ASC
LIMIT 1`,
[raffleId, qty]
)
}
static deleteByRaffle(raffleId) {
return execute('DELETE FROM raffle_discounts WHERE raffle_id = $1', [raffleId])
}
static bulkInsert(raffleId, tiers) {
if (!tiers || tiers.length === 0) return Promise.resolve()
const values = tiers
.map((t, i) => `($1, $${i * 2 + 2}, $${i * 2 + 3}, TRUE)`)
.join(', ')
const params = [raffleId, ...tiers.flatMap(t => [parseInt(t.min_qty), parseFloat(t.discount_pct)])]
return execute(
`INSERT INTO raffle_discounts (raffle_id, min_qty, discount_pct, active) VALUES ${values}`,
params
)
}
}
module.exports = RaffleDiscount