]> git.agnieray.net Git - galette.git/blob - tests/Galette/Entity/tests/units/PdfModel.php
9221379cd1f79bb3750beb22395f0781fdcbe735
[galette.git] / tests / Galette / Entity / tests / units / PdfModel.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * PDF model tests
7 *
8 * PHP version 5
9 *
10 * Copyright © 2020-2023 The Galette Team
11 *
12 * This file is part of Galette (http://galette.tuxfamily.org).
13 *
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
26 *
27 * @category Entity
28 * @package GaletteTests
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020-2023 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since 2020-11-21
35 */
36
37 namespace Galette\Entity\test\units;
38
39 use Galette\Entity\Adherent;
40 use Galette\DynamicFields\DynamicField;
41 use Galette\GaletteTestCase;
42
43 /**
44 * PDF model tests
45 *
46 * @category Entity
47 * @name PdfModel
48 * @package GaletteTests
49 * @author Johan Cwiklinski <johan@x-tnd.be>
50 * @copyright 2020-2023 The Galette Team
51 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
52 * @link http://galette.tuxfamily.org
53 * @since 2020-11-21
54 */
55 class PdfModel extends GaletteTestCase
56 {
57 private array $remove = [];
58 protected int $seed = 95842354;
59
60 /**
61 * Set up tests
62 *
63 * @return void
64 */
65 public function setUp(): void
66 {
67 parent::setUp();
68
69 $models = new \Galette\Repository\PdfModels($this->zdb, $this->preferences, $this->login);
70 $res = $models->installInit(false);
71 $this->assertTrue($res);
72
73 $this->adh = new \Galette\Entity\Adherent($this->zdb);
74 $this->adh->setDependencies(
75 $this->preferences,
76 $this->members_fields,
77 $this->history
78 );
79 $this->contrib = new \Galette\Entity\Contribution($this->zdb, $this->login);
80 }
81
82 /**
83 * Tear down tests
84 *
85 * @return void
86 */
87 public function tearDown(): void
88 {
89 parent::tearDown();
90
91 $delete = $this->zdb->delete(\Galette\Entity\Contribution::TABLE);
92 $delete->where(['info_cotis' => 'FAKER' . $this->seed]);
93 $this->zdb->execute($delete);
94 $delete = $this->zdb->delete(\Galette\Entity\Adherent::TABLE);
95 $this->zdb->execute($delete);
96 $delete = $this->zdb->delete(\Galette\Entity\DynamicFieldsHandle::TABLE);
97 $this->zdb->execute($delete);
98 $delete = $this->zdb->delete(DynamicField::TABLE);
99 $this->zdb->execute($delete);
100 //cleanup dynamic translations
101 $delete = $this->zdb->delete(\Galette\Core\L10n::TABLE);
102 $delete->where([
103 'text_orig' => [
104 'Dynamic choice field',
105 'Dynamic date field',
106 'Dynamic text field'
107 ]
108 ]);
109 $this->zdb->execute($delete);
110 }
111
112 /**
113 * Test expected patterns
114 *
115 * @return void
116 */
117 public function testExpectedPatterns()
118 {
119 $model = new class ($this->zdb, $this->preferences, 1) extends \Galette\Entity\PdfModel {
120 };
121
122 $main_expected = [
123 'asso_name' => '/{ASSO_NAME}/',
124 'asso_slogan' => '/{ASSO_SLOGAN}/',
125 'asso_address' => '/{ASSO_ADDRESS}/',
126 'asso_address_multi' => '/{ASSO_ADDRESS_MULTI}/',
127 'asso_website' => '/{ASSO_WEBSITE}/',
128 'asso_logo' => '/{ASSO_LOGO}/',
129 'date_now' => '/{DATE_NOW}/',
130 'login_uri' => '/{LOGIN_URI}/'
131 ];
132 $this->assertSame($main_expected, $model->getPatterns());
133
134 $model = new \Galette\Entity\PdfMain($this->zdb, $this->preferences);
135 $this->assertSame($main_expected, $model->getPatterns());
136
137 $expected = $main_expected + [
138 'adh_title' => '/{TITLE_ADH}/',
139 'adh_id' => '/{ID_ADH}/',
140 'adh_num' => '/{NUM_ADH}/',
141 'adh_name' => '/{NAME_ADH}/',
142 'adh_last_name' => '/{LAST_NAME_ADH}/',
143 'adh_first_name' => '/{FIRST_NAME_ADH}/',
144 'adh_nickname' => '/{NICKNAME_ADH}/',
145 'adh_gender' => '/{GENDER_ADH}/',
146 'adh_birth_date' => '/{ADH_BIRTH_DATE}/',
147 'adh_birth_place' => '/{ADH_BIRTH_PLACE}/',
148 'adh_profession' => '/{PROFESSION_ADH}/',
149 'adh_company' => '/{COMPANY_ADH}/',
150 'adh_address' => '/{ADDRESS_ADH}/',
151 'adh_address_multi' => '/{ADDRESS_ADH_MULTI}/',
152 'adh_zip' => '/{ZIP_ADH}/',
153 'adh_town' => '/{TOWN_ADH}/',
154 'adh_country' => '/{COUNTRY_ADH}/',
155 'adh_phone' => '/{PHONE_ADH}/',
156 'adh_mobile' => '/{MOBILE_ADH}/',
157 'adh_email' => '/{EMAIL_ADH}/',
158 'adh_login' => '/{LOGIN_ADH}/',
159 'adh_main_group' => '/{GROUP_ADH}/',
160 'adh_groups' => '/{GROUPS_ADH}/',
161 'adh_dues' => '/{ADH_DUES}/',
162 'days_remaining' => '/{DAYS_REMAINING}/',
163 'days_expired' => '/{DAYS_EXPIRED}/',
164 '_adh_company' => '/{COMPANY_NAME_ADH}/',
165 '_adh_last_name' => '/{LASTNAME_ADH}/',
166 '_adh_first_name' => '/{FIRSTNAME_ADH}/',
167 '_adh_login' => '/{LOGIN}/',
168 '_adh_email' => '/{MAIL_ADH}/',
169 ];
170 $model = new \Galette\Entity\PdfAdhesionFormModel($this->zdb, $this->preferences);
171 $this->assertSame($expected, $model->getPatterns());
172
173 $expected += [
174 'contrib_label' => '/{CONTRIB_LABEL}/',
175 'contrib_amount' => '/{CONTRIB_AMOUNT}/',
176 'contrib_amount_letters' => '/{CONTRIB_AMOUNT_LETTERS}/',
177 'contrib_date' => '/{CONTRIB_DATE}/',
178 'contrib_year' => '/{CONTRIB_YEAR}/',
179 'contrib_comment' => '/{CONTRIB_COMMENT}/',
180 'contrib_bdate' => '/{CONTRIB_BEGIN_DATE}/',
181 'contrib_edate' => '/{CONTRIB_END_DATE}/',
182 'contrib_id' => '/{CONTRIB_ID}/',
183 'contrib_payment' => '/{CONTRIB_PAYMENT_TYPE}/',
184 'contrib_info' => '/{CONTRIB_INFO}/',
185 '_contrib_label' => '/{CONTRIBUTION_LABEL}/',
186 '_contrib_amount' => '/{CONTRIBUTION_AMOUNT}/',
187 '_contrib_amount_letters' => '/{CONTRIBUTION_AMOUNT_LETTERS}/',
188 '_contrib_date' => '/{CONTRIBUTION_DATE}/',
189 '_contrib_year' => '/{CONTRIBUTION_YEAR}/',
190 '_contrib_comment' => '/{CONTRIBUTION_COMMENT}/',
191 '_contrib_bdate' => '/{CONTRIBUTION_BEGIN_DATE}/',
192 '_contrib_edate' => '/{CONTRIBUTION_END_DATE}/',
193 '_contrib_id' => '/{CONTRIBUTION_ID}/',
194 '_contrib_payment' => '/{CONTRIBUTION_PAYMENT_TYPE}/',
195 '_contrib_info' => '/{CONTRIBUTION_INFO}/',
196 '__contrib_label' => '/{CONTRIB_TYPE}/',
197 'deadline' => '/{DEADLINE}/'
198 ];
199 $model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
200 $this->assertSame($expected, $model->getPatterns());
201
202 $model = new \Galette\Entity\PdfReceipt($this->zdb, $this->preferences);
203 $this->assertSame($expected, $model->getPatterns());
204 }
205
206 /**
207 * Types provider
208 *
209 * @return array
210 */
211 public static function typesProvider(): array
212 {
213 return [
214 [
215 'type' => \Galette\Entity\PdfModel::MAIN_MODEL,
216 'expected' => 'Galette\Entity\PdfMain'
217 ], [
218 'type' => \Galette\Entity\PdfModel::INVOICE_MODEL,
219 'expected' => 'Galette\Entity\PdfInvoice'
220 ], [
221 'type' => \Galette\Entity\PdfModel::RECEIPT_MODEL,
222 'expected' => 'Galette\Entity\PdfReceipt'
223 ], [
224 'type' => \Galette\Entity\PdfModel::ADHESION_FORM_MODEL,
225 'expected' => 'Galette\Entity\PdfAdhesionFormModel'
226 ], [
227 'type' => 0,
228 'expected' => 'Galette\Entity\PdfMain'
229 ]
230 ];
231 }
232
233 /**
234 * Tets getTypeClass
235 * @dataProvider typesProvider
236 *
237 * @param integer $type Requested type
238 * @param string $expected Expected class name
239 *
240 * @return void
241 */
242 public function testGetypeClass($type, $expected)
243 {
244 $this->assertSame($expected, \Galette\Entity\PdfModel::getTypeClass($type));
245 }
246
247 /**
248 * Test model replacements
249 *
250 * @return void
251 */
252 public function testReplacements()
253 {
254 //create dynamic fields
255 $field_data = [
256 'form_name' => 'adh',
257 'field_name' => 'Dynamic text field',
258 'field_perm' => DynamicField::PERM_USER_WRITE,
259 'field_type' => DynamicField::TEXT,
260 'field_required' => 1,
261 'field_repeat' => 1
262 ];
263
264 $adf = DynamicField::getFieldType($this->zdb, $field_data['field_type']);
265
266 $stored = $adf->store($field_data);
267 $error_detected = $adf->getErrors();
268 $warning_detected = $adf->getWarnings();
269 $this->assertTrue(
270 $stored,
271 implode(
272 ' ',
273 $adf->getErrors() + $adf->getWarnings()
274 )
275 );
276 $this->assertEmpty($error_detected, implode(' ', $adf->getErrors()));
277 $this->assertEmpty($warning_detected, implode(' ', $adf->getWarnings()));
278
279 $field_data = [
280 'form_name' => 'contrib',
281 'field_form' => 'contrib',
282 'field_name' => 'Dynamic date field',
283 'field_perm' => DynamicField::PERM_USER_WRITE,
284 'field_type' => DynamicField::DATE,
285 'field_required' => 1,
286 'field_repeat' => 1
287 ];
288
289 $cdf = DynamicField::getFieldType($this->zdb, $field_data['field_type']);
290
291 $stored = $cdf->store($field_data);
292 $error_detected = $cdf->getErrors();
293 $warning_detected = $cdf->getWarnings();
294 $this->assertTrue(
295 $stored,
296 implode(
297 ' ',
298 $cdf->getErrors() + $cdf->getWarnings()
299 )
300 );
301 $this->assertEmpty($error_detected, implode(' ', $cdf->getErrors()));
302 $this->assertEmpty($warning_detected, implode(' ', $cdf->getWarnings()));
303
304 //prepare model
305 $pk = \Galette\Entity\PdfModel::PK;
306 $rs = new \ArrayObject([
307 $pk => 42,
308 'model_name' => 'Test model',
309 'model_title' => 'A simple tmodel for tests',
310 'model_subtitle' => 'The subtitle',
311 'model_header' => null,
312 'model_footer' => null,
313 'model_body' => 'name: {NAME_ADH} login: {LOGIN_ADH} birthdate: {ADH_BIRTH_DATE} dynlabel: {LABEL_DYNFIELD_' .
314 $adf->getId() . '_ADH} dynvalue: {INPUT_DYNFIELD_' . $adf->getId() . '_ADH} ' .
315 '- enddate: {CONTRIB_END_DATE} amount: {CONTRIB_AMOUNT} ({CONTRIB_AMOUNT_LETTERS}) dynlabel: ' .
316 '{LABEL_DYNFIELD_' . $cdf->getId() . '_CONTRIB} dynvalue: {INPUT_DYNFIELD_' . $cdf->getId() . '_CONTRIB}',
317 'model_styles' => null,
318 'model_parent' => \Galette\Entity\PdfModel::MAIN_MODEL
319 ], \ArrayObject::ARRAY_AS_PROPS);
320 $model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences, $rs);
321
322 $data = $this->dataAdherentOne() + [
323 'info_field_' . $adf->getId() . '_1' => 'My value (:'
324 ];
325 $this->createMember($data);
326 $model->setMember($this->adh);
327
328 $this->createPdfContribution($cdf);
329 $model->setContribution($this->contrib);
330
331 $this->assertStringContainsString(
332 '<td id="pdf_assoname"><strong id="asso_name">Galette</strong><br/></td>',
333 $model->hheader
334 );
335
336 $this->assertMatchesRegularExpression(
337 '/<td id="pdf_logo"><img src="@.+" width="129" height="60" alt="" \/><\/td>/',
338 $model->hheader
339 );
340
341 $this->assertSame(
342 '<div id="pdf_footer">
343 Association Galette - Galette
344 Palais des Papes
345 Au milieu
346 84000 Avignon - France<br/>
347
348 </div>',
349 $model->hfooter
350 );
351
352 $this->assertSame(
353 'name: DURAND René login: arthur.hamon' . $this->seed . ' birthdate: ' . $data['ddn_adh'] . ' dynlabel: Dynamic text field dynvalue: ' .
354 'My value (: ' .
355 '- enddate: ' . $this->contrib->end_date . ' amount: 92 (ninety-two) dynlabel: Dynamic date field ' .
356 'dynvalue: 2020-12-03',
357 $model->hbody
358 );
359
360 $legend = $model->getLegend();
361 $this->assertCount(3, $legend);
362 $this->assertArrayHasKey('main', $legend);
363 $this->assertArrayHasKey('member', $legend);
364 $this->assertArrayHasKey('contribution', $legend);
365
366 $this->assertCount(8, $legend['main']['patterns']);
367 $this->assertCount(28, $legend['member']['patterns']);
368 $this->assertTrue(isset($legend['member']['patterns']['label_dynfield_' . $adf->getId() . '_adh']));
369 $this->assertCount(14, $legend['contribution']['patterns']);
370 $this->assertTrue(isset($legend['contribution']['patterns']['label_dynfield_' . $cdf->getId() . '_contrib']));
371 }
372
373 /**
374 * Create test contribution in database
375 *
376 * @param DynamicField $cdf Contribution dynamic field
377 *
378 * @return void
379 */
380 protected function createPdfContribution($cdf)
381 {
382 $bdate = new \DateTime(); // 2020-11-07
383 $bdate->sub(new \DateInterval('P5M')); // 2020-06-07
384 $bdate->add(new \DateInterval('P3D')); // 2020-06-10
385
386 $edate = clone $bdate;
387 $edate->add(new \DateInterval('P1Y'));
388
389 $dyndate = new \DateTime('2020-12-03 22:56:53');
390
391 $data = [
392 'id_adh' => $this->adh->id,
393 'id_type_cotis' => 1,
394 'montant_cotis' => 92,
395 'type_paiement_cotis' => 3,
396 'info_cotis' => 'FAKER' . $this->seed,
397 'date_enreg' => $bdate->format('Y-m-d'),
398 'date_debut_cotis' => $bdate->format('Y-m-d'),
399 'date_fin_cotis' => $edate->format('Y-m-d'),
400 'info_field_' . $cdf->getId() . '_1' => $dyndate->format('Y-m-d')
401 ];
402 $this->createContrib($data);
403 }
404
405 /**
406 * Test model storage in db
407 *
408 * @return void
409 */
410 public function testStorage()
411 {
412 $model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
413
414 $orig_title = $model->title;
415 $this->assertSame('_T("Invoice") {CONTRIBUTION_YEAR}-{CONTRIBUTION_ID}', $orig_title);
416
417 $model->title = 'Another test';
418 $this->assertTrue($model->store());
419
420 $model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
421 $this->assertSame('Another test', $model->title);
422 }
423 }