<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="22" zv="Cache for Windows (x86-32) 2008.2.1 (Build 902U)" ts="2010-07-06 17:14:33">
<Class name="Alliance.Agris.Logic.Generator">
<Description><![CDATA[

Generator:
	Letzte Änderung 06.07.2010 rz
06.07.2010 * Stacktrace nicht mehr in KAL schreiben bei Speicherfehler
09.06.2010 + Aktionspreise und Individualpreise je VZ
19.05.2010 * Fehler in GenerateAuftrag korrigiert -> KAL Parameter ausserhalb definiert
03.05.2010 + Kommentarheader hinzugefügt]]></Description>
<Super>%RegisteredObject</Super>
<TimeChanged>61913,62055.036959</TimeChanged>
<TimeCreated>61829,43330.328416</TimeCreated>

<Parameter name="GEBINDEKENNUNG1">
<Description>
Wenn ZCO, ist die AnzahlGebinde (OrderedQty) direkt die Anzahl Gebinde,
ansonsten muss diese Menge noch durch AnzahlJeGebinde vom spez. Artikel geteilt werden</Description>
<Default>ZCO</Default>
</Parameter>

<Parameter name="GEBINDEKENNUNG2">
<Description>
Wenn ZIF, ist die AnzahlGebinde (OrderedQty) direkt die Anzahl Gebinde,
ansonsten muss diese Menge noch durch AnzahlJeGebinde vom spez. Artikel geteilt werden</Description>
<Default>ZIF</Default>
</Parameter>

<Method name="GenerateAuftragByOid">
<ClassMethod>1</ClassMethod>
<FormalSpec>OrderOid:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
	set order = ##class(Alliance.Common.Model.Order.Order).%OpenId(OrderOid)
	quit ..GenerateAuftrag(.order, 1)
]]></Implementation>
</Method>

<Method name="GenerateAuftrag">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&Order:Alliance.Common.Model.Order.Order,TriggeredFromDotNet:%Boolean=0]]></FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[

	set retval = 0
	
	//Plattformmandant auslesen
	set mandOid = ##class(DBCore.AppEinstellung).GetStringEinst(##class(DBCore.Konst).PLATTFORMMANDANT())
	
	//Abnehmer auslesen
	set abnehmerOid = ##class(DBDebiKredi.Debitor).GetIdByWebEdiId(mandOid, Order.DeliveryParty.PartyId)
	
	
	set kopfState = $$$OK
	set detailState = $$$OK
	set errorOccured = 0
	
	//KAL Messagetypen initialisieren
	set typ = ##class(Alliance.Common.KAL.Code.MessageType).Lieferung()
	set subTyp = ##class(Alliance.Common.KAL.Code.MessageSubType).Information()
	set senderTyp = ##class(Alliance.Common.KAL.Code.MessageSenderType).AgrisM()
	set severity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Error()
	set msgStatus = $$$OK
	set addText = ""
	
	if (abnehmerOid '= "") {
		
		TSTART
		
		set kopf = ##class(DBPlattform.AuftragsKopf).%New()
		set kopf.Mandant = mandOid
		set kopf.Abnehmer = ##class(DBDebiKredi.Debitor).%OpenId(abnehmerOid)
		set kopf.Auftragsdatum = Order.DocumentDateTime.Date
		set kopf.Lieferdatum = Order.ReqDeliveryDate.Date
		set kopf.BestellNr = Order.OrderNo
		set kopf.MasterID = Order.MasterID
		set kopf.ItemID = Order.ItemID
		set kopfState = kopf.%Save()
		w kopfState
			
		// Wenn OK -> Details anlegen
		if ($$$ISOK(kopfState)) {
			
			set key = ""
			do {
				set line = Order.OrderLines.GetNext(.key)
				if (line '= "") {
    				
    				//Detailposition anlegen
    				set spezArtikel = ##class(DBAgrofresh.Preis).GetPreisForWebEdi(abnehmerOid, line.BuyerArticleNo)
    				if (spezArtikel '= $$$NULLOREF) {
	    				
	    				set det = ##class(DBPlattform.AuftragsPos).%New()
	    				if (TriggeredFromDotNet = 1) {
		    				set det.OrderManuellEingelesen = 1
	    				}
	    				set det.PositionsNr = line.LineNo
	    				set det.Auftrag = kopf
	    				set det.Artikel = spezArtikel.Artikel
	    				
	    				//Gebindehandling
	    				if (spezArtikel.Gebinde '= $$$NULLOREF) {
		    				set det.Gebinde = spezArtikel.Gebinde
	    				} elseif (spezArtikel.Artikel.Gebinde '= $$$NULLOREF) {
		    				set det.Gebinde = spezArtikel.Artikel.Gebinde
	    				} else {
		    				//Fehler an KAL, dass Gebinde nicht eingestellt ist auf Artikel	
		    				set todayH = ##class(Base.DateTime).today().toHorolog()
		    				do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, abnehmerOid,,, "Gebinde ist auf Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" nicht eingestellt!")
	    				}
	    				
	    				//AnzahlJeGebinde
	    				if ((spezArtikel.AnzahlJeGebinde '= "") && (spezArtikel.AnzahlJeGebinde '= 0)) {
		    				set det.AnzahlJeGebinde = spezArtikel.AnzahlJeGebinde
	    				} elseif ((spezArtikel.Artikel.AnzahlJeGebinde '= "") && (spezArtikel.Artikel.AnzahlJeGebinde '= 0)) {
		    				set det.AnzahlJeGebinde = spezArtikel.Artikel.AnzahlJeGebinde
	    				} else {
		    				//Fehler an KAL, dass AnzahlJeGebinde nicht eingestellt
		    				set todayH = ##class(Base.DateTime).today().toHorolog()
		    				do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, abnehmerOid,,, "Anzahl je Gebinde ist auf Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" nicht eingestellt!")
	    				}
	    				
	    				//Mengeneinheit
	    				if (spezArtikel.Menge '= $$$NULLOREF) {
		    				set det.Mengeneinheit = spezArtikel.Menge
	    				} elseif (spezArtikel.Artikel.Mengeneinheit '= $$$NULLOREF) {
		    				set det.Mengeneinheit = spezArtikel.Artikel.Mengeneinheit
	    				} else {
		    				//Fehler an KAL, dass Mengeineinheit nicht eingestellt ist auf Artikel	
		    				set todayH = ##class(Base.DateTime).today().toHorolog()
		    				do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, abnehmerOid,,, "Mengeneinheit ist auf Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" nicht eingestellt!")
	    				}
	    				
	    				set det.KundenSpezArtNr = line.BuyerArticleNo
	    				
	    				set gebk = line.OrderedQtyUoM
	    				if ((gebk = ..#GEBINDEKENNUNG1) || (gebk = ..#GEBINDEKENNUNG2)) {
		    				set det.AnzahlGebinde = line.OrderedQty
	    				} else {
		    				if ((det.AnzahlJeGebinde '= "") && (det.AnzahlJeGebinde '= 0)) {
			    				set det.AnzahlGebinde = line.OrderedQty / det.AnzahlJeGebinde
		    				} else {
			    				set det.AnzahlGebinde = line.OrderedQty
		    				}
	    				}		
	    				
	    				set det.Menge = det.AnzahlGebinde * det.AnzahlJeGebinde
	    				
    				
	    				//*******************************************
	    				// Preis abgleichen
	    				//*******************************************
	    				set promotionStart = ""
	    				set promotionEnd = ""
	    				if (line.PromotionStart '= $$$NULLOREF) {
		    				set promotionStart = line.PromotionStart.Date
	    				}
	    				
	    				if (line.PromotionEnd '= $$$NULLOREF) {
		    				set promotionEnd = line.PromotionEnd.Date
	    				}
	    				
	    				if (line.PriceNet '= $$$NULLOREF) {
		    				set price = line.PriceNet.Price
		    				set unit = line.PriceNet.UnitPriceBase
		    				set unitMeasure = line.PriceNet.UnitOfMeasure
		    				
		    				set stueckPreis = 0
		    				if ((unitMeasure = ..#GEBINDEKENNUNG1) || (unitMeasure = ..#GEBINDEKENNUNG2)) {
		    					if ((det.AnzahlJeGebinde '= $$$NULLOREF) || (det.AnzahlJeGebinde > 0)) {
		    						set stueckPreis = ((price / unit) / det.AnzahlJeGebinde)
		    					} else {
			    					set stueckPreis = price / unit
		    					}
	    					} else {
		    					set stueckPreis = price / unit
	    					}
		    				
		    				
		    				//set spezArtPreis = spezArtikel.EngrosPreis
		    				set spezArtPreis = 0
		    				set isAbDatum = 0
		    				set isAktion = 0
		    				set idAktionsP = ""
		    				set isKundenspez = 0
		    				set kundenspezP = ""
		    				
		    				if ((promotionStart '= "") && (promotionStart '= 0) && (promotionEnd '= "") && (promotionEnd '= 0)) {
			    				set isAktion = 1
			    				
			    				set idAktionsP = ##class(DBAgrofresh.AktionspreisDet).GetIdByIdentDatum(mandOid, kopf.Abnehmer.%Id(), det.Artikel.%Id(), promotionStart, promotionEnd)
			    				if (idAktionsP '= "") {
				    				set detAktionsPreis = ##class(DBAgrofresh.AktionspreisDet).%OpenId(idAktionsP)
				    				if (detAktionsPreis '= $$$NULLOREF) {
					    				set spezArtPreis = detAktionsPreis.Preis
				    				}
			    				}
			    				
		    				} else {
			    				
			    				//neu ist es möglich, dass Coop Preise unter den VZs unterschiedlich sein können
			    				//es ist die Aufgabe des Disponenten, dazu vorgängig verkaufsseitig einen Kundenspezifischen Preis zu erfassen
			    				//existiert für einen Artikel ein Kundenspez. Preis, wird auf diesen abgeglichen.
			    				set kundenspezP = ##class(DBAgrofresh.Preis).GetPreis(mandOid, kopf.Abnehmer.Adresse.%Id(), det.Artikel.%Id(),0,1)
			    				if (kundenspezP '= $$$NULLOREF) {
				    				set isKundenspez = 1
				    				if ((kundenspezP.DatumPreisaenderung <= kopf.Lieferdatum) && (kundenspezP.DatumPreisaenderung '= $$$NULLOREF)) {
					    				set spezArtPreis = kundenspezP.EngrosPreisAbDatum
					    				set isAbDatum = 1
				    				} else {
					    				set spezArtPreis = kundenspezP.EngrosPreis
				    				}
				    				
			    				} else {
				    				if ((spezArtikel.DatumPreisaenderung <= kopf.Lieferdatum) && (spezArtikel.DatumPreisaenderung '= $$$NULLOREF)) {
					    				set spezArtPreis = spezArtikel.EngrosPreisAbDatum
					    				set isAbDatum = 1
				    				} else {
					    				set spezArtPreis = spezArtikel.EngrosPreis
				    				}
			    				}
		    				}
		    				    				
		    				//akt. oder neuer Preis updaten + Warnmeldung ausgeben, wenns nicht übereinstimmt
		    				if (stueckPreis '= spezArtPreis) {
			    				
			    				if (isAktion = 1) {
				    				
				    					//Aktionsdatensatz existiert
				    				if (idAktionsP '= "") {
				    					set aktionsDet = ##class(DBAgrofresh.AktionspreisDet).%OpenId(idAktionsP)
				    					set aktionsDet.Preis = stueckPreis
				    					do aktionsDet.%Save()
				    					
				    					//Meldung an KAL, dass Preise nicht übereinstimmen	
				    					set preisSeverity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Warning()
				    					set todayH = ##class(Base.DateTime).today().toHorolog()
			    						do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, preisSeverity, todayH, abnehmerOid,,, "Aktionspreis stimmt auf Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" nicht überein. Coop Preis: "_stueckPreis_" eingestellt: "_spezArtPreis)
				    					
				    					//Aktionsdatensatz anlegen
				    				} else {
					    				
					    				set aktionsKopfId = ##class(DBAgrofresh.AktionspreisKopf).GetIdByIdent(mandOid, kopf.Abnehmer.%Id(), det.Artikel.%Id())
					    				//Kopf anlegen
					    				if (aktionsKopfId = "") {
						    				set aktionsKopf = ##class(DBAgrofresh.AktionspreisKopf).%New()
						    				set aktionsKopf.Mandant = mandOid
						    				set aktionsKopf.Kunde = kopf.Abnehmer
						    				set aktionsKopf.Artikel = det.Artikel
						    				do aktionsKopf.%Save()
						    				set aktionsKopfId = aktionsKopf.%Id()
					    				}
					    				
					    				//konnte der Kopf richtig angelegt werden, oder existierte bereits
					    				// -> Detail anlegen
					    				if (aktionsKopfId '= "") {
						    				set aktionsDet = ##class(DBAgrofresh.AktionspreisDet).%New()
						    				set aktionsDet.Kopf = ##class(DBAgrofresh.AktionspreisKopf).%OpenId(aktionsKopfId)
						    				set aktionsDet.AktionVon = promotionStart
						    				set aktionsDet.AktionBis = promotionEnd
						    				set aktionsDet.Preis = stueckPreis
						    				do aktionsDet.%Save()
						    				
						    				//Meldung an KAL, dass Preise nicht übereinstimmen	
				    						set preisSeverity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Info()
				    						set todayH = ##class(Base.DateTime).today().toHorolog()
			    							do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, preisSeverity, todayH, abnehmerOid,,, "Aktionspreis für Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" und VZ "_kopf.Abnehmer.Adresse.Name_" angelegt.")
					    				}
				    				}
				    				
			    				} else {
				    				
				    				if ((isKundenspez = 1) && (kundenspezP '= "")) {
					    				
					    				if (isAbDatum = 1) {
						    				set kundenspezP.EngrosPreisAbDatum = stueckPreis	
					    				} else {
						    				set kundenspezP.EngrosPreis = stueckPreis
					    				}
					    				do kundenspezP.%Save()
				    				
				    				} else {
					    			
					    				if (isAbDatum = 1) {
						    				set spezArtikel.EngrosPreisAbDatum = stueckPreis	
					    				} else {
						    				set spezArtikel.EngrosPreis = stueckPreis
					    				}
					    				do spezArtikel.%Save()
				    				}
				    				
				    				//Meldung an KAL, dass Preise nicht übereinstimmen	
				    				set preisSeverity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Warning()
				    				set todayH = ##class(Base.DateTime).today().toHorolog()
			    					do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, preisSeverity, todayH, abnehmerOid,,, "Preise stimmen auf Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" nicht überein. Coop Preis: "_stueckPreis_" eingestellt: "_spezArtPreis)
			    				}
		    				}
		    				set det.Preis = stueckPreis
		    				
		    				
	    				}
	    				
	    				//*******************************************
	    				// LieferantenPreis abgleichen/anlegen
	    				//*******************************************
	    				do ##class(DBAgrofresh.Preis).UpdateLieferantenPreise(abnehmerOid, kopf.Lieferdatum, .spezArtikel)		
	    				
	    				set detailState = det.%Save()
	    				if ($$$ISOK(detailState) = 0) {
		    				//do-while verlassen -> Rollback + Fehler an KAL
		    				set addText = "Detailposition für Artikel "_spezArtikel.Artikel.ArtikelNr_" "_spezArtikel.Artikel.Kurztext_" und Bestellung "_Order.OrderNo_" konnte nicht gespeichert werden."
		    				Quit	
	    				}
	    				
    				} else {
	    				set errorOccured = 1
	    				w "Meldung an KAL, SpezPreis nicht gefunden für VZ und Artikel",!
	    				w "AbnehmerOid: "_abnehmerOid,"BuyerArtNo"_line.BuyerArticleNo
	    				set artikeltext = ""
	    				set keyDesc = ""
	    				do {
		    				set description = line.ItemDescriptions.GetNext(.keyDesc)
		    				if (description '= $$$NULLOREF) {
			    				if (description.Ident = "CU") {
				    				set artikeltext = description.Textline1	
			    				}	
		    				}
		    				
	    				} while (keyDesc '= "")
	    				
		    			set addText = "SpezPreis für Coop Artikel "_line.BuyerArticleNo_" "_artikeltext_" und Bestellung "_Order.OrderNo_" konnte nicht gefunden werden."

	    				Quit	
    				}
    				
    			}
			} while (key '= "")
				
		} else {
			set errorOccured = 1
			w "Nur Meldung an KAL, dass Auftrag nicht angelegt werden konnte",!	
			
		   	set addText = "Auftragskopf für Bestellung "_Order.OrderNo_" konnte nicht angelegt werden."
		}
		
		if (($$$ISOK(kopfState)) && ($$$ISOK(detailState)) && (errorOccured = 0)) {
			TCOMMIT
			set retval = 1
			
			set typ = ##class(Alliance.Common.KAL.Code.MessageType).Lieferung()
			set subTyp = ##class(Alliance.Common.KAL.Code.MessageSubType).BestellungGesplittet()
			set senderTyp = ##class(Alliance.Common.KAL.Code.MessageSenderType).AgrisM()
			set severity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Info()
			set todayH = ##class(Base.DateTime).today().toHorolog()
	   		do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, abnehmerOid,,, "Bestellung "_Order.OrderNo_" eingelesen und aufgeteilt.")
			
		} else {
			w "ROLLBACK"," KopfState: "_kopfState,"DetailState: "_detailState,"ErrorOccured: "_errorOccured,!
			TROLLBACK
			set todayH = ##class(Base.DateTime).today().toHorolog()
		    do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, abnehmerOid,,, addText)
			
			set retval = 0
			
		}
		
	} else {
		//Fehlermeldung an KAL, dass Abnehmer nicht aufgelöst werden konnte
		set todayH = ##class(Base.DateTime).today().toHorolog()
	   	do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, abnehmerOid,,, "Verteilzentrum für Bestellung "_Order.OrderNo_" konnte nicht zugewiesen werden und somit auch keine Bestellung erfasst werden.")
	   	set retval = 0
	}
	Quit retval
]]></Implementation>
</Method>

<Method name="GenerateDesAdv">
<ClassMethod>1</ClassMethod>
<FormalSpec>PlattformAkOid:%String,HeaderSenderId:%String,HeaderRecipientId:%String,Test:%Boolean</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
	// DespatchAdvice
	set desAdv = ##class(Alliance.Common.Model.DespatchAdvice.DespatchAdvice).%New()
	
	//set desAdv.CreatedOnSystem = "AgrisM"
	
	set plattformAK = ##class(DBPlattform.AuftragsKopf).%OpenId(PlattformAkOid)
	
	// Lieferdatum / Zeit von Gesamtlieferschein (Agrofresh.Auftragskopf)
	set daDeliveryDate = ##class(Alliance.Common.Model.Order.EDIDTM).%New()
	set daDeliveryDate.DTType = "191"
	set daDeliveryDate.Format = "204"
	set daDeliveryDate.Data = $ZDATE(plattformAK.DefinitiverAuftrag.Lieferdatum,8)_"000000"
	
	
	set strSQL = "SELECT ID FROM Alliance_Common_Model_Order.Order WHERE OrderNo='"_plattformAK.DefinitiverAuftrag.BestellNr_"' AND ReqDeliveryDate_data %STARTSWITH '"_$EXTRACT(daDeliveryDate.Data,1,8)_"'"
	Set rs = ##class(%Library.ResultSet).%New("%DynamicQuery:SQL")
	
	Do rs.Prepare(strSQL)
	Set sc=rs.Execute()
	set orderId = ""
	
	IF $$$ISOK(sc) {
		if (rs.Next(.sc)) {
			set orderId = rs.Data("ID")
		}
	}
	
	set order = ##class(Alliance.Common.Model.Order.Order).%OpenId(orderId)
	
	set testIndicator = "0"
	if (Test) {
		set testIndicator = "1"
	}
	
	w "--------------------------",!
	w " Selektierte Informationen:",!,!
	w " plattformAK:    "_plattformAK,!
	w " daDeliveryDate: "_daDeliveryDate.Data,!
	w " BestellNr:      "_plattformAK.DefinitiverAuftrag.BestellNr,!
	w " orderId:        "_orderId,!
	w " order:          "_order,!
	w " testIndicator:  "_testIndicator,!
	
	set applicationRef = "DESADV96A006R1"
	set communicationAgrmt = "EANCOM"_order.Buyer.PartyId_order.Supplier.PartyId_"502"
	
	w " applicationRef: "_applicationRef,!
	w " commAgrmt:      "_communicationAgrmt,!
	w "--------------------------",!
	
	set desAdv.EDIHeader = ##class(Alliance.Agris.Logic.Generator).GetDesAdvEDIHeader(HeaderSenderId, HeaderRecipientId, order.Supplier.PartyId, testIndicator, applicationRef, communicationAgrmt)
	
	// Aktueller Timestamp
	set daMsgTimestamp = ##class(Alliance.Common.Model.Order.EDIDTM).%New()
	set daMsgTimestamp.DTType = "137"
	set daMsgTimestamp.Format = "204"
	set daMsgTimestamp.Data = $ZDATE($H,8)_$replace($ztime($piece($h,",",2),1),":","")
	set desAdv.MsgTimestamp = daMsgTimestamp
	
	//set desAdv.ShpDocName = "351"
	//set desAdv.ShpCodeListAgy = "9"
	
	// Lieferschein-Nr von Gesamtlieferschein (Agrofresh.Auftragskopf)
	set desAdv.ShpNo = plattformAK.DefinitiverAuftrag.LieferscheinNr
	
	//set desAdv.ShpMsgFnct = "9"
	
	set desAdv.DeliveryTime = daDeliveryDate
	
	// Bestellnummer Coop
	set desAdv.OrderNo = plattformAK.DefinitiverAuftrag.BestellNr
	
	set desAdv.OrderNoType = "ON"
	
	set desAdv.SAPBusCase = "G"
	
	set desAdv.BuyerInfo = ##class(Alliance.Agris.Logic.Generator).GetDesAdvBuyerInfo(order.Buyer.PartyId, order.Buyer.ReferenceQual,order.Buyer.ReferenceNo)
	
	set desAdv.SupplierInfo = ##class(Alliance.Agris.Logic.Generator).GetDesAdvSupplierInfo(order.Supplier.PartyId, order.Supplier.ReferenceQual, order.Supplier.ReferenceNo)
	
	set desAdv.DeliveryPartyInfo = ##class(Alliance.Agris.Logic.Generator).GetDesAdvDeliveryInfo(order.DeliveryParty.PartyId)
	
	set desAdv.StoreNumberInfo = ""
	
	set desAdv.TransportDetails = ##class(Alliance.Agris.Logic.Generator).GetDesAdvTransportDetails(PlattformAkOid)
	
	set desAdv.PackageInfos = ##class(Alliance.Agris.Logic.Generator).GetDesAdvPackageInfos(PlattformAkOid, orderId)
	
	set statusDesAdv = desAdv.%Save()
	
	if ($$$ISOK(statusDesAdv)) {
		set plattformAK.DesAdvId = desAdv.%Id()
		do plattformAK.%Save()
	}
	
	set typ = ##class(Alliance.Common.KAL.Code.MessageType).DespatchAdvice()
	set subTyp = ##class(Alliance.Common.KAL.Code.MessageSubType).DespatchAdviceErstellt()
	set senderTyp = ##class(Alliance.Common.KAL.Code.MessageSenderType).AgrisM()
	set severity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Info()
	set msgStatus = $$$OK
	set todayH = ##class(Base.DateTime).today().toHorolog()
	do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, plattformAK.Abnehmer.%Id(),,, desAdv.%Id())
	
	
	quit statusDesAdv
]]></Implementation>
</Method>

<Method name="GetDesAdvEDIHeader">
<ClassMethod>1</ClassMethod>
<FormalSpec>SenderId:%String,RecipientId:%String,RoutingAdr:%String,TestIndicator:%String,ApplicationRef:%String,CommunicationAgrmt:%String</FormalSpec>
<ReturnType>Alliance.Common.Model.DespatchAdvice.EDIHeader</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvEDIHeader",!
	
	set header = ##class(Alliance.Common.Model.DespatchAdvice.EDIHeader).%New()
	
	//set header.SyntaxId = "UNOC"
	//set header.SyntaxVer = "3"
	
	// GLN techn. Sender (muss unterschiedlich sein zu SupplierPartyInfo->PartyID)
	set header.SenderId = SenderId  // "7640146110015"
	
	//set header.SenderIdCodeQual = "14"
	
	// GLN techn. Empfänger (muss unterschiedlich sein zu BuyerPartyInfo->PartyID)
	set header.RecipientId = RecipientId  // "7110808000046"
	
	//set header.RecipientIdCodeQual = "14"
	
	// SupplierPartyInfo->PartyId
	set header.RoutingAdr = RoutingAdr
	
	// Erstelldatum Header (Format "YYMMDD")
	set header.InterchangeDate = $EXTRACT($ZDATE($H,8),3,*)
	
	// Erstellzeit Header (Format "HHMM")
	set header.InterchangeTime = $extract($replace($ztime($piece($h,",",2),1),":",""),1,4)
	
	// Fortlaufende, lückenlose Nummer dieses Interchanges pro Empfänger (VZ?)
	set header.InterchangeCtrlRef = $INCREMENT(^AllianceInterchangeCtrlRef)
	
	//  0- 6 = "DesAdv"
	//  7- 9 = "96A"
	// 10-12 = EANCOM Versionsnr der Msg = "006"
	//    13 = Coop Variante = "R"
	//    14 = Coop Version = "1"   
	set header.ApplicationRef = ApplicationRef
	
	//  0- 6 = "EANCOM"
	//  7-19 = GLN Coop
	// 20-32 = GLN Vetragspartner aus EHB = Alliance GLN
	// 33-35 = Version DIA = "502"
	set header.CommunicationAgrmt = CommunicationAgrmt
	
	set header.TestIndicator = TestIndicator
	
	set header.MsgRefNo = "1"
	
	//set header.MsgTypeId = "DESADV"
	
	//set header.MsgTypeVerNo = "D"
	
	//set header.MsgTypeReleaseNo = "96A"
	
	//set header.CntrlAcy = "UN"
	
	//set header.AssocAssCode = "EAN006"
	
	quit header
]]></Implementation>
</Method>

<Method name="GetDesAdvBuyerInfo">
<ClassMethod>1</ClassMethod>
<FormalSpec>GLN:%String,RefQual:%String,RefNo:%String</FormalSpec>
<ReturnType>Alliance.Common.Model.DespatchAdvice.PartyInfo</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvBuyerInfo",!
	
	set buyer = ##class(Alliance.Common.Model.DespatchAdvice.PartyInfo).%New()
	
	set buyer.Type = "BY"
	set buyer.PartyID = GLN
	//set buyer.CodeListRespAgy = "9"
	set buyer.RefQual = RefQual
	set buyer.RefNo = RefNo
	
	w " |   GLN: "_GLN,!
	
	quit buyer
]]></Implementation>
</Method>

<Method name="GetDesAdvSupplierInfo">
<ClassMethod>1</ClassMethod>
<FormalSpec>GLN:%String,RefQual:%String,RefNo:%String</FormalSpec>
<ReturnType>Alliance.Common.Model.DespatchAdvice.PartyInfo</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvSupplierInfo",!
	
	set supplier = ##class(Alliance.Common.Model.DespatchAdvice.PartyInfo).%New()
	
	set supplier.Type = "SU"
	set supplier.PartyID = GLN
	//set supplier.CodeListRespAgy = "9"
	set supplier.RefQual = RefQual
	set supplier.RefNo = RefNo
	
	w " |   GLN: "_GLN,!
	
	quit supplier
]]></Implementation>
</Method>

<Method name="GetDesAdvDeliveryInfo">
<ClassMethod>1</ClassMethod>
<FormalSpec>GLN:%String</FormalSpec>
<ReturnType>Alliance.Common.Model.DespatchAdvice.PartyInfo</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvDeliveryInfo",!
	
	set delivery = ##class(Alliance.Common.Model.DespatchAdvice.PartyInfo).%New()
	
	set delivery.Type = "DP"
	set delivery.PartyID = GLN
	//set delivery.CodeListRespAgy = "9"
	set delivery.RefQual = "PS"
	set delivery.RefNo = ""
	
	w " |   GLN: "_GLN,!
	
	quit delivery
]]></Implementation>
</Method>

<Method name="GetDesAdvTransportDetails">
<ClassMethod>1</ClassMethod>
<FormalSpec>PlattformAkOid:%String</FormalSpec>
<ReturnType>Alliance.Common.Model.DespatchAdvice.TransportDetails</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvTransportDetails",!
	
	set transport = ##class(Alliance.Common.Model.DespatchAdvice.TransportDetails).%New()
	
	//set transport.TransportStage = "20"
	set transport.Mode = "30"
	//set transport.TypeOfTransport = ""
	//set transport.IdentOfTransport = ""
	
	
	quit transport
]]></Implementation>
</Method>

<Method name="GetDesAdvPackageInfos">
<ClassMethod>1</ClassMethod>
<FormalSpec>PlattformAkOid:%String,OrderOid:%String</FormalSpec>
<ReturnType>%Library.ListOfObjects</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvPackageInfos("_PlattformAkOid_","_OrderOid_")",!
	
	set plattformAK = ##class(DBPlattform.AuftragsKopf).%OpenId(PlattformAkOid)
	
	set strSQL = "SELECT COUNT(ID) As Anzahl FROM DBAgrofresh.Auftragspos WHERE Auftragskopf->BestellNr='"_plattformAK.DefinitiverAuftrag.BestellNr_"' AND AnzahlGebinde = 0"
	Set rsCnt = ##class(%Library.ResultSet).%New("%DynamicQuery:SQL")
	
	Do rsCnt.Prepare(strSQL)
	Set scCnt =rsCnt.Execute()
	set anzNuller = 0
	IF $$$ISOK(scCnt) {
		if (rsCnt.Next(.scCnt)) {
			set anzNuller = rsCnt.Data("Anzahl")
		}		
	}

	//set strSQL = "SELECT ID FROM DBAgrofreshEK.Bestellungspos WHERE Bestellungskopf->BestellNrAbnehmer='"_plattformAK.DefinitiverAuftrag.BestellNr_"'"
	set strSQL = "SELECT ID, Artikel FROM DBAgrofresh.Auftragspos WHERE Auftragskopf->BestellNr='"_plattformAK.DefinitiverAuftrag.BestellNr_"' AND AnzahlGebinde <> 0 ORDER BY PositionsNr"
	Set rs = ##class(%Library.ResultSet).%New("%DynamicQuery:SQL")
	
	Do rs.Prepare(strSQL)
	Set sc=rs.Execute()
	set orderId = ""
	Set list=##class(%Library.ListOfObjects).%New()
	set count = 2
	set countSSCCs = 0
	set cntLins = (1 + anzNuller)
	
	IF $$$ISOK(sc) {
		while(rs.Next(.sc)) {
			set auftPosOid = rs.Data("ID")
			set auftPosArtikelOid = rs.Data("Artikel")
			
			set strSQLBest = "SELECT ID, SSCCInfo_SSCC, SSCCInfo_AnzahlGebinde FROM DBAgrofreshEK.Bestellungspos_SSCCInfo WHERE Bestellungspos->Artikel='"_auftPosArtikelOid_"' AND Bestellungspos->Bestellungskopf->BestellNrAbnehmer='"_plattformAK.DefinitiverAuftrag.BestellNr_"' AND Bestellungspos->AnzahlGebinde <> 0 ORDER BY Bestellungspos->AnzahlGebinde DESC"
			Set rsBest = ##class(%Library.ResultSet).%New("%DynamicQuery:SQL")
	
			Do rsBest.Prepare(strSQLBest)
			Set scBest=rsBest.Execute()
			IF $$$ISOK(scBest) {
				while(rsBest.Next(.scBest)) {
					set bestPosOid = rsBest.Data("ID")
					set ssccNo = rsBest.Data("SSCCInfo_SSCC")
					set ssccAnzGebinde = rsBest.Data("SSCCInfo_AnzahlGebinde")
			
					set package = ##class(Alliance.Common.Model.DespatchAdvice.PackageInfo).%New()
	
					set package.HierarchyNo = count
					set package.ParentHryNo = "1"
	
					set package.PackageUnits = ##class(Alliance.Agris.Logic.Generator).GetDesAdvPackageUnits(ssccNo)
					set countSSCCs = countSSCCs + package.PackageUnits.Count()
					set package.Items = ##class(Alliance.Agris.Logic.Generator).GetDesAdvItemDetails(auftPosOid, OrderOid, cntLins, ssccAnzGebinde)
					set cntLins = cntLins + 1
	
					do list.Insert(package)
					set count = count + 1
				}
			}
		}
		
		set packageHeader = ##class(Alliance.Common.Model.DespatchAdvice.PackageInfo).%New()
		set packageHeader.HierarchyNo = "1"
		set packageHeader.ParentHryNo = ""
		set listUnits = ##class(%Library.ListOfObjects).%New()
		set unit = ##class(Alliance.Common.Model.DespatchAdvice.PackageUnit).%New()
		set unit.Count = countSSCCs
		set unit.Level = ""
		set unit.Type = ""
		set unit.SSCCNo = ""
		do listUnits.Insert(unit)
		set packageHeader.PackageUnits = listUnits
		
		//LINS mit QTY 0 hinzufügen
		set strSQL = "SELECT ID FROM DBAgrofresh.Auftragspos WHERE Auftragskopf->BestellNr='"_plattformAK.DefinitiverAuftrag.BestellNr_"' AND AnzahlGebinde = 0 ORDER BY PositionsNr"
		Set rs = ##class(%Library.ResultSet).%New("%DynamicQuery:SQL")
	
		Do rs.Prepare(strSQL)
		Set sc=rs.Execute()
		Set listNullLins = ##class(%Library.ListOfObjects).%New()
		set countNullLins = 1
		
		IF $$$ISOK(sc) {
			while(rs.Next(.sc)) {
				set auftPosOidNuller = rs.Data("ID")
				
				set tmpList = ##class(Alliance.Agris.Logic.Generator).GetDesAdvItemDetails(auftPosOidNuller, OrderOid, countNullLins, 0)
				do listNullLins.Insert(tmpList.GetAt(1))
				
				
				set countNullLins = countNullLins + 1
			
			}
		}
		set packageHeader.Items = listNullLins
		
		do list.InsertAt(packageHeader,1)
		
		
	}
	w " |   List: "_list,!
	
	quit list
]]></Implementation>
</Method>

<Method name="GetDesAdvPackageUnits">
<ClassMethod>1</ClassMethod>
<FormalSpec>SSCCNo:%String</FormalSpec>
<ReturnType>%Library.ListOfObjects</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvPackageUnits",!
	
	set listUnits = ##class(%Library.ListOfObjects).%New()
	
	set unit = ##class(Alliance.Common.Model.DespatchAdvice.PackageUnit).%New()

	set unit.Count = "1"
	set unit.Level = "3"
	set unit.Type = "08"
	set unit.SSCCNo = SSCCNo
	//bestellpos.SSCCInfo.GetAt(countSSCC).SSCC

	do listUnits.Insert(unit)
	
	w " |   Anzahl Units: "_listUnits.Count(),!
	
	quit listUnits
]]></Implementation>
</Method>

<Method name="GetDesAdvItemDetails">
<ClassMethod>1</ClassMethod>
<FormalSpec>AuftPosOid:%String,OrderOid:%String,CntLins:%Integer,AnzahlGebinde:%Integer</FormalSpec>
<ReturnType>%Library.ListOfObjects</ReturnType>
<Implementation><![CDATA[
	w " |",!
	w " +-- GetDesAdvItemDetails",!
	
	set itemDetails = ##class(%Library.ListOfObjects).%New()
	set count = 0

	set auftPos = ##class(DBAgrofresh.Auftragspos).%OpenId(AuftPosOid)
	w " |       Order-Oid: "_OrderOid,!
	w " |       Barcode: "_auftPos.SpezPreis.Barcode,!
	set orderLineOid = ##class(Alliance.Agris.Logic.Generator).GetLineOidFromOrderLine(OrderOid,auftPos.SpezPreis.KundenSpezArtNr)
	set orderLine = ##class(Alliance.Common.Model.Order.OrderLine).%OpenId(orderLineOid)
	
	w " |       Order-Line-Oid: "_orderLineOid,!
	
	set item = ##class(Alliance.Common.Model.DespatchAdvice.ItemDetails).%New()
	set item.LineNo = CntLins
	set item.ItemNo = auftPos.SpezPreis.Barcode
	//set item.ItemNoType = "EN"
	set item.Subline = ""
	set item.LineNoRef = ""
	//set item.Configuration = ""
	set item.SAPItemNo = auftPos.SpezPreis.KundenSpezArtNr
	// immer in Gebinde zurückgeben, da alles Gebinde EANs in Agris eingestellt werden
	set item.Quantity = AnzahlGebinde
	if (orderLine.OrderedQtyUoM = "PCE") {
		
		set gebindeEinheit = ""
	   	set keyDesc = ""
	    do {
			set description = orderLine.ItemDescriptions.GetNext(.keyDesc)
		    if (description '= $$$NULLOREF) {
				if (description.Type = "F") {
					set gebindeEinheit = description.Textline2	
			   	}	
		    }
		} while (keyDesc '= "")
	    				
		set item.QuantityUoM = gebindeEinheit
		w " |       Einheit Stück, Menge: "_item.Quantity,!
	} else {
		set item.QuantityUoM = orderLine.OrderedQtyUoM
		w " |       Einheit Gebinde, Menge: "_item.Quantity,!
	}
	set item.QuantityQual = "12"
	
	//set item.BestBefore = ""
	set item.OrderItemNo = orderLine.LineNo
	//set item.MarkingInstruction = ""
	//set item.BatchNo = ""
	
	
	do itemDetails.Insert(item)
	
	w " |   Anzahl Items: "_itemDetails.Count(),!
	
	quit itemDetails
]]></Implementation>
</Method>

<Method name="GetLineOidFromOrderLine">
<ClassMethod>1</ClassMethod>
<FormalSpec>OrderOid:%String,BuyerArticleNo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
	set strSQL = "SELECT ID FROM Alliance_Common_Model_Order.OrderLine l WHERE l.Order='"_OrderOid_"' AND l.BuyerArticleNo='"_BuyerArticleNo_"'"
	Set rs = ##class(%Library.ResultSet).%New("%DynamicQuery:SQL")

	Do rs.Prepare(strSQL)
	Set sc=rs.Execute()
	set orderId = ""

	IF $$$ISOK(sc) {
		if (rs.Next(.sc)) {
			set orderId = rs.Data("ID")
		}
	}

	quit orderId
]]></Implementation>
</Method>

<Method name="test">
<ClassMethod>1</ClassMethod>
<Implementation><![CDATA[
	set typ = ##class(Alliance.Common.KAL.Code.MessageType).DespatchAdvice()
	set subTyp = ##class(Alliance.Common.KAL.Code.MessageSubType).DespatchAdviceErstellt()
	set senderTyp = ##class(Alliance.Common.KAL.Code.MessageSenderType).AgrisM()
	set severity = ##class(Alliance.Common.KAL.Code.MessageSeverity).Info()
	set msgStatus = $$$OK
	set todayH = ##class(Base.DateTime).today().toHorolog()
	do ##class(Alliance.Common.KAL.Message).new(.msgStatus, typ, subTyp, senderTyp, severity, todayH, "",,, "AgrisM||1")
]]></Implementation>
</Method>
</Class>


<Class name="Alliance.Agris.Logic.Qry">
<Super>%RegisteredObject</Super>
<TimeChanged>61831,63922.107383</TimeChanged>
<TimeCreated>61831,63922.107383</TimeCreated>

<Query name="OrdersByDate">
<Type>%SQLQuery</Type>
<SqlQuery><![CDATA[	SELECT ID, 
			OrderNo,
			DocumentDateTime_Data AS DocumentDateTime,
			ReqDeliveryDate_Data AS ReqDeliveryDate,
			DeliveryParty->Name1,
			DeliveryParty->Name2,
			DeliveryParty->ZIPCode,
			DeliveryParty->City,
			(SELECT Count(ID) FROM Alliance_Common_Model_Order.OrderLine ol WHERE ol."Order" = o.ID) As AnzLines,
			(SELECT ID FROM DBPlattform.Auftragskopf ak WHERE ak.BestellNr=o.OrderNo) As AuftragskopfOid
	FROM Alliance_Common_Model_Order."Order" o
	ORDER BY ReqDeliveryDate DESC, OrderNo]]></SqlQuery>
</Query>
</Class>
</Export>
