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