Index: EWORDS6.mac.rou =================================================================== diff -u -r55205 -r75040 --- EWORDS6.mac.rou (.../EWORDS6.mac.rou) (revision 55205) +++ EWORDS6.mac.rou (.../EWORDS6.mac.rou) (revision 75040) @@ -11,21 +11,32 @@ - EWORDS6 : automatisch markeren (via background job, cfr. IsVoorVandaagOfMorgen) ============================================================================================================================ */ + +SendWMSIndienAfhaling(ORDNr) + Set VerzW = $P($P($$DEFAULT^KLVERZW(, , ORDNr),"`"),";") + If (VerzW["AF")&&$$CheckAutoSend(ORDNr) ; AFH en AFC + { + Do ##class(vhLib.Logger).%New().Info("Klaarzetten voor picking", "Afhaling order '" _ ORDNr _ "' wordt doorgestuurd, werd getriggerd door interface AXOrder2Admin" ) + Do SendWMS(ORDNr) + } + Quit ; WMS verwerking en eventueel doorsturen naar Egemin software indien voor vandaag SendWMS(ORDNr) New %J,I,R,PRNr,Aantal,OLUNr,LeverDag,VerzDat,DOutDate,DOutTime,VerzW,VerzZ,LevAdr,ChkBeletDone,ORDNrs,CumulORDNr,WaitORDNrs New LandCode,PostCode - New PickingDag, KlantNummer, Filters, FilterIterator, IsVoorVandaag, ConsolidatieNummer + New PickingDag, KlantNummer, FilterIterator, IsVoorVandaag, ConsolidatieNummer New OrderApi, OrderLijn, OrderLijnIterator New PickingOpdrachtInfo, PickingOpdrachtInfoIterator, PickingOpdrachtInfoLijst + New IsKlantOnderRembours, OrderPickingOpdrachtInfoLijst, OrderLijnCount, PickingVoorVandaagOrderLijnCount, IsOrderVolledigPickingVoorVandaag #dim PickingDag As BL.Legacy.EWORDS6.enu.PickingDag = ##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(ORDNr) Do ##class(BL.Legacy.EWORDS6.InfoMelder).%New().Controleer(ORDNr) If ($$$Not(PickingDag = ##class(BL.Legacy.EWORDS6.enu.PickingDag).Andere())) { #dim KlantNummer As %String = ##class(BL.Legacy.EWORDS6).GeefKlantNummer(ORDNr, D) + #dim IsKlantOnderRembours As %Boolean = ##class(BL.Legacy.EWORDS6).IsKlantOnderRembours(KlantNummer) Set ORDNrs = $$Cumul(ORDNr) Set WaitORDNrs = $$WachtendeOrders(KlantNummer) @@ -42,30 +53,40 @@ #dim OrderApi As DOM.VKP.impl.DataM.DataMOrderAPI = ##class(DOM.VKP.impl.DataM.DataMOrderAPI).%New() #dim PickingOpdrachtInfoLijst As %ListOfDataTypes = ##class(%ListOfDataTypes).%New() + #dim OrderPickingOpdrachtInfoLijst As %ListOfDataTypes = ##class(%ListOfDataTypes).%New() + #dim OrderLijnCount, PickingVoorVandaagOrderLijnCount As %Integer + #dim IsOrderVolledigPickingVoorVandaag As %Boolean For I=1:1:$Length(ORDNrs,";") { Set CumulORDNr = $Piece(ORDNrs,";",I) Quit:$$$Not(CumulORDNr) #dim OrderLijnIterator As TECH.Iterator = OrderApi.GeefOrder(CumulORDNr).GeefOrderLijnIterator() + Set IsOrderVolledigPickingVoorVandaag = $$$False + Set OrderLijnCount = 0 + Set PickingVoorVandaagOrderLijnCount = 0 While (OrderLijnIterator.HasNext()) { #dim OrderLijn As DOM.VKP.ProductOrderlijn = OrderLijnIterator.Next() If (OrderLijn.%IsA("DOM.VKP.impl.DataM.DataMProductOrderlijn") && $$$Not(OrderLijn.GeefProductID() = "")) { + Set OrderLijnCount = OrderLijnCount + 1 If ##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(OrderLijn.GeefOrderID(),OrderLijn.GeefLijnVolgNr()) { - Do PickingOpdrachtInfoLijst.Insert(##class(BL.Legacy.EWORDS.PickingOpdrachtInfo).%New(OrderLijn.GeefAantal(), OrderLijn.GeefLeverdag(), OrderLijn.GeefOrderID(), OrderLijn.GeefID())) + Set PickingVoorVandaagOrderLijnCount = PickingVoorVandaagOrderLijnCount + 1 + Do OrderPickingOpdrachtInfoLijst.Insert(##class(BL.Legacy.EWORDS.PickingOpdrachtInfo).%New(OrderLijn.GeefAantal(), OrderLijn.GeefLeverdag(), OrderLijn.GeefOrderID(), OrderLijn.GeefID())) } } } + + Set IsOrderVolledigPickingVoorVandaag = (OrderLijnCount = PickingVoorVandaagOrderLijnCount) + + If ($$$Not(IsKlantOnderRembours && $$$Not(IsOrderVolledigPickingVoorVandaag))) { + Set PickingOpdrachtInfoLijst = ##class(TECH.ListUtils).Complement(OrderPickingOpdrachtInfoLijst, PickingOpdrachtInfoLijst) } + } - #dim Filters As %ListOfDataTypes = ##class(%ListOfDataTypes).%New() - Do Filters.Insert(##class(BL.Legacy.EWORDS.PickingOpdrachtInfoIterator.Filter.OrgaluxFilter).%New()) - Do Filters.Insert(##class(BL.Legacy.EWORDS.PickingOpdrachtInfoIterator.Filter.NietOrgaluxFilter).%New()) - #dim IsVoorVandaag As %Boolean = (PickingDag = ##class(BL.Legacy.EWORDS6.enu.PickingDag).Vandaag()) - #dim FilterIterator As TECH.Iterator = ##class(TECH.ListIterator).%New(Filters) + #dim FilterIterator As TECH.Iterator = ##class(TECH.ListIterator).%New(##class(BL.Legacy.EWORDS.Save).GeefFilters()) Set %J = $$%J^vhRtn1() Kill ^HULP(%J) @@ -77,8 +98,10 @@ If (PickingOpdrachtInfoIterator.HasNext()) { While (PickingOpdrachtInfoIterator.HasNext()) { #dim PickingOpdrachtInfo As BL.Legacy.EWORDS.PickingOpdrachtInfo = PickingOpdrachtInfoIterator.Next() - - Set ^HULP(%J, KlantNummer, "M", "A", PickingOpdrachtInfo.GeefOrderNummer(), PickingOpdrachtInfo.GeefOrderLijnNummer()) = PickingOpdrachtInfo.GeefData() + If '$D(^ORDW("IO",PickingOpdrachtInfo.GeefOrderNummer(), PickingOpdrachtInfo.GeefOrderLijnNummer())) + { + Set ^HULP(%J, KlantNummer, "M", "A", PickingOpdrachtInfo.GeefOrderNummer(), PickingOpdrachtInfo.GeefOrderLijnNummer()) = PickingOpdrachtInfo.GeefData() + } } Do INITDOMVKP^FLOWORD2(KlantNummer, ORDNr) @@ -87,13 +110,17 @@ Set VerzZone = "" Set DOutDateTime = $Select(IsVoorVandaag:+$Horolog,1:+$$CALCDATE^vhLib.DataTypes($Horolog,"A",1)) _ "," _ blVerzendWijze.DueOutPickingTime() Set VerzDat = blLeveringsTermijn.GetVroegsteLeverDag(+DOutDateTime) + If (##class(DOM.DomeinContext).Instance().GeefProjectSettingsAPI().DD1StockerenBijVRDIndienVroegerGeproduceerd()){ + Set:(VerzW="DD1") VerzDat=##class(TECH.DateTime).BerekenWerkdag($$GetPickDatum^EWORDS6(ORDNr),1) ;Leverdatum met behoud Pickdatum + } Set DOutDateTime = blLeveringsTermijn.GetLaatstePickingsTijdstip(VerzDat) Set LevAdr = ^KOD(KlantNummer, "F", ORDNr, 3) Do BLDCONS^EWORDS2(KlantNummer, $Name(^HULP(%J, KlantNummer, "M")), ConsolidatieNummer, $Piece(VerzW, ";"), VerzDat, DOutDateTime, VerzZone, LevAdr, .ChkBeletDone) ; Creatie suborderlijnen - Do ##class(vhLib.Logger).%New().Info("Klaarzetten voor picking", "Bon '" _ ConsolidatieNummer _ "' is automatisch aangemaakt.") - + Do ##class(vhLib.Logger).%New().Info("Klaarzetten voor picking", "Bon '" _ ConsolidatieNummer _ "' is automatisch aangemaakt, WMSActief:"_$$WMSIsActief()_", IsVoorVandaag:"_IsVoorVandaag ) + Set ^BONLog(ConsolidatieNummer,+$H)=$LB("A",IsVoorVandaag,$zdt($H,8)) + If ($$WMSIsActief() && IsVoorVandaag) { Do SEND^EWORDSW(ConsolidatieNummer) } @@ -119,7 +146,7 @@ AutoSendIsActief() New AutoSendIsActief Set AutoSendIsActief=+$G(^ORDW("AUTO")) - Set AutoSendIsActief=$S($P($H,",",2)<25200:0,$P($H,",",2)>68400:0,1:AutoSendIsActief) ; Enkel tussen 07:00 en 19:00 + Set AutoSendIsActief=$S($P($H,",",2)<19800:0,$P($H,",",2)>68400:0,1:AutoSendIsActief) ; Enkel tussen 05:30 en 19:00 - aangepast PV - 31/5/2023 Quit AutoSendIsActief ; Controle of het order (en alle eventueel gelinkte orders) voor dezelfde leverdag zijn. @@ -157,7 +184,7 @@ ; Geeft de DUEOUT picking. Als die gisteren of ouder is, wordt de eerste zinvolle teruggegeven. GetPickDatum(ORDNr,GevraagdOLNr) - New R,KLNr,blVerzendWijze,blLeveringsTermijn,LeverDag + New R,KLNr,blVerzendWijze,blLeveringsTermijn,LeverDag,PickDatum Set PickDatum="" Set LeverDag=$LG($$GetLeverDagen(ORDNr,$G(GevraagdOLNr))) // = De vroegste leverdag van alle lijnen van het order en zijn gekoppelde orders. if $length(LeverDag) { @@ -193,56 +220,60 @@ ; Deze routine verwerkt alle orders verzameld in de wachtrij door 'FetchAutoSend' ; Opgestartom de 15 minuten -AutoSend +AutoSend ; Orders die in de wachtrij staan klaarzetten voor picking New Set Q="K",D="\",U=";",QU(1)=0 If $$AutoSendIsActief() { - Lock +^ORDW("AUTO"):30 - Quit:'$T - ; Sorteren volgens tijstip en klant - Set ORDNr="" - For { - Set ORDNr=$O(^ORDW("AUTO",ORDNr)) - Quit:ORDNr="" - Set KLNr=$P($G(^KO1(ORDNr,"F")),"\") - If 'KLNr Kill ^ORDW("AUTO",ORDNr) Continue - Set KlKey=^KK1(KLNr) - If '$D(^KOD(KLNr,"F",ORDNr)) Kill ^ORDW("AUTO",ORDNr) Continue - Continue:'##class(BL.Legacy.EWORDS6).CheckAutoSend(ORDNr) - Continue:'$D(^ORDW("AUTO",ORDNr)) ; Het order is ondertussen reeds doorgestuurd - Set Aangemaakt=^ORDW("AUTO",ORDNr),AanmaakDatum=$P(Aangemaakt,","),AanmaakTijdstip=$P(Aangemaakt,",",2) - Set:$$DIFFTIME^vhLib.DataTypes(Aangemaakt,$H)>0 ORDNrs(AanmaakDatum,AanmaakTijdstip,KlKey,ORDNr)="" - } - Set AanmaakDatum="" - For { - Set AanmaakDatum=$O(ORDNrs(AanmaakDatum)) - Quit:AanmaakDatum="" - Set AanmaakTijdstip="" - For { - Set AanmaakTijdstip=$O(ORDNrs(AanmaakDatum,AanmaakTijdstip)) - Quit:AanmaakTijdstip="" - Set KlKey="" - For { - Set KlKey=$O(ORDNrs(AanmaakDatum,AanmaakTijdstip,KlKey)) - Quit:KlKey="" - Set ORDNr="" - For { - Set ORDNr=$O(ORDNrs(AanmaakDatum,AanmaakTijdstip,KlKey,ORDNr)) - Quit:ORDNr="" - Continue:'$D(^ORDW("AUTO",ORDNr)) ; Het order is samen met andere orders gecumuleerd verwerkt - Do SendWMS(ORDNr) - } - } - } - } + Lock +^ORDW("AUTO"):30 + Quit:'$T + ; Sorteren volgens tijstip en klant + Set ORDNr="" + For { + Set ORDNr=$O(^ORDW("AUTO",ORDNr)) + Quit:ORDNr="" + Set KLNr=$P($G(^KO1(ORDNr,"F")),"\") + If 'KLNr Kill ^ORDW("AUTO",ORDNr) Continue + Set KlKey=^KK1(KLNr) + If '$D(^KOD(KLNr,"F",ORDNr)) Kill ^ORDW("AUTO",ORDNr) + If '##class(BL.Legacy.EWORDS6).CheckAutoSend(ORDNr) Kill ^ORDW("AUTO",ORDNr) + Continue:'$D(^ORDW("AUTO",ORDNr)) ; Het order is ondertussen reeds doorgestuurd + Set Aangemaakt=^ORDW("AUTO",ORDNr),AanmaakDatum=$P(Aangemaakt,","),AanmaakTijdstip=$P(Aangemaakt,",",2) + Set:$$DIFFTIME^vhLib.DataTypes(Aangemaakt,$H)>0 ORDNrs(AanmaakDatum,AanmaakTijdstip,KlKey,ORDNr)="" + } + Set AanmaakDatum="" + For { + Set AanmaakDatum=$O(ORDNrs(AanmaakDatum)) + Quit:AanmaakDatum="" + Set AanmaakTijdstip="" + For { + Set AanmaakTijdstip=$O(ORDNrs(AanmaakDatum,AanmaakTijdstip)) + Quit:AanmaakTijdstip="" + Set KlKey="" + For { + Set KlKey=$O(ORDNrs(AanmaakDatum,AanmaakTijdstip,KlKey)) + Quit:KlKey="" + Set ORDNr="" + For { + Set ORDNr=$O(ORDNrs(AanmaakDatum,AanmaakTijdstip,KlKey,ORDNr)) + Quit:ORDNr="" + Continue:'$D(^ORDW("AUTO",ORDNr)) ; Het order is samen met andere orders gecumuleerd verwerkt + If ( ##class(BL.Legacy.EWORDS6).CheckAutoSend(ORDNr)) { ; Een vorig order kan met de stock gaan lopen zijn. + Do SendWMS(ORDNr) + } Else { + K ^ORDW("AUTO",ORDNr) + } + } + } + } + } } Quit ; ********************************** // Deze niet meer rechtstreeks aanroepen, maar wel via de classmethod ##class(BL.Legacy.EWORDS6).CheckAutoSend(...) -CheckAutoSend(ORDNr) +CheckAutoSend(ORDNr) New Check,fc Set Check=$$SendWMSStatus(ORDNr)="A" ; Status i.v.m. het doorsturen is automatisch ;w:$G(io)=1015 0,Check," " @@ -251,6 +282,7 @@ Set:Check Check=##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(ORDNr) ;w:$G(io)=1015 1,Check," " Set:Check Check=$$OrderGesloten(ORDNr) + Set:Check Check=$$OrderNotNOSEND(ORDNr) ;w:$G(io)=1015 2,Check," " Set:Check Check='$$IsContractOfAfroep(ORDNr) ;w:$G(io)=1015 3,Check," " @@ -284,20 +316,25 @@ SendWMSStatus(ORDNr) New R,KLNr,SendWMSStatus Set R=^KO1(ORDNr,"F"),KLNr=$P(R,"\",1) - Set SendWMSStatus=$P(^KOD(KLNr,"F",ORDNr,1),"\",26) - If SendWMSStatus'="W" { - Set:SendWMSStatus="" SendWMSStatus=$E($P(^KKL(^KK1(KLNr),2),"\",8)) - Set:SendWMSStatus'="M" SendWMSStatus="A" - } + Set SendWMSStatus=$E($P(^KKL(^KK1(KLNr),2),"\",8)) + Set:SendWMSStatus'="M" SendWMSStatus="A" Quit SendWMSStatus - + +VerzendwDD1(ORDNr) + New R,KLNr + Set R=^KO1(ORDNr,"F"),KLNr=$P(R,"\",1) + Quit $$DEFAULT^KLVERZW(,KLNr,ORDNr)="DD1" + ; Do orders moeten gesloten zijn OrderGesloten(ORDNr) New R,KLNr,ORDNrs,OrderGesloten Set R=^KO1(ORDNr,"F"),KLNr=$P(R,"\",1) Set OrderGesloten=$P(^KOD(KLNr,"F",ORDNr,1),"\",22) Quit OrderGesloten +OrderNotNOSEND(ORDNr) + Quit '($D(^ORDW("NOSEND",ORDNr))&&($$DIFFTIME^vhLib.DataTypes(^ORDW("NOSEND",ORDNr),$H)<1800)) ;Orders die door het terugtrekken uit ORDW op NOSEND gekomen zijn moeten 30min. wachten + ; Contract- en afroeporders niet toegestaan IsContractOfAfroep(ORDNr) New R,KLNr,ORDNrs,IsContractOfAfroep,OrderType @@ -494,7 +531,7 @@ ; De orders voor vandaag of morgen opzoeken in ^KOD en in de wachtrij plaatsen voor 'AutoSend' ; Elke minuut opgestart -FetchAutoSend +FetchAutoSend ;Orders die klaargezet kunnen worden in een wachtrij plaatsen New Set Q="K",D="\",U=";",Horolog=$H If $$AutoSendIsActief() { @@ -568,6 +605,10 @@ Set:'Check Warning="Terugname." } If Check { + Set Check='$$VerzendwDD1(ORDNr) + Set:'Check Warning="Verzendwijze DD1" + } + If Check { Set Check=$$CheckStock(ORDNr) Set:'Check Warning="Onvoldoende voorraad.",Manueel=1 } @@ -619,7 +660,9 @@ ; Cumuleren van orders voor eenzelfde klant Cumul(ORDNr) - New R,KLNr,ORDNrs,CumulORDNr + New R,KLNr,ORDNrs,CumulORDNr,PickingDag + #dim PickingDag As BL.Legacy.EWORDS6.enu.PickingDag = ##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(ORDNr) + Set ORDNrs=ORDNr,R=^KO1(ORDNr,"F"),KLNr=$P(R,D),CumulORDNr="" #dim LegacyPartijAPI As DOM.PARTIJ.LegacyPartijAPI = ##class(DOM.DomeinContext).Instance().GeefLegacyPartijAPI() #dim Klant As DOM.VKP.Klant = ##class(DOM.DomeinContext).Instance().GeefVerkoopAPI().GeefKlant(LegacyPartijAPI.GeefKlantPartijID(KLNr)) @@ -630,6 +673,7 @@ Quit:CumulORDNr="" Set R=^KO1(CumulORDNr,"F") Continue:$P(R,D)'=KLNr + Continue:PickingDag'=##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(CumulORDNr) If ORDNrs'[CumulORDNr,$$CheckCumul(ORDNr,CumulORDNr) Set ORDNrs=ORDNrs_";"_CumulORDNr } }