Passed
Push — main ( f1540e...02d90d )
by Rafael
45:15
created

doc_generic_shipment_odt   F

Complexity

Total Complexity 69

Size/Duplication

Total Lines 518
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 319
dl 0
loc 518
rs 2.88
c 0
b 0
f 0
wmc 69

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 36 2
F write_file() 0 353 58
B info() 0 91 9

How to fix   Complexity   

Complex Class

Complex classes like doc_generic_shipment_odt often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use doc_generic_shipment_odt, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/* Copyright (C) 2010-2012  Laurent Destailleur <[email protected]>
4
 * Copyright (C) 2012		Juanjo Menent		<[email protected]>
5
 * Copyright (C) 2014		Marcos García		<[email protected]>
6
 * Copyright (C) 2016		Charlie Benke		<[email protected]>
7
 * Copyright (C) 2018-2021  Philippe Grand      <[email protected]>
8
 * Copyright (C) 2018-2019  Frédéric France     <[email protected]>
9
 *
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; either version 3 of the License, or
13
* (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
* GNU General Public License for more details.
19
*
20
* You should have received a copy of the GNU General Public License
21
* along with this program. If not, see <https://www.gnu.org/licenses/>.
22
* or see https://www.gnu.org/
23
*/
24
25
/**
26
 *  \file       htdocs/core/modules/expedition/doc/doc_generic_shipment_odt.modules.php
27
 *  \ingroup    expedition
28
 *  \brief      File of class to build ODT documents for shipment
29
 */
30
31
require_once DOL_DOCUMENT_ROOT . '/core/modules/expedition/modules_expedition.php';
32
require_once BASE_PATH . '/../Dolibarr/Lib/Company.php';
33
require_once BASE_PATH . '/../Dolibarr/Lib/Functions2.php';
34
require_once BASE_PATH . '/../Dolibarr/Lib/Files.php';
35
require_once BASE_PATH . '/../Dolibarr/Lib/Doc.php';
36
37
38
/**
39
 *  Class to build documents using ODF templates generator
40
 */
41
class doc_generic_shipment_odt extends ModelePdfExpedition
42
{
43
    /**
44
     * Dolibarr version of the loaded document
45
     * @var string
46
     */
47
    public $version = 'dolibarr';
48
49
50
    /**
51
     *  Constructor
52
     *
53
     *  @param      DoliDB      $db      Database handler
54
     */
55
    public function __construct($db)
56
    {
57
        global $conf, $langs, $mysoc;
58
59
        // Load translation files required by the page
60
        $langs->loadLangs(array("main", "companies"));
61
62
        $this->db = $db;
63
        $this->name = "ODT templates";
64
        $this->description = $langs->trans("DocumentModelOdt");
65
        $this->scandir = 'EXPEDITION_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan
66
67
        // Page size for A4 format
68
        $this->type = 'odt';
69
        $this->page_largeur = 0;
70
        $this->page_hauteur = 0;
71
        $this->format = array($this->page_largeur, $this->page_hauteur);
72
        $this->marge_gauche = 0;
73
        $this->marge_droite = 0;
74
        $this->marge_haute = 0;
75
        $this->marge_basse = 0;
76
77
        $this->option_logo = 1; // Display logo
78
        $this->option_tva = 0; // Manage the vat option EXPEDITION_TVAOPTION
79
        $this->option_modereg = 0; // Display payment mode
80
        $this->option_condreg = 0; // Display payment terms
81
        $this->option_multilang = 1; // Available in several languages
82
        $this->option_escompte = 0; // Displays if there has been a discount
83
        $this->option_credit_note = 0; // Support credit notes
84
        $this->option_freetext = 1; // Support add of a personalised text
85
        $this->option_draft_watermark = 0; // Support add of a watermark on drafts
86
87
        // Recupere emetteur
88
        $this->emetteur = $mysoc;
89
        if (!$this->emetteur->country_code) {
90
            $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
91
        }
92
    }
93
94
95
    /**
96
     *  Return description of a module
97
     *
98
     *  @param  Translate   $langs      Lang object to use for output
99
     *  @return string                  Description
100
     */
101
    public function info($langs)
102
    {
103
        global $conf, $langs;
104
105
        // Load translation files required by the page
106
        $langs->loadLangs(array("errors", "companies"));
107
108
        $form = new Form($this->db);
109
110
        $texte = $this->description . ".<br>\n";
111
        $texte .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="POST" enctype="multipart/form-data">';
112
        $texte .= '<input type="hidden" name="token" value="' . newToken() . '">';
113
        $texte .= '<input type="hidden" name="page_y" value="">';
114
        $texte .= '<input type="hidden" name="action" value="setModuleOptions">';
115
        $texte .= '<input type="hidden" name="param1" value="EXPEDITION_ADDON_PDF_ODT_PATH">';
116
        $texte .= '<table class="nobordernopadding" width="100%">';
117
118
        // List of directories area
119
        $texte .= '<tr><td>';
120
        $texttitle = $langs->trans("ListOfDirectories");
121
        $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim($conf->global->EXPEDITION_ADDON_PDF_ODT_PATH)));
122
        $listoffiles = array();
123
        foreach ($listofdir as $key => $tmpdir) {
124
            $tmpdir = trim($tmpdir);
125
            $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
126
            if (!$tmpdir) {
127
                unset($listofdir[$key]);
128
                continue;
129
            }
130
            if (!is_dir($tmpdir)) {
131
                $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), 0);
132
            } else {
133
                $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)');
134
                if (count($tmpfiles)) {
135
                    $listoffiles = array_merge($listoffiles, $tmpfiles);
136
                }
137
            }
138
        }
139
        $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT");
140
        $texthelp .= '<br><br><span class="opacitymedium">' . $langs->trans("ExampleOfDirectoriesForModelGen") . '</span>';
141
        // Add list of substitution keys
142
        $texthelp .= '<br>' . $langs->trans("FollowingSubstitutionKeysCanBeUsed") . '<br>';
143
        $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
144
145
        $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1, 3, $this->name);
146
        $texte .= '<div><div style="display: inline-block; min-width: 100px; vertical-align: middle;">';
147
        $texte .= '<textarea class="flat" cols="60" name="value1">';
148
        $texte .= getDolGlobalString('EXPEDITION_ADDON_PDF_ODT_PATH');
149
        $texte .= '</textarea>';
150
        $texte .= '</div><div style="display: inline-block; vertical-align: middle;">';
151
        $texte .= '<input type="submit" class="button button-edit reposition smallpaddingimp" name="modify" value="' . $langs->trans("Modify") . '">';
152
        $texte .= '<br></div></div>';
153
154
        // Scan directories
155
        $nbofiles = count($listoffiles);
156
        if (getDolGlobalString('EXPEDITION_ADDON_PDF_ODT_PATH')) {
157
            $texte .= $langs->trans("NumberOfModelFilesFound") . ': <b>';
158
            //$texte.=$nbofiles?'<a id="a_'.get_class($this).'" href="#">':'';
159
            $texte .= count($listoffiles);
160
            //$texte.=$nbofiles?'</a>':'';
161
            $texte .= '</b>';
162
        }
163
        if ($nbofiles) {
164
            $texte .= '<div id="div_' . get_class($this) . '" class="hiddenx">';
165
            // Show list of found files
166
            foreach ($listoffiles as $file) {
167
                $texte .= '- ' . $file['name'] . ' <a href="' . DOL_URL_ROOT . '/document.php?modulepart=doctemplates&file=shipments/' . urlencode(basename($file['name'])) . '">' . img_picto('', 'listlight') . '</a>';
168
                $texte .= ' &nbsp; <a class="reposition" href="' . $_SERVER['PHP_SELF'] . '?modulepart=doctemplates&keyforuploaddir=EXPEDITION_ADDON_PDF_ODT_PATH&action=deletefile&token=' . newToken() . '&file=' . urlencode(basename($file['name'])) . '">' . img_picto('', 'delete') . '</a>';
169
                $texte .= '<br>';
170
            }
171
            $texte .= '</div>';
172
        }
173
        // Add input to upload a new template file.
174
        $texte .= '<div>' . $langs->trans("UploadNewTemplate");
175
        $maxfilesizearray = getMaxFileSizeArray();
176
        $maxmin = $maxfilesizearray['maxmin'];
177
        if ($maxmin > 0) {
178
            $texte .= '<input type="hidden" name="MAX_FILE_SIZE" value="' . ($maxmin * 1024) . '">';    // MAX_FILE_SIZE must precede the field type=file
179
        }
180
        $texte .= ' <input type="file" name="uploadfile">';
181
        $texte .= '<input type="hidden" value="EXPEDITION_ADDON_PDF_ODT_PATH" name="keyforuploaddir">';
182
        $texte .= '<input type="submit" class="button smallpaddingimp reposition" value="' . dol_escape_htmltag($langs->trans("Upload")) . '" name="upload">';
183
        $texte .= '</div>';
184
        $texte .= '</td>';
185
186
        $texte .= '</tr>';
187
188
        $texte .= '</table>';
189
        $texte .= '</form>';
190
191
        return $texte;
192
    }
193
194
	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
195
    /**
196
     *  Function to build a document on disk using the generic odt module.
197
     *
198
     *  @param      Expedition  $object             Object source to build document
199
     *  @param      Translate   $outputlangs        Lang output object
200
     *  @param      string      $srctemplatepath    Full path of source filename for generator using a template file
201
     *  @param      int         $hidedetails        Do not show line details
202
     *  @param      int         $hidedesc           Do not show desc
203
     *  @param      int         $hideref            Do not show ref
204
     *  @return     int                             1 if OK, <=0 if KO
205
     */
206
    public function write_file($object, $outputlangs, $srctemplatepath, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
207
    {
208
		// phpcs:enable
209
        global $user, $langs, $conf, $mysoc, $hookmanager;
210
211
        if (empty($srctemplatepath)) {
212
            dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
213
            return -1;
214
        }
215
216
        // Add odtgeneration hook
217
        if (!is_object($hookmanager)) {
218
            include_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
219
            $hookmanager = new HookManager($this->db);
220
        }
221
        $hookmanager->initHooks(array('odtgeneration'));
222
        global $action;
223
224
        if (!is_object($outputlangs)) {
225
            $outputlangs = $langs;
226
        }
227
        $sav_charset_output = $outputlangs->charset_output;
228
        $outputlangs->charset_output = 'UTF-8';
229
230
        // Load traductions files required by page
231
        $outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
232
233
        if ($conf->expedition->dir_output . "/sending") {
234
            // If $object is id instead of object
235
            if (!is_object($object)) {
236
                $id = $object;
237
                $object = new Expedition($this->db);
238
                $result = $object->fetch($id);
239
                if ($result < 0) {
240
                    dol_print_error($this->db, $object->error);
241
                    return -1;
242
                }
243
            }
244
245
            $object->fetch_thirdparty();
246
247
            $dir = $conf->expedition->dir_output . "/sending";
248
            $objectref = dol_sanitizeFileName($object->ref);
249
            if (!preg_match('/specimen/i', $objectref)) {
250
                $dir .= "/" . $objectref;
251
            }
252
            $file = $dir . "/" . $objectref . ".odt";
253
254
            if (!file_exists($dir)) {
255
                if (dol_mkdir($dir) < 0) {
256
                    $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
257
                    return -1;
258
                }
259
            }
260
261
            if (file_exists($dir)) {
262
                //print "srctemplatepath=".$srctemplatepath;    // Src filename
263
                $newfile = basename($srctemplatepath);
264
                $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile);
265
                $newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
266
                $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
267
                $newfiletmp = $objectref . '_' . $newfiletmp;
268
                //$file=$dir.'/'.$newfiletmp.'.'.dol_print_date(dol_now(),'%Y%m%d%H%M%S').'.odt';
269
                // Get extension (ods or odt)
270
                $newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
271
                if (getDolGlobalString('MAIN_DOC_USE_TIMING')) {
272
                    $format = getDolGlobalString('MAIN_DOC_USE_TIMING');
273
                    if ($format == '1') {
274
                        $format = '%Y%m%d%H%M%S';
275
                    }
276
                    $filename = $newfiletmp . '-' . dol_print_date(dol_now(), $format) . '.' . $newfileformat;
277
                } else {
278
                    $filename = $newfiletmp . '.' . $newfileformat;
279
                }
280
                $file = $dir . '/' . $filename;
281
                //print "newdir=".$dir;
282
                //print "newfile=".$newfile;
283
                //print "file=".$file;
284
                //print "conf->societe->dir_temp=".$conf->societe->dir_temp;
285
286
                dol_mkdir($conf->expedition->dir_temp);
287
                if (!is_writable($conf->expedition->dir_temp)) {
288
                    $this->error = $langs->transnoentities("ErrorFailedToWriteInTempDirectory", $conf->expedition->dir_temp);
289
                    dol_syslog('Error in write_file: ' . $this->error, LOG_ERR);
290
                    return -1;
291
                }
292
293
                // If SHIPMENT contact defined on invoice, we use it
294
                $usecontact = false;
295
                $arrayidcontact = $object->getIdContact('external', 'SHIPPING');
296
                if (count($arrayidcontact) > 0) {
297
                    $usecontact = true;
298
                    $result = $object->fetch_contact($arrayidcontact[0]);
299
                }
300
301
                // Recipient name
302
                $contactobject = null;
303
                if (!empty($usecontact)) {
304
                    // We can use the company of contact instead of thirdparty company
305
                    if ($object->contact->socid != $object->thirdparty->id && (!isset($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT) || getDolGlobalString('MAIN_USE_COMPANY_NAME_OF_CONTACT'))) {
306
                        $object->contact->fetch_thirdparty();
307
                        $socobject = $object->contact->thirdparty;
308
                        $contactobject = $object->contact;
309
                    } else {
310
                        $socobject = $object->thirdparty;
311
                        // if we have a SHIPPING contact and we don't use it as thirdparty recipient we store the contact object for later use
312
                        $contactobject = $object->contact;
313
                    }
314
                } else {
315
                    $socobject = $object->thirdparty;
316
                }
317
318
                // Make substitution
319
                $substitutionarray = array(
320
                    '__FROM_NAME__' => $this->emetteur->name,
321
                    '__FROM_EMAIL__' => $this->emetteur->email,
322
                    '__TOTAL_TTC__' => $object->total_ttc,
323
                    '__TOTAL_HT__' => $object->total_ht,
324
                    '__TOTAL_VAT__' => $object->total_tva
325
                );
326
                complete_substitutions_array($substitutionarray, $langs, $object);
327
                // Call the ODTSubstitution hook
328
                $parameters = array('file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$substitutionarray);
329
                $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
330
331
                // Line of free text
332
                $newfreetext = '';
333
                $paramfreetext = 'EXPEDITION_FREE_TEXT';
334
                if (!empty($conf->global->$paramfreetext)) {
335
                    $newfreetext = make_substitutions(getDolGlobalString($paramfreetext), $substitutionarray);
336
                }
337
338
                // Open and load template
339
                require_once ODTPHP_PATH . 'odf.php';
0 ignored issues
show
Bug introduced by
The constant ODTPHP_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
340
                try {
341
                    $odfHandler = new Odf(
342
                        $srctemplatepath,
343
                        array(
344
                        'PATH_TO_TMP'     => $conf->expedition->dir_temp,
345
                        'ZIP_PROXY'       => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
346
                        'DELIMITER_LEFT'  => '{',
347
                        'DELIMITER_RIGHT' => '}'
348
                        )
349
                    );
350
                } catch (Exception $e) {
351
                    $this->error = $e->getMessage();
352
                    dol_syslog($e->getMessage(), LOG_INFO);
353
                    return -1;
354
                }
355
                // After construction $odfHandler->contentXml contains content and
356
                // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
357
                // [!-- BEGIN lines --]*[!-- END lines --]
358
                //print html_entity_decode($odfHandler->__toString());
359
                //print exit;
360
361
362
                // Make substitutions into odt of freetext
363
                try {
364
                    $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8');
365
                } catch (OdfException $e) {
366
                    dol_syslog($e->getMessage(), LOG_INFO);
367
                }
368
369
                // Make substitutions into odt of user info
370
                $tmparray = $this->get_substitutionarray_user($user, $outputlangs);
371
                //var_dump($tmparray); exit;
372
                foreach ($tmparray as $key => $value) {
373
                    try {
374
                        if (preg_match('/logo$/', $key)) { // Image
375
                            //var_dump($value);exit;
376
                            if (file_exists($value)) {
377
                                $odfHandler->setImage($key, $value);
378
                            } else {
379
                                $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
380
                            }
381
                        } else { // Text
382
                            $odfHandler->setVars($key, $value, true, 'UTF-8');
383
                        }
384
                    } catch (OdfException $e) {
385
                        dol_syslog($e->getMessage(), LOG_INFO);
386
                    }
387
                }
388
                // Make substitutions into odt of mysoc
389
                $tmparray = $this->get_substitutionarray_mysoc($mysoc, $outputlangs);
390
                //var_dump($tmparray); exit;
391
                foreach ($tmparray as $key => $value) {
392
                    try {
393
                        if (preg_match('/logo$/', $key)) {  // Image
394
                            //var_dump($value);exit;
395
                            if (file_exists($value)) {
396
                                $odfHandler->setImage($key, $value);
397
                            } else {
398
                                $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
399
                            }
400
                        } else { // Text
401
                            $odfHandler->setVars($key, $value, true, 'UTF-8');
402
                        }
403
                    } catch (OdfException $e) {
404
                        dol_syslog($e->getMessage(), LOG_INFO);
405
                    }
406
                }
407
                // Make substitutions into odt of thirdparty
408
                if ($socobject->element == 'contact') {
409
                    $tmparray = $this->get_substitutionarray_contact($socobject, $outputlangs);
410
                } else {
411
                    $tmparray = $this->get_substitutionarray_thirdparty($socobject, $outputlangs);
412
                }
413
                foreach ($tmparray as $key => $value) {
414
                    try {
415
                        if (preg_match('/logo$/', $key)) {  // Image
416
                            if (file_exists($value)) {
417
                                $odfHandler->setImage($key, $value);
418
                            } else {
419
                                $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
420
                            }
421
                        } else { // Text
422
                            $odfHandler->setVars($key, $value, true, 'UTF-8');
423
                        }
424
                    } catch (OdfException $e) {
425
                        dol_syslog($e->getMessage(), LOG_INFO);
426
                    }
427
                }
428
429
                if ($usecontact && is_object($contactobject)) {
430
                    $tmparray = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact');
431
                    foreach ($tmparray as $key => $value) {
432
                        try {
433
                            if (preg_match('/logo$/', $key)) {  // Image
434
                                if (file_exists($value)) {
435
                                    $odfHandler->setImage($key, $value);
436
                                } else {
437
                                    $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
438
                                }
439
                            } else { // Text
440
                                $odfHandler->setVars($key, $value, true, 'UTF-8');
441
                            }
442
                        } catch (OdfException $e) {
443
                            dol_syslog($e->getMessage(), LOG_INFO);
444
                        }
445
                    }
446
                }
447
448
                // Replace tags of object + external modules
449
                $tmparray = array_merge($tmparray, $this->get_substitutionarray_shipment($object, $outputlangs));
450
                $tmparray = array_merge($tmparray, $this->get_substitutionarray_other($outputlangs));
451
452
                complete_substitutions_array($tmparray, $outputlangs, $object);
453
                // Call the ODTSubstitution hook
454
                $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray);
455
                $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
456
                foreach ($tmparray as $key => $value) {
457
                    try {
458
                        if (preg_match('/logo$/', $key)) { // Image
459
                            if (file_exists($value)) {
460
                                $odfHandler->setImage($key, $value);
461
                            } else {
462
                                $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
463
                            }
464
                        } else { // Text
465
                            $odfHandler->setVars($key, $value, true, 'UTF-8');
466
                        }
467
                    } catch (OdfException $e) {
468
                        dol_syslog($e->getMessage(), LOG_INFO);
469
                    }
470
                }
471
                // Replace tags of lines
472
                try {
473
                    $foundtagforlines = 1;
474
                    try {
475
                        $listlines = $odfHandler->setSegment('lines');
476
                    } catch (OdfExceptionSegmentNotFound $e) {
477
                        // We may arrive here if tags for lines not present into template
478
                        $foundtagforlines = 0;
479
                        dol_syslog($e->getMessage(), LOG_INFO);
480
                    } catch (OdfException $e) {
481
                        $foundtagforlines = 0;
482
                        dol_syslog($e->getMessage(), LOG_INFO);
483
                    }
484
                    if ($foundtagforlines) {
485
                        foreach ($object->lines as $line) {
486
                            $tmparray = $this->get_substitutionarray_lines($line, $outputlangs);
487
                            complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines");
488
                            // Call the ODTSubstitutionLine hook
489
                            $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray, 'line' => $line);
490
                            $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
491
                            foreach ($tmparray as $key => $val) {
492
                                try {
493
                                    $listlines->setVars($key, $val, true, 'UTF-8');
494
                                } catch (OdfException $e) {
495
                                    dol_syslog($e->getMessage(), LOG_INFO);
496
                                } catch (SegmentException $e) {
497
                                    dol_syslog($e->getMessage(), LOG_INFO);
498
                                }
499
                            }
500
                            $listlines->merge();
501
                        }
502
                        $odfHandler->mergeSegment($listlines);
503
                    }
504
                } catch (OdfException $e) {
505
                    $this->error = $e->getMessage();
506
                    dol_syslog($this->error, LOG_WARNING);
507
                    return -1;
508
                }
509
510
                // Replace labels translated
511
                $tmparray = $outputlangs->get_translations_for_substitutions();
512
                foreach ($tmparray as $key => $value) {
513
                    try {
514
                        $odfHandler->setVars($key, $value, true, 'UTF-8');
515
                    } catch (OdfException $e) {
516
                        dol_syslog($e->getMessage(), LOG_INFO);
517
                    }
518
                }
519
520
                // Call the beforeODTSave hook
521
                $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray);
522
                $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
523
524
                // Write new file
525
                if (getDolGlobalString('MAIN_ODT_AS_PDF')) {
526
                    try {
527
                        $odfHandler->exportAsAttachedPDF($file);
528
                    } catch (Exception $e) {
529
                        $this->error = $e->getMessage();
530
                        dol_syslog($e->getMessage(), LOG_INFO);
531
                        return -1;
532
                    }
533
                } else {
534
                    try {
535
                        $odfHandler->saveToDisk($file);
536
                    } catch (Exception $e) {
537
                        $this->error = $e->getMessage();
538
                        dol_syslog($e->getMessage(), LOG_INFO);
539
                        return -1;
540
                    }
541
                }
542
                $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray);
543
                $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
544
545
                dolChmod($file);
546
547
                $odfHandler = null; // Destroy object
548
549
                $this->result = array('fullpath' => $file);
550
551
                return 1; // Success
552
            } else {
553
                $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
554
                return -1;
555
            }
556
        }
557
558
        return -1;
559
    }
560
}
561