FLOWORD6 ;Order [ 10/07/2002 2:40 PM ] ; BACKORD(KLNr,ORDNr,OLNr,BOQty,RestQty,LevWk,ReturnLocal) ; RestQty is optioneel New R,ModAant,Aantal,OLUNr,LEVNr,TOENr,TLNr,ModTLNr,TLUNr,ModOLNr,SwapFrom,SwapTo,PakFact,I Set ModAant=$G(RestQty),LevWk=$G(LevWk),ModOLNr=OLNr Set R=^KOD(KLNr,"F",ORDNr,OLNr),$P(R,D,23)=$P(R,D,3),^KOD(KLNr,"F",ORDNr,OLNr)=R Set Aantal=$P(R,D,3),$P(R,D,23)="",PakFact=$P(R,D,36) Set:PakFact BOQty=BOQty*PakFact Set:'ModAant ModAant=$P(R,D,3)-BOQty Set:LevWk="" LevWk=$P(R,D,25) For I=9,10,16 Set:Aantal $P(R,D,I)=$P(R,D,I)/Aantal Set $P(R,D,I)=$J($P(R,D,I)*BOQty,0,##class(APPS.VKP.OrderlijnPrijsBepaler).GeefAantalDecimalen()) /// In de nieuwe backorderlijn enkele pieces anders invullen. Set $P(R,D,3)=BOQty Set $P(R,D,25)=LevWk Set $P(R,D,54)= "" /// 54. Receptietijdstip gekoppelde toeleveringslijn op leeg zetten Set OLUNr=$P(R,D,15) Set OLUNr=$$BerekenVolgendOLUNr(ORDNr,OLUNr) Set $P(R,D,15)=OLUNr Set:$L($P(R,D,35)) $P(R,D,35)=$$SPLITNR(KLNr,ORDNr,OLNr) Set OLNr=^KOD(KLNr,"F",ORDNr,0),^KOD(KLNr,"F",ORDNr,0)=OLNr+1 Set ^KOD(KLNr,"F",ORDNr,OLNr)=R,TOENr=$P(R,D,27),(TLNr,ModTLNr)=$P(R,D,28) Do SWNODE^FLOWORD(KLNr,ORDNr,OLNr) Set ReturnLocal("NewOLUNr") = OLUNr Do ProductOrderLijnGemaakt^FLOWORD2(KLNr,ORDNr,OLNr) If TOENr Do .Set LEVNr=$P(^KTO1(TOENr),D),R=^KTO(LEVNr,TOENr,TLNr),Aantal=$P(R,D,3) .For I=9,10,16 Set:Aantal $P(R,D,I)=$P(R,D,I)/Aantal Set $P(R,D,I)=$J($P(R,D,I)*BOQty,0,##class(APPS.VKP.OrderlijnPrijsBepaler).GeefAantalDecimalen()) .Set TLNr=^KTO(LEVNr,TOENr,0),^KTO(LEVNr,TOENr,0)=TLNr+1 .Set $P(R,D,3)=BOQty,$P(R,D,13)=TLNr-100,TLUNr=$P(R,D,15),TLUNr=TLUNr\100*100+99 .Set TLUNr=$O(^TO("IU",TOENr,TLUNr),-1)+1,$P(R,D,15)=TLUNr,$P(R,D,28)=OLNr .Set ^KTO(LEVNr,TOENr,TLNr)=R .Do SWNODE^FLOWTOE(LEVNr,TOENr,TLNr) .Do ProductToeleveringLijnGemaakt^FLOWTOE2(LEVNr,TOENr,TLNr) .Set R=^KOD(KLNr,"F",ORDNr,OLNr),$P(R,D,28)=TLNr,^KOD(KLNr,"F",ORDNr,OLNr)=R .Do InvoerUitvoerLinkAangemaakt^FLOWTOE2(LEVNr,TOENr,TLNr) .Set (SwapFrom,ReturnLocal("NewTLNr"))=TLNr .For Do Quit:SwapTo'>ModTLNr ..Set SwapTo=$O(^KTO(LEVNr,TOENr,SwapFrom),-1) ..Quit:SwapTo'>ModTLNr ..Do LSWAP^FLOWTOE2(TOENr,SwapFrom,SwapTo) ..Set (SwapFrom,ReturnLocal("NewTLNr"))=SwapTo Set SwapFrom=OLNr For Do Quit:SwapTo'>ModOLNr .Set SwapTo=$O(^KOD(KLNr,"F",ORDNr,SwapFrom),-1) .Quit:SwapTo'>ModOLNr .Do LSWAP^FLOWORD2(ORDNr,SwapFrom,SwapTo,1) .Set SwapFrom=SwapTo Do MODAANT(KLNr,ORDNr,ModOLNr,ModAant) Quit ; BerekenVolgendOLUNr(ORDNr,OLUNr) Set OLUNr=OLUNr\10*10+9 Set OLUNr=$O(^ORD("IU",ORDNr,OLUNr),-1)+1 ;If $D(^ORD("IU",ORDNr,OLUNr)) Do ThrowException Quit OLUNr ; MODAANT(KLNr,ORDNr,OLNr,Aantal,LevWk) New R,OldAant,TOENr,TLNr,I Set LevWk=$G(LevWk) Set:'$G(KLNr) KLNr=$P(^KO1(ORDNr,"F"),D) Do KWNODE^FLOWORD(KLNr,ORDNr,OLNr) Set R=^KOD(KLNr,"F",ORDNr,OLNr),OldAant=$P(R,D,3),TOENr=$P(R,D,27),TLNr=$P(R,D,28) For I=9,10,16 Set:OldAant $P(R,D,I)=$P(R,D,I)/OldAant Set $P(R,D,I)=$J($P(R,D,I)*Aantal,0,##class(APPS.VKP.OrderlijnPrijsBepaler).GeefAantalDecimalen()) Set $P(R,D,3)=Aantal,^KOD(KLNr,"F",ORDNr,OLNr)=R Do SWNODE^FLOWORD(KLNr,ORDNr,OLNr) If 'Aantal&&OldAant Do ProductOrderLijnAnnulatie^FLOWORD2(KLNr,ORDNr,OLNr,OldAant) Else If Aantal&&('OldAant) Do ProductOrderLijnGemaakt^FLOWORD2(KLNr,ORDNr,OLNr,OldAant) Else If Aantal'=OldAant Do ProductOrderLijnGewijzigd^FLOWORD2(KLNr,ORDNr,OLNr,##class(DOM.VKP.enu.ProductOrderLijnWijzigingType).Aantal()) Do:TOENr MODTAANT(,TOENr,TLNr,Aantal) Do:$L(LevWk) MODLEVWK(KLNr,ORDNr,OLNr,LevWk) Quit ; MODTAANT(LEVNr,TOENr,TLNr,Aantal) New R,OldAant,I Set:'$G(LEVNr) LEVNr=$P(^KTO1(TOENr),D) Do KWNODE^FLOWTOE(LEVNr,TOENr,TLNr) Set R=^KTO(LEVNr,TOENr,TLNr),OldAant=$P(R,D,3) For I=9,10,16 Set:OldAant $P(R,D,I)=$P(R,D,I)/OldAant Set $P(R,D,I)=$J($P(R,D,I)*Aantal,0,##class(APPS.VKP.OrderlijnPrijsBepaler).GeefAantalDecimalen()) Set $P(R,D,3)=Aantal,^KTO(LEVNr,TOENr,TLNr)=R Do SWNODE^FLOWTOE(LEVNr,TOENr,TLNr) Do:Aantal'=OldAant ProductToeleveringLijnGewijzigd^FLOWTOE2(LEVNr,TOENr,TLNr,##class(DOM.AKP.enu.ProductToeleveringLijnWijzigingType).Aantal()) Quit ; MODLEVWK(KLNr,ORDNr,OLNr,LevWk) New R Set:'$G(KLNr) KLNr=$P(^KO1(ORDNr,"F"),D) Do KWNODE^FLOWORD(KLNr,ORDNr,OLNr) Set R=^KOD(KLNr,"F",ORDNr,OLNr),$P(R,D,25)=LevWk,^KOD(KLNr,"F",ORDNr,OLNr)=R Do SWNODE^FLOWORD(KLNr,ORDNr,OLNr) Do ProductOrderLijnGewijzigd^FLOWORD2(KLNr,ORDNr,OLNr,##class(DOM.VKP.enu.ProductOrderLijnWijzigingType).Leverdatum()) Quit ; SPLITOLN(KLNr,ORDNr,OLNr,Aantal,LevWk,SplitAll,ReturnLocal) New I,R,KlOLNr,OLUNr Set LevWk = $G(LevWk) Set SplitAll = '$D(SplitAll) If '$G(KLNr) { Set R=^KO1(ORDNr,"F") Set KLNr=$P(R,D) } Set R=^KOD(KLNr,"F",ORDNr,OLNr) Set OLUNr=$P(R,D,15) Set SplitAll(OLUNr)="" If LevWk="" { Set LevWk = $P(R,D,25) } Set KlOLNr=$P(R,D,35) Do BACKORD(KLNr,ORDNr,OLNr,Aantal,,LevWk,.ReturnLocal) If $L(KlOLNr),SplitAll Do ; Splits alle lijnen van dezelfde groep KlOLNr .Set OLNr=100 .For Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Do ..Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr),OLUNr=$P(OrdRec,D,15) ..Quit:$D(SplitAll(OLUNr)) ..Quit:$P($P(OrdRec,D,35),".")'=$P(KlOLNr,".") ..Quit:$P($P(OrdRec,D,35),".",3)'=$P(KlOLNr,".",3) ..Do SPLITOLN(KLNr,ORDNr,OLNr,Aantal,LevWk,.SplitAll) Quit ; ; Geeft het volgend splitsnummer voor een bepaalde EDI-groep SPLITNR(KLNr,ORDNr,OLNr) New R,OrdRec,KlOLNr,SplitNr If '$G(KLNr) Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr),KlOLNr=$P(OrdRec,D,35),SplitNr=$P(KlOLNr,".",3) Do:$L(KlOLNr) .Set OLNr=100 .For Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Do ..Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr) ..If $P($P(OrdRec,D,35),".",1,2)=$P(KlOLNr,".",1,2),$P($P(OrdRec,D,35),".",3)>SplitNr Set SplitNr=$P($P(OrdRec,D,35),".",3) Set SplitNr=$P(KlOLNr,".",1,2)_"."_(SplitNr+1) Quit SplitNr ; ; Wijzig aantal en/of leverweek van een ganse EDI-groep MODEDIGR(KLNr,ORDNr,OLNr,Aantal,LevWk) New R,OrdRec,KlOLNr,Faktor Set Aantal=$G(Aantal),LevWk=$G(LevWk) If '$G(KLNr) Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr),KlOLNr=$P(OrdRec,D,35),Faktor=$P(OrdRec,D,36) Set:'Faktor Faktor=1 Set Aantal=Aantal/Faktor Do:$L(KlOLNr) .Set OLNr=100 .For Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Do ..Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr) ..Quit:$P($P(OrdRec,D,35),".")'=$P(KlOLNr,".") Quit:$P($P(OrdRec,D,35),".",3)'=$P(KlOLNr,".",3) ..Set Faktor=$P(OrdRec,D,36) Set:'Faktor Faktor=1 ..If Aantal Do ...Do MODAANT(KLNr,ORDNr,OLNr,Aantal*Faktor,LevWk) ..Else Do MODLEVWK(KLNr,ORDNr,OLNr,LevWk) Quit ; ; Verwijderen EDI-groep aanduiding REMEDIGR(KLNr,ORDNr,OLNr) New R,OrdRec,KlOLNr If '$G(KLNr) Set R=^KO1(ORDNr,"F"),KLNr=$P(R,D) Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr),KlOLNr=$P(OrdRec,D,35) Do:$L(KlOLNr) .Set OLNr=100 .For Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Do ..Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr) ..Quit:$P($P(OrdRec,D,35),".")'=$P(KlOLNr,".") Quit:$P($P(OrdRec,D,35),".",3)'=$P(KlOLNr,".",3) ..Set $P(OrdRec,D,35)="",^KOD(KLNr,"F",ORDNr,OLNr)=OrdRec Quit ; ; Controle bij opsplitsen van OLUNrs CheckOLUNr(ORDNr,OLNr) New OLUNr,Ok Set Ok=1,KLNr=$P(^KO1(ORDNr,"F"),D) Set OLUNr=$P(^KOD(KLNr,"F",ORDNr,OLNr),D,15) Set OLUNr=OLUNr\10*10+9 Set Ok=($O(^ORD("IU",ORDNr,OLUNr),-1)+1)'>OLUNr Quit Ok ; ; Versmelten van orderlijnen binnen een OLUNr groep tot een lijn MergeOLUNrs(ORDNr,ToOLUNr) New KLNr,Rec,FromOLUNr,ToOLNr,FromOLNr,ToPRNr,FromPRNr,ToPrijs,FromPrijs,ToLeverdag,FromLeverdag,ToTOENr,FromTOENr If '$D(^ORDW("IO",ORDNr,ToOLUNr)) { Set KLNr=$P(^KO1(ORDNr,"F"),D) Set ToOLNr=^ORD("IU",ORDNr,ToOLUNr) Set Rec=^KOD(KLNr,"F",ORDNr,ToOLNr),ToPRNr=$P(Rec,D,2),ToPrijs=$P(Rec,D,6),ToLeverdag=$P(Rec,D,25),ToTOENr=$P(Rec,D,27) Set FromOLUNr=ToOLUNr\10*10 For FromOLUNr=FromOLUNr:1:(FromOLUNr+9) { Continue:(FromOLUNr=ToOLUNr) Set FromOLNr=$G(^ORD("IU",ORDNr,FromOLUNr)) Continue:'FromOLNr Continue:$D(^ORDW("IO",ORDNr,FromOLUNr)) ; Deze lijn is verzonden naar het WMS Set Rec=^KOD(KLNr,"F",ORDNr,FromOLNr),FromPRNr=$P(Rec,D,2),FromPrijs=$P(Rec,D,6),FromLeverdag=$P(Rec,D,25),FromTOENr=$P(Rec,D,27) If FromPRNr=ToPRNr,FromPrijs=ToPrijs,FromLeverdag=ToLeverdag,FromTOENr=ToTOENr Do MergeLijn(ORDNr,FromOLNr,ToOLNr) } } Quit ; ; Versmelten van twee orderlijnen tot een lijn MergeLijn(ORDNr,FromOLNr,ToOLNr) New KLNr,Rec,FromPRNr,ToPRNr,FromAantal,ToAantal,FromPrijs,ToPrijs,FromLeverdag,ToLeverdag,FromTOENr,ToTOENr,FromOLUNr,ToOLUNr Set KLNr=$P(^KO1(ORDNr,"F"),D) Set FromOLUNr=$$GeefOrderLijnCode^FLOWORD(KLNr,ORDNr,FromOLNr) Set Rec=^KOD(KLNr,"F",ORDNr,FromOLNr),FromPRNr=$P(Rec,D,2),FromAantal=$P(Rec,D,3),FromPrijs=$P(Rec,D,6),FromLeverdag=$P(Rec,D,25),FromTOENr=$P(Rec,D,27) Set ToOLUNr=$$GeefOrderLijnCode^FLOWORD(KLNr,ORDNr,ToOLNr) Set Rec=^KOD(KLNr,"F",ORDNr,ToOLNr),ToPRNr=$P(Rec,D,2),ToAantal=$P(Rec,D,3),ToPrijs=$P(Rec,D,6),ToLeverdag=$P(Rec,D,25),ToTOENr=$P(Rec,D,27) If '$D(^ORDW("IO",ORDNr,FromOLUNr)),'$D(^ORDW("IO",ORDNr,ToOLUNr)),FromOLNr'=ToOLNr,FromPRNr=ToPRNr,FromPrijs=ToPrijs,FromLeverdag=ToLeverdag,FromTOENr=ToTOENr { ; Zelfde product, zelfde verkoopprijs, zelfde leverdag maar niet met zichzelf en geen van beide in het WMS Do MODAANT(KLNr,ORDNr,ToOLNr,(FromAantal+ToAantal)) Do UpdateTekstLijn(KLNr,ORDNr,FromOLUNr,ToOLUNr) Do DELLINE^FLOWORD3(ORDNr,FromOLNr) } Quit ; ; TekstLijnen corrigeren als oorspronkelijke orderlijn verwijderd wordt. UpdateTekstLijn(KLNr,ORDNr,FromOLUNr,ToOLUNr) New AanduidingTekstBlok,LijnType Set OLNr=100 For Set OLNr=$O(^KOD(KLNr,"F",ORDNr,OLNr)) Quit:OLNr="" Do .Set OrdRec=^KOD(KLNr,"F",ORDNr,OLNr) .Set AanduidingTekstBlok = $P(OrdRec,D,18) .Set LijnType = $P(OrdRec,D,17) .If ($P(AanduidingTekstBlok,";",3)=FromOLUNr)&&(LijnType["KF11#") Do ..Set $P(AanduidingTekstBlok,";",3)=ToOLUNr ..Set $P(^KOD(KLNr,"F",ORDNr,OLNr),D,18)=AanduidingTekstBlok Quit ; RebuildKO1 New KLNr,ORDNr,BONNr Set ORDNr="" For Set ORDNr=$O(^KO1(ORDNr)) Quit:ORDNr="" Do . Set BONNr=$P(^KO1(ORDNr,"F"),D,2) . Quit:BONNr . Kill ^KO1(ORDNr) Set KLNr=0 For Set KLNr=$O(^KOD(KLNr)) Quit:KLNr="" Do . Set ORDNr="" . For Set ORDNr=$O(^KOD(KLNr,"F",ORDNr)) Quit:ORDNr="" Set ^KO1(ORDNr,"F")=KLNr_D Quit ;