#include BL.Derde.LevSpecifiek #include vhLib.Macro EWORDS6 ;E'WMS Automatisch markeren voor orderpicking [ 10/28/2003 10:26 AM ] /* ============================================================================================================================ BELANGRIJK : ============ De controles om te mogen groeperen ("Cumuleer Order" of kortere naam ... ) moeten in 2 routines in sync gehouden worden !!! - EWORDS3 : manueel markeren (via Admin-scherm, UI met vhTXTPOP-meldingen) - EWORDS6 : automatisch markeren (via background job, cfr. IsVoorVandaagOfMorgen) ============================================================================================================================ */ ; 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, 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) For I=$Length(WaitORDNrs,";"):-1:1 { Set CumulORDNr = $Piece(WaitORDNrs,";",I) If ORDNrs [ CumulORDNr Else If $$CheckCumul(ORDNr,CumulORDNr) Set ORDNrs = ORDNrs _ ";" _ CumulORDNr Else Continue Set $Piece(WaitORDNrs,";",I) = $Piece(WaitORDNrs,";",I+1,99) } Quit:$$$Not($$Lock(ORDNrs)) #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()) { 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 IsVoorVandaag As %Boolean = (PickingDag = ##class(BL.Legacy.EWORDS6.enu.PickingDag).Vandaag()) #dim FilterIterator As TECH.Iterator = ##class(TECH.ListIterator).%New(##class(BL.Legacy.EWORDS.Save).GeefFilters()) Set %J = $$%J^vhRtn1() Kill ^HULP(%J) While (FilterIterator.HasNext()) { #dim ConsolidatieNummer As %String = $$GETNUM^FLOW("KUL", "KU1") #dim PickingOpdrachtInfoIterator As TECH.Iterator = ##class(BL.Legacy.EWORDS.PickingOpdrachtInfoIterator).%New(PickingOpdrachtInfoLijst, FilterIterator.Next()) 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() } Do INITDOMVKP^FLOWORD2(KlantNummer, ORDNr) Set VerzW = $$DEFAULT^KLVERZW(, KlantNummer, ORDNr) Set VerzZone = "" Set DOutDateTime = $Select(IsVoorVandaag:+$Horolog,1:+$$CALCDATE^vhLib.DataTypes($Horolog,"A",1)) _ "," _ blVerzendWijze.DueOutPickingTime() Set VerzDat = blLeveringsTermijn.GetVroegsteLeverDag(+DOutDateTime) 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, WMSActief:"_$$WMSIsActief()_", IsVoorVandaag:"_IsVoorVandaag ) If ($$WMSIsActief() && IsVoorVandaag) { Do SEND^EWORDSW(ConsolidatieNummer) } } Kill ^HULP(%J, KlantNummer) } Kill ^HULP(%J) For I=1:1:$L(ORDNrs,";") Set CumulORDNr=$P(ORDNrs,";",I) Kill ^ORDW("AUTO",CumulORDNr) Do UnLock(ORDNrs) } Quit ; WMS is actief? WMSIsActief() New WMSIsActief Set WMSIsActief=+$G(^EWREC("P","NOSEND")) Quit 'WMSIsActief ; AutoSend is actief? 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 Quit AutoSendIsActief ; Controle of het order (en alle eventueel gelinkte orders) voor dezelfde leverdag zijn. CheckLeverDag(ORDNr) New LeverDagOk,LeverDagen Set LeverDagen=$$GetLeverDagen(ORDNr),LeverDagOk=0 If $L(LeverDagen),$LL(LeverDagen)=1 Set LeverDagOk=1 ; Er zijn leverdagen en er is er maar een Quit LeverDagOk ; Bepaal de leverdagen van een groep gelinkte orders ; Optioneel kan je de opvraging beperken tot die voor één specifieke orderlijn. Zoniet wordt voor het volledige order incl zijn gekoppelde orders. GetLeverDagen(GevraagdORDNr,GevraagdOLNr) New I,R,KLNr,ORDNrs,lbLeverDagen,LeverDagen,LeverDag Set R=^KO1(GevraagdORDNr,"F"),KLNr=$P(R,"\") ; Klant ophalen. Set ORDNrs=$$GetOrderLink(GevraagdORDNr) ; Ophalen gelinkte orders. New ORDNr For I=1:1:$L(ORDNrs,";") Set ORDNr=$P(ORDNrs,";",I) Set:ORDNr ORDNrs(ORDNr)="" ; delimited list naar multidimensional. ; Alle leverdagen verzamelen. Set ORDNr="" For { Set ORDNr=$O(ORDNrs(ORDNr)) Quit:ORDNr="" Quit:($G(GevraagdOLNr)'="")&&(GevraagdORDNr'=ORDNr) Set lbLeverDagen=$$GetLeverDagen^FLOWORD5(KLNr,ORDNr,$G(GevraagdOLNr)) For I=1:1:$LL(lbLeverDagen) Set LeverDag=$LI(lbLeverDagen,I),LeverDagen(LeverDag)="" } ; Multidimensional naar Listbuild. Set (lbLeverDagen,LeverDag)="" For Set LeverDag=$O(LeverDagen(LeverDag)) Quit:LeverDag="" Set lbLeverDagen=lbLeverDagen_$LB(LeverDag) Quit lbLeverDagen ; Geeft de DUEOUT picking. Als die gisteren of ouder is, wordt de eerste zinvolle teruggegeven. GetPickDatum(ORDNr,GevraagdOLNr) New R,KLNr,blVerzendWijze,blLeveringsTermijn,LeverDag 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) { Set R=^KO1(ORDNr,"F"),KLNr=$P(R,"\",1) Do INITDOMVKP^FLOWORD2(KLNr,ORDNr) Set PickDatum=blLeveringsTermijn.GetLaatstePickingsTijdstip(LeverDag) // = Dueout picking (voor de VZW) op de dag van picking. // Indien picking vóór vandaag had moeten gebeuren, dan wordt de pickdatum voor de eerstvolgende nog mogelijke leverdatum bepaald. // De gebruikers van deze method lijken niet (allemaal) te rekenen op het eventueel zoeken van een nieuwe haalbare pickdatum!!! // // Nog een vreemd aspect: hier wordt geen rekening gehouden met het kanteltijd doorsturen. // Noch met de pickingdueout; al klopt dat misschien wel, want dat geeft enkel een volgorde, geen absolute tijd van de dag. if (PickDatum < ##class(TECH.Context).Instance().GeefDateTimeAPI().CurrentDate()) { Set LeverDag = blLeveringsTermijn.GetVroegsteLeverDag(##class(TECH.Context).Instance().GeefDateTimeAPI().CurrentDate()) set PickDatum = blLeveringsTermijn.GetLaatstePickingsTijdstip(LeverDag) } } Quit PickDatum // DEPRECATED (16/04/2013) // Rechtstreeks aanroepen via BL.Legacy !!! IsVoorVandaagOfMorgen(ORDNr) new result set result = ##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(ORDNr) quit result GeefKantelPuntDoorsturenPicking(ORDNr) new blLeveringsTermijn,blVerzendWijze Do INITDOMVKP^FLOWORD2(,ORDNr) quit blVerzendWijze.GeefKantelPuntDoorsturenPicking() ; Deze routine verwerkt alle orders verzameld in de wachtrij door 'FetchAutoSend' ; Opgestartom de 15 minuten AutoSend 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) } } } } } Quit ; ********************************** // Deze niet meer rechtstreeks aanroepen, maar wel via de classmethod ##class(BL.Legacy.EWORDS6).CheckAutoSend(...) CheckAutoSend(ORDNr) New Check,fc Set Check=$$SendWMSStatus(ORDNr)="A" ; Status i.v.m. het doorsturen is automatisch ;w:$G(io)=1015 0,Check," " /// Niet automatisch doorsturen indien we - om de leverdatum te halen - al te laat zijn of pas later dan morgen moeten doorsturen. Set:Check Check=##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(ORDNr) ;w:$G(io)=1015 1,Check," " Set:Check Check=$$OrderGesloten(ORDNr) ;w:$G(io)=1015 2,Check," " Set:Check Check='$$IsContractOfAfroep(ORDNr) ;w:$G(io)=1015 3,Check," " Set:Check Check='$$IsTerugname(ORDNr) ;w:$G(io)=1015 4,Check," " Set:Check Check='$$InWMS(ORDNr) ;w:$G(io)=1015 5,Check," " Set:Check Check=$$CheckStock(ORDNr) ;w:$G(io)=1015 6,Check," " Set:Check Check=$$MagazijnBeschikbaar(ORDNr) ;w:$G(io)=1015 7,Check," " Set:Check Check=##class(APPS.OrderUitvoering.DoorsturenOrderPickingService).%New().OrderKanWordenDoorgestuurd(ORDNr) ;w:$G(io)=1015 8,Check," " Set:Check Check=##class(BL.Legacy.EWTOE).OrderStaatVolledigBijVanHoecke(ORDNr) ;w:$G(io)=1015 9,Check," " If Check { ; Indien de magazijnen beschikbaar zijn, de forecast herberekenen en de beschikbaarheid terug controleren Set fc=$$FETCHSOM^EWSTAT() Do CheckTijdsraming^EWORDSM() Set Check=$$MagazijnBeschikbaar(ORDNr) } ;w:$G(io)=1015 10,Check," " If Check { Do:'$$CheckKredietwaardig(ORDNr) MarkeerKredietProbleemInORDNr^EWORDS3(ORDNr,"A") Set Check=$$CheckBoekhouding(ORDNr) } ;w:$G(io)=1015 11,Check," " Quit Check ; Geef de status van een order i.v.m. het doorsturen 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" } Quit SendWMSStatus ; 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 ; Contract- en afroeporders niet toegestaan IsContractOfAfroep(ORDNr) New R,KLNr,ORDNrs,IsContractOfAfroep,OrderType Set ORDNrs=$$GetOrderLink(ORDNr) ; Alle glinkte orders Set KLNr=$P(^KO1(ORDNr,"F"),"\",1) For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set R=^KOD(KLNr,"F",ORDNr,1),OrderType=$P(R,"\",25) Set IsContractOfAfroep=OrderType="C" ; Contract Set:'IsContractOfAfroep IsContractOfAfroep=OrderType="A" ; Afroep Quit:IsContractOfAfroep } Quit:##class(TECH.Config.ConfigMgr).Instance().GeefBoolean("BevestigdAXOrderSluitenActief") 0 ; hack PV Quit IsContractOfAfroep ; Terugnames niet toegestaan IsTerugname(ORDNr) New ORDNrs,IsTerugname Set ORDNrs=$$GetOrderLink(ORDNr) ; Alle glinkte orders For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set IsTerugname=$$ISTERUGN^FLOWORD5(ORDNr) Quit:IsTerugname } Quit IsTerugname ; De orders mogen nog niet in het WMS zitten InWMS(ORDNr) New ORDNrs,InWMS Set ORDNrs=$$GetOrderLink(ORDNr) ; Alle glinkte orders For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set InWMS=$D(^ORDW("IO",ORDNr)) Quit:InWMS } Quit InWMS ; Boekhoudkundige controle? CheckBoekhouding(ORDNr) Quit:##class(TECH.Config.ConfigMgr).Instance().GeefBoolean("BevestigdAXOrderSluitenActief") 1 ; hack PV New CheckIsOK Set CheckIsOK=$$CheckRembours(ORDNr) Set:CheckIsOK CheckIsOK=$$CheckVooruitBetaling(ORDNr) Set:CheckIsOK CheckIsOK=$$CheckDubieus(ORDNr) Set:CheckIsOK CheckIsOK=$$CheckKredietwaardig(ORDNr) Quit CheckIsOK ; Controle rembours CheckRembours(ORDNr) New R,KLNr,PickingMagStarten,Rembours,SendWMS Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set R=^KKL(^KK1(KLNr),3),Rembours=$P(R,D) Set PickingMagStarten = ('Rembours) Quit:##class(TECH.Config.ConfigMgr).Instance().GeefBoolean("BevestigdAXOrderSluitenActief") 1 ; hack PV Quit PickingMagStarten ; Controle vooruitbetaling CheckVooruitBetaling(ORDNr) New R,KLNr,CheckIsOK,VooruitBetaling,SendWMS Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set CheckIsOK=$$IsKlantVrijgesteldVanVrijgaveDoorBKH(KLNr) Set:'CheckIsOK CheckIsOK=$$CheckVolledigHalux(KLNr,ORDNr) Set:'CheckIsOK R=^KKL(^KK1(KLNr),3),VooruitBetaling=$P(R,D,2),CheckIsOK='VooruitBetaling Quit:##class(TECH.Config.ConfigMgr).Instance().GeefBoolean("BevestigdAXOrderSluitenActief") 1 ; hack PV Quit CheckIsOK ; Controle dubieus CheckDubieus(ORDNr) New R,KLNr,CheckIsOK,Dubieus,SendWMS Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set R=^KKL(^KK1(KLNr),3),Dubieus=$P(R,D,8),CheckIsOK='Dubieus Quit:##class(TECH.Config.ConfigMgr).Instance().GeefBoolean("BevestigdAXOrderSluitenActief") 1 ; hack PV Quit CheckIsOK ; Controle kredietwaardig? CheckKredietwaardig(ORDNr) New R,KLNr,CheckIsOK,SendWMS Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set CheckIsOK=$$IsKlantVrijgesteldVanVrijgaveDoorBKH(KLNr) Set:'CheckIsOK CheckIsOK=$$CheckVolledigHalux(KLNr,ORDNr) Set:'CheckIsOK CheckIsOK=+$$WAARDIG^KREDIET(KLNr) Quit:##class(TECH.Config.ConfigMgr).Instance().GeefBoolean("BevestigdAXOrderSluitenActief") 1 ; hack PV Quit CheckIsOK ; De voorraad van alle gelinkte orders voldoende? CheckStock(ORDNr) New ORDNrs,InStock Set ORDNrs=$$GetOrderLink(ORDNr) ; Alle glinkte orders For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set InStock=$$CheckStockOneOrder(ORDNr) Quit:'InStock } Quit $G(InStock,1) IsKlantVrijgesteldVanVrijgaveDoorBKH(KLNr) New VrijgaveAutomatisch Set VrijgaveAutomatisch=$P(^KKL(^KK1(KLNr),2),D,8) Quit $E(VrijgaveAutomatisch,$L(VrijgaveAutomatisch)) CheckVolledigHalux(KLNr,ORDNr) New OLNr,R,TOELNr,LevNr,PRNr,NietVolledigHalux Set NietVolledigHalux=0 Set OLNr=100 For { Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Set R=^KOD(KLNr,"F",ORDNr,OLNr),PRNr=$P(R,D,2) Continue:'PRNr Set LevNr=$E($O(^KPR(PRNr,"J")),2,9) Set TOELNr=$P(R,D,28) ;bevat de lijnnr van de toelevering of KOM If (TOELNr="")||(LevNr'=$$$LevHalux) Set NietVolledigHalux=1 Quit:NietVolledigHalux } Quit 'NietVolledigHalux ; Controle voorraad van een order CheckStockOneOrder(ORDNr) New R,KLNr,OLNr,PRNr,Aantal,InStock,StockUpd,TOENr Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D),OLNr=100 For { Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Set R=^KOD(KLNr,"F",ORDNr,OLNr),PRNr=$P(R,D,2),Aantal=$P(R,D,3),TOENr=$P(R,D,27) Continue:'PRNr Set TOENr=$P(R,D,27) If TOENr Set InStock=0 Quit ; Kom-link Set StockUpd=$P(R,D,14)'["S" Set:StockUpd StockUpd=$P(R,D,14)'["Z" If StockUpd,'$$MAGHANDEL^PRODUKT2(PRNr) Set StockUpd=0 If 'StockUpd Set InStock=0 ; Zonder stockupdate niet automatisch Else Set InStock=$$CheckStockOneProduct(PRNr,Aantal) Quit:'InStock } Quit $G(InStock,1) ; Voorraadcontrole van een product CheckStockOneProduct(PRNr,Aantal) New R,InStock,PraStock,WVTekort,LevTerm,BufferW,WeekDat,WVStock,WVRes,GemWVK Set R=$O(^KPR(PRNr,"J")),WVTekort="" Set LevTerm=6,BufferW=$P(^KPR(PRNr,1),D,17) If $E(R)="J" { Set R=^KPR(PRNr,R),LevTerm=$P(R,D,7) Set WeekDat=(LevTerm+BufferW)*7+$H Set WVStock=$$CV2MAG^MRP(PRNr,$P($G(^PRSTOCK("D",PRNr)),D,5)) Set:WVStock<0 WVStock=0 Set WVRes=$$CV2MAG^MRP(PRNr,$P($$VerkoopKinderen^PRODUKT4(PRNr,WeekDat),"\",2)) Set WVTekort=$S(WVStockPraStock) ;If InStock { ; Product in voorraad, controle op gemiddelde weekverkoop ; Set R=^KPR(PRNr,1),GemWVK=$P(R,D,23) ; Set GemWVK=GemWVK+$P(GemWVK,"#",2) ; Set:GemWVK InStock=(PraStock>(GemWVK+Aantal)) ;} Quit $G(InStock,1) ; Zijn alle magazijnen beschikbaar voor alle gelinkte orders? MagazijnBeschikbaar(ORDNr,AutoSend) New ORDNrs,MagazijnBeschikbaar Set ORDNrs=$$GetOrderLink(ORDNr) ; Alle glinkte orders For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set MagazijnBeschikbaar=$$MagazijnBeschikbaar^EWORDSM(ORDNr,$G(AutoSend,1)) Quit:'MagazijnBeschikbaar } Quit $G(MagazijnBeschikbaar,1) ; ********************************** ; Ophalen gelinkte orders GetOrderLink(ORDNr) New ORDNrs Set ORDNrs=$$GetOrderLink^KFO(ORDNr) Set ORDNrs(ORDNr)="" For I=1:1:$L(ORDNrs,";") Set ORDNr=$P(ORDNrs,";",I) Set:ORDNr ORDNrs(ORDNr)="" Set (ORDNrs,ORDNr)="" For { Set ORDNr=$O(ORDNrs(ORDNr)) Quit:ORDNr="" Set ORDNrs=ORDNrs_";"_ORDNr } Set $E(ORDNrs)="" Quit ORDNrs ; De orders voor vandaag of morgen opzoeken in ^KOD en in de wachtrij plaatsen voor 'AutoSend' ; Elke minuut opgestart FetchAutoSend New Set Q="K",D="\",U=";",Horolog=$H If $$AutoSendIsActief() { Lock +^ORDW("AUTO"):30 Quit:'$T Set KLNr=0 For { Set KLNr=$O(^KOD(KLNr)) Quit:KLNr="" Set ORDNr="" For { Set ORDNr=$O(^KOD(KLNr,"F",ORDNr)) Quit:ORDNr="" Continue:$D(^ORDW("AUTO",ORDNr)) Set ORDNrs=$$GetOrderLink(ORDNr) Continue:'##class(BL.Legacy.EWORDS6).CheckAutoSend(ORDNr) Continue:'$$Lock(ORDNrs) Do PutAutoSend(ORDNr,Horolog) Do UnLock(ORDNrs) } } } Quit ; Invullen voor automatisch zenden PutAutoSend(ORDNr,Horolog) New I,ORDNrs Set ORDNrs=$$GetOrderLink(ORDNr),Horolog=$G(Horolog,$H) ; Alle glinkte orders For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) If ORDNr,'$D(^ORDW("AUTO",ORDNr)) Set ^ORDW("AUTO",ORDNr)=Horolog } Quit ; Verwijderen voor automatisch zenden DelAutoSend(ORDNr) New I,ORDNrs Set ORDNrs=$$GetOrderLink(ORDNr) ; Alle glinkte orders For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) If ORDNr Kill ^ORDW("AUTO",ORDNr) } Quit ; Invullen voor automatisch zenden bij het verlaten van een order (FLOWORD) PutViaFLOWORD(ORDNr) New KLNr,Horolog,IsVoorVandaag,Check,Warning,Manueel,TxtLoc,ButLoc,SendWMSStatus,fc,MarkeerKredietProbleemInORDNr Set Horolog=$G(^ORDW("AUTO",ORDNr)) Do DelAutoSend(ORDNr) If $$AutoSendIsActief() { Set KLNr=$P($G(^KO1(ORDNr,"F")),D) Quit:'KLNr Quit:'$D(^KOD(KLNr,"F",ORDNr)) ; Order bestaat niet meer, bon reeds opgemaakt Quit:'$$OrderGesloten(ORDNr) ; Order niet gesloten Quit:$$InWMS(ORDNr) ; Order reeds in het WMS Set IsVoorVandaag=##class(BL.Legacy.EWORDS6).PickingVoorVandaagVolgendeArbeidsdagOfAndereDag(ORDNr)=1 If IsVoorVandaag { Set MarkeerKredietProbleemInORDNr=0 Set SendWMSStatus=$$SendWMSStatus(ORDNr) Set Check=SendWMSStatus="A" ; Status i.v.m. het doorsturen is automatisch If 'Check { Set Warning="Status is "_$S(SendWMSStatus="W":"wachtende",1:"manueel") Set Manueel=SendWMSStatus'="W" } If Check { Set Check='$$IsContractOfAfroep(ORDNr) Set:'Check Warning="Contract of afroep." } If Check { Set Check='$$IsTerugname(ORDNr) Set:'Check Warning="Terugname." } If Check { Set Check=$$CheckStock(ORDNr) Set:'Check Warning="Onvoldoende voorraad.",Manueel=1 } If Check { Set Check=$$MagazijnBeschikbaar(ORDNr) If Check { ; Indien de magazijnen beschikbaar zijn, de forcast herberekenen en de beschikbaarheid terug controleren Set fc=$$FETCHSOM^EWSTAT() Do CheckTijdsraming^EWORDSM() Set Check=$$MagazijnBeschikbaar(ORDNr) } Set:'Check Warning="Magazijn niet beschikbaar.",Manueel=$$MagazijnBeschikbaar(ORDNr,0) } If Check { Set Check=$$CheckRembours(ORDNr) Set:'Check Warning="Klant op rembours.",Manueel=1 } If Check { Set Check=$$CheckVooruitBetaling(ORDNr) Set:'Check Warning="Klant op vooruitbetaling.",Manueel=1 } If Check { Set Check=$$CheckDubieus(ORDNr) Set:'Check Warning="Klant dubieus.",Manueel=1 } If Check { Set Check=$$CheckKredietwaardig(ORDNr) Set:'Check Warning="Kredietlimiet overschreden.",(Manueel,MarkeerKredietProbleemInORDNr)=1 } If Check { Set:Horolog="" Horolog=$$CALCTIME^vhLib.DataTypes($h,15,"M") Do PutAutoSend(ORDNr,Horolog) } If 'Check { Set TxtLoc(1)="Order "_ORDNr_" is voor "_$$EXTDATE^vhLib.DataTypes()_" (vandaag)" Set TxtLoc(2)=Warning Set:$G(Manueel) TxtLoc(3)="EWMS markeren orderpicking manueel verwerken." Set ButLoc(1)=$S($G(Manueel):"Manueel&M",1:"Ok") Set:$G(Manueel) ButLoc(2)="Annuleer&A*" If $$WILD^vhTXTPOP("C;C","","TxtLoc","ButLoc",2)="M" { Do:MarkeerKredietProbleemInORDNr MarkeerKredietProbleemInORDNr^EWORDS3(ORDNr,"B") Do EWMS^FLOWORD("M") } } } } Quit ; ********************************** ; Cumuleren van orders voor eenzelfde klant Cumul(ORDNr) New R,KLNr,ORDNrs,CumulORDNr 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)) #dim KlantOrderInstellingen As DOM.VKP.KlantOrderInstellingen = Klant.GeefKlantOrderInstellingen() If (KlantOrderInstellingen.GeefPickingGroeperingManierTBXOrder() = ##class(DOM.VKP.enu.PickingGroeperingManier).SamenDoorgestuurdeSamenTePicken() && $$ISTBX^FLOWCHK("O",ORDNr)) || ('$$EenOPerB(ORDNr)) { For { Set CumulORDNr=$O(^ORDW("AUTO",CumulORDNr)) Quit:CumulORDNr="" Set R=^KO1(CumulORDNr,"F") Continue:$P(R,D)'=KLNr If ORDNrs'[CumulORDNr,$$CheckCumul(ORDNr,CumulORDNr) Set ORDNrs=ORDNrs_";"_CumulORDNr } } Quit ORDNrs CheckCumul(ORDNr,CumulORDNr) ; BELANGRIJK : zie opmerking bovenaan deze routine !!! New Cumul Set Cumul=$$AventosAppart(ORDNr,CumulORDNr) Set:Cumul Cumul=$$LevAdr(ORDNr,CumulORDNr) Set:Cumul Cumul=$$LevVoorw(ORDNr,CumulORDNr) Set:Cumul Cumul=$$FactAdr(ORDNr,CumulORDNr) Set:Cumul Cumul=$$Munt(ORDNr,CumulORDNr) Set:Cumul Cumul=$$NettoBruto(ORDNr,CumulORDNr) Set:Cumul Cumul=$$Export(ORDNr,CumulORDNr) Set:Cumul Cumul=$$OrderType(ORDNr,CumulORDNr) Set:Cumul Cumul=$$Orgalux(ORDNr,CumulORDNr) Set:Cumul Cumul=$$TaorIndeling(ORDNr,CumulORDNr) Set:Cumul Cumul=$$VerpakType(ORDNr,CumulORDNr) Set:Cumul Cumul=$$VerzendWijze(ORDNr,CumulORDNr) Set:Cumul Cumul=$$Transport(ORDNr,CumulORDNr) Set:Cumul Cumul=$$ConsumentCommissie(ORDNr,CumulORDNr) Set:Cumul Cumul=##class(BL.Legacy.EWORDS6).CheckCumulAutoVolgensPersonality(ORDNr,CumulORDNr) ; orders van noteborn en vanhoecke mogen niet opzelfde levering komen Quit Cumul ; Een order per bon per factuuur EenOPerB(ORDNr) New R,KLNr Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Quit $$EenOPerBVoorKlant(KLNr) EenOPerBVoorKlant(KLNr) Set R=^KKL(^KK1(KLNr),1),EenOPerB=$P($P(R,D,18),";") Set:EenOPerB=3 EenOPerB=0 ; Meerdere orders per bon, een bon per factuur Quit ''EenOPerB ; Een Aventosorder per bon AventosAppart(ORDNr,CumulORDNr) New CumulOk,AventosAppart Set CumulOk=1,AventosAppart=$G(^AventosAppart(KLNr)) ;$P(R,D,??) Do:AventosAppart . Set CumulOk=0 . If '$$BevatAventos^FLOW("O",ORDNr),'$$BevatAventos^FLOW("O",CumulORDNr) Set CumulOk=1 Quit CumulOk ; Leveringsadres gelijk? LevAdr(ORDNr,CumulORDNr) New R,KLNr,LevAdr,CumulLevAdr Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set LevAdr=$G(^KOD(KLNr,"F",ORDNr,3)) Set CumulLevAdr=$G(^KOD(KLNr,"F",CumulORDNr,3)) Quit $P(LevAdr,D,2,7)=$P(CumulLevAdr,D,2,7) ; Levringsvoorwaarde glijk? LevVoorw(ORDNr,CumulORDNr) New R,KLNr,LevVoorw,CumulLevVoorw Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set LevVoorw=$P(^KOD(KLNr,"F",ORDNr,1),D,21) Set CumulLevVoorw=$P(^KOD(KLNr,"F",CumulORDNr,1),D,21) Quit LevVoorw=CumulLevVoorw ; Facturatiesadres gelijk? FactAdr(ORDNr,CumulORDNr) New R,KLNr,FactAdr,CumulFactAdr Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set FactAdr=$P(^KOD(KLNr,"F",ORDNr,1),D,6) Set CumulFactAdr=$P(^KOD(KLNr,"F",CumulORDNr,1),D,6) Quit FactAdr=CumulFactAdr ; Facturatiemunt gelijk? Munt(ORDNr,CumulORDNr) New R,KLNr,Munt,CumulMunt Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set Munt=$P(^KOD(KLNr,"F",ORDNr,1),D,18) Set CumulMunt=$P(^KOD(KLNr,"F",CumulORDNr,1),D,18) Quit Munt=CumulMunt ; NettoBruto gelijk? NettoBruto(ORDNr,CumulORDNr) New R,KLNr,NettoBruto,CumulNettoBruto Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set NettoBruto=$P(^KOD(KLNr,"F",ORDNr,1),D,27) Set CumulNettoBruto=$P(^KOD(KLNr,"F",CumulORDNr,1),D,27) Quit NettoBruto=CumulNettoBruto ; Exportcode gelijk? Export(ORDNr,CumulORDNr) New R,KLNr,Export,CumulExport Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set Export=$P(^KOD(KLNr,"F",ORDNr,1),D,14) Set CumulExport=$P(^KOD(KLNr,"F",CumulORDNr,1),D,14) Quit Export=CumulExport ; Ordertype gelijk? OrderType(ORDNr,CumulORDNr) New R,KLNr,OrderType,CumulOrderType Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set R=^KOD(KLNr,"F",ORDNr,1),OrderType=$P(R,D,25)_$P(R,D,29) Set R=^KOD(KLNr,"F",CumulORDNr,1),CumulOrderType=$P(R,D,25)_$P(R,D,29) Quit OrderType=CumulOrderType ; Orgaluxcode orders steeds afzonderlijk? Orgalux(ORDNr,CumulORDNr) New MagCumuleren, LegacyEwords6 #dim LegacyEwords6 As BL.Legacy.EWORDS6 = ##class(BL.Legacy.EWORDS6).%New() #dim MagCumuleren As %Boolean = $$$False Set MagCumuleren = $$$Not(LegacyEwords6.BevatOrderOrgalux(ORDNr)) Set:(MagCumuleren) MagCumuleren = $$$Not(LegacyEwords6.BevatOrderOrgalux(CumulORDNr)) Quit MagCumuleren TaorIndeling(ORDNr,CumulORDNr) New CumulTaorIndeling Set CumulTaorIndeling='$$HeeftTAORIndeling^FLOW("O",ORDNr) Set:CumulTaorIndeling CumulTaorIndeling='$$HeeftTAORIndeling^FLOW("O",CumulORDNr) Quit CumulTaorIndeling ; Verpaktype gelijk? VerpakType(ORDNr,CumulORDNr) New VerpakType,CumulVerpakType Set VerpakType=$$ORDER^VERPAK(ORDNr) Set CumulVerpakType=$$ORDER^VERPAK(CumulORDNr) Quit VerpakType=CumulVerpakType ; Verzendwijze gelijk? VerzendWijze(ORDNr,CumulORDNr) New VerzendWijze,CumulVerzendWijze Set VerzendWijze=$$DEFAULT^KLVERZW(,KLNr,ORDNr) Set CumulVerzendWijze=$$DEFAULT^KLVERZW(,KLNr,CumulORDNr) Quit $P(VerzendWijze,";")=$P(CumulVerzendWijze,";") ; Transport gelijk? Transport(ORDNr,CumulORDNr) New R,KLNr,Transport,CumulTransport Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set Transport=$P(^KOD(KLNr,"F",ORDNr,1),D,12) Set CumulTransport=$P(^KOD(KLNr,"F",CumulORDNr,1),D,12) Quit Transport=CumulTransport ; Consumentcommissie gelijk? ConsumentCommissie(ORDNr,CumulORDNr) New R,KLNr,ConsumentCommissie,CumulConsumentCommissie Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set ConsumentCommissie=$P(^KOD(KLNr,"F",ORDNr,1),D,55,56) Set CumulConsumentCommissie=$P(^KOD(KLNr,"F",CumulORDNr,1),D,55,56) Set:ConsumentCommissie="" ConsumentCommissie=D Set:CumulConsumentCommissie="" CumulConsumentCommissie=D Quit ConsumentCommissie=CumulConsumentCommissie ; ********************************** Lock(ORDNrs) New %TC,R,KLNr,ORDNr For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set:'$D(KLNr) R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Lock +^KOD(KLNr,"F",ORDNr):0 Set %TC=$T Quit:'%TC } If '%TC{ ; Niet alle orders kunnen gelockd worden For I=1:1:I-1 { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Lock -^KOD(KLNr,"F",ORDNr) } } Quit %TC UnLock(ORDNrs) New R,KLNr,ORDNr For I=1:1:$L(ORDNrs,";") { Set ORDNr=$P(ORDNrs,";",I) Continue:'ORDNr Set:'$D(KLNr) R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Lock -^KOD(KLNr,"F",ORDNr) } Quit WachtendeOrders(KLNr) New ORDNr,ORDNrs Set (ORDNr,ORDNrs)="" For { Set ORDNr=$O(^KOD(KLNr,"F",ORDNr)) Quit:ORDNr="" Continue:'$$OrderGesloten(ORDNr) Continue:$$IsContractOfAfroep(ORDNr) Continue:$$IsTerugname(ORDNr) Continue:$$InWMS(ORDNr) Continue:'$$CheckStock(ORDNr) If '$$CheckKredietwaardig(ORDNr) Do MarkeerKredietProbleemInORDNr^EWORDS3(ORDNr,"A") Continue Continue:'$$CheckBoekhouding(ORDNr) Set:$$SendWMSStatus(ORDNr)="W" ORDNrs=ORDNrs_";"_ORDNr } Set $E(ORDNrs)="" Quit ORDNrs ; Invullen markering voor leveringsperformantie MarkForLeveringsPerformantie(ORDNr,Code) New Context,OrderAPI,Order,Iterator,Lijn,KLNr,PRNr,LeverTermijn,LevPerfCode Set Context = ##class(DOM.DomeinContext).Instance() Set OrderAPI = Context.GeefOrderAPI() Set Order=OrderAPI.GeefOrder(ORDNr) Set KLNr=##class(DOM.DomeinContext).Instance().GeefLegacyPartijAPI().GeefKlantNummerVoorPartijID(Order.GeefKlantID()) Set Iterator = Order.GeefTypeOrderLijnIterator(##class(DOM.VKP.enu.OrderLijnType).Product()) While Iterator.HasNext() { Set OrderLijn=Iterator.Next() Set PRNr=OrderLijn.GeefProductID() Set LeverTermijn=OrderLijn.GeefLeverTermijn() ; cfr CSC Set LevPerfCode=OrderLijn.GeefLevPerfCode() ; cfr CSC If LevPerfCode="",LeverTermijn,LeverTermijn<$H ;Set OrderLijn.SetLevPerfCode()=Code ; cfr CSC } Quit