CORE-POS/IS4C

View on GitHub
fannie/reports/Members/MembersReport.php

Summary

Maintainability
C
1 day
Test Coverage
C
77%
<?php
include(dirname(__FILE__) . '/../../config.php');
if (!class_exists('FannieAPI')) {
    include(dirname(__FILE__) . '/../../classlib2.0/FannieAPI.php');
}

class MembersReport extends FannieReportPage
{
    protected $header = 'Members Report';
    protected $title = 'Members Report';
    protected $report_headers = array('#', 'First Name', 'Last Name', 'Total Equity', 'Start', 'End', 'Inactive');
    protected $required_fields = array('type');
    protected $no_sort_but_style = true;

    public $description = '[Members Report] lists members by type with active status and equity balance';
    public $report_set = 'Membership';
    public $themed = true;

    function fetch_report_data()
    {
        $dbc = $this->connection;
        $dbc->selectDB($this->config->get('OP_DB'));

        $inType = '';
        $args = array();
        if (!is_array($this->form->type)) {
            $this->form->type = array($this->form->type);
        }
        foreach ($this->form->type as $memType) {
            $inType .= '?,';
            $args[] = $memType; 
        }
        $inType = substr($inType, 0, strlen($inType)-1);
        $suspended = FormLib::get('suspended', 1);

        $trans = $this->config->get('TRANS_DB');
        if ($dbc->dbmsName() == 'mssql') {
            $trans .= ".dbo";
        }
        $q = $dbc->prepare("
            SELECT c.CardNo,
                CASE WHEN m.start_date IS NULL THEN n.startdate ELSE m.start_date END AS startdate,
                m.end_date AS enddate,
                c.FirstName,
                c.LastName,
                CASE WHEN s.type = 'I' THEN 1 ELSE 0 END AS isInactive,
                CASE WHEN r.textStr IS NULL THEN s.reason ELSE r.textStr END as reason,
                CASE WHEN n.payments IS NULL THEN 0 ELSE n.payments END as equity
            FROM custdata AS c 
                LEFT JOIN memDates AS m ON m.card_no = c.CardNo AND c.personNum=1
                LEFT JOIN {$trans}.equity_history_sum AS n ON c.CardNo=n.card_no AND c.personNum=1
                LEFT JOIN suspensions AS s ON c.CardNo=s.cardno AND c.personNum=1
                LEFT JOIN reasoncodes AS r ON s.reasonCode & r.mask <> 0
            WHERE c.Type <> 'TERM' 
                AND (c.memType IN ($inType) OR s.memtype1 IN ($inType))
                AND c.personNum=1
                " . ($suspended == 0 ? ' AND s.cardno IS NULL ' : '') . "
            ORDER BY c.CardNo
        ");
        $arg_count = count($args);
        for ($i=0; $i<$arg_count; $i++) {
            $args[] = $args[$i];
        }
        $r = $dbc->execute($q, $args);

        $candidateDepts = array();
        if (preg_match_all("/[0-9]+/",$this->config->get('EQUITY_DEPARTMENTS'),$matches)) {
            $candidateDepts = array_pop($matches);
        }
        list($inDept, $deptArgs) = $dbc->safeInClause($candidateDepts);
        $pEq = $dbc->prepare("
            SELECT 
                card_no AS CardNo,
                dept,
                dept_name,
                SUM(stockPurchase) AS ttl
            FROM " . FannieDB::fqn('stockpurchases', 'trans') . " AS s
                INNER JOIN departments AS d ON s.dept=d.dept_no
            WHERE dept IN ($inDept)
            GROUP BY card_no, dept, dept_name
            ORDER BY dept");
        $rEq = $dbc->execute($pEq, $deptArgs);
        $equitySum = array();
        $depts = array();
        while ($w = $dbc->fetch_row($rEq)) {
            $cardno = $w['CardNo'];
            if (!isset($equitySum[$cardno])) {
                $equitySum[$cardno] = array();
            }
            $equitySum[$cardno][$w['dept']] = $w['ttl'];
            if (!isset($depts[$w['dept']])) {
                $depts[$w['dept']] = $w['dept_name'];
            }
        }
        if (count($depts) > 1) {
            foreach ($depts as $id=>$name) {
                $this->report_headers[] = $name;
            }
        }

        $saveW = array();
        $data = array();
        $r = $dbc->execute($q, $args);
        while ($w = $dbc->fetch_row($r)) {
            $record = $this->formatRow($w);
            if (count($depts) > 1) {
                foreach ($depts as $id=>$name) {
                    if (isset($equitySum[$w['CardNo']]) && isset($equitySum[$w['CardNo']][$id])) {
                        $record[] = sprintf('%.2f', $equitySum[$w['CardNo']][$id]);
                    } else {
                        $record[] = 0;
                    }
                }
            }
            $data[] = $record;
        }

        return $data;
    }

    private function formatRow($arr)
    {
        $ret = array(
            $arr['CardNo'],
            $arr['FirstName'],
            $arr['LastName'],
            $arr['equity'],
        );
        if (date('Y', strtotime($arr['startdate'])) < 1900) {
            $ret[] = '';
        } else {
            $ret[] = date('m/d/Y', strtotime($arr['startdate']));
        }
        if (date('Y', strtotime($arr['enddate'])) < 1900) {
            $ret[] = '';
        } else {
            $ret[] = date('m/d/Y', strtotime($arr['enddate']));
        }
        $ret[] = ($arr['isInactive'] == 1) ? $arr['reason'] : '';

        return $ret;
    }

    public function report_description_content()
    {
        $dbc = $this->connection;
        $dbc->selectDB($this->config->get('OP_DB'));
        $memtypes = new MemtypeModel($dbc);
        $ret = 'List of: ';
        if (!is_array($this->form->type)) {
            $this->form->type = array($this->form->type);
        }
        foreach ($this->form->type as $type) {
            $memtypes->memtype($type);
            $memtypes->load();
            $ret .= $memtypes->memDesc() . ', ';
        }

        return array($ret);
    }

    public function form_content()
    {
        $dbc = $this->connection;
        $dbc->selectDB($this->config->get('OP_DB'));
        $memtypes = new MemtypeModel($dbc);
        ob_start();
        ?>
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
        <div class="panel panel-default">
            <div class="panel-heading">Include these Types</div>
        <div class="panel panel-body">
        <?php 
        foreach ($memtypes->find('memtype') as $m) {
            printf('
                <div class="form-group">
                    <label>
                        <input type="checkbox" class="checkbox-inline"
                            name="type[]" value="%d" %s />
                        %s
                    </label>
                </div>',
                $m->memtype(),
                ($m->custdataType() == 'PC') ? 'checked' : '',
                $m->memDesc()
            );
        }
        ?>
        <div class="form-group">
            <select name="suspended" class="form-control">
                <option value="1">Include suspended accounts</option>
                <option value="0">Exclude suspended accounts</option>
            </select>
        </div>
        <p>
            <button type="submit" class="btn btn-default">List Members</button>
        </p>
        </div> <!-- panel-body -->
        </div> <!-- panel -->
        </form>
        <?php

        return ob_get_clean();
    }

    public function helpContent()
    {
        return '<p>
            List members by type or types as well as
            equity balance and active status information.
            </p>';
    }
}

FannieDispatch::conditionalExec();