word wrap for final receipt
discount for final receipt
This commit is contained in:
@@ -40,24 +40,7 @@ public class ReceiptConverter
|
||||
// Items
|
||||
foreach (var item in finalReceipt.Items)
|
||||
{
|
||||
string quantityDesc = $"{item.Quantity}x {item.Description}";
|
||||
string prices = $"{item.UnitPrice:F2}"+$"{item.TotalPrice:F2}".PadLeft(7)+$" {item.TaxCategory}";
|
||||
|
||||
// Calculate spacing to align prices to the right
|
||||
int spacesNeeded = _lineWidth - quantityDesc.Length - prices.Length;
|
||||
if (spacesNeeded < 1) spacesNeeded = 1;
|
||||
|
||||
string itemLine = quantityDesc + new string(' ', spacesNeeded) + prices;
|
||||
commands.Add(new PrintCommand(itemLine));
|
||||
|
||||
// SubItems
|
||||
if (item.SubItems != null)
|
||||
{
|
||||
foreach (var subItem in item.SubItems)
|
||||
{
|
||||
commands.Add(new PrintCommand($" - {subItem}"));
|
||||
}
|
||||
}
|
||||
PrintItem(item, commands);
|
||||
}
|
||||
|
||||
commands.Add(new PrintCommand("")); // Reini
|
||||
@@ -185,6 +168,93 @@ public class ReceiptConverter
|
||||
return commands;
|
||||
}
|
||||
|
||||
private void PrintItem(FinalReceiptItem item, List<PrintCommand> commands)
|
||||
{
|
||||
string quantityPrefix = $"{item.Quantity}x ";
|
||||
string prices = $"{item.UnitPrice:F2}" + $"{item.TotalPrice:F2}".PadLeft(7) + $" {item.TaxCategory}";
|
||||
string fullLine = quantityPrefix + item.Description;
|
||||
|
||||
int spacesNeeded = _lineWidth - fullLine.Length - prices.Length;
|
||||
|
||||
if (spacesNeeded >= 1 || string.IsNullOrEmpty(item.Description))
|
||||
{
|
||||
if (spacesNeeded < 1) spacesNeeded = 1;
|
||||
commands.Add(new PrintCommand(fullLine + new string(' ', spacesNeeded) + prices));
|
||||
}
|
||||
else
|
||||
{
|
||||
int continuationAvailable = _lineWidth - quantityPrefix.Length;
|
||||
int firstLineAvailable = continuationAvailable - prices.Length - 1;
|
||||
|
||||
if (continuationAvailable <= 0)
|
||||
{
|
||||
// Prefix alone exceeds line width, print without wrapping
|
||||
commands.Add(new PrintCommand(fullLine));
|
||||
}
|
||||
else
|
||||
{
|
||||
var words = item.Description.Split(' ');
|
||||
var lines = new List<string>();
|
||||
string currentLine = "";
|
||||
bool isFirstLine = true;
|
||||
|
||||
foreach (var word in words)
|
||||
{
|
||||
int available = (isFirstLine && firstLineAvailable > 0) ? firstLineAvailable : continuationAvailable;
|
||||
|
||||
if (currentLine.Length == 0)
|
||||
{
|
||||
currentLine = word;
|
||||
}
|
||||
else if (currentLine.Length + 1 + word.Length <= available)
|
||||
{
|
||||
currentLine += " " + word;
|
||||
}
|
||||
else
|
||||
{
|
||||
lines.Add(currentLine);
|
||||
currentLine = word;
|
||||
if (isFirstLine) isFirstLine = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentLine.Length > 0)
|
||||
{
|
||||
lines.Add(currentLine);
|
||||
}
|
||||
|
||||
// First line with prefix and right-aligned prices
|
||||
string firstLineText = quantityPrefix + lines[0];
|
||||
int firstSpaces = _lineWidth - firstLineText.Length - prices.Length;
|
||||
if (firstSpaces >= 1)
|
||||
{
|
||||
commands.Add(new PrintCommand(firstLineText + new string(' ', firstSpaces) + prices));
|
||||
}
|
||||
else
|
||||
{
|
||||
commands.Add(new PrintCommand(firstLineText));
|
||||
commands.Add(new PrintCommand(prices.PadLeft(_lineWidth)));
|
||||
}
|
||||
|
||||
// Continuation lines indented to align with description
|
||||
string continuationIndent = new string(' ', quantityPrefix.Length);
|
||||
for (int i = 1; i < lines.Count; i++)
|
||||
{
|
||||
commands.Add(new PrintCommand(continuationIndent + lines[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SubItems
|
||||
if (item.SubItems != null)
|
||||
{
|
||||
foreach (var subItem in item.SubItems)
|
||||
{
|
||||
commands.Add(new PrintCommand($" - {subItem}"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string Center(string text, bool isBigFont)
|
||||
{
|
||||
int effectiveLineWidth = isBigFont ? _bigFontLineWidth : _lineWidth;
|
||||
|
||||
Reference in New Issue
Block a user