Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @using System
- @using System.Collections.Generic
- @using System.Linq
- @using System.Diagnostics
- @using Resto.Front.PrintTemplates.Reports
- @using Resto.Front.PrintTemplates.Reports.TemplateModels
- @using Resto.Front.PrintTemplates.RmsEntityWrappers
- @using Resto.Front.PrintTemplates.Reports.OlapReports
- @using Resto.Front.PrintTemplates.RmsEntityWrappers
- @* 041 Выручка по типам с налогами *@
- @* Парный к 011-му отчет по кассовым данным *@
- @inherits TemplateBase
- @{
- FillData();
- FillSalesData();
- }
- @if (!Model.IsOnlyBodyMarkupRequired)
- {
- <doc formatter="split">
- @Header()
- @Body()
- @Footer()
- </doc>
- }
- else
- {
- <doc formatter="split">
- @Body()
- </doc>
- }
- @helper Header()
- {
- var terminalName = Model.CashRegister != null
- ? string.Format(Resources.TerminalNumberNamePattern, Model.CashRegister.Number, Model.Group.Name)
- : string.Format(Resources.TerminalNamePattern, Model.CurrentTerminal, Model.Group.Name);
- foreach (var headerLine in Model.CafeSetup.ReportHeader.Split(Environment.NewLine.ToCharArray()))
- {
- <left>
- <whitespace-preserve>@headerLine</whitespace-preserve>
- </left>
- }
- <np />
- <center>@Model.Name</center>
- <np />
- <pair left="@Resources.HeadTerminal" right="@terminalName" fit="left" />
- if (Model.CafeSession != null)
- {
- <pair left="@Resources.HeadCashRegisterShift" right="@Model.CafeSession.Number" fit="right" />
- <pair left="@Resources.HeadCashRegisterShiftOpened" right="@FormatLongDateTime(Model.CafeSession.OpenTime)" fit="right" />
- }
- <pair left="@Resources.HeadCurrentTime" right="@FormatLongDateTime(Model.CurrentTime)" fit="right" />
- <table>
- <columns>
- <column autowidth=""/>
- <column align="right"/>
- </columns>
- <cells>
- <ct>@Resources.HeadCurrentUser</ct>
- <ct>@(Model.CurrentUser == null ? string.Empty : Model.CurrentUser.Name)</ct>
- </cells>
- </table>
- <np />
- <center>Подразделение: @Model.Group.Name</center>
- }
- @helper Footer()
- {
- <np />
- <center>
- @string.Format(Resources.AllSumsInFormat, Model.CafeSetup.CurrencyName)
- </center>
- <np />
- }
- @helper Body()
- {
- var k = 0;
- var Type = "";
- <np />
- <center>ПРИХОД</center>
- <np />
- <center>Выручка</center>
- <table>
- <columns>
- <column formatter="split" />
- <column align="right" autowidth="" />
- </columns>
- <cells>
- <linecell symbols="-" />
- <ct>@Resources.PaymentType</ct>
- <ct>@Resources.Sum</ct>
- <linecell symbols="-" />
- @foreach (var groupIsFiscal in salesData)
- {
- var c = 0;
- <c colspan="0"><np /></c>
- foreach (var groupPaymentGroup in groupIsFiscal.Value)
- {
- // Если несколько групп оплаты, то между ними вставляем пустую строку
- if (c++ > 0)
- {
- <c colspan="0"><np /></c>
- }
- foreach (var saleInfo in groupPaymentGroup.Value)
- {
- Type = saleInfo.PaymentTypeName.ToLower();
- if (Type.Contains("наличные") || Type.Contains("банковские карты") || Type.Contains("депозит"))
- {
- <c colspan="2">@groupPaymentGroup.Key.GetLocalName()</c>
- <ct>@string.Format(Resources.TotalSub, groupPaymentGroup.Key.GetLocalName())</ct>
- <ct>@FormatPrice(saleInfo.Sum)</ct>
- k= k+ Decimal.ToInt32(saleInfo.Sum);
- }
- }
- }
- }
- <linecell symbols="-" />
- <ct>@Resources.TotalSales</ct>
- <ct>@FormatPrice(k)</ct>
- </cells>
- </table>
- <np />
- <np />
- <center>Принятая предоплата</center>
- <np />
- var payments = closedOrdersSource.SelectMany(order => order.Payments).ToList();
- <table>
- <columns>
- <column autowidth="" />
- <column formatter="split" />
- <column formatter="split" />
- <column align="right" autowidth="" />
- </columns>
- <cells>
- <c colspan="4"></c>
- <linecell symbols="-" />
- <ct>@Resources.OrderColumn</ct>
- <ct>@Resources.TableColumn</ct>
- <ct>@Resources.PaymentType</ct>
- <ct>@Resources.SumTitle</ct>
- <linecell symbols="-" />
- @GetPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.Cash).ToList(),Resources.PaymentTypeGroupCashTitle)
- @GetPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.Card).ToList(),Resources.PaymentTypeGroupCardTitle)
- @GetPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupCreditTitle)
- @GetPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && !IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupNonCashTitle)
- </cells>
- </table>
- <table>
- <columns>
- <column formatter="split" />
- <column align="left" autowidth="" />
- <column align="right" autowidth="" />
- </columns>
- <cells>
- <linecell symbols="-" />
- <c>@Resources.PaymentType</c>
- <ct>@Resources.Cheques</ct>
- <ct>@Resources.Sum</ct>
- <linecell symbols="-" />
- @GetTotalPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.Cash).ToList(),Resources.PaymentTypeGroupCashTitle)
- @GetTotalPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.Card).ToList(),Resources.PaymentTypeGroupCardTitle)
- @GetTotalPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupCreditTitle)
- @GetTotalPrepay(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && !IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupNonCashTitle)
- <linecell symbols="-" />
- @GetAllTotalPrepay(payments.ToList())
- <linecell symbols="-" />
- </cells>
- </table>
- <np />
- <center>РАСХОД</center>
- <np />
- <center>Возврат предоплаты</center>
- <np />
- <table>
- <columns>
- <column autowidth="" />
- <column formatter="split" />
- <column formatter="split" />
- <column align="right" autowidth="" />
- </columns>
- <cells>
- <c colspan="4"></c>
- <linecell symbols="-" />
- <ct>@Resources.OrderColumn</ct>
- <ct>@Resources.TableColumn</ct>
- <ct>@Resources.PaymentType</ct>
- <ct>@Resources.SumTitle</ct>
- <linecell symbols="-" />
- @GetPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.Cash).ToList(),Resources.PaymentTypeGroupCashTitle)
- @GetPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.Card).ToList(),Resources.PaymentTypeGroupCardTitle)
- @GetPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupCreditTitle)
- @GetPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && !IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupNonCashTitle)
- </cells>
- </table>
- <table>
- <columns>
- <column formatter="split" />
- <column align="left" autowidth="" />
- <column align="right" autowidth="" />
- </columns>
- <cells>
- <linecell symbols="-" />
- <c>@Resources.PaymentType</c>
- <ct>@Resources.Cheques</ct>
- <ct>@Resources.Sum</ct>
- <linecell symbols="-" />
- @GetTotalPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.Cash).ToList(),Resources.PaymentTypeGroupCashTitle)
- @GetTotalPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.Card).ToList(),Resources.PaymentTypeGroupCardTitle)
- @GetTotalPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupCreditTitle)
- @GetTotalPrepayReturn(payments.Where(p => p.PaymentType.Group == PaymentGroup.NonCash && !IsCreditPaymentType(p.PaymentType)).ToList(),Resources.PaymentTypeGroupNonCashTitle)
- <linecell symbols="-" />
- @GetAllTotalPrepayReturn(payments.ToList())
- <linecell symbols="-" />
- </cells>
- </table>
- <np />
- <center>Без выручки</center>
- <np />
- <table>
- <columns>
- <column formatter="split" />
- <column align="left" autowidth="" />
- <column align="right" autowidth="" />
- </columns>
- <cells>
- <c colspan="3"></c>
- <linecell symbols="-" />
- <c>@Resources.PaymentType</c>
- <ct>@Resources.Cheques</ct>
- <ct>@Resources.Sum</ct>
- <linecell symbols="-" />
- @GetWriteoff(payments.Where(p => p.PaymentType.Group == PaymentGroup.Writeoff).ToList())
- <linecell symbols="-" />
- @GetWriteoffTotal(payments.Where(p => p.PaymentType.Group == PaymentGroup.Writeoff).ToList())
- <linecell symbols="-" />
- </cells>
- </table>
- }
- @* Создаёт разметку для подраздела Приняте предоплаты *@
- @helper GetPrepay(List<ClosedOrderPayment> closedPayments, string Pay)
- {
- if (Pay == "ОПЛАЧЕНО ЗА НАЛИЧНЫЕ")
- {
- Pay = "Наличные";
- }
- if (Pay == "ВЫРУЧКА ПО КАРТАМ")
- {
- Pay = "Банковские карты";
- }
- if (Pay.Contains("БЕЗНАЛИЧН"))
- {
- Pay = "Безналичный расчет";
- }
- foreach (var closedPaymentsGroup in closedPayments.GroupBy(x => x.Timestamp.Date))
- {
- foreach (var closedPayment in closedPaymentsGroup.OrderBy(x => x.Timestamp))
- {
- switch (closedPayment.CloseType)
- {
- case OrderCloseType.Prepay:
- {
- <ct>@closedPayment.Order.Number</ct>
- <ct>@closedPayment.Order.TableNumber</ct>
- <ct>@Pay</ct>
- <ct>@FormatPrice(closedPayment.Sum)</ct>
- break;
- }
- }
- }
- }
- // @GetOperationTypesSummary(closedPayments)
- }
- @* Создаёт разметку для подраздела Возврат предоплат *@
- @helper GetPrepayReturn(List<ClosedOrderPayment> closedPayments, string Pay)
- {
- Pay = PayName(Pay);
- foreach (var closedPaymentsGroup in closedPayments.GroupBy(x => x.Timestamp.Date))
- {
- foreach (var closedPayment in closedPaymentsGroup.OrderBy(x => x.Timestamp))
- {
- switch (closedPayment.CloseType)
- {
- case OrderCloseType.PrepayReturn:
- {
- <ct>@closedPayment.Order.Number</ct>
- <ct>@closedPayment.Order.TableNumber</ct>
- <ct>@Pay</ct>
- <ct>@FormatPrice(closedPayment.Sum)</ct>
- break;
- }
- }
- }
- }
- }
- @* Возвращает итоги по Предоплатам внутри группы типов платежей (например, для группы платежей по банковским картам: MasterCard, Visa и т.п.) *@
- @helper GetTotalPrepay(IEnumerable<ClosedOrderPayment> closedPayments, string Pay)
- {
- Pay = PayName(Pay);
- foreach (var group in closedPayments.GroupBy(x => x.CloseType))
- {
- switch (group.Key)
- {
- case OrderCloseType.Prepay:
- {
- <ct>@string.Format(Resources.TotalSub, Pay)</ct>
- <ct>@group.Count()</ct>
- <ct>@FormatPrice(group.Sum(x => x.Sum))</ct>
- break;
- }
- }
- }
- }
- @* Возвращает итоги по Предоплатам внутри группы типов платежей (например, для группы платежей по банковским картам: MasterCard, Visa и т.п.) *@
- @helper GetAllTotalPrepay(IEnumerable<ClosedOrderPayment> closedPayments)
- {
- //Pay = PayName(Pay);
- foreach (var group in closedPayments.GroupBy(x => x.CloseType))
- {
- switch (group.Key)
- {
- case OrderCloseType.Prepay:
- {
- <ct>@string.Format(Resources.TotalSub, "Предоплат")</ct>
- <ct>@group.Count()</ct>
- <ct>@FormatPrice(group.Sum(x => x.Sum))</ct>
- break;
- }
- }
- }
- }
- @* Возвращает итоги по Предоплатам внутри группы типов платежей (например, для группы платежей по банковским картам: MasterCard, Visa и т.п.) *@
- @helper GetTotalPrepayReturn(IEnumerable<ClosedOrderPayment> closedPayments, string Pay)
- {
- Pay = PayName(Pay);
- foreach (var group in closedPayments.GroupBy(x => x.CloseType))
- {
- switch (group.Key)
- {
- case OrderCloseType.PrepayReturn:
- {
- <ct>@string.Format(Resources.TotalSub, Pay)</ct>
- <ct>@group.Count()</ct>
- <ct>@FormatPrice(group.Sum(x => x.Sum))</ct>
- break;
- }
- }
- }
- }
- @* Возвращает итоги по Предоплатам внутри группы типов платежей (например, для группы платежей по банковским картам: MasterCard, Visa и т.п.) *@
- @helper GetAllTotalPrepayReturn(IEnumerable<ClosedOrderPayment> closedPayments)
- {
- //Pay = PayName(Pay);
- foreach (var group in closedPayments.GroupBy(x => x.CloseType))
- {
- switch (group.Key)
- {
- case OrderCloseType.PrepayReturn:
- {
- <ct>@string.Format(Resources.TotalSub, "Предоплат")</ct>
- <ct>@group.Count()</ct>
- <ct>@FormatPrice(group.Sum(x => x.Sum))</ct>
- break;
- }
- }
- }
- }
- @* Без выручки по типам *@
- @helper GetWriteoff(IEnumerable<ClosedOrderPayment> closedPayments)
- {
- //Pay = PayName(Pay);
- foreach (var group in closedPayments.GroupBy(x => x.PaymentType))
- {
- <ct>@group.Key.Name</ct>
- <ct>@group.Count()</ct>
- <ct>@FormatPrice(group.Sum(x => x.Sum))</ct>
- }
- }
- @* Без выручки (все) *@
- @helper GetWriteoffTotal(IEnumerable<ClosedOrderPayment> closedPayments)
- {
- //Pay = PayName(Pay);
- foreach (var group in closedPayments.GroupBy(x => x.CloseType))
- {
- <ct>@string.Format(Resources.TotalSub, "Без выручки")</ct>
- <ct>@group.Count()</ct>
- <ct>@FormatPrice(group.Sum(x => x.Sum))</ct>
- }
- }
- @functions
- {
- private SortedDictionary<bool, Dictionary<PaymentGroup, List<DetailedSaleInfo>>> salesData;
- private IEnumerable<TaxInfo> taxesData;
- private int totalChequesNum;
- private IEnumerable<ClosedOrder> closedOrdersSource;
- /// <summary>
- /// Заполнение данных о всех оплатах
- /// </summary>
- private void FillData()
- {
- var session = Model.CafeSession;
- if (session == null)
- return;
- // получить все транзакции оплаты, сгруппированные по заказам
- var transactions = Model.Transactions.GetOrderPaymentTransactionsBySession(session)
- .Where(tr => tr.Order != null)
- .GroupBy(tr => tr.Order)
- .ToDictionary(g => g.Key, g => (ICollection<IOrderPaymentTransaction>)g.ToArray());
- closedOrdersSource = session.ClosedOrders
- .Concat(session.StornedOrders)
- .Except(transactions.Keys)
- .Select(order => new ClosedOrder(order, new IOrderPaymentTransaction[0]))
- .Concat(transactions.Select(tr => new ClosedOrder(tr.Key, tr.Value)))
- .ToList();
- }
- public sealed class ClosedOrder
- {
- public readonly int Number;
- public readonly int TableNumber;
- public readonly string WaiterName;
- /// <summary>
- /// Оплаты (включая предоплаты)
- /// </summary>
- public readonly List<ClosedOrderPayment> Payments;
- /// <summary>
- /// Скидки и надбавки
- /// </summary>
- public readonly List<ClosedOrderDiscountItem> Discounts;
- /// <summary>
- /// Оплаченные элементы заказа
- /// </summary>
- public readonly List<OrderItem> Items;
- public ClosedOrder(IOrder order, ICollection<IOrderPaymentTransaction> transactions)
- {
- Number = order.Number;
- TableNumber = order.Table.Number;
- WaiterName = order.Waiter == null ? null : order.Waiter.Name;
- Payments = BuildClosedOrderPaymentList(order, transactions).ToList();
- Discounts = order.DiscountItems.Select(item => new ClosedOrderDiscountItem(item, order.GetFullSum())).ToList();
- Items = order.GetIncludedEntries().Select(item => new OrderItem(item, order)).ToList();
- }
- private IEnumerable<ClosedOrderPayment> BuildClosedOrderPaymentList(IOrder baseOrder, ICollection<IOrderPaymentTransaction> transactions)
- {
- var closedOrderPayments = new List<ClosedOrderPayment>();
- var prepays = transactions.OfType<IOrderPrepayTransaction>().Where(tr => tr.TransactionType == OrderPaymentTransactionType.Prepay);
- closedOrderPayments.AddRange(prepays.Select(tr => new ClosedOrderPayment(tr, ParseCloseType(tr, baseOrder), this)));
- var returnPrepays = transactions.OfType<IOrderPrepayTransaction>().Where(tr => tr.TransactionType == OrderPaymentTransactionType.PrepayReturn);
- closedOrderPayments.AddRange(returnPrepays.Select(tr => new ClosedOrderPayment(tr, ParseCloseType(tr, baseOrder), this)));
- var payments = transactions.Where(tr => !(tr is IOrderPrepayTransaction) && !(tr is IOrderPrepayClosedTransaction));
- closedOrderPayments.AddRange(payments.Select(tr => new ClosedOrderPayment(tr, ParseCloseType(tr, baseOrder), this)));
- if (baseOrder.CloseInfo == null || baseOrder.CloseInfo.WriteoffItem == null)
- return closedOrderPayments;
- // создать фейковую транзакцию для типа оплаты "Без выручки" и добавить в список
- var fakeTransaction = new FakeWriteoffPaymentTransactionForReport(baseOrder.CloseInfo.WriteoffItem, baseOrder.CloseInfo, false);
- closedOrderPayments.Add(new ClosedOrderPayment(fakeTransaction, ParseCloseType(fakeTransaction, baseOrder), this));
- // создать фейковую транзакцию для сторнированного заказа (показывать с отриц.суммами) с типом оплаты "Без выручки" и добавить в список
- if (baseOrder.Status == OrderStatus.Deleted)
- {
- fakeTransaction = new FakeWriteoffPaymentTransactionForReport(baseOrder.CloseInfo.WriteoffItem, baseOrder.CloseInfo, true);
- closedOrderPayments.Add(new ClosedOrderPayment(fakeTransaction, ParseCloseType(fakeTransaction, baseOrder), this));
- }
- return closedOrderPayments;
- }
- }
- public sealed class ClosedOrderPayment
- {
- public readonly IPaymentType PaymentType;
- /// <summary>
- /// Номер платёжной банковской карты для типа оплаты "Банковские карты".
- /// Во фронте нет возможности узнать номер платёжной банковской карты
- /// </summary>
- public readonly string CardNumber = string.Empty;
- /// <summary>
- /// Контрагент для типа оплаты "В кредит"
- /// </summary>
- public readonly string CreditUserName;
- /// <summary>
- /// Карта контрагента для типа оплаты "В кредит"
- /// </summary>
- public readonly string CreditUserMaskedCardNumber;
- /// <summary>
- /// Причина оплаты "За счет заведения" (Без выручки)
- /// </summary>
- public readonly string WriteoffReason;
- /// <summary>
- /// Кассир
- /// </summary>
- public readonly string CashierName;
- /// <summary>
- /// Кем авторизована транзакция оплаты
- /// </summary>
- public readonly string AuthUserName;
- /// <summary>
- /// Родительский заказ
- /// </summary>
- public readonly ClosedOrder Order;
- public readonly OrderCloseType CloseType;
- public readonly decimal Sum;
- public readonly DateTime Timestamp;
- public ClosedOrderPayment(IOrderPaymentTransaction paymentTransaction, OrderCloseType closeType, ClosedOrder closedOrder)
- {
- PaymentType = paymentTransaction.PaymentType;
- CloseType = closeType;
- Sum = paymentTransaction.Sum;
- Timestamp = paymentTransaction.Date;
- CashierName = paymentTransaction.Cashier.Name;
- Order = closedOrder;
- // Если это транзакции оплаты "В кредит"
- var creditTransaction = paymentTransaction as ICreditPaymentTransaction;
- if (creditTransaction != null && creditTransaction.Counteragent != null)
- {
- CreditUserName = creditTransaction.Counteragent.Name;
- if (creditTransaction.CreditCounteragentCardSlided && !string.IsNullOrEmpty(creditTransaction.Counteragent.Card))
- CreditUserMaskedCardNumber = MaskCardNumber(creditTransaction.Counteragent.Card, 3);
- }
- // Если это транзакция оплаты "Без выручки", заполняем причину списания
- // Иначе заполняем юзера, который подтвердил оплату
- //var writeoffPaymentTransaction = paymentTransaction as FakeWriteoffPaymentTransactionForReport;
- }
- }
- private sealed class FakeWriteoffPaymentTransactionForReport : IOrderPaymentTransaction
- {
- private readonly IWriteoffPaymentItem paymentItem;
- private readonly IOrderCloseInfo closeInfo;
- private readonly bool isViewOrderAsStorned;
- public FakeWriteoffPaymentTransactionForReport(IWriteoffPaymentItem paymentItem, IOrderCloseInfo closeInfo, bool isViewOrderAsStorned)
- {
- this.paymentItem = paymentItem;
- this.closeInfo = closeInfo;
- this.isViewOrderAsStorned = isViewOrderAsStorned;
- }
- // Время закрытия заказа, но проставляется и как время оплаты, и как время сторнирования
- public DateTime Date
- {
- get { throw new NotSupportedException(); }
- }
- public decimal Sum
- {
- get { return isViewOrderAsStorned ? -paymentItem.Sum : paymentItem.Sum; }
- }
- public bool IsFiscal
- {
- get { throw new NotSupportedException(); }
- }
- public IOrder Order
- {
- get { throw new NotSupportedException(); }
- }
- public IUser Cashier
- {
- get { throw new NotSupportedException(); }
- }
- public IPaymentType PaymentType
- {
- get { return paymentItem.Type; }
- }
- public OrderPaymentTransactionType TransactionType
- {
- get { return OrderPaymentTransactionType.OnTheHouse; }
- }
- public int ChequeNumber
- {
- get { throw new NotSupportedException(); }
- }
- public bool IsPurchase
- {
- get { throw new NotSupportedException(); }
- }
- public IAuthData AuthData
- {
- get { throw new NotSupportedException(); }
- }
- public bool IsWaiterDebt
- {
- get { throw new NotSupportedException(); }
- }
- public ICurrencyInfo CurrencyInfo
- {
- get { throw new NotImplementedException(); }
- }
- public Guid OrderId
- {
- get { throw new NotImplementedException(); }
- }
- public bool IsDeliveryOrder
- {
- get { throw new NotImplementedException(); }
- }
- }
- public sealed class ClosedOrderDiscountItem
- {
- /// <summary>
- /// Тип скидки или надбавки
- /// </summary>
- public readonly string DiscountTypeName;
- /// <summary>
- /// Процент скидки или надбавки
- /// </summary>
- public readonly decimal DiscountPercent;
- /// <summary>
- /// Кем авторизована скидка
- /// </summary>
- public readonly string AuthUserName;
- /// <summary>
- /// Имя гостя, если скидка по карте
- /// </summary>
- public readonly string GuestName;
- /// <summary>
- /// Трек гостевой катры, если скидка по карте
- /// </summary>
- public readonly string GuestCardTrack;
- /// <summary>
- /// Является ли скидка автоматической
- /// </summary>
- public readonly bool IsAutomatic;
- /// <summary>
- /// Является ли скидка скидкой на категорию
- /// </summary>
- public readonly bool IsCategorised;
- /// <summary>
- /// Количество отображаемых и печатаемых цифр номера карты, если скидка по карте
- /// </summary>
- private readonly int? visibleDigitsCount;
- public int VisibleDigitsCount
- {
- get
- {
- if (!visibleDigitsCount.HasValue)
- throw new NotSupportedException();
- return visibleDigitsCount.Value;
- }
- }
- public ClosedOrderDiscountItem(IDiscountItem item, decimal orderSum)
- {
- IsAutomatic = item.Source == DiscountSource.Auto;
- DiscountPercent = ModelExtensions.CalculateDiscountPercent(orderSum, item.GetDiscountSum());
- DiscountTypeName = item.Type.Name;
- IsCategorised = item.IsCategorized;
- AuthUserName = item.AuthData != null ? item.AuthData.User.Name : null;
- if (item.CardInfo == null)
- return;
- visibleDigitsCount = item.NumOfPrintedDigits;
- GuestCardTrack = item.CardInfo.Card;
- GuestName = item.CardInfo.Owner;
- }
- }
- /// <summary>
- /// Отдельная позиция закрытого заказа (блюдо)
- /// </summary>
- public sealed class OrderItem
- {
- public readonly string Name;
- public readonly decimal Amount;
- public readonly decimal Sum;
- public OrderItem(IOrderEntry baseOrderItem, IOrder order)
- {
- Amount = baseOrderItem.Amount;
- Name = baseOrderItem.Product.Name;
- Sum = baseOrderItem.GetVatSumExcludedFromPriceForOrderEntry(order.DiscountItems) + baseOrderItem.GetCost();
- }
- }
- public enum OrderCloseType
- {
- /// <summary>
- /// Продажа
- /// </summary>
- Sale,
- /// <summary>
- /// Возврат заказа
- /// </summary>
- Storno,
- /// <summary>
- /// Внесение предоплаты
- /// </summary>
- Prepay,
- /// <summary>
- /// Возврат предоплаты
- /// </summary>
- PrepayReturn
- };
- private static OrderCloseType ParseCloseType(IOrderPaymentTransaction transaction, IOrder baseOrder)
- {
- switch (transaction.TransactionType)
- {
- case OrderPaymentTransactionType.Cash:
- case OrderPaymentTransactionType.Card:
- case OrderPaymentTransactionType.Credit:
- case OrderPaymentTransactionType.OnTheHouse:
- {
- // Если заказ сторнирован и показывается с отрицательной суммой, присваиваем OrderCloseType = Storno.
- // Все потому что для сторнирования не предусмотрен отдельный тип транзакции,
- // поэтому различаем сторнирование от продажи с помощью знаков суммы транзакции
- return baseOrder.Status == OrderStatus.Deleted
- ? transaction.Sum > 0
- ? OrderCloseType.Sale
- : OrderCloseType.Storno
- : OrderCloseType.Sale;
- }
- case OrderPaymentTransactionType.Prepay:
- return OrderCloseType.Prepay;
- case OrderPaymentTransactionType.PrepayReturn:
- return OrderCloseType.PrepayReturn;
- default:
- throw new NotSupportedException();
- }
- }
- private static string PayName(string Pay)
- {
- if (Pay == "ОПЛАЧЕНО ЗА НАЛИЧНЫЕ")
- {
- Pay = "Наличные";
- }
- if (Pay == "ВЫРУЧКА ПО КАРТАМ")
- {
- Pay = "Банковские карты";
- }
- if (Pay.Contains("БЕЗНАЛИЧНЫ"))
- {
- Pay = "Безналичный расчет";
- }
- return Pay;
- }
- /// <summary>
- /// Возвращает название операции (для заголовка, в единственном числе)
- /// </summary>
- private static string GetOrderCloseTypeName(OrderCloseType closeType)
- {
- switch (closeType)
- {
- case OrderCloseType.Sale:
- return Resources.OrderCloseTypeSell;
- case OrderCloseType.Prepay:
- return Resources.OrderCloseTypePrepay;
- case OrderCloseType.Storno:
- return Resources.OrderCloseTypeStorno;
- case OrderCloseType.PrepayReturn:
- return Resources.OrderCloseTypePrepayReturn;
- default:
- throw new ArgumentOutOfRangeException("closeType");
- }
- }
- /// <summary>
- /// Возвращает название операции (для итогов, во множественном числе)
- /// </summary>
- private static string GetOrderCloseTypeSummaryName(OrderCloseType closeType)
- {
- switch (closeType)
- {
- case OrderCloseType.Sale:
- return Resources.OrderCloseTypeSummarySell;
- case OrderCloseType.Prepay:
- return Resources.OrderCloseTypeSummaryPrepay;
- case OrderCloseType.Storno:
- return Resources.OrderCloseTypeSummaryStorno;
- case OrderCloseType.PrepayReturn:
- return Resources.OrderCloseTypeSummaryPrepayReturn;
- default:
- throw new ArgumentOutOfRangeException("closeType");
- }
- }
- private static IWriteoffPaymentType GetWriteoffPaymentType(IPaymentType paymentType)
- {
- var cpt = paymentType as IConfigurablePaymentType;
- if (cpt != null)
- paymentType = cpt.BasePaymentType;
- return (IWriteoffPaymentType)paymentType;
- }
- private static bool IsCreditPaymentType(IPaymentType paymentType)
- {
- var cpt = paymentType as IConfigurablePaymentType;
- if (cpt != null)
- paymentType = cpt.BasePaymentType;
- return paymentType is ICreditPaymentType;
- }
- private static string MaskCardNumber(string cardTrack, int visibleDigitsCount)
- {
- if (string.IsNullOrEmpty(cardTrack))
- throw new ArgumentException("Card track must contain at least one digit", "cardTrack");
- if (visibleDigitsCount < 0)
- throw new ArgumentOutOfRangeException("visibleDigitsCount", "Visible digits count must be greater than or equal to zero.");
- if (visibleDigitsCount == 0)
- return string.Empty;
- return cardTrack.Length > visibleDigitsCount
- ? string.Format(Resources.GuestCardMaskFormat, cardTrack.Substring(cardTrack.Length - visibleDigitsCount))
- : string.Format(Resources.GuestCardFormat, cardTrack);
- }
- private sealed class SaleInfo
- {
- public bool IsFiscal { get; set; }
- public PaymentGroup PaymentGroup { get; set; }
- public DetailedSaleInfo DetailedSaleInfo { get; set; }
- }
- private sealed class DetailedSaleInfo
- {
- public string PaymentTypeName { get; set; }
- public int ChequesNum { get; set; }
- public decimal Sum { get; set; }
- }
- private sealed class TaxInfo
- {
- public decimal VatPercent { get; set; }
- public decimal VatSum { get; set; }
- public decimal Sum { get; set; }
- }
- /// <summary>
- /// Заполнение данных о фискальных/нефискальных оплатах
- /// </summary>
- private void FillSalesData()
- {
- var session = Model.CafeSession;
- if (session == null)
- return;
- var transactionsBySession = Model.Transactions.GetOrderPaymentTransactionsBySession(session)
- // Предоплаты учитываем только после оплаты заказа и не учитываем сторнированные заказы
- .Where(pt => !(pt is IOrderPrepayTransaction) && (pt.Order == null || !pt.Order.IsStorned))
- .ToList();
- // Группировка по фиск./нефиск. типам, потом по группам оплаты, где у каждой группы оплаты есть список DetailedSaleInfo (тип оплаты с количеством заказов и суммой)
- var sales = transactionsBySession
- .GroupBy(t => t.PaymentType)
- .Select(data => new SaleInfo
- {
- IsFiscal = data.Key.PrintCheque,
- PaymentGroup = data.Key.Group,
- DetailedSaleInfo = new DetailedSaleInfo
- {
- PaymentTypeName = data.Key.Name,
- Sum = data.Sum(t => t.Sum),
- ChequesNum = data.Select(t => t.Order).Distinct().Count()
- }
- })
- .GroupBy(sale => sale.IsFiscal)
- .ToDictionary(fiscalGroup => fiscalGroup.Key, fiscalGroup => fiscalGroup
- .GroupBy(sale => sale.PaymentGroup)
- .ToDictionary(paymentGroupGroup => paymentGroupGroup.Key, paymentGroupGroup => paymentGroupGroup
- .Select(info => info.DetailedSaleInfo)
- .OrderBy(info => info.PaymentTypeName)
- .ToList()));
- if (!sales.ContainsKey(true))
- sales.Add(true, new Dictionary<PaymentGroup, List<DetailedSaleInfo>>());
- if (!sales.ContainsKey(false))
- sales.Add(false, new Dictionary<PaymentGroup, List<DetailedSaleInfo>>());
- salesData = new SortedDictionary<bool, Dictionary<PaymentGroup, List<DetailedSaleInfo>>>(sales, new DescendingComparer<bool>());
- totalChequesNum = transactionsBySession.Select(t => t.Order).Distinct().Count();
- }
- private sealed class DescendingComparer<T> : IComparer<T> where T : IComparable<T>
- {
- public int Compare(T x, T y)
- {
- return y.CompareTo(x);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement