diff --git a/docker-compose.yml b/docker-compose.yml index c4c05e72..b2b7c716 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,20 +33,6 @@ services: networks: - cmc-network restart: unless-stopped - develop: - watch: - - action: rebuild - path: ./php/app - ignore: - - ./php/app/webroot/pdf - - ./php/app/webroot/attachments_files - - ./php/app/tmp - - action: sync - path: ./php/app/webroot/css - target: /var/www/cmc-sales/app/webroot/css - - action: sync - path: ./php/app/webroot/js - target: /var/www/cmc-sales/app/webroot/js db: image: mariadb:latest diff --git a/go/.env b/go/.env new file mode 100644 index 00000000..097f7288 --- /dev/null +++ b/go/.env @@ -0,0 +1,12 @@ +# Database configuration +DB_HOST=db +DB_PORT=3306 +DB_USER=cmc +DB_PASSWORD=xVRQI&cA?7AU=hqJ!%au +DB_NAME=cmc + +# Root database password (for dbshell-root) +DB_ROOT_PASSWORD=secureRootPassword + +# Server configuration +PORT=8080 \ No newline at end of file diff --git a/go/bin/server b/go/bin/server index c53828f6..350a47da 100755 Binary files a/go/bin/server and b/go/bin/server differ diff --git a/go/bin/vault b/go/bin/vault new file mode 100755 index 00000000..1486d150 Binary files /dev/null and b/go/bin/vault differ diff --git a/go/internal/cmc/documents/html_types.go b/go/internal/cmc/documents/html_types.go index 5cf8bd77..dcdfa759 100644 --- a/go/internal/cmc/documents/html_types.go +++ b/go/internal/cmc/documents/html_types.go @@ -101,11 +101,14 @@ type PackingListPDFData struct { type OrderAckPDFData struct { OrderAcknowledgement *db.Document Customer *db.Customer + CmcReference string EmailTo string Attention string IssueDateString string YourReference string JobTitle string + CustomerOrderNumber string + CustomerABN string BillTo string ShipTo string ShipVia string diff --git a/go/internal/cmc/documents/order_ack_builder.go b/go/internal/cmc/documents/order_ack_builder.go index b634f479..62402a7b 100644 --- a/go/internal/cmc/documents/order_ack_builder.go +++ b/go/internal/cmc/documents/order_ack_builder.go @@ -80,55 +80,59 @@ func (g *HTMLDocumentGenerator) BuildOrderAckHTML(data *OrderAckPDFData, totalPa // Prepare template data templateData := struct { - OrderAckNumber string - CompanyName string - EmailTo string - Attention string - IssueDateString string - YourReference string - JobTitle string - BillTo template.HTML - ShipTo template.HTML - ShipVia string - FOB string - PaymentTerms string - CustomerABN string - CurrencyCode string - CurrencySymbol string - LineItems []OrderAckLineItemTemplateData - Subtotal float64 - GSTAmount float64 - Total float64 - ShowGST bool - PageCount int - CurrentPage int - FreightDetails template.HTML - LogoDataURI string + OrderAckNumber string + CmcReference string + CompanyName string + EmailTo string + Attention string + IssueDateString string + YourReference string + JobTitle string + CustomerOrderNumber string + BillTo template.HTML + ShipTo template.HTML + ShipVia string + FOB string + PaymentTerms string + CustomerABN string + CurrencyCode string + CurrencySymbol string + LineItems []OrderAckLineItemTemplateData + Subtotal float64 + GSTAmount float64 + Total float64 + ShowGST bool + PageCount int + CurrentPage int + FreightDetails template.HTML + LogoDataURI string }{ - OrderAckNumber: orderAckNumber, - CompanyName: data.Customer.Name, - EmailTo: data.EmailTo, - Attention: data.Attention, - IssueDateString: data.IssueDateString, - YourReference: data.YourReference, - JobTitle: data.JobTitle, - BillTo: template.HTML(data.BillTo), - ShipTo: template.HTML(data.ShipTo), - ShipVia: data.ShipVia, - FOB: data.FOB, - PaymentTerms: data.PaymentTerms, - CustomerABN: "", - CurrencyCode: data.CurrencyCode, - CurrencySymbol: data.CurrencySymbol, - LineItems: lineItemsData, - Subtotal: subtotal, - GSTAmount: gstAmount, - Total: total, - ShowGST: data.ShowGST, - PageCount: totalPages, - CurrentPage: currentPage, - FreightDetails: template.HTML(data.FreightDetails), - LogoDataURI: g.loadLogo("quote_logo.png"), + OrderAckNumber: orderAckNumber, + CmcReference: data.CmcReference, + CompanyName: data.Customer.Name, + EmailTo: data.EmailTo, + Attention: data.Attention, + IssueDateString: data.IssueDateString, + YourReference: data.YourReference, + JobTitle: data.JobTitle, + CustomerOrderNumber: data.CustomerOrderNumber, + BillTo: template.HTML(data.BillTo), + ShipTo: template.HTML(data.ShipTo), + ShipVia: data.ShipVia, + FOB: data.FOB, + PaymentTerms: data.PaymentTerms, + CustomerABN: data.CustomerABN, + CurrencyCode: data.CurrencyCode, + CurrencySymbol: data.CurrencySymbol, + LineItems: lineItemsData, + Subtotal: subtotal, + GSTAmount: gstAmount, + Total: total, + ShowGST: data.ShowGST, + PageCount: totalPages, + CurrentPage: currentPage, + FreightDetails: template.HTML(data.FreightDetails), + LogoDataURI: g.loadLogo("quote_logo.png"), } // Define template functions diff --git a/go/internal/cmc/documents/templates/order-acknowledgement.html b/go/internal/cmc/documents/templates/order-acknowledgement.html index d3b853ca..d1d2a9d9 100644 --- a/go/internal/cmc/documents/templates/order-acknowledgement.html +++ b/go/internal/cmc/documents/templates/order-acknowledgement.html @@ -25,7 +25,8 @@ .header { text-align: center; - margin-bottom: 10mm; + margin-top: -5mm; + margin-bottom: 8mm; } .header h1 { @@ -46,6 +47,10 @@ font-size: 9pt; } + .details-table td:last-child { + padding-right: 3mm; + } + .details-table td.label { font-weight: bold; width: 25%; @@ -237,8 +242,8 @@ COMPANY NAME: {{.CompanyName}} - YOUR REFERENCE: - {{.YourReference}} + CMC JOB#: + {{.JobTitle}} CONTACT: @@ -246,10 +251,6 @@ EMAIL: {{.EmailTo}} - - JOB TITLE: - {{.JobTitle}} - @@ -269,7 +270,7 @@ CUSTOMER ORDER NO - CMC JOB # + CMC REF INCOTERMS 2010 PAYMENT TERMS CUSTOMER ABN @@ -277,21 +278,19 @@ - {{.YourReference}} - {{.JobTitle}} + {{if .CustomerOrderNumber}}{{.CustomerOrderNumber}}{{else}}-{{end}} + {{if .CmcReference}}{{.CmcReference}}{{else}}-{{end}} {{.FOB}} {{.PaymentTerms}} - {{.CustomerABN}} + {{if .CustomerABN}}{{.CustomerABN}}{{else}}-{{end}} - +
Shown in {{.CurrencyCode}}
- - @@ -362,20 +361,5 @@ {{end}} - - - diff --git a/go/internal/cmc/handlers/documents/documents_api.go b/go/internal/cmc/handlers/documents/documents_api.go index 0b007973..4f0ea352 100644 --- a/go/internal/cmc/handlers/documents/documents_api.go +++ b/go/internal/cmc/handlers/documents/documents_api.go @@ -552,7 +552,7 @@ func GenerateOrderAckPDF(w http.ResponseWriter, r *http.Request) { return } - doc := &db.Document{ID: req.DocumentID} + doc := &db.Document{ID: req.DocumentID, CmcReference: req.CmcReference} cust := &db.Customer{Name: req.CustomerName} lineItems := make([]db.GetLineItemsTableRow, len(req.LineItems)) @@ -574,11 +574,14 @@ func GenerateOrderAckPDF(w http.ResponseWriter, r *http.Request) { data := &pdf.OrderAckPDFData{ OrderAcknowledgement: doc, Customer: cust, + CmcReference: req.CmcReference, EmailTo: req.EmailTo, Attention: req.Attention, IssueDateString: req.IssueDateString, YourReference: req.YourReference, JobTitle: req.JobTitle, + CustomerOrderNumber: req.CustomerOrderNumber, + CustomerABN: req.CustomerABN, BillTo: req.BillTo, ShipTo: req.ShipTo, ShipVia: req.ShipVia, @@ -630,27 +633,30 @@ type OrderAckLineItemRequest = InvoiceLineItemRequest // OrderAckPDFRequest payload type OrderAckPDFRequest struct { - DocumentID int32 `json:"document_id"` - Title string `json:"title"` - CustomerName string `json:"customer_name"` - EmailTo string `json:"email_to"` - Attention string `json:"attention"` - YourReference string `json:"your_reference"` - JobTitle string `json:"job_title"` - IssueDate string `json:"issue_date"` // YYYY-MM-DD - IssueDateString string `json:"issue_date_string"` // formatted date - BillTo string `json:"bill_to"` - ShipTo string `json:"ship_to"` - ShipVia string `json:"ship_via"` - FOB string `json:"fob"` - PaymentTerms string `json:"payment_terms"` - FreightDetails string `json:"freight_details"` - EstimatedDelivery string `json:"estimated_delivery"` - CurrencySymbol string `json:"currency_symbol"` - CurrencyCode string `json:"currency_code"` - ShowGST bool `json:"show_gst"` - LineItems []OrderAckLineItemRequest `json:"line_items"` - OutputDir string `json:"output_dir"` + DocumentID int32 `json:"document_id"` + Title string `json:"title"` + CustomerName string `json:"customer_name"` + CmcReference string `json:"cmc_reference"` + CustomerOrderNumber string `json:"customer_order_number"` + CustomerABN string `json:"customer_abn"` + EmailTo string `json:"email_to"` + Attention string `json:"attention"` + YourReference string `json:"your_reference"` + JobTitle string `json:"job_title"` + IssueDate string `json:"issue_date"` // YYYY-MM-DD + IssueDateString string `json:"issue_date_string"` // formatted date + BillTo string `json:"bill_to"` + ShipTo string `json:"ship_to"` + ShipVia string `json:"ship_via"` + FOB string `json:"fob"` + PaymentTerms string `json:"payment_terms"` + FreightDetails string `json:"freight_details"` + EstimatedDelivery string `json:"estimated_delivery"` + CurrencySymbol string `json:"currency_symbol"` + CurrencyCode string `json:"currency_code"` + ShowGST bool `json:"show_gst"` + LineItems []OrderAckLineItemRequest `json:"line_items"` + OutputDir string `json:"output_dir"` } // CountPagesRequest payload for page counting diff --git a/go/server b/go/server index 62ce489c..3fdcfc6f 100755 Binary files a/go/server and b/go/server differ diff --git a/go/tmp/stdout b/go/tmp/stdout index 4325a402..48aefbc7 100644 --- a/go/tmp/stdout +++ b/go/tmp/stdout @@ -1 +1 @@ -exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file +exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file diff --git a/php/app/.htaccess b/php/app/.htaccess new file mode 100644 index 00000000..e129ef0e --- /dev/null +++ b/php/app/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine on + RewriteRule ^$ webroot/ [L] + RewriteRule (.*) webroot/$1 [L] + diff --git a/php/app/config/core.php b/php/app/config/core.php index 84b91cd9..f96db222 100644 --- a/php/app/config/core.php +++ b/php/app/config/core.php @@ -77,6 +77,12 @@ Configure::write('email_directory', '/var/www/emails'); Configure::write('pdf_directory', $basedir.'webroot/pdf/'); Configure::write('attachments_directory', $basedir.'webroot/attachments_files/'); +// Ensure Go service base URL is available to PHP when provided via environment +$goBaseUrl = getenv('GO_BASE_URL'); +if (!empty($goBaseUrl)) { + Configure::write('go_base_url', rtrim($goBaseUrl, '/')); +} + /** * Application wide charset encoding diff --git a/php/app/controllers/documents_controller.php b/php/app/controllers/documents_controller.php index 097ea9d2..0e226866 100755 --- a/php/app/controllers/documents_controller.php +++ b/php/app/controllers/documents_controller.php @@ -819,6 +819,12 @@ ENDINSTRUCTIONS; $docType = $this->Document->getDocType($document); $docTypeFullName = $this->Document->getDocFullName($docType); + // Normalize docType when missing or unexpected: infer orderAck if OrderAcknowledgement data exists + if (empty($docType) && !empty($document['OrderAcknowledgement']['id'])) { + $docType = 'orderAck'; + $docTypeFullName = $this->Document->getDocFullName($docType); + } + $currency = $this->Document->getCurrency($document); @@ -933,11 +939,17 @@ ENDINSTRUCTIONS; $job = $this->Document->OrderAcknowledgement->Job->find('first', array('conditions'=>array('Job.id'=>$document['OrderAcknowledgement']['job_id']))); + // Load enquiry from job + if ($job && isset($job['Job']['enquiry_id'])) { + $enquiry = $this->Document->OrderAcknowledgement->Job->Enquiry->read(null, $job['Job']['enquiry_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('enquiry', $enquiry); $this->set('issue_date_string', date('d F Y', strtotime($document['OrderAcknowledgement']['issue_date']))); $this->set('ship_via', $document['OrderAcknowledgement']['ship_via']); @@ -958,6 +970,11 @@ ENDINSTRUCTIONS; $template_name = 'pdf_packinglist'; break; + default: + // No matching template - log and render error + error_log("PDF generation: Unknown document type: " . $docType . " for Document ID: " . $document['Document']['id']); + echo "ERROR: Unknown document type for PDF generation"; + exit; } // Don't set filename here - let the Go service and view handle it @@ -981,6 +998,12 @@ ENDINSTRUCTIONS; $this->set('colWidths',$colWidths); + // Ensure template_name was set by the switch; otherwise show error + if (!isset($template_name)) { + echo "

ERROR: Unknown document type '$docType' for document ID $id. Cannot render PDF.

"; + exit; + } + $this->render($template_name); } diff --git a/php/app/views/documents/pdf_orderack.ctp b/php/app/views/documents/pdf_orderack.ctp index 90d47fe7..6c6c8f15 100755 --- a/php/app/views/documents/pdf_orderack.ctp +++ b/php/app/views/documents/pdf_orderack.ctp @@ -1,8 +1,17 @@ intval($document['Document']['id']), - 'order_ack_number' => $orderAckNumber, 'title' => $orderAckTitle, 'customer_name' => $customerName, - 'contact_email' => $contactEmail, - 'contact_name' => $contactName, - 'user_first_name' => $userFirstName, - 'user_last_name' => $userLastName, - 'user_email' => $userEmail, + 'cmc_reference' => isset($document['Document']['cmc_reference']) ? $document['Document']['cmc_reference'] : '', + 'email_to' => $contactEmail, + 'attention' => $contactName, 'your_reference' => $yourReference, + 'customer_order_number' => isset($job['Job']['customer_order_number']) ? $job['Job']['customer_order_number'] : '', + 'job_title' => isset($job['Job']['title']) ? $job['Job']['title'] : '', + 'issue_date' => isset($document['OrderAcknowledgement']['issue_date']) ? $document['OrderAcknowledgement']['issue_date'] : date('Y-m-d'), + 'issue_date_string' => isset($issue_date_string) ? $issue_date_string : '', + 'bill_to' => isset($document['Document']['bill_to']) ? $document['Document']['bill_to'] : '', + 'ship_to' => isset($document['Document']['ship_to']) ? $document['Document']['ship_to'] : '', 'ship_via' => isset($document['OrderAcknowledgement']['ship_via']) ? $document['OrderAcknowledgement']['ship_via'] : '', 'fob' => isset($document['OrderAcknowledgement']['fob']) ? $document['OrderAcknowledgement']['fob'] : '', + 'payment_terms' => isset($job['Customer']['payment_terms']) ? $job['Customer']['payment_terms'] : '', + 'customer_abn' => isset($job['Customer']['abn']) ? $job['Customer']['abn'] : '', + 'freight_details' => isset($document['Document']['shipping_details']) ? $document['Document']['shipping_details'] : '', 'estimated_delivery' => isset($document['OrderAcknowledgement']['estimated_delivery']) ? $document['OrderAcknowledgement']['estimated_delivery'] : '', - 'issue_date' => $document['OrderAcknowledgement']['issue_date'], - 'issue_date_string' => isset($issue_date_string) ? $issue_date_string : '', 'currency_symbol' => $currencySymbol, 'currency_code' => $currencyCode, 'show_gst' => (bool)$gst, - 'bill_to' => isset($document['Document']['bill_to']) ? $document['Document']['bill_to'] : '', - 'ship_to' => isset($document['Document']['ship_to']) ? $document['Document']['ship_to'] : '', - 'shipping_details' => isset($document['Document']['shipping_details']) ? $document['Document']['shipping_details'] : '', - 'customer_order_number' => isset($job['Job']['customer_order_number']) ? $job['Job']['customer_order_number'] : '', - 'job_title' => isset($job['Job']['title']) ? $job['Job']['title'] : '', - 'payment_terms' => isset($job['Customer']['payment_terms']) ? $job['Customer']['payment_terms'] : '', - 'customer_abn' => isset($job['Customer']['abn']) ? $job['Customer']['abn'] : '', - 'subtotal' => $subtotal, - 'gst_amount' => $gstAmount, - 'total' => $total, + 'subtotal' => $totals['subtotal'], + 'gst_amount' => $totals['gst'], + 'total' => $totals['total'], 'line_items' => $lineItems, 'output_dir' => $outputDir ); @@ -111,15 +112,22 @@ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); +error_log("=== pdf_orderack.ctp: Making curl request to Go service ==="); $response = curl_exec($ch); +error_log("=== pdf_orderack.ctp: Curl response received: " . substr($response, 0, 200) . " ==="); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlErr = curl_error($ch); +error_log("=== pdf_orderack.ctp: HTTP Code: " . $httpCode . ", Curl Error: " . $curlErr . " ==="); curl_close($ch); if ($httpCode < 200 || $httpCode >= 300) { - echo "

Failed to generate Order Acknowledgement PDF via Go service (HTTP $httpCode)."; + echo "

Failed to generate PDF via Go service (HTTP $httpCode).
"; + echo "Endpoint: " . htmlspecialchars($goEndpoint) . "
"; if ($curlErr) { - echo " Error: $curlErr"; + echo "Error: " . htmlspecialchars($curlErr) . "
"; + } + if (!empty($response)) { + echo "Response: " . htmlspecialchars($response) . "
"; } echo "

"; exit;