source: spip-zone/_plugins_/Association/Associaspip/exec/comptes.php @ 61063

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

harmonisation, correction et extension du filtrage des listes principales

File size: 12.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
12if (!defined('_ECRIRE_INC_VERSION'))
13        return;
14
15include_spip ('inc/navigation_modules');
16
17function exec_comptes()
18{
19        if (!autoriser('associer', 'comptes')) {
20                include_spip('inc/minipres');
21                echo minipres();
22        } else {
23// initialisations
24                $id_exercice = intval(_request('exercice'));
25                if(!$id_exercice){
26                        /* on recupere l'id du dernier exercice */
27                        $id_exercice = sql_getfetsel('id_exercice','spip_asso_exercices','','','debut DESC');
28                }
29                $vu = _request('vu');
30                if (!is_numeric($vu))
31                        $vu = '';
32                $imputation = _request('imputation');
33                if (!$imputation)
34                        $imputation= '%';
35                $max_par_page = intval(_request('max'));
36                if (!$max_par_page)
37                        $max_par_page = 30;
38                $id_compte = intval(_request('id_compte', $_GET));
39                if (!$id_compte) {
40                        $id_compte = '';
41                } else { // quand on a un id compte, on doit selectionner automatiquement l'exercice dans lequel il se trouve
42                        $date_operation = sql_getfetsel('date', 'spip_asso_comptes', 'id_compte='.$id_compte);
43                        $exercice = sql_getfetsel('id_exercice','spip_asso_exercices', "fin>='$date_operation' AND debut<='$date_operation'", '', 'debut DESC');
44                }
45                $debut = intval(_request('debut'));
46                $exercice_data = sql_asso1ligne('exercice', $id_exercice);
47// traitements
48                $where = 'imputation LIKE '. sql_quote($imputation);
49                $where .= (!is_numeric($vu) ? '' : " AND vu=$vu");
50                $where .= " AND date>='$exercice_data[debut]' AND date<='$exercice_data[fin]'";
51                onglets_association('titre_onglet_comptes');
52                // INTRO : rappel de l'exercicee affichee
53                echo totauxinfos_intro($exercice_data['intitule'],'exercice',$id_exercice);
54                $journaux = sql_allfetsel('journal, intitule', 'spip_asso_comptes RIGHT JOIN spip_asso_plan ON journal=code', "date>='$exercice_data[debut]' AND date<='$exercice_data[fin]'", "intitule DESC"); // on se permet sql_allfetsel car il s'agit d'une association (mois d'une demie dizaine de comptes) et non d'un etablissement financier (des milliers de comptes clients)
55                // TOTAUX : operations de l'exercice par compte financier (indique rapidement les comptes financiers les plus utilises ou les modes de paiement preferes...)
56                foreach (array('recette','depense') as $direction) {
57                        foreach ($journaux as $financier) {
58                                $nombre_direction = sql_countsel('spip_asso_comptes', "journal='".$financier['journal']."' AND date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' AND $direction<>0 ");
59                                if ($nombre_direction) { // on ne s'embarasse pas avec ceux a zero
60                                        $direction_libelles[$financier['journal']] = $financier['intitule'];
61                                        $direction_effectifs[$financier['journal']] = $nombre_direction;
62                                }
63                        }
64                        if (count($direction_libelles))
65                                echo totauxinfos_effectifs(_T('asso:compte_entete_financier') .': '. _T('asso:'.$direction.'s'), $direction_libelles, $direction_effectifs); // ToDo: tri par ordre decroissant (sorte de "top")
66                }
67                // TOTAUX : operations de l'exercice par type d'operation
68                $classes = array('pair'=>'produits', 'impair'=>'charges', 'cv'=>'contributions_volontaires', 'vi'=>'banques');
69                $liste_libelles = $liste_effectifs = array();
70                foreach ($classes as $classe_css=>$classe_cpt) {
71                        $liste_effectifs[$classe_css] = sql_countsel('spip_asso_comptes', "LEFT(imputation,1)='".$GLOBALS['association_metas']["classe_$classe_cpt"]."' AND date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' ");
72                        $liste_libelles[$classe_css] = 'compte_liste_nombre_'.$classe_css;
73                }
74                echo totauxinfos_effectifs('compte_entete_imputation', $liste_libelles, $liste_effectifs);
75                // STATS : montants de l'exercice pour l'imputation choisie (toutes si aucune)
76                echo totauxinfos_stats('mouvements', 'comptes', array('bilan_recettes'=>'recette','bilan_depenses'=>'depense',), $where, 2);
77                // TOTAUX : montants de l'exercice pour l'imputation choisie (toutes si aucune)
78                $data = sql_fetsel( 'SUM(recette) AS somme_recettes, SUM(depense) AS somme_depenses, code, classe',  'spip_asso_comptes RIGHT JOIN spip_asso_plan ON imputation=code', "$where AND classe<>".sql_quote($GLOBALS['association_metas']['classe_banques']). " AND classe<>".sql_quote($GLOBALS['association_metas']['classe_contributions_volontaires']), 'code'); // une contribution benevole ne doit pas etre comptabilisee en charge/produit
79                echo totauxinfos_montants(($imputation=='%' ? _T('asso:tous') : $imputation), $data['somme_recettes'], $data['somme_depenses']);
80                // datation et raccourcis
81                icones_association(array(), array(
82                        'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$id_exercice"),
83                        'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$id_exercice"),
84                        'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$id_exercice"),
85#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice"),
86                        'ajouter_une_operation' => array('ajout-24.png', 'edit_compte'),
87                ) );
88                debut_cadre_association('finances-24.png', 'informations_comptables');
89                // FILTRES
90                echo '<form method="get" action="'.generer_url_ecrire('comptes').'">';
91                echo "\n<input type='hidden' name='exec' value='comptes' />";
92                echo "\n<table width='100%' class='asso_tablo_filtres'><tr>";
93                echo '<td id="filtre_exercice">'. association_selectionner_exercice($id_exercice) .'</td>';
94#               echo '<td id="filtre_id">'. association_selectionner_id($id_compte) .'</td>';
95                echo '<td id="filtre_imputation">';
96                echo '<select name="imputation" onchange="form.submit()">';
97                echo '<option value="%" ';
98                if ($imputation=='%') {
99                        echo ' selected="selected"';
100                }
101                echo '>'. _T('asso:entete_tous') .'</option>';
102                $sql = sql_select(
103                        'imputation , code, intitule, classe',
104                        'spip_asso_comptes RIGHT JOIN spip_asso_plan ON imputation=code',
105                        "classe<>'".$GLOBALS['association_metas']['classe_banques']."' AND active AND date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' ", // pour l'exercice en cours... ; n'afficher ni les comptes de la classe financiere --ce ne sont pas des imputations-- ni les inactifs
106                        'code', 'code ASC');
107                while ($plan = sql_fetch($sql)) { // Remplir le select uniquement avec les comptes utilises
108                        echo '<option value="'.$plan['code'].'"';
109                        if ($imputation==$plan['code']) {
110                                echo ' selected="selected"';
111                        }
112                        echo '>'.$plan['code'].' - '.$plan['intitule'].'</option>';
113                }
114                echo '</select></td>';
115                echo '<noscript><td><input type="submit" value="'._T('asso:bouton_filtrer').'" /></noscript></td>';
116                echo '</tr></table></form>';
117                /* (re)calculer la pagination en fonction de id_compte */
118                if ($id_compte) {
119                        /* on recupere les id_comptes de la requete sans le critere de limite et on en tire l'index de l'id_compte recherche parmis tous ceux disponible */
120                        $all_id_compte = sql_allfetsel('id_compte', 'spip_asso_comptes', $where, '',  'date DESC,id_compte DESC');
121                        $index_id_compte = -1;
122                        reset($all_id_compte);
123                        while (($index_id_compte<0) && (list($k,$v) = each($all_id_compte))) {
124                                if ($v['id_compte']==$id_compte) $index_id_compte = $k;
125                        }
126                        /* on recalcule le parametre de limite de la requete */
127                        if ($index_id_compte>=0) {
128                                $debut = intval($index_id_compte/$max_par_page)*$max_par_page;
129                        }
130                }
131                // TABLEAU
132                $table = comptes_while($where, "$debut,$max_par_page", $id_compte);
133                if ($table) {
134                        //SOUS-PAGINATION
135                        $nombre_selection = sql_countsel('spip_asso_comptes', $where);
136                        $pages = intval($nombre_selection/$max_par_page)+1;
137                        $nav = '';
138                        if ($pages!=1)
139                                for ($i=0; $i<$pages; $i++) {
140                                        $position = $i*$max_par_page;
141                                        if ($position==$debut) {
142                                                $nav .= '<strong>'.$position.' </strong>';
143                                        } else {
144                                                $h = generer_url_ecrire('comptes',"exercice=$id_exercice"."&imputation=$imputation". (is_numeric($vu) ? "&vu=$vu" : '') ."&debut=$position");
145                                                $nav .= "<a href='$h'>$position</a>\n";
146                                }
147                        }
148                        //
149                        $table = "<table width='100%' class='asso_tablo' id='asso_tablo_comptes'>\n"
150                        . "<thead>\n<tr>"
151                        . '<th>'. _T('asso:entete_id') .'</th>'
152                        . '<th>'. _T('asso:entete_date') .'</th>'
153                        . '<th>'. _T('asso:compte_entete_imputation') .'</th>'
154                        . '<th>'. _T('asso:compte_entete_justification') .'</th>'
155                        . '<th>'. _T('asso:entete_montant') .'</th>'
156                        . '<th>'. _T('asso:compte_entete_financier') .'</th>'
157                        . '<th colspan="3" class="actions">'. _T('asso:entete_action') .'</th>'
158                        . "</tr>\n</thead><tbody>"
159                        . $table
160                        . "</tbody>\n</table>\n"
161                        . "<table width='100%'><tr>\n<td>" . $nav . '</td><td style="text-align:right;"><input type="submit" value="'. _T('asso:bouton_valider') . '" class="fondo" /></td></tr></table>';
162                        echo generer_form_ecrire('action_comptes', $table);
163                } else {
164                        echo '<table width="100%"><tbody><tr><td class="actions erreur">' .( $exercice ? _T('asso:exercice_sans_operation') : '<a href="'.generer_url_ecrire('exercices').'">'._T('asso:ajouter_un_exercice').'</a>' ). '</td></tr></tbody></table>';
165                }
166                fin_page_association();
167        }
168}
169
170function comptes_while($where, $limit, $id_compte)
171{
172        $query = sql_select('*', 'spip_asso_comptes', $where,'',  'date DESC,id_compte DESC', $limit);
173        $comptes = '';
174        while ($data = sql_fetch($query)) {
175                if ($data['depense']>0) { // depense
176                        $class = 'impair';
177                } else { // recette
178                        $class = 'pair';
179                }
180                if ($data['imputation']==$GLOBALS['association_metas']['pc_intravirements']) { // virement interne
181                        $class = 'vi';
182                }
183                if (substr($data['imputation'],0,1)==$GLOBALS['association_metas']['classe_contributions_volontaires']) { // contribution volontaire
184                        $class = 'cv';
185                }
186                if($id_compte==$data['id_compte']) { // pour voir au chargement l'id_compte recherche
187                        $onload_option .= 'onLoad="document.getElementById(\'id_compte'.$id_compte.'\').scrollIntoView(true);"';
188                        $class = 'surligne';
189                } else {
190                        $onload_option = '';
191                }
192                $comptes .= "<tr id='id_compte".$data['id_compte']."' class='$class'>"
193                . '<td class="integer">'.$data['id_compte'].'</td>'
194                . '<td class="date">'. association_datefr($data['date']) .'</td>'
195                . '<td class="text">'. $data['imputation'].'</td>'
196                . '<td class="text">&nbsp;'. propre($data['justification']) .'</td>'
197                . '<td class="decimal">'. association_prixfr($data['recette']-$data['depense']) .'</td>'
198                . '<td class="text">&nbsp;'.$data['journal'].'</td>'
199                . ( $data['vu']
200                        /* pas d'action sur les operations validees */
201                        ? ('<td class="action" colspan="2"><img src="'._DIR_PLUGIN_ASSOCIATION_ICONES.'puce-verte.gif" '.$onload_option.' /></td>'.'<td class="action"><input disabled="disabled" type="checkbox" /></td>')
202                        : ( ($data['id_journal'] && $data['imputation']!=$GLOBALS['association_metas']['pc_cotisations'])
203                                /* pas d'edition/suppression des operations gerees par un module externe (souci de coherence avec des donnees d'autres tables) */
204                                ? ('<td class="action" colspan="2"><img src="'._DIR_PLUGIN_ASSOCIATION_ICONES.'puce-rouge.gif" '.$onload_option.' /></td>')
205                                : ( (substr($data['imputation'],0,1)==$GLOBALS['association_metas']['classe_banques'])
206                                        /* pas d'edition des virements internes (souci de coherence car il faut modifier deux operations concordament : ToDo...) */
207                                        ? '<td class="action">&nbsp;</td>'
208                                        /* le reste est editable */
209                                        : '<td class="action">'. association_bouton('mettre_a_jour', 'edit-12.gif', 'edit_compte', 'id='.$data['id_compte'], $onload_option) . '</td>'
210                                        )
211                                /* operation supprimable */
212                                . association_bouton_supprimer('comptes', 'id='.$data['id_compte'], 'td')
213                                )
214                        /* operation non validee (donc validable et editable ...ici ou via le module dedie...) */
215                        . '<td class="action"><input name="valide[]" type="checkbox" value="'.$data['id_compte']. '" /></td>'
216                )
217                . '</tr>';
218        }
219        return $comptes;
220}
221
222?>
Note: See TracBrowser for help on using the repository browser.