Primeiramente vamos alinhar com o cliente a seguinte regra:



Sendo assim, com a nota e o produto em mãos, é necessário identificar a GUID do produto que gravou o serviço de custo com o seguinte select:


SELECT A.GUID_JSON, A.GUID_JSON_DEV, B.CODPROD FROM PCMOV B, PCMOVCOMPLE A WHERE A.NUMTRANSITEM = B.NUMTRANSITEM AND B.NUMTRANSENT = XXXXX


Após pegar a GUID iremos pegar a GUID_JSON_DEV e realizar a consulta na PCNFCUSTO_JSON, para identificarmos a chamada do serviço de custo (Se não houver registro, encaminhar o ticket para a equipe de faturamento, visto que nesse caso o serviço não foi chamado).


SELECT * FROM PCNFCUSTO_JSON WHERE GUID = 'XXXXX'


Será apresentado dois campos CLOB, onde um é da nota de devolução e o outro é a chamada do serviço, primeiramente é necessário identificar a chamada do serviço para identificar se foi chamado pela nota de venda, pela entrada, ou pela pchistest, visto que a PKG_VALIDA_CUSTO, segue a seguinte regra de validação:


  1. Custo da nota de venda
  2. Custo da nota de entrada
  3. Custo PCHISTEST


A chamada do serviço, mostra qual custo foi retornado conforme imagem abaixo:



Podemos ver nesse caso que o retorno mostra a origem como "Venda" assim, podemos concluir que serão utilizados como base os custos da venda para calculo dos custos médios, agora basta pegar os custos da venda para que possamos realizar o calculo, vamos usar como exemplo o custo real, financeiro, e contábil:

SELECT * FROM PCESTCOM WHERE NUMTRANSENT = XXXX

SELECT A.CUSTOREALEST, B.CUSTOFINEST, B.CUSTOCONT FROM PCMOVCOMPLE A, PCMOV B WHERE A.NUMTRANSITEM = B.NUMTRANSITEM AND B.NUMTRANSVENDA = XXX AND B.CODPROD = XXX

Como os custos médios usam como base o custo anterior à devolução, como a entrada faz, temos que realizar a seguinte consulta na PCLOGESTOQUE:

select a.data,
       a.qtest,
       a,qtestant,
       a.qtestger,
       a.qtestgerant,
       a.custocont_ant,
       a.custocont,
       a.custofin_ant,
       a.custofin,
       a.custoultent_ant,
       a.custoultent,
       a.custoreal_ant,
       a.custoreal,
       a.programa,
       a.maquina,
       a.usuario,
a.identificador
  from pclogestoque a
  where a.codprod= 'XXX'
  and codfilial= 'XXX'
  and data between 'DD-MM-AAAA' and 'DD-MM-AAAA'
  order by data asc;


Com base nesses dados basta que sigamos a forma como os custos são calculados:

CUSTO REAL = ((CUSTOREALANTERIOR X QTESTGERANT) + (CUSTOREALEST X QTDEVOL)) / (QTESTGERANT + QTDEVOL)

CUSTO CONTABIL ((CUSTOCONTANTERIOR X QTESTANT) + (CUSTOCONT X QTESTDEVOL)) / (QTESTANT + QTESTDEVOL)

Lembrando que os dados de CUSTOREALEST e CUSTOCONT são sempre conforme o retorno da consulta mencionada acima, ou seja nesse caso da nota de venda.


Outra informação importante, é que quem passa a transação de venda é a rotina de devolução não o serviço de custos, então se estiver incorreto, devemos direcionar para a rotina mencionada.