source: spip-zone/_plugins_/Association/Associaspip/exec/bilan.php @ 60892

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

harmonisation d'interface et quelques corrections en passant

File size: 11.2 KB
Line 
1<?php
2/***************************************************************************\
3 *  Associaspip, extension de SPIP pour gestion d'associations             *
4 *                                                                         *
5 *  Copyright (c) 2007 Bernard Blazin & Fran�ois de Montlivault (V1)       *
6 *  Copyright (c) 2010-2011 Emmanuel Saint-James & Jeannot Lapin (V2)       *
7 *                                                                         *
8 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
9 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
10\***************************************************************************/
11
12
13if (!defined('_ECRIRE_INC_VERSION'))
14        return;
15
16include_spip ('inc/navigation_modules');
17
18function exec_bilan()
19{
20        if (!autoriser('associer', 'comptes')) {
21                include_spip('inc/minipres');
22                echo minipres();
23        } else {
24                $plan = sql_countsel('spip_asso_plan');
25                $exercice = intval(_request('exercice'));
26                if(!$exercice){
27                        /* on recupere l'id_exercice dont la date "fin" est "la plus grande" */
28                        $exercice = sql_getfetsel('id_exercice','spip_asso_exercices','','','fin DESC');
29                        if(!$exercice)
30                                $exercice=0;
31                }
32                $exercice_data = sql_asso1ligne('exercice', $exercice);
33                // recupere l'id_destination de la ou des destinations dans POST ou cree une entree a 0 dans le tableau
34                if (!($ids_destination_bilan = _request('destination')))
35                        $ids_destination_bilan = array(0);
36                include_spip('inc/association_comptabilite');
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', $exercice, $infos);
42                // datation et raccourcis
43                icones_association(array('comptes', "exercice=$exercice"), array(
44                        'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$exercice"),
45#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$exercice"),
46                        'encaisse' => array('finances-24.png', 'encaisse', "exercice=$exercice"),
47                ));
48                // selecteur de destinations
49                if ($GLOBALS['association_metas']['destinations']) {// on affiche une liste de choix de destinations et on cree parallelement les intitule de toutes les destinations dans un tableau
50                        $select_destination = '';
51                        $intitule_destinations = array();
52                        $query = sql_select('id_destination, intitule', 'spip_asso_destination', '', '', 'intitule');
53                        while ($data = sql_fetch($query)) {
54                                $select_destination .= '<div class="choix"><input type="checkbox" name ="destination[]" value="'.$data['id_destination'].'" id="destination_'.$data['id_destination'].'"';
55                                if (!(array_search($data['id_destination'], $ids_destination_bilan)===FALSE))
56                                        $select_destination .= ' checked="checked"';
57                                $select_destination .= ' /><label for="destination_'.$data['id_destination'].'">'.$data['intitule'].'</label></div>';
58                                $intitule_destinations[$data['id_destination']] = $data['intitule'];
59                        }
60                        echo debut_cadre_enfonce('',true);
61                        echo '<h3>'. _T('plugins_vue_liste') .'</h3>';
62                        echo '<div class="formulaire_spip formulaire_asso_compteresultats">';
63                        echo '<form method="post" action="'.generer_url_ecrire('bilan', "exercice=$exercice").'"><ul><li>';
64                        echo '<div class="choix"><input type="checkbox" name ="destination[]" value="0" id="destination_0"';
65                        if (!(array_search(0, $ids_destination_bilan)===FALSE))
66                                echo ' selected="selected"';
67                        echo ' /><label for="destination_0">'._T('asso:toutes_destinations').'</label></div>'.$select_destination;
68                        echo '</li></ul>';
69                        echo '<p class="boutons"><input type="submit" value="'. _T('asso:compte_resultat') .'" /></p>';
70                        echo '</form></div>';
71                        echo fin_cadre_enfonce(true);
72                }
73                debut_cadre_association('finances-24.png', 'resultat_courant');
74                // Filtres
75                filtres_association(array(
76                        'exercice'=>$exercice,
77                ), 'bilan');
78                if ($plan) {
79                        $join = ' RIGHT JOIN spip_asso_plan ON imputation=code';
80                        $sel = ', code, intitule, classe';
81                        $where = " date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' ";
82                        $having =  "classe NOT IN ('". sql_quote($GLOBALS['association_metas']['classe_banques']). "','" .sql_quote($GLOBALS['association_metas']['classe_contributions_volontaires']) . "','" .sql_quote($GLOBALS['association_metas']['classe_charges']) . "','" .sql_quote($GLOBALS['association_metas']['classe_produits']) . "')";
83                        $order = 'code';
84                } else {
85                        $join = $sel = $where = $having = $order = '';
86                }
87                $classes = array(
88                        sql_quote($GLOBALS['association_metas']['classe_charges']),
89                        sql_quote($GLOBALS['association_metas']['classe_produits']),
90                );
91                // on boucle sur le tableau des destinations en refaisant le fetch a chaque iteration
92                foreach ($ids_destination_bilan as $id_destination) {
93                        //TABLEAU EXPLOITATION
94                        echo "\n<fieldset>";
95                        echo '<legend><b>'. ($id_destination ? $intitule_destinations[$id_destination] : ($GLOBALS['association_metas']['destinations']?_T('asso:toutes_destination'):'') ). '</b></legend>';
96                        $solde = association_liste_totaux_comptes_classes($classes, 'cpte_resultat', 0, $exercice, $id_destination);
97                        if(autoriser('associer', 'export_comptes') && !$id_destination){ // on peut exporter : pdf, csv, xml, ...
98                                echo "<br /><table width='100%' class='asso_tablo' cellspacing='6' id='asso_tablo_exports'>\n";
99                                echo '<tbody><tr>';
100                                echo '<td><b>'. _T('asso:cpte_resultat_mode_exportation') .'</b></td>';
101                                if (test_plugin_actif('FPDF')) { // impression en PDF
102                                        echo '<td class="action"><a href="'.generer_url_ecrire('export_compteresultats_pdf').'&var='.rawurlencode($var). '"><strong>PDF</strong></td>'; //!\ generer_url_ecrire() utilise url_enconde() or il est preferable avec les grosses variables serialisees d'utiliser rawurlencode()
103                                }
104                                foreach(array('csv','ctx','tex','tsv','xml','yaml') as $type) { // autres exports (donnees brutes) possibles
105                                        echo '<td class="action"><a href="'. generer_url_ecrire('export_compteresultats_'.$type).'&var='.rawurlencode($var). '"><strong>'. strtoupper($type) .'</strong></td>'; //!\ generer_url_ecrire($exec, $param) equivaut a generer_url_ecrire($exec).'&'.urlencode($param) or il faut utiliser rawurlencode($param) ici...
106                                }
107                                echo '</tr></tbody></table>';
108                        }
109                        echo '</fieldset>';
110                }
111//              bilan_encaisse();
112                fin_page_association();
113        }
114}
115
116/* Dans la fonction suivante on dissocie la "lecture" et "l'affichage"
117 * afin de pouvoir traiter et calculer des valeurs intermédiaires :
118 * 1 - on ne comptabilise pour le terme "encaisse" que les sommes dont le journal est 53xx ou 51xx
119 * 2 - si "imputation" vaut 58xx : c'est un virement interne et le solde du compte doit etre a zéro
120 *              sinon il y a une erreur !!
121 * 3 - si "imputation" vaut 86xx ou 87xx : c'est une contribution volontaire ... il est preferable que
122 *              que les comptes 86 et 87 s'equilibrent. Faire apparaitre dans le "bilan" uniquement le cas ou il
123 *              y a desequilibre !
124 */
125function bilan_encaisse()
126{
127        $lesEcritures = array();
128        $lesEcritures['_58xx']['solde'] = $lesEcritures['_86xx']['solde'] = $lesEcritures['_87xx']['solde'] = 0;
129        $query = sql_select('*', 'spip_asso_plan', '(classe='.sql_quote($GLOBALS['association_metas']['classe_banques']).' OR classe='.sql_quote($GLOBALS['association_metas']['classe_contributions_volontaires']).') AND active=1', '',  'code' );
130        while ($val = sql_fetch($query)) {
131                /* on declare un tableau et on le rempli avec les donnees du compte */
132                $lesEcritures[$val['code']] = array(
133                        'code' => $val['code'],
134                        'intitule' => $val['intitule'],
135                        'date_solde' => $val['date_anterieure'],
136                        'solde_anterieur' => $val['solde_anterieur'],
137                        'id_plan' => $val['id_plan'],
138                );
139                /* ne pas comptabiliser les opérations au delà d'aujourd'hui meme si il y a des echeances futures !!!! */
140                $compte = sql_fetsel('SUM(recette) AS recettes, SUM(depense) AS depenses, date, imputation',
141                        'spip_asso_comptes',
142                        'date>='. sql_quote($lesEcritures[$val['code']]['date_solde']).' AND date<=NOW() AND (journal='. sql_quote($val['code']) .' OR imputation='. sql_quote($val['code']) .')',
143                        'journal');
144                if ($compte) {
145                        if(substr($compte['imputation'],0,1)===$GLOBALS['association_metas']['classe_contributions_volontaires']) {
146                                /* c'est une contribution volontaire du type 8xxx :
147                                 * c'est une dépense evaluee si 86xx ou recette évaluée si 87xx
148                                 * qui doit apparaître dans le compte de resultat
149                                 */
150                                $lesEcritures['_86xx']['solde'] += $compte['depenses'];
151                                $lesEcritures['_87xx']['solde'] += $compte['recettes'];
152                        } else {
153                                /* c'est une recette ou une depense */
154                                $lesEcritures[$code]['solde'] = $compte['recettes']-$compte['depenses'];
155                                if (substr($compte['imputation'],0,1)===$GLOBALS['association_metas']['classe_banques'])
156                                /* c'est un virement interne avec le code 58xx :
157                                 * le solde du compte doit être à zero sinon il y a erreur !
158                                 */
159                                        $lesEcritures['_58xx']['solde'] += $compte['recettes']-$compte['depenses'];
160                        }
161                }
162        }
163        echo "\n<fieldset>";
164        echo '<legend><strong>' . _T('asso:encaisse') . '</strong></legend>';
165        echo "<table width='100%' class='asso_tablo' id='asso_tablo_bilan_encaisse'>\n";
166        echo "<thead>\n<tr>";
167        echo '<th colspan="2">&nbsp;</th>';
168        echo '<th>'. _T('asso:avoir_initial') .'</th>';
169        echo '<th>'. _T('asso:avoir_actuel') .'</th>';
170        echo "</tr>\n</thead><tbody>";
171        $total_actuel = $total_initial = 0;
172        foreach($lesEcritures as $compteFinancier) {
173                if( substr($compteFinancier['code'],0,1)==$GLOBALS['association_metas']['classe_banques'] ) { //!\ Tous les comptes financiers ne sont normalement pas concernes : idealement il aurait fallu configurer un groupe "caisse" (51xx) et un groupe "banque" (53xx) mais d'une part nous ignorons si d'autres systemes comptables n'utilisent pas plus de groupes et d'autre part (meme une association francaise) peut bien ne pas avoir les deux types de comptes...
174                        echo '<tr id="'.$compteFinancier['id_plan'].'">';
175                        echo '<td class="text">'. $compteFinancier['code'] .' : '. $compteFinancier['intitule'] .'</td>';
176                        echo '<td class="date">'. association_datefr($compteFinancier['date_anterieure'],'dtstart') .'</td>';
177                        echo '<td class="decimal">'. association_prixfr($compteFinancier['solde_anterieur']) .'</td>';
178                        echo '<td class="decimal">'. association_prixfr($compteFinancier['solde_anterieur']+$compteFinancier['solde']) .'</td>';
179                        $total_initial += $compteFinancier['solde_anterieur'];
180                        $total_actuel += $compteFinancier['solde_anterieur']+$compteFinancier['solde'];
181                } else {
182                        if($compteFinancier['_86xx']['solde']!=$compteFinancier['_87xx']['solde']) {
183                                $erreur8687=TRUE;
184                        }
185                }
186        }
187        echo "</tr>\n</tbody><tfoot>\n<tr>";
188        echo '<th  colspan="2" class="text">'. _T('asso:encaisse') .'</th>';
189        echo '<th class="decimal">'. association_prixfr($total_initial) .'</th>';
190        echo '<th class="decimal">'. association_prixfr($total_actuel) .'</th>';
191        if( $compteFinancier['_58xx']['solde']!=0 ){
192                echo '<td  colspan="4" class="erreur">'. _T('asso:erreur_equilibre_comptes58') .'</td>';
193        }
194        if( $compteFinancier['_86xx']['solde']!=$compteFinancier['_87xx']['solde'] ){
195                echo '<td  colspan="4" class="erreur">'. _T('asso:erreur_equilibre_comptes8687') .'</td>';
196        }
197        echo "</tr>\n</tfoot>\n</table>\n";
198        echo '</fieldset>';
199}
200
201?>
Note: See TracBrowser for help on using the repository browser.