Pular para o conteúdo principal

MPD014 — Movimentação MPD014

Fonte​

  • Source: source/MPD014/
  • Arquivos analisados: UMPD014.pas (882 linhas), UdmMPD014.pas (604 linhas), UMPD014.dfm, UdmMPD014.dfm, MPD014.dpk
  • Shared units usadas: jSessao, jDB, jMessage, jLista, jReport, jUtils (do jCommon); jPesquisa

Objetivo​

Construir a ficha de formacao de preco de venda por regiao comercial, associando a cada produto acabado a sua composicao de materias-primas (quantidade x custo + ICMS + frete), outras despesas (valor fixo ou percentual) e o preco de venda resultante. A tela gerencia a hierarquia de regioes (origem/filha/copia), permite herdar/replicar composicoes entre regioes e reprocessar custos a partir das ultimas notas fiscais de entrada, integrando-se a ficha tecnica de producao (ITEMPRODUCAO) e ao custo contábil (RETORNA_SALDOESTOQUE).

Funcionalidades​

  • Consulta filtrada por Regiao (PRECOREGIAO), Grupo (GRUPO) e Produto (ITEM) — aba Dados para Consulta
  • Edicao master-detail-detail: Regiao -> Produto Acabado -> (Materias-Primas + Outras Despesas + Valores)
  • Calculo automatico de custo total, % custo, % margem, % venda e valor unitario (custo / fator)
  • Herdar composicao da regiao de origem (menu popup Herdar Dados da Origem)
  • Replicar composicao para regioes filhas (menu popup Replicar dados para Filhos)
  • Gerar Copia ou Filha de regiao com copia integral da ficha (Gerar Copia/Gerar Filho)
  • Reprocessar custos (unitario via Reprocessar ou em lote via Reprocessar Custos) buscando a ultima NF de entrada
  • Importar composicao a partir da ficha tecnica de producao (ITEMPRODUCAO)
  • Impressao de relatorio consolidado filtrado por Regiao / Grupo / Item

Estrutura da Tela​

Form MDI-Child frmMPD014 com toolbar lateral padrao (Novo F5, Salvar F6, Excluir F7, Cancelar F4, Consultar F3, Atualizar F2, Imprimir F8, Sair F12) e PageControl com duas abas:

Aba: Dados para Consulta​

Tres painaes de filtro (grids de digitacao com lookup F9) e botao de confirmacao:

GrupoGrid/CampoFonte (F9)Observacao
RegiaoCódigo, DescricaoPRECOREGIAOSeleciona regioes a filtrar
GruposCódigo, DescricaoGRUPOFiltra por grupo de produto
ItensCódigo, DescricaoITEM (ST_ATIVO='S')Filtra por produto acabado
Consultar <F3>Botao—Chama btnProcurarClick e abre aba Fichas Precos

Aba: Fichas Precos​

Layout master-detail-detail com quatro grupos principais:

GrupoGrid/CampoDatasetFuncao
RegiaoCD_REGIAO, DS_REGIAO, DS_REGIAORIGEMtabPRECOREGIAORegistro de cabecalho da ficha; popup popup com Herdar / Replicar / Copia / Filho / Reprocessar Custos
Produto AcabadoCD_ITEM, DS_ITEM, SG_UNIDMED (Un)tabITEMPRECOREGIAOProduto-pai da ficha; popup PopupItem com Importar Ficha Tecnica
Valor de Custo, Margem e VendaVL_CUSTO (R$ Custo), PC_CUSTO (% Custo), PC_MARGEMVENDA (% Margem), PC_VENDA (^% Margem), VL_VENDA (R$ Venda), NR_FATOR (Fator), VL_UNITARIO (R$ Unitario)tabFORMACAOPRECOVL_VENDA e editavel; demais sao recalculados por Calcula_Totais ao sair da coluna
Produtos Componentes da FichaCD_MATERIAPRIMA, DS_ITEM, SG_UNIDMED (Un), QT_PARTICIPACAO (Quantidade), VL_CUSTOMP (Custo), VL_ICMSCUSTOMP (ICMS Custo), VL_FRETE (Valor Frete), VL_ICMSFRETE (ICMS Frete), VL_TOTAL (Custo Total) + label Total ligado a T_VL_PARTICIPACAO + botao Reprocessar CustostabITEMPRECOREGIAOMP (TP_DESPESA='Q')Materias-primas que compoem o custo; lookup F9 traz produtos com TP_ITEM NOT IN ('S','A')
Outras Despesas da FichaCD_MATERIAPRIMA, DS_ITEM, TP_DESPESA (V/P), QT_PARTICIPACAO (Valor / Perc), VL_DESPESA (Valor) + label Total ligado a VL_OUTRAStabITEMDESPESA (TP_DESPESA<>'Q')Despesas fixas (V) ou percentuais (P); duplo-clique em TP_DESPESA alterna V<->P; lookup F9 traz produtos com TP_ITEM IN ('S','A')

popup (sobre grid de Regiao):

  • Herdar Dados da Origem -> HerdarDados1Click -> Herdar(cd_pai, cd_filha)
  • Replicar dados para Filhos -> Replicardadosparafilhos1Click
  • Gerar Copia -> btCopiaClick (cria nova regiao com CD_REGIAORIGEM = origem atual)
  • Gerar Filho -> btCopiaClick (cria nova regiao com CD_REGIAORIGEM = regiao corrente)
  • Reprocessar Custos -> ReprocessarCustos1Click (itera todos os itens reprocessando)

PopupItem (sobre grid de Produto Acabado):

  • Importar Ficha Tecnica -> ImportarFichaTecnica1Click (le ITEMPRODUCAO com TP_PRODUCAO='C' e TP_DESPESA='M')

Teclas e Navegacao​

  • F2 Atualizar, F3 Consultar, F4 Cancelar, F5 Novo, F6 Salvar, F7 Excluir, F8 Imprimir, F12 Sair
  • F9 em qualquer grid (Regiao / Grupos / Itens / Produto Acabado / Materia-Prima / Despesa) abre Pesquisa com retorno para o campo corrente
  • PgUp/PgDn navegam first/last; Shift+Enter retrocede campo, Enter avanca

Parametros que Influenciam​

A tela nao consulta tabelas PARM*/PARAM* diretamente em nenhum handler. O unico parametro de sessao usado e sessao.empresa.cd_empresa, empregado em:

ContextoUso
Calcula_TotaisPassado a RETORNA_SALDOESTOQUE(cd_empresa, CD_MATERIAPRIMA, NULL, NULL, CURRENT_DATE) para obter custo contábil alternativo
ImportarFichaTecnica1ClickFiltra ITEMPRODUCAO.CD_EMPRESA ao importar composicao da ficha tecnica

Nao ha parametros de comportamento (habilitacao/desabilitacao) em PARMFATUR, PARMFINANC ou similares que alterem o fluxo da tela.

Regras de Negocio​

Validacoes (BeforePost / OnValidate)​

  • tabPRECOREGIAOBeforePost: exige CD_REGIAO e DS_REGIAO nao vazios — acumula mensagens e dispara JException('W-0000', [texto]).
  • tabITEMPRECOREGIAOBeforePost: cancela insercao se nao ha regiao de cabecalho; exige CD_ITEM — JException('W-0000', ['E Necessario informar o Item!']).
  • tabITEMPRECOREGIAOMPBeforePost: exige CD_MATERIAPRIMA e QT_PARTICIPACAO &gt; 0.
  • tabITEMDESPESABeforePost: exige CD_MATERIAPRIMA e QT_PARTICIPACAO &gt; 0 (mensagem "Valor/Percentual deve ser maior que Zero").
  • tabFORMACAOPRECOBeforePost: exige VL_VENDA &gt; 0; se NR_FORMACAOPRECO vazio, gera via GERA_SEQUENCIA(NULL, 'SEQ_FORMACAOPRECO'); preenche CD_REGIAO/CD_ITEM a partir do master quando vazios.
  • tabITENSCD_ITEMValidate / tabITEMPRECOREGIAOCD_ITEMValidate: lookup em ITEM — exige cadastrado e ativo (ST_ATIVO='S'), filtra TP_ITEM='P' no detail; mensagem "[TPO001]" em caso de erro.
  • tabITEMPRECOREGIAOMPCD_MATERIAPRIMAValidate: exige TP_ITEM NOT IN ('A','S') (apenas materia-prima/produto); nao permite duplicidade na ficha; chama Busca_Custo apos validacao.
  • tabITEMDESPESACD_MATERIAPRIMAValidate: exige TP_ITEM IN ('A','S') (apenas servico/outras); nao permite duplicidade; default TP_DESPESA='V' (valor) se vazio.
  • tabGRUPOSCD_GRUPOValidate / tabREGIAOCD_REGIAOValidate: lookup simples em GRUPO / PRECOREGIAO exigindo cadastro.

Calculo de Totais (Calcula_Totais)​

Orquestrador principal do custo da ficha, disparado por tabITEMDESPESAAfterScroll, tabITEMPRECOREGIAOMPAfterScroll, tabFORMACAOPRECOAfterScroll e gridValoresColExit quando VL_VENDA e alterado:

  1. Soma liquida dos componentes com TP_DESPESA='Q': SUM((VL_CUSTOMP - VL_ICMSCUSTOMP + VL_FRETE - VL_ICMSFRETE) * QT_PARTICIPACAO) -> campo calculado T_VL_PARTICIPACAO.
  2. Soma fixa das despesas com TP_DESPESA='V' e adiciona ao VL_CUSTO.
  3. Se tp_calculo='%' e PC_VENDA&gt;0: calcula VL_VENDA = VL_CUSTO + VL_CUSTO * (PC_VENDA/100).
  4. Se tp_calculo='$' e VL_VENDA&gt;0: soma custos com TP_DESPESA='P' como VL_VENDA * (QT_PARTICIPACAO/100) (despesas percentuais sobre a venda) ao VL_CUSTO; recalcula PC_VENDA, PC_MARGEMVENDA e PC_CUSTO.
  5. VL_OUTRAS = VL_CUSTO - T_VL_PARTICIPACAO (diferenca entre custo total e custo dos componentes).
  6. OnCalcFields de tabFORMACAOPRECO calcula VL_UNITARIO = VL_VENDA / NR_FATOR.
  7. OnCalcFields de tabITEMDESPESA calcula VL_DESPESA = VL_VENDA * QT_PARTICIPACAO/100 quando TP_DESPESA='P', senao VL_DESPESA = QT_PARTICIPACAO.

Busca de Custo da Materia-Prima (Busca_Custo)​

Chamado apos validar CD_MATERIAPRIMA e no botao Reprocessar do grid de componentes:

  1. Ultima NF de entrada (NOTA.ST_NOTA='V', TP_NOTA='E') ORDER BY DT_EMISSAO DESC LIMIT 1, lendo VL_UNITARIO, VL_FRETE, VL_TOTAL, PS_ITEMNOTA/QT_ITEMNOTA de ITEMNOTA.
  2. VL_CUSTOMP := VL_UNITARIO da NF; VL_FRETE := VL_FRETE_NF / quantidade.
  3. VALOR_IMPOSTO(empresa, lancamento, serie, 'E', cd_item, 'I', 'N', 'VI') -> calcula ICMS custo; dividido por quantidade -> VL_ICMSCUSTOMP.
  4. VALOR_IMPOSTO(..., 'P', ...) -> IPI / ST somado ao VL_CUSTOMP.
  5. Se VL_FRETE=0, consulta FRETENOTA vinculada (CT-e) ligada a NOTA, rateia pelo valor fiscal e calcula ICMS sobre frete proporcional via novo VALOR_IMPOSTO(..., 'I', ...) -> VL_ICMSFRETE.

Herdar e Replicar (Herdar)​

Sincroniza tres tabelas filhas entre regioes (parent cd_pai, child cd_filha) em transacao aberta:

  1. DELETE FROM FORMACAOPRECO/ITEMPRECOREGIAOMP/ITEMPRECOREGIAO WHERE CD_REGIAO = cd_filha.
  2. INSERT INTO ITEMPRECOREGIAO (CD_REGIAO, CD_ITEM, DT_REGISTRO) SELECT cd_filha, CD_ITEM, 'NOW' FROM ITEMPRECOREGIAO WHERE CD_REGIAO = cd_pai.
  3. Inserts analogos para ITEMPRECOREGIAOMP (copiando QT_PARTICIPACAO, TP_DESPESA, VL_CUSTOMP, VL_ICMSCUSTOMP, VL_FRETE, VL_ICMSFRETE) e FORMACAOPRECO (gerando novo NR_FORMACAOPRECO via GERA_SEQUENCIA).

Gerar Copia / Filho (btCopiaClick)​

  • CD_REGIAO novo via MAX(CD_REGIAO)+1.
  • Copia: CD_REGIAORIGEM = origem da atual (mesmo nivel, irma).
  • Filho: CD_REGIAORIGEM = CD_REGIAO atual (dependente hierarquicamente).
  • Apos criar a regiao, chama Herdar para copiar a composicao.

Importar Ficha Tecnica​

Antes de importar, apaga apenas registros com TP_DESPESA='Q' (quantidade) da regiao/item e insere SELECT ITEMPRODUCAO ... WHERE CD_EMPRESA = sessao.empresa.cd_empresa AND CD_ITEM = item AND TP_PRODUCAO='C' AND TP_DESPESA='M'. Preserva despesas V/P existentes.

Reprocessamento em Lote (ReprocessarCustos1Click)​

Itera por todos os ITEMPRECOREGIAO da regiao corrente, e para cada item executa btnReprocessarClick (que por sua vez itera tabITEMPRECOREGIAOMP chamando Busca_Custo em cada linha). Controles desativados via DisableControls/EnableControls.

Ciclo Transacional​

  • iniciar -> transaction.StartTransaction.
  • btnSalvar -> Post em cascata (PRECOREGIAO, ITEMPRECOREGIAO, ITEMPRECOREGIAOMP, ITEMDESPESA, FORMACAOPRECO) -> Commit -> StartTransaction -> reabre queries e reposiciona via Locate.
  • btnExcluir -> msgCodigo('C-0045') confirmacao; em tabPRECOREGIAO apaga em cascata (FORMACAOPRECO, ITEMPRECOREGIAOMP, ITEMPRECOREGIAO da regiao); em tabITEMPRECOREGIAO apaga apenas os registros do item; depois Navegacao.Delete e Commit.
  • btnAtualizar -> Rollback + restaura isqlPRECOREGIAO/isqlITEMPRECOREGIAO + reabre.
  • FormClose -> pergunta C-0048 para salvar -> Rollback -> Free.

Controle de Acesso​

Se programa.tpAcesso = 2, oculta btnNovo, btnSalvar, btnExcluir e Separador1 (modo somente leitura).

Datasets e SQL​

DatasetPrincipal SELECTParametrosEventos
tabPRECOREGIAOselect P.CD_REGIAO, P.DS_REGIAO, P.CD_REGIAORIGEM, P.DT_REGISTRO, O.DS_REGIAO DS_REGIAORIGEM from PRECOREGIAO P left join PRECOREGIAO O on O.CD_REGIAO = P.CD_REGIAORIGEM order by P.CD_REGIAO—BeforePost, AfterScroll
tabITEMPRECOREGIAOselect R.CD_REGIAO, R.CD_ITEM, I.DS_ITEM, I.SG_UNIDMED, R.DT_REGISTRO from ITEMPRECOREGIAO R inner join ITEM I on I.CD_ITEM = R.CD_ITEM where R.CD_REGIAO = :CD_REGIAO order by I.DS_ITEMCD_REGIAOBeforePost, AfterScroll
tabITEMPRECOREGIAOMPselect R.*, I.DS_ITEM, I.SG_UNIDMED from ITEMPRECOREGIAOMP R inner join ITEM I on R.CD_MATERIAPRIMA = I.CD_ITEM where R.TP_DESPESA = 'Q' and R.CD_REGIAO = :CD_REGIAO and R.CD_ITEM = :CD_ITEM order by I.DS_ITEMCD_REGIAO, CD_ITEMAfterInsert, BeforePost, AfterScroll, OnCalcFields
tabITEMDESPESAmesma base de ITEMPRECOREGIAOMP com R.TP_DESPESA &lt;&gt; 'Q'CD_REGIAO, CD_ITEMAfterInsert, BeforePost, AfterScroll, OnCalcFields
tabFORMACAOPRECOselect FORMACAOPRECO.*, CAST(0 AS NUMERIC(15,5)) VL_OUTRAS, VL_CUSTO, PC_CUSTO, PC_MARGEMVENDA, PC_VENDA from FORMACAOPRECO where CD_REGIAO = :CD_REGIAO and CD_ITEM = :CD_ITEMCD_REGIAO, CD_ITEMBeforePost, AfterScroll, OnCalcFields
tabREGIAO, tabGRUPOS, tabITENSFiltros pre-carregados com WHERE ... = -1 (vazios); preenchidos manualmente no grid via F9 ou digitacao—OnValidate em cada CD_

Queries diretas (ExecutaConsulta / ExecUpdate)​

  • btnImprimirClick: monta SELECT R.CD_REGIAO, R.DS_REGIAO, I.CD_ITEM, I.DS_ITEM, F.VL_VENDA FROM ITEMPRECOREGIAO L INNER JOIN PRECOREGIAO R ... INNER JOIN ITEM I ... INNER JOIN FORMACAOPRECO F ... com filtros IN() montados por concatenacao; chama GeraRelatorio.
  • btCopiaClick: select (max(CD_REGIAO)+1) from PRECOREGIAO + insert into PRECOREGIAO(...).
  • Replicardadosparafilhos1Click: select CD_REGIAO from PRECOREGIAO where CD_REGIAORIGEM = :atual.
  • Calcula_Totais: SELECT SUM(QT_PARTICIPACAO), SUM((VL_CUSTOMP - VL_ICMSCUSTOMP + VL_FRETE - VL_ICMSFRETE) * QT_PARTICIPACAO), SUM(COALESCE(RETORNA_SALDOESTOQUE(...), 0) * QT_PARTICIPACAO) agrupado por TP_DESPESA in ('Q','V','P').
  • Busca_Custo: FIRST 1 FROM NOTA INNER JOIN ITEMNOTA ... WHERE ST_NOTA='V' AND TP_NOTA='E' ORDER BY DT_EMISSAO DESC + VALOR_IMPOSTO(...) + FRETENOTA INNER JOIN NOTA ....
  • ImportarFichaTecnica1Click: INSERT INTO ITEMPRECOREGIAOMP ... SELECT FROM ITEMPRODUCAO WHERE CD_EMPRESA=... AND CD_ITEM=... AND TP_PRODUCAO='C' AND TP_DESPESA='M'.

Pesquisa (F9)​

GridTabela alvoFiltro
gridREGIAOPRECOREGIAOtodos
gridGRUPOSGRUPOtodos
gridITENSITEMST_ATIVO = 'S'
gridITEMPRECOREGIAOITEMST_ATIVO='S' AND TP_ITEM='P' AND CD_ITEM NOT IN (SELECT CD_ITEM FROM ITEMPRECOREGIAO WHERE CD_REGIAO = corrente)
gridITEMPRECOREGIAOMPITEMST_ATIVO='S' AND TP_ITEM NOT IN ('S','A') AND CD_ITEM NOT IN (SELECT CD_MATERIAPRIMA FROM ITEMPRECOREGIAOMP WHERE CD_REGIAO= AND CD_ITEM=)
gridITEMDESPESAITEMST_ATIVO='S' AND TP_ITEM IN ('S','A') AND CD_ITEM NOT IN (...)

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
FORMACAOPRECODELETE, INSERT, SELECT, UPDATE
GRUPODELETE, INSERT, SELECT, UPDATE
ITEMDELETE, INSERT, SELECT, UPDATE
ITEMPRECOREGIAODELETE, INSERT, SELECT, UPDATE
ITEMPRECOREGIAOMPDELETE, INSERT, SELECT, UPDATE
PRECOREGIAODELETE, INSERT, SELECT, UPDATE

Tabelas de Leitura (SELECT)​

TabelaOperacoes
FRETENOTASELECT
ITEMNOTASELECT
ITEMPRODUCAOSELECT
NOTASELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
GERA_SEQUENCIASEQUENCIA (SELECT/UPDATE)
RETORNA_SALDOESTOQUEESTOQUE (SELECT), ESTOQUEDIA (SELECT), ITEMLOCAL (SELECT), MOVESTOQUE (SELECT), OPERACAO (SELECT), PARMESTOQUE (SELECT)
VALOR_IMPOSTOIMPOSTO (SELECT), IMPOSTONOTA (SELECT), NOTA (SELECT), PESSOA (SELECT)

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
ESTOQUESELECT
ESTOQUEDIASELECT
IMPOSTOSELECT
IMPOSTONOTASELECT
ITEMLOCALSELECT
MOVESTOQUESELECT
NOTASELECT
OPERACAOSELECT
PARMESTOQUESELECT
PESSOASELECT
SEQUENCIASELECT, UPDATE

Dependencias Aferentes​

Módulos que produzem dados consumidos por MPD014 (principalmente notas fiscais de entrada em NOTA/ITEMNOTA/FRETENOTA e composicao tecnica em ITEMPRODUCAO):

MNF001, MNF002, MNF003, MNF004, MNF005, MNF006, MNF007, MNF008, MNF010, MNF011, MNF013, MNF014, MNF016, MNF017, MNF019, MNF023, MNF024, MNF026, MNF027, MNF029, MNF030, MFC009, MFC029, MCA004, MCA008, CNF001, CNF004, CNF007, CFA001

Dependencias Eferentes​

As tabelas especificas de precificacao (PRECOREGIAO, ITEMPRECOREGIAO, ITEMPRECOREGIAOMP, FORMACAOPRECO) nao sao consumidas por nenhum outro módulo mapeado no table_screen_map.json — MPD014 e o unico produtor e consumidor. O preco final apurado pode ser reutilizado manualmente em rotinas de importacao/atualizacao de precos (ver MFA019) ou em formacao de preco alternativa (CFA001).