1336 lines
45 KiB
PHP
Executable file
1336 lines
45 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');
|
||
|
||
var $defaultShippingText = <<<ENDDETAILS
|
||
COURIER NAME: TNT , COURIER SERVICE: TBA<br>
|
||
CON NOTE NO: TBA<br>
|
||
1 BOX @ Gross: TBA kg, Net: TBA kg, DIMS: TBA cm<br>
|
||
<br>
|
||
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'].'<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'])
|
||
)
|
||
));
|
||
|
||
$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'] = <<<ENDDELIVER
|
||
CMC TECHNOLOGIES PTY LTD<br>
|
||
Unit 19, 77 Bourke Road<br>
|
||
Alexandria NSW 2015 AUSTRALIA<br>
|
||
Attn: Con Carpis E: sales@cmctechnologies.com.au<br>
|
||
P: +61 2 9669 4000 F:+61 2 9669 4111
|
||
ENDDELIVER;
|
||
|
||
|
||
$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';
|
||
$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));
|
||
}
|
||
|
||
|
||
}
|
||
|
||
function getBaseTitle($titleWithRevision) {
|
||
// The pattern matches:
|
||
// - : the literal hyphen
|
||
// Rev : the literal string "Rev" (case-sensitive)
|
||
// \d+ : one or more digits (representing the revision number)
|
||
// $ : asserts that this pattern must be at the end of the string
|
||
//
|
||
// If "Rev" could be "rev", "REV", etc., you can make it case-insensitive
|
||
// by adding the 'i' flag: '/-Rev\d+$/i'
|
||
$baseTitle = preg_replace('/-Rev\d+$/', '', $titleWithRevision);
|
||
return $baseTitle;
|
||
}
|
||
|
||
|
||
/**
|
||
* 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'])) {
|
||
// Invoice revision
|
||
$newDoc = array();
|
||
|
||
// 1. Copy Document fields and update revision
|
||
$newDoc['Document'] = $this->unset_keys($document['Document'], array('id', 'created', 'modified'));
|
||
$newDoc['Document']['revision'] = $document['Document']['revision'] + 1;
|
||
// user_id for the new revision will be the current user
|
||
$currentUser = $this->GetCurrentUser(); // Assumes GetCurrentUser() is available
|
||
$newDoc['Document']['user_id'] = $currentUser['User']['id'];
|
||
// CakePHP will set created/modified timestamps automatically for the new record
|
||
|
||
// 2. Copy Invoice fields
|
||
$newDoc['Invoice'] = $this->unset_keys($document['Invoice'], array('id', 'document_id', 'created', 'modified'));
|
||
$newDoc['Invoice']['issue_date'] = date('Y-m-d');
|
||
$newDoc['Invoice']['due_date'] = date("Y-m-d", strtotime("+30 days"));
|
||
|
||
// Modify title for uniqueness, appending revision number
|
||
$orginalTitleParts = explode('-', $document['Invoice']['title']);
|
||
$newDoc['Invoice']['title'] = $orginalTitleParts[0] . '-REV' . $newDoc['Document']['revision'];
|
||
|
||
// 3. Copy DocPage records (if any)
|
||
if (!empty($document['DocPage'])) {
|
||
$newDoc['DocPage'] = $document['DocPage'];
|
||
foreach ($newDoc['DocPage'] as $index => $page) {
|
||
$newDoc['DocPage'][$index]['id'] = null; // New record
|
||
$newDoc['DocPage'][$index]['document_id'] = null; // Will be set by saveAll
|
||
}
|
||
}
|
||
|
||
// 4. Copy Job associations (if applicable - check your data model)
|
||
if (!empty($document['Job'])) {
|
||
$job_ids = array();
|
||
foreach ($document['Job'] as $job) {
|
||
$job_ids[] = $job['id'];
|
||
}
|
||
// This structure is typically used by saveAll for HABTM relationships
|
||
$newDoc['Job']['Job'] = $job_ids;
|
||
}
|
||
|
||
// Store info for flash message
|
||
// $this->set('revision_number_for_flash', $newDoc['Document']['revision']);
|
||
// $this->set('document_type_for_flash', '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'])) {
|
||
// Purchase Order revision
|
||
$newDoc = array();
|
||
|
||
// 1. Copy Document fields and update revision
|
||
$newDoc['Document'] = $this->unset_keys($document['Document'], array('id', 'created', 'modified'));
|
||
$newDoc['Document']['revision'] = $document['Document']['revision'] + 1;
|
||
$newDoc['Document']['type'] = 'purchaseOrder'; // Ensure type is set
|
||
|
||
// user_id for the new revision will be the current user
|
||
$currentUser = $this->GetCurrentUser();
|
||
$newDoc['Document']['user_id'] = $currentUser['User']['id'];
|
||
|
||
// 2. Copy PurchaseOrder fields
|
||
$newDoc['PurchaseOrder'] = $this->unset_keys($document['PurchaseOrder'], array('id', 'document_id', 'created', 'modified'));
|
||
$newDoc['PurchaseOrder']['issue_date'] = date('Y-m-d');
|
||
|
||
// Modify title for uniqueness, appending revision number
|
||
$baseTitle = $this->getBaseTitle($document['PurchaseOrder']['title']);
|
||
$newDoc['PurchaseOrder']['title'] = $baseTitle . '-Rev' . $newDoc['Document']['revision'];
|
||
|
||
// 3. Copy DocPage records (if any)
|
||
if (!empty($document['DocPage'])) {
|
||
$newDoc['DocPage'] = array();
|
||
foreach ($document['DocPage'] as $page) {
|
||
$newPage = $this->unset_keys($page, array('id', 'document_id', 'created', 'modified'));
|
||
$newDoc['DocPage'][] = $newPage;
|
||
}
|
||
}
|
||
|
||
// 4. Handle Job associations (HABTM)
|
||
// First, we need to fetch the jobs associated with the original purchase order
|
||
$originalPO = $this->Document->PurchaseOrder->find('first', array(
|
||
'conditions' => array('PurchaseOrder.id' => $document['PurchaseOrder']['id']),
|
||
'contain' => array('Job')
|
||
));
|
||
|
||
if (!empty($originalPO['Job'])) {
|
||
$job_ids = array();
|
||
foreach ($originalPO['Job'] as $job) {
|
||
$job_ids[] = $job['id'];
|
||
}
|
||
// Store job IDs to be processed after the main save
|
||
$newDoc['_job_ids'] = $job_ids;
|
||
}
|
||
print_r($newDoc);
|
||
}
|
||
|
||
|
||
else if (!empty($document['OrderAcknowledgement']['id'])) {
|
||
//TODO Order Acknowledgement revision
|
||
}
|
||
|
||
|
||
/** 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;
|
||
|
||
// Handle Purchase Order Job associations
|
||
if (!empty($document['PurchaseOrder']['id']) && !empty($newDoc['_job_ids'])) {
|
||
// Get the new PurchaseOrder ID
|
||
$newPurchaseOrder = $this->Document->PurchaseOrder->find('first', array(
|
||
'conditions' => array('PurchaseOrder.document_id' => $newid),
|
||
'fields' => array('PurchaseOrder.id')
|
||
));
|
||
|
||
if (!empty($newPurchaseOrder['PurchaseOrder']['id'])) {
|
||
$po_id = $newPurchaseOrder['PurchaseOrder']['id'];
|
||
|
||
// Method 1: Using CakePHP's HABTM save (recommended)
|
||
$this->Document->PurchaseOrder->id = $po_id;
|
||
|
||
// Method 2: If Method 1 doesn't work, use the SQL approach as a fallback
|
||
foreach($newDoc['_job_ids'] as $job_id) {
|
||
$query = "INSERT INTO `jobs_purchase_orders` (`job_id`, `purchase_order_id`) VALUES ('{$job_id}', '{$po_id}');";
|
||
$this->Document->query($query);
|
||
}
|
||
}
|
||
}
|
||
|
||
// Updated flash message logic
|
||
$revisionNumber = $newDoc['Document']['revision'];
|
||
$docTypeFullName = 'Unknown Document';
|
||
if (isset($newDoc['Document']['type'])) {
|
||
$docTypeFullName = $this->Document->getDocFullName($newDoc['Document']['type']);
|
||
} else if (isset($document['Document']['type'])) {
|
||
$docTypeFullName = $this->Document->getDocFullName($document['Document']['type']);
|
||
}
|
||
|
||
$this->Session->setFlash(__("Revision {$revisionNumber} of {$docTypeFullName} 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'] = '<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 */
|
||
|
||
|
||
$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 = <<<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;
|
||
}
|
||
|
||
function invoice_email_subject($document) {
|
||
$id = $document['Document']['id'];
|
||
//print_r($document);
|
||
$q = <<<EOT
|
||
SELECT i.title as invoice_title, j.title as job_title, e.title as enquiry_title
|
||
FROM invoices i
|
||
JOIN enquiries e ON i.enquiry_id = e.id
|
||
JOIN jobs j on i.job_id = j.id
|
||
WHERE i.document_id = $id;
|
||
EOT;
|
||
$titles = $this->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 = <<<EOT
|
||
SELECT p.title as packing_list_title, j.title as job_title, e.title as enquiry_title
|
||
FROM packing_lists p
|
||
JOIN enquiries e on p.enquiry_id = e.id
|
||
JOIN jobs j on p.job_id = j.id
|
||
WHERE p.document_id = $id;
|
||
EOT;
|
||
$titles = $this->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 <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: ".$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);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
// 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 "<pre>";
|
||
//print_r($results);
|
||
//echo "</pre>";
|
||
|
||
$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 <<<ENDINSTRUCTIONS
|
||
<b>FREIGHT FORWARDER:</b> $ffText<br>
|
||
<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>
|
||
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];
|
||
}
|
||
|
||
}
|