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

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

hot fixes r64577 and r66942

File size: 11.6 KB
Line 
1<?php
2/***************************************************************************\
3 *  Associaspip, extension de SPIP pour gestion d'associations
4 *
5 * @copyright Copyright (c) 2007 Bernard Blazin & Francois de Montlivault
6 * @copyright Copyright (c) 2010--2011 Emmanuel Saint-James
7 * @copyright Copyright (c) 201108 Marcel Bolla
8 *
9 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
10\***************************************************************************/
11if (!defined('_ECRIRE_INC_VERSION'))
12        return;
13
14function exec_comptes() {
15        if (!autoriser('voir_compta', 'association')) {
16                include_spip('inc/minipres');
17                echo minipres();
18        } else {
19                include_spip ('inc/navigation_modules');
20// initialisations
21                $vu = _request('vu');
22                if (!is_numeric($vu))
23                        $vu = '';
24                $imputation = _request('imputation');
25                if (!$imputation)
26                        $imputation= '%';
27                $id_compte = association_passeparam_id('compte');
28                list($id_periode, $critere_periode) = association_passeparam_periode('operation', 'asso_comptes', $id_compte);
29// traitements
30                $where = 'imputation LIKE '. sql_quote($imputation);
31                $where .= (!is_numeric($vu) ? '' : " AND vu=$vu");
32                $where .= " AND $critere_periode";
33                onglets_association('titre_onglet_comptes', 'comptes');
34                $journaux = sql_allfetsel('journal, intitule', 'spip_asso_comptes RIGHT JOIN spip_asso_plan ON journal=code', $critere_periode, "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)
35                // TOTAUX : operations de l'exercice par compte financier (indique rapidement les comptes financiers les plus utilises ou les modes de paiement preferes...)
36                foreach (array('recette','depense') as $direction) {
37                        foreach ($journaux as $financier) {
38                                $nombre_direction = sql_countsel('spip_asso_comptes', "journal=".sql_quote($financier['journal'])." $critere_periode AND $direction<>0 ");
39                                if ($nombre_direction) { // on ne s'embarasse pas avec ceux a zero
40                                        $direction_decomptes[$financier['journal']] = array( $financier['intitule'], $nombre_direction, );
41                                }
42                        }
43                        if (count($direction_libelles))
44                                echo association_totauxinfos_effectifs(_T('asso:compte_entete_financier') .': '. _T('asso:'.$direction.'s'), $direction_decomptes); // ToDo: tri par ordre decroissant (sorte de "top")
45                }
46                // TOTAUX : operations de l'exercice par type d'operation
47                $classes = array('pair'=>'produits', 'impair'=>'charges', 'cv'=>'contributions_volontaires', 'vi'=>'banques');
48                $liste_types = array();
49                foreach ($classes as $classe_css=>$classe_cpt) {
50                        $liste_types[$classe_css] = array( 'compte_liste_nombre_'.$classe_css, sql_countsel('spip_asso_comptes', "LEFT(imputation,1)=".sql_quote($GLOBALS['association_metas']["classe_$classe_cpt"])." AND $critere_periode "), );
51                }
52                echo association_totauxinfos_effectifs(_T('asso:bouton_radio_type_operation_titre'), $liste_types);
53                // STATS : montants de l'exercice pour l'imputation choisie (toutes si aucune)
54                echo association_totauxinfos_stats('mouvements', 'comptes', array('bilan_recettes'=>'recette','bilan_depenses'=>'depense',), $where, 2);
55                // TOTAUX : montants de l'exercice pour l'imputation choisie (toutes si aucune)
56                $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
57                echo association_totauxinfos_montants(($imputation=='%' ? _T('asso:tous') : $imputation), $data['somme_recettes'], $data['somme_depenses']);
58                // datation et raccourcis
59                raccourcis_association(array(), array(
60                        'encaisse_titre_general' => array('finances-24.png', array('encaisse', ($GLOBALS['association_metas']['exercices']?'exercice':'annee')."=$id_periode") ),
61                        'cpte_resultat_titre_general' => array('finances-24.png', array('compte_resultat', ($GLOBALS['association_metas']['exercices']?'exercice':'annee')."=$id_periode") ),
62                        'cpte_bilan_titre_general' => array('finances-24.png', array('compte_bilan', ($GLOBALS['association_metas']['exercices']?'exercice':'annee')."=$id_periode") ),
63#                       'annexe_titre_general' => array('finances-24.png', array('annexe', ($GLOBALS['association_metas']['exercices']?'exercice':'annee')."=$id_periode") ),
64                        'ajouter_une_operation' => array('ajout-24.png', 'edit_compte'),
65                ) );
66                debut_cadre_association('finances-24.png', 'informations_comptables');
67                // FILTRES
68                $filtre_imputation = '<select name="imputation" onchange="form.submit()">';
69                $filtre_imputation .= '<option value="%" ';
70                $filtre_imputation .= (($imputation=='%' || $imputation='')?' selected="selected"':'');
71                $filtre_imputation .= '>'. _T('asso:entete_tous') .'</option>';
72                $sql = sql_select(
73                        'imputation , code, intitule, classe',
74                        'spip_asso_comptes RIGHT JOIN spip_asso_plan ON imputation=code',
75                        "classe<>". sql_quote($GLOBALS['association_metas']['classe_banques']) ." AND active AND $critere_periode ", // pour l'exercice en cours... ; n'afficher ni les comptes de la classe financiere --ce ne sont pas des imputations-- ni les inactifs
76                        'code', 'code ASC');
77                while ($plan = sql_fetch($sql)) { // Remplir le select uniquement avec les comptes utilises
78                        $filtre_imputation .= '<option value="'.$plan['code'].'"';
79                        $filtre_imputation .= ($imputation==$plan['code']?' selected="selected"':'');
80                        $filtre_imputation .= '>'.$plan['code'].' - '.$plan['intitule'].'</option>';
81                }
82                $filtre_imputation .= '</select>';
83                $filtre_vu = '<select name="vu" onchange="form.submit()">';
84                $filtre_vu .= '<option value="" '. ($vu==''?'':' selected="selected"') .'>'. _T('asso:cpte_op_vu_tous') .'</option>';
85                $filtre_vu .= '<option value="0" '. ($vu=='0'?' selected="selected"':'') .'>'. _T('asso:cpte_op_vu_non') .'</option>';
86                $filtre_vu .= '<option value="1" '. ($vu=='1'?' selected="selected"':'') .'>'. _T('asso:cpte_op_vu_oui') .'</option>';
87                $filtre_vu .= '</select>';
88                filtres_association(array(
89                        'periode' => array($id_periode, 'asso_comptes', 'operation'),
90#                       'id' => $id_compte,
91                ), 'comptes', array(
92                        'imputation' => $filtre_imputation,
93                        'vu' => $filtre_vu,
94                ));
95                if ($id_compte) { // (re)calculer la pagination en fonction de id_compte
96                        $all_id_compte = sql_allfetsel('id_compte', 'spip_asso_comptes', $where, '',  'date_operation DESC,id_compte DESC'); // on recupere les id_comptes de la requete sans le critere de limite...
97                        $index_id_compte = -1;
98                        reset($all_id_compte);
99                        while (($index_id_compte<0) && (list($k,$v) = each($all_id_compte))) { // ...et on en tire l'index de l'id_compte recherche parmis tous ceux disponible
100                                if ($v['id_compte']==$id_compte) $index_id_compte = $k;
101                        }
102                        if ($index_id_compte>=0) { // on recalcule le parametre de limite de la requete
103                                set_request('debut', intval($index_id_compte/_ASSOCIASPIP_LIMITE_SOUSPAGE)*_ASSOCIASPIP_LIMITE_SOUSPAGE);
104                        }
105                }
106                // TABLEAU
107                $table = comptes_while($where, sql_asso1page(), $id_compte);
108                if ($table) { // affichage de la liste
109                        // SOUS-PAGINATION
110                        $nav = association_selectionner_souspage(array('spip_asso_comptes', $where), 'comptes', ($GLOBALS['association_metas']['exercices']?'exercice':'annee')."=$id_periode".($imputation?"&imputation=$imputation":''). (is_numeric($vu)?"&vu=$vu":''), FALSE);
111                        // ENTETES
112                        $table = "<table width='100%' class='asso_tablo' $onload_option id='asso_liste_comptes'>\n"
113                        . "<thead>\n<tr>"
114                        . '<th>'. _T('asso:entete_id') .'</th>'
115                        . '<th>'. _T('asso:entete_date') .'</th>'
116                        . '<th>'. _T('asso:compte_entete_imputation') .'</th>'
117                        . '<th>'. _T('asso:compte_entete_justification') .'</th>'
118                        . '<th>'. _T('asso:entete_montant') .'</th>'
119                        . '<th>'. _T('asso:compte_entete_financier') .'</th>'
120                        . '<th colspan="2" class="actions">'. _T('asso:entete_actions') .'</th>'
121                        . '<th><input title="'._T('asso:selectionner_tout').'" type="checkbox" id="selectionnerTous" onclick="var currentVal = this.checked; var checkboxList = document.getElementsByName(\'valide[]\'); for (var i in checkboxList) {checkboxList[i].checked=currentVal;}" /></th>'
122                        . "</tr>\n</thead><tbody>"
123                        . $table
124                        . "</tbody>\n</table>\n"
125                        . "<table width='100%' class='asso_tablo_filtres'><tr>\n<td align='left'>" . $nav . '</td><td align="right" width="30"><input type="submit" value="'. _T('asso:bouton_valider') . '"  /></td></tr></table>';
126                        echo generer_form_ecrire('action_comptes', $table);
127                } else { // absence d'operation pour l'exercice
128                        echo '<table width="100%"><tbody><tr><td class="actions erreur">' .( $id_periode ? _T('asso:exercice_sans_operation') : '<a href="'.generer_url_ecrire('exercices').'">'._T('asso:ajouter_un_exercice').'</a>' ). '</td></tr></tbody></table>';
129                }
130                fin_page_association();
131        }
132}
133
134function comptes_while($where, $limit, $id_compte) {
135        $query = sql_select('*', 'spip_asso_comptes', $where,'',  'date_operation DESC,id_compte DESC', $limit);
136        $comptes = '';
137        while ($data = sql_fetch($query)) {
138                if ($data['depense']>0) { // depense
139                        $class = 'impair';
140                } else { // recette
141                        $class = 'pair';
142                }
143                if ($data['imputation']==$GLOBALS['association_metas']['pc_intravirements']) { // virement interne
144                        $class = 'vi';
145                }
146                if (substr($data['imputation'],0,1)==$GLOBALS['association_metas']['classe_contributions_volontaires']) { // contribution volontaire
147                        $class = 'cv';
148                }
149                if($id_compte==$data['id_compte']) { // operation recherchee
150                        $onload_option .= 'onLoad="document.getElementById(\'compte'.$id_compte.'\').scrollIntoView(TRUE);"'; // pour voir au chargement l'id_compte recherche
151                        $class = 'surligne';
152                } else {
153                        $onload_option = '';
154                }
155                $comptes .= "<tr id='compte".$data['id_compte']."' class='$class'>"
156                . '<td class="integer">'.$data['id_compte'].'</td>'
157                . '<td class="date">'. association_formater_date($data['date']) .'</td>'
158                . '<td class="text">'. $data['imputation'].'</td>'
159                . '<td class="text">&nbsp;'. propre($data['justification']) .'</td>'
160                . '<td class="decimal">'. association_formater_prix($data['recette']-$data['depense']) .'</td>'
161                . '<td class="text">&nbsp;'.$data['journal'].'</td>';
162                if ( $data['vu'] ) { // pas d'action sur les operations validees !
163                        $comptes .= '<td class="action" colspan="2">'. association_formater_puce($data['id_journal'], 'verte', '', $onload_option) .' </td>'; // edition+suppresion
164                        $comptes .= association_bouton_coch(''); // validation
165                } else {  // operation non validee (donc validable et effacable...
166                        if ( $data['id_journal'] && $data['imputation']!=$GLOBALS['association_metas']['pc_cotisations'] ) { // pas d'edition/suppression des operations gerees par un autre module (exepte les cotisations) ...par souci de coherence avec les donnees dupliquees dans d'autres tables...
167                                $comptes .= '<td class="action" colspan="2">'. association_formater_puce($data['id_journal'], 'rouge', '', $onload_option) .'</td>'; // edition+suppression
168                        } else { // operation geree par ce module
169                                if (substr($data['imputation'],0,1)==$GLOBALS['association_metas']['classe_banques']) { // pas d'edition des virements internes (souci de coherence car il faut modifier deux operations concordament : ToDo...)
170                                        $comptes .= '<td class="action">&nbsp;</td>'; // edition
171                                } else { // le reste est editable
172                                        $comptes .= association_bouton_edit('compte', 'id='.$data['id_compte']); // edition
173                                }
174                                $comptes .= association_bouton_suppr('comptes', 'id='.$data['id_compte']); // suppression
175                        }
176                        $comptes .= association_bouton_coch('valide', $data['id_compte']); // validation
177                }
178                $comptes .= '</tr>';
179        }
180        return $comptes;
181}
182
183?>
Note: See TracBrowser for help on using the repository browser.