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

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