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

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

quelques petites corrections sur les derniers commits relatifs à la compta

File size: 11.9 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                echo "\n<table width='100%'><tr>";
90                echo '<td width="50%" align="left">'. association_selectionner_exercice($id_exercice, generer_url_ecrire('comptes',"imputation=$imputation") ) .'</td>';
91                echo '<td width="50%" align="right">';
92                echo '<form method="post" action="'.generer_url_ecrire('comptes', "exercice=$id_exercice").'"><div>';
93                echo '<select name ="imputation" onchange="form.submit()">';
94                echo '<option value="%" ';
95                if ($imputation=='%') {
96                        echo ' selected="selected"';
97                }
98                echo '>Tous</option>';
99                /* Remplir le select uniquement avec les comptes utilises */
100                $sql = sql_select(
101                        'imputation , code, intitule, classe',
102                        'spip_asso_comptes RIGHT JOIN spip_asso_plan ON imputation=code',
103                        /* n'afficher ni les comptes de la classe financiere --ce ne sont pas des imputations-- ni les inactifs */
104                        "classe<>'".$GLOBALS['association_metas']['classe_banques']."' AND active AND date>='$exercice_data[debut]' AND date<='$exercice_data[fin]' ",
105                        'code', 'code ASC');
106                while ($plan = sql_fetch($sql)) {
107                        echo '<option value="'.$plan['code'].'" ';
108                        if ($imputation==$plan['code']) {
109                                echo ' selected="selected"';
110                        }
111                        echo '>'.$plan['code'].' - '.$plan['intitule'].'</option>';
112                }
113                echo '</select><noscript><input type="submit" value="'._T('asso:bouton_filtrer').'" /></noscript></div></form></td>';
114                echo '</tr></table>';
115                /* (re)calculer la pagination en fonction de id_compte */
116                if ($id_compte) {
117                        /* 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 */
118                        $all_id_compte = sql_allfetsel('id_compte', 'spip_asso_comptes', $where, '',  'date DESC,id_compte DESC');
119                        $index_id_compte = -1;
120                        reset($all_id_compte);
121                        while (($index_id_compte<0) && (list($k,$v) = each($all_id_compte))) {
122                                if ($v['id_compte']==$id_compte) $index_id_compte = $k;
123                        }
124                        /* on recalcule le parametre de limite de la requete */
125                        if ($index_id_compte>=0) {
126                                $debut = intval($index_id_compte/$max_par_page)*$max_par_page;
127                        }
128                }
129                // TABLEAU
130                $table = comptes_while($where, "$debut,$max_par_page", $id_compte);
131                if ($table) {
132                        //SOUS-PAGINATION
133                        $nombre_selection = sql_countsel('spip_asso_comptes', $where);
134                        $pages = intval($nombre_selection/$max_par_page)+1;
135                        $nav = '';
136                        if ($pages!=1)
137                                for ($i=0; $i<$pages; $i++) {
138                                        $position = $i*$max_par_page;
139                                        if ($position==$debut) {
140                                                $nav .= '<strong>'.$position.' </strong>';
141                                        } else {
142                                                $h = generer_url_ecrire('comptes',"exercice=$id_exercice"."&imputation=$imputation". (is_numeric($vu) ? "&vu=$vu" : '') ."&debut=$position");
143                                                $nav .= "<a href='$h'>$position</a>\n";
144                                }
145                        }
146                        //
147                        $table = "<table width='100%' class='asso_tablo' id='asso_tablo_comptes'>\n"
148                        . "<thead>\n<tr>"
149                        . '<th>'. _T('asso:entete_id') .'</th>'
150                        . '<th>'. _T('asso:entete_date') .'</th>'
151                        . '<th>'. _T('asso:compte_entete_imputation') .'</th>'
152                        . '<th>'. _T('asso:compte_entete_justification') .'</th>'
153                        . '<th>'. _T('asso:entete_montant') .'</th>'
154                        . '<th>'. _T('asso:compte_entete_financier') .'</th>'
155                        . '<th colspan="3" class="actions">'. _T('asso:entete_action') .'</th>'
156                        . "</tr>\n</thead><tbody>"
157                        . $table
158                        . "</tbody>\n</table>\n"
159                        . "<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>';
160                        echo generer_form_ecrire('action_comptes', $table);
161                } else {
162                        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>';
163                }
164                fin_page_association();
165        }
166}
167
168function comptes_while($where, $limit, $id_compte)
169{
170        $query = sql_select('*', 'spip_asso_comptes', $where,'',  'date DESC,id_compte DESC', $limit);
171        $comptes = '';
172        while ($data = sql_fetch($query)) {
173                if ($data['depense']>0) {
174                        $class = 'impair';
175                } else {
176                        $class = 'pair';
177                }
178                if ($data['imputation']==$GLOBALS['association_metas']['pc_intravirements']) {
179                        $class = 'vi';
180                } // virement interne
181                if (substr($data['imputation'],0,1)==$GLOBALS['association_metas']['classe_contributions_volontaires']) {
182                        $class = 'cv';
183                }
184                if($id_compte==$data['id_compte']) { /* pour voir au chargement l'id_compte recherche */
185                        $onload_option .= 'onLoad="document.getElementById(\'id_compte'.$id_compte.'\').scrollIntoView(true);"';
186                        $class = 'surligne';
187                } else {
188                        $onload_option = '';
189                }
190                $comptes .= "<tr id='id_compte".$data['id_compte']."' class='$class'>"
191                . '<td class="integer">'.$data['id_compte'].'</td>'
192                . '<td class="date">'. association_datefr($data['date']) .'</td>'
193                . '<td class="text">'. $data['imputation'].'</td>'
194                . '<td class="text">&nbsp;'. propre($data['justification']) .'</td>'
195                . '<td class="decimal">'. association_prixfr($data['recette']-$data['depense']) .'</td>'
196                . '<td class="text">&nbsp;'.$data['journal'].'</td>'
197                . ( $data['vu']
198                        /* pas d'action sur les operations validees */
199                        ? ('<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>')
200                        : ( ($data['id_journal'] && $data['imputation']!=$GLOBALS['association_metas']['pc_cotisations'])
201                                /* pas d'edition/suppression des operations gerees par un module externe (souci de coherence avec des donnees d'autres tables) */
202                                ? ('<td class="action" colspan="2"><img src="'._DIR_PLUGIN_ASSOCIATION_ICONES.'puce-rouge.gif" '.$onload_option.' /></td>')
203                                : ( (substr($data['imputation'],0,1)==$GLOBALS['association_metas']['classe_banques'])
204                                        /* pas d'edition des virements internes (souci de coherence car il faut modifier deux operations concordament : ToDo...) */
205                                        ? '<td class="action">&nbsp;</td>'
206                                        /* le reste est editable */
207                                        : '<td class="action">'. association_bouton('mettre_a_jour', 'edit-12.gif', 'edit_compte', 'id='.$data['id_compte'], $onload_option) . '</td>'
208                                        )
209                                /* operation supprimable */
210                                . association_bouton_supprimer('comptes', 'id='.$data['id_compte'], 'td')
211                                )
212                        /* operation non validee (donc validable et editable ...ici ou via le module dedie...) */
213                        . '<td class="action"><input name="valide[]" type="checkbox" value="'.$data['id_compte']. '" /></td>'
214                )
215                . '</tr>';
216        }
217        return $comptes;
218}
219
220?>
Note: See TracBrowser for help on using the repository browser.