<?php
class DocumentsController extends AppController {

	var $name = 'Documents';
	var $helpers = array('Html', 'Form', 'Number', 'Decimal');


	var $paginate = array(
		'contain' => true,
		'limit' => 200,
		'order'=>array('Document.id' => 'desc')
	);

	var $components = array('Email');

	function index() {
		$this->Document->recursive = 0;
		//$this->set('documents', $this->paginate());
		//print_r$($this->params["named"]["page"]);

		$query = "SELECT id,type,created,user_id,doc_page_count, pdf_filename,pdf_created_at, pdf_created_by_user_id FROM documents As Document ORDER BY id DESC LIMIT 1000;";
		$this->set('documents', $this->Document->query($query));

		$this->set('users', $this->Document->User->getUsersList());
	}

	function view($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid Document.', true));
			$this->redirect(array('action'=>'index'));
		}
		//$document = $this->Document->read(null,$id);
		$document = $this->Document->find('first', array('conditions' => array('Document.id' => $id), 'recursive'=>1));

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

		$this->data = $document;
		$docType = $this->Document->getDocType($document);
		$this->set('docType', $docType);

		$this->set('docTypeFullName', $this->Document->getDocFullName($docType));
		$this->set('users', $this->Document->User->getUsersList());

		$this->set('currency', $this->Document->getCurrency($document));
		$enquiry = $this->Document->getEnquiry($document);
		$this->set('enquiry', $enquiry);
		if($enquiry) {
			$this->set('jobs', $this->Document->Invoice->Job->find('list', 
				array('conditions'=> array('Job.customer_id' => $enquiry['Enquiry']['customer_id']), 'recursive' =>0, 'order'=>'id DESC')));
		}


		$customerAddresses = $this->Document->User->Enquiry->BillingAddress->find('all', array('conditions'=>array('BillingAddress.customer_id' => $enquiry['Enquiry']['customer_id'])));


		/* (2013). This STILL feels like an ugly hack. But it gets the desired effect and it will do for now. Screw it. */
		if(isset($customerAddresses[0]['BillingAddress'])) {
			foreach ($customerAddresses as $address) {
				$i = $address['BillingAddress']['id'];
				$billing_address_list[$i] = $address['BillingAddress']['address'].'<br>'.$address['BillingAddress']['city'].' '.$address['State']['name'].' '.$address['BillingAddress']['postcode'].'<br>'.up($address['Country']['name']).'<br><br>';
			}
			$this->set('billing_addresses_list', $billing_address_list);
			$this->set('shipping_addresses_list', $billing_address_list);
		}
		else {
			$this->set('billing_addresses_list', 'No Addresses exist for this Customer. Please add one');
			$this->set('shipping_addresses_list', 'No Addresses exist for this Customer. Please add one');
		}

		$this->set('attachments', $this->Document->DocumentAttachment->find('all', array('conditions'=>array('document_id'=> $id))));
		$this->set('principles', $this->Document->LineItem->Product->Principle->find('list'));

		switch($docType) {
		case 'quote':
			$docTypeElement = 'document_quote_view';
			break;
		case 'invoice':
			$docTypeElement = 'document_invoice_view';
			$this->set('currencies', $this->Document->Invoice->Currency->find('list'));
			$this->set('invoice', $this->Document->Invoice->find('first', array('conditions'=>array('Invoice.id'=>$document['Invoice']['id']))));
			break;
		case 'purchaseOrder':
			$docTypeElement = 'document_purchase_order_view';
			$this->set('currencies', $this->Document->PurchaseOrder->Currency->find('list'));
			$this->set('purchaseOrder', $this->Document->PurchaseOrder->find('first', 
				array('conditions'=>
					array('PurchaseOrder.id' => $document['PurchaseOrder']['id'])
					)
				));

			break;
		case 'orderAck':
			$this->set('currencies', $this->Document->OrderAcknowledgement->Currency->find('list'));
			$this->set('job', $this->Document->OrderAcknowledgement->Job->find('first', array('conditions'=>array('Job.id'=>$document['OrderAcknowledgement']['job_id']))));
			$docTypeElement = 'document_orderack_view';
			break;

		case 'packingList':
			$docTypeElement = 'document_packinglist_view';
			$this->set('currencies', $this->Document->Invoice->Currency->find('list'));
			$this->set('packing_list', $this->Document->PackingList->find('first', array('conditions'=>array('PackingList.id'=>$document['PackingList']['id']))));
			break;
		}

		$this->set('docTypeElement', $docTypeElement);
		//	$this->set('principles', $this->Document->LineItem->Product->Principle->find('list'));
	}


	function getProducts($principleID = null) {
		$this->layout = 'ajax';

		if($principleID == null) {
			echo "INVALID PRINCIPLE ID";
		}
		else {
			$products = $this->Document->LineItem->Product->find('list', array('conditions'=>array('Product.principle_id'=>$principleID)));
			$this->set('products',$products);
		}
	}


	/**
	 * Return a JSON object of the Product.
	 */
	function getProductDetails($productID = null) {
		$this->layout = 'ajax';

		if($productID == null) {
			echo "INVALID PRODUCT ID";
		}
		else {
			$product = $this->Document->LineItem->Product->find('first',array('conditions'=>array('Product.id'=>$productID)));
			$this->set('product',$product);
		}
	}


	function getAttachments($documentID) {
		$this->layout = 'ajax';
		if(!$documentID) {
			echo "FAIL";
		}
		else {
			$this->set('attachments', $this->Document->DocumentAttachment->find('all', array('conditions'=>array('document_id'=> $documentID))));
		}
	}

	function getAttachmentsByPrinciple($principleID) {
		$this->layout = 'ajax';
		if(!$principleID) {
			echo "FAIL";
		}
		else {
			$attachments = $this->Document->DocumentAttachment->Attachment->find('all', array('conditions'=>array('principle_id'=> $principleID, 'archived'=>0)));
			$this->set('attachments', $attachments);
		}
	}

	function saveAttachments() {
		$this->layout = 'ajax';
		if($this->data) {
			$attachments = array();
			foreach($this->data['DocumentAttachment']['attachment_id'] as $i => $attachment_id) {
				$docID = $this->data['DocumentAttachment']['document_id'];
				$query = "DELETE FROM document_attachments WHERE document_id = {$docID} AND attachment_id = {$attachment_id}";
				$this->Document->DocumentAttachment->query($query);

				$attachment[$i]['DocumentAttachment']['document_id'] = $this->data['DocumentAttachment']['document_id'];
				$attachment[$i]['DocumentAttachment']['attachment_id'] = $attachment_id;
			}
			if($this->Document->DocumentAttachment->saveAll($attachment)) { 
				echo "SUCCESS";
			}
			else {
				echo "FAIL";
			}
		}
	}

	function removeAttachments() {
		$this->layout = 'ajax';
		foreach($this->data['DocumentAttachment'] as $attachment) {

			$this->Document->DocumentAttachment->delete($attachment['id']);
		}
		echo 'SUCCESS';
	}


	/**
	 * Create a New Document
	 *
	 *
	 * @param string $type
	 * @param int $id
	 * @param int $jobid
	 * @param int $source_document_id
	 */
	function newDocument($type = null, $enquiryid = null, $jobid = 0, $source_document_id = null) {
		if(!$type) {
			$this->Session->setFlash('Invalid Doc Type or ID');
		}

		$this->Document->create();

		switch($type) {
		case "quote":

			$enquiry = $this->Document->Quote->Enquiry->findById($enquiryid);

			if(!$enquiry) {
				$this->Session->setFlash('Invalid Enquiry ID');
				$this->redirect(array('action'=>'index'));
				return;
			}


			$this->data['Quote']['enquiry_id'] = $enquiryid;
			$number_of_revisions = $this->Document->Quote->findCount('Quote.enquiry_id ='. $enquiryid);
			$this->data['Document']['revision'] = $number_of_revisions;
			$this->data['Quote']['date_issued'] = date('Y-m-d');
			$this->data['Quote']['currency_id'] = 2; //All new Quotes default to AUD.

			$this->data['Document']['user_id']= $enquiry['Enquiry']['user_id'];

			$this->data['Document']['type'] = 'quote';
			break;
		case "invoice":

			$invoice_number_offset = 4436; //What Invoice number we are up to. Starting at 4500 due to the data loss.

			$number_of_invoices = $this->Document->Invoice->findCount();

			$enquiry = $this->Document->Invoice->Enquiry->read(null, $enquiryid);
			if(!$enquiry) {
				$this->Session->setFlash('Invalid Enquiry ID');
				$this->redirect(array('action'=>'index'));
				return;
			}

			$newInvoiceNumber = $invoice_number_offset + $number_of_invoices;
			$this->data['Invoice']['enquiry_id'] = $enquiryid;
			$this->data['Invoice']['title'] = "CMCIN".$newInvoiceNumber;
			$this->data['Invoice']['job_id'] = $jobid;
			$this->data['Invoice']['customer_id'] = $enquiry['Enquiry']['customer_id'];

			$this->data['Document']['user_id']= $enquiry['Enquiry']['user_id'];
			//$number_of_revisions = $this->Document->Invoice->findCount('Invoice.enquiry_id ='. $enquiryid);
			$this->data['Document']['revision'] = 0; //No revisions for Invoices. I have decreed it!
			$this->data['Document']['type'] = 'invoice';

			$this->data['Invoice']['issue_date'] = date('Y-m-d'); //Argh. Quote model uses 'date_issed'.
			$this->data['Invoice']['due_date'] = date("Y-m-d", strtotime("+30 days"));


			$this->data['Invoice']['currency_id'] = 2; //All new Invoices default to AUD.


			if(isset($source_document_id)) {
				//This is not ideal. But nothing else is either.
				$sourceDoc = $this->Document->find('first', array('conditions' => array('Document.id' => $source_document_id)));
				if($sourceDoc['Document']['type'] == 'orderAck') {
					$oa_attribues = array(
						'ship_via',
						'fob',
						'estimated_delivery'
					);

					foreach($oa_attribues as $attr) {
						$this->data['Invoice'][$attr] = $sourceDoc['OrderAcknowledgement'][$attr];
					}
				}

			}


			break;
		case "purchaseOrder":
			//$enquiry = $this->Document->OrderAcknowledgement->Enquiry->read(null, $enquiryid);
			$count = $this->Document->PurchaseOrder->findCount();
			$count++;
			$offset = 2060;
			$count += $offset;
			$newPOnumber = "CMCPO".$count;
			$this->data['PurchaseOrder']['title'] = $newPOnumber;
			$this->data['PurchaseOrder']['issue_date'] = date('Y-m-d');

			$this->data['PurchaseOrder']['deliver_to'] = <<<ENDDELIVER
CMC TECHNOLOGIES PTY LTD<br>
Unit 19, 77 Bourke Road<br>
Alexandria NSW 2015 AUSTRALIA<br>
ENDDELIVER;

			//Fuck it all.
			$this->data['PurchaseOrder']['shipping_instructions'] = <<<ENDINSTRUCTIONS

<b>PART SHIPMENT:</b> Not Acceptable - please advise ASAP if production of an Item will Delay the Dispatch of the Complete Order by the Date Required stated above.<br>
<b>INSURANCE:</b> DO NOT INSURE - Insurance effected by CMC<br>
<b>SECURITY:</b> It is essential that the cargo is prepared & handled so as not to compromise its security standing.<br>
<b>SHIPMENT MARKINGS:</b><br>
(Please put red fragile stickers on boxing)<br>
CMC TECHNOLOGIES PTY LTD<br>
UNIT 19, 77 BOURKE ROAD<br>
ALEXANDRIA NSW 2015 AUSTRALIA<br>
ENDINSTRUCTIONS;


			$currentuser = $this->GetCurrentUser();
			$this->data['Document']['user_id'] = $currentuser['User']['id'];
			$this->data['Document']['revision'] = 0; //No revisions for POs. I have decreed it!
			$this->data['Document']['doc_page_count'] = 0;
			$this->data['Document']['type'] = 'purchaseOrder';
			break;
		
		
		case "orderAck":
			$enquiry = $this->Document->OrderAcknowledgement->Enquiry->read(null, $enquiryid);
			$this->data['OrderAcknowledgement']['job_id'] = $jobid;
			$this->data['OrderAcknowledgement']['enquiry_id'] = $enquiryid;
			$this->data['OrderAcknowledgement']['currency_id'] = 2; //Default to AUD.
			$this->data['Document']['user_id']= $enquiry['Enquiry']['user_id'];
			$this->data['Document']['revision'] = 0; //No revisions for Order Acks. I have decreed it!
			$this->data['Document']['type'] = 'orderAck';
			break;


		case "packingList";
			$this->data['Document']['type'] = 'packingList';


			$packing_number_offset = 6500; //What PL number we are up to. Starting at 6500 to avoid conflicts

			$number_of_packinglists = $this->Document->PackingList->findCount();

			$enquiry = $this->Document->PackingList->Enquiry->read(null, $enquiryid);
			if(!$enquiry) {
				$this->Session->setFlash('Invalid Enquiry ID');
				$this->redirect(array('action'=>'index'));
				return;
			}

			$newPackingNumber = $packing_number_offset + $number_of_packinglists;
			$this->data['PackingList']['enquiry_id'] = $enquiryid;
			$this->data['PackingList']['title'] = "CMCPL".$newPackingNumber;
			$this->data['PackingList']['job_id'] = $jobid;
			$this->data['PackingList']['customer_id'] = $enquiry['Enquiry']['customer_id'];

			$this->data['Document']['user_id']= $enquiry['Enquiry']['user_id'];
			//$number_of_revisions = $this->Document->Invoice->findCount('Invoice.enquiry_id ='. $enquiryid);
			$this->data['Document']['revision'] = 0; //No revisions for Invoices. I have decreed it!
			$this->data['Document']['type'] = 'packingList';

			$this->data['PackingList']['issue_date'] = date('Y-m-d'); //Argh. Quote model uses 'date_issed'.




			if(isset($source_document_id)) {
				//This is not ideal. But nothing else is either.
				$sourceDoc = $this->Document->find('first', array('conditions' => array('Document.id' => $source_document_id)));
				
				$source_attribues = array(
					'ship_via',
					'fob',
					'estimated_delivery'
				);

				if($sourceDoc['Document']['type'] == 'orderAck') {
					foreach($oa_attribues as $attr) {
						$this->data['PackingList'][$attr] = $sourceDoc['OrderAcknowledgement'][$attr];
					}
				}
				if($sourceDoc['Document']['type'] == 'invoice') {
					foreach($oa_attribues as $attr) {
						$this->data['PackingList'][$attr] = $sourceDoc['Invoice'][$attr];
					}
				}


			}

			break;
		
		
		}

		if(isset($source_document_id)) {
			$sourceDoc = $this->Document->find('first', array('conditions' => array('Document.id' => $source_document_id)));


			$copy_doc_attributes = array('cmc_reference', 'shipping_details', 'bill_to', 'ship_to');
			foreach($copy_doc_attributes as $attr) {
				$this->data['Document'][$attr] = $sourceDoc['Document'][$attr];
			}

			
			$this->data['LineItem'] = $this->copy_related($sourceDoc, 'LineItem', array('id', 'document_id', 'costing_id'));

		}
		if ($this->Document->saveAll($this->data)) {
			$newid = $this->Document->id;
			$this->Session->setFlash(__('The Document has been saved', true));
			$this->redirect(array('action'=>'view',$newid));
		} else {
			$this->Session->setFlash(__('The Document could not be saved. Something went wrong! Ensure all fields are entered correctly.', true));
		}


	}


	/**
	 * Revise a Document.
	 *
	 * @param int $id - the document ID we want to make a new revision of.
	 * @return <type>
	 */

	function revise($id = null) {
		if(!$id) {
			$this->Session->setFlash('Invalid Document ID');
			return;
		}

		$document = $this->Document->find('first', array('conditions' => array('Document.id' => $id)));
		$this->set('document', $document);

		$this->Document->create();

		if(!empty($document['Invoice']['id'])) {
			echo "WE HAVE AN INVOICE";
		}
		else if (!empty($document['Quote']['id'])) {

			//First setup the Date and default valid until date. (30 days from today).

			$today_date = date("Y-m-d");
			$valid_until = date("Y-m-d", strtotime("+30 days"));

			$newDoc = array();


			$newDoc['Quote'] = $this->unset_keys($document['Quote'], array('id','created'));

			$newDoc['Quote']['date_issued'] = $today_date;
			$newDoc['Quote']['days_valid'] = 30;
			$newDoc['Quote']['valid_until'] = $valid_until;

			$enquiryid = $document['Quote']['enquiry_id'];
			$number_of_revisions = $this->Document->Quote->findCount('Quote.enquiry_id ='. $enquiryid);
			$newDoc['Document']['revision'] = $number_of_revisions;
			$newDoc['Document']['type'] = 'quote';


			$newDoc['DocPage'] = $document['DocPage'];

			foreach($newDoc['DocPage'] as $index => $li) {
				$newDoc['DocPage'][$index]['id'] = null;
				$newDoc['DocPage'][$index]['document_id'] = null;
			}

		}

		else if (!empty($document['PurchaseOrder']['id'])) {
			echo "WE ARE REVISING A PO";
		}


		else if (!empty($document['OrderAcknowledgement']['id'])) {
			echo "WE ARE REVISING An ORDER ACK";
		}


		/** Copy the LineItems from this Document. Applies to all of the Document Types */
		
		$newDoc['LineItem'] = $this->copy_related($document, 'LineItem', array('id', 'document_id', 'costing_id'));

		$newDoc['DocumentAttachment'] = $this->copy_related($document, 'DocumentAttachment', 'id', 'document_id');


		$this->set('newDoc', $newDoc);
		
		if ($this->Document->saveAll($newDoc)) {
			$newid = $this->Document->id;
			$this->Session->setFlash(__("Revision {$number_of_revisions} created", true));
			$this->redirect(array('action'=>'view',$newid));
		} else {
			$this->Session->setFlash(__('The Document could not be saved. Please, try again.', true));
		}

	}


	function ajax_edit($id = null) {
		$this->layout = 'ajax';

		if (!$id && empty($this->data)) {
			echo 'Invalid Document ID';
		}
		if (!empty($this->data)) {
			$docID = $this->data['Document']['id'];
			//this is retarded. I think we delete and re-create each page each time..
			$this->Document->DocPage->deleteAll(array('document_id'=>$docID));
			$this->Document->DocPage->updateCounterCache(array('document_id'=>$docID));

			if(isset($this->data['PurchaseOrder'])) {
				//Delete all the existing JobPurchaseOrder relationships for this PO.
				//Fuck it. @TODO SQL injection potential here.
				$query = "DELETE FROM jobs_purchase_orders WHERE purchase_order_id =".$this->data['PurchaseOrder']['id'];
				$result = $this->Document->query($query);

			}

			if(isset($this->data['PurchaseOrder']['Job'])) {
						//Loop over the submitted Jobs and add them. Fuck CakePHP is a piece of shit. 
				//This is easier than using the fucking built in crap that doesnt work. 
				//Fuck everything about this.
				$po_id = $this->data['PurchaseOrder']['id'];
				foreach($this->data['PurchaseOrder']['Job'] as $job_id) {
					$query = "INSERT INTO `cmc`.`jobs_purchase_orders` (`id`, `job_id`, `purchase_order_id`) VALUES (NULL, '{$job_id}', '{$po_id}');";
					$this->Document->query($query);
				}
				$result = $this->Document->PurchaseOrder->saveAll($this->data['PurchaseOrder']);

				
				//die(print_r($this->data['PurchaseOrder']));
				//die(print_r($result));
				//die(print_r($this->data));
			}

			if ($this->Document->saveAll($this->data)) {
				echo 'SUCCESS'; //this is so stupid
			} else {
				echo 'FAILURE';
			}
		}
		else {
			echo 'FAILURE';
		}
	}


	/**
	 *
	 * Convert a Quote to an OrderAcknowledgement.
	 *
	 * Create a new Job for the Enquiry.
	 *
	 * Make a new Document (orderack) with the same LineItems as Quote with Document ID #$id
	 *
	 *
	 */
	function convert_to_oa() {
		$this->layout = 'ajax';
		if (empty($this->data)) {
			echo 'FAILURE';
		}
		else {
			$id = $this->data['Document']['id'];

			$originalDoc = $this->Document->find('first', array('conditions' => array('Document.id' => $id)));

			$enquiry = $this->Document->OrderAcknowledgement->Enquiry->find('first', array('conditions'=>array('Enquiry.id'=>$originalDoc['Quote']['enquiry_id'])));
			$enquiry['Enquiry']['status_id'] = 3; //Job Won, Order Placed

			$this->Document->OrderAcknowledgement->Enquiry->save($enquiry);

			$customer = $this->Document->OrderAcknowledgement->Enquiry->Customer->find('first', array('conditions'=>array('Customer.id'=>$enquiry['Enquiry']['customer_id'])));

			$customer['Customer']['customer_category_id'] = 3; //make Customer a Creditor

			$this->Document->OrderAcknowledgement->Enquiry->Customer->save($customer);

			$newDoc = array();
			if($this->data['Job']['create_new_job']) {
				$job = $this->Document->OrderAcknowledgement->Job->newJob($enquiry, $this->data['Job']['customer_order_number']); //Only way to know Enquiry ID is if it's a Quote. 
				$newDoc['OrderAcknowledgement']['job_id'] = $job['Job']['id'];

			}

			$newDoc['Document']['type'] = 'orderAck';
			$newDoc['OrderAcknowledgement']['enquiry_id'] = $enquiry['Enquiry']['id'];
			$newDoc['OrderAcknowledgement']['currency_id'] = 2; //Default to AUD.
			$newDoc['OrderAcknowledgement']['issue_date'] = date('Y-m-d');

			$newDoc['Document']['user_id']= $enquiry['Enquiry']['user_id'];
			$newDoc['Document']['revision'] = 0; //No revisions for Order Acks. I have decreed it!
			$newDoc['Document']['type'] = 'orderAck';

			if(isset($enquiry['BillingAddress']['id'])) {
				$newDoc['Document']['bill_to'] = '<b>'.$customer['Customer']['name'].'</b><br/>';
				$newDoc['Document']['bill_to'] .= $this->Document->OrderAcknowledgement->Enquiry->formatAddress($enquiry['BillingAddress']['id'], 'BillingAddress');
			}

			if(isset($enquiry['ShippingAddress']['id'])) {
				$newDoc['Document']['ship_to'] = '<b>'.$customer['Customer']['name'].'</b><br/>';
				$newDoc['Document']['ship_to'] .= $this->Document->OrderAcknowledgement->Enquiry->formatAddress($enquiry['ShippingAddress']['id'], 'ShippingAddress');
			}


			$newDoc['LineItem'] = $this->copy_related($originalDoc, 'LineItem', array('id', 'document_id', 'costing_id'));
			$newDoc['DocumentAttachment'] = $this->copy_related($originalDoc, 'DocumentAttachment', array('id', 'document_id'));

			/** Copy the LineItems from this Document. Applies to all of the Document Types */


			if ($this->Document->saveAll($newDoc)) {
				$newid = $this->Document->id;
				if(isset($job)) {
					$this->Session->setFlash(__("Job {$job['Job']['title']} and Order Acknowledgement created", true));
				}
				else {
					$this->Session->setFlash(__("Order Acknowledgement created", true));
				}
				$this->redirect(array('action'=>'view',$newid));
			} else {
				$this->Session->setFlash(__('The Document could not be saved. Please, try again.', true));
			}
			$this->Document->saveAll($newDoc);
		}
	}


	function pdf($id = null) {
		//Configure::write('debug',0);
		if(!$id) {
			$this->Session->setFlash(__('Invalid Document', true));
			$this->redirect(array('controller'=>'documents', 'action'=>'index'));
		}

		$document = $this->Document->read(null,$id);

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

		$this->data = $document;

		$docType = $this->Document->getDocType($document);
		$docTypeFullName = $this->Document->getDocFullName($docType);



		$currency = $this->Document->getCurrency($document);
		$enquiry = $this->Document->getEnquiry($document);

		$this->set('docType', $docType);
		$this->set('docTypeFullName',strtoupper($docTypeFullName));
		$this->set('currency',$currency);
		$this->set('currencyCode', $currency['Currency']['iso4217']);
		$this->set('currencySymbol', $currency['Currency']['symbol']);

		$gst = $enquiry['Enquiry']['gst'];

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

		if($gst == 1) {
			$totalsDescText = array(
				'subtotal' => 'SUBTOTAL',
				'gst' => 'GST (10%)',
				'total' => 'TOTAL DUE'
			);
		}
		else {
			$totalsDescText = array(
				'subtotal' => 'SUBTOTAL',
				'gst' => 'GST (10%)',
				'total' => 'TOTAL PAYABLE'
			);
		}


		$totals = $this->calculateTotals($document, $gst);
		$this->set('totals',$totals);
		$this->set('totalsDescText',$totalsDescText);

		$this->set('currency', $currency);
		$this->set('enquiry', $enquiry);

		$this->set('principlesList', $this->Document->LineItem->Product->Principle->find('list'));

		$this->set('products', $document['LineItem']);
		$this->set('states', $this->Document->Invoice->Enquiry->State->find('list'));


		//Set filename for the document.
		//
		switch($docType) {
		case "quote":
			$filename = $enquiry['Enquiry']['title'];
			$template_name = 'pdf_quote';
			break;

		case "invoice":
			$filename = $document['Invoice']['title'];
			$this->set('docTitle', $document['Invoice']['title']);
			$this->set('job', $this->Document->Invoice->Job->find('first', array('conditions'=>array('Job.id'=>$document['Invoice']['job_id']))));
			$this->set('issue_date_string', date('d F Y', strtotime($document['Invoice']['issue_date'])));

			$this->set('ship_via', $document['Invoice']['ship_via']);
			$this->set('fob', $document['Invoice']['fob']);
			$template_name = 'pdf_invoice';
			break;

		case "purchaseOrder":
			$principle = $this->Document->LineItem->Product->Principle->find('first', array('conditions'=>array('Principle.id' => $document['PurchaseOrder']['principle_id'])));
			
			$this->set('principle', $principle);
			$purchase_order = $this->Document->PurchaseOrder->find('first', 
				array('conditions'=>array('PurchaseOrder.id' => $document['PurchaseOrder']['id'])));
			$this->set('purchase_order', $purchase_order); 

			$totalsDescText = array(
				'subtotal' => 'SUBTOTAL',
				'gst' => 'GST',
				'total' => 'ORDER TOTAL'
			);
			//No GST for POs for now.	
			if($principle['Country']['id'] == 1) {
				$totals = $this->calculateTotals($document, 1);
			}
			else {
				$totalsDescText['gst'] = '';
				$totals = $this->calculateTotals($document, 0);
			}

			$this->set('totals',$totals);
			$this->set('totalsDescText',$totalsDescText);
			
			$filename = $document['PurchaseOrder']['title'];
			
			$issue_date = date('l, j F Y', strtotime($document['PurchaseOrder']['issue_date']));
			$this->set('issue_date', $issue_date);
			$template_name = 'pdf_po';
			break;

		case "orderAck":

			$job = $this->Document->OrderAcknowledgement->Job->find('first', array('conditions'=>array('Job.id'=>$document['OrderAcknowledgement']['job_id'])));

			$filename = $job['Job']['title'].'_OrderAcknowledgement';
			$this->set('docTitle', $job['Job']['title']);

			$this->set('docTypeFullName', 'JOB'); //So it doesnt say CMC order Ack # in the pdf_shipping_billing_box. This string is too long
			$this->set('job', $job);
			$this->set('issue_date_string', date('d F Y', strtotime($document['OrderAcknowledgement']['issue_date'])));

			$this->set('ship_via', $document['OrderAcknowledgement']['ship_via']);
			$this->set('fob', $document['OrderAcknowledgement']['fob']);
			$this->set('estimated_delivery', $document['OrderAcknowledgement']['estimated_delivery']);

			$template_name = 'pdf_orderack';
			break;

		case "packingList":
			$filename = $document['PackingList']['title'];
			$this->set('docTitle', $document['PackingList']['title']);
			$this->set('job', $this->Document->PackingList->Job->find('first', array('conditions'=>array('Job.id'=>$document['PackingList']['job_id']))));
			$this->set('issue_date_string', date('d F Y', strtotime($document['PackingList']['issue_date'])));

			$this->set('ship_via', $document['PackingList']['ship_via']);
			$this->set('fob', $document['PackingList']['fob']);
			$template_name = 'pdf_packinglist';

		break;
		
		}

		if($document['Document']['revision'] > 0) {
			$filename = $filename.'_'.$document['Document']['revision'].'.pdf';
		}
		else {
			$filename = $filename.'.pdf';
		}

		$this->set('filename', $filename);
		$document['Document']['pdf_filename'] = $filename;
		$document['Document']['pdf_created_at'] = date('Y-m-d H:i:s');
		$document['Document']['pdf_created_by_user_id'] = $this->getCurrentUserID();
		if($this->Document->save($document)) {
			//echo "Set pdf_filename attritbute to: ".$filename;
		}
		else {
			//echo 'Failed to set pdf_filename to: '.$filename;
		}


		$colWidths = array(
			'item' => '7%',
			'qty' => '7%',
			'desc' => '56%',
			'unit' => '15%',
			'total' => '15%'

		);

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

		$this->render($template_name);
	}


	//Called via AJAX to generate Quotation First Pages.
	function generateFirstPage($id = null) {
		$this->layout = 'ajax';

		if(!$id) {
			return;
		}

		$document = $this->Document->read(null, $id);
		$this->set('document',$document);
		$this->set('attachments', $this->Document->DocumentAttachment->find('all', array('conditions'=>array('document_id'=> $id))));
		$enquiry = $this->Document->Quote->Enquiry->read(null, $document['Quote']['enquiry_id']);
		$this->set('enquiry', $enquiry);
	}
  
  
  function email_format($a) {
    return "<".$a.">";
  }
  
  /**
   * Email the PDF(document + attachments) for this Document to a Recipient (Customer or Principle).
   *
   *
   * @param <int> $id  - Document ID
   */
  function email_pdf($id) {

    //Setup the SMTP Options
    $this->Email->smtpOptions = Configure::read('smtp_settings');
    $this->Email->delivery = 'smtp';

    $document = $this->Document->read(null,$id); 

    if(empty($document['Document']['pdf_filename'])) {
      $this->Session->setFlash(__('Error. Please generate the PDF before attempting to email it', true));
      return;
    }
    else {
      $pdf_dir = Configure::read('pdf_directory');

      $attachment_files = array($pdf_dir.$document['Document']['pdf_filename']);
      foreach($document['DocumentAttachment'] as $document_attachment) {
        $attachment = $this->Document->DocumentAttachment->Attachment->read(null, $document_attachment['attachment_id']);
        $attachment_files[] = $attachment['Attachment']['file'];
      }
      $this->Email->attachments = $attachment_files;
    
    }
    $enquiry = $this->Document->getEnquiry($document);

    $this->Email->to = $this->email_format($enquiry['Contact']['email']);

  

    $this->Email->cc = array($this->email_format($enquiry['User']['email']));
    $this->Email->bcc = array($this->email_format('carpis@cmctechnologies.com.au'));

    $this->Email->replyTo = $enquiry['User']['email'];
    $this->Email->from = 'CMC Technologies - Sales <sales@cmctechnologies.com.au>';

    $docType = $this->Document->getDocType($document);

    $template = $docType.'_email';
    $subject = $enquiry['Enquiry']['title'].' ';
    
    switch($docType) {
      case 'quote':
        $subject .= " Quotation";
        break;
      case 'invoice':
        $subject .= " Invoice";
        $this->set('invoice', $this->Document->Invoice->find('first', array('conditions'=>array('Invoice.id'=>$document['Invoice']['id']))));
        break;
      case 'purchaseOrder':
        $subject .= " Purchase Order";

        $primary_contact = $this->Document->User->find('first', array('conditions'=>array('User.principle_id' => $document['PurchaseOrder']['principle_id'],'User.primary_contact' => 1)));
        if(empty($primary_contact)) {
          
          $this->Session->setFlash(__('Unable to send. No primary Principle Contact', true));
          $this->redirect(array('action'=>'view/'.$id), null, false);
          return;
        }
        $this->Email->subject = 'CMC Technologies Purchase Order: '.$document['PurchaseOrder']['title'];

        $this->Email->to = $this->email_format($primary_contact['User']['email']);
        $this->Email->replyTo = null;
        $this->Email->cc = null;
        $this->set('job', $this->Document->PurchaseOrder->Job->find('first', array('conditions'=>array('Job.id'=>$document['OrderAcknowledgement']['job_id']))));
        break;
      case 'orderAck':
        $subject .= " Order Acknowledgement";
        $this->set('job', $this->Document->OrderAcknowledgement->Job->find('first', array('conditions'=>array('Job.id'=>$document['OrderAcknowledgement']['job_id']))));
        if ($document['OrderAcknowledgement']['signature_required']) {
          $template = 'orderAck_email_signature_required';
        } 
    }


    $this->Email->template = $template;
    $this->Email->subject = $subject;


    $this->Email->sendAs = 'both';
    $this->Email->charset = 'iso-8859-1';
    $this->set('enquiry', $enquiry);
    $this->set('document', $document); 
    $this->set('DocFullName', $this->Document->getDocFullName($document['Document']['type']));
    if($this->Email->send()) {
      $this->Session->setFlash(__('The Email has been sent', true));
      $this->redirect(array('action'=>'view/'.$id), null, false);
    }
    else {
      $this->set('smtp_errors', $this->Email->smtpError);
      print_r($this->Email->smtpError);
      $this->Session->setFlash(__('The Email has NOT been sent. Something went wrong.', true));
      //$this->redirect(array('action'=>'view/'.$id), null, false);

    }

  }

	function add_job_items_to_po($job_id, $document_id) {
		$this->layout = 'ajax';
		$job = $this->Document->PurchaseOrder->Job->find('first', array('conditions'=>array('Job.id' => $job_id)));

		$orderack = $this->Document->OrderAcknowledgement->find('first', array('conditions'=>array('OrderAcknowledgement.enquiry_id' => $job['Job']['enquiry_id']), 'recursive' => 1));

		$oa_document = $this->Document->find('first', 
			array('conditions'=> 
				array('Document.id' => $orderack['Document']['id']
				)
			)
		);

		
		$destination_document = $this->Document->find('first', array('conditions'=>array('Document.id' => $document_id)));

		$new_items = $this->copy_related($oa_document, 'LineItem', array('id', 'document_id', 'costing_id'));

		$last_item_number = 1.0;
		foreach($destination_document['LineItem'] as $item) {
			$last_item_number = $item['item_number'];
		}
		if($last_item_number != 1.0) { //Fuck knows
			$last_item_number++;
		}

		foreach($new_items as $i => $item) {
			$item['item_number'] = $last_item_number++;
			$item['document_id'] = $document_id;
			$destination_document['LineItem'][] = $item;
		}


		
		if ($this->Document->LineItem->saveAll($destination_document['LineItem'])) {
			echo 'SUCCESS';
		} 
		else {
				echo 'FAILURE';
		
		}
		
	}


	function costing() {
	}


	/** Helper function to make copying related models more DRY 
	 *
	 * @param array $document
	 * @param string $model - eg 'LineItem'
	 * @param array $keys_to_null - eg. array('id', 'document_id')
	 *
	 * */
	function copy_related($document, $model, $keys_to_null) {
		if(empty($document[$model])) {
			return null;
		}
		$newDoc[$model] = $document[$model];
		
		foreach($newDoc[$model] as $index => $ele) {
			foreach($keys_to_null as $key) {
				$newDoc[$model][$index][$key] = null;
			}
		}
		return $newDoc[$model];	
	}

}
