148 lines
4.7 KiB
JavaScript
148 lines
4.7 KiB
JavaScript
'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
|