public ShipmentOperation AssertDocumentsIncome(ExampleShipment shipment)
        {
            DateTime date = ShipmentDateShipment;

            var builder = this.GenerateBuilder(shipment, date, shipment.Summ, "DocumentsIncome");

            var operation = builder.Build("DocumentsIncome", date, shipment.Summ) as ShipmentOperation;
            Assert.AreEqual(shipment.Summ, operation.Summ.Value);
            Assert.AreEqual(date, operation.Date);
            Assert.AreEqual("DocumentsIncome", operation.Type);

            //не должно быть комисии
            Assert.AreEqual(0, operation.Commission.Total);
            Assert.AreEqual(new Money(shipment.Summ * ((shipment.StatusFinancing) ? shipment.MITComFin : shipment.MITComNoFin)).NotLess(shipment.MITComMin), operation.Commission.MIT);
            Assert.AreEqual(0, operation.Commission.Body);
            Assert.AreEqual(0, operation.Commission.Increased);

            Assert.AreEqual(0, operation.ToCustomer.Summ);
            Assert.AreEqual(0, operation.ToCustomer.Netting.Summ);

            Assert.AreEqual(shipment.StatusRegress ? 3 : 2, operation.Postings.Count);
            Assert.IsTrue(operation.Postings.All(p => p.Summ == shipment.Summ));
            Assert.IsTrue(operation.Postings.All(p => p.Date == date));
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("478 03") && p.Cred.Number.StartsWith("474 01")));
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("914 18") && p.Cred.Number.StartsWith("999 99") && p.Summ == shipment.Summ));
            if (shipment.StatusRegress)
                Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("914 14") && p.Cred.Number.StartsWith("999 99") && p.Summ == shipment.Summ));

            return operation;
        }
        public ExampleShipmentParamsProvider(ExampleShipment shipment, DateTime date, double summ, string type = "")
        {
            _shipment = shipment;

              //  _date = date;
              //  _summ = summ;
              //  _type = type;

            _cacheValues = new Dictionary<CachePack, Value>();
            _cacheRates = new Dictionary<CachePack, RateCommission>();
            _cacheAccounts = new Dictionary<string, Account>();
        }
        public ShipmentOperation AssertCustomerFinancing(ExampleShipment shipment)
        {
            DateTime date = ShipmentDateShipment;

            Money summ = shipment.Summ;
            Money financing = Math.Round(shipment.Summ * shipment.RateFinancing, 2);

            var builder = this.GenerateBuilder(shipment, date, financing, "CustomerFinansing");

            var operation = builder.Build("CustomerFinancing", date, shipment.Summ * shipment.RateFinancing) as ShipmentOperation;
            Assert.AreEqual(financing, operation.Summ.Value);
            Assert.AreEqual(date, operation.Date);
            Assert.AreEqual("CustomerFinansing", operation.Type);

            //не должно быть комисии
            Assert.AreEqual(Math.Round(shipment.PrepayCommission * Math.Max(shipment.Summ * shipment.RateCommission, shipment.RateCommissionMin), 2), operation.Commission.Total.Value);
            Assert.AreEqual(0, operation.Commission.MIT);
            Assert.AreEqual(0, operation.Commission.Body);
            Assert.AreEqual(0, operation.Commission.Increased);

            Assert.AreEqual(shipment.IsAccountCommission407 ? financing : financing - operation.Commission.Total, operation.ToCustomer.Summ);
            Assert.AreEqual(0, operation.ToCustomer.Netting.Summ);

            Assert.AreEqual((operation.ToCustomer.Netting.Summ > 0 ? 2 : 1) + (shipment.PrepayCommission > 0 ? (shipment.IsAccountCommission407 ? 3 : 5) : 0), operation.Postings.Count);
            //Assert.IsTrue(operation.Postings.All(p => p.Summ == shipment.Summ));
            //Assert.IsTrue(operation.Postings.All(p => p.Date.Date == date.Date));
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("474 01") && p.Cred.Number.StartsWith("40") && p.Summ == (shipment.IsAccountCommission407 ? financing : financing - operation.Commission.Total)));
            if (shipment.PrepayCommission > 0)
            {
                if (shipment.IsAccountCommission407)
                    Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("40") && p.Cred.Number.StartsWith("474 23")));
                else
                    Assert.IsTrue(operation.Postings.Count(p => p.Debt.Number.StartsWith("474 01") && p.Cred.Number.StartsWith("474 23")) == 3);

                Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("474 23") && p.Cred.Number.StartsWith("603") && p.Summ == operation.Commission.TotalNDS));
                Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("474 23") && p.Cred.Number.StartsWith("706") && p.Summ == operation.Commission.TotalClear));
            }

            return operation;
        }
        public ShipmentOperation AssertPayment(ExampleShipment shipment, DateTime date)
        {
            var builder = this.GenerateBuilder(shipment, date, shipment.Summ, "PaymentDebtor");

            var operation = builder.Build("Payment Debtor", date, shipment.Summ) as ShipmentOperation;
            Assert.AreEqual(shipment.Summ, operation.Summ.Value);
            Assert.AreEqual(date, operation.Date);
            Assert.AreEqual("Payment Debtor", operation.Type);

            //не должно быть комисии
            Assert.IsTrue(operation.Commission.Total > 0);
            Assert.AreEqual(0, operation.Commission.MIT);
            Assert.AreEqual(shipment.DutyCustomer, operation.Commission.Body.Value);
            Assert.AreEqual(0, operation.Commission.Increased);

            Assert.AreEqual(shipment.Summ - shipment.DutyCustomer - operation.Commission.Total, operation.ToCustomer.Summ.Value);
            Assert.AreEqual(0, operation.ToCustomer.Netting.Summ);

            Assert.AreEqual(shipment.StatusRegress ? 9 : 8, operation.Postings.Count);
            //Assert.IsTrue(operation.Postings.All(p => p.Summ == shipment.Summ));
            Assert.IsTrue(operation.Postings.All(p => p.Date.Date == date.Date));

            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("612 12") && p.Cred.Number.StartsWith("478 03") && p.Summ == shipment.Summ));
            Assert.IsTrue(operation.Postings.Count(p => p.Debt.Number.StartsWith("474 01") && p.Cred.Number.StartsWith("474 23")) == 3);
            Assert.IsTrue(operation.Postings.Sum(p => (p.Debt.Number.StartsWith("474 01") && p.Cred.Number.StartsWith("474 23")) ? p.Summ : 0) == operation.Commission.Total);
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("474 23") && p.Cred.Number.StartsWith("603") && p.Summ == operation.Commission.TotalNDS));
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("474 23") && p.Cred.Number.StartsWith("706") && p.Summ == operation.Commission.TotalClear));
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("474 01") && p.Cred.Number.StartsWith("40") && p.Summ == operation.ToCustomer.Send));
            Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("999 99") && p.Cred.Number.StartsWith("914 18") && p.Summ == shipment.Summ));
            if (shipment.StatusRegress)
                Assert.IsTrue(operation.Postings.Any(p => p.Debt.Number.StartsWith("999 99") && p.Cred.Number.StartsWith("914 14") && p.Summ == shipment.Summ));

            return operation;
            //test change
        }
 protected ShipmentOperationBuilder GenerateBuilder(ExampleShipment shipment, DateTime date, double summ, string type="")
 {
     var provider = new ExampleShipmentParamsProvider(shipment, date, summ, type);
     return new ShipmentOperationBuilder(provider);
 }