'BCD', 'version' => 2, 'characterSet' => 1, 'identification' => 'SCT', 'bic' => '', 'purpose' => '', ]; public function __construct(protected Company $company, protected Invoice|RecurringInvoice $invoice, protected float $amount) { } public function getQrCode() { $qr = ''; try { $renderer = new ImageRenderer( new RendererStyle(200), new SvgImageBackEnd() ); $writer = new Writer($renderer); $this->validateFields(); $qr = $writer->writeString($this->encodeMessage(), 'utf-8'); return " {$qr}"; } catch(\Throwable $e) { nlog("EPC QR failure => ".$e->getMessage()); return ''; } catch(\Exception $e) { nlog("EPC QR failure => ".$e->getMessage()); return ''; } catch(InvalidArgumentException $e) { nlog("EPC QR failure => ".$e->getMessage()); return ''; } } public function encodeMessage() { // return rtrim(implode("\n", [ // $this->sepa['serviceTag'], // sprintf('%03d', $this->sepa['version']), // $this->sepa['characterSet'], // $this->sepa['identification'], // isset($this->company?->custom_fields?->company2) ? $this->company->settings->custom_value2 : '', // $this->company->present()->name(), // isset($this->company?->custom_fields?->company1) ? $this->company->settings->custom_value1 : '', // $this->formatMoney($this->amount), // $this->sepa['purpose'], // substr($this->invoice->number, 0, 34), // '', // ' ' // ]), "\n"); $data = [ 'BCD', '002', // Version '1', // Encoding: 1 = UTF-8 'SCT', // Service Tag: SEPA Credit Transfer isset($this->company?->custom_fields?->company2) ? $this->company->settings->custom_value2 : '', // BIC $this->company->present()->name(), // Name of the beneficiary isset($this->company?->custom_fields?->company1) ? $this->company->settings->custom_value1 : '', // IBAN $this->formatMoney($this->amount), // Amount with EUR prefix '', // Reference substr($this->invoice->number, 0, 34) // Unstructured remittance information ]; return implode("\n", $data); } // substr("{$this->invoice->number} {$this->invoice->client->number}", 0,139), private function validateFields() { if (Ninja::isSelfHost() && isset($this->company?->custom_fields?->company2)) { nlog('The BIC field is not present and _may_ be a required fields for EPC QR codes'); } if (Ninja::isSelfHost() && isset($this->company?->custom_fields?->company1)) { nlog('The IBAN field is required'); } } private function formatMoney($value) { return sprintf('EUR%s', number_format($value, 2, '.', '')); } }