Valor do Produto em Nota de Transferência
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas (label "Valor Produto Para Nota de Transferência") Tabela:
PARMFATUR.ST_TRANSFERENCIAValor padrão:N(Tabela de Venda)
Define de onde o sistema busca o valor unitário do item quando o pedido ou a nota fiscal é identificada como Transferência entre Empresas (matriz/filial com mesmo raiz de CNPJ). A identificação de transferência acontece automaticamente quando a pessoa do documento é uma filial/matriz da empresa logada — nesse momento o pedido/nota marca ST_TRANSFERENCIAEMPRESAS = 'S' e o preço dos itens passa a ser obtido conforme este parâmetro.
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Pedido de Venda | MPD002 | Pedido de venda – busca o preço do item na transferência |
| Nota Fiscal Saída | MNF002 | Emissão de NF de saída – busca o preço do item na transferência |
| Nota Fiscal Genérica | MNF008 | NF genérica – busca preço do custo em estoque quando S |
| Transferência entre Empresas | MNF036 | Geração de pedidos de transferência – usa custo/tab.compra/tab.venda |
Observação: em MPD002 e MNF002, quando o valor é
SouC, o campoCD_PESSOAé bloqueado após confirmar a transferência (BloqueiaCampoPessoa(true)).
Procedures / funções envolvidas
| Procedure / View | Arquivo | Descrição |
|---|---|---|
RETORNA_SALDOESTOQUE | Scripts/RETORNA_SALDOESTOQUE.sql | Retorna O_VL_CUSTO usado quando ST_TRANSFERENCIA = 'S' |
RETORNA_TABPRECO | Scripts/RETORNA_TABPRECO.sql | Retorna O_CD_TABPRECO usado quando ST_TRANSFERENCIA = 'N' |
Campos envolvidos
| Campo | Descrição |
|---|---|
PEDIDO.ST_TRANSFERENCIAEMPRESAS | Flag gravado no próprio pedido (S/N) identificando que é transferência entre empresas |
ITEMPEDIDO.VL_UNITARIO / ITEMNOTA.VL_UNITARIO | Valor unitário preenchido conforme origem definida neste parâmetro |
ITEMPEDIDO.CD_TABPRECO / ITEMNOTA.CD_TABPRECO | Tabela de preço selecionada (usado quando N) |
PARMFATUR.CD_TABCOMPRA | Tabela de compra consultada quando C |
PARMFATUR.CD_TABPRECO | Tabela de venda padrão (usada indiretamente via RETORNA_TABPRECO quando N) |
ITEMTABCOMPRA.VL_PRECO | Preço de compra cadastrado (origem do custo quando C) |
ITEMLOCAL.ST_FATURAMENTO | Filtro usado para localizar o saldo de estoque quando S |
Homônimos (não confundir com este parâmetro):
PARMENTREGA.ST_TRANSFERENCIA– flag por movimentação que indica se a movimentação gera transferência de local de armazenagem (usado emGERA_NOTAFISCALESTOQUE.sql, MNF019, MRC020, MFA011).MOVTOCAIXA.ST_TRANSFERENCIA– flag marcada por MFC020 indicando transferência entre contas (filtrado em CFC002 e RFC017).TRANSFERENCIALEITE.ST_TRANSFERENCIA– controle de transferência de leite (MCA003, MCA005).PEDIDO.ST_TRANSFERENCIAEMPRESAS– flag gravada no próprio pedido/nota identificando que a operação é transferência entre filiais; é alimentada pela lógica que consulta este parâmetro.
Opções disponíveis
S - Custo Estoque
| O que faz | Detalhe |
|---|---|
Origem do VL_UNITARIO | Custo médio do estoque do item (RETORNA_SALDOESTOQUE.O_VL_CUSTO) |
Bloqueia CD_PESSOA? | Sim após confirmar transferência (BloqueiaCampoPessoa(true) em MPD002/MNF002) |
| Fluxo em MPD002 | UdmMPD002.pas:2586 – quando iTransf='S' e parâmetro=S, procura CD_TIPOLOCAL/CD_LOCAL válidos em ITEMLOCAL com ST_FATURAMENTO='S' e chama RETORNA_SALDOESTOQUE para preencher o valor unitário |
| Fluxo em MNF002 | UdmMNF002.pas:5165 – mesma lógica (custo de estoque) |
| Fluxo em MNF008 | UdmMNF008.pas:2762 – quando iTransf='S' e iST_TRANSFERENCIA='S' busca O_VL_CUSTO via RETORNA_SALDOESTOQUE(CD_EMPRESA, CD_ITEM, NULL, NULL, NULL) |
| Fluxo em MNF036 | UMNF036.pas:396 – busca CD_TIPOLOCAL/CD_LOCAL do ITEMLOCAL e obtém O_VL_CUSTO do estoque para gravar VL_UNITARIO do item transferido |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → Valor Produto Para Nota de Transferência = "Custo Estoque".
- Salve os parâmetros (F6).
- Abra um Pedido de Venda (MPD002).
- Informe como cliente uma empresa filial (pessoa vinculada a uma empresa cadastrada em
EMPRESA.CD_PESSOA). - Quando for exibida a pergunta "Este Pedido é uma Transferência entre Empresas?", responda Sim (ou, se for matriz/filial detectada automaticamente, o sistema assume
Ssem perguntar). - O campo
CD_PESSOAfica bloqueado — não é mais editável. - Adicione um item com estoque cadastrado em
ITEMLOCALcomST_FATURAMENTO='S'. VL_UNITARIOé preenchido com o custo médio atual do estoque desse item (retorno deO_VL_CUSTOda procedureRETORNA_SALDOESTOQUE).- Repita o teste em MNF002 — comportamento idêntico.
Resultado esperado: em pedidos/notas de transferência, o valor unitário é sempre igual ao custo médio do estoque do item, garantindo que a movimentação entre filiais não gere lucro contábil.
C - Tabela de Compra
| O que faz | Detalhe |
|---|---|
Origem do VL_UNITARIO | Preço cadastrado em ITEMTABCOMPRA da tabela de compra configurada em PARMFATUR.CD_TABCOMPRA |
Bloqueia CD_PESSOA? | Sim após confirmar transferência |
| Fluxo em MPD002 | UdmMPD002.pas:2619 – quando iTransf='S' e parâmetro=C, busca IC.VL_PRECO em ITEMTABCOMPRA IC LEFT JOIN PARMFATUR PARM ON (PARM.CD_EMPRESA = <empresa>) WHERE IC.CD_TABCOMPRA = PARM.CD_TABCOMPRA AND IC.CD_ITEM = <item> |
| Fluxo em MNF002 | UdmMNF002.pas:5196 – mesma query sobre ITEMTABCOMPRA/PARMFATUR.CD_TABCOMPRA |
| Fluxo em MNF036 | UMNF036.pas:425 – busca VL_PRECO de ITEMTABCOMPRA vinculando pela PARMFATUR.CD_TABCOMPRA da empresa de origem |
| Requisito | PARMFATUR.CD_TABCOMPRA deve estar preenchido e o item precisa ter preço cadastrado em ITEMTABCOMPRA |
Simulação passo a passo
- Em MFA001 informe uma Tabela de Compra no campo
CD_TABCOMPRA(Aba de tabelas) e selecione em Opção 1 → Valor Produto Para Nota de Transferência = "Tabela de Compra". - Salve os parâmetros (F6).
- Cadastre um item com preço em
ITEMTABCOMPRApara essaCD_TABCOMPRA(TFA011 ou similar de tabela de compra). - Abra um Pedido de Venda (MPD002) e selecione uma pessoa que seja filial/matriz da empresa logada.
- Confirme que é uma transferência entre empresas.
CD_PESSOAé bloqueado.- Adicione o item cadastrado no passo 3.
VL_UNITARIOé preenchido com oVL_PRECOdaITEMTABCOMPRA.- Remova o preço de compra desse item (
ITEMTABCOMPRAvazio) e repita →VL_UNITARIOfica zero/não é atualizado.
Resultado esperado: o valor unitário nas transferências corresponde exatamente ao preço cadastrado na tabela de compra da empresa de origem.
N - Tabela de Venda (valor padrão)
| O que faz | Detalhe |
|---|---|
Origem do VL_UNITARIO | Tabela de venda – o sistema busca O_CD_TABPRECO via RETORNA_TABPRECO e usa o preço dessa tabela como em uma venda normal |
Bloqueia CD_PESSOA? | Não – campo permanece editável (mesmo com iTransf='S') |
| Fluxo em MPD002 | UdmMPD002.pas:1706 e UdmMPD002.pas:2199 – a busca de CD_TABPRECO via RETORNA_TABPRECO só acontece quando iTransf <> 'S' ou ST_TRANSFERENCIA = 'N'. Ou seja, com N a transferência se comporta como uma venda tradicional |
| Fluxo em MNF002 | UdmMNF002.pas:5210 (buscando VL_PRECO em ITEMTABPRECO) e UdmMNF002.pas:5866 / UdmMNF002.pas:6231 (buscando CD_TABPRECO via RETORNA_TABPRECO) |
| Fluxo em MNF036 | UMNF036.pas:439 – chama RETORNA_TABPRECO(<empresa>, <cond.pagto>, <tipo.pessoa>, NULL, <regiao>, <UF>, <pessoa>, <item>, <qtd>) e armazena a tabela retornada no item |
| Comportamento na MNF036 | O VL_UNITARIO é calculado com base no preço da tabela de venda encontrada (operação com preço de venda) |
Simulação passo a passo
- Em MFA001 → Opção 1 → Valor Produto Para Nota de Transferência = "Tabela de Venda" (opção padrão ao criar um registro novo).
- Salve os parâmetros (F6).
- Abra um Pedido de Venda (MPD002) e selecione uma pessoa filial.
- Confirme que é transferência entre empresas.
- Observe que o campo
CD_PESSOApermanece editável (diferente dos modosS/C). - Adicione um item →
CD_TABPRECOé preenchido automaticamente pelaRETORNA_TABPRECOusando a região/vendedor/condição da pessoa destino e oVL_UNITARIOvem do preço dessa tabela. - Faça o mesmo em MNF002 → idêntico: a NF de transferência adota a tabela de venda.
Resultado esperado: a transferência usa os mesmos preços de uma venda normal para a filial — útil quando há política fiscal de faturar com preço de venda entre filiais. Este é o valor padrão gravado em AfterInsert de UdmMFA001.pas:469.
Comportamento adicional: bloqueio de CD_PESSOA
Tanto MPD002 quanto MNF002 executam frmMPDxxx.BloqueiaCampoPessoa(true) quando todas as condições abaixo são atendidas:
- A pessoa do documento é matriz/filial da empresa logada (detectado por CNPJ raiz ou
EMPRESA.CD_PESSOA); ou o usuário respondeu Sim à pergunta "Este Pedido/Nota é uma Transferência entre Empresas?". PARMFATUR.ST_TRANSFERENCIA IN ('S', 'C')ouPARMFATUR.ST_BLOQCLIENTETRANSFPEDIDO = 'S'.
Referências:
source/MPD002/UdmMPD002.pas:1812-1816source/MPD002/UdmMPD002.pas:4292-4296e4309-4313source/MNF002/UdmMNF002.pas:4147-4151
Quando o parâmetro é N, o bloqueio só ocorre se ST_BLOQCLIENTETRANSFPEDIDO = 'S'.
Tabela Comparativa Resumida
| Opção | Descrição | Origem do VL_UNITARIO | Bloqueia CD_PESSOA | Requer configuração extra |
|---|---|---|---|---|
| S | Custo Estoque | RETORNA_SALDOESTOQUE.O_VL_CUSTO (custo médio do estoque) | Sim | Item com estoque em ITEMLOCAL com ST_FATURAMENTO='S' |
| C | Tabela de Compra | ITEMTABCOMPRA.VL_PRECO da tabela PARMFATUR.CD_TABCOMPRA | Sim | PARMFATUR.CD_TABCOMPRA preenchido + preço em ITEMTABCOMPRA |
| N | Tabela de Venda (padrão) | RETORNA_TABPRECO → preço da tabela de venda encontrada | Não (salvo se ST_BLOQCLIENTETRANSFPEDIDO='S') | Nenhuma (usa regras normais de tabela de venda) |
Referências no Código Fonte
MFA001 (tela de configuração)
source/MFA001/UMFA001.dfm:6120–FocusControl = cmbST_TRANSFERENCIA(label "Valor Produto Para Nota de Transferência")source/MFA001/UMFA001.dfm:6845-6872–cmbST_TRANSFERENCIA: TwwDBComboBoxcomItems.Strings = ('Custo Estoque'#9'S', 'Tabela de Venda'#9'N', 'Tabela de Compra'#9'C')source/MFA001/UdmMFA001.pas:113–tabPARMFATURST_TRANSFERENCIA: TStringFieldsource/MFA001/UdmMFA001.pas:469– valor padrão'N'emtabPARMFATURAfterInsert
Leitura/consulta do parâmetro
source/MNF002/UdmMNF002.pas:4147-4148– decide bloquear pessoa em NFsource/MNF002/UdmMNF002.pas:5165– busca custo de estoque (opçãoS)source/MNF002/UdmMNF002.pas:5196– busca tabela de compra (opçãoC)source/MNF002/UdmMNF002.pas:5210– busca tabela de venda direto emITEMTABPRECO(opçãoN)source/MNF002/UdmMNF002.pas:5866/6231–RETORNA_TABPRECOparaCD_TABPRECOquandoNsource/MPD002/UdmMPD002.pas:1706– liberaRETORNA_TABPRECOquandoNou não é transferênciasource/MPD002/UdmMPD002.pas:1812-1814– bloqueia pessoa emS/Csource/MPD002/UdmMPD002.pas:2199–RETORNA_TABPRECOno re-processamentosource/MPD002/UdmMPD002.pas:2586– busca custo de estoque (opçãoS)source/MPD002/UdmMPD002.pas:2619– busca tabela de compra (opçãoC)source/MPD002/UMPD002.pas:4292-4310– bloqueia pessoa ao reprocessar pedidosource/MNF008/UdmMNF008.pas:656/692/2762– carregaiST_TRANSFERENCIAe, quando'S', busca custo de estoque (RETORNA_SALDOESTOQUE)source/MNF036/UMNF036.pas:396– opçãoS(custo estoque) na geração da transferênciasource/MNF036/UMNF036.pas:425– opçãoC(tabela de compra)source/MNF036/UMNF036.pas:439– opçãoN(tabela de venda viaRETORNA_TABPRECO)
SQL de manipulação da coluna (INSERT/UPDATE/SELECT)
source/MCA003/UdmMCA003.dfm– SQL do módulo MFA001 que insere/atualizaST_TRANSFERENCIAemPARMFATUR(linhas 3064, 3131, 3225, 3329)source/CPD009/UdmCPD009.dfm– DML/consulta dePARMFATURcom o campo (linhas 318, 382, 476, 580)
Nenhuma procedure em
Scripts/referenciaPARMFATUR.ST_TRANSFERENCIA– toda a lógica de seleção de valor unitário em transferências está implementada no cliente Delphi. Referências emScripts/são sempre de outros campos homônimos (ver seção Campos envolvidos).