CORE-POS/IS4C

View on GitHub
fannie/batches/CAP/CoopDealsReviewPage.php

Summary

Maintainability
D
2 days
Test Coverage
F
18%
<?php
/*******************************************************************************

    Copyright 2009,2013 Whole Foods Co-op

    This file is part of CORE-POS.

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

    CORE-POS 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

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

include(dirname(__FILE__) . '/../../config.php');
if (!class_exists('FannieAPI')) {
    include_once(__DIR__ . '/../../classlib2.0/FannieAPI.php');
}

class CoopDealsReviewPage extends FanniePage 
{
    protected $title = "Fannie - CAP sales";
    protected $header = "Review Data";

    public $description = '[Co+op Deals Review] lists the currently load Co+op Deals data
    and can create sales batches from that data.';
    public $themed = true;

    protected $auth_classes = array('batches');
    protected $must_authenticate = true;
    
    private $mode = 'form';

    public function preprocess()
    {
        if (FormLib::get_form_value('start') !== '') {
            $this->mode = 'results';
        }

        return true;
    }

    public function body_content()
    {
        if ($this->mode == 'form') {
            return $this->form_content();
        } elseif ($this->mode == 'results') {
            return $this->results_content();
        }
    }

    public function results_content()
    {
        global $FANNIE_OP_DB;
        $dbc = FannieDB::get($FANNIE_OP_DB);
        $start = date('Y-m-d', strtotime(FormLib::get_form_value('start',date('Y-m-d'))));
        $end = date('Y-m-d', strtotime(FormLib::get_form_value('end',date('Y-m-d'))));
        $b_start = date('Y-m-d', strtotime(FormLib::get_form_value('bstart',date('Y-m-d'))));
        $b_end = date('Y-m-d', strtotime(FormLib::get_form_value('bend',date('Y-m-d'))));
        $naming = FormLib::get_form_value('naming','');
        $upcs = FormLib::get_form_value('upc',array());
        $set = FormLib::get('deal-set');
        $batchIDs = array();

        if( FormLib::get_form_value('group_by_superdepts','') == 'on' ){
            $superdept_grouping = "CASE WHEN s.super_name IS NULL THEN 'sale' ELSE s.super_name END";
        } else {
            $superdept_grouping = "";
        }

        list($upcIn, $args) = $dbc->safeInClause($upcs);
        $args[] = $set;

        $cdDef = $dbc->tableDefinition('CoopDealsItems');

        $saleItemsP = $dbc->prepare("
            SELECT t.upc,
                t.price,
                t.multiplier,"
                . $dbc->concat(
                    ($superdept_grouping ? $superdept_grouping : "''"),
                    ($superdept_grouping ? "' '" : "''"),
                    "'Co-op Deals '",
                    "t.abtpr",
                    ''
                ) . " AS batch,
                " . (isset($cdDef['cost']) ? 't.cost' : '0') . " AS cost
            FROM CoopDealsItems as t
                " . DTrans::joinProducts('t', 'p', 'INNER') . "
                LEFT JOIN MasterSuperDepts AS s ON p.department=s.dept_ID
            WHERE t.upc IN ({$upcIn})
                AND t.dealSet=?
            ORDER BY batch, t.upc
        ");
        $saleItemsR = $dbc->execute($saleItemsP, $args);

        $batchP = $dbc->prepare('
            INSERT INTO batches (
                batchName,
                batchType,
                discountType,
                priority,
                startDate,
                endDate,
                owner
            )
            VALUES (?, ?, ?, 0, ?, ?, ?)
        ');

        $blDef = $dbc->tableDefinition('batchList');
        $insQ = "INSERT INTO batchList (upc, batchID, salePrice, active, groupSalePrice, pricemethod, quantity";
        if (isset($blDef['signMultiplier'])) {
            $insQ .= ", signMultiplier";
        }
        if (isset($blDef['cost'])) {
            $insQ .= ", cost";
        }
        $insQ .= ") VALUES (?, ?, ?, 0, ?, ?, ?";
        if (isset($blDef['signMultiplier'])) {
            $insQ .= ", ?";
        }
        if (isset($blDef['cost'])) {
            $insQ .= ", ?";
        }
        $insQ .= ")";
        $insP = $dbc->prepare($insQ);

        //$bu = new BatchUpdateModel($dbc);
        $dbc->startTransaction();
        while ($row = $dbc->fetch_row($saleItemsR)) {
            if (!isset($batchIDs[$row['batch']])) {
                $args = array($row['batch'] . ' ' . $naming, 1, 1);
                if (substr($row['batch'],-2) == " A"){
                    $args[] = $start;
                    $args[] = $end;
                } else if (substr($row['batch'],-2) == " B") {
                    $args[] = $b_start;
                    $args[] = $b_end;
                } else {
                    $args[] = $start;
                    $args[] = $b_end;
                }
                list($firstWord) = explode(' ', $args[0]);
                $args[] = $firstWord;
    
                $dbc->execute($batchP,$args);
                $bID = $dbc->insertID();
                $batchIDs[$row['batch']] = $bID;
                //$bu->reset();
                //$bu->batchID($bID);
                //$bu->logUpdate(//$bu::UPDATE_CREATE);

                if ($this->config->get('STORE_MODE') === 'HQ') {
                    StoreBatchMapModel::initBatch($bID);
                }
            }
            $id = $batchIDs[$row['batch']];

            $args = array($row['upc'], $id, sprintf('%.2f', $row['price']));
            if ($row['multiplier'] == -3) {
                $args[] = sprintf('%.2f', $row['price']);
                $args[] = $this->config->get('BOGO_MODE', 2);
                $args[] = 2;
            } else {
                $args[] = null;
                $args[] = 0;
                $args[] = 0;
            }
            if (isset($blDef['signMultiplier'])) {
                $args[] = $row['multiplier'];
            }
            if (isset($blDef['cost'])) {
                $args[] = $row['cost'];
            }
            $dbc->execute($insP, $args);
            //$bu->reset();
            //$bu->upc($row['upc']);
            //$bu->batchID($id);
            //$bu->logUpdate(//$bu::UPDATE_ADDED);
        }
        $dbc->commitTransaction();

        $ret = "<p>New sales batches have been created!</p>";
        $ret .= "<p><a href=\"../newbatch/\">View batches</a></p>";

        $cbs = $this->config->get('BATCH_CALLBACKS');
        foreach ($cbs as $cb) {
            $obj = new $cb();
            $obj->run(array_values($batchIDs));
        }

        return $ret;
    }

    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("
            SELECT
                t.upc,
                p.brand,
                p.description,
                t.price,
                MAX(CASE WHEN s.super_name IS NULL THEN 'sale' ELSE s.super_name END) as batch,
                t.abtpr as subbatch
            FROM CoopDealsItems as t
                " . DTrans::joinProducts('t', 'p', 'INNER') . "
                LEFT JOIN MasterSuperDepts AS s ON p.department=s.dept_ID
            WHERE t.dealSet=?
            GROUP BY t.upc,
                p.brand,
                p.description,
                t.price,
                t.abtpr
            ORDER BY batch,t.upc
        ");
        $result = $dbc->execute($query, array($set));

        $ret = "<form action=CoopDealsReviewPage.php method=post>
        <div class=\"form-group\">
            <label>Month</label>
            <select name=\"deal-set\" class=\"form-control\" 
                onchange=\"location='?deal-set='+this.value;\">
            " . $opts . "
            </select>
        </div>
        <table class=\"table table-bordered table-striped tablesorter tablesorter-core small\">
        <thead>
        <tr><th>UPC</th><th>Brand</th><th>Desc</th><th>Sale Price</th>
        <th>New Batch Name</th></tr>\n
        </thead><tbody>";
        while ($row = $dbc->fetch_row($result)) {
            $ret .= sprintf('<input type="hidden" name="upc[]" value="%s" />', $row['upc']);
            $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;
    }
    
    public function helpContent()
    {
        return '<p>This tool creates A, B, and TPR batches. The TPR batches will
            start on <em>A Start</em> and end on <em>B End</em>. The Month field
            is used in batch names. For example, if Month is <em>January</em>, 
            batches will have names like <em>Co+op Deals January A</em>.</p>
            <p><em>Group sale batches by superdepartment</em> means create 
            separate sales batches for each appicable superdepartment rather
            than having a single A batch, single B batch, and single TPR
            batch.</p>
            ';
    }

    public function unitTest($phpunit)
    {
        $phpunit->assertNotEquals(0, strlen($this->body_content()));
    }
}

FannieDispatch::conditionalExec();