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'] : '' ); } } // 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 "
ERROR: No currency information found for this purchase order. Please ensure the document or supplier has a currency set.
"; error_log("PO PDF Generation Error: No currency found for document ID " . $document['Document']['id']); exit; } $payload = array( 'document_id' => intval($document['Document']['id']), 'user_id' => isset($user['User']['id']) ? intval($user['User']['id']) : 0, 'title' => $document['PurchaseOrder']['title'], 'issue_date' => $document['PurchaseOrder']['issue_date'], 'issue_date_string' => isset($issue_date) ? $issue_date : '', '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'], 'currency_symbol' => $currencySymbolToUse, 'currency_code' => $currencyCodeToUse, 'show_gst' => (bool)$gst, '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, '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 "Failed to generate PO PDF via Go service (HTTP $httpCode)."; if ($curlErr) { echo " Error: $curlErr"; } echo "
"; exit; } // 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')); // 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); } } ?>PDF generated successfully. Redirecting back to purchase order...