Ejemplo n.º 1
3
 function export_order($id)
 {
     global $FANNIE_OP_DB, $FANNIE_ROOT;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $order = new PurchaseOrderModel($dbc);
     $order->orderID($id);
     $order->load();
     $items = new PurchaseOrderItemsModel($dbc);
     $items->orderID($id);
     $vendor = new VendorsModel($dbc);
     $vendor->vendorID($order->vendorID());
     $vendor->load();
     $contact = new VendorContactModel($dbc);
     $contact->vendorID($order->vendorID());
     $contact->load();
     if (!class_exists('FPDF')) {
         include_once $FANNIE_ROOT . 'src/fpdf/fpdf.php';
     }
     $pdf = new FPDF('P', 'mm', 'Letter');
     $pdf->AddPage();
     $pdf->SetFont('Arial', '', '12');
     $pdf->Cell(100, 5, 'Vendor: ' . $vendor->vendorName(), 0, 0);
     $pdf->Cell(100, 5, 'Date: ' . date('Y-m-d'), 0, 0);
     $pdf->Ln();
     $pdf->Cell(100, 5, 'Phone: ' . $contact->phone(), 0, 0);
     $pdf->Cell(100, 5, 'Fax: ' . $contact->fax(), 0, 0);
     $pdf->Ln();
     $pdf->Cell(100, 5, 'Email: ' . $contact->email(), 0, 0);
     $pdf->Cell(100, 5, 'Website: ' . $contact->website(), 0, 0);
     $pdf->Ln();
     $pdf->MultiCell(0, 5, "Ordering Info:\n" . $contact->notes(), 'B');
     $pdf->Ln();
     $cur_page = 0;
     $pdf->SetFontSize(10);
     foreach ($items->find() as $obj) {
         if ($cur_page != $pdf->PageNo()) {
             $cur_page = $pdf->PageNo();
             $pdf->Cell(25, 5, 'SKU', 0, 0);
             $pdf->Cell(20, 5, 'Order Qty', 0, 0);
             $pdf->Cell(30, 5, 'Brand', 0, 0);
             $pdf->Cell(65, 5, 'Description', 0, 0);
             $pdf->Cell(20, 5, 'Case Size', 0, 0);
             $pdf->Cell(20, 5, 'Est. Cost', 0, 0);
             $pdf->Ln();
         }
         $pdf->Cell(25, 5, $obj->sku(), 0, 0);
         $pdf->Cell(20, 5, $obj->quantity(), 0, 0, 'C');
         $pdf->Cell(30, 5, $obj->brand(), 0, 0);
         $pdf->Cell(65, 5, $obj->description(), 0, 0);
         $pdf->Cell(20, 5, $obj->caseSize(), 0, 0, 'C');
         $pdf->Cell(20, 5, sprintf('%.2f', $obj->caseSize() * $obj->unitCost() * $obj->quantity()), 0, 0);
         $pdf->Ln();
     }
     $pdf->Output('order_export.pdf', 'D');
 }
Ejemplo n.º 2
0
 function export_order($id)
 {
     global $FANNIE_OP_DB;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $order = new PurchaseOrderModel($dbc);
     $order->orderID($id);
     $order->load();
     $items = new PurchaseOrderItemsModel($dbc);
     $items->orderID($id);
     $vendor = new VendorsModel($dbc);
     $vendor->vendorID($order->vendorID());
     $vendor->load();
     echo 'Vendor,"' . $vendor->vendorName() . '",Order Date,' . date('Y-m-d') . "\r\n";
     echo "\r\n";
     echo "SKU,\"Order Qty\",Brand,Description,\"Case Size\",\"Est. Cost\"\r\n";
     foreach ($items->find() as $obj) {
         echo $obj->sku() . ',';
         echo $obj->quantity() . ',';
         echo '"' . $obj->brand() . '",';
         echo '"' . $obj->description() . '",';
         echo '"' . $obj->caseSize() . '",';
         printf('%.2f', $obj->unitCost() * $obj->caseSize() * $obj->quantity());
         echo "\r\n";
     }
 }
Ejemplo n.º 3
0
 function list_content()
 {
     global $FANNIE_OP_DB, $FANNIE_URL;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $supertype = FormLib::get_form_value('supertype', 'dept');
     $manufacturer = FormLib::get_form_value('manufacturer', '');
     $mtype = FormLib::get_form_value('mtype', 'prefix');
     $deptStart = FormLib::get_form_value('deptStart', 0);
     $deptEnd = FormLib::get_form_value('deptEnd', 0);
     $deptMulti = FormLib::get('departments', array());
     $subDepts = FormLib::get('subdepts', array());
     $super = FormLib::get_form_value('deptSub');
     $vendorID = FormLib::get('vendor');
     $upc_list = FormLib::get('u', array());
     $inUse = FormLib::get('inUse', 1);
     $store = FormLib::get('store', 0);
     $sort = FormLib::get_form_value('sort', 'Department');
     $order = 'dept_name';
     if ($sort === 'UPC') {
         $order = 'i.upc';
     } elseif ($sort === 'Description') {
         $order = 'i.description, i.upc';
     }
     $ret = 'Report sorted by ' . $sort . '<br />';
     if ($supertype == 'dept' && $super === '') {
         $ret .= 'Department ' . $deptStart . ' to ' . $deptEnd . '<br />';
     } else {
         if ($supertype == 'dept') {
             $ret .= 'Sub department ' . $super . '<br />';
         } else {
             if ($supertype == 'manu') {
                 $ret .= _('Brand') . ' ' . $manufacturer . '<br />';
             } else {
                 if ($supertype == 'vendor') {
                     $vendor = new VendorsModel($dbc);
                     $vendor->vendorID($vendorID);
                     $vendor->load();
                     $ret .= 'Vendor ' . $vendor->vendorName() . '<br />';
                 }
             }
         }
     }
     $ret .= date("F j, Y, g:i a") . '<br />';
     $page_url = sprintf('ProductListPage.php?supertype=%s&deptStart=%s&deptEnd=%s&deptSub=%s&manufacturer=%s&mtype=%s&vendor=%d', $supertype, $deptStart, $deptEnd, $super, $manufacturer, $mtype, $vendorID);
     if (!$this->excel) {
         $ret .= '<form action="' . filter_input(INPUT_SERVER, 'PHP_SELF') . '" method="post" id="excel-form">
             <input type="hidden" name="supertype" value="' . $supertype . '" />
             <input type="hidden" name="deptStart" value="' . $deptStart . '" />
             <input type="hidden" name="deptEnd" value="' . $deptEnd . '" />
             <input type="hidden" name="deptSub" value="' . $super . '" />
             <input type="hidden" name="manufacturer" value="' . $manufacturer . '" />
             <input type="hidden" name="mtype" value="' . $mtype . '" />
             <input type="hidden" name="vendor" value="' . $vendorID . '" />
             <input type="hidden" name="inUse" value="' . $inUse . '" />
             <input type="hidden" name="excel" value="yes" />';
         if (is_array($subDepts)) {
             foreach ($subDepts as $s) {
                 $ret .= '<input type="hidden" name="subdepts[]" value="' . $s . '" />';
             }
         }
         if (is_array($upc_list)) {
             foreach ($upc_list as $u) {
                 $ret .= '<input type="hidden" name="u[]" value="' . $u . '" />';
             }
         }
         $ret .= '</form>';
         $ret .= sprintf('<a href="" onclick="$(\'#excel-form\').submit();return false;">Save to Excel</a> 
             &nbsp; &nbsp; <a href="%s">Back</a><br />', basename(__FILE__));
     }
     /** base select clause and joins **/
     $query = "\n            SELECT i.upc,\n                i.description,\n                i.brand,\n                d.dept_name as department,\n                i.normal_price,\n                (CASE WHEN i.tax = 1 THEN 'X' WHEN i.tax=0 THEN '-' ELSE LEFT(t.description,1) END) as Tax,              \n                (CASE WHEN i.foodstamp = 1 THEN 'X' ELSE '-' END) as FS,\n                (CASE WHEN i.discount = 0 THEN '-' ELSE 'X'END) as DISC,\n                (CASE WHEN i.scale = 1 THEN 'X' ELSE '-' END) as WGHd,\n                (CASE WHEN i.local > 0 AND o.originID IS NULL THEN 'X' \n                  WHEN i.local > 0 AND o.originID IS NOT NULL THEN LEFT(o.shortName,1) ELSE '-' END) as local,\n                COALESCE(v.vendorName, x.distributor) AS distributor,\n                i.cost,\n                i.store_id,\n                l.description AS storeName\n            FROM products as i \n                LEFT JOIN departments as d ON i.department = d.dept_no\n                LEFT JOIN taxrates AS t ON t.id = i.tax\n                LEFT JOIN prodExtra as x on i.upc = x.upc\n                LEFT JOIN vendors AS v ON i.default_vendor_id=v.vendorID\n                LEFT JOIN Stores AS l ON i.store_id=l.storeID\n                LEFT JOIN origins AS o ON i.local=o.originID";
     /** add extra joins if this lookup requires them **/
     if ($supertype == 'dept' && $super !== '') {
         if ($super >= 0) {
             $query .= ' LEFT JOIN superdepts AS s ON i.department=s.dept_ID ';
         } elseif ($super == -2) {
             $query .= ' LEFT JOIN MasterSuperDepts AS s ON i.department=s.dept_ID ';
         }
     } elseif ($supertype == 'vendor') {
         $query .= ' LEFT JOIN vendors AS z ON z.vendorName=x.distributor ';
     }
     /** build where clause and parameters based on
         the lookup type **/
     $query .= ' WHERE 1=1 ';
     $args = array();
     if ($supertype == 'dept' && $super !== '') {
         if ($super >= 0) {
             $query .= ' AND s.superID=? ';
             $args = array($super);
         } elseif ($super == -2) {
             $query .= ' AND s.superID <> 0 ';
         }
         if ($deptStart != 0 && $deptEnd != 0) {
             $query .= ' AND i.department BETWEEN ? AND ? ';
             $args[] = $deptStart;
             $args[] = $deptEnd;
         } elseif (count($deptMulti) > 0) {
             $query .= ' AND i.department IN (';
             foreach ($deptMulti as $d) {
                 $query .= '?,';
                 $args[] = $d;
             }
             $query = substr($query, 0, strlen($query) - 1) . ')';
         }
         if (is_array($subDepts) && count($subDepts) > 0) {
             $query .= ' AND i.subdept IN (';
             foreach ($subDepts as $s) {
                 $query .= '?,';
                 $args[] = $s;
             }
             $query = substr($query, 0, strlen($query) - 1) . ')';
         }
     } elseif ($supertype == 'manu' && $mtype == 'prefix') {
         $query .= ' AND i.upc LIKE ? ';
         $args = array('%' . $manufacturer . '%');
     } elseif ($supertype == 'manu' && $mtype != 'prefix') {
         $query .= ' AND (i.brand LIKE ? OR x.manufacturer LIKE ?) ';
         $args = array('%' . $manufacturer . '%', '%' . $manufacturer . '%');
     } elseif ($supertype == 'vendor') {
         $query .= ' AND (i.default_vendor_id=? OR z.vendorID=?) ';
         $args = array($vendorID, $vendorID);
     } elseif ($supertype == 'upc') {
         $inp = '';
         foreach ($upc_list as $u) {
             $inp .= '?,';
             $args[] = $u;
         }
         $inp = substr($inp, 0, strlen($inp) - 1);
         $query .= ' AND i.upc IN (' . $inp . ') ';
     } else {
         $query .= ' AND i.department BETWEEN ? AND ? ';
         $args = array($deptStart, $deptEnd);
         if (is_array($subDepts) && count($subDepts) > 0) {
             $query .= ' AND i.subdept IN (';
             foreach ($subDepts as $s) {
                 $query .= '?,';
                 $args[] = $s;
             }
         }
     }
     if ($inUse == 1) {
         $query .= ' AND i.inUse=1 ';
     } else {
         $query .= ' AND i.inUse=0 ';
     }
     if ($store > 0) {
         $query .= ' AND i.store_id=? ';
         $args[] = $store;
     }
     /** finish building query w/ order clause **/
     $query .= 'ORDER BY ' . $order;
     if ($order != "i.upc") {
         $query .= ",i.upc";
     }
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($prep, $args);
     if ($result === false || $dbc->num_rows($result) == 0) {
         return 'No data found!';
     }
     $ret .= '<table class="table table-striped table-bordered tablesorter small">
         <thead>
         <tr>';
     $ret .= "<th>UPC</th><th>Brand</th><th>Description</th><th>Dept</th><th>" . _('Vendor') . "</th><th>Cost</th><th>Price</th>";
     $ret .= "<th>Tax</th><th>FS</th><th>Disc</th><th>Wg'd</th><th>Local</th>";
     if (!$this->excel && $this->canEditItems !== false) {
         $ret .= '<th>&nbsp;</th>';
     }
     $ret .= "</tr></thead><tbody>";
     $multi = $this->config->get('STORE_MODE') == 'HQ' ? true : false;
     while ($row = $dbc->fetch_row($result)) {
         $ret .= '<tr id="' . $row[0] . '">';
         $enc = base64_encode($row[1]);
         if (!$this->excel) {
             $ret .= "<td align=center class=\"td_upc\"><a href=ItemEditorPage.php?searchupc={$row['0']}>{$row['0']}</a>";
             if ($multi) {
                 $ret .= ' (' . substr($row['storeName'], 0, 1) . ')';
             }
             if ($this->canDeleteItems !== false) {
                 $ret .= " <a href=\"\" onclick=\"deleteCheck('{$row['0']}','{$enc}'); return false;\">";
                 $ret .= \COREPOS\Fannie\API\lib\FannieUI::deleteIcon() . '</a>';
             }
             $ret .= '</td>';
             $ret .= '<input type="hidden" class="hidden_upc" value="' . $row[0] . '" />';
             $ret .= '<input type="hidden" class="hidden_store_id" value="' . $row['store_id'] . '" />';
         } else {
             $ret .= "<td align=center>{$row['0']}</td>";
         }
         $ret .= "<td align=center class=\"td_brand clickable\">{$row['brand']}</td>";
         $ret .= "<td align=center class=\"td_desc clickable\">{$row['description']}</td>";
         $ret .= "<td align=center class=\"td_dept clickable\">{$row['department']}</td>";
         $ret .= "<td align=center class=\"td_supplier clickable\">{$row['distributor']}</td>";
         $ret .= "<td align=center class=\"td_cost clickable\">" . sprintf('%.2f', $row['cost']) . "</td>";
         $ret .= "<td align=center class=\"td_price clickable\">{$row['normal_price']}</td>";
         $ret .= "<td align=center class=td_tax>{$row['Tax']}</td>";
         $ret .= "<td align=center class=td_fs>{$row['FS']}</td>";
         $ret .= "<td align=center class=td_disc>{$row['DISC']}</td>";
         $ret .= "<td align=center class=td_wgt>{$row['WGHd']}</td>";
         $ret .= "<td align=center class=td_local>{$row['local']}</td>";
         if (!$this->excel && $this->canEditItems !== False) {
             $ret .= "<td align=center class=td_cmd><a href=\"\" \n                    class=\"edit-link\"\n                    onclick=\"edit(\$(this).closest('tr')); return false;\">" . \COREPOS\Fannie\API\lib\FannieUI::editIcon() . '</a>
                 <a href="" class="save-link collapse"
                 onclick="save($(this).closest(\'tr\')); return false;">' . \COREPOS\Fannie\API\lib\FannieUI::saveIcon() . '</a></td>';
         }
         $ret .= "</tr>\n";
     }
     $ret .= '</tbody></table>';
     if ($this->excel) {
         header('Content-Type: application/ms-excel');
         header('Content-Disposition: attachment; filename="itemList.csv"');
         $array = \COREPOS\Fannie\API\data\DataConvert::htmlToArray($ret);
         $ret = \COREPOS\Fannie\API\data\DataConvert::arrayToCsv($array);
     } else {
         $this->add_script('../src/javascript/tablesorter/jquery.tablesorter.min.js');
         $this->add_onload_command("\$('.tablesorter').tablesorter();\n");
     }
     return $ret;
 }
Ejemplo n.º 4
0
 private function getVendorInfo($id)
 {
     global $FANNIE_OP_DB, $FANNIE_ROOT;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $ret = "";
     $nameQ = $dbc->prepare_statement("SELECT vendorName FROM vendors WHERE vendorID=?");
     $nameR = $dbc->exec_statement($nameQ, array($id));
     $model = new VendorsModel($dbc);
     $model->vendorID($id);
     $model->load();
     $ret .= '<div>';
     $ret .= "<b>Id</b>: {$id} &nbsp; <b>Name</b>: " . $model->vendorName();
     $ret .= '</div>';
     $itemQ = $dbc->prepare_statement("SELECT COUNT(*) FROM vendorItems WHERE vendorID=?");
     $itemR = $dbc->exec_statement($itemQ, array($id));
     $num = 0;
     if ($itemR && ($row = $dbc->fetch_row($itemR))) {
         $num = $row[0];
     }
     $ret .= '
         <div class="row">
             <div class="container-fluid col-sm-3">';
     $ret .= '
         <div class="panel panel-default">
             <div class="panel-heading">Catalog</div>
             <div class="panel-body">
             This vendor contains ' . $num . ' items<br />';
     if ($num > 0) {
         $ret .= "<a href=\"BrowseVendorItems.php?vid={$id}\">Browse vendor catalog</a>";
         if ($num <= 750) {
             $ret .= "<br />";
             $ret .= "<a href=\"EditVendorItems.php?id={$id}\">Edit vendor catalog</a>";
         }
     }
     $ret .= "<br />";
     $ret .= "<a href=\"DefaultUploadPage.php?vid={$id}\">Upload new vendor catalog</a>";
     $ret .= "<br />";
     $ret .= "<a href=\"VendorIndexPage.php?vid={$id}&autoAdd=1\">Add existing items to catalog</a>";
     $ret .= '</div></div>';
     $ret .= '</div><div class="container-fluid col-sm-3">';
     $ret .= '
         <div class="panel panel-default">
             <div class="panel-heading">Mappings</div>
             <div class="panel-body">';
     $ret .= "<a href=\"UploadPluMapPage.php?vid={$id}\">Upload PLU/SKU mapping</a>";
     $ret .= "<br />";
     $ret .= "<a href=\"SkuMapPage.php?id={$id}\">View or Edit PLU/SKU mapping</a>";
     $ret .= "<br />";
     $ret .= "<a href=\"UnitBreakdownPage.php?id={$id}\">View or Edit Breakdown mapping</a>";
     $ret .= '</div></div>';
     $ret .= '</div><div class="container-fluid col-sm-3">';
     $ret .= '
         <div class="panel panel-default">
             <div class="panel-heading">Margin</div>
             <div class="panel-body">';
     $itemQ = $dbc->prepare("SELECT COUNT(*) FROM vendorDepartments WHERE vendorID=?");
     $itemR = $dbc->execute($itemQ, array($id));
     $num = 0;
     if ($itemR && ($row = $dbc->fetch_row($itemR))) {
         $num = $row[0];
     }
     $ret .= '<p>';
     $ret .= "<a href=\"../../batches/UNFI/\">Vendor Price Batch Tools</a>";
     $ret .= "</p><p>";
     if ($num == 0) {
         $ret .= "<a href=\"VendorDepartmentEditor.php?vid={$id}\">This vendor's items are not yet arranged into subcategories</a>";
         $ret .= '<p />';
         $ret .= "<a href=\"VendorDepartmentUploadPage.php?vid={$id}\">Upload Subcategory List</a>";
     } else {
         $ret .= "This vendor's items are divided into ";
         $ret .= $num . " subcategories";
         $ret .= "<br />";
         $ret .= "<a href=\"VendorDepartmentEditor.php?vid={$id}\">View or Edit vendor-specific margin(s)</a>";
         $ret .= "<br />";
         $ret .= "<a href=\"VendorMarginsPage.php?id={$id}\">And Even More Margins</a>";
         $ret .= '<p />';
         $ret .= "<a href=\"VendorDepartmentUploadPage.php?vid={$id}\">Upload Subcategory List</a>";
     }
     $ret .= '</p>';
     $ret .= '
         <div class="form-group">
             <div class="input-group">
                 <span class="input-group-addon">Shipping</span>
                 <input type="text" id="vc-shipping" name="shipping" 
                     onchange="saveShipping(this.value);"
                     title="Markup percentage to account for shipping fees"
                     class="form-control" value="' . $model->shippingMarkup() * 100 . '" />
                 <span class="input-group-addon">%</span>
             </div>
         </div>
         <div class="form-group">
             <div class="input-group">
                 <span class="input-group-addon">Discount Rate</span>
                 <input type="text" id="vc-discount" name="discount-rate" 
                     title="Markdown percentage from catalog list costs"
                     onchange="saveDiscountRate(this.value);"
                     class="form-control" value="' . $model->discountRate() * 100 . '" />
                 <span class="input-group-addon">%</span>
             </div>
         </div>';
     $ret .= '</div></div>';
     $ret .= '</div></div>';
     $ret .= '
         <div class="panel panel-default">
             <div class="panel-heading">Contact Info</div>
             <div class="panel-body">
                 <div class="form-alerts"></div>';
     $ret .= '<form role="form" class="form-horizontal" onsubmit="saveVC(' . $id . '); return false;" id="vcForm">';
     $ret .= '<div class="form-group">
         <label for="vcPhone" class="control-label col-sm-1">Phone</label>
         <div class="col-sm-10">
         <input type="tel" class="form-control" id="vcPhone" name="phone" value="' . $model->phone() . '" />
         </div>
         </div>';
     $ret .= '<div class="form-group">
         <label for="vcFax" class="control-label col-sm-1">Fax</label>
         <div class="col-sm-10">
         <input type="text" id="vcFax" class="form-control" name="fax" value="' . $model->fax() . '" />
         </div>
         </div>';
     $ret .= '<div class="form-group">
         <label for="vcEmail" class="control-label col-sm-1">Email</label>
         <div class="col-sm-10">
         <input type="text" class="form-control" id="vcEmail" name="email" value="' . $model->email() . '" />
         </div>
         </div>';
     $ret .= '<div class="form-group">
         <label for="vcWebsite" class="control-label col-sm-1">Website</label>
         <div class="col-sm-10">
         <input type="text" class="form-control" id="vcWebsite" name="website" value="' . $model->website() . '" />
         </div>
         </div>';
     $ret .= '<div class="form-group">
         <label for="vc-local-id" class="control-label col-sm-1">Local</label>
         <div class="col-sm-10">
             <select class="form-control" name="local-origin-id">
             <option value="0">No</option>';
     $origins = new OriginsModel($dbc);
     $origins->local(1);
     foreach ($origins->find('shortName') as $origin) {
         $ret .= sprintf('<option %s value="%d">%s</option>', $origin->originID() == $model->localOriginID() ? 'selected' : '', $origin->originID(), $origin->shortName());
     }
     $ret .= '</select>
             </div>
         </div>';
     $ret .= '<div class="form-group">
         <label for="vcNotes" class="control-label col-sm-1">Ordering Notes</label>
         <div class="col-sm-10">
         <textarea class="form-control" rows="5" name="notes" id="vcNotes">' . $model->notes() . '</textarea>
         </div>
         </div>';
     $ret .= '<button type="submit" class="btn btn-default">Save Vendor Contact Info</button>';
     $ret .= '</form>';
     $ret .= '</div></div>';
     $delivery = new VendorDeliveriesModel($dbc);
     $delivery->vendorID($id);
     $delivery->load();
     $ret .= '<p class="form-inline form-group"><label class="control-label" for="deliverySelect">Delivery Schedule</label>: ';
     $ret .= '<select class="delivery form-control" name="frequency" id="deliverySelect"><option>Weekly</option></select>';
     $ret .= ' <label for="regular" class="control-label">Regular</label>: <input type="checkbox" class="delivery"
                 name="regular" id="regular" ' . ($delivery->regular() ? 'checked' : '') . ' />';
     $dt = mktime(0, 0, 0, 6, 15, 2014);
     // date doesn't matter; just need a sunday
     $labels = '';
     $checks = '';
     for ($i = 0; $i < 7; $i++) {
         $func = strtolower(date('l', $dt));
         $labels .= '<th><label for="' . $func . '">' . date('D', $dt) . '</label></th>';
         $checks .= '<td><input type="checkbox" id="' . $func . '" name="' . $func . '"
                     ' . ($delivery->{$func}() ? 'checked' : '') . ' class="delivery" /></td>';
         $dt = mktime(0, 0, 0, date('n', $dt), date('j', $dt) + 1, date('Y', $dt));
     }
     $ret .= '<table class="table"><tr>' . $labels . '</tr><tr>' . $checks . '</tr></table>';
     $ret .= 'Next 2 deliveries: ' . '<span id="nextDelivery">' . date('D, M jS', strtotime($delivery->nextDelivery())) . '</span>' . ' and ' . '<span id="nextNextDelivery">' . date('D, M jS', strtotime($delivery->nextNextDelivery())) . '</span>';
     $ret .= '</p>';
     echo $ret;
 }
Ejemplo n.º 5
0
function addUPC($orderID, $memNum, $upc, $num_cases = 1)
{
    global $FANNIE_OP_DB, $TRANS;
    $dbc = FannieDB::get($FANNIE_OP_DB);
    $sku = str_pad($upc, 6, '0', STR_PAD_LEFT);
    if (is_numeric($upc)) {
        $upc = BarcodeLib::padUPC($upc);
    }
    $manualSKU = false;
    if (isset($upc[0]) && $upc[0] == "+") {
        $sku = substr($upc, 1);
        $upc = "zimbabwe";
        // string that will not match
        $manualSKU = true;
    }
    $ins_array = genericRow($orderID);
    $ins_array['upc'] = "{$upc}";
    if ($manualSKU) {
        $ins_array['upc'] = BarcodeLib::padUPC($sku);
    }
    $ins_array['card_no'] = "{$memNum}";
    $ins_array['trans_type'] = "I";
    $caseSize = 1;
    $vendor = "";
    $vendor_desc = !is_numeric($upc) ? $upc : "";
    $srp = 0.0;
    $vendor_upc = !is_numeric($upc) ? '0000000000000' : "";
    $skuMatch = 0;
    $caseP = $dbc->prepare_statement("\n        SELECT units,\n            vendorName,\n            description,\n            i.srp,\n            i.upc,\n            CASE WHEN i.upc=? THEN 0 ELSE 1 END as skuMatch \n        FROM vendorItems as i\n            LEFT JOIN vendors AS v ON i.vendorID=v.vendorID \n        WHERE i.upc=? \n            OR i.sku=? \n            OR i.sku=?\n        ORDER BY i.vendorID");
    $caseR = $dbc->exec_statement($caseP, array($upc, $upc, $sku, '0' . $sku));
    if ($dbc->num_rows($caseR) > 0) {
        $row = $dbc->fetch_row($caseR);
        $caseSize = $row['units'];
        $vendor = $row['vendorName'];
        $vendor_desc = $row['description'];
        $srp = $row['srp'];
        $vendor_upc = $row['upc'];
        $skuMatch = $row['skuMatch'];
    }
    if (!empty($vendor_upc)) {
        $ins_array['upc'] = "{$vendor_upc}";
    }
    if ($skuMatch == 1) {
        $ins_array['upc'] = "{$vendor_upc}";
        $upc = $vendor_upc;
    }
    $ins_array['quantity'] = $caseSize;
    $ins_array['ItemQtty'] = $num_cases;
    $ins_array['mixMatch'] = substr($vendor, 0, 26);
    $ins_array['description'] = substr($vendor_desc, 0, 32) . " SO";
    $mempricing = false;
    if ($memNum != 0 && !empty($memNum)) {
        $p = $dbc->prepare_statement("SELECT Type,memType FROM custdata WHERE CardNo=?");
        $r = $dbc->exec_statement($p, array($memNum));
        $w = $dbc->fetch_row($r);
        if ($w['Type'] == 'PC') {
            $mempricing = true;
        } elseif ($w['memType'] == 9) {
            $mempricing = true;
        }
    }
    $pdP = $dbc->prepare_statement("\n        SELECT normal_price,\n            special_price,\n            department,\n            discounttype,\n            description,\n            discount,\n            default_vendor_id\n        FROM products WHERE upc=?");
    $pdR = $dbc->exec_statement($pdP, array($upc));
    $qtyReq = False;
    if ($dbc->num_rows($pdR) > 0) {
        $pdW = $dbc->fetch_row($pdR);
        $ins_array['department'] = $pdW['department'];
        $ins_array['discountable'] = $pdW['discount'];
        $mapP = $dbc->prepare_statement("SELECT map_to FROM \n                {$TRANS}SpecialOrderDeptMap WHERE dept_ID=?");
        $mapR = $dbc->exec_statement($mapP, array($pdW['department']));
        if ($dbc->num_rows($mapR) > 0) {
            $ins_array['department'] = array_pop($dbc->fetch_row($mapR));
        }
        $superP = $dbc->prepare_statement("SELECT superID \n                FROM superdepts WHERE dept_ID=?");
        $superR = $dbc->exec_statement($superP, array($ins_array['department']));
        while ($superW = $dbc->fetch_row($superR)) {
            if ($superW[0] == 5) {
                $qtyReq = 3;
            }
            if ($qtyReq !== false) {
                $caseSize = $qtyReq;
                $ins_array['quantity'] = $qtyReq;
                break;
            }
        }
        // only calculate prices for items that exist in
        // vendorItems (i.e., have known case size)
        $ins_array['discounttype'] = $pdW['discounttype'];
        if ($dbc->num_rows($caseR) > 0 || true) {
            // test always do this
            $ins_array['total'] = $pdW['normal_price'] * $caseSize * $num_cases;
            $ins_array['regPrice'] = $pdW['normal_price'] * $caseSize * $num_cases;
            $ins_array['unitPrice'] = $pdW['normal_price'];
            if ($pdW['discount'] != 0 && $pdW['discounttype'] == 1) {
                /**
                  Only apply sale pricing from non-closeout batches
                  At WFC closeout happens to be batch type #11
                */
                $closeoutP = $dbc->prepare('
                    SELECT l.upc
                    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
                        AND b.batchType=11
                ');
                $closeoutR = $dbc->execute($closeoutP, array($upc));
                if ($closeoutR && $dbc->num_rows($closeoutR) == 0) {
                    $ins_array['total'] = $pdW['special_price'] * $caseSize * $num_cases;
                    $ins_array['unitPrice'] = $pdW['special_price'];
                }
            } elseif ($mempricing) {
                if ($pdW['discounttype'] == 2) {
                    $ins_array['total'] = $pdW['special_price'] * $caseSize * $num_cases;
                    $ins_array['unitPrice'] = $pdW['special_price'];
                } elseif ($pdW['discounttype'] == 3) {
                    $ins_array['unitPrice'] = $pdW['normal_price'] * (1 - $pdW['special_price']);
                    $ins_array['total'] = $ins_array['unitPrice'] * $caseSize * $num_cases;
                } elseif ($pdW['discounttype'] == 5) {
                    $ins_array['unitPrice'] = $pdW['normal_price'] - $pdW['special_price'];
                    $ins_array['total'] = $ins_array['unitPrice'] * $caseSize * $num_cases;
                }
                if ($pdW['discount'] != 0 && $pdW['normal_price'] * $caseSize * $num_cases * 0.85 < $ins_array['total']) {
                    $ins_array['total'] = $pdW['normal_price'] * $caseSize * $num_cases * 0.85;
                    $ins_array['discounttype'] = 0;
                    $ins_array['unitPrice'] = $pdW['normal_price'];
                }
            }
        }
        $ins_array['description'] = substr($pdW['description'], 0, 32);
        /**
          If product has a default vendor, lookup
          vendor name and add it
        */
        if ($pdW['default_vendor_id'] != 0) {
            $v = new VendorsModel($dbc);
            $v->vendorID($pdW['default_vendor_id']);
            if ($v->load()) {
                $ins_array['mixMatch'] = substr($v->vendorName(), 0, 26);
            }
        }
        /**
          If no vendor name was found, try looking in prodExtra
        */
        if (empty($ins_array['mixMatch']) && $dbc->tableExists('prodExtra')) {
            $distP = $dbc->prepare('
                SELECT x.distributor
                FROM prodExtra AS x
                WHERE x.upc=?
            ');
            $distR = $dbc->execute($distP, array($upc));
            if ($distR && $dbc->num_rows($distR) > 0) {
                $distW = $dbc->fetch_row($distR);
                $ins_array['mixMatch'] = substr($distW['distributor'], 0, 26);
            }
        }
    } elseif ($srp != 0) {
        // use vendor SRP if applicable
        $ins_array['regPrice'] = $srp * $caseSize * $num_cases;
        $ins_array['total'] = $srp * $caseSize * $num_cases;
        $ins_array['unitPrice'] = $srp;
        if ($mempricing) {
            $ins_array['total'] *= 0.85;
        }
    }
    $tidP = $dbc->prepare_statement("SELECT MAX(trans_id),MAX(voided),MAX(numflag) \n            FROM {$TRANS}PendingSpecialOrder WHERE order_id=?");
    $tidR = $dbc->exec_statement($tidP, array($orderID));
    $tidW = $dbc->fetch_row($tidR);
    $ins_array['trans_id'] = $tidW[0] + 1;
    $ins_array['voided'] = $tidW[1];
    $ins_array['numflag'] = $tidW[2];
    $dbc->smart_insert("{$TRANS}PendingSpecialOrder", $ins_array);
    return array($qtyReq, $ins_array['trans_id'], $ins_array['description']);
}
Ejemplo n.º 6
0
 private function vendorDeptDisplay($id)
 {
     global $FANNIE_OP_DB, $FANNIE_URL;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $v = new VendorsModel($dbc);
     $v->vendorID($id);
     $v->load();
     $name = $v->vendorName();
     $ret = "<strong>Subcategories in {$name}</strong><br />";
     $ret .= "<table class=\"table\">";
     $ret .= "<tr><th>No.</th><th>Name</th><th>Margin</th><th>POS Dept#</th>\n            <th>&nbsp;</th><th>&nbsp;</th></tr>";
     $deptQ = $dbc->prepare_statement("\n            SELECT d.vendorID,\n                deptID,\n                name,\n                margin,\n                testing,\n                posDeptID\n            FROM vendorDepartments AS d\n            WHERE d.vendorID=?\n            ORDER BY deptID");
     $deptR = $dbc->exec_statement($deptQ, array($id));
     while ($row = $dbc->fetch_row($deptR)) {
         $ret .= sprintf("<tr id=\"row-%d\">\n                <td>%d</td>\n                <td id=nametd%d>%s</td>\n                <td id=margintd%d>%.2f%%</td>\n                <td id=posdepttd%d>%d</td>\n                <td id=button%d>\n                    <a href=\"\" onclick=\"edit(%d);return false;\"\n                        class=\"edit-link\">%s</a>\n                    <a href=\"\" onclick=\"save(%d);return false;\"\n                        class=\"save-link collapse\">%s</a>\n                </td>\n                <td><a href=\"\" onclick=\"deleteCat(%d,'%s');return false\">%s</a></td>\n                <td><a href=\"../../reports/VendorCategory/VendorCategoryReport.php?id=%d&category=%d\"\n                    title=\"View Items in this Category\">\n                    <span class=\"glyphicon glyphicon-th-list\"></span>\n                    </a></td>\n                </tr>", $row['deptID'], $row['deptID'], $row['deptID'], $row['name'], $row['deptID'], $row['margin'] * 100, $row['deptID'], $row['posDeptID'], $row['deptID'], $row['deptID'], \COREPOS\Fannie\API\lib\FannieUI::editIcon(), $row['deptID'], \COREPOS\Fannie\API\lib\FannieUI::saveIcon(), $row['deptID'], $row['name'], \COREPOS\Fannie\API\lib\FannieUI::deleteIcon(), $id, $row['deptID']);
     }
     $ret .= "</table>";
     $ret .= '<p><a href="VendorIndexPage.php?vid=' . $id . '" class="btn btn-default">Home</a></p>';
     return $ret;
 }
Ejemplo n.º 7
0
 function preview_content()
 {
     global $FANNIE_OP_DB, $FANNIE_URL;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $vendor = new VendorsModel($dbc);
     $vendor->vendorID(FormLib::get('vendorID'));
     $vendor->load();
     $ret = sprintf("<b>Batch Type</b>: %s <input type=hidden value=%d name=vendorID /><br />", $vendor->vendorName(), FormLib::get_form_value('vendorID'));
     $ret .= sprintf("<b>PO/Inv#</b>: %s <input type=hidden value=\"%s\" name=identifier /><br />", FormLib::get_form_value('identifier'), FormLib::get_form_value('identifier'));
     $ret .= sprintf("<b>Order Date</b>: %s <input type=hidden value=\"%s\" name=orderDate /><br />", FormLib::get_form_value('orderDate'), FormLib::get_form_value('orderDate'));
     $ret .= sprintf("<b>Recv'd Date</b>: %s <input type=hidden value=\"%s\" name=recvDate /><br />", FormLib::get_form_value('recvDate'), FormLib::get_form_value('recvDate'));
     return $ret;
 }
Ejemplo n.º 8
0
 public function preprocess()
 {
     global $FANNIE_PLUGIN_SETTINGS, $FANNIE_OP_DB, $FANNIE_URL, $FANNIE_TRANS_DB;
     //$this->add_script($FANNIE_URL.'src/javascript/jquery.js');
     //$this->add_script($FANNIE_URL.'src/javascript/jquery-ui.js');
     if (FormLib::get('upc_in') !== '') {
         $upc = BarcodeLib::padUPC(FormLib::get('upc_in'));
         $this->current_item_data['upc'] = $upc;
         $dbc = FannieDB::get($FANNIE_OP_DB);
         $model = new ProductsModel($dbc);
         $model->upc($upc);
         $vendorID = 0;
         if ($model->load()) {
             $this->current_item_data['desc'] = $model->brand() . ' ' . $model->description();
             $this->current_item_data['par'] = $model->auto_par();
             $vendorID = $model->default_vendor_id();
         }
         $model = new VendorsModel($dbc);
         $model->vendorID($vendorID);
         if ($model->load()) {
             $this->current_item_data['vendor'] = $model->vendorName();
             $schedule = new VendorDeliveriesModel($dbc);
             $schedule->vendorID($vendorID);
             if ($schedule->load() && $schedule->regular() == 1) {
                 $this->current_item_data['nextDelivery'] = date('D, M jS', strtotime($schedule->nextDelivery())) . ' & ' . date('D, M jS', strtotime($schedule->nextNextDelivery()));
                 $nd = new DateTime(date('Y-m-d', strtotime($schedule->nextDelivery())));
                 $nnd = new DateTime(date('Y-m-d', strtotime($schedule->nextNextDelivery())));
                 $this->current_item_data['deliverySpan'] = $nnd->diff($nd)->format('%a');
             }
             $items = new VendorItemsModel($dbc);
             $items->vendorID($vendorID);
             $items->upc($upc);
             $this->current_item_data['cases'] = array();
             foreach ($items->find('units') as $item) {
                 $this->current_item_data['cases'][] = $item->units();
             }
         }
         $saleNow = 'SELECT b.batchName, b.startDate, b.endDate
                     FROM batchList AS l
                         INNER JOIN batches AS b ON b.batchID=l.batchID
                     WHERE l.upc=?
                         AND b.discounttype <> 0
                         AND b.startDate <= ' . $dbc->now() . '
                         AND b.endDate >= ' . $dbc->now();
         $saleNow = $dbc->prepare($saleNow);
         $saleNow = $dbc->execute($saleNow, array($upc));
         if ($dbc->num_rows($saleNow) > 0) {
             $row = $dbc->fetch_row($saleNow);
             $this->current_item_data['onSale'] = $row['batchName'] . ' thru ' . date('D, M jS', strtotime($row['endDate']));
         }
         $saleNext = 'SELECT b.batchName, b.startDate, b.endDate
                     FROM batchList AS l
                         INNER JOIN batches AS b ON b.batchID=l.batchID
                     WHERE l.upc=?
                         AND b.discounttype <> 0
                         AND b.startDate >= ' . $dbc->now() . '
                         AND b.endDate >= ' . $dbc->now();
         $saleNext = $dbc->prepare($saleNext);
         $saleNext = $dbc->execute($saleNext, array($upc));
         if ($dbc->num_rows($saleNext) > 0) {
             $row = $dbc->fetch_row($saleNext);
             $this->current_item_data['soonSale'] = $row['batchName'] . ' on ' . date('D, M jS', strtotime($row['startDate']));
         }
         $ordersQ = 'SELECT v.vendorName,
                         o.placedDate,
                         i.quantity,
                         i.caseSize
                     FROM PurchaseOrderItems AS i
                         INNER JOIN PurchaseOrder AS o ON i.orderID=o.orderID
                         INNER JOIN vendors AS v ON o.vendorID=v.vendorID
                     WHERE i.internalUPC = ?
                     ORDER BY o.placedDate DESC';
         $ordersQ = $dbc->add_select_limit($ordersQ, 10);
         $ordersP = $dbc->prepare($ordersQ);
         $ordersR = $dbc->execute($ordersP, array($upc));
         $orders = array();
         while ($w = $dbc->fetch_row($ordersR)) {
             $orders[] = $w;
         }
         $this->current_item_data['orders'] = $orders;
         $salesQ = 'SELECT ' . DTrans::sumQuantity('d') . ' AS qty,
                     MIN(tdate) as day
                    FROM ' . $FANNIE_TRANS_DB . $dbc->sep() . 'dlog_15 AS d
                    WHERE upc = ?
                    GROUP BY YEAR(tdate), MONTH(tdate), DAY(tdate)
                    ORDER BY YEAR(tdate) DESC, MONTH(tdate) DESC, DAY(tdate) DESC';
         $salesP = $dbc->prepare($salesQ);
         $salesR = $dbc->execute($salesP, array($upc));
         $sales = array();
         while ($w = $dbc->fetch_row($salesR)) {
             $sales[] = $w;
         }
         $this->current_item_data['sales'] = $sales;
     }
     $this->linea_ios_mode = $this->linea_support_available();
     if ($this->linea_ios_mode) {
         $this->add_script($FANNIE_URL . 'src/javascript/linea/cordova-2.2.0.js');
         $this->add_script($FANNIE_URL . 'src/javascript/linea/ScannerLib-Linea-2.0.0.js');
     }
     $this->add_script($FANNIE_URL . 'src/javascript/tablesorter/jquery.tablesorter.js');
     $this->add_css_file($FANNIE_URL . 'src/javascript/tablesorter/themes/blue/style.css');
     //$this->add_css_file($FANNIE_URL.'src/javascript/jquery-ui.css');
     return true;
 }
Ejemplo n.º 9
0
 public function get_id_view()
 {
     $dbc = FannieDB::get($this->config->get('OP_DB'));
     $vendor = new VendorsModel($dbc);
     $vendor->vendorID($this->id);
     $vendor->load();
     $ret = '<p id="vendor-name">New <strong>' . $vendor->vendorName() . '</strong> order</p>';
     $ret .= '<div id="alert-area"></div>';
     $ret .= '<form id="order-form" onsubmit="saveOrder(); return false;">
         <input type="hidden" id="vendor-id" name="id" value="' . $this->id . '" />
         <div class="form-group form-inline">
             <label>Order Date</label>
             <input type="text" name="order-date" class="form-control date-field"
                 value="' . date('Y-m-d') . '" />
             <label>PO #</label>
             <input type="text" name="po-number" class="form-control" />
             <label>Inv. #</label>
             <input type="text" name="inv-number" class="form-control" />
         </div>';
     $ret .= '<div class="collapse" id="delete-html">' . FannieUI::deleteIcon() . '</div>';
     $ret .= '<div class="form-group">
         <button type="button" class="btn btn-default" onclick="addInvoiceLine();">Add Line</button>
         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <button type="submit" class="btn btn-default" id="save-btn">Save As Order</button>
         </div>';
     $ret .= '<table class="table table-bordered" id="invoice-table">
         <thead><tr>
             <th>SKU</th>
             <th>UPC</th>
             <th>Cases</th>
             <th>Units/Case</th>
             <th>Total Cost</th>
             <th>Brand</th>
             <th>Description</th>
         </thead>
         <tbody>
         </tbody>
         </table>';
     $ret .= '</form>';
     $this->addScript('js/manual.js');
     $this->addScript('../item/autocomplete.js');
     $this->addOnloadCommand('addInvoiceLine();');
     return $ret;
 }
Ejemplo n.º 10
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;
    }
Ejemplo n.º 11
0
 function get_id_view()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $order = new PurchaseOrderModel($dbc);
     $order->orderID($this->id);
     $order->load();
     $vendor = new VendorsModel($dbc);
     $vendor->vendorID($order->vendorID());
     $vendor->load();
     $ret = '<p><div class="form-inline">';
     $ret .= '<b>Vendor</b>: ' . $vendor->vendorName();
     $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;';
     $ret .= '<b>Created</b>: ' . $order->creationDate();
     $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;';
     $ret .= '<b>Placed</b>: <span id="orderPlacedSpan">' . ($order->placed() ? $order->placedDate() : 'n/a') . '</span>';
     $ret .= '<input type="checkbox" ' . ($order->placed() ? 'checked' : '') . ' id="placedCheckbox"
             onclick="togglePlaced(' . $this->id . ');" />';
     $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
     $ret .= 'Export as: <select id="exporterSelect" class="form-control">';
     $dh = opendir('exporters');
     while (($file = readdir($dh)) !== False) {
         if (substr($file, -4) != '.php') {
             continue;
         }
         include 'exporters/' . $file;
         $class = substr($file, 0, strlen($file) - 4);
         if (!class_exists($class)) {
             continue;
         }
         $obj = new $class();
         if (!isset($obj->nice_name)) {
             continue;
         }
         $ret .= '<option value="' . $class . '">' . $obj->nice_name . '</option>';
     }
     $ret .= '</select> ';
     $ret .= '<button type="submit" class="btn btn-default" onclick="doExport(' . $this->id . ');return false;">Export</button>';
     $ret .= '&nbsp;&nbsp;&nbsp;';
     $init = $order->placed() ? 'init=placed' : 'init=pending';
     $ret .= '<button type="button" class="btn btn-default" 
         onclick="location=\'ViewPurchaseOrders.php?' . $init . '\'; return false;">All Orders</button>';
     $ret .= '</div></p>';
     $ret .= '<div class="row"><div class="col-sm-6">';
     $ret .= '<table class="table table-bordered"><tr><th colspan="2">Coding(s)</th>';
     $ret .= '<td><b>PO#</b>: ' . $order->vendorOrderID() . '</td>';
     $ret .= '<td><b>Invoice#</b>: ' . $order->vendorInvoiceID() . '</td>';
     $ret .= '</tr>';
     $ret .= '{{CODING}}';
     $ret .= '</table>';
     $ret .= '</div><div class="col-sm-6">';
     if (!$order->placed()) {
         $ret .= '<button class="btn btn-default"
             onclick="location=\'EditOnePurchaseOrder.php?id=' . $order->vendorID() . '\'; return false;">Add Items</button>';
         $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;';
         $ret .= '<button class="btn btn-default" onclick="deleteOrder(' . $this->id . '); return false;">Delete Order</button>';
     } else {
         $ret .= '<a class="btn btn-default"
             href="ManualPurchaseOrderPage.php?id=' . $order->vendorID() . '&adjust=' . $this->id . '">Edit Order</a>';
         $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;';
         $ret .= '<a class="btn btn-default"
             href="ViewPurchaseOrders.php?id=' . $this->id . '&receive=1">Receive Order</a>';
         $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;';
         $ret .= '<a class="btn btn-default"
             href="ViewPurchaseOrders.php?id=' . $this->id . '&recode=1">Alter Codings</a>';
     }
     $ret .= '</div></div>';
     $model = new PurchaseOrderItemsModel($dbc);
     $model->orderID($this->id);
     $codings = array();
     $accounting = $this->config->get('ACCOUNTING_MODULE');
     if (!class_exists($accounting)) {
         $accounting = '\\COREPOS\\Fannie\\API\\item\\Accounting';
     }
     $ret .= '<table class="table tablesorter"><thead>';
     $ret .= '<tr><th>Coding</th><th>SKU</th><th>UPC</th><th>Brand</th><th>Description</th>
         <th>Unit Size</th><th>Units/Case</th><th>Cases</th>
         <th>Est. Cost</th><th>&nbsp;</th><th>Received</th>
         <th>Rec. Qty</th><th>Rec. Cost</th></tr></thead><tbody>';
     foreach ($model->find() as $obj) {
         $css = '';
         if ($obj->receivedQty() == 0 && $obj->quantity() != 0) {
             $css = 'class="danger"';
         } elseif ($obj->receivedQty() < $obj->quantity()) {
             $css = 'class="warning"';
         }
         if ($obj->salesCode() == '') {
             $code = $obj->guessCode();
             $obj->salesCode($code);
             $obj->save();
         }
         $coding = (int) $obj->salesCode();
         $coding = $accounting::toPurchaseCode($coding);
         if (!isset($codings[$coding])) {
             $codings[$coding] = 0.0;
         }
         $codings[$coding] += $obj->receivedTotalCost();
         $ret .= sprintf('<tr %s><td>%d</td><td>%s</td>
                 <td><a href="../item/ItemEditorPage.php?searchupc=%s">%s</a></td><td>%s</td><td>%s</td>
                 <td>%s</td><td>%s</td><td>%d</td><td>%.2f</td>
                 <td>&nbsp;</td><td>%s</td><td>%d</td><td>%.2f</td>
                 </tr>', $css, $accounting::toPurchaseCode($obj->salesCode()), $obj->sku(), $obj->internalUPC(), $obj->internalUPC(), $obj->brand(), $obj->description(), $obj->unitSize(), $obj->caseSize(), $obj->quantity(), $obj->quantity() * $obj->caseSize() * $obj->unitCost(), date('Y-m-d', strtotime($obj->receivedDate())), $obj->receivedQty(), $obj->receivedTotalCost());
     }
     $ret .= '</tbody></table>';
     $coding_rows = '';
     foreach ($codings as $coding => $ttl) {
         $coding_rows .= sprintf('<tr><td>%d</td><td>%.2f</td></tr>', $coding, $ttl);
     }
     $ret = str_replace('{{CODING}}', $coding_rows, $ret);
     $this->add_script('js/view.js');
     $this->add_script('../src/javascript/tablesorter/jquery.tablesorter.min.js');
     $this->addOnloadCommand("\$('.tablesorter').tablesorter();\n");
     return $ret;
 }
Ejemplo n.º 12
0
 public function get_id_view()
 {
     $this->addScript('pricing-batch.js');
     $dbc = $this->connection;
     $dbc->selectDB($this->config->OP_DB);
     $superID = FormLib::get_form_value('super', 99);
     $queueID = FormLib::get('queueID');
     $vendorID = $this->id;
     $filter = FormLib::get_form_value('filter') == 'Yes' ? True : False;
     /* lookup vendor and superdept names to build a batch name */
     $sname = "All";
     if ($superID != 99) {
         $smodel = new SuperDeptNamesModel($dbc);
         $smodel->superID($superID);
         $smodel->load();
         $sname = $smodel->super_name();
     }
     $vendor = new VendorsModel($dbc);
     $vendor->vendorID($vendorID);
     $vendor->load();
     $batchName = $sname . " " . $vendor->vendorName() . " PC " . date('m/d/y');
     /* find a price change batch type */
     $types = new BatchTypeModel($dbc);
     $types->discType(0);
     $bType = 0;
     foreach ($types->find() as $obj) {
         $bType = $obj->batchTypeID();
         break;
     }
     /* get the ID of the current batch. Create it if needed. */
     $bidQ = $dbc->prepare("\n            SELECT batchID \n            FROM batches \n            WHERE batchName=? \n                AND batchType=? \n                AND discounttype=0\n            ORDER BY batchID DESC");
     $bidR = $dbc->execute($bidQ, array($batchName, $bType));
     $batchID = 0;
     if ($dbc->numRows($bidR) == 0) {
         $b = new BatchesModel($dbc);
         $b->batchName($batchName);
         $b->startDate('1900-01-01');
         $b->endDate('1900-01-01');
         $b->batchType($bType);
         $b->discountType(0);
         $b->priority(0);
         $batchID = $b->save();
     } else {
         $bidW = $dbc->fetchRow($bidR);
         $batchID = $bidW['batchID'];
     }
     $ret = sprintf('<b>Batch</b>: 
                 <a href="%sbatches/newbatch/BatchManagementTool.php?startAt=%d">%s</a>', $this->config->URL, $batchID, $batchName);
     $ret .= sprintf("<input type=hidden id=vendorID value=%d />\n            <input type=hidden id=batchID value=%d />\n            <input type=hidden id=queueID value=%d />\n            <input type=hidden id=superID value=%d />", $vendorID, $batchID, $queueID, $superID);
     $batchUPCs = array();
     $batchList = new BatchListModel($dbc);
     $batchList->batchID($batchID);
     foreach ($batchList->find() as $obj) {
         $batchUPCs[$obj->upc()] = true;
     }
     $costSQL = Margin::adjustedCostSQL('v.cost', 'b.discountRate', 'b.shippingMarkup');
     $marginSQL = Margin::toMarginSQL($costSQL, 'p.normal_price');
     $p_def = $dbc->tableDefinition('products');
     $marginCase = '
         CASE 
             WHEN g.margin IS NOT NULL AND g.margin <> 0 THEN g.margin
             WHEN s.margin IS NOT NULL AND s.margin <> 0 THEN s.margin
             ELSE d.margin
         END';
     $srpSQL = Margin::toPriceSQL($costSQL, $marginCase);
     $query = "SELECT p.upc,\n            p.description,\n            v.cost,\n            b.shippingMarkup,\n            b.discountRate,\n            p.normal_price,\n            " . Margin::toMarginSQL($costSQL, 'p.normal_price') . " AS current_margin,\n            " . Margin::toMarginSQL($costSQL, 'v.srp') . " AS desired_margin,\n            " . $costSQL . " AS adjusted_cost,\n            v.srp,\n            " . $srpSQL . " AS rawSRP,\n            v.vendorDept,\n            x.variable_pricing,\n            " . $marginCase . " AS margin\n            FROM products AS p \n                INNER JOIN vendorItems AS v ON p.upc=v.upc AND p.default_vendor_id=v.vendorID\n                INNER JOIN vendors as b ON v.vendorID=b.vendorID\n                LEFT JOIN departments AS d ON p.department=d.dept_no\n                LEFT JOIN vendorDepartments AS s ON v.vendorDept=s.deptID AND v.vendorID=s.vendorID\n                LEFT JOIN VendorSpecificMargins AS g ON p.department=g.deptID AND v.vendorID=g.vendorID\n                LEFT JOIN prodExtra AS x on p.upc=x.upc ";
     $args = array($vendorID);
     if ($superID != 99) {
         $query .= " LEFT JOIN MasterSuperDepts AS m\n                ON p.department=m.dept_ID ";
     }
     $query .= "WHERE v.cost > 0 \n                    AND v.vendorID=?\n                    AND p.inUse=1 ";
     if ($superID != 99) {
         $query .= " AND m.superID=? ";
         $args[] = $superID;
     }
     if ($filter === false) {
         $query .= " AND p.normal_price <> v.srp ";
     }
     if ($this->config->get('STORE_MODE') == 'HQ') {
         $query .= ' AND p.store_id=? ';
         $args[] = $this->config->get('STORE_ID');
     }
     $query .= " ORDER BY p.upc";
     if (isset($p_def['price_rule_id'])) {
         $query = str_replace('x.variable_pricing', 'p.price_rule_id AS variable_pricing', $query);
     }
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($prep, $args);
     $ret .= "<table class=\"table table-bordered small\">";
     $ret .= "<tr><td colspan=6>&nbsp;</td><th colspan=2>Current</th>\n            <th colspan=3>Vendor</th></tr>";
     $ret .= "<tr><th>UPC</th><th>Our Description</th>\n            <th>Base Cost</th>\n            <th>Shipping</th>\n            <th>Discount%</th>\n            <th>Adj. Cost</th>\n            <th>Price</th><th>Margin</th><th>Raw</th><th>SRP</th>\n            <th>Margin</th><th>Cat</th><th>Var</th>\n            <th>Batch</th></tr>";
     while ($row = $dbc->fetch_row($result)) {
         $background = "white";
         if (isset($batchUPCs[$row['upc']])) {
             $background = 'selection';
         } elseif ($row['variable_pricing'] == 0) {
             $background = $row['normal_price'] + 0.1 < $row['rawSRP'] ? 'red' : 'green';
             if ($row['normal_price'] - 0.1 > $row['rawSRP']) {
                 $background = $row['normal_price'] - 0.1 > $row['rawSRP'] ? 'yellow' : 'green';
             }
         }
         if (isset($batchUPCs[$row['upc']])) {
             $icon = '<span class="glyphicon glyphicon-minus-sign"
                 title="Remove from batch">
                 </span>';
         } else {
             $icon = '<span class="glyphicon glyphicon-plus-sign"
                 title="Add to batch">
                 </span>';
         }
         $ret .= sprintf("<tr id=row%s class=%s>\n                <td class=\"sub\"><a href=\"%sitem/ItemEditorPage.php?searchupc=%s\">%s</a></td>\n                <td class=\"sub\">%s</td>\n                <td class=\"sub cost\">%.2f</td>\n                <td class=\"sub shipping\">%.2f%%</td>\n                <td class=\"sub discount\">%.2f%%</td>\n                <td class=\"sub adj-cost\">%.2f</td>\n                <td class=\"sub price\">%.2f</td>\n                <td class=\"sub cmargin\">%.2f%%</td>\n                <td class=\"sub raw-srp\">%.2f</td>\n                <td onclick=\"reprice('%s');\" class=\"sub srp\">%.2f</td>\n                <td class=\"sub dmargin\">%.2f%%</td>\n                <td class=\"sub\">%d</td>\n                <td><input class=varp type=checkbox onclick=\"toggleV('%s');\" %s /></td>\n                <td class=white>\n                    <a class=\"add-button %s\" href=\"\" \n                        onclick=\"addToBatch('%s'); return false;\">\n                        <span class=\"glyphicon glyphicon-plus-sign\"\n                            title=\"Add item to batch\"></span>\n                    </a>\n                    <a class=\"remove-button %s\" href=\"\" \n                        onclick=\"removeFromBatch('%s'); return false;\">\n                        <span class=\"glyphicon glyphicon-minus-sign\"\n                            title=\"Remove item from batch\"></span>\n                    </a>\n                </td>\n                </tr>", $row['upc'], $background, $this->config->URL, $row['upc'], $row['upc'], $row['description'], $row['cost'], $row['shippingMarkup'] * 100, $row['discountRate'] * 100, $row['adjusted_cost'], $row['normal_price'], 100 * $row['current_margin'], $row['rawSRP'], $row['upc'], $row['srp'], 100 * $row['desired_margin'], $row['vendorDept'], $row['upc'], $row['variable_pricing'] >= 1 ? 'checked' : '', isset($batchUPCs[$row['upc']]) ? 'collapse' : '', $row['upc'], !isset($batchUPCs[$row['upc']]) ? 'collapse' : '', $row['upc']);
     }
     $ret .= "</table>";
     return $ret;
 }