using System; using System.Text; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Net.Mail; using System.Collections.Generic; using System.Xml; using System.Net; using System.IO; public partial class Admin_OrderWizard_Ship : WebBlocks.AdministrativePage { string ImagePath { get { return (Session["ImagePath"] == null ? "" : Session["ImagePath"].ToString()); } set { Session["ImagePath"] = value; } } private int OrderID { get { return (ViewState["OrderID"] == null ? 0 : (int)ViewState["OrderID"]); } set { ViewState["OrderID"] = value; } } private string ShipmentDigest { get { return (ViewState["ShipmentDigest"] == null ? "" : (string)ViewState["ShipmentDigest"]); } set { ViewState["ShipmentDigest"] = value; } } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { ShipmentDigest = null; OrderID = Int32.Parse(Request["OrderID"]); //OrderID = 57; txtNumPackages.Focus(); DataRow drOrder = Database.Orders_GetOrderAndBillingAddress(OrderID); if ((int)drOrder["OrderStatusID"] == 3) { litShipped.Text = "This order has already been shipped"; Button btnCaptureFunds = (Button)wizShip.FindControl("FinishNavigationTemplateContainerID$btnCaptureFunds"); wizShip.ActiveStepIndex = 5; if ((bool)drOrder["IsCaptured"]) btnCaptureFunds.Visible = false; } // first step, check if the order has been captured //DataRow dr = Database.Orders_GetByOrderID(OrderID); //bool IsAuthorized = (bool)dr["IsAuthorized"]; //bool IsCaptured = (bool)dr["IsCaptured"]; //if (IsCaptured) // skip step one if its captured already // wizShip.ActiveStepIndex = 1; } } protected void rptPackages_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Literal litHeader = (Literal)e.Item.FindControl("litHeader"); RadioButtonList rdoPackagingTypes = (RadioButtonList)e.Item.FindControl("rdoPackagingTypes"); DropDownList ddlWeightTypes = (DropDownList)e.Item.FindControl("ddlWeightTypes"); TextBox txtWeight = (TextBox)e.Item.FindControl("txtWeight"); CheckBox chkLargePackage = (CheckBox)e.Item.FindControl("chkLargePackage"); fillRDOPackagingTypes(ref rdoPackagingTypes); fillDDLPakageWeightTypes(ref ddlWeightTypes); litHeader.Text = "Package " + e.Item.DataItem.ToString(); } } private void bindPackages() { ArrayList numPackages = new ArrayList(); for (int i = 1; i <= Int32.Parse(txtNumPackages.Text); i++) numPackages.Add(i); rptPackages.DataSource = numPackages; rptPackages.DataBind(); } protected void wizShip_NextButtonClick(object sender, WizardNavigationEventArgs e) { litPackagesError.Text = string.Empty; litShippingMethodError.Text = string.Empty; litHighValueReport.Text = string.Empty; DataRow drOrder = Database.Orders_GetOrderAndBillingAddress(OrderID); if (e.CurrentStepIndex == 0) { int result; if (Int32.TryParse(txtNumPackages.Text, out result) && result > 0) { bindPackages(); } else { litPackagesError.Text = "Please enter a valid number that's greater than 0.
"; txtNumPackages.Focus(); e.Cancel = true; } } else if (e.CurrentStepIndex == 1) { foreach (RepeaterItem rptItem in rptPackages.Items) { Literal litHeader = (Literal)rptItem.FindControl("litHeader"); RadioButtonList rdoPackagingTypes = (RadioButtonList)rptItem.FindControl("rdoPackagingTypes"); DropDownList ddlWeightTypes = (DropDownList)rptItem.FindControl("ddlWeightTypes"); TextBox txtWeight = (TextBox)rptItem.FindControl("txtWeight"); CheckBox chkLargePackage = (CheckBox)rptItem.FindControl("chkLargePackage"); Literal litPackageDetailsError = (Literal)rptItem.FindControl("litPackageDetailsError"); TextBox txtValue = (TextBox)rptItem.FindControl("txtValue"); litPackageDetailsError.Text = string.Empty; if (rdoPackagingTypes.SelectedValue == "") { litPackageDetailsError.Text += "Please select a packaging type.
"; rdoPackagingTypes.Focus(); e.Cancel = true; } double weight; if (!(Double.TryParse(txtWeight.Text, out weight))) { litPackageDetailsError.Text += "Please enter a valid weight that's greater than 0.
"; txtWeight.Focus(); e.Cancel = true; } else if(weight < 0) { litPackageDetailsError.Text += "Please enter a valid weight that's greater than 0.
"; txtWeight.Focus(); e.Cancel = true; } double value; if (!(Double.TryParse(txtValue.Text, out value))) { litPackageDetailsError.Text += "Please enter a valid insured value that's greater than 0.
"; txtValue.Focus(); e.Cancel = true; } else if(value < 0) { litPackageDetailsError.Text += "Please enter a valid insured value that's greater than 0.
"; txtValue.Focus(); e.Cancel = true; } rdoShippingMethods.Items.Clear(); fillRDOShippingMethods(ref rdoShippingMethods); litCustomerShippingMethod.Text = drOrder["ShippingMethod"].ToString(); foreach (ListItem li in rdoShippingMethods.Items) { if (Server.HtmlDecode(litCustomerShippingMethod.Text) == li.Text) { li.Selected = true; li.Text = "" + li.Text + ""; } } } } else if (e.CurrentStepIndex == 2) { // validate if (rdoShippingMethods.SelectedIndex == -1) { litShippingMethodError.Text = "Please select a shipping method.
"; e.Cancel = true; } else { // get label! // request a shipping label from UPS UPS ship = new UPS(); // make the package classes List packages = new List(); foreach (RepeaterItem rptItem in rptPackages.Items) { Literal litHeader = (Literal)rptItem.FindControl("litHeader"); RadioButtonList rdoPackagingTypes = (RadioButtonList)rptItem.FindControl("rdoPackagingTypes"); DropDownList ddlWeightTypes = (DropDownList)rptItem.FindControl("ddlWeightTypes"); TextBox txtWeight = (TextBox)rptItem.FindControl("txtWeight"); CheckBox chkLargePackage = (CheckBox)rptItem.FindControl("chkLargePackage"); Literal litPackageDetailsError = (Literal)rptItem.FindControl("litPackageDetailsError"); TextBox txtValue = (TextBox)rptItem.FindControl("txtValue"); UPS.PackageClass package = new UPS.PackageClass(); package.PackagingType.Code = rdoPackagingTypes.SelectedValue; package.PackagingType.Description = rdoPackagingTypes.SelectedItem.Text; package.PackageWeight.UnitOfMeasurement.Code = ddlWeightTypes.SelectedValue; package.PackageWeight.UnitOfMeasurement.Description = ddlWeightTypes.SelectedItem.Text; package.PackageWeight.Weight = Double.Parse(txtWeight.Text); if (chkLargePackage.Checked) package.LargePackageIndicator = "true"; // put any value in here to make this line item show up package.PackageServiceOptions.InsuredValue.MonetaryValue = txtValue.Text; packages.Add(package); } XmlDocument xmlDoc = ship.ConfirmShipment(OrderID, packages, rdoShippingMethods.SelectedItem.Value); string ResponseCode = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/Response/ResponseStatusCode").InnerText; if (ResponseCode == "0") { string ErrorSeverity = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/Response/Error/ErrorSeverity").InnerText; string ErrorCode = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/Response/Error/ErrorCode").InnerText; string ErrorDescription = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/Response/Error/ErrorDescription").InnerText; litShippingMethodError.Text = "There was an error with the label request
"; litShippingMethodError.Text += "ErrorCode: " + ErrorCode + "
"; litShippingMethodError.Text += "ErrorDescription: " + ErrorDescription + "
"; e.Cancel = true; } else { string TotalCharge = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/ShipmentCharges/TotalCharges/MonetaryValue").InnerText; string trackingNumber = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/ShipmentIdentificationNumber").InnerText; string digest = xmlDoc.SelectSingleNode("ShipmentConfirmResponse/ShipmentDigest").InnerText; litTotalCharge.Text = "$" + String.Format("{0:c}", TotalCharge); litTotalCharge.Text = "" + litTotalCharge.Text + ""; Database.Orders_SetDateShipped(OrderID, DateTime.Now); ShipmentDigest = digest; litTrackingNumber.Text = trackingNumber; } //xmlDoc.Save("C:\\ShipmentConfirmResponse.xml"); } } else if (e.CurrentStepIndex == 3) { UPS ship = new UPS(); XmlDocument xmlDoc = ship.AcceptShipment(ShipmentDigest); string ResponseCode = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/Response/ResponseStatusCode").InnerText; string labelPath = Server.MapPath("~/Resources/Orders/" + OrderID.ToString()); // delete any existing shipping labels if(System.IO.File.Exists(labelPath + "\\UPSshippinglabel.gif")) System.IO.File.Delete(labelPath + "\\UPSshippinglabel.gif"); litAcceptError.Text = ""; if (ResponseCode == "0") { string ErrorSeverity = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/Response/Error/ErrorSeverity").InnerText; string ErrorCode = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/Response/Error/ErrorCode").InnerText; string ErrorDescription = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/Response/Error/ErrorDescription").InnerText; litAcceptError.Text = "There was an error with the label request
"; litAcceptError.Text += "ErrorCode: " + ErrorCode + "
"; litAcceptError.Text += "ErrorDescription: " + ErrorDescription + "
"; e.Cancel = true; } else { litPrintShipingLabel.Text = string.Empty; // save tracking number and image to db // TODO - partial shipments - remember to check for existing shipping labels XmlNodeList shippingLabels = xmlDoc.SelectNodes("ShipmentAcceptResponse/ShipmentResults/PackageResults"); for(int i = 1; i <= shippingLabels.Count; i++) { string graphicImage = shippingLabels[i - 1].SelectSingleNode("LabelImage/GraphicImage").InnerText; byte[] img = Convert.FromBase64String(graphicImage); System.Drawing.Image img2 = byteArrayToImage(img); if (!Directory.Exists(labelPath)) { Directory.CreateDirectory(labelPath); } // save original img2.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone); img2.Save(labelPath + "\\UPSshippinglabel" + i + ".gif"); // resize it System.Drawing.Image img3 = Graphix.GetSizedImage(labelPath + "\\UPSshippinglabel" + i + ".gif", 400, 700, true); img3.Save(labelPath + "\\UPSshippinglabel" + i + ".gif"); litPrintShipingLabel.Text += "Print Shipping Label (" + i + ")
"; } // delete any existing high value reports if(System.IO.File.Exists(Server.MapPath("~/Resources/Orders/" + OrderID.ToString() + "/HighValueReport.html"))) System.IO.File.Delete(Server.MapPath("~/Resources/Orders/" + OrderID.ToString() + "/HighValueReport.html")); XmlNode nodeHighValueReport = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/ShipmentResults/ControlLogReceipt/GraphicImage"); if (nodeHighValueReport != null) { // check if we have a High Value Report FileStream fs = new FileStream(Server.MapPath("~/Resources/Orders/" + OrderID.ToString() + "/HighValueReport.html"), FileMode.Create, FileAccess.ReadWrite); BinaryWriter bw = new BinaryWriter(fs); try { string highValueReport = nodeHighValueReport.InnerText; string ErrorSeverity = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/Response/Error/ErrorSeverity").InnerText; string ErrorDescription = xmlDoc.SelectSingleNode("ShipmentAcceptResponse/Response/Error/ErrorDescription").InnerText; litHighValueReport.Text = "
There was a warning in the label request
"; litHighValueReport.Text += "Warning: " + ErrorDescription + "
"; byte[] bytesHighValuereport = Convert.FromBase64String(highValueReport); bw.Write(bytesHighValuereport); bw.Close(); litHighValueReport.Text += "
View High Value Report"; } catch { // no high value report } finally { bw.Close(); } } Database.Orders_Ship(OrderID, litTrackingNumber.Text); if((int)drOrder["OrderStatusID"] == 14) Database.Orders_SetOrderStatusID(OrderID, 13); else Database.Orders_SetOrderStatusID(OrderID, 3); } //xmlDoc.Save("C:\\ShipmentAcceptResponse.xml"); } else if (e.CurrentStepIndex == 4) { if (chkSendEmail.Checked) SendEmail(); Button btnCaptureFunds = (Button)wizShip.FindControl("FinishNavigationTemplateContainerID$btnCaptureFunds"); if ((bool)drOrder["IsCaptured"]) { litShipped.Text = "The shipment wizard is complete. Click the \"Finish\" button to return to the order details page."; btnCaptureFunds.Visible = false; } else litShipped.Text = "The shipment wizard is complete. Click the \"Capture Funds\" button to go to the capture funds wizard or the \"Finish\" button to return to the order details page."; } else if (e.CurrentStepIndex == 5) { } } protected void btnCaptureFunds_Click(object sender, EventArgs e) { Response.Redirect("OrderWizard_Capture.aspx?OrderID=" + OrderID.ToString()); } protected void btnFinish_Click(object sender, EventArgs e) { Response.Redirect("EditOrder.aspx?OrderID=" + OrderID.ToString()); } private void SendEmail() { DataRow drOrder = Database.Orders_GetByOrderID(OrderID); DataRow drCustomer = Database.Customers_Get((int)drOrder["CustomerID"]); if (drOrder != null && drCustomer != null) { string EmailAddress = (string)drCustomer["EmailAddress"]; string TrackingNumber = (drOrder["TrackingNumber"] == null ? "Not Specified" : (string)drOrder["TrackingNumber"]); // send order confirmation email TemplatedEmail email = new TemplatedEmail(this, "~/EmailTemplates/OrderShipped.html"); email.From = new MailAddress(Configuration.Get("Emails.ReplyEmail"), Configuration.Get("Emails.FromName")); email.To.Add(new MailAddress(EmailAddress)); email.TemplateVariables.Add("[[OrderID]]", OrderID.ToString()); email.TemplateVariables.Add("[[Tracking Number]]", TrackingNumber); // grab data needed to send the email DataRow drBilling = Database.OrderAddresses_GetByOrderAddressID((int)drOrder["BillingAddressID"]); email.TemplateVariables.Add("[[BillingFirstName]]", (string)drBilling["FirstName"]); email.TemplateVariables.Add("[[BillingLastName]]", (string)drBilling["LastName"]); email.TemplateVariables.Add("[[BillingAddress]]", (string)drBilling["Address"]); email.TemplateVariables.Add("[[BillingCity]]", (string)drBilling["City"]); email.TemplateVariables.Add("[[BillingState]]", (string)drBilling["State"]); email.TemplateVariables.Add("[[BillingZipCode]]", (string)drBilling["ZipCode"]); email.TemplateVariables.Add("[[BillingCountry]]", (string)drBilling["Country"]); email.TemplateVariables.Add("[[BillingPhone]]", (string)drBilling["Phone"]); DataRow drShipping = Database.OrderAddresses_GetByOrderAddressID((int)drOrder["ShippingAddressID"]); email.TemplateVariables.Add("[[ShippingFirstName]]", (string)drShipping["FirstName"]); email.TemplateVariables.Add("[[ShippingLastName]]", (string)drShipping["LastName"]); email.TemplateVariables.Add("[[ShippingAddress]]", (string)drShipping["Address"]); email.TemplateVariables.Add("[[ShippingCity]]", (string)drShipping["City"]); email.TemplateVariables.Add("[[ShippingState]]", (string)drShipping["State"]); email.TemplateVariables.Add("[[ShippingZipCode]]", (string)drShipping["ZipCode"]); email.TemplateVariables.Add("[[ShippingCountry]]", (string)drShipping["Country"]); DataTable dtOrderItems = Database.OrderItems_GetForAdmin(OrderID); StringBuilder str = new StringBuilder(); str.Append(""); str.Append(""); foreach (DataRow dr in dtOrderItems.Rows) { str.Append(""); } str.Append("
QuantityItemItem PriceTotal
"); str.Append(dr["Quantity"].ToString()); str.Append(""); str.Append((string)dr["ItemName"]); str.Append(""); str.Append(String.Format("{0:C}", (decimal)dr["Price"])); str.Append(""); str.Append(String.Format("{0:C}", (decimal)dr["Cost"])); str.Append("
"); email.TemplateVariables.Add("[[ShoppingCart]]", str.ToString()); email.TemplateVariables.Add("[[Comments]]", txtComments.Text); email.Send(); } } # region "Helper Methods" private void fillRDOShippingMethods(ref RadioButtonList rdoList) { rdoList.Items.Add(new ListItem("UPS Next Day Air®", "01")); rdoList.Items.Add(new ListItem("UPS Second Day Air®", "02")); rdoList.Items.Add(new ListItem("UPS Ground", "03")); rdoList.Items.Add(new ListItem("UPS Three-Day Select®", "12")); rdoList.Items.Add(new ListItem("UPS Next Day Air Saver®", "13")); rdoList.Items.Add(new ListItem("UPS Next Day Air® Early A.M. SM", "14")); rdoList.Items.Add(new ListItem("UPS Second Day Air A.M.®", "59")); rdoList.Items.Add(new ListItem("UPS Saver", "65")); } private void fillRDOPackagingTypes(ref RadioButtonList rdoList) { rdoList.Items.Add(new ListItem("UPS Letter", "01")); rdoList.Items.Add(new ListItem("Customer Supplied Package", "02")); rdoList.Items.Add(new ListItem("Tube", "03")); rdoList.Items.Add(new ListItem("PAK", "04")); rdoList.Items.Add(new ListItem("UPS Express Box", "21")); rdoList.Items.Add(new ListItem("UPS 25KG Box", "24")); rdoList.Items.Add(new ListItem("UPS 10KG Box", "25")); rdoList.Items.Add(new ListItem("Pallet", "30")); rdoList.Items.Add(new ListItem("Small Express Box", "2a")); rdoList.Items.Add(new ListItem("Medium Express Box", "2b")); rdoList.Items.Add(new ListItem("Large Express Box", "2c")); } private void fillDDLPakageWeightTypes(ref DropDownList ddl) { ddl.Items.Add(new ListItem("Pounds", "LBS")); ddl.Items.Add(new ListItem("Kilograms", "KGS")); } public System.Drawing.Image byteArrayToImage(byte[] byteArrayIn) { MemoryStream ms = new MemoryStream(byteArrayIn); System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms); return returnImage; } # endregion }