'use strict' const Produto = require('../models/Produto') const produtoController = { async list(req, res) { try { const tenantId = req.tenant.id const { search, categoria, ativo, limit, offset } = req.query const rows = await Produto.list(tenantId, { search, categoria, ativo: ativo === undefined ? true : ativo === 'true', limit, offset, }) res.json(rows) } catch (err) { console.error('[produto.list]', err.message) res.status(500).json({ error: 'Erro ao listar produtos' }) } }, async listAll(req, res) { try { const tenantId = req.tenant.id const { search, categoria, limit, offset } = req.query const rows = await Produto.list(tenantId, { search, categoria, limit, offset }) res.json(rows) } catch (err) { res.status(500).json({ error: 'Erro ao listar produtos' }) } }, async listCategorias(req, res) { try { const rows = await Produto.listCategorias(req.tenant.id) res.json(rows.map(r => r.categoria)) } catch (err) { res.status(500).json({ error: 'Erro ao listar categorias' }) } }, async get(req, res) { try { const prod = await Produto.findById(req.params.id) if (!prod) return res.status(404).json({ error: 'Produto não encontrado' }) res.json(prod) } catch (err) { res.status(500).json({ error: 'Erro ao buscar produto' }) } }, async create(req, res) { try { const tenantId = req.tenant.id const { sku, nome, descricao, unidade, preco, preco_promocional, estoque, categoria } = req.body if (!nome?.trim()) return res.status(400).json({ error: 'nome é obrigatório' }) if (preco === undefined || preco === null) return res.status(400).json({ error: 'preco é obrigatório' }) if (sku) { const existe = await Produto.findBySku(sku, tenantId) if (existe) return res.status(409).json({ error: 'SKU já cadastrado' }) } const prod = await Produto.create({ tenant_id: tenantId, sku, nome: nome.trim(), descricao, unidade, preco, preco_promocional: preco_promocional || null, estoque, categoria }) res.status(201).json(prod) } catch (err) { console.error('[produto.create]', err.message) res.status(500).json({ error: 'Erro ao criar produto' }) } }, async update(req, res) { try { const prod = await Produto.findById(req.params.id) if (!prod) return res.status(404).json({ error: 'Produto não encontrado' }) await Produto.update(req.params.id, req.body) res.json({ ok: true }) } catch (err) { res.status(500).json({ error: 'Erro ao atualizar produto' }) } }, async updateEstoque(req, res) { try { const { estoque } = req.body if (estoque === undefined) return res.status(400).json({ error: 'estoque é obrigatório' }) await Produto.updateEstoque(req.params.id, estoque) res.json({ ok: true }) } catch (err) { res.status(500).json({ error: 'Erro ao atualizar estoque' }) } }, async updatePreco(req, res) { try { const { preco } = req.body if (preco === undefined) return res.status(400).json({ error: 'preco é obrigatório' }) await Produto.updatePreco(req.params.id, preco) res.json({ ok: true }) } catch (err) { res.status(500).json({ error: 'Erro ao atualizar preço' }) } }, async remove(req, res) { try { await Produto.delete(req.params.id) res.json({ ok: true }) } catch (err) { res.status(500).json({ error: 'Erro ao remover produto' }) } }, // Importação CSV — recebe array de produtos no body async importar(req, res) { try { const tenantId = req.tenant.id const { produtos } = req.body if (!Array.isArray(produtos) || produtos.length === 0) { return res.status(400).json({ error: 'produtos deve ser um array não vazio' }) } const resultados = { inseridos: 0, atualizados: 0, erros: [] } for (const p of produtos) { if (!p.nome || !p.sku) { resultados.erros.push({ sku: p.sku || '?', erro: 'nome e sku são obrigatórios' }) continue } try { const res2 = await Produto.upsertBySku({ tenant_id: tenantId, ...p }) // ON CONFLICT atualiza → xmax > 0 indica UPDATE if (res2 && res2.xmax && res2.xmax !== '0') resultados.atualizados++ else resultados.inseridos++ } catch (e) { resultados.erros.push({ sku: p.sku, erro: e.message }) } } res.json(resultados) } catch (err) { console.error('[produto.importar]', err.message) res.status(500).json({ error: 'Erro na importação' }) } }, } module.exports = produtoController