true, 'limit' => 200, 'order'=>array('Document.id' => 'desc') ); var $components = array('Email'); var $defaultShippingText = << CON NOTE NO: TBA
1 BOX @ Gross: TBA kg, Net: TBA kg, DIMS: TBA cm

CMC Technologies’ payment terms are net 30 days from invoice date unless stated otherwise in the terms box above. This contract is subject to CMC Technologies’ terms and conditions of sale dated 1/7/ 2006 (attached). ENDDETAILS; var $defaultFOB = "Ex-works CMC Technologies, Alexandria NSW"; 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']) ) )); $sql = "SELECT DISTINCT freight_forwarder_text FROM purchase_orders WHERE freight_forwarder_text != '' ORDER BY freight_forwarder_text ASC;"; $previousValues = $this->Document->query($sql); $ffOptions = array( "CMC will make the booking with Fedex Economy. We will send you the labels. Please send us the packing list, invoice, weights and dimensions.", "FEDEX Airfreight Economy service on CMC Account #409368441", "FEDEX INTERNATIONAL Priority on CMC Account #409368441" ); foreach($previousValues as $val) { array_push($ffOptions, $val["purchase_orders"]["freight_forwarder_text"]); } asort($ffOptions); $this->set('freightForwarderSelect', $ffOptions); 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))); $totals = $this->calculateTotals($sourceDoc, $enquiry['Enquiry']['gst']); $this->data['Invoice']['amount_invoiced'] = $totals['total']; if($sourceDoc['Document']['type'] == 'orderAck') { $oa_attributes = array( 'ship_via', 'fob', 'estimated_delivery' ); foreach($oa_attributes 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']['description'] = "Items as per attached schedule"; $this->data['PurchaseOrder']['deliver_to'] = << Unit 19, 77 Bourke Road
Alexandria NSW 2015 AUSTRALIA
Attn: Con Carpis E: sales@cmctechnologies.com.au
P: +61 2 9669 4000 F:+61 2 9669 4111 ENDDELIVER; $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'; $this->data['Document']['shipping_details'] = $this->defaultShippingText; 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))); if($sourceDoc['Document']['type'] == 'orderAck') { foreach($source_attributes as $attr) { $this->data['PackingList'][$attr] = $sourceDoc['OrderAcknowledgement'][$attr]; } } if($sourceDoc['Document']['type'] == 'invoice') { $source_attributes = array( 'ship_via', 'fob' ); foreach($source_attributes 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']; $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 */ $newDoc['Document']['shipping_details'] = $this->defaultShippingText; $newDoc['Document']['doc_page_count'] = 0; $newDoc['Document']['cmc_reference'] = ''; $newDoc['Document']['pdf_filename'] = ''; $newDoc['Document']['pdf_created_at'] = '0000-00-00 00:00:00'; $newDoc['Document']['pdf_created_at'] = 0; $newDoc['OrderAcknowledgement']['fob'] = $this->defaultFOB; 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 = <<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 = <<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 = <<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; } function invoice_email_subject($document) { $id = $document['Document']['id']; //print_r($document); $q = <<Document->query($q); if(count($titles) < 1) { // This probably shouldn't happen, but who knows. $subject = 'Invoice'; return $subject; } $subject = 'CMC Technologies Tax Invoice: '.$titles[0]['i']['invoice_title'].' ('.$titles[0]['e']['enquiry_title'].') ('.$titles[0]['j']['job_title'].')'; return $subject; } function packing_list_email_subject($document) { $id = $document['Document']['id']; $q = <<Document->query($q); if(count($titles) < 1) { // This probably shouldn't happen, but who knows. $subject = 'Packing list'; return $subject; } $subject = 'CMC Technologies Packing List: '.$titles[0]['p']['packing_list_title'].' ('.$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 $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: ".$enquiry['Enquiry']['title']; break; case 'invoice': $subject = $this->invoice_email_subject($document); $this->set('invoice', $this->Document->Invoice->find('first', array('conditions'=>array('Invoice.id'=>$document['Invoice']['id'])))); $this->set('job', $this->Document->Invoice->Job->find('first', array('conditions'=>array('Job.id'=>$document['Invoice']['job_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'; } break; case 'packingList': $subject = $this->packing_list_email_subject($document); break; } $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 format_email($email) { $email = trim($email); // Basic RFC 5322 email validation if (!preg_match('/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/', $email)) { return ''; } return "$email <$email>"; } function parse_email_to_array($input) { try { if (empty($input) || !is_string($input)) { return array(); } $input = trim($input); if ($input === '') { return array(); } if (strpos($input, ',') !== false) { $parts = explode(',', $input); $result = array(); foreach ($parts as $email) { $email = $this->format_email($email); if ($email !== '') { $result[] = $email; } } return $result; } else { $result = $this->format_email($input); $array[] = $result; return $array; } } catch (Exception $e) { return array(); } } /** * Email the PDF(document + attachments) for this Document to custom recipients. * * @param int $id - Document ID * @param string $to - Recipient email address (comma-separated if multiple) * @param string|null $cc - CC email address(es), optional (comma-separated) * @param string|null $bcc - BCC email address(es), optional (comma-separated) */ function email_pdf_with_custom_recipients($id = null, $to = null, $cc = null, $bcc = null) { $this->autoRender = false; if (empty($to) && !empty($this->params['form']['to'])) { $to = $this->params['form']['to']; } if (empty($cc) && isset($this->params['form']['cc'])) { $cc = $this->params['form']['cc']; } if (empty($bcc) && isset($this->params['form']['bcc'])) { $bcc = $this->params['form']['bcc']; } // Basic validation if (empty($id) || empty($to)) { $msg = 'Document ID and recipient email are required.'; echo json_encode(array('success' => false, 'message' => $msg)); return; } $this->Email->smtpOptions = Configure::read('smtp_settings'); $this->Email->delivery = 'smtp'; $document = $this->Document->read(null, $id); error_log("[email_pdf_with_custom_recipients] Document loaded: " . print_r($document['Document'], true)); error_log("[email_pdf_with_custom_recipients] DocumentAttachments: " . print_r($document['DocumentAttachment'], true)); if (empty($document) || empty($document['Document'])) { $msg = 'Document not found.'; echo json_encode(array('success' => false, 'message' => $msg)); return; } if (empty($document['Document']['pdf_filename'])) { $msg = 'Error. Please generate the PDF before attempting to email it'; echo json_encode(array('success' => false, 'message' => $msg)); return; } $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']; error_log("[email_pdf_with_custom_recipients] Added attachment: " . $attachment['Attachment']['file']); } if (!empty($document['DocumentAttachment'])) { foreach ($document['DocumentAttachment'] as $document_attachment) { if (!empty($document_attachment['attachment_id'])) { $attachment = $this->Document->DocumentAttachment->Attachment->read(null, $document_attachment['attachment_id']); if (!empty($attachment['Attachment']['file'])) { $attachment_files[] = $attachment['Attachment']['file']; error_log("[email_pdf_with_custom_recipients] Added attachment: " . $attachment['Attachment']['file']); } } } } error_log("[email_pdf_with_custom_recipients] All attachments: " . print_r($attachment_files, true)); $this->Email->attachments = $attachment_files; $enquiry = $this->Document->getEnquiry($document); $toArray = $this->parse_email_to_array($to); if (empty($toArray)) { $msg = 'Invalid recipient email address.'; echo json_encode(array('success' => false, 'message' => $msg)); return; } else { $this->Email->to = implode(', ', $toArray); } $ccArray = $this->parse_email_to_array($cc); if (!empty($ccArray)) { $this->Email->cc = $ccArray; } $bccArray = $this->parse_email_to_array($bcc); if (!empty($bccArray)) { $this->Email->bcc = $bccArray; } $this->Email->replyTo = 'CMC Technologies - Sales '; $this->Email->from = 'CMC Technologies - Sales '; $docType = $this->Document->getDocType($document); $template = $docType . '_email'; $subject = !empty($enquiry['Enquiry']['title']) ? $enquiry['Enquiry']['title'] . ' ' : 'Document'; error_log("[email_pdf_with_custom_recipients] Enquiry Title: " . empty($enquiry['Enquiry']['title']) . $enquiry['Enquiry']['title']); switch($docType) { case 'quote': $subject = !empty($enquiry['Enquiry']['title']) ? "Quotation: " . $enquiry['Enquiry']['title'] : 'Quotation'; break; case 'invoice': $subject = $this->invoice_email_subject($document); if (!empty($document['Invoice']['id'])) { $this->set('invoice', $this->Document->Invoice->find('first', array('conditions'=>array('Invoice.id'=>$document['Invoice']['id'])))); } if (!empty($document['Invoice']['job_id'])) { $this->set('job', $this->Document->Invoice->Job->find('first', array('conditions'=>array('Job.id'=>$document['Invoice']['job_id'])))); } break; case 'purchaseOrder': $subject .= "Purchase Order"; $primary_contact = null; if (!empty($document['PurchaseOrder']['principle_id'])) { $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)) { $msg = 'Unable to send. No primary Principle Contact'; echo json_encode(array('success' => false, 'message' => $msg)); return; } $subject = $this->po_email_subject($document['PurchaseOrder']); if (!empty($document['OrderAcknowledgement']['job_id'])) { $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); if (!empty($document['OrderAcknowledgement']['job_id'])) { $this->set('job', $this->Document->OrderAcknowledgement->Job->find('first', array('conditions'=>array('Job.id'=>$document['OrderAcknowledgement']['job_id'])))); } if (!empty($document['OrderAcknowledgement']['signature_required'])) { $template = 'orderAck_email_signature_required'; } break; case 'packingList': $subject = $this->packing_list_email_subject($document); break; } $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'])); $sent = false; try { $sent = $this->Email->send(); } catch (Exception $e) { $msg = 'Exception: ' . $e->getMessage(); echo json_encode(array('success' => false, 'message' => $msg)); return; } if ($sent) { echo json_encode(array('success' => true, 'message' => 'The Email has been sent')); return; } else { $msg = 'The Email has NOT been sent'; echo json_encode(array('success' => false, 'message' => $msg, 'smtp_errors' => $this->Email->smtpError)); return; } echo json_encode(array('success' => false, 'message' => 'No response from email function')); } // generateShippingReference builds the Shipping Instructions: with the PO number and job titles. function generateShippingInstructions($document_id) { $this->layout = 'ajax'; $po = $this->Document->PurchaseOrder->find('first', array('conditions'=> array('Document.id' => $document_id) ) ); // TODO SQL injection risk. Need to rewrite this whole rickety thing.. $query = 'select j.title as job_title, po.title as po_title from jobs_purchase_orders jpo JOIN jobs j on j.id = jpo.job_id JOIN purchase_orders po ON po.id= jpo.purchase_order_id WHERE jpo.purchase_order_id = '.$po['PurchaseOrder']['id'].';'; $results = $this->Document->query($query); //echo "
";
            //print_r($results);
            //echo "
"; $label = ""; if (count($results) > 0) { $label = $results[0]["po"]["po_title"]; } foreach ($results as $result) { $label .= " / ". $result["j"]["job_title"]; } $ffText = $po['PurchaseOrder']['freight_forwarder_text']; echo <<FREIGHT FORWARDER: $ffText
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
REF: $label ENDINSTRUCTIONS; /*if($this->Document->PurchaseOrder->save($po["PurchaseOrder"])) { echo "SUCCESS"; //THIS IS SO STUPID. } else { echo "FAILURE"; }*/ } 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]; } }