01. DADOS GERAIS

Produto:

TOTVS Logística WMS

Linha de :

Linha Protheus

Segmento:

Logística

Módulo:

TOTVS WMS - Linha Protheus - WMS Protheus (SIGAWMS)

Função:distribution.convergencia.pedido.venda.classe - Classes/métodos da Convergência do Pedido de Venda.
País:Todos Países
Ticket:

23784715

Requisito/Story/Issue (informe o requisito relacionado) :DLOGWMSMSP-17682

02. DESCRIÇÃO

Este Ponto de Entrada permite realizar no WMS SaaS a separação à maior na finalização da convergência do pedido de venda.

03. LOCALIZAÇÃO

Localizado no início do método finaliza da rotina distribution.convergencia.pedido.venda.classe (Classes/métodos da Convergência do Pedido de Venda), antes do processamento padrão.

04. PARÂMETROS

Nome

Tipo

Descrição

aFinalizadosArrayArray com os dados da finalização da convergência dos pedidos de venda (item, produto, lote, quantidade, sequência, tipoEstoque).
oObjetoObjetoObjeto contendo as informações da classe WMSSaasPedidoVenda.

05. RETORNO

Nome

Tipo

Descrição

aRetPE[1]LógicoSe o retorno for .T. irá prosseguir para a continuidade do processamento do produto padrão. Se o retorno for .F. não irá prosseguir o processamento e irá apresentar ao usuário a mensagem de consistência com o problema encontrado.
aRetPE[2]CaracterMensagem de sucesso ou mensagem do erro encontrado (caso o retorna acima seja .F.).

06. VERSÕES

Protheus 12.1.2410 ou superiores.

07. OBSERVAÇÃO

Não se aplica.

08. EXEMPLO

------

User Function WMSFIMPV()

Local aFinalizados := ParamIxb[1]
Local oObjeto      := ParamIxb[2]
Local lRet         := .T.
Local cAliasSC9    := GetNextAlias()
Local aAreaSC6     := SC6->(GetArea())
Local aAreaSC9     := SC9->(GetArea())
Local lDelSC9      := .F.
Local aARREsp      := {}
Local itemFinalizado := 1
Local itemEsp        := 1
Local aSequenciasAlteradas   := {}

conout("CONOUT WMSFIMPV - Inicio")

For itemFinalizado := 1 to Len(aFinalizados)
    cItem    := aFinalizados[itemFinalizado]['item']
    cProduto := aFinalizados[itemFinalizado]['produto']
    cLote    := aFinalizados[itemFinalizado]['lote']
    nQtde    := aFinalizados[itemFinalizado]['quantidade']
    cSequenc := aFinalizados[itemFinalizado]['sequencia']
    cTpEstoq := aFinalizados[itemFinalizado]['tipoEstoque']
    cPedido  := oObjeto:numeroDocumento

    cAliasSC9  := GetNextAlias()
    BeginSql Alias cAliasSC9
        SELECT SC9.C9_LOTECTL,
                SC9.C9_LOCAL,
                SC9.C9_NUMLOTE,
                SC9.C9_QTDLIB
        FROM %Table:SC9% SC9
        WHERE SC9.C9_FILIAL = %xFilial:SC9%
        AND SC9.C9_PEDIDO = %Exp:cPedido%
        AND SC9.C9_ITEM = %Exp:cItem%
        AND SC9.C9_PRODUTO = %Exp:cProduto%
        AND SC9.C9_SEQUEN = %Exp:cSequenc%            
        AND SC9.%NotDel%
    EndSql
    dbSelectArea(cAliasSC9)
    dbGoTop()
    if (cAliasSC9)->(Eof())
        (cAliasSC9)->(DbCloseArea())
        return {.F., 'Não foi possível localizar o registro relacionado ao pedido '+Alltrim(cPedido)+;
                                '| Item: '+Alltrim(cItem)+;
                                '| Produto: '+Alltrim(cProduto)} 
    else
        If Empty((cAliasSC9)->C9_LOTECTL)
            nPosEsp := aScan(aARREsp,{|x|AllTrim(x[1]) == AllTrim(cItem) .And.;
                                            AllTrim(x[2]) == AllTrim(cProduto) .And.;
                                            AllTrim(x[3]) == "" .And.;
                                            AllTrim(x[5]) == AllTrim(cSequenc) })
            If nPosEsp == 0
                Aadd(aARREsp,{cItem, cProduto, " ", nQtde, cSequenc, cTpEstoq, (cAliasSC9)->C9_LOCAL})
            Else
                aARREsp[nPosEsp][4] += nQtde
            EndIf
        Else
            If AllTrim((cAliasSC9)->C9_LOTECTL) == AllTrim(cLote)
                nPosEsp := aScan(aARREsp,{|x|AllTrim(x[1]) == AllTrim(cItem) .And.;
                                                AllTrim(x[2]) == AllTrim(cProduto) .And.;
                                                AllTrim(x[3]) == AllTrim(cLote) .And.;
                                                AllTrim(x[5]) == AllTrim(cSequenc) })
                If nPosEsp == 0
                    Aadd(aARREsp,{cItem, cProduto, cLote, nQtde, cSequenc, cTpEstoq, (cAliasSC9)->C9_LOCAL})
                Else
                    aARREsp[nPosEsp][4] += nQtde
                EndIf
            Else
                return {.F., 'Lote não encontrado.'} 
            EndIf
        EndIf
    endif
Next itemFinalizado
(cAliasSC9)->(DbCloseArea())

conout("CONOUT WMSFIMPV - ANTES DO FOR")

For itemEsp := 1 to Len(aARREsp)
    cItem    := aARREsp[itemEsp][1]
    cProduto := aARREsp[itemEsp][2]
    cLoteCtl := aARREsp[itemEsp][3]
    nQtde    := aARREsp[itemEsp][4]
    cSequenc := aARREsp[itemEsp][5]
    cLocal   := aARREsp[itemEsp][7]
    cPedido  := oObjeto:numeroDocumento

    cAliasSC9  := GetNextAlias()
    BeginSql Alias cAliasSC9
        SELECT SC9.C9_SEQUEN,
                SC9.R_E_C_N_O_ RECNOSC9
        FROM %Table:SC9% SC9 //(NOLOCK)
        WHERE SC9.C9_FILIAL = %xFilial:SC9%
        AND SC9.C9_PEDIDO = %Exp:cPedido%
        AND SC9.C9_ITEM = %Exp:cItem%
        AND SC9.C9_PRODUTO = %Exp:cProduto%
        AND SC9.C9_LOTECTL = %Exp:cLoteCtl%
        AND SC9.C9_SEQUEN  = %Exp:cSequenc%
        AND SC9.C9_NFISCAL = '  '
        AND SC9.%NotDel%
        ORDER BY C9_SEQUEN
    EndSql

    conout("<<<<|WMSFIMPV|>>>> Query: "+getlastquery()[2])
    dbSelectArea(cAliasSC9)
    dbGoTop()
    if !(cAliasSC9)->(Eof())

        if !vldSaldo(cProduto, cLocal, nQtde, cLoteCtl)
            (cAliasSC9)->(DbCloseArea())
            return {.F., "Produto não possui saldo de estoque suficiente."} 
        endif

        conout("CONOUT WMSFIMPV - WHILE")
        If (cAliasSC9)->(!Eof()) .And. QtdComp(nQtde) > 0
            conout("CONOUT WMSFIMPV - dentro while")
            SC9->(DbGoTo((cAliasSC9)->RECNOSC9))

            nQtdOrig := SC9->C9_QTDLIB

            /*If QtdComp(nQtdOrig) > QtdComp(nQtde)
                Return .t.
            EndIf*/

            nQtdMaior := nQtde - nQtdOrig
            If nQtdMaior <= 0
                Loop
            EndIf

            // Itens Pedidos de Vendas
            SC6->(DbSetOrder(1))
            SC6->(MsSeek(xFilial("SC6")+SC9->C9_PEDIDO+SC9->C9_ITEM))
            // 2.Estorno do SC9 / Estorno da Liberacao de 6.Estoque/4.Credito do SC9 / WMS
            aLocaliz := {{ "","","","",SC9->C9_QTDLIB,,Ctod(""),"","","",SC9->C9_LOCAL,0}}
            MaAvalSC9("SC9",2,aLocaliz,Nil,Nil,Nil,Nil,Nil,Nil,,.F.,,.F.)
            //-- Atualiza quantidade liberada
            RecLock("SC9",.F.)
            SC9->C9_BLEST   := " "
            SC9->C9_BLCRED  := " "
            //SC9->C9_QTDLIB  := SC9->C9_QTDLIB + nQtdMaior
            SC9->C9_QTDLIB  += nQtdMaior
            SC9->C9_BLWMS   := "01"
            SC9->C9_DATALIB := dDataBase
            SC9->C9_QTDLIB2 := ConvUm(SC9->C9_PRODUTO,SC9->C9_QTDLIB,0,2)
            SC9->C9_LOTECTL := cLoteCtl
            If QtdComp(SC9->C9_QTDLIB) <= 0
                lDelSC9 := .T.
            EndIf
            SC9->(MsUnlock())
            SC9->(DbCommit()) //-- Força enviar para o banco a atualização da SC9

            If WMSSaasPedidoVenda():IsItemInConvergencia(SC9->C9_PEDIDO, SC9->C9_ITEM, SC9->C9_PRODUTO, SC9->C9_SEQUEN)
                aAdd(aSequenciasAlteradas, {;
                    "produto": cProduto,;
                    "item": cItem,;
                    "sequencia": Alltrim(SC9->C9_SEQUEN),;
                    "tipoEstoque": cLocal,;
                    "quantidade":SC9->C9_QTDLIB,;
                    "lote":cLoteCtl;
                    })                    
            EndIf

            RecLock("SC6",.F.)
            // Atualiza item do pedido de venda
            SC6->C6_QTDLIB  := SC9->C9_QTDLIB
            SC6->C6_QTDLIB2 := SC9->C9_QTDLIB2
            SC6->C6_LOTECTL := cLoteCtl
            // Deve calcular tudo o que já possui liberado do pedido de venda
            cAliasSUM  := GetNextAlias()
            BeginSql Alias cAliasSUM
                    SELECT SUM(SC9.C9_QTDLIB) SUM_QTDLIB
                    FROM %Table:SC9% SC9
                    WHERE SC9.C9_FILIAL = %xFilial:SC9%
                    AND SC9.C9_PEDIDO = %Exp:SC9->C9_PEDIDO%
                    AND SC9.C9_ITEM = %Exp:SC9->C9_ITEM%
                    AND SC9.%NotDel%
            EndSql
            If QtdComp((cAliasSUM)->SUM_QTDLIB) > QtdComp(SC6->C6_QTDVEN)
                SC6->C6_QTDVEN := (cAliasSUM)->SUM_QTDLIB
                SC6->C6_UNSVEN := ConvUM(SC6->C6_PRODUTO,SC6->C6_QTDVEN,0,2)
            EndIf
            (cAliasSUM)->(DbCloseArea())
            SC6->(MsUnlock())
            SC6->(DbCommit())

            //aSequenciasAlteradas[1]["quantidade"] := SC9->C9_QTDLIB
            //-- Atualiza Credito
            If !lDelSC9
                aLocaliz := {{ "","","","",SC9->C9_QTDLIB,,Ctod(""),"","","",SC9->C9_LOCAL,0}}
                MaAvalSC9("SC9",1,aLocaliz,Nil,Nil,Nil,Nil,Nil,Nil,,.F.,,.F.)
            EndIf

            // Atualiza DBY com novas quantidades, lotes e data de validade
            oObjeto:updateSequences(aSequenciasAlteradas)
            aSequenciasAlteradas := {}
            
            (cAliasSC9)->(DbSkip())
            nQtdMaior  := 0
        EndIf
    EndIf
    (cAliasSC9)->(DbCloseArea())
Next itemEsp

RestArea(aAreaSC6)
RestArea(aAreaSC9)

Return { lRet, "Processamento ok"}