dolibarr  16.0.5
accountancyexport.class.php
Go to the documentation of this file.
1 <?php
2 /*
3  * Copyright (C) 2007-2012 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
5  * Copyright (C) 2015 Florian Henry <florian.henry@open-concept.pro>
6  * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
7  * Copyright (C) 2016 Pierre-Henry Favre <phf@atm-consulting.fr>
8  * Copyright (C) 2016-2023 Alexandre Spangaro <aspangaro@open-dsi.fr>
9  * Copyright (C) 2013-2017 Olivier Geffroy <jeff@jeffinfo.com>
10  * Copyright (C) 2017 Elarifr. Ari Elbaz <github@accedinfo.com>
11  * Copyright (C) 2017-2019 Frédéric France <frederic.france@netlogic.fr>
12  * Copyright (C) 2017 André Schild <a.schild@aarboard.ch>
13  * Copyright (C) 2020 Guillaume Alexandre <guillaume@tag-info.fr>
14  * Copyright (C) 2022 Joachim Kueter <jkueter@gmx.de>
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 3 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program. If not, see <https://www.gnu.org/licenses/>.
28  */
29 
36 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
39 
40 
45 {
46  // Type of export. Used into $conf->global->ACCOUNTING_EXPORT_MODELCSV
47  public static $EXPORT_TYPE_CONFIGURABLE = 1; // CSV
48  public static $EXPORT_TYPE_AGIRIS = 10;
49  public static $EXPORT_TYPE_EBP = 15;
50  public static $EXPORT_TYPE_CEGID = 20;
51  public static $EXPORT_TYPE_COGILOG = 25;
52  public static $EXPORT_TYPE_COALA = 30;
53  public static $EXPORT_TYPE_BOB50 = 35;
54  public static $EXPORT_TYPE_CIEL = 40;
55  public static $EXPORT_TYPE_SAGE50_SWISS = 45;
56  public static $EXPORT_TYPE_CHARLEMAGNE = 50;
57  public static $EXPORT_TYPE_QUADRATUS = 60;
58  public static $EXPORT_TYPE_WINFIC = 70;
59  public static $EXPORT_TYPE_OPENCONCERTO = 100;
60  public static $EXPORT_TYPE_LDCOMPTA = 110;
61  public static $EXPORT_TYPE_LDCOMPTA10 = 120;
62  public static $EXPORT_TYPE_GESTIMUMV3 = 130;
63  public static $EXPORT_TYPE_GESTIMUMV5 = 135;
64  public static $EXPORT_TYPE_ISUITEEXPERT = 200;
65  // Generic FEC after that
66  public static $EXPORT_TYPE_FEC = 1000;
67  public static $EXPORT_TYPE_FEC2 = 1010;
68 
72  public $db;
73 
77  public $errors = array();
78 
83  public $separator = '';
84 
89  public $end_line = '';
90 
96  public function __construct(DoliDB $db)
97  {
98  global $conf, $hookmanager;
99 
100  $this->db = $db;
101  $this->separator = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV;
102  $this->end_line = empty($conf->global->ACCOUNTING_EXPORT_ENDLINE) ? "\n" : ($conf->global->ACCOUNTING_EXPORT_ENDLINE == 1 ? "\n" : "\r\n");
103 
104  $hookmanager->initHooks(array('accountancyexport'));
105  }
106 
112  public function getType()
113  {
114  global $langs, $hookmanager;
115 
116  $listofexporttypes = array(
117  self::$EXPORT_TYPE_CONFIGURABLE => $langs->trans('Modelcsv_configurable'),
118  self::$EXPORT_TYPE_CEGID => $langs->trans('Modelcsv_CEGID'),
119  self::$EXPORT_TYPE_COALA => $langs->trans('Modelcsv_COALA'),
120  self::$EXPORT_TYPE_BOB50 => $langs->trans('Modelcsv_bob50'),
121  self::$EXPORT_TYPE_CIEL => $langs->trans('Modelcsv_ciel'),
122  self::$EXPORT_TYPE_QUADRATUS => $langs->trans('Modelcsv_quadratus'),
123  self::$EXPORT_TYPE_WINFIC => $langs->trans('Modelcsv_winfic'),
124  self::$EXPORT_TYPE_EBP => $langs->trans('Modelcsv_ebp'),
125  self::$EXPORT_TYPE_COGILOG => $langs->trans('Modelcsv_cogilog'),
126  self::$EXPORT_TYPE_AGIRIS => $langs->trans('Modelcsv_agiris'),
127  self::$EXPORT_TYPE_OPENCONCERTO => $langs->trans('Modelcsv_openconcerto'),
128  self::$EXPORT_TYPE_SAGE50_SWISS => $langs->trans('Modelcsv_Sage50_Swiss'),
129  self::$EXPORT_TYPE_CHARLEMAGNE => $langs->trans('Modelcsv_charlemagne'),
130  self::$EXPORT_TYPE_LDCOMPTA => $langs->trans('Modelcsv_LDCompta'),
131  self::$EXPORT_TYPE_LDCOMPTA10 => $langs->trans('Modelcsv_LDCompta10'),
132  self::$EXPORT_TYPE_GESTIMUMV3 => $langs->trans('Modelcsv_Gestinumv3'),
133  self::$EXPORT_TYPE_GESTIMUMV5 => $langs->trans('Modelcsv_Gestinumv5'),
134  self::$EXPORT_TYPE_FEC => $langs->trans('Modelcsv_FEC'),
135  self::$EXPORT_TYPE_FEC2 => $langs->trans('Modelcsv_FEC2'),
136  self::$EXPORT_TYPE_ISUITEEXPERT => 'Export iSuite Expert',
137  );
138 
139  // allow modules to define export formats
140  $parameters = array();
141  $reshook = $hookmanager->executeHooks('getType', $parameters, $listofexporttypes);
142 
143  ksort($listofexporttypes, SORT_NUMERIC);
144 
145  return $listofexporttypes;
146  }
147 
154  public static function getFormatCode($type)
155  {
156  $formatcode = array(
157  self::$EXPORT_TYPE_CONFIGURABLE => 'csv',
158  self::$EXPORT_TYPE_CEGID => 'cegid',
159  self::$EXPORT_TYPE_COALA => 'coala',
160  self::$EXPORT_TYPE_BOB50 => 'bob50',
161  self::$EXPORT_TYPE_CIEL => 'ciel',
162  self::$EXPORT_TYPE_QUADRATUS => 'quadratus',
163  self::$EXPORT_TYPE_WINFIC => 'winfic',
164  self::$EXPORT_TYPE_EBP => 'ebp',
165  self::$EXPORT_TYPE_COGILOG => 'cogilog',
166  self::$EXPORT_TYPE_AGIRIS => 'agiris',
167  self::$EXPORT_TYPE_OPENCONCERTO => 'openconcerto',
168  self::$EXPORT_TYPE_SAGE50_SWISS => 'sage50ch',
169  self::$EXPORT_TYPE_CHARLEMAGNE => 'charlemagne',
170  self::$EXPORT_TYPE_LDCOMPTA => 'ldcompta',
171  self::$EXPORT_TYPE_LDCOMPTA10 => 'ldcompta10',
172  self::$EXPORT_TYPE_GESTIMUMV3 => 'gestimumv3',
173  self::$EXPORT_TYPE_GESTIMUMV5 => 'gestimumv5',
174  self::$EXPORT_TYPE_FEC => 'fec',
175  self::$EXPORT_TYPE_FEC2 => 'fec2',
176  self::$EXPORT_TYPE_ISUITEEXPERT => 'isuiteexpert',
177  );
178 
179  global $hookmanager;
180  $code = $formatcode[$type];
181  $parameters = array('type' => $type);
182  $reshook = $hookmanager->executeHooks('getFormatCode', $parameters, $code);
183 
184  return $code;
185  }
186 
192  public function getTypeConfig()
193  {
194  global $conf, $langs;
195 
196  $exporttypes = array(
197  'param' => array(
198  self::$EXPORT_TYPE_CONFIGURABLE => array(
199  'label' => $langs->trans('Modelcsv_configurable'),
200  'ACCOUNTING_EXPORT_FORMAT' => empty($conf->global->ACCOUNTING_EXPORT_FORMAT) ? 'txt' : $conf->global->ACCOUNTING_EXPORT_FORMAT,
201  'ACCOUNTING_EXPORT_SEPARATORCSV' => empty($conf->global->ACCOUNTING_EXPORT_SEPARATORCSV) ? ',' : $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV,
202  'ACCOUNTING_EXPORT_ENDLINE' => empty($conf->global->ACCOUNTING_EXPORT_ENDLINE) ? 1 : $conf->global->ACCOUNTING_EXPORT_ENDLINE,
203  'ACCOUNTING_EXPORT_DATE' => empty($conf->global->ACCOUNTING_EXPORT_DATE) ? '%d%m%Y' : $conf->global->ACCOUNTING_EXPORT_DATE,
204  ),
205  self::$EXPORT_TYPE_CEGID => array(
206  'label' => $langs->trans('Modelcsv_CEGID'),
207  ),
208  self::$EXPORT_TYPE_COALA => array(
209  'label' => $langs->trans('Modelcsv_COALA'),
210  ),
211  self::$EXPORT_TYPE_BOB50 => array(
212  'label' => $langs->trans('Modelcsv_bob50'),
213  ),
214  self::$EXPORT_TYPE_CIEL => array(
215  'label' => $langs->trans('Modelcsv_ciel'),
216  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
217  ),
218  self::$EXPORT_TYPE_QUADRATUS => array(
219  'label' => $langs->trans('Modelcsv_quadratus'),
220  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
221  ),
222  self::$EXPORT_TYPE_WINFIC => array(
223  'label' => $langs->trans('Modelcsv_winfic'),
224  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
225  ),
226  self::$EXPORT_TYPE_EBP => array(
227  'label' => $langs->trans('Modelcsv_ebp'),
228  ),
229  self::$EXPORT_TYPE_COGILOG => array(
230  'label' => $langs->trans('Modelcsv_cogilog'),
231  ),
232  self::$EXPORT_TYPE_AGIRIS => array(
233  'label' => $langs->trans('Modelcsv_agiris'),
234  ),
235  self::$EXPORT_TYPE_OPENCONCERTO => array(
236  'label' => $langs->trans('Modelcsv_openconcerto'),
237  ),
238  self::$EXPORT_TYPE_SAGE50_SWISS => array(
239  'label' => $langs->trans('Modelcsv_Sage50_Swiss'),
240  ),
241  self::$EXPORT_TYPE_CHARLEMAGNE => array(
242  'label' => $langs->trans('Modelcsv_charlemagne'),
243  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
244  ),
245  self::$EXPORT_TYPE_LDCOMPTA => array(
246  'label' => $langs->trans('Modelcsv_LDCompta'),
247  ),
248  self::$EXPORT_TYPE_LDCOMPTA10 => array(
249  'label' => $langs->trans('Modelcsv_LDCompta10'),
250  ),
251  self::$EXPORT_TYPE_GESTIMUMV3 => array(
252  'label' => $langs->trans('Modelcsv_Gestinumv3'),
253  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
254  ),
255  self::$EXPORT_TYPE_GESTIMUMV5 => array(
256  'label' => $langs->trans('Modelcsv_Gestinumv5'),
257  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
258  ),
259  self::$EXPORT_TYPE_FEC => array(
260  'label' => $langs->trans('Modelcsv_FEC'),
261  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
262  ),
263  self::$EXPORT_TYPE_FEC2 => array(
264  'label' => $langs->trans('Modelcsv_FEC2'),
265  'ACCOUNTING_EXPORT_FORMAT' => 'txt',
266  ),
267  self::$EXPORT_TYPE_ISUITEEXPERT => array(
268  'label' => 'iSuite Expert',
269  'ACCOUNTING_EXPORT_FORMAT' => 'csv',
270  ),
271  ),
272  'cr'=> array(
273  '1' => $langs->trans("Unix"),
274  '2' => $langs->trans("Windows")
275  ),
276  'format' => array(
277  'csv' => $langs->trans("csv"),
278  'txt' => $langs->trans("txt")
279  ),
280  );
281 
282  global $hookmanager;
283  $parameters = array();
284  $reshook = $hookmanager->executeHooks('getTypeConfig', $parameters, $exporttypes);
285  return $exporttypes;
286  }
287 
288 
296  public function export(&$TData, $formatexportset)
297  {
298  global $conf, $langs;
299  global $search_date_end; // Used into /accountancy/tpl/export_journal.tpl.php
300 
301  // Define name of file to save
302  $filename = 'general_ledger-'.$this->getFormatCode($formatexportset);
303  $type_export = 'general_ledger';
304 
305  global $db; // The tpl file use $db
306  include DOL_DOCUMENT_ROOT.'/accountancy/tpl/export_journal.tpl.php';
307 
308 
309  switch ($formatexportset) {
310  case self::$EXPORT_TYPE_CONFIGURABLE:
311  $this->exportConfigurable($TData);
312  break;
313  case self::$EXPORT_TYPE_CEGID:
314  $this->exportCegid($TData);
315  break;
316  case self::$EXPORT_TYPE_COALA:
317  $this->exportCoala($TData);
318  break;
319  case self::$EXPORT_TYPE_BOB50:
320  $this->exportBob50($TData);
321  break;
322  case self::$EXPORT_TYPE_CIEL:
323  $this->exportCiel($TData);
324  break;
325  case self::$EXPORT_TYPE_QUADRATUS:
326  $this->exportQuadratus($TData);
327  break;
328  case self::$EXPORT_TYPE_WINFIC:
329  $this->exportWinfic($TData);
330  break;
331  case self::$EXPORT_TYPE_EBP:
332  $this->exportEbp($TData);
333  break;
334  case self::$EXPORT_TYPE_COGILOG:
335  $this->exportCogilog($TData);
336  break;
337  case self::$EXPORT_TYPE_AGIRIS:
338  $this->exportAgiris($TData);
339  break;
340  case self::$EXPORT_TYPE_OPENCONCERTO:
341  $this->exportOpenConcerto($TData);
342  break;
343  case self::$EXPORT_TYPE_SAGE50_SWISS:
344  $this->exportSAGE50SWISS($TData);
345  break;
346  case self::$EXPORT_TYPE_CHARLEMAGNE:
347  $this->exportCharlemagne($TData);
348  break;
349  case self::$EXPORT_TYPE_LDCOMPTA:
350  $this->exportLDCompta($TData);
351  break;
352  case self::$EXPORT_TYPE_LDCOMPTA10:
353  $this->exportLDCompta10($TData);
354  break;
355  case self::$EXPORT_TYPE_GESTIMUMV3:
356  $this->exportGestimumV3($TData);
357  break;
358  case self::$EXPORT_TYPE_GESTIMUMV5:
359  $this->exportGestimumV5($TData);
360  break;
361  case self::$EXPORT_TYPE_FEC:
362  $this->exportFEC($TData);
363  break;
364  case self::$EXPORT_TYPE_FEC2:
365  $this->exportFEC2($TData);
366  break;
367  case self::$EXPORT_TYPE_ISUITEEXPERT :
368  $this->exportiSuiteExpert($TData);
369  break;
370  default:
371  global $hookmanager;
372  $parameters = array('format' => $formatexportset);
373  // file contents will be created in the hooked function via print
374  $reshook = $hookmanager->executeHooks('export', $parameters, $TData);
375  if ($reshook != 1) {
376  $this->errors[] = $langs->trans('accountancy_error_modelnotfound');
377  }
378  break;
379  }
380  }
381 
382 
389  public function exportCegid($objectLines)
390  {
391  foreach ($objectLines as $line) {
392  $date = dol_print_date($line->doc_date, '%d%m%Y');
393  $separator = ";";
394  $end_line = "\n";
395 
396  print $date.$separator;
397  print $line->code_journal.$separator;
398  print length_accountg($line->numero_compte).$separator;
399  print length_accounta($line->subledger_account).$separator;
400  print $line->sens.$separator;
401  print price2fec(abs($line->debit - $line->credit)).$separator;
402  print dol_string_unaccent($line->label_operation).$separator;
403  print dol_string_unaccent($line->doc_ref);
404  print $end_line;
405  }
406  }
407 
414  public function exportCogilog($objectLines)
415  {
416  foreach ($objectLines as $line) {
417  $date = dol_print_date($line->doc_date, '%d%m%Y');
418  $separator = ";";
419  $end_line = "\n";
420 
421  print $line->code_journal.$separator;
422  print $date.$separator;
423  print $line->piece_num.$separator;
424  print length_accountg($line->numero_compte).$separator;
425  print ''.$separator;
426  print $line->label_operation.$separator;
427  print $date.$separator;
428  if ($line->sens == 'D') {
429  print price($line->debit).$separator;
430  print ''.$separator;
431  } elseif ($line->sens == 'C') {
432  print ''.$separator;
433  print price($line->credit).$separator;
434  }
435  print $line->doc_ref.$separator;
436  print $line->label_operation.$separator;
437  print $end_line;
438  }
439  }
440 
447  public function exportCoala($objectLines)
448  {
449  // Coala export
450  $separator = ";";
451  $end_line = "\n";
452 
453  foreach ($objectLines as $line) {
454  $date = dol_print_date($line->doc_date, '%d/%m/%Y');
455 
456  print $date.$separator;
457  print $line->code_journal.$separator;
458  print length_accountg($line->numero_compte).$separator;
459  print $line->piece_num.$separator;
460  print $line->doc_ref.$separator;
461  print price($line->debit).$separator;
462  print price($line->credit).$separator;
463  print 'E'.$separator;
464  print length_accounta($line->subledger_account).$separator;
465  print $end_line;
466  }
467  }
468 
475  public function exportBob50($objectLines)
476  {
477 
478  // Bob50
479  $separator = ";";
480  $end_line = "\n";
481 
482  foreach ($objectLines as $line) {
483  print $line->piece_num.$separator;
484  $date = dol_print_date($line->doc_date, '%d/%m/%Y');
485  print $date.$separator;
486 
487  if (empty($line->subledger_account)) {
488  print 'G'.$separator;
489  print length_accounta($line->numero_compte).$separator;
490  } else {
491  if (substr($line->numero_compte, 0, 3) == '411') {
492  print 'C'.$separator;
493  }
494  if (substr($line->numero_compte, 0, 3) == '401') {
495  print 'F'.$separator;
496  }
497  print length_accountg($line->subledger_account).$separator;
498  }
499 
500  print price($line->debit).$separator;
501  print price($line->credit).$separator;
502  print dol_trunc($line->label_operation, 32).$separator;
503  print $end_line;
504  }
505  }
506 
521  public function exportCiel(&$TData)
522  {
523  $end_line = "\r\n";
524 
525  $i = 1;
526 
527  foreach ($TData as $data) {
528  $code_compta = length_accountg($data->numero_compte);
529  if (!empty($data->subledger_account)) {
530  $code_compta = length_accounta($data->subledger_account);
531  }
532 
533  $date_document = dol_print_date($data->doc_date, '%Y%m%d');
534  $date_echeance = dol_print_date($data->date_lim_reglement, '%Y%m%d');
535 
536  $Tab = array();
537  $Tab['num_ecriture'] = str_pad($data->piece_num, 5);
538  $Tab['code_journal'] = str_pad(self::trunc($data->code_journal, 2), 2);
539  $Tab['date_ecriture'] = str_pad($date_document, 8, ' ', STR_PAD_LEFT);
540  $Tab['date_echeance'] = str_pad($date_echeance, 8, ' ', STR_PAD_LEFT);
541  $Tab['num_piece'] = str_pad(self::trunc($data->doc_ref, 12), 12);
542  $Tab['num_compte'] = str_pad(self::trunc($code_compta, 11), 11);
543  $Tab['libelle_ecriture'] = str_pad(self::trunc(dol_string_unaccent($data->doc_ref).dol_string_unaccent($data->label_operation), 25), 25);
544  $Tab['montant'] = str_pad(price2fec(abs($data->debit - $data->credit)), 13, ' ', STR_PAD_LEFT);
545  $Tab['type_montant'] = str_pad($data->sens, 1);
546  $Tab['vide'] = str_repeat(' ', 18); // Analytical accounting - Not managed in Dolibarr
547  $Tab['intitule_compte'] = str_pad(self::trunc(dol_string_unaccent($data->label_operation), 34), 34);
548  $Tab['end'] = 'O2003'; // 0 = EUR | 2003 = Format Ciel
549 
550  $Tab['end_line'] = $end_line;
551 
552  print implode($Tab);
553  $i++;
554  }
555  }
556 
568  public function exportQuadratus(&$TData)
569  {
570  global $conf, $db;
571 
572  $end_line = "\r\n";
573 
574  // We should use dol_now function not time however this is wrong date to transfert in accounting
575  // $date_ecriture = dol_print_date(dol_now(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy
576  // $date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy
577  foreach ($TData as $data) {
578  // Clean some data
579  $data->doc_ref = dol_string_unaccent($data->doc_ref);
580 
581  $data->label_operation = str_replace(array("\t", "\n", "\r"), " ", $data->label_operation);
582  $data->label_operation = str_replace(array("- ", "…", "..."), "", $data->label_operation);
583  $data->label_operation = dol_string_unaccent($data->label_operation);
584 
585  $data->numero_compte = dol_string_unaccent($data->numero_compte);
586  $data->label_compte = dol_string_unaccent($data->label_compte);
587  $data->subledger_account = dol_string_unaccent($data->subledger_account);
588 
589  $data->subledger_label = dol_string_unaccent($data->subledger_label);
590  $data->subledger_label = str_replace(array("- ", "…", "..."), "", $data->subledger_label);
591  $data->subledger_label = dol_string_unaccent($data->subledger_label);
592 
593  $code_compta = $data->numero_compte;
594  if (!empty($data->subledger_account)) {
595  $code_compta = $data->subledger_account;
596  }
597 
598  $Tab = array();
599 
600  if (!empty($data->subledger_account)) {
601  $Tab['type_ligne'] = 'C';
602  $Tab['num_compte'] = str_pad(self::trunc($data->subledger_account, 8), 8);
603  $Tab['lib_compte'] = str_pad(self::trunc($data->subledger_label, 30), 30);
604 
605  if ($data->doc_type == 'customer_invoice') {
606  $Tab['lib_alpha'] = strtoupper(str_pad('C'.self::trunc($data->subledger_label, 6), 7));
607  $Tab['filler'] = str_repeat(' ', 52);
608  $Tab['coll_compte'] = str_pad(self::trunc($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER, 8), 8);
609  } elseif ($data->doc_type == 'supplier_invoice') {
610  $Tab['lib_alpha'] = strtoupper(str_pad('F'.self::trunc($data->subledger_label, 6), 7));
611  $Tab['filler'] = str_repeat(' ', 52);
612  $Tab['coll_compte'] = str_pad(self::trunc($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER, 8), 8);
613  } else {
614  $Tab['filler'] = str_repeat(' ', 59);
615  $Tab['coll_compte'] = str_pad(' ', 8);
616  }
617 
618  $Tab['filler2'] = str_repeat(' ', 110);
619  $Tab['Maj'] = 2; // Partial update (alpha key, label, address, collectif, RIB)
620 
621  if ($data->doc_type == 'customer_invoice') {
622  $Tab['type_compte'] = 'C';
623  } elseif ($data->doc_type == 'supplier_invoice') {
624  $Tab['type_compte'] = 'F';
625  } else {
626  $Tab['type_compte'] = 'G';
627  }
628 
629  $Tab['filler3'] = str_repeat(' ', 235);
630 
631  $Tab['end_line'] = $end_line;
632 
633  print implode($Tab);
634  }
635 
636  $Tab = array();
637  $Tab['type_ligne'] = 'M';
638  $Tab['num_compte'] = str_pad(self::trunc($code_compta, 8), 8);
639  $Tab['code_journal'] = str_pad(self::trunc($data->code_journal, 2), 2);
640  $Tab['folio'] = '000';
641 
642  // We use invoice date $data->doc_date not $date_ecriture which is the transfert date
643  // maybe we should set an option for customer who prefer to keep in accounting software the tranfert date instead of invoice date ?
644  //$Tab['date_ecriture'] = $date_ecriture;
645  $Tab['date_ecriture'] = dol_print_date($data->doc_date, '%d%m%y');
646  $Tab['filler'] = ' ';
647  $Tab['libelle_ecriture'] = str_pad(self::trunc($data->doc_ref.' '.$data->label_operation, 20), 20);
648 
649  // Credit invoice - invert sens
650  /*
651  if ($data->montant < 0) {
652  if ($data->sens == 'C') {
653  $Tab['sens'] = 'D';
654  } else {
655  $Tab['sens'] = 'C';
656  }
657  $Tab['signe_montant'] = '-';
658  } else {
659  $Tab['sens'] = $data->sens; // C or D
660  $Tab['signe_montant'] = '+';
661  }*/
662  $Tab['sens'] = $data->sens; // C or D
663  $Tab['signe_montant'] = '+';
664 
665  // The amount must be in centimes without decimal points.
666  $Tab['montant'] = str_pad(abs(($data->debit - $data->credit) * 100), 12, '0', STR_PAD_LEFT);
667  $Tab['contrepartie'] = str_repeat(' ', 8);
668 
669  // Force date format : %d%m%y
670  if (!empty($data->date_lim_reglement)) {
671  //$Tab['date_echeance'] = dol_print_date($data->date_lim_reglement, $conf->global->ACCOUNTING_EXPORT_DATE);
672  $Tab['date_echeance'] = dol_print_date($data->date_lim_reglement, '%d%m%y'); // Format must be ddmmyy
673  } else {
674  $Tab['date_echeance'] = '000000';
675  }
676 
677  // Please keep quadra named field lettrage(2) + codestat(3) instead of fake lettrage(5)
678  // $Tab['lettrage'] = str_repeat(' ', 5);
679  $Tab['lettrage'] = str_repeat(' ', 2);
680  $Tab['codestat'] = str_repeat(' ', 3);
681  $Tab['num_piece'] = str_pad(self::trunc($data->piece_num, 5), 5);
682 
683  // Keep correct quadra named field instead of anon filler
684  // $Tab['filler2'] = str_repeat(' ', 20);
685  $Tab['affaire'] = str_repeat(' ', 10);
686  $Tab['quantity1'] = str_repeat(' ', 10);
687  $Tab['num_piece2'] = str_pad(self::trunc($data->piece_num, 8), 8);
688  $Tab['devis'] = str_pad($conf->currency, 3);
689  $Tab['code_journal2'] = str_pad(self::trunc($data->code_journal, 3), 3);
690  $Tab['filler3'] = str_repeat(' ', 3);
691 
692  // Keep correct quadra named field instead of anon filler libelle_ecriture2 is 30 char not 32 !!!!
693  // as we use utf8, we must remove accent to have only one ascii char instead of utf8 2 chars for specials that report wrong line size that will exceed import format spec
694  // TODO: we should filter more than only accent to avoid wrong line size
695  // TODO: remove invoice number doc_ref in libelle,
696  // TODO: we should offer an option for customer to build the libelle using invoice number / name / date in accounting software
697  //$Tab['libelle_ecriture2'] = str_pad(self::trunc($data->doc_ref . ' ' . $data->label_operation, 30), 30);
698  $Tab['libelle_ecriture2'] = str_pad(self::trunc($data->label_operation, 30), 30);
699  $Tab['codetva'] = str_repeat(' ', 2);
700 
701  // We need to keep the 10 lastest number of invoice doc_ref not the beginning part that is the unusefull almost same part
702  // $Tab['num_piece3'] = str_pad(self::trunc($data->piece_num, 10), 10);
703  $Tab['num_piece3'] = substr(self::trunc($data->doc_ref, 20), -10);
704  $Tab['filler4'] = str_repeat(' ', 73);
705 
706  $Tab['end_line'] = $end_line;
707 
708  print implode($Tab);
709  }
710  }
711 
722  public function exportWinfic(&$TData)
723  {
724  global $conf;
725 
726  $end_line = "\r\n";
727  $index = 1;
728 
729  //We should use dol_now function not time however this is wrong date to transfert in accounting
730  //$date_ecriture = dol_print_date(dol_now(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy
731  //$date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy
732 
733  // Warning ! When truncation is necessary, no dot because 3 dots = three characters. The columns are shifted
734 
735  foreach ($TData as $data) {
736  $code_compta = $data->numero_compte;
737  if (!empty($data->subledger_account)) {
738  $code_compta = $data->subledger_account;
739  }
740 
741  $Tab = array();
742  //$Tab['type_ligne'] = 'M';
743  $Tab['code_journal'] = str_pad(dol_trunc($data->code_journal, 2, 'right', 'UTF-8', 1), 2);
744 
745  //We use invoice date $data->doc_date not $date_ecriture which is the transfert date
746  //maybe we should set an option for customer who prefer to keep in accounting software the tranfert date instead of invoice date ?
747  //$Tab['date_ecriture'] = $date_ecriture;
748  $Tab['date_operation'] = dol_print_date($data->doc_date, '%d%m%Y');
749 
750  $Tab['folio'] = ' 1';
751 
752  $Tab['num_ecriture'] = str_pad(dol_trunc($index, 6, 'right', 'UTF-8', 1), 6, ' ', STR_PAD_LEFT);
753 
754  $Tab['jour_ecriture'] = dol_print_date($data->doc_date, '%d%m%y');
755 
756  $Tab['num_compte'] = str_pad(dol_trunc($code_compta, 6, 'right', 'UTF-8', 1), 6, '0');
757 
758  if ($data->sens == 'D') {
759  $Tab['montant_debit'] = str_pad(number_format($data->debit, 2, ',', ''), 13, ' ', STR_PAD_LEFT);
760 
761  $Tab['montant_crebit'] = str_pad(number_format(0, 2, ',', ''), 13, ' ', STR_PAD_LEFT);
762  } else {
763  $Tab['montant_debit'] = str_pad(number_format(0, 2, ',', ''), 13, ' ', STR_PAD_LEFT);
764 
765  $Tab['montant_crebit'] = str_pad(number_format($data->credit, 2, ',', ''), 13, ' ', STR_PAD_LEFT);
766  }
767 
768  $Tab['libelle_ecriture'] = str_pad(dol_trunc(dol_string_unaccent($data->doc_ref).' '.dol_string_unaccent($data->label_operation), 30, 'right', 'UTF-8', 1), 30);
769 
770  $Tab['lettrage'] = str_repeat(dol_trunc($data->lettering_code, 2, 'left', 'UTF-8', 1), 2);
771 
772  $Tab['code_piece'] = str_pad(dol_trunc($data->piece_num, 5, 'left', 'UTF-8', 1), 5, ' ', STR_PAD_LEFT);
773 
774  $Tab['code_stat'] = str_repeat(' ', 4);
775 
776  if (!empty($data->date_lim_reglement)) {
777  //$Tab['date_echeance'] = dol_print_date($data->date_lim_reglement, $conf->global->ACCOUNTING_EXPORT_DATE);
778  $Tab['date_echeance'] = dol_print_date($data->date_lim_reglement, '%d%m%Y');
779  } else {
780  $Tab['date_echeance'] = dol_print_date($data->doc_date, '%d%m%Y');
781  }
782 
783  $Tab['monnaie'] = '1';
784 
785  $Tab['filler'] = ' ';
786 
787  $Tab['ind_compteur'] = ' ';
788 
789  $Tab['quantite'] = '0,000000000';
790 
791  $Tab['code_pointage'] = str_repeat(' ', 2);
792 
793  $Tab['end_line'] = $end_line;
794 
795  print implode('|', $Tab);
796 
797  $index++;
798  }
799  }
800 
801 
808  public function exportEbp($objectLines)
809  {
810 
811  $separator = ',';
812  $end_line = "\n";
813 
814  foreach ($objectLines as $line) {
815  $date = dol_print_date($line->doc_date, '%d%m%Y');
816 
817  print $line->id.$separator;
818  print $date.$separator;
819  print $line->code_journal.$separator;
820  if (empty($line->subledger_account)) {
821  print $line->numero_compte.$separator;
822  } else {
823  print $line->subledger_account.$separator;
824  }
825  //print substr(length_accountg($line->numero_compte), 0, 2) . $separator;
826  print '"'.dol_trunc($line->label_operation, 40, 'right', 'UTF-8', 1).'"'.$separator;
827  print '"'.dol_trunc($line->piece_num, 15, 'right', 'UTF-8', 1).'"'.$separator;
828  print price2num(abs($line->debit - $line->credit)).$separator;
829  print $line->sens.$separator;
830  print $date.$separator;
831  //print 'EUR';
832  print $end_line;
833  }
834  }
835 
836 
843  public function exportAgiris($objectLines)
844  {
845 
846  $separator = ';';
847  $end_line = "\n";
848 
849  foreach ($objectLines as $line) {
850  $date = dol_print_date($line->doc_date, '%d%m%Y');
851 
852  print $line->piece_num.$separator;
853  print self::toAnsi($line->label_operation).$separator;
854  print $date.$separator;
855  print self::toAnsi($line->label_operation).$separator;
856 
857  if (empty($line->subledger_account)) {
858  print length_accountg($line->numero_compte).$separator;
859  print self::toAnsi($line->label_compte).$separator;
860  } else {
861  print length_accounta($line->subledger_account).$separator;
862  print self::toAnsi($line->subledger_label).$separator;
863  }
864 
865  print self::toAnsi($line->doc_ref).$separator;
866  print price($line->debit).$separator;
867  print price($line->credit).$separator;
868  print price(abs($line->debit - $line->credit)).$separator;
869  print $line->sens.$separator;
870  print $line->lettering_code.$separator;
871  print $line->code_journal;
872  print $end_line;
873  }
874  }
875 
882  public function exportOpenConcerto($objectLines)
883  {
884 
885  $separator = ';';
886  $end_line = "\n";
887 
888  foreach ($objectLines as $line) {
889  $date = dol_print_date($line->doc_date, '%d/%m/%Y');
890 
891  print $date.$separator;
892  print $line->code_journal.$separator;
893  if (empty($line->subledger_account)) {
894  print length_accountg($line->numero_compte).$separator;
895  } else {
896  print length_accounta($line->subledger_account).$separator;
897  }
898  print $line->doc_ref.$separator;
899  print $line->label_operation.$separator;
900  print price($line->debit).$separator;
901  print price($line->credit).$separator;
902 
903  print $end_line;
904  }
905  }
906 
913  public function exportConfigurable($objectLines)
914  {
915  global $conf;
916 
917  $separator = $this->separator;
918 
919  foreach ($objectLines as $line) {
920  $tab = array();
921  // export configurable
922  $date = dol_print_date($line->doc_date, $conf->global->ACCOUNTING_EXPORT_DATE);
923  $tab[] = $line->piece_num;
924  $tab[] = $date;
925  $tab[] = $line->doc_ref;
926  $tab[] = preg_match('/'.$separator.'/', $line->label_operation) ? "'".$line->label_operation."'" : $line->label_operation;
927  $tab[] = length_accountg($line->numero_compte);
928  $tab[] = length_accounta($line->subledger_account);
929  $tab[] = price2num($line->debit);
930  $tab[] = price2num($line->credit);
931  $tab[] = price2num($line->debit - $line->credit);
932  $tab[] = $line->code_journal;
933 
934  print implode($separator, $tab).$this->end_line;
935  }
936  }
937 
944  public function exportFEC($objectLines)
945  {
946  global $langs;
947 
948  $separator = "\t";
949  $end_line = "\r\n";
950 
951  print "JournalCode".$separator;
952  print "JournalLib".$separator;
953  print "EcritureNum".$separator;
954  print "EcritureDate".$separator;
955  print "CompteNum".$separator;
956  print "CompteLib".$separator;
957  print "CompAuxNum".$separator;
958  print "CompAuxLib".$separator;
959  print "PieceRef".$separator;
960  print "PieceDate".$separator;
961  print "EcritureLib".$separator;
962  print "Debit".$separator;
963  print "Credit".$separator;
964  print "EcritureLet".$separator;
965  print "DateLet".$separator;
966  print "ValidDate".$separator;
967  print "Montantdevise".$separator;
968  print "Idevise".$separator;
969  print "DateLimitReglmt".$separator;
970  print "NumFacture";
971  print $end_line;
972 
973  foreach ($objectLines as $line) {
974  if ($line->debit == 0 && $line->credit == 0) {
975  //unset($array[$line]);
976  } else {
977  $date_creation = dol_print_date($line->date_creation, '%Y%m%d');
978  $date_document = dol_print_date($line->doc_date, '%Y%m%d');
979  $date_lettering = dol_print_date($line->date_lettering, '%Y%m%d');
980  $date_validation = dol_print_date($line->date_validation, '%Y%m%d');
981  $date_limit_payment = dol_print_date($line->date_lim_reglement, '%Y%m%d');
982 
983  $refInvoice = '';
984  if ($line->doc_type == 'customer_invoice') {
985  // Customer invoice
986  require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
987  $invoice = new Facture($this->db);
988  $invoice->fetch($line->fk_doc);
989 
990  $refInvoice = $invoice->ref;
991  } elseif ($line->doc_type == 'supplier_invoice') {
992  // Supplier invoice
993  require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
994  $invoice = new FactureFournisseur($this->db);
995  $invoice->fetch($line->fk_doc);
996 
997  $refInvoice = $invoice->ref_supplier;
998  }
999 
1000  // FEC:JournalCode
1001  print $line->code_journal . $separator;
1002 
1003  // FEC:JournalLib
1004  print dol_string_unaccent($langs->transnoentities($line->journal_label)) . $separator;
1005 
1006  // FEC:EcritureNum
1007  print $line->piece_num . $separator;
1008 
1009  // FEC:EcritureDate
1010  print $date_document . $separator;
1011 
1012  // FEC:CompteNum
1013  print length_accountg($line->numero_compte) . $separator;
1014 
1015  // FEC:CompteLib
1016  print dol_string_unaccent($line->label_compte) . $separator;
1017 
1018  // FEC:CompAuxNum
1019  print length_accounta($line->subledger_account) . $separator;
1020 
1021  // FEC:CompAuxLib
1022  print dol_string_unaccent($line->subledger_label) . $separator;
1023 
1024  // FEC:PieceRef
1025  print $line->doc_ref . $separator;
1026 
1027  // FEC:PieceDate
1028  print dol_string_unaccent($date_creation) . $separator;
1029 
1030  // FEC:EcritureLib
1031  // Clean label operation to prevent problem on export with tab separator & other character
1032  $line->label_operation = str_replace(array("\t", "\n", "\r"), " ", $line->label_operation);
1033  print dol_string_unaccent($line->label_operation) . $separator;
1034 
1035  // FEC:Debit
1036  print price2fec($line->debit) . $separator;
1037 
1038  // FEC:Credit
1039  print price2fec($line->credit) . $separator;
1040 
1041  // FEC:EcritureLet
1042  print $line->lettering_code . $separator;
1043 
1044  // FEC:DateLet
1045  print $date_lettering . $separator;
1046 
1047  // FEC:ValidDate
1048  print $date_validation . $separator;
1049 
1050  // FEC:Montantdevise
1051  print $line->multicurrency_amount . $separator;
1052 
1053  // FEC:Idevise
1054  print $line->multicurrency_code . $separator;
1055 
1056  // FEC_suppl:DateLimitReglmt
1057  print $date_limit_payment . $separator;
1058 
1059  // FEC_suppl:NumFacture
1060  // Clean ref invoice to prevent problem on export with tab separator & other character
1061  $refInvoice = str_replace(array("\t", "\n", "\r"), " ", $refInvoice);
1062  print dol_trunc(self::toAnsi($refInvoice), 17, 'right', 'UTF-8', 1);
1063 
1064  print $end_line;
1065  }
1066  }
1067  }
1068 
1075  public function exportFEC2($objectLines)
1076  {
1077  global $langs;
1078 
1079  $separator = "\t";
1080  $end_line = "\r\n";
1081 
1082  print "JournalCode".$separator;
1083  print "JournalLib".$separator;
1084  print "EcritureNum".$separator;
1085  print "EcritureDate".$separator;
1086  print "CompteNum".$separator;
1087  print "CompteLib".$separator;
1088  print "CompAuxNum".$separator;
1089  print "CompAuxLib".$separator;
1090  print "PieceRef".$separator;
1091  print "PieceDate".$separator;
1092  print "EcritureLib".$separator;
1093  print "Debit".$separator;
1094  print "Credit".$separator;
1095  print "EcritureLet".$separator;
1096  print "DateLet".$separator;
1097  print "ValidDate".$separator;
1098  print "Montantdevise".$separator;
1099  print "Idevise".$separator;
1100  print "DateLimitReglmt".$separator;
1101  print "NumFacture";
1102  print $end_line;
1103 
1104  foreach ($objectLines as $line) {
1105  if ($line->debit == 0 && $line->credit == 0) {
1106  //unset($array[$line]);
1107  } else {
1108  $date_creation = dol_print_date($line->date_creation, '%Y%m%d');
1109  $date_document = dol_print_date($line->doc_date, '%Y%m%d');
1110  $date_lettering = dol_print_date($line->date_lettering, '%Y%m%d');
1111  $date_validation = dol_print_date($line->date_validation, '%Y%m%d');
1112  $date_limit_payment = dol_print_date($line->date_lim_reglement, '%Y%m%d');
1113 
1114  $refInvoice = '';
1115  if ($line->doc_type == 'customer_invoice') {
1116  // Customer invoice
1117  require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1118  $invoice = new Facture($this->db);
1119  $invoice->fetch($line->fk_doc);
1120 
1121  $refInvoice = $invoice->ref;
1122  } elseif ($line->doc_type == 'supplier_invoice') {
1123  // Supplier invoice
1124  require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1125  $invoice = new FactureFournisseur($this->db);
1126  $invoice->fetch($line->fk_doc);
1127 
1128  $refInvoice = $invoice->ref_supplier;
1129  }
1130 
1131  // FEC:JournalCode
1132  print $line->code_journal . $separator;
1133 
1134  // FEC:JournalLib
1135  print dol_string_unaccent($langs->transnoentities($line->journal_label)) . $separator;
1136 
1137  // FEC:EcritureNum
1138  print $line->piece_num . $separator;
1139 
1140  // FEC:EcritureDate
1141  print $date_creation . $separator;
1142 
1143  // FEC:CompteNum
1144  print length_accountg($line->numero_compte) . $separator;
1145 
1146  // FEC:CompteLib
1147  print dol_string_unaccent($line->label_compte) . $separator;
1148 
1149  // FEC:CompAuxNum
1150  print length_accounta($line->subledger_account) . $separator;
1151 
1152  // FEC:CompAuxLib
1153  print dol_string_unaccent($line->subledger_label) . $separator;
1154 
1155  // FEC:PieceRef
1156  print $line->doc_ref . $separator;
1157 
1158  // FEC:PieceDate
1159  print $date_document . $separator;
1160 
1161  // FEC:EcritureLib
1162  // Clean label operation to prevent problem on export with tab separator & other character
1163  $line->label_operation = str_replace(array("\t", "\n", "\r"), " ", $line->label_operation);
1164  print dol_string_unaccent($line->label_operation) . $separator;
1165 
1166  // FEC:Debit
1167  print price2fec($line->debit) . $separator;
1168 
1169  // FEC:Credit
1170  print price2fec($line->credit) . $separator;
1171 
1172  // FEC:EcritureLet
1173  print $line->lettering_code . $separator;
1174 
1175  // FEC:DateLet
1176  print $date_lettering . $separator;
1177 
1178  // FEC:ValidDate
1179  print $date_validation . $separator;
1180 
1181  // FEC:Montantdevise
1182  print $line->multicurrency_amount . $separator;
1183 
1184  // FEC:Idevise
1185  print $line->multicurrency_code . $separator;
1186 
1187  // FEC_suppl:DateLimitReglmt
1188  print $date_limit_payment . $separator;
1189 
1190  // FEC_suppl:NumFacture
1191  // Clean ref invoice to prevent problem on export with tab separator & other character
1192  $refInvoice = str_replace(array("\t", "\n", "\r"), " ", $refInvoice);
1193  print dol_trunc(self::toAnsi($refInvoice), 17, 'right', 'UTF-8', 1);
1194 
1195 
1196  print $end_line;
1197  }
1198  }
1199  }
1200 
1211  public function exportSAGE50SWISS($objectLines)
1212  {
1213  // SAGE50SWISS
1214  $this->separator = ',';
1215  $this->end_line = "\r\n";
1216 
1217  // Print header line
1218  print "Blg,Datum,Kto,S/H,Grp,GKto,SId,SIdx,KIdx,BTyp,MTyp,Code,Netto,Steuer,FW-Betrag,Tx1,Tx2,PkKey,OpId,Flag";
1219  print $this->end_line;
1220  $thisPieceNum = "";
1221  $thisPieceAccountNr = "";
1222  $aSize = count($objectLines);
1223  foreach ($objectLines as $aIndex => $line) {
1224  $sammelBuchung = false;
1225  if ($aIndex - 2 >= 0 && $objectLines[$aIndex - 2]->piece_num == $line->piece_num) {
1226  $sammelBuchung = true;
1227  } elseif ($aIndex + 2 < $aSize && $objectLines[$aIndex + 2]->piece_num == $line->piece_num) {
1228  $sammelBuchung = true;
1229  } elseif ($aIndex + 1 < $aSize
1230  && $objectLines[$aIndex + 1]->piece_num == $line->piece_num
1231  && $aIndex - 1 < $aSize
1232  && $objectLines[$aIndex - 1]->piece_num == $line->piece_num
1233  ) {
1234  $sammelBuchung = true;
1235  }
1236 
1237  //Blg
1238  print $line->piece_num.$this->separator;
1239 
1240  // Datum
1241  $date = dol_print_date($line->doc_date, '%d.%m.%Y');
1242  print $date.$this->separator;
1243 
1244  // Kto
1245  print length_accountg($line->numero_compte).$this->separator;
1246  // S/H
1247  if ($line->sens == 'D') {
1248  print 'S'.$this->separator;
1249  } else {
1250  print 'H'.$this->separator;
1251  }
1252  //Grp
1253  print self::trunc($line->code_journal, 1).$this->separator;
1254  // GKto
1255  if (empty($line->code_tiers)) {
1256  if ($line->piece_num == $thisPieceNum) {
1257  print length_accounta($thisPieceAccountNr).$this->separator;
1258  } else {
1259  print "div".$this->separator;
1260  }
1261  } else {
1262  print length_accounta($line->code_tiers).$this->separator;
1263  }
1264  //SId
1265  print $this->separator;
1266  //SIdx
1267  print "0".$this->separator;
1268  //KIdx
1269  print "0".$this->separator;
1270  //BTyp
1271  print "0".$this->separator;
1272 
1273  //MTyp 1=Fibu Einzelbuchung 2=Sammebuchung
1274  if ($sammelBuchung) {
1275  print "2".$this->separator;
1276  } else {
1277  print "1".$this->separator;
1278  }
1279  // Code
1280  print '""'.$this->separator;
1281  // Netto
1282  print abs($line->debit - $line->credit).$this->separator;
1283  // Steuer
1284  print "0.00".$this->separator;
1285  // FW-Betrag
1286  print "0.00".$this->separator;
1287  // Tx1
1288  $line1 = self::toAnsi($line->label_compte, 29);
1289  if ($line1 == "LIQ" || $line1 == "LIQ Beleg ok" || strlen($line1) <= 3) {
1290  $line1 = "";
1291  }
1292  $line2 = self::toAnsi($line->doc_ref, 29);
1293  if (strlen($line1) == 0) {
1294  $line1 = $line2;
1295  $line2 = "";
1296  }
1297  if (strlen($line1) > 0 && strlen($line2) > 0 && (strlen($line1) + strlen($line2)) < 27) {
1298  $line1 = $line1.' / '.$line2;
1299  $line2 = "";
1300  }
1301 
1302  print '"'.self::toAnsi($line1).'"'.$this->separator;
1303  // Tx2
1304  print '"'.self::toAnsi($line2).'"'.$this->separator;
1305  //PkKey
1306  print "0".$this->separator;
1307  //OpId
1308  print $this->separator;
1309 
1310  // Flag
1311  print "0";
1312 
1313  print $this->end_line;
1314 
1315  if ($line->piece_num !== $thisPieceNum) {
1316  $thisPieceNum = $line->piece_num;
1317  $thisPieceAccountNr = $line->numero_compte;
1318  }
1319  }
1320  }
1321 
1330  public function exportLDCompta($objectLines)
1331  {
1332 
1333  $separator = ';';
1334  $end_line = "\r\n";
1335 
1336  foreach ($objectLines as $line) {
1337  $date_document = dol_print_date($line->doc_date, '%Y%m%d');
1338  $date_creation = dol_print_date($line->date_creation, '%Y%m%d');
1339  $date_lim_reglement = dol_print_date($line->date_lim_reglement, '%Y%m%d');
1340 
1341  // TYPE
1342  $type_enregistrement = 'E'; // For write movement
1343  print $type_enregistrement.$separator;
1344  // JNAL
1345  print substr($line->code_journal, 0, 2).$separator;
1346  // NECR
1347  print $line->id.$separator;
1348  // NPIE
1349  print $line->piece_num.$separator;
1350  // DATP
1351  print $date_document.$separator;
1352  // LIBE
1353  print $line->label_operation.$separator;
1354  // DATH
1355  print $date_lim_reglement.$separator;
1356  // CNPI
1357  if ($line->doc_type == 'supplier_invoice') {
1358  if (($line->debit - $line->credit) > 0) {
1359  $nature_piece = 'AF';
1360  } else {
1361  $nature_piece = 'FF';
1362  }
1363  } elseif ($line->doc_type == 'customer_invoice') {
1364  if (($line->debit - $line->credit) < 0) {
1365  $nature_piece = 'AC';
1366  } else {
1367  $nature_piece = 'FC';
1368  }
1369  } else {
1370  $nature_piece = '';
1371  }
1372  print $nature_piece.$separator;
1373  // RACI
1374  // if (! empty($line->subledger_account)) {
1375  // if ($line->doc_type == 'supplier_invoice') {
1376  // $racine_subledger_account = '40';
1377  // } elseif ($line->doc_type == 'customer_invoice') {
1378  // $racine_subledger_account = '41';
1379  // } else {
1380  // $racine_subledger_account = '';
1381  // }
1382  // } else {
1383  $racine_subledger_account = ''; // for records of type E leave this field blank
1384  // }
1385 
1386  print $racine_subledger_account.$separator; // deprecated CPTG & CPTA use instead
1387  // MONT
1388  print price(abs($line->debit - $line->credit), 0, '', 1, 2, 2).$separator;
1389  // CODC
1390  print $line->sens.$separator;
1391  // CPTG
1392  print length_accountg($line->numero_compte).$separator;
1393  // DATE
1394  print $date_creation.$separator;
1395  // CLET
1396  print $line->lettering_code.$separator;
1397  // DATL
1398  print $line->date_lettering.$separator;
1399  // CPTA
1400  if (!empty($line->subledger_account)) {
1401  print length_accounta($line->subledger_account).$separator;
1402  } else {
1403  print $separator;
1404  }
1405  // CNAT
1406  if ($line->doc_type == 'supplier_invoice' && !empty($line->subledger_account)) {
1407  print 'F'.$separator;
1408  } elseif ($line->doc_type == 'customer_invoice' && !empty($line->subledger_account)) {
1409  print 'C'.$separator;
1410  } else {
1411  print $separator;
1412  }
1413  // SECT
1414  print $separator;
1415  // CTRE
1416  print $separator;
1417  // NORL
1418  print $separator;
1419  // DATV
1420  print $separator;
1421  // REFD
1422  print $line->doc_ref.$separator;
1423  // CODH
1424  print $separator;
1425  // NSEQ
1426  print $separator;
1427  // MTDV
1428  print '0'.$separator;
1429  // CODV
1430  print $separator;
1431  // TXDV
1432  print '0'.$separator;
1433  // MOPM
1434  print $separator;
1435  // BONP
1436  print $separator;
1437  // BQAF
1438  print $separator;
1439  // ECES
1440  print $separator;
1441  // TXTL
1442  print $separator;
1443  // ECRM
1444  print $separator;
1445  // DATK
1446  print $separator;
1447  // HEUK
1448  print $separator;
1449 
1450  print $end_line;
1451  }
1452  }
1453 
1464  public function exportLDCompta10($objectLines)
1465  {
1466  require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
1467 
1468  $separator = ';';
1469  $end_line = "\r\n";
1470  $last_codeinvoice = '';
1471 
1472  foreach ($objectLines as $line) {
1473  // TYPE C
1474  if ($last_codeinvoice != $line->doc_ref) {
1475  //recherche societe en fonction de son code client
1476  $sql = "SELECT code_client, fk_forme_juridique, nom, address, zip, town, fk_pays, phone, siret FROM ".MAIN_DB_PREFIX."societe";
1477  $sql .= " WHERE code_client = '".$this->db->escape($line->thirdparty_code)."'";
1478  $resql = $this->db->query($sql);
1479 
1480  if ($resql && $this->db->num_rows($resql) > 0) {
1481  $soc = $this->db->fetch_object($resql);
1482 
1483  $address = array('', '', '');
1484  if (strpos($soc->address, "\n") !== false) {
1485  $address = explode("\n", $soc->address);
1486  if (is_array($address) && count($address) > 0) {
1487  foreach ($address as $key => $data) {
1488  $address[$key] = str_replace(array("\t", "\n", "\r"), "", $data);
1489  $address[$key] = dol_trunc($address[$key], 40, 'right', 'UTF-8', 1);
1490  }
1491  }
1492  } else {
1493  $address[0] = substr(str_replace(array("\t", "\r"), " ", $soc->address), 0, 40);
1494  $address[1] = substr(str_replace(array("\t", "\r"), " ", $soc->address), 41, 40);
1495  $address[2] = substr(str_replace(array("\t", "\r"), " ", $soc->address), 82, 40);
1496  }
1497 
1498  $type_enregistrement = 'C';
1499  //TYPE
1500  print $type_enregistrement.$separator;
1501  //NOCL
1502  print $soc->code_client.$separator;
1503  //NMCM
1504  print $separator;
1505  //LIBI
1506  print $separator;
1507  //TITR
1508  print $separator;
1509  //RSSO
1510  print $soc->nom.$separator;
1511  //CAD1
1512  print $address[0].$separator;
1513  //CAD2
1514  print $address[1].$separator;
1515  //CAD3
1516  print $address[2].$separator;
1517  //COPO
1518  print $soc->zip.$separator;
1519  //BUDI
1520  print substr($soc->town, 0, 40).$separator;
1521  //CPAY
1522  print $separator;
1523  //PAYS
1524  print substr(getCountry($soc->fk_pays), 0, 40).$separator;
1525  //NTEL
1526  print $soc->phone.$separator;
1527  //TLEX
1528  print $separator;
1529  //TLPO
1530  print $separator;
1531  //TLCY
1532  print $separator;
1533  //NINT
1534  print $separator;
1535  //COMM
1536  print $separator;
1537  //SIRE
1538  print str_replace(" ", "", $soc->siret).$separator;
1539  //RIBP
1540  print $separator;
1541  //DOBQ
1542  print $separator;
1543  //IBBQ
1544  print $separator;
1545  //COBQ
1546  print $separator;
1547  //GUBQ
1548  print $separator;
1549  //CPBQ
1550  print $separator;
1551  //CLBQ
1552  print $separator;
1553  //BIBQ
1554  print $separator;
1555  //MOPM
1556  print $separator;
1557  //DJPM
1558  print $separator;
1559  //DMPM
1560  print $separator;
1561  //REFM
1562  print $separator;
1563  //SLVA
1564  print $separator;
1565  //PLCR
1566  print $separator;
1567  //ECFI
1568  print $separator;
1569  //CREP
1570  print $separator;
1571  //NREP
1572  print $separator;
1573  //TREP
1574  print $separator;
1575  //MREP
1576  print $separator;
1577  //GRRE
1578  print $separator;
1579  //LTTA
1580  print $separator;
1581  //CACT
1582  print $separator;
1583  //CODV
1584  print $separator;
1585  //GRTR
1586  print $separator;
1587  //NOFP
1588  print $separator;
1589  //BQAF
1590  print $separator;
1591  //BONP
1592  print $separator;
1593  //CESC
1594  print $separator;
1595 
1596  print $end_line;
1597  }
1598  }
1599 
1600  $date_document = dol_print_date($line->doc_date, '%Y%m%d');
1601  $date_creation = dol_print_date($line->date_creation, '%Y%m%d');
1602  $date_lim_reglement = dol_print_date($line->date_lim_reglement, '%Y%m%d');
1603 
1604  // TYPE E
1605  $type_enregistrement = 'E'; // For write movement
1606  print $type_enregistrement.$separator;
1607  // JNAL
1608  print substr($line->code_journal, 0, 2).$separator;
1609  // NECR
1610  print $line->id.$separator;
1611  // NPIE
1612  print $line->piece_num.$separator;
1613  // DATP
1614  print $date_document.$separator;
1615  // LIBE
1616  print dol_trunc($line->label_operation, 25, 'right', 'UTF-8', 1).$separator;
1617  // DATH
1618  print $date_lim_reglement.$separator;
1619  // CNPI
1620  if ($line->doc_type == 'supplier_invoice') {
1621  if (($line->amount) < 0) { // Currently, only the sign of amount allows to know the type of invoice (standard or credit note). Other solution is to analyse debit/credit/role of account. TODO Add column doc_type_long or make amount mandatory with rule on sign.
1622  $nature_piece = 'AF';
1623  } else {
1624  $nature_piece = 'FF';
1625  }
1626  } elseif ($line->doc_type == 'customer_invoice') {
1627  if (($line->amount) < 0) {
1628  $nature_piece = 'AC'; // Currently, only the sign of amount allows to know the type of invoice (standard or credit note). Other solution is to analyse debit/credit/role of account. TODO Add column doc_type_long or make amount mandatory with rule on sign.
1629  } else {
1630  $nature_piece = 'FC';
1631  }
1632  } else {
1633  $nature_piece = '';
1634  }
1635  print $nature_piece.$separator;
1636  // RACI
1637  // if (! empty($line->subledger_account)) {
1638  // if ($line->doc_type == 'supplier_invoice') {
1639  // $racine_subledger_account = '40';
1640  // } elseif ($line->doc_type == 'customer_invoice') {
1641  // $racine_subledger_account = '41';
1642  // } else {
1643  // $racine_subledger_account = '';
1644  // }
1645  // } else {
1646  $racine_subledger_account = ''; // for records of type E leave this field blank
1647  // }
1648 
1649  print $racine_subledger_account.$separator; // deprecated CPTG & CPTA use instead
1650  // MONT
1651  print price(abs($line->debit - $line->credit), 0, '', 1, 2).$separator;
1652  // CODC
1653  print $line->sens.$separator;
1654  // CPTG
1655  print length_accountg($line->numero_compte).$separator;
1656  // DATE
1657  print $date_document.$separator;
1658  // CLET
1659  print $line->lettering_code.$separator;
1660  // DATL
1661  print $line->date_lettering.$separator;
1662  // CPTA
1663  if (!empty($line->subledger_account)) {
1664  print length_accounta($line->subledger_account).$separator;
1665  } else {
1666  print $separator;
1667  }
1668  // CNAT
1669  if ($line->doc_type == 'supplier_invoice' && !empty($line->subledger_account)) {
1670  print 'F'.$separator;
1671  } elseif ($line->doc_type == 'customer_invoice' && !empty($line->subledger_account)) {
1672  print 'C'.$separator;
1673  } else {
1674  print $separator;
1675  }
1676  // CTRE
1677  print $separator;
1678  // NORL
1679  print $separator;
1680  // DATV
1681  print $separator;
1682  // REFD
1683  print $line->doc_ref.$separator;
1684  // NECA
1685  print '0'.$separator;
1686  // CSEC
1687  print $separator;
1688  // CAFF
1689  print $separator;
1690  // CDES
1691  print $separator;
1692  // QTUE
1693  print $separator;
1694  // MTDV
1695  print '0'.$separator;
1696  // CODV
1697  print $separator;
1698  // TXDV
1699  print '0'.$separator;
1700  // MOPM
1701  print $separator;
1702  // BONP
1703  print $separator;
1704  // BQAF
1705  print $separator;
1706  // ECES
1707  print $separator;
1708  // TXTL
1709  print $separator;
1710  // ECRM
1711  print $separator;
1712  // DATK
1713  print $separator;
1714  // HEUK
1715  print $separator;
1716 
1717  print $end_line;
1718 
1719  $last_codeinvoice = $line->doc_ref;
1720  }
1721  }
1722 
1729  public function exportCharlemagne($objectLines)
1730  {
1731  global $langs;
1732  $langs->load('compta');
1733 
1734  $separator = "\t";
1735  $end_line = "\n";
1736 
1737  /*
1738  * Charlemagne export need header
1739  */
1740  print $langs->transnoentitiesnoconv('Date').$separator;
1741  print self::trunc($langs->transnoentitiesnoconv('Journal'), 6).$separator;
1742  print self::trunc($langs->transnoentitiesnoconv('Account'), 15).$separator;
1743  print self::trunc($langs->transnoentitiesnoconv('LabelAccount'), 60).$separator;
1744  print self::trunc($langs->transnoentitiesnoconv('Piece'), 20).$separator;
1745  print self::trunc($langs->transnoentitiesnoconv('LabelOperation'), 60).$separator;
1746  print $langs->transnoentitiesnoconv('Amount').$separator;
1747  print 'S'.$separator;
1748  print self::trunc($langs->transnoentitiesnoconv('Analytic').' 1', 15).$separator;
1749  print self::trunc($langs->transnoentitiesnoconv('AnalyticLabel').' 1', 60).$separator;
1750  print self::trunc($langs->transnoentitiesnoconv('Analytic').' 2', 15).$separator;
1751  print self::trunc($langs->transnoentitiesnoconv('AnalyticLabel').' 2', 60).$separator;
1752  print self::trunc($langs->transnoentitiesnoconv('Analytic').' 3', 15).$separator;
1753  print self::trunc($langs->transnoentitiesnoconv('AnalyticLabel').' 3', 60).$separator;
1754  print $end_line;
1755 
1756  foreach ($objectLines as $line) {
1757  $date = dol_print_date($line->doc_date, '%Y%m%d');
1758  print $date.$separator; //Date
1759 
1760  print self::trunc($line->code_journal, 6).$separator; //Journal code
1761 
1762  if (!empty($line->subledger_account)) {
1763  $account = $line->subledger_account;
1764  } else {
1765  $account = $line->numero_compte;
1766  }
1767  print self::trunc($account, 15).$separator; //Account number
1768 
1769  print self::trunc($line->label_compte, 60).$separator; //Account label
1770  print self::trunc($line->doc_ref, 20).$separator; //Piece
1771  // Clean label operation to prevent problem on export with tab separator & other character
1772  $line->label_operation = str_replace(array("\t", "\n", "\r"), " ", $line->label_operation);
1773  print self::trunc($line->label_operation, 60).$separator; //Operation label
1774  print price(abs($line->debit - $line->credit)).$separator; //Amount
1775  print $line->sens.$separator; //Direction
1776  print $separator; //Analytic
1777  print $separator; //Analytic
1778  print $separator; //Analytic
1779  print $separator; //Analytic
1780  print $separator; //Analytic
1781  print $separator; //Analytic
1782  print $end_line;
1783  }
1784  }
1785 
1793  public function exportGestimumV3($objectLines)
1794  {
1795  global $langs;
1796 
1797  $this->separator = ',';
1798 
1799  $invoices_infos = array();
1800  $supplier_invoices_infos = array();
1801  foreach ($objectLines as $line) {
1802  if ($line->debit == 0 && $line->credit == 0) {
1803  //unset($array[$line]);
1804  } else {
1805  $date = dol_print_date($line->doc_date, '%d/%m/%Y');
1806 
1807  $invoice_ref = $line->doc_ref;
1808  $company_name = "";
1809 
1810  if (($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice') && $line->fk_doc > 0) {
1811  if (($line->doc_type == 'customer_invoice' && !isset($invoices_infos[$line->fk_doc])) ||
1812  ($line->doc_type == 'supplier_invoice' && !isset($supplier_invoices_infos[$line->fk_doc]))) {
1813  if ($line->doc_type == 'customer_invoice') {
1814  // Get new customer invoice ref and company name
1815  $sql = 'SELECT f.ref, s.nom FROM ' . MAIN_DB_PREFIX . 'facture as f';
1816  $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'societe AS s ON f.fk_soc = s.rowid';
1817  $sql .= ' WHERE f.rowid = '.((int) $line->fk_doc);
1818  $resql = $this->db->query($sql);
1819  if ($resql) {
1820  if ($obj = $this->db->fetch_object($resql)) {
1821  // Save invoice infos
1822  $invoices_infos[$line->fk_doc] = array('ref' => $obj->ref, 'company_name' => $obj->nom);
1823  $invoice_ref = $obj->ref;
1824  $company_name = $obj->nom;
1825  }
1826  }
1827  } else {
1828  // Get new supplier invoice ref and company name
1829  $sql = 'SELECT ff.ref, s.nom FROM ' . MAIN_DB_PREFIX . 'facture_fourn as ff';
1830  $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'societe AS s ON ff.fk_soc = s.rowid';
1831  $sql .= ' WHERE ff.rowid = '.((int) $line->fk_doc);
1832  $resql = $this->db->query($sql);
1833  if ($resql) {
1834  if ($obj = $this->db->fetch_object($resql)) {
1835  // Save invoice infos
1836  $supplier_invoices_infos[$line->fk_doc] = array('ref' => $obj->ref, 'company_name' => $obj->nom);
1837  $invoice_ref = $obj->ref;
1838  $company_name = $obj->nom;
1839  }
1840  }
1841  }
1842  } elseif ($line->doc_type == 'customer_invoice') {
1843  // Retrieve invoice infos
1844  $invoice_ref = $invoices_infos[$line->fk_doc]['ref'];
1845  $company_name = $invoices_infos[$line->fk_doc]['company_name'];
1846  } else {
1847  // Retrieve invoice infos
1848  $invoice_ref = $supplier_invoices_infos[$line->fk_doc]['ref'];
1849  $company_name = $supplier_invoices_infos[$line->fk_doc]['company_name'];
1850  }
1851  }
1852 
1853  print $line->id . $this->separator;
1854  print $date . $this->separator;
1855  print substr($line->code_journal, 0, 4) . $this->separator;
1856 
1857  if ((substr($line->numero_compte, 0, 3) == '411') || (substr($line->numero_compte, 0, 3) == '401')) {
1858  print length_accountg($line->subledger_account) . $this->separator;
1859  } else {
1860  print substr(length_accountg($line->numero_compte), 0, 15) . $this->separator;
1861  }
1862  //Libellé Auto
1863  print $this->separator;
1864  //print '"'.dol_trunc(str_replace('"', '', $line->label_operation),40,'right','UTF-8',1).'"' . $this->separator;
1865  //Libellé manuel
1866  print dol_trunc(str_replace('"', '', $invoice_ref . (!empty($company_name) ? ' - ' : '') . $company_name), 40, 'right', 'UTF-8', 1) . $this->separator;
1867  //Numéro de pièce
1868  print dol_trunc(str_replace('"', '', $line->piece_num), 10, 'right', 'UTF-8', 1) . $this->separator;
1869  //Devise
1870  print 'EUR' . $this->separator;
1871  //Amount
1872  print price2num(abs($line->debit - $line->credit)) . $this->separator;
1873  //Sens
1874  print $line->sens . $this->separator;
1875  //Code lettrage
1876  print $this->separator;
1877  //Date Echéance
1878  print $date;
1879  print $this->end_line;
1880  }
1881  }
1882  }
1883 
1891  public function exportGestimumV5($objectLines)
1892  {
1893 
1894  $this->separator = ',';
1895 
1896  foreach ($objectLines as $line) {
1897  if ($line->debit == 0 && $line->credit == 0) {
1898  //unset($array[$line]);
1899  } else {
1900  $date = dol_print_date($line->doc_date, '%d%m%Y');
1901 
1902  print $line->id . $this->separator;
1903  print $date . $this->separator;
1904  print substr($line->code_journal, 0, 4) . $this->separator;
1905  if ((substr($line->numero_compte, 0, 3) == '411') || (substr($line->numero_compte, 0, 3) == '401')) { // TODO No hard code value
1906  print length_accountg($line->subledger_account) . $this->separator;
1907  } else {
1908  print substr(length_accountg($line->numero_compte), 0, 15) . $this->separator;
1909  }
1910  print $this->separator;
1911  //print '"'.dol_trunc(str_replace('"', '', $line->label_operation),40,'right','UTF-8',1).'"' . $this->separator;
1912  print '"' . dol_trunc(str_replace('"', '', $line->doc_ref), 40, 'right', 'UTF-8', 1) . '"' . $this->separator;
1913  print '"' . dol_trunc(str_replace('"', '', $line->piece_num), 10, 'right', 'UTF-8', 1) . '"' . $this->separator;
1914  print price2num(abs($line->debit - $line->credit)) . $this->separator;
1915  print $line->sens . $this->separator;
1916  print $date . $this->separator;
1917  print $this->separator;
1918  print $this->separator;
1919  print 'EUR';
1920  print $this->end_line;
1921  }
1922  }
1923  }
1924 
1934  public function exportiSuiteExpert($objectLines)
1935  {
1936  $this->separator = ';';
1937  $this->end_line = "\r\n";
1938 
1939 
1940  foreach ($objectLines as $line) {
1941  $tab = array();
1942 
1943  $date = dol_print_date($line->doc_date, '%d/%m/%Y');
1944 
1945  $tab[] = $line->piece_num;
1946  $tab[] = $date;
1947  $tab[] = substr($date, 6, 4);
1948  $tab[] = substr($date, 3, 2);
1949  $tab[] = substr($date, 0, 2);
1950  $tab[] = $line->doc_ref;
1951  //Conversion de chaine UTF8 en Latin9
1952  $tab[] = mb_convert_encoding(str_replace(' - Compte auxiliaire', '', $line->label_operation), "Windows-1252", 'UTF-8');
1953 
1954  //Calcul de la longueur des numéros de comptes
1955  $taille_numero = strlen(length_accountg($line->numero_compte));
1956 
1957  //Création du numéro de client générique
1958  $numero_cpt_client = '411';
1959  for ($i = 1; $i <= ($taille_numero - 3); $i++) {
1960  $numero_cpt_client .= '0';
1961  }
1962 
1963  //Création des comptes auxiliaire des clients
1964  if (length_accountg($line->numero_compte) == $numero_cpt_client) {
1965  $tab[] = rtrim(length_accounta($line->subledger_account), "0");
1966  } else {
1967  $tab[] = length_accountg($line->numero_compte);
1968  }
1969  $nom_client = explode(" - ", $line->label_operation);
1970  $tab[] = mb_convert_encoding($nom_client[0], "Windows-1252", 'UTF-8');
1971  $tab[] = price($line->debit);
1972  $tab[] = price($line->credit);
1973  $tab[] = price($line->montant);
1974  $tab[] = $line->code_journal;
1975 
1976  $separator = $this->separator;
1977  print implode($separator, $tab) . $this->end_line;
1978  }
1979  }
1980 
1988  public static function trunc($str, $size)
1989  {
1990  return dol_trunc($str, $size, 'right', 'UTF-8', 1);
1991  }
1992 
2000  public static function toAnsi($str, $size = -1)
2001  {
2002  $retVal = dol_string_nohtmltag($str, 1, 'Windows-1251');
2003  if ($retVal >= 0 && $size >= 0) {
2004  $retVal = mb_substr($retVal, 0, $size, 'Windows-1251');
2005  }
2006  return $retVal;
2007  }
2008 }
length_accounta
length_accounta($accounta)
Return Auxiliary accounting account of thirdparties with defined length.
Definition: accounting.lib.php:133
db
$conf db
API class for accounts.
Definition: inc.php:41
dol_trunc
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
Definition: functions.lib.php:3805
AccountancyExport\exportQuadratus
exportQuadratus(&$TData)
Export format : Quadratus (Format ASCII) Format since 2015 compatible QuadraCOMPTA Last review for th...
Definition: accountancyexport.class.php:568
AccountancyExport\exportGestimumV5
exportGestimumV5($objectLines)
Export format : Gestimum V5.
Definition: accountancyexport.class.php:1891
DoliDB
Class to manage Dolibarr database access.
Definition: DoliDB.class.php:30
AccountancyExport\exportCogilog
exportCogilog($objectLines)
Export format : COGILOG.
Definition: accountancyexport.class.php:414
AccountancyExport\export
export(&$TData, $formatexportset)
Function who chose which export to use with the default config, and make the export into a file.
Definition: accountancyexport.class.php:296
FactureFournisseur
Class to manage suppliers invoices.
Definition: fournisseur.facture.class.php:53
AccountancyExport\getType
getType()
Array with all export type available (key + label)
Definition: accountancyexport.class.php:112
AccountancyExport\exportCoala
exportCoala($objectLines)
Export format : COALA.
Definition: accountancyexport.class.php:447
AccountancyExport\exportOpenConcerto
exportOpenConcerto($objectLines)
Export format : OpenConcerto.
Definition: accountancyexport.class.php:882
AccountancyExport\getTypeConfig
getTypeConfig()
Array with all export type available (key + label) and parameters for config.
Definition: accountancyexport.class.php:192
AccountancyExport\trunc
static trunc($str, $size)
trunc
Definition: accountancyexport.class.php:1988
AccountancyExport\exportLDCompta
exportLDCompta($objectLines)
Export format : LD Compta version 9 http://www.ldsysteme.fr/fileadmin/telechargement/np/ldcompta/Docu...
Definition: accountancyexport.class.php:1330
AccountancyExport\getFormatCode
static getFormatCode($type)
Return string to summarize the format (Used to generated export filename)
Definition: accountancyexport.class.php:154
AccountancyExport\exportGestimumV3
exportGestimumV3($objectLines)
Export format : Gestimum V3.
Definition: accountancyexport.class.php:1793
Facture
Class to manage invoices.
Definition: facture.class.php:60
AccountancyExport\exportCegid
exportCegid($objectLines)
Export format : CEGID.
Definition: accountancyexport.class.php:389
price2num
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
Definition: functions.lib.php:5661
AccountancyExport\exportWinfic
exportWinfic(&$TData)
Export format : WinFic - eWinfic - WinSis Compta Last review for this format : 2022-11-01 Alexandre S...
Definition: accountancyexport.class.php:722
AccountancyExport\exportFEC2
exportFEC2($objectLines)
Export format : FEC2.
Definition: accountancyexport.class.php:1075
dol_print_date
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
Definition: functions.lib.php:2514
AccountancyExport\exportFEC
exportFEC($objectLines)
Export format : FEC.
Definition: accountancyexport.class.php:944
AccountancyExport\exportBob50
exportBob50($objectLines)
Export format : BOB50.
Definition: accountancyexport.class.php:475
AccountancyExport
Manage the different format accountancy export.
Definition: accountancyexport.class.php:44
AccountancyExport\exportLDCompta10
exportLDCompta10($objectLines)
Export format : LD Compta version 10 & higher Last review for this format : 08-15-2021 Alexandre Span...
Definition: accountancyexport.class.php:1464
dol_string_unaccent
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
Definition: functions.lib.php:1309
AccountancyExport\exportCharlemagne
exportCharlemagne($objectLines)
Export format : Charlemagne.
Definition: accountancyexport.class.php:1729
AccountancyExport\exportCiel
exportCiel(&$TData)
Export format : CIEL (Format XIMPORT) Format since 2003 compatible CIEL version > 2002 / Sage50 Last ...
Definition: accountancyexport.class.php:521
length_accountg
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
Definition: accounting.lib.php:94
AccountancyExport\exportConfigurable
exportConfigurable($objectLines)
Export format : Configurable CSV.
Definition: accountancyexport.class.php:913
dol_string_nohtmltag
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
Definition: functions.lib.php:6694
price2fec
price2fec($amount)
Function to format a value into a defined format for French administration (no thousand separator & d...
Definition: functions2.lib.php:2730
AccountancyExport\exportAgiris
exportAgiris($objectLines)
Export format : Agiris Isacompta.
Definition: accountancyexport.class.php:843
AccountancyExport\exportiSuiteExpert
exportiSuiteExpert($objectLines)
Export format : iSuite Expert.
Definition: accountancyexport.class.php:1934
AccountancyExport\toAnsi
static toAnsi($str, $size=-1)
toAnsi
Definition: accountancyexport.class.php:2000
$resql
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->rights->fournisseur->facture->lire)||(isModEnabled('supplier_invoice') && $user->rights->supplier_invoice->lire)) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->rights->commande->lire &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:742
AccountancyExport\__construct
__construct(DoliDB $db)
Constructor.
Definition: accountancyexport.class.php:96
AccountancyExport\exportEbp
exportEbp($objectLines)
Export format : EBP.
Definition: accountancyexport.class.php:808
price
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
Definition: functions.lib.php:5541
getCountry
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
Definition: company.lib.php:489
AccountancyExport\exportSAGE50SWISS
exportSAGE50SWISS($objectLines)
Export format : SAGE50SWISS.
Definition: accountancyexport.class.php:1211