Index: vhTest/Mock/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml
===================================================================
diff -u
--- vhTest/Mock/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 0)
+++ vhTest/Mock/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 72244)
@@ -0,0 +1,32 @@
+
+
+
+
+Deze klasse werd automatisch gegenereerd en onderhouden - lokale aanpassingen zijn niet nodig.
+Een hercompilatie van de basis interface - met een correct werkende studiohook ( v2.20 ++ ) - zorgt ervoor dat deze klasse aangepast wordt
+1
+APPS.Verpakking.OrgaluxBonOptimizer,Tools.Mock.MockClassBase
+right
+
+
+%Status
+
+
+
+
+Bon:DOM.VKP.Bon
+%ListOfObjects
+
+
+
+
+BONNr:%String
+
+
+
+
+
+
Index: APPS/Verpakking/OrgaluxBonOptimizer.cls.xml
===================================================================
diff -u
--- APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 0)
+++ APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 72244)
@@ -0,0 +1,1163 @@
+
+
+
+TECH.Mockable
+
+
+%Integer
+1170
+
+
+
+%Integer
+770
+
+
+
+%Integer
+730
+
+
+
+%String
+1
+
+
+
+%String
+Overdoos
+
+
+
+vhLib.Logger
+1
+
+
+
+%Boolean
+1
+
+
+
+APPS.Verpakking.BoxDataRepository
+1
+
+
+
+APPS.Verpakking.SnijDataRepository
+1
+
+
+
+DOM.PM.ProductAPI
+1
+
+
+
+%Boolean
+0
+
+
+
+%String
+1
+
+
+
+%Decimal
+1
+
+
+
+%Decimal
+1
+
+
+
+%Decimal
+1
+
+
+
+TECH.DateTime.impl.DateTimeAPI
+1
+
+
+
+APPS.Verpakking.DoosFactory
+1
+
+
+
+APPS.Verpakking.Optimizer
+1
+
+
+
+APPS.Verpakking.DoosAanvuller
+1
+
+
+
+%String
+1
+
+
+
+APPS.Verpakking.CubeIQRequestBuilder
+1
+
+
+
+DoosFactory:APPS.Verpakking.DoosFactory="",DoosAanvuller:APPS.Verpakking.DoosAanvuller="",Optimizer:APPS.Verpakking.Optimizer="",CubeIQRequestBuilder:APPS.Verpakking.CubeIQRequestBuilder
+1
+1
+%Status
+1
+
+
+
+
+1
+BonId:%String
+
+
+
+
+BonId:%String
+
+
+
+
+BoxDataLijstVanTeStapelenDozen:%ListOfObjects
+APPS.Verpakking.dto.CubeIQ.Response
+ Score) {
+ Set BesteStapeling = CubeIQResponse
+ Set BesteScore = Score
+ }
+ }
+ } Else {
+ #dim MaxHoogteDoos As %Decimal = 150
+
+ While ((BesteStapeling = "") && (MaxHoogteDoos < ..#MaximumVerpakkingHoogteVoorEuropallet)) {
+ Set Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, ..#MaximumVerpakkingBreedteVoorEuropallet, ..#MaximumVerpakkingDiepteVoorEuropallet, MaxHoogteDoos, $$$True)
+ Set Response = ..GeefParsedCubeIQResponse(Request)
+
+ If ((Response.cubeiq.loadedcontainers.loadedcontainer.Count() = MinimumAantalPallettenVoorBon) && (Response.cubeiq.unloadedproducts = "")) {
+ Set BesteStapeling = Response
+ }
+
+ Set MaxHoogteDoos = MaxHoogteDoos + 50
+ }
+ }
+
+ If (BesteStapeling = "") {
+ #dim FoutOmschrijving As %String = "Geen optimale stapeling gevonden voor bon "_ ..BonId _"."
+ Do ..Logger.ErrorMail("Optimaliseer bon orgalux", FoutOmschrijving)
+ Set Exception = ##class(TECH.Exceptions.DataNotFoundException).%New(FoutOmschrijving)
+ Do ##class(TECH.ExceptionHandler).Throw(Exception)
+ }
+
+ Quit BesteStapeling
+]]>
+
+
+
+BoxDataLijstVanTeStapelenDozen:%ListOfObjects
+%Integer
+
+
+
+
+CubeIQResponse:APPS.Verpakking.dto.CubeIQ.Response,BoxDataLijst:%ListOfObjects
+ 0) {
+ Set SnijDataDoos = ..MaakMetaDataVoorSnijOpdracht(BoxData, .OptiDataDoos, 1, NummerDoos, BoxData.ObjRef, "", SnijDataOverdoosBodem, OptiDataOverdoosBodem, "", AfbeeldingCodeDoos)
+
+ #dim DelenVanBoxDataIterator As TECH.Iterator = ..BoxDataRepository.ZoekDeelVanBoxDataViaId(BoxData.%Id())
+ While DelenVanBoxDataIterator.HasNext() {
+ #dim DeelVanBoxData As DS.Prod.OptiBox.BoxData = DelenVanBoxDataIterator.Next()
+ #dim OptiDataInnerDoos As DS.Prod.OptiBox.OptiData = ""
+ Do ..MaakMetaDataVoorSnijOpdracht(DeelVanBoxData, .OptiDataInnerDoos, 1, "", BoxData.ObjRef, SnijDataDoos, OptiDataDoos, OptiDataDoos,SnijDataDoos)
+ }
+
+ Set Block.quantity = Block.quantity - 1
+ Set NummerDoos = NummerDoos + 1
+ }
+ }
+ Set NummerAfbeelding = NummerAfbeelding + 1
+ }
+ }
+ Set NummerOverdoos = NummerOverdoos + 1
+ }
+]]>
+
+
+
+
+1
+DS.Prod.OptiBox.SnijData
+
+
+
+
+
+
+
+
+
+BoxDataLijst:%ListOfObjects,ParentSnijData:DS.Prod.OptiBox.BoxData,OptiDataParent:DS.Prod.OptiBox.OptiData
+1
+
+
+
+
+BoxData:DS.Prod.OptiBox.BoxData
+1
+DS.Prod.OptiBox.sub.emSnijDef
+
+
+
+
+BoxData:DS.Prod.OptiBox.BoxData
+1
+APPS.Verpakking.dto.Doos
+
+
+
+
+
+1
+DS.Prod.OptiBox.SnijData
+
+
+
+
+BoxData:DS.Prod.OptiBox.BoxData,Sequentie:%Integer,OptiData:DS.Prod.OptiBox.OptiData,Product:DOM.PM.Product,SnijDataParent:DS.Prod.OptiBox.SnijData,SnijDataBoxParent:DS.Prod.OptiBox.SnijData,ProductAantal:%Integer,AfbeeldingCode:%String=""
+1
+DS.Prod.OptiBox.SnijData
+ 0) {
+ Set SnijData.Sequentie = Sequentie
+ }
+ Set SnijData.SnijMachineID = ##class(APPS.Verpakking.enu.MachineID).VH()
+ Set SnijData.Simulate = $$$False
+
+ /*
+ #dim SnijHistoriek As DS.Prod.OptiBox.SnijHistoriek = ##class(DS.Prod.OptiBox.SnijHistoriek).%New()
+ Set SnijData.Status = "F"
+
+ Set SnijHistoriek.CardboardID = Doos.CardBoardID
+ Set SnijHistoriek.CardboardProduct = ##class(Prod.Product).%OpenId(..KartonRepository.GeefKartonProductIdViaID(Doos.CardBoardID))
+ Set SnijHistoriek.CardboardBreedte = ..KartonRepository.GeefKartonBreedteViaID(Doos.CardBoardID)
+ Set SnijHistoriek.Lengte = Doos.UsedCardBoardLength
+
+ #dim SaveStatusSnijHistoriek As %Status = SnijHistoriek.%Save()
+ Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatusSnijHistoriek,"Het bewaren van SnijHistoriek in MaakSnijData is niet gelukt.")
+
+ Set SnijData.SnijHistoriek = SnijHistoriek
+ */
+
+ #dim SaveStatus As %Status = SnijData.%Save()
+ Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatus,"Het bewaren van SnijData in MaakSnijData is niet gelukt.")
+
+ Set SnijData.BoxDeelVan = SnijData
+ Set SaveStatus = SnijData.%Save()
+ Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatus,"Het 2e keer bewaren van SnijData in MaakSnijData is niet gelukt.")
+
+ Quit SnijData
+]]>
+
+
+
+BoxData:DS.Prod.OptiBox.BoxData,Product:DOM.PM.Product="",OptiDataParent:DS.Prod.OptiBox.OptiData="",OptiDataBoxParent:DS.Prod.OptiBox.OptiData=""
+1
+DS.Prod.OptiBox.OptiData
+ 0 : BoxData.Aantal, 1:1)
+ Set OptiData.Status = "L"
+
+ #dim SaveStatus As %Status = OptiData.%Save()
+ Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(SaveStatus,"Het bewaren van OptiData is niet gelukt.")
+
+ Quit OptiData
+]]>
+
+
+
+1
+
+
+
+
+CubeIQRequest:APPS.Verpakking.dto.CubeIQ.Request
+1
+APPS.Verpakking.dto.CubeIQ.Response
+
+
+
+
+1
+%Boolean
+
+
+
+
+Request:APPS.Verpakking.dto.CubeIQ.Request
+1
+%Net.HttpRequest
+
+
+
+
+BoxDataLijst:%ListOfObjects
+1
+DS.Prod.OptiBox.BoxDataMetID
+
+
+
+
+Overdoos:APPS.Verpakking.dto.CubeIQ.Response.LoadedContainer,MinimumAantalPallettenVoorBon:%Integer
+1
+%Decimal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ */
+ //Do ##class(Tools.Wlip).%New(110).String("SCORE NOG TE BEPALEN")
+ #dim VolumeFactor As %Integer = ##class(TECH.Math).Pow((Overdoos.overallheight * Overdoos.overalllength * Overdoos.overallwidth), 1/3)
+ #dim GrondOppervlakFactor As %Integer = ##class(TECH.Math).Pow((Overdoos.overalllength * Overdoos.overallwidth), 1/2) * 0.1
+ #dim StabiliteitFactor As %Decimal = Overdoos.overallheight / ##class(TECH.Math).Min(Overdoos.overalllength, Overdoos.overallwidth) * 50
+ #dim TotaleKartonOppervlakteFactor As %Integer = ##class(TECH.Math).Pow((2 * ((Overdoos.overalllength * Overdoos.overallwidth) + (Overdoos.overalllength * Overdoos.overallheight) + (Overdoos.overallheight * Overdoos.overallwidth))), 1/2) * 3
+ #dim GrondOppervlakKleinerDanHalvePalletFactor As %Integer = $Select(((..GrootsteDimensieGrondvlak < (..#MaximumVerpakkingDiepteVoorEuropallet)) && (..TweedeGrootsteDimensieGrondvlak < (..#MaximumVerpakkingBreedteVoorEuropallet / 2))):-200, 1:0)
+ #dim VierkantigheidFactor As %Integer = ##class(TECH.Math).Max(##class(TECH.Math).Max(##class(TECH.Math).Abs(Overdoos.overalllength - Overdoos.overallwidth), ##class(TECH.Math).Abs(Overdoos.overalllength - Overdoos.overallheight)), ##class(TECH.Math).Abs(Overdoos.overallheight - Overdoos.overallwidth)) * 0.5
+ #dim HoogteKleinerDan33cm As %Integer = $Select(Overdoos.overallheight < 330:-100, 1:0)
+
+ //Score is nog te bekijken op de optboxbig rechtstreeks
+ ;set t = VolumeFactor + GrondOppervlakFactor + StabiliteitFactor + TotaleKartonOppervlakteFactor + GrondOppervlakKleinerDanHalvePalletFactor + VierkantigheidFactor + HoogteKleinerDan33cm
+ ;Do ##class(Tools.Wlip).%New(110).String(t _ " Vol " _VolumeFactor _" GrondOpp "_ GrondOppervlakFactor _" Stab "_ StabiliteitFactor _" TotKartonOpp "_ TotaleKartonOppervlakteFactor _" GrondOppKleinerDanHalvePlt "_ GrondOppervlakKleinerDanHalvePalletFactor _" Vierkantigheid "_ VierkantigheidFactor_" Hoogte<330 "_ HoogteKleinerDan33cm)
+ Quit (VolumeFactor + GrondOppervlakFactor + StabiliteitFactor + TotaleKartonOppervlakteFactor + GrondOppervlakKleinerDanHalvePalletFactor + VierkantigheidFactor + HoogteKleinerDan33cm)
+]]>
+
+
+
+BoxDataLijst:%ListOfObjects
+1
+
+
+
+
+BoxDataLijst:%ListOfObjects
+1
+%ListOfObjects
+
+
+
+
+BoxDataLijst:%ListOfObjects
+1
+%ListOfObjects
+ 0) {
+ Do GegroepeerdeBoxDataLijst.Insert(BoxDataVoorGegroepeerdeMatten)
+ }
+
+ While BoxDataIterator.HasNext() {
+ #dim BoxData As DS.Prod.OptiBox.BoxDataMetID = BoxDataIterator.Next()
+ #dim BoxDataGroep As DS.Prod.OptiBox.BoxData
+
+ If $$$Not(BoxData.VolumeVan = "")
+ {
+ If $$$Not(BoxData.VolumeVan.%Id() = "OL||Antislipmat groep||1") {
+ Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.UnimplementedException).%New("Groepering "_ BoxData.VolumeVan.%Id() _"' is nog niet geïmplementeerd bij de optimalisatie van de verpakking van de orgalux bonnen."))
+ }
+ } Else {
+ Do GegroepeerdeBoxDataLijst.Insert(BoxData)
+ }
+ }
+
+ Quit GegroepeerdeBoxDataLijst
+]]>
+
+
+
+BonID:%String
+1
+%ListOfObjects
+ 1)) { //Verdelen in evenredige stapels
+ #dim GelijkVerdeeldeAantallenLijstIterator As TECH.Iterator = ..GeefGelijkVerdeeldeAantallenLijstIterator(Qty, BoxData.MaxCombinAantal)
+ While GelijkVerdeeldeAantallenLijstIterator.HasNext() {
+ #dim Aantal As %Integer = GelijkVerdeeldeAantallenLijstIterator.Next()
+ Set Params("PRODAANTAL") = Aantal
+ Set Params("AANTAL") = Aantal
+ Set BoxData.Aantal = Aantal / BoxData.MaxCombinAantal //???????????? TODO
+ Set BoxData.Breedte = ..CalcMetDefault(1, BoxData.BreedteExec, .Params)
+ Set BoxData.Diepte = ..CalcMetDefault(1, BoxData.DiepteExec, .Params)
+ Set BoxData.Hoogte = ..CalcMetDefault(1, BoxData.HoogteExec, .Params)
+ Do BoxDataLijst.Insert(BoxData)
+ }
+ } Else {
+ Set Params("PRODAANTAL") = Qty
+ Set Params("AANTAL") = Qty
+ Set BoxData.Aantal = Qty
+ Set BoxData.Breedte = ..CalcMetDefault(1, BoxData.BreedteExec, .Params)
+ Set BoxData.Diepte = ..CalcMetDefault(1, BoxData.DiepteExec, .Params)
+ Set BoxData.Hoogte = ..CalcMetDefault(1, BoxData.HoogteExec, .Params)
+
+ If (##class(TECH.Math).Max(BoxData.Breedte, BoxData.Diepte) > ..#MaximumVerpakkingBreedteVoorEuropallet) && (##class(TECH.Math).Min(BoxData.Breedte, BoxData.Diepte) > ..#MaximumVerpakkingDiepteVoorEuropallet) {
+ Do ..Logger.Debug("PastProductOpEuropallet", "Product "_PRNr_" past niet op een europallet voor bon " _ BonID_".")
+ } Else {
+ Do BoxDataLijst.Insert(BoxData)
+ }
+ }
+ }
+ }
+
+ Quit BoxDataLijst
+]]>
+
+
+
+BoxData:DS.Prod.OptiBox.BoxData
+DS.Prod.OptiBox.BoxDataMetID
+
+
+
+
+BonID:%String
+1
+TECH.Iterator
+
+
+
+
+TeVerdelenGetal:%Integer,MaximaleVerdeling:%Integer
+1
+TECH.Iterator
+ MaximumProductenPerStapel) {
+ Do AantallenLijst.Insert(MaximumProductenPerStapel)
+ Set TeVerdelenGetal = TeVerdelenGetal - MaximumProductenPerStapel
+ }
+
+ If (TeVerdelenGetal > 0) {
+ Do AantallenLijst.Insert(TeVerdelenGetal)
+ }
+
+ Quit ##class(TECH.ListIterator).%New(AantallenLijst)
+]]>
+
+
+
+
+1
+
+
+
+
+
+Berekenen van een expressie door gebruik te maken van de waarden in Params
+
+0
+",1)_"> "_Expression
+ New msg
+ Set $ECODE=""
+ Set msg="EXECUTE FOUT: "_Expression_$$ArrayToText^vhLib("Params",.Params)
+ Do WLFMT^vhDBG(msg,"B-Red")
+ Set Result="ERR"
+ Quit Result
+]]>
+
+
+
+Status:%Status,HttpRequest:%Net.HttpRequest
+1
+
+
+
+
+CubeIQRequest:APPS.Verpakking.dto.CubeIQ.Request
+1
+%String
+
+
+
+
+JsonStream:%Stream,RootObjectClassname:%String
+1
+TECH.RegisteredObject
+
+
+
+
+1
+%TimeStamp
+
+
+
+
+Getal:%Integer,TotaleLengteGetal:%Integer
+1
+%String
+
+
+
+
+ProductID:%Integer
+1
+TECH.Integer
+
+
+
+
+ObjRef:%String
+1
+TECH.Integer
+
+
+
+
+
+
Index: vhTest/Fake/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml
===================================================================
diff -u
--- vhTest/Fake/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 0)
+++ vhTest/Fake/APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (revision 72244)
@@ -0,0 +1,25 @@
+
+
+
+
+Deze klasse werd automatisch gegenereerd en onderhouden, nieuwe methodes worden automatisch bijgevoegd, bestaande blijven zoals ze zijn.
+Een hercompilatie van de basis interface - met een correct werkende studiohook ( v2.20 ++ ) - zorgt ervoor dat deze klasse aangepast wordt
+1
+APPS.Verpakking.OrgaluxBonOptimizer
+
+
+Bon:DOM.VKP.Bon
+%ListOfObjects
+
+
+
+
+BONNr:%String
+
+
+
+
+
+