diff --git a/htdocs/accountancy/admin/export.php b/htdocs/accountancy/admin/export.php index 0b43e99b1d8d5e8e88cf51b913cff9eb4ca99200..1a32c22e12f48f4c83e1cc1fa2081a2db5eb7295 100644 --- a/htdocs/accountancy/admin/export.php +++ b/htdocs/accountancy/admin/export.php @@ -30,6 +30,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountancyexport.class.php'; $langs->load("compta"); $langs->load("bills"); @@ -195,12 +196,7 @@ if (! $conf->use_javascript_ajax) { print "</td>"; } else { print '<td>'; - $listmodelcsv = array ( - '1' => $langs->trans("Modelcsv_normal"), - '2' => $langs->trans("Modelcsv_CEGID"), - '3' => $langs->trans("Modelcsv_COALA"), - '4' => $langs->trans("Modelcsv_bob50") - ); + $listmodelcsv = AccountancyExport::getType(); print $form->selectarray("modelcsv", $listmodelcsv, $conf->global->ACCOUNTING_EXPORT_MODELCSV, 0); print '</td>'; diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 515736580f848ee62520941405903e7ca979c9ce..b507c4dfffa672701082264e14797d434af8c392 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -218,16 +218,31 @@ if ($action == 'delbookkeeping') { exit(); } } elseif ($action == 'export_csv') { - $sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; - $journal = 'bookkepping'; - include DOL_DOCUMENT_ROOT . '/accountancy/tpl/export_journal.tpl.php'; + include DOL_DOCUMENT_ROOT . '/accountancy/class/accountancyexport.class.php'; $result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter); - if ($result < 0) { + if ($result < 0) + { setEventMessages($object->error, $object->errors, 'errors'); } + else + { + if (in_array($conf->global->ACCOUNTING_EXPORT_MODELCSV, array(5,6))) // TODO remove the conditional and keep the code in the "else" + { + $accountancyexport = new AccountancyExport($db); + $accountancyexport->export($object->lines); + if (!empty($accountancyexport->errors)) setEventMessages('', $accountancyexport->errors, 'errors'); + else exit; + } + } + + // TODO remove next 3 lines and foreach to implement the AccountancyExport method for each model + $sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; + $journal = 'bookkepping'; + include DOL_DOCUMENT_ROOT . '/accountancy/tpl/export_journal.tpl.php'; + foreach ( $object->lines as $line ) { if ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 2) { diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php new file mode 100644 index 0000000000000000000000000000000000000000..acf490ae787d0f29c96bbb29e011f81f35f450d1 --- /dev/null +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -0,0 +1,270 @@ +<?php +/* Copyright (C) 2007-2012 Laurent Destailleur <eldy@users.sourceforge.net> + * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es> + * Copyright (C) 2015 Florian Henry <florian.henry@open-concept.pro> + * Copyright (C) 2015 Raphaƫl Doursenaud <rdoursenaud@gpcsolutions.fr> + * Copyright (C) 2016 Pierre-Henry Favre <phf@atm-consulting.fr> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * \file htdocs/accountancy/class/accountancyexport.class.php + */ + +/** + * Class AccountancyExport + * + * Manage the different format accountancy export + */ +require_once DOL_DOCUMENT_ROOT . '/core/lib/functions.lib.php'; + +class AccountancyExport +{ + /** + * @var Type of export + */ + public static $EXPORT_TYPE_NORMAL = 1; + public static $EXPORT_TYPE_CEGID = 2; + public static $EXPORT_TYPE_COALA = 3; + public static $EXPORT_TYPE_BOB50 = 4; + public static $EXPORT_TYPE_CIEL = 5; + public static $EXPORT_TYPE_QUADRATUS = 6; + + /** + * @var string[] Error codes (or messages) + */ + public $errors = array(); + + /** + * @var string Separator + */ + public $separator = ''; + + /** + * @var string End of line + */ + public $end_line = ''; + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct(DoliDB &$db) + { + global $conf; + + $this->db = &$db; + $this->separator = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; + $this->end_line = "\n"; + return 1; + } + + /** + * Get all export type are available + * + * @return array of type + */ + public static function getType() + { + global $langs; + + return array ( + self::$EXPORT_TYPE_NORMAL => $langs->trans('Modelcsv_normal'), + self::$EXPORT_TYPE_CEGID => $langs->trans('Modelcsv_CEGID'), + self::$EXPORT_TYPE_COALA => $langs->trans('Modelcsv_COALA'), + self::$EXPORT_TYPE_BOB50 => $langs->trans('Modelcsv_bob50'), + self::$EXPORT_TYPE_CIEL => $langs->trans('Modelcsv_ciel'), + self::$EXPORT_TYPE_QUADRATUS => $langs->trans('Modelcsv_quadratus') + ); + } + + /** + * Download the export + * + * @return void + */ + public static function downloadFile() + { + global $conf; + $journal = 'bookkepping'; + include DOL_DOCUMENT_ROOT . '/accountancy/tpl/export_journal.tpl.php'; + } + + /** + * Function who chose which export to use with the default config + * + * @return void + */ + public function export(&$TData) + { + global $conf, $langs; + + switch ($conf->global->ACCOUNTING_EXPORT_MODELCSV) { + case self::$EXPORT_TYPE_NORMAL: + $this->exportNormal($TData); + break; + case self::$EXPORT_TYPE_CEGID: + $this->exportCegid($TData); + break; + case self::$EXPORT_TYPE_COALA: + $this->exportCoala($TData); + break; + case self::$EXPORT_TYPE_BOB50: + $this->exportBob50($TData); + break; + case self::$EXPORT_TYPE_CIEL: + $this->exportCiel($TData); + break; + case self::$EXPORT_TYPE_QUADRATUS: + $this->exportQuadratus($TData); + break; + default: + $this->errors[] = $langs->trans('accountancy_error_modelnotfound'); + break; + } + + if (empty($this->errors)) self::downloadFile(); + } + + /** + * Export format : Normal + * + * @return void + */ + public function exportNormal(&$TData) + { + + } + + /** + * Export format : CEGID + * + * @return void + */ + public function exportCegid(&$TData) + { + + } + + /** + * Export format : COALA + * + * @return void + */ + public function exportCoala(&$TData) + { + + } + + /** + * Export format : BOB50 + * + * @return void + */ + public function exportBob50(&$TData) + { + + } + + /** + * Export format : CIEL + * + * @return void + */ + public function exportCiel(&$TData) + { + global $conf; + + $i=1; + $date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be yyyymmdd + foreach ($TData as $data) + { + $code_compta = $data->numero_compte; + if (!empty($data->code_tiers)) $code_compta = $data->code_tiers; + + $Tab = array(); + $Tab['num_ecriture'] = str_pad($i, 5); + $Tab['code_journal'] = str_pad($data->code_journal, 2); + $Tab['date_ecriture'] = $date_ecriture; + $Tab['date_ope'] = dol_print_date($data->doc_date, $conf->global->ACCOUNTING_EXPORT_DATE); + $Tab['num_piece'] = str_pad(self::trunc($data->piece_num, 12), 12); + $Tab['num_compte'] = str_pad(self::trunc($code_compta, 11), 11); + $Tab['libelle_ecriture'] = str_pad(self::trunc($data->doc_ref.$data->label_compte, 25), 25); + $Tab['montant'] = str_pad(abs($data->montant), 13, ' ', STR_PAD_LEFT); + $Tab['type_montant'] = str_pad($data->sens, 1); + $Tab['vide'] = str_repeat(' ', 18); + $Tab['intitule_compte'] = str_pad(self::trunc($data->label_compte, 34), 34); + $Tab['end'] = 'O2003'; + + $Tab['end_line'] = $this->end_line; + + print implode($Tab); + $i++; + } + } + + /** + * Export format : Quadratus + * + * @return void + */ + public function exportQuadratus(&$TData) + { + global $conf; + + $date_ecriture = dol_print_date(time(), $conf->global->ACCOUNTING_EXPORT_DATE); // format must be ddmmyy + foreach ($TData as $data) + { + $code_compta = $data->numero_compte; + if (!empty($data->code_tiers)) $code_compta = $data->code_tiers; + + $Tab = array(); + $Tab['type_ligne'] = 'M'; + $Tab['num_compte'] = str_pad(self::trunc($code_compta, 8), 8); + $Tab['code_journal'] = str_pad(self::trunc($data->code_journal, 2), 2); + $Tab['folio'] = '000'; + $Tab['date_ecriture'] = $date_ecriture; + $Tab['filler'] = ' '; + $Tab['libelle_ecriture'] = str_pad(self::trunc($data->doc_ref.' '.$data->label_compte, 20), 20); + $Tab['sens'] = $data->sens; // C or D + $Tab['signe_montant'] = '+'; + $Tab['montant'] = str_pad(abs($data->montant)*100, 12, '0', STR_PAD_LEFT); // TODO manage negative amount + $Tab['contrepartie'] = str_repeat(' ', 8); + if (!empty($data->date_echeance)) $Tab['date_echeance'] = dol_print_date($data->date_echeance, $conf->global->ACCOUNTING_EXPORT_DATE); + else $Tab['date_echeance'] = '000000'; + $Tab['lettrage'] = str_repeat(' ', 5); + $Tab['num_piece'] = str_pad(self::trunc($data->piece_num, 5), 5); + $Tab['filler2'] = str_repeat(' ', 20); + $Tab['num_piece2'] = str_pad(self::trunc($data->piece_num, 8), 8); + $Tab['devis'] = str_pad($conf->currency, 3); + $Tab['code_journal2'] = str_pad(self::trunc($data->code_journal, 3), 3); + $Tab['filler3'] = str_repeat(' ', 3); + $Tab['libelle_ecriture2'] = str_pad(self::trunc($data->doc_ref.' '.$data->label_compte, 32), 32); + $Tab['num_piece3'] = str_pad(self::trunc($data->piece_num, 10), 10); + $Tab['filler4'] = str_repeat(' ', 73); + + $Tab['end_line'] = $this->end_line; + + print implode($Tab); + } + } + + public static function trunc($str, $size) + { + return dol_trunc($str, $size, 'right', 'UTF-8', 1); + } + +} diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index f4b478b681e229c497face8927f733681bb02221..4a0ebbe898889bb109c8e740864f41b74f0208ed 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -170,7 +170,7 @@ class BookKeeping extends CommonObject $this->piece_num = 0; // first check if line not yet in bookkeeping - $sql = "SELECT count(*)"; + $sql = "SELECT count(*) as nb"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE doc_type = '" . $this->doc_type . "'"; $sql .= " AND fk_docdet = " . $this->fk_docdet; @@ -180,8 +180,8 @@ class BookKeeping extends CommonObject $resql = $this->db->query($sql); if ($resql) { - $row = $this->db->fetch_array($resql); - if ($row[0] == 0) { + $row = $this->db->fetch_object($resql); + if ($row->nb == 0) { // Determine piece_num $sqlnum = "SELECT piece_num"; diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 8ffb4690dba8980703044141468c92e6ee1576cb..670875ec52bf4413b6e4cf066e96ca85ef28b247 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -40,6 +40,7 @@ require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; // Langs +$langs->load("commercial"); $langs->load("compta"); $langs->load("bills"); $langs->load("other"); diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index f1b82c9be2129588ef3aff967834f5a1e0e93292..8685cb7d5d4dc16c39c0b7a574dedfdc659adbcb 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -254,11 +254,11 @@ if ($result) { print '<tr class="liste_titre">'; print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_invoice" value="' . $search_invoice . '"></td>'; - print '<td class="liste_titre"><input type="text" class="flat" size="15" name="search_ref" value="' . $search_ref . '"></td>'; + print '<td class="liste_titre">%<input type="text" class="flat" size="15" name="search_ref" value="' . $search_ref . '"></td>'; print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_label" value="' . $search_label . '"></td>'; print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_desc" value="' . $search_desc . '"></td>'; print '<td class="liste_titre" align="right"><input type="text" class="flat" size="10" name="search_amount" value="' . $search_amount . '"></td>'; - print '<td class="liste_titre" align="center"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '">%</td>'; + print '<td class="liste_titre" align="center">%<input type="text" class="flat" size="5" name="search_vat" value="' . $search_vat . '"></td>'; print '<td class="liste_titre" align="center"> </td>'; print '<td class="liste_titre"> </td>'; print '<td align="right" colspan="2" class="liste_titre">';