'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"); } 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, '.', '')); } }