Pular para o conteúdo principal

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_TRANSFERENCIA Valor 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óduloCódigoDescrição
Pedido de VendaMPD002Pedido de venda – busca o preço do item na transferência
Nota Fiscal SaídaMNF002Emissão de NF de saída – busca o preço do item na transferência
Nota Fiscal GenéricaMNF008NF genérica – busca preço do custo em estoque quando S
Transferência entre EmpresasMNF036Geração de pedidos de transferência – usa custo/tab.compra/tab.venda

Observação: em MPD002 e MNF002, quando o valor é S ou C, o campo CD_PESSOA é bloqueado após confirmar a transferência (BloqueiaCampoPessoa(true)).

Procedures / funções envolvidas​

Procedure / ViewArquivoDescrição
RETORNA_SALDOESTOQUEScripts/RETORNA_SALDOESTOQUE.sqlRetorna O_VL_CUSTO usado quando ST_TRANSFERENCIA = 'S'
RETORNA_TABPRECOScripts/RETORNA_TABPRECO.sqlRetorna O_CD_TABPRECO usado quando ST_TRANSFERENCIA = 'N'

Campos envolvidos​

CampoDescrição
PEDIDO.ST_TRANSFERENCIAEMPRESASFlag gravado no próprio pedido (S/N) identificando que é transferência entre empresas
ITEMPEDIDO.VL_UNITARIO / ITEMNOTA.VL_UNITARIOValor unitário preenchido conforme origem definida neste parâmetro
ITEMPEDIDO.CD_TABPRECO / ITEMNOTA.CD_TABPRECOTabela de preço selecionada (usado quando N)
PARMFATUR.CD_TABCOMPRATabela de compra consultada quando C
PARMFATUR.CD_TABPRECOTabela de venda padrão (usada indiretamente via RETORNA_TABPRECO quando N)
ITEMTABCOMPRA.VL_PRECOPreço de compra cadastrado (origem do custo quando C)
ITEMLOCAL.ST_FATURAMENTOFiltro 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 em GERA_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 fazDetalhe
Origem do VL_UNITARIOCusto 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 MPD002UdmMPD002.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 MNF002UdmMNF002.pas:5165 – mesma lógica (custo de estoque)
Fluxo em MNF008UdmMNF008.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 MNF036UMNF036.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​

  1. Vá em MFA001 → Parâmetros → Ambos → Opção 1 → Valor Produto Para Nota de Transferência = "Custo Estoque".
  2. Salve os parâmetros (F6).
  3. Abra um Pedido de Venda (MPD002).
  4. Informe como cliente uma empresa filial (pessoa vinculada a uma empresa cadastrada em EMPRESA.CD_PESSOA).
  5. Quando for exibida a pergunta "Este Pedido é uma Transferência entre Empresas?", responda Sim (ou, se for matriz/filial detectada automaticamente, o sistema assume S sem perguntar).
  6. O campo CD_PESSOA fica bloqueado — não é mais editável.
  7. Adicione um item com estoque cadastrado em ITEMLOCAL com ST_FATURAMENTO='S'.
  8. VL_UNITARIO é preenchido com o custo médio atual do estoque desse item (retorno de O_VL_CUSTO da procedure RETORNA_SALDOESTOQUE).
  9. 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 fazDetalhe
Origem do VL_UNITARIOPreço cadastrado em ITEMTABCOMPRA da tabela de compra configurada em PARMFATUR.CD_TABCOMPRA
Bloqueia CD_PESSOA?Sim após confirmar transferência
Fluxo em MPD002UdmMPD002.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 MNF002UdmMNF002.pas:5196 – mesma query sobre ITEMTABCOMPRA/PARMFATUR.CD_TABCOMPRA
Fluxo em MNF036UMNF036.pas:425 – busca VL_PRECO de ITEMTABCOMPRA vinculando pela PARMFATUR.CD_TABCOMPRA da empresa de origem
RequisitoPARMFATUR.CD_TABCOMPRA deve estar preenchido e o item precisa ter preço cadastrado em ITEMTABCOMPRA

Simulação passo a passo​

  1. 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".
  2. Salve os parâmetros (F6).
  3. Cadastre um item com preço em ITEMTABCOMPRA para essa CD_TABCOMPRA (TFA011 ou similar de tabela de compra).
  4. Abra um Pedido de Venda (MPD002) e selecione uma pessoa que seja filial/matriz da empresa logada.
  5. Confirme que é uma transferência entre empresas.
  6. CD_PESSOA é bloqueado.
  7. Adicione o item cadastrado no passo 3.
  8. VL_UNITARIO é preenchido com o VL_PRECO da ITEMTABCOMPRA.
  9. Remova o preço de compra desse item (ITEMTABCOMPRA vazio) e repita → VL_UNITARIO fica 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 fazDetalhe
Origem do VL_UNITARIOTabela 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 MPD002UdmMPD002.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 MNF002UdmMNF002.pas:5210 (buscando VL_PRECO em ITEMTABPRECO) e UdmMNF002.pas:5866 / UdmMNF002.pas:6231 (buscando CD_TABPRECO via RETORNA_TABPRECO)
Fluxo em MNF036UMNF036.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 MNF036O 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​

  1. Em MFA001 → Opção 1 → Valor Produto Para Nota de Transferência = "Tabela de Venda" (opção padrão ao criar um registro novo).
  2. Salve os parâmetros (F6).
  3. Abra um Pedido de Venda (MPD002) e selecione uma pessoa filial.
  4. Confirme que é transferência entre empresas.
  5. Observe que o campo CD_PESSOA permanece editável (diferente dos modos S/C).
  6. Adicione um item → CD_TABPRECO é preenchido automaticamente pela RETORNA_TABPRECO usando a região/vendedor/condição da pessoa destino e o VL_UNITARIO vem do preço dessa tabela.
  7. 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:

  1. 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?".
  2. PARMFATUR.ST_TRANSFERENCIA IN ('S', 'C') ou PARMFATUR.ST_BLOQCLIENTETRANSFPEDIDO = 'S'.

Referências:

  • source/MPD002/UdmMPD002.pas:1812-1816
  • source/MPD002/UdmMPD002.pas:4292-4296 e 4309-4313
  • source/MNF002/UdmMNF002.pas:4147-4151

Quando o parâmetro é N, o bloqueio só ocorre se ST_BLOQCLIENTETRANSFPEDIDO = 'S'.


Tabela Comparativa Resumida​

OpçãoDescriçãoOrigem do VL_UNITARIOBloqueia CD_PESSOARequer configuração extra
SCusto EstoqueRETORNA_SALDOESTOQUE.O_VL_CUSTO (custo médio do estoque)SimItem com estoque em ITEMLOCAL com ST_FATURAMENTO='S'
CTabela de CompraITEMTABCOMPRA.VL_PRECO da tabela PARMFATUR.CD_TABCOMPRASimPARMFATUR.CD_TABCOMPRA preenchido + preço em ITEMTABCOMPRA
NTabela de Venda (padrão)RETORNA_TABPRECO → preço da tabela de venda encontradaNã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: TwwDBComboBox com Items.Strings = ('Custo Estoque'#9'S', 'Tabela de Venda'#9'N', 'Tabela de Compra'#9'C')
  • source/MFA001/UdmMFA001.pas:113 – tabPARMFATURST_TRANSFERENCIA: TStringField
  • source/MFA001/UdmMFA001.pas:469 – valor padrão 'N' em tabPARMFATURAfterInsert

Leitura/consulta do parâmetro​

  • source/MNF002/UdmMNF002.pas:4147-4148 – decide bloquear pessoa em NF
  • source/MNF002/UdmMNF002.pas:5165 – busca custo de estoque (opção S)
  • source/MNF002/UdmMNF002.pas:5196 – busca tabela de compra (opção C)
  • source/MNF002/UdmMNF002.pas:5210 – busca tabela de venda direto em ITEMTABPRECO (opção N)
  • source/MNF002/UdmMNF002.pas:5866 / 6231 – RETORNA_TABPRECO para CD_TABPRECO quando N
  • source/MPD002/UdmMPD002.pas:1706 – libera RETORNA_TABPRECO quando N ou não é transferência
  • source/MPD002/UdmMPD002.pas:1812-1814 – bloqueia pessoa em S/C
  • source/MPD002/UdmMPD002.pas:2199 – RETORNA_TABPRECO no re-processamento
  • source/MPD002/UdmMPD002.pas:2586 – busca custo de estoque (opção S)
  • source/MPD002/UdmMPD002.pas:2619 – busca tabela de compra (opção C)
  • source/MPD002/UMPD002.pas:4292-4310 – bloqueia pessoa ao reprocessar pedido
  • source/MNF008/UdmMNF008.pas:656 / 692 / 2762 – carrega iST_TRANSFERENCIA e, quando 'S', busca custo de estoque (RETORNA_SALDOESTOQUE)
  • source/MNF036/UMNF036.pas:396 – opção S (custo estoque) na geração da transferência
  • source/MNF036/UMNF036.pas:425 – opção C (tabela de compra)
  • source/MNF036/UMNF036.pas:439 – opção N (tabela de venda via RETORNA_TABPRECO)

SQL de manipulação da coluna (INSERT/UPDATE/SELECT)​

  • source/MCA003/UdmMCA003.dfm – SQL do módulo MFA001 que insere/atualiza ST_TRANSFERENCIA em PARMFATUR (linhas 3064, 3131, 3225, 3329)
  • source/CPD009/UdmCPD009.dfm – DML/consulta de PARMFATUR com o campo (linhas 318, 382, 476, 580)

Nenhuma procedure em Scripts/ referencia PARMFATUR.ST_TRANSFERENCIA – toda a lógica de seleção de valor unitário em transferências está implementada no cliente Delphi. Referências em Scripts/ são sempre de outros campos homônimos (ver seção Campos envolvidos).