diff --git a/migrations/20250114000001_add_stone_product_fields/down.sql b/migrations/20250114000001_add_stone_product_fields/down.sql new file mode 100644 index 000000000..12b1661c7 --- /dev/null +++ b/migrations/20250114000001_add_stone_product_fields/down.sql @@ -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; diff --git a/migrations/20250114000001_add_stone_product_fields/up.sql b/migrations/20250114000001_add_stone_product_fields/up.sql new file mode 100644 index 000000000..719571146 --- /dev/null +++ b/migrations/20250114000001_add_stone_product_fields/up.sql @@ -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); diff --git a/src/core/shared/schema.rs b/src/core/shared/schema.rs index 8014960c9..c4079ccfb 100644 --- a/src/core/shared/schema.rs +++ b/src/core/shared/schema.rs @@ -983,6 +983,59 @@ diesel::table! { barcode -> Nullable, created_at -> Timestamptz, updated_at -> Timestamptz, + // Campos fiscais e tributários (Stone/Brasil) + ncm -> Nullable, + cest -> Nullable, + cfop -> Nullable, + origem -> Nullable, + gtin -> Nullable, + gtin_tributavel -> Nullable, + // Dimensões detalhadas (frete) + peso_liquido -> Nullable, + peso_bruto -> Nullable, + largura -> Nullable, + altura -> Nullable, + comprimento -> Nullable, + volumes -> Nullable, + // Informações tributárias + icms_cst -> Nullable, + icms_aliquota -> Nullable, + ipi_cst -> Nullable, + ipi_aliquota -> Nullable, + pis_cst -> Nullable, + pis_aliquota -> Nullable, + cofins_cst -> Nullable, + cofins_aliquota -> Nullable, + // Marketplace e e-commerce + marca -> Nullable, + modelo -> Nullable, + cor -> Nullable, + tamanho -> Nullable, + material -> Nullable, + genero -> Nullable, + // Controle de estoque avançado + localizacao_estoque -> Nullable, + lote -> Nullable, + data_validade -> Nullable, + data_fabricacao -> Nullable, + estoque_minimo -> Nullable, + estoque_maximo -> Nullable, + ponto_reposicao -> Nullable, + // Preços e custos detalhados + preco_promocional -> Nullable, + promocao_inicio -> Nullable, + promocao_fim -> Nullable, + custo_frete -> Nullable, + margem_lucro -> Nullable, + // Campos Stone específicos + stone_item_id -> Nullable, + stone_category_id -> Nullable, + stone_metadata -> Nullable, + // SEO e busca + slug -> Nullable, + meta_title -> Nullable, + meta_description -> Nullable, + tags -> Nullable>>, } } @@ -1080,6 +1133,16 @@ diesel::table! { attributes -> Jsonb, is_active -> Bool, created_at -> Timestamptz, + // Stone/Brasil fields + gtin -> Nullable, + peso_liquido -> Nullable, + peso_bruto -> Nullable, + largura -> Nullable, + altura -> Nullable, + comprimento -> Nullable, + cor -> Nullable, + tamanho -> Nullable, + images -> Nullable, } } diff --git a/src/products/api.rs b/src/products/api.rs index ddc9ccc1a..4031b5474 100644 --- a/src/products/api.rs +++ b/src/products/api.rs @@ -48,6 +48,59 @@ pub struct Product { pub barcode: Option, pub created_at: DateTime, pub updated_at: DateTime, + // Campos fiscais e tributários (Stone/Brasil) + pub ncm: Option, + pub cest: Option, + pub cfop: Option, + pub origem: Option, + pub gtin: Option, + pub gtin_tributavel: Option, + // Dimensões detalhadas (frete) + pub peso_liquido: Option, + pub peso_bruto: Option, + pub largura: Option, + pub altura: Option, + pub comprimento: Option, + pub volumes: Option, + // Informações tributárias + pub icms_cst: Option, + pub icms_aliquota: Option, + pub ipi_cst: Option, + pub ipi_aliquota: Option, + pub pis_cst: Option, + pub pis_aliquota: Option, + pub cofins_cst: Option, + pub cofins_aliquota: Option, + // Marketplace e e-commerce + pub marca: Option, + pub modelo: Option, + pub cor: Option, + pub tamanho: Option, + pub material: Option, + pub genero: Option, + // Controle de estoque avançado + pub localizacao_estoque: Option, + pub lote: Option, + pub data_validade: Option, + pub data_fabricacao: Option, + pub estoque_minimo: Option, + pub estoque_maximo: Option, + pub ponto_reposicao: Option, + // Preços e custos detalhados + pub preco_promocional: Option, + pub promocao_inicio: Option>, + pub promocao_fim: Option>, + pub custo_frete: Option, + pub margem_lucro: Option, + // Campos Stone específicos + pub stone_item_id: Option, + pub stone_category_id: Option, + pub stone_metadata: Option, + // SEO e busca + pub slug: Option, + pub meta_title: Option, + pub meta_description: Option, + pub tags: Option>>, } #[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, + // Stone/Brasil fields + pub gtin: Option, + pub peso_liquido: Option, + pub peso_bruto: Option, + pub largura: Option, + pub altura: Option, + pub comprimento: Option, + pub cor: Option, + pub tamanho: Option, + pub images: Option, } #[derive(Debug, Deserialize)]