diff --git a/EpsonTest/Program.cs b/EpsonTest/Program.cs index b608502..d7e6677 100644 --- a/EpsonTest/Program.cs +++ b/EpsonTest/Program.cs @@ -43,19 +43,19 @@ using System.Text.Json; // ============================================================================ // INVOICE RECEIPT - HTML PRINTER // ============================================================================ -var receipt = TestHelpers.BuildSampleInvoiceReceipt(); -var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); +//var receipt = TestHelpers.BuildSampleInvoiceReceipt(); +//var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); -var converter = new InvoiceReceiptConverter(lineWidth: 48, bigFontLineWidth: 24); -var printCommands = converter.Convert(serializedReceipt); +//var converter = new InvoiceReceiptConverter(lineWidth: 48, bigFontLineWidth: 24); +//var printCommands = converter.Convert(serializedReceipt); -TestHelpers.PrintCommandsToConsole(printCommands); +//TestHelpers.PrintCommandsToConsole(printCommands); -var printer = await TestHelpers.CreateHtmlPrinterAsync(); -await TestHelpers.PrintCommandsToHtmlPrinterAsync( - printer, - printCommands, - logoPath: "ristorante-klinglers.ch-logo_white_bg.png"); +//var printer = await TestHelpers.CreateHtmlPrinterAsync(); +//await TestHelpers.PrintCommandsToHtmlPrinterAsync( +// printer, +// printCommands, +// logoPath: "ristorante-klinglers.ch-logo_white_bg.png"); // ============================================================================ @@ -112,17 +112,17 @@ await TestHelpers.PrintCommandsToHtmlPrinterAsync( // ============================================================================ // KITCHEN RECEIPT - EPSON PRINTER // ============================================================================ -//var receipt = TestHelpers.BuildSampleKitchenReceiptNextDish(); -//var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); -//var deserializedReceipt = JsonSerializer.Deserialize(serializedReceipt); +var receipt = TestHelpers.BuildSampleKitchenReceipt(); +var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); +var deserializedReceipt = JsonSerializer.Deserialize(serializedReceipt); -//var converter = new KitchenReceiptConverter(bigLineWidth: 18, lineWidth: 33); -//var printCommands = converter.ConvertToPrintCommands(deserializedReceipt); +var converter = new KitchenReceiptConverter(bigLineWidth: 18, lineWidth: 33); +var printCommands = converter.ConvertToPrintCommands(deserializedReceipt); -//TestHelpers.PrintCommandsToConsole(printCommands); +TestHelpers.PrintCommandsToConsole(printCommands); -//var printer = await TestHelpers.CreateEpsonPrinterAsync(paperWidth:TestHelpers.KitchenPaperWidth); -//await TestHelpers.PrintCommandsToEpsonPrinterAsync(printer, printCommands, useDelay: true); +var printer = await TestHelpers.CreateEpsonPrinterAsync(paperWidth: TestHelpers.KitchenPaperWidth); +await TestHelpers.PrintCommandsToEpsonPrinterAsync(printer, printCommands, useDelay: true); // ============================================================================ diff --git a/EpsonTest/TestHelpers.cs b/EpsonTest/TestHelpers.cs index 8a239cf..173dc5e 100644 --- a/EpsonTest/TestHelpers.cs +++ b/EpsonTest/TestHelpers.cs @@ -48,7 +48,7 @@ public static class TestHelpers Address1 = "Münzplatz 3", Address2 = "CH-8001 Zürich", Phone = "043 321 22 22", - ReceiptNumber = "1-81-202", + ReceiptNumber = null,//"1-81-202", DateTime = new DateTime(2025, 12, 16, 14, 58, 0), Guests = 2, Total = 160.00m, @@ -211,11 +211,14 @@ public static class TestHelpers Address1 = "Münzplatz 3", Address2 = "CH-8001 Zürich", Phone = "043 321 22 22", - ReceiptNumber = "1-81-202", + ReceiptNumber = null,//"1-81-202", DateTime = new DateTime(2025, 12, 16, 14, 58, 0), Guests = 2, Total = 160.00m, - Currency = "CHF" + Currency = "CHF", + TableNumber = "12", + ThankYouMessage = "Thank you!" + }; // Add items @@ -308,9 +311,10 @@ public static class TestHelpers Removed = new List { "Wasabi" }, Added = new List { "Extra Ginger" } }, - Comment = "No soy sauce" + Comment = "No soy sauce", + GuestId = 1 }); - receipt.Gangs[0].Dishes.Add(new Dish(1, "Baby Spinach Salad with Truffl")); + receipt.Gangs[0].Dishes.Add(new Dish(1, "Baby Spinach Salad with Truffl"){GuestId = 2}); receipt.Gangs[0].Dishes.Add(new Dish(1, "Beef Tataki") { Modifications = new DishModifications @@ -318,20 +322,22 @@ public static class TestHelpers Removed = new List { "Onion" }, Added = new List { "Extra Sauce" } }, - Comment = "Medium rare" + Comment = "Medium rare", + GuestId = 3 }); receipt.Gangs[0].Dishes.Add(new Dish(1, "Salmon Taco") { Modifications = new DishModifications { Added = new List { "Extra Lime" } - } + }, + GuestId = 4 }); - receipt.Gangs[1].Dishes.Add(new Dish(1, "Avocado Sashimi")); - receipt.Gangs[1].Dishes.Add(new Dish(1, "Baby Spinach Salad with Truffl")); - receipt.Gangs[1].Dishes.Add(new Dish(1, "Beef Tataki")); - receipt.Gangs[1].Dishes.Add(new Dish(1, "Salmon Taco")); + receipt.Gangs[1].Dishes.Add(new Dish(1, "Avocado Sashimi") { GuestId = 2 }); + receipt.Gangs[1].Dishes.Add(new Dish(1, "Baby Spinach Salad with Truffl") { GuestId = 2 }); + receipt.Gangs[1].Dishes.Add(new Dish(1, "Beef Tataki") { GuestId = 3 }); + receipt.Gangs[1].Dishes.Add(new Dish(1, "Salmon Taco") { GuestId = 4 }); return receipt; } @@ -346,37 +352,37 @@ public static class TestHelpers WaiterName = "Mariano Amato", WaiterId = "32 (VK Restaurant)", TableNumber = "22", - SpecialInstruction = "Next dish" + SpecialInstruction = "Gang schicken" }; receipt.Gangs.Add(new Gang(2, "Gang")); - - receipt.Gangs[0].Dishes.Add(new Dish(1, "Avocado Sashimi") - { - Modifications = new DishModifications - { - Removed = new List { "Wasabi" }, - Added = new List { "Extra Ginger" } - }, - Comment = "No soy sauce" - }); - receipt.Gangs[0].Dishes.Add(new Dish(1, "Baby Spinach Salad with Truffl")); - receipt.Gangs[0].Dishes.Add(new Dish(1, "Beef Tataki") - { - Modifications = new DishModifications - { - Removed = new List { "Onion" }, - Added = new List { "Extra Sauce" } - }, - Comment = "Medium rare" - }); - receipt.Gangs[0].Dishes.Add(new Dish(1, "Salmon Taco") - { - Modifications = new DishModifications - { - Added = new List { "Extra Lime" } - } - }); + // to dishes in next dish + //receipt.Gangs[0].Dishes.Add(new Dish(1, "Avocado Sashimi") + //{ + // Modifications = new DishModifications + // { + // Removed = new List { "Wasabi" }, + // Added = new List { "Extra Ginger" } + // }, + // Comment = "No soy sauce" + //}); + //receipt.Gangs[0].Dishes.Add(new Dish(1, "Baby Spinach Salad with Truffl")); + //receipt.Gangs[0].Dishes.Add(new Dish(1, "Beef Tataki") + //{ + // Modifications = new DishModifications + // { + // Removed = new List { "Onion" }, + // Added = new List { "Extra Sauce" } + // }, + // Comment = "Medium rare" + //}); + //receipt.Gangs[0].Dishes.Add(new Dish(1, "Salmon Taco") + //{ + // Modifications = new DishModifications + // { + // Added = new List { "Extra Lime" } + // } + //}); return receipt; } @@ -459,13 +465,23 @@ public static class TestHelpers EpsonPrinter printer, IEnumerable commands, bool useDelay = true, - int delayMs = 500) + int delayMs = 200) { await printer.FeedLinesAsync(1); await printer.SetCustomLineSpacing(22); foreach (var command in commands) { + if (command.IsCut) + { + await printer.FeedLinesAsync(10); + if (useDelay) await Task.Delay(delayMs * 5); + await printer.CutAsync(false); + if (useDelay) await Task.Delay(delayMs); + continue; + + } + await printer.SetBiggerFontTM220(command.IsBig, command.IsTall | command.IsBig, secondaryFont: false); if (useDelay) await Task.Delay(delayMs); @@ -479,7 +495,7 @@ public static class TestHelpers if (useDelay) await Task.Delay(delayMs); } - await printer.FeedLinesAsync(5); + await printer.FeedLinesAsync(10); if (useDelay) await Task.Delay(delayMs * 5); await printer.CutAsync(); } @@ -493,6 +509,11 @@ public static class TestHelpers foreach (var command in commands) { + if (command.IsCut) + { + await printer.CutAsync(false); + continue; + } if (command.IsBig) await printer.SetFontSizeAsync(2, 1); else diff --git a/Inspectron.Epson/EpsonPrinter.cs b/Inspectron.Epson/EpsonPrinter.cs index 52ce518..daa9e1a 100644 --- a/Inspectron.Epson/EpsonPrinter.cs +++ b/Inspectron.Epson/EpsonPrinter.cs @@ -394,7 +394,7 @@ public class EpsonPrinter : IEpsonPrinter await SendRawAsync(EpsonCommands.FeedLines((byte)lines)); } - public async Task CutAsync() + public async Task CutAsync(bool fullCut=true) { _logger?.LogInformation("Cutting paper"); await SendRawAsync(EpsonCommands.CutPaperFull); diff --git a/Inspectron.Epson/HtmlPrinter.cs b/Inspectron.Epson/HtmlPrinter.cs index 517db9f..ebdb841 100644 --- a/Inspectron.Epson/HtmlPrinter.cs +++ b/Inspectron.Epson/HtmlPrinter.cs @@ -322,11 +322,17 @@ public class HtmlPrinter : IEpsonPrinter } /// - public Task CutAsync() + public Task CutAsync(bool fullCut = true) { EnsureConnected(); _logger?.LogInformation("HtmlPrinter: Cutting paper"); - WriteHtmlFile(); + if(fullCut) + WriteHtmlFile(); + else + { + // add scissors icon for partial cut + _content.AppendLine("
✂️
"); + } return Task.CompletedTask; } diff --git a/Inspectron.Epson/IEpsonPrinter.cs b/Inspectron.Epson/IEpsonPrinter.cs index a4a375f..29ecfd3 100644 --- a/Inspectron.Epson/IEpsonPrinter.cs +++ b/Inspectron.Epson/IEpsonPrinter.cs @@ -122,7 +122,7 @@ public interface IEpsonPrinter : IAsyncDisposable /// /// Cut the paper /// - Task CutAsync(); + Task CutAsync(bool fullCut=true); /// /// Load an image from a file path into the printer buffer diff --git a/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs b/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs index e1a2248..a6b9be3 100644 --- a/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs +++ b/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs @@ -35,6 +35,12 @@ public class TM_U220IITranslated : IPrinter { foreach (var command in commands) { + if (command.IsCut) + { + await _printer.CutAsync(false); + await Task.Delay(200); + continue; + } await _printer.SetBiggerFontTM220(command.IsBig, command.IsTall | command.IsBig); await Task.Delay(200); await _printer.SetRedColor(command.IsRed); diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs index a2d9956..f386415 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs @@ -6,7 +6,7 @@ public class FinalReceipt public string Address1 { get; set; } public string Address2 { get; set; } public string Phone { get; set; } - public string ReceiptNumber { get; set; } + public string? ReceiptNumber { get; set; } public DateTime DateTime { get; set; } public int Guests { get; set; } public List Items { get; set; } = new List(); diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs index 895bbc6..dc054a2 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs @@ -27,7 +27,12 @@ public class ReceiptConverter commands.Add(new PrintCommand("Debitorenrechnung")); } // FinalReceipt info - string receiptLine = $"Rechnung Nr. {finalReceipt.ReceiptNumber}".PadRight(_lineWidth/2)+$"{finalReceipt.DateTime:HH:mm dd.MM.yyyy}".PadLeft(_lineWidth/2); + string receiptLine = ""; + if (finalReceipt.ReceiptNumber != null) + receiptLine += $"Rechnung Nr. {finalReceipt.ReceiptNumber}".PadRight(_lineWidth / 2); + else + receiptLine += $"".PadRight(_lineWidth / 2); + receiptLine += $"{finalReceipt.DateTime:HH:mm dd.MM.yyyy}".PadLeft(_lineWidth / 2); commands.Add(new PrintCommand(receiptLine,isBold:true)); commands.Add(new PrintCommand($"Guests: {finalReceipt.Guests}")); commands.Add(new PrintCommand("")); diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/Models.cs b/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/Models.cs index c907e0b..4e4f2ea 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/Models.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/Models.cs @@ -12,6 +12,8 @@ public class InvoiceReceipt public List Items { get; set; } = new List(); public decimal Total { get; set; } public string Currency { get; set; } + public string TableNumber { get; set; } + public string ThankYouMessage { get; set; } } public class ReceiptItem diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/ReceiptConverter.cs b/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/ReceiptConverter.cs index ddcb72f..eb83437 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/ReceiptConverter.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/InvoiceReceipt/ReceiptConverter.cs @@ -1,3 +1,5 @@ +using Inspectron.Epson.PrintServer.Printers.Utils.FinalRecipe; + namespace Inspectron.Epson.PrintServer.Printers.Utils.InvoiceReceipt; public class ReceiptConverter @@ -24,7 +26,13 @@ public class ReceiptConverter commands.Add(new PrintCommand("")); // InvoiceReceipt info - string receiptLine = $"Rechnung Nr. {invoiceReceipt.ReceiptNumber}".PadRight(_lineWidth/2)+$"{invoiceReceipt.DateTime:HH:mm dd.MM.yyyy}".PadLeft(_lineWidth/2); + string receiptLine = ""; + if (invoiceReceipt.ReceiptNumber != null) + receiptLine += $"Rechnung Nr. {invoiceReceipt.ReceiptNumber}".PadRight(_lineWidth / 2); + else + receiptLine += $"".PadRight(_lineWidth / 2); + receiptLine += $"{invoiceReceipt.DateTime:HH:mm dd.MM.yyyy}".PadLeft(_lineWidth / 2); + commands.Add(new PrintCommand(receiptLine,isBold:true)); commands.Add(new PrintCommand($"Guests: {invoiceReceipt.Guests}")); commands.Add(new PrintCommand("")); @@ -59,6 +67,8 @@ public class ReceiptConverter // Total string totalLine = $"Summe: {invoiceReceipt.Total:F2} {invoiceReceipt.Currency}"; commands.Add(new PrintCommand(Center(totalLine, true), true, true)); + commands.Add(new PrintCommand(Center($"Tisch: {invoiceReceipt.TableNumber}",false), false)); + commands.Add(new PrintCommand(Center(invoiceReceipt.ThankYouMessage, false))); return commands; } diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/KitchenReceiptConverter.cs b/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/KitchenReceiptConverter.cs index 298c637..521ac2c 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/KitchenReceiptConverter.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/KitchenReceiptConverter.cs @@ -46,7 +46,7 @@ public class KitchenReceiptConverter // Gangs - + foreach (Gang gang in kitchenReceipt.Gangs) { @@ -55,6 +55,13 @@ public class KitchenReceiptConverter { PrintDish(dish, commands); } + + if (gang != kitchenReceipt.Gangs.Last()) + { + commands.Add(new PrintCommand(""){IsCut = true}); + commands.Add(new PrintCommand("")); + commands.Add(new PrintCommand("")); + } } if (kitchenReceipt.Gangs.Count > 0) @@ -96,7 +103,11 @@ public class KitchenReceiptConverter private static void PrintDish(Dish dish, List commands) { string dishLine = $"{dish.Number}x {dish.Name}"; - commands.Add(new PrintCommand(dishLine){IsTall = true}); + string guestInfo = dish.GuestId.HasValue ? $"{dish.GuestId.Value} " : ""; + + //todo: add word wrap if guest id is present and guestInfo + dish line too long. add spaces in front of continued lines to align with dish name start position + + commands.Add(new PrintCommand(guestInfo+dishLine) {IsTall = true}); // Modifications if (dish.Modifications != null && (dish.Modifications.Removed.Any() || dish.Modifications.Added.Any())) { diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs b/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs index 00bafed..189f519 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs @@ -80,6 +80,8 @@ public Dish(){} + public int? GuestId { get; set; } + public Dish(int number, string name) { Number = number; diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/PrintCommand.cs b/Inspectron.Epson/PrintServer/Printers/Utils/PrintCommand.cs index 3134bea..395172c 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/PrintCommand.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/PrintCommand.cs @@ -8,6 +8,7 @@ public class PrintCommand public bool IsBold { get; set; } public bool IsRed { get; set; } public int? SetLineSpacing { get; set; }=null; + public bool IsCut { get; set; } public PrintCommand(string text, bool isBig = false, bool isBold = false) { Text = text;