| 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 |
Este Ponto de Entrada permite realizar no WMS SaaS a separação à maior na finalização da convergência do pedido de venda.
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.
Nome | Tipo | Descrição |
|---|---|---|
| aFinalizados | Array | Array com os dados da finalização da convergência dos pedidos de venda (item, produto, lote, quantidade, sequência, tipoEstoque). |
| oObjeto | Objeto | Objeto contendo as informações da classe WMSSaasPedidoVenda. |
Nome | Tipo | Descrição |
|---|---|---|
| aRetPE[1] | Lógico | Se 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] | Caracter | Mensagem de sucesso ou mensagem do erro encontrado (caso o retorna acima seja .F.). |
Protheus 12.1.2410 ou superiores.
Não se aplica.
------
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"}