protected Posting AddPosting(ref ShipmentOperation operation, string debt, string cred, DateTime date, Money summ, string comment = "", string type = "Standart")
        {
            var accDebt = _provider.GetAccount(debt);
            var accCred = _provider.GetAccount(cred);

            var posting = new Posting(type, accDebt, accCred, date, summ, String.IsNullOrEmpty(comment) ? operation.Comment : comment);

            operation.AddPosting(posting);

            return posting;
        }
 protected Posting AddPosting(ref ShipmentOperation operation, string debt, string cred)
 {
     return this.AddPosting(ref operation, debt, cred, operation.Date, operation.Summ, operation.Comment, "Standart");
 }
 protected Posting AddPosting(ref ShipmentOperation operation, string debt, string cred, Money summ, string comment = "", string type = "Standart")
 {
     return this.AddPosting(ref operation, debt, cred, operation.Date, summ, comment, type);
 }
        private ShipmentOperation Payment(DateTime date, Money summ, string type = "Payment Debtor")
        {
            // определяем комиссию по платежу
            var commission = this.CalculateCommission(summ);

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

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

            #region Формируем проводки
            // погашение долга дебитора
            string holder = _provider["Holder"];
            if (holder.Equals("debtor", StringComparison.InvariantCultureIgnoreCase))
                this.AddPosting(ref result, "612 12", "478 03");
            else if (holder.Equals("customer", StringComparison.InvariantCultureIgnoreCase))
                this.AddPosting(ref result, "612 12", "474 23");

            // погашение внебалансовых документов (номинала накладных)
            this.AddPosting(ref result, "999 99", "914 18");

            // погашение внебалансовых поручительств
            if (_provider["StatusRegress"])
                this.AddPosting(ref result, "999 99", "914 14");

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

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

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

                //списание (погашение) уже нарощенной комиссии
                this.AddPosting(ref result, "474 01", "474 23", result.Date, result.Commission.Increased, comment, "Commission");

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

                // зачисление в НДС
                this.AddPosting(ref result, "474 23", "603", result.Date, 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;
        }
        private ShipmentOperation IncreasedCommission(DateTime date, Money summ)
        {
            // определяем комиссию в момент финансирования
            var commission = this.CalculateCommission(summ);

            // создаем операцию наращивания
            var result = new ShipmentOperation("IncreasedCommission", date, summ, this.MakeComment(CommentIncreasedCommission))
            {
                Commission = commission
            };

            #region Формируем проводки
            // наращивание комиссии в прибыль
            this.AddPosting(ref result, "474 23", "706 01", result.Commission.IncreseNeeded);
            #endregion

            return result;
        }
        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;
        }
        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;
        }