97 lines
3.1 KiB
JavaScript
97 lines
3.1 KiB
JavaScript
'use strict'
|
|
|
|
const MensagemInterna = require('../models/MensagemInterna')
|
|
|
|
const SETORES_VALIDOS = ['geral','atendimento','cotacao','separacao','embalagem','auditoria','fiscal','expedicao','financeiro','suporte']
|
|
|
|
const inboxController = {
|
|
// INB-01 — Lista mensagens de um setor
|
|
async listBySetor(req, res) {
|
|
try {
|
|
const { setor } = req.params
|
|
if (!SETORES_VALIDOS.includes(setor)) return res.status(400).json({ error: 'Setor inválido' })
|
|
const somenteNaoLidas = req.query.nao_lidas === 'true'
|
|
const rows = await MensagemInterna.listBySetor(req.tenant.id, setor, somenteNaoLidas)
|
|
res.json(rows)
|
|
} catch (err) {
|
|
res.status(500).json({ error: 'Erro ao listar inbox' })
|
|
}
|
|
},
|
|
|
|
// INB-02 — Lista mensagens de um pedido
|
|
async listByPedido(req, res) {
|
|
try {
|
|
const rows = await MensagemInterna.listByPedido(req.params.pedidoId)
|
|
res.json(rows)
|
|
} catch (err) {
|
|
res.status(500).json({ error: 'Erro ao listar mensagens do pedido' })
|
|
}
|
|
},
|
|
|
|
// INB-02 — Envia mensagem interna (setor + pedido opcional)
|
|
async enviar(req, res) {
|
|
try {
|
|
const { pedido_id, setor, mensagem } = req.body
|
|
if (!setor || !mensagem) return res.status(400).json({ error: 'setor e mensagem são obrigatórios' })
|
|
if (!SETORES_VALIDOS.includes(setor)) return res.status(400).json({ error: 'Setor inválido' })
|
|
|
|
const remetente = req.user?.nome || req.user?.email || 'Sistema'
|
|
const result = await MensagemInterna.create({
|
|
tenantId: req.tenant.id,
|
|
pedidoId: pedido_id || null,
|
|
setor,
|
|
remetente,
|
|
mensagem,
|
|
})
|
|
res.status(201).json({ ok: true, id: result.id })
|
|
} catch (err) {
|
|
console.error('[inbox.enviar]', err.message)
|
|
res.status(500).json({ error: 'Erro ao enviar mensagem' })
|
|
}
|
|
},
|
|
|
|
// INB-03 — Badge: contagem de não lidas por setor
|
|
async contadores(req, res) {
|
|
try {
|
|
const rows = await MensagemInterna.contadorNaoLidas(req.tenant.id)
|
|
const total = await MensagemInterna.totalNaoLidas(req.tenant.id)
|
|
res.json({ total: Number(total?.total ?? 0), por_setor: rows })
|
|
} catch (err) {
|
|
res.status(500).json({ error: 'Erro ao buscar contadores' })
|
|
}
|
|
},
|
|
|
|
// Marcar lida
|
|
async marcarLida(req, res) {
|
|
try {
|
|
await MensagemInterna.marcarLida(req.params.id)
|
|
res.json({ ok: true })
|
|
} catch (err) {
|
|
res.status(500).json({ error: 'Erro ao marcar lida' })
|
|
}
|
|
},
|
|
|
|
// Marcar todas lidas de um pedido
|
|
async marcarTodasPedido(req, res) {
|
|
try {
|
|
await MensagemInterna.marcarTodasLidasPorPedido(req.params.pedidoId)
|
|
res.json({ ok: true })
|
|
} catch (err) {
|
|
res.status(500).json({ error: 'Erro ao marcar lidas' })
|
|
}
|
|
},
|
|
|
|
// Marcar todas lidas de um setor
|
|
async marcarTodasSetor(req, res) {
|
|
try {
|
|
const { setor } = req.params
|
|
await MensagemInterna.marcarTodasLidasPorSetor(req.tenant.id, setor)
|
|
res.json({ ok: true })
|
|
} catch (err) {
|
|
res.status(500).json({ error: 'Erro ao marcar lidas' })
|
|
}
|
|
},
|
|
}
|
|
|
|
module.exports = inboxController
|