CORE-POS/IS4C

View on GitHub
fannie/modules/plugins2.0/MyWeb/models/MyReceiptsModel.php

Summary

Maintainability
B
5 hrs
Test Coverage
<?php

use COREPOS\Fannie\API\item\ItemText;

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

    Copyright 2017 Whole Foods Co-op

    This file is part of CORE-POS.

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

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

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

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

/**
  @class MyReceiptsModel
*/
class MyReceiptsModel extends BasicModel
{
    protected $name = "MyReceipts";

    protected $columns = array(
    'myReceiptID' => array('type'=>'INT', 'increment'=>true, 'primary_key'=>true),
    'customerID' => array('type'=>'INT', 'index'=>true),
    'posReceiptID' => array('type'=>'VARCHAR(255)'),
    'description' => array('type'=>'VARCHAR(255)'),
    'quantity' => array('type'=>'DECIMAL(10,2)'),
    'price' => array('type'=>'MONEY'),
    'tdate' => array('type'=>'DATETIME'),
    'seqID' => array('type'=>'INT'),
    );

    public function etl($config)
    {
        $settings = $config->get('PLUGIN_SETTINGS');
        $mydb = $settings['MyWebDB'] . $this->connection->sep();
        $opdb = $config->get('OP_DB') . $this->connection->sep();
        $transdb = $config->get('TRANS_DB') . $this->connection->sep();

        $clearP = $this->connection->prepare("DELETE FROM {$mydb}MyReceipts WHERE tdate < ?");
        $clearR = $this->connection->execute($clearP, array(date('Y-m-d', strtotime('90 days ago'))));

        $dateP = $this->connection->prepare("SELECT MAX(tdate) FROM {$mydb}MyReceipts");
        $maxDate = $this->connection->getValue($dateP);
        if (!$maxDate) {
            $maxDate = date('Y-m-d', strtotime('90 days ago'));
        }
        //echo "$maxDate\n";

        $insP = $this->connection->prepare("INSERT INTO {$mydb}MyReceipts
            (customerID, posReceiptID, description, quantity, price, tdate, seqID)
            VALUES (?, ?, ?, ?, ?, ?, ?)");

        $query = "SELECT t.upc,
                t.date_id,
                t.tdate,
                t.quantity,
                t.total,
                t.trans_id,
                t.store_id,
                t.card_no,
                t.trans_num,
                " . ItemText::longBrandSQL() . ",
                " . ItemText::longDescriptionSQL('u', 't') . "
            FROM {$transdb}dlog_90_view AS t
                LEFT JOIN {$opdb}products AS p ON t.upc=p.upc AND t.store_id=p.store_id
                LEFT JOIN {$opdb}productUser AS u ON t.upc=u.upc
            WHERE card_no=?
                AND tdate > ?
            ORDER BY tdate DESC";
        $prep = $this->connection->prepare($query);
        $this->connection->startTransaction();
        $memP = $this->connection->prepare("SELECT DISTINCT card_no FROM {$transdb}dlog_90_view AS d
            LEFT JOIN {$opdb}custdata AS c ON d.card_no=c.CardNo
            WHERE c.personNum=1 AND c.type='PC' AND tdate > ?");
        $memR = $this->connection->execute($memP, array($maxDate));
        $num = $this->connection->numRows($memR);
        $count = 1;
        while ($memW = $this->connection->fetchRow($memR)) {
            //echo "$count/$num\r";
            $limiter = array();
            $res = $this->connection->execute($prep, array($memW['card_no'], $maxDate));
            while ($row = $this->connection->fetchRow($res)) {
                $mem = $row['card_no'];
                if (count($limiter) >= 10) {
                    continue;
                }
                $fullID = $row['date_id'] . '-' . $row['store_id'] . '-' . $row['trans_num'];
                $limiter[$fullID] = true;
                list($tdate,) = explode(' ', $row['tdate'], 2);
                $desc = $row['description'];
                if (!empty($row['brand'])) {
                    $desc = $row['brand'] . ' ' . $desc;
                }
                $this->connection->execute($insP, array(
                    $mem,
                    $fullID,
                    $desc,
                    $row['quantity'],
                    $row['total'],
                    $tdate,
                    $row['trans_id'],
                ));
            }
            $count++;
        }
        //echo "\n";
        $this->connection->commitTransaction();
    }

}