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

86 lines
3.4 KiB
JavaScript

'use strict'
const { execute, queryOne, query } = require('../database/postgres')
class Produto {
static findById(id) {
return queryOne(`SELECT * FROM produtos WHERE id = $1`, [id])
}
static findBySku(sku, tenantId) {
return queryOne('SELECT * FROM produtos WHERE sku = $1 AND tenant_id = $2', [sku, tenantId])
}
static list(tenantId, { search, categoria, ativo, limit = 50, offset = 0 } = {}) {
const params = [tenantId]
let where = 'WHERE p.tenant_id = $1'
if (ativo !== undefined) { params.push(ativo); where += ` AND p.ativo = $${params.length}` }
if (categoria) { params.push(categoria); where += ` AND p.categoria = $${params.length}` }
if (search) {
params.push(`%${search.replace(/[%_]/g, '\\$&')}%`)
where += ` AND (p.nome ILIKE $${params.length} OR p.sku ILIKE $${params.length} OR p.descricao ILIKE $${params.length})`
}
params.push(Math.min(Number(limit) || 50, 500))
params.push(Math.max(Number(offset) || 0, 0))
return query(
`SELECT * FROM produtos p
${where}
ORDER BY p.nome ASC
LIMIT $${params.length - 1} OFFSET $${params.length}`,
params
)
}
static listCategorias(tenantId) {
return query(
`SELECT DISTINCT categoria FROM produtos WHERE tenant_id = $1 AND categoria IS NOT NULL ORDER BY categoria`,
[tenantId]
)
}
static create({ tenant_id, sku, nome, descricao, unidade, preco, preco_promocional, estoque, categoria, imagem }) {
return execute(
`INSERT INTO produtos (tenant_id,sku,nome,descricao,unidade,preco,preco_promocional,estoque,categoria,imagem)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10) RETURNING *`,
[tenant_id, sku || null, nome, descricao || null, unidade || 'un',
preco || 0, preco_promocional || null, estoque || 0, categoria || null, imagem || null]
)
}
static update(id, { sku, nome, descricao, unidade, preco, preco_promocional, estoque, categoria, imagem, ativo }) {
return execute(
`UPDATE produtos SET sku=$1,nome=$2,descricao=$3,unidade=$4,preco=$5,preco_promocional=$6,
estoque=$7,categoria=$8,imagem=$9,ativo=$10,updated_at=NOW() WHERE id=$11`,
[sku || null, nome, descricao || null, unidade || 'un',
preco, preco_promocional || null, estoque, categoria || null, imagem || null, ativo !== false, id]
)
}
static updateEstoque(id, estoque) {
return execute('UPDATE produtos SET estoque=$1, updated_at=NOW() WHERE id=$2', [estoque, id])
}
static updatePreco(id, preco) {
return execute('UPDATE produtos SET preco=$1, updated_at=NOW() WHERE id=$2', [preco, id])
}
static delete(id) {
return execute('DELETE FROM produtos WHERE id = $1', [id])
}
// Upsert por SKU — usado na importação CSV
static upsertBySku({ tenant_id, sku, nome, descricao, unidade, preco, preco_promocional, estoque, categoria }) {
return execute(
`INSERT INTO produtos (tenant_id,sku,nome,descricao,unidade,preco,preco_promocional,estoque,categoria)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)
ON CONFLICT (sku, tenant_id) DO UPDATE
SET nome=$3, descricao=$4, unidade=$5, preco=$6, preco_promocional=$7, estoque=$8, categoria=$9, updated_at=NOW()
RETURNING *`,
[tenant_id, sku, nome, descricao || null, unidade || 'un',
preco || 0, preco_promocional || null, estoque || 0, categoria || null]
)
}
}
module.exports = Produto