feat: initial project structure (Model Project) - Backend + Multi-Frontend + Docker
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
'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
|
||||
Reference in New Issue
Block a user