'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