63 lines
2.0 KiB
JavaScript
63 lines
2.0 KiB
JavaScript
'use strict'
|
|
|
|
const { execute, queryOne, query } = require('../database/postgres')
|
|
const Raffle = require('./Raffle')
|
|
|
|
class PriceRule {
|
|
static async create({ raffle_id, rule_type, price, start_at, end_at, priority }) {
|
|
return execute(
|
|
`INSERT INTO raffle_price_rules (raffle_id, rule_type, price, start_at, end_at, priority)
|
|
VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`,
|
|
[raffle_id, rule_type, price, start_at || null, end_at || null, priority || 0]
|
|
)
|
|
}
|
|
|
|
static async listByRaffle(raffle_id) {
|
|
return query(
|
|
`SELECT * FROM raffle_price_rules WHERE raffle_id = $1 AND active = 1 ORDER BY priority DESC`,
|
|
[raffle_id]
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Engine de Preço Dinâmico: Verifica qual regra está ativa agora.
|
|
* Retorna o preço apropriado e o ID da regra aplicada (se houver).
|
|
*/
|
|
static async getCurrentPrice(raffle_id) {
|
|
const rules = await this.listByRaffle(raffle_id)
|
|
const now = new Date()
|
|
|
|
let appliedRuleId = null
|
|
|
|
for (const rule of rules) {
|
|
if (rule.rule_type === 'time_range') {
|
|
const start = rule.start_at ? new Date(rule.start_at) : new Date(0)
|
|
const end = rule.end_at ? new Date(rule.end_at) : new Date(8640000000000000) // max date
|
|
if (now >= start && now <= end) {
|
|
return { price: parseFloat(rule.price), rule_id: rule.id }
|
|
}
|
|
}
|
|
|
|
if (rule.rule_type === 'fixed') {
|
|
return { price: parseFloat(rule.price), rule_id: rule.id }
|
|
}
|
|
}
|
|
|
|
// Fallback: Busca o preço padrão do sorteio
|
|
const raffle = await Raffle.findById(raffle_id)
|
|
if (!raffle) throw new Error('Sorteio não encontrado')
|
|
|
|
return { price: parseFloat(raffle.preco_numero), rule_id: null }
|
|
}
|
|
|
|
static async logPrice({ raffle_id, order_id, user_cpf, price_applied, rule_id }) {
|
|
return execute(
|
|
`INSERT INTO price_logs (raffle_id, order_id, user_cpf, price_applied, rule_id)
|
|
VALUES ($1, $2, $3, $4, $5)`,
|
|
[raffle_id, order_id || null, user_cpf || null, price_applied, rule_id || null]
|
|
)
|
|
}
|
|
}
|
|
|
|
module.exports = PriceRule
|