CORE-POS/IS4C

View on GitHub
pos/is4c-nf/gui-modules/productlist.php

Summary

Maintainability
B
6 hrs
Test Coverage
C
73%
<?php
/*******************************************************************************

    Copyright 2001, 2004 Wedge Community Co-op

    This file is part of IT CORE.

    IT CORE 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.

    IT CORE 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\pos\lib\gui\NoInputCorePage;
use COREPOS\pos\lib\DisplayLib;
use COREPOS\pos\lib\MiscLib;
use COREPOS\pos\lib\Search\Products\ProductSearch;
use COREPOS\pos\parser\parse\UPC;

include_once(dirname(__FILE__).'/../lib/AutoLoader.php');

class productlist extends NoInputCorePage 
{

    private $boxSize;
    private $searchResults = array();
    private $quantity = 0;

    private function adjustUPC($entered)
    {
        // expand UPC-E to UPC-A
        if (substr($entered, 0, 1) == 0 && strlen($entered) == 7) {
            $parser = new UPC($this->session);
            $entered = $parser->expandUPCE($entered);
        }

        // UPCs should be length 13 w/ at least one leading zero
        if (strlen($entered) == 13 && substr($entered, 0, 1) != 0) 
            $entered = "0".substr($entered, 0, 12);
        else 
            $entered = substr("0000000000000".$entered, -13);

        // zero out the price field of scale UPCs
        if (substr($entered, 0, 3) == "002")
            $entered = substr($entered, 0, 8)."00000";

        return $entered;
    }

    private function getQuantity($entered)
    {
        $qty = 0;
        if (strstr($entered, '*')) {
            list($qty,$entered) = explode('*', $entered, 2);
            $qty = is_numeric($qty) ? $qty : 1;
        } elseif ($this->form->tryGet('qty') !== '') {
            $qty = is_numeric($this->form->qty) ? $this->form->qty : 0;
        }

        return array($qty, $entered);
    }

    function preprocess()
    {
        $entered = "";
        try {
            $entered = strtoupper(trim($this->form->search));
        } catch (Exception $ex) {
            return true;
        }

        // canceled
        if (empty($entered)) {
            $this->change_page($this->page_url."gui-modules/pos2.php");
            return false;
        }

        list($qty, $entered) = $this->getQuantity($entered);
        $this->quantity = $qty;

        // picked an item from the list
        if (is_numeric($entered) && strlen($entered) == 13) {
            $inp = $qty ? $qty . '*' . $entered : $entered;
            $this->change_page(
                $this->page_url
                . "gui-modules/pos2.php"
                . '?reginput=' . urlencode($inp)
                . '&repeat=1');
            return false;
        }

        if (is_numeric($entered)) {
            $entered = $this->adjustUPC($entered);
        }

        $this->searchResults = $this->runSearch($entered);

        return true;
    } // END preprocess() FUNCTION

    private function runSearch($entered)
    {
        /* Get all enabled plugins and standard modules of the base. */
        $modules = AutoLoader::ListModules('COREPOS\\pos\\lib\\Search\\Products\\ProductSearch');
        $results = array();
        $this->boxSize = 1;
        /* Search first with the plugins
         *  and then with standard modules.
         * Keep only the first instance of each upc.
         * Increase the depth of the list from module parameters.
         */
        foreach($modules as $modName){
            $mod = new $modName();
            $modResults = $mod->search($entered);
            foreach($modResults as $upc => $record){
                if (!isset($results[$upc]))
                    $results[$upc] = $record;
            }
            if ($mod->result_size > $this->boxSize)
                $this->boxSize = $mod->result_size;
            if (isset($mod->this_mod_only) && $mod->this_mod_only) {
                break;
            }
        }

        return $results;
    }

    function head_content()
    {
        // Javascript is only really needed if there are results
        if (count($this->searchResults) > 0) {
            ?>
            <script type="text/javascript" src="../js/selectSubmit.js"></script>
            <?php
        }
    } // END head() FUNCTION

    function body_content()
    {
        if (count($this->searchResults) == 0) {
            return $this->productsearchbox(_("no match found")."<br />"._("next search or enter upc"));
        } 

        $this->addOnloadCommand("selectSubmit('#search', '#selectform', '#filter-span')\n");

        // originally 390
        $maxSelectWidth = $this->session->get('touchscreen') ? 470 : 530;
        echo "<div class=\"baseHeight\">"
            ."<div class=\"listbox\">"
            ."<form name=\"selectform\" method=\"post\" action=\""
            . AutoLoader::ownURL() . "\""
            ." id=\"selectform\">"
            ."<select name=\"search\" id=\"search\" "
            .' style="min-height: 200px; min-width: 220px;'
            ." max-width: {$maxSelectWidth}px;\""
            ."size=".$this->boxSize." onblur=\"\$('#search').focus();\" "
            ."ondblclick=\"document.forms['selectform'].submit();\">";

        $selected = "selected";
        foreach ($this->searchResults as $row){
            $price = $row["normal_price"];    

            $scale = $row['scale'] != 0 ? 'S' : '';

            $price = MiscLib::truncate2($price);

            echo "<option value='".$row["upc"]."' ".$selected.">".$row["upc"]." - ".$row["description"]
                ." -- [".$price."] ".$scale."\n";
                
            $selected = "";
        }
        echo "</select>"
            . '<div id="filter-span"></div>'
            ."</div>";
        if ($this->session->get('touchscreen')) {
            echo '<div class="listbox listboxText">'
                . DisplayLib::touchScreenScrollButtons()
                . '</div>';
        }
        echo "<div class=\"listboxText coloredText centerOffset\">"
            . _("use arrow keys") . '<br />' . _("to navigate") . '<br />' . _("the list")
            . '<p><button type="submit" class="pos-button wide-button coloredArea">'
            . _('OK') . ' <span class="smaller">' . _('[enter]') . '</span>
                </button></p>'
            . '<p><button type="submit" class="pos-button wide-button errorColoredArea"
                onclick="$(\'#search\').append($(\'<option>\').val(\'\'));$(\'#search\').val(\'\');">'
            . _('Cancel') . ' <span class="smaller">' . _('[clear]') . '</span>
                </button></p>'
            ."</div><!-- /.listboxText coloredText .centerOffset -->"
            .'<input type="hidden" name="qty" value="' . $this->quantity . '" />'
            ."</form>"
            ."<div class=\"clear\"></div>";
        echo "</div>";

        $this->addOnloadCommand("\$('#search').focus();\n");
    } // END body_content() FUNCTION

    function productsearchbox($strmsg) {
        ?>
        <div class="baseHeight">
            <div class="colored centeredDisplay rounded">
            <span class="larger">
            <?php echo $strmsg;?>
            </span>
            <form action="<?php echo AutoLoader::ownURL(); ?>" method="post" autocomplete="off">
            <p>
            <input type="text" name="search" size="15" id="search"
                onblur="$('#search').focus();" />
            <input type="hidden" name="qty" value="<?php echo $this->quantity; ?>" />
            </p>
            <?php if ($this->session->get('touchscreen')) {
                echo DisplayLib::touchScreenKeyboard('#search');
            } ?>
            <button class="pos-button" type="button"
                onclick="$('#search').val('');$(this).closest('form').submit();">
                <?php echo _('Cancel [enter]'); ?>
            </button>
            </form>
            </div>
        </div>
        <?php
        $this->addOnloadCommand("\$('#search').focus();\n");
    }

    public function unitTest($phpunit)
    {
        $res = $this->runSearch('BANA');
        $phpunit->assertInternalType('array', $res);
        $phpunit->assertNotEquals(0, count($res));
        $one = array_pop($res);
        $this->searchResults = array($one); // no need to loop whole list
        $this->onload_commands = array();
        ob_start();
        $this->body_content();
        $phpunit->assertNotEquals(0, strlen(ob_get_clean()));
        $phpunit->assertNotEquals(false, strstr(implode('', $this->onload_commands), "\$('#search').focus();"));
        list($qty, $entered) = $this->getQuantity('5*1234');
        $phpunit->assertEquals(5, $qty);
        $phpunit->assertEquals('1234', $entered);
        $this->form = new COREPOS\common\mvc\ValueContainer();
        $this->form->qty = 2;
        list($qty, $entered) = $this->getQuantity('1234');
        $phpunit->assertEquals(2, $qty);
        $phpunit->assertEquals('1234', $entered);
        $this->searchResults = array();
        $this->onload_commands = array();
        ob_start();
        $this->body_content();
        $phpunit->assertNotEquals(0, strlen(ob_get_clean()));
        $phpunit->assertNotEquals(false, strstr(implode('', $this->onload_commands), "\$('#search').focus();"));
    }

}

AutoLoader::dispatch();