Overview
SHA1:e8d51c046abba20465b522b23b06b78870cd8b62
Date: 2018-07-09 15:27:50
User: bohwaz
Comment:Export ODS compta et membres
Timelines: family | ancestors | descendants | both | trunk | stable
Downloads: Tarball | ZIP archive
Other Links: files | file ages | folders | manifest
References
2018-07-09
17:32 • Fixed ticket [6fdea769b9]: Options pour l'export CVS pour Excel plus 5 other changes (user: bohwaz) [details]
Tags And Properties
Context
2018-07-11
10:55
[285a6b0597] Fix : identité du membre n'était pas affichée sur la page d'accueil (user: bohwaz, tags: trunk, stable)
2018-07-09
15:27
[e8d51c046a] Export ODS compta et membres (user: bohwaz, tags: trunk, stable)
15:16
[ede5c3863e] Corrige affichage des cotisations par période, signalé par @Daniel (user: bohwaz, tags: trunk)
Changes

Modified src/include/lib/Garradin/Compta/Comptes.php from [f2bc5722a8] to [413403054e].

   159    159           }
   160    160   
   161    161           if ($db->test('compta_comptes_bancaires', $db->where('id', $id)))
   162    162           {
   163    163               throw new UserException('Ce compte ne peut être supprimé car il est lié à un compte bancaire.');
   164    164           }
   165    165   
   166         -        if ($db->test('compta_categories', $db->where('compte', $id)))
   167         -        {
   168         -            throw new UserException('Ce compte ne peut être supprimé car des catégories y sont liées.');
   169         -        }
   170         -
   171    166           $db->delete('compta_comptes', $db->where('id', $id));
   172    167   
   173    168           return true;
   174    169       }
   175    170   
   176    171       /**
   177    172        * Peut-on supprimer ce compte ? (OUI s'il n'a pas d'écriture liée)

Modified src/include/lib/Garradin/Compta/Import.php from [5efe3ab736] to [434894af9b].

     2      2   
     3      3   namespace Garradin\Compta;
     4      4   
     5      5   use \Garradin\DB;
     6      6   use \Garradin\Utils;
     7      7   use \Garradin\UserException;
     8      8   
            9  +use KD2\ODSWriter;
           10  +
     9     11   class Import
    10     12   {
    11         -	protected $csv_header = [
           13  +	protected $header = [
    12     14   		'Numéro mouvement',
    13     15   		'Date',
    14     16   		'Type de mouvement',
    15     17   		'Catégorie',
    16     18   		'Libellé',
    17     19   		'Montant',
    18     20   		'Compte de débit - numéro',
................................................................................
    21     23   		'Compte de crédit - libellé',
    22     24   		'Moyen de paiement',
    23     25   		'Numéro de chèque',
    24     26   		'Numéro de pièce',
    25     27   		'Remarques'
    26     28   	];
    27     29   
    28         -	public function toCSV($exercice)
           30  +	protected function export($exercice)
    29     31   	{
    30         -		$db = DB::getInstance();
    31         -
    32         -		$res = $db->prepare('SELECT
           32  +		return DB::getInstance()->prepare('SELECT
    33     33   			journal.id,
    34     34   			strftime(\'%d/%m/%Y\', date) AS date,
    35     35   			(CASE cat.type WHEN 1 THEN \'Recette\' WHEN -1 THEN \'Dépense\' ELSE \'Autre\' END) AS type,
    36     36   			(CASE cat.intitule WHEN NULL THEN \'\' ELSE cat.intitule END) AS cat,
    37     37   			journal.libelle,
    38     38   			montant,
    39     39   			compte_debit,
................................................................................
    48     48   				LEFT JOIN compta_categories AS cat ON cat.id = journal.id_categorie
    49     49   				LEFT JOIN compta_comptes AS debit ON debit.id = journal.compte_debit
    50     50   				LEFT JOIN compta_comptes AS credit ON credit.id = journal.compte_credit
    51     51   				LEFT JOIN compta_moyens_paiement AS moyen ON moyen.code = journal.moyen_paiement
    52     52   			WHERE id_exercice = '.(int)$exercice.'
    53     53   			ORDER BY journal.date;
    54     54   		')->execute();
           55  +	}
           56  +
           57  +	public function toCSV($exercice)
           58  +	{
           59  +		$res = $this->export($exercice);
    55     60   
    56     61   		$fp = fopen('php://output', 'w');
    57     62   
    58         -		fputcsv($fp, $this->csv_header);
           63  +		fputcsv($fp, $this->header);
    59     64   
    60     65   		while ($row = $res->fetchArray(SQLITE3_ASSOC))
    61     66   		{
    62     67   			fputcsv($fp, $row);
    63     68   		}
    64     69   
    65     70   		fclose($fp);
    66     71   
    67     72   		return true;
    68     73   	}
           74  +
           75  +    public function toODS($exercice)
           76  +    {
           77  +    	$result = $this->export($exercice);
           78  +        $ods = new ODSWriter;
           79  +        $ods->table_name = 'Journal';
           80  +
           81  +        $ods->add($this->header);
           82  +
           83  +        while ($row = $result->fetchArray(SQLITE3_ASSOC))
           84  +        {
           85  +        	unset($row->passe);
           86  +        	$ods->add($row);
           87  +        }
           88  +
           89  +        $ods->output();
           90  +    }
    69     91   
    70     92   	public function fromCSV($path)
    71     93   	{
    72     94   		if (!file_exists($path) || !is_readable($path))
    73     95   		{
    74     96   			throw new \RuntimeException('Fichier inconnu : '.$path);
    75     97   		}

Modified src/include/lib/Garradin/Membres/Import.php from [657b6765f3] to [032b787733].

     4      4   
     5      5   use Garradin\Membres;
     6      6   use Garradin\Config;
     7      7   use Garradin\DB;
     8      8   use Garradin\Utils;
     9      9   use Garradin\UserException;
    10     10   
           11  +use KD2\ODSWriter;
           12  +
    11     13   class Import
    12     14   {
    13     15   	/**
    14     16   	 * Champs du CSV de Galette
    15     17   	 * les lignes vides ('') ne seront pas proposées à l'import
    16     18   	 * @var array
    17     19   	 */
................................................................................
   258    260   
   259    261   		$db->commit();
   260    262   
   261    263   		fclose($fp);
   262    264   		return true;
   263    265   	}
   264    266   
   265         -    public function toCSV($excel = false)
   266         -    {
          267  +	protected function export()
          268  +	{
   267    269           $db = DB::getInstance();
   268    270   
   269    271           $champs = Config::getInstance()->get('champs_membres')->getKeys();
   270         -        $champs = 'm.' . implode(', m.', $champs);
          272  +        $champs_sql = 'm.' . implode(', m.', $champs);
   271    273   
   272         -        $res = $db->prepare('SELECT ' . $champs . ', c.nom AS categorie FROM membres AS m 
          274  +        $res = $db->prepare('SELECT ' . $champs_sql . ', c.nom AS categorie FROM membres AS m 
   273    275               LEFT JOIN membres_categories AS c ON m.id_categorie = c.id ORDER BY c.id;')->execute();
   274    276   
          277  +        return [array_merge($champs, ['categorie']), $res];
          278  +	}
          279  +
          280  +    public function toCSV()
          281  +    {
          282  +    	list($champs, $result) = $this->export();
          283  +
   275    284           $fp = fopen('php://output', 'w');
   276         -        fputs($fp, Utils::csv_header($excel));
   277    285           $header = false;
   278    286   
   279         -        while ($row = $res->fetchArray(SQLITE3_ASSOC))
          287  +        while ($row = $result->fetchArray(SQLITE3_ASSOC))
   280    288           {
   281    289               unset($row->passe);
   282    290   
   283    291               if (!$header)
   284    292               {
   285         -                fputs($fp, Utils::row_to_csv(array_keys($row), $excel));
          293  +                fputs($fp, Utils::row_to_csv(array_keys($row)));
   286    294                   $header = true;
   287    295               }
   288    296   
   289         -            fputs($fp, Utils::row_to_csv($row, $excel));
          297  +            fputs($fp, Utils::row_to_csv($row));
   290    298           }
   291    299   
   292    300           fclose($fp);
   293    301   
   294    302           return true;
   295    303       }
          304  +
          305  +    public function toODS()
          306  +    {
          307  +    	list($champs, $result) = $this->export();
          308  +        $ods = new ODSWriter;
          309  +        $ods->table_name = 'Membres';
          310  +
          311  +        $ods->add($champs);
          312  +
          313  +        while ($row = $result->fetchArray(SQLITE3_ASSOC))
          314  +        {
          315  +        	unset($row->passe);
          316  +        	$ods->add($row);
          317  +        }
          318  +
          319  +        $ods->output();
          320  +    }
   296    321   }

Modified src/include/lib/Garradin/Utils.php from [56babf6e61] to [cb5d0acf56].

   719    719           // Skip BOM
   720    720           if (fgets($fp, 4) !== chr(0xEF) . chr(0xBB) . chr(0xBF))
   721    721           {
   722    722               fseek($fp, 0);
   723    723           }
   724    724       }
   725    725   
   726         -    static public function row_to_csv($row, $excel = false)
          726  +    static public function row_to_csv($row)
   727    727       {
   728    728           $row = (array) $row;
   729    729   
   730         -        $eol = "\r\n";
   731         -        // Excel ne comprends pas les virgules en france, le c*****!
   732         -        $separator = $excel ? '";"' : '","';
   733         -
   734    730           array_walk($row, function ($field) {
   735    731               return strtr($field, ['"' => '""', "\r\n" => "\n"]);
   736    732           });
   737    733   
   738         -        $out = '"' . implode($separator, $row) . '"' . $eol;
   739         -
   740         -        return $out;
   741         -    }
   742         -
   743         -    static public function csv_header($excel = false)
   744         -    {
   745         -        if ($excel)
   746         -        {
   747         -            // BOM spécifique pour Excel sinon il ne sait pas lire l'UTF8!
   748         -            return chr(0xEF) . chr(0xBB) . chr(0xBF);
   749         -        }
   750         -
   751         -        return '';
          734  +        return sprintf("\"%s\"\r\n", implode('","', $row));
   752    735       }
   753    736   }

Modified src/templates/admin/compta/import.tpl from [41a1fc641c] to [d8c04dcc34].

     6      6       <p class="confirm">
     7      7           L'import s'est bien déroulé.
     8      8       </p>
     9      9   {/if}
    10     10   
    11     11   <ul class="actions">
    12     12       <li class="current"><a href="{$admin_url}compta/import.php">Importer</a></li>
    13         -    <li><a href="{$admin_url}compta/import.php?export">Exporter en CSV</a></li>
           13  +    <li><a href="{$admin_url}compta/import.php?export=csv">Exporter en CSV</a></li>
           14  +    <li><a href="{$admin_url}compta/import.php?export=ods">Exporter en classeur Office</a></li>
    14     15   </ul>
    15     16   
    16     17   <form method="post" action="{$self_url}" enctype="multipart/form-data">
    17     18   
    18     19       <fieldset>
    19     20           <legend>Importer depuis un fichier</legend>
    20     21           <dl>

Modified src/templates/admin/membres/import.tpl from [0e9a87ea52] to [239f90c5ba].

     1      1   {include file="admin/_head.tpl" title="Import & export des membres" current="membres" js=1}
     2      2   
     3      3   <ul class="actions">
     4      4       <li class="current"><a href="{$admin_url}membres/import.php">Importer</a></li>
     5         -    <li><a href="{$admin_url}membres/import.php?export">Exporter en CSV</a></li>
     6         -    <li><a href="{$admin_url}membres/import.php?export=excel">Exporter en CSV (Excel)</a></li>
            5  +    <li><a href="{$admin_url}membres/import.php?export=csv">Exporter en CSV</a></li>
            6  +    <li><a href="{$admin_url}membres/import.php?export=ods">Exporter en classeur Office</a></li>
     7      7   </ul>
     8      8   
     9      9   {form_errors}
    10     10   
    11     11   {if $ok}
    12     12       <p class="confirm">
    13     13           L'import s'est bien déroulé.

Modified src/www/admin/compta/import.php from [cbf52a3a51] to [7e73141123].

     4      4   require_once __DIR__ . '/_inc.php';
     5      5   
     6      6   $session->requireAccess('compta', Membres::DROIT_ADMIN);
     7      7   
     8      8   $e = new Compta\Exercices;
     9      9   $import = new Compta\Import;
    10     10   
    11         -if (qg('export') !== null)
           11  +if (qg('export') == 'csv')
    12     12   {
    13     13       header('Content-type: application/csv');
    14     14       header('Content-Disposition: attachment; filename="Export comptabilité - ' . $config->get('nom_asso') . ' - ' . date('Y-m-d') . '.csv"');
    15     15       $import->toCSV($e->getCurrentId());
    16     16       exit;
           17  +}
           18  +elseif (qg('export') == 'ods')
           19  +{
           20  +    header('Content-type: application/vnd.oasis.opendocument.spreadsheet');
           21  +    header('Content-Disposition: attachment; filename="Export comptabilité - ' . $config->get('nom_asso') . ' - ' . date('Y-m-d') . '.ods"');
           22  +    $import->toODS($e->getCurrentId());
           23  +    exit;
    17     24   }
    18     25   
    19     26   if (f('import'))
    20     27   {
    21     28       $form->check('compta_import', [
    22     29           'upload' => 'file|required',
    23     30           'type'   => 'required|in:citizen,garradin',

Modified src/www/admin/membres/import.php from [caede8a449] to [414da74c86].

     3      3   
     4      4   require_once __DIR__ . '/_inc.php';
     5      5   
     6      6   $session->requireAccess('membres', Membres::DROIT_ADMIN);
     7      7   
     8      8   $import = new Membres\Import;
     9      9   
    10         -if (null !== qg('export'))
           10  +$tpl->assign('tab', null !== qg('export') ? 'export' : 'import');
           11  +
           12  +if (qg('export') == 'csv')
    11     13   {
    12     14       header('Content-type: application/csv');
    13     15       header('Content-Disposition: attachment; filename="Export membres - ' . $config->get('nom_asso') . ' - ' . date('Y-m-d') . '.csv"');
    14         -    $import->toCSV(qg('export') == 'excel' ? true : false);
           16  +    $import->toCSV();
           17  +    exit;
           18  +}
           19  +elseif (qg('export') == 'ods')
           20  +{
           21  +    header('Content-type: application/vnd.oasis.opendocument.spreadsheet');
           22  +    header('Content-Disposition: attachment; filename="Export membres - ' . $config->get('nom_asso') . ' - ' . date('Y-m-d') . '.ods"');
           23  +    $import->toODS();
    15     24       exit;
    16     25   }
    17     26   
    18     27   $champs = $config->get('champs_membres')->getAll();
    19     28   $champs->date_inscription = (object) ['title' => 'Date inscription', 'type' => 'date'];
    20     29   
    21     30   if (f('import'))