private ShipmentOperation DocumentsIncome(DateTime date, Money summ)
        {
            // определяем комиссию МИТ
            var commission = new ShipmentCommission(0, 0, 0, 0, 0, 0, _provider.GetRate("MIT").Calculate(summ));

            // создаем операцию примема документов
            var result = new ShipmentOperation("DocumentsIncome", date, summ, this.MakeComment(CommentDocumentsIncome))
            {
                Commission = commission
            };

            #region Формируем Проводки
            // стандартная проводка покупки задолженности
            this.AddPosting(ref result, "478 03", "474 01");

            // Забалансовый счет. Отражается прием документов в учете банка (учет суммы купленного документа)
            this.AddPosting(ref result, "914 18", "999 99");

            // Забалансовый счет. Отражается учет поручительства (учет суммы документа поручительства)
            if (_provider["StatusRegress"])
                this.AddPosting(ref result, "914 14", "999 99");
            #endregion

            return result;
        }
        /// <summary>
        /// Расчет комисии от суммы пришедшего платежа
        /// </summary>
        /// <param name="summ">Сумма поступившего платежа</param>
        /// <returns>Расчитанная Комиссия за платеж</returns>
        private ShipmentCommission CalculateCommission(Money summ, bool increased = true)
        {
            // определяем текущую сумму долга поставщика (остаток тела кредита)
            double dutyCutomer = _provider["DutyCustomer"];

            // номинал накладной
            double nominal = _provider["Nominal"];

            // определяем значения ставок
            RateCommission rateStandart = _provider.GetRate("KP1");
            RateCommission rateExtra = _provider.GetRate("KP1Extra");
            RateCommission rateCommission = _provider.GetRate("KP2");
            RateCommission rateDaily = _provider.GetRate("KP3");
            RateCommission ratePeny = _provider.GetRate("Peny");

            // определяем уже оплаченную комиссию КП2 по накладной до настоящей операции
            double payedCommission = _provider["PayedCommission"];

            // остаток от плататежа
            Money rest = summ;

            //рассчет комисии КП2 всегда зависит от номинала накладной
            Money commission = (rateCommission.Calculate(nominal) - payedCommission).NotMore(rest).NotLess(0);
            rest -= commission;

            //рассчет суммы Пени от суммы платежа
            Money peny = ratePeny.Calculate(summ).NotMore(rest).NotLess(0);
            rest -= peny;

            //рассчет комисии КП3 от суммы платежа
            Money daily = rateDaily.Calculate(summ).NotMore(rest).NotLess(0);
            rest -= daily;

            // определяем ту часть тела кредита, которую можем погасить (не более остатка самого тела)
            Money body = (rest / (1 + rateStandart.Rate + rateExtra.Rate)).NotMore(dutyCutomer).NotMore(rest).NotLess(0);
            rest -= body;

            // на основании погашаемой части тела можем расчитать годовую комиссию стандарт
            Money standart = rateStandart.Calculate(body).NotMore(rest).NotLess(0);
            rest -= standart;

            // на основании погашаемой части тела можем расчитать годовую комиссию за просрочку экстра
            Money extra = new Money(rateExtra.Calculate(body)).NotMore(rest).NotLess(0);
            rest -= extra;

            // создаем комиссионную структуру
            var result = new ShipmentCommission(body, commission, standart, extra, daily, peny);

            // если необходимо, учитываем наращенную комиссию
            if (increased)
                result.Increased = this.CalculateIncreased();

            return result;
        }
        private ShipmentOperation CustomerFinancing(DateTime date, Money summ)
        {
            // номинал накладной (сумма накладной с учетом корректировок)
            double nominal = _provider["Nominal"];

            // определяем комиссию в момент финансирования
            var commission = new ShipmentCommission(0, _provider["PrepayCommission"] * _provider.GetRate("KP2").Calculate(nominal), 0, 0, 0);

            // пытаемся использовать наращенную комиссию
            // обычно такого не бывает, так как финансирум в момент покупки (сразу), когда еще не делали наращивания
            commission.Increased = this.CalculateIncreased();

            // отправлять ли (и списывать соответсвенно) комиссию на 40702
            bool sendCommissionToCustomer40702 = _provider["IsCommissionAccount407"];

            // определяем деньги для поставщика
            var toCustomer = new ShipmentOperationPartToCustomer(_provider["DateToCustomer"], (sendCommissionToCustomer40702 ? summ : summ - commission.Total).NotLess(0));

            // создаем операцию выплаты финансирования
            var result = new ShipmentOperation("CustomerFinansing", date, summ, this.MakeComment(CommentCustomerFinancing))
            {
                Commission = commission,
                ToCustomer = toCustomer
            };

            #region Формируем проводки
            if (result.Commission.Total > 0)
            {
                // комментарий для комиссионных проводок
                string comment = this.MakeComment(CommentCommission);

                // комиссионные проводки
                if (sendCommissionToCustomer40702)
                {
                    // если мы зачислили финансирование И комиссию на р/с
                    // то нужно теперь комиссию списывать с р/с
                    this.AddPosting(ref result, "40", "474 23", result.Commission.Total, this.MakeComment(CommentCommissionWriteOut), "WriteOut");
                }
                else
                {
                    // если мы НЕ зачисляли комиссию на р/с,
                    // то ее нужно списывать (рреализовывать) сразу с 47401

                    //списание (погашение) донарощенной (только что) комиссии
                    this.AddPosting(ref result, "474 01", "474 23", result.Commission.IncreseNeeded, comment, "Commission");

                    //списание (погашение) уже нарощенной комиссии ранее (скорее всего такой проводки НЕ должно быть, так как еще не было наращивания)
                    this.AddPosting(ref result, "474 01", "474 23", result.Commission.Increased, comment, "Commission");

                    //списание (погашение) НДС
                    this.AddPosting(ref result, "474 01", "474 23", result.Commission.TotalNDS, comment, "Standart");
                }

                // донаращивание комиссии (зачисление комиссии в прибыль)
                this.AddPosting(ref result, "474 23", "706 01", result.Commission.IncreseNeeded, comment, "Standart");

                // зачисление в НДС
                this.AddPosting(ref result, "474 23", "603", result.Commission.TotalNDS, comment, "Commission");
            }

            // выплата финансирования
            this.AddPosting(ref result, "474 01", "40",  result.ToCustomer.Date, result.ToCustomer.Send, result.Comment, "Payment");

            // зачитывание финансирования (если есть)
            if (result.ToCustomer.Netting.Summ > 0)
                this.AddPosting(ref result, "474 01", result.ToCustomer.Netting.Account.Number, result.ToCustomer.Date, result.ToCustomer.Netting.Summ, result.Comment, "Standart");
            #endregion

            return result;
        }