Exemplo n.º 1
0
        public byte[] GenerateShipmentRequestDocument(IEnumerable <IPurchaseOrder> orders)
        {
            var orderList = orders.ToList();

            m_log.Info($"Zacinam vytvareni dokumentu pro Zasilkovnu, zdroj = {orderList.Count} objednavek");

            using (var stream = new MemoryStream())
                using (var streamWriter = new StreamWriter(stream, Encoding.UTF8))
                {
                    var generator = new CsvGenerator(streamWriter, ZasilkovnaColIndex);

                    foreach (var order in orderList)
                    {
                        try
                        {
                            var shipmentTitle = order.ShippingMethodName;

                            var dobirkovaCastka = StringUtil.FormatDecimal(order.PriceWithVat);

                            if (!string.IsNullOrWhiteSpace(dobirkovaCastka) && order.Currency.Symbol == "CZK")
                            {
                                dobirkovaCastka = ((int)double.Parse(dobirkovaCastka)).ToString();
                            }

                            if (!order.IsPayOnDelivery)
                            {
                                dobirkovaCastka = string.Empty;
                            }

                            var pobockaId = GetPobockaId(order);

                            if (string.IsNullOrWhiteSpace(order.CustomerEmail) &&
                                string.IsNullOrWhiteSpace(order.DeliveryAddress?.Phone) &&
                                string.IsNullOrWhiteSpace(order.InvoiceAddress?.Phone))
                            {
                                throw new Exception("Musi byt telefon nebo e-mail");
                            }

                            var externalDeliveryProvider = false;
                            if (string.IsNullOrWhiteSpace(pobockaId))
                            {
                                externalDeliveryProvider = true;

                                pobockaId = GetBranches().GetPobockaId(shipmentTitle, GetShipmentMethodsMapping());
                            }

                            if (order.ErpId == null)
                            {
                                throw new InvalidOperationException("Unexpected order without Erp");
                            }

                            var erpClient      = m_erpClientFactory.GetErpClient(order.ErpId.Value);
                            var trackingNumber = erpClient.GetPackingReferenceNumber(order);

                            decimal?weight = null;

                            try
                            {
                                weight = m_orderWeightCalculator.GetWeight(order);
                            }
                            catch (Exception e)
                            {
                                m_log.Error($"Weight calc failed", e);
                            }

                            // not sure about Version 4 used by Elsa, but ver. 6 is documented here: https://docs.packetery.com/03-creating-packets/01-csv-import.html
                            generator.CellOpt(null)                                                     //1 Vyhrazeno
                            .CellMan(trackingNumber)                                                    //2 Číslo objednávky
                            .CellMan(order.DeliveryAddress?.FirstName, order.InvoiceAddress?.FirstName) //3 Jméno
                            .CellMan(order.DeliveryAddress?.LastName, order.InvoiceAddress?.LastName)   //4 Příjmení
                            .CellOpt(
                                externalDeliveryProvider
                                    ? (string.IsNullOrWhiteSpace(order.DeliveryAddress?.CompanyName)
                                           ? order.InvoiceAddress?.CompanyName
                                           : order.DeliveryAddress?.CompanyName)
                                    : string.Empty)                                             //5 Firma
                            .CellOpt(order.CustomerEmail)                                       //6 E-mail
                            .CellOpt(order.DeliveryAddress?.Phone, order.InvoiceAddress?.Phone) //7 Mobil
                            .CellOpt(dobirkovaCastka)                                           //8 Dobírková částka
                            .CellMan(order.Currency.Symbol)                                     //9 Měna
                            .CellMan(StringUtil.FormatDecimal(order.PriceWithVat))              //10 Hodnota zásilky
                            .CellOpt(StringUtil.FormatDecimal(weight))                          //11 Hmotnost zásilky
                            .CellMan(pobockaId)                                                 //12 Cílová pobočka
                            .CellMan(/*"biorythme.cz"*/ m_config.ClientName)                    //13 Odesilatel
                            .CellMan(0)                                                         //14 Obsah 18+
                            .CellOpt(null)                                                      //15 Zpožděný výdej
                            ;

                            if (externalDeliveryProvider)
                            {
                                generator.CellMan(order.DeliveryAddress?.Street, order.InvoiceAddress?.Street) //16
                                .CellMan(
                                    GetFormattedHouseNumber(order.DeliveryAddress),
                                    GetFormattedHouseNumber(order.InvoiceAddress))                //17
                                .CellMan(order.DeliveryAddress?.City, order.InvoiceAddress?.City) //18
                                .CellMan(order.DeliveryAddress?.Zip, order.InvoiceAddress?.Zip)   //19
                                ;
                            }

                            generator.CommitRow();
                        }
                        catch (Exception ex)
                        {
                            generator.RollbackRow();
                            throw new InvalidOperationException(
                                      "Chyba objednavky " + order.OrderNumber + ":" + ex.Message,
                                      ex);
                        }
                    }

                    streamWriter.Flush();
                    return(stream.ToArray());
                }
        }