} //AddItem //----------------------------------------------------------------------------------------------// private void DestroyAllObjects() { if (conData != null) { Marshal.FinalReleaseComObject(conData); conData = null; }//If if (currData != null) { Marshal.FinalReleaseComObject(currData); currData = null; }//If if (sopPost != null) { Marshal.FinalReleaseComObject(sopPost); sopPost = null; }//If if (sopItem != null) { Marshal.FinalReleaseComObject(sopItem); sopItem = null; }//If if (stockRecord != null) { Marshal.FinalReleaseComObject(stockRecord); stockRecord = null; }//If if (ws != null) { ws.Disconnect(); Marshal.FinalReleaseComObject(ws); ws = null; }//If if (sdo != null) { Marshal.FinalReleaseComObject(sdo); sdo = null; } //If } //DestroyAllObjects
}//CTOR //----------------------------------------------------------------------------------------------// public bool Post() { try { //Connect and create. sdo = new SDOEngine(); ws = sdo.Workspaces.Add("App Server"); ws.Connect(setUsr.sageDBDir, setUsr.sageUsername, setUsr.sagePassword, "Unique"); salesRecord = (SalesRecord)ws.CreateObject("SalesRecord"); conData = (ControlData)ws.CreateObject("ControlData"); currData = (CurrencyData)ws.CreateObject("CurrencyData"); sopPost = (SopPost)ws.CreateObject("SOPPost"); //Unwrap order. string cusCode = order.Customer.Code; OrderType type = order.type; List <Models.Product> productList = order.ProductList; //Create a saleRecord with comboAccRef.Text and look for it in database. SDOHelper.Write(salesRecord, "ACCOUNT_REF", cusCode); if (salesRecord.Find(false)) { //Check Account Status here. short accStatus = (short)SDOHelper.Read(salesRecord, "ACCOUNT_STATUS"); if (accStatus != 0) { throw new MyException("Customer " + order.Customer.Code + "'s account is on hold."); } short defTaxCode = (short)SDOHelper.Read(salesRecord, "DEF_TAX_CODE"); string taxRateField = "T" + defTaxCode + "_Rate"; defTaxRate = (double)SDOHelper.Read(conData, taxRateField); currencyCode = (sbyte)SDOHelper.Read(salesRecord, "CURRENCY") + 1; //If customer exists add details to sopPostHeader. SDOHelper.Write(sopPost.Header, "ACCOUNT_REF", SDOHelper.Read(salesRecord, "ACCOUNT_REF")); SDOHelper.Write(sopPost.Header, "NAME", SDOHelper.Read(salesRecord, "NAME")); //Add each address line to header for (int i = 1; i <= 5; i++) { SDOHelper.Write(sopPost.Header, "ADDRESS_" + i, SDOHelper.Read(salesRecord, "ADDRESS_" + i)); }//For if (order.DeliveryAddress != null) { var deliveryAddress = order.DeliveryAddress; SDOHelper.Write(sopPost.Header, "DEL_ADDRESS_1", RestrictLength(deliveryAddress.Line1)); SDOHelper.Write(sopPost.Header, "DEL_ADDRESS_2", RestrictLength(deliveryAddress.Line2)); SDOHelper.Write(sopPost.Header, "DEL_ADDRESS_3", RestrictLength(deliveryAddress.Line3)); SDOHelper.Write(sopPost.Header, "DEL_ADDRESS_4", RestrictLength(deliveryAddress.Line4)); SDOHelper.Write(sopPost.Header, "DEL_ADDRESS_5", RestrictLength(deliveryAddress.Line5)); }//If //Add date and customer O/N to header SDOHelper.Write(sopPost.Header, "ORDER_DATE", DateTime.Now); SDOHelper.Write(sopPost.Header, "CUST_ORDER_NUMBER", order.CustomerOrderNumber); SDOHelper.Write(sopPost.Header, "CARR_NOM_CODE", ((int)setUsr.carrNomCode).ToString()); SDOHelper.Write(sopPost.Header, "CARR_NET", order.Carriage); //Check if we are entering an order for a foreign customer. if (currencyCode != baseCurrencyCode) { taxCode = (short)setUsr.taxCodeForeign; SDOHelper.Write(sopPost.Header, "CARR_TAX_CODE", (short)taxCode); currData.Read(currencyCode); //Populate Foreign Currency Fields SDOHelper.Write(sopPost.Header, "FOREIGN_RATE", SDOHelper.Read(currData, "EXCHANGE_RATE")); SDOHelper.Write(sopPost.Header, "CURRENCY", SDOHelper.Read(salesRecord, "CURRENCY")); SDOHelper.Write(sopPost.Header, "CURRENCY_USED", SDOHelper.Read(salesRecord, "CURRENCY")); } else { taxCode = (short)setUsr.taxCode; SDOHelper.Write(sopPost.Header, "CARR_TAX_CODE", (short)taxCode); }//Else //Check if its a quote or not if (type == OrderType.QUOTE) { // Populate details to generate quote SDOHelper.Write(sopPost.Header, "ORDER_TYPE", (byte)InvoiceType.sdoSopQuote); SDOHelper.Write(sopPost.Header, "QUOTE_STATUS", (byte)QuoteStatus.sdoOpen); }//If //Any notes var notes = order.Notes; if (!string.IsNullOrWhiteSpace(notes)) { var len = notes.Length; //Split the note up if it's too long SDOHelper.Write(sopPost.Header, "NOTES_1", RestrictLength(order.Notes.Substring(0, Math.Min(len, MAX_LENGTH_NOTE)))); if (len > MAX_LENGTH_NOTE) { SDOHelper.Write(sopPost.Header, "NOTES_2", RestrictLength(order.Notes.Substring(MAX_LENGTH_NOTE, Math.Min(len, 2 * MAX_LENGTH_NOTE)))); } if (len > 2 * MAX_LENGTH_NOTE) { SDOHelper.Write(sopPost.Header, "NOTES_3", RestrictLength(order.Notes.Substring(2 * MAX_LENGTH_NOTE, Math.Min(len, 3 * MAX_LENGTH_NOTE)))); } }//If //Add discount rate (usually 0). cusDiscountRate = (double)SDOHelper.Read(salesRecord, "DISCOUNT_RATE"); //Add each product to sopPost items section. foreach (Models.Product product in productList) { AddItem(product, ws); }//ForEach //Add username SDOHelper.Write(sopPost.Header, "TAKEN_BY", GetTakenBy()); //Update: will fail if not set up properly if (!sopPost.Update()) { return(false); } else { return(true); } } else { throw new MyException("Customer " + order.Customer.Code + " does not seem to exist."); }//Else } catch (MyException mE) { throw new MyException(mE.Message); } catch (Exception e) { throw new MyException("Problem posting order to database " + e.GetType().Name + ":" + e.Message); } finally { DestroyAllObjects(); } //Finally } //Post