From ea9d923bda1329c28d0821bb8ece2cd64af76a90 Mon Sep 17 00:00:00 2001 From: checkitsedo Date: Sun, 22 Dec 2019 13:27:25 +0100 Subject: [PATCH] finishing application test --- composer.json | 19 +- src/Controllers/EsrpaymentslipController.php | 165 ++++++ src/Controllers/HomeController.php | 25 + src/Esrpaymentslip.php | 25 + src/EsrpaymentslipServiceProvider.php | 38 ++ src/Helpers/EsrpaymentslipHelper.php | 40 ++ src/Pdf/Download.php | 556 ++++++++++++++++++ ...16_090734_create_esrpaymentslips_table.php | 45 ++ src/public/images/ezs_orange.png | Bin 0 -> 26463 bytes src/routes.php | 20 + src/views/esrpaymentslips/create.blade.php | 168 ++++++ src/views/esrpaymentslips/edit.blade.php | 169 ++++++ src/views/esrpaymentslips/index.blade.php | 144 +++++ src/views/esrpaymentslips/layout.blade.php | 332 +++++++++++ src/views/esrpaymentslips/show.blade.php | 104 ++++ src/views/home.blade.php | 25 + src/views/layouts/app.blade.php | 68 +++ 17 files changed, 1942 insertions(+), 1 deletion(-) create mode 100644 src/Controllers/EsrpaymentslipController.php create mode 100644 src/Controllers/HomeController.php create mode 100644 src/Esrpaymentslip.php create mode 100644 src/EsrpaymentslipServiceProvider.php create mode 100644 src/Helpers/EsrpaymentslipHelper.php create mode 100644 src/Pdf/Download.php create mode 100644 src/database/migrations/2019_12_16_090734_create_esrpaymentslips_table.php create mode 100644 src/public/images/ezs_orange.png create mode 100644 src/routes.php create mode 100644 src/views/esrpaymentslips/create.blade.php create mode 100644 src/views/esrpaymentslips/edit.blade.php create mode 100644 src/views/esrpaymentslips/index.blade.php create mode 100644 src/views/esrpaymentslips/layout.blade.php create mode 100644 src/views/esrpaymentslips/show.blade.php create mode 100644 src/views/home.blade.php create mode 100644 src/views/layouts/app.blade.php diff --git a/composer.json b/composer.json index a02b6ad..7268ef2 100644 --- a/composer.json +++ b/composer.json @@ -10,5 +10,22 @@ } ], "minimum-stability": "stable", - "require": {} + "require": { + "apphostbd/laravel-fpdf": "^1.0" + }, + "autoload": { + "psr-4": { + "Checkitsedo\\Esrpaymentslip\\": "packages/checkitsedo/esrpaymentslip/src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Checkitsedo\\Esrpaymentslip\\EsrpaymentslipServiceProvider" + ], + "aliases": { + "EsrpaymentslipHelper": "Checkitsedo\\Esrpaymentslip\\Helpers\\EsrpaymentslipHelper" + } + } + } } diff --git a/src/Controllers/EsrpaymentslipController.php b/src/Controllers/EsrpaymentslipController.php new file mode 100644 index 0000000..8c5f974 --- /dev/null +++ b/src/Controllers/EsrpaymentslipController.php @@ -0,0 +1,165 @@ +paginate(5); + + return view('esrpaymentslips::esrpaymentslips.index',compact('esrpaymentslips')) + ->with('i', (request()->input('page', 1) - 1) * 5); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + return view('esrpaymentslips::esrpaymentslips.create'); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $esrpaymentslip = new Esrpaymentslip(); + $esrpaymentslip->bankName = $request->bankName; + $esrpaymentslip->bankCity = $request->bankCity; + $esrpaymentslip->bankingAccount = $request->bankingAccount; + $esrpaymentslip->bankingCustomerIdentification = $request->bankingCustomerIdentification; + $esrpaymentslip->recipientName = $request->recipientName; + $esrpaymentslip->recipientAddress = $request->recipientAddress; + $esrpaymentslip->recipientCity = $request->recipientCity; + $esrpaymentslip->payerLine1 = $request->payerLine1; + $esrpaymentslip->payerLine2 = $request->payerLine2; + $esrpaymentslip->payerLine3 = $request->payerLine3; + $esrpaymentslip->payerLine4 = $request->payerLine4; + $esrpaymentslip->amount = $request->amount; + $esrpaymentslip->invoiceNumber = $request->invoiceNumber; + $tempInvoiceNumber = $request->invoiceNumber; + $esrpaymentslip->referenceNumber = EsrpaymentslipHelper::calculateReference($tempInvoiceNumber); + $esrpaymentslip->save(); + + return redirect()->route('esrpaymentslips.index') + ->with('success','ESR Payment Slip created successfully.'); + } + + /** + * Display the specified resource. + * + * @param \Checkitsedo\Esrpaymentslip $esrpaymentslip + * @return \Illuminate\Http\Response + */ + public function show(Esrpaymentslip $esrpaymentslip, $id) + { + $esrpaymentslip = Esrpaymentslip::find($id); + return view('esrpaymentslips::esrpaymentslips.show',compact('esrpaymentslip')); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Esrpaymentslip $esrpaymentslip + * @return \Illuminate\Http\Response + */ + public function edit(Esrpaymentslip $esrpaymentslip, $id) + { + $esrpaymentslip = Esrpaymentslip::find($id); + return view('esrpaymentslips::esrpaymentslips.edit',compact('esrpaymentslip')); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Esrpaymentslip $esrpaymentslip + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $request->validate([ + 'bankName' => 'required', + 'bankCity' => 'required', + 'bankingAccount' => 'required', + 'bankingCustomerIdentification' => 'required', + 'recipientName' => 'required', + 'recipientAddress' => 'required', + 'recipientCity' => 'required', + 'payerLine1' => 'nullable', + 'payerLine2' => 'nullable', + 'payerLine3' => 'nullable', + 'payerLine4' => 'nullable', + 'amount' => 'required', + 'invoiceNumber' => 'required', + 'referenceNumber' => 'nullable', + ]); + + $tempInvoiceNumber = $request->invoiceNumber; + + $update = [ + 'bankName' => $request->bankName, + 'bankCity' => $request->bankCity, + 'bankingAccount' => $request->bankingAccount, + 'bankingCustomerIdentification' => $request->bankingCustomerIdentification, + 'recipientName' => $request->recipientName, + 'recipientAddress' => $request->recipientAddress, + 'recipientCity' => $request->recipientCity, + 'payerLine1' => $request->payerLine1, + 'payerLine2' => $request->payerLine2, + 'payerLine3' => $request->payerLine3, + 'payerLine4' => $request->payerLine4, + 'amount' => $request->amount, + 'invoiceNumber' => $request->invoiceNumber, + 'referenceNumber' => EsrpaymentslipHelper::calculateReference($tempInvoiceNumber), + ]; + + Esrpaymentslip::where('id', $id)->update($update); + + return redirect()->route('esrpaymentslips.index') + ->with('success','ESR Payment Slip updated successfully'); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Esrpaymentslip $esrpaymentslip + * @return \Illuminate\Http\Response + */ + public function destroy(Esrpaymentslip $esrpaymentslip, $id) + { + $esrpaymentslip = Esrpaymentslip::find($id); + $esrpaymentslip->delete(); + + return redirect()->route('esrpaymentslips.index') + ->with('success','ESR Payment Slip deleted successfully'); + } + + public function download($id) + { + $esrpaymentslip = Esrpaymentslip::find($id); + + $download = new Download($esrpaymentslip); + $esr = $download->esr($esrpaymentslip); + + exit; + } +} diff --git a/src/Controllers/HomeController.php b/src/Controllers/HomeController.php new file mode 100644 index 0000000..9db3811 --- /dev/null +++ b/src/Controllers/HomeController.php @@ -0,0 +1,25 @@ +app->make('Checkitsedo\Esrpaymentslip\Controllers\EsrpaymentslipController'); + $this->loadViewsFrom(__DIR__.'/views','esrpaymentslips'); + + require_once __DIR__.'/Helpers/EsrpaymentslipHelper.php'; + require_once __DIR__.'/Pdf/Download.php'; + } + + /** + * Bootstrap services. + * + * @return void + */ + public function boot() + { + $this->loadRoutesFrom(__DIR__.'/routes.php'); + + $this->loadMigrationsFrom(__DIR__.'/database/migrations'); + + $this->publishes([ + __DIR__.'/public/images' => public_path('checkitsedo/images'), + ], 'public'); + } +} diff --git a/src/Helpers/EsrpaymentslipHelper.php b/src/Helpers/EsrpaymentslipHelper.php new file mode 100644 index 0000000..27b74f0 --- /dev/null +++ b/src/Helpers/EsrpaymentslipHelper.php @@ -0,0 +1,40 @@ +marginTop = $marginTop; + $this->marginLeft = $marginLeft; + $this->landscapeOrPortrait = $landscapeOrPortrait; + $this->format = $format; + + if($pdfObject != false){ + $this->pdf = $pdfObject; + }//if + + } + + + /** + * Verarbeiten der Eingaben aus dem Formular + */ + + public function esr($esrpaymentslip) { + + //Create a new pdf to create your invoice, already using FPDF + //(if you don't understand this part you should have a look at the FPDF documentation) + $pdf = new Fpdf('P','mm','A4'); + Fpdf::AddPage(); + Fpdf::SetAutoPageBreak(0,0); + Fpdf::SetFont('Helvetica','B',5.975); + Fpdf::SetTextColor(205,81,56); + Fpdf::SetXY(4.5, 0); + Fpdf::Cell(50, 377, utf8_decode("--> Sie können die unten stehenden Daten kopieren und in Ihr e-Banking-Zahlungsformular einfügen. Der folgende Abschnitt kann nicht als Einzahlungsschein am Postschalter verwendet werden. <--")); + Fpdf::SetTextColor(0,0,0); + + //Fügen Sie jetzt einfach Ihren Einzahlungsschein hinzu. Senden Sie Ihre PDF-Instanz an die Klasse Einzahlungsschein + $ezs = new Download(191, 0, $pdf); + + $bankName = $esrpaymentslip->bankName; + $bankCity = $esrpaymentslip->bankCity; + $bankingAccount = $esrpaymentslip->bankingAccount; + $bankingCustomerIdentification = $esrpaymentslip->bankingCustomerIdentification; + + $recipientName = $esrpaymentslip->recipientName; + $recipientAddress = $esrpaymentslip->recipientAddress; + $recipientCity = $esrpaymentslip->recipientCity; + + $payerLine1 = $esrpaymentslip->payerLine1; + $payerLine2 = $esrpaymentslip->payerLine2; + $payerLine3 = $esrpaymentslip->payerLine3; + $payerLine4 = $esrpaymentslip->payerLine4; + + $invoiceNumber = $esrpaymentslip->invoiceNumber; + $referenceNumber = $esrpaymentslip->referenceNumber; + $amount = $esrpaymentslip->amount; + + $ezs->setBankData($bankName, $bankCity, $bankingAccount); + $ezs->setRecipientData($recipientName, $recipientAddress, $recipientCity, $bankingCustomerIdentification); + $ezs->setPayerData($payerLine1, $payerLine2, $payerLine3, $payerLine4); + $ezs->setPaymentData($amount, $referenceNumber); + $ezs->createEinzahlungsschein(false, true); + + Fpdf::output('D', "Einzahlungsschein.pdf", true); + } + + + //Typ setzen + public function setType($type){ + $this->type = $type; + } + + + /** + * Set name, address and banking account of bank + * @param string $bankName + * @param string $bankCity + * @param string $bankingAccount + * @return bool + */ + public function setBankData($bankName, $bankCity, $bankingAccount) + { + $this->ezs_bankName = utf8_decode($bankName); + $this->ezs_bankCity = utf8_decode($bankCity); + $this->ezs_bankingAccount = $bankingAccount; + return true; + } + + + /** + * Set name and address of recipient of money (= you, I guess) + * @param string $recipientName + * @param string $recipientAddress + * @param string $recipientCity + * @param int $bankingCustomerIdentification + * @return bool + */ + public function setRecipientData($recipientName, $recipientAddress, $recipientCity, $bankingCustomerIdentification) + { + $this->ezs_recipientName = $recipientName; + $this->ezs_recipientAddress = $recipientAddress; + $this->ezs_recipientCity = $recipientCity; + $this->ezs_bankingCustomerIdentification = $bankingCustomerIdentification; + return true; + } + + + /** + * Set name and address of payer (very flexible four lines of text) + * @param string $payerLine1 + * @param string $payerLine2 + * @param string $payerLine3 + * @param string $payerLine4 + * @return bool + */ + public function setPayerData($payerLine1, $payerLine2, $payerLine3, $payerLine4) + { + $this->ezs_payerLine1 = $payerLine1; + $this->ezs_payerLine2 = $payerLine2; + $this->ezs_payerLine3 = $payerLine3; + $this->ezs_payerLine4 = $payerLine4; + return true; + } + + + /** + * Set name and address of payer (very flexible four lines of text) + * @param string $payerLine1 + * @param string $payerLine2 + * @param string $payerLine3 + * @param string $payerLine4 + * @return bool + */ + public function setPayerFullAddress($address) + { + $this->ezs_payerFullAddress = $address; + return true; + } + + + /** + * Set payment data + * @param float $amount + * @param int $referenceNumber ( + * @return bool + */ + public function setPaymentData($amount, $referenceNumber=null) + { + $this->ezs_amount = sprintf("%01.2f",$amount); + $this->ezs_referenceNumber = $referenceNumber; + return true; + } + + + /** + * Set payment reason + * @param string $txt + * @return bool + */ + public function setPaymentReason($txt) + { + $this->paymentReason = utf8_decode($txt); + return true; + } + + + /** + * Does the magic! + * @param bool $doOutput + * @param string $filename + * @param string $saveAction (I, D, F, or S -> see http://www.fpdf.de/funktionsreferenz/?funktion=Output) + * @return string or file + */ + public function createEinzahlungsschein($doOutput=true, $displayImage=false, $fileName='', $saveAction=''){ + + //Set basic stuff + if(!$this->pdf){ + $this->pdf = new Fpdf($this->landscapeOrPortrait,'mm',$this->format); + $this->pdf->AddPage(); + $this->pdf->SetAutoPageBreak(0); + }//if + + + //Place image + if($displayImage){ + Fpdf::Image($this->pathToImage."ezs_".$this->type.".png", $this->marginLeft, $this->marginTop, 210, 106, "PNG"); + }//if + + //Set font + Fpdf::SetFont('Helvetica','',9); + + + //Place name of bank (twice) + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+9); + Fpdf::Cell(50, 4,$this->ezs_bankName); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+13); + Fpdf::Cell(50, 4,$this->ezs_bankCity); + + Fpdf::SetXY($this->marginLeft+62.6, $this->marginTop+9); + Fpdf::Cell(50, 4,$this->ezs_bankName); + Fpdf::SetXY($this->marginLeft+62.6, $this->marginTop+13); + Fpdf::Cell(50, 4,$this->ezs_bankCity); + + + //Place banking account (twice) + Fpdf::SetXY($this->marginLeft+27, $this->marginTop+42.75); + Fpdf::Cell(30, 4,$this->ezs_bankingAccount); + + Fpdf::SetXY($this->marginLeft+87.5, $this->marginTop+42.75); + Fpdf::Cell(30, 4,$this->ezs_bankingAccount); + + + //Place money amount (twice) + if($this->ezs_amount > 0){ + $amountParts = explode(".", $this->ezs_amount); + }else{ + $amountParts[0] = "--"; + $amountParts[1] = "--"; + }//if + + + $offset = 50.5; + if($this->type == 'red'){$offset = 51.5;}; + + Fpdf::SetFont('Helvetica','',12); + + Fpdf::SetXY($this->marginLeft+7, $this->marginTop+$offset+0.7); + Fpdf::Cell(35, 4,$amountParts[0], 0, 0, "R"); + Fpdf::SetXY($this->marginLeft+48.5, $this->marginTop+$offset+0.7); + Fpdf::Cell(6, 4,$amountParts[1], 0, 0, "C"); + + Fpdf::SetXY($this->marginLeft+67.6, $this->marginTop+$offset+0.7); + Fpdf::Cell(35, 4,$amountParts[0], 0, 0, "R"); + Fpdf::SetXY($this->marginLeft+109.2, $this->marginTop+$offset+0.7); + Fpdf::Cell(6, 4,$amountParts[1], 0, 0, "C"); + + + //Place name of receiver (twice) + if($this->type == 'red'){ + + $this->pdf->SetFont('Helvetica','',9); + + $this->pdf->SetXY($this->marginLeft+2, $this->marginTop+23); + $this->pdf->Cell(50, 4,$this->formatIban(utf8_decode($this->ezs_bankingCustomerIdentification))); + $this->pdf->SetXY($this->marginLeft+2, $this->marginTop+27); + $this->pdf->Cell(50, 4,utf8_decode($this->ezs_recipientName)); + $this->pdf->SetXY($this->marginLeft+2, $this->marginTop+31); + $this->pdf->Cell(50, 4,utf8_decode($this->ezs_recipientAddress)); + $this->pdf->SetXY($this->marginLeft+2, $this->marginTop+35); + $this->pdf->Cell(50, 4,utf8_decode($this->ezs_recipientCity)); + + $this->pdf->SetXY($this->marginLeft+62.6, $this->marginTop+23); + $this->pdf->Cell(50, 4,$this->formatIban(utf8_decode($this->ezs_bankingCustomerIdentification))); + $this->pdf->SetXY($this->marginLeft+62.6, $this->marginTop+27); + $this->pdf->Cell(50, 4,utf8_decode($this->ezs_recipientName)); + $this->pdf->SetXY($this->marginLeft+62.6, $this->marginTop+31); + $this->pdf->Cell(50, 4,utf8_decode($this->ezs_recipientAddress)); + $this->pdf->SetXY($this->marginLeft+62.6, $this->marginTop+35); + $this->pdf->Cell(50, 4,utf8_decode($this->ezs_recipientCity)); + + }else{ + + Fpdf::SetFont('Helvetica','',9); + + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+21.5); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_recipientName)); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+25.5); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_recipientAddress)); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+29.5); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_recipientCity)); + + Fpdf::SetXY($this->marginLeft+62.6, $this->marginTop+21.5); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_recipientName)); + Fpdf::SetXY($this->marginLeft+62.6, $this->marginTop+25.5); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_recipientAddress)); + Fpdf::SetXY($this->marginLeft+62.6, $this->marginTop+29.5); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_recipientCity)); + + } + + + + //Place name of Payer (twice) + if($this->ezs_payerFullAddress){ + + $this->pdf->SetXY($this->marginLeft+2, $this->marginTop+64); + $this->pdf->MultiCell(50, 4, utf8_decode($this->ezs_payerFullAddress), 0, 'L'); + + $this->pdf->SetXY($this->marginLeft+123, $this->marginTop+48); + $this->pdf->MultiCell(50, 4, utf8_decode($this->ezs_payerFullAddress), 0, 'L'); + + }else{ + + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+66); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine1)); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+70); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine2)); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+74); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine3)); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+78); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine4)); + + + Fpdf::SetXY($this->marginLeft+123.2, $this->marginTop+47); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine1)); + Fpdf::SetXY($this->marginLeft+123.2, $this->marginTop+51); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine2)); + Fpdf::SetXY($this->marginLeft+123.2, $this->marginTop+55); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine3)); + Fpdf::SetXY($this->marginLeft+123.2, $this->marginTop+59); + Fpdf::Cell(50, 4,utf8_decode($this->ezs_payerLine4)); + + } + + + + //Reference number + if($this->type == 'orange'){ + + //create complete reference number + $completeReferenceNumber = $this->createCompleteReferenceNumber(); + + //Place Reference Number (twice) + Fpdf::SetFont('Helvetica','',10); + Fpdf::SetXY($this->marginLeft+125, $this->marginTop+34.25); + Fpdf::Cell(80, 4, $this->breakStringIntoBlocks($completeReferenceNumber)); + + Fpdf::SetFont('Helvetica','',7); + Fpdf::SetXY($this->marginLeft+2, $this->marginTop+60); + Fpdf::Cell(50, 4, $this->breakStringIntoBlocks($completeReferenceNumber)); + + }//if + + + //Payment reason + if($this->type == 'red'){ + + $this->pdf->SetXY($this->marginLeft+125, $this->marginTop+12); + $this->pdf->MultiCell(50, 4, $this->paymentReason, 0, 'L'); + + }//if + + + //Bottom line + if($this->type == 'orange'){ + + //create bottom line string + $bottomLineString = ''; + + //EZS with amount or not? + if($this->ezs_amount == 0){ + $bottomLineString .= "042>"; + }else{ + $amountParts = explode(".", $this->ezs_amount); + $bottomLineString .= "01"; + $bottomLineString .= str_pad($amountParts[0], 8 ,'0', STR_PAD_LEFT); + $bottomLineString .= str_pad($amountParts[1], 2 ,'0', STR_PAD_RIGHT); + $bottomLineString .= $this->modulo10($bottomLineString); + $bottomLineString .= ">"; + }//if + + //add reference number + $bottomLineString .= $this->createCompleteReferenceNumber(); + $bottomLineString .= "+ "; + + //add banking account + $bankingAccountParts = explode("-", $this->ezs_bankingAccount); + $bottomLineString .= str_pad($bankingAccountParts[0], 2 ,'0', STR_PAD_LEFT); + $bottomLineString .= str_pad($bankingAccountParts[1], 6 ,'0', STR_PAD_LEFT); + $bottomLineString .= str_pad($bankingAccountParts[2], 1 ,'0', STR_PAD_LEFT); + $bottomLineString .= ">"; + + + //Set bottom line + Fpdf::AddFont('OCRB10'); + Fpdf::SetFont('OCRB10','',10); + Fpdf::SetXY($this->marginLeft+63, $this->marginTop+85); + Fpdf::Cell(140,4,$bottomLineString, 0, 0, "R"); + + }else{ + + //set font + Fpdf::AddFont('OCRB10'); + Fpdf::SetFont('OCRB10','',10); + + + //add banking account + $bottomLineString = ''; + $bottomLineString .= str_pad(substr($this->ezs_bankingCustomerIdentification, 8), 26 ,'0', STR_PAD_LEFT); + $bottomLineString .= $this->modulo10($bottomLineString); + $bottomLineString .= "+"; + + $bottomLineString2 = ''; + $bcNummer = substr($this->ezs_bankingCustomerIdentification, 4, 5); + $bottomLineString2 .= " 07".$bcNummer; + $bottomLineString2 .= $this->modulo10($bcNummer); + $bottomLineString2 .= $this->modulo10($bottomLineString2); + $bottomLineString2 .= ">"; + $bottomLineString .= $bottomLineString2; + + + //Set bottom line + Fpdf::SetXY($this->marginLeft+67, $this->marginTop+85); + Fpdf::Cell(140,4,$bottomLineString, 0, 0, "R"); + + + //add banking account + $bottomLineString = ''; + $bankingAccountParts = explode("-", $this->ezs_bankingAccount); + $bottomLineString .= str_pad($bankingAccountParts[0], 2 ,'0', STR_PAD_LEFT); + $bottomLineString .= str_pad($bankingAccountParts[1], 6 ,'0', STR_PAD_LEFT); + $bottomLineString .= str_pad($bankingAccountParts[2], 1 ,'0', STR_PAD_LEFT); + $bottomLineString .= ">"; + + //Set bottom line + Fpdf::SetXY($this->marginLeft+67, $this->marginTop+92); + Fpdf::Cell(140,4,$bottomLineString, 0, 0, "R"); + + }//if + + + //Output + if($doOutput){ + Fpdf::Output($fileName, $saveAction); + if($fileName != ''){ + return $fileName; + }//if + }//if + + } + + + + /** + * Creates Modulo10 recursive check digit + * + * as found on http://www.developers-guide.net/forums/5431,modulo10-rekursiv + * (thanks, dude!) + * + * @param string $number + * @return int + */ + private function modulo10($number) { + $table = array(0,9,4,6,8,2,7,1,3,5); + $next = 0; + for ($i=0; $iezs_referenceNumber, (26 - strlen($this->ezs_bankingCustomerIdentification)) ,'0', STR_PAD_LEFT); + + //add customer identification code + $completeReferenceNumber = $this->ezs_bankingCustomerIdentification.$completeReferenceNumber; + + //add check digit + $completeReferenceNumber .= $this->modulo10($completeReferenceNumber); + + //return + return $completeReferenceNumber; + } + + + + + + /** + * Displays a string in blocks of a certain size. + * Example: 00000000000000000000 becomes more readable 00000 00000 00000 + * @param string $string + * @param int $blocksize + * @return string + */ + private function breakStringIntoBlocks($string, $blocksize=5, $alignFromRight=true) { + + //lets reverse the string (because we want the block to be aligned from the right) + if($alignFromRight){ + $string = strrev($string); + }//if + + //chop it into blocks + $string = trim(chunk_split($string, $blocksize, ' ')); + + //re-reverse + if($alignFromRight){ + $string = strrev($string); + }//if + + return $string; + + } + + + + /** + * Formats IBAN number in human readable format + * @return string + */ + private function formatIban($iban){ + return $this->breakStringIntoBlocks($iban, 4, false); + } + +} \ No newline at end of file diff --git a/src/database/migrations/2019_12_16_090734_create_esrpaymentslips_table.php b/src/database/migrations/2019_12_16_090734_create_esrpaymentslips_table.php new file mode 100644 index 0000000..5fcaa79 --- /dev/null +++ b/src/database/migrations/2019_12_16_090734_create_esrpaymentslips_table.php @@ -0,0 +1,45 @@ +bigIncrements('id'); + $table->string('bankName'); + $table->string('bankCity'); + $table->string('bankingAccount'); + $table->string('bankingCustomerIdentification'); + $table->string('recipientName'); + $table->string('recipientAddress'); + $table->string('recipientCity'); + $table->string('payerLine1'); + $table->string('payerLine2'); + $table->string('payerLine3'); + $table->string('payerLine4'); + $table->string('amount'); + $table->string('invoiceNumber'); + $table->string('referenceNumber'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('esrpaymentslips'); + } +} diff --git a/src/public/images/ezs_orange.png b/src/public/images/ezs_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..252a1153ec3e954681241d9b37770fe835570c4d GIT binary patch literal 26463 zcmafaWn5Hk*Do_PNP{2>jI^YZN)AX!cbA}mba#y)QqmD5J#+*3{m5BT+gZ)d%-PM@(G*4Oy`70EM8?M0+*H-n_`Qcix2X_t zQ;@Q}x+EP9QD(ut_N9TJ2$n!M^txmoGc)zZA4 z{dpSo^1R66G=%k{!gYUj@+?te`FG#dU@o%f=VeR8dA31OX37gTHhF1D7h6k_SFh@S zz&^x7=MEjw1)}?(S|6SL3)*L{U)83}qz5)ZM4H z(=byCW+=54)DAeHrL{S=TTT6XUT)`+plzd=u z;3+IDLP8V>1p42vaL&mmW)-vjEKznP4R zR*lgre-zo#V9QNcUrEQ1Ns<2*|~7VUa9l*((|nv znci2r)rgw8hXg+grQSaiA9~_%x3q9k;U8&W>{NwEg5SF1x)j_;C8uBKr#*0Oo_man z(`9Q%ak++5BQ84L`5QddXLiKM&Qjf3t>~h{Gr{QRz_R=KwoY?bGCzFSZC1`s(RFO`(+55C?gS~BF$Z^&03^EsI0pG(a8z# zs={F}D)xt0R;v56=*K!FGgsRP>fpD0URHej-#?Vd-+q6wsf>9!->vG}sw9`{frIdGtRD~MDX%rZC(`J1fVRPAVt+fcj1L@rDhRVpyEt%ftZcaaX zc-?kR22F9lzCk{<#@?0qX)9-Yd*J2k^w;(Le!EYKGZkgzI+J=I?kYH`)Wm6NJB@BN zyOa2_yMPi-)+#HsP5KM2JIZR-e|e5(oaBAXxqj!z2Aw7z&+1U{q6{wHJj`OgSnmsp zrRr2Ms!VBm-a&nmYwNUnN{#unNz+zP-Pple;B&j>7)R_Xd;RyR!(*E7oTV{_7!TpEaX?8)v@ri@` zcE3!eQ2GkQL-%yr^!S-UA%%63r09#YBe@#hNLI+f=ytfZ;S5J&LA*mIm8Fh?S0<8o zt$9l+DBG}m+UrV7SSwuQG^KhkDBYoCGe98)sj5XsrEx1=lb3Y+!ft0ap?UVW=F-RA zfP>GcFe2Qh^!1y&7lKJ_oJQ);8ceUQP97Ha$k)`ZO;D$n_VRi;+|F$?A9Wk%QDu`0 zbZzCB`4#%@R5Q4haSOWo8i8IZC`A>!bxY5pYi#^Fp78$akr=ebc@&o7seF| z`^;+M?YK}X48OW~?;uLlG?$>DIP-QyQ1zC9bC}?Uao!F2>4(~jvJ-}Fl??I-0n0yL zKKjXdE*c-}M0!?FMjai>^NP*J8TZiW`FkwB+YQWnF!>`)yPe*BoARoTz$yNHRd67! zX&n^1rK7dYQk$);l6t|YT3{?W*7fxeUYRz;m5+bWZXOlj#sKhe?fHcO#-U{1Je z38hQov=JYN9|K%0I9%6ReqMnjb)(;NnzORACfCV;BnrDKA2a!lOG*Wj*HAhV)#%u9 z-uTKG!S4J#btga9um*3p*y7{kCvP{Ce^!fl-m7kXK<0&m!-t5PUFOH>Z*mQ|y?p9U z#tmps{q3u%4g9~p^t0nDnI4HHaTM@@wxzucR;*z1dRF4csIxO*eQ4!FJvSFJW(K5o zcsHVcazKC3R&lo|s&i1RI`x#qDaGhg@5ml(x#blhBD|JUP;FIFFv`<)98u$;#_lsA zlC*W>qV6!2g2=U!?X1o_+ZA%23YqqJ20K%<1-8R&baV?#r>iiEL0uyAQNyc=!6Cue=oz9Lgp z?83&*YbFUAwm5yCxP)OIgWQpiHA*|$cV$vdp_-GI|1<3xW!KQW6D!F2p32fU`K!`V z@9tbC(=7tyJth78W#UN?V?Om&XUg_g`ROL+l+-I5>bbEU9a_Bya~d@%LOE{IvET6n zxJTIPRebFHrG#CzeC>p!OBsr&D;I)`U-fiEI+|Xce)oJ{XDi_EVyLm&^V+1rZs0{l zUHMa)a=XzDq+`EwXmz~(xBA;B$fV!f;~o2aUr9h4Vp!vQm_;|W7?l+Ckv^<=lR6gp zQkAiFC0HLuZ;=u%x5A)F#DIHMP406kMH=UNbX$8^(&^{9Z!d)&)jJ(#zOw#&AEAVf z{6)M{C{H0+=36fqwx^H}s*hJbrAEOn1sy2T*6epxXBOl)cltc`tRH=L8x=H=ClpO4 zt={vr6CsLnN%-n@kv*Lpw2PXYwi9^D^t)|3eJbVK_Gr=63JoI5_E#L9t=aWuCzLTj zvUo1+*b`i?gf?b{JsQ}(hEnKP%=u@>ck-=cgU4m!dL5rlvq4QA!ltZ=xu#IsMX+3J zM_Ec_^Yyka-UmO`al{qO>;_giU#bW*Evh7kQ8GoQ&HnM#xcO4o_@JNKcJYBUZL!!p|Jt zzUJt_8_0?^K*|de?8$tcjx}*VnN2kq2!W+mw9jz-o==`2913bw-a^7kaPkbbF^}5* zq|EM9+-Ac(*^P645crtg=t55%n|V=Lruv1+hmelVgi-YyZIvqqL{ZkOH?>B1>$o5U zZ(G5`%~#|I${|tQbwq;-4rt@1EMtpxu@`Jf&@qkk#+8aqBpKHN?U>b5@Sq%4Ps;x? z*7g~EZs!d-I?tOv8~k0n{v#l$Zz=K}_4WV!QiBVgN)jFmCwInIm|hp>(@05JbpqL7 zETffTe;Bqa9-g-3z&*XO6PZHCh@Cb}e>b{fQ&mitgDPdWyI85UM1xV4<<3l|X8)$3P%)w^TVyHZ6-9HP0eG8(#V>}JK-N3L#Wr8UNztkiD` zW(FEvz2E`}Q#Z?%Grd`tSzEImkEYQ(Z6-WTKPLFaH!3un-31+eJAXmvWk)6S%ID1+ zKFY(Ql^FH(kY2RqZP#yFwgKF2w3wK`pGWr2atl4;!1~}GXFxb~opteH+7*ExU~eHD zkoxNP2rf8TNfJ5>h-t3u=hpY(a#y~d9v-&16Ih2J**lK09ggT}qK6xs*dF%2wW3yp zo^E8u45C$5rS`l2AX(k@DkLAz7J4p>2Is>H`?W12K6Lm+PWs|RL8g8pMq?0!glV6;YsM2b}>)Bl|d`m^(v4jLjS~;JI z%&gU);gUDi4IFT{i{2+zuK8k$;b_&{#&Q*#>eD(AO{TXzXZdA^b`iWOeRQ(((^sjO znA)uHUF9dK4-(OMUiK)W@o1U8W++YYUmeAg92UW~>;ky&6T7QY^)p+0Mg!s@ zAf(;N4kKP&a&#-CczK;HPhP2nW4|I9dj5j{!t@6(0TaAJnjr&ceW>A4K~m?8omW1_ zduq`-AG@ZMja{$%R}EIwc&uuHdYD6T&s zHFIk4qA%v`rMkASOTK{*+Rde19oaNECFi{KAUOIqo90F|BoiEDxzXg7P~o~&g4N|r zvF%EZ_TKf#*Zr$tkXX>~=Vu!YpOd|g7)LNBu7CGun^U^oC*@jtc#DdwBYrZ8Gaxg5 zt1xzJ;K>6gGe0>crLMCKA-OyBsf9kpCla|@-|SQs@8s*5;c|;RHTGvTQQvLbEMM80 z|IumCX@mSDF|ZHxgu9Guo>Xe|QVxt44BG7_b{1ME>2A)J(Ad!J1&l=IKaU(%Bg^6j zA)SQL7WN$spaBU#ZhaG7`U5vx(sstkCYKPe3NK?g4pu=)DV&+XYy;nurS6EN$J_c7JtYb7zzM#yNe)H}zObPmqpu z%bQeR^hM1@b~A4z1Dx|kKt5+9`Eel=As+#Ih8wrQ4eRn89V@2!di;hB?|GObIYPWI z;1VPD#Hontk8{3cL*Jo^aj%`QL)jSy(rQmtcrsBA@yzKDO**N2o0cPIYN_sVbMWA* z7M^$ckT>OE`Ss~=<2n_#QQCuvNG_N5JGj$YFaMpP=&hgT5UYW_{`sPT$;GAoC0pZ; z%;L*|c*)Ywjvh~&*`z{;!_kf_YAZd~i7@%Xhwwe!QajIOj_S1@p~JelKf{Uwww>nY zZmK?Ft+$}@Oxryh_31VA{;_I z4-m=WhNGbDvccyKa0MgUnlh4Mn=KR%P@vFEEG$MA2nx&zl;pLz$S~PkvkXEJdWcB} zK|z5vcVN9~zQ#gHkEHv<>ENa4dJIy4G4Rhdy3^1A7v2$qg*HDby34$W&JYrQX-O>` zr00UzVqxWhKp_u;AA`lAP+HWb&#;B`AvEc~-(Zx4QC+awr|^xR&#j3c5!OtQDwC!V zI2;#Wunztiy3%`icgXy5Ne;M~&mTr>L@R=pQQYd(k2!Ir7$T!vN8XHu_)$_|W`LyG z3wDreKKtl<@sg?Oepv!m2q!moPqVSVZhrhl`t|&Nm}*x0*tLq(-D$&8hGAf&-sMYP z$kG+<0Ymgtcp_=kRhq{2bFus{S`E?H^C(GVtwO_z!xy5rC3`l#ZE+$ou;4wb_C$%# zFhgDF()>$&t)^>12ZoSs;(e{MWLCqAkXP*Qkj7D;93M>>1s0sV9>{CXd(GcFqumeJ zWWCKOa@NFJsbo|0BVD2?)0|W#W-Q;3Af@i!BQYXFT89_rrYn}rYHTp}SEq0y^))Iy znx6?5`D%Kq85TEx>Dx9#8Z4fP4izV#H#vICyvJIPM<)%&on~Xdt|T-sW$K!!V!h>9 zVaTpw=?Ic#V)nUVC4Yc3IOrIi&^kggpIDEiJs24a>q|DBc&+?iGKH*N;JCvgIkx2Xw`&{wu09q-s86Zff8eH_;Jq+YhSf=xw{8%dUn%Z_oSa*{dwnL zvyrD>dI1Hg;kP?W%~>*Ew~`r532!5MK=WwFhv1kxW_sX%quEj>0kDCriy2=Xk;mSa!8T#rUbaWoUExpu*R#&0@u|IBk8~<%kc3_ISqBq zq+%7x;FC1@1lBzU=6KI>jh%b~ud2YkxViY;as7fmL)SuET$)nsi1Vg5e~o~& zg8K5C8m#B+_OT-7Hhg2?$!HIqJvLPRxnd{QSa=>zlz%&K&gd=)jyG5B*IkvcV_-6C z($RZ6?#6XNFUFgVu@iY|y5T}WmOil?Rw_$?Avk<}3)egO6OeHS{*QBFV}HozI4x+* z8}o1lWWng)i7?D6d2^$FD(Nm6YdJH5YZXn%Fl-S@p?K@ze`&bkkSnZyE(`p22@_bDl?_KnrA= zVTXmkuIZ+KMFw2m66Z+FU$>VrvLKPRUJtcRe>NvNYf&bYkVbPW414o0_0f^`tT+5O zE*qOcnk{Z}dp&AKYu^U^b_(vEi}{$7J~{B2JCEri9FoI%Q{@}fhE{cY>_b~_Cm^sz z7c6NT+FO|cUz%|%bo?zt6|yB&v#lyY{K+O?C%@z=qN=vC$i%0d$$=`AH<*Wf+}Jsp zR*|t6FZ5`r=tYzauiA83%)68Vqr_cvjq<1^ubgV$7)h4Kx5O8*ORc>z)sa7omK#(q}|Gr07{7ds{~e@^#u2K!gnv+zfkQ&UY!5%^Q7cE@HxN# zlMs9vM^7N5yiB$3COQzp2?j5n27^P#n=-O9g;6rlT>elJ9!Nr=Gt@O0E0=4}!k6EF z?)*JmB51OB=0nGFKqYu@#ZRyW2Lk8T`)K4v@cj#wtYT9#;9O_rjV4p zEs2lbT6^#*I+oYp3LbdWk<&qHU-<1aQ$wNq>kh2`@PalaTOB!X&U}NxyNbjMTDZ)U z^-qZs7_kw0`f=Zhi8bC#qGgafnU>)Y49h_|14Vbejd2JotT(*z ze5<#f`wHyu7ij#Op6lz|8FA6`3D?T3lD&%}FEpMI)U^GWuDAYRRnGdm30Zaf&KjSm z5EOs`!K1tpfT_A?NJJ_luY~9F+sbqlB1e;(q;tcQik3 z^zUMd|MS!!O%2y&1zx0`=IA}?d*!+x)S8N&Bu@L%O+SS{`x%}GT-vGausBXk*~LHy z`|nZzwR!u_XVRK{`=<~~!1=CD152-%S)bba?4GoaC<{N$PV1P+(jw7PeqV!Tn20CM_OcRpfL=O2Ysat4>Ji{e@WRuF-{^44Ryl)Jy z*1-DiS35%6KibTcs~-FACzqnN@&K+gaOQ3S)dt&2!BWh~4}pDz6BzMH#S8v+ZS z7UdSlO@+%75qe{OHdfMrhWjnWb8c}t=m*JAT-4vaJkU~T3;(lL|82lX=1;B55=P16 zhSeUt=|=`tJ<1xPG0L|F7xhe#gBuA2ey32;dY6fAS+d^=+gED=+Vll0mdn4b-?BG_ zh}RvuCb&8g4FxRDy?p`(CrkL#Hja`iFK5tmdcTs_I&V9XJeJqec>0ME*L-ifTjUpD-f(Ck}?bN)4RB0QJ`fXHV zu`%IzS7oC}_QX8WzaiNH$Sr|`m=Q*>;GUU%?>R39ZpK~=%oHQ}RfgF=!AfKy6vayH7gBVoJ7Xti0kE70KG0FpsEqg?PTw^giR|xt1VC<1 zj+S4t%a5in29W3hcSeXo@FR6dPK^_baV6N%M=7G*iro6ogxb{btQa@_bSx`TQKO*+ z)_MWPuPb!JOVe3(oUU@hp*UmG83}ZCFBZS6e5R1kU>0P17Ljt=uY$!beQ5s|Biy_s zCkUMOBtG7k9FY{yM02;uM z0yNqZ8rEn#&;(QOjI#8%LeE+&Eyo3qT(G&smgfsUg_p8CE$qCFJ{@*A^^%6ca&Q#v z)ySgwlw%ADhgbxOlv7K_PtZYC+?Hy2@quDWP^lM&{N_f`%?$e?wA{5pO>(rXU(~fG zs|w8m;7hP@)Vn^}A@X^@-*{Lb3ig@PyK&w;?$YaYp}<2YUGvrM)EK0<1lky@?1+ z5XYK+6#i@^4OXO)D%=8OSj9abgBx>je<0kP%z3(yUF;q)wfa!~t@4py`0_~?O; zq2D&qP~10yUo*DoK zMrr#Y^M2pc!6~3K4@A~X6Z+o=#6ZGbDJIP?(EOStpd=!HlSA-yns%bmo%&;t0{Pzz zG7+YC4QXx*7r9Us#q+9J6@j1uN#8xGmZ61Pi2k}Q;S7b!Z3dHP@o(l^KrU6|P_G8H zXCONwPGcBrE!rSxK=#w02@Uf2uyr}guJijLIGG2i$D=_G4Udh0+ZyP=$%p?Q3wI@# zd>menI0nH`fCSCuAXk2V;RXVK$3P=dc)zP~MW}yfKDtPQzJf7$Fo$FA_qD(J6a&aH zUsY+3{2}`V&BRfDi%DGv@f-H2AdQygYhup&OQhKuUt;r#PbA>&nF~43AS!2hj%Sf* z#|lg>#b|LtLvuGP;SZ+kE`I3I-dma-gj4|zaca=WPj12^JJYo`m>>mGAcAW_Te)@x z2zn&OK99ibRPiRn44FY>9zSd^iD$U5WF0IJ`2JO2MW21=*>BBypn9N18ln@Xt3Vvq zZLB0?%-G8-p<>W!BJ;vdCA4ZHBr(S@D~Dj5nV+Fg0%)yx#W!vlMy_@mYJH3dq68MC z?%>{_RL)Lb+ElLol_a5JW{hA7gyAek#OGtzc`)3nbzT&dXnE*2Ddh_l`4m8RD6 zR5gM+I;OIMOc9^ITG}KpOl|a2TB%4MQc#}lfptX(II&{~Ibmt6cJH7-hF>s6r56M+w=cf2Nff+?_=Rt_7{IFeSqWCHi-%Xq7SBpuy9 zUe&>}vc;E9xdI4FaPz1>{df&k3%r8mutBsCrK&X^f%WjHZ5;Bg*EK?f?6&!K{(DSN2=wfEal zU9Kq4dn>h%(WrPm>uMmf@}oQ5=M-cba}IaP1;En<5&00^7CA zdgxxGym#WtZIAq3sY($W>or?8_O9t?yYiobxre`Ir&Bd=281SX{nY%o4SZ%g!}M+a>6$o6jL>+*Ky`x$ zB9JR>&bgfnPBhX&ud&AM+{DZ~E`c9IiMh6ubJYCTY0bSLa$@yi1I$0B#~VfS3d)gQ zf!-G?LhWZ7OJT5_XYiFrzFCI@Yd@~*V8^A`2RA);$HY;UmV;+u-w`_gveW#MQaX3U z7c|6U%ZJ?+z}XPDogAc~0#$0&ym9le_ho{sR(BW1@+C|}%d8dCT_l{j#?;0bcx^rl zivB}pyzQ0FnQ>D2(68&&QeSUhw(W;>RN`@mMGw|0`6nkSCI#0k-Zb8OmlkWCE)3)) z$k%Hfl?7S}$qNP9<2mwWEjr)J2V~h@RHLo~H7Ix{mdv)6k-BUy7G5{@ReY>A2?V%y z2HkiO)TfJ@8DIPxoV;&_&c-yg=;U=IOn29p0dn%g#fLLl2y+=YGpjZs z3({7+Oc_+;-k>ba=gBCmP}Vu>)Wp#w7h1dMY~~zd@J5fX>|rkY2GeMbUsACVSqZC=kz*60 zMWCRaw&`(|(k=VMQp5JQE36U%@me=;)E7=;2(o10_`0C!;FbFLqlh0xwT$>UV8^YQ zVKcfDlSuoo@D;rNZ!c3)j?~P8m7B!N45f3@%IkiyzxR8sGIpt|k%M=lh+E?k@%neA z<)(=L{_zzDX1hgkiB%h9yJwRjkBA#En}dPorDeNW3`F6rCx49 zm2mQ%EMNZ^rYeDsqjMAgf>BvRi8G9+$0W*bd%w)FWt(y26hpZ#)}pJ6UTWP81)w2a zRi$t68%p4P);e)##Bm%3h}?5$uYkp+6DMa?BWm-?s|sy#Y(-TV*(uKMDud)`L-c=GhAb& z7&6>}MivrtQHz4f`Kg?$(oR#eaxbDW`2gVxw?=yAraeChA0qSboO%T zfZo7x=qBa*9Q9edyDhfRl#%$nx!SEY@I zGgbOV`P}v{4*gZH8SIS4aO(_Ohi=Rek5!PwQ-5ZCK9yOV(sddiyA^aEDzd~H-_c-Pk27~@5Z9lEcm3cVyUI4j~s+rCyok3&PAi!O)B zY5u2LRY=J7VBnuohXNRK5wSAGMfCQfTx+{ghe4pYQZeg`7YVT>^W+u5fql5=E9M9N zJz6{Emh6u8=gQsEF!Tb9QKRg0seZi;3(HAuMGfxs;__$e)>3)oGWs{=;=Fd>wHSNU z(F;t8l;@!YcXa#>{F4}e8uy3@c_Ck8VEVl25{Q1@!E3g}GgY$e^Pw53)JtDRJHH;) z=B`z}7vCHAM@P1(W3$tLWi^!?+nDI2*DtkAot4+`gFOnhWY z0SgP%5{H(R-cvyB#8K`?m2Hx&u4+szPrB);YS67^+x16geL_1c7p!_llek7Ct+KF* zDc`k+%nVy0VWH&yI+0;s?!-*gn{VoqPkAvCex!i|(lGsP8}57RNfjbvGWQ1YE;G*V zCU2|)L^SlMFgobzxsh;8gAYO44g?+|PBNp8PM_h%5mW7J^|`S{4$*BA^(zn@x~3u# zzsaMUhJ>w*!9CR9?v8J&kf?k^Un$I1iw}|)yX1Xx*sWlxbJLm|Rv0%Jz2ow3ojpv$ zpr3bMJzeMHwJ_HDCt8}b=-(S!%gQ3B^*GK#WA~7!ye#xET#42qrDcF?y1@t3aXTf~ zFL6VUxY&?gd^x1aar?sS6EY^E!2o`4kMX&$tFo*-6E?VLbYUzJ=n113N`GvMZy&{oQ| z6aPDU_{%|B2HvCRPH4x%1)YA+hJXQLt)_dJjj^^HC+}1^y0V{@z5D|+y~=Z`u2B8aA4}ACXvdEnl)s#y zeqS)!dwq`-8}dXa@yq5>e$K$y#Phb)Rppr&Ffk$B&{CwA#fko-v3axXI47jtV50dd zD4llx9g%EM2ol|pjaxZ=tXp7+wbVuIFz~a+qm@=>PaT7~4viiH%ZrzN?Ziuh$ZzzU zijH!t{D-F8p6DjBs`3z9(beAQp|j75PU;gkW-+fB|k_)X6^w z*GJ<)r}zXwo-tWOa$kKfMe^c1@%`99$hCx}=A53p8!_lTg8U#w;&db4dgCh4Q`=wb zd^4IqG2|ZhZ!BJ3L?aDXVZ}RotRMOh@R=xaYO!O!x>ZBd9^HH?@w{YDi|40sI&8`N z=1ebRg{K9CVkeR2J)=2z`S9I62=@l)RTc#S+z>XcEdt}203c&Kv z8R9#F>dTzSR_K3FZ$_e;m4QfEoZggi0DvQ15P=XslBcuX@VWZ9#8qlrC-RRx`&_*6 z!zQI)9JX8hXrJ!!Y)+DzANBJXTKuI301OQ!c@pvvjS~E{x9~!@ADkV?k$&1 zkAdy_@AEviwvVniyRnS5nJk?D1X%%{d_etvA`>F^apiBiMgJ*%!`o_saE`iZARpdzHg$uui7ymjgMtkv7>_AwfyvQQ^ zexQp#6o1^XfzBESP^M65(0vc#fyxCo5>hw(Uo!_!FMs@}rvc0p_zQ~B5dNJk@OQxf zpT1QsfY)KP5!p#Uz80s=uGwX8fXPl2CkV}F1D9j`z;e(=fm8Y?BbR_&?- z3u_l!!5(XU(H@;?^5w~O#+qH`7yFmOhImZ{-p%~4?PrC0Fbc=i?tXO>_$ebfXnU!F z{Ov*|8BiYD+pMi14c%7-N+DXfG~Iq97tP8F^Ho_pIIS5$5>KXc$Evl?eDxU?qxy&r z86WfG`Wvh#?-aG>nThr~8OY$gW1d*~Yh%wh;P8zSxg-XSWP&8w9Qh(U&iv}}`TLjU zz&)|IT3o$X2NU4KnA36pS{u;$aifj^|~; zYkMg<=Hh#n=;b@P=XqPNr=Z7~H`1bYXk_HaB!`0$cq|)=0oLVJjSY7j5|ZI6dBs9Xne2bs_nTMQTm(Br$giFIL^Ua@r{Ry7$Z_O|b~hu0Ehs(r8#E8P62w zd_XRz(QVSh(uZ3<3;)40L%XxFpS!`bNHW4@Liw z*OvYE-rTQPOX|5KD@0>@7;Jf^)(WBaT`hGsXg|yP;f?#rVica7eT+adS0`SGJex z&q9}qR2B;jT8O(d#piGswG#C5u(`x(HLfR114%@J-IjNIy~}y=?NENaR1lPpR*E)u ziYnvqpvh7h8OX9;tZ5fg=>3#kozkne;6hP*`0R3iLsR%^SbUj54ect&0dDIIl{0tX z<{vUtP#r1=&##O)itSf_c+NC{>={z<^r9PIr4SMdIRm}0SmG!eAq*oVOw%zHmU0Q+ zz)90wHA*s%Ip61;jg9Ftwk-KdosV6n9m4B5~zbWOweN%F( z4!wm!eP_s{=1HO^$fN9%w~{IQH_5@2*T3YzhrmET=1X9wE2AbS!_vQDEAj=cwvt;k zOmb;tJBTU}+>>QhEcg0a4;+b_qFc1^$}{sL0_H3mT+CJO22U}lsuXtIieX%%kC7#B zkoCuBGSsK1&6dc~Ss5)f=iA3YU`sg~oUZK}+Xfom0jyv&Nq3?lI-EBrC%LAZGD;H?>c6I>r_urWa;eoqtn8rX0VymqOMdW(Vf)Dwf{aT+0$WCZ!{n|( zOIXz|PbltStXe-J;ih>hFT$sp3I1~Au1gv}PoLwqLO0C^`H1-_bZD=*dOAix-@`Dv z(of1tDWY$5ddxfbF4QDjkuz+X%v9GYXS$baWyW%+cxAlO$Hce6huqgeF!vVZTk5P) zl3ut^dtxO!_zNg9?y~{f{R@W>2pZ3~dpqCfj~77w@Rt{y2W?V+ZjWzl2rn|1SOVKEvFL@$P4)`(NSzkqDfu{I4ckD4qi) z%02h!pN;A6Z~ZSbUw{nxud@Hq-ThK9*h0w=8qj_EU(5o%`@c_S0*mA@LI@UK04gS# zsYD}H{{ELKTPW=Rx$@U2C}8n>dp{wYAQ zc)#>p()$eo{QD&qjs=Y90Aw(PLNV{zzvmE0=AZt@fMQsGRlxlG!Q;R3F^Lfw{w4C@ zga7M$!`-(50TO>-DFypCh?4-50smd||7Rqi&y4B=JPX+Oe<}H&D}Z-G?-%%oJ_^9t zy~F;!WD9Ql@z;%1-jY56bF~kXb4wg-1ev$Hykbc=0;YLGGOphS7RFx?N(ClfESA<3 z8K@Xs%w0-PqvT@u6ol*@qmf>KpFWx2>zKJRF-Z5iT$~;*D#%%29sW|VSHybUu0qBa zq}h1cPrY&X-dz)v&&=rIx~jWr^2N#Ni=@ZHI+cUsMn?yQ{?M2)y}Ee6)z<#-;Kd1j z4^n~y9~)2zE*b;e*JZ&Rtm|`D4~ZZCqWUgs!Ev>lz1amp9B&!Ucqn;lp}-^#EoFxn zUThqG(@%Og)bD36<7ENRY!zCP{SyHIlbmdjvlJBs3w&?fKSsY(m4o$L) zU|=~VKC9aM=oJe_OC8+%j$zVnNtBI4-eg+udEC6NCdzW+c8IOuOrs&K}ooE?T zm5gPWD6m#3R^&WC%-pw@)VX^jFdID7&&979R$}7sAuOiDdyrNFTdKt;DI;KIhxfEU zRT1QMU|0$$%v`T4o10t;&@0gwwwk%F88Q0h(6~uOt}}es8D^>W=4+Q(jdoB~jl`3b z{`_}N>cQ_iE2}!heqVJeOrv**f0xSP=T-;a=L6pIN?_B)VWyT3G$&O~$tWK?6ZSw~ zCd)VKS|cg#Lx}4m-J3G1$%hqI1)p7!i}bUJEnaMK$>185jO)dFde-C=A*3v=4m|b< z1*U`B<bS5zo-4kF(mrl5)H%0!ie5QztQY~jse%k^B|&3F8ZxCI zgqleO1ry|?4Glee9u>-KNxdi3pug^W!pImZQ>yzo?5kNePW6^YM?nv+XqY4^ZnK5f z5pJn+=Vw;&l88|F^V0&YoJ}>UHE_0$a^JdEpgxpTyDNN;ibh9|AyJQUe6E->T@$*s zRuriY;f_}jAC)a+IdY8YVpnj~PHL}Y@wCWJV~7e$V2UL5Fj(%MA?cB`Krq(5S3#ZNjKI~GNLz@>?Ea#)8-Rf7ZR6@=jyidei*eH2L70<5JgE>_wk^q zRJU;qL|9XWS+}Rf$QB?1c?OE!cPWyjpJFDMR>6IAG*YaAkU^V{R~b~7DLItM30z3L z>7{tI0=G%C+H6-%Jp5rvu8t5#a6FxO{DdZZZd^QG^YRZSi;xkCzFHvOlpKrC8$RrU zZkn|#daS{vxfF)=CYZn?m(YO#Qgwcnk|Vw9b|CZ%8p_A zTe)k#qpP~RAxSkiNTwn#L`VC2RLWy0orP7#h3%H+>)S%~CDoE&gDdozEQs1`zS9ZA zO*f9Ma8JFk-YB-shw8X>9*nrST1i@-0n2UInfy8@pd^j9Bb+?GN1G|w1;Xy0-AfJF zEN7&-(#BB#dLsZ5R@8=OhX&;-lNN-k$kG{*MLiEA>?H$98VFkI3)?#mm5L0pb?R?5Ay;%OcvYzAQ%QO&zEU7MeWROq1gneX^tq1E*B)WumE+d4j zf{zB2mZk7}NL6q<6uPx*IINM=`ZYt{zHMa3?Q!x$AqVTc;W%F< zs3)}Mm8{95BiELkskE$bhq9w+=J;RaX=Li7mHLKCDARSI#?QFpnxd2qdIQi*KQC`C z=Wm6@g*Wc($J!>uqGjVNPC|>Wusj2NyjVA9?Hw)X)HU>Ib`k0r^VUE^HI^i5`!&*Qx)ed)2#eL&)lsXP;A8?lJl8AWdP-7Cv2tESz|0-c{T@%#6Z%V6@;fJ7kU9Ql8*Vquh0_X>^UGczuucu#VZWEh-uZ z9UgIm5C!=gTjYKbICN~0xW_rVC;%Q8uXnRg=JJwUjODRqz}sSi{6sMl z+2&nSb&5 zcslPh$603dqQVaT^}kzX z?EwCb>vdoE zb^WgGsa<2~*#)i}2G9(d3=JvGKJ0~wUo%50k=}>YsEf%#^zUZItbe^#-iy@PY32}; z)Xe0$*wNIDM?u>#f#*^*NqI{b=VQ|?4RO@bpW!<*&)Z24s9p#>Be4GUc-f+c;;%)Q z6jOd$zyFe*O@vctC`07UjDLJFQt)$SfDHhUf1u#+!>fMy$>k3+{@;KeKf_d2&BFRb%XaZSNs!8=E6D<4 zhbR<}th&X1TAf&EyaVc+>R~TH;yD1F2XprB>x|I(jyVV+R9z!#)DwrZ7urLaocwuI zedy&VuWa?+0(K}d9f^!dArQOpH`#W&z81`Jt}VLt>xm*LykmwOP`?{TAP&)MzTBD3 zm10cO*VsSrnar)xAw9}Z!3w9|d0)()orcMD(1RO%R-VUOu{+D=>VW7z@E zaRlw-Mt7(P{U%c8WZ2^!<7r>#e)R1fb4fEy0|zb}97{k8{PzX~|K0!q=7RD&1hqLR zJWrzmF5KT62>%BG|9hDKHyxG}(N5*5Ir7gNy&rXis`t2w>r&e^y@?s0dqTN;U@^M-gU*Ag{uMsowTysA0zJq zu%NM!b+=>B`gQ#>XLrm=Oxxu$U?x$yT#f3igI9#%$EKRh9{->$snQcEovE$R@r?EX z^JCw4zNyJe3r!CK=GP{yC!(Zj_hCR(<4scDu7 zim8kkK4lK8Va~rDxx#9kkhk&n(v~oLg!YT&_QEmcrKmjd?#|~a1>aAMST*Iv37v7O zEYKfF%{_f9V&8Kn$@nIK?h`lHUFZKfi|7{7Li$Tw9{&L>gXx6m2*0;RQEM*7+}?GwN#!J z=3KfTed$p4xo6FZL+YX`HdVdD-8t=Ky@cT{y!S`R^V7P)!dlIuv0eG?y4pnDkTc@0 zd0P*To;NvS^7N&r3h&^}+j!WclelYdoSksm$BAx2O||FGx|~{>>^HHz?^*HSdAAWx zi;tcyyu|XF$xRO1HXjkw0)-0Qp0hzEkDs-3-1JH}f+lsa_+ju>Pi#(@u4Dz2n01Lf z*66u4_Od6DC8_SN4MWGw>AZHmD!CqJLE%Mapd2PRVng zEFMh8@8e4nc8*|9@)~ByDJblW%hnn#xQtGA*R#rRJYLxQs#L~%tdQKfuqWVL$;yLs z`$br`*QCpzg$=F;jO+0H(Utn^K87}ZtZzeYd``VTcF+CzMosd_XO=iwv zjZG>SKeIXHa@X=iAG?us&dHwKPHe@KuPa~Y?HHC3rl3$^SBtcHadc;Uh&yreI^>sn z(}C9Yt`5(Z!AcTslD}Fg2rCe$O^FLM_sH8H{dr?^RF2BTy)?=Ec=fDL)!Sq6l^N0I zhZ(b(X#Udy`+7e0yGO~$V2fok+Rjhy*}yMuUH5%)%BQeqWc98}BMU{-2BA=dX zM5YLDJ`rE*Zj<^8&!3M;0xnomhg6K8ES%NAK8nk;zzL~!N+`mduDspYl7DdFaC;7Q?%e@P00q6t~^ridIpO8e|{8T)>#R;^V1e9d#@%j!iry`l$NsAAUf{#q`Tt z^bfz}Kiz=Txd34JPnR4>Y5(2N7}SD83h?5?f6IHq9^jq=UcbMWQugZ&?GAhh`!grd z+etS&+s2Gso3X$TE6Zik{{6R5BXvW|D zyngp%po*A(IRAdR2UB)0!~eaMwVgMaAR7H2b3*=7C?E}y8(Svyt7GOHVJc4eL#D99 zqsGcqgtz1K1PFh}-}qLpy8w9wT>SN!!x88ETk?W;`{LWNAPS9}A z^|_D+thjDRQFB88^zu{2v>ha>|7LF*$XSh#v#{YK2&# z%s>FiWjqlI4NEa}Tj$@nXbx)iSs|v!Utww)dOXY}i*jhJhe7dzOcVT<=L)53D2G>6 z-?;XtoS5d#EgH~)r|vo)rfnS}C6fWlSzM@q?4rrA-~K~Xk8o(~#3D`@B&tx4&*qX6 z7-EOcU=k1n$ZAwspgAueExo`x&L!S7Z5X%YBIaC6)&*Y~ND7+emjUG%YnRH?ngbYv zQVYua*QdCz1**Ka+=oUY<7;2A1G;QRgt9GmMUuov@VzI~P6+jpek`!jfQk^F6UJze zh(M$r$zPv&t5%XTBm7>BsrZ&-@GZyaZE;==r%P)l8stQI&V$h&m)%hZJXIUak;MAnskq zOx!J!{{Y6G|29bGBRKNH*HDEOWUuWBm)UNq#MFVeL5r{pm9718SAcX>{GcTOIDQ>g zRv(NT$Z~ZZk$qvo(iYTn=7CQ*0$z>uSK;#bMX(i46?hw&Mw0s ziKWRnMJM(u`x}?t!09`j4 z5dHd2SbUnICx4>0>_TzhrE`azHl>3csQCWqU8Hx+H@$q9weHGo&DpytmxH-(us#|t z&;Tk1l+~5Bb`(vnt`8Wl&55fmRcj7|>L~F3V0lMJ(ah75Qnl!)j^nGZS7dWS&Dgde zaqf`v+aNA9f$lfZHm4JmX{bS${Q`etD)U!)sbU|B8$!YxvNT|Db((*Kkib}qzk@Nf zZkjuBw%@@sYH$n&q&5zcV)H3~;yb^r$veLTC;wJUCg#!_F?g8UyVg@s+Di{4lpq=J zp+k%TR^*P-V*X{HR`356ySh`e0vVIk?L7KzCQ>s%KtRahNE>}PWWs_l)2~?3J5bB} zw^9PjM21tJ|1)d^1qwkv%&(XtB)x!C`Ft>^HD$DtmV$v-e_6L90RwN71B1}`tt!Fu zdGvJXmKqGN^EniN0I6*&uCE|!bP<`boyyM**3pKf2hW1Fq4Mo;YAgu`c!w7Q19a8~ zDQBRdbrkli84C62LEZKzU3xGxl#Yf40s;moIz@x{^9Cfmz^INY7#Ixk_j_;#pymD> zjL>9^a*q*zMwY>X8KD#Xy%s)*{O@`3+a6D7Ko{zSH^CgB%bhTqKhqM>OrWu{ zC{ROx#sOLnEYaY?x|>CyrBP2@DI2dv593DwjKLb_8=TU*OL&nX7WS1tVrKk}E$G!T z-N#unG0=YDLp(i+dEb9Vc^@!lJWs1`+=J%$MBSO3i&uQe`^{E+2GLTc>p^#Qp;-{G z7$2~kc>gGPWiYj&fn&XU1=>yBK0T+T3*vwijW||4jsSD4)uZS`50Ba37ef`k31-3Hgj03dgW$82d z=69^hBI*QbV#eSwog;eeqV}#dbuD*nH7H|J{!)WQ z!f-e%V-`6pTP@a`*1cfx$~@v_^(!$ef_p$;q&uc>R!9g#*aKt2@3^0izPT;9|>C|x_1-xc$n&i<-zcYWlOkg2b&Lr$SioW zUqvrGx>!pept^c>Yo;!wT$s8`i&evKVsbNL-1UyC1MKE69=h+Z@d+_4yD*y=6~YL1 zg+Ig~jDDf^JaT(sNPo43R7&q0Vv6hb@jM1sh*D#Q2qV?ZVe~@?p%)e!qL|ybeIn4e zB*nAHM~vL@3!Q72ln&{uUSX=U#=aj@9yTEElnezj%t>rrxc|R*omhmljBQ76(%c5c8Kgp z3ru#0`3XJ<>X~d^6U*6Z$3_J1f_Ftm>}w062%cKYaIWvy6MEl&t9YoXFfr?FL)^Pl z&AzA1SJm~^Do?=smI6Y0Zz)78DI}gNC@Ex*^e>dB93wh@MCYWvq4MQsndh*`KvX# zb!&4;UvlyauTDOzk=!+q>wqOp^63|IGU(>lJFVWC-;VQ6?th-@zFg{5U2bC*N#eJ+ z+j5^sI=+%*He#T#$m_~cuF6kv0|^X(3n>i8S9<6+O8NHO#b1_A?G;+p|2Ui6T)o%D zuBi#J(OVfRfhEhDiS~01Pud+iVK|HIG@#z$w!(!EXl*}b_5EALcv+I{yZ3~tp_T-$ zRd(8!${*;D^+}*|CTV06)X@!!f8B5$dMcvFh=OGa5GsBIZg=Lc6(Y{Nal7uGv5~rG zCYRCW{y4--9k)@t$_(#wCzmwqUul`w#I?-x1cFaUz@(lFmU$rIrs~U*h!mwj6}t1Y z@ev%FZFh7Aj6U-UI91?V%R%LppYORU2C=qVS2yOC!@Ke$l7St>2w;M3`P zI%`8#=5jG#6_tr1G4EV#rR_WIFyEz0=1Gd+j}17Tr;duM^{}#)wKY%B=tJVvgyEM@ z#>y}$J~(T&gQSSJzZ_6Uc=WD@C7mXcD#K6t%; z<;Xd>h>b)7{2H*O71=h?D6Kj7k@l^W3)JMr@?SG(-t$tFPy1mMgXo9D5))Rc*vWo_ zClhR)pX(jTZ-+a8nm|ouA#UrqA)`XiR`B3d(wkdXG6t7S8K*qq;;oimYn6Sxl7|+U zentYtlEp_j$f(0=wEUXS?>x?ZVTBbQTsMi>kPoh_S3UQ#fNPwzSDPprCq*a}>T?)5L9N@Wz z(=7)SoU2gvin9f@5ZifOXDj;1_~mRBdn{XH_tl4MLqS-qDPw=1dyAb}t8d_>YtMcM zKD*H3@z)h{k#}uMT0JSfWQA@^1_w#D!0lK`%syVR^_p_hO*ITAa};**0AjJb)$GbN zTDR+rljD6$=7&F9KOSu}3zWgNe5g#6mUw&eVN*}Wbaurd$@i~fSz`H>@Dq_*uDLoJ z4Nn8LAl-_Z(msZH{N47{W;}kvT-t3^AEzXZu`Zq3%C{OTxV)J4u7sTY(Uo(hFvxf< z^3=T_g&`5sV^YFn^N36PWnucqaK=2*^XXG^3kRl^+wLeNrJ-~D^IJdM<9fIyMbmf2 zzUh5npp=MuWt6pK_P`mrT&uT3v~M&0z~T)&VsMW(Bk(E2RA#st^x@oxaY#*OE^xK0 z0y#9kOCmO&pyvxlrn-xqQ$}U4o1Ylz7c2{2ibZxHODO|_@<578q2a8C6rLLkyETgR z>ulBho~bLLte?+C<#L7>InuqmD~-Aa6k}32zH!!(_NBXdSO4MmY(z@Fb?>fE3FOZ% z&$gsy)9$~oxBe{8+XQ}IOa6;2E~?3X!#b*OIBnb_^e;%1qd_%%aZYi14DHDBEAN!o znh{4j(^DtZmNE<6G#^OM4k#J3FV3G@IZ)pG+SPn6Er-*el55KrsMhGl=g&WV>D=3( z&`Cwi8XW%SAo70r9zMc>(1!B~GJ5u$Kn;P_@q~-q+zZ{7LulcE*b3eoop|WB97j*B zSn9ko+LUe@*v))S4ASOg4JVL+Ahg%pQ-JwpezWj9sEe;f$|^g(#GEH zRxXjJtF|>>ox!E9@!t1cdu`-M)#&v<<_nQWgHl=wkuOJ-lkmWG1JlRhu5DMmYZoc% zoO`mdf^OQVebndUxn|# z94@;xj8gPU9W}l8Nl8Zqn<<&zyOMkMxG`;jbb)Vk6~)Gtr!=@9xpt*fx=|)nluCb$zi zlCOFtR!lnn64-Vu%`i`*q8^^JxOHyi(HX|tM~v*Lj0-dY1Fo)tGcT=5i*qe`zH3?G zntTth6WE5hn@x(dNC#IkERqBvbW{7h)lix4Qy?NG^fYdlE&6+!>&DHLQ2Xdhs+hJ< zy7P;=Gm z@pUPe6-$$@fVC{nzAq*^Rc}wODwYfsQHE%)0d{-?(ui@A>Nhuk^dJJ_`FF_{gD<__ z!FJlO$d(6tj>HBGkfdjJHGmI;eRz2^CA45Q;efc*x|IM{Aw=C5mh2i=J3Rd~$lu~M zV*;=pU~r3&eXTSy)#Ym3arO(B>7!)dw2)R`1E{zXLb0ApoLH)UF>BGmBg@_tG@D|5 zb!l$6f8Z)(YTxii@5}8L-%GjV`(0P;$;sROSB;Hn0!C6OcoVYjv$12t3Z1UUN~M6< z1X5k>6Zo*|>`LJWx$Z2>#@4*^N3CSHa}yIvl6})Dd!m_}J`B`bw8o4nmE5TNs3;Mz zU3p7JZ24!@M3tQ}8GTCClf2jI+OVwGuG3VMT%_Ela-1KeY{LA4;abC=FI%i_7yC+z zUp-Pj=LRPq|;ZIOT+G1al@i4ev#`~$GZ5*<1KEa(LFNAp6 zv-8P^(daQ4u~PIyyb{&@xT@g-+|_k;3&B1Y>S*p`2*a&p7&L&yhOsaBr50^Y?vmeX zdPgLm7$5B6UV=U;y*5v&yXe}B=ux8o!(da@$Z4=_F&yz?Q(JtM7Xc3&&sb#3L!*Qx zaSAS%_9ToVQNj{98#;=;=Q65+jmzi)eq;CQsECq>AeQikzid>N$GI2U=OYR}WI}|8 zkOX^bsh;`_3s!o2ciRz}Y4#*>LxE5W`iJt~H`WeFPakvZ}k9>Y99S^8y!U;?T zJ(7is5WY8OOiTfc+X?eNoi^LEswf-{gO8uYeZKERHyvgU?U$B5=da6vgJZF{ufuSs z<#!yiMt=BvPY8`)qDG@fVfScrq7JQMZsZR_q)Nw29FlmOYf-aAPaK0cG8lP&*Uo{# z52D)EQ!Z{@LDHkzEaZLpFM97H2_SL!eJmNJaC=5h3}M0kQcqK^j>oCbC?*V{BVLL# z^wHWENp4|rTq!bb*^v;kNEeGnVFhrha-?vI&%u?lV8Q(^o7wNrxK4o zED9c7kAa%02~3Szl+7!adsTDDVsTaGV*yh%Dc)DNRu2F!dP?Wu{5c~%+xdeU*aAFY zHJFfTN3dnt&y2z1TJy7P*l6Dg;~oL?ce#BxOLTdzxY))Rv@mvy)e)AQilAu~EDmp( zIqZ#cdgr&79qLx7AQ@#{A5r3ySE2=YDd2(s(2Uh|zH4#t9Mn^XwAZJMlbD;?RA_+1 z!&IK^I{cHOcBE@{&ol7Zw&khf)bSBFVOJeqHE)PYoav))ohcKa>?6^Qd%18K@cw?x z@R4^PmPq1mJi+(#{b2A7|M-jNc?Wc+=ejUMsSYbQ!%YyXRQxm%!@dV2E%S9Pw6ZRMrKDmx9Alu`oCa zgFv!y5F~lmLxWeV*c)227vKoIXYj5zdYF6~42}gp5e$rLIv+*@<5p=wcww^&Vc^ek Mt&^HWjf-Lb17@~21poj5 literal 0 HcmV?d00001 diff --git a/src/routes.php b/src/routes.php new file mode 100644 index 0000000..7350339 --- /dev/null +++ b/src/routes.php @@ -0,0 +1,20 @@ +name('home'); + +Route::get('admin/routes', 'Checkitsedo\Esrpaymentslip\Controllers\HomeController@admin')->middleware('admin'); + +Route::get('/pdf/{id}', 'Checkitsedo\Esrpaymentslip\Controllers\EsrpaymentslipController@download')->name('esrpaymentslips.download'); + +Route::resource('esrpaymentslips','Checkitsedo\Esrpaymentslip\Controllers\EsrpaymentslipController'); diff --git a/src/views/esrpaymentslips/create.blade.php b/src/views/esrpaymentslips/create.blade.php new file mode 100644 index 0000000..eb75fda --- /dev/null +++ b/src/views/esrpaymentslips/create.blade.php @@ -0,0 +1,168 @@ +@extends('esrpaymentslips::layouts.app') + +@section('title', 'Home ESR Tools - Dominik Senti') + +@section('content') +
+
+
+

Add New ESR Payment Slip

+
+
+ Back +
+
+
+ +
+ @csrf + +
+
+

Einzahlung von/Versé par:

+ + + +
+ + + +
+ + + +
+ + +
+ +
+

Einzahlung für/Versement pour:

+ + + +
+ + + +
+ + + +
+ + +
+ +
+
+ +
+

Zungunsten von/En faveur de:

+ + + +
+ + + +
+ + +
+ +
+

Zahlungsinformationen/données de paiement:

+ + + +
+ + + +
+ + +
+ +
+
+ +
+ +
+
+ +
+ +@endsection \ No newline at end of file diff --git a/src/views/esrpaymentslips/edit.blade.php b/src/views/esrpaymentslips/edit.blade.php new file mode 100644 index 0000000..e9632c5 --- /dev/null +++ b/src/views/esrpaymentslips/edit.blade.php @@ -0,0 +1,169 @@ +@extends('esrpaymentslips::layouts.app') + +@section('title', 'Home ESR Tools - Dominik Senti') + +@section('content') +
+
+
+

Edit ESR Payment Slip

+
+
+ Back +
+
+
+ +
+ @csrf + @method('PATCH') + +
+
+

Einzahlung von/Versé par:

+ + + +
+ + + +
+ + + +
+ + +
+ +
+

Einzahlung für/Versement pour:

+ + + +
+ + + +
+ + + +
+ + +
+ +
+
+ +
+

Zungunsten von/En faveur de:

+ + + +
+ + + +
+ + +
+ +
+

Zahlungsinformationen/données de paiement:

+ + + +
+ + + +
+ + +
+ +
+
+ +
+ +
+
+ +
+ +@endsection \ No newline at end of file diff --git a/src/views/esrpaymentslips/index.blade.php b/src/views/esrpaymentslips/index.blade.php new file mode 100644 index 0000000..22607c1 --- /dev/null +++ b/src/views/esrpaymentslips/index.blade.php @@ -0,0 +1,144 @@ +@extends('esrpaymentslips::layouts.app') + +@section('title', 'Home ESR Tools - Dominik Senti') + +@section('content') + +
+
+
+

ESR Payment Slips Tool

+
+ +
+
+ + @if ($message = Session::get('success')) +
+

{{ $message }}

+
+ @endif + + @if (count($esrpaymentslips) > 0) + + + + + + + + + + + + + + @foreach ($esrpaymentslips as $esrpaymentslip) + + + + + + + + + + + + + @endforeach + +
#Payer Line 1Invoice NumberReference NumberAmount
+ {{ $esrpaymentslip->id }} + + {{ $esrpaymentslip->payerLine1 }} + {{ $esrpaymentslip->invoiceNumber }}{{ $esrpaymentslip->referenceNumber }}{{ $esrpaymentslip->amount }} +
+
+ + + + @csrf + @method('DELETE') + +
+
+
+
+
+
+
Einzahlung von:
+
+
+ {{ $esrpaymentslip->payerLine1 }} +
+
+ {{ $esrpaymentslip->payerLine2 }}
+
+
+ {{ $esrpaymentslip->payerLine3 }} +
+
+ {{ $esrpaymentslip->payerLine4 }} +
+
+
+
+
Einzahlung für:
+
+
+ {{ $esrpaymentslip->bankName }} +
+
+ {{ $esrpaymentslip->bankCity }}
+
+
+ {{ $esrpaymentslip->bankingAccount }} +
+
+ {{ $esrpaymentslip->bankingCustomerIdentification }} +
+
+
+
+
Zugunsten von:
+
+
+ {{ $esrpaymentslip->recipientName }} +
+
+ {{ $esrpaymentslip->recipientAddress }}
+
+
+ {{ $esrpaymentslip->recipientCity }} +
+
+
+
+
Zahlungsinformationen:
+
+
+ {{ $esrpaymentslip->amount }} +
+
+ {{ $esrpaymentslip->invoiceNumber }}
+
+
+ {{ $esrpaymentslip->referenceNumber }} +
+
+
+
+
+

Created: {{ $esrpaymentslip->created_at->diffForHumans() }}

+
+
+ @else +

No ESR Payment Slips found

+ @endif + + {!! $esrpaymentslips->links() !!} + +@endsection diff --git a/src/views/esrpaymentslips/layout.blade.php b/src/views/esrpaymentslips/layout.blade.php new file mode 100644 index 0000000..79e443d --- /dev/null +++ b/src/views/esrpaymentslips/layout.blade.php @@ -0,0 +1,332 @@ + + + + @yield('title') + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+ + + +
+ @yield('content') +
+ + + + + + + + + + \ No newline at end of file diff --git a/src/views/esrpaymentslips/show.blade.php b/src/views/esrpaymentslips/show.blade.php new file mode 100644 index 0000000..47ef1f9 --- /dev/null +++ b/src/views/esrpaymentslips/show.blade.php @@ -0,0 +1,104 @@ +@extends('esrpaymentslips::layouts.app') + +@section('title', 'Home ESR Tools - Dominik Senti') + +@section('content') +
+
+
+

Show ESR Payment Slip

+
+
+ Back +
+
+
+ +
+
+
+ Bank Name: + {{ $esrpaymentslip->bankName }} +
+
+
+
+ Bank City: + {{ $esrpaymentslip->bankCity }} +
+
+
+
+ Banking Account: + {{ $esrpaymentslip->bankingAccount }} +
+
+
+
+ Banking CID: + {{ $esrpaymentslip->bankingCustomerIdentification }} +
+
+
+
+ Recipient Name: + {{ $esrpaymentslip->recipientName }} +
+
+
+
+ Recipient Address: + {{ $esrpaymentslip->recipientAddress }} +
+
+
+
+ Recipient City: + {{ $esrpaymentslip->recipientCity }} +
+
+
+
+ Payer Line 1: + {{ $esrpaymentslip->payerLine1 }} +
+
+
+
+ Payer Line 2: + {{ $esrpaymentslip->payerLine2 }} +
+
+
+
+ Payer Line 3: + {{ $esrpaymentslip->payerLine3 }} +
+
+
+
+ Payer Line 4: + {{ $esrpaymentslip->payerLine4 }} +
+
+
+
+ Amount: + {{ $esrpaymentslip->amount }} +
+
+
+
+ Invoice Number: + {{ $esrpaymentslip->invoiceNumber }} +
+
+
+
+ Reference Number: + {{ $esrpaymentslip->referenceNumber }} +
+
+
+ +@endsection \ No newline at end of file diff --git a/src/views/home.blade.php b/src/views/home.blade.php new file mode 100644 index 0000000..26fa1a4 --- /dev/null +++ b/src/views/home.blade.php @@ -0,0 +1,25 @@ +@extends('esrpaymentslips::layouts.app') + +@section('content') +
+
+
+
+
Dashboard
+ +
+ @if (session('status')) + + @endif + + Admin + ESR Payment Slips + +
+
+
+
+
+@endsection diff --git a/src/views/layouts/app.blade.php b/src/views/layouts/app.blade.php new file mode 100644 index 0000000..c2598ba --- /dev/null +++ b/src/views/layouts/app.blade.php @@ -0,0 +1,68 @@ + + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + + + + + + + + + + + +
+ + +
+ @yield('content') +
+
+ +