Add Stone Pagamentos fields: SKU, dimensões, peso, NCM, GTIN, tributos, etc

This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2026-01-14 09:50:39 -03:00
parent 15a09270a1
commit 95a7591c39
4 changed files with 294 additions and 0 deletions

View file

@ -0,0 +1,84 @@
-- Rollback Stone Pagamentos fields from products table
-- Remove índices das variantes
DROP INDEX IF EXISTS idx_product_variants_gtin;
-- Remove campos das variantes
ALTER TABLE product_variants DROP COLUMN IF EXISTS gtin;
ALTER TABLE product_variants DROP COLUMN IF EXISTS peso_liquido;
ALTER TABLE product_variants DROP COLUMN IF EXISTS peso_bruto;
ALTER TABLE product_variants DROP COLUMN IF EXISTS largura;
ALTER TABLE product_variants DROP COLUMN IF EXISTS altura;
ALTER TABLE product_variants DROP COLUMN IF EXISTS comprimento;
ALTER TABLE product_variants DROP COLUMN IF EXISTS cor;
ALTER TABLE product_variants DROP COLUMN IF EXISTS tamanho;
ALTER TABLE product_variants DROP COLUMN IF EXISTS images;
-- Remove índices dos produtos
DROP INDEX IF EXISTS idx_products_ncm;
DROP INDEX IF EXISTS idx_products_gtin;
DROP INDEX IF EXISTS idx_products_marca;
DROP INDEX IF EXISTS idx_products_slug;
DROP INDEX IF EXISTS idx_products_validade;
DROP INDEX IF EXISTS idx_products_stone_item;
-- Remove campos SEO e busca
ALTER TABLE products DROP COLUMN IF EXISTS slug;
ALTER TABLE products DROP COLUMN IF EXISTS meta_title;
ALTER TABLE products DROP COLUMN IF EXISTS meta_description;
ALTER TABLE products DROP COLUMN IF EXISTS tags;
-- Remove campos Stone específicos
ALTER TABLE products DROP COLUMN IF EXISTS stone_item_id;
ALTER TABLE products DROP COLUMN IF EXISTS stone_category_id;
ALTER TABLE products DROP COLUMN IF EXISTS stone_metadata;
-- Remove preços e custos detalhados
ALTER TABLE products DROP COLUMN IF EXISTS preco_promocional;
ALTER TABLE products DROP COLUMN IF EXISTS promocao_inicio;
ALTER TABLE products DROP COLUMN IF EXISTS promocao_fim;
ALTER TABLE products DROP COLUMN IF EXISTS custo_frete;
ALTER TABLE products DROP COLUMN IF EXISTS margem_lucro;
-- Remove controle de estoque avançado
ALTER TABLE products DROP COLUMN IF EXISTS localizacao_estoque;
ALTER TABLE products DROP COLUMN IF EXISTS lote;
ALTER TABLE products DROP COLUMN IF EXISTS data_validade;
ALTER TABLE products DROP COLUMN IF EXISTS data_fabricacao;
ALTER TABLE products DROP COLUMN IF EXISTS estoque_minimo;
ALTER TABLE products DROP COLUMN IF EXISTS estoque_maximo;
ALTER TABLE products DROP COLUMN IF EXISTS ponto_reposicao;
-- Remove campos para marketplace e e-commerce
ALTER TABLE products DROP COLUMN IF EXISTS marca;
ALTER TABLE products DROP COLUMN IF EXISTS modelo;
ALTER TABLE products DROP COLUMN IF EXISTS cor;
ALTER TABLE products DROP COLUMN IF EXISTS tamanho;
ALTER TABLE products DROP COLUMN IF EXISTS material;
ALTER TABLE products DROP COLUMN IF EXISTS genero;
-- Remove informações tributárias
ALTER TABLE products DROP COLUMN IF EXISTS icms_cst;
ALTER TABLE products DROP COLUMN IF EXISTS icms_aliquota;
ALTER TABLE products DROP COLUMN IF EXISTS ipi_cst;
ALTER TABLE products DROP COLUMN IF EXISTS ipi_aliquota;
ALTER TABLE products DROP COLUMN IF EXISTS pis_cst;
ALTER TABLE products DROP COLUMN IF EXISTS pis_aliquota;
ALTER TABLE products DROP COLUMN IF EXISTS cofins_cst;
ALTER TABLE products DROP COLUMN IF EXISTS cofins_aliquota;
-- Remove dimensões detalhadas
ALTER TABLE products DROP COLUMN IF EXISTS peso_liquido;
ALTER TABLE products DROP COLUMN IF EXISTS peso_bruto;
ALTER TABLE products DROP COLUMN IF EXISTS largura;
ALTER TABLE products DROP COLUMN IF EXISTS altura;
ALTER TABLE products DROP COLUMN IF EXISTS comprimento;
ALTER TABLE products DROP COLUMN IF EXISTS volumes;
-- Remove campos de identificação fiscal e tributária
ALTER TABLE products DROP COLUMN IF EXISTS ncm;
ALTER TABLE products DROP COLUMN IF EXISTS cest;
ALTER TABLE products DROP COLUMN IF EXISTS cfop;
ALTER TABLE products DROP COLUMN IF EXISTS origem;
ALTER TABLE products DROP COLUMN IF EXISTS gtin;
ALTER TABLE products DROP COLUMN IF EXISTS gtin_tributavel;

View file

@ -0,0 +1,84 @@
-- Stone Pagamentos compatible fields for products
-- Adiciona campos para integração com Stone e outros gateways de pagamento brasileiros
-- Campos de identificação fiscal e tributária
ALTER TABLE products ADD COLUMN IF NOT EXISTS ncm VARCHAR(10); -- Nomenclatura Comum do Mercosul
ALTER TABLE products ADD COLUMN IF NOT EXISTS cest VARCHAR(9); -- Código Especificador da Substituição Tributária
ALTER TABLE products ADD COLUMN IF NOT EXISTS cfop VARCHAR(4); -- Código Fiscal de Operações e Prestações
ALTER TABLE products ADD COLUMN IF NOT EXISTS origem INTEGER DEFAULT 0; -- Origem da mercadoria (0=Nacional, 1-8=Importado)
ALTER TABLE products ADD COLUMN IF NOT EXISTS gtin VARCHAR(14); -- Global Trade Item Number (EAN/UPC)
ALTER TABLE products ADD COLUMN IF NOT EXISTS gtin_tributavel VARCHAR(14); -- GTIN da unidade tributável
-- Dimensões detalhadas (para cálculo de frete)
ALTER TABLE products ADD COLUMN IF NOT EXISTS peso_liquido DECIMAL(10,3); -- Peso líquido em kg
ALTER TABLE products ADD COLUMN IF NOT EXISTS peso_bruto DECIMAL(10,3); -- Peso bruto em kg
ALTER TABLE products ADD COLUMN IF NOT EXISTS largura DECIMAL(10,2); -- Largura em cm
ALTER TABLE products ADD COLUMN IF NOT EXISTS altura DECIMAL(10,2); -- Altura em cm
ALTER TABLE products ADD COLUMN IF NOT EXISTS comprimento DECIMAL(10,2); -- Comprimento/Profundidade em cm
ALTER TABLE products ADD COLUMN IF NOT EXISTS volumes INTEGER DEFAULT 1; -- Quantidade de volumes
-- Informações tributárias
ALTER TABLE products ADD COLUMN IF NOT EXISTS icms_cst VARCHAR(3); -- Código de Situação Tributária ICMS
ALTER TABLE products ADD COLUMN IF NOT EXISTS icms_aliquota DECIMAL(5,2); -- Alíquota ICMS
ALTER TABLE products ADD COLUMN IF NOT EXISTS ipi_cst VARCHAR(2); -- CST do IPI
ALTER TABLE products ADD COLUMN IF NOT EXISTS ipi_aliquota DECIMAL(5,2); -- Alíquota IPI
ALTER TABLE products ADD COLUMN IF NOT EXISTS pis_cst VARCHAR(2); -- CST do PIS
ALTER TABLE products ADD COLUMN IF NOT EXISTS pis_aliquota DECIMAL(5,2); -- Alíquota PIS
ALTER TABLE products ADD COLUMN IF NOT EXISTS cofins_cst VARCHAR(2); -- CST do COFINS
ALTER TABLE products ADD COLUMN IF NOT EXISTS cofins_aliquota DECIMAL(5,2); -- Alíquota COFINS
-- Campos para marketplace e e-commerce
ALTER TABLE products ADD COLUMN IF NOT EXISTS marca VARCHAR(100); -- Marca/Fabricante
ALTER TABLE products ADD COLUMN IF NOT EXISTS modelo VARCHAR(100); -- Modelo
ALTER TABLE products ADD COLUMN IF NOT EXISTS cor VARCHAR(50); -- Cor principal
ALTER TABLE products ADD COLUMN IF NOT EXISTS tamanho VARCHAR(20); -- Tamanho (P, M, G, 38, 40, etc)
ALTER TABLE products ADD COLUMN IF NOT EXISTS material VARCHAR(100); -- Material principal
ALTER TABLE products ADD COLUMN IF NOT EXISTS genero VARCHAR(20); -- Masculino, Feminino, Unissex
-- Controle de estoque avançado
ALTER TABLE products ADD COLUMN IF NOT EXISTS localizacao_estoque VARCHAR(100); -- Localização no armazém
ALTER TABLE products ADD COLUMN IF NOT EXISTS lote VARCHAR(50); -- Número do lote
ALTER TABLE products ADD COLUMN IF NOT EXISTS data_validade DATE; -- Data de validade
ALTER TABLE products ADD COLUMN IF NOT EXISTS data_fabricacao DATE; -- Data de fabricação
ALTER TABLE products ADD COLUMN IF NOT EXISTS estoque_minimo INTEGER DEFAULT 0; -- Estoque mínimo para alerta
ALTER TABLE products ADD COLUMN IF NOT EXISTS estoque_maximo INTEGER; -- Estoque máximo
ALTER TABLE products ADD COLUMN IF NOT EXISTS ponto_reposicao INTEGER; -- Ponto de reposição
-- Preços e custos detalhados
ALTER TABLE products ADD COLUMN IF NOT EXISTS preco_promocional DECIMAL(15,2); -- Preço promocional
ALTER TABLE products ADD COLUMN IF NOT EXISTS promocao_inicio TIMESTAMPTZ; -- Início da promoção
ALTER TABLE products ADD COLUMN IF NOT EXISTS promocao_fim TIMESTAMPTZ; -- Fim da promoção
ALTER TABLE products ADD COLUMN IF NOT EXISTS custo_frete DECIMAL(15,2); -- Custo médio de frete
ALTER TABLE products ADD COLUMN IF NOT EXISTS margem_lucro DECIMAL(5,2); -- Margem de lucro %
-- Campos Stone específicos
ALTER TABLE products ADD COLUMN IF NOT EXISTS stone_item_id VARCHAR(100); -- ID do item na Stone
ALTER TABLE products ADD COLUMN IF NOT EXISTS stone_category_id VARCHAR(100); -- ID da categoria na Stone
ALTER TABLE products ADD COLUMN IF NOT EXISTS stone_metadata JSONB DEFAULT '{}'; -- Metadados Stone
-- SEO e busca
ALTER TABLE products ADD COLUMN IF NOT EXISTS slug VARCHAR(255); -- URL amigável
ALTER TABLE products ADD COLUMN IF NOT EXISTS meta_title VARCHAR(255); -- Título para SEO
ALTER TABLE products ADD COLUMN IF NOT EXISTS meta_description TEXT; -- Descrição para SEO
ALTER TABLE products ADD COLUMN IF NOT EXISTS tags TEXT[]; -- Tags para busca
-- Índices para novos campos
CREATE INDEX IF NOT EXISTS idx_products_ncm ON products(ncm);
CREATE INDEX IF NOT EXISTS idx_products_gtin ON products(gtin);
CREATE INDEX IF NOT EXISTS idx_products_marca ON products(marca);
CREATE INDEX IF NOT EXISTS idx_products_slug ON products(slug);
CREATE INDEX IF NOT EXISTS idx_products_validade ON products(data_validade);
CREATE INDEX IF NOT EXISTS idx_products_stone_item ON products(stone_item_id);
-- Também adicionar campos similares nas variantes
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS gtin VARCHAR(14);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS peso_liquido DECIMAL(10,3);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS peso_bruto DECIMAL(10,3);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS largura DECIMAL(10,2);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS altura DECIMAL(10,2);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS comprimento DECIMAL(10,2);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS cor VARCHAR(50);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS tamanho VARCHAR(20);
ALTER TABLE product_variants ADD COLUMN IF NOT EXISTS images JSONB DEFAULT '[]';
CREATE INDEX IF NOT EXISTS idx_product_variants_gtin ON product_variants(gtin);

View file

@ -983,6 +983,59 @@ diesel::table! {
barcode -> Nullable<Varchar>,
created_at -> Timestamptz,
updated_at -> Timestamptz,
// Campos fiscais e tributários (Stone/Brasil)
ncm -> Nullable<Varchar>,
cest -> Nullable<Varchar>,
cfop -> Nullable<Varchar>,
origem -> Nullable<Int4>,
gtin -> Nullable<Varchar>,
gtin_tributavel -> Nullable<Varchar>,
// Dimensões detalhadas (frete)
peso_liquido -> Nullable<Numeric>,
peso_bruto -> Nullable<Numeric>,
largura -> Nullable<Numeric>,
altura -> Nullable<Numeric>,
comprimento -> Nullable<Numeric>,
volumes -> Nullable<Int4>,
// Informações tributárias
icms_cst -> Nullable<Varchar>,
icms_aliquota -> Nullable<Numeric>,
ipi_cst -> Nullable<Varchar>,
ipi_aliquota -> Nullable<Numeric>,
pis_cst -> Nullable<Varchar>,
pis_aliquota -> Nullable<Numeric>,
cofins_cst -> Nullable<Varchar>,
cofins_aliquota -> Nullable<Numeric>,
// Marketplace e e-commerce
marca -> Nullable<Varchar>,
modelo -> Nullable<Varchar>,
cor -> Nullable<Varchar>,
tamanho -> Nullable<Varchar>,
material -> Nullable<Varchar>,
genero -> Nullable<Varchar>,
// Controle de estoque avançado
localizacao_estoque -> Nullable<Varchar>,
lote -> Nullable<Varchar>,
data_validade -> Nullable<Date>,
data_fabricacao -> Nullable<Date>,
estoque_minimo -> Nullable<Int4>,
estoque_maximo -> Nullable<Int4>,
ponto_reposicao -> Nullable<Int4>,
// Preços e custos detalhados
preco_promocional -> Nullable<Numeric>,
promocao_inicio -> Nullable<Timestamptz>,
promocao_fim -> Nullable<Timestamptz>,
custo_frete -> Nullable<Numeric>,
margem_lucro -> Nullable<Numeric>,
// Campos Stone específicos
stone_item_id -> Nullable<Varchar>,
stone_category_id -> Nullable<Varchar>,
stone_metadata -> Nullable<Jsonb>,
// SEO e busca
slug -> Nullable<Varchar>,
meta_title -> Nullable<Varchar>,
meta_description -> Nullable<Text>,
tags -> Nullable<Array<Nullable<Text>>>,
}
}
@ -1080,6 +1133,16 @@ diesel::table! {
attributes -> Jsonb,
is_active -> Bool,
created_at -> Timestamptz,
// Stone/Brasil fields
gtin -> Nullable<Varchar>,
peso_liquido -> Nullable<Numeric>,
peso_bruto -> Nullable<Numeric>,
largura -> Nullable<Numeric>,
altura -> Nullable<Numeric>,
comprimento -> Nullable<Numeric>,
cor -> Nullable<Varchar>,
tamanho -> Nullable<Varchar>,
images -> Nullable<Jsonb>,
}
}

View file

@ -48,6 +48,59 @@ pub struct Product {
pub barcode: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
// Campos fiscais e tributários (Stone/Brasil)
pub ncm: Option<String>,
pub cest: Option<String>,
pub cfop: Option<String>,
pub origem: Option<i32>,
pub gtin: Option<String>,
pub gtin_tributavel: Option<String>,
// Dimensões detalhadas (frete)
pub peso_liquido: Option<BigDecimal>,
pub peso_bruto: Option<BigDecimal>,
pub largura: Option<BigDecimal>,
pub altura: Option<BigDecimal>,
pub comprimento: Option<BigDecimal>,
pub volumes: Option<i32>,
// Informações tributárias
pub icms_cst: Option<String>,
pub icms_aliquota: Option<BigDecimal>,
pub ipi_cst: Option<String>,
pub ipi_aliquota: Option<BigDecimal>,
pub pis_cst: Option<String>,
pub pis_aliquota: Option<BigDecimal>,
pub cofins_cst: Option<String>,
pub cofins_aliquota: Option<BigDecimal>,
// Marketplace e e-commerce
pub marca: Option<String>,
pub modelo: Option<String>,
pub cor: Option<String>,
pub tamanho: Option<String>,
pub material: Option<String>,
pub genero: Option<String>,
// Controle de estoque avançado
pub localizacao_estoque: Option<String>,
pub lote: Option<String>,
pub data_validade: Option<chrono::NaiveDate>,
pub data_fabricacao: Option<chrono::NaiveDate>,
pub estoque_minimo: Option<i32>,
pub estoque_maximo: Option<i32>,
pub ponto_reposicao: Option<i32>,
// Preços e custos detalhados
pub preco_promocional: Option<BigDecimal>,
pub promocao_inicio: Option<DateTime<Utc>>,
pub promocao_fim: Option<DateTime<Utc>>,
pub custo_frete: Option<BigDecimal>,
pub margem_lucro: Option<BigDecimal>,
// Campos Stone específicos
pub stone_item_id: Option<String>,
pub stone_category_id: Option<String>,
pub stone_metadata: Option<serde_json::Value>,
// SEO e busca
pub slug: Option<String>,
pub meta_title: Option<String>,
pub meta_description: Option<String>,
pub tags: Option<Vec<Option<String>>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Queryable, Insertable, AsChangeset)]
@ -145,6 +198,16 @@ pub struct ProductVariant {
pub attributes: serde_json::Value,
pub is_active: bool,
pub created_at: DateTime<Utc>,
// Stone/Brasil fields
pub gtin: Option<String>,
pub peso_liquido: Option<BigDecimal>,
pub peso_bruto: Option<BigDecimal>,
pub largura: Option<BigDecimal>,
pub altura: Option<BigDecimal>,
pub comprimento: Option<BigDecimal>,
pub cor: Option<String>,
pub tamanho: Option<String>,
pub images: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize)]