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'].'
'.$address['BillingAddress']['city'].' '.$address['State']['name'].' '.$address['BillingAddress']['postcode'].'
'.up($address['Country']['name']).'

'; } $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'] = << Unit 19, 77 Bourke Road
Alexandria NSW 2015 AUSTRALIA
ENDDELIVER; //Fuck it all. $this->data['PurchaseOrder']['shipping_instructions'] = <<PART SHIPMENT: Not Acceptable - please advise ASAP if production of an Item will Delay the Dispatch of the Complete Order by the Date Required stated above.
INSURANCE: DO NOT INSURE - Insurance effected by CMC
SECURITY: It is essential that the cargo is prepared & handled so as not to compromise its security standing.
SHIPMENT MARKINGS:
(Please put red fragile stickers on boxing)
CMC TECHNOLOGIES PTY LTD
UNIT 19, 77 BOURKE ROAD
ALEXANDRIA NSW 2015 AUSTRALIA
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 */ 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'] = ''.$customer['Customer']['name'].'
'; $newDoc['Document']['bill_to'] .= $this->Document->OrderAcknowledgement->Enquiry->formatAddress($enquiry['BillingAddress']['id'], 'BillingAddress'); } if(isset($enquiry['ShippingAddress']['id'])) { $newDoc['Document']['ship_to'] = ''.$customer['Customer']['name'].'
'; $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 $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 '; $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); $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]; } }