コード例 #1
0
ファイル: Submissions.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     $start = Arr::get($_GET, 'start') ? strtotime($_GET['start']) : strtotime('this week', strtotime('this week') > time() ? strtotime('yesterday') : time());
     $end = Arr::get($_GET, 'end') ? strtotime($_GET['end']) + 86399 : time();
     $query = array('update_time' => array('$gt' => intval($start), '$lt' => intval($end)));
     if (Arr::get($_GET, 'app-start')) {
         $query['process_time']['$gt'] = strtotime($_GET['app-start']);
     }
     if (Arr::get($_GET, 'app-end')) {
         $query['process_time']['$lt'] = strtotime($_GET['app-end']) + 86399;
     }
     if (Group::current('allow_assign')) {
         $companies = DB::select('id', 'name')->from('companies')->order_by('name', 'asc')->execute()->as_array('id', 'name');
     }
     if (!Group::current('allow_assign') || Arr::get($_GET, 'company')) {
         $query['user_id'] = array('$in' => DB::select('id')->from('users')->where('company_id', '=', Group::current('allow_assign') ? $_GET['company'] : User::current('company_id'))->execute()->as_array(NULL, 'id'));
     }
     $jobs = array();
     if (Arr::get($_GET, 'finished')) {
         $jobs['data.245'] = $_GET['finished'];
     }
     if (Arr::get($_GET, 'ticket')) {
         $tickets = explode(',', $_GET['ticket']);
         $q = array();
         foreach ($tickets as $ticket) {
             $ticket = preg_replace('/[^a-z0-9]/i', '', strval($ticket));
             if (!$ticket) {
                 continue;
             }
             if (preg_match('/^T1W[0-9]{12}$/', $ticket)) {
                 $q[] = $ticket;
             } else {
                 $q[] = new MongoRegex('/.*' . $ticket . '.*/i');
             }
         }
         if (count($q) > 1) {
             $jobs['_id'] = array('$in' => $q);
         } elseif ($q) {
             $jobs['_id'] = $q[0];
         }
     }
     if (Arr::get($_GET, 'fsa')) {
         $values = is_array($_GET['fsa']) ? $_GET['fsa'] : explode(',', $_GET['fsa']);
         $jobs['data.12'] = count($values) > 1 ? array('$in' => array_values($values)) : current($values);
     }
     if (Arr::get($_GET, 'fsam')) {
         $values = is_array($_GET['fsam']) ? $_GET['fsam'] : explode(',', $_GET['fsam']);
         $jobs['data.13'] = count($values) > 1 ? array('$in' => array_values($values)) : current($values);
     }
     if (Arr::get($_GET, 'fda')) {
         $values = is_array($_GET['fda']) ? $_GET['fda'] : explode(',', $_GET['fda']);
         $jobs['data.14'] = count($values) > 1 ? array('$in' => array_values($values)) : current($values);
     }
     if (Arr::get($_GET, 'address')) {
         $jobs['data.8'] = new MongoRegex('/.*' . strval($_GET['address']) . '.*/mi');
     }
     if ($jobs) {
         if (count($jobs) == 1 && isset($jobs['_id'])) {
             $query['job_key'] = $jobs['_id'];
         } else {
             $query['job_key'] = array('$in' => Database_Mongo::collection('jobs')->distinct('_id', $jobs));
         }
     }
     $sort = array('job_key' => 1);
     if (!Arr::get($_GET, 'sort')) {
         $_GET['sort'] = array('-submission');
     }
     foreach ($_GET['sort'] as $s) {
         $dir = substr($s, 0, 1) == '-' ? -1 : 1;
         $s = substr($s, 1);
         switch ($s) {
             case 'submission':
                 $sort['update_time'] = $dir;
                 break;
             case 'approval':
                 $sort['process_time'] = $dir;
                 break;
         }
     }
     $result = Database_Mongo::collection('submissions')->find($query)->sort($sort);
     $submissions = array();
     $users = array();
     foreach ($result as $submission) {
         $submissions[$submission['job_key']][] = $submission;
         $users[$submission['user_id']] = 1;
     }
     if ($users) {
         User::get(array_keys($users));
     }
     if (isset($_GET['export'])) {
         header('Content-type: text/csv');
         header('Content-disposition: filename="Submissions.' . date('Ymd', $start) . '-' . date('Ymd', $end) . '.' . date('YmdHi', time()) . '.csv"');
         $file = tmpfile();
         $headers = array('Tickets ID', 'FDA ID', 'LOC ID', 'Address', 'Submission Date', 'Approval Date', 'User');
         if (Group::current('allow_assign')) {
             $headers[] = 'Company';
         }
         $headers[] = 'Column';
         $headers[] = 'Value';
         fputcsv($file, $headers);
         $result = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => array_keys($submissions))), array('data.8' => 1, 'data.9' => 1, 'data.14' => 1));
         $jobs = array();
         foreach ($result as $job) {
             $jobs[$job['_id']] = array('a' => Arr::path($job, 'data.8', ''), 'f' => Arr::path($job, 'data.14', ''), 'l' => Arr::path($job, 'data.9', ''));
         }
         foreach ($submissions as $job => $list) {
             foreach ($list as $submission) {
                 $key = substr($submission['key'], 5);
                 $data = array($job, Arr::path($jobs, array($job, 'f')), Arr::path($jobs, array($job, 'l')), Arr::path($jobs, array($job, 'a')), date('d-m-Y H:i', $submission['update_time']), Arr::get($submission, 'process_time') ? date('d-m-Y H:i', $submission['process_time']) : '', User::get($submission['user_id'], 'login'));
                 if (Group::current('allow_assign')) {
                     $data[] = Arr::get($companies, User::get($submission['user_id'], 'company_id'), 'Unknown');
                 }
                 $data[] = Columns::get_name($key);
                 $data[] = Columns::output($submission['value'], Columns::get_type($key), true);
                 fputcsv($file, $data);
             }
         }
         fseek($file, 0);
         fpassthru($file);
         fclose($file);
         die;
     } elseif (isset($_GET['export2'])) {
         //header('Content-type: text/plain');
         header('Content-type: text/csv');
         header('Content-disposition: filename="Submissions.' . date('Ymd', $start) . '-' . date('Ymd', $end) . '.' . date('YmdHi', time()) . '.csv"');
         $result = array();
         $columns = array();
         foreach ($submissions as $job => $list) {
             foreach ($list as $submission) {
                 $key = substr($submission['key'], 5);
                 $result[$job][$submission['update_time']][$submission['user_id']][$key] = $submission['value'];
                 $columns[$key] = Columns::get_name($key);
             }
         }
         $submissions = $result;
         ksort($columns);
         $headers = array('Tickets ID', 'FDA ID', 'LOC ID', 'Address', 'Submission Date', 'User');
         if (Group::current('allow_assign')) {
             $headers[] = 'Company';
         }
         /*$columns = Columns::get_visible();*/
         foreach ($columns as $column) {
             $headers[] = $column;
         }
         $columns = array_keys($columns);
         $result = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => array_keys($submissions))), array('data.8' => 1, 'data.9' => 1, 'data.14' => 1));
         $jobs = array();
         foreach ($result as $job) {
             $jobs[$job['_id']] = array('f' => Arr::path($job, 'data.14', ''), 'l' => Arr::path($job, 'data.9', ''), 'a' => Arr::path($job, 'data.8', ''));
         }
         $file = tmpfile();
         fputcsv($file, $headers);
         foreach ($submissions as $job => $list) {
             foreach ($list as $time => $values) {
                 foreach ($values as $user => $submission) {
                     $row = array($job, Arr::path($jobs, $job . '.f'), Arr::path($jobs, $job . '.l'), Arr::path($jobs, $job . '.a'), date('d-m-Y H:i', $time), User::get($user, 'login'));
                     if (Group::current('allow_assign')) {
                         $row[] = Arr::get($companies, User::get($user, 'company_id'));
                     }
                     foreach ($columns as $column) {
                         $row[] = Columns::output(Arr::get($submission, $column, ''), Columns::get_type($column), true);
                     }
                     fputcsv($file, $row);
                 }
             }
         }
         fseek($file, 0);
         fpassthru($file);
         fclose($file);
         //print_r($result);
         die;
     } elseif (isset($_GET['export3'])) {
         //header('Content-type: text/plain');
         header('Content-type: text/csv');
         header('Content-disposition: filename="Submissions.' . date('Ymd', $start) . '-' . date('Ymd', $end) . '.' . date('YmdHi', time()) . '.csv"');
         $result = array();
         foreach ($submissions as $job => $list) {
             foreach ($list as $submission) {
                 $key = substr($submission['key'], 5);
                 $result[$job][$submission['update_time']][$submission['user_id']][$key] = $submission['value'];
             }
         }
         $submissions = $result;
         $headers = array('Tickets ID', 'FDA ID', 'LOC ID', 'Address', 'Submission Date', 'User');
         if (Group::current('allow_assign')) {
             $headers[] = 'Company';
         }
         $columns = Columns::get_visible();
         foreach ($columns as $column) {
             $headers[] = $column;
         }
         $columns = array_keys($columns);
         $result = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => array_keys($submissions))), array('data.8' => 1, 'data.9' => 1, 'data.14' => 1));
         $jobs = array();
         foreach ($result as $job) {
             $jobs[$job['_id']] = array('f' => Arr::path($job, 'data.14', ''), 'l' => Arr::path($job, 'data.9', ''), 'a' => Arr::path($job, 'data.8', ''));
         }
         $file = tmpfile();
         fputcsv($file, $headers);
         foreach ($submissions as $job => $list) {
             foreach ($list as $time => $values) {
                 foreach ($values as $user => $submission) {
                     $row = array($job, Arr::path($jobs, $job . '.f'), Arr::path($jobs, $job . '.l'), Arr::path($jobs, $job . '.a'), date('d-m-Y H:i', $time), User::get($user, 'login'));
                     if (Group::current('allow_assign')) {
                         $row[] = Arr::get($companies, User::get($user, 'company_id'));
                     }
                     foreach ($columns as $column) {
                         $row[] = Arr::get($submission, $column) ? Columns::output($submission[$column], Columns::get_type($column), true) : '';
                     }
                     fputcsv($file, $row);
                 }
             }
         }
         fseek($file, 0);
         fpassthru($file);
         fclose($file);
         //print_r($result);
         die;
     }
     $result = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => array_keys($submissions))), array('data.8' => 1, 'data.9' => 1, 'data.14' => 1));
     $jobs = array();
     foreach ($result as $job) {
         $jobs[$job['_id']] = array('f' => Arr::path($job, 'data.14', ''), 'l' => Arr::path($job, 'data.9', ''), 'a' => Arr::path($job, 'data.8', ''));
     }
     $view = View::factory("Reports/Submissions")->bind('companies', $companies)->bind('submissions', $submissions)->bind('jobs', $jobs);
     $this->response->body($view);
 }
コード例 #2
0
        <td><?=User::get(Arr::get($ticket, 'user_id'), 'login') ? : 'Unknown'?></td>
        <td><a href="<?=URL::base() . 'imex/discrepancies?file=' . urlencode($ticket['filename'])?>"><?=HTML::chars($ticket['filename'])?></a></td>
        <?php foreach ($reports as $key => $name):?>
        <td><?=Columns::output(Arr::path($ticket, 'static.'.$key), Columns::get_type($key))?></td>
        <?php endforeach;?>
        <td>
            <table class="table subtable">
                <tr class="same-yellow">
                    <th>Column name</th>
                    <th>Old value</th>
                    <th>New value</th>
                    <th>Current value</th>
                </tr>
                <?php foreach($ticket['data'] as $id => $value): $date = Columns::get_type($id) == 'date';?>
                <tr class="submission <?=$value['old_value'] != $ticket['current'][$id] ? 'rose' : 'same-yellow' . (isset($_GET['discrepancy']) ? ' hidden' : '')?>">
                    <td><?=HTML::chars(Columns::get_name($id));?></td>
                    <td><?=HTML::chars($date ? date("d-m-Y H:i", $value['old_value'] ? : 0) : $value['old_value'])?></td>
                    <td><?=HTML::chars($date ? date("d-m-Y H:i", $value['new_value'] ? : 0) : $value['new_value'])?></td>
                    <td><?=HTML::chars($date ? date("d-m-Y H:i", $ticket['current'][$id] ? : 0) : $ticket['current'][$id])?></td>
                </tr>
                <?php endforeach;?>
            </table>
        </td>
    </tr>
    <?php endforeach;?>
</table>
<div class="col-xs-12 text-center">
<?php if (Pager::pages() > 1) echo $pager = View::factory('Pager');?>
</div>
<div class="col-xs-12">
    <a class="pull-right btn btn-simple export-button" data-url="<?=URL::base()?>imex/discrepancies/export" href="javascript:;"><span class="glyphicon glyphicon-export"></span>Export to CSV</a>
コード例 #3
0
ファイル: Reports.php プロジェクト: nikulinsanya/exeltek
 public function action_export()
 {
     $id = $this->request->param('id');
     if ($id == 'all') {
         ini_set('memory_limit', '4G');
     }
     $result = $this->get_results($id == 'all');
     $reports = array();
     foreach (Columns::get_static() as $column => $value) {
         $reports[$column] = Columns::get_name($column);
     }
     $file = tmpfile();
     $actions = array('1' => 'Created', '2' => 'Updated', '3' => 'Removed');
     $data = array('Ticket ID', 'Date', 'Action', 'File name');
     foreach ($reports as $id => $name) {
         $data[] = $name;
     }
     $data[] = "Column name";
     $data[] = "Old value";
     $data[] = "New value";
     fputcsv($file, $data);
     foreach ($result as $ticket) {
         $ticket['update_time'] = date('d-m-Y H:i', $ticket['update_time']);
         $ticket['type'] = Arr::get($actions, $ticket['update_type'], 'Unknown');
         $data = array($ticket['job_key'], $ticket['update_time'], $ticket['type'], $ticket['filename']);
         foreach ($reports as $id => $name) {
             $data[] = Columns::output(Arr::path($ticket, 'static.' . $id), Columns::get_type($id), true);
         }
         if ($ticket['update_type'] == 2) {
             if ($ticket['data']) {
                 $base = $data;
                 foreach ($ticket['data'] as $key => $value) {
                     $data = $base;
                     $date = Columns::get_type($key) == 'date';
                     $data[] = Columns::get_name($key);
                     $data[] = $date && $value['old_value'] ? date('d-m-Y H:i', $value['old_value']) : $value['old_value'];
                     $data[] = $date && $value['new_value'] ? date('d-m-Y H:i', $value['new_value']) : $value['new_value'];
                     fputcsv($file, $data);
                 }
             } else {
                 $data[] = "Non-relevant";
                 fputcsv($file, $data);
             }
         } else {
             $data[] = "N/A";
             fputcsv($file, $data);
         }
     }
     rewind($file);
     header('Content-type: text/csv');
     header('Content-disposition: filename=Export.csv');
     fpassthru($file);
     fclose($file);
     die;
 }
コード例 #4
0
ファイル: Submissions.php プロジェクト: nikulinsanya/exeltek
        <th class="sortable" data-id="submission">Submission date</th>
        <th class="sortable" data-id="approval">Approval date</th>
        <th>User</th>
        <?php if (Group::current('allow_assign')):?><th>Company</th><?php endif;?>
        <th>Column</th>
        <th>Value</th>
    </tr>
    <?php foreach ($submissions as $job => $list):?>
        <tr class="text-center">
            <th colspan="<?=(Group::current('allow_assign')) ? 6 : 5?>">
                <a href="<?=URL::base()?>search/view/<?=$job?>"><?=$job?>, <?=Arr::path($jobs, array($job, 'l'))?>, <?=Arr::path($jobs, array($job, 'f'))?>, <?=Arr::path($jobs, array($job, 'a'))?></a>
            </th>
        </tr>

        <?php foreach ($list as $submission): $key = substr($submission['key'], 5); $status = Arr::get($submission, 'active', 0);?>
            <tr class="text-center <?=$status > 0 ? 'yellow' : ($status < 0 ? 'lgreen' : 'rose')?>">
                <td><?=date('d-m-Y H:i', $submission['update_time'])?></td>
                <td><?=isset($submission['process_time']) ? date('d-m-Y H:i', $submission['process_time']) : ''?></td>
                <td><?=User::get($submission['user_id'], 'login')?></td>
                <?php if (Group::current('allow_assign')):?><td><?=Arr::get($companies, User::get($submission['user_id'], 'company_id'), 'Unknown')?></td><?php endif;?>
                <td><?=Columns::get_name($key)?></td>
                <td class="<?=strlen(Columns::output($submission['value'], Columns::get_type($key))) > 2 ? 'shorten' : ''?>"><?=Columns::output($submission['value'], Columns::get_type($key))?></td>
            </tr>
        <?php endforeach;?>
    <?php endforeach;?>
</table>
<div class="upload-buttons text-right">
    <a href="?export&company=<?=Arr::get($_GET, 'company')?>&start=<?=Arr::get($_GET, 'start', date('d-m-Y', $week))?>&end=<?=Arr::get($_GET, 'end', date('d-m-Y'))?>" class="btn btn-info"><span class="glyphicon glyphicon-export"></span> Export</a>
    <a href="?export2&company=<?=Arr::get($_GET, 'company')?>&start=<?=Arr::get($_GET, 'start', date('d-m-Y', $week))?>&end=<?=Arr::get($_GET, 'end', date('d-m-Y'))?>" class="btn btn-primary"><span class="glyphicon glyphicon-export"></span> Export grouped</a>
    <a href="?export3&company=<?=Arr::get($_GET, 'company')?>&start=<?=Arr::get($_GET, 'start', date('d-m-Y', $week))?>&end=<?=Arr::get($_GET, 'end', date('d-m-Y'))?>" class="btn btn-warning"><span class="glyphicon glyphicon-export"></span> Export all columns</a>
</div>
コード例 #5
0
ファイル: Form.php プロジェクト: nikulinsanya/exeltek
        <tr>
            <td>
                <label>Job ID:</label>
                <div>
                    <?=$job['_id']?>
                </div>
            </td>
            <td class="extra"></td>
        </tr>
        <?php $index = 0;foreach (Form::$static_title as $column):?>
            <?php if (0 == $index++ % 2) :?>
                <tr>
                <?php $tdIndex=0;?>
            <?php endif; ?>
                <td>
                    <label class="control-label"><?=Columns::get_name($column)?>:</label>
                    <div>
                        <?=Columns::output(Arr::get($job['data'], $column), Columns::get_type($column))?>
                    </div>
                </td>

            <?php if ($tdIndex++==0 && sizeof(Form::$static_title) == $index): ?>
                <td class="extra"></td>
            <?php endif; ?>

            <?php if (0 == $index % 2) :?>
                </tr>
            <?php endif; ?>
        <?php endforeach;?>
    </table>
コード例 #6
0
ファイル: Export.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     if (!Group::current('allow_reports')) {
         throw new HTTP_Exception_403('Forbidden');
     }
     $regions = DB::select('id', 'name')->from('regions')->execute()->as_array('id', 'name');
     $groups = DB::select('id', 'name')->from('groups')->execute()->as_array('id', 'name');
     $form = new Form();
     $form->add('region', 'Region', Form::SELECT, array('' => 'Please, select region') + $regions, array('not_empty'));
     if (isset($_POST['group']) && isset($_POST['csv'])) {
         if (isset($_POST['job'])) {
             $query = array('_id' => array('$in' => array_keys($_POST['job'])));
             $region = array('name' => 'PARTIAL');
         } else {
             if (!Arr::get($_POST, 'region')) {
                 throw new HTTP_Exception_404('Not found');
             }
             $region = DB::select('id', 'name')->from('regions')->where('id', '=', $_POST['region'])->execute()->current();
             $query = array('region' => $region['id']);
         }
         $jobs = Database_Mongo::collection('jobs')->find($query);
         $columns = array();
         $csv = $_POST['csv'];
         if ($_POST['group']) {
             if (Group::get($_POST['group'], 'is_admin')) {
                 $result = DB::select('id')->from('job_columns')->execute()->as_array(NULL, 'id');
             } else {
                 $result = DB::select('column_id')->from('group_columns')->where('group_id', '=', $_POST['group'])->and_where('permissions', '>', 0)->execute()->as_array(NULL, 'column_id');
             }
             if ($csv != 'none') {
                 foreach ($result as $column) {
                     if ($csv == 'all' || !($csv == 'csv' xor Columns::get_csv($column))) {
                         $columns[$column] = Columns::get_name($column);
                     }
                 }
             }
         } else {
             foreach (Arr::get($_POST, 'columns', array()) as $column => $value) {
                 $columns[$column] = Columns::get_name($column);
             }
         }
         header("Content-type: text/csv");
         header('Content-disposition: filename="' . date('Ymd') . '_EXEL_' . $region['name'] . '_EOD.csv"');
         $file = tmpfile();
         fputcsv($file, array(0 => 'Ticket Of Work') + $columns);
         while ($job = $jobs->next()) {
             $data[0] = $job['_id'];
             $i = 1;
             foreach ($columns as $key => $value) {
                 $data[$i++] = iconv("CP1251", 'CP1251//ignore', Columns::output(Arr::get($job['data'], $key, ''), Columns::get_type($key), true));
             }
             fputcsv($file, $data);
         }
         rewind($file);
         fpassthru($file);
         fclose($file);
         die;
     }
     $view = View::factory('Jobs/Export')->bind('regions', $regions)->bind('groups', $groups);
     $this->response->body($view);
 }
コード例 #7
0
ファイル: Batch.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     if (!Group::current('allow_assign')) {
         throw new HTTP_Exception_403('Forbidden');
     }
     header('Content-type: application/json');
     $action = $this->request->param('id');
     $result = array();
     $columns = DB::select('id')->from('job_columns')->where('editable', '=', 1)->execute()->as_array('id', 'id');
     switch ($action) {
         case 'get':
             $data = array();
             $result['columns'] = array();
             foreach ($columns as $column) {
                 $value = array('id' => intval($column), 'name' => Columns::get_name($column));
                 $type = Columns::get_type($column);
                 if (substr($type, 0, 4) == 'enum') {
                     $id = substr($type, 5);
                     $type = Enums::is_multi($id) ? 'multi' : 'list';
                     $value['values'] = array_values(Enums::get_values($id));
                 }
                 $value['type'] = $type ?: 'string';
                 $result['columns'][] = $value;
                 $data[] = 'data.' . $column;
             }
             $ids = explode(',', strval(Arr::get($_GET, 'id', '')));
             $values = array();
             if ($ids) {
                 $query = array('_id' => array('$in' => $ids));
                 if (!Group::current('show_all_jobs')) {
                     $query['companies'] = intval(User::current('company_id'));
                 }
                 $jobs = Database_Mongo::collection('jobs')->find($query, $data);
                 foreach ($jobs as $job) {
                     foreach ($job['data'] as $key => $value) {
                         $job['data'][$key] = Columns::output($value, Columns::get_type($key), true);
                     }
                     $job['id'] = $job['_id'];
                     unset($job['_id']);
                     $values[] = $job;
                 }
             }
             $result['jobs'] = $values;
             break;
         case 'set':
             if (User::current('login') !== Arr::get($_POST, 'username')) {
                 die('Wrong username! Please, check it and submit data again.');
             }
             $data = Arr::get($_POST, 'jobs');
             $values = array();
             foreach ($data as $job) {
                 $id = strval(Arr::get($job, 'id', ''));
                 foreach (Arr::get($job, 'data') as $key => $value) {
                     if (isset($columns[$key])) {
                         $values[$id][$key] = strval($value);
                     }
                 }
             }
             $query = array('_id' => array('$in' => array_keys($values)));
             if (!Group::current('show_all_jobs')) {
                 $query['companies'] = intval(User::current('company_id'));
             }
             $data = array();
             foreach ($columns as $column) {
                 $data['data.' . $column] = 1;
             }
             $count = 0;
             $jobs = Database_Mongo::collection('jobs')->find($query, $data);
             foreach ($jobs as $job) {
                 if (isset($values[$job['_id']])) {
                     $id = $job['_id'];
                     $new = array();
                     $archive = array();
                     foreach ($values[$id] as $key => $value) {
                         $value = $value ? Columns::parse($value, Columns::get_type($key)) : '';
                         $old = Arr::path($job, 'data.' . $key);
                         if (($value || $old) && $value != $old) {
                             if ($value) {
                                 $new['$set']['data.' . $key] = $value;
                             } else {
                                 $new['$unset']['data.' . $key] = 1;
                             }
                             $archive['data'][$key] = array('old_value' => $old, 'new_value' => $value);
                         }
                     }
                     if ($new) {
                         $new['$set']['last_update'] = time();
                         Database_Mongo::collection('jobs')->update(array('_id' => $id), $new);
                         $archive['fields'] = array_keys($archive['data']);
                         $archive['job_key'] = $id;
                         $archive['user_id'] = User::current('id');
                         $archive['update_time'] = time();
                         $archive['update_type'] = 2;
                         $archive['filename'] = 'MANUAL';
                         Database_Mongo::collection('archive')->insert($archive);
                         $count++;
                     }
                 }
             }
             $result = array('success' => true, 'count' => $count);
             break;
     }
     die(json_encode($result));
 }
コード例 #8
0
ファイル: View.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     $id = $this->request->param('id');
     $job = Database_Mongo::collection('jobs')->findOne(array('_id' => strval($id)));
     if (!$job) {
         throw new HTTP_Exception_404('Not found');
     }
     if (!Group::current('show_all_jobs') && !in_array((int) User::current('company_id'), Arr::get($job, 'companies', array()), true) && !in_array((int) User::current('company_id'), Arr::get($job, 'ex', array()), true)) {
         throw new HTTP_Exception_403('Forbidden');
     }
     if (!Group::current('show_all_jobs') && !in_array((int) User::current('company_id'), Arr::get($job, 'companies', array()), true)) {
         Columns::set_readonly();
     }
     $job['attachments'] = DB::select()->from('attachments')->where('job_id', '=', $id)->and_where('uploaded', '>', '0')->order_by('folder', 'asc')->order_by('numbering', 'asc')->execute()->as_array('id');
     if (isset($_GET['delete']) && Group::current('allow_assign')) {
         $file_id = intval($_GET['delete']);
         if (isset($job['attachments'][$file_id])) {
             if (file_exists(DOCROOT . 'storage/' . $file_id)) {
                 unlink(DOCROOT . 'storage/' . $file_id);
             }
             $attachment = $job['attachments'][$file_id];
             $data = array('filename' => $attachment['folder'] . ' / ' . $attachment['fda_id'] . ' / ' . $attachment['address'] . ' / ' . $attachment['filename'], 'uploaded' => time(), 'user_id' => User::current('id'), 'job_id' => $id, 'action' => 2);
             Database::instance()->begin();
             DB::insert('upload_log', array_keys($data))->values(array_values($data))->execute();
             DB::delete('attachments')->where('id', '=', $file_id)->execute();
             Database::instance()->commit();
             die(json_encode(array('success' => true)));
         } else {
             throw new HTTP_Exception_404('Not found');
         }
     }
     $users = array();
     $job['region'] = DB::select('name')->from('regions')->where('id', '=', $job['region'])->execute()->get('name');
     $tabs = DB::select()->from('job_tabs')->execute()->as_array('id');
     foreach ($job['attachments'] as $attachment) {
         $users[$attachment['user_id']] = 1;
     }
     $job_types = DB::select('id', 'name')->from('job_types')->order_by('name', 'asc')->execute()->as_array('id', 'name');
     $companies = DB::select('id', 'name')->from('companies')->order_by('name', 'asc')->execute()->as_array('id', 'name');
     $submissions = array();
     if (Group::current('allow_assign')) {
         $result = Database_Mongo::collection('submissions')->find(array('job_key' => $id))->sort(array('update_time' => -1, 'user_id' => 1, 'key' => 1));
     } else {
         $u = DB::select('id')->from('users')->where('company_id', '=', User::current('company_id'))->execute()->as_array(NULL, 'id');
         $result = Database_Mongo::collection('submissions')->find(array('job_key' => $id, 'user_id' => array('$in' => $u)))->sort(array('update_time' => -1, 'user_id' => 1, 'key' => 1));
     }
     foreach ($result as $submission) {
         $users[$submission['user_id']] = 1;
         $key = substr($submission['key'], 5);
         $data = array('id' => $submission['_id'], 'key' => str_replace('.', '-', $submission['key']), 'user_id' => $submission['user_id'], 'time' => $submission['update_time'], 'name' => Columns::get_name($key), 'type' => Columns::get_type($key), 'active' => Arr::get($submission, 'active'), 'value' => $submission['value']);
         if (isset($submission['version'])) {
             $data['version'] = $submission['version'];
         }
         if (Group::current('allow_assign') && Arr::get($submission, 'active') == 1) {
             $tabs[Columns::get_tab($key)]['submissions'][$key] = 1;
             $submissions[$submission['key']][] = $data;
         }
         $submissions['list'][(string) $data['id']] = $data;
     }
     foreach (Columns::get_visible() as $key => $name) {
         $tabs[Columns::get_tab($key)]['columns'][$key] = $name;
     }
     User::get(array_keys($users));
     if ($_POST) {
         $update_time = time();
         if (!Arr::path($_FILES, 'attachment.error', -1) && is_uploaded_file($_FILES['attachment']['tmp_name'])) {
             $data = array('filename' => $_FILES['attachment']['name'], 'mime' => $_FILES['attachment']['type'], 'uploaded' => $update_time, 'user_id' => User::current('id'), 'job_id' => $id);
             Database::instance()->begin();
             $result = DB::insert('attachments', array_keys($data))->values(array_values($data))->execute();
             $image_id = Arr::get($result, 0);
             if ($image_id && move_uploaded_file($_FILES['attachment']['tmp_name'], DOCROOT . 'storage/' . $image_id)) {
                 Database::instance()->commit();
                 Messages::save("File " . $data['filename'] . ' was successfully uploaded!', 'success');
             } else {
                 Database::instance()->rollback();
             }
         }
         if (Group::current('allow_assign')) {
             $update = array();
             $archive = array();
             foreach (Arr::get($_POST, 'data', array()) as $key => $value) {
                 $value = Columns::parse($value, Columns::get_type($key));
                 if (Arr::path($job, 'data.' . $key) != $value) {
                     if ($value) {
                         $update['$set']['data.' . $key] = $value;
                     } else {
                         $update['$unset']['data.' . $key] = 1;
                     }
                     $archive['data'][$key] = array('old_value' => Arr::path($job, 'data.' . $key), 'new_value' => $value);
                     $job['data'][$key] = $value;
                 }
             }
             $list = Arr::get($submissions, 'list', array());
             $pending = array();
             $accepted = array();
             $ignored = array();
             foreach ($list as $submission) {
                 $key = 'submission-' . str_replace('-', '.', $submission['key']);
                 $value = Arr::path($_POST, $key);
                 if ($value !== NULL) {
                     $pending[] = $submission['id'];
                     if ($value) {
                         $accepted[] = $submission['id'];
                     } else {
                         $ignored[] = $submission['id'];
                     }
                 }
             }
             foreach (Arr::get($_POST, 'submission-data', array()) as $key => $value) {
                 if ($value && isset($list[$value])) {
                     $value = Arr::path($list, $value . '.value');
                     if ($key == 177 || $key == 205) {
                         $value = $value ? 1 : 0;
                     }
                     if (Arr::path($job, 'data.' . $key) != $value) {
                         if ($value) {
                             $update['$set']['data.' . $key] = $value;
                             unset($update['$unset']['data.' . $key]);
                         } else {
                             $update['$unset']['data.' . $key] = 1;
                             unset($update['$set']['data.' . $key]);
                         }
                         $archive['data'][$key] = array('old_value' => Arr::path($job, 'data.' . $key), 'new_value' => $value);
                         $job['data'][$key] = $value;
                     }
                 }
             }
             if ($pending) {
                 Database_Mongo::collection('submissions')->update(array('_id' => array('$in' => $ignored)), array('$set' => array('admin_id' => User::current('id'), 'process_time' => $update_time), '$unset' => array('active' => 1)), array('multiple' => 1));
                 Database_Mongo::collection('submissions')->update(array('_id' => array('$in' => $accepted)), array('$set' => array('admin_id' => User::current('id'), 'process_time' => $update_time, 'active' => -1)), array('multiple' => 1));
             }
             $ass = false;
             $values = array();
             foreach (Arr::get($_POST, 'assigned', array()) as $key => $value) {
                 if (Arr::path($job, 'assigned.' . $key) != $value) {
                     if ($ass < 1) {
                         $ass = $value ? 1 : -1;
                     }
                     $values[] = array('time' => $update_time, 'user_id' => User::current('id'), 'company_id' => max($value, 0), 'job_id' => $job['_id'], 'type' => $key);
                     $unassigned = Arr::path($job, 'assigned.' . $key);
                     if ($value) {
                         $job['assigned'][$key] = $value;
                         $users = DB::select('id')->from('users')->where('company_id', '=', $value)->execute()->as_array(NULL, 'id');
                         $update['$set']['data.266'] = $update_time;
                         $message = '1 ticket was allocated on ' . date('d-m-Y H:i', $update_time) . '. <a href="' . URL::base() . 'search/view/' . $job['_id'] . '">View ticket</a>';
                         $insert = DB::insert('notifications', array('user_id', 'message'));
                         foreach ($users as $user) {
                             $insert->values(array($user, $message));
                         }
                         $insert->execute();
                     } else {
                         unset($job['assigned'][$key]);
                     }
                     if ($unassigned) {
                         $users = DB::select('id')->from('users')->where('company_id', '=', $unassigned)->execute()->as_array(NULL, 'id');
                         $subs = Database_Mongo::collection('submissions')->findOne(array('job_key' => $job['_id'], 'active' => 1));
                         if ($subs) {
                             Messages::save('Unable to unassign the job - please, approve or reject all submissions first!', 'danger');
                         } else {
                             $subs = Database_Mongo::collection('submissions')->find(array('job_key' => $job['_id'], 'user_id' => array('$in' => $users), 'financial' => array('$exists' => 0), 'active' => -1))->sort(array('process_time' => 1));
                             $list = array();
                             foreach ($subs as $sub) {
                                 $list[$sub['key']] = $sub['_id'];
                             }
                             $financial = DB::select('id')->from('job_columns')->where('financial', '>', 0)->execute()->as_array(NULL, 'id');
                             $result = array();
                             foreach ($financial as $column) {
                                 if (isset($list['data.' . $column])) {
                                     $result[$column] = $list['data.' . $column];
                                 }
                             }
                             Database_Mongo::collection('submissions')->update(array('_id' => array('$in' => array_values($result))), array('$set' => array('financial_time' => 0)), array('multiple' => 1));
                         }
                     }
                 }
             }
             if ($ass) {
                 $update['$set']['assigned'] = $job['assigned'];
                 $insert = DB::insert('assign_log', array_keys($values[0]));
                 foreach ($values as $value) {
                     $insert->values($value);
                 }
                 $insert->execute();
                 $result = Database_Mongo::collection('submissions')->distinct('user_id', array('job_key' => $job['_id']));
                 if ($result) {
                     $result = DB::select('company_id')->distinct(true)->from('users')->where('id', 'IN', $result)->and_where('company_id', '>', 0)->execute()->as_array(NULL, 'company_id');
                 }
                 $companies = array_flip($result);
                 foreach ($companies as $key => $value) {
                     $companies[$key] = 1;
                 }
                 $update['$set']['ex'] = array_keys($companies);
             }
             if (!Arr::get($update, '$unset')) {
                 unset($update['$unset']);
             }
             $companies = array();
             if (isset($job['assigned'])) {
                 foreach ($job['assigned'] as $company) {
                     if ($company) {
                         $companies[$company] = 1;
                     }
                 }
             }
             foreach (Columns::$settings as $key => $value) {
                 if (!in_array($key, Columns::$settings_read_only, true)) {
                     if (Arr::get($job, $key) != Arr::get($_POST, $key)) {
                         $value = Arr::get($_POST, $key) ? 1 : 0;
                         $update[$value ? '$set' : '$unset'][$key] = 1;
                         $job[$key] = $value;
                     }
                 }
             }
             $discrepancies = Database_Mongo::collection('discrepancies')->find(array('job_key' => $job['_id']))->sort(array('update_time' => -1))->getNext();
             if (Group::current('allow_reports') && $discrepancies) {
                 $fl = 0;
                 $set = array();
                 $ignores = Arr::get($_POST, 'ignore-discrepancy');
                 foreach ($discrepancies['data'] as $key => $values) {
                     $val = Arr::get($values, 'ignore') ? 1 : 0;
                     $new_val = Arr::get($ignores, $key) ? 1 : 0;
                     if ($val != $new_val) {
                         if ($new_val) {
                             if (!$fl) {
                                 $fl = -1;
                             }
                             $set['$set']['data.' . $key . '.ignore'] = 1;
                             $discrepancies['data'][$key]['ignore'] = 1;
                         } else {
                             if ($values['old_value'] != Arr::get($job['data'], $key, '')) {
                                 $fl = 1;
                             }
                             $set['$unset']['data.' . $key . '.ignore'] = 1;
                             $discrepancies['data'][$key]['ignore'] = 0;
                         }
                     }
                 }
                 if ($set) {
                     Database_Mongo::collection('discrepancies')->update(array('_id' => new MongoId($discrepancies['_id'])), $set);
                 }
                 if ($fl > 0 && !Arr::get($job, 'discrepancies')) {
                     $update['$set']['discrepancies'] = 1;
                 } elseif ($fl <= 0 && Arr::get($job, 'discrepancies')) {
                     $fl = true;
                     foreach ($discrepancies['data'] as $key => $values) {
                         if (!Arr::get($values, 'ignore')) {
                             $value = $values['old_value'];
                             $new_value = Arr::get($job['data'], $key, '');
                             if ($key == 44) {
                                 $value = preg_replace('/[^a-z]/i', '', strtolower($value));
                                 $new_value = preg_replace('/[^a-z]/i', '', strtolower($new_value));
                             }
                             if ($value != $new_value) {
                                 $fl = false;
                             }
                         }
                     }
                     if ($fl) {
                         $update['$unset']['discrepancies'] = 1;
                     }
                 }
             }
             if ($update) {
                 Utils::calculate_financial($job);
                 $status = preg_replace('/[^a-z]/', '', strtolower(Arr::path($update, array('$set', 'data.44'), '')));
                 if ($status == 'built' && !Arr::path($job, 'data.264')) {
                     $update['$set']['data.264'] = $update_time;
                 }
                 if ($status == 'tested' && !Arr::path($job, 'data.265')) {
                     $update['$set']['data.265'] = $update_time;
                     if (!Arr::path($job, 'data.264')) {
                         $update['$set']['data.264'] = $update_time;
                     }
                 }
                 $update['$set']['companies'] = array_keys($companies);
                 $status = Arr::get($job, 'status', Enums::STATUS_UNALLOC);
                 if ($companies && $status == Enums::STATUS_UNALLOC) {
                     $update['$set']['status'] = Enums::STATUS_ALLOC;
                 } elseif (!$companies && $status == Enums::STATUS_ALLOC) {
                     $update['$unset']['status'] = 1;
                 }
                 $update['$set']['last_update'] = $update_time;
                 if (isset($update['$set']['data.8'])) {
                     $update['$set']['address'] = MapQuest::parse($update['$set']['data.8']);
                 } elseif (isset($update['$unset']['data.8'])) {
                     $update['$unset']['address'] = 1;
                 }
                 Database_Mongo::collection('jobs')->update(array('_id' => $id), $update);
                 if ($archive) {
                     foreach (Columns::get_static() as $key => $value) {
                         $archive['static'][$key] = Arr::path($job, 'data.' . $key);
                     }
                     $archive['fields'] = array_keys($archive['data']);
                     $archive['job_key'] = $id;
                     $archive['user_id'] = User::current('id');
                     $archive['update_time'] = $update_time;
                     $archive['update_type'] = 2;
                     $archive['filename'] = 'MANUAL';
                     Database_Mongo::collection('archive')->insert($archive);
                 }
                 Messages::save("Changes were succesfully saved!", 'success');
             } else {
                 Messages::save("No changes were submitted", 'warning');
             }
             if ($pending) {
                 $count = Database_Mongo::collection('submissions')->find(array('job_key' => $id, 'active' => 1))->count();
                 $status = Arr::get($job, 'status', Enums::STATUS_UNALLOC);
                 if ($status == Enums::STATUS_PENDING && !$count) {
                     $update = array('$set' => array('last_update' => $update_time, 'status' => Enums::STATUS_COMPLETE));
                     Database_Mongo::collection('jobs')->update(array('_id' => $id), $update);
                 }
             } elseif (in_array(Arr::get($job, 'status', Enums::STATUS_UNALLOC), array(Enums::STATUS_UNALLOC, Enums::STATUS_ALLOC))) {
                 if ($companies) {
                     $status = Enums::STATUS_ALLOC;
                 } else {
                     $status = Enums::STATUS_UNALLOC;
                 }
                 if ($status != Arr::get($job, 'status', Enums::STATUS_UNALLOC)) {
                     $update = array('$set' => array('last_update' => $update_time));
                     if ($status == Enums::STATUS_UNALLOC) {
                         $update['$unset']['status'] = 1;
                     } else {
                         $update['$set']['status'] = $status;
                     }
                     Database_Mongo::collection('jobs')->update(array('_id' => $id), $update);
                 }
             } elseif ($ass == 1 && in_array(Arr::get($job, 'status', Enums::STATUS_UNALLOC), array(Enums::STATUS_COMPLETE, Enums::STATUS_ARCHIVE))) {
                 $update = array('$set' => array('last_update' => $update_time, 'status' => Enums::STATUS_ALLOC));
                 Database_Mongo::collection('jobs')->update(array('_id' => $id), $update);
             }
             if ($submissions) {
                 Messages::save(count($pending) . '/' . count($submissions['list']) . ' submission(s) were processed.', 'info');
             }
         } else {
             $submissions = array();
             foreach (Arr::get($_POST, 'data', array()) as $key => $value) {
                 $value = Columns::parse($value, Columns::get_type($key));
                 if (Arr::path($job, 'data.' . $key) != $value) {
                     $submissions[$key] = $value;
                 }
             }
             if ($submissions) {
                 $submission = array('job_key' => $id, 'user_id' => User::current('id'), 'active' => 1, 'update_time' => $update_time);
                 if (Arr::get($_POST, 'location')) {
                     $submission['location'] = $_POST['location'];
                 }
                 $status = Arr::get($job, 'status', Enums::STATUS_UNALLOC);
                 $update = array();
                 $approval = false;
                 $archive = array();
                 foreach ($submissions as $key => $value) {
                     if (Columns::get_direct($key)) {
                         if ($value) {
                             $update['$set']['data.' . $key] = $value;
                         } else {
                             $update['$unset']['data.' . $key] = 1;
                         }
                         $archive['data'][$key] = array('old_value' => Arr::path($job, 'data.' . $key), 'new_value' => $value);
                         $job['data'][$key] = $value;
                         $submission['key'] = 'data.' . $key;
                         $submission['value'] = $value;
                         $submission['active'] = -1;
                         $submission['process_time'] = $submission['update_time'];
                         Database_Mongo::collection('submissions')->insert($submission);
                         unset($submission['process_time']);
                         unset($submission['_id']);
                     } else {
                         $approval = true;
                         if ($status != Enums::STATUS_PENDING) {
                             $status = $update['$set']['status'] = Enums::STATUS_PENDING;
                         }
                         $submission['key'] = 'data.' . $key;
                         $submission['value'] = $value;
                         $submission['active'] = 1;
                         Database_Mongo::collection('submissions')->insert($submission);
                         unset($submission['_id']);
                     }
                 }
                 if ($update) {
                     $update['$set']['last_update'] = $update_time;
                     Database_Mongo::collection('jobs')->update(array('_id' => $id), $update);
                     if ($archive) {
                         foreach (Columns::get_static() as $key => $value) {
                             $archive['static'][$key] = Arr::path($job, 'data.' . $key);
                         }
                         $archive['fields'] = array_keys($archive['data']);
                         $archive['job_key'] = $id;
                         $archive['user_id'] = User::current('id');
                         $archive['update_time'] = $update_time;
                         $archive['update_type'] = 2;
                         $archive['filename'] = 'MANUAL';
                         Database_Mongo::collection('archive')->insert($archive);
                     }
                 }
                 Messages::save("Changes were succesfully submitted. " . ($approval ? 'Manager will review changes and confirm them.' : ''), 'success');
             } else {
                 Messages::save("No changes were submitted", 'warning');
             }
         }
         $this->redirect('/search');
     }
     $values = array();
     if (!Group::current('allow_assign')) {
         $last = Database_Mongo::collection('submissions')->find(array('job_key' => $id, 'active' => 1, 'user_id' => array('$in' => DB::select('id')->from('users')->where('company_id', '=', User::current('company_id'))->execute()->as_array(NULL, 'id'))))->sort(array('update_time' => 1));
         foreach ($last as $submission) {
             $values[str_replace('.', '', $submission['key'])] = $submission['value'];
         }
     }
     $job['discr'] = array();
     if (Group::current('allow_reports')) {
         $job['discr'] = Database_Mongo::collection('discrepancies')->find(array('job_key' => $id))->sort(array('update_time' => -1))->getNext();
     }
     if (Group::current('time_machine')) {
         $result = Database_Mongo::collection('archive')->find(array('job_key' => $job['_id']))->sort(array('update_time' => -1));
         $archive = array();
         $ids = array();
         foreach ($result as $item) {
             $archive[] = $item;
             $ids[Arr::get($item, 'user_id', 0)] = 1;
         }
         User::get(array_keys($ids));
     }
     if (Group::current('allow_finance')) {
         $query = DB::select('company_id', 'payment_time', 'admin_id', array('payments.amount', 'total'), array('payment_jobs.amount', 'amount'))->from('payment_jobs')->join('payments')->on('payment_jobs.payment_id', '=', 'payments.id')->where('job_key', '=', $job['_id'])->order_by('payment_time', 'desc');
         if (!Group::current('show_all_jobs')) {
             $query->and_where('company_id', '=', User::current('company_id'));
         }
         $job['payments'] = $query->execute()->as_array();
         $ids = array();
         foreach ($job['payments'] as $payment) {
             $ids[$payment['admin_id']] = 1;
         }
         if ($ids) {
             User::get(array_keys($ids));
         }
     }
     $forms = array();
     if (Group::current('allow_custom_forms')) {
         $forms = array('job' => $job['_id']);
         if (!Group::current('show_all_jobs')) {
             $forms['company'] = User::current('company_id');
         }
         $result = Database_Mongo::collection('forms-data')->find($forms, array('data' => 0))->sort(array('last_update' => -1));
         $forms = array();
         $ids = array();
         foreach ($result as $form) {
             $ids[$form['form_id']] = 1;
             $forms[] = $form;
         }
         $list = array();
         foreach ($ids as $key => $dummy) {
             $list[] = new MongoId($key);
         }
         $result = Database_Mongo::collection('forms')->find(array('_id' => array('$in' => $list)), array('name' => 1));
         $list = array();
         foreach ($result as $form) {
             $list[strval($form['_id'])] = $form['name'];
         }
         foreach ($forms as $key => $form) {
             if (isset($list[$form['form_id']])) {
                 $forms[$key]['name'] = $list[$form['form_id']];
             }
         }
     }
     $view = View::factory('Jobs/View')->bind('job', $job)->bind('tabs', $tabs)->bind('job_types', $job_types)->bind('companies', $companies)->bind('submissions', $submissions)->bind('values', $values)->bind('archive', $archive)->bind('forms', $forms);
     $this->response->body($view);
 }
コード例 #9
0
 public function action_export()
 {
     $id = $this->request->param('id');
     if ($id == 'all') {
         ini_set('memory_limit', '512M');
     }
     header('Content-type: text/csv');
     header('Content-disposition: filename=Discrepancy.csv');
     $result = $this->get_results($id == 'all');
     $reports = array();
     foreach (Columns::get_static() as $column => $value) {
         $reports[$column] = Columns::get_name($column);
     }
     $file = tmpfile();
     $data = array('Ticket ID', 'Date', 'File name');
     foreach ($reports as $id => $name) {
         $data[] = $name;
     }
     $data[] = "Column name";
     $data[] = "Old value";
     $data[] = "New value";
     $data[] = 'Current value';
     fputcsv($file, $data);
     foreach ($result as $ticket) {
         if (!$ticket['discr'] || !isset($_GET['discrepancy'])) {
             $ticket['update_time'] = date('d-m-Y H:i', $ticket['update_time']);
             $data = array($ticket['job_key'], $ticket['update_time'], $ticket['filename']);
             foreach ($reports as $id => $name) {
                 $data[] = Arr::path($ticket, 'static.' . $id);
             }
             $base = $data;
             foreach ($ticket['data'] as $key => $value) {
                 if (!isset($_GET['discrepancy']) || $ticket['current'][$key] != $value['old_value']) {
                     $data = $base;
                     $date = Columns::get_type($key) == 'date';
                     $data[] = Columns::get_name($key);
                     $data[] = $date && $value['old_value'] ? date('d-m-Y H:i', $value['old_value']) : $value['old_value'];
                     $data[] = $date && $value['new_value'] ? date('d-m-Y H:i', $value['new_value']) : $value['new_value'];
                     $current = $ticket['current'][$key];
                     $data[] = $date && $current ? date('d-m-Y H:i', $current) : $current;
                     fputcsv($file, $data);
                 }
             }
         }
     }
     rewind($file);
     fpassthru($file);
     die;
 }
コード例 #10
0
ファイル: Search.php プロジェクト: nikulinsanya/exeltek
            </div>
            <div class="modal-body" id="table-row-details">
                <table class="table small">
                    <tr class="text-center tr-header">
                        <th>Ticket ID</th>
                        <?php if (isset($columns['last_update'])):?><th class="hidden-sm hidden-xs">Last update</th><?php endif;?>
                        <?php if (isset($columns['last_submit'])):?><th class="hidden-sm hidden-xs"> Last submit</th><?php endif;?>
                        <?php if (isset($columns['status']) && Group::current('show_all_jobs') && $_GET['status'] == -1):?><th class="hidden-sm hidden-xs">Job status</th><?php endif;?>
                        <?php if (isset($columns['types'])):?><th class="hidden-xs">Assigned works</th><?php endif;?>
                        <?php if (isset($columns['companies'])):?><th class="hidden-sm hidden-xs">Assigned companies</th><?php endif;?>
                        <?php if (isset($columns['ex'])):?><th class="hidden-sm hidden-xs">Previously assigned companies</th><?php endif;?>
                        <?php if (isset($columns['settings'])):?><th class="hidden-sm hidden-xs">Settings</th><?php endif;?>
                        <?php if (isset($columns['pending'])):?><th class="hidden-sm hidden-xs">Pending submissions</th><?php endif;?>
                        <?php if (isset($columns['attachments'])):?><th class="hidden-xs">Attachments</th><?php endif;?>
                        <?php foreach (Columns::get_search() as $id => $type):?>
                        <th><?=Columns::get_name($id)?></th>
                        <?php endforeach;?>
                    </tr>
                    <tr class="text-center tr-body"></tr>
                </table>
            </div>
            <div class="modal-footer" id="tableRowButtons">
            </div>
        </div>
    </div>
</div>

<div class="modal fade" id="batchEditModal" tabindex="-1" role="dialog">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
コード例 #11
0
ファイル: Map.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     $ids = array_keys(Arr::get($_POST, 'job', array()));
     if (!$ids) {
         throw new HTTP_Exception_404('Not found');
     }
     $regs = DB::select('region_id')->from('user_regions')->where('user_id', '=', User::current('id'))->execute()->as_array('region_id', 'region_id');
     $query = array();
     if ($regs) {
         $query['region'] = array('$in' => array_values($regs));
     }
     if (!Group::current('show_all_jobs')) {
         $query['$or'] = array(array('ex' => intval(User::current('company_id'))), array('companies' => intval(User::current('company_id'))));
     }
     $query['_id'] = array('$in' => $ids);
     $jobs = Database_Mongo::collection('jobs')->find($query);
     $static = array_flip(explode(',', Group::current('columns')));
     $header = array('Ticket ID');
     $types = DB::select('id', 'name')->from('job_types')->execute()->as_array('id', 'name');
     $companies = DB::select('id', 'name')->from('companies')->execute()->as_array('id', 'name');
     if ($ids) {
         $attachments = DB::select('job_id', DB::expr('COUNT(*) as cnt'))->from('attachments')->where('job_id', 'IN', $ids)->and_where('uploaded', '>', 0)->group_by('job_id')->execute()->as_array('job_id', 'cnt');
     } else {
         $attachments = array();
     }
     if (Group::current('allow_assign')) {
         $result = Database_Mongo::collection('submissions')->aggregate(array(array('$match' => array('job_key' => array('$in' => $ids), 'active' => 1)), array('$group' => array('_id' => '$job_key', 'count' => array('$sum' => 1)))));
         $submissions = array();
         foreach (Arr::get($result, 'result', array()) as $value) {
             $submissions[$value['_id']] = $value['count'];
         }
     }
     if (isset($static['last_update'])) {
         $header[] = 'Last update';
     }
     if (isset($static['last_submit'])) {
         $header[] = 'Last submit';
     }
     if (isset($static['status']) && Group::current('show_all_jobs')) {
         $header[] = 'Job status';
     }
     if (isset($static['types'])) {
         $header[] = 'Assigned works';
     }
     if (isset($static['companies'])) {
         $header[] = 'Assigned companies';
     }
     if (isset($static['pending'])) {
         $header[] = 'Pending submissions';
     }
     if (isset($static['attachments'])) {
         $header[] = 'Attachments';
     }
     foreach (Columns::get_search() as $id => $type) {
         $header[] = Columns::get_name($id);
     }
     $list = array();
     $request = array();
     foreach ($jobs as $job) {
         if (!isset($job['lat'])) {
             $request[$job['_id']] = Arr::path($job, 'data.8');
         }
     }
     if ($request) {
         $coords = MapQuest::locate($request);
         foreach ($coords as $key => $value) {
             Database_Mongo::collection('jobs')->update(array('_id' => $key), array('$set' => array('lng' => $value['lng'], 'lat' => $value['lat'])));
         }
     } else {
         $coords = array();
     }
     foreach ($jobs as $ticket) {
         if (isset($coords[$ticket['_id']])) {
             $ticket['lng'] = $coords[$ticket['_id']]['lng'];
             $ticket['lat'] = $coords[$ticket['_id']]['lat'];
         }
         if (!isset($ticket['lat'])) {
             continue;
         }
         $row = array($ticket['_id']);
         if (isset($static['last_update'])) {
             $row[] = date('d-m-Y H:i', Arr::get($ticket, 'last_update', $ticket['created']));
         }
         if (isset($static['last_submit'])) {
             $row[] = Arr::get($ticket, 'last_submit') ? date('d-m-Y H:i', $ticket['last_submit']) : '';
         }
         if (isset($static['status']) && Group::current('show_all_jobs')) {
             $row[] = Arr::get(Enums::$statuses, Arr::get($ticket, 'status', 0), 'Unknown');
         }
         if (isset($static['types'])) {
             if (Group::current('allow_assign')) {
                 $row[] = implode(', ', array_intersect_key($types, Arr::get($ticket, 'assigned', array())));
             } else {
                 $row[] = implode(', ', array_intersect_key($types, array_filter(Arr::get($ticket, 'assigned', array()), function ($x) {
                     return $x == User::current('company_id');
                 })));
             }
         }
         if (isset($static['companies'])) {
             $row[] = implode(', ', array_intersect_key($companies, array_flip(Arr::get($ticket, 'assigned', array()))));
         }
         if (isset($static['pending'])) {
             $row[] = Arr::get($submissions, $ticket['_id']);
         }
         if (isset($static['attachments'])) {
             $row[] = Arr::get($attachments, $ticket['_id']);
         }
         foreach (Columns::get_search() as $id => $type) {
             $row[] = Arr::path($ticket, array('data', $id)) ? Columns::output($ticket['data'][$id], Columns::get_type($id), true) : '';
         }
         $row = array_combine($header, $row);
         $row['lat'] = $ticket['lat'];
         $row['lng'] = $ticket['lng'];
         $list[] = $row;
     }
     if (!$list) {
         throw new HTTP_Exception_404('Not found');
     }
     DB::delete('maps')->where('expire', '<', time())->execute();
     $ids = DB::select('map_id')->distinct(true)->from('maps')->execute()->as_array('map_id', 'map_id');
     do {
         $id = Text::random('alnum', 32);
     } while (isset($ids[$id]));
     $expire = time() + 60 * 60 * 24 * 7;
     $query = DB::insert('maps', array('map_id', 'job_key', 'lng', 'lat', 'info', 'expire'));
     foreach ($list as $values) {
         $lat = $values['lat'];
         $lng = $values['lng'];
         unset($values['lng']);
         unset($values['lat']);
         $query->values(array($id, $values['Ticket ID'], $lng, $lat, json_encode($values), $expire));
     }
     $query->execute();
     $this->redirect('/map.html#' . $id);
 }
コード例 #12
0
ファイル: Submissions.php プロジェクト: nikulinsanya/exeltek
     <th>Date</th>
     <th>User</th>
     <th>Source</th>
     <th>Status</th>
     <th>Processed</th>
     <th>Company</th>
     <th>Location</th>
     <th>Column name</th>
     <th>Value</th>
     <th>Current value</th>
     <?php if (Group::current('allow_assign')):?>
     <th>&nbsp;</th>
     <?php endif;?>
 </tr>
 <?php foreach ($submissions as $submission): 
     $name = Columns::get_name(substr($submission['key'], 5));
     $type = Columns::get_type(substr($submission['key'], 5));
     $value = Columns::output($submission['value'], $type);
     $current = Columns::output(Arr::path($job, 'data.' . substr($submission['key'], 5)), $type);
     ?>
     <tr class="<?=Arr::get($submission, 'active') ? ($submission['active'] > 0 ? 'bg-warning' : 'bg-success') : 'bg-danger'?>">
         <td><?=date('d-m-Y H:i:s', $submission['update_time'])?></td>
         <td><?=User::get($submission['user_id'], 'login')?></td>
         <td><?=isset($submission['version']) ? 'Mobile app (' . ($submission['version'] ? : 'Unknown') . ')' : 'Web-app'?></td>
         <td><span class="glyphicon glyphicon-<?=Arr::get($submission, 'active') ? ($submission['active'] < 0 ? 'ok text-success' : 'edit text-info') : 'remove text-danger'?>"></span></td>
         <td><?=Arr::get($submission, 'process_time') ? date('d-m-Y H:i:s', $submission['process_time']) . ' by ' . User::get(Arr::get($submission, 'admin_id'), 'login') : ''?></td>
         <td><?=Arr::get($companies, User::get($submission['user_id'], 'company_id'))?></td>
         <td><?=Arr::get($submission, 'location') ? '<a target="_blank" href="https://www.google.com/maps/@' . $submission['location'] . ',19z">Location</a>' : ''?></td>
         <td><?=HTML::chars($name)?></td>
         <td class="<?=strlen($value) > 100 ? 'shorten' : ''?>"><?=$value?></td>
         <td class="<?=strlen($current) > 100 ? 'shorten' : ''?>"><?=$current?></td>
コード例 #13
0
ファイル: Financial.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     $start = Arr::get($_GET, 'start') ? strtotime($_GET['start']) : strtotime('first day of this month');
     $end = Arr::get($_GET, 'end') ? strtotime($_GET['end']) + 86399 : time();
     $query = array('financial_time' => isset($_GET['excel']) ? array('$gt' => 0) : array('$exists' => 1), 'update_time' => array('$gt' => intval($start), '$lt' => intval($end)));
     if (Arr::get($_GET, 'app-start')) {
         $query['process_time']['$gt'] = strtotime($_GET['app-start']);
     }
     if (Arr::get($_GET, 'app-end')) {
         $query['process_time']['$lt'] = strtotime($_GET['app-end']) + 86399;
     }
     if (Arr::get($_GET, 'fin-start')) {
         $query['financial_time']['$gt'] = strtotime($_GET['fin-start']);
     }
     if (Arr::get($_GET, 'fin-end')) {
         $query['financial_time']['$lt'] = strtotime($_GET['fin-end']) + 86399;
     }
     if (Group::current('allow_assign')) {
         $companies = DB::select('id', 'name')->from('companies')->order_by('name', 'asc')->execute()->as_array('id', 'name');
     }
     if (!Group::current('allow_assign') || Arr::get($_GET, 'company')) {
         if (Group::current('allow_assign')) {
             $company = $_GET['company'];
             if (!is_array($company)) {
                 $company = explode(',', $company);
             }
             $company = array_map('intval', $company);
         } else {
             $company = array(User::current('company_id'));
         }
         $query['user_id'] = array('$in' => DB::select('id')->from('users')->where('company_id', 'IN', $company)->execute()->as_array(NULL, 'id'));
     }
     $jobs = array();
     if (Arr::get($_GET, 'ticket')) {
         $tickets = explode(',', $_GET['ticket']);
         $q = array();
         foreach ($tickets as $ticket) {
             $ticket = preg_replace('/[^a-z0-9]/i', '', strval($ticket));
             if (!$ticket) {
                 continue;
             }
             if (preg_match('/^T1W[0-9]{12}$/', $ticket)) {
                 $q[] = $ticket;
             } else {
                 $q[] = new MongoRegex('/.*' . $ticket . '.*/i');
             }
         }
         if (count($q) > 1) {
             $jobs['_id'] = array('$in' => $q);
         } elseif ($q) {
             $jobs['_id'] = $q[0];
         }
     }
     if (Arr::get($_GET, 'fsa')) {
         $values = is_array($_GET['fsa']) ? $_GET['fsa'] : explode(',', $_GET['fsa']);
         $jobs['data.12'] = count($values) > 1 ? array('$in' => array_values($values)) : current($values);
     }
     if (Arr::get($_GET, 'fsam')) {
         $values = is_array($_GET['fsam']) ? $_GET['fsam'] : explode(',', $_GET['fsam']);
         $jobs['data.13'] = count($values) > 1 ? array('$in' => array_values($values)) : current($values);
     }
     if (Arr::get($_GET, 'fda')) {
         $values = is_array($_GET['fda']) ? $_GET['fda'] : explode(',', $_GET['fda']);
         $jobs['data.14'] = count($values) > 1 ? array('$in' => array_values($values)) : current($values);
     }
     if (Arr::get($_GET, 'address')) {
         $jobs['data.8'] = new MongoRegex('/.*' . strval($_GET['address']) . '.*/mi');
     }
     if ($jobs) {
         if (count($jobs) == 1 && isset($jobs['_id'])) {
             $query['job_key'] = $jobs['_id'];
         } else {
             $query['job_key'] = array('$in' => Database_Mongo::collection('jobs')->distinct('_id', $jobs));
         }
     }
     $sort = array('job_key' => 1);
     if (!Arr::get($_GET, 'sort')) {
         $_GET['sort'] = array('-submission');
     }
     foreach ($_GET['sort'] as $s) {
         $dir = substr($s, 0, 1) == '-' ? -1 : 1;
         $s = substr($s, 1);
         switch ($s) {
             case 'submission':
                 $sort['update_time'] = $dir;
                 break;
             case 'approval':
                 $sort['process_time'] = $dir;
                 break;
             case 'financial':
                 $sort['financial_time'] = $dir;
                 break;
         }
     }
     $result = Database_Mongo::collection('submissions')->find($query)->sort($sort);
     $submissions = array();
     $users = array();
     $jobs = array();
     $keys = array('region' => 1, 'data.8' => 1, 'data.9' => 1, 'data.14' => 1);
     foreach ($result as $submission) {
         $jobs[$submission['job_key']] = 1;
         $keys[$submission['key']] = 1;
         $submissions[$submission['job_key']][] = $submission;
         $users[$submission['user_id']] = 1;
     }
     $result = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => array_keys($jobs))), $keys);
     $jobs = array();
     foreach ($result as $job) {
         $jobs[$job['_id']] = $job;
     }
     if ($users) {
         User::get(array_keys($users));
     }
     $rates = array();
     $result = DB::select()->from('rates')->execute();
     foreach ($result as $row) {
         $rates[$row['company_id']][$row['region_id']][$row['column_id']] = $row['rate'];
     }
     $columns = Columns::get_financial();
     $approved = array();
     $duplicates = array();
     $discr = array();
     $partial = array();
     $full = array();
     $skip = array();
     if (Group::current('allow_assign') && isset($_GET['approve']) && Arr::get($_GET, 'company') && count($_GET['company']) == 1) {
         $rates = Arr::get($rates, $_GET['company'][0], array());
         foreach ($submissions as $job => $list) {
             $region = $jobs[$job]['region'];
             $data = array();
             $partial_fl = false;
             $full_fl = true;
             $dup_fl = false;
             $discr_fl = false;
             $skip_fl = false;
             foreach ($list as $submission) {
                 $data[$submission['key']][] = $submission;
             }
             foreach ($data as $key => $values) {
                 $key = substr($key, 5);
                 $rate = isset($rates[$region][$key]) ? $rates[$region][$key] : (isset($rates[0][$key]) ? $rates[0][$key] : 0);
                 $value = array_shift($values);
                 if (count($values)) {
                     $dup_fl = true;
                     $full_fl = false;
                 } elseif ($value['value'] != Arr::path($jobs, $job . '.data.' . $key)) {
                     $discr_fl = true;
                     $full_fl = false;
                 } elseif (!$rate) {
                     $skip_fl = true;
                     $full_fl = false;
                 } elseif (!$value['financial_time']) {
                     $approved[] = array('id' => $value['_id'], 'rate' => $rate, 'paid' => min(floatval($value['value']), Arr::get($columns, $key)));
                     $partial_fl = true;
                 }
             }
             if ($partial_fl) {
                 if ($full_fl) {
                     $full[$job] = 1;
                 } else {
                     $partial[$job] = 1;
                 }
             }
             if ($skip_fl) {
                 $skip[$job] = 1;
             }
             if ($dup_fl) {
                 $duplicates[$job] = 1;
             }
             if ($discr_fl) {
                 $discr[$job] = 1;
             }
             $submissions[$job] = $data;
         }
         $time = time();
         foreach ($approved as $value) {
             Database_Mongo::collection('submissions')->update(array('_id' => $value['id']), array('$set' => array('paid' => $value['paid'], 'rate' => $value['rate'], 'financial_time' => $time)));
         }
         $count = count($jobs);
         $jobs = Database_Mongo::collection('jobs')->find(array('_id' => array('$in' => array_keys($jobs))));
         foreach ($jobs as $job) {
             Utils::calculate_financial($job);
         }
         Messages::save(sprintf('%d/%d tickets were successfully approved.', count($full), $count), 'success');
         if ($partial) {
             Messages::save(sprintf('%d tickets were partially approved.', count($partial)), 'warning');
         }
         if ($discr) {
             Messages::save(sprintf('%d tickets contain discrepancies.', count($discr)), 'danger');
         }
         if ($duplicates) {
             Messages::save(sprintf('%d tickets contain duplicates.', count($duplicates)), 'danger');
         }
         if ($skip) {
             Messages::save(sprintf('%d tickets contain submissions with unknown rates.', count($skip)), 'danger');
         }
         $this->redirect($this->request->uri() . URL::query(array('approve' => NULL)));
     } elseif (isset($_GET['export'])) {
         $discr = isset($_GET['discrepancy']);
         header('Content-type: text/csv');
         header('Content-disposition: filename="Submissions.' . date('Ymd', $start) . '-' . date('Ymd', $end) . '.' . date('YmdHi', time()) . '.csv"');
         $file = tmpfile();
         $headers = array('Tickets ID', 'Submission Date', 'Approval Date', 'User');
         if (Group::current('allow_assign')) {
             $headers[] = 'Company';
         }
         $headers[] = 'Column';
         $headers[] = 'Value';
         $keys = array();
         fputcsv($file, $headers);
         foreach ($submissions as $job => $list) {
             foreach ($list as $submission) {
                 if (!$discr || Arr::path($jobs, $job . '.' . $submission['key']) != $submission['value']) {
                     $keys[$submission['key']] = 1;
                     $key = substr($submission['key'], 5);
                     $data = array($job, date('d-m-Y H:i', $submission['update_time']), Arr::get($submission, 'process_time') ? date('d-m-Y H:i', $submission['process_time']) : '', User::get($submission['user_id'], 'login'));
                     if (Group::current('allow_assign')) {
                         $data[] = Arr::get($companies, User::get($submission['user_id'], 'company_id'), 'Unknown');
                     }
                     $data[] = Columns::get_name($key);
                     $data[] = Columns::output($submission['value'], Columns::get_type($key), true);
                     fputcsv($file, $data);
                 }
             }
         }
         fseek($file, 0);
         fpassthru($file);
         fclose($file);
         die;
     } elseif (isset($_GET['excel'])) {
         $doc = PHPExcel_IOFactory::load(DOCROOT . 'financial.template.xlsx');
         $sheet = $doc->getSheet();
         $sheet->setTitle(date('d-m-Y', $start) . ' - ' . date('d-m-Y', $end));
         $s = date('M Y', $start);
         $e = date('M Y', $end);
         if ($s == $e) {
             $month = $s;
         } else {
             $month = $s . ' - ' . $e;
         }
         $map = array('G' => '190', 'H' => '191', 'I' => '192', 'J' => '193', 'K' => '194', 'L' => '195', 'M' => '196', 'N' => '197', 'O' => '198', 'P' => '199', 'Q' => '200', 'R' => '201', 'S' => '202', 'T' => '203', 'U' => '204', 'V' => '205', 'W' => '206', 'X' => '207', 'Y' => '208', 'Z' => '43', 'AA' => '257');
         $i = 10;
         $total = array();
         $amount = array();
         $users = array();
         if (count($submissions)) {
             foreach (array_merge($map, array('AC' => 0, 'AD' => 0)) as $column => $key) {
                 $sheet->setCellValue($column . '7', '=SUM(' . $column . '11:' . $column . (count($submissions) + 10) . ')');
             }
             $styleArray = array('borders' => array('allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)));
             $sheet->getStyle('B11:AD' . (count($submissions) + 10))->applyFromArray($styleArray);
         }
         foreach ($submissions as $job => $list) {
             $job = Database_Mongo::collection('jobs')->findOne(array('_id' => $job));
             $data = Arr::get($job, 'data');
             $inst_min = false;
             $inst_max = false;
             $app_min = false;
             $app_max = false;
             $result = array();
             $rate = array();
             foreach ($list as $submission) {
                 $users[$submission['user_id']] = 1;
                 $inst = $submission['update_time'];
                 if ($inst_min === false || $inst_min > $inst) {
                     $inst_min = $inst;
                 }
                 if ($inst_max === false || $inst_max < $inst) {
                     $inst_max = $inst;
                 }
                 $app = Arr::get($submission, 'process_time', false);
                 if ($app_min === false && $app !== false || $app_min > $app) {
                     $app_min = $app;
                 }
                 if ($app_max === false && $app !== false || $app_max < $app) {
                     $app_max = $app;
                 }
                 $key = substr($submission['key'], 5);
                 $result[$key] = $submission['paid'];
                 $rate[$key] = $submission['rate'];
             }
             $sum = 0;
             foreach ($result as $key => $value) {
                 $sum += $value * $rate[$key];
                 $total[$key] = Arr::get($total, $key, 0) + $value * $rate[$key];
                 $amount[$key] = Arr::get($amount, $key, 0) + $value;
             }
             $i++;
             $inst_min = date('d-m-Y', $inst_min);
             $inst_max = date('d-m-Y', $inst_max);
             $app_min = date('d-m-Y', $app_min);
             $app_max = date('d-m-Y', $app_max);
             $sheet->setCellValue('B' . $i, $inst_min == $inst_max ? $inst_min : $inst_min . ' - ' . $inst_max)->setCellValue('C' . $i, $app_min == $app_max ? $app_min : $app_min . ' - ' . $app_max)->setCellValue('D' . $i, $job['_id'])->setCellValue('E' . $i, Arr::get($data, 8))->setCellValue('F' . $i, Arr::get($data, 14))->setCellValue('AC' . $i, $sum);
             foreach ($map as $key => $value) {
                 $sheet->setCellValue($key . $i, Arr::get($result, $value) ? $result[$value] : '');
             }
         }
         foreach ($map as $key => $value) {
             $sheet->setCellValue($key . '10', Arr::get($amount, $value) ? $total[$value] / $amount[$value] : '');
         }
         if ($users) {
             $companies = DB::select('name')->from('companies')->where('id', 'IN', DB::select('company_id')->distinct(true)->from('users')->where('id', 'IN', array_keys($users)))->execute()->as_array(NULL, 'name');
         } else {
             $companies = array('None');
         }
         $sheet->setCellValue('D2', implode(', ', $companies))->setCellValue('D3', $month);
         header('Content-type: application/xlsx');
         header('Content-disposition: filename="Report.xlsx"');
         $name = tempnam(sys_get_temp_dir(), 'excel');
         $writer = new PHPExcel_Writer_Excel2007($doc);
         $writer->setPreCalculateFormulas(true);
         $writer->save($name);
         readfile($name);
         unlink($name);
         die;
     }
     $discrepancies = array();
     foreach ($submissions as $job => $list) {
         $fl = false;
         foreach ($list as $submission) {
             if (Arr::path($jobs, $job . '.' . $submission['key']) != $submission['value']) {
                 $fl = true;
                 break;
             }
         }
         if (!$fl) {
             $discrepancies[$job] = 1;
         }
     }
     $view = View::factory("Reports/Financial")->set('approve_all', $start > 0 && date('m', $start) == date('m', $end) && Arr::get($_GET, 'company') && count($_GET['company']) == 1 && !Arr::get($_GET, 'fin-start'))->bind('companies', $companies)->bind('submissions', $submissions)->bind('discrepancies', $discrepancies)->bind('columns', $columns)->bind('jobs', $jobs)->bind('rates', $rates);
     $this->response->body($view);
 }
コード例 #14
0
ファイル: Export.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     $action = $this->request->param('id');
     $ids = array_keys(Arr::get($_POST, 'job', array()));
     if (!$ids) {
         throw new HTTP_Exception_404('Not found');
     }
     $regs = DB::select('region_id')->from('user_regions')->where('user_id', '=', User::current('id'))->execute()->as_array('region_id', 'region_id');
     $query = array();
     if ($regs) {
         $query['region'] = array('$in' => array_values($regs));
     }
     if (!Group::current('show_all_jobs')) {
         $query['$or'] = array(array('ex' => intval(User::current('company_id'))), array('companies' => intval(User::current('company_id'))));
     }
     $query['_id'] = array('$in' => $ids);
     $jobs = Database_Mongo::collection('jobs')->find($query);
     $static = array_flip(explode(',', Group::current('columns')));
     $header = array('Ticket ID');
     $types = DB::select('id', 'name')->from('job_types')->execute()->as_array('id', 'name');
     $companies = DB::select('id', 'name')->from('companies')->execute()->as_array('id', 'name');
     if ($action == 'excel') {
         $result = DB::select()->from('attachments')->where('job_id', 'IN', $ids)->and_where('uploaded', '>', 0)->and_where('folder', '<>', 'Signatures')->execute()->as_array();
         $attachments = array();
         $attachments_list = array();
         foreach ($result as $row) {
             $attachments[$row['job_id']] = Arr::get($attachments, $row['job_id'], 0) + 1;
             if (preg_match('/^image\\/.*$/i', $row['mime'])) {
                 $attachments_list[$row['job_id']][] = $row['id'];
             }
         }
     } elseif ($ids && $static['attachments']) {
         $attachments = DB::select('job_id', DB::expr('COUNT(*) as cnt'))->from('attachments')->where('job_id', 'IN', $ids)->and_where('uploaded', '>', 0)->and_where('folder', '<>', 'Signatures')->group_by('job_id')->execute()->as_array('job_id', 'cnt');
     } else {
         $attachments = array();
     }
     if (Group::current('allow_assign')) {
         $result = Database_Mongo::collection('submissions')->aggregate(array(array('$match' => array('job_key' => array('$in' => $ids), 'active' => 1)), array('$group' => array('_id' => '$job_key', 'count' => array('$sum' => 1)))));
         $submissions = array();
         foreach (Arr::get($result, 'result', array()) as $value) {
             $submissions[$value['_id']] = $value['count'];
         }
     }
     if (isset($static['last_update'])) {
         $header[] = 'Last update';
     }
     if (isset($static['last_submit'])) {
         $header[] = 'Last submit';
     }
     if (isset($static['status']) && Group::current('show_all_jobs')) {
         $header[] = 'Job status';
     }
     if (isset($static['types'])) {
         $header[] = 'Assigned works';
     }
     if (isset($static['companies'])) {
         $header[] = 'Assigned companies';
     }
     if (isset($static['ex'])) {
         $header[] = 'Previously assigned companies';
     }
     if (isset($static['pending'])) {
         $header[] = 'Pending submissions';
     }
     if (isset($static['attachments'])) {
         $header[] = 'Attachments';
     }
     foreach (Columns::get_search() as $id => $type) {
         $header[] = Columns::get_name($id);
     }
     if ($action == 'excel') {
         $excel = new PHPExcel();
         $sheet = $excel->getActiveSheet();
         $sheet->setTitle('Search Results');
         $sheet->fromArray($header, NULL, 'A1');
         $i = 1;
         foreach (range('A', $sheet->getHighestDataColumn()) as $col) {
             $sheet->getColumnDimension($col)->setAutoSize(true);
         }
         $x = $attachments_list ? max(array_map('count', $attachments_list)) : 0;
         foreach (range(0, $x - 1) as $col) {
             $sheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex(count($header) + $col))->setWidth(14);
         }
     } else {
         $file = tmpfile();
         fputcsv($file, $header);
     }
     foreach ($jobs as $ticket) {
         $row = array($ticket['_id']);
         if (isset($static['last_update'])) {
             $row[] = date('d-m-Y H:i', Arr::get($ticket, 'last_update', $ticket['created']));
         }
         if (isset($static['last_submit'])) {
             $row[] = Arr::get($ticket, 'last_submit') ? date('d-m-Y H:i', $ticket['last_submit']) : '';
         }
         if (isset($static['status']) && Group::current('show_all_jobs')) {
             $row[] = Arr::get(Enums::$statuses, Arr::get($ticket, 'status', 0), 'Unknown');
         }
         if (isset($static['types'])) {
             if (Group::current('allow_assign')) {
                 $row[] = implode(', ', array_intersect_key($types, Arr::get($ticket, 'assigned', array())));
             } else {
                 $row[] = implode(', ', array_intersect_key($types, array_filter(Arr::get($ticket, 'assigned', array()), function ($x) {
                     return $x == User::current('company_id');
                 })));
             }
         }
         if (isset($static['companies'])) {
             $row[] = implode(', ', array_intersect_key($companies, array_flip(Arr::get($ticket, 'assigned', array()))));
         }
         if (isset($static['ex'])) {
             $row[] = implode(', ', array_intersect_key($companies, array_flip(Arr::get($ticket, 'ex', array()))));
         }
         if (isset($static['pending'])) {
             $row[] = Arr::get($submissions, $ticket['_id']);
         }
         if (isset($static['attachments'])) {
             $row[] = Arr::get($attachments, $ticket['_id']);
         }
         foreach (Columns::get_search() as $id => $type) {
             $row[] = Arr::path($ticket, array('data', $id)) ? Columns::output($ticket['data'][$id], Columns::get_type($id), true) : '';
         }
         if ($action == 'excel') {
             $i++;
             $sheet->fromArray($row, NULL, 'A' . $i);
             $x = count($row);
             if (isset($attachments_list[$ticket['_id']])) {
                 $sheet->getRowDimension($i)->setRowHeight(80);
             }
             foreach (Arr::get($attachments_list, $ticket['_id'], array()) as $image) {
                 if (!file_exists(DOCROOT . 'storage/' . $image . '.thumb')) {
                     if (!file_exists(DOCROOT . 'storage/' . $image)) {
                         continue;
                     }
                     $data = file_get_contents(DOCROOT . 'storage/' . $image);
                     $er = error_reporting(0);
                     $img = imagecreatefromstring($data);
                     error_reporting($er);
                     if (!$img) {
                         continue;
                     }
                     $x = imagesx($img);
                     $y = imagesy($img);
                     $size = max($x, $y);
                     $x = round($x / $size * 96);
                     $y = round($y / $size * 96);
                     $thumb = imagecreatetruecolor($x, $y);
                     imagealphablending($thumb, false);
                     imagesavealpha($thumb, true);
                     imagecopyresampled($thumb, $img, 0, 0, 0, 0, $x, $y, imagesx($img), imagesy($img));
                     imagepng($thumb, DOCROOT . 'storage/' . $image . '.thumb', 9);
                 }
                 $data = file_get_contents(DOCROOT . 'storage/' . $image . '.thumb');
                 $img = imagecreatefromstring($data);
                 $objDrawing = new PHPExcel_Worksheet_MemoryDrawing();
                 $objDrawing->setImageResource($img);
                 $coord = PHPExcel_Cell::stringFromColumnIndex($x++);
                 $objDrawing->setCoordinates($coord . $i);
                 $objDrawing->setOffsetY(5);
                 $objDrawing->setResizeProportional(true);
                 $objDrawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG);
                 $objDrawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT);
                 $objDrawing->setWorksheet($sheet);
                 //$sheet->getCell($coord . $i)->setHyperlink(new PHPExcel_Cell_Hyperlink(URL::site('download/attachment/' . $image, 'http'), 'Show Image'));
             }
         } else {
             fputcsv($file, $row);
         }
     }
     if ($action == 'excel') {
         $name = tempnam(sys_get_temp_dir(), 'excel');
         header('Content-type: application/xlsx');
         header('Content-disposition: filename="SearchResults.xlsx"');
         $writer = new PHPExcel_Writer_Excel2007($excel);
         $writer->save($name);
         readfile($name);
         unlink($name);
     } else {
         fseek($file, 0);
         header('Content-type: text/csv');
         header('Content-disposition: filename="SearchResults.csv"');
         fpassthru($file);
         fclose($file);
     }
     die;
 }
コード例 #15
0
ファイル: Jobs.php プロジェクト: nikulinsanya/exeltek
 public function action_index()
 {
     $token = Arr::get($_REQUEST, 'token');
     if (!API::check($token)) {
         die(json_encode(array('success' => false, 'error' => 'forbidden')));
     }
     $regs = DB::select('region_id')->from('user_regions')->where('user_id', '=', User::current('id'))->execute()->as_array(NULL, 'region_id');
     $query = array('companies' => intval(User::current('company_id')));
     if ($regs) {
         $query['region'] = array('$in' => $regs);
     }
     $result = Database_Mongo::collection('jobs')->find($query, array('created' => '1', 'last_update' => 1));
     $jobs = array();
     Form::$static_title[] = 245;
     $columns = array_flip(array_merge(array_keys(Columns::get_static()), Form::$static_title));
     $columns[8] = 1;
     $columns[12] = 1;
     $columns[13] = 1;
     $columns[14] = 1;
     foreach (Form::$columns as $type => $list) {
         foreach ($list as $keys => $name) {
             foreach (explode(',', $keys) as $key) {
                 if (is_numeric($key)) {
                     $columns[$key] = 1;
                 }
             }
         }
     }
     foreach ($result as $job) {
         $jobs[$job['_id']] = Arr::get($job, 'last_update') ?: Arr::get($job, 'created');
     }
     $list = array();
     foreach ($columns as $column => $value) {
         $value = array('n' => Columns::get_name($column));
         $type = Columns::get_type($column);
         if ($type) {
             if (substr($type, 0, 4) == 'enum') {
                 $value['t'] = 'enum';
                 $value['m'] = Enums::is_multi(substr($type, 5));
                 $value['v'] = array_values(Enums::get_values(substr($type, 5)));
             } else {
                 $value['t'] = Columns::get_type($column);
             }
         }
         $list[$column] = $value;
     }
     $columns = $list;
     ksort($columns);
     $form = array();
     foreach (Form::$columns as $id => $list) {
         foreach ($list as $key => $value) {
             $form[$id][] = array('k' => $key, 'v' => $value);
         }
     }
     if (isset($_GET['gzip'])) {
         die(gzcompress(json_encode(array('success' => true, 'columns' => $columns, 'static' => Form::$static_title, 'form' => $form, 'jobs' => $jobs)), 9));
     } else {
         header('Content-type: application/json');
         die(json_encode(array('success' => true, 'columns' => $columns, 'static' => Form::$static_title, 'form' => $form, 'jobs' => $jobs)));
     }
 }