Parâmetro de Alerta de Valor de Custo
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos → Opção 1 → campo "Alerta Valor de Custo" Tabela:
PARMFATUR.ST_AVISACUSTOValor padrão:N(Não)
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Nota Fiscal Saída | MNF002 | Emissão de NF de saída (único módulo que aplica a regra efetivamente) |
Observação: O campo é carregado também pelos SQL de leitura de
PARMFATURem MNF008, MCO006, RCA006 e CPD009, mas nesses módulos o valor é apenas transportado (não há lógica consumindo o parâmetro). A validação real ocorre somente em MNF002.
Campos envolvidos
| Campo | Descrição |
|---|---|
ITEMNOTA.VL_UNITARIO | Valor unitário informado no item da NF |
ITEMNOTA.PC_DESCONTO | Percentual de desconto aplicado ao item (usado para calcular o valor líquido) |
RETORNA_SALDOESTOQUE.O_VL_CUSTO | Valor de custo vigente do item, retornado pela procedure de saldo de estoque |
Procedures impactadas
| Procedure | Uso |
|---|---|
RETORNA_SALDOESTOQUE(CD_EMPRESA, CD_ITEM, NULL, NULL, NULL) | Obtém o O_VL_CUSTO do produto para comparar com o valor unitário informado |
Opções disponíveis
S - Sim (Avisa)
| O que faz | Detalhe |
|---|---|
| Quando dispara | No BeforePost do item da NF (MNF002), antes de gravar o item |
| Cálculo do valor líquido | Se houver PC_DESCONTO: VL_UNITARIO - (VL_UNITARIO * PC_DESCONTO / 100). Caso contrário, usa VL_UNITARIO puro |
| Consulta de custo | SELECT COALESCE(O_VL_CUSTO, 0) FROM RETORNA_SALDOESTOQUE(CD_EMPRESA, CD_ITEM, NULL, NULL, NULL) |
| Condição do alerta | Se Valor <= Custo, exibe confirmação (C-0000) ao usuário |
| Se usuário confirma (SIM) | Permite continuar a inclusão do item; flag interno ValidaCusto := False para não perguntar de novo |
| Se usuário recusa (NÃO) | Lança JException W-0000 com a mensagem "Inclusão do Produto Cancelada!" e mantém ValidaCusto := True |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → Alerta Valor de Custo = "Sim"
- Salve os parâmetros (F6)
- Certifique-se que o produto X possui custo de estoque > 0 (ex.: Custo = R$ 50,00)
- Abra uma NF de Saída em MNF002
- Adicione o produto X
- Informe VL_UNITARIO = R$ 40,00 (abaixo do custo) → Ao tentar confirmar o item, o sistema exibe a mensagem:
O Valor Unitário do Produto X esta Menor ou Igual ao Valor de Custo! Deseja Continuar?Valor Unitário: 40,00Valor de Custo: 50,00
- Clique em "Sim" → Item é gravado normalmente; o flag interno desativa novas perguntas no mesmo ciclo
- Clique em "Não" → Inclusão é cancelada com a mensagem "Inclusão do Produto Cancelada!"
- Refaça o teste com VL_UNITARIO = R$ 80,00 (acima do custo) → Item é gravado sem nenhum aviso
Resultado esperado: Ao inserir/alterar um item cujo valor unitário (já com desconto aplicado) seja menor ou igual ao custo retornado por RETORNA_SALDOESTOQUE, o sistema exige confirmação do operador antes de prosseguir.
N - Não (Padrão)
| O que faz | Detalhe |
|---|---|
| Validação | Desligada. O BeforePost do item da NF ignora completamente a comparação entre valor unitário e custo |
Consulta RETORNA_SALDOESTOQUE | Não é executada para esta validação |
| Impacto na digitação | Usuário pode digitar qualquer valor unitário (inclusive abaixo do custo) sem nenhuma pergunta ou alerta |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → Alerta Valor de Custo = "Não"
- Salve os parâmetros (F6)
- Certifique-se que o produto X possui custo de estoque > 0 (ex.: Custo = R$ 50,00)
- Abra uma NF de Saída em MNF002
- Adicione o produto X
- Informe VL_UNITARIO = R$ 40,00 (abaixo do custo) → Item é gravado sem qualquer aviso
- Informe VL_UNITARIO = R$ 1,00 (muito abaixo do custo) → Item também é gravado sem aviso
Resultado esperado: Total liberdade. O sistema não compara o preço de venda com o custo do produto ao salvar o item.
Este é o valor padrão ao criar um novo registro no MFA001 (definido em
TdmMFA001.tabPARMFATURAfterInsert,UdmMFA001.pas:481).
Tabela Comparativa Resumida
| Opção | Descrição | Dispara alerta? | Consulta custo de estoque? | Onde atua |
|---|---|---|---|---|
| S | Sim | Sim, quando Valor <= Custo | Sim (RETORNA_SALDOESTOQUE) | Apenas MNF002 - BeforePost do ITEMNOTA |
| N | Não (padrão) | Não | Não | Nenhuma |
Referências no Código Fonte
Tela MFA001 (configuração do parâmetro)
source/MFA001/UMFA001.dfm(linha 3199-3225) -cmbST_AVISACUSTO: TwwDBComboBoxcomItems.Strings = ('Sim'#9'S', 'Não'#9'N')eDataField = 'ST_AVISACUSTO'source/MFA001/UMFA001.dfm(linhas 2464-2477) -Label3comCaption = 'Alerta Valor de Custo'(label visível ao usuário)source/MFA001/UMFA001.pas(linha 242) - DeclaraçãocmbST_AVISACUSTO: TwwDBComboBoxsource/MFA001/UdmMFA001.pas(linha 132) -tabPARMFATURST_AVISACUSTO: TStringFieldsource/MFA001/UdmMFA001.pas(linha 481) -AfterInsertdefine valor padrão'N'source/MFA001/UdmMFA001.dfm(linhas 136, 1112-1117, 2375, 2534, 2746, 3016) - Campo incluído emSELECT,INSERTeUPDATEdePARMFATUR
Uso funcional do parâmetro
source/MNF002/UdmMNF002.pas(linhas 3944-3969) - Validação dentro deTdmMNF002.tabITEMNOTABeforePost(procedure iniciada em linha 3807). QuandoValidaCusto = Trueeparmfatur.values['ST_AVISACUSTO'] = 'S', compara o valor unitário (descontado) comRETORNA_SALDOESTOQUE.O_VL_CUSTOe exibeMsgCodigo('C-0000', ...)para confirmação.
Módulos que apenas carregam o parâmetro (sem lógica consumidora)
source/MNF002/UdmMNF002.pas(linha 10497) -SELECT ... P.ST_AVISACUSTO ...que monta oTStringList parmfaturconsumido pela validação acimasource/MNF008/UdmMNF008.pas(linha 762) -SELECT ... P.ST_AVISACUSTO ...(apenas leitura, sem uso na lógica)source/MCO006/UdmMCO006.pas(linha 2106) -SELECT ... P.ST_AVISACUSTO ...(apenas leitura, sem uso na lógica)source/RCA006/UdmRCA006.dfm(linhas 3076, 3140, 3239, 3343) - SQL de persistência do PARMFATUR (INSERT/UPDATE/SELECT)source/CPD009/UdmCPD009.dfm(linhas 327, 391, 490, 594) - SQL de persistência do PARMFATUR (INSERT/UPDATE/SELECT)
Scripts SQL (stored procedures)
- Nenhuma procedure em
Scripts/referencia diretamenteST_AVISACUSTO. A regra é totalmente aplicada em Delphi (MNF002).