/ Published in: C#
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
/* This function has been delivered by coresystems ag as a sample. This sample has been tested with a SAP Business One demo database and is delivered without further warranties. ***** Description: ***** Name: Get UPS live rates This rule gather the total order weight as well as the ship to address and fills in the live ship costs from UPS. NOTES: 1. Package max weight is 150LB 2. make sure the ship from address (taken from the company address) is within the US ***** Parameters: ***** This function does not contain any parameters. ***** External DLLs: ***** in order to use the rule you will need to copy the following dlls: UPSrates.XmlSerializers.dll UPSrates.dll into the following directory: C:\Program Files (x86)\SAP\SAP Business One\AddOns\COR\coresuite\COR_Customize\DLL ***** Function source code: ***** */ try { SwissAddonFramework.Messaging.StatusBar.WriteSucess("Getting live rates started please wait while contacting UPS rates service..."); // GET COMPANY OBJEKT AND STORE IN VARIABLE comp SAPbobsCOM.Company comp = (SAPbobsCOM.Company) SwissAddonFramework.B1Connector.GetB1Connector().Company; // GET EMTPY PO AND SAVE IN prodOrder SAPbobsCOM.Items vItem = (SAPbobsCOM.Items) comp.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oItems); UPSrates.RateWebReference.UPSSecurityServiceAccessToken upssSvcAccessToken = new UPSrates.RateWebReference.UPSSecurityServiceAccessToken(); upssSvcAccessToken.AccessLicenseNumber = "0C69CC8370856078"; upss.ServiceAccessToken = upssSvcAccessToken; UPSrates.RateWebReference.UPSSecurityUsernameToken upssUsrNameToken = new UPSrates.RateWebReference.UPSSecurityUsernameToken(); upssUsrNameToken.Username = "coresuite"; upssUsrNameToken.Password = "vista7"; upss.UsernameToken = upssUsrNameToken; rate.UPSSecurityValue = upss; String[] requestOption = { "shop" }; request.RequestOption = requestOption; rateRequest.Request = request; System.Data.SqlClient.SqlCommand SqlCmd; string street = ""; string city =""; string zipcode = ""; string state = ""; string country = ""; string CardCode = ((TextEdit) pVal.Form.Items["4"]).Value; string AddName = ((ComboBox) pVal.Form.Items["40"]).Value; string SqlTxt = ""; bool useUIAddress = false; if (useUIAddress) { try { //Read ship-to address pVal.Form.Freeze(true); Folder.GetFromUID(pVal.Form, "114").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); Button.GetFromUID(pVal.Form, "10002101").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); Form ActiveForm = Form.GetFormFromUID(customize.B1Connector.GetB1Connector().Application.Forms.ActiveForm.UniqueID); Matrix mtxRows = Matrix.GetFromUID(ActiveForm, "10000003"); street = mtxRows.GetValue("10000003", 0); city = mtxRows.GetValue("10000011", 0); zipcode = mtxRows.GetValue("10000013", 0); state = mtxRows.GetValue("10000017", 0); country = mtxRows.GetValue("10000019", 0); // close address form Button.GetFromUID(ActiveForm, "10000001").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); Folder.GetFromUID(pVal.Form, "112").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); } catch (Exception ex) { SwissAddonFramework.Messaging.StatusBar.WriteError(ex.Message); } finally { pVal.Form.Freeze(false); } } else { SqlTxt = "SELECT T1.[Street], T1.[City], T1.[State],T1.[ZipCode], T1.[Country] FROM[dbo].[CRD1] T1 WHERE T1.[Address] = '" + AddName + "' AND T1.[CardCode] = '" + CardCode + "' AND T1.[AdresType] = 'S'"; //SqlCmd.Parameters.AddWithValue("@CardCode", CardCode); //SqlCmd.Parameters.AddWithValue("@AddName", AddName); System.Data.SqlClient.SqlDataReader addrSdr = customize.B1Connector.GetB1Connector().ExecuteQuery(SqlCmd); if(addrSdr.Read()) { street = addrSdr[0].ToString(); city = addrSdr[1].ToString(); state = addrSdr[2].ToString(); zipcode = addrSdr[3].ToString(); country = addrSdr[4].ToString(); } } SwissAddonFramework.Messaging.StatusBar.WriteSucess("Ship-To Address:" + AddName + ":" + CardCode + ": " + street + " " + city + " " + state + " " + zipcode + " " + country); // read ship-from address string companyStreet = ""; string companyZipCode = ""; string companyCity = ""; string companyState = ""; string companyCountry = ""; SqlCmd = new System.Data.SqlClient.SqlCommand("SELECT Street, ZipCode, City, State, Country FROM ADM1"); System.Data.SqlClient.SqlDataReader sdr = customize.B1Connector.GetB1Connector().ExecuteQuery(SqlCmd); if(sdr.Read()) { companyStreet = sdr[0].ToString(); companyZipCode = sdr[1].ToString(); companyCity = sdr[2].ToString(); companyState = sdr[3].ToString(); companyCountry = sdr[4].ToString(); } shipper.ShipperNumber = "1"; //Shipper's shipper number String[] addressLine = { companyStreet }; shipperAddress.AddressLine = addressLine; shipperAddress.City = companyCity; shipperAddress.PostalCode = companyZipCode; shipperAddress.StateProvinceCode = companyState; shipperAddress.CountryCode = companyCountry; shipperAddress.AddressLine = addressLine; shipper.Address = shipperAddress; shipment.Shipper = shipper; UPSrates.RateWebReference.AddressType shipFromAddress = new UPSrates.RateWebReference.AddressType(); shipFromAddress.AddressLine = addressLine; shipFromAddress.City = companyCity; shipFromAddress.PostalCode = companyZipCode; shipFromAddress.StateProvinceCode = companyState; shipFromAddress.CountryCode = companyCountry; shipFrom.Address = shipFromAddress; shipment.ShipFrom = shipFrom; UPSrates.RateWebReference.ShipToAddressType shipToAddress = new UPSrates.RateWebReference.ShipToAddressType(); String[] addressLine1 = { street }; shipToAddress.AddressLine = addressLine1; shipToAddress.City = city; shipToAddress.PostalCode = zipcode; shipToAddress.StateProvinceCode = state; shipToAddress.CountryCode = country; shipTo.Address = shipToAddress; shipment.ShipTo = shipTo; UPSrates.RateWebReference.CodeDescriptionType service = new UPSrates.RateWebReference.CodeDescriptionType(); double TotalWeight = 0; double pkgCurrTotalWeight = 0; double currWeight = 0; System.Collections.Generic.List<UPSrates.RateWebReference.PackageType> pkgArrayList = new System.Collections.Generic.List<UPSrates.RateWebReference.PackageType>(); UPSrates.RateWebReference.PackageWeightType packageWeight = new UPSrates.RateWebReference.PackageWeightType(); // start new packageeightType(); UPSrates.RateWebReference.CodeDescriptionType uom = new UPSrates.RateWebReference.CodeDescriptionType(); uom.Code = "lbs"; uom.Description = "pounds"; packageWeight.UnitOfMeasurement = uom; package.PackageWeight = packageWeight; UPSrates.RateWebReference.CodeDescriptionType packType = new UPSrates.RateWebReference.CodeDescriptionType(); packType.Code = "02"; package.PackagingType = packType; int pckNumber = 1; // read matrix Matrix m = Matrix.GetFromUID(pVal.Form, "38"); for(int i = 0; i < m.Rows.Count ; i++) { string itemCode = m.GetValue("1", i); //MessageBox.Show(m.GetValue("11", i), "OK"); double quantity = double.Parse(m.GetValue("11", i), System.Globalization.CultureInfo.InvariantCulture.NumberFormat); if(string.IsNullOrEmpty(itemCode)) continue; if(vItem.GetByKey(itemCode) == true) { currWeight = vItem.SalesUnitWeight * quantity; SwissAddonFramework.Messaging.StatusBar.WriteSucess("OK Item: ItemCode:" + itemCode + " Quantity:" + quantity.ToString() + " Weight:" + currWeight.ToString()); if ((currWeight + pkgCurrTotalWeight) >= 150) { packageWeight.Weight = pkgCurrTotalWeight.ToString(); pkgArrayList.Add(package); SwissAddonFramework.Messaging.StatusBar.WriteSucess("Package " + pckNumber.ToString() + " weight:" + pkgCurrTotalWeight.ToString()); // start new package pckNumber++; packageWeight.Weight = currWeight.ToString(); pkgCurrTotalWeight = currWeight; uom.Code = "lbs"; uom.Description = "pounds"; packageWeight.UnitOfMeasurement = uom; package.PackageWeight = packageWeight; packType.Code = "02"; package.PackagingType = packType; } else { //add to existing package pkgCurrTotalWeight += currWeight; } } } packageWeight.Weight = pkgCurrTotalWeight.ToString(); pkgArrayList.Add(package); SwissAddonFramework.Messaging.StatusBar.WriteSucess("Package " + pckNumber.ToString() + " weight:" + pkgCurrTotalWeight.ToString()); SwissAddonFramework.Messaging.StatusBar.WriteSucess("Total number of packages " + pckNumber.ToString()); //SwissAddonFramework.Messaging.StatusBar.WriteSucess("Total Weight for Shipment is:" + TotalWeight.ToString()); // as default we use UPS ground // TODO future dev will be to read dynamic values from SAP // 01 - UPS Next Day Air® United States Domestic Shipments // 02 - UPS Second Day Air® United States Domestic Shipments // 03 - UPS Ground United States Domestic Shipments // 12 - UPS Three - Day Select® United States Domestic Shipments // 13 - UPS Next Day Air Saver® United States Domestic Shipments // 14 - UPS Next Day Air® Early A.M. SM United States Domestic Shipments // 59 - UPS Second Day Air A.M.® United States Domestic Shipments // 65 - UPS Saver United States Domestic Shipments service.Code = "03"; shipment.Service = service; UPSrates.RateWebReference.PackageType[] pkgArray = pkgArrayList.ToArray(); shipment.Package = pkgArray; rateRequest.Shipment = shipment; Console.WriteLine(rateRequest); UPSrates.RateWebReference.RateResponse rateResponse = rate.ProcessRate(rateRequest); try { // read values from Form //Fill total live freight cost from UPS in the freight form pVal.Form.Freeze(true); LinkedButton.GetFromUID(pVal.Form, "91").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); Form FreightForm = Form.GetFormFromUID(customize.B1Connector.GetB1Connector().Application.Forms.ActiveForm.UniqueID); Matrix FreightMtxRows = Matrix.GetFromUID(FreightForm, "3"); // row index holds the line in the freight window to fill with freight charges currently we default it to the first row. int rowIndex = 0; FreightMtxRows.SetValue("3", rowIndex, rateResponse.RatedShipment[0].TotalCharges.MonetaryValue); // close freight form Button.GetFromUID(FreightForm, "1").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); Button.GetFromUID(FreightForm, "1").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular); } catch (Exception ex) { SwissAddonFramework.Messaging.StatusBar.WriteError(ex.Message); } finally { pVal.Form.Freeze(false); } SwissAddonFramework.Messaging.StatusBar.WriteSucess("The transaction was a " + rateResponse.Response.ResponseStatus.Description); SwissAddonFramework.Messaging.StatusBar.WriteSucess("Total Shipment Charges " + rateResponse.RatedShipment[0].TotalCharges.MonetaryValue + rateResponse.RatedShipment[0].TotalCharges.CurrencyCode); } catch (System.Web.Services.Protocols.SoapException ex) { //SwissAddonFramework.Messaging.StatusBar.WriteError("---------Web Service returns error----------------"); //SwissAddonFramework.Messaging.StatusBar.WriteError("---------\"Hard\" is user error \"Transient\" is system error----------------"); //SwissAddonFramework.Messaging.StatusBar.WriteError("SoapException Message= " + ex.Message); SwissAddonFramework.Messaging.StatusBar.WriteError("SoapException Category:Code:Message= " + ex.Detail.LastChild.InnerText); //SwissAddonFramework.Messaging.StatusBar.WriteError("SoapException XML String for all= " + ex.Detail.LastChild.OuterXml); //SwissAddonFramework.Messaging.StatusBar.WriteError("SoapException StackTrace= " + ex.StackTrace); } catch (System.ServiceModel.CommunicationException ex) { SwissAddonFramework.Messaging.StatusBar.WriteError("CommunicationException= " + ex.Message); SwissAddonFramework.Messaging.StatusBar.WriteError("CommunicationException-StackTrace= " + ex.StackTrace); } catch (Exception ex) { SwissAddonFramework.Messaging.StatusBar.WriteError(" Generaal Exception= " + ex.Message); SwissAddonFramework.Messaging.StatusBar.WriteError(" Generaal Exception-StackTrace= " + ex.StackTrace); }