58 lines
1.6 KiB
JavaScript
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
|