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(dojCommon);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
Reprocessarou em lote viaReprocessar 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:
| Grupo | Grid/Campo | Fonte (F9) | Observacao |
|---|---|---|---|
| Regiao | Código, Descricao | PRECOREGIAO | Seleciona regioes a filtrar |
| Grupos | Código, Descricao | GRUPO | Filtra por grupo de produto |
| Itens | Código, Descricao | ITEM (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:
| Grupo | Grid/Campo | Dataset | Funcao |
|---|---|---|---|
| Regiao | CD_REGIAO, DS_REGIAO, DS_REGIAORIGEM | tabPRECOREGIAO | Registro de cabecalho da ficha; popup popup com Herdar / Replicar / Copia / Filho / Reprocessar Custos |
| Produto Acabado | CD_ITEM, DS_ITEM, SG_UNIDMED (Un) | tabITEMPRECOREGIAO | Produto-pai da ficha; popup PopupItem com Importar Ficha Tecnica |
| Valor de Custo, Margem e Venda | VL_CUSTO (R$ Custo), PC_CUSTO (% Custo), PC_MARGEMVENDA (% Margem), PC_VENDA (^% Margem), VL_VENDA (R$ Venda), NR_FATOR (Fator), VL_UNITARIO (R$ Unitario) | tabFORMACAOPRECO | VL_VENDA e editavel; demais sao recalculados por Calcula_Totais ao sair da coluna |
| Produtos Componentes da Ficha | CD_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 Custos | tabITEMPRECOREGIAOMP (TP_DESPESA='Q') | Materias-primas que compoem o custo; lookup F9 traz produtos com TP_ITEM NOT IN ('S','A') |
| Outras Despesas da Ficha | CD_MATERIAPRIMA, DS_ITEM, TP_DESPESA (V/P), QT_PARTICIPACAO (Valor / Perc), VL_DESPESA (Valor) + label Total ligado a VL_OUTRAS | tabITEMDESPESA (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') |
Menus Popup
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 comCD_REGIAORIGEM= origem atual) - Gerar Filho ->
btCopiaClick(cria nova regiao comCD_REGIAORIGEM= regiao corrente) - Reprocessar Custos ->
ReprocessarCustos1Click(itera todos os itens reprocessando)
PopupItem (sobre grid de Produto Acabado):
- Importar Ficha Tecnica ->
ImportarFichaTecnica1Click(leITEMPRODUCAOcomTP_PRODUCAO='C'eTP_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
Pesquisacom 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:
| Contexto | Uso |
|---|---|
Calcula_Totais | Passado a RETORNA_SALDOESTOQUE(cd_empresa, CD_MATERIAPRIMA, NULL, NULL, CURRENT_DATE) para obter custo contábil alternativo |
ImportarFichaTecnica1Click | Filtra 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_REGIAOeDS_REGIAOnao vazios — acumula mensagens e disparaJException('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_MATERIAPRIMAeQT_PARTICIPACAO > 0. - tabITEMDESPESABeforePost: exige
CD_MATERIAPRIMAeQT_PARTICIPACAO > 0(mensagem "Valor/Percentual deve ser maior que Zero"). - tabFORMACAOPRECOBeforePost: exige
VL_VENDA > 0; seNR_FORMACAOPRECOvazio, gera viaGERA_SEQUENCIA(NULL, 'SEQ_FORMACAOPRECO'); preencheCD_REGIAO/CD_ITEMa partir do master quando vazios. - tabITENSCD_ITEMValidate / tabITEMPRECOREGIAOCD_ITEMValidate: lookup em
ITEM— exige cadastrado e ativo (ST_ATIVO='S'), filtraTP_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; chamaBusca_Custoapos validacao. - tabITEMDESPESACD_MATERIAPRIMAValidate: exige
TP_ITEM IN ('A','S')(apenas servico/outras); nao permite duplicidade; defaultTP_DESPESA='V'(valor) se vazio. - tabGRUPOSCD_GRUPOValidate / tabREGIAOCD_REGIAOValidate: lookup simples em
GRUPO/PRECOREGIAOexigindo cadastro.
Calculo de Totais (Calcula_Totais)
Orquestrador principal do custo da ficha, disparado por tabITEMDESPESAAfterScroll, tabITEMPRECOREGIAOMPAfterScroll, tabFORMACAOPRECOAfterScroll e gridValoresColExit quando VL_VENDA e alterado:
- Soma liquida dos componentes com
TP_DESPESA='Q':SUM((VL_CUSTOMP - VL_ICMSCUSTOMP + VL_FRETE - VL_ICMSFRETE) * QT_PARTICIPACAO)-> campo calculadoT_VL_PARTICIPACAO. - Soma fixa das despesas com
TP_DESPESA='V'e adiciona aoVL_CUSTO. - Se
tp_calculo='%'ePC_VENDA>0: calculaVL_VENDA = VL_CUSTO + VL_CUSTO * (PC_VENDA/100). - Se
tp_calculo='$'eVL_VENDA>0: soma custos comTP_DESPESA='P'comoVL_VENDA * (QT_PARTICIPACAO/100)(despesas percentuais sobre a venda) aoVL_CUSTO; recalculaPC_VENDA,PC_MARGEMVENDAePC_CUSTO. VL_OUTRAS = VL_CUSTO - T_VL_PARTICIPACAO(diferenca entre custo total e custo dos componentes).OnCalcFieldsdetabFORMACAOPRECOcalculaVL_UNITARIO = VL_VENDA / NR_FATOR.OnCalcFieldsdetabITEMDESPESAcalculaVL_DESPESA = VL_VENDA * QT_PARTICIPACAO/100quandoTP_DESPESA='P', senaoVL_DESPESA = QT_PARTICIPACAO.
Busca de Custo da Materia-Prima (Busca_Custo)
Chamado apos validar CD_MATERIAPRIMA e no botao Reprocessar do grid de componentes:
- Ultima NF de entrada (
NOTA.ST_NOTA='V',TP_NOTA='E')ORDER BY DT_EMISSAO DESC LIMIT 1, lendoVL_UNITARIO,VL_FRETE,VL_TOTAL,PS_ITEMNOTA/QT_ITEMNOTAdeITEMNOTA. VL_CUSTOMP := VL_UNITARIOda NF;VL_FRETE := VL_FRETE_NF / quantidade.VALOR_IMPOSTO(empresa, lancamento, serie, 'E', cd_item, 'I', 'N', 'VI')-> calcula ICMS custo; dividido por quantidade ->VL_ICMSCUSTOMP.VALOR_IMPOSTO(..., 'P', ...)-> IPI / ST somado aoVL_CUSTOMP.- Se
VL_FRETE=0, consultaFRETENOTAvinculada (CT-e) ligada aNOTA, rateia pelo valor fiscal e calcula ICMS sobre frete proporcional via novoVALOR_IMPOSTO(..., 'I', ...)->VL_ICMSFRETE.
Herdar e Replicar (Herdar)
Sincroniza tres tabelas filhas entre regioes (parent cd_pai, child cd_filha) em transacao aberta:
DELETE FROM FORMACAOPRECO/ITEMPRECOREGIAOMP/ITEMPRECOREGIAO WHERE CD_REGIAO = cd_filha.INSERT INTO ITEMPRECOREGIAO (CD_REGIAO, CD_ITEM, DT_REGISTRO) SELECT cd_filha, CD_ITEM, 'NOW' FROM ITEMPRECOREGIAO WHERE CD_REGIAO = cd_pai.- Inserts analogos para
ITEMPRECOREGIAOMP(copiando QT_PARTICIPACAO, TP_DESPESA, VL_CUSTOMP, VL_ICMSCUSTOMP, VL_FRETE, VL_ICMSFRETE) eFORMACAOPRECO(gerando novoNR_FORMACAOPRECOviaGERA_SEQUENCIA).
Gerar Copia / Filho (btCopiaClick)
CD_REGIAOnovo viaMAX(CD_REGIAO)+1.- Copia:
CD_REGIAORIGEM= origem da atual (mesmo nivel, irma). - Filho:
CD_REGIAORIGEM=CD_REGIAOatual (dependente hierarquicamente). - Apos criar a regiao, chama
Herdarpara 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 viaLocate.btnExcluir->msgCodigo('C-0045')confirmacao; emtabPRECOREGIAOapaga em cascata (FORMACAOPRECO, ITEMPRECOREGIAOMP, ITEMPRECOREGIAO da regiao); emtabITEMPRECOREGIAOapaga apenas os registros do item; depoisNavegacao.DeleteeCommit.btnAtualizar->Rollback+ restauraisqlPRECOREGIAO/isqlITEMPRECOREGIAO+ reabre.FormClose-> perguntaC-0048para salvar ->Rollback->Free.
Controle de Acesso
Se programa.tpAcesso = 2, oculta btnNovo, btnSalvar, btnExcluir e Separador1 (modo somente leitura).
Datasets e SQL
| Dataset | Principal SELECT | Parametros | Eventos |
|---|---|---|---|
tabPRECOREGIAO | select 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 |
tabITEMPRECOREGIAO | select 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_ITEM | CD_REGIAO | BeforePost, AfterScroll |
tabITEMPRECOREGIAOMP | select 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_ITEM | CD_REGIAO, CD_ITEM | AfterInsert, BeforePost, AfterScroll, OnCalcFields |
tabITEMDESPESA | mesma base de ITEMPRECOREGIAOMP com R.TP_DESPESA <> 'Q' | CD_REGIAO, CD_ITEM | AfterInsert, BeforePost, AfterScroll, OnCalcFields |
tabFORMACAOPRECO | select 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_ITEM | CD_REGIAO, CD_ITEM | BeforePost, AfterScroll, OnCalcFields |
tabREGIAO, tabGRUPOS, tabITENS | Filtros pre-carregados com WHERE ... = -1 (vazios); preenchidos manualmente no grid via F9 ou digitacao | — | OnValidate em cada CD_ |
Queries diretas (ExecutaConsulta / ExecUpdate)
btnImprimirClick: montaSELECT 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; chamaGeraRelatorio.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 porTP_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)
| Grid | Tabela alvo | Filtro |
|---|---|---|
| gridREGIAO | PRECOREGIAO | todos |
| gridGRUPOS | GRUPO | todos |
| gridITENS | ITEM | ST_ATIVO = 'S' |
| gridITEMPRECOREGIAO | ITEM | ST_ATIVO='S' AND TP_ITEM='P' AND CD_ITEM NOT IN (SELECT CD_ITEM FROM ITEMPRECOREGIAO WHERE CD_REGIAO = corrente) |
| gridITEMPRECOREGIAOMP | ITEM | ST_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=) |
| gridITEMDESPESA | ITEM | ST_ATIVO='S' AND TP_ITEM IN ('S','A') AND CD_ITEM NOT IN (...) |
Tabelas de Escrita (INSERT/UPDATE/DELETE)
| Tabela | Operacoes |
|---|---|
| FORMACAOPRECO | DELETE, INSERT, SELECT, UPDATE |
| GRUPO | DELETE, INSERT, SELECT, UPDATE |
| ITEM | DELETE, INSERT, SELECT, UPDATE |
| ITEMPRECOREGIAO | DELETE, INSERT, SELECT, UPDATE |
| ITEMPRECOREGIAOMP | DELETE, INSERT, SELECT, UPDATE |
| PRECOREGIAO | DELETE, INSERT, SELECT, UPDATE |
Tabelas de Leitura (SELECT)
| Tabela | Operacoes |
|---|---|
| FRETENOTA | SELECT |
| ITEMNOTA | SELECT |
| ITEMPRODUCAO | SELECT |
| NOTA | SELECT |
Procedures Chamadas
| Procedure | Tabelas Acessadas |
|---|---|
| GERA_SEQUENCIA | SEQUENCIA (SELECT/UPDATE) |
| RETORNA_SALDOESTOQUE | ESTOQUE (SELECT), ESTOQUEDIA (SELECT), ITEMLOCAL (SELECT), MOVESTOQUE (SELECT), OPERACAO (SELECT), PARMESTOQUE (SELECT) |
| VALOR_IMPOSTO | IMPOSTO (SELECT), IMPOSTONOTA (SELECT), NOTA (SELECT), PESSOA (SELECT) |
Tabelas via Procedures (acesso indireto)
| Tabela | Operacoes |
|---|---|
| ESTOQUE | SELECT |
| ESTOQUEDIA | SELECT |
| IMPOSTO | SELECT |
| IMPOSTONOTA | SELECT |
| ITEMLOCAL | SELECT |
| MOVESTOQUE | SELECT |
| NOTA | SELECT |
| OPERACAO | SELECT |
| PARMESTOQUE | SELECT |
| PESSOA | SELECT |
| SEQUENCIA | SELECT, 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).