예제 #1
0
        public Error SendPickToWarehouse(PickHeaderModel pickM)
        {
            var error = new Error();

            var pickH = db.FindPickHeader(pickM.Id);

            if (pickH == null)
            {
                error.SetRecordError("PickHeader", pickM.Id);
            }
            else
            {
                var location = pickH.Location ?? new Location {
                    Id = 0, LocationName = "[Unknown]"
                };
                var transferConfig = DataTransferService.FindFileTransferConfigurationModel(location.Id,
                                                                                            FileTransferType.Send,
                                                                                            FileTransferDataType.WarehousePick);
                if (transferConfig == null)
                {
                    error.SetError(EvolutionResources.errCannotDropOrderNoDataTransfer, pickH.Id.ToString(), location.LocationName);
                }
                else
                {
                    error = processPick(pickM, transferConfig);
                }
            }
            return(error);
        }
예제 #2
0
        public Error CreatePicks(CompanyModel company, List <SalesOrderHeaderModel> sohList, bool bCombine,
                                 List <PickHeaderModel> pickHeaders)
        {
            // Given a list of SalesOrderHeaders and a flag indicating whether to create
            // individual picks or a single combined pick, creates the required pick(s)
            // in the PickHeader and PickDetail database tables.
            // If successful, it then creates the CSV pick data files.
            var error = new Error();

            if (sohList != null)
            {
                bool            bFirst     = true;
                PickHeaderModel pickHeader = null;

                foreach (var soh in sohList)
                {
                    if (bFirst || !bCombine)
                    {
                        pickHeader = new PickHeaderModel();
                        error      = createPick(company, soh, ref pickHeader);
                    }
                    if (!error.IsError)
                    {
                        error = addPickDetails(pickHeader, soh.SalesOrderDetails);

                        if (bCombine)
                        {
                            // If combined, we only save the first pick header because there will only be one
                            if (bFirst)
                            {
                                pickHeaders.Add(pickHeader);
                            }
                            bFirst = false;
                        }
                        else
                        {
                            // If not combined, save every pick header
                            pickHeaders.Add(pickHeader);

                            // Create a pick CSV file for this sale
                            error = createPickDataFile(pickHeader);
                        }
                    }
                    if (error.IsError)
                    {
                        break;
                    }
                }

                // If no errors and combined, create the CSV for the combined sales
                if (!error.IsError && bCombine)
                {
                    error = createPickDataFile(pickHeader);
                }
            }
            return(error);
        }
        public void SetPickSentToWarehouseDate(PickHeaderModel pick, DateTimeOffset dt)
        {
            var p = db.FindPickHeader(pick.Id);

            if (p != null)
            {
                pick.STWDate = p.STWDate = dt;
                db.InsertOrUpdatePickHeader(p);
            }
        }
예제 #4
0
        private Error processPick(PickHeaderModel pickH,
                                  FileTransferConfigurationModel template)
        {
            var error = new Error();

            // Load the template configuration file
            var configFile = getTemplateFileName(template);

            XElement doc  = XElement.Load(configFile);
            var      file = doc.Element("File");
            var      extn = file.Attribute("DataFileExtension").Value;

            var tempFile = Path.GetTempPath() + pickH.Id + ".CSV";   // extn;
            var zipFile  = "";

            // Check if the pick's files are to be compressed and sent in a ZIP.
            // A pick can be a single CSV file or a CSV with onr or more PDF's.
            // A single file can optionally be compressed whereas multiple files must be compressed
            // as a package of files.
            // The requirement is that a single file is dropped for FTP.
            bool bCompress = file.Attribute("CompressFile").Value.ParseBool();

            if (bCompress || pickH.PickFiles.Count() > 1)
            {
                // File(s) are to be compressed/combined
                zipFile = tempFile.ChangeExtension(".zip");

                error = Zip.ZipFiles(pickH.PickFiles, zipFile);

                if (error.IsError)
                {
                    FileManagerService.FileManagerService.DeleteFile(zipFile);
                }
                else
                {
                    tempFile = zipFile;
                }
            }

            if (!error.IsError)
            {
                if (file.Attribute("FTPFile").Value.ParseBool())
                {
                    // Copy the file to the FTP pickup folder
                    error = moveFileToFTPFolder(tempFile,
                                                template.SourceFolder,
                                                DataTransferService.GetTargetFileName(template,
                                                                                      tempFile,
                                                                                      pickH.Id));
                }
            }
            FileManagerService.FileManagerService.DeleteFile(tempFile);

            return(error);
        }
예제 #5
0
        public List <PickDetailModel> FindPickDetailListModel(CompanyModel company, PickHeaderModel pickHeader)
        {
            var model = new List <PickDetailModel>();

            foreach (var item in db.FindPickDetails(company.Id, pickHeader.Id))
            {
                model.Add(mapToModel(item));
            }

            return(model);
        }
예제 #6
0
        private void mapToModel(PickHeader pickH, PickHeaderModel pickModel)
        {
            Mapper.Map <PickHeader, PickHeaderModel>(pickH, pickModel);

            if (pickH.Location != null)
            {
                pickModel.LocationName = pickH.Location.LocationName;
            }
            if (pickH.Country != null)
            {
                pickModel.ShipCountry = pickH.Country.CountryName;
            }
        }
예제 #7
0
        private Error createPickDataFile(PickHeaderModel pickH)
        {
            // Create a pick data file
            var error = new Error();

            // Get the file transfer for the pick
            var location = db.FindLocation(pickH.LocationId ?? 0);

            if (location == null)
            {
                location = new Location();
            }

            var transferConfig = db.FindFileTransferConfiguration(location.Id,
                                                                  FileTransferType.Send,
                                                                  FileTransferDataType.WarehousePick);

            if (transferConfig == null)
            {
                error.SetError(EvolutionResources.errCannotDropOrderNoDataTransfer, "", pickH.InvoiceNumber.ToString(), location.LocationName);
            }
            else
            {
                // Load the template configuration file
                string configFile = getTemplateFileName(transferConfig),
                       tempFile   = "";

                XElement doc  = XElement.Load(configFile);
                var      file = doc.Element("File");

                error = createPickDataFile(pickH, file, ref tempFile);
                if (!error.IsError)
                {
                    pickH.PickFiles.Add(tempFile);
                    pickH.PickDropFolder = transferConfig.SourceFolder;
                }
            }
            return(error);
        }
예제 #8
0
        public PickHeaderModel mapToModel(PickHeader pick)
        {
            PickHeaderModel newItem = Mapper.Map <PickHeader, PickHeaderModel>(pick);

            if (pick.Customer != null)
            {
                newItem.CustomerName = pick.Customer.Name;
            }
            if (pick.PickStatusId != null)
            {
                newItem.Status = db.FindPickStatus(pick.PickStatusId.Value).StatusName;
            }
            if (pick.LocationId != null)
            {
                newItem.LocationName = db.FindLocation(pick.LocationId.Value).LocationName;
            }
            if (pick.ShipCountryId != null)
            {
                newItem.ShipCountry = db.FindCountry(pick.ShipCountryId.Value).CountryName;
            }

            return(newItem);
        }
예제 #9
0
        private Error addPickDetails(PickHeaderModel pickHeader, List <SalesOrderDetailModel> sodList)
        {
            // Adds detail lines to a pick.
            var error = new Error();

            foreach (var item in sodList)
            {
                var pickD = new PickDetail {
                    CompanyId           = pickHeader.CompanyId.Value,
                    PickHeaderId        = pickHeader.Id,
                    ProductId           = item.ProductId,
                    QtyToPick           = item.PickQty,
                    QtyPicked           = 0,
                    PickDetailStatusId  = (int)PickDetailStatus.ToBePicked,
                    SalesOrderDetailId  = item.Id,
                    PickLocationId      = pickHeader.LocationId,
                    IsReportedToWebsite = false
                };
                db.InsertOrUpdatePickDetail(pickD);

                pickHeader.PickDetails.Add(mapToModel(pickD));
            }
            return(error);
        }
예제 #10
0
        public Error CreatePickDocumentPdf(PickHeaderModel pickHeader, DocumentTemplateModel template,
                                           string pdfFile, bool showCancelledItems,
                                           ref string outputFile, int maxItems = Int32.MaxValue)
        {
            var error = new Error();

            string tempFile = MediaService.MediaService.GetTempFile(".html");

            if (string.IsNullOrEmpty(pdfFile))
            {
                outputFile = MediaService.MediaService.GetTempFile().FolderName() + "\\" + pickHeader.Id + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
            }
            else
            {
                outputFile = pdfFile;
            }

            decimal subTotal     = 0;
            var     company      = CompanyService.FindCompanyModel(pickHeader.CompanyId == null ? 0 : pickHeader.CompanyId.Value);
            var     customer     = CustomerService.FindCustomerModel(pickHeader.CustomerId == null ? 0 : pickHeader.CustomerId.Value, company);
            var     paymentTerms = LookupService.FindPaymentTermModel(pickHeader.TermsID == null ? 0 : pickHeader.TermsID.Value);
            var     taxCode      = LookupService.FindTaxCodeModel(customer.TaxCodeId);
            var     currency     = LookupService.FindCurrencyModel(company.DefaultCurrencyID == null ? 0 : company.DefaultCurrencyID.Value);

            Dictionary <string, string>         headerProps = new Dictionary <string, string>();
            List <Dictionary <string, string> > records     = new List <Dictionary <string, string> >();

            AddCompanyInformation(company, headerProps);

            var pickDetailListModel = PickService.FindPickDetailListModel(company, pickHeader).FirstOrDefault();
            var sod = FindSalesOrderDetailModel(pickDetailListModel.SalesOrderDetailId);
            var soh = FindSalesOrderHeaderModel(sod.SalesOrderHeaderId, company);

            // RETAIL INVOICE/PACKING SLIP
            headerProps.AddProperty("ORDERDATE", formatDate(soh.OrderDate, company.DateFormat));
            headerProps.AddProperty("OURREF", soh.OrderNumber);

            // STANDARD PACKING SLIP
            headerProps.AddProperty("REFERENCENUMBER", soh.OrderNumber);
            headerProps.AddProperty("INVOICENUMBER", pickHeader.InvoiceNumber);
            headerProps.AddProperty("SALESDATE", formatDate(soh.OrderDate, company.DateFormat));
            headerProps.AddProperty("TERMS", paymentTerms.TermText); // ??

            headerProps.AddProperty("CUSTOMERCONTACT", pickHeader.CustomerContact);
            var address = pickHeader.ShipAddress1 + "<br/>";

            address += (!string.IsNullOrWhiteSpace(pickHeader.ShipAddress2)) ? pickHeader.ShipAddress2 + "<br/>" : "";
            address += (!string.IsNullOrWhiteSpace(pickHeader.ShipAddress3)) ? pickHeader.ShipAddress3 + "<br/>" : "";
            address += (!string.IsNullOrWhiteSpace(pickHeader.ShipAddress4)) ? pickHeader.ShipAddress4 + "<br/>" : "";
            address += pickHeader.ShipSuburb + " " + pickHeader.ShipState + " " + pickHeader.ShipPostcode + "<br/>";
            address += pickHeader.ShipCountry;
            headerProps.AddProperty("DELIVERYADDRESS", address);

            headerProps.AddProperty("ORDERNUMBER", soh.OrderNumber);
            headerProps.AddProperty("PURCHASEORDERNUMBER", soh.CustPO);

            // Add items
            int itemCount = 1;

            foreach (var pickDetail in PickService.FindPickDetailListModel(company, pickHeader))
            {
                var product = ProductService.FindProductModel(pickDetail.ProductId.Value, null, company, false);

                Dictionary <string, string> line = new Dictionary <string, string>();
                line.AddProperty("ORDERQTY", pickDetail.QtyToPick); // Correct?
                line.AddProperty("ITEMNUMBER", product.ItemNumber);
                line.AddProperty("DESCRIPTION", itemCount.ToString() + " " + sod.ProductDescription);

                // RETAIL INVOICE/PACKING SLIP
                var unitPriceExTax = sod.UnitPriceExTax.Value;
                var discountPc     = sod.DiscountPercent.Value;
                var linePrice      = (pickDetail.QtyToPick * unitPriceExTax - ((pickDetail.QtyToPick * unitPriceExTax) / 100 * discountPc)).Value;

                sod = FindSalesOrderDetailModel(pickDetail.SalesOrderDetailId);
                string allocated = AllocationService.GetExpectedShipdate(sod);
                if (allocated.Count() > 5)
                {
                    allocated = DateTimeOffset.Parse(allocated).ToString(company.DateFormat);
                }

                line.AddProperty("EXPSHIPDATE", allocated);
                line.AddProperty("LINEPRICE", sod.UnitPriceExTax.Value.ToString("#,##0.00"));
                subTotal += linePrice;

                records.Add(line);
                itemCount++;

                // STILL TO SHIP: TODO
            }

            // RETAIL INVOICE/PACKING SLIP
            headerProps.AddProperty("CURRENCYSYMBOL", currency.CurrencySymbol);
            headerProps.AddProperty("SALEAMOUNTEX", subTotal.ToString("#,##0.00"));
            headerProps.AddProperty("FREIGHT", pickHeader.FreightCost ?? 0);
            subTotal += Convert.ToDecimal(pickHeader.FreightCost);
            var subTotalIncGst = subTotal + (taxCode.TaxPercentageRate == null ? 0 : (subTotal / 100 * taxCode.TaxPercentageRate.Value));

            headerProps.AddProperty("SALEAMOUNTINC", subTotal.ToString("#,##0.00"));
            headerProps.AddProperty("GST", (subTotalIncGst - subTotal).ToString("#,##0.00"));
            headerProps.AddProperty("TAXNAME", taxCode.TaxCode);


            return(DocumentService.CreateDocumentPdf(headerProps, records, template.QualTemplateFile, outputFile, maxItems));
        }
예제 #11
0
 public void DeletePick(PickHeaderModel pick)
 {
     db.DeletePickHeader(pick.Id);       // Also deletes the details
 }
예제 #12
0
        private Error createPick(CompanyModel company, SalesOrderHeaderModel soh, ref PickHeaderModel pickHeader)
        {
            // Creates a pick in the pick database tables.
            // This method does not create any files.
            var error = new Error();

            if (soh.SalesOrderDetails == null || soh.SalesOrderDetails.Count == 0)
            {
                error.SetError(EvolutionResources.errCannotCreatePickWithNoItems, "", soh.OrderNumber.ToString());
            }
            else
            {
                LookupService.LookupService lookupService = new LookupService.LookupService(db);
                var pickH = new PickHeader {
                    CompanyId  = soh.CompanyId,
                    CustomerId = soh.CustomerId,
                    //public DateTimeOffset? PickDate { set; get; }
                    //public int? PickStatusId { set; get; }
                    LocationId = soh.LocationId,
                    //public DateTimeOffset? STWDate { set; get; }
                    //public DateTimeOffset? PickComplete { set; get; }
                    //public DateTimeOffset? PackComplete { set; get; }
                    ShipAddress1 = soh.ShipAddress1,
                    ShipAddress2 = soh.ShipAddress2,
                    ShipAddress3 = soh.ShipAddress3,
                    ShipAddress4 = soh.ShipAddress4,
                    ShipSuburb   = soh.ShipSuburb,
                    ShipState    = soh.ShipState,
                    ShipPostcode = soh.ShipPostcode,
                    //public DateTimeOffset? InvoiceDate { set; get; }
                    InvoiceNumber = Convert.ToInt32(lookupService.GetNextSequenceNumber(company, SequenceNumberType.InvoiceNumber)),
                    //public bool InvoiceFinalised { set; get; }
                    ShipMethodId  = soh.ShippingMethodId,
                    SalesPersonId = soh.SalespersonId,
                    //public DateTimeOffset? ShipDate { set; get; }
                    //public string TrackingNumber { set; get; }
                    //public int? BoxCount { set; get; }
                    //public int? PickPriority { set; get; }
                    //public int? PickedById { set; get; }
                    //public int? PackedById { set; get; }
                    //public DateTimeOffset? ReadyForShippingDate { set; get; }
                    //public int? ShippingDocumentId { set; get; }
                    //public DateTimeOffset? AddedToShipManifestDate { set; get; }
                    //public bool DocumentPrinted { set; get; }
                    CustPO = soh.CustPO,
                    //public string SecretComment { set; get; }
                    //public string PickComment { set; get; }
                    //public string ShipMethodAccount { set; get; }
                    //public double? FreightCost { set; get; }
                    DeliveryInstructions = soh.DeliveryInstructions,
                    //public string CustomerContact { set; get; }
                    IsManualFreight = soh.IsManualFreight,
                    ShipCountryId   = soh.ShipCountryId,
                    //public decimal? OurFreightCost { set; get; }
                    //public string EnteredBy { set; get; }
                    WarehouseInstructions = soh.WarehouseInstructions,
                    EndUserName           = soh.EndUserName,
                    CreditCardId          = soh.CreditCardId,
                    //public bool IsRetailPick { set; get; }
                    //public bool IsUploadedToWarehouse { set; get; }
                    TermsID = soh.TermsId,
                    //public string UnregisteredFreightCarrier { set; get; }
                    //public DateTimeOffset? DateCreditCardCharged { set; get; }
                    OrderTypeId = soh.OrderTypeId
                };
                db.InsertOrUpdatePickHeader(pickH);
                mapToModel(pickH, pickHeader);
            }
            return(error);
        }
예제 #13
0
        private Error createPickDataFile(PickHeaderModel pickH, XElement file, ref string tempFile)
        {
            var error = new Error();

            try {
                Dictionary <string, string> data = new Dictionary <string, string>();

                // Create the CSV writer
                List <CSVFormat> formats = new List <CSVFormat>();

                // Read the formatting configuration from the XML file
                foreach (var formatElement in file.Elements("Formats").Elements())
                {
                    // Read the formatting options
                    CSVFormat fileFormat = new CSVFormat {
                        DataFieldDelimiter      = doReplacements(formatElement.Attribute("DataFieldDelimiter").Value),
                        DataFieldDelimiterUsage = (CSVDelimiterUsage)Enum.Parse(typeof(CSVDelimiterUsage),
                                                                                formatElement.Attribute("DataFieldDelimiterUsage").Value),
                        DataFieldSeparator   = doReplacements(formatElement.Attribute("DataFieldSeparator").Value),
                        HeaderFieldDelimiter = doReplacements(formatElement.Attribute("HeaderFieldDelimiter").Value),
                        HeaderFieldSeparator = doReplacements(formatElement.Attribute("HeaderFieldSeparator").Value)
                    };

                    // Now read the fields
                    foreach (var fieldElement in formatElement.Elements("Fields").Elements())
                    {
                        CSVField fieldFormat = new CSVField {
                            FieldName = fieldElement.Attribute("Name").Value,
                            FieldType = (CSVFieldType)Enum.Parse(typeof(CSVFieldType),
                                                                 fieldElement.Attribute("Type").Value)
                        };
                        fileFormat.Fields.Add(fieldFormat);
                    }

                    formats.Add(fileFormat);
                }

                // Create a temp file
                var extn = file.Attribute("DataFileExtension").Value;
                tempFile = Path.GetTempPath() + pickH.Id.ToString() + ".CSV";   // extn;

                // Create the CSV writer
                CSVWriter sw = new CSVWriter();
                sw.CreateFile(tempFile, formats);

                // Write the header lines
                for (int i = 0; i < sw.Formats.Count(); i++)
                {
                    sw.CurrentFormat = i;
                    sw.WriteHeaderLine();
                }

                var customer = db.FindCustomer(pickH.CustomerId.Value);
                var country  = db.FindCountry(pickH.ShipCountryId.Value);

                int idx = 0;
                if (sw.Formats.Count > 1)
                {
                    // Now write the first data line
                    sw.CurrentFormat = idx++;

                    data.AddProperty("PickID", pickH.Id.ToString());
                    data.AddProperty("HeaderLabel", "H");
                    data.AddProperty("CustomerName", customer.Name);
                    data.AddProperty("CustomerOrderNumber", pickH.CustPO);
                    data.AddProperty("ShipAddress1", pickH.ShipAddress1);
                    data.AddProperty("ShipAddress2", pickH.ShipAddress2);
                    data.AddProperty("ShipAddress3", pickH.ShipAddress3);
                    data.AddProperty("ShipSuburb", pickH.ShipSuburb);
                    data.AddProperty("ShipState", pickH.ShipState);
                    data.AddProperty("ShipPostcode", pickH.ShipPostcode);
                    data.AddProperty("ShipCountry", country.CountryName);
                    data.AddProperty("OnforwarderName", "");
                    data.AddProperty("OnforwarderAddress", "");
                    data.AddProperty("OnForwarderSuburb", "");
                    data.AddProperty("OnForwarderPostcode", "");
                    data.AddProperty("OnForwarderState", "");
                    data.AddProperty("OnForwarderCode", "");
                    data.AddProperty("CarrierCode", "");
                    data.AddProperty("CustomerID", pickH.CustomerId);
                    data.AddProperty("DeliveryInstructions", pickH.DeliveryInstructions);
                    data.AddProperty("CustomerContact", "");
                    data.AddProperty("PartnerEDI", "");
                    sw.WriteLine(data);
                }

                // Now write the second and subsequent data lines
                sw.CurrentFormat = idx;

                foreach (var pickD in pickH.PickDetails)
                {
                    data = new Dictionary <string, string>();

                    // Properties for Warehouse and common
                    var product = db.FindProduct(pickD.ProductId.Value);

                    data.AddProperty("PickID", pickH.Id);
                    data.AddProperty("DetailLabel", "I");
                    data.AddProperty("PickQty", pickD.QtyToPick);
                    data.AddProperty("ItemNumber", product.ItemNumber);
                    data.AddProperty("PickLineID", pickD.Id);
                    sw.WriteLine(data);
                }

                sw.Close();
            } catch (Exception ex) {
                error.SetError(ex);
            }

            return(error);
        }