Pular para conteúdo

Estoque e Logística

Objetivo

Documentar as extensões da localização brasileira nos módulos de Estoque (stock.picking) e Movimentações, incluindo faturamento pelo picking, movimentação de estoque de terceiros, integração com lotes/rastreabilidade do DF-e, e cálculo de pesos.


Estoque → Operações → Transferências Estoque → Operações → Recebimentos/Expedições Wizard: Botão "Criar NF" no formulário do picking


Implementação Técnica

  • Model: stock.picking (herança) — classe StockPicking
  • Model: stock.picking.type (herança) — classe StockPickingType
  • Model: stock.move (herança) — classe stock_move
  • Wizard: stock.invoice.onshipping — classe stock_invoice_onshipping
  • Arquivo: l10n_br_ciel_it_account/models/stock_picking.py (791 linhas)

Campos Adicionais no Picking

stock.picking

Campo Tipo Descrição
invoice_state Selection invoiced (Faturado) ou 2binvoiced (À Faturar)
invoice_id Many2one Fatura vinculada ao picking
invoice_id_state Selection (related) Situação da NF-e
l10n_br_pdf_aut_nfe Binary (related) DANFE da NF-e
l10n_br_xml_aut_nfe Binary (related) XML da NF-e
l10n_br_xml_cce_nfe Binary (related) XML da CCe
l10n_br_informacao_fiscal Text Informação fiscal
l10n_br_informacao_complementar Text Informação complementar
picking_terceiro_id Many2one Picking de estoque de terceiro
picking_industrializacao_id Many2one Picking de industrialização
show_btn_preencher_lotes_dfe Boolean (computed) Exibir botão de preenchimento automático de lotes

stock.picking.type

Campo Tipo Descrição
invoice_move_type Selection Tipo de fatura a ser gerada (Cliente/Fornecedor/Crédito/Débito)
l10n_br_tipo_pedido Selection Tipo de pedido de saída padrão para este tipo de operação
l10n_br_tipo_pedido_entrada Selection Tipo de pedido de entrada padrão

Faturamento pelo Picking (Wizard)

Visão Geral

O wizard stock.invoice.onshipping permite gerar NF-e diretamente a partir de um picking, sem necessidade de usar o fluxo padrão Venda → Fatura.

Menu: Botão "Criar NF" no formulário ou lista de pickings selecionados

Campos do Wizard

Campo Tipo Descrição
journal_id Many2one Diário contábil (selecionado automaticamente pelo tipo de picking)
move_type Selection Tipo de fatura: Cliente, Fornecedor, Crédito, Débito
l10n_br_tipo_pedido Selection Tipo de operação (saída)
l10n_br_tipo_pedido_entrada Selection Tipo de operação (entrada)
group Boolean Agrupar faturas por parceiro
invoice_date Date Data da fatura (padrão: hoje no fuso de SP)

Fluxo do Wizard

flowchart TD
    A["Selecionar Picking(s)"] --> B["Abrir Wizard 'Criar NF'"]
    B --> C["Definir Diário e Tipo"]
    C --> D["action_invoice_create()"]
    D --> E{"Split serviço<br/>x produto?"}
    E -->|Sim| F["Gerar NF de Serviço<br/>(sem frete)"]
    F --> G["Gerar NF de Produto"]
    E -->|Não| H["Gerar NF única"]
    G --> I["Recalcular impostos"]
    H --> I
    I --> J["Abrir fatura gerada"]

Regras de Negócio do Faturamento

Regra funcional: Se a empresa tem l10n_br_split_service_invoice = True, itens de serviço e produtos são separados em faturas distintas. A NF de serviço não carrega frete.

Regra funcional: Para kits (BOM), o sistema insere apenas 1 item por kit na fatura, evitando duplicidade dos componentes.

Regra funcional: O preço unitário é herdado da linha do pedido de venda (sale.order.line.price_unit) quando disponível, ou do preço de lista do produto como fallback.


Movimentação de Estoque de Terceiros

Funcionalidade

Regra funcional: Em operações de industrialização (remessa e retorno), o sistema cria automaticamente movimentações para controlar o estoque em posse de terceiros.

Implementação técnica: action_movimentar_estoque_terceiro()

Disparado automaticamente em button_validate() — ao validar um picking, se a operação é de industrialização:

Saída (Remessa para Industrialização)

  1. Cria um picking interno: Estoque empresa → Localização do terceiro
  2. A localização do terceiro é criada automaticamente como filho de stock_location_customers_terceiro
  3. Nome: {CNPJ} - {Nome do Parceiro}

Entrada (Retorno de Industrialização)

Para itens com CFOP 1902/1903 (retorno de material sem custo): 1. Cria picking: Terceiro → Localização de cliente (saída de estoque do terceiro) 2. Cria picking: Estoque empresa → Produção Virtual (consumo)


Preenchimento Automático de Lotes (DF-e)

Funcionalidade

Regra funcional: Para produtos com rastreabilidade (lote/serial), o sistema pode preencher automaticamente os lotes a partir dos dados da NF-e importada (DF-e).

Método: action_preencher_lotes_dfe()

  1. Para cada move com produto rastreável
  2. Busca os lotes registrados na NF-e (campo det_rastro_nlote do DF-e)
  3. Cria stock.lot se não existir (com data de validade do DF-e, se aplicável)
  4. Preenche os move_line_ids com as quantidades do DF-e

Visibilidade: O botão só aparece se: - Há movimentos com produto rastreável - Existem dados de lote no DF-e - O picking não está finalizado/cancelado


Cálculo de Peso

Regra funcional: Se o parâmetro l10n_br_ciel_it_account.calcular_peso = "1", o peso líquido e bruto são calculados automaticamente com base nos pesos unitários dos produtos × quantidade.

Campos calculados no picking: - l10n_br_peso_liquido — Soma dos pesos líquidos - l10n_br_peso_bruto — Soma dos pesos brutos - l10n_br_volumes — Quantidade de volumes - l10n_br_especie — Espécie do volume - l10n_br_marca — Marca do volume - l10n_br_numeracao_volume — Numeração dos volumes


Cenários de Uso / Troubleshooting

1. Botão "Criar NF" não aparece

  • Verificar: O picking está no estado correto (não cancelado/rascunho)
  • Verificar: O invoice_state não é invoiced

2. Fatura gerada sem impostos

  • Causa: Os impostos são recalculados após a criação da fatura
  • Solução: Os impostos são aplicados automaticamente via onchange_l10n_br_calcular_imposto()

3. Lotes não preenchidos automaticamente

  • Verificar: O produto tem tracking = 'lot' ou 'serial'
  • Verificar: O DF-e tem dados de rastreabilidade (lote_ids)

4. Estoque de terceiro não criado

  • Verificar: O tipo de pedido é industrialização (TIPO_PEDIDO_SAIDA_INDUSTRIALIZACAO ou TIPO_PEDIDO_ENTRADA_INDUSTRIALIZACAO)
  • Verificar: A localização stock_location_customers_terceiro existe

Referências Cruzadas