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 | |
---|
13 | if (!defined('_ECRIRE_INC_VERSION')) |
---|
14 | return; |
---|
15 | |
---|
16 | include_spip ('inc/navigation_modules'); |
---|
17 | |
---|
18 | function 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 | */ |
---|
121 | function 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"> </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 | ?> |
---|