@using System.Collections.Generic @using System.Linq @using Resto.Front.PrintTemplates.Cheques.Razor @using Resto.Front.PrintTemplates.Cheques.Razor.TemplateModels @using Resto.Front.PrintTemplates.RmsEntityWrappers @inherits TemplateBase @{ var order = Model.Order; var chequeInfo = Model.ChequeInfo; var session = chequeInfo.Session; var notDeletedItems = order.Guests.SelectMany(guest => guest.Items).Where(item => item.DeletionInfo == null).ToList(); var fullSum = order.GetFullSum(); var subTotal = fullSum - order.DiscountItems.Where(discountItem => discountItem.IsCategorized && discountItem.PrintDetailedInPrecheque).Sum(discountItem => discountItem.GetDiscountSum()); var vatSum = order.GetVatSumExcludedFromPrice(); var resultSum = subTotal - order.DiscountItems.Where(discountItem => !discountItem.IsCategorized || !discountItem.PrintDetailedInPrecheque).Sum(discountItem => discountItem.GetDiscountSum()) + vatSum; var changeSum = order.Payments.Sum(p => p.Sum) + order.GetPrepaySum() - resultSum; var discountItems = order.DiscountItems.ToList(); List prepays; List paymentsData; if (order.CloseInfo != null) { var paymentDiscounts = order.CloseInfo.DiscountsForPaymentsAsDiscount.ToList(); discountItems.AddRange(paymentDiscounts); resultSum -= paymentDiscounts.Sum(pd => pd.DiscountSums.Values.Sum()); changeSum = 0; prepays = order.PrePayments.Where(p => !p.IsProcessedAsDiscount).ToList(); paymentsData = order.Payments.Where(p => !p.Type.ProcessAsDiscount).ToList(); } else { prepays = order.PrePayments.ToList(); paymentsData = order.Payments.ToList(); } var payments = paymentsData .Where(p => p.Type.Group != PaymentGroup.Cash) .Select(p => new { p.Type.Name, p.Sum }) // Показываем сумму наличными так, будто оплачено без сдачи. // Если наличных платежей нет, все равно явно показываем, что сумма наличными == 0. .StartWith(new { Name = Resources.Cash, Sum = paymentsData.Where(p => p.Type.Group == PaymentGroup.Cash).Sum(p => p.Sum) - changeSum }) .ToList(); var categorizedDiscountItems = new List(); var nonCategorizedDiscountItems = new List(); foreach (var discountItem in discountItems) { if (discountItem.IsCategorized && discountItem.PrintDetailedInPrecheque) { categorizedDiscountItems.Add(discountItem); } else { nonCategorizedDiscountItems.Add(discountItem); } } } @* header *@ @Model.CommonInfo.CafeSetup.BillHeader
@Resources.CashMemoChequeTitle
@* body *@ @Products(notDeletedItems, categorizedDiscountItems, order.Table.Section.PrintProductItemCommentInCheque) @if (nonCategorizedDiscountItems.Count > 0) { @NonCategorizedDiscounts(nonCategorizedDiscountItems, fullSum) } @if (vatSum != 0m) { var vatSumsByVat = order.GetIncludedEntries() .Where(orderEntry => !orderEntry.VatIncludedInPrice) .GroupBy(orderEntry => orderEntry.Vat) .Where(group => group.Key != 0m) .Select(group => new { Vat = group.Key, Sum = group.Sum(orderEntry => orderEntry.ExcludedVat) }) .ToList(); foreach (var vatWithSum in vatSumsByVat) { } if (vatSumsByVat.Count > 1) { } } @* payments *@ @foreach (var prepay in prepays) { } @foreach (var payment in payments) { } @if (Model.Order.Donations.Any()) { foreach (var donation in Model.Order.Donations) { } } @* footer *@ @string.Format(Resources.SumFormat, FormatMoneyInWords(resultSum)) @Resources.Released
@Resources.MemoChequeSignature
@string.Format(Resources.AllSumsInFormat, Model.CommonInfo.CafeSetup.CurrencyName)
@Model.CommonInfo.CafeSetup.BillFooter
@helper Products(List orderItems, List categorizedDiscountItems, bool showComments) { if (orderItems.Count == 0) { @Resources.ZeroChequeBody } else { @Resources.NameColumnHeader @Resources.AmountShort @Resources.ProductPrice @Resources.ResultSum @foreach (var orderItem in orderItems) { @Product(orderItem, categorizedDiscountItems, showComments) }
} } @helper Product(IOrderItem orderItem, List categorizedDiscountItems, bool showComments) { itemsCount++; var productItem = orderItem as IProductItem; if (productItem != null && productItem.CompoundsInfo != null && productItem.CompoundsInfo.IsPrimaryComponent) { @string.Format("{0} {1}", productItem.CompoundsInfo.ModifierSchemaName, productItem.ProductSize == null ? string.Empty : productItem.ProductSize.Name) // для разделенной пиццы комменты печатаем под схемой if (showComments && productItem.Comment != null && !productItem.Comment.Deleted) { @productItem.Comment.Text
} // у пиццы не может быть удаленных модификаторов, поэтому берем весь список foreach (var orderEntry in productItem.ModifierEntries.Where(orderEntry => ModifiersFilter(orderEntry, productItem, true))) { itemsCount++; var productName = orderEntry.ProductCustomName ?? orderEntry.Product.Name; @(" " + productName) @string.Format("{0} {1} x", FormatAmount(orderEntry.Amount), orderEntry.Product.MeasuringUnit.Name) @FormatMoney(orderEntry.Price) @FormatMoney(orderEntry.Cost) @CategorizedDiscounts(orderEntry, categorizedDiscountItems) } } if (productItem != null && productItem.CompoundsInfo != null) { @(" 1/2 " + GetOrderEntryNameWithProductSize(productItem)) } else { @GetOrderEntryNameWithProductSize(orderItem) } @string.Format("{0} {1} x", FormatAmount(orderItem.Amount), orderItem.Product.MeasuringUnit.Name) @FormatMoney(orderItem.Price) @FormatMoney(orderItem.Cost) // здесь комменты для обычных блюд и целых пицц if (showComments && productItem != null && productItem.Comment != null && !productItem.Comment.Deleted && productItem.CompoundsInfo == null) { @productItem.Comment.Text
} @CategorizedDiscounts(orderItem, categorizedDiscountItems) foreach (var child in GetFilteredChildren(orderItem)) { itemsCount++; var productName = child.ProductCustomName ?? child.Product.Name; @string.Format(" {0}", productName) @string.Format("{0} {1} x", FormatAmount(child.Amount), child.Product.MeasuringUnit.Name) @FormatMoney(child.Price) @FormatMoney(child.Cost) @CategorizedDiscounts(child, categorizedDiscountItems) } } @helper CategorizedDiscounts(IOrderEntry orderEntry, IEnumerable categorizedDiscountItems) { foreach (var discountItem in categorizedDiscountItems.Where(d => d.DiscountSums.ContainsKey(orderEntry))) { @string.Format(" {0}", discountItem.Type.PrintableName) @FormatMoney(-discountItem.GetDiscountSumFor(orderEntry)) if (discountItem.CardInfo != null && !string.IsNullOrWhiteSpace(discountItem.CardInfo.MaskedCard)) { @string.Format(Resources.CardPattern, discountItem.CardInfo.MaskedCard) } } } @helper NonCategorizedDiscounts(IEnumerable discountItems, decimal fullSum) { @foreach (var discountItem in discountItems) { @discountItem.Type.PrintableName @FormatMoney(-discountItem.GetDiscountSum()) if (discountItem.CardInfo != null && !string.IsNullOrWhiteSpace(discountItem.CardInfo.MaskedCard)) { @string.Format(Resources.CardPattern, discountItem.CardInfo.MaskedCard) } }
} @functions { private int itemsCount; private static IEnumerable GetFilteredChildren(IOrderItem orderItem) { var productItem = orderItem as IProductItem; if (productItem != null) return productItem.ModifierEntries.Where(m => ModifiersFilter(m, productItem)); return ((ITimePayServiceItem)orderItem).RateScheduleEntries; } private static bool CommonModifiersFilter(bool isCommonModifier, IProductItem parent, bool onlyCommonModifiers) { if (parent.CompoundsInfo != null && parent.CompoundsInfo.IsPrimaryComponent) { if (onlyCommonModifiers && !isCommonModifier) return false; if (!onlyCommonModifiers && isCommonModifier) return false; return true; } return true; } private static bool ModifiersFilter(IModifierEntry modifierEntry, IProductItem parent, bool onlyCommonModifiers = false) { if (!CommonModifiersFilter((modifierEntry).IsCommonModifier, parent, onlyCommonModifiers)) return false; if (modifierEntry.DeletionInfo != null) return false; if (modifierEntry.Cost > 0m) return true; if (modifierEntry.ChildModifier == null) return true; if (!modifierEntry.ChildModifier.HideIfDefaultAmount) return true; var amountPerItem = modifierEntry.ChildModifier.AmountIndependentOfParentAmount ? modifierEntry.Amount : modifierEntry.Amount / GetParentAmount(parent, onlyCommonModifiers); return amountPerItem != modifierEntry.ChildModifier.DefaultAmount; } private static string GetOrderEntryNameWithProductSize(IOrderEntry orderEntry) { var productName = orderEntry.ProductCustomName ?? orderEntry.Product.Name; var productItem = orderEntry as IProductItem; return productItem == null || productItem.ProductSize == null || productItem.CompoundsInfo != null ? productName : string.Format(Resources.ProductNameWithSizeFormat, productName, productItem.ProductSize.Name); } private static decimal GetParentAmount(IOrderItem parent, bool onlyCommonModifiers) { return onlyCommonModifiers ? parent.Amount * 2 : parent.Amount; } }