Example #1
0
 public function post_upc_description_department_cost_price_qty_reason_handler()
 {
     global $FANNIE_TRANS_DB, $FANNIE_EMP_NO, $FANNIE_REGISTER_NO;
     $dbc = FannieDB::get($FANNIE_TRANS_DB);
     $record = DTrans::$DEFAULTS;
     $record['emp_no'] = $FANNIE_EMP_NO;
     $record['register_no'] = $FANNIE_REGISTER_NO;
     $record['trans_no'] = DTrans::getTransNo($dbc, $FANNIE_EMP_NO, $FANNIE_REGISTER_NO);
     $record['trans_id'] = 1;
     $record['upc'] = $this->upc;
     $record['description'] = $this->description;
     $record['department'] = $this->department;
     $record['trans_type'] = 'I';
     $record['quantity'] = $this->qty;
     $record['ItemQtty'] = $this->qty;
     $record['unitPrice'] = $this->price;
     $record['regPrice'] = $this->price;
     $record['total'] = $this->qty * $this->price;
     $record['cost'] = $this->qty * $this->cost;
     $record['numflag'] = $this->reason;
     $record['charflag'] = strlen(FormLib::get('type')) > 0 ? strtoupper(substr(FormLib::get('type'), 0, 1)) : '';
     $record['trans_status'] = 'Z';
     $info = DTrans::parameterize($record, 'datetime', $dbc->now());
     $query = 'INSERT INTO dtransactions
         (' . $info['columnString'] . ')
         VALUES
         (' . $info['valueString'] . ')';
     $prep = $dbc->prepare($query);
     $result = $dbc->execute($prep, $info['arguments']);
     header('Location: ' . $_SERVER['PHP_SELF'] . '?msg=1');
     return false;
 }
Example #2
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $query = '
         SELECT b.batchID,
             b.batchName,
             l.upc,
             p.normal_price,
             l.salePrice,
             CASE WHEN b.startDate > ' . $dbc->curdate() . ' THEN 0 ELSE 1 END AS current
         FROM batches AS b
             INNER JOIN batchList AS l ON b.batchID=l.batchID
             ' . DTrans::joinProducts('l', 'p', 'INNER') . '
         WHERE b.endDate >= ' . $dbc->curdate() . '
             AND b.discounttype <> 0
             AND l.salePrice >= p.normal_price';
     $result = $dbc->query($query);
     $data = array();
     while ($w = $dbc->fetchRow($result)) {
         $record = array('<a href="' . $this->config->get('URL') . 'batches/newbatch/EditBatchPage.php?id=' . $w['batchID'] . '">' . $w['batchName'] . '</a>', $w['upc'], $w['current'] == 1 ? 'Yes' : 'No', $w['normal_price'], $w['salePrice']);
         $data[] = $record;
     }
     return $data;
 }
Example #3
0
 public function fetch_report_data()
 {
     global $FANNIE_OP_DB;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $qty = FormLib::get('qty', 1);
     $create = $dbc->prepare_statement("CREATE TABLE groupingTempBS (upc VARCHAR(13), quantity double, total decimal(10,2), trans_num varchar(50))");
     $dbc->exec_statement($create);
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $setupQ = $dbc->prepare_statement("INSERT INTO groupingTempBS\n            SELECT upc, quantity, total, trans_num\n            FROM {$dlog} AS d WHERE tdate BETWEEN ? AND ?\n            AND trans_type IN ('I','D')\n            GROUP BY year(tdate),month(tdate),day(tdate),trans_num \n            HAVING COUNT(*) <= ?");
     $dbc->exec_statement($setupQ, array($date1 . ' 00:00:00', $date2 . ' 23:59:59', $qty));
     $reportQ = $dbc->prepare_statement('
         SELECT g.upc,
             p.description,
             SUM(g.quantity) AS qty,
             COUNT(DISTINCT trans_num) AS num,
             SUM(total) AS ttl
         FROM groupingTempBS as g ' . DTrans::joinProducts('g', 'p') . '
         GROUP BY g.upc,
             p.description
         HAVING sum(total) <> 0
         ORDER BY count(*) DESC
     ');
     $reportR = $dbc->exec_statement($reportQ);
     $data = array();
     while ($w = $dbc->fetch_row($reportR)) {
         $record = array($w['upc'], empty($w['description']) ? 'n/a' : $w['description'], $w[3], sprintf('%.2f', $w[2]), sprintf('%.2f', $w[4]));
         $data[] = $record;
     }
     $drop = $dbc->prepare_statement("DROP TABLE groupingTempBS");
     $dbc->exec_statement($drop);
     return $data;
 }
Example #4
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $query_parts = FormLib::standardItemFromWhere();
     $query = '
         SELECT t.upc,
             t.description,
             t.department,
             d.dept_name,
             ' . DTrans::sumQuantity('t') . ' AS qty,
             SUM(t.total) AS total ' . $query_parts['query'] . ' AND t.memType=?
         GROUP BY t.upc,
             t.description,
             t.department,
             d.dept_name
         ORDER BY t.upc';
     $args = $query_parts['args'];
     $args[] = FormLib::get('memtype');
     $data = array();
     $prep = $dbc->prepare($query);
     $res = $dbc->execute($prep, $args);
     while ($w = $dbc->fetchRow($res)) {
         $data[] = array($w['upc'], $w['description'], $w['department'] . ' ' . $w['dept_name'], sprintf('%.2f', $w['qty']), sprintf('%.2f', $w['total']));
     }
     return $data;
 }
Example #5
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get('deptStart');
     $deptEnd = FormLib::get('deptEnd');
     $deptMulti = FormLib::get('departments', array());
     $buyer = FormLib::get('buyer', '');
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $queryAll = "SELECT YEAR(tdate) AS year, MONTH(tdate) AS month, DAY(tdate) AS day,\n            COUNT(DISTINCT trans_num) as trans_count\n            FROM {$dlog} AS d \n            WHERE tdate BETWEEN ? AND ?\n            GROUP BY YEAR(tdate), MONTH(tdate), DAY(tdate)\n            ORDER BY YEAR(tdate), MONTH(tdate), DAY(tdate)";
     $argsAll = array($date1 . ' 00:00:00', $date2 . ' 23:59:59');
     $querySelected = "SELECT YEAR(tdate) AS year, MONTH(tdate) AS month, DAY(tdate) AS day,\n            COUNT(DISTINCT trans_num) as trans_count\n            FROM {$dlog} AS d ";
     if ($buyer !== '' && $buyer > -1) {
         $querySelected .= " LEFT JOIN superdepts AS s ON d.department=s.dept_ID ";
     } elseif ($buyer !== '' && $buyer == -2) {
         $query .= 'LEFT JOIN MasterSuperDepts AS s ON d.department=s.dept_ID ';
     }
     $querySelected .= " WHERE tdate BETWEEN ? AND ? ";
     $argsSel = $argsAll;
     if ($buyer !== '') {
         if ($buyer == -2) {
             $querySelected .= ' AND s.superID != 0 ';
         } elseif ($buyer != -1) {
             $querySelected .= ' AND s.superID=? ';
             $argsSel[] = $buyer;
         }
     }
     if ($buyer != -1) {
         list($conditional, $argsSel) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $argsSel);
         $querySelected .= $conditional;
     }
     $querySelected .= " GROUP BY YEAR(tdate), MONTH(tdate), DAY(tdate)";
     $dataset = array();
     $prep = $dbc->prepare_statement($queryAll);
     $result = $dbc->exec_statement($prep, $argsAll);
     while ($row = $dbc->fetch_row($result)) {
         $datestr = sprintf("%d/%d/%d", $row['month'], $row['day'], $row['year']);
         $dataset[$datestr] = array('ttl' => $row['trans_count'], 'sub' => 0);
     }
     $prep = $dbc->prepare_statement($querySelected);
     $result = $dbc->exec_statement($prep, $argsSel);
     while ($row = $dbc->fetch_row($result)) {
         $datestr = sprintf("%d/%d/%d", $row['month'], $row['day'], $row['year']);
         if (isset($dataset[$datestr])) {
             $dataset[$datestr]['sub'] = $row['trans_count'];
         }
     }
     $data = array();
     foreach ($dataset as $date => $count) {
         $record = array($date, $count['sub'], $count['ttl']);
         $record[] = sprintf('%.2f%%', $count['sub'] / $count['ttl'] * 100);
         $data[] = $record;
     }
     return $data;
 }
Example #6
0
 function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->setDefaultDB($this->config->get('OP_DB'));
     $d1 = $this->form->date1;
     $d2 = $this->form->date2;
     $dates = array($d1 . ' 00:00:00', $d2 . ' 23:59:59');
     $today = date('Ymd');
     $data = array();
     $dlog = DTransactionsModel::selectDlog($d1);
     $tenderQ = $dbc->prepare("\n            SELECT TenderName,\n                COUNT(d.total) AS num,\n                SUM(d.total) as total,\n                t.SalesCode\n            FROM {$dlog} AS d\n                LEFT JOIN tenders as t ON d.trans_subtype=t.TenderCode\n            WHERE d.tdate BETWEEN ? AND ?\n                AND d.trans_type = 'T'\n                AND d.total <> 0\n            GROUP BY t.TenderName,\n                t.SalesCode \n            ORDER BY TenderName");
     $tenderR = $dbc->execute($tenderQ, $dates);
     while ($tenderW = $dbc->fetch_row($tenderR)) {
         $credit = $tenderW['total'] <= 0 ? abs($tenderW['total']) : 0.0;
         $debit = $tenderW['total'] > 0 ? $tenderW['total'] : 0.0;
         $data[] = array($today, $tenderW['SalesCode'], sprintf('%.2f', $credit), sprintf('%.2f', $debit), $tenderW['TenderName']);
     }
     $salesQ = '
         SELECT t.salesCode AS category,
             SUM(d.quantity) AS qty,
             SUM(d.total) AS total
         FROM ' . $dlog . ' AS d
             LEFT JOIN departments AS t ON d.department=t.dept_no
         WHERE d.department <> 0
             AND d.trans_type <> \'T\'
             AND d.tdate BETWEEN ? AND ?
         GROUP BY t.salesCode
         ORDER BY t.salesCode';
     $salesP = $dbc->prepare($salesQ);
     $salesR = $dbc->execute($salesP, $dates);
     $report = array();
     while ($salesW = $dbc->fetch_row($salesR)) {
         $credit = $salesW['total'] < 0 ? abs($salesW['total']) : 0.0;
         $debit = $salesW['total'] >= 0 ? $salesW['total'] : 0.0;
         $data[] = array($today, $salesW['category'], sprintf('%.2f', $credit), sprintf('%.2f', $debit), 'Sales ' . $salesW['category']);
     }
     $discQ = $dbc->prepare("\n                SELECT m.memDesc, \n                    SUM(d.total) AS total,\n                    count(*) AS num,\n                    m.salesCode\n                FROM {$dlog} d \n                    LEFT JOIN memtype m ON d.memType = m.memtype\n                WHERE d.tdate BETWEEN ? AND ?\n                   AND d.upc = 'DISCOUNT'\n                    AND total <> 0\n                GROUP BY m.memDesc,\n                    m.salesCode \n                ORDER BY m.memDesc");
     $discR = $dbc->execute($discQ, $dates);
     while ($discW = $dbc->fetch_row($discR)) {
         $credit = $discW['total'] <= 0 ? abs($discW['total']) : 0.0;
         $debit = $discW['total'] > 0 ? $discW['total'] : 0.0;
         $data[] = array($today, $discW['salesCode'], sprintf('%.2f', $credit), sprintf('%.2f', $debit), $discW['memDesc'] . ' Discount');
     }
     $report = array();
     $trans = DTransactionsModel::selectDTrans($d1);
     $lineItemQ = $dbc->prepare("\n            SELECT d.description,\n                SUM(regPrice) AS ttl,\n                t.salesCode\n            FROM {$trans} AS d\n                LEFT JOIN taxrates AS t ON d.numflag=t.id\n            WHERE datetime BETWEEN ? AND ?\n                AND d.upc='TAXLINEITEM'\n                AND " . DTrans::isNotTesting('d') . "\n            GROUP BY d.description\n        ");
     $lineItemR = $dbc->execute($lineItemQ, $dates);
     while ($lineItemW = $dbc->fetch_row($lineItemR)) {
         $credit = $lineItemW['ttl'] < 0 ? abs($lineItemW['ttl']) : 0.0;
         $debit = $lineItemW['ttl'] >= 0 ? $lineItemW['ttl'] : 0.0;
         $data[] = array($today, $lineItemW['salesCode'], sprintf('%.2f', $credit), sprintf('%.2f', $debit), $lineItemW['description'] . ' tax');
     }
     return $data;
 }
Example #7
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get('deptStart');
     $deptEnd = FormLib::get('deptEnd');
     $deptMulti = FormLib::get('departments', array());
     $buyer = FormLib::get('buyer', '');
     // args/parameters differ with super
     // vs regular department
     $args = array($date1 . ' 00:00:00', $date2 . ' 23:59:59');
     $where = ' 1=1 ';
     if ($buyer !== '') {
         if ($buyer == -2) {
             $where .= ' AND s.superID != 0 ';
         } elseif ($buyer != -1) {
             $where .= ' AND s.superID=? ';
             $args[] = $buyer;
         }
     }
     if ($buyer != -1) {
         list($conditional, $args) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $args);
         $where .= $conditional;
     }
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $query = "\n            SELECT d.upc,\n                p.brand,\n                p.description," . DTrans::sumQuantity('d') . " AS qty,\n                CASE WHEN memDiscount <> 0 AND memType <> 0 THEN unitPrice - memDiscount ELSE unitPrice END as price,\n                d.department, \n                t.dept_name, \n                SUM(total) AS total\n            FROM {$dlog} AS d " . DTrans::joinProducts('d', 'p', 'inner') . DTrans::joinDepartments('d', 't');
     // join only needed with specific buyer
     if ($buyer !== '' && $buyer > -1) {
         $query .= 'LEFT JOIN superdepts AS s ON d.department=s.dept_ID ';
     } elseif ($buyer !== '' && $buyer == -2) {
         $query .= 'LEFT JOIN MasterSuperDepts AS s ON d.department=s.dept_ID ';
     }
     $query .= "\n            WHERE tdate BETWEEN ? AND ?\n                AND {$where}\n            GROUP BY d.upc,p.description,price,d.department,t.dept_name\n            ORDER BY d.upc";
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($query, $args);
     $data = array();
     while ($row = $dbc->fetch_row($result)) {
         $record = array($row['upc'], $row['brand'], $row['description'], $row['department'], $row['dept_name'], sprintf('%.2f', $row['price']), sprintf('%.2f', $row['qty']), sprintf('%.2f', $row['total']));
         $data[] = $record;
     }
     // bold items that sold at multiple prices
     for ($i = 0; $i < count($data); $i++) {
         if (!isset($data[$i + 1])) {
             continue;
         }
         if ($data[$i][0] == $data[$i + 1][0]) {
             $data[$i]['meta'] = FannieReportPage::META_BOLD;
             $data[$i + 1]['meta'] = FannieReportPage::META_BOLD;
         }
     }
     return $data;
 }
 public function fetch_report_data()
 {
     global $FANNIE_OP_DB, $FANNIE_SERVER_DBMS;
     // creates a temporary table so requesting a writable connection
     // does make sense here
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $depts = FormLib::get('depts', array());
     $upc = FormLib::get('upc');
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $filters = FormLib::get('filters', array());
     list($dClause, $dArgs) = $dbc->safeInClause($depts);
     $where = "d.department IN ({$dClause})";
     $inv = "d.department NOT IN ({$dClause})";
     if ($upc != "") {
         $upc = BarcodeLib::padUPC($upc);
         $where = "d.upc = ?";
         $inv = "d.upc <> ?";
         $dArgs = array($upc);
     }
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $filter = "";
     $fArgs = array();
     if (is_array($filters) && count($filters) > 0) {
         $fClause = "";
         foreach ($filters as $f) {
             $fClause .= "?,";
             $fArgs[] = $f;
         }
         $fClause = "(" . rtrim($fClause, ",") . ")";
         $filter = "AND d.department IN {$fClause}";
     }
     $query = $dbc->prepare_statement("CREATE TABLE groupingTemp (tdate varchar(11), emp_no int, register_no int, trans_no int)");
     $dbc->exec_statement($query);
     $dateConvertStr = $FANNIE_SERVER_DBMS == 'MSSQL' ? 'convert(char(11),d.tdate,110)' : 'convert(date(d.tdate),char)';
     $loadQ = $dbc->prepare_statement("INSERT INTO groupingTemp\n            SELECT {$dateConvertStr} as tdate,\n            emp_no,register_no,trans_no FROM {$dlog} AS d\n            WHERE {$where} AND tdate BETWEEN ? AND ?\n            GROUP BY {$dateConvertStr}, emp_no,register_no,trans_no");
     $dArgs[] = $date1 . ' 00:00:00';
     $dArgs[] = $date2 . ' 23:59:59';
     $dbc->exec_statement($loadQ, $dArgs);
     $dataQ = $dbc->prepare_statement("\n            SELECT d.upc,\n                p.description,\n                t.dept_no,\n                t.dept_name,\n                SUM(d.quantity) AS quantity\n            FROM {$dlog} AS d \n                INNER JOIN groupingTemp AS g ON \n                    {$dateConvertStr} = g.tdate\n                    AND g.emp_no = d.emp_no\n                    AND g.register_no = d.register_no\n                    AND g.trans_no = d.trans_no " . DTrans::joinProducts('d', 'p') . DTrans::joinDepartments('d', 't') . "\n            WHERE {$inv} \n                AND trans_type IN ('I','D')\n                AND d.tdate BETWEEN ? AND ?\n                AND d.trans_status=''\n                {$filter}\n            GROUP BY d.upc,\n                p.description,\n                t.dept_no,\n                t.dept_name\n            ORDER BY SUM(d.quantity) DESC");
     foreach ($fArgs as $f) {
         $dArgs[] = $f;
     }
     $dataR = $dbc->exec_statement($dataQ, $dArgs);
     $data = array();
     while ($dataW = $dbc->fetch_row($dataR)) {
         $record = array($dataW['upc'], $dataW['description'], $dataW['dept_no'] . ' ' . $dataW['dept_name'], sprintf('%.2f', $dataW['quantity']));
         $data[] = $record;
     }
     $drop = $dbc->prepare_statement("DROP TABLE groupingTemp");
     $dbc->exec_statement($drop);
     return $data;
 }
Example #9
0
 function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $month1 = $this->form->month1;
     $month2 = $this->form->month2;
     $year1 = FormLib::get_form_value('year1', date('Y'));
     $year2 = FormLib::get_form_value('year2', date('Y'));
     $date1 = date('Y-m-d', mktime(0, 0, 0, $month1, 1, $year1));
     $date2 = date('Y-m-t', mktime(0, 0, 0, $month2, 1, $year2));
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $date1 .= ' 00:00:00';
     $date2 .= ' 00:00:00';
     $qArgs = array($date1, $date2);
     $query = "";
     $type = FormLib::get_form_value('mtype', 'upc');
     if ($type == 'upc') {
         $inClause = "(";
         $vals = preg_split("/\\D+/", FormLib::get_form_value('upcs', ''));
         foreach ($vals as $v) {
             $qArgs[] = BarcodeLib::padUPC($v);
             $inClause .= "?,";
         }
         $inClause = rtrim($inClause, ",") . ")";
         $query = "SELECT t.upc,\n                        p.description, " . DTrans::sumQuantity('t') . " AS qty,\n                        SUM(total) AS sales, \n                        MONTH(tdate) AS month, \n                        YEAR(tdate) AS year\n                      FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p') . " \n                      WHERE t.trans_status <> 'M'\n                        AND tdate BETWEEN ? AND ?\n                        AND t.upc IN {$inClause}\n                      GROUP BY YEAR(tdate),\n                        MONTH(tdate),\n                        t.upc,\n                        p.description\n                      ORDER BY YEAR(tdate),\n                        MONTH(tdate),\n                        t.upc,\n                        p.description";
     } else {
         $dept1 = FormLib::get_form_value('dept1', 1);
         $dept2 = FormLib::get_form_value('dept2', 1);
         $qArgs[] = $dept1;
         $qArgs[] = $dept2;
         $query = "SELECT t.department,d.dept_name,SUM(t.quantity) as qty,\n                SUM(total) as sales, MONTH(tdate) as month, YEAR(tdate) as year\n                FROM {$dlog} AS t\n                LEFT JOIN departments AS d ON t.department=d.dept_no\n                WHERE t.trans_status <> 'M'\n                AND tdate BETWEEN ? AND ?\n                AND t.department BETWEEN ? AND ?\n                GROUP BY YEAR(tdate),MONTH(tdate),t.department,d.dept_name\n                ORDER BY YEAR(tdate),MONTH(tdate),t.department,d.dept_name";
     }
     $queryP = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($queryP, $qArgs);
     $ret = array();
     while ($row = $dbc->fetch_array($result)) {
         if (!isset($ret[$row[0]])) {
             $ret[$row[0]] = array('num' => $row[0], 'desc' => $row[1]);
             foreach ($this->months as $mkey) {
                 $ret[$row[0]][$mkey] = 0;
             }
         }
         if (FormLib::get_form_value('results', 'Sales') == 'Sales') {
             $ret[$row[0]][$row['year'] . '-' . $row['month']] = $row['sales'];
         } else {
             $ret[$row[0]][$row['year'] . '-' . $row['month']] = $row['qty'];
         }
     }
     return $this->dekey_array($ret);
 }
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $manu = FormLib::get_form_value('manu', '');
     $type = FormLib::get_form_value('type', '');
     $groupby = FormLib::get_form_value('groupby', 'upc');
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $type_condition = "p.brand LIKE ?";
     $args = array('%' . $manu . '%');
     if ($type == 'prefix') {
         $type_condition = 't.upc LIKE ?';
     }
     $query = "";
     $args[] = $date1 . ' 00:00:00';
     $args[] = $date2 . ' 23:59:59';
     switch ($groupby) {
         case 'upc':
             $query = "\n                SELECT t.upc,\n                    p.brand,\n                    p.description, " . DTrans::sumQuantity('t') . " AS qty,\n                    SUM(t.total) AS ttl,\n                    d.dept_no,\n                    d.dept_name,\n                    s.superID\n                FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p', 'INNER') . DTrans::joinDepartments('t', 'd') . "\n                    LEFT JOIN MasterSuperDepts AS s ON d.dept_no = s.dept_ID\n                WHERE {$type_condition}\n                    AND t.tdate BETWEEN ? AND ?\n                GROUP BY t.upc,\n                    p.description,\n                    d.dept_no,\n                    d.dept_name,\n                    s.superID\n                ORDER BY SUM(t.total) DESC";
             break;
         case 'date':
             $query = "\n                SELECT YEAR(t.tdate) AS year,\n                    MONTH(t.tdate) AS month,\n                    DAY(t.tdate) AS day, " . DTrans::sumQuantity('t') . " AS qty,\n                    SUM(t.total) AS ttl\n                FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p', 'INNER') . "\n                WHERE {$type_condition}\n                    AND t.tdate BETWEEN ? AND ?\n                GROUP BY YEAR(t.tdate),\n                    MONTH(t.tdate),\n                    DAY(t.tdate)\n                ORDER BY YEAR(t.tdate),\n                    MONTH(t.tdate),\n                    DAY(t.tdate)";
             break;
         case 'dept':
             $query = "\n                SELECT d.dept_no,\n                    d.dept_name, " . DTrans::sumQuantity('t') . " AS qty,\n                    SUM(t.total) AS ttl,\n                    s.superID\n                FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p', 'INNER') . DTrans::joinDepartments('t', 'd') . "\n                    LEFT JOIN MasterSuperDepts AS s ON d.dept_no=s.dept_ID\n                WHERE {$type_condition}\n                    AND t.tdate BETWEEN ? AND ?\n                GROUP BY d.dept_no,\n                    d.dept_name,\n                    s.superID\n                ORDER BY SUM(t.total) DESC";
             break;
     }
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($prep, $args);
     $ret = array();
     while ($row = $dbc->fetch_array($result)) {
         $record = array();
         if ($groupby == "date") {
             $record[] = $row['month'] . '/' . $row['day'] . '/' . $row['year'];
             $record[] = number_format($row['qty'], 2);
             $record[] = number_format($row['ttl'], 2);
         } else {
             for ($i = 0; $i < $dbc->num_fields($result); $i++) {
                 if ($dbc->field_name($result, $i) == 'qty' || $dbc->field_name($result, $i) == 'ttl') {
                     $row[$i] = sprintf('%.2f', $row[$i]);
                 }
                 $record[] .= $row[$i];
             }
         }
         $ret[] = $record;
     }
     return $ret;
 }
Example #11
0
function lookupItem($store, $sec, $subsec, $sh_set, $shelf, $loc)
{
    global $FANNIE_OP_DB;
    $dbc = FannieDB::get($FANNIE_OP_DB);
    $q = $dbc->prepare_statement("SELECT l.upc,p.description FROM prodPhysicalLocation AS l\n        " . DTrans::joinProducts('l') . "\n        WHERE l.store_id=? AND section=? AND subsection=?\n        AND shelf_set=? AND shelf=? AND location=?");
    $args = array($store, $sec, $subsec, $sh_set, $shelf, $loc);
    $r = $dbc->exec_statement($q, $args);
    $ret = array('upc' => '', 'description' => 'no item at this location');
    if ($dbc->num_rows($r) > 0) {
        $w = $dbc->fetch_row($r);
        $ret['upc'] = $w['upc'];
        $ret['description'] = $w['description'];
    }
    return $ret;
}
Example #12
0
 public function guessCode()
 {
     $dbc = $this->connection;
     // case 1: item exists in products
     $deptP = $dbc->prepare('
         SELECT d.salesCode
         FROM products AS p
             INNER JOIN departments AS d ON p.department=d.dept_no
         WHERE p.upc=?');
     $deptR = $dbc->execute($deptP, array($this->internalUPC()));
     if ($dbc->numRows($deptR)) {
         $w = $dbc->fetchRow($deptR);
         return $w['salesCode'];
     }
     $order = new PurchaseOrderModel($dbc);
     $order->orderID($this->orderID());
     $order->load();
     // case 2: item is SKU-mapped but the order record
     // does not reflect the internal PLU
     $deptP = $dbc->prepare('
         SELECT d.salesCode
         FROM vendorSKUtoPLU AS v
             ' . DTrans::joinProducts('v', 'p', 'INNER') . '
             INNER JOIN departments AS d ON p.department=d.dept_no
         WHERE v.sku=?
             AND v.vendorID=?');
     $deptR = $dbc->execute($deptP, array($this->sku(), $order->vendorID()));
     if ($dbc->numRows($deptR)) {
         $w = $dbc->fetchRow($deptR);
         return $w['salesCode'];
     }
     // case 3: item is not normally carried but is in a vendor catalog
     // that has vendor => POS department mapping
     $deptP = $dbc->prepare('
         SELECT d.salesCode
         FROM vendorItems AS v
             INNER JOIN vendorDepartments AS z ON v.vendorDept=z.deptID AND v.vendorID=z.vendorID
             INNER JOIN departments AS d ON z.posDeptID=d.dept_no
         WHERE v.sku=?
             AND v.vendorID=?');
     $deptR = $dbc->execute($deptP, array($this->sku(), $order->vendorID()));
     if ($dbc->numRows($deptR)) {
         $w = $dbc->fetchRow($deptR);
         return $w['salesCode'];
     }
     return false;
 }
Example #13
0
 function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $upc = $this->form->upc;
     if (is_numeric($upc)) {
         $upc = BarcodeLib::padUPC($upc);
     }
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $query = "SELECT \n                    MONTH(t.tdate),\n                    DAY(t.tdate),\n                    YEAR(t.tdate),\n                    t.upc,\n                    p.brand,\n                    p.description,\n                    " . DTrans::sumQuantity('t') . " AS qty,\n                    SUM(t.total) AS total\n                  FROM {$dlog} AS t \n                    " . DTrans::joinProducts('t', 'p', 'LEFT') . "\n                  WHERE t.upc = ? AND\n                    t.tdate BETWEEN ? AND ?\n                  GROUP BY \n                    YEAR(t.tdate),\n                    MONTH(t.tdate),\n                    DAY(t.tdate),\n                    t.upc,\n                    p.description\n                  ORDER BY year(t.tdate),month(t.tdate),day(t.tdate)";
     $args = array($upc, $date1 . ' 00:00:00', $date2 . ' 23:59:59');
     if (strtolower($upc) == "rrr" || $upc == "0000000000052") {
         if ($dlog == "dlog_90_view" || $dlog == "dlog_15") {
             $dlog = "transarchive";
         } else {
             $dlog = "trans_archive.bigArchive";
         }
         $query = "select MONTH(datetime),DAY(datetime),YEAR(datetime),\n                upc,'' AS brand,'RRR' AS description,\n                sum(case when upc <> 'rrr' then quantity when volSpecial is null or volSpecial > 9999 then 0 else volSpecial end) as qty,\n                sum(t.total) AS total from\n                {$dlog} as t\n                where upc = ?\n                AND datetime BETWEEN ? AND ?\n                and emp_no <> 9999 and register_no <> 99\n                and trans_status <> 'X'\n                GROUP BY YEAR(datetime),MONTH(datetime),DAY(datetime)\n                ORDER BY YEAR(datetime),MONTH(datetime),DAY(datetime)";
     } else {
         if (!is_numeric($upc)) {
             $dlog = DTransactionsModel::selectDTrans($date1, $date2);
             $query = "select MONTH(datetime),DAY(datetime),YEAR(datetime),\n                upc,'' AS brand, description,\n                sum(CASE WHEN quantity=0 THEN 1 ELSE quantity END) as qty,\n                sum(t.total) AS total from\n                {$dlog} as t\n                where upc = ?\n                AND datetime BETWEEN ? AND ?\n                and emp_no <> 9999 and register_no <> 99\n                and (trans_status <> 'X' || trans_type='L')\n                GROUP BY YEAR(datetime),MONTH(datetime),DAY(datetime)";
         }
     }
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($prep, $args);
     /**
       Simple report
     
       Issue a query, build array of results
     */
     $ret = array();
     while ($row = $dbc->fetch_array($result)) {
         $record = array();
         $record[] = $row[0] . "/" . $row[1] . "/" . $row[2];
         $record[] = $row['upc'];
         $record[] = $row['brand'] === null ? '' : $row['brand'];
         $record[] = $row['description'] === null ? '' : $row['description'];
         $record[] = sprintf('%.2f', $row['qty']);
         $record[] = sprintf('%.2f', $row['total']);
         $ret[] = $record;
     }
     return $ret;
 }
Example #14
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get('deptStart');
     $deptEnd = FormLib::get('deptEnd');
     $deptMulti = FormLib::get('departments', array());
     $buyer = FormLib::get('buyer', '');
     // args/parameters differ with super
     // vs regular department
     $args = array();
     $where = ' 1=1 ';
     if ($buyer !== '') {
         if ($buyer == -2) {
             $where .= ' AND s.superID != 0 ';
         } elseif ($buyer != -1) {
             $where .= ' AND s.superID=? ';
             $args[] = $buyer;
         }
     }
     if ($buyer != -1) {
         list($conditional, $args) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $args, 'p');
         $where .= $conditional;
     }
     $args[] = $date1 . ' 00:00:00';
     $args[] = $date2 . ' 23:59:59';
     $query = "SELECT MIN(CASE WHEN a.modified IS NULL THEN p.modified ELSE a.modified END) AS entryDate, \n            a.upc, p.description, p.department, d.dept_name\n            FROM products AS p INNER JOIN prodUpdate AS a ON a.upc=p.upc\n            LEFT JOIN departments AS d ON d.dept_no=p.department ";
     // join only needed with specific buyer
     if ($buyer !== '' && $buyer > -1) {
         $query .= 'LEFT JOIN superdepts AS s ON p.department=s.dept_ID ';
     } elseif ($buyer !== '' && $buyer == -2) {
         $query .= 'LEFT JOIN MasterSuperDepts AS s ON p.department=s.dept_ID ';
     }
     $query .= "WHERE {$where}\n            GROUP BY p.upc,p.description,p.department, d.dept_name\n            HAVING entryDate BETWEEN ? AND ?\n            ORDER BY entryDate";
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($query, $args);
     $data = array();
     while ($row = $dbc->fetch_row($result)) {
         $record = array($row['entryDate'], $row['upc'], $row['description'], $row['department'], $row['dept_name']);
         $data[] = $record;
     }
     return $data;
 }
Example #15
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get('deptStart');
     $deptEnd = FormLib::get('deptEnd');
     $deptMulti = FormLib::get('departments', array());
     $buyer = FormLib::get('buyer', '');
     // args/parameters differ with super
     // vs regular department
     $args = array($date1 . ' 00:00:00', $date2 . ' 23:59:59');
     $where = ' 1=1 ';
     if ($buyer !== '') {
         if ($buyer > -1) {
             $where .= ' AND s.superID=? ';
             $args[] = $buyer;
         } elseif ($buyer == -2) {
             $where .= ' AND s.superID <> 0 ';
         }
     }
     if ($buyer != -1) {
         list($conditional, $args) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $args);
         $where .= $conditional;
     }
     $tempTables = array('connection' => $dbc, 'clauses' => array(array('sql' => 'trans_type IN (?, ?)', 'params' => array('I', 'D'))));
     $dlog = DTransactionsModel::selectDlog($date1, $date2, $tempTables);
     $query = "SELECT year(tdate),month(tdate),day(tdate),\n          SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total,\n          SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty,\n          SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) /\n          SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage\n          FROM {$dlog} as d ";
     // join only needed with specific buyer
     if ($buyer !== '' && $buyer > -1) {
         $query .= 'LEFT JOIN superdepts AS s ON d.department=s.dept_ID ';
     } elseif ($buyer == -2) {
         $query .= 'LEFT JOIN MasterSuperDepts AS s ON d.department=s.dept_ID ';
     }
     $query .= "WHERE trans_type IN ('I','D')\n            AND tdate BETWEEN ? AND ?\n            AND {$where}\n            GROUP BY year(tdate),month(tdate),day(tdate)\n            ORDER BY year(tdate),month(tdate),day(tdate)";
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($query, $args);
     $data = array();
     while ($row = $dbc->fetch_row($result)) {
         $record = array(sprintf('%d/%d/%d', $row[1], $row[2], $row[0]), sprintf('%.2f', $row['total']), sprintf('%.2f', $row['qty']), sprintf('%.2f%%', $row['percentage'] * 100));
         $data[] = $record;
     }
     return $data;
 }
Example #16
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $vendor = FormLib::get_form_value('vendor', '');
     $groupby = FormLib::get_form_value('groupby', 'upc');
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $query = "";
     switch ($groupby) {
         case 'upc':
             $query = "\n                    SELECT t.upc,\n                        COALESCE(p.brand, x.manufacturer) AS brand,\n                        p.description, " . DTrans::sumQuantity('t') . " AS qty,\n                        SUM(t.total) AS ttl,\n                        d.dept_no,\n                        d.dept_name,\n                        s.super_name\n                    FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p', 'INNER') . DTrans::joinDepartments('t', 'd') . "\n                        LEFT JOIN vendors AS v ON p.default_vendor_id = v.vendorID\n                        LEFT JOIN prodExtra AS x ON p.upc=x.upc\n                        LEFT JOIN MasterSuperDepts AS s ON d.dept_no = s.dept_ID\n                    WHERE (v.vendorName LIKE ? OR x.distributor LIKE ?)\n                        AND t.tdate BETWEEN ? AND ?\n                    GROUP BY t.upc,\n                        COALESCE(p.brand, x.manufacturer),\n                        p.description,\n                        d.dept_no,\n                        d.dept_name,\n                        s.super_name\n                    ORDER BY SUM(t.total) DESC";
             break;
         case 'date':
             $query = "\n                    SELECT YEAR(t.tdate) AS year,\n                        MONTH(t.tdate) AS month,\n                        DAY(t.tdate) AS day, " . DTrans::sumQuantity('t') . " AS qty,\n                        SUM(t.total) AS ttl\n                    FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p') . "\n                        LEFT JOIN vendors AS v ON p.default_vendor_id = v.vendorID\n                        LEFT JOIN prodExtra AS x ON p.upc=x.upc\n                    WHERE (v.vendorName LIKE ? OR x.distributor LIKE ?)\n                        AND t.tdate BETWEEN ? AND ?\n                    GROUP BY YEAR(t.tdate),\n                        MONTH(t.tdate),\n                        DAY(t.tdate)\n                    ORDER BY YEAR(t.tdate),\n                        MONTH(t.tdate),\n                        DAY(t.tdate)";
             break;
         case 'dept':
             $query = "\n                    SELECT d.dept_no,\n                        d.dept_name, " . DTrans::sumQuantity('t') . " AS qty,\n                        SUM(t.total) AS ttl,\n                        s.super_name\n                    FROM {$dlog} AS t " . DTrans::joinProducts('t', 'p', 'INNER') . DTrans::joinDepartments('t', 'd') . "\n                        LEFT JOIN vendors AS v ON p.default_vendor_id = v.vendorID\n                        LEFT JOIN MasterSuperDepts AS s ON d.dept_no=s.dept_ID\n                        LEFT JOIN prodExtra AS x ON p.upc=x.upc\n                    WHERE (v.vendorName LIKE ? OR x.distributor LIKE ?)\n                        AND t.tdate BETWEEN ? AND ?\n                    GROUP BY d.dept_no,\n                        d.dept_name,\n                        s.super_name\n                    ORDER BY SUM(t.total) DESC";
             break;
     }
     $args = array('%' . $vendor . '%', '%' . $vendor . '%', $date1 . ' 00:00:00', $date2 . ' 23:59:59');
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($prep, $args);
     $ret = array();
     while ($row = $dbc->fetch_array($result)) {
         $record = array();
         if ($groupby == "date") {
             $record[] = $row['month'] . '/' . $row['day'] . '/' . $row['year'];
             $record[] = number_format($row['qty'], 2);
             $record[] = number_format($row['ttl'], 2);
         } else {
             for ($i = 0; $i < $dbc->num_fields($result); $i++) {
                 if ($dbc->field_name($result, $i) == 'qty' || $dbc->field_name($result, $i) == 'ttl') {
                     $row[$i] = number_format($row[$i], 2);
                 }
                 $record[] .= $row[$i];
             }
         }
         $ret[] = $record;
     }
     return $ret;
 }
Example #17
0
 public function run()
 {
     $dbc = FannieDB::get($this->config->get('OP_DB'));
     $yesterday = date('Y-m-d', strtotime('yesterday'));
     $url = $this->config->get('URL');
     $host = php_uname('n');
     $dtrans = DTransactionsModel::selectDTrans($yesterday);
     $findP = $dbc->prepare('
         SELECT d.upc,
             d.description,
             d.department,
             p.inUse,
             count(*) AS occurences
         FROM ' . $dtrans . ' AS d ' . DTrans::joinProducts('d') . '
         WHERE d.trans_type=\'L\'
             AND d.trans_subtype=\'OG\'
             AND d.charflag=\'IU\'
             AND d.emp_no <> 9999
             AND d.register_no <> 99
             AND d.datetime BETWEEN ? AND ?
         GROUP BY d.upc,
             d.description,
             d.department,
             p.inUse
         HAVING SUM(d.quantity) <> 0
     ');
     $findR = $dbc->execute($findP, array($yesterday . ' 00:00:00', $yesterday . ' 23:59:59'));
     while ($w = $dbc->fetchRow($findR)) {
         $msg = sprintf('%s (%s) was sold %d times while not inUse', $w['description'], $w['upc'], $w['occurences']);
         $email = \COREPOS\Fannie\API\lib\AuditLib::getAddresses($w['department']);
         if ($email) {
             $subject = 'Not In Use Report';
             $from = "From: automail\r\n";
             $msg .= "\n";
             $msg .= "http://{$host}/{$url}item/ItemEditorPage.php?searchupc={$w['upc']}\n";
             mail($email, $subject, $msg, $from);
         } else {
             $this->cronMsg($msg);
         }
     }
 }
Example #18
0
 /**
   Create a POS transaction
   @param $emp_no [int] employee ID
   @param $register_no [int] lane ID
   @param $lines [array] of records
 
   Each record is a set of key/value pairs 
   with the following keys:
   amount        => purchase amount
   department    => department ID#
   description   => text description
   card_no       => member ID#
 */
 public static function writeTransaction($emp_no, $register_no, $lines)
 {
     global $FANNIE_TRANS_DB;
     $dbc = FannieDB::get($FANNIE_TRANS_DB);
     $prep = $dbc->prepare('SELECT MAX(trans_no) FROM dtransactions
                         WHERE emp_no=? AND register_no=?');
     $result = $dbc->execute($prep, array($emp_no, $register_no));
     $trans_no = 1;
     if ($dbc->num_rows($result) > 0) {
         $row = $dbc->fetch_row($result);
         if ($row[0] != '') {
             $trans_no = $row[0] + 1;
         }
     }
     $record = DTrans::$DEFAULTS;
     $record['register_no'] = $register_no;
     $record['emp_no'] = $emp_no;
     $record['trans_no'] = $trans_no;
     $record['trans_id'] = 1;
     $record['trans_type'] = 'D';
     $record['quantity'] = 1.0;
     $record['ItemQtty'] = 1.0;
     $record['memType'] = 1;
     foreach ($lines as $line) {
         $record['total'] = sprintf('%.2f', $line['amount']);
         $record['unitPrice'] = sprintf('%.2f', $line['amount']);
         $record['regPrice'] = sprintf('%.2f', $line['amount']);
         $record['department'] = $line['department'];
         $record['description'] = substr($line['description'], 0, 30);
         $record['card_no'] = $line['card_no'];
         $record['upc'] = sprintf('%.2fDP%d', $line['amount'], $line['department']);
         $p = DTrans::parameterize($record, 'datetime', $dbc->now());
         $query = "INSERT INTO dtransactions ({$p['columnString']}) VALUES ({$p['valueString']})";
         $prep = $dbc->prepare($query);
         $write = $dbc->execute($prep, $p['arguments']);
         $record['trans_id']++;
     }
     return $emp_no . '-' . $register_no . '-' . $trans_no;
 }
Example #19
0
 public function run()
 {
     global $FANNIE_OP_DB, $FANNIE_TRANS_DB, $FANNIE_AR_DEPARTMENTS, $FANNIE_SERVER_DBMS;
     $dbc = FannieDB::get($FANNIE_TRANS_DB);
     $date = date('Y-m-t 23:59:59', mktime(0, 0, 0, date('n') - 1));
     $cn = 'SELECT CardNo FROM ' . $FANNIE_OP_DB . $dbc->sep() . 'custdata
         WHERE memType=4 and personNum=1';
     $r = $dbc->query($cn);
     $balQ = 'SELECT balance FROM ar_live_balance where card_no=?';
     $balP = $dbc->prepare($balQ);
     $tn = 1;
     while ($w = $dbc->fetch_row($r)) {
         $balR = $dbc->execute($balP, array($w['CardNo']));
         if ($balW = $dbc->fetch_row($balR)) {
             if ($balW[0] > 0) {
                 $record = DTrans::$DEFAULTS;
                 $datetime = date('\'Y-m-t 00:00:00\'', mktime(0, 0, 0, date('n') - 1));
                 $record['emp_no'] = 1001;
                 $record['register_no'] = 20;
                 $record['upc'] = $balW[0] . 'DP990';
                 $record['description'] = 'AR Payment';
                 $record['department'] = 990;
                 $record['quantity'] = 1;
                 $record['ItemQtty'] = 1;
                 $record['card_no'] = $w['CardNo'];
                 $record['regPrice'] = $balW[0];
                 $record['total'] = $balW[0];
                 $record['unitPrice'] = $balW[0];
                 $record['trans_no'] = $tn;
                 $record['trans_id'] = 1;
                 $info = DTrans::parameterize($record, 'datetime', $datetime);
                 $query = 'INSERT INTO dtransactions (' . $info['columnString'] . ') VALUES (' . $info['valueString'] . ')';
                 $prep = $dbc->prepare($query);
                 $result = $dbc->execute($prep, $info['arguments']);
                 $tn++;
             }
         }
     }
 }
Example #20
0
 function fetch_report_data()
 {
     global $FANNIE_OP_DB, $FANNIE_ARCHIVE_DB;
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get_form_value('deptStart', 0);
     $deptEnd = FormLib::get_form_value('deptEnd', 0);
     $deptMulti = FormLib::get('departments', array());
     $tempName = "TempNoMove";
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $tempQ = $dbc->prepare_statement("CREATE TABLE {$tempName} (upc varchar(13))");
     $dbc->exec_statement($tempQ);
     $insQ = $dbc->prepare("\n            INSERT INTO {$tempName}\n            SELECT d.upc FROM {$dlog} AS d\n            WHERE \n                d.tdate BETWEEN ? AND ?\n                AND d.trans_type='I'\n            GROUP BY d.upc");
     $dbc->exec_statement($insQ, array($date1 . ' 00:00:00', $date2 . ' 23:59:59'));
     $where = ' 1=1 ';
     $buyer = FormLib::get('super');
     $args = array();
     if ($buyer !== '') {
         if ($buyer == -2) {
             $where .= ' AND s.superID != 0 ';
         } elseif ($buyer != -1) {
             $where .= ' AND s.superID=? ';
             $args[] = $buyer;
         }
     }
     if ($buyer != -1) {
         list($conditional, $args) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $args, 'p');
         $where .= $conditional;
     }
     $query = "\n            SELECT p.upc,\n                p.brand,\n                p.description,\n                d.dept_no,\n                d.dept_name \n            FROM products AS p \n                LEFT JOIN departments AS d ON p.department=d.dept_no ";
     if ($buyer !== '' && $buyer > -1) {
         $query .= 'LEFT JOIN superdepts AS s ON p.department=s.dept_ID ';
     } elseif ($buyer !== '' && $buyer == -2) {
         $query .= 'LEFT JOIN MasterSuperDepts AS s ON p.department=s.dept_ID ';
     }
     $query .= " WHERE p.upc NOT IN (\n                SELECT upc FROM {$tempName}\n                )\n                AND {$where}\n                AND p.inUse=1\n            ORDER BY p.upc";
     $prep = $dbc->prepare($query);
     $result = $dbc->exec_statement($prep, $args);
     /**
       Simple report
     
       Issue a query, build array of results
     */
     $ret = array();
     while ($row = $dbc->fetch_array($result)) {
         $record = array();
         $record[] = $row[0];
         $record[] = $row[1];
         $record[] = $row[2];
         $record[] = $row[3];
         $record[] = $row[4];
         if ($this->report_format == 'html') {
             $record[] = sprintf('<a href="" id="del%s"
                     onclick="backgroundDeactivate(\'%s\');return false;">
                     Deactivate this item</a>', $row[0], $row[0]);
         } else {
             $record[] = '';
         }
         if ($this->report_format == 'html') {
             $record[] = sprintf('<a href="" id="del%s"
                     onclick="backgroundDelete(\'%s\',\'%s\');return false;">
                     Delete this item</a>', $row[0], $row[0], $row[1]);
         } else {
             $record[] = '';
         }
         $ret[] = $record;
     }
     $drop = $dbc->prepare_statement("DROP TABLE {$tempName}");
     $dbc->exec_statement($drop);
     return $ret;
 }
Example #21
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get('deptStart', 1);
     $deptEnd = FormLib::get('deptEnd', 1);
     $deptMulti = FormLib::get('departments', array());
     $buyer = FormLib::get('buyer', '');
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     /**
       Report Query notes:
       * Combining vendorName and prodExtra.distributor is a nod to
         legacy data. Eventually data should be fully normalized on
         products.default_vendor_id
       * Excluding prodExtra.distributor empty string combines those
         records with SQL NULL. Having two different "blank" rows
         is confusing for users.
       * Joins are only needed is a super department condition is 
         involved. WHERE clause changes similarly.
     */
     $query = '
         SELECT COALESCE(v.vendorName, x.distributor) AS vendor,
             ' . DTrans::sumQuantity('t') . ' AS qty,
             SUM(t.total) AS ttl
         FROM ' . $dlog . ' AS t
             ' . DTrans::joinProducts('t', 'p', 'LEFT') . '
             LEFT JOIN vendors AS v ON p.default_vendor_id=v.vendorID
             LEFT JOIN prodExtra AS x ON p.upc=x.upc 
             ';
     if ($buyer !== '' && $buyer > -1) {
         $query .= ' LEFT JOIN superdepts AS s ON t.department=s.dept_ID ';
     } elseif ($buyer !== '' && $buyer == -2) {
         $query .= ' LEFT JOIN MasterSuperDepts AS s ON t.department=s.dept_ID ';
     }
     $query .= '
         WHERE t.tdate BETWEEN ? AND ?
             AND t.trans_type IN (\'I\',\'D\') ';
     $args = array($date1 . ' 00:00:00', $date2 . ' 23:59:59');
     if ($buyer !== '') {
         if ($buyer == -2) {
             $query .= ' AND s.superID != 0 ';
         } elseif ($buyer != -1) {
             $query .= ' AND s.superID=? ';
             $args[] = $buyer;
         }
     }
     if ($buyer != -1) {
         list($conditional, $args) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $args, 't');
         $query .= $conditional;
     }
     $query .= '
         GROUP BY COALESCE(v.vendorName, x.distributor)
         ORDER BY SUM(total) DESC';
     $prep = $dbc->prepare($query);
     $result = $dbc->execute($prep, $args);
     $data = array();
     $total_sales = 0.0;
     while ($w = $dbc->fetch_row($result)) {
         $data[] = array($w['vendor'], sprintf('%.2f', $w['qty']), sprintf('%.2f', $w['ttl']), 0.0);
         $total_sales += $w['ttl'];
     }
     for ($i = 0; $i < count($data); $i++) {
         $data[$i][3] = sprintf('%.2f%%', $data[$i][2] / $total_sales * 100);
         $data[$i][2] = '$' . $data[$i][2];
     }
     return $data;
 }
Example #22
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $query = '';
     $from_where = FormLib::standardItemFromWhere();
     switch ($this->mode) {
         case 'PLU':
             $query = "\n                    SELECT t.upc,\n                        CASE WHEN p.description IS NULL THEN t.description ELSE p.description END as description, \n                        SUM(CASE WHEN trans_status IN('','0') THEN 1 WHEN trans_status='V' THEN -1 ELSE 0 END) as rings," . DTrans::sumQuantity('t') . " as qty,\n                        SUM(t.total) AS total,\n                        t.department,\n                        d.dept_name,\n                        m.super_name,\n                        COALESCE(v.vendorName,x.distributor) AS distributor\n                    " . $from_where['query'] . "\n                    GROUP BY t.upc,\n                        CASE WHEN p.description IS NULL THEN t.description ELSE p.description END,\n                        CASE WHEN t.trans_status='R' THEN 'Refund' ELSE 'Sale' END,\n                        t.department,\n                        d.dept_name,\n                        m.super_name,\n                        COALESCE(v.vendorName,x.distributor)\n                    ORDER BY SUM(t.total) DESC";
             break;
         case 'Department':
             $query = "\n                    SELECT t.department,\n                        d.dept_name, " . DTrans::sumQuantity('t') . " AS qty,\n                        SUM(total) AS total \n                    " . $from_where['query'] . "\n                    GROUP BY t.department,\n                        d.dept_name\n                    ORDER BY SUM(t.total) DESC";
             break;
         case 'Date':
             $query = "\n                    SELECT YEAR(t.tdate) AS year,\n                        MONTH(t.tdate) AS month,\n                        DAY(t.tdate) AS day, " . DTrans::sumQuantity('t') . " AS qty,\n                        SUM(total) AS total \n                    " . $from_where['query'] . "\n                    GROUP BY YEAR(t.tdate),\n                        MONTH(t.tdate),\n                        DAY(t.tdate)\n                    ORDER BY YEAR(t.tdate),\n                        MONTH(t.tdate),\n                        DAY(t.tdate)";
             break;
         case 'Weekday':
             $cols = $dbc->dayofweek("tdate") . " AS dayNumber,CASE \n                    WHEN " . $dbc->dayofweek("tdate") . "=1 THEN 'Sun'\n                    WHEN " . $dbc->dayofweek("tdate") . "=2 THEN 'Mon'\n                    WHEN " . $dbc->dayofweek("tdate") . "=3 THEN 'Tue'\n                    WHEN " . $dbc->dayofweek("tdate") . "=4 THEN 'Wed'\n                    WHEN " . $dbc->dayofweek("tdate") . "=5 THEN 'Thu'\n                    WHEN " . $dbc->dayofweek("tdate") . "=6 THEN 'Fri'\n                    WHEN " . $dbc->dayofweek("tdate") . "=7 THEN 'Sat'\n                    ELSE 'Err' END";
             $query = "\n                    SELECT " . $cols . " AS dayName, " . DTrans::sumQuantity('t') . " as qty,\n                        SUM(total) as total \n                    " . $from_where['query'] . "\n                    GROUP BY " . str_replace(' AS dayNumber', '', $cols) . "\n                    ORDER BY " . $dbc->dayofweek('t.tdate');
             break;
     }
     $prep = $dbc->prepare($query);
     $result = $dbc->execute($prep, $from_where['args']);
     $data = array();
     while ($row = $dbc->fetch_row($result)) {
         switch ($this->mode) {
             case 'PLU':
                 $data[] = array($row['upc'], $row['description'], $row['rings'], sprintf('%.2f', $row['qty']), sprintf('%.2f', $row['total']), $row['department'], $row['dept_name'], $row['super_name'], $row['distributor']);
                 break;
             case 'Department':
                 $data[] = array($row['department'], $row['dept_name'], sprintf('%.2f', $row['qty']), sprintf('%.2f', $row['total']));
                 break;
             case 'Date':
                 $tstamp = mktime(0, 0, 0, $row['month'], $row['day'], $row['year']);
                 $data[] = array(date('m/d/Y', $tstamp), date('l', $tstamp), sprintf('%.2f', $row['qty']), sprintf('%.2f', $row['total']));
                 break;
             case 'Weekday':
                 $data[] = array($row['dayNumber'], $row['dayName'], sprintf('%.2f', $row['qty']), sprintf('%.2f', $row['total']));
                 break;
         }
     }
     return $data;
 }
Example #23
0
if (strtotime($repDate) <= strtotime('2015-04-01')) {
    $countyTax = 0;
}
$taxQ = $dbc->prepare_statement("\nSELECT \n    (CASE WHEN d.tax = 1 THEN 'Non Deli Sales' ELSE 'Deli Sales' END) as type, \n    sum(total) as taxable_sales,\n    {$cityTax}*(sum(total)) as city_tax,\n    {$deliTax}*(sum(CASE WHEN d.tax = 2 THEN total ELSE 0 END)) as deli_tax,\n    {$stateTax}*(sum(total)) as state_tax,\n    {$countyTax}*(SUM(total)) AS county_tax\nFROM {$dlog} as d \nWHERE d.tdate BETWEEN ? AND ?\nAND d.tax <> 0 \nAND " . DTrans::isStoreID($store, 'd') . "\nGROUP BY d.tax ORDER BY d.tax DESC");
$taxR = $dbc->exec_statement($taxQ, $store_dates);
$taxes = array();
while ($row = $dbc->fetch_row($taxR)) {
    $taxes["{$row['0']}"] = array(-1 * $row['taxable_sales'], -1 * $row['city_tax'], -1 * $row['deli_tax'], -1 * $row['county_tax'], -1 * $row['state_tax'], -1 * ($row['city_tax'] + $row['county_tax'] + $row['state_tax'] + $row['deli_tax']));
}
echo "<br /><b>Sales Tax</b>";
echo WfcLib::tablify($taxes, array(0, 1, 2, 3, 4, 5, 6), array("&nbsp;", "Taxable Sales", sprintf("City Tax (%.2f%%)", $cityTax * 100), sprintf("Deli Tax (%.2f%%)", $deliTax * 100), sprintf("County Tax (%.2f%%)", $countyTax * 100), sprintf("State Tax (%.3f%%)", $stateTax * 100), "Total Tax"), array(WfcLib::ALIGN_LEFT, WfcLib::ALIGN_RIGHT | WfcLib::TYPE_MONEY, WfcLib::ALIGN_RIGHT | WfcLib::TYPE_MONEY, WfcLib::ALIGN_RIGHT | WfcLib::TYPE_MONEY, WfcLib::ALIGN_RIGHT | WfcLib::TYPE_MONEY, WfcLib::ALIGN_RIGHT | WfcLib::TYPE_MONEY, WfcLib::ALIGN_RIGHT | WfcLib::TYPE_MONEY));
$taxSumQ = $dbc->prepare_statement("SELECT  -1*sum(total) as tax_collected\nFROM {$dlog} as d \nWHERE d.tdate BETWEEN ? AND ?\nAND (d.upc = 'tax')\nAND " . DTrans::isStoreID($store, 'd') . "\nGROUP BY d.upc");
$taxSumR = $dbc->exec_statement($taxSumQ, $store_dates);
echo "<br /><b><u>Actual Tax Collected</u></b><br />";
echo sprintf("%.2f<br />", array_pop($dbc->fetch_row($taxSumR)));
$transQ = $dbc->prepare_statement("select q.trans_num,sum(q.quantity) as items,transaction_type, sum(q.total) from\n    (\n    select trans_num,card_no,quantity,total,\n        m.memdesc as transaction_type\n    from {$dlog} as d\n    left join custdata as c on d.card_no = c.cardno\n    left join memTypeID as m on c.memtype = m.memTypeID\n    WHERE d.tdate BETWEEN ? AND ?\n    AND trans_type in ('I','D')\n    and upc <> 'RRR'\n    and c.personNum=1\n    AND " . DTrans::isStoreID($store, 'd') . "\n    ) as q \n    group by q.trans_num,q.transaction_type");
$transR = $dbc->exec_statement($transQ, $store_dates);
$transinfo = array("Member" => array(0, 0.0, 0.0, 0.0, 0.0), "Non Member" => array(0, 0.0, 0.0, 0.0, 0.0), "Staff Member" => array(0, 0.0, 0.0, 0.0, 0.0), "Staff NonMem" => array(0, 0.0, 0.0, 0.0, 0.0));
while ($row = $dbc->fetch_array($transR)) {
    if (!isset($transinfo[$row[2]])) {
        continue;
    }
    $transinfo[$row[2]][0] += 1;
    $transinfo[$row[2]][1] += $row[1];
    $transinfo[$row[2]][3] += $row[3];
}
$tSum = 0;
$tItems = 0;
$tDollars = 0;
foreach (array_keys($transinfo) as $k) {
    $transinfo[$k][2] = round($transinfo[$k][1] / $transinfo[$k][0], 2);
Example #24
0
 /**
   Do whatever the service is supposed to do.
   Should override this.
   @param $args array of data
   @return an array of data
 */
 public function run($args = array())
 {
     $ret = array();
     if (!property_exists($args, 'field') || !property_exists($args, 'search')) {
         // missing required arguments
         $ret['error'] = array('code' => -32602, 'message' => 'Invalid parameters');
         return $ret;
     } else {
         if (strlen($args->search) < 1) {
             // search term is too short
             $ret['error'] = array('code' => -32602, 'message' => 'Invalid parameters');
             return $ret;
         }
     }
     $dbc = \FannieDB::getReadOnly(\FannieConfig::factory()->get('OP_DB'));
     switch (strtolower($args->field)) {
         case 'item':
             $res = false;
             if (!is_numeric($args->search)) {
                 $prep = $dbc->prepare('SELECT p.upc,
                                     p.description
                                    FROM products AS p
                                     LEFT JOIN productUser AS u ON u.upc=p.upc
                                    WHERE p.description LIKE ?
                                     OR p.brand LIKE ?
                                     OR u.description LIKE ?
                                     OR u.brand LIKE ?
                                    GROUP BY p.upc,
                                     p.description
                                    ORDER BY p.description');
                 $term = '%' . $args->search . '%';
                 $res = $dbc->execute($prep, array($term, $term, $term, $term));
             } elseif (ltrim($args->search, '0') != '') {
                 $prep = $dbc->prepare('
                 SELECT p.upc,
                     p.upc AS description
                 FROM products AS p
                 WHERE p.upc LIKE ?
                 GROUP BY p.upc');
                 $res = $dbc->execute($prep, array('%' . $args->search . '%'));
             }
             while ($res && ($row = $dbc->fetch_row($res))) {
                 $ret[] = array('label' => $row['description'], 'value' => $row['upc']);
             }
         case 'brand':
             $prep = $dbc->prepare('SELECT brand
                                FROM products
                                WHERE brand LIKE ?
                                GROUP BY brand
                                ORDER BY brand');
             $res = $dbc->execute($prep, array($args->search . '%'));
             while ($row = $dbc->fetch_row($res)) {
                 $ret[] = $row['brand'];
             }
             return $ret;
         case 'long_brand':
             $prep = $dbc->prepare('
             SELECT u.brand
             FROM productUser AS u
                 ' . DTrans::joinProducts('u', 'p', 'INNER') . '
             WHERE u.brand LIKE ?
             GROUP BY u.brand
             ORDER BY u.brand');
             $res = $dbc->execute($prep, array($args->search . '%'));
             while ($row = $dbc->fetch_row($res)) {
                 $ret[] = $row['brand'];
             }
             return $ret;
         case 'vendor':
             $prep = $dbc->prepare('SELECT vendorID,
                                 vendorName
                                FROM vendors
                                WHERE vendorName LIKE ?
                                ORDER BY vendorName');
             $res = $dbc->execute($prep, array($args->search . '%'));
             while ($row = $dbc->fetch_row($res)) {
                 $ret[] = $row['vendorName'];
             }
             if ($dbc->tableExists('prodExtra')) {
                 $prep = $dbc->prepare('SELECT distributor
                                    FROM prodExtra
                                    WHERE distributor LIKE ?
                                    GROUP BY distributor
                                    ORDER BY distributor');
                 $res = $dbc->execute($prep, array($args->search . '%'));
                 while ($row = $dbc->fetch_row($res)) {
                     if (!in_array($row['distributor'], $ret)) {
                         $ret[] = $row['distributor'];
                     }
                 }
             }
             return $ret;
         case 'mfirstname':
         case 'mlastname':
         case 'maddress':
         case 'mcity':
         case 'memail':
             return \COREPOS\Fannie\API\member\MemberREST::autoComplete($args->field, $args->search);
         case 'sku':
             $query = 'SELECT sku
                   FROM vendorItems
                   WHERE sku LIKE ? ';
             $param = array($args->search . '%');
             if (property_exists($args, 'vendor_id')) {
                 $query .= ' AND vendorID=? ';
                 $param[] = $args->vendor_id;
             }
             $query .= 'GROUP BY sku
                   ORDER BY sku';
             $prep = $dbc->prepare($query);
             $res = $dbc->execute($prep, $param);
             while ($row = $dbc->fetch_row($res)) {
                 $ret[] = $row['sku'];
                 if (count($ret) > 50) {
                     break;
                 }
             }
             return $ret;
         case 'unit':
             $query = '
             SELECT unitofmeasure
             FROM products
             WHERE unitofmeasure LIKE ?
             GROUP BY unitofmeasure
             ORDER BY unitofmeasure';
             $param = array($args->search . '%');
             $prep = $dbc->prepare($query);
             $res = $dbc->execute($prep, $param);
             while ($row = $dbc->fetchRow($res)) {
                 $ret[] = $row['unitofmeasure'];
                 if (count($ret) > 50) {
                     break;
                 }
             }
             return $ret;
         default:
             return $ret;
     }
 }
Example #25
0
 public function get_id_view()
 {
     $dbc = FannieDB::get($this->config->get('OP_DB'));
     $prep = $dbc->prepare("\n            SELECT m.sku,\n                m.upc,\n                v.description AS vendorDescript,\n                p.description as storeDescript\n            FROM VendorBreakdowns AS m\n                " . DTrans::joinProducts('m') . "\n                LEFT JOIN vendorItems AS v ON v.sku=m.sku AND v.vendorID=m.vendorID\n            WHERE m.vendorID = ?\n            ORDER BY m.upc\n        ");
     $ret = '';
     $ret .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="get">';
     $ret .= '<div class="form-group form-inline">
         <label>SKU</label>
         <input type="text" class="form-control" name="sku" placeholder="Vendor SKU" />
         <label>PLU/UPC</label>
         <input type="text" class="form-control" name="plu" placeholder="Our PLU" />
         <button type="submit" class="btn btn-default">Add Entry</button>
         <input type="hidden" name="id" value="' . $this->id . '" />
         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <a href="?id=' . $this->id . '&break=1" class="btn btn-default">Run Breakdowns</a>
         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <a href="VendorIndexPage.php?vid=' . $this->id . '" class="btn btn-default">Home</a>
         </div>
         </form>';
     $ret .= '<table class="table table-bordered">';
     $ret .= '<thead><tr>
         <th>Vendor SKU</th>
         <th>Our PLU</th>
         <th>Vendor Description</th>
         <th>Our Description</th>
         <th>&nbsp;</th>
         </tr></thead><tbody>';
     $res = $dbc->execute($prep, array($this->id));
     while ($row = $dbc->fetchRow($res)) {
         if (empty($row['vendorDescript'])) {
             $row['vendorDescript'] = '<span class="alert-danger">Discontinued by vendor?</span>';
         }
         if (empty($row['storeDescript'])) {
             $row['storeDescript'] = '<span class="alert-danger">Discontinued by us?</span>';
         }
         $ret .= sprintf('
             <tr>
                 <td>%s</td>
                 <td><a href="../ItemEditorPage.php?searchupc=%s">%s</a></td>
                 <td>%s</td>
                 <td>%s</td>
                 <td>
                     <a href="?_method=delete&id=%d&sku=%s&plu=%s" 
                     onclick="return confirm(\'Delete entry for PLU #%s?\');">%s</a>
                 </td>
             </tr>', $row['sku'], $row['upc'], $row['upc'], $row['vendorDescript'], $row['storeDescript'], $this->id, $row['sku'], $row['upc'], $row['upc'], FannieUI::deleteIcon());
     }
     $ret .= '</tbody></table>';
     $this->addScript('../../src/javascript/tablesorter/jquery.tablesorter.js');
     $this->addOnloadCommand("\$('.table').tablesorter([[1,0]]);\n");
     return $ret;
 }
Example #26
0
 function get_view()
 {
     global $FANNIE_OP_DB, $FANNIE_TRANS_DB;
     /**
       Excludes:
       Values with spaces (fixed in lanecode going forward)
       One and two digit PLUs (likely simply miskeys)
       Values with no leading zeroes (EAN-13 and UPC-A should have
         at least one. I do have some values with no leading zeroes
         but not sure yet what they are. Do not appear to be GTIN-14).
     */
     $dbc = FannieDB::get($FANNIE_OP_DB);
     $query = "SELECT t.upc, COUNT(t.upc) AS instances,\n                MIN(datetime) as oldest,\n                MAX(datetime) as newest,\n                p.description as prod,\n                MAX(v.description) as vend, MAX(n.vendorName) as vendorName, MAX(v.srp) as srp\n                FROM " . $FANNIE_TRANS_DB . $dbc->sep() . "transarchive AS t\n                    " . DTrans::joinProducts('t') . "\n                    LEFT JOIN vendorItems AS v ON t.upc=v.upc\n                    LEFT JOIN vendors AS n ON v.vendorID=n.vendorID\n                WHERE t.trans_type='L' AND t.description='BADSCAN'\n                AND t.upc NOT LIKE '% %'\n                AND t.upc NOT LIKE '00000000000%'\n                AND (t.upc NOT LIKE '00000000%' OR p.upc IS NOT NULL OR v.upc IS NOT NULL)";
     if ($this->date_restrict) {
         $query .= ' AND datetime >= ' . date('\'Y-m-d 00:00:00\'', strtotime('-8 days'));
     }
     $query .= "GROUP BY t.upc, p.description\n                ORDER BY t.upc DESC";
     if ($this->date_restrict == 2) {
         $query = str_replace('transarchive', 'dtransactions', $query);
     }
     $result = $dbc->query($query);
     $data = array();
     while ($row = $dbc->fetch_row($result)) {
         $data[] = $row;
     }
     // stick a total in the cache along with SQL results
     $dbc = FannieDB::get($FANNIE_TRANS_DB);
     $query = "SELECT COUNT(*) FROM transarchive WHERE trans_type='I' AND upc <> '0'";
     $result = $dbc->query($query);
     $row = $dbc->fetch_row($result);
     $data['itemTTL'] = $row[0];
     $ret = '';
     $ret .= '<div class="nav">';
     $ret .= '<a href="BadScanTool.php?lastquarter=1"
                 class="btn btn-default navbar-btn' . (!$this->date_restrict ? ' active' : '') . '">View Last Quarter</a>';
     $ret .= ' ';
     $ret .= '<a href="BadScanTool.php"
                 class="btn btn-default navbar-btn' . ($this->date_restrict == 1 ? ' active' : '') . '">View Last Week</a>';
     $ret .= ' ';
     $ret .= '<a href="BadScanTool.php?today=1"
                 class="btn btn-default navbar-btn' . ($this->date_restrict == 2 ? ' active' : '') . '">View Today</a>';
     $ret .= '</div>';
     $ret .= '<br /><b>Show</b>: ';
     $ret .= '<input type="radio" name="rdo" id="rdoa" onclick="showAll();" /> 
                 <label for="rdoa">All</label>';
     $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
     $ret .= '<input type="radio" name="rdo" id="rdom" onclick="showMultiple();" /> 
                 <label for="rdom">Repeats</label>';
     $ret .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
     $ret .= '<input type="radio" name="rdo" id="rdof" onclick="showFixable();" checked /> 
                 <label for="rdof">Fixable</label>';
     $ret .= '<br />';
     $ret .= '<div class="well">';
     $ret .= '<span class="alert-success">Green items have been entered in POS</span>. ';
     $ret .= '<span class="alert-danger">Red items can be added from vendor catalogs</span>. ';
     $ret .= '<span class="alert-info">Blue items can also be added from vendor catalogs but
             may not be needed. All scans are within a 5 minute window. May indicate a special
             order case scanned by mistake or a bulk purchase in a barcoded container.</span> ';
     $ret .= 'Other items are not identifiable with available information';
     $ret .= '</div>';
     $ret .= '<table id="scantable" class="table"><thead>';
     $ret .= '<tr id="tableheader"><th>UPC</th><th># Scans</th><th>Oldest</th><th>Newest</th>
             <th>In POS</th><th>In Vendor Catalog</th><th>SRP</th></tr>';
     $ret .= '</thead><tbody>';
     $scanCount = 0;
     foreach ($data as $row) {
         if (count($row) == 1) {
             // cached item total
             continue;
         }
         $css = '';
         $fixButton = '';
         $span = strtotime($row['newest']) - strtotime($row['oldest']);
         if (!empty($row['prod'])) {
             $css = 'class="fixed alert alert-success collapse"';
         } else {
             if (!empty($row['vend']) && !empty($row['srp'])) {
                 if ($span > 300) {
                     $css = 'class="fixable alert alert-danger"';
                 } else {
                     $css = 'class="semiFixable alert alert-info"';
                 }
                 $fixButton = ' <a href="ItemEditorPage.php?searchupc= ' . $row['upc'] . '" target="_new' . $row['upc'] . '">ADD</a>';
             } else {
                 if ($row['instances'] == 1) {
                     $css = 'class="loner collapse"';
                 } else {
                     $css = 'class="collapse"';
                 }
             }
         }
         $ret .= sprintf('<tr %s><td>%s</td><td>%d</td><td>%s</td><td>%s</td>
                         <td>%s</td><td>%s</td><td>%s</td>
                         <td><a href="OpenRingReceipts.php?upc=%s&date1=%s&date2=%s">View Receipts</a></td>
                         </tr>', $css, $row['upc'], $row['instances'], $row['oldest'], $row['newest'], !empty($row['prod']) ? "Yes ({$row['prod']})" : 'No', !empty($row['vend']) ? "Yes ({$row['vendorName']} {$row['vend']})" : 'No', !empty($row['srp']) ? $row['srp'] . $fixButton : 'n/a', $row['upc'], $row['oldest'], $row['newest']);
         $scanCount += $row['instances'];
     }
     $ret .= '</tbody></table>';
     $ret .= '<div id="ratio">';
     $ret .= sprintf('Approx. bad scan rate: %.2f%%', $data['itemTTL'] == 0 ? 0 : (double) $scanCount / ((double) $data['itemTTL'] != 0) * 100);
     $ret .= '</div>';
     $this->addScript('../src/javascript/tablesorter/jquery.tablesorter.min.js');
     $this->addOnloadCommand("\$('#scantable').tablesorter();\n");
     return $ret;
 }
Example #27
0
 public function fetch_report_data()
 {
     $dbc = $this->connection;
     $dbc->selectDB($this->config->get('OP_DB'));
     $date1 = $this->form->date1;
     $date2 = $this->form->date2;
     $deptStart = FormLib::get('deptStart');
     $deptEnd = FormLib::get('deptEnd');
     $deptMulti = FormLib::get('departments', array());
     $weekday = FormLib::get('weekday', 0);
     $buyer = FormLib::get('buyer', '');
     // args/parameters differ with super
     // vs regular department
     $args = array($date1 . ' 00:00:00', $date2 . ' 23:59:59');
     $where = ' 1=1 ';
     if ($buyer !== '') {
         if ($buyer == -2) {
             $where .= ' AND s.superID != 0 ';
         } elseif ($buyer != -1) {
             $where .= ' AND s.superID=? ';
             $args[] = $buyer;
         }
     }
     if ($buyer != -1) {
         list($conditional, $args) = DTrans::departmentClause($deptStart, $deptEnd, $deptMulti, $args);
         $where .= $conditional;
     }
     $date_selector = 'year(tdate), month(tdate), day(tdate)';
     $day_names = array();
     if ($weekday == 1) {
         $date_selector = $dbc->dayofweek('tdate');
         $timestamp = strtotime('next Sunday');
         for ($i = 1; $i <= 7; $i++) {
             $day_names[$i] = strftime('%a', $timestamp);
             $timestamp = strtotime('+1 day', $timestamp);
         }
     }
     $hour = $dbc->hour('tdate');
     $dlog = DTransactionsModel::selectDlog($date1, $date2);
     $query = "SELECT {$date_selector}, {$hour} as hour, \n                    sum(d.total) AS ttl, avg(d.total) as avg\n                  FROM {$dlog} AS d ";
     // join only needed with specific buyer
     // or all retail
     if ($buyer !== '' && $buyer > -1) {
         $query .= 'LEFT JOIN superdepts AS s ON d.department=s.dept_ID ';
     } elseif ($buyer !== '' && $buyer == -2) {
         $query .= 'LEFT JOIN MasterSuperDepts AS s ON d.department=s.dept_ID ';
     }
     $query .= "WHERE d.trans_type IN ('I','D')\n                    AND d.tdate BETWEEN ? AND ?\n                    AND {$where} ";
     if ($this->config->get('COOP_ID') == 'WFC_Duluth') {
         $query .= ' AND d.department NOT IN (993, 998, 703) ';
     }
     $query .= " GROUP BY {$date_selector}, {$hour}\n                   ORDER BY {$date_selector}, {$hour}";
     $prep = $dbc->prepare_statement($query);
     $result = $dbc->exec_statement($query, $args);
     $dataset = array();
     $minhour = 24;
     $maxhour = 0;
     while ($row = $dbc->fetch_row($result)) {
         $hour = (int) $row['hour'];
         $date = '';
         if ($weekday == 1) {
             $date = $day_names[$row[0]];
         } else {
             $date = sprintf('%d/%d/%d', $row[1], $row[2], $row[0]);
         }
         if (!isset($dataset[$date])) {
             $dataset[$date] = array();
         }
         $dataset[$date][$hour] = $row['ttl'];
         if ($hour < $minhour) {
             $minhour = $hour;
         }
         if ($hour > $maxhour) {
             $maxhour = $hour;
         }
     }
     /**
       # of columns is dynamic depending on the
       date range selected
     */
     $this->report_headers = array('Day');
     foreach ($dataset as $day => $info) {
         $this->report_headers[] = $day;
     }
     $this->report_headers[] = 'Total';
     $data = array();
     /**
       # of rows is dynamic depending when
       the store was open
     */
     for ($i = $minhour; $i <= $maxhour; $i++) {
         $record = array();
         $sum = 0;
         if ($i < 12) {
             $record[] = str_pad($i, 2, '0', STR_PAD_LEFT) . ':00 AM';
         } else {
             if ($i == 12) {
                 $record[] = $i . ':00 PM';
             } else {
                 $record[] = str_pad($i - 12, 2, '0', STR_PAD_LEFT) . ':00 PM';
             }
         }
         // each day's sales for the given hour
         foreach ($dataset as $day => $info) {
             $sales = isset($info[$i]) ? $info[$i] : 0;
             $record[] = sprintf('%.2f', $sales);
             $sum += $sales;
         }
         $record[] = sprintf('%.2f', $sum);
         $data[] = $record;
     }
     return $data;
 }
Example #28
0
    public function form_content()
    {
        $dbc = $this->connection;
        $dbc->selectDB($this->config->get('OP_DB'));
        $set = FormLib::get('deal-set');
        $optsR = $dbc->query('
            SELECT dealSet
            FROM CoopDealsItems
            GROUP BY dealSet
            ORDER BY MAX(coopDealsItemID) DESC');
        $opts = '';
        while ($optsW = $dbc->fetchRow($optsR)) {
            if ($set === '') {
                $set = $optsW['dealSet'];
            }
            $opts .= sprintf('<option %s>%s</option>', $set == $optsW['dealSet'] ? 'selected' : '', $optsW['dealSet']);
        }
        $query = $dbc->prepare_statement("\n            SELECT\n                t.upc,\n                p.brand,\n                p.description,\n                t.price,\n                CASE WHEN s.super_name IS NULL THEN 'sale' ELSE s.super_name END as batch,\n                t.abtpr as subbatch\n            FROM CoopDealsItems as t\n                " . DTrans::joinProducts('t', 'p', 'INNER') . "\n                LEFT JOIN MasterSuperDepts AS s ON p.department=s.dept_ID\n            WHERE t.dealSet=?\n                AND p.inUse=1\n            ORDER BY s.super_name,t.upc\n        ");
        $result = $dbc->exec_statement($query, array($set));
        $ret = "<form action=CoopDealsReviewPage.php method=post>\n        <div class=\"form-group\">\n            <label>Month</label>\n            <select name=\"deal-set\" class=\"form-control\" \n                onchange=\"location='?deal-set='+this.value;\">\n            " . $opts . "\n            </select>\n        </div>\n        <table class=\"table table-bordered table-striped tablesorter tablesorter-core small\">\n        <thead>\n        <tr><th>UPC</th><th>Brand</th><th>Desc</th><th>Sale Price</th>\n        <th>New Batch Name</th></tr>\n\n        </thead><tbody>";
        while ($row = $dbc->fetch_row($result)) {
            $ret .= sprintf('<tr>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%.2f</td>
                        <td><span class="superNameSpan">%s </span>Co-op Deals %s</td>
                        </tr>' . "\n", $row['upc'], $row['brand'], $row['description'], $row['price'], $row['batch'], $row['subbatch']);
        }
        $ret .= <<<html
        </tbody>
        </table><p />
        <div class="row form-horizontal form-group">
            <label class="col-sm-2 control-label">A Start</label>
            <div class="col-sm-4">
                <input type="text" name="start" id="start" class="form-control date-field" />
            </div>
            <label class="col-sm-2 control-label">B Start</label>
            <div class="col-sm-4">
                <input type="text" name="bstart" id="bstart" class="form-control date-field" />
            </div>
        </div>
        <div class="row form-horizontal form-group">
            <label class="col-sm-2 control-label">A End</label>
            <div class="col-sm-4">
                <input type="text" name="end" id="end" class="form-control date-field" />
            </div>
            <label class="col-sm-2 control-label">B End</label>
            <div class="col-sm-4">
                <input type="text" name="bend" id="bend" class="form-control date-field" />
            </div>
        </div>
        <div class="row form-horizontal form-group">
            <label class="col-sm-2 control-label">Month</label>
            <div class="col-sm-4">
                <input type="text" name="naming" class="form-control" value="{{set}}" />
            </div>
            <label class="col-sm-6">
                <input type="checkbox" name="group_by_superdepts" checked="true" 
                    onchange="\$('.superNameSpan').toggle(); " />
                Group sale batches by Superdepartment
            </label>
        </div>
        <p>    
            <button type=submit class="btn btn-default">Create Batch(es)</button>
            <a href="CoopDealsMergePage.php" class="pull-right btn btn-default">Merge New Items into Existing Batch(es)</a>
        </p>
        </form>
html;
        $ret = str_replace('{{set}}', $set, $ret);
        return $ret;
    }
Example #29
0
 public static function aggregateStruct(SQLManager $connection, $dlog, $start_date, $end_date, stdclass $where, $groupby = array())
 {
     $base_table = self::selectStruct($dlog, $start_date, $end_date);
     $dt_col = $dlog ? 'tdate' : 'datetime';
     $clone_table = $dlog ? 'dlog_15' : 'transarchive';
     /**
       Grouping is required
     */
     if (!is_array($groupby) || count($groupby) == 0) {
         return $base_table;
     }
     /**
       Validate group by columns
     */
     $model = new DTransactionsModel(null);
     $columns = $model->getColumns();
     $insert_cols = array();
     $select_cols = array();
     for ($i = 0; $i < count($groupby); $i++) {
         $group = $groupby[$i];
         if (isset($columns[$group])) {
             $insert_cols[] = $group;
             $select_cols[] = $group;
         } elseif (preg_match('/(.+)\\s+AS\\s+(\\w+)$/', $group, $matches)) {
             $col_definition = $matches[1];
             $col_alias = $matches[2];
             if (isset($columns[$col_alias])) {
                 $insert_cols[] = $col_alias;
                 $select_cols[] = $group;
                 $groupby[$i] = $col_definition;
             } else {
                 return $base_table;
             }
         } else {
             return $base_table;
         }
     }
     /**
       Always include a datetime column
     */
     if (!in_array($dt_col, $insert_cols)) {
         $insert_cols[] = $dt_col;
         $select_cols[] = 'MAX(' . $dt_col . ') AS ' . $dt_col;
     }
     /**
       Create randomly named temporary table based
       on the structure of dlog_15 or transachive
     */
     $config = FannieConfig::factory();
     $sep = $connection->sep();
     $random_name = uniqid('temp' . rand(1000, 9999));
     $temp_table = $config->get('ARCHIVE_DB') . $sep . $random_name;
     $clone_table = $config->get('TRANS_DB') . $sep . $clone_table;
     $temp_name = $connection->temporaryTable($temp_table, $clone_table);
     if ($temp_name === false) {
         return $base_table;
     }
     /**
       Build a query to insert aggregated rows into
       the temporary table
     */
     $query = 'INSERT INTO ' . $temp_name . '(';
     foreach ($insert_cols as $c) {
         $query .= $c . ',';
     }
     $query .= 'total, quantity) ';
     $query .= ' SELECT ';
     foreach ($select_cols as $c) {
         $query .= $c . ',';
     }
     /**
       Always aggregate by total & quantity
     */
     $query .= ' SUM(total) AS total, ' . DTrans::sumQuantity() . ' AS quantity
         FROM __TRANSACTION_TABLE__
         WHERE ' . $dt_col . ' BETWEEN ? AND ? ';
     $params = array($start_date . ' 00:00:00', $end_date . ' 23:59:59');
     /**
       Add a where clause if one has been specified
     */
     if (property_exists($where, 'sql') && is_array($where->sql)) {
         foreach ($where->sql as $sql) {
             $query .= ' AND ' . $sql;
         }
     }
     if (property_exists($where, 'params') && is_array($where->params)) {
         foreach ($where->params as $p) {
             $params[] = $p;
         }
     }
     /**
       Add the group by clause
     */
     $query .= ' GROUP BY ';
     foreach ($groupby as $group) {
         $query .= $group . ',';
     }
     $query = substr($query, 0, strlen($query) - 1);
     /**
       Split monthly archive union if needed
     */
     $source_tables = array();
     if (strstr($base_table, ' UNION ')) {
         preg_match_all('/\\s+FROM\\s+(\\w+)\\s+/', $base_table, $matches);
         foreach ($matches[1] as $m) {
             $source_tables[] = $m;
         }
     } else {
         $source_tables = array($base_table);
     }
     /**
       Load data into temporary table from source table(s)
       using built query
     */
     foreach ($source_tables as $source_table) {
         $insertQ = str_replace('__TRANSACTION_TABLE__', $source_table, $query);
         $prep = $connection->prepare($insertQ);
         if (!$connection->execute($prep, $params)) {
             return $base_table;
         }
     }
     return $temp_name;
 }
Example #30
0
 function finish_content()
 {
     if (!empty($this->errors)) {
         return $this->errors;
     }
     $ret = '';
     $trans_no = DTrans::getTransNo($this->connection, $this->CORRECTION_CASHIER, $this->CORRECTION_LANE);
     $params = array('card_no' => $this->cn, 'register_no' => $this->CORRECTION_LANE, 'emp_no' => $this->CORRECTION_CASHIER);
     DTrans::addOpenRing($this->connection, $this->dept1, -1 * $this->amount, $trans_no, $params);
     DTrans::addOpenRing($this->connection, $this->dept2, $this->amount, $trans_no, $params);
     $comment = FormLib::get_form_value('comment');
     if (!empty($comment)) {
         $params = array('description' => $comment, 'trans_type' => 'C', 'trans_subtype' => 'CM', 'card_no' => $this->cn, 'register_no' => $this->CORRECTION_LANE, 'emp_no' => $this->CORRECTION_CASHIER);
         DTrans::addItem($this->connection, $trans_no, $params);
     }
     $ret .= sprintf("Receipt #1: %s", $this->CORRECTION_CASHIER . '-' . $this->CORRECTION_LANE . '-' . $trans_no);
     return $ret;
 }