Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
DefaultPdf
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 3
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 Header
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
72
 Footer
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   Modules\Media
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15/**
16 * Default PDF class.
17 *
18 * The TCPDF class must be included previously in the parent code.
19 *
20 * @package Modules\Media
21 * @license OMS License 2.0
22 * @link    https://jingga.app
23 * @since   1.0.0
24 *
25 * @link ../../../../../../Resources/tcpdf/TCPDF.php
26 */
27class DefaultPdf extends TCPDF
28{
29    /**
30     * Font
31     *
32     * @var string
33     * @since 1.0.0
34     */
35    public string $fontName = '';
36
37    /**
38     * Font size
39     *
40     * @var int
41     * @since 1.0.0
42     */
43    public int $fontSize = 8;
44
45    /**
46     * Side margins
47     *
48     * @var int
49     * @since 1.0.0
50     */
51    public int $sideMargin = 15;
52
53    /**
54     * Template language
55     *
56     * @var string
57     * @since 1.0.0
58     */
59    public string $language = 'en';
60
61    /**
62     * Language components
63     *
64     * @var array<string, array<string, string>>
65     * @since 1.0.0
66     */
67    public array $lang = [
68        'en' => [
69            'Page'        => 'Page',
70            'CEO'         => 'CEO',
71            'TaxOffice'   => 'Tax office',
72            'TaxNumber'   => 'Tax number',
73            'Swift'       => 'BIC',
74            'BankAccount' => 'IBAN',
75        ],
76        'de' => [
77            'Page'        => 'Seite',
78            'CEO'         => 'Geschäftsführer',
79            'TaxOffice'   => 'Finanzamt',
80            'TaxNumber'   => 'Steuernummer',
81            'Swift'       => 'BIC',
82            'BankAccount' => 'IBAN',
83        ],
84    ];
85
86    /**
87     * Bill attributes
88     *
89     * @var array<string, string>
90     * @since 1.0.0
91     */
92    public array $attributes = [
93        'logo'         => __DIR__ . '/../Web/Backend/img/logo.png',
94        'title_name'   => 'Jingga',
95        'slogan'       => 'Business solutions made simple.',
96        'legal_name'   => '',
97        'address'      => '',
98        'city'         => '',
99        'country'      => '',
100        'ceo'          => '',
101        'tax_office'   => '',
102        'tax_number'   => '',
103        'bank_name'    => '',
104        'swift'        => '',
105        'bank_account' => '',
106        'website'      => '',
107        'email'        => '',
108        'phone'        => '',
109    ];
110
111    /**
112     * Constructor.
113     *
114     * @since 1.0.0
115     */
116    public function __construct()
117    {
118        parent::__construct('P', 'mm', 'A4', true, 'UTF-8', false);
119
120        // set default header data
121        $this->setHeaderData('', 15, $this->attributes['title_name'], $this->attributes['slogan']);
122
123        // set header and footer fonts
124        $this->setHeaderFont([PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN]);
125        $this->setFooterFont([PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA]);
126
127        // set default monospaced font
128        $this->setDefaultMonospacedFont(PDF_FONT_MONOSPACED);
129
130        // set margins
131        $this->setMargins(15, 30, 15);
132
133        // set auto page breaks
134        $this->setAutoPageBreak(true, 25);
135
136        // set image scale factor
137        $this->setImageScale(PDF_IMAGE_SCALE_RATIO);
138    }
139
140    /**
141     * Create header
142     *
143     * @return void
144     *
145     * @since 1.0.0
146     */
147    public function Header() : void
148    {
149        if ($this->header_xobjid === false) {
150            $this->header_xobjid = $this->startTemplate($this->w, 0);
151
152            // Set Logo
153            if (!empty($this->header_logo)) {
154                $this->Image(
155                    $this->header_logo,
156                    15, 15,
157                    $this->header_logo_width, 0,
158                    'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false
159                );
160            }
161
162            // Set Title
163            $this->setFont('helvetica', 'B', 20);
164            $this->setX(15 + 15 + 3);
165            $this->Cell(0, 14, $this->header_title, 0, 0, 'L', false, '', 0, false, 'T', 'M');
166
167            $this->setFont('helvetica', '', 10);
168            $this->setX(15 + 15 + 3);
169            $this->Cell(0, 26, $this->header_string, 0, 0, 'L', false, '', 0, false, 'T', 'M');
170
171            $this->endTemplate();
172        }
173
174        $x  = 0;
175        $dx = 0;
176
177        if (!$this->header_xobj_autoreset && $this->booklet && (($this->page % 2) == 0)) {
178            // adjust margins for booklet mode
179            $dx = ($this->original_lMargin - $this->original_rMargin);
180        }
181
182        $x = $this->rtl ? $this->w + $dx : 0 + $dx;
183
184        $this->printTemplate($this->header_xobjid, $x, 0, 0, 0, '', '', false);
185        if ($this->header_xobj_autoreset) {
186            // reset header xobject template at each page
187            $this->header_xobjid = false;
188        }
189    }
190
191    /**
192     * Create footer
193     *
194     * @return void
195     *
196     * @since 1.0.0
197     */
198    public function Footer() : void
199    {
200        $this->setY(-25);
201
202        $this->setFont('helvetica', 'I', 7);
203        $this->Cell($this->getPageWidth() - 22, 0, $this->lang[$this->language]['Page'] . ' '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, 0, 'R', false, '', 0, false, 'T', 'M');
204        $this->Ln();
205        $this->Ln();
206
207        $this->SetFillColor(245, 245, 245);
208        $this->setX(0);
209        $this->Cell($this->getPageWidth(), 25, '', 0, 0, 'L', true, '', 0, false, 'T', 'T');
210
211        $this->setFont('helvetica', '', 7);
212        $this->setXY(15 + 10, -15, true);
213        $this->MultiCell(
214            30, 0,
215            $this->attributes['legal_name'] . "\n"
216            . $this->attributes['address'] . "\n"
217            . $this->attributes['city'],
218            0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
219        );
220
221        $this->setXY(25 + 15 + 20, -15, true);
222        $this->MultiCell(
223            40, 0,
224            $this->lang[$this->language]['CEO']. ': ' . $this->attributes['ceo'] . "\n"
225            . $this->lang[$this->language]['TaxOffice']. ': ' . $this->attributes['tax_office'] . "\n"
226            . $this->lang[$this->language]['TaxNumber']. ': ' . $this->attributes['tax_number'],
227            0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
228        );
229
230        $this->setXY(25 + 45 + 15 + 30, -15, true);
231        $this->MultiCell(
232            35, 0,
233            $this->attributes['bank_name'] . "\n"
234            . $this->lang[$this->language]['Swift']. ': ' . $this->attributes['swift'] . "\n"
235            . $this->lang[$this->language]['BankAccount']. ': ' . $this->attributes['bank_account'],
236            0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
237        );
238
239        $this->setXY(25 + 45 + 35 + 15 + 40, -15, true);
240        $this->MultiCell(
241            35, 0,
242            $this->attributes['website'] . "\n"
243            . $this->attributes['email'] . "\n"
244            . $this->attributes['phone'],
245            0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
246        );
247    }
248}