From 1d4c6c7fdab48069d6e686896ec4391cd900788c Mon Sep 17 00:00:00 2001 From: serty Date: Tue, 22 Jul 2025 22:40:42 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20CashMemo.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Товарник без процентов скидок-надбавок. Только название и сумма --- CashMemo.cs | 353 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 CashMemo.cs diff --git a/CashMemo.cs b/CashMemo.cs new file mode 100644 index 0000000..6746810 --- /dev/null +++ b/CashMemo.cs @@ -0,0 +1,353 @@ +@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; + } +} \ No newline at end of file