@martinzeltin heres my first pass:
<?php
class Printer
{
public static function prepare_receipt(Request $request, $printer)
{
if (self::hasItems($printer['id'])) {
$output = '';
if ($request->pre_receipt) {
$output .= "======== Pre receipt =======\n\n\n";
}
/**
* Time and table
*/
$output .= "Table: " . $request->table . "\n\n";
$output .= "Floor: " . $request->floor . "\n\n";
if ($request->isTakeaway || $request->isDeliveryGuys || $request->isBolt) {
$output .= "Time: " . $request->takeawayTime . "\n";
}
if ($request->order_comment) {
$output .= "Comment: " . removeSpecialChars($request->order_comment) . "\n";
}
$output .= "------------------------\n";
/**
* Food items
*/
foreach ($request->orderedItems as $orderedItem) {
$has_unprinted_quantity = false;
if (isset($orderedItem['last_printed_quantity'])) {
$unprinted_quantity_count = intval($orderedItem['is_printed_quantity']) - intval($orderedItem['last_printed_quantity']);
if ($unprinted_quantity_count > 0) {
$has_unprinted_quantity = true;
}
}
if (($orderedItem['should_print'] &&
!$orderedItem['is_printed'] &&
$orderedItem['is_visible']) ||
$request->pre_receipt ||
$has_unprinted_quantity) {
$printers = (is_array($orderedItem['printers'])) ? $orderedItem['printers'] : json_decode($orderedItem['printers'],
true);
if (in_array($printer['id'], $printers) || $request->pre_receipt) {
$output .= ($has_unprinted_quantity) ? $unprinted_quantity_count . 'x ' : $orderedItem['quantity'] . 'x ';
// We ned to split it for multiple lines...
$itemDescriptionParts = self::split($orderedItem['description']);
foreach ($itemDescriptionParts as $itemDescription) {
$itemDescriptionClean = removeSpecialChars($itemDescription);
$output .= $itemDescriptionClean;
}
// Add price for pre receipt
if ($request->pre_receipt) {
$output .= " - " . number_format($orderedItem['price_with_discount'], 2, '.', ',');
}
if (!$request->pre_receipt) {
if ($orderedItem['comments'] != '') {
$output .= " > " . removeSpecialChars(substr($orderedItem['comments'], 0, 27)) . "\n";
}
}
/** Side dishes */
if (isset($orderedItem['side_dishes']) && !$request->pre_receipt) {
foreach ($orderedItem['side_dishes'] as $side_dish) {
$output .= "\n + " . removeSpecialChars(substr($side_dish['description'], 0,
27)) . "\n";
}
}
$output .= "\n";
}
}
}
/**
* Sums
*/
/**
* Footer
*/
$output .= "------------------------\n";
if ($request->pre_receipt) {
$output .= "\nSubtotal: " . number_format($request->order['subtotal'], 2, '.', ',') . "\n";
$output .= "Discount: " . number_format($request->order['discount'], 2, '.', ',') . "\n";
$output .= "Total: " . number_format($request->order['total'], 2, '.', ',') . "\n\n";
}
$output .= "Time: " . getTime() . "\n";
return $output;
}
return 'EMPTY';
}
}
notable changes:
- use $request instead of $_POST so you can sanitize your inputs before using them.
- this bit
if ($_POST['isTakeaway'] || $_POST["isDeliveryGuys"] || $_POST["isBolt"]) {
only related to displaying
$output .= "Time: " . $_POST['takeawayTime'] . "\n";
so I've dried that up.
this:
if (is_array($orderedItem['printers'])) {
$in_printer = in_array($printer['id'], $orderedItem['printers']);
} else {
$in_printer = in_array($printer['id'], json_decode($orderedItem['printers'], true));
}
if ($in_printer || $request->pre_receipt) {
can be simplified to:
$printers = is_array($orderedItem['printers']) ? $orderedItem['printers'] : json_decode($orderedItem['printers'], true);
if (in_array($printer['id'], $printers) || $request->pre_receipt) {
theres some more that can be done, so I might update again..