CORE-POS/IS4C

View on GitHub
fannie/item/handheld/ItemStatusPage.php

Summary

Maintainability
D
2 days
Test Coverage
F
48%
<?php
/*******************************************************************************

    Copyright 2014 Whole Foods Community Co-op

    This file is part of CORE-POS.

    CORE-POS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    CORE-POS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    in the file license.txt along with IT CORE; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*********************************************************************************/

use COREPOS\Fannie\API\lib\Store;

include(dirname(__FILE__) . '/../../config.php');
if (!class_exists('FannieAPI')) {
    include(__DIR__ . '/../../classlib2.0/FannieAPI.php');
}

class ItemStatusPage extends FannieRESTfulPage
{
    protected $header = '';
    protected $title = 'Status Check';
    protected $enable_linea = true;
    public $themed = true;
    public $description = '[Item Status] is a quick status check tool';

    public function preprocess()
    {
        if (php_sapi_name() !== 'cli') {
            /* this page requires a session to pass some extra
               state information through multiple requests */
            if (session_id() == '') {
                session_start();
            }
        }

        $this->__routes[] = 'get<tagID><upc>';
        $this->__routes[] = 'get<floorID><upc>';
        $this->__routes[] = 'get<narrowTag><upc>';

        return parent::preprocess();
    }

    /**
      Queue or Re-Queue shelf tag
    */
    public function get_tagID_upc_handler()
    {
        global $FANNIE_OP_DB;
        $dbc = FannieDB::get($FANNIE_OP_DB);
        $product = new ProductsModel($dbc);
        $product->upc($this->upc);
        $product->store_id($this->config->get('STORE_ID'));
        $product->load();
        $info = $product->getTagData();

        $tag = new ShelftagsModel($dbc);
        $tag->upc($this->upc);
        foreach ($tag->find() as $obj) {
            if ($obj->id() != $this->tagID) {
                $obj->delete();
            }
        }

        $this->session->LastTagQueue = $this->tagID;
        $tag->id($this->tagID);
        $tag->description($info['description']);
        $tag->brand($info['brand']);
        $tag->normal_price($info['normal_price']);
        $tag->sku($info['sku']);
        $tag->size($info['size']);
        $tag->units($info['units']);
        $tag->vendor($info['vendor']);
        $tag->pricePerUnit($info['pricePerUnit']);
        $tag->save();

        header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $this->upc);

        return false;
    }

    public function get_floorID_upc_handler()
    {
        $dbc = $this->connection;
        $dbc->selectDB($this->config->get('OP_DB'));
        $loc = new ProdPhysicalLocationModel($dbc);
        $loc->upc(BarcodeLib::padUPC($this->upc));
        $loc->floorSectionID($this->floorID);
        $loc->save();
        $this->session->LastFloorSection = $this->floorID;

        header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $this->upc);

        return false;
    }

    public function get_narrowTag_upc_handler()
    {
        $dbc = $this->connection;
        $storeID = Store::getIdByIp();
        $dbc->selectDB($this->config->get('OP_DB'));
        $s_def = $dbc->tableDefinition('SignProperties');
        $upc = BarcodeLib::padUPC($this->upc);
        $pu = new ProductUserModel($dbc);
        $signModel = (isset($s_def['signCount'])) ? new SignPropertiesModel($dbc) : $pu;
        $pu->upc($upc);
        if (!$pu->load()) {
            $p = new ProductsModel($dbc);
            $p->upc($upc);
            $p->load();
            $pu->brand($p->brand());
            $pu->description($p->description());
            $pu->signCount(1);
            $pu->save();
        }
        $pu->reset();
        $pu->upc($upc);

        $signModel->upc($upc);
        $signModel->storeID($storeID);
        $action = FormLib::get('narrowTag');
        if ($action == 'remove') {
            $signModel->narrow(0);
            $signModel->save();
        } elseif ($action == 'add') {
            $signModel->narrow(1);
            $signModel->save();
        }

        header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $this->upc);

        return false;
    }

    public function get_id_view()
    {
        global $FANNIE_OP_DB;
        $ret = $this->get_view();
        $upc = BarcodeLib::padUPC($this->id);

        $ret .= '<hr />';
        $ret .= '<div class="panel panel-default">
            <div class="panel-heading">' . $upc . '</div>
            <div class="panel-body">';

        $dbc = FannieDB::getReadOnly($FANNIE_OP_DB);
        $storeID = Store::getIdByIp();
        $product = new ProductsModel($dbc);
        $s_def = $dbc->tableDefinition('SignProperties');
        $table = (isset($s_def['signCount'])) ? ' SignProperties ' : ' productUser ';
        $args = array($upc);
        $query = "SELECT narrow FROM $table WHERE upc=?";
        if (isset($s_def['signCount'])) {
            $query .= " AND storeID = ? ";
            $args[] = $storeID;
        }
        $narrowTag = $dbc->prepare($query);
        $isNarrow = $dbc->getValue($narrowTag, $args);
        $vendor = new VendorsModel($dbc);
        $product->upc($upc);
        if ($this->config->get('STORE_MODE') == 'HQ') {
            $product->store_id(Store::getIdByIp());
        }

        if (!$product->load()) {
            $ret .= '<div class="alert alert-danger">Item not found</div>';
            return $ret;
        }
        $vendor->vendorID($product->default_vendor_id());
        $vendor->load();

        $ret .= '<p><strong>Brand</strong>: ' . $product->brand();
        $ret .= ', <strong>Desc.</strong>: ' . $product->description();
        $ret .= ', <strong>Vendor</strong>:';
        if ($vendor->vendorName() != 'UNFI') {
            $ret .= '<span class="alert-warning">' . $vendor->vendorName() . '</span></p>';
        } else {
            $ret .= $vendor->vendorName() . '</p>';
        }


        $ret .= '<p><strong>Price</strong>: $' . sprintf('%.2f', $product->normal_price());
        if ($product->discounttype() > 0) {
            $ret .= ', <span class="alert-success"><strong>On Sale</strong> $' . sprintf('%.2f', $product->special_price());
            $batchP = $dbc->prepare('
                SELECT b.batchName,
                    b.startDate,
                    b.endDate
                FROM batchList as l
                    INNER JOIN batches AS b ON l.batchID=b.batchID
                WHERE l.upc=?
                    AND ' . $dbc->curdate() . ' >= b.startDate
                    AND ' . $dbc->curdate() . ' <= b.endDate');
            $batchR = $dbc->execute($batchP, array($upc));
            if ($batchR && $dbc->num_rows($batchR)) {
                $batchW = $dbc->fetch_row($batchR);
                $batchW['startDate'] = date('Y-m-d', strtotime($batchW['startDate']));
                $batchW['endDate'] = date('Y-m-d', strtotime($batchW['endDate']));
                $ret .= ' (' . $batchW['batchName'] . ' '
                    . $batchW['startDate'] . ' - ' . $batchW['endDate']
                    . ')';
            } else {
                $ret .= ' (Unknown batch)';
            }
            $ret .= '</span>';
        }
        $ret .= '</p>';

        $supersP = $dbc->prepare('
            SELECT s.superID,
                n.super_name
            FROM superdepts AS s
                INNER JOIN superDeptNames AS n ON s.superID=n.superID
            WHERE s.dept_ID=?
            ORDER BY s.superID');
        $supersR = $dbc->execute($supersP, array($product->department()));
        $master = false;
        // preserve queue selection if user is entering several tags
        if (isset($this->session->LastTagQueue) && is_numeric($this->session->LastTagQueue)) {
            $master = $this->session->LastTagQueue;
        }
        $ret .= '<p><strong>Super(s)</strong>: ';
        while ($supersW = $dbc->fetch_row($supersR)) {
            if ($master === false) {
                $master = $supersW['superID'];
                $ret .= '<em>' . $supersW['super_name'] . '</em>; ';
            } else {
                $ret .= $supersW['super_name'] . '; ';
            }
        }
        $ret .= '</p>';

        $shelftagsP = $dbc->prepare('
            SELECT count(s.upc) as c
            FROM shelftags as s
            WHERE s.id=?');
        $shelftagsR = $dbc->execute($shelftagsP, $master);
        while ($shelftagsW = $dbc->fetch_row($shelftagsR)) {
            $tags = $shelftagsW['c'];
        }

        $dept = new DepartmentsModel($dbc);
        $dept->dept_no($product->department());
        $dept->load();
        $sub = new SubDeptsModel($dbc);
        $sub->subdept_no($product->subdept());
        $sub->load();
        $ret .= sprintf('<p><strong>Dept</strong>: %d %s, <strong>SubDept</strong>: %d %s</p>',
            $dept->dept_no(), $dept->dept_name(),
            $sub->subdept_no(), $sub->subdept_name());

        $ret .= '<p> Tags in this queue: ' . $tags . '</p> ';
        if ($isNarrow) {
            $ret .= 'Flagged As: <span class="alert-warning">Narrow Tag</span>';
            $ret .= '
                <form class="form-inline" method="get">
                </form>
            ';
        }

        $ret .= '<p><form class="form-inline" method="get">';
        $tags = new ShelftagsModel($dbc);
        $tags->upc($upc);
        $tags->id(0, '>=');
        $queued = $tags->find('id');
        $queues = new ShelfTagQueuesModel($dbc);
        $verb = 'Queue';
        if (count($queued) > 0) {
            if ($queued[0]->id() == 0) {
                $ret .= 'Tags queued for Default';
            } else {
                $queues->shelfTagQueueID($queued[0]->id());
                $queues->load();
                $ret .= 'Tags queued for ' . $queues->description();
            }
            $verb = 'Requeue';
        } else {
            $ret .= 'No tags queued';
        }
        $ret .= '<input type="hidden" name="upc" value="' . $upc . '" />
            <button class="btn btn-default" type="submit">' . $verb . ' Tags</button>
            for <select name="tagID" class="form-control">';
        $queues->reset();
        $ret .= $queues->toOptions($master);
        $ret .= '</select></form></p>';

        $ret .= '<form class="form-inline" method="get">';
        if ($isNarrow) {
            $ret .= '
                <input type="hidden" name="narrowTag" value="remove">
                <input type="hidden" name="upc" value="' . $upc . '" />
                <button class="btn btn-default" type="submit">
                    Remove Flag: <span class="text-warning">Narrow</span></button>
            ';
        } else {
            $ret .= '
                <input type="hidden" name="narrowTag" value="add">
                <input type="hidden" name="upc" value="' . $upc . '" />
                <button class="btn btn-default" type="submit">
                    Add Flag: Narrow</button>
            ';
        }
        $ret .= '</form><br>';

        /*
        $ret .= '<p><form class="form-inline" method="get">
            <label>Loc.</label>
            <select name="floorID" class="form-control">
                <option value="0">n/a</option>';
        $loc = new ProdPhysicalLocationModel($dbc);
        $loc->upc($upc);
        $loc->load();
        $selected = 0;
        if ($loc->floorSectionID()) {
            $selected = $loc->floorSectionID();
        } elseif (isset($this->session->LastFloorSection)) {
            $selected = $this->session->LastFloorSection;
        }
        $sections = new FloorSectionsModel($dbc);
        foreach ($sections->find('name') as $s) {
            $ret .= sprintf('<option %s value="%d">%s</option>',
                    ($selected == $s->floorSectionID() ? 'selected' : ''),
                    $s->floorSectionID(), $s->name()
            );
        }
        $ret .= '</select>';
        $ret .= '<input type="hidden" name="upc" value="' . $upc . '" />
            <button class="btn btn-default" type="submit">Update Location</button>
            </form></p>';
        */

        if (FannieAuth::validateUserQuiet('pricechange') || FannieAuth::validateUserQuiet('audited_pricechange')) {
            $ret .= '<p><a href="../ItemEditorPage.php?searchupc=' . $this->id . '"
                class="btn btn-default">Edit This Item</a></p>';
        }

        $ret .= '</div></div>';

        return $ret;
    }

    public function get_view()
    {
        $this->addScript('../autocomplete.js');
        $this->addOnloadCommand("bindAutoComplete('#upc', '../../ws/', 'item');\n");
        if (FormLib::get('linea') != 1) {
            $this->addOnloadCommand("\$('#upc').focus();\n");
        }
        $this->addOnloadCommand("enableLinea('#upc', function(){ \$('#upc-form').append('<input type=hidden name=linea value=1 />').submit(); });\n");
        return '
            <div class="row">
                <div class="col-md-6">
                    <form id="upc-form" action="' . $_SERVER['PHP_SELF'] . '" method="get">
                    <div class="form-group form-inline">
                        <label>UPC</label>
                        <input type="text" name="id" id="upc" class="form-control" />
                        <button type="submit" class="btn btn-default">Check Item</button>
                    </div>
                    </form>
                </div>
                <div class="col-md-6">
                    <ul>
                        <li><a href="../../admin/labels/ShelfTagIndex.php">Print Shelf Tags</a></li>
                        <li><a href="../../modules/plugins2.0/ShelfAudit/SaMenuPage.php">Menu</a></li>
                    </ul>
                </div>
            </div>
                
            ';
    }

    public function helpContent()
    {
        return '<p>
            The status check shows a brief summary of
            a product\'s information in POS. It can be used
            to verify pricing and queue up new shelf tags.
            This particular page should scale to a mobile
            device where as the full item editor often
            does not fit well on small screens.
            </p>';
    }

    public function unitTest($phpunit)
    {
        $phpunit->assertNotEquals(0, strlen($this->get_view()));
        $this->id = 4011;
        $phpunit->assertNotEquals(0, strlen($this->get_id_view()));
    }
}

FannieDispatch::conditionalExec();