CORE-POS/IS4C

View on GitHub
fannie/modules/plugins2.0/RP/RpSegmentation.php

Summary

Maintainability
D
2 days
Test Coverage
<?php

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

class RpSegmentation extends FannieRESTfulPage
{
    protected $header = 'Segmentation';
    protected $title = 'Segmentation';

    public function preprocess()
    {
        $this->addRoute('get<segID><store>', 'post<segID><store>');

        return parent::preprocess();
    }

    protected function post_segID_store_handler()
    {
        $json = array('err' => false, 'msg' => '');

        $days = FormLib::get('day', array());
        $segment = array();
        foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $i => $day) {
            $segment[$day] = isset($days[$i]) ? $days[$i] / 100 : 0;
        }
        $sales = FormLib::get('sales');
        $sales = str_replace(',', '', $sales);
        $retain = FormLib::get('retention');

        $ts = strtotime($this->segID);
        $ts = mktime(0, 0, 0, date('n', $ts), date('j', $ts), date('Y', $ts) - 1);
        $direction = date('N', $ts) <= 4 ? -1 : 1;
        while (date('N', $ts) != 1) {
            $ts = mktime(0, 0, 0, date('n', $ts), date('j', $ts) + $direction, date('Y', $ts));
        }
        $lyStart = date('Y-m-d', $ts);
        $lyEnd = date('Y-m-d', mktime(0, 0, 0, date('n', $ts), date('j', $ts) + 6, date('Y', $ts)));
        $dlog = DTransactionsModel::selectDlog($lyStart, $lyEnd);
        $DoW = $this->connection->dayofweek('tdate');
        $prep = $this->connection->prepare("SELECT {$DoW} AS DoW, SUM(total) AS ttl
            FROM {$dlog} AS d
                INNER JOIN MasterSuperDepts AS m ON d.department=m.dept_ID
            WHERE d.trans_type in ('I', 'D')
                AND m.superID=6
                AND d.store_id=?
                AND d.tdate BETWEEN ? AND ?
            GROUP BY {$DoW}
            ORDER BY {$DoW}");
        $args = array($this->store, $lyStart, $lyEnd . ' 23:59:59');
        $rows = $this->connection->getAllRows($prep, $args);
        $lastYear = array('Mon'=>0, 'Tue'=>0, 'Wed'=>0, 'Thu'=>0, 'Fri'=>0, 'Sat'=>0, 'Sun'=>0);
        foreach ($rows as $row) {
            switch ($row['DoW']) {
                case 1:
                    $lastYear['Sun'] = round($row['ttl'], 2);
                    break;
                case 2:
                    $lastYear['Mon'] = round($row['ttl'], 2);
                    break;
                case 3:
                    $lastYear['Tue'] = round($row['ttl'], 2);
                    break;
                case 4:
                    $lastYear['Wed'] = round($row['ttl'], 2);
                    break;
                case 5:
                    $lastYear['Thu'] = round($row['ttl'], 2);
                    break;
                case 6:
                    $lastYear['Fri'] = round($row['ttl'], 2);
                    break;
                case 7:
                    $lastYear['Sat'] = round($row['ttl'], 2);
                    break;
            }
        }

        $existsP = $this->connection->prepare("SELECT rpSegmentID FROM RpSegments WHERE storeID=? AND startDate=?");
        $exists = $this->connection->getValue($existsP, array($this->store, $this->segID));
        if ($exists) {
            $prep = $this->connection->prepare("UPDATE RpSegments SET sales=?, retention=?, segmentation=?, lastYear=? WHERE rpSegmentID=?");
            $saved = $this->connection->execute($prep, array($sales, $retain, json_encode($segment), json_encode($lastYear), $exists));
        } else {
            $prep = $this->connection->prepare("INSERT INTO RpSegments
                (storeID, startDate, sales, retention, segmentation, lastYear) VALUES (?, ?, ?, ?, ?, ?)");
            $saved = $this->connection->execute($prep, array($this->store, $this->segID, $sales, $retain, json_encode($segment), json_encode($lastYear)));
        }

        $json['err'] = $saved ? false : true;
        echo json_encode($json);

        return false;
    }

    protected function get_segID_store_handler()
    {
        $ts = strtotime($this->segID);
        if ($ts === false || date('N', $ts) != 1) {
            echo '<div class="alert alert-danger">Not a valid week</div>';
            return false;
        }

        $prep = $this->connection->prepare("SELECT * FROM RpSegments WHERE storeID=? AND startDate=?");
        $row = $this->connection->getRow($prep, array($this->store, $this->segID));
        $plan = 0;
        $retain = 60;
        $json = array();
        if ($row) {
            $plan = $row['sales'];
            $retain = $row['retention'];
            $json = json_decode($row['segmentation'], true);
        }

        $ret = '<p><table class="table table-bordered table-striped small">';
        $ret .= sprintf('<tr><th>Sales</th>
            <th><input type="text" name="sales" value="%s" class="form-control" /></th></tr>',
            number_format($plan));
        $ret .= sprintf('<tr><th>Retention</th><th><div class="input-group">
            <input type="text" name="retention" value="%s" class="form-control"
                style="z-index: 1;" />
            <span class="input-group-addon">%%</span></th></tr>',
            number_format($retain));
        $sum = 0;
        foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) {
            $ret .= sprintf('<tr><td>%s</td>
                <td><div class="input-group">
                    <input type="text" name="day[]" class="form-control plan-day" value="%.2f"
                        style="z-index: 0;" onchange="reSumPlan();" />
                    <span class="input-group input-group-addon">%%</span>
                </div></td></tr>',
                $day,
                isset($json[$day]) ? $json[$day] * 100 : 0);
            $sum += isset($json[$day]) ? $json[$day] : 0;
        }
        $ret .= sprintf('<tr><td></td><td id="sumPercents">%.2f%%</td></tr>', $sum*100);
        $ret .= '</table></p>';
        $ret .= '<p><button type="submit" class="btn btn-default">Save</button></p>';
        $ret .= '<p><textarea id="copyPaste" placeholder="paste here" onchange="
            var arr = $(this).val().split(\'\n\');
            console.log(arr);
            $(\'input.plan-day\').each(function () {
                $(this).val(arr.shift().replace(\'%\',\'\'));
                $(this).trigger(\'change\');
            });
            "></textarea></p>';

        echo $ret;

        return false;
    }

    protected function get_id_handler()
    {
        $prep = $this->connection->prepare("
            SELECT *
            FROM " . FannieDB::fqn('SuperWeeklySales', 'plugin:WarehouseDatabase') . "
            WHERE storeID=?
                AND startDate=?
                AND superID=6");
        $row = $this->connection->getRow($prep, array(FormLib::get('store'), $this->id));
        if (!$row) {
            echo '<div class="alert alert-danger">Data not found</div>';
            return false;
        }

        $ret = '<table class="table table-bordered table-striped small">';
        $ret .= '<tr><th>Sales</th><th>All</th><th>$' . number_format($row['total']) . '</th></tr>';
        $json = json_decode($row['segmentation'], true);
        foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) {
            $ret .= sprintf('<tr><td>%s</td><td>%.2f%%</td><td>$%s</td></tr>',
                $day, $json[$day] * 100, number_format($row['total'] * $json[$day]));
        }
        $ret .= '</table>';

        echo $ret;

        return false;
    }

    protected function get_view()
    {
        $backLink = isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'RpDirectPage.php')
            ? 'RpDirectPage.php'
            : 'RpOrderPage.php';
        $store = FormLib::get('store');
        if (!$store) {
            $store = COREPOS\Fannie\API\lib\Store::getIdByIp();
        }
        $sSelect = FormLib::storePicker();
        $sSelect['html'] = str_replace('<select', '<select onchange="location=\'RpSegmentation.php?store=\' + this.value;"', $sSelect['html']);
        $ts = time();
        while (date('N', $ts) != 1) {
            $ts = mktime(0, 0, 0, date('n', $ts), date('j', $ts) - 1, date('Y', $ts));
        }
        $monday = date('Y-m-d', $ts);

        $segs = '';
        $prep = $this->connection->prepare("SELECT * FROM RpSegments WHERE storeID=? ORDER BY startDate DESC");
        $res = $this->connection->getAllRows($prep, array($store));
        $segID = FormLib::get('segID', false);
        $cur = false;
        foreach ($res as $row) {
            $segs .= sprintf('<option %s value="%d">%s</option>',
                ($row['rpSegmentID'] == $segID ? 'selected' : ''),
                $row['rpSegmentID'], $row['startDate']);
            if ($row['rpSegmentID'] == $segID) {
                $cur = $row;
            } elseif ($cur === false) {
                $cur = $row;
            }
        }
        $this->addOnloadCommand("\$('#segID').trigger('change');");

        return <<<HTML
<div class="row">
    <div class="col-sm-5">
    <p>
        <h3>Plan</h3>
        <div id="msgArea"></div>
        <form id="segForm" onsubmit="saveSegment(); return false;">
        <label>Store:</label> {$sSelect['html']}
        <label>Week of:</label>
        <input type="text" class="form-control date-field" id="segID" name="segID"
            onchange="getPlan(this.value, {$store});" value="{$monday}" />
        <div id="segFields"></div>
        </form>
    </p>
    </div>
    <div class="col-sm-5">
    <p>
        <h3>Actual</h3>
        <label>Week of:</label>
        <input type="text" class="form-control date-field" 
            onchange="getHistory(this.value, {$store});" />
        <div id="historyDiv"></div>
    </p>
    <p>
        <a href="{$backLink}" class="btn btn-default">Back to Order Guide</a>
    </p>
    </div>
</div>
HTML;
    }

    protected function javascriptContent()
    {
        return <<<JAVASCRIPT
function getPlan(start, store) {
    var dstr = 'segID=' + start + '&store=' + store;
    $.ajax({
        type: 'get',
        data: dstr
    }).done(function (resp) {
        $('#segFields').html(resp);
    });
}
function getHistory(start, store) {
    var dstr = 'id=' + start + '&store=' + store;
    $.ajax({
        type: 'get',
        data: dstr
    }).done(function (resp) {
        $('#historyDiv').html(resp);
    });
}
function saveSegment() {
    var dstr = $('#segForm').serialize();
    $.ajax({
        'type': 'post',
        'data': dstr,
        'dataType': 'json'
    }).done(function (resp) {
        if (resp.err) {
            showBootstrapAlert('#msgArea', 'danger', 'Error saving segment');
        } else {
            showBootstrapAlert('#msgArea', 'success', 'Saved segment');
        }
    });
}
function reSumPlan() {
    var sum = 0;
    $('input.plan-day').each(function () {
        sum += ( $(this).val() * 1 );
    });
    sum = Math.round(sum * 100) / 100;
console.log(sum);
    $('#sumPercents').html(sum + '%');
}
JAVASCRIPT;
    }
}

FannieDispatch::conditionalExec();