2013-04-13 20:14:11 -07:00
<?php
2026-01-12 03:00:48 -08:00
// Generate the Purchase Order PDF by calling the Go service instead of TCPDF/FPDI.
$goBaseUrl = AppController::getGoBaseUrlOrFail();
2026-01-21 05:14:27 -08:00
$goEndpoint = $goBaseUrl . '/go/document/generate/purchase-order';
2026-01-12 03:00:48 -08:00
$outputDir = Configure::read('pdf_directory');
$lineItems = array();
2026-01-12 05:21:57 -08:00
if (isset($document['LineItem']) && is_array($document['LineItem'])) {
foreach ($document['LineItem'] as $li) {
$lineItems[] = array(
'item_number' => isset($li['item_number']) ? $li['item_number'] : '',
'quantity' => isset($li['quantity']) ? $li['quantity'] : '',
'title' => isset($li['title']) ? $li['title'] : '',
'description' => isset($li['description']) ? $li['description'] : '',
'unit_price' => isset($li['gross_unit_price']) ? floatval($li['gross_unit_price']) : 0.0,
'total_price' => isset($li['gross_price']) ? floatval($li['gross_price']) : 0.0,
'net_unit_price' => isset($li['net_unit_price']) ? floatval($li['net_unit_price']) : 0.0,
'net_price' => isset($li['net_price']) ? floatval($li['net_price']) : 0.0,
'discount_percent' => isset($li['discount_percent']) ? floatval($li['discount_percent']) : 0.0,
'discount_amount_unit' => isset($li['discount_amount_unit']) ? floatval($li['discount_amount_unit']) : 0.0,
'discount_amount_total' => isset($li['discount_amount_total']) ? floatval($li['discount_amount_total']) : 0.0,
'option' => isset($li['option']) ? intval($li['option']) : 0,
'has_text_prices' => isset($li['has_text_prices']) ? (bool)$li['has_text_prices'] : false,
'unit_price_string' => isset($li['unit_price_string']) ? $li['unit_price_string'] : '',
'gross_price_string' => isset($li['gross_price_string']) ? $li['gross_price_string'] : ''
);
}
2026-01-12 03:00:48 -08:00
}
2026-01-25 05:30:43 -08:00
// Get currency info - priority: document currency, then principle's currency, then error
$currencySymbolToUse = null;
$currencyCodeToUse = null;
// First check if document/PO has currency loaded
if (isset($currency['Currency']['symbol']) && isset($currency['Currency']['iso4217'])) {
$currencySymbolToUse = $currency['Currency']['symbol'];
$currencyCodeToUse = $currency['Currency']['iso4217'];
}
// Fall back to principle's currency
elseif (isset($principle['Currency']['symbol']) && isset($principle['Currency']['iso4217'])) {
$currencySymbolToUse = $principle['Currency']['symbol'];
$currencyCodeToUse = $principle['Currency']['iso4217'];
}
// Last resort - check if variables were set directly
elseif (isset($currencySymbol) && isset($currencyCode)) {
$currencySymbolToUse = $currencySymbol;
$currencyCodeToUse = $currencyCode;
}
// Error out if no currency found
if ($currencySymbolToUse === null || $currencyCodeToUse === null) {
echo "<p style='color: red; font-weight: bold;'>ERROR: No currency information found for this purchase order. Please ensure the document or supplier has a currency set.</p>";
error_log("PO PDF Generation Error: No currency found for document ID " . $document['Document']['id']);
exit;
}
2026-01-12 03:00:48 -08:00
$payload = array(
'document_id' => intval($document['Document']['id']),
2026-01-25 05:30:43 -08:00
'user_id' => isset($user['User']['id']) ? intval($user['User']['id']) : 0,
2026-01-12 03:00:48 -08:00
'title' => $document['PurchaseOrder']['title'],
2026-01-12 05:21:57 -08:00
'issue_date' => $document['PurchaseOrder']['issue_date'],
'issue_date_string' => isset($issue_date) ? $issue_date : '',
2026-01-12 03:00:48 -08:00
'principle_name' => isset($principle['Principle']['name']) ? $principle['Principle']['name'] : $document['PurchaseOrder']['ordered_from'],
'principle_reference' => $document['PurchaseOrder']['principle_reference'],
'ordered_from' => $document['PurchaseOrder']['ordered_from'],
'dispatch_by' => $document['PurchaseOrder']['dispatch_by'],
'deliver_to' => $document['PurchaseOrder']['deliver_to'],
'shipping_instructions' => $document['PurchaseOrder']['shipping_instructions'],
2026-01-25 05:30:43 -08:00
'currency_symbol' => $currencySymbolToUse,
'currency_code' => $currencyCodeToUse,
2026-01-12 03:00:48 -08:00
'show_gst' => (bool)$gst,
2026-01-12 05:21:57 -08:00
'subtotal' => isset($totals['subtotal']) ? floatval($totals['subtotal']) : 0.0,
'gst_amount' => isset($totals['gst']) ? floatval($totals['gst']) : 0.0,
'total' => isset($totals['total']) ? floatval($totals['total']) : 0.0,
2026-01-12 03:00:48 -08:00
'line_items' => $lineItems,
'output_dir' => $outputDir
);
$ch = curl_init($goEndpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErr = curl_error($ch);
curl_close($ch);
if ($httpCode < 200 || $httpCode >= 300) {
echo "<p>Failed to generate PO PDF via Go service (HTTP $httpCode).";
if ($curlErr) {
echo " Error: $curlErr";
}
echo "</p>";
exit;
}
2013-04-13 20:14:11 -07:00
2026-01-25 05:30:43 -08:00
// PDF generated successfully - now save metadata and count pages
$result = json_decode($response, true);
if (isset($result['filename'])) {
// Build path, removing any double slashes
$pdfPath = $outputDir . '/' . $result['filename'];
$pdfPath = preg_replace('#/+#', '/', $pdfPath);
// Update database with PDF metadata
$Document = ClassRegistry::init('Document');
$Document->id = $document['Document']['id'];
$Document->saveField('pdf_filename', $result['filename']);
$Document->saveField('pdf_created_at', date('Y-m-d H:i:s'));
2013-04-13 20:14:11 -07:00
2026-01-25 05:30:43 -08:00
// Get user ID safely (match quote/invoice logic) with Basic Auth fallback
$userId = null;
$sessionUser = null;
if (isset($this->Session)) {
$sessionUser = $this->Session->read('Auth.User');
$userId = isset($sessionUser['id']) ? $sessionUser['id'] : null;
}
if (!$userId && isset($_SESSION['Auth']['User']['id'])) {
$userId = $_SESSION['Auth']['User']['id'];
}
// Fallback: try Basic Auth username/email -> User lookup
if (!$userId && !empty($_SERVER['PHP_AUTH_USER'])) {
$User = ClassRegistry::init('User');
$foundUser = $User->find('first', array(
'conditions' => array(
'OR' => array(
'User.email' => $_SERVER['PHP_AUTH_USER'],
'User.username' => $_SERVER['PHP_AUTH_USER'],
),
),
'fields' => array('User.id'),
'recursive' => -1,
'order' => 'User.id ASC'
));
if ($foundUser && isset($foundUser['User']['id'])) {
$userId = $foundUser['User']['id'];
}
}
if ($userId) {
$Document->saveField('pdf_created_by_user_id', $userId);
}
// Count pages using the Go service
App::import('Vendor','pagecounter');
$pageCounter = new PageCounter();
$pageCount = $pageCounter->count($pdfPath);
if ($pageCount > 0) {
$Document->saveField('doc_page_count', $pageCount);
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0;url=/documents/view/<?=$document['Document']['id']?>" />
<title>Redirecting...</title>
</head>
<body>
<p>PDF generated successfully. Redirecting back to purchase order...</p>
<p><a href="/documents/view/<?=$document['Document']['id']?>">Click here if not redirected</a></p>
<script type="text/javascript">
window.location.replace("/documents/view/<?=$document['Document']['id']?>");
</script>
</body>
</html>