private OrderHead GetOrder(blading blading)
        {
            orders.Clear();             // очистка списка заказов

            var orderIds = new List <uint>();

            if (blading.@uint != null)
            {
                orderIds.Add((uint)blading.@uint);
            }

            // если заказы объединены (накладной соответствует несколько заказов)
            if (orderIds.Count == 0 && blading.bladingFolder != null)
            {
                orderIds = blading.bladingFolder.Where(f => f.orderUint != null).Select(f => (uint)f.orderUint.Value).Distinct().ToList();                 // берем все заказы
            }

            if (orderIds.Count == 0)
            {
                _logger.WarnFormat("Для накладной {0}({1}) не задан номер заказа", blading.bladingId, blading.baseId);
                return(null);
            }

            //игнорируем потеряные заказы
            orders = orderIds
                     .Where(id => id <IgnoreOrderFromId || id> IgnoreOrderToId)
                     .Select(id => ActiveRecordMediator <OrderHead> .FindByPrimaryKey(id, false))
                     .Where(o => o != null)
                     .ToList();
            return(orders.FirstOrDefault());
        }
        public void SetUp()
        {
            supplier = TestSupplier.CreateNaked(session);
            client1  = TestClient.CreateNaked(session);
            client2  = TestClient.CreateNaked(session);

            order1         = new TestOrder();
            order1.Client  = client1;
            order1.Address = client1.Addresses[0];
            order1.Price   = supplier.Prices[0];
            session.Save(order1);

            order2         = new TestOrder();
            order2.Client  = client2;
            order2.Address = client2.Addresses[0];
            order2.Price   = supplier.Prices[0];
            session.Save(order2);

            fake = new FakeProtekHandler();
            fake.IgnoreOrderFromId = 0;
            fake.IgnoreOrderToId   = 100;

            fake.headerResponce = new getBladingHeadersResponse {
                @return = new eZakazXML {
                    blading = new[] {
                        new blading {
                            bladingId = 1,
                        },
                    }
                }
            };

            blading = new blading {
                bladingId    = 1,
                @uint        = (int?)order1.Id,
                bladingItems = new[] {
                    new bladingItem {
                        itemId           = 3345,
                        itemName         = "Коринфар таб п/о 10мг № 50",
                        manufacturerName = "",
                        bitemQty         = 3,
                        country          = "Хорватия/Германия",
                        prodexpiry       = DateTime.Parse("17.02.2012"),
                        distrPriceNds    = 45.05,
                        distrPriceWonds  = 40.95,
                        vitalMed         = 1,
                        sumVat           = 12.3
                    }
                },
            };
            fake.bodyResponce = new getBladingBodyResponse {
                @return = new eZakazXML {
                    blading = new[] { blading }
                }
            };

            begin = DateTime.Now;
        }
        public static void Dump(string path, blading blading)
        {
            if (String.IsNullOrEmpty(path))
            {
                return;
            }
            var file = Path.Combine(path, DateTime.Now.ToString("dd_MM_yyyy_HH_mm_ss_fff") + ".xml");

            using (var stream = File.OpenWrite(file))
                blading.ToXml(stream);
        }
        public Document ToDocument(blading blading, ProtekServiceConfig config)
        {
            Dump(ConfigurationManager.AppSettings["DebugProtekPath"], blading);

            var      order    = GetOrder(blading);
            Supplier supplier = null;
            Address  address  = null;

            if (order != null)
            {
                supplier = order.Price.Supplier;
                address  = order.Address;
            }
            else if (!String.IsNullOrEmpty(blading.recipientId.ToString()))
            {
                var query = new AddressIdQuery(config.SupplierId, false)
                {
                    SupplierDeliveryId = blading.recipientId.ToString(),
                };
                var addressIds = query.Query();
                if (addressIds.Count > 0)
                {
                    supplier = Supplier.Find(config.SupplierId);
                    address  = Address.Find(addressIds.First());
                }
            }

            if (address == null)
            {
                _logger.WarnFormat("Для накладной {0}({1}) не удалось определить получателя код клиента {2} код доставки {3}",
                                   blading.bladingId,
                                   blading.baseId,
                                   blading.payerId,
                                   blading.recipientId);
                return(null);
            }

            var log = new DocumentReceiveLog(supplier, address, DocType.Waybill)
            {
                IsFake  = true,
                Comment = "Получен через сервис Протек"
            };

            var document = new Document(log, "ProtekHandler")
            {
                OrderId            = order?.Id,
                ProviderDocumentId = blading.baseId,
                DocumentDate       = blading.date0,
            };

            document.SetInvoice();
            var invoice = document.Invoice;

            invoice.InvoiceDate             = blading.date0;
            invoice.InvoiceNumber           = blading.baseId;
            invoice.SellerName              = blading.protekNameAddr;
            invoice.SellerINN               = blading.protekInnKpp;
            invoice.ShipperInfo             = blading.protekAddr;
            invoice.RecipientId             = blading.recipientId;
            invoice.RecipientName           = blading.recipientName;
            invoice.RecipientAddress        = blading.recipientAddr;
            invoice.PaymentDocumentInfo     = blading.baseId;
            invoice.BuyerId                 = blading.payerId;
            invoice.BuyerName               = blading.payerName;
            invoice.BuyerINN                = blading.payerInn;
            invoice.CommissionFee           = (decimal?)blading.ksMin;
            invoice.CommissionFeeContractId = blading.ncontr2;
            invoice.AmountWithoutNDS        = (decimal?)blading.sumbyWonds;
            invoice.AmountWithoutNDS10      = (decimal?)blading.sumbyNdsrate10;
            invoice.NDSAmount10             = (decimal?)blading.nds10;
            invoice.AmountWithoutNDS18      = (decimal?)blading.sumbyNdsrate18;
            invoice.NDSAmount18             = (decimal?)blading.nds20;
            invoice.Amount = (decimal?)blading.rprice;
            invoice.DelayOfPaymentInBankDays = blading.dbd;
            invoice.DelayOfPaymentInDays     = blading.dkd;

            foreach (var bladingItem in blading.bladingItems)
            {
                var line = document.NewLine();
                line.Code     = bladingItem.itemId.ToString();
                line.Product  = bladingItem.itemName;
                line.Producer = bladingItem.manufacturerName;
                line.Quantity = (uint?)bladingItem.bitemQty;
                line.Country  = bladingItem.country;

                line.ExpireInMonths    = bladingItem.expiry;
                line.Period            = bladingItem.prodexpiry?.ToShortDateString();
                line.DateOfManufacture = bladingItem.proddt;

                line.RegistryCost = (decimal?)bladingItem.reestrPrice;
                line.RegistryDate = bladingItem.reestrDate;

                line.SupplierPriceMarkup = (decimal?)bladingItem.distrProc;
                line.NdsAmount           = (decimal?)bladingItem.sumVat;
                line.Nds = (uint?)bladingItem.vat;
                line.SupplierCostWithoutNDS = (decimal?)bladingItem.distrPriceWonds;
                line.SupplierCost           = (decimal?)bladingItem.distrPriceNds;
                line.ProducerCostWithoutNDS = (decimal?)bladingItem.prodPriceWonds;
                line.VitallyImportant       = bladingItem.vitalMed != null && bladingItem.vitalMed.Value == 1;
                line.Amount            = (decimal?)bladingItem.positionsum;
                line.SerialNumber      = bladingItem.prodseria;
                line.EAN13             = NullableConvert.ToUInt64(bladingItem.prodsbar);
                line.CountryCode       = bladingItem.countryCode;
                line.BillOfEntryNumber = bladingItem.gtdn;
                line.UnitCode          = bladingItem.cvpItemOkei.ToString();
                if (bladingItem.bladingItemSeries != null)
                {
                    var certificates = bladingItem.bladingItemSeries
                                       .Where(s => s.bladingItemSeriesCertificates != null)
                                       .SelectMany(s => s.bladingItemSeriesCertificates)
                                       .Where(c => c != null);

                    line.ProtekDocIds = certificates
                                        .Select(c => c.docId)
                                        .Where(id => id != null)
                                        .Select(id => new ProtekDoc(line, id.Value))
                                        .ToList();

                    line.Certificates         = certificates.FirstOrDefault()?.regNo;
                    line.CertificateAuthority = certificates.FirstOrDefault()?.regOrg;
                    line.CertificatesDate     = certificates.FirstOrDefault()?.regd?.ToString();
                    line.CertificatesEndDate  = certificates.FirstOrDefault()?.dateExpire;
                }
            }

            return(document);
        }