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 AcabadosTabela:PARMFATUR.ST_CUSTOPRODACABADOTipo: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ódulo | Código | Descrição | Uso |
|---|---|---|---|
| Parâmetros de Faturamento | MFA001 | Configuração do parâmetro | Leitura/gravação do valor |
| Nota Fiscal de Entrada | MNF001 | Emissão/Recebimento de NF-e | Consumidor: ao salvar a nota de entrada, dispara a atualização do custo |
Janela Atualização Custo de Produtos Acabados | frmPRODACABADONF (UPRODACABADONF dentro do BPL MNF001) | Tela modal de acerto de custo | Listagem dos produtos acabados vinculados, permite editar VL_CUSTO e atualiza ITEMTABCOMPRA |
| Cadastro de Parâmetros Recap | RCA006 | Parâmetros Recapadora (mantém PARMFATUR sincronizado) | Replica o campo nos comandos Insert/Update/Select da PARMFATUR |
| Cadastro Copiar Parâmetros | CPD009 | Cópia/Sincronização de PARMFATUR entre empresas | Replica 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ável | Descrição |
|---|---|
PARMFATUR.ST_CUSTOPRODACABADO | Flag de configuração ('S'/'N') |
dmMNF001.iST_CUSTOPRODACABADO | Variável em memória que guarda o valor lido da PARMFATUR em UMNF001.pas:1411 |
PARMFATUR.CD_TABCOMPRA / dmMNF001.iCD_TABCOMPRA | Tabela de Compra destino da atualização do custo |
PARMFATUR.CD_TABPRECO / dmMNF001.iCD_TABPRECO | Tabela de Preço usada para recuperar o preço base |
ITEMTABCOMPRA.VL_PRECO | Campo atualizado/inserido pelo fluxo (recebe o VL_CUSTO informado) |
ITEMTABCOMPRA.DT_REGISTRO | Atualizado para NOW na gravação |
ITEMPRODUCAO.CD_ITEM / CD_MATERIAPRIMA | Liga 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_ABRECUSTOREPO | Usado no JOIN da query da janela para decidir como considerar MOVIMENTACAO.CD_TIPOCONTA |
MOVIMENTACAO.CD_TIPOCONTA | Filtro: 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 faz | Detalhe |
|---|---|
| Abre tela de acerto de custo ao salvar NF de Entrada? | SIM, frmPRODACABADONF.ShowModal é executado |
| Filtro dos itens exibidos | Somente 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 janela | VL_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_CUSTO | Cópia de VL_PRECO (preço vigente na Tabela de Compra) |
| Pré-requisito | PARMFATUR.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
- MFA001 → Parâmetros → Ambos → Opção 1 → Acerto de Custo de Produtos Acabados =
Sim(S) - Certifique-se que a Tabela de Compra está preenchida no mesmo MFA001
- Salve (F6) os parâmetros
- 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 comTP_ITEM = 'I' - Clique em Salvar (
btnSalvar) - Após os commits internos da nota, o sistema verifica
dmMNF001.iST_CUSTOPRODACABADO = 'S'e abre a janelaAtualização Custo de Produtos Acabados - A grid lista: Produto, Custo Prod. Acabado, Custo Mat. Prima, Tab. Compra, Preço Venda, Última Compra, Custo Sugerido (editável)
- O campo
Custo Sugeridojá vem preenchido com oVL_PRECOatual da Tabela de Compra - Ajuste o custo desejado e confirme (
OKou 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 (...)comVL_PRECO = VL_CUSTO - Se já existe →
UPDATE ITEMTABCOMPRA SET VL_PRECO = ..., DT_REGISTRO = 'NOW' WHERE CD_TABCOMPRA = ... AND CD_ITEM = ...
- Se não existe registro em
- 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 faz | Detalhe |
|---|---|
| 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 acabados | Permanece com o valor atual da ITEMTABCOMPRA (nenhum recálculo automático) |
Transação transactionNota extra | Não é aberta |
Simulação passo a passo
- MFA001 → Parâmetros → Ambos → Opção 1 → Acerto de Custo de Produtos Acabados =
Não(N) - Salve (F6)
- Abra MNF001 e lance uma nota de entrada contendo uma matéria-prima que compõe um produto acabado
- Clique em Salvar
- 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:
- Matérias-primas consumidas por produtos acabados — via
JOIN ITEMPRODUCAO IP ON IP.CD_MATERIAPRIMA = N.CD_ITEMeITEM I ON I.CD_ITEM = IP.CD_ITEM AND I.TP_ITEM <> 'S' - 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ção | Abre janela de acerto? | Grava em ITEMTABCOMPRA? | Requer CD_TABCOMPRA preenchido? | Padrão |
|---|---|---|---|---|
| S (Sim) | Sim | Sim (INSERT/UPDATE VL_PRECO) | Sim (obrigatório) | Não |
| N (Não) | Não | Não | Não | Sim |
Referências no Código Fonte
MFA001 (tela de configuração — produtora)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MFA001/UMFA001.dfm | 2484 | Label "Acerto de Custo de Produtos Acabados" (Label4, Top=272, Left=304) |
source/MFA001/UMFA001.dfm | 3226-3252 | Componente cmbST_CUSTOPRODACABADO: TwwDBComboBox — Items: Sim=S, Não=N, Style csDropDownList, DataField ST_CUSTOPRODACABADO |
source/MFA001/UMFA001.pas | 243 | Declaração cmbST_CUSTOPRODACABADO: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 133 | Declaração tabPARMFATURST_CUSTOPRODACABADO: TStringField |
source/MFA001/UdmMFA001.pas | 483 | Valor padrão no AfterInsert: tabPARMFATURST_CUSTOPRODACABADO.Asstring := 'N'; |
source/MFA001/UdmMFA001.dfm | 137, 1118-1123, 2377, 2534, 2747, 3017 | Select/Insert/Update/Refresh SQL da PARMFATUR incluindo a coluna |
MNF001 (consumidora — lógica de negócio)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MNF001/UMNF001.pas | 1112 | Declaração da variável iST_CUSTOPRODACABADO: String |
source/MNF001/UMNF001.pas | 1377 | SQL que carrega o parâmetro da PARMFATUR |
source/MNF001/UMNF001.pas | 1411 | Atribuição dmMNF001.iST_CUSTOPRODACABADO := Resultado[19] |
source/MNF001/UMNF001.pas | 2479-2515 | Lógica principal dentro de btnSalvarClick — abre frmPRODACABADONF se flag = 'S', faz commit/rollback da transactionNota |
source/MNF001/UPRODACABADONF.pas | 125-158 | btnOKClick - grava ITEMTABCOMPRA (INSERT/UPDATE) com o custo informado |
source/MNF001/UPRODACABADONF.pas | 133-136 | Validações: VL_CUSTO obrigatório e CD_TABCOMPRA obrigatório em MFA001 |
source/MNF001/UPRODACABADONF.dfm | 6 | Caption da janela: "Atualização Custo de Produtos Acabados" |
source/MNF001/UPRODACABADONF.dfm | 293-483 | tabCUSTO: TFDQuery com o UNION ALL que monta a lista de produtos acabados |
Telas de sincronização de PARMFATUR (mirror)
| Arquivo | Linha(s) | Descrição |
|---|---|---|
source/RCA006/UdmRCA006.dfm | 3076, 3140, 3240, 3344 | Insert/Update/Select da PARMFATUR no cadastro Recap |
source/CPD009/UdmCPD009.dfm | 327, 391, 491, 595 | Insert/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 masPARMFATUR.CD_TABCOMPRAestiver vazio, o usuário recebe o erroW-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 emITEMTABCOMPRA.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/referenciandoST_CUSTOPRODACABADO— toda a lógica é executada no cliente Delphi.