<?php
class ShipmentsController extends AppController {

    var $name = 'Shipments';
    var $helpers = array('Html', 'Form');


    var $paginate = array(

	    'contain' => false,
	    'limit' => 300,
	    'recursive' => 1

    );

    function index($type = 'all') {




	$this->Shipment->recursive = 0;

	switch($type) {

	    case 'all':
		$conditions = array();
		break;

	    case 'import':

		$conditions =  array('Shipment.type'=>1);


		break;


	    case 'direct':
		$conditions = array('Shipment.type'=>2);

		break;


	    case 'export':
		$conditions = array('Shipment.type'=>3);



		break;

	    case 'local':
		$conditions = array('Shipment.type'=>4);
		break;


	    default:



	}
	$this->set('shipments', $this->paginate($conditions));
	$this->set('type', $type);


	$principles = $this->Shipment->Principle->find('list');
	$freightForwarders = $this->Shipment->FreightForwarder->find('list');
	$shipmentType = $this->typeOptions(false);
	$shipmentTypeShort = $this->typeOptions(true);
	$currencies = $this->Shipment->ShipmentInvoice->Currency->find('list', array('fields'=>array('Currency.id','Currency.iso4217')));
	$principles =  $this->Shipment->Principle->find('list');
	$this->set(compact('principles', 'freightForwarders', 'shipmentType', 'shipmentTypeShort', 'currencies', 'principles'));

    }

    function view($id = null) {
	if (!$id) {
	    $this->Session->setFlash(__('Invalid Shipment.', true));
	    $this->redirect(array('action'=>'index'));
	}
	$this->set('shipment', $this->Shipment->read(null, $id));
    }


    function add() {
	$principles = $this->Shipment->Principle->find('list');
	$freightForwarders = $this->Shipment->FreightForwarder->find('list');
	$shipmentType = $this->typeOptions(false);
	$shipmentTypeShort = $this->typeOptions(true);
	$currencies = $this->Shipment->ShipmentInvoice->Currency->find('list');
	$invoiceType = $this->invoiceTypeOptions();
	$this->set('yesNo', array(0=>'No', 1=>'Yes'));
	$this->set(compact('principles', 'freightForwarders', 'shipmentType', 'shipmentTypeShort', 'currencies','invoiceType', 'yesNo'));

    }

    function edit($id = null) {

	if(isset($id)) {
	    if (empty($this->data)) {
		$this->data = $this->Shipment->read(null, $id);

		$address = $this->Shipment->Address->find('first', array('conditions'=>array('Address.id'=>$this->data['Shipment']['address_id']),'recursive'=>0));


		$principles = $this->Shipment->Principle->find('list');
		$freightForwarders = $this->Shipment->FreightForwarder->find('list');
		$shipmentType = $this->typeOptions(false);
		$shipmentTypeShort = $this->typeOptions(true);
		$currencies = $this->Shipment->ShipmentInvoice->Currency->find('list');

		$invoiceType = $this->invoiceTypeOptions();
		$this->set('yesNo', array(0=>'No', 1=>'Yes'));

		$this->set(compact('principles', 'freightForwarders', 'shipmentType', 'shipmentTypeShort', 'currencies','invoiceType', 'yesNo', 'address'));



	    }
	}

    }


    function ajax_edit() {
	$this->layout = 'ajax';
	if(!empty($this->data)) {
	    //$this->Shipment->create($this->data);

	    $shipment_id = $this->data['Shipment']['id'];

	    $this->Shipment->Box->deleteAll(array('shipment_id'=>$shipment_id));
	    $this->Shipment->ShipmentInvoice->deleteAll(array('shipment_id'=>$shipment_id));


	    if ($this->Shipment->saveAll($this->data)) {

		$this->Shipment->Box->updateCounterCache(array('shipment_id'=>$shipment_id));
		$this->Shipment->ShipmentInvoice->updateCounterCache(array('shipment_id'=>$shipment_id));

		/*$boxIDs = array();
		foreach($this->data['Box'] as $box) {
		    $boxIDs[] = $box['id'];

		}

		$invoiceIDs = array();
		foreach($this->data['ShipmentInvoice'] as $si) {
		    $invoiceIDs[] = $si['id'];
		}
		print_r($boxIDs);*/

		if($this->data['Shipment']['type'] > 1) {
		    $jobIDs = array();
		    foreach($this->data['Job'] as $job) {
			foreach($job as $index => $id) {
			    $jobIDs[] = $id;
			}
		    }

		    $this->Shipment->Job->updateAll(array('Job.all_sent' => 1), array('Job.id'=>$jobIDs));
		}
		//print_r($this->data);


		echo "SUCCESS";
	    }
	    else {
		echo "FAILURE";
	    }


	}
	else {
	    echo "NO-DATA";
	}

    }


    function ajax_add() {
	$this->layout = 'ajax';
	if(!empty($this->data)) {
	    $this->Shipment->create($this->data);

	    if ($this->Shipment->saveAll($this->data)) {
		echo "SUCCESS";

	    }
	    else {
		echo "FAILURE";
	    }


	}
	else {
	    echo "NO-DATA";
	}

    }





    function markJobsSent() {

    }


    /* Moved the Views for Adding/Editing to elements. Called from the Index.
     *
     * function add($action = 'add') {

	$principles = $this->Shipment->Principle->find('list');
	$freightForwarders = $this->Shipment->FreightForwarder->find('list');
	$shipmentType = $this->typeOptions();
	$this->set(compact('principles', 'freightForwarders', 'shipmentType'));
    }*/



    function invoiceTypeOptions() {
	$options = array('', 'Freight','Customs','Principle');
	return $options;
    }

    function typeOptions($short = false) {
	if($short == false) {
	    $options = array('','Import: Principle to CMC','Direct: Principle to Customer','Export','Local');
	}
	else {
	    $options = array('','Import','Direct','Export','Local');
	}

	return $options;
    }



	function delete($id = null) {
		$this->layout = 'ajax';
		if ($this->Shipment->del($id)) {
			return "Deleted"; // This should be returning status codes
		}
		else {
			return "Fail"; //All over the app.		
		}
    }


    function reports() {
	$invoices = $this->Shipment->ShipmentInvoice->find('all');

	/*foreach($shipments as $shipment) {
	    foreach($shipment['ShipmentInvoice'] as $si) {
		if($si['deferred_gst'] == 1) {
		    echo $si['deferred_gst_amount']."\n";
		}
	    }
	}*/


	$Fyears = $this->getFinancialYears($invoices);
	$this->set('Fyears',$Fyears);

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

    }


    function getFinancialYears($shipments) {

	$Fyears = array();

	foreach($shipments as $shipment) {

	    $time = strtotime($shipment['ShipmentInvoice']['date_issued']);
	    $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;
    }

    function viewReport($year, $month = null) {
	$this->layout = 'ajax';


	if(isset($month) && isset($year)) { //After a Specific Month for a Year



	    $startDate = $year.'-'.$month.'-01';

	    $startDateTime = strtotime($startDate);

	    $numberOfDaysInMonth = date('t', $startDateTime);

	    $endDate = $year.'-'.$month.'-'.$numberOfDaysInMonth;

	    $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');



	    $jobRangeTitle = $monthStrings[$month]." $year";
	    $shipmentInvoices = $this->Shipment->ShipmentInvoice->find('all', array('recursive'=>1, 'conditions'=>
		    array('ShipmentInvoice.date_issued BETWEEN ? AND ?'=>array($startDate, $endDate)),
		    'order'=>'ShipmentInvoice.date_issued ASC'));

	    $shipments = $this->Shipment->find('all');


	    $jobList = array();
	    foreach($shipments as $shipment) {
		$jobListString = '';
		foreach($shipment['Job'] as $job) {
		    $jobListString .= '<a href="/jobs/view/'.$job['id'].'">'.$job['title'].'</a> '; //Goddamn
		    //$html->link($job['Job']['title'], '/jobs/view/'.$job['Job']['id']).' ';
		   

		}
		$jobList[$shipment['Shipment']['id']] = $jobListString;
 	    }

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

	    /*   $dateStringFormat = 'j F Y';
	    $dateString['first'] = date($dateStringFormat, $firstDayUnix);
	    $dateString['last'] = date($dateStringFormat, $lastDayUnix);
	    */
	    $this->set('jobRangeTitle', $jobRangeTitle);

	    $this->set('year', $year);
	    $this->set('month', $month);
	    $this->set('shipments',$shipmentInvoices); //ugh.

	  

	//    $this->set('totals', $this->getTotals($jobs));

	    $this->set('principleList',$this->Shipment->Job->Enquiry->Principle->find('list'));

	    $this->set('startDate',$startDate);
	    $this->set('endDate',$endDate);


	}

	elseif(isset($year) && !isset($month)) { //Requested a whole Financial Year Jobs



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

	    $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);


	    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'

		$jobs = $this->Job->find('all', array('conditions'=>
			array('Job.date_order_received BETWEEN ? AND ?'=>array($firstDayDate, $lastDayDate))
			)
		);

		$lastYear = $year - 1;
		$jobRangeTitle = $lastYear.' - '.$year.' ('.$dateString['first']." to ".$dateString['last'].')';

	    }

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

	    $this->set('shipments',$shipments);
	    $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', )



    }


    function setInvoiceDates() {

	$shipments = $this->Shipment->find('all');

	foreach($shipments as $shipment) {
	    
	    $created = $shipment['Shipment']['created'];

	    foreach($shipment['ShipmentInvoice'] as $si) {
	       
		$this->Shipment->ShipmentInvoice->id = $si['id'];
		$this->data = $si;
		$this->data['created'] = $created;
		$this->data['date_issued'] = date('Y-m-d', strtotime($created));
		if($this->Shipment->ShipmentInvoice->save($this->data)) {
		    	echo 'Updated '.$si['id']."to have {$created} as created and date_issued"."<br>";
		}
		else {
		    echo "Unable to save ".$si['id']."<br>";
		}
	}
	}

    }

}
?>
