1060 lines
35 KiB
PHP
Executable file
1060 lines
35 KiB
PHP
Executable file
<?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.">";
|
|
}
|
|
|
|
|
|
// Do a bunch of queries to build a subject line for PO emails.
|
|
function po_email_subject($document) {
|
|
$id = $document['id'];
|
|
|
|
$subject = 'CMC Technologies Purchase Order: '.$document['title'];
|
|
|
|
$q = <<<EOT
|
|
SELECT jobs.id, title FROM jobs
|
|
JOIN jobs_purchase_orders as jpo ON (jpo.purchase_order_id = $id AND jpo.job_id = jobs.id)
|
|
|
|
EOT;
|
|
|
|
$jobs = $this->Document->query($q);
|
|
if(count($jobs) <= 0) {
|
|
return $subject;
|
|
}
|
|
$job_numbers = array();
|
|
$job_ids = array();
|
|
foreach($jobs as $job) {
|
|
$job_numbers[] = $job["jobs"]["title"];
|
|
$job_ids[] = $job["jobs"]["id"];
|
|
}
|
|
$job_ids_in = implode(",", $job_ids);
|
|
|
|
$q = <<<EOT
|
|
SELECT enquiries.title from enquiries join jobs on enquiries.id = jobs.enquiry_id AND jobs.id IN($job_ids_in);
|
|
EOT;
|
|
|
|
$enquiries = $this->Document->query($q);
|
|
|
|
$enquiry_numbers = array();
|
|
foreach($enquiries as $enquiry) {
|
|
$enquiry_numbers[] = $enquiry["enquiries"]["title"];
|
|
}
|
|
|
|
$subject = $subject . ' ( ' .implode(" ", $job_numbers). ' )';
|
|
$subject = $subject . ' ( ' .implode(" ", $enquiry_numbers) . ' )';
|
|
|
|
return $subject;
|
|
}
|
|
|
|
function orderack_email_subject($document) {
|
|
$id = $document['Document']['id'];
|
|
//print_r($document);
|
|
$q = <<<EOT
|
|
SELECT j.title as job_title, e.title as enquiry_title
|
|
FROM order_acknowledgements oa
|
|
JOIN enquiries e ON oa.enquiry_id = e.id
|
|
JOIN jobs j on oa.job_id = j.id
|
|
WHERE oa.document_id = $id;
|
|
EOT;
|
|
$titles = $this->Document->query($q);
|
|
|
|
if(count($titles) < 1) {
|
|
// This probably shouldn't happen, but who knows.
|
|
$subject = 'CMC Technologies Order Acknowledgement';
|
|
return $subject;
|
|
}
|
|
|
|
$subject = 'CMC Technologies Order Acknowledgement: '.$titles[0]['e']['enquiry_title'].' '.$titles[0]['j']['job_title'];
|
|
return $subject;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
$subject = $this->po_email_subject($document['PurchaseOrder']);
|
|
$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 = $this->orderack_email_subject($document);
|
|
$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);
|
|
|
|
$this->Session->setFlash(__('The Email has NOT been sent', 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';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 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];
|
|
}
|
|
|
|
}
|