CORE-POS/IS4C

View on GitHub
fannie/modules/plugins2.0/OrderTablet/OrderTabletPage.php

Summary

Maintainability
B
6 hrs
Test Coverage
<?php

include(__DIR__ . '/../../../config.php');
if (!class_exists('FannieAPI')) {
    include(__DIR__ . '/../../../classlib2.0/FannieAPI.php');
}
if (!class_exists('COREPOS\\pos\\lib\\PrintHandlers\\PrintHandler')) {
    include(__DIR__ . '/../../../../pos/is4c-nf/lib/PrintHandlers/PrintHandler.php');
}
if (!class_exists('COREPOS\\pos\\lib\\PrintHandlers\\ESCPOSPrintHandler')) {
    include(__DIR__ . '/../../../../pos/is4c-nf/lib/PrintHandlers/ESCPOSPrintHandler.php');
}
if (!class_exists('COREPOS\\pos\\lib\\PrintHandlers\\ESCNetRawHandler')) {
    include(__DIR__ . '/../../../../pos/is4c-nf/lib/PrintHandlers/ESCNetRawHandler.php');
}

class OrderTabletPage extends FannieRESTfulPage
{
    protected $title = '';
    protected $header = '';

    public function preprocess()
    {
        $this->addRoute('get<items>', 'get<done>', 'get<cancel>');
        if (!isset($this->session->otItems) || !is_array($this->session->otItems)) {
            $this->session->otItems = array();
        }

        return parent::preprocess();
    }

    /**
     * Just clear session data to start over
     */
    protected function get_cancel_handler()
    {
        $this->session->otItems = array();

        return 'OrderTabletPage.php';
    }

    /**
     * Finish transaction.
     *
     * Generates receipt and sends to printer, twice, via
     * network.
     *
     * Adds items to dtransactions, copies them to suspended,
     * and flips the dtransactions records to trans_status=X
     */
    protected function get_done_handler()
    {
        $emp = $this->config->get('EMP_NO');
        $reg = $this->config->get('REGISTER_NO');
        $trans = DTrans::getTransNo($this->connection, $emp, $reg);
        $orderNumber = $emp . '-' . $reg . '-' . $trans;

        $ph = new COREPOS\pos\lib\PrintHandlers\ESCPOSPrintHandler();
        $receipt = "\n"
            . $ph->textStyle(true, false, true)
            . 'Order #' . $orderNumber . "\n"
            . date('n j, Y g:i:a') . "\n"
            . $ph->textStyle(true)
            . "\n\n";
        foreach ($this->session->otItems as $item) {
            $receipt .= str_pad($item['price'], 4) . ' ';
            $receipt .= $item['name'] . "\n";
            DTrans::addItem($this->connection, $trans, array(
                'emp_no' => $emp,
                'register_no' => $reg,
                'trans_type' => 'I',
                'upc' => $item['upc'],
                'description' => $item['name'],
                'quantity' => 1,
                'ItemQtty' => 1,
                'unitPrice' => $item['price'],
                'total' => $item['price'],
                'regPrice' => $item['price'],
                'cost' => $item['cost'],
                'department' => $item['dept'],
                'tax' => $item['tax'],
                'foodstamp' => $item['fs'],
                'discountable' => $item['disc'],
            ));
        }
        $receipt .= str_repeat("\n", 8);
        $receipt .= $ph->cutPaper();

        $this->connection = FannieDB::get($this->config->get('TRANS_DB'));
        $cols = '';
        foreach ($this->connection->matchingColumns('dtransactions', 'suspended') as $c) {
            $cols .= $this->connection->identifierEscape($c) . ',';
        }
        $cols = substr($cols, 0, strlen($cols) - 1);
        $suspP = $this->connection->prepare("
            INSERT INTO suspended ({$cols})
            SELECT {$cols} FROM dtransactions
            WHERE datetime >= " . $this->connection->curdate() . "
                AND emp_no=?
                AND register_no=?
                AND trans_no=?");
        $this->connection->execute($suspP, array($emp, $reg, $trans));
        $endP = $this->connection->prepare("UPDATE dtransactions SET trans_status='X'
            WHERE datetime >= " . $this->connection->curdate() . "
                AND emp_no=?
                AND register_no=?
                AND trans_no=?");
        $this->connection->execute($endP, array($emp, $reg, $trans));
                
        $net = new COREPOS\pos\lib\PrintHandlers\ESCNetRawHandler();
        $net->setTarget('127.0.0.1:9100');
        $net->writeLine($receipt);
        $net->writeLine($receipt);

        $this->session->otItems = array();

        return 'OrderTabletPage.php';
    }

    protected function delete_id_handler()
    {
        $keep = array();
        foreach ($this->session->otItems as $id => $item) {
            if ($id != $this->id) {
                $keep[] = $item;
            }
        }
        $this->session->otItems = $keep;

        return 'OrderTabletPage.php';
    }

    /**
     * Append new item to in-session storage
     * and return to the main page (get_view())
     */
    protected function post_id_handler()
    {
        $items = $this->session->otItems;
        $itemP = $this->connection->prepare("SELECT description, cost, tax, foodstamp, discount, department FROM products WHERE upc=?");
        for ($i=0; $i<count($this->id); $i++) {
            list($upc,$price) = explode('::', $this->id[$i]);
            $qty = FormLib::get($upc);
            if ($qty) {
                $item = $this->connection->getRow($itemP, array($upc));
                for ($j=0; $j<$qty; $j++) {
                    $items[] = array(
                        'upc' => $upc,
                        'price' => $price,
                        'name' => $item['description'],
                        'tax' => $item['tax'],
                        'fs' => $item['foodstamp'],
                        'cost' => $item['cost'],
                        'disc' => $item['discount'],
                        'dept' => $item['department'],
                    );
                }
            }
        }
        $this->session->otItems = $items;

        return 'OrderTabletPage.php';
    }

    /**
     * Get list of items.
     * Simply cross-references table OrderTabletItems to
     * decided which items to list
     */
    protected function get_items_view()
    {
        $res = $this->connection->query("
SELECT i.upc, p.description, p.normal_price, p.special_price, p.discounttype, d.dept_name
FROM OrderTabletItems AS i
    " . DTrans::joinProducts('i', 'p', 'INNER') . "
    INNER JOIN departments AS d ON p.department=d.dept_no
ORDER BY d.dept_name, p.description");
        $items = '';
        $dept = false;
        while ($row = $this->connection->fetchRow($res)) {
            if ($row['dept_name'] != $dept) {
                $items .= '<h3>' . $row['dept_name'] . '</h3>';
                $dept = $row['dept_name'];
            }
            $price = $row['discounttype'] == 1 ? $row['special_price'] : $row['normal_price'];
            $items .= sprintf('<div class="row"><div class="col-sm-6">%.2f %s</div>
                <div class="col-sm-6">
                    <input type="hidden" name="id[]" value="%s::%.2f" />
                    <div class="col-sm-6">
                        <button type="button" onclick="incDec(\'%s\', 1);" class="btn btn-success">+</button> 
                        <button type="button" onclick="incDec(\'%s\', -1);" class="btn btn-danger">-</button> 
                    </div>
                    <div class="col-sm-6">
                        <input type="number" id="inp%s" name="%s" value="0" class="form-control" />
                    </div>
                </div></div>',
                $price, $row['description'],
                $row['upc'], $price,
                $row['upc'],
                $row['upc'],
                $row['upc'], $row['upc']);
        }

        return <<<HTML
<form method="post" action="OrderTabletPage.php">
<div class="row">
    <div class="col-sm-5">
        {$items}
    </div>
    <div class="col-sm-5">
        <button type="submit" class="btn btn-success btn-lg">Add Items</button>
        <br /><br />
        <a href="OrderTabletPage.php" class="btn btn-default btn-lg">Go Back</a>
    </div>
</div>
</form>
HTML;
    }

    /**
     * Print two columns
     * Left - items in the order
     * Right - Command buttons
     */
    protected function get_view()
    {
        $items = '';
        $total = 0;
        foreach ($this->session->otItems as $id => $item) {
            $items .= sprintf('<div class="item-row" onclick="selectItem(event);" data-id="%d">
                <span class="pull-left">%s</span>
                <span class="pull-right">%.2f</span>
                </div><br />',
                $id, $item['name'], $item['price']);
            $total += $item['price'];
        }
        $items .= sprintf('<br /><div class="item-row">
            <span class="pull-left">Subtotal</span>
            <span class="pull-right">%.2f</span>
            </div>', $total
        );
            
        return <<<HTML
<div class="row">
    <div class="col-sm-5" style="font-size: 140%";>
        <h3>Items</h3>
        {$items}
    </div>
    <div class="col-sm-5">
        <a href="OrderTabletPage.php?items=1" class="btn btn-default btn-lg">Add Item</a>
        <br />
        <br />
        <a href="OrderTabletPage.php" id="rmLink" class="btn btn-default btn-lg">Remove Item</a>
        <br />
        <br />
        <a href="OrderTabletPage.php?done=1" class="btn btn-success btn-lg">Done</a>
        <br />
        <br />
        <a href="OrderTabletPage.php?cancel=1" class="btn btn-danger btn-lg">Cancel</a>
    </div>
</div>
HTML;
    }

    protected function javascriptContent()
    {
        return <<<JAVASCRIPT
function selectItem(ev) {
    $('div.item-row').removeClass('alert-danger');
    $(ev.target).parent().addClass('alert-danger');
    var id = $(ev.target).parent().attr('data-id');
    if (id) {
        $('#rmLink').attr('href', 'OrderTabletPage.php?_method=delete&id=' + id);
    }
}
function incDec(id, inc) {
    var cur =$('#inp' + id).val();
    cur = cur * 1;
    cur += inc;
    if (cur <= 0) {
        cur = 0;
    }
    $('#inp'+id).val(cur);
};
JAVASCRIPT;
    }
}

FannieDispatch::conditionalExec();