95 lines
2.7 KiB
JavaScript
95 lines
2.7 KiB
JavaScript
'use strict'
|
|
|
|
const { execute, queryOne, query } = require('../database/postgres')
|
|
|
|
/**
|
|
* Pedidos Recorrentes — FUT-02
|
|
* Permite que clientes PJ (e PF) agendem recompras automáticas.
|
|
*/
|
|
class PedidoRecorrente {
|
|
static listByUser(userId, tenantId) {
|
|
return query(
|
|
`SELECT pr.*, cl.nome AS cliente_nome
|
|
FROM pedidos_recorrentes pr
|
|
LEFT JOIN clientes cl ON cl.id = pr.cliente_id
|
|
WHERE pr.user_id = $1 AND pr.tenant_id = $2
|
|
ORDER BY pr.created_at DESC`,
|
|
[userId, tenantId]
|
|
)
|
|
}
|
|
|
|
static findById(id, userId) {
|
|
return queryOne(
|
|
`SELECT * FROM pedidos_recorrentes WHERE id = $1 AND user_id = $2`,
|
|
[id, userId]
|
|
)
|
|
}
|
|
|
|
static create({ tenant_id, user_id, cliente_id, nome, itens, frequencia, proximo_em }) {
|
|
return queryOne(
|
|
`INSERT INTO pedidos_recorrentes
|
|
(tenant_id,user_id,cliente_id,nome,itens,frequencia,proximo_em)
|
|
VALUES ($1,$2,$3,$4,$5,$6,$7)
|
|
RETURNING *`,
|
|
[tenant_id || 1, user_id, cliente_id || null, nome, JSON.stringify(itens || []), frequencia || 'mensal', proximo_em]
|
|
)
|
|
}
|
|
|
|
static update(id, userId, { nome, itens, frequencia, proximo_em, pausado }) {
|
|
return execute(
|
|
`UPDATE pedidos_recorrentes
|
|
SET nome=$1, itens=$2, frequencia=$3, proximo_em=$4, pausado=$5, updated_at=NOW()
|
|
WHERE id=$6 AND user_id=$7`,
|
|
[nome, JSON.stringify(itens || []), frequencia, proximo_em, pausado ?? false, id, userId]
|
|
)
|
|
}
|
|
|
|
static togglePausa(id, userId, pausado) {
|
|
return execute(
|
|
`UPDATE pedidos_recorrentes SET pausado=$1, updated_at=NOW() WHERE id=$2 AND user_id=$3`,
|
|
[pausado, id, userId]
|
|
)
|
|
}
|
|
|
|
static remove(id, userId) {
|
|
return execute(
|
|
`DELETE FROM pedidos_recorrentes WHERE id=$1 AND user_id=$2`,
|
|
[id, userId]
|
|
)
|
|
}
|
|
|
|
/** Retorna todos os recorrentes vencidos hoje (para o job diário) */
|
|
static listDue(tenantId) {
|
|
return query(
|
|
`SELECT pr.*, u.telefone AS user_telefone
|
|
FROM pedidos_recorrentes pr
|
|
LEFT JOIN users u ON u.id = pr.user_id
|
|
WHERE pr.tenant_id = $1
|
|
AND pr.ativo = TRUE
|
|
AND pr.pausado = FALSE
|
|
AND pr.proximo_em <= CURRENT_DATE`,
|
|
[tenantId]
|
|
)
|
|
}
|
|
|
|
/** Atualiza proximo_em após execução */
|
|
static avancaProximo(id, frequencia) {
|
|
const intervalMap = {
|
|
semanal: '7 days',
|
|
quinzenal: '14 days',
|
|
mensal: '1 month',
|
|
bimestral: '2 months',
|
|
trimestral: '3 months',
|
|
}
|
|
const interval = intervalMap[frequencia] || '1 month'
|
|
return execute(
|
|
`UPDATE pedidos_recorrentes
|
|
SET proximo_em = proximo_em + $1::INTERVAL, updated_at = NOW()
|
|
WHERE id = $2`,
|
|
[interval, id]
|
|
)
|
|
}
|
|
}
|
|
|
|
module.exports = PedidoRecorrente
|