mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-04-02 22:36:21 -04:00
Implementation of UBL 2.1 invoice generation to comply with Belgium's 2026 Peppol mandate. Key changes: - Add num-num/ubl-invoice dependency via composer.json - Create Ubl_generator library to convert OSPOS sale data to UBL format - Create country_helper.php to map country names to ISO 3166-1 alpha-2 codes - Extend Email_lib to support multiple attachments for PDF+UBL emails - Add getUblInvoice() method in Sales controller for UBL download - Modify getSendPdf() to optionally attach UBL based on invoice_format config - Add database migration for invoice_format configuration (pdf_only/ubl_only/both) - Add UBL download button to invoice view - Add UBL download link to sales manage table - Add language keys for UBL-related UI elements Data mapping: - Company name/address -> Supplier Party - account_number -> Company VAT number - Customer address/country -> Customer Party with ISO country code - Customer tax_id -> Customer VAT number - Cart items -> InvoiceLines - Taxes -> TaxCategory and TaxTotal - Totals -> LegalMonetaryTotal Features: - Generate valid UBL 2.1 XML invoices - Download UBL from invoice view and manage table - Email with PDF, UBL, or both based on configuration - Support for multiple customer countries with ISO code mapping - Graceful handling of missing optional customer fields
61 lines
1.3 KiB
PHP
61 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Libraries\InvoiceAttachment;
|
|
|
|
use CodeIgniter\Config\Services;
|
|
|
|
class PdfAttachment implements InvoiceAttachment
|
|
{
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function generate(array $saleData, string $type): ?string
|
|
{
|
|
$view = Services::renderer();
|
|
$html = $view->setData($saleData)->render("sales/{$type}_email");
|
|
|
|
helper(['dompdf', 'file']);
|
|
|
|
$tempPath = tempnam(sys_get_temp_dir(), 'ospos_pdf_');
|
|
if ($tempPath === false) {
|
|
log_message('error', 'PDF attachment: failed to create temp file');
|
|
return null;
|
|
}
|
|
|
|
$filename = $tempPath . '.pdf';
|
|
rename($tempPath, $filename);
|
|
|
|
$pdfContent = create_pdf($html);
|
|
if (file_put_contents($filename, $pdfContent) === false) {
|
|
log_message('error', 'PDF attachment: failed to write content');
|
|
@unlink($filename);
|
|
return null;
|
|
}
|
|
|
|
return $filename;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function isApplicableForType(string $type, array $saleData): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function getFileExtension(): string
|
|
{
|
|
return 'pdf';
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function getEnabledConfigValues(): array
|
|
{
|
|
return ['pdf_only', 'both'];
|
|
}
|
|
} |