cmc-sales/controllers/jobs_controller.php

689 lines
16 KiB
PHP
Raw Normal View History

<?php
class JobsController extends AppController {
var $name = 'Jobs';
2011-04-07 03:21:46 -07:00
var $helpers = array('Html', 'Form', 'Text', 'Javascript', 'Number');
var $components = array('RequestHandler');
2010-07-07 23:25:55 -07:00
var $paginate = array(
'contain' => false,
'limit' => 200,
'order'=>array('Job.id' => 'desc')
2010-07-07 23:25:55 -07:00
);
2011-04-12 18:26:38 -07:00
function index($showUnpaid = null, $showUnsent = null) {
$this->Job->recursive = 1;
2011-04-12 18:26:38 -07:00
2011-04-12 18:26:38 -07:00
2011-04-12 18:28:45 -07:00
if(!empty($showUnpaid) && !empty($showUnsent)) {
2011-04-12 18:26:38 -07:00
$conditions = array(
'Job.all_paid' => 0,
'Job.all_sent' => 0,
);
}
2011-04-12 18:28:45 -07:00
else if(!empty($showUnpaid)) {
2011-04-12 18:26:38 -07:00
$conditions = array(
'Job.all_paid' => 0,
2011-04-12 18:26:38 -07:00
);
}
2011-04-12 18:28:45 -07:00
else if(!empty($showUnsent)) {
2011-04-12 18:26:38 -07:00
$conditions = array(
'Job.all_sent' => 0,
);
}
else {
$conditions = array();
}
$this->set('jobs', $this->paginate($conditions));
$this->set('customers', $this->Job->Enquiry->Customer->find('list'));
$this->set('currencies', $this->Job->Currency->find('list'));
2011-04-19 01:07:27 -07:00
$this->set('principleList',$this->Job->Enquiry->Principle->find('list'));
2011-03-22 00:05:56 -07:00
$this->set('sale_category_options', $this->sale_category_options());
$this->set('sale_category_array', $this->sale_category_array());
$this->set('job_type_options', $this->job_type_options());
$this->set('shipment_category_options', $this->shipment_category_options());
$this->set('freight_paid_by_options',$this->freight_paid_options());
$this->set('gst_options', $this->gst_options());
}
/** Called via AJAX to get an editable row */
function getEditableRow($id) {
$this->layout = 'ajax';
2011-04-12 18:26:38 -07:00
$job = $this->Job->find('first', array('conditions'=>array('Job.id'=>$id)));
$this->set('job', $job);
$this->data = $job;
$this->set('shipment_category_options', $this->shipment_category_options());
$this->set('yesNo', array(0=>'No', 1=>'Yes'));
$this->set('currencies', $this->Job->Currency->find('list'));
$this->set('sale_category_options', $this->sale_category_options());
$this->set('sale_category_array', $this->sale_category_array());
$this->set('job_type_options', $this->job_type_options());
$this->set('freight_paid_by_options',$this->freight_paid_options());
$this->set('gst_options', $this->gst_options());
$this->set('job_status_options', $this->job_status_options());
$this->set('principleList',$this->Job->Enquiry->Principle->find('list'));
}
/** Called via AJAX to get an viewable row */
function getViewableRow($id) {
$this->layout = 'ajax';
$this->set('job', $this->Job->find('first', array('conditions'=>array('Job.id'=>$id))));
$this->set('sale_category_options', $this->sale_category_options());
$this->set('sale_category_array', $this->sale_category_array());
$this->set('job_type_options', $this->job_type_options());
$this->set('shipment_category_options', $this->shipment_category_options());
$this->set('freight_paid_by_options',$this->freight_paid_options());
$this->set('gst_options', $this->gst_options());
$this->set('principleList',$this->Job->Enquiry->Principle->find('list'));
2011-04-06 19:26:26 -07:00
}
2011-04-06 00:03:07 -07:00
function reports() {
2011-04-06 19:26:26 -07:00
$this->Job->recursive = 0;
$jobs = $this->Job->find('all', array('fields'=>array('Job.date_order_received'), 'order'=>array('Job.date_order_received'=>'asc')));
//$monthList = $this->getYearMonths($jobs);
2011-04-06 19:26:26 -07:00
//$this->set('monthList', $monthList);
2011-05-11 23:39:39 -07:00
$Fyears = $this->getFinancialYears($jobs);
$this->set('Fyears',$Fyears);
2011-04-06 19:26:26 -07:00
/* $this->set('jobs', $jobs);
2011-04-06 00:03:07 -07:00
$this->set('customers', $this->Job->Enquiry->Customer->find('list'));
2011-04-06 19:26:26 -07:00
$this->set('currencies', $this->Job->Currency->find('list'));*/
}
2011-04-06 00:03:07 -07:00
2011-04-06 19:26:26 -07:00
2011-05-11 23:39:39 -07:00
function viewReport($year, $month = null) {
2011-05-12 17:52:17 -07:00
$this->layout = 'ajax';
2011-04-06 19:26:26 -07:00
if(isset($month) && isset($year)) { //After a Specific Month for a Year
2011-05-12 20:16:06 -07:00
2011-05-12 19:52:53 -07:00
$startDate = $year.'-'.$month.'-01';
$startDateTime = strtotime($startDate);
$numberOfDaysInMonth = date('t', $startDateTime);
2011-05-12 19:52:53 -07:00
$endDate = $year.'-'.$month.'-'.$numberOfDaysInMonth;
2011-05-12 20:16:06 -07:00
$monthStrings = array(
'01'=>'January',
'02'=> 'February',
'03'=>'March',
'04'=> 'April',
'05'=> 'May',
'06'=> 'June',
'07'=> 'July',
'08'=> 'August',
'09'=> 'September',
'10'=> 'October',
'11'=> 'November',
'12' => 'December');
2011-05-12 20:16:06 -07:00
$jobRangeTitle = $monthStrings[$month]." $year";
$jobs = $this->Job->find('all', array('conditions'=>
2011-05-12 19:52:53 -07:00
array('Job.date_order_received BETWEEN ? AND ?'=>array($startDate, $endDate)),
2011-05-12 20:16:06 -07:00
'order'=>'Job.date_order_received ASC'));
2011-05-12 19:52:53 -07:00
2011-05-12 20:16:06 -07:00
/* $dateStringFormat = 'j F Y';
2011-05-12 19:52:53 -07:00
$dateString['first'] = date($dateStringFormat, $firstDayUnix);
$dateString['last'] = date($dateStringFormat, $lastDayUnix);
2011-05-12 20:16:06 -07:00
*/
2011-05-12 19:52:53 -07:00
$this->set('jobRangeTitle', $jobRangeTitle);
2011-05-11 23:39:39 -07:00
$this->set('year', $year);
$this->set('month', $month);
$this->set('jobs', $jobs);
2011-05-12 20:16:06 -07:00
$this->set('totals', $this->getTotals($jobs));
$this->set('principleList',$this->Job->Enquiry->Principle->find('list'));
$this->set('startDate',$startDate);
$this->set('endDate',$endDate);
}
2011-05-11 23:39:39 -07:00
elseif(isset($year) && !isset($month)) { //Requested a whole Financial Year Jobs
2011-05-12 17:52:17 -07:00
$this->set('year', $year);
2011-05-11 23:39:39 -07:00
$lastDayUnix = $this->getLastDayFY($year);
$firstDayUnix = $this->getFirstDayFY($year,true);
$lastDayDate = date('Y-m-d', $lastDayUnix);
$firstDayDate = date('Y-m-d', $firstDayUnix);
$dateStringFormat = 'j F Y';
$dateString['first'] = date($dateStringFormat, $firstDayUnix);
$dateString['last'] = date($dateStringFormat, $lastDayUnix);
2011-05-11 23:39:39 -07:00
2011-05-12 17:52:17 -07:00
if($year == 0) { //Jobs with an empty 'date_order_received
$jobs = $this->Job->find('all', array('conditions'=>array('Job.date_order_received'=>'0000-00-000')));
$jobRangeTitle = "Jobs without Order Received date";
}
else { //We're looking for Jobs that have an 'date_order_received'
2011-05-11 23:39:39 -07:00
2011-05-12 17:52:17 -07:00
$jobs = $this->Job->find('all', array('conditions'=>
array('Job.date_order_received BETWEEN ? AND ?'=>array($firstDayDate, $lastDayDate))
)
);
2011-05-11 23:39:39 -07:00
2011-05-12 17:52:17 -07:00
$lastYear = $year - 1;
$jobRangeTitle = $lastYear.' - '.$year.' ('.$dateString['first']." to ".$dateString['last'].')';
2011-05-12 20:16:06 -07:00
2011-05-12 17:52:17 -07:00
}
2011-05-11 23:39:39 -07:00
$this->set('jobRangeTitle', $jobRangeTitle);
2011-05-12 17:52:17 -07:00
$this->set('jobs',$jobs);
2011-05-11 23:39:39 -07:00
$this->set('principleList',$this->Job->Enquiry->Principle->find('list'));
$this->set('sale_category_options', $this->sale_category_options());
$this->set('sale_category_array', $this->sale_category_array());
$this->set('job_type_options', $this->job_type_options());
$this->set('shipment_category_options', $this->shipment_category_options());
$this->set('freight_paid_by_options',$this->freight_paid_options());
$this->set('gst_options', $this->gst_options());
$this->set('totals', $this->getTotals($jobs));
// print_r($totals);
//print_r($jobs);
}
else {
echo "Failure";
}
//$this->set('jobs', )
2011-04-06 19:26:26 -07:00
}
2011-05-10 16:44:56 -07:00
/**
2011-05-11 23:39:39 -07:00
* Generate aggregates for the financial data in $jobs.
2011-05-10 16:44:56 -07:00
*
* Procedure:
* 1. Loop over the $jobs.
* 2. Check if this job is cancelled or on hold.
* 3. If not, add each $job[$field] to the total.
*
* @param <type> $jobs
*/
2011-05-11 23:39:39 -07:00
function getTotals($jobs) {
$fields = array(
2011-05-12 17:52:17 -07:00
'company_gross_sales_aud' => 'total',
'net_sales_aud' =>'total',
'gross_profit_aud' => 'total',
'net_export_sales_aud' => 'total',
'gross_profit_exports_aud' => 'total',
'gp_percent' => 'average_gp',
2011-05-12 17:52:17 -07:00
'gross_australian_sales_foreign_currency' => 'total',
'net_australian_sales_foreign_currency' => 'total',
'gross_profit_value_australian_sales_foreign_currency' => 'total',
'gross_export_sales_foreign_currency' => 'total',
'net_export_sales_foreign_currency' => 'total',
'gross_profit_value_after_discount_exports_foreign_currency' => 'total',
'gross_commissions' => 'total',
'net_commissions' => 'total'
);
2011-05-11 23:39:39 -07:00
$totals = array();
foreach($fields as $field => $action) {
$totals[$field] = 0;
}
2011-05-12 17:52:17 -07:00
2011-05-11 23:39:39 -07:00
$jobCount = 0;
foreach($jobs as $job) {
if($job['Job']['job_status'] == 'JOB CANCELLED' ||
$job['Job']['job_status'] == 'JOB ON HOLD' ) {
continue; //Don't total cancelled or on hold jobs.
}
else { //Total all other jobs.
foreach(array_keys($job['Job']) as $key) {
if(isset($fields[$key])) {
$totals[$key] += $job['Job'][$key];
}
}
2011-05-12 17:52:17 -07:00
2011-05-11 23:39:39 -07:00
$jobCount++;
}
}
foreach($totals as $key => $value) {
if($fields[$key] == 'average') {
$avg = $value / $jobCount;
$totals[$key] = $avg;
}
}
2011-05-12 17:52:17 -07:00
2011-05-11 23:39:39 -07:00
return $totals;
2011-05-10 16:44:56 -07:00
}
2011-05-11 23:39:39 -07:00
function getFinancialYears($jobs) {
$Fyears = array();
foreach($jobs as $job) {
$time = strtotime($job['Job']['date_order_received']);
$year = date('Y', $time); //ISO-8601 year number
$startFYunix = $this->getFirstDayFY($year); //1 July of $year.
if($time < $startFYunix) { //Date is before 1 July $year.
$lastYear = $year - 1;
if(!isset($Fyears[$year])) {
$Fyears[$year] = 1;
}
else {
$Fyears[$year]++;
}
}
else { //Date is After 1 July $year.
$nextYear = $year + 1;
if(!isset($Fyears[$nextYear])) {
$Fyears[$nextYear] = 1;
}
else {
$Fyears[$nextYear]++;
}
}
}
krsort($Fyears); //Sort the array in reverse order, most recent to oldest.
return $Fyears;
}
2011-05-12 17:34:47 -07:00
/**
2011-05-12 17:52:17 -07:00
*
2011-05-12 17:34:47 -07:00
* @param <type> $year
* @param <type> $prevYear
2011-05-12 17:52:17 -07:00
* @return <type>
2011-05-12 17:34:47 -07:00
*/
2011-05-11 23:39:39 -07:00
function getFirstDayFY($year,$prevYear = false) {
if($prevYear == false) {
return mktime(0,0,0,7,1,$year);
2011-05-11 23:39:39 -07:00
}
else {
return mktime(0,0,0,7,1,$year-1);
}
}
2011-05-12 17:34:47 -07:00
/**
*
* @param <type> $year
2011-05-12 17:52:17 -07:00
* @return <type>
2011-05-12 17:34:47 -07:00
*/
2011-05-11 23:39:39 -07:00
function getLastDayFY($year) {
return mktime(23,59,59,6,30,$year);
2011-05-12 17:34:47 -07:00
}
function getMonthsFY($year) {
2011-05-12 17:52:17 -07:00
}
function job_status_options() {
$options = array('ORDER RECEIVED FROM CUSTOMER',
2011-04-06 19:26:26 -07:00
'ORDER PLACED ON PRINCIPLE - WAITING ON DELIVERY',
'GOODS SHIPPED TO CUSTOMER',
'WAITING ON DELIVERY',
'MULTIPLE SHIPMENTS CMC WAITING ON ANOTHER DELIVERY',
'GOODS DELIVERED TO CUSTOMER',
2011-04-06 19:26:26 -07:00
'JOB CANCELLED',
'JOB ON HOLD',
'CUSTOMER TO PAY 100% WITH ORDER'
);
2011-04-06 19:26:26 -07:00
$options = $this->buildEnumOpts($options);
return $options;
}
2011-03-22 00:05:56 -07:00
/**
* For the 'sale_category' column.
*/
function sale_category_options() {
$options['Australian Sale'] = array(
0 => "AS: Australian Customer & Australian Destination (GST Applies)",
1 => "AS: Overseas Customer & Australian Destination (GST Applies)",
2 => "AS: Commission from Australian Company or Supplier (GST Applies)",
);
$options['Exports'] = array(
3 => "EX: Overseas Customer & Overseas Destination (no GST)",
4 => "EX: Australian Customer & Overseas Destination (no GST)",
5 => "EX: Commission from Overseas Company (no GST)"
);
return $options;
}
/** For viewing the sale Cat */
function sale_category_array() {
$options = array(
0 => "AS: Australian Customer & Australian Destination (GST Applies)",
1 => "AS: Overseas Customer & Australian Destination (GST Applies)",
2 => "AS: Commission from Australian Company or Supplier (GST Applies)",
3 => "EX: Overseas Customer & Overseas Destination (no GST)",
4 => "EX: Australian Customer & Overseas Destination (no GST)",
5 => "EX: Commission from Overseas Company (no GST)"
);
return $options;
}
/**
* Build the Array for 'job_type'
*/
function job_type_options() {
//$options = array('INDENT','STOCK','COMMISSION','SERVICE');
$options = array('GOODS','SERVICES');
$enumOpts = $this->buildEnumOpts($options);
return $enumOpts;
}
function shipment_category_options() {
$options = array(
0 => '',
1 => 'Indent - via CMC',
2 => 'Direct - Principle to final',
3 => 'Stock',
4 => 'No Shipment'
);
return $options;
}
function freight_paid_options() {
$options = array('CMC', 'CUSTOMER');
return $this->buildEnumOpts($options);
}
function gst_options() {
$options = array(1=>'YES', 0=>'NO');
return $options;
}
function buildEnumOpts($options) {
2011-03-31 22:23:52 -07:00
$enumOpts = array();
foreach($options as $opt) {
$enumOpts[$opt] = $opt;
}
return $enumOpts;
}
2011-03-31 22:23:52 -07:00
function ajax_edit() {
if(!empty($this->data)) {
if ($this->Job->save($this->data)) {
echo "SUCCESS";
}
else {
echo "FAILURE";
}
}
else {
return;
}
}
2011-03-22 00:05:56 -07:00
function view($id = null) {
if (!$id) {
$this->flash(__('Invalid Job', true), array('action'=>'index'));
}
$job = $this->Job->read(null, $id);
$emailIDs = array();
foreach($job['Email'] as $email) {
$emailIDs[] = $email['id'];
}
$emails = $this->Job->Email->find('all', array('conditions'=>array('Email.id'=>$emailIDs)));
$this->set('emails', $emails);
2010-05-17 23:45:38 -07:00
$this->set('job', $job);
$this->set('customer', $this->Job->Enquiry->Customer->findById($job['Enquiry']['customer_id']));
$this->set('principles', $this->Job->PurchaseOrder->Principle->find('list'));
$this->pageTitle = $job['Job']['title'];
2010-05-17 23:45:38 -07:00
}
function save_jobs() {
if(isset($this->data)) {
//$data = json_decode($this->data);
2011-06-19 22:12:41 -07:00
// print_r($this->data);
}
}
2011-04-18 23:04:40 -07:00
function ajax_add($enquiryID) {
$this->layout = 'ajax';
if(!isset($enquiryID)) {
return;
}
else {
$this->Job->create();
$job_offset = 6141;
$number_of_jobs = $this->Job->findCount();
$new_job_number = $job_offset + $number_of_jobs;
$enquiry = $this->Job->Enquiry->findById($enquiryID);
$monthYearShort = strtoupper(date("My"));
$jobLetter = $enquiry['State']['enqform'];
$this->data['Job']['title'] = $monthYearShort.$jobLetter."J".$new_job_number;
$this->data['Job']['state_id'] = $enquiry['Enquiry']['state_id'];
$this->data['Job']['customer_id'] = $enquiry['Enquiry']['customer_id'];
$this->data['Job']['contact_id'] = $enquiry['Enquiry']['contact_id'];
$this->data['Job']['enquiry_id'] = $enquiry['Enquiry']['id'];
$this->data['Job']['date_order_received'] = date('Y-m-d');
2011-04-19 01:07:27 -07:00
if ($this->Job->save($this->data)) {
2011-04-18 23:04:40 -07:00
echo "SUCCESS";
2011-04-19 01:07:27 -07:00
}
else {
echo "FAILURE";
}
2011-04-18 23:04:40 -07:00
}
}
2010-06-07 21:11:06 -07:00
function __isNotEmptyDate($date) {
if($date == "0000-00-00") {
return true;
}
else {
return false;
}
}
2010-06-07 21:11:06 -07:00
2011-05-11 23:39:39 -07:00
function autocomplete() {
2011-04-28 00:41:36 -07:00
$this->layout = 'ajax';
$query = strtolower($_GET["term"]);
//$this->set('customers_json', print_r($this->data));
if($query == null) {
return;
}
App::import('Core', 'Sanitize');
$query = Sanitize::clean($query);
$jobs = $this->Job->find('list', array(
'conditions' => array(
'Job.title LIKE' => '%'.$query.'%'
),'fields' => array('Job.title'),
'order' => array('Job.title ASC')
));
//print_r($POs);
foreach ($jobs as $id => $job) {
$job_list[] = array('id'=> $id, 'label' => $job);
}
$jobs_json = json_encode($job_list);
$this->set('jobs_json', $jobs_json);
}
2011-06-16 17:54:09 -07:00
function markDeleted($id) {
$this->layout = 'ajax';
if(!$id) {
echo "FAILURE";
}
else {
$this->Job->read(null, $id);
$this->Job->set('deleted', true);
if($this->Job->save()) {
echo "SUCCESS";
}
else {
echo "FAILURE";
}
}
}
function markUndeleted($id) {
$this->layout = 'ajax';
if(!$id) {
echo "FAILURE";
}
else {
$this->Job->read(null, $id);
$this->Job->set('deleted', false);
if($this->Job->save()) {
echo "SUCCESS";
}
else {
echo "FAILURE";
}
}
}
/**
* Need to fix the customer_id which hasn't been set for these 500odd records.
*
* Will fetch the right ID the same way the Index does, then update each record.
*/
2011-03-14 20:22:09 -07:00
/*function fixJobs() {
$jobs = $this->Job->find('all');
foreach($jobs as $job) {
$this->Job->id = $job['Job']['id'];
$this->data = $job;
$this->data['Job']['customer_id'] = $job['Enquiry']['customer_id'];
$this->data['Job']['state_id'] = $job['Enquiry']['state_id'];
$this->data['Job']['contact_id'] = $job['Enquiry']['contact_id'];
$this->Job->save($this->data);
}
$this->set('jobs', $this->Job->find('all'));
2010-06-07 21:11:06 -07:00
2011-03-14 20:22:09 -07:00
}*/
2011-03-22 00:05:56 -07:00
}
?>