Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.


01. DADOS GERAIS

Produto:

Solucoes_totvs

Solucoes_totvs_cross
SolucaoCrossTOTVS Backoffice

Solucoes_totvs_parceiros
SolucaoParceiros

Solucoes_totvs_parceirosexptotvs
SolucaoParcsExpsTOTVS

Linha de Produto:

Linhas_totvs
LinhaLinha Protheus

Segmento:

Segmentos_totvs
SegmentoBackoffice

Módulo:

Modulos_cross_segmentos
ModulosCrossSegmentosTOTVS Backoffice (Linha Protheus) - Estoque e Custos (SIGAEST)

Modulos_framework

Modulos_totvs_construcao

Modulos_totvs_juridico

Modulos_totvs_logistica

Modulos_totvs_manufatura

Modulos_totvs_rh

Modulos_totvs_saude

Modulos_totvs_prestadores_de_servicos

Função:MATA330
País:Brasil
Ticket:
Issue:DMANMAT01-42029


02. DESCRIÇÃO

O ponto de entrada M330CD1 é utilizado em conjunto com o ponto de entrada MA330CP e permite a manipulação do custo em partes de notas fiscais de entrada (SD1) que não sejam do tipo (D1_TIPO) D-Devolução. Veja o tópico Assuntos Relacionados para maiores detalhes sobre o custo em partes e o ponto de entrada MA330CP.

Por padrão, a regra configurada no ponto de entrada MA330CP atribui o custo da nota fiscal na parte em que o produto se enquadra, e o ponto de entrada M330CD1 é utilizado para sobrepor este custo.

Assim como ocorre com o custo padrão, o custo em partes da nota fiscal de compras é adicionado na tabela de saldos físico/financeiro (SB2 ou TR2, durante o recálculo). Quando ocorrem movimentações que requisitam o saldo no estoque a custo médio, o custo em partes é requisitado proporcionalmente.

Veja um exemplo sem o ponto de entrada M330CD1:

Configuração do custo em partes:

  • Parte 1: Produtos insumos industriais (B1_TIPO = II)
  • Parte 2: Produtos matéria-prima (B1_TIPO = MP)
  • Parte 3: Outros (demais produtos não classificados na regra anterior)

Movimentações no período:

  • Compra de produto insumo industrial: Quantidade 500 | Custo total 20.000
  • Requisição de produto insumo industrial: Quantidade 200 | Custo: médio (a calcular)

Após a execução do recálculo, teremos:

MovimentoQuantidadeCusto TotalCusto MédioCusto Parte 1Parte 2Parte 3
Compra50020.0004020.00000
Requisição2008.00040800000
Saldo Final30012.0004012.00000

Digamos que, para o produto de insumo industrial, deseje-se que parte do custo seja atribuído à parte 2 - matéria prima. Isto é possível somente com a manipulação do custo através do ponto de entrada M330CD1. Ainda no mesmo exemplo, supondo que deseje-se atribuir 70% à parte 1 e 30% à parte 2, teremos:

MovimentoQuantidadeCusto TotalCusto MédioCusto Parte 1Parte 2Parte 3
Compra50020.0004014.0006.0000
Requisição2008.000405.6002.4000
Saldo Final30012.000408.4003.6000


03. PARÂMETROS

Além dos parâmetros que o ponto de entrada recebe, ele estará posicionado na nota fiscal de entrada (SD1).

NomeTipoDescriçãoConteúdo
ParamIXB[1]LógicolCstParte - Indica se o custo em partes está sendo calculado.T. ou .F.
ParamIXB[2]ArrayaRegraCP -
Composition Setup
import.css=/download/attachments/327912/newLayout.css

...

Ponto-de-Entrada: M330CD1 - Manipula custo em parte nas notas de entrada

...

'SD1' que possuem o D1_TIPO diferente de 'D'.

O Ponto de Entrada é utilizado para manipular o custo em partes das notas de entrada.

Programa Fonte
MATA330.PRX
Sintaxe

M330CD1 - Manipula custo em parte nas notas de entrada ( < PARAMIXB[1]> , < PARAMIXB[2]> , < PARAMIXB[3]> )

Retorno --> aRetPartes

...

Array com a regra do custo em partes

...

O mesmo conteúdo configurado no ponto de entrada MA330CP
ParamIXB

...

[3]

...

ArrayaCusto - Array com

...

custo da nota fiscal de entrada, nas 5 moedas

aCusto[1] - Custo total na moeda 1

aCusto[2] - Custo total na moeda 2

aCusto[3] - Custo total na moeda 3

aCusto[4] - Custo total na moeda 4

aCusto[5] - Custo total na moeda 5

04. RETORNO

aRetPartes -

...

Array com o novo custo em partes para a nota fiscal de entrada (SD1).

Informações
titleImportante

Caso não se deseje manipular o custo da nota posicionada, retornar Nil (nulo) ao ponto de entrada.

Atualmente, existem dois retornos possíveis para o Array de retorno:

  • Para notas que não são de transferência
  • Para notas que são de transferência, onde ambas as notas de entrada e saída estão sendo processadas juntas.

Caso não seja uma nota de transferência, o retorno deve ser o custo do movimento

...

       aretPartes [1]: parte 1 na moeda 1 \
       aretPartes [2]: parte 1 na moeda 2  \
       aretPartes [3]: parte 1 na moeda 3   > Parte 1
       aretPartes [4]: parte 1 na moeda 4  /
       aretPartes [5]: parte 1 na moeda 5 /

       aretPartes [6]: parte 2 na moeda 1 \
       aretPartes [7]: parte 2 na moeda 2  \
       aretPartes [8]: parte 2 na moeda 3   > Parte 2
       aretPartes [9]: parte 2 na moeda 4  /
       aretPartes [10]:parte 2 na moeda 5 /
       ...
       ...
      a Parte abaixo corresponde a ultima parte + 1 (Outros)
       aretPartes [n]: parte n na moeda 1 \
       aretPartes [n]: parte n na moeda 2  \
       aretPartes [n]: parte n na moeda 3   > Parte n
       aretPartes [n]: parte n na moeda 4  /
       aretPartes [n]: parte n na moeda 5 /

dividido pela quantidade (D1_CUSTO/D1_QUANT).

Caso seja uma nota de transferência, o retorno deve ser o custo total do movimento.

Estrutura do Array:

PosiçãoParteMoedaDescrição
111Custo médio ou total na parte 1 e moeda 1
212Custo médio ou total na parte 1 e moeda 2
313Custo médio ou total na parte 1 e moeda 3
414Custo médio ou total na parte 1 e moeda 4
515Custo médio ou total na parte 1 e moeda 5
621Custo médio ou total na parte 2 e moeda 1
722Custo médio ou total na parte 2 e moeda 2
823Custo médio ou total na parte 2 e moeda 3
924Custo médio ou total na parte 2 e moeda 4
1025Custo médio ou total na parte 2 e moeda 5
............
(n-1) x 5 +1n1Custo médio ou total na parte n e moeda 1
(n-1) x 5 +2n2Custo médio ou total na parte n e moeda 2
(n-1) x 5 +3n3Custo médio ou total na parte n e moeda 3
(n-1) x 5 +4n4Custo médio ou total na parte n e moeda 4
(n-1) x 5 +5n5Custo médio ou total na parte n e moeda 5

Card documentos
Informacao O tamanho do array retornado depende do número de regras configuradas no ponto de entrada MA330CP.
TituloIMPORTANTE!

05. EXEMPLO DE UTILIZAÇÃO

Exemplo :

...

Card documentos
Informacao

Este exemplo é de referencia apenas, as partes variam de acordo com a regra utilizada no ponto de entrada MA330CP,

...

podendo ter de 1

...

a 99 partes, portanto não se deve copiar e colar sem

...

adequar a regra utilizada.

...

O exemplo é apenas para demonstrar como deve ser montado o array de retorno em relação a regra usada.
TituloIMPORTANTE!

Para o exemplo, considere o PE MA330CP configurado com 2 regras (3 partes) e rateio de 80%/20%/0% entre as 3 partes


Bloco de código
languagejava
themeMidnight
titleExemplo M330CD1
linenumberstrue
#INCLUDE "TOTVS.CH" 

/*/{Protheus.doc} M330CD1
Manipula o custo da nota fiscal de entrada 
@type       user function
@author    TOTVS 
/*/
User Function M330CD1()  
    Local aAreaAnt   := GetArea()
    Local aAreaSF4   := SF4->(GetArea())
    Local aAreas     := {aAreaSF4, aAreaAnt}
    Local lCstPart  
ExemploAtenção: Este exemplo é de referencia apenas, as partes variam de acordo com a regra utilizada no ponto de entrada MA330CP, podendo ter de 1 á 99 partes, portanto não se deve copiar e colar
sem ajustar a regra utilizada. O exemplo é apenas para demonstrar como deve ser montado o array de retorno em
relação a regra usada.
UserFunctionM330CD1()Local aAreaAnt   := GetArea()
Local lCstPart  
 := PARAMIXB[1]


    Local aRegraCP 
 
  := PARAMIXB[2]


    Local aCusto 
 
   
 
 := PARAMIXB[3]


    Local aRetPartes :=
{}
 Nil
    Local nMoedas 
 
   
 
:= 0


    Local nPartes, nMoe


    Local 
nPar
aRateio :=
0
 {0.80, 0.20, 0.0}

    nMoedas := 5 //(mesmo que não use o MV_MOEDACM, a qtde de moedas deve ser 5)
If lCstPart
    aRetPartes := Array((len(aregraCP)+1)*(nMoedas))
    For nPartes := 1 to len(aRetPartes) step nMoedas
        nPar += 1
        For nMoe := 1 to nMoedas
            If Len(aRegraCP) >= nPar
                If "'MP'" $ aregraCP[nPar] .and. SD1->D1_COD = 'TESTEMP'
                    If nMoe = 1
                        aRetPartes [nPartes] := 999
                    Else
                        aRetPartes [nPartes+nMoe-1] := 0
                    EndIf
                Else
                    If "'EM'" $ aregraCP[nPar] .and. (SD1->D1_COD = 'TESTEEM' .or. SD1->D1_COD = 'TESTE')
                        If nMoe = 1
           


    If lCstPart
        If SD1->D1_DOC = 'DOC123456' //Implementar regra de filtro
			SF4->(DbSetOrder(1)) //F4_FILIAL+F4_CODIGO
            If SF4->(DbSeek(FWXFilial('SF4')+SD1->D1_TES))
                If SF4->F4_TRANFIL <> '1' //Não é nota de transferência
             
    aRetPartes [nPartes]
		aRetPartes := 
999
                        Else
                            aRetPartes [nPartes+nMoe-1] := 0
                        EndIf
                    else
                        If nMoe = 1
                            aRetPartes [nPartes] := 0
                        else
                            aRetPartes [nPartes+nMoe-1] := 0
                        EndIf
                    EndIf
                EndIf
            else
                If nMoe = 1
                    aRetPartes [nPartes] := 0
                else
                    aRetPartes [nPartes+nMoe-1] := 0
                EndIf  
            EndIf                
        Next nMoe          
    Next nPartes
else
    aRetPartes := NIL
EndIf
RestArea(aAreaAnt)
Return aRetPartes  
Array((len(aregraCP)+1)*(nMoedas))
            		For nPartes := 1 To Len(aRegraCP)
                		For nMoe := 1 To nMoedas
                    		aRetPartes[(nPartes-1)*5+nMoe] := aCusto[nMoe]*aRateio[nPartes] / SD1->D1_QUANT
                		Next nMoe
            		Next nPartes
				EndIf
			EndIf
        EndIf
    Else
        aRetPartes := NIL
    EndIf

    AEval(aAreas, {|x| RestArea(x)})
Return aRetPartes


06. ASSUNTOS RELACIONADOS



Templatedocumentos