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

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