@using System @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 @Header() @Body() @Footer() @helper Header() { var delivery = Model.Delivery; var customer = delivery.Customer; var address = delivery.Address; var cafeSetup = Model.CommonInfo.CafeSetup; @Raw(string.Join(Environment.NewLine, Model.Extensions.BeforeHeader)) @cafeSetup.BillHeader
@string.Format(Resources.BillHeaderOrderNumberPattern, delivery.Number)
Customer: @customer.NameSurname() @delivery.Phone if (!delivery.IsSelfService) { Address: @string.Format(address.StringView()) @(string.IsNullOrWhiteSpace(address.AdditionalInfo) ? string.Empty : address.AdditionalInfo) if (!string.IsNullOrWhiteSpace(address.Region)) { @string.Format(Resources.AddressRegionFormat, address.Region) } } if (!string.IsNullOrWhiteSpace(customer.CardNumber)) { @string.Format(Resources.DiscountCardNumber, customer.CardNumber) } @Resources.ManagerColon @Model.CommonInfo.CurrentUser.GetNameOrEmpty() @if (!delivery.IsSelfService) { @Resources.CourierColon if (delivery.Courier != null) { @delivery.Courier.Name } else { } }
Order accepted by: @Model.Delivery.DeliveryOperator.Name @Resources.DeliveryCreatedColon @FormatDateTimeCustom(delivery.Created, "MM/dd/yyyy hh:mm tt") @Resources.DeliveryBillPrintedColon @FormatDateTimeCustom(Model.CommonInfo.CurrentTime, "MM/dd/yyyy hh:mm tt") @Resources.DeliveryDateTimeColon @FormatDateTimeCustom(delivery.DeliverTime, "MM/dd/yyyy hh:mm tt") @Resources.DeliveryRealDateTimeColon ________________
@Raw(string.Join(Environment.NewLine, Model.Extensions.AfterHeader)) } @helper Footer() { var delivery = Model.Delivery; var cafeSetup = Model.CommonInfo.CafeSetup; @Resources.DeliveryProcessingCommentsColon if (!string.IsNullOrWhiteSpace(delivery.Comment)) { @delivery.Comment } @Raw(string.Join(Environment.NewLine, Model.Extensions.AfterFooter)) } @helper Body() { var delivery = Model.Delivery; var order = delivery.Order; 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.GetChangeSum(resultSum); var paymentsAsDiscountSum = order.Payments.Concat(order.PrePayments).Where(pi => pi.Type.ProccessAsDiscount).Sum(t => t.Sum); resultSum -= paymentsAsDiscountSum; var nonCategorizedDiscounts = (from discountItem in order.DiscountItems where !discountItem.IsCategorized || !discountItem.PrintDetailedInPrecheque let discountSum = discountItem.GetDiscountSum() select new NonCategorizedDiscountItem( discountItem.Type.PrintableName, CalculatePercent(fullSum, discountSum), discountSum, discountItem.CardInfo != null && !string.IsNullOrWhiteSpace(discountItem.CardInfo.MaskedCard) ? discountItem.CardInfo.MaskedCard : string.Empty, discountItem.Type.DiscountBySum)).ToList(); foreach (var paymentItem in order.Payments.Concat(order.PrePayments).Where(pi => pi.Type.ProccessAsDiscount && pi.Type is INonCashPaymentType)) { var replaceDiscount = ((INonCashPaymentType)paymentItem.Type).ReplaceDiscount; if (replaceDiscount == null) { continue; } var iikoNetPaymentItem = paymentItem as IIikoNetPaymentItem; if (iikoNetPaymentItem != null) { var discountSum = iikoNetPaymentItem.DiscountSum; var paymentSum = paymentItem.Sum - discountSum; //добавляем информацию о платеже. Если скидки нет, информация о платеже добавляется всегда if (paymentSum > 0 || discountSum == 0) { nonCategorizedDiscounts.Add(new NonCategorizedDiscountItem( string.Format(Resources.PaymentWithDiscountSplitFormatPayment, replaceDiscount.PrintableName), CalculatePercent(fullSum, paymentSum), paymentSum, string.Empty, false)); } //добавляем информацию о скидке: не показывается, если скидки нет if (discountSum > 0) { nonCategorizedDiscounts.Add(new NonCategorizedDiscountItem( string.Format(Resources.PaymentWithDiscountSplitFormatDiscount, replaceDiscount.PrintableName), CalculatePercent(fullSum, discountSum), discountSum, string.Empty, false)); } } else { nonCategorizedDiscounts.Add(new NonCategorizedDiscountItem( replaceDiscount.PrintableName, CalculatePercent(fullSum, paymentItem.Sum), paymentItem.Sum, string.Empty, replaceDiscount.DiscountBySum)); } } @EntriesByGuest() if (nonCategorizedDiscounts.Count > 0) { @foreach (var discount in nonCategorizedDiscounts) { if (discount.Sum>0) { if (discount.DiscountBySum) { @discount.Name } else { @discount.Name @FormatPercent(-discount.Percent) } @FormatMoney(-discount.Sum) } }
} 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) { } } var payments = order.Payments.Where(payment => !payment.Type.ProccessAsDiscount).ToList(); var containsAnyPaymentsOrPrePayments = payments.Any() || order.PrePayments.Any(); var paymentsSumLessThanResultOrderSum = payments.Concat(order.PrePayments).Sum(p => p.Sum) < resultSum; { foreach (var paymentItem in order.PrePayments) { } foreach (var payment in payments.Where(p => p.Type.Group == PaymentGroup.Cash)) { var nameFormat = GetPaymentItemName(payment); } foreach (var payment in payments.Where(p => p.Type.Group == PaymentGroup.Card)) { var nameFormat = GetPaymentItemName(payment); } foreach (var payment in payments.Where(p => p.Type.Group != PaymentGroup.Cash && p.Type.Group != PaymentGroup.Card)) { var nameFormat = GetPaymentItemName(payment); var iikoNetPaymentItem = payment as IIikoNetPaymentItem; if (iikoNetPaymentItem != null) { var discountSum = iikoNetPaymentItem.DiscountSum; var paymentSum = payment.Sum - discountSum; //добавляем информацию о платеже. Если скидки нет, информация о платеже добавляется всегда if (paymentSum > 0 || discountSum == 0) { } //добавляем информацию о скидке: не показывается, если скидки нет if (discountSum > 0) { } } else { var creditPaymentItem = payment as ICreditPaymentItem; if (creditPaymentItem != null && creditPaymentItem.Counteragent != null) { @string.Format(Resources.CounteragentFormat, creditPaymentItem.Counteragent.Name) @string.Format(Resources.CounteragentCardFormat, creditPaymentItem.Counteragent.Card) } } } if (changeSum > Decimal.Zero) { } decimal prepayment = 0; foreach (var paymentItem in order.PrePayments) { prepayment = paymentItem.Sum; } foreach (var paymentItem in order.Payments) { prepayment = paymentItem.Sum; } var totalwithoutprepayment = resultSum - prepayment; } } @helper EntriesByGuest() { @Resources.NameColumnHeader @Resources.AmountShort @Resources.ProductPrice @Resources.ResultSum @if (Model.Delivery.SplitBetweenPersons) { var firstGuest = Model.Delivery.Order.Guests.First(); @Guest(firstGuest.Name, firstGuest.Items.ToList()) foreach (var guest in Model.Delivery.Order.Guests.Skip(1)) { @Guest(guest.Name, guest.Items.ToList()) } } else { @Guest(null, Model.Delivery.Order.Guests.SelectMany(g => g.Items).ToList()) }
} @helper Guest(string guestName, ICollection items) { if (!string.IsNullOrWhiteSpace(guestName)) { @guestName } foreach (var comboGroup in items.Where(item => item.DeletionInfo == null).GroupBy(i => i.Combo)) { var combo = comboGroup.Key; if (combo != null) { @combo.Name @(string.Format("{0} x", FormatAmount(combo.Amount))) $@FormatMoney(combo.Price) $@FormatMoney(combo.Price * combo.Amount) } foreach (var orderItem in comboGroup.OrderBy(i => i.OrderRank)) { @OrderItem(orderItem, combo != null) } } if (!string.IsNullOrWhiteSpace(guestName)) { @string.Format(Resources.BillFooterTotalGuestPattern, guestName) @FormatMoney(items.SelectMany(item => item.ExpandIncludedEntries()).Sum(item => item.Cost)) var test = Convert.ToSingle(items.SelectMany(item => item.ExpandIncludedEntries()).Sum(item => item.Cost)); } } @helper OrderItem(IOrderItem item, bool isPartOfCombo) { var productItem = item as IProductItem; // для позиций в составе комбо, делается дополнительный отступ var additionalSpace = isPartOfCombo ? " " : string.Empty; var commentText = Model.Delivery.Order.Table.Section.PrintProductItemCommentInCheque && productItem != null && productItem.Comment != null && !productItem.Comment.Deleted ? productItem.Comment.Text : null; if (productItem != null && productItem.CompoundsInfo != null && productItem.CompoundsInfo.IsPrimaryComponent) { @(additionalSpace + string.Format("{0} {1}", productItem.CompoundsInfo.ModifierSchemaName, productItem.ProductSize == null ? string.Empty : productItem.ProductSize.Name)) // для разделенной пиццы комменты печатаем под схемой if (commentText != null) { @(additionalSpace + " " + commentText) } // у пиццы не может быть удаленных модификаторов, поэтому берем весь список foreach (var orderEntry in productItem.ModifierEntries.Where(orderEntry => ModifiersFilter(orderEntry, productItem, true))) { @(additionalSpace + " " + orderEntry.Product.Name) if (orderEntry.Cost != 0m) { @(additionalSpace + string.Format("{0} {1} x", FormatAmount(orderEntry.Amount), orderEntry.Product.MeasuringUnit.Name)) @FormatMoney(orderEntry.Price) @FormatMoney(orderEntry.Cost) } else { @(additionalSpace + string.Format("{0} {1} ", FormatAmount(orderEntry.Amount), orderEntry.Product.MeasuringUnit.Name)) } @CategorizedDiscountsForOrderEntry(orderEntry, isPartOfCombo) } } if (productItem != null && productItem.CompoundsInfo != null) { @(additionalSpace + " 1/2 " + GetOrderEntryNameWithProductSize(productItem)) } else { @(additionalSpace + GetOrderEntryNameWithProductSize(item)) @* для обычных блюд перед списком модификаторов *@ if (commentText != null) { @(additionalSpace + " " + commentText) } } if (!isPartOfCombo) { @string.Format("{0} {1} x", FormatAmount(item.Amount), item.Product.MeasuringUnit.Name) @FormatMoney(item.Price) @FormatMoney(item.Cost) } else { @string.Format("{0} {1} ", FormatAmount(item.Amount), item.Product.MeasuringUnit.Name) } @CategorizedDiscountsForOrderEntry(item, isPartOfCombo) foreach (var orderEntry in item.GetNotDeletedChildren().Where(orderEntry => ModifiersFilter(orderEntry, item)) .Where(orderEntry => orderEntry.Cost > 0 || orderEntry.Product.PrechequePrintable).ToList()) { @(additionalSpace + " " + orderEntry.Product.Name) if (orderEntry.Cost != 0m) { @string.Format("{0} {1} x", FormatAmount(orderEntry.Amount), orderEntry.Product.MeasuringUnit.Name) @FormatMoney(orderEntry.Price) @FormatMoney(orderEntry.Cost) } else { @string.Format("{0} {1} ", FormatAmount(orderEntry.Amount), orderEntry.Product.MeasuringUnit.Name) } @CategorizedDiscountsForOrderEntry(orderEntry, isPartOfCombo) } } @helper CategorizedDiscountsForOrderEntry(IOrderEntry entry, bool isPartOfCombo) { var additionalSpace = isPartOfCombo ? " " : string.Empty; var categorizedDiscounts = from discountItem in Model.Delivery.Order.DiscountItems.ToList().Where(discountItem => discountItem.IsCategorized && discountItem.PrintDetailedInPrecheque).ToList() where discountItem.DiscountSums.ContainsKey(entry) let discountSum = discountItem.GetDiscountSumFor(entry) select new { Name = discountItem.Type.PrintableName, Percent = Math.Round(CalculatePercent(entry.Cost, discountSum)), Sum = discountSum, CardNumber = discountItem.CardInfo != null && !string.IsNullOrWhiteSpace(discountItem.CardInfo.MaskedCard) ? discountItem.CardInfo.MaskedCard : string.Empty, discountItem.Type.DiscountBySum }; foreach (var discount in categorizedDiscounts) { if (discount.DiscountBySum) { @(additionalSpace + string.Format(" {0}", discount.Name)) } else { @(additionalSpace + string.Format(" {0} ({1})", discount.Name, FormatPercent(-discount.Percent))) } @FormatMoney(-discount.Sum) if (!string.IsNullOrWhiteSpace(discount.CardNumber)) { @string.Format(Resources.CardPattern, discount.CardNumber) } } } @functions { 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(IOrderEntry orderEntry, IOrderItem parent, bool onlyCommonModifiers = false) { var parentProductItem = parent as IProductItem; if (parentProductItem != null && !CommonModifiersFilter(((IModifierEntry)orderEntry).IsCommonModifier, parentProductItem, onlyCommonModifiers)) return false; if (orderEntry.Cost > 0m) return true; if (!orderEntry.Product.PrechequePrintable) return false; var modifierEntry = orderEntry as IModifierEntry; if (modifierEntry == null) 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 decimal GetParentAmount(IOrderItem parent, bool onlyCommonModifiers) { return onlyCommonModifiers ? parent.Amount * 2 : parent.Amount; } private static string GetPaymentItemName(IPaymentItem payment) { var nameFormat = payment.Type.Group == PaymentGroup.Card ? string.Format(Resources.CardPattern, payment.Type.Name) : payment.Type.Name; return payment.IsProcessedExternally ? string.Format(Resources.PaymentItemIsProcessedNameFormat, nameFormat) : nameFormat; } private sealed class NonCategorizedDiscountItem { public NonCategorizedDiscountItem(string name, decimal percent, decimal sum, string cardNumber, bool discountBySum) { Name = name; Percent = percent; Sum = sum; CardNumber = cardNumber; DiscountBySum = discountBySum; } public string Name { get; private set; } public decimal Percent { get; private set; } public decimal Sum { get; private set; } public string CardNumber { get; private set; } public bool DiscountBySum { get; private set; } } private static string GetOrderEntryNameWithProductSize(IOrderEntry orderEntry) { var productItem = orderEntry as IProductItem; return productItem == null || productItem.ProductSize == null || productItem.CompoundsInfo != null ? orderEntry.Product.Name : string.Format(Resources.ProductNameWithSizeFormat, productItem.Product.Name, productItem.ProductSize.Name); } }