///////////////////////////////////////////////////////////
// X08_SAP_Objednavky.cs
// Implementation of the Class X08_SAP_Objednavky
// Created on: 1.6.2009
// Original author: Miroslav Brousek
///////////////////////////////////////////////////////////
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using KZ.SapNeos.Engine.Resources;
using KZ.SapNeos.Engine.Exceptions;
using KZ.SapNeos.Engine.Transactions;
using KZ.SapNeos.Engine.Data;
using KZ.SapNeos.Engine.Alerts;
using KZ.SapNeos.WebServices.SAP.ZNEOS_ALL;
namespace KZ.SapNeos.Engine.DataExchange
{
///
/// Třída zajišťující zápis dat objednávek z interní DB
/// do cílového systému (SAP) prostřednictvím určeného rozhraní ..... .
/// Načtení musí být uskutečněno v rámci spuštěné transakce.
/// Odkaz na spuštěnou transakci se předává parametrem konstruktoru.
///
class X08_SAP_Objednavky
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Konstruktory a "destruktor" Dispose.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
public X08_SAP_Objednavky(SITransaction Transaction) { this.InitComponents(Transaction); }
///
/// Uvolnění prostředků alokovaných třídou.
///
public void Dispose() { this.DoneComponents(); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Public properties & methods
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal Properties & methods
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
internal string CurrentOrderNo { get {return _CurrentOrderNo; }}
///
/// Zapíše data načtená do DB v rámci spuštěné transakce do cílového systému (SAP)
/// prostřednictvím služby rozhraní SR07
///
internal void Write(bool AllRecs) { this.doWrite(AllRecs); }
internal void Commit() { this.doCommit(); }
internal void Rollback(string ErrorMessage) { this.doRollback(ErrorMessage); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private properties & attributes declaration
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ---- Private attributes ------------------------------------------------------------------------------------
private SIExceptions _Exceptions = SIExceptions.Instance;
private SITransaction _Transaction;
private KZ.SapNeos.Engine.Data.Objednavka _ObjednavkaNeOS;
private KZ.SapNeos.Engine.Data.Objednavka _ObjednavkaResponse;
private ZNEOS_ALL _WebService;
private ArrayList _Headers;
private ArrayList _Items;
private KZ_PurchaseOrdersNeOS_INResponse _WebServiceResponse;
private KZ_PurchaseOrdersNeOS_IN _Orders;
private ObjednavkaIOResult _ObjednavkaIOResult;
private string _CurrentOrderNo;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private methods implementations
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ---- Public properties Get.. & Set.. methods ---------------------------------------------------------------
// ---- Internal properties Get.. & Set.. methods -------------------------------------------------------------
// ---- Private metods implementation -------------------------------------------------------------------------
private void InitComponents(SITransaction Transaction)
{
_Transaction = Transaction;
if (_Transaction == null)
_Exceptions.ThrowException(802, SIResourceStrings.sE0802_TransactionIDMissing);
if (_Transaction.TransactionState != TransactionStates.Running)
_Exceptions.ThrowException(803, SIResourceStrings.sE0803_TransactionIsNotActive);
_ObjednavkaNeOS = new KZ.SapNeos.Engine.Data.Objednavka();
_ObjednavkaResponse = new KZ.SapNeos.Engine.Data.Objednavka();
_Orders = new KZ_PurchaseOrdersNeOS_IN();
if (SISetup.Instance.Echo || SISetup.Instance.Test || SISetup.Instance.ReadOnly)
_Orders.I_FCODE = "99";
else
_Orders.I_FCODE = "01";
_Orders.I_TRANS_ID = _Transaction.TransactionID.ToString();
_WebService = new ZNEOS_ALL();
_WebService.Url = SISetup.Instance.SAP_ZNeosServiceURL;
_WebService.Credentials = new NetworkCredential(SISetup.Instance.SAPServiceUserName, SISetup.Instance.SAPServicePswd);
_WebService.Timeout = SISetup.Instance.SAPServiceTimeout;
_Headers = new ArrayList();
_Items = new ArrayList();
_ObjednavkaIOResult = new ObjednavkaIOResult();
_ObjednavkaIOResult.UID_Transaction = _Transaction.TransactionID;
}
private void DoneComponents()
{
try
{
if (_Items != null)
_Items.Clear();
if (_Headers != null)
_Headers.Clear();
if (_WebService != null)
_WebService.Dispose();
if (_ObjednavkaNeOS != null)
_ObjednavkaNeOS.Dispose();
if (_ObjednavkaResponse != null)
_ObjednavkaResponse.Dispose();
if (_ObjednavkaIOResult != null)
_ObjednavkaIOResult.Dispose();
}
catch (Exception e)
{
if (_Exceptions != null)
_Exceptions.HandleException(e);
}
finally
{
_ObjednavkaIOResult = null;
_ObjednavkaNeOS = null;
_ObjednavkaResponse = null;
_WebService = null;
_Items = null;
_Headers = null;
}
}
private void addHeader(string ID)
{
ZINV_HEADER Header = new ZINV_HEADER();
Header.INTID = "SR08";
Header.OBJID = ID.Trim();
Header.TSTMP = SIDateUtils.ToSAPDate(DateTime.Now);
_Headers.Add(Header);
}
private void addItem(string ID, string Key, string Value)
{
if (Value != null)
{
ZINV_ITEM Item = new ZINV_ITEM();
Item.INTID = "SR08";
Item.OBJID = ID.Trim();
Item.PARNA = Key.Trim();
Item.PARVA = Value.Trim();
_Items.Add(Item);
}
}
private void fillCurrentRec()
{
this.addHeader(_ObjednavkaNeOS.CisloPor);
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.cenamj", _ObjednavkaNeOS.CenaMJ.ToString().Replace(',', '.'));
this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.cislopor", _ObjednavkaNeOS.CisloPor );
// this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.cislopor", this.getCisloPor());
this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.datum", SIDateUtils.ToSAPDate(_ObjednavkaNeOS.Datum));
this.addItem(_ObjednavkaNeOS.CisloPor, "catsupplier.id_biztran", _ObjednavkaNeOS.ID_BizTran );
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.idcatitem", _ObjednavkaNeOS.IDCatItem );
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.ssup", _ObjednavkaNeOS.Sup );
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.sean", _ObjednavkaNeOS.EAN );
this.addItem(_ObjednavkaNeOS.CisloPor, "oddeleni.kod", _ObjednavkaNeOS.Kod );
this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.odber", _ObjednavkaNeOS.Odber);
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.sSubSumObj", _ObjednavkaNeOS.SubSumObj);
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.typKoduPolozky", _ObjednavkaNeOS.TypKoduPolozky);
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.mj", _ObjednavkaNeOS.MJ );
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.mnozstvi", _ObjednavkaNeOS.Mnozstvi.ToString().Replace(',', '.'));
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.nazev", _ObjednavkaNeOS.Nazev );
this.addItem(_ObjednavkaNeOS.CisloPor, "catsupplier.SAP_KodDod", _ObjednavkaNeOS.SAP_KodDod );
this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.SAP_SkupMat", _ObjednavkaNeOS.SAP_SkupMat );
// this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.zakazka", _ObjednavkaNeOS.Zakazka );
this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.zpracovatel", _ObjednavkaNeOS.Zpracovatel );
}
private void fillData()
{
_Items.Clear();
_Headers.Clear();
bool Continue = _ObjednavkaNeOS.First();
while (Continue)
{
this.fillCurrentRec();
Continue = _ObjednavkaNeOS.Next();
}
}
///
/// Volání služby pro zápis dat do cílového systému.
/// Při výjimce opakuje tři pokusy.
///
private void callService()
{
_Orders.IT_HEADERS = (ZINV_HEADER[])_Headers.ToArray(typeof(ZINV_HEADER));
_Orders.IT_ITEMS = (ZINV_ITEM[])_Items.ToArray(typeof(ZINV_ITEM));
Exception CurrentException = null;
int Attempt = 0;
bool OK = false;
while ((!OK) && (Attempt < SISetup.Instance.MaxAttempts))
{
try
{
_WebServiceResponse = _WebService.KZ_PurchaseOrdersNeOS_IN(_Orders);
OK = true;
}
catch (Exception e)
{
// Zaznamená pouze první výjimku, následná již můžre být touto ovlivněna a tudíž nevypovídající
if (CurrentException == null)
CurrentException = e;
Attempt++;
_Transaction.Warning(String.Format(SIResourceStrings.sW0801_CallServiceAtemptFailed, e.Message, Attempt));
}
}
if (!OK)
{
if (CurrentException != null)
throw CurrentException;
else
throw new SIException(804, SIResourceStrings.sE0804_CallSAPWebServiceError);
}
}
private void addResponseItem(ZINV_ITEM Item)
{
if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_TYP")
_ObjednavkaResponse.SAP_Typ = Item.PARVA;
else if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_OBJEKT")
_ObjednavkaResponse.SAP_Objekt = Item.PARVA;
else if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_POLOZKA")
_ObjednavkaResponse.SAP_Polozka = Item.PARVA;
else if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_CENA")
// _ObjednavkaResponse.SAP_Cena = Convert.ToDecimal(Item.PARVA.Replace('.',','));
_ObjednavkaResponse.SAP_Cena = Convert.ToDecimal(Item.PARVA);
}
///
/// Zapíše do DB vrácené hodnoty.
///
private void updateReturnValues()
{
if (_WebServiceResponse != null)
{
_ObjednavkaResponse.UID_Transaction = _Transaction.TransactionID;
_ObjednavkaResponse.Init();
foreach (ZINV_ITEM Item in _WebServiceResponse.ET_ITEMS)
{
if ((_ObjednavkaResponse.CisloPor != null) && (Item.OBJID != _ObjednavkaResponse.CisloPor))
_ObjednavkaResponse.Write();
_ObjednavkaResponse.CisloPor = Item.OBJID;
this.addResponseItem(Item);
}
if (_ObjednavkaResponse.CisloPor != null)
_ObjednavkaResponse.Write();
}
}
///
/// Zapíše do DB výsledky přenosu.
///
private void updateResults()
{
if (_WebServiceResponse != null)
{
foreach (ZINV_BAPIRET_S Result in _WebServiceResponse.ET_RETURN)
{
_ObjednavkaIOResult.MarkResult(Result.OBJID, Result);
}
}
}
///
/// Zkontroluje výsledek přenosu a v případě chyby odešle výstrahu.
///
private void checkResults()
{
string AlertText = "";
if (_WebServiceResponse != null)
{
foreach (ZINV_BAPIRET_S Result in _WebServiceResponse.ET_RETURN)
{
if (Result.TYPE.Trim().ToUpper() == "E")
AlertText += "E: " + Result.OBJID.Trim() + " - " + Result.MESSAGE.Trim() + Environment.NewLine;
}
}
if (AlertText != "")
{
KZ.SapNeos.Engine.Alerts.Alert ExchangeAlert = new KZ.SapNeos.Engine.Alerts.Alert();
try
{
ExchangeAlert.Kind = AlertKinds.DataFailure;
ExchangeAlert.Header = SIResourceStrings.sAlertDataErrorLabel + SIResourceStrings.sAlertOrders2;
ExchangeAlert.Body = SIResourceStrings.sAlertOrdersDataErrorHeader + Environment.NewLine +
Environment.NewLine + AlertText +
Environment.NewLine + SIResourceStrings.sAlertOrdersDataErrorFooter;
ExchangeAlert.Send();
}
finally
{
ExchangeAlert.Dispose();
}
}
}
private void doWriteAll()
{
_ObjednavkaNeOS.UID_Transaction = _Transaction.TransactionID;
//Chkpt 01 - Fill data
_Transaction.CheckPoint(SIResourceStrings.sTM0811_SAPReadingData);
this.fillData();
//Chkpt 02 - Call WebService
_Transaction.CheckPoint(SIResourceStrings.sTM0812_SAPCallServiceStart);
throw new Exception("Zkus");
this.callService();
//Chkpt 03 - Updating response
_Transaction.CheckPoint(SIResourceStrings.sTM0813_SAPUpdatingResults);
this.updateResults();
//Chkpt 04 - Updating returned values
_Transaction.CheckPoint(SIResourceStrings.sTM0814_SAPUpdatingReturnValues);
this.updateReturnValues();
//Chkpt 05 - Checking results
_Transaction.CheckPoint(SIResourceStrings.sTM0816_SAPCheckingResults);
this.checkResults();
//Chkpt 05 - Data reading finished
_Transaction.CheckPoint(SIResourceStrings.sTM0815_SAPDataTransferFinishedAll);
}
private void doSendOrder()
{
try
{
this.callService();
this.updateResults();
this.updateReturnValues();
this.checkResults();
}
finally
{
_Items.Clear();
_Headers.Clear();
}
_Transaction.CheckPoint(String.Format(SIResourceStrings.sTM0815_SAPDataTransferFinishedOne, _CurrentOrderNo));
}
private void doWritePerPartes()
{
_Transaction.CheckPoint(SIResourceStrings.sTM0811_SAPReadingData);
_ObjednavkaNeOS.UID_Transaction = _Transaction.TransactionID;
_CurrentOrderNo = "";
_Items.Clear();
_Headers.Clear();
//Do SQL pro načtení bylo 13.1.2011 doplněno "ORDER BY CisloNeOS",
//takže by měly záznamy jedné objednávky chodit "vcelku" zasebou.
bool Continue = _ObjednavkaNeOS.First();
while (Continue)
{
if (_CurrentOrderNo != _ObjednavkaNeOS.CisloNeOS)
{
if (_CurrentOrderNo != "")
doSendOrder();
_CurrentOrderNo = _ObjednavkaNeOS.CisloNeOS;
}
this.fillCurrentRec();
Continue = _ObjednavkaNeOS.Next();
}
if (_CurrentOrderNo != "")
doSendOrder();
}
///
/// Zápis dat do cílového systému.
/// Data se zapisují po jednotlivých záznamech.
/// Výsledek každého volání služby se dokumentuje v DB.
///
private void doWrite(bool AllRecs)
{
if (AllRecs)
doWriteAll();
else
doWritePerPartes();
}
private void doCommit()
{
XX_SAP_TransConfirmation TransConfirmation = new XX_SAP_TransConfirmation(_Transaction);
try
{
TransConfirmation.Commit();
}
finally
{
TransConfirmation.Dispose();
}
}
private void doRollback(string ErrorMessage)
{
XX_SAP_TransConfirmation TransConfirmation = new XX_SAP_TransConfirmation(_Transaction);
try
{
TransConfirmation.Rollback(ErrorMessage);
}
finally
{
TransConfirmation.Dispose();
}
}
// ------------------------------------------------------------------------------------------------------------
}
}