source: spip-zone/_plugins_/Association/Associaspip/exec/bilan.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: 11.1 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                if ($plan) {
75                        $join = ' RIGHT JOIN spip_asso_plan ON imputation=code';
76                        $sel = ', code, intitule, classe';
77                        $where = " date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' ";
78                        $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']) . "')";
79                        $order = 'code';
80                } else {
81                        $join = $sel = $where = $having = $order = '';
82                }
83                $classes = array(
84                        sql_quote($GLOBALS['association_metas']['classe_charges']),
85                        sql_quote($GLOBALS['association_metas']['classe_produits']),
86                );
87                // on boucle sur le tableau des destinations en refaisant le fetch a chaque iteration
88                foreach ($ids_destination_bilan as $id_destination) {
89                        //TABLEAU EXPLOITATION
90                        echo "\n<fieldset>";
91                        echo '<legend><b>'. ($id_destination ? $intitule_destinations[$id_destination] : ($GLOBALS['association_metas']['destinations']?_T('asso:toutes_destination'):'') ). '</b></legend>';
92                        $solde = association_liste_totaux_comptes_classes($classes, 'cpte_resultat', 0, $exercice, $id_destination);
93                        if(autoriser('associer', 'export_comptes') && !$id_destination){ // on peut exporter : pdf, csv, xml, ...
94                                echo "<br /><table width='100%' class='asso_tablo' cellspacing='6' id='asso_tablo_exports'>\n";
95                                echo '<tbody><tr>';
96                                echo '<td><b>'. _T('asso:cpte_resultat_mode_exportation') .'</b></td>';
97                                if (test_plugin_actif('FPDF')) { // impression en PDF
98                                        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()
99                                }
100                                foreach(array('csv','ctx','tex','tsv','xml','yaml') as $type) { // autres exports (donnees brutes) possibles
101                                        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...
102                                }
103                                echo '</tr></tbody></table>';
104                        }
105                        echo '</fieldset>';
106                }
107//              bilan_encaisse();
108                fin_page_association();
109        }
110}
111
112/* Dans la fonction suivante on dissocie la "lecture" et "l'affichage"
113 * afin de pouvoir traiter et calculer des valeurs intermédiaires :
114 * 1 - on ne comptabilise pour le terme "encaisse" que les sommes dont le journal est 53xx ou 51xx
115 * 2 - si "imputation" vaut 58xx : c'est un virement interne et le solde du compte doit etre a zéro
116 *              sinon il y a une erreur !!
117 * 3 - si "imputation" vaut 86xx ou 87xx : c'est une contribution volontaire ... il est preferable que
118 *              que les comptes 86 et 87 s'equilibrent. Faire apparaitre dans le "bilan" uniquement le cas ou il
119 *              y a desequilibre !
120 */
121function bilan_encaisse()
122{
123        $lesEcritures = array();
124        $lesEcritures['_58xx']['solde'] = $lesEcritures['_86xx']['solde'] = $lesEcritures['_87xx']['solde'] = 0;
125        $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' );
126        while ($val = sql_fetch($query)) {
127                /* on declare un tableau et on le rempli avec les donnees du compte */
128                $lesEcritures[$val['code']] = array(
129                        'code' => $val['code'],
130                        'intitule' => $val['intitule'],
131                        'date_solde' => $val['date_anterieure'],
132                        'solde_anterieur' => $val['solde_anterieur'],
133                        'id_plan' => $val['id_plan'],
134                );
135                /* ne pas comptabiliser les opérations au delà d'aujourd'hui meme si il y a des echeances futures !!!! */
136                $compte = sql_fetsel('SUM(recette) AS recettes, SUM(depense) AS depenses, date, imputation',
137                        'spip_asso_comptes',
138                        'date>='. sql_quote($lesEcritures[$val['code']]['date_solde']).' AND date<=NOW() AND (journal='. sql_quote($val['code']) .' OR imputation='. sql_quote($val['code']) .')',
139                        'journal');
140                if ($compte) {
141                        if(substr($compte['imputation'],0,1)===$GLOBALS['association_metas']['classe_contributions_volontaires']) {
142                                /* c'est une contribution volontaire du type 8xxx :
143                                 * c'est une dépense evaluee si 86xx ou recette évaluée si 87xx
144                                 * qui doit apparaître dans le compte de resultat
145                                 */
146                                $lesEcritures['_86xx']['solde'] += $compte['depenses'];
147                                $lesEcritures['_87xx']['solde'] += $compte['recettes'];
148                        } else {
149                                /* c'est une recette ou une depense */
150                                $lesEcritures[$code]['solde'] = $compte['recettes']-$compte['depenses'];
151                                if (substr($compte['imputation'],0,1)===$GLOBALS['association_metas']['classe_banques'])
152                                /* c'est un virement interne avec le code 58xx :
153                                 * le solde du compte doit être à zero sinon il y a erreur !
154                                 */
155                                        $lesEcritures['_58xx']['solde'] += $compte['recettes']-$compte['depenses'];
156                        }
157                }
158        }
159        echo "\n<fieldset>";
160        echo '<legend><strong>' . _T('asso:encaisse') . '</strong></legend>';
161        echo "<table width='100%' class='asso_tablo' id='asso_tablo_bilan_encaisse'>\n";
162        echo "<thead>\n<tr>";
163        echo '<th colspan="2">&nbsp;</th>';
164        echo '<th>'. _T('asso:avoir_initial') .'</th>';
165        echo '<th>'. _T('asso:avoir_actuel') .'</th>';
166        echo "</tr>\n</thead><tbody>";
167        $total_actuel = $total_initial = 0;
168        foreach($lesEcritures as $compteFinancier) {
169                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...
170                        echo '<tr id="'.$compteFinancier['id_plan'].'">';
171                        echo '<td class="text">'. $compteFinancier['code'] .' : '. $compteFinancier['intitule'] .'</td>';
172                        echo '<td class="date">'. association_datefr($compteFinancier['date_anterieure'],'dtstart') .'</td>';
173                        echo '<td class="decimal">'. association_prixfr($compteFinancier['solde_anterieur']) .'</td>';
174                        echo '<td class="decimal">'. association_prixfr($compteFinancier['solde_anterieur']+$compteFinancier['solde']) .'</td>';
175                        $total_initial += $compteFinancier['solde_anterieur'];
176                        $total_actuel += $compteFinancier['solde_anterieur']+$compteFinancier['solde'];
177                } else {
178                        if($compteFinancier['_86xx']['solde']!=$compteFinancier['_87xx']['solde']) {
179                                $erreur8687=TRUE;
180                        }
181                }
182        }
183        echo "</tr>\n</tbody><tfoot>\n<tr>";
184        echo '<th  colspan="2" class="text">'. _T('asso:encaisse') .'</th>';
185        echo '<th class="decimal">'. association_prixfr($total_initial) .'</th>';
186        echo '<th class="decimal">'. association_prixfr($total_actuel) .'</th>';
187        if( $compteFinancier['_58xx']['solde']!=0 ){
188                echo '<td  colspan="4" class="erreur">'. _T('asso:erreur_equilibre_comptes58') .'</td>';
189        }
190        if( $compteFinancier['_86xx']['solde']!=$compteFinancier['_87xx']['solde'] ){
191                echo '<td  colspan="4" class="erreur">'. _T('asso:erreur_equilibre_comptes8687') .'</td>';
192        }
193        echo "</tr>\n</tfoot>\n</table>\n";
194        echo '</fieldset>';
195}
196
197?>
Note: See TracBrowser for help on using the repository browser.