Pular para o conteúdo principal

Acerto de Custo de Produtos Acabados

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos → Opção 1 Label na tela: Acerto de Custo de Produtos Acabados Tabela: PARMFATUR.ST_CUSTOPRODACABADO Tipo: CHAR(1) FixedChar Valor padrão: N (Não)

O parâmetro controla se, ao salvar uma Nota Fiscal de Entrada (MNF001) que contenha matérias-primas consumidas por Ordens de Produção (ligadas via ITEMPRODUCAO) ou itens industrializados (ITEM.TP_ITEM = 'I'), o sistema deve abrir a janela Atualização Custo de Produtos Acabados para o usuário ajustar o custo sugerido dos produtos acabados e gravar o novo valor em ITEMTABCOMPRA.

Telas impactadas​

MóduloCódigoDescriçãoUso
Parâmetros de FaturamentoMFA001Configuração do parâmetroLeitura/gravação do valor
Nota Fiscal de EntradaMNF001Emissão/Recebimento de NF-eConsumidor: ao salvar a nota de entrada, dispara a atualização do custo
Janela Atualização Custo de Produtos AcabadosfrmPRODACABADONF (UPRODACABADONF dentro do BPL MNF001)Tela modal de acerto de custoListagem dos produtos acabados vinculados, permite editar VL_CUSTO e atualiza ITEMTABCOMPRA
Cadastro de Parâmetros RecapRCA006Parâmetros Recapadora (mantém PARMFATUR sincronizado)Replica o campo nos comandos Insert/Update/Select da PARMFATUR
Cadastro Copiar ParâmetrosCPD009Cópia/Sincronização de PARMFATUR entre empresasReplica o campo nos comandos Insert/Update/Select da PARMFATUR

A regra de negócio ativa só está implementada em MNF001 (UMNF001.pas + UPRODACABADONF.pas). As demais telas apenas persistem o valor da coluna.

Campos envolvidos​

Campo / VariávelDescrição
PARMFATUR.ST_CUSTOPRODACABADOFlag de configuração ('S'/'N')
dmMNF001.iST_CUSTOPRODACABADOVariável em memória que guarda o valor lido da PARMFATUR em UMNF001.pas:1411
PARMFATUR.CD_TABCOMPRA / dmMNF001.iCD_TABCOMPRATabela de Compra destino da atualização do custo
PARMFATUR.CD_TABPRECO / dmMNF001.iCD_TABPRECOTabela de Preço usada para recuperar o preço base
ITEMTABCOMPRA.VL_PRECOCampo atualizado/inserido pelo fluxo (recebe o VL_CUSTO informado)
ITEMTABCOMPRA.DT_REGISTROAtualizado para NOW na gravação
ITEMPRODUCAO.CD_ITEM / CD_MATERIAPRIMALiga a matéria-prima da nota ao produto acabado
ITEM.TP_ITEM'I' = Industrializado / 'S' = Serviço (filtro do UNION da query tabCUSTO)
PARMFATUR.ST_ABRECUSTOREPOUsado no JOIN da query da janela para decidir como considerar MOVIMENTACAO.CD_TIPOCONTA
MOVIMENTACAO.CD_TIPOCONTAFiltro: só entra na query se CD_TIPOCONTA IS NOT NULL e de movimentação de entrada (ST_DEVOLUCAO = 'N')

Opções disponíveis​

S - Sim​

O que fazDetalhe
Abre tela de acerto de custo ao salvar NF de Entrada?SIM, frmPRODACABADONF.ShowModal é executado
Filtro dos itens exibidosSomente itens da nota ligados a ITEMPRODUCAO (matérias-primas que compõem produtos acabados) ou itens industrializados (ITEM.TP_ITEM = 'I')
Campo obrigatório na janelaVL_CUSTO (Custo Sugerido) — bloqueia gravação se vazio
Efeito ao confirmar (OK / F6)Para cada linha faz INSERT ou UPDATE em ITEMTABCOMPRA com VL_PRECO = VL_CUSTO e DT_REGISTRO = NOW
Valor inicial de VL_CUSTOCópia de VL_PRECO (preço vigente na Tabela de Compra)
Pré-requisitoPARMFATUR.CD_TABCOMPRA deve estar preenchido — do contrário a janela gera W-0000: É obrigatório informar a Tabela de Compra. Verifique! [MFA001]
Cancelar (Esc)dmMNF001.transactionNota.Rollback — desfaz a alteração de custo

Simulação passo a passo​

  1. MFA001 → Parâmetros → Ambos → Opção 1 → Acerto de Custo de Produtos Acabados = Sim (S)
  2. Certifique-se que a Tabela de Compra está preenchida no mesmo MFA001
  3. Salve (F6) os parâmetros
  4. Abra MNF001 e lance uma nota de entrada contendo uma matéria-prima que esteja cadastrada em ITEMPRODUCAO (matéria-prima de um produto acabado) ou um item com TP_ITEM = 'I'
  5. Clique em Salvar (btnSalvar)
  6. Após os commits internos da nota, o sistema verifica dmMNF001.iST_CUSTOPRODACABADO = 'S' e abre a janela Atualização Custo de Produtos Acabados
  7. A grid lista: Produto, Custo Prod. Acabado, Custo Mat. Prima, Tab. Compra, Preço Venda, Última Compra, Custo Sugerido (editável)
  8. O campo Custo Sugerido já vem preenchido com o VL_PRECO atual da Tabela de Compra
  9. Ajuste o custo desejado e confirme (OK ou F6) → o sistema roda para cada linha:
    • Se não existe registro em ITEMTABCOMPRA → INSERT INTO ITEMTABCOMPRA(CD_TABCOMPRA, CD_ITEM, VL_PRECO, DT_REGISTRO) VALUES (...) com VL_PRECO = VL_CUSTO
    • Se já existe → UPDATE ITEMTABCOMPRA SET VL_PRECO = ..., DT_REGISTRO = 'NOW' WHERE CD_TABCOMPRA = ... AND CD_ITEM = ...
  10. Confirma com dmMNF001.transactionNota.Commit

Resultado esperado: Ao dar entrada em matérias-primas o usuário é obrigado a revisar o custo dos produtos acabados derivados, e o novo custo é gravado imediatamente na Tabela de Compra (ITEMTABCOMPRA), refletindo nos próximos preços e cálculos de margem.


N - Não​

O que fazDetalhe
Abre tela de acerto de custo ao salvar NF de Entrada?NÃO - o bloco if (dmMNF001.iST_CUSTOPRODACABADO = 'S') não executa
Custo dos produtos acabadosPermanece com o valor atual da ITEMTABCOMPRA (nenhum recálculo automático)
Transação transactionNota extraNão é aberta

Simulação passo a passo​

  1. MFA001 → Parâmetros → Ambos → Opção 1 → Acerto de Custo de Produtos Acabados = Não (N)
  2. Salve (F6)
  3. Abra MNF001 e lance uma nota de entrada contendo uma matéria-prima que compõe um produto acabado
  4. Clique em Salvar
  5. A nota é gravada normalmente sem abrir a janela Atualização Custo de Produtos Acabados

Resultado esperado: O fluxo da nota termina diretamente no commit, sem interação para acerto de custo. O custo gravado em ITEMTABCOMPRA do produto acabado permanece inalterado até que seja atualizado manualmente (por exemplo, via TPO010 ou similar).

Este é o valor padrão ao criar um novo registro no MFA001 — definido em UdmMFA001.pas:483:

tabPARMFATURST_CUSTOPRODACABADO.Asstring := 'N';

Regra de carga em MNF001​

O valor é lido em UMNF001.pas (linhas 1370-1411) pela rotina BuscaParametros:

Consulta :=
'Select CD_EMPRESA, CD_CONDPAGTO, CD_FORMAPAGTO, ' +
...
' ST_CUSTOPRODACABADO, ST_PRODUCAOVENDA, ST_VALIDAITEMEMPRESA, ' +
...
'From PARMFATUR ' +
'Where CD_EMPRESA = ' + IntToStr(sessao.empresa.cd_Empresa);
...
dmMNF001.iST_CUSTOPRODACABADO := Resultado[19];

Ou seja: o parâmetro é resolvido no momento da abertura do MNF001 e fica em cache na variável iST_CUSTOPRODACABADO. Se o valor for alterado em MFA001 enquanto o MNF001 está aberto, é necessário reabrir o MNF001 para refletir.


Query da janela frmPRODACABADONF​

A grid da janela modal é populada por um UNION ALL (em UPRODACABADONF.dfm:303-483) que cobre dois casos:

  1. Matérias-primas consumidas por produtos acabados — via JOIN ITEMPRODUCAO IP ON IP.CD_MATERIAPRIMA = N.CD_ITEM e ITEM I ON I.CD_ITEM = IP.CD_ITEM AND I.TP_ITEM <> 'S'
  2. Itens industrializados diretamente — via ITEM I ON I.CD_ITEM = N.CD_ITEM AND I.TP_ITEM = 'I'

Em ambos os casos, a movimentação precisa ter CD_TIPOCONTA IS NOT NULL (avaliado de acordo com PARMFATUR.ST_ABRECUSTOREPO), e a query traz VL_ESTOQUE, VL_PRECO (Tab. Compra), VL_ULTIMOCUSTO, VL_PRECOVENDA, VL_ULTIMONOTACOMPRA e VL_CUSTOMATERIAPRIMA como referência para o usuário informar o VL_CUSTO sugerido.


Tabela Comparativa Resumida​

OpçãoAbre janela de acerto?Grava em ITEMTABCOMPRA?Requer CD_TABCOMPRA preenchido?Padrão
S (Sim)SimSim (INSERT/UPDATE VL_PRECO)Sim (obrigatório)Não
N (Não)NãoNãoNãoSim

Referências no Código Fonte​

MFA001 (tela de configuração — produtora)​

ArquivoLinhaDescrição
source/MFA001/UMFA001.dfm2484Label "Acerto de Custo de Produtos Acabados" (Label4, Top=272, Left=304)
source/MFA001/UMFA001.dfm3226-3252Componente cmbST_CUSTOPRODACABADO: TwwDBComboBox — Items: Sim=S, Não=N, Style csDropDownList, DataField ST_CUSTOPRODACABADO
source/MFA001/UMFA001.pas243Declaração cmbST_CUSTOPRODACABADO: TwwDBComboBox
source/MFA001/UdmMFA001.pas133Declaração tabPARMFATURST_CUSTOPRODACABADO: TStringField
source/MFA001/UdmMFA001.pas483Valor padrão no AfterInsert: tabPARMFATURST_CUSTOPRODACABADO.Asstring := 'N';
source/MFA001/UdmMFA001.dfm137, 1118-1123, 2377, 2534, 2747, 3017Select/Insert/Update/Refresh SQL da PARMFATUR incluindo a coluna

MNF001 (consumidora — lógica de negócio)​

ArquivoLinhaDescrição
source/MNF001/UMNF001.pas1112Declaração da variável iST_CUSTOPRODACABADO: String
source/MNF001/UMNF001.pas1377SQL que carrega o parâmetro da PARMFATUR
source/MNF001/UMNF001.pas1411Atribuição dmMNF001.iST_CUSTOPRODACABADO := Resultado[19]
source/MNF001/UMNF001.pas2479-2515Lógica principal dentro de btnSalvarClick — abre frmPRODACABADONF se flag = 'S', faz commit/rollback da transactionNota
source/MNF001/UPRODACABADONF.pas125-158btnOKClick - grava ITEMTABCOMPRA (INSERT/UPDATE) com o custo informado
source/MNF001/UPRODACABADONF.pas133-136Validações: VL_CUSTO obrigatório e CD_TABCOMPRA obrigatório em MFA001
source/MNF001/UPRODACABADONF.dfm6Caption da janela: "Atualização Custo de Produtos Acabados"
source/MNF001/UPRODACABADONF.dfm293-483tabCUSTO: TFDQuery com o UNION ALL que monta a lista de produtos acabados

Telas de sincronização de PARMFATUR (mirror)​

ArquivoLinha(s)Descrição
source/RCA006/UdmRCA006.dfm3076, 3140, 3240, 3344Insert/Update/Select da PARMFATUR no cadastro Recap
source/CPD009/UdmCPD009.dfm327, 391, 491, 595Insert/Update/Select da PARMFATUR na cópia de parâmetros

Observações​

  • Escopo restrito: apesar do nome genérico (Custo de Produtos Acabados), o parâmetro só atua em MNF001 (Nota Fiscal de Entrada). Outras telas de entrada (ex.: MNF007, MNF024) não consultam esta flag.
  • Dependência obrigatória: se ST_CUSTOPRODACABADO = 'S' e a nota entrar em matéria-prima mas PARMFATUR.CD_TABCOMPRA estiver vazio, o usuário recebe o erro W-0000: É obrigatório informar a Tabela de Compra. Verifique! [MFA001] e não consegue gravar o acerto (tem que cancelar e configurar a Tabela de Compra em MFA001 primeiro).
  • Efeito colateral em ITEMTABCOMPRA: como grava diretamente em ITEMTABCOMPRA.VL_PRECO, o acerto impacta o preço de compra vigente daquele item — relevante para relatórios de custo, margem de lucro (I.PC_MARGEMLUCRO) e fórmulas de formação de preço que leiam essa tabela.
  • Não há stored procedures/views no diretório Scripts/ referenciando ST_CUSTOPRODACABADO — toda a lógica é executada no cliente Delphi.