If anyone needs the code to generate the QR code of a Slovenian UPN bank order, copy and paste it into: "application/libraries/QrCode.php"

<?php

if (! defined('BASEPATH')) {
    exit('Dostop ni dovoljen');
}

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelMedium;
use SepaQr\Data;

#[AllowDynamicProperties]
class QrCode {
    public $racun;
    public $prejemnik;
    public $iban;
    public $bic;
    public $valuta;
    public $sklic;
    public $opis_placila;
    public $payer_name;
    public $payer_address;
    public $payer_city;

    public function __construct($params) {
        $CI = &get_instance();
        $CI->load->helper('template');
        
        $this->racun = $params['invoice'];

        // Podatki prejemnika
        $this->prejemnik = trim($CI->mdl_settings->setting('qr_code_prejemnik')) ?: 'Podjetje d.o.o.';
        $this->iban = str_replace(' ', '', $CI->mdl_settings->setting('qr_code_iban'));
        $this->bic = trim($CI->mdl_settings->setting('qr_code_bic'));

        // Preverimo valuto (3-črkovna koda, npr. EUR)
        $this->valuta = trim($CI->mdl_settings->setting('qr_code_valuta')) ?: 'EUR';

        // Podatki o plačniku (iz računa)
        $this->payer_name = trim($this->racun->client_name) ?: '';
        $this->payer_address = trim($this->racun->client_address_1) ?: '';
        $this->payer_city = trim($this->racun->client_city) ?: '';

        // Sklic (model in referenca skupaj)
        $model = 'SI12'; // Lahko pridobiš iz nastavitev
        $reference = preg_replace('/\s+/', '', $this->racun->invoice_number);
        $this->sklic = $model . $reference;

        // Opis plačila
        $this->opis_placila = trim(parse_template($this->racun, $CI->mdl_settings->setting('qr_code_opis_placila'))) ?: 'Plačilo računa';
    }

    public function generateQrData() {
        $invoiceNumber = trim($this->racun->invoice_number);
        $dueDate = date("d.m.Y", strtotime($this->racun->invoice_date_due));
        $amount = str_pad(number_format($this->racun->invoice_balance * 100, 0, '', ''), 11, '0', STR_PAD_LEFT);

        // Struktura QR kode (posamezna polja se ločijo z \n)
        $qrData = "UPNQR\n";
        $qrData .= "\n"; // IBAN plačnika (prazno)
        $qrData .= "\n"; // Depozit (prazno)
        $qrData .= "\n"; // Dvig (prazno)
        $qrData .= "\n"; // Referenca plačnika (prazno)
        $qrData .= "{$this->payer_name}\n";
        $qrData .= "{$this->payer_address}\n";
        $qrData .= "{$this->payer_city}\n";
        $qrData .= "{$amount}\n";
        $qrData .= "\n"; // Datum plačila (prazno)
        $qrData .= "\n"; // Nujno (prazno)
        $qrData .= "OTHR\n"; // Koda namena (npr. COST, OTHR itd.)
        $qrData .= "{$this->opis_placila}\n";
        $qrData .= "{$dueDate}\n";
        $qrData .= "{$this->iban}\n";
        $qrData .= "{$this->sklic}\n";
        $qrData .= "{$this->prejemnik}\n";
        $qrData .= "Ulica 1\n"; // Ulica prejemnika (prilagodi po potrebi)
        $qrData .= "1000 Ljubljana\n"; // Mesto prejemnika (prilagodi po potrebi)

        // Izračun kontrolne vsote (checksum)
        $checksum = strlen(str_replace("\n", "", $qrData)) + 19;
        $qrData .= str_pad($checksum, 3, '0', STR_PAD_LEFT) . "\n";

        return $qrData;
    }

    public function generate() {
        $qrCodeDataUri = Builder::create()
            ->data($this->generateQrData())
            ->errorCorrectionLevel(new ErrorCorrectionLevelMedium())
            ->build()
            ->getDataUri();

        return $qrCodeDataUri;
    }
}
1 Like