Пример #1
0
 public function showEditForm($upc, $display_mode = 1, $expand_mode = 1)
 {
     $upc = BarcodeLib::padUPC($upc);
     $ret = '<div id="ExtraInfoFieldset" class="panel panel-default">';
     $ret .= "<div class=\"panel-heading\">\n                <a href=\"\" onclick=\"\$('#ExtraInfoFieldsetContent').toggle();return false;\">\n               Extra Info\n                </a></div>";
     $css = $expand_mode == 1 ? '' : ' collapse';
     $ret .= '<div id="ExtraInfoFieldsetContent" class="panel-body' . $css . '">';
     $info = array('cost' => 0.0, 'deposit' => 0, 'local' => 0, 'inUse' => 1, 'modified' => 'Unknown', 'idEnforced' => 0);
     $dbc = $this->db();
     $p = $dbc->prepare_statement('SELECT cost,deposit,local,inUse,modified,idEnforced FROM products WHERE upc=?');
     $r = $dbc->exec_statement($p, array($upc));
     if ($dbc->num_rows($r) > 0) {
         $info = $dbc->fetch_row($r);
     }
     $local_opts = array(0 => 'No');
     $origin = new OriginsModel($dbc);
     $local_opts = array_merge($local_opts, $origin->getLocalOrigins());
     if (count($local_opts) == 1) {
         $local_opts[1] = 'Yes';
         // generic local if no origins defined
     }
     $localSelect = '<select name="local" id="local-origin-id" class="form-control"
         onchange="$(\'#prod-local\').val(this.value);">';
     foreach ($local_opts as $id => $val) {
         $localSelect .= sprintf('<option value="%d" %s>%s</option>', $id, $id == $info['local'] ? 'selected' : '', $val);
     }
     $localSelect .= '</select>';
     $ageSelect = '<select name="idReq" id="idReq" class="form-control"
         onchange="$(\'#id-enforced\').val(this.value);">';
     $ages = array('n/a' => 0, 18 => 18, 21 => 21);
     foreach ($ages as $label => $age) {
         $ageSelect .= sprintf('<option %s value="%d">%s</option>', $age == $info['idEnforced'] ? 'selected' : '', $age, $label);
     }
     $ageSelect .= '</select>';
     $ret .= "<table class=\"table table-bordered\" width='100%'><tr>";
     $ret .= '<tr><th>Deposit' . \COREPOS\Fannie\API\lib\FannieHelp::ToolTip('PLU/UPC of linked deposit item') . '</th>
         <th>Age Req.</th>
         <th>Local</th>
         <th>In Use' . \COREPOS\Fannie\API\lib\FannieHelp::ToolTip('Uncheck to temporarily disable') . '</th></tr>';
     $ret .= sprintf('<tr>
             <td align="center"><input type="text" class="form-control" value="%d" name="deposit" 
                 id="deposit" onchange="$(\'#deposit-upc\').val(this.value);" /></td>
             <td align="center">%s</td>
             <td align="center">%s</td>
             <td align="center">
                 <input type="checkbox" id="extra-in-use-checkbox" name="inUse" value="1" %s 
                     onchange="$(\'#in-use-checkbox\').prop(\'checked\', $(this).prop(\'checked\'));" />
             </td></tr>', $info['deposit'], $ageSelect, $localSelect, $info['inUse'] == 1 ? 'checked' : '');
     $ret .= '</table>
             </div>
             </div>';
     return $ret;
 }
Пример #2
0
    function post_u_view()
    {
        global $FANNIE_OP_DB, $FANNIE_URL;
        $ret = '';
        $dbc = FannieDB::get($FANNIE_OP_DB);
        $taxes = array(0 => 'NoTax');
        $taxerates = $dbc->query('SELECT id, description FROM taxrates');
        while ($row = $dbc->fetch_row($taxerates)) {
            $taxes[$row['id']] = $row['description'];
        }
        $locales = array(0 => 'No');
        $origin = new OriginsModel($dbc);
        $locales = array_merge($locales, $origin->getLocalOrigins());
        $depts = array();
        $deptlist = $dbc->query('SELECT dept_no, dept_name FROM departments ORDER BY dept_no');
        while ($row = $dbc->fetch_row($deptlist)) {
            $depts[$row['dept_no']] = $row['dept_name'];
        }
        $ret .= '<form action="EditItemsFromSearch.php" method="post">';
        $ret .= '<table class="table small">';
        $ret .= '<tr>
                <th>UPC</th>
                <th>Description</th>
                <th>Brand</th>
                <th>Vendor</th>
                <th>Department</th>
                <th>Tax</th>
                <th>FS</th>
                <th>Scale</th>
                <th>%Disc</th>
                <th>Local</th>
                </tr>';
        $ret .= '<tr><th colspan="2">Change All &nbsp;&nbsp;&nbsp;<button type="reset" 
                class="btn btn-default">Reset</button></th>';
        /**
          List known brands from vendorItems as a drop down selection
          rather than free text entry. prodExtra remains an imperfect
          solution but this can at least start normalizing that data
        */
        $ret .= '<td><select class="form-control input-sm" onchange="updateAll(this.value, \'.brandField\');">';
        $ret .= '<option value=""></option>';
        $brands = $dbc->query('
            SELECT brand 
            FROM vendorItems 
            WHERE brand IS NOT NULL AND brand <> \'\' 
            GROUP BY brand 
            
            UNION 

            SELECT brand 
            FROM products 
            WHERE brand IS NOT NULL AND brand <> \'\' 
            GROUP BY brand 
            
            
            ORDER BY brand');
        while ($row = $dbc->fetch_row($brands)) {
            $ret .= '<option>' . $row['brand'] . '</option>';
        }
        $ret .= '</select></td>';
        /**
          See brand above
        */
        $ret .= '<td><select class="form-control input-sm" onchange="updateAll(this.value, \'.vendorField\');">';
        $ret .= '<option value=""></option><option>DIRECT</option>';
        $vendors = $dbc->query('SELECT vendorName FROM vendors
                        GROUP BY vendorName ORDER BY vendorName');
        while ($row = $dbc->fetch_row($vendors)) {
            $ret .= '<option>' . $row['vendorName'] . '</option>';
        }
        $ret .= '</select></td>';
        $ret .= '<td><select class="form-control input-sm" onchange="updateAll(this.value, \'.deptSelect\');">';
        foreach ($depts as $num => $name) {
            $ret .= sprintf('<option value="%d">%d %s</option>', $num, $num, $name);
        }
        $ret .= '</select></td>';
        $ret .= '<td><select class="form-control input-sm" onchange="updateAll(this.value, \'.taxSelect\');">';
        foreach ($taxes as $num => $name) {
            $ret .= sprintf('<option value="%d">%s</option>', $num, $name);
        }
        $ret .= '</select></td>';
        $ret .= '<td><input type="checkbox" onchange="toggleAll(this, \'.fsCheckBox\');" /></td>';
        $ret .= '<td><input type="checkbox" onchange="toggleAll(this, \'.scaleCheckBox\');" /></td>';
        $ret .= '<td><input type="checkbox" onchange="toggleAll(this, \'.discCheckBox\');" /></td>';
        $ret .= '<td><select class="form-control input-sm" onchange="updateAll(this.value, \'.localSelect\');">';
        foreach ($locales as $num => $name) {
            $ret .= sprintf('<option value="%d">%s</option>', $num, $name);
        }
        $ret .= '</select></td>';
        $ret .= '</tr>';
        list($in_sql, $args) = $dbc->safeInClause($this->upcs);
        $query = 'SELECT p.upc, p.description, p.department, d.dept_name,
                    p.tax, p.foodstamp, p.discount, p.scale, p.local,
                    x.manufacturer, x.distributor
                  FROM products AS p
                  LEFT JOIN departments AS d ON p.department=d.dept_no
                  LEFT JOIN prodExtra AS x ON p.upc=x.upc
                  WHERE p.upc IN (' . $in_sql . ')
                  ORDER BY p.upc';
        $prep = $dbc->prepare($query);
        $result = $dbc->execute($prep, $args);
        while ($row = $dbc->fetch_row($result)) {
            $deptOpts = '';
            foreach ($depts as $num => $name) {
                $deptOpts .= sprintf('<option %s value="%d">%d %s</option>', $num == $row['department'] ? 'selected' : '', $num, $num, $name);
            }
            $taxOpts = '';
            foreach ($taxes as $num => $name) {
                $taxOpts .= sprintf('<option %s value="%d">%s</option>', $num == $row['tax'] ? 'selected' : '', $num, $name);
            }
            $localOpts = '';
            foreach ($locales as $num => $name) {
                $localOpts .= sprintf('<option %s value="%d">%s</option>', $num == $row['local'] ? 'selected' : '', $num, $name);
            }
            $ret .= sprintf('<tr>
                            <td>
                                <a href="ItemEditorPage.php?searchupc=%s" target="_edit%s">%s</a>
                                <input type="hidden" class="upcInput" name="upc[]" value="%s" />
                            </td>
                            <td>%s</td>
                            <td><input type="text" name="brand[]" class="brandField form-control input-sm" value="%s" /></td>
                            <td><input type="text" name="vendor[]" class="vendorField form-control input-sm" value="%s" /></td>
                            <td><select name="dept[]" class="deptSelect form-control input-sm">%s</select></td>
                            <td><select name="tax[]" class="taxSelect form-control input-sm">%s</select></td>
                            <td><input type="checkbox" name="fs[]" class="fsCheckBox" value="%s" %s /></td>
                            <td><input type="checkbox" name="scale[]" class="scaleCheckBox" value="%s" %s /></td>
                            <td><input type="checkbox" name="disc[]" class="discCheckBox" value="%s" %s /></td>
                            <td><select name="local[]" class="localSelect form-control input-sm">%s</select></td>
                            </tr>', $row['upc'], $row['upc'], $row['upc'], $row['upc'], $row['description'], $row['manufacturer'], $row['distributor'], $deptOpts, $taxOpts, $row['upc'], $row['foodstamp'] == 1 ? 'checked' : '', $row['upc'], $row['scale'] == 1 ? 'checked' : '', $row['upc'], $row['discount'] == 1 ? 'checked' : '', $localOpts);
        }
        $ret .= '</table>';
        $ret .= '<p>';
        $ret .= '<button type="submit" name="save" class="btn btn-default" value="1">Save Changes</button>';
        $ret .= '</form>';
        return $ret;
    }
Пример #3
0
    function javascript_content()
    {
        global $FANNIE_URL, $FANNIE_OP_DB;
        if ($this->excel) {
            return '';
        }
        $dbc = FannieDB::get($FANNIE_OP_DB);
        $depts = array();
        $prep = $dbc->prepare_statement('SELECT dept_no,dept_name FROM departments ORDER BY dept_no');
        $result = $dbc->exec_statement($prep);
        while ($row = $dbc->fetch_row($result)) {
            $depts[$row[0]] = $row[1];
        }
        $taxes = array('-' => array(0, 'NoTax'));
        $prep = $dbc->prepare_statement('SELECT id, description FROM taxrates ORDER BY id');
        $result = $dbc->exec_statement($prep);
        while ($row = $dbc->fetch_row($result)) {
            if ($row['id'] == 1) {
                $taxes['X'] = array(1, 'Regular');
            } else {
                $taxes[strtoupper(substr($row[1], 0, 1))] = array($row[0], $row[1]);
            }
        }
        $local_opts = array('-' => array(0, 'No'));
        $origins = new OriginsModel($dbc);
        $local_origins = $origins->getLocalOrigins();
        foreach ($local_origins as $originID => $shortName) {
            $local_opts[substr($shortName, 0, 1)] = array($originID, $shortName);
        }
        if (count($local_opts) == 1) {
            $local_opts['X'] = array(1, 'Yes');
        }
        // generic local if no origins defined
        $vendors = array('', 'DIRECT');
        $vModel = new VendorsModel($dbc);
        foreach ($vModel->find('vendorName') as $v) {
            $vendors[] = $v->vendorName();
        }
        ob_start();
        ?>
        var deptObj = <?php 
        echo json_encode($depts);
        ?>
;
        var taxObj = <?php 
        echo json_encode($taxes);
        ?>
;
        var localObj = <?php 
        echo json_encode($local_opts);
        ?>
;
        var vendorObj = <?php 
        echo json_encode($vendors);
        ?>
;
        function edit(elem){
            var brand = elem.find('.td_brand:first').html();
            var content = "<input type=text class=\"in_brand form-control input-sm\" size=8 value=\""+brand+"\" />";   
            elem.find('.td_brand:first').html(content);

            var desc = elem.find('.td_desc:first').html();
            var content = "<input type=text class=\"in_desc form-control input-sm\" size=10 value=\""+desc+"\" />";   
            elem.find('.td_desc:first').html(content);

            var dept = elem.find('.td_dept:first').text();
            var content = '<select class=\"in_dept form-control input-sm\"><optgroup style="font-size: 90%;">';
            for(dept_no in deptObj){
                content += "<option value=\""+dept_no+"\" "+((dept==deptObj[dept_no])?'selected':'')+">";
                content += deptObj[dept_no]+"</option>";
            }
            content += '</optgroup></select>';
            elem.find('.td_dept:first').html(content);

            var supplier = elem.find('.td_supplier:first').text();
            var content = '<select class=\"in_supplier form-control input-sm\"><optgroup style="font-size: 90%;">';
            for(var i in vendorObj){
                content += "<option "+((supplier==vendorObj[i])?'selected':'')+">";
                content += vendorObj[i]+"</option>";
            }
            content += '</optgroup></select>';
            elem.find('.td_supplier:first').html(content);

            var cost = elem.find('.td_cost:first').html();
            var content = "<input type=text class=\"in_cost form-control input-sm\" size=4 value=\""+cost+"\" />";    
            elem.find('.td_cost:first').html(content);

            var price = elem.find('.td_price:first').html();
            var content = "<input type=text class=\"in_price form-control input-sm\" size=4 value=\""+price+"\" />";  
            elem.find('.td_price:first').html(content);

            var tax = elem.find('.td_tax:first').html();
            var content = '<select class=\"in_tax form-control input-sm\">';
            for (ch in taxObj){
                var sel = (tax == ch) ? 'selected' : '';
                content += "<option value=\""+ch+":"+taxObj[ch][0]+"\" "+sel+">";
                content += taxObj[ch][1]+"</option>";
            }
            elem.find('.td_tax:first').html(content);

            var fs = elem.find('.td_fs:first').html();
            var content = "<input type=checkbox class=in_fs "+((fs=='X')?'checked':'')+" />";
            elem.find('.td_fs:first').html(content);

            var disc = elem.find('.td_disc:first').html();
            var content = "<input type=checkbox class=in_disc "+((disc=='X')?'checked':'')+" />";
            elem.find('.td_disc:first').html(content);

            var wgt = elem.find('.td_wgt:first').html();
            var content = "<input type=checkbox class=in_wgt "+((wgt=='X')?'checked':'')+" />";
            elem.find('.td_wgt:first').html(content);

            var local = elem.find('.td_local:first').html();
            //var content = "<input type=checkbox class=in_local "+((local=='X')?'checked':'')+" />";
            var content = '<select class=\"in_local form-control input-sm\">';
            for (ch in localObj){
                var sel = (local == ch) ? 'selected' : '';
                content += "<option value=\""+ch+":"+localObj[ch][0]+"\" "+sel+">";
                content += localObj[ch][1]+"</option>";
            }
            elem.find('.td_local:first').html(content);

            elem.find('.td_cmd:first .edit-link').hide();
            elem.find('.td_cmd:first .save-link').show();

            elem.find('input:text').keydown(function(event) {
                if (event.which == 13) {
                    save(elem);
                }
            });
            elem.find('.clickable input:text').click(function(event){
                // do nothing
                event.stopPropagation();
            });
            elem.find('.clickable select').click(function(event){
                // do nothing
                event.stopPropagation();
            });
        }
        function save(elem){
            var upc = elem.find('.hidden_upc:first').val();
            var store_id = elem.find('.hidden_store_id:first').val();

            var brand = elem.find('.in_brand:first').val();
            elem.find('.td_brand:first').html(brand);

            var desc = elem.find('.in_desc:first').val();
            elem.find('.td_desc:first').html(desc);
        
            var dept = elem.find('.in_dept:first').val();
            elem.find('.td_dept:first').html(deptObj[dept]);

            var supplier = elem.find('.in_supplier:first').val();
            elem.find('.td_supplier:first').html(supplier);

            mathField(elem.find('.in_cost:first').get(0));
            var cost = elem.find('.in_cost:first').val();
            elem.find('.td_cost:first').html(cost);

            var price = elem.find('.in_price:first').val();
            elem.find('.td_price:first').html(price);

            var tax = elem.find('.in_tax:first').val().split(':');
            elem.find('.td_tax:first').html(tax[0]);
            
            var fs = elem.find('.in_fs:first').is(':checked') ? 1 : 0;
            elem.find('.td_fs:first').html((fs==1)?'X':'-');

            var disc = elem.find('.in_disc:first').is(':checked') ? 1 : 0;
            elem.find('.td_disc:first').html((disc==1)?'X':'-');

            var wgt = elem.find('.in_wgt:first').is(':checked') ? 1 : 0;
            elem.find('.td_wgt:first').html((wgt==1)?'X':'-');

            var local = elem.find('.in_local:first').val().split(':');
            elem.find('.td_local:first').html(local[0]);

            elem.find('.td_cmd:first .edit-link').show();
            elem.find('.td_cmd:first .save-link').hide();

            var dstr = 'ajax=save&upc='+upc+'&desc='+desc+'&dept='+dept+'&price='+price+'&cost='+cost;
            dstr += '&tax='+tax[1]+'&fs='+fs+'&disc='+disc+'&wgt='+wgt+'&supplier='+supplier+'&local='+local[1];
            dstr += '&brand='+encodeURIComponent(brand);
            dstr += '&store_id='+store_id;
            $.ajax({
            url: 'ProductListPage.php',
            data: dstr,
            cache: false,
            type: 'post',
            success: function(data){
            }
            });
        }
        function deleteCheck(upc,desc){
            $.ajax({
            url: 'ProductListPage.php',
            data: 'ajax=deleteCheck&upc='+upc+'&desc='+desc,
            dataType: 'json',
            cache: false,
            type: 'post',
            success: function(data){
                if (data.alertBox && data.upc && data.enc_desc){
                    if (confirm(data.alertBox)){
                        $.ajax({
                        url: 'ProductListPage.php',
                        data: 'ajax=doDelete&upc='+upc+'&desc='+data.enc_desc,
                        cache: false,
                        type: 'post',
                        success: function(data){
                            $('#' + upc).remove();
                        }
                        });
                    }
                }
                else
                    alert('Data error: cannot delete');
            }
            });
        }
        <?php 
        if ($this->canEditItems) {
            ?>
        $(document).ready(function(){
            $('tr').each(function(){
                if ($(this).find('.hidden_upc').length != 0) {
                    var upc = $(this).find('.hidden_upc').val();
                    $(this).find('.clickable').click(function() {
                        if ($(this).find(':input').length == 0) {
                            edit($(this).closest('tr'));
                            $(this).find(':input').select();
                        }
                    });
                }
            });
        });
        <?php 
        }
        return ob_get_clean();
    }
Пример #4
0
 protected function get_view()
 {
     global $FANNIE_OP_DB, $FANNIE_URL;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $this->addScript('search.js');
     $ret = '<div class="col-sm-10">';
     $ret .= '<form method="post" id="searchform" onsubmit="getResults(); return false;" onreset="formReset();">';
     $ret .= '<table class="table table-bordered">';
     $ret .= '<tr>';
     $ret .= '<td class="text-right">
         <label class="small control-label">
             <a href="" class="btn btn-default btn-xs"
             onclick="$(\'.upc-in\').toggle(); return false;">+</a>
             UPC
         </label>
         </td>
         <td>
             <textarea class="upc-in form-control input-sm collapse" name="upcs"></textarea>
             <input type="text" name="upc" class="upc-in form-control input-sm" 
                 placeholder="UPC or PLU" />
         </td>';
     $ret .= '<td class="text-right">
         <label class="control-label small">Descript.</label>
         </td>
         <td>
         <input type="text" name="description" class="form-control input-sm" 
             placeholder="Item Description" />
         </td>';
     $ret .= '<td class="text-right">
         <label class="control-label small">Brand</label>
         </td>
         <td>
         <input type="text" name="brand" class="form-control input-sm" 
             placeholder="Brand Name" id="brand-field" />
         </td>';
     $ret .= '</tr><tr>';
     $ret .= '<td class="text-right">
         <label class="control-label small">Super Dept</label>
         </td>
         <td>
         <select name="superID" class="form-control input-sm" onchange="chainSuper(this.value);" >
             <option value="">Select Super...</option>';
     $supers = $dbc->query('SELECT superID, super_name FROM superDeptNames order by superID');
     while ($row = $dbc->fetch_row($supers)) {
         $ret .= sprintf('<option value="%d">%s</option>', $row['superID'], $row['super_name']);
     }
     $ret .= '</select></td>';
     $ret .= '<td class="text-right">
         <label class="control-label small">Dept Start</label>
         </td>
         <td>
         <select name="deptStart" id="dept-start" class="form-control input-sm">
             <option value="">Select Start...</option>';
     $supers = $dbc->query('SELECT dept_no, dept_name FROM departments order by dept_no');
     while ($row = $dbc->fetch_row($supers)) {
         $ret .= sprintf('<option value="%d">%d %s</option>', $row['dept_no'], $row['dept_no'], $row['dept_name']);
     }
     $ret .= '</select></td>';
     $ret .= '<td class="text-right">
         <label class="control-label small">Dept End</label>
         </td>
         <td>
         <select name="deptEnd" id="dept-end" class="form-control input-sm">
             <option value="">Select End...</option>';
     $supers = $dbc->query('SELECT dept_no, dept_name FROM departments order by dept_no');
     while ($row = $dbc->fetch_row($supers)) {
         $ret .= sprintf('<option value="%d">%d %s</option>', $row['dept_no'], $row['dept_no'], $row['dept_name']);
     }
     $ret .= '</select></td>';
     $ret .= '</tr><tr>';
     // end row
     $ret .= '<td>
         <select class="form-control input-sm" name="modOp">
             <option>Modified On</option>
             <option>Modified Before</option>
             <option>Modified After</option>
         </select>
         </td>
         <td>
         <input type="text" name="modDate" id="modDate" class="form-control input-sm date-field" 
                 placeholder="Modified date" />
        </td>';
     $ret .= '<td class="text-right">
             <label class="control-label small">Movement</label>
             </td>
             <td>
             <select name="soldOp" class="form-control input-sm"><option value="">n/a</option><option value="7">Last 7 days</option>
                 <option value="30">Last 30 days</option><option value="90">Last 90 days</option></select>
             </td>';
     $ret .= '<td class="text-right">
                 <label class="control-label small">Vendor</label>
              </td>
              <td>
                 <select name="vendor" class="form-control input-sm"
                 onchange="if(this.value===\'\' || this.value===\'0\') $(\'#vendorSale\').attr(\'disabled\',\'disabled\'); else $(\'#vendorSale\').removeAttr(\'disabled\');" >
                 <option value="">Any</option>
                 <option value="0">Not Assigned</option>';
     $vendors = $dbc->query('SELECT vendorID, vendorName FROM vendors ORDER BY vendorName');
     while ($row = $dbc->fetch_row($vendors)) {
         $ret .= sprintf('<option value="%d">%s</option>', $row['vendorID'], $row['vendorName']);
     }
     $ret .= '</select></td>';
     $ret .= '</tr><tr>';
     // end row
     $ret .= '
         <td class="text-right">
             <label class="control-label small">Price</label>
         </td>
         <td class="form-inline">
             <select name="price_op" class="form-control input-sm">
                 <option>=</option>
                 <option>&lt;</option>
                 <option>&gt;</option>
             </select>
             <input type="text" class="form-control input-sm price-field"
                 name="price" placeholder="$0.00" />
         </td>
         <td class="text-right">
             <label class="control-label small">Cost</label>
         </td>
         <td class="form-inline">
             <select name="cost_op" class="form-control input-sm">
                 <option>=</option>
                 <option>&lt;</option>
                 <option>&gt;</option>
             </select>
             <input type="text" class="form-control input-sm price-field"
                 name="cost" placeholder="$0.00" />
         </td>
         <td class="form-inline" colspan="2">
             <label class="control-label small">Pricing Rule</label>
             <select name="price_rule" class="form-control input-sm">
                 <option value="">Any</option>
                 <option value="0">Standard</option>
                 <option value="1">Variable</option>
             </select>
         </td>
         </td>';
     $ret .= '</tr><tr>';
     // end row
     $ret .= '<td class="text-right">
         <label class="control-label small">Origin</label>
         </td>';
     $ret .= '<td>
         <select name="originID" class="form-control input-sm"><option value="0">Any Origin</option>';
     $origins = $dbc->query('SELECT originID, shortName FROM origins WHERE local=0 ORDER BY shortName');
     while ($row = $dbc->fetch_row($origins)) {
         $ret .= sprintf('<option value="%d">%s</option>', $row['originID'], $row['shortName']);
     }
     $ret .= '</select></td>';
     $ret .= '<td class="text-right">
             <label class="control-label small">Likecode</label> 
             </td>';
     $ret .= '<td>
         <select name="likeCode" class="form-control input-sm"><option value="">Choose Like Code</option>
             <option value="ANY">In Any Likecode</option>
             <option value="NONE">Not in a Likecode</option>';
     $lcs = $dbc->query('SELECT likeCode, likeCodeDesc FROM likeCodes ORDER BY likeCode');
     while ($row = $dbc->fetch_row($lcs)) {
         $ret .= sprintf('<option value="%d">%d %s</option>', $row['likeCode'], $row['likeCode'], $row['likeCodeDesc']);
     }
     $ret .= '</select></td>';
     $ret .= '<td colspan="2">
         <label class="small" for="vendorSale">
         On Vendor Sale
         <input type="checkbox" id="vendorSale" name="vendorSale" class="checkbox-inline" disabled />
         </label>';
     $ret .= ' | 
             <label class="small" for="in_use">
             InUse
             <input type="checkbox" name="in_use" id="in_use" value="1" checked class="checkbox-inline" />
             </label>
             </td>';
     $ret .= '</tr><tr>';
     $ret .= '<td colspan="2" class="form-inline">
         <div class="form-group">
         <label class="control-label small">Tax</label>
         <select name="tax" class="form-control input-sm"><option value="">Any</option><option value="0">NoTax</option>';
     $taxes = $dbc->query('SELECT id, description FROM taxrates');
     while ($row = $dbc->fetch_row($taxes)) {
         $ret .= sprintf('<option value="%d">%s</option>', $row['id'], $row['description']);
     }
     $ret .= '</select></div>';
     $ret .= '&nbsp;&nbsp;
         <div class="form-group">
         <label class="control-label small">FS</label>
         <select name="fs" class="form-control input-sm">
         <option value="">Any</option><option value="1">Yes</option><option value="0">No</option></select>
         </div>
         </td>';
     $ret .= '<td colspan="2" class="form-inline">
         <div class="form-group">
         <label class="control-label small">Local</label>
         <select name="local" class="form-control input-sm"><option value="">Any</option><option value="0">No</option>';
     $origins = new OriginsModel($dbc);
     foreach ($origins->getLocalOrigins() as $originID => $shortName) {
         $ret .= sprintf('<option value="%d">%s</option>', $originID, $shortName);
     }
     $ret .= '</select></div> ';
     $ret .= '&nbsp;&nbsp;
         <div class="form-group">
         <label class="control-label small">%Disc</label>
         <select name="discountable" class="form-control input-sm">
         <option value="">Any</option><option value="1">Yes</option><option value="0">No</option></select>
         </div>
         <label class="small" for="serviceScale">
         Service Scale
         <input type="checkbox" id="serviceScale" name="serviceScale" class="checkbox-inline" />
         </label>
         </td>';
     $ret .= '<td colspan="2" class="form-inline">
         <div class="form-group">
         <label class="control-label small">Location</label>
         <select name="location" class="form-control input-sm">
         <option value="">Any</option><option value="1">Yes</option><option value="0">No</option>
         </select>
         </div>';
     $ret .= '&nbsp;&nbsp;
         <div class="form-group">
         <label class="control-label small">Sign Info</label>
         <select name="signinfo" class="form-control input-sm">
         <option value="">Any</option><option value="1">Yes</option><option value="0">No</option>
         </select>
         </div>';
     $ret .= '</td>';
     // end row
     $ret .= '</tr><tr>';
     $ret .= '<td colspan="6" class="form-inline">';
     $ret .= '
             <label class="control-label small">In Sale Batch</label>
             <select name="onsale" class="form-control input-sm"
                 onchange="if(this.value===\'\') $(\'.saleField\').attr(\'disabled\',\'disabled\'); else $(\'.saleField\').removeAttr(\'disabled\');" >
                 <option value="">Any</option>';
     $ret .= '<option value="1">Yes</option><option value="0">No</option>';
     $ret .= '</select>';
     $ret .= '&nbsp;&nbsp;
         <label class="control-label small">Sale Type</label>
         <select disabled class="saleField form-control input-sm" name="saletype">
         <option value="">Any Sale Type</option>';
     $vendors = $dbc->query('SELECT batchTypeID, typeDesc FROM batchType WHERE discType <> 0');
     while ($row = $dbc->fetch_row($vendors)) {
         $ret .= sprintf('<option value="%d">%s</option>', $row['batchTypeID'], $row['typeDesc']);
     }
     $ret .= '</select>';
     $ret .= '&nbsp;&nbsp;
             <label class="small">
             All Sales
             <input type="checkbox" disabled class="saleField checkbox-inline" name="sale_all" id="sale_all" value="1" /> 
             </label> | ';
     $ret .= '<label class="small">
             Past Sales
             <input type="checkbox" disabled class="saleField checkbox-inline" name="sale_past" id="sale_past" value="1" /> 
             </label> | ';
     $ret .= '<label class="small">
             Current Sales
             <input type="checkbox" disabled class="saleField checkbox-inline" name="sale_current" id="sale_current" value="1" /> 
             </label> | ';
     $ret .= '<label class="small">
             Upcoming Sales
             <input type="checkbox" disabled class="saleField checkbox-inline" name="sale_upcoming" id="sale_upcoming" value="1" /> 
             </label>';
     $ret .= '</td>';
     $ret .= '</tr></table>';
     $ret .= '<button type="submit" class="btn btn-default btn-core">Find Items</button>';
     $ret .= '<button type="reset" class="btn btn-default btn-reset">Clear Settings</button>';
     $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;';
     $ret .= '<span id="selection-counter"></span>';
     $ret .= '</form>';
     $ret .= '<hr />';
     $ret .= '
         <div class="progress collapse">
             <div class="progress-bar progress-bar-striped active"  role="progressbar" 
                 aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%">
                 <span class="sr-only">Searching</span>
             </div>
         </div>';
     $ret .= '<div id="resultArea"></div>';
     $ret .= '</div>';
     // end col-sm-10
     $ret .= '<div class="col-sm-2">';
     $ret .= '<div class="panel panel-default">
         <div class="panel-heading">Selected Items</div>
         <div class="panel-body">';
     $ret .= '<p><button type="submit" class="btn btn-default btn-xs" 
         onclick="goToBatch();">Price or Sale Batch</button></p>';
     $ret .= '<p><button type="submit" class="btn btn-default btn-xs" 
         onclick="goToEdit();">Group Edit Items</button></p>';
     $ret .= '<p><button type="submit" class="btn btn-default btn-xs" 
         onclick="goToList();">Product List Tool</button></p>';
     $ret .= '<p><button class="btn btn-default btn-xs" type="submit" 
         onclick="goToSigns();">Tags/Signs</button></p>';
     $ret .= '<p><button class="btn btn-default btn-xs" type="submit" 
         onclick="goToMargins();">Margins</button></p>';
     $ret .= '<p><button class="btn btn-default btn-xs" type="submit" 
         onclick="goToSync();">Scale Sync</button></p>';
     $ret .= '</div>';
     $ret .= '</div>';
     $ret .= '<div class="panel panel-default">
         <div class="panel-heading">Report on Items</div>
         <div class="panel-body">';
     $ret .= '<select id="reportURL" class="form-control input-sm">';
     $ret .= sprintf('<option value="%sreports/DepartmentMovement/SmartMovementReport.php?date1=%s&date2=%s&lookup-type=u">
                     Movement</option>', $FANNIE_URL, date('Y-m-d'), date('Y-m-d'));
     $ret .= sprintf('<option value="%sreports/from-search/PercentageOfSales/PercentageOfSalesReport.php">
                     %% of Sales</option>', $FANNIE_URL);
     $ret .= '</select> ';
     $ret .= '<p><button class="btn btn-default btn-xs" type="submit" 
         onclick="goToReport();">Get Report</button></p>';
     $ret .= '</div>';
     $ret .= '</div>';
     $ret .= '<form method="post" id="actionForm" target="__advs_act"></form>';
     $ret .= '</div>';
     $this->add_script('autocomplete.js');
     $this->add_onload_command("bindAutoComplete('#brand-field', '../ws/', 'brand');\n");
     $this->addScript('../src/javascript/tablesorter/jquery.tablesorter.js');
     return $ret;
 }
Пример #5
0
    public function showEditForm($upc, $display_mode = 1, $expand_mode = 1)
    {
        $FANNIE_PRODUCT_MODULES = FannieConfig::config('PRODUCT_MODULES', array());
        $upc = BarcodeLib::padUPC($upc);
        $trimmed = ltrim($upc, '0');
        $barcode_type = '';
        if (strlen($trimmed) == '12') {
            // probably EAN-13 w/o check digi
            $barcode_type = 'EAN';
        } elseif (strlen($trimmed) == 11 && $trimmed[0] == '2') {
            // variable price UPC
            $barcode_type = 'Scale';
        } elseif (strlen($trimmed) <= 11 && strlen($trimmed) >= 6) {
            // probably UPC-A w/o check digit
            $barcode_type = 'UPC';
        } else {
            $barcode_type = 'PLU';
        }
        $ret = '<div id="BaseItemFieldset" class="panel panel-default">';
        $dbc = $this->db();
        $q = '
            SELECT
                p.description,
                p.pricemethod,
                p.normal_price,
                p.cost,
                CASE 
                    WHEN p.size IS NULL OR p.size=\'\' OR p.size=\'0\' AND v.size IS NOT NULL THEN v.size 
                    ELSE p.size 
                END AS size,
                p.unitofmeasure,
                p.modified,
                p.last_sold,
                p.special_price,
                p.end_date,
                p.subdept,
                p.department,
                p.tax,
                p.foodstamp,
                p.scale,
                p.qttyEnforced,
                p.discount,
                p.line_item_discountable,
                p.brand AS manufacturer,
                x.distributor,
                u.description as ldesc,
                p.default_vendor_id,
                v.units AS caseSize,
                v.sku,
                p.inUse,
                p.idEnforced,
                p.local,
                p.deposit,
                p.discounttype,
                p.wicable,
                p.store_id
            FROM products AS p 
                LEFT JOIN prodExtra AS x ON p.upc=x.upc 
                LEFT JOIN productUser AS u ON p.upc=u.upc 
                LEFT JOIN vendorItems AS v ON p.upc=v.upc AND p.default_vendor_id = v.vendorID
            WHERE p.upc=?';
        $p_def = $dbc->tableDefinition('products');
        if (!isset($p_def['last_sold'])) {
            $q = str_replace('p.last_sold', 'NULL as last_sold', $q);
        }
        $p = $dbc->prepare($q);
        $r = $dbc->exec_statement($p, array($upc));
        $store_model = new StoresModel($dbc);
        $store_model->hasOwnItems(1);
        $stores = array();
        foreach ($store_model->find('storeID') as $obj) {
            $stores[$obj->storeID()] = $obj;
        }
        $items = array();
        $rowItem = array();
        $prevUPC = False;
        $nextUPC = False;
        $likeCode = False;
        if ($dbc->num_rows($r) > 0) {
            //existing item
            while ($w = $dbc->fetch_row($r)) {
                $items[$w['store_id']] = $w;
                $rowItem = $w;
            }
            /**
              Lookup default vendor & normalize
            */
            $product = new ProductsModel($dbc);
            $product->upc($upc);
            $product->load();
            $vendor = new VendorsModel($dbc);
            $vendor->vendorID($product->default_vendor_id());
            if ($vendor->load()) {
                $rowItem['distributor'] = $vendor->vendorName();
            }
            /* find previous and next items in department */
            $pnP = $dbc->prepare_statement('SELECT upc FROM products WHERE department=? ORDER BY upc');
            $pnR = $dbc->exec_statement($pnP, array($product->department()));
            $passed_it = False;
            while ($pnW = $dbc->fetch_row($pnR)) {
                if (!$passed_it && $upc != $pnW[0]) {
                    $prevUPC = $pnW[0];
                } else {
                    if (!$passed_it && $upc == $pnW[0]) {
                        $passed_it = True;
                    } else {
                        if ($passed_it) {
                            $nextUPC = $pnW[0];
                            break;
                        }
                    }
                }
            }
            $lcP = $dbc->prepare_statement('SELECT likeCode FROM upcLike WHERE upc=?');
            $lcR = $dbc->exec_statement($lcP, array($upc));
            if ($dbc->num_rows($lcR) > 0) {
                $lcW = $dbc->fetch_row($lcR);
                $likeCode = $lcW['likeCode'];
            }
            if (FannieConfig::config('STORE_MODE') == 'HQ') {
                $default_id = array_keys($items);
                $default_id = $default_id[0];
                $default_item = $items[$default_id];
                foreach ($stores as $id => $info) {
                    if (!isset($items[$id])) {
                        $items[$id] = $default_item;
                    }
                }
            }
        } else {
            // default values for form fields
            $rowItem = array('description' => '', 'normal_price' => 0, 'pricemethod' => 0, 'size' => '', 'unitofmeasure' => '', 'modified' => '', 'ledesc' => '', 'manufacturer' => '', 'distributor' => '', 'default_vendor_id' => 0, 'department' => 0, 'subdept' => 0, 'tax' => 0, 'foodstamp' => 0, 'scale' => 0, 'qttyEnforced' => 0, 'discount' => 1, 'line_item_discountable' => 1, 'caseSize' => '', 'sku' => '', 'inUse' => 1, 'idEnforced' => 0, 'local' => 0, 'deposit' => 0, 'cost' => 0, 'discounttype' => 0, 'wicable' => 0);
            /**
              Check for entries in the vendorItems table to prepopulate
              fields for the new item
            */
            $vendorP = "\n                SELECT \n                    i.description,\n                    i.brand as manufacturer,\n                    i.cost,\n                    v.vendorName as distributor,\n                    d.margin,\n                    i.vendorID,\n                    i.srp,\n                    i.size,\n                    i.units,\n                    i.sku,\n                    i.vendorID as default_vendor_id\n                FROM vendorItems AS i \n                    LEFT JOIN vendors AS v ON i.vendorID=v.vendorID\n                    LEFT JOIN vendorDepartments AS d ON i.vendorDept=d.deptID AND d.vendorID=i.vendorID\n                WHERE i.upc=?";
            $args = array($upc);
            $vID = FormLib::get_form_value('vid', '');
            if ($vID !== '') {
                $vendorP .= ' AND i.vendorID=?';
                $args[] = $vID;
            }
            $vendorP .= ' ORDER BY i.vendorID';
            $vendorP = $dbc->prepare_statement($vendorP);
            $vendorR = $dbc->exec_statement($vendorP, $args);
            if ($dbc->num_rows($vendorR) > 0) {
                $v = $dbc->fetch_row($vendorR);
                $ret .= "<div><i>This product is in the " . $v['distributor'] . " catalog. Values have\n                    been filled in where possible</i></div>";
                $rowItem['description'] = $v['description'];
                $rowItem['manufacturer'] = $v['manufacturer'];
                $rowItem['cost'] = $v['cost'];
                $rowItem['distributor'] = $v['distributor'];
                $rowItem['normal_price'] = $v['srp'];
                $rowItem['default_vendor_id'] = $v['vendorID'];
                $rowItem['size'] = $v['size'];
                $rowItem['caseSize'] = $v['units'];
                $rowItem['sku'] = $v['sku'];
                while ($v = $dbc->fetch_row($vendorR)) {
                    $ret .= sprintf('This product is also in <a href="?searchupc=%s&vid=%d">%s</a><br />', $upc, $v['vendorID'], $v['distributor']);
                }
            }
            /**
              Look for items with a similar UPC to guess what
              department this item goes in. If found, use 
              department settings to fill in some defaults
            */
            $rowItem['department'] = 0;
            $search = substr($upc, 0, 12);
            $searchP = $dbc->prepare('SELECT department FROM products WHERE upc LIKE ?');
            while (strlen($search) >= 8) {
                $searchR = $dbc->execute($searchP, array($search . '%'));
                if ($dbc->numRows($searchR) > 0) {
                    $searchW = $dbc->fetchRow($searchR);
                    $rowItem['department'] = $searchW['department'];
                    break;
                }
                $search = substr($search, 0, strlen($search) - 1);
            }
            /**
              If no match is found, pick the most
              commonly used department
            */
            if ($rowItem['department'] == 0) {
                $commonQ = '
                    SELECT department,
                        COUNT(*)
                    FROM products
                    GROUP BY department
                    ORDER BY COUNT(*) DESC';
                $commonR = $dbc->query($commonQ);
                if ($commonR && $dbc->numRows($commonR)) {
                    $commonW = $dbc->fetchRow($commonR);
                    $rowItem['department'] = $commonW['department'];
                }
            }
            /**
              Get defaults for chosen department
            */
            $dmodel = new DepartmentsModel($dbc);
            $dmodel->dept_no($rowItem['department']);
            if ($dmodel->load()) {
                $rowItem['tax'] = $dmodel->dept_tax();
                $rowItem['foodstamp'] = $dmodel->dept_fs();
                $rowItem['discount'] = $dmodel->dept_discount();
            }
            foreach ($stores as $id => $obj) {
                $items[$id] = $rowItem;
            }
        }
        $ret .= '<div class="panel-heading">';
        if ($prevUPC) {
            $ret .= ' <a class="btn btn-default btn-xs small" href="ItemEditorPage.php?searchupc=' . $prevUPC . '"
                title="Previous item in this department">
                <span class="glyphicon glyphicon-chevron-left"></span></a> ';
        }
        $ret .= '<strong>UPC</strong>
                <span class="text-danger">';
        switch ($barcode_type) {
            case 'EAN':
            case 'UPC':
                $ret .= substr($upc, 0, 3) . '<a class="text-danger iframe fancyboxLink" href="../reports/ProductLine/ProductLineReport.php?prefix=' . substr($upc, 3, 5) . '" title="Product Line">' . '<strong>' . substr($upc, 3, 5) . '</strong>' . '</a>' . substr($upc, 8);
                break;
            case 'Scale':
                $ret .= substr($upc, 0, 3) . '<strong>' . substr($upc, 3, 4) . '</strong>' . substr($upc, 7);
                break;
            case 'PLU':
                $trimmed = ltrim($upc, '0');
                if (strlen($trimmed) < 13) {
                    $ret .= str_repeat('0', 13 - strlen($trimmed)) . '<strong>' . $trimmed . '</strong>';
                } else {
                    $ret .= $upc;
                }
                break;
            default:
                $ret .= $upc;
        }
        $ret .= '</span>';
        $ret .= '<input type="hidden" id="upc" name="upc" value="' . $upc . '" />';
        if ($nextUPC) {
            $ret .= ' <a class="btn btn-default btn-xs small" href="ItemEditorPage.php?searchupc=' . $nextUPC . '"
                title="Next item in this department">
                <span class="glyphicon glyphicon-chevron-right"></span></a>';
        }
        $ret .= ' <label style="color:darkmagenta;">Modified</label>
                <span style="color:darkmagenta;">' . $rowItem['modified'] . '</span>';
        $ret .= ' | <label style="color:darkmagenta;">Last Sold</label>
                <span style="color:darkmagenta;">' . (empty($rowItem['last_sold']) ? 'n/a' : $rowItem['last_sold']) . '</span>';
        $ret .= '</div>';
        // end panel-heading
        $ret .= '<div class="panel-body">';
        $new_item = false;
        if ($dbc->num_rows($r) == 0) {
            // new item
            $ret .= "<div class=\"alert alert-warning\">Item not found.  You are creating a new one.</div>";
            $new_item = true;
        }
        $nav_tabs = '<ul id="store-tabs" class="nav nav-tabs small" role="tablist">';
        $ret .= '{{nav_tabs}}<div class="tab-content">';
        $active_tab = true;
        foreach ($items as $store_id => $rowItem) {
            $tabID = 'store-tab-' . $store_id;
            $store_description = 'n/a';
            if (isset($stores[$store_id])) {
                $store_description = $stores[$store_id]->description();
            }
            $nav_tabs .= '<li role="presentation" ' . ($active_tab ? 'class="active"' : '') . '>' . '<a href="#' . $tabID . '" aria-controls="' . $tabID . '" ' . 'onclick="$(\'.tab-content .chosen-select:visible\').chosen();"' . 'role="tab" data-toggle="tab">' . $store_description . '</a></li>';
            $ret .= '<div role="tabpanel" class="tab-pane' . ($active_tab ? ' active' : '') . '"
                id="' . $tabID . '">';
            $ret .= '<input type="hidden" class="store-id" name="store_id[]" value="' . $store_id . '" />';
            $ret .= '<table class="table table-bordered">';
            $limit = 30 - strlen(isset($rowItem['description']) ? $rowItem['description'] : '');
            $ret .= <<<HTML
<tr>
    <th class="text-right">Description</th>
    <td colspan="5">
        <div class="input-group" style="width:100%;">
            <input type="text" maxlength="30" class="form-control syncable-input" required
                name="descript[]" id="descript" value="{{description}}"
                onkeyup="\$(this).next().html(30-(this.value.length));" />
            <span class="input-group-addon">{{limit}}</span>
        </div>
    </td>
    <th class="text-right">Cost</th>
    <td>
        <div class="input-group">
            <span class="input-group-addon">\$</span>
            <input type="text" id="cost{{store_id}}" name="cost[]" 
                class="form-control price-field cost-input syncable-input"
                value="{{cost}}" data-store-id="{{store_id}}"
                onkeydown="if (typeof nosubmit == 'function') nosubmit(event);"
                onkeyup="if (typeof nosubmit == 'function') nosubmit(event);" 
                onchange="\$('.default_vendor_cost').val(this.value);"
            />
        </div>
    </td>
    <th class="text-right">Price</th>
    <td>
        <div class="input-group">
            <span class="input-group-addon">\$</span>
            <input type="text" id="price{{store_id}}" name="price[]" 
                class="form-control price-field price-input syncable-input"
                data-store-id="{{store_id}}"
                required value="{{normal_price}}" />
        </div>
    </td>
</tr>
HTML;
            $ret = str_replace('{{description}}', $rowItem['description'], $ret);
            $ret = str_replace('{{limit}}', $limit, $ret);
            $ret = str_replace('{{cost}}', sprintf('%.2f', $rowItem['cost']), $ret);
            $ret = str_replace('{{normal_price}}', sprintf('%.2f', $rowItem['normal_price']), $ret);
            // no need to display this field twice
            if (!isset($FANNIE_PRODUCT_MODULES['ProdUserModule'])) {
                $ret .= '
                    <tr>
                        <th>Long Desc.</th>
                        <td colspan="5">
                        <input type="text" size="60" name="puser_description" maxlength="255"
                            ' . (!$active_tab ? ' disabled ' : '') . '
                            value="' . $rowItem['ldesc'] . '" class="form-control" />
                        </td>
                    </tr>';
            }
            $ret .= '
                <tr>
                    <th class="text-right">Brand</th>
                    <td colspan="5">
                        <input type="text" name="manufacturer[]" 
                            class="form-control input-sm brand-field syncable-input"
                            value="' . $rowItem['manufacturer'] . '" />
                    </td>';
            /**
              Check products.default_vendor_id to see if it is a 
              valid reference to the vendors table
            */
            $normalizedVendorID = false;
            if (isset($rowItem['default_vendor_id']) && $rowItem['default_vendor_id'] != 0) {
                $normalizedVendor = new VendorsModel($dbc);
                $normalizedVendor->vendorID($rowItem['default_vendor_id']);
                if ($normalizedVendor->load()) {
                    $normalizedVendorID = $normalizedVendor->vendorID();
                }
            }
            /**
              Use a <select> box if the current vendor corresponds to a valid
              entry OR if no vendor entry exists. Only allow free text
              if it's already in place
            */
            $ret .= ' <th class="text-right">Vendor</th> ';
            if ($normalizedVendorID || empty($rowItem['distributor'])) {
                $ret .= '<td colspan="3" class="form-inline"><select name="distributor[]" 
                            class="chosen-select form-control vendor_field syncable-input"
                            onchange="vendorChanged(this.value);">';
                $ret .= '<option value="0">Select a vendor</option>';
                $vendors = new VendorsModel($dbc);
                foreach ($vendors->find('vendorName') as $v) {
                    $ret .= sprintf('<option %s>%s</option>', $v->vendorID() == $normalizedVendorID ? 'selected' : '', $v->vendorName());
                }
                $ret .= '</select>';
            } else {
                $ret .= "<td colspan=\"3\"><input type=text name=distributor[] size=8 value=\"" . (isset($rowItem['distributor']) ? $rowItem['distributor'] : "") . "\" class=\"form-control vendor-field syncable-input\" />";
            }
            $ret .= ' <button type="button" 
                        title="Create new vendor"
                        class="btn btn-default btn-sm newVendorButton">
                        <span class="glyphicon glyphicon-plus"></span></button>';
            $ret .= '</td></tr>';
            // end row
            if (isset($rowItem['discounttype']) && $rowItem['discounttype'] != 0) {
                /* show sale info */
                $batchP = $dbc->prepare_statement("\n                    SELECT b.batchName, \n                        b.batchID \n                    FROM batches AS b \n                        LEFT JOIN batchList as l on b.batchID=l.batchID \n                    WHERE '" . date('Y-m-d') . "' BETWEEN b.startDate AND b.endDate \n                        AND (l.upc=? OR l.upc=?)");
                $batchR = $dbc->exec_statement($batchP, array($upc, 'LC' . $likeCode));
                $batch = array('batchID' => 0, 'batchName' => "Unknown");
                if ($dbc->num_rows($batchR) > 0) {
                    $batch = $dbc->fetch_row($batchR);
                }
                $ret .= '<td class="alert-success" colspan="8">';
                $ret .= sprintf("<strong>Sale Price:</strong>\n                    %.2f (<em>Batch: <a href=\"%sbatches/newbatch/EditBatchPage.php?id=%d\">%s</a></em>)", $rowItem['special_price'], FannieConfig::config('URL'), $batch['batchID'], $batch['batchName']);
                list($date, $time) = explode(' ', $rowItem['end_date']);
                $ret .= "<strong>End Date:</strong>\n                        {$date} \n                        (<a href=\"EndItemSale.php?id={$upc}\">Unsale Now</a>)";
                $ret .= '</td>';
            }
            $supers = array();
            $depts = array();
            $subs = array();
            $range_limit = FannieAuth::validateUserLimited('pricechange');
            $deptQ = '
                SELECT dept_no,
                    dept_name,
                    subdept_no,
                    subdept_name,
                    s.dept_ID,
                    MIN(m.superID) AS superID
                FROM departments AS d
                    LEFT JOIN subdepts AS s ON d.dept_no=s.dept_ID
                    LEFT JOIN superdepts AS m ON d.dept_no=m.dept_ID ';
            if (is_array($range_limit) && count($range_limit) == 2) {
                $deptQ .= ' WHERE m.superID BETWEEN ? AND ? ';
            } else {
                $range_limit = array();
            }
            $deptQ .= '
                GROUP BY d.dept_no,
                    d.dept_name,
                    s.subdept_no,
                    s.subdept_name,
                s.dept_ID
                ORDER BY d.dept_no, s.subdept_name';
            $p = $dbc->prepare($deptQ);
            $r = $dbc->execute($p, $range_limit);
            $superID = '';
            while ($w = $dbc->fetch_row($r)) {
                if (!isset($depts[$w['dept_no']])) {
                    $depts[$w['dept_no']] = $w['dept_name'];
                }
                if ($w['dept_no'] == $rowItem['department']) {
                    $superID = $w['superID'];
                }
                if (!isset($supers[$w['superID']])) {
                    $supers[$w['superID']] = array();
                }
                $supers[$w['superID']][] = $w['dept_no'];
                if ($w['subdept_no'] == '') {
                    continue;
                }
                if (!isset($subs[$w['dept_ID']])) {
                    $subs[$w['dept_ID']] = '';
                }
                $subs[$w['dept_ID']] .= sprintf('<option %s value="%d">%d %s</option>', $w['subdept_no'] == $rowItem['subdept'] ? 'selected' : '', $w['subdept_no'], $w['subdept_no'], $w['subdept_name']);
            }
            $ret .= '<tr>
                <th class="text-right">Dept</th>
                <td colspan="7" class="form-inline">
                <select id="super-dept{{store_id}}" name="super[]"
                    class="form-control chosen-select syncable-input" 
                    onchange="chainSuperDepartment(\'../ws/\', this.value, {dept_start:\'#department{{store_id}}\', callback:function(){$(\'#department{{store_id}}\').trigger(\'chosen:updated\');baseItemChainSubs({{store_id}});}});">';
            $names = new SuperDeptNamesModel($dbc);
            if (is_array($range_limit) && count($range_limit) == 2) {
                $names->superID($range_limit[0], '>=');
                $names->superID($range_limit[1], '<=');
            }
            foreach ($names->find('superID') as $obj) {
                $ret .= sprintf('<option %s value="%d">%s</option>', $obj->superID() == $superID ? 'selected' : '', $obj->superID(), $obj->super_name());
            }
            $ret .= '</select>
                <select name="department[]" id="department{{store_id}}" 
                    class="form-control chosen-select syncable-input" 
                    onchange="baseItemChainSubs({{store_id}});">';
            foreach ($depts as $id => $name) {
                if (is_numeric($superID) && is_array($supers[$superID])) {
                    if (!in_array($id, $supers[$superID]) && $id != $rowItem['department']) {
                        continue;
                    }
                }
                $ret .= sprintf('<option %s value="%d">%d %s</option>', $id == $rowItem['department'] ? 'selected' : '', $id, $id, $name);
            }
            $ret .= '</select>';
            $jsVendorID = $rowItem['default_vendor_id'] > 0 ? $rowItem['default_vendor_id'] : 'no-vendor';
            $ret .= '<select name="subdept[]" id="subdept{{store_id}}" 
                class="form-control chosen-select syncable-input">';
            $ret .= isset($subs[$rowItem['department']]) ? $subs[$rowItem['department']] : '<option value="0">None</option>';
            $ret .= '</select>';
            $ret .= '</td>
                <th class="small text-right">SKU</th>
                <td colspan="2">
                    <input type="text" name="vendorSKU" class="form-control input-sm"
                        value="' . $rowItem['sku'] . '" 
                        onchange="$(\'#vsku' . $jsVendorID . '\').val(this.value);" 
                        ' . ($jsVendorID == 'no-vendor' || !$active_tab ? 'disabled' : '') . '
                        id="product-sku-field" />
                </td>
                </tr>';
            $taxQ = $dbc->prepare_statement('SELECT id,description FROM taxrates ORDER BY id');
            $taxR = $dbc->exec_statement($taxQ);
            $rates = array();
            while ($taxW = $dbc->fetch_row($taxR)) {
                array_push($rates, array($taxW[0], $taxW[1]));
            }
            array_push($rates, array("0", "NoTax"));
            $ret .= '<tr>
                <th class="small text-right">Tax</th>
                <td>
                <select name="tax[]" id="tax{{store_id}}" 
                    class="form-control input-sm syncable-input">';
            foreach ($rates as $r) {
                $ret .= sprintf('<option %s value="%d">%s</option>', isset($rowItem['tax']) && $rowItem['tax'] == $r[0] ? 'selected' : '', $r[0], $r[1]);
            }
            $ret .= '</select></td>';
            $ret .= '<td colspan="4" class="small">
                <label>FS
                <input type="checkbox" value="{{store_id}}" name="FS[]" id="FS{{store_id}}"
                    class="syncable-checkbox"
                    ' . ($rowItem['foodstamp'] == 1 ? 'checked' : '') . ' />
                </label>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <label>Scale
                <input type="checkbox" value="{{store_id}}" name="Scale[]" 
                    class="scale-checkbox syncable-checkbox"
                    ' . ($rowItem['scale'] == 1 ? 'checked' : '') . ' />
                </label>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <label>QtyFrc
                <input type="checkbox" value="{{store_id}}" name="QtyFrc[]" 
                    class="qty-checkbox syncable-checkbox"
                    ' . ($rowItem['qttyEnforced'] == 1 ? 'checked' : '') . ' />
                </label>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <label>WIC
                <input type="checkbox" value="{{store_id}}" name="prod-wicable[]" 
                    class="prod-wicable-checkbox syncable-checkbox"
                    ' . ($rowItem['wicable'] == 1 ? 'checked' : '') . '  />
                </label>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <label>InUse
                <input type="checkbox" value="{{store_id}}" name="prod-in-use[]" 
                    class="in-use-checkbox syncable-checkbox"
                    ' . ($rowItem['inUse'] == 1 ? 'checked' : '') . ' 
                    onchange="$(\'#extra-in-use-checkbox\').prop(\'checked\', $(this).prop(\'checked\'));" />
                </label>
                </td>
                <th class="small text-right">Discount</th>
                <td class="col-sm-1">
                <select id="discount-select{{store_id}}" name="discount[]" 
                    class="form-control input-sm syncable-input">';
            $disc_opts = array(0 => 'No', 1 => 'Yes', 2 => 'Trans Only', 3 => 'Line Only');
            if ($rowItem['discount'] == 1 && $rowItem['line_item_discountable'] == 1) {
                $rowItem['discount'] = 1;
            } elseif ($rowItem['discount'] == 1 && $rowItem['line_item_discountable'] == 0) {
                $rowItem['discount'] = 2;
            } elseif ($rowItem['discount'] == 0 && $rowItem['line_item_discountable'] == 1) {
                $rowItem['discount'] = 3;
            }
            foreach ($disc_opts as $id => $val) {
                $ret .= sprintf('<option %s value="%d">%s</option>', $id == $rowItem['discount'] ? 'selected' : '', $id, $val);
            }
            $ret .= '</select></td>
                <th class="small text-right">Deposit</th>
                <td colspan="2">
                    <input type="text" name="deposit-upc[]" class="form-control input-sm syncable-input"
                        value="' . ($rowItem['deposit'] != 0 ? $rowItem['deposit'] : '') . '" 
                        placeholder="Deposit Item PLU/UPC"
                        onchange="$(\'#deposit\').val(this.value);" />
                </td>
                </tr>';
            $ret .= '
                <tr>
                    <th class="small text-right">Case Size</th>
                    <td class="col-sm-1">
                        <input type="text" name="caseSize" class="form-control input-sm"
                            id="product-case-size"
                            value="' . $rowItem['caseSize'] . '" 
                            onchange="$(\'#vunits' . $jsVendorID . '\').val(this.value);" 
                            ' . ($jsVendorID == 'no-vendor' || !$active_tab ? 'disabled' : '') . ' />
                    </td>
                    <th class="small text-right">Pack Size</th>
                    <td class="col-sm-1">
                        <input type="text" name="size[]" 
                            class="form-control input-sm product-pack-size syncable-input"
                            value="' . $rowItem['size'] . '" 
                            onchange="$(\'#vsize' . $jsVendorID . '\').val(this.value);" />
                    </td>
                    <th class="small text-right">Unit of measure</th>
                    <td class="col-sm-1">
                        <input type="text" name="unitm[]" 
                            class="form-control input-sm unit-of-measure syncable-input"
                            value="' . $rowItem['unitofmeasure'] . '" />
                    </td>
                    <th class="small text-right">Age Req</th>
                    <td class="col-sm-1">
                        <select name="id-enforced[]" class="form-control input-sm id-enforced syncable-input"
                            onchange="$(\'#idReq\').val(this.value);">';
            $ages = array('n/a' => 0, 18 => 18, 21 => 21);
            foreach ($ages as $label => $age) {
                $ret .= sprintf('<option %s value="%d">%s</option>', $age == $rowItem['idEnforced'] ? 'selected' : '', $age, $label);
            }
            $ret .= '</select>
                </td>
                <th class="small text-right">Local</th>
                <td>
                    <select name="prod-local[]" class="form-control input-sm prod-local syncable-input"
                        onchange="$(\'#local-origin-id\').val(this.value);">';
            $local_opts = array(0 => 'No');
            $origin = new OriginsModel($dbc);
            $local_opts = array_merge($local_opts, $origin->getLocalOrigins());
            if (count($local_opts) == 1) {
                $local_opts[1] = 'Yes';
                // generic local if no origins defined
            }
            foreach ($local_opts as $id => $val) {
                $ret .= sprintf('<option value="%d" %s>%s</option>', $id, $id == $rowItem['local'] ? 'selected' : '', $val);
            }
            $ret .= '</select>
                    </td>
                    </tr>
                </div>';
            $ret .= '</table>';
            $ret .= '</div>';
            $ret = str_replace('{{store_id}}', $store_id, $ret);
            $active_tab = false;
            if (FannieConfig::config('STORE_MODE') != 'HQ') {
                break;
            }
        }
        $ret .= '</div>';
        // sync button will copy current tab values to all other store tabs
        if (!$new_item && FannieConfig::config('STORE_MODE') == 'HQ') {
            $nav_tabs .= '<li><label title="Apply update to all stores">
                <input type="checkbox" id="store-sync" checked /> Sync</label></li>';
        }
        $nav_tabs .= '</ul>';
        // only show the store tabs in HQ mode
        if (FannieConfig::config('STORE_MODE') == 'HQ') {
            $ret = str_replace('{{nav_tabs}}', $nav_tabs, $ret);
        } else {
            $ret = str_replace('{{nav_tabs}}', '', $ret);
        }
        $ret .= <<<HTML
<div id="newVendorDialog" title="Create new Vendor" class="collapse">
    <fieldset>
        <label for="newVendorName">Vendor Name</label>
        <input type="text" name="newVendorName" id="newVendorName" class="form-control" />
    </fieldset>
</div>
HTML;
        $ret .= '</div>';
        // end panel-body
        $ret .= '</div>';
        // end panel
        return $ret;
    }