source: spip-zone/_plugins_/Association/Associaspip/exec/compte_resultat.php @ 60835

Last change on this file since 60835 was 60835, checked in by gildas.cotomale@…, 9 years ago

harmonisation d'interface et quelques corrections en passant

File size: 13.8 KB
Line 
1<?php
2
3/* * *************************************************************************\
4 *  Associaspip, extension de SPIP pour gestion d'associations             *
5 *                                                                         *
6 *  Copyright (c) 2007 Bernard Blazin & Fran�ois de Montlivault (V1)       *
7 *  Copyright (c) 2010-2011 Emmanuel Saint-James & Jeannot Lapin (V2)      *
8 *  ajouté en 08/2011 par Marcel BOLLA ... à partir de bilan.php           *
9 *                                                                         *
10 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
11 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
12  \************************************************************************** */
13
14
15if (!defined('_ECRIRE_INC_VERSION'))
16        return;
17
18include_spip('inc/navigation_modules');
19
20function exec_compte_resultat()
21{
22        if (!autoriser('associer', 'comptes')) {
23                include_spip('inc/minipres');
24                echo minipres();
25        } else {
26// initialisations
27                $plan = sql_countsel('spip_asso_plan','active=1');
28                $id_exercice = intval(_request('exercice'));
29                if(!$id_exercice){
30                        /* on recupere l'id_exercice dont la date "fin" est "la plus grande" */
31                        $id_exercice = sql_getfetsel('id_exercice', 'spip_asso_exercices', '', '', 'fin DESC');
32                }
33                $id_destination = intval(_request('destination'));
34                $exercice_data = sql_asso1ligne('exercice', $id_exercice);
35                include_spip('inc/association_comptabilite');
36// traitements
37                onglets_association('titre_onglet_comptes');
38                // INTRO : rappel de l'exercicee affichee
39                $infos['exercice_entete_debut'] = association_datefr($exercice_data['debut'], 'dtstart');
40                $infos['exercice_entete_fin'] = association_datefr($exercice_data['fin'], 'dtend');
41                echo totauxinfos_intro($exercice_data['intitule'], 'exercice', $id_exercice, $infos);
42                // pas de sommes de synthes puisque tous les totaux sont dans la zone centrale ;-
43                // datation et raccourcis
44                icones_association(array('comptes', "exercice=$id_exercice"), array(
45                        'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
46                        'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
47#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
48                ));
49                // elements communs aux requetes
50                if ($plan) {
51                        $join = ' RIGHT JOIN spip_asso_plan ON imputation=code';
52                        $sel = ', code, intitule, classe';
53                        $where = " date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' ";
54                        $having = 'classe = ';
55                        $order = 'code';
56                } else {
57                        $join = $sel = $where = $having = $order = '';
58                }
59                $var = serialize(array($id_exercice, $join, $sel, $where, $having, $order)); //!\ les cles numeriques peuvent poser probleme... <http://www.mail-archive.com/php-bugs@lists.php.net/msg100262.html> mais il semble qu'ici le souci vient de l'absence d'encodage lorsqu'on passe $var par URL...
60//              $var = serialize(array('id'=>$id_exercice, '1'=>$join, '2'=>$sel, '3'=>$where, '4'=>$having, '5'=>$order));
61                if(autoriser('associer', 'export_comptes')){ // on peut exporter : pdf, csv, xml, ...
62                        echo debut_cadre_enfonce('',true);
63                        echo '<h3>'. _T('asso:cpte_resultat_mode_exportation') .'</h3>';
64                        if (test_plugin_actif('FPDF')) { // impression en PDF : _T('asso:bouton_impression')
65                                echo icone1_association('PDF', generer_url_ecrire('export_compteresultats_pdf').'&var='.rawurlencode($var), 'print-24.png'); //!\ generer_url_ecrire() utilise url_enconde() or il est preferable avec les grosses variables serialisees d'utiliser rawurlencode()
66                        }
67                        foreach(array('csv','ctx','dbk','json','tex','tsv','xml','yaml') as $type) { // autres exports (donnees brutes) possibles
68                                echo icone1_association(strtoupper($type), generer_url_ecrire("export_compteresultats_$type").'&var='.rawurlencode($var), 'export-24.png'); //!\ generer_url_ecrire($exec, $param) equivaut a generer_url_ecrire($exec).'&'.urlencode($param) or il faut utiliser rawurlencode($param) ici...
69                        }
70                        echo fin_cadre_enfonce(true);
71                }
72                debut_cadre_association('finances-24.jpg', 'cpte_resultat_titre_general', $exercice_data['intitule']);
73                echo "\n<form method='get' action=''>\n<input type='hidden' name='exec' value='compte_resultat' />\n<table width='100%'><tr>";
74                echo '<td width="50%" align="left">'. association_selectionner_exercice($id_exercice, '') .'</td>';
75                echo '<td width="50%" align="right">'. association_selectionner_destination($id_destination, '') .'</td>';
76                echo '<td width="20%" class="boutons"><noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript></td>';
77                echo "</tr>\n</table>\n</form>\n";
78                // liste des charges (depenses d'exploitation) cumulees par comptes
79                $charges = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_charges'], 'cpte_resultat', '-1', $id_exercice, $id_destination);
80                // liste des produits (recettes d'exploitation) cumules par comptes
81                $produits = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_produits'], 'cpte_resultat', '+1', $id_exercice, $id_destination);
82                // resultat comptable courant : c'est la difference entre les recettes et les depenses d'exploitation
83                association_liste_resultat_net($produits, $charges);
84                // liste des contributions volontaires (emplois et ressources) par comptes
85                $contributions = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_contributions_volontaires'], 'cpte_benevolat', 0, $id_exercice, $id_destination);
86                fin_page_association();
87        }
88}
89
90
91        include_spip('inc/charsets');
92        include_spip('inc/association_plan_comptable');
93
94// Brique commune aux classes d'exportation des donnees du compte de resultat
95class ExportCompteResultats {
96
97        var $exercice;
98        var $join;
99        var $sel;
100        var $where;
101        var $having;
102        var $order;
103        var $out;
104
105        function  __construct($var) {
106                $tableau = unserialize(rawurldecode($var));
107                $this->exercice = $tableau[0];
108                $this->join = $tableau[1];
109                $this->sel = $tableau[2];
110                $this->where = $tableau[3];
111                $this->having = $tableau[4];
112                $this->order = $tableau[5];
113                $this->out = '';
114        }
115
116        // de type CSV,INI,TSV, etc.
117        function LignesSimplesEntete($champsSeparateur, $lignesSeparateur, $echappements=array(), $champDebut='', $champFin='') {
118                $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), utf8_decode(html_entity_decode(_T('asso:entete_code')))) .$champFin.$champsSeparateur;
119                $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), utf8_decode(html_entity_decode(_T('asso:entete_intitule')))) .$champFin.$champsSeparateur;
120                $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), utf8_decode(html_entity_decode(_T('asso:entete_montant')))) .$champFin.$lignesSeparateur;
121        }
122
123        // de type CSV,INI,TSV, etc.
124        function LignesSimplesCorps($key, $champsSeparateur, $lignesSeparateur, $echappements=array(), $champDebut='', $champFin='') {
125                switch ($key) {
126                        case 'charges' :
127                                $quoi = "SUM(depense) AS valeurs";
128                                break;
129                        case 'produits' :
130                                $quoi = "SUM(recette) AS valeurs";
131                                break;
132                        case 'contributions_volontaires' :
133                                $quoi = "SUM(depense) AS charge_evaluee, SUM(recette) AS produit_evalue";
134                                break;
135                }
136                $query = sql_select(
137                        "imputation, $quoi ".$this->sel, // select
138                        'spip_asso_comptes '.$this->join, // from
139                        $this->where, // where
140                        $this->order, // group by
141                        $this->order, // order by
142                        '', // limit
143                        $this->having .$GLOBALS['association_metas']['classe_'.$key] // having
144                );
145                $chapitre = '';
146                $i = 0;
147                while ($data = sql_fetch($query)) {
148                        if ($key==='contributions_volontaires') {
149                                if ($data['charge_evaluee']>0) {
150                                        $valeurs = $data['charge_evaluee'];
151                                } else {
152                                        $valeurs = $data['produit_evalue'];
153                                }
154                        } else {
155                                $valeurs = $data['valeurs'];
156                        }
157                        $new_chapitre = substr($data['code'], 0, 2);
158                        if ($chapitre!=$new_chapitre) {
159                                $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), $new_chapitre) .$champFin.$champsSeparateur;
160                                $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), ($GLOBALS['association_metas']['plan_comptable_prerenseigne']?association_plan_comptable_complet($new_chapitre):sql_getfetsel('intitule','spip_asso_plan',"code='$new_chapitre'"))) .$champFin.$champsSeparateur;
161                                $this->out .= $champsSeparateur.' '.$champsSeparateur;
162                                $this->out .= $lignesSeparateur;
163                                $chapitre = $new_chapitre;
164                        }
165                        $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), $data['code']) .$champFin.$champsSeparateur;
166                        $this->out .= $champDebut. str_replace(array_keys($echappements), array_values($echappements), $data['intitule']) .$champFin.$champsSeparateur;
167                        $this->out .= $champDebut.$valeurs.$champFin.$lignesSeparateur;
168                }
169        }
170
171        // export texte de type tableau (lignes*colonnes) simple : CSV,CTX,HTML*SPIP,INI*,TSV,etc.
172        // de par la simplicite recherchee il n'y a pas de types ou autres : CSV et CTX dans une certaine mesure pouvant distinguer "nombres", "chaines alphanumeriques" et "chaine binaires encodees"
173        function exportLignesUniques($champsSeparateur, $lignesSeparateur, $echappements=array(), $champDebut='', $champFin='', $entete=true) {
174                if ($entete) {
175                        LignesSimplesEntete($champsSeparateur, $lignesSeparateur, $echappements=array(), $champDebut='', $champFin='');
176                }
177                foreach (array('charges', 'produits', 'contributions_volontaires') as $nomClasse) {
178                        LignesSimplesCorps($nomClasse, $champsSeparateur, $lignesSeparateur, $echappements=array(), $champDebut='', $champFin='');
179                }
180        }
181
182        // export texte de type s-expression / properties-list / balisage (conteneurs*conteneurs*donnees) simple : JSON, XML (utilisable avec ASN.1), YAML, etc.
183        // de par la simplicite recherchee il n'y a pas de types ou d'attributs : BSON, Bencode, JSON, pList, XML, etc.
184        function exportLignesMultiples($balises, $echappements=array(), $champDebut='', $champFin='', $indent="\t", $entetesPerso='') {
185                $this->out .= "$balises[compteresultat1]\n";
186                if (!$entetesPerso) {
187                        $this->out .= "$indent$balises[entete1]\n";
188                        $this->out .= "$indent$indent$balises[titre1] $champDebut". utf8_decode(html_entity_decode(_T('asso:cpte_resultat_titre_general'))) ."$champFin $balises[titre0]\n";
189                        $this->out .= "$indent$indent$balises[nom1] $champDebut". $GLOBALS['association_metas']['nom'] ."$champFin $balises[nom0]\n";
190                        $this->out .= "$indent$indent$balises[exercice1] $champDebut". sql_asso1champ('exercice', $this->exercice, 'intitule') ."$champFin $balises[exercice0]\n";
191                        $this->out .= "$indent$balises[entete0]\n";
192                }
193                foreach (array('charges', 'produits', 'contributions_volontaires') as $nomClasse) {
194                        switch ($nomClasse) {
195                                case 'charges' :
196                                        $quoi = "SUM(depense) AS valeurs";
197                                        break;
198                                case 'produits' :
199                                        $quoi = "SUM(recette) AS valeurs";
200                                        break;
201                                case 'contributions_volontaires' :
202                                        $quoi = "SUM(depense) AS charge_evaluee, SUM(recette) AS produit_evalue";
203                                        break;
204                        }
205                        $baliseClasse = $nomClasse.'1';
206                        $this->out .= "$indent$balises[$baliseClasse]\n";
207                        $query = sql_select(
208                                "imputation, $quoi ".$this->sel, // select
209                        'spip_asso_comptes'.$this->join, // from
210                                $this->where, // where
211                                $this->order, // group by
212                                $this->order, // order by
213                        '', // limit
214                                $this->having .$GLOBALS['association_metas']['classe_'.$nomClasse] // having
215                        );
216                        $chapitre = '';
217                        $i = 0;
218                        while ($data = sql_fetch($query)) {
219                                if ($key==='contributions_volontaires') {
220                                        if ($data['charge_evaluee']>0) {
221                                                $valeurs = $data['charge_evaluee'];
222                                        } else {
223                                                $valeurs = $data['produit_evalue'];
224                                        }
225                                } else {
226                                        $valeurs = $data['valeurs'];
227                                }
228                                $new_chapitre = substr($data['code'], 0, 2);
229                                if ($chapitre!=$new_chapitre) {
230                                        if ($chapitre!='') {
231                                                $this->out .= "$indent$indent$balises[chapitre0]\n";
232                                        }
233                                        $this->out .= "$indent$indent$balises[chapitre1]\n";
234                                        $this->out .= "$indent$indent$indent$balises[code1] $champDebut". str_replace(array_keys($echappements), array_values($echappements), $new_chapitre) ."$champFin $balises[code0]\n";;
235                                        $this->out .= "$indent$indent$indent$balises[libelle1] $champDebut". str_replace(array_keys($echappements), array_values($echappements), ($GLOBALS['association_metas']['plan_comptable_prerenseigne']?association_plan_comptable_complet($new_chapitre):sql_getfetsel('intitule','spip_asso_plan',"code='$new_chapitre'"))) ."$champFin $balises[libelle0]\n";
236                                        $chapitre = $new_chapitre;
237                                }
238                                $this->out .= "$indent$indent$indent$balises[categorie1]\n";
239                                $this->out .= "$indent$indent$indent$indent$balises[code1] $champDebut". str_replace(array_keys($echappements), array_values($echappements), $data['code']) ."$champFin $balises[code0]\n";
240                                $this->out .= "$indent$indent$indent$indent$balises[intitule1] $champDebut". str_replace(array_keys($echappements), array_values($echappements), $data['intitule']) ."$champFin $balises[intitule0]\n";
241                                $this->out .= "$indent$indent$indent$indent$balises[montant1] $champDebut".$valeurs."$champFin $balises[montant0]\n";
242                                $this->out .= "$indent$indent$indent$balises[categorie0]\n";
243                        }
244                        if ($chapitre!='') {
245                                $this->out .= "$indent$indent$balises[chapitre0]\n";
246                        }
247                        $baliseClasse = $nomClasse.'0';
248                        $this->out .= "$indent$balises[$baliseClasse]\n";
249                }
250                $this->out .= "$balises[compteresultat0]\n";
251        }
252
253        // fichier texte final a afficher/telecharger
254        function leFichier($ext) {
255                $fichier = _DIR_RACINE.'/'._NOM_TEMPORAIRES_ACCESSIBLES.'compte_resultats_'.$this->exercice.".$ext"; // on essaye de creer le fichier dans le cache local/ http://www.spip.net/fr_article4637.html
256                $f = fopen($fichier, 'w');
257                fputs($f, $this->out);
258                fclose($f);
259                header('Content-type: application/'.$ext);
260                header('Content-Disposition: attachment; filename="'.$fichier.'"');
261                readfile($fichier);
262        }
263
264}
265
266?>
Note: See TracBrowser for help on using the repository browser.