source: pmb4.2/trunk/fuentes/pmb/classes/budgets.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 12.0 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2005 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: budgets.class.php,v 1.27 2015-04-03 11:16:20 jpermanne Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9require_once("$class_path/actes.class.php");
10
11if(!defined('TYP_BUD_RUB')) define('TYP_BUD_RUB', 0);   //Type de budget        0 = Affectation par rubrique
12if(!defined('TYP_BUD_GLO')) define('TYP_BUD_GLO', 1);   //                                      1 = Affectation globale
13
14if(!defined('STA_BUD_PRE')) define('STA_BUD_PRE', 0);   //Statut                0 = En préparation
15if(!defined('STA_BUD_VAL')) define('STA_BUD_VAL', 1);   //                              1 = Valide
16if(!defined('STA_BUD_CLO')) define('STA_BUD_CLO', 2);   //                              2 = Cloturé
17
18class budgets{
19       
20       
21        var $id_budget = 0;                                                     //Identifiant de budget
22        var $num_entite = 0;                                            //Identifiant de l'entité propriétaire du budget
23        var $num_exercice = 0;                                          //Numéro de l'exercice sur lequel le budget est affecté
24        var $libelle = '';                                                      //Libellé du budget
25        var $commentaires = '';                                         //Commentaires sur le budget
26        var $montant_global = '000000.00';                      //Montant global du budget
27        var $seuil_alerte = '000';                                      //Niveau d'alerte en % du montant global
28        var $statut = '0';                                                      //Statut du budget (0=En préparation, 1=valide, 2=Cloturé)
29        var $type_budget = '0';                                         //Type de budget 0=Affectation par rubriques, 1=Affectation globale
30         
31        //Constructeur. 
32        function budgets($id_budget= 0){ 
33               
34                if ($id_budget) {
35                        $this->id_budget = $id_budget;
36                        $this->load(); 
37                }
38        }       
39       
40       
41        // charge un budget à partir de la base.
42        function load(){
43       
44                global $dbh;
45               
46                $q = "select * from budgets where id_budget = '".$this->id_budget."' ";
47                $r = pmb_mysql_query($q, $dbh) ;
48                $obj = pmb_mysql_fetch_object($r);
49                $this->num_entite = $obj->num_entite;
50                $this->num_exercice = $obj->num_exercice;
51                $this->libelle = $obj->libelle;
52                $this->commentaires = $obj->commentaires;
53                $this->montant_global = $obj->montant_global;
54                $this->seuil_alerte = $obj->seuil_alerte;
55                $this->statut = $obj->statut;
56                $this->type_budget = $obj->type_budget;
57
58        }
59
60       
61        // enregistre un budget en base.
62        function save(){
63               
64                global $dbh;
65               
66                if( $this->libelle == '' || !$this->num_entite || !$this->num_exercice ) die("Erreur de création budgets");
67               
68                if($this->id_budget) {
69               
70                                $q = "update budgets set num_entite = '".$this->num_entite."', num_exercice = '".$this->num_exercice."', libelle = '".addslashes($this->libelle)."', ";
71                                $q.= "commentaires = '".addslashes($this->commentaires)."', montant_global = '".$this->montant_global."', seuil_alerte = '".$this->seuil_alerte."', ";
72                                $q.= "statut = '".$this->statut."', type_budget = '".$this->type_budget."' "; 
73                                $q.= "where id_budget = '".$this->id_budget."' ";
74                                pmb_mysql_query($q, $dbh);
75
76                } else {
77
78                        $q = "insert into budgets set num_entite = '".$this->num_entite."', num_exercice = '".$this->num_exercice."', libelle = '".addslashes($this->libelle)."', ";
79                        $q.= "commentaires = '".addslashes($this->commentaires)."', montant_global = '".$this->montant_global."', seuil_alerte = '".$this->seuil_alerte."', ";
80                        $q.= "statut = '".$this->statut."', type_budget = '".$this->type_budget."' "; 
81                        pmb_mysql_query($q, $dbh);
82                        $this->id_budget = pmb_mysql_insert_id($dbh);
83                       
84                }
85        }
86
87        // duplique un budget et l'enregistre en base.
88        static function duplicate($id_budget=0){
89               
90                global $dbh;   
91
92                $new_bud = new budgets($id_budget);
93                $new_bud->id_budget = 0;
94
95                $lib = $new_bud->libelle.'_';
96                $l_lib = strlen($lib);
97                $q = "select if(max(substring(libelle, ".$l_lib."+1)) is null, 1, max(substring(libelle, ".$l_lib."+1))+1)  from budgets ";
98                $q.= "where substring(libelle, 1, ".$l_lib.") = '".addslashes($lib)."' ";
99                $q.= "and substring(libelle, ".$l_lib."+1) regexp '^[0-9]+\$' ";
100                $r = pmb_mysql_query($q, $dbh);
101                $n=pmb_mysql_result($r, 0, 0);
102                $new_bud->libelle = $lib.$n;
103               
104                $new_bud->statut = STA_BUD_PRE;
105                $new_bud->save();
106                $id_new_bud = $new_bud->id_budget;
107               
108                $q = budgets::listAllRubriques($id_budget);
109                $r = pmb_mysql_query($q, $dbh);
110                $tab_p = array();
111                while (($obj=pmb_mysql_fetch_object($r))) {
112                       
113                        $new_rub = new rubriques($obj->id_rubrique);
114                        $new_rub->num_budget = $id_new_bud;
115                        $new_rub->id_rubrique = 0;
116                        if ($obj->num_parent) $new_rub->num_parent = $tab_p[$obj->num_parent];
117                        $new_rub->save();
118                        $id_new_rub = $new_rub->id_rubrique;
119                        $tab_p[$obj->id_rubrique]= $id_new_rub;
120                       
121                }
122                return $id_new_bud;
123                                       
124        }
125
126
127        //supprime un budget de la base
128        function delete($id_budget= 0) {
129               
130                global $dbh;
131
132                if(!$id_budget) $id_budget = $this->id_budget; 
133
134                $q = "delete from budgets where id_budget = '".$id_budget."' ";
135                pmb_mysql_query($q, $dbh);
136               
137                //supprime les rubriques associées
138                $q = "delete from rubriques where num_budget = '".$id_budget."' ";
139                pmb_mysql_query($q, $dbh);
140                               
141        }
142
143
144        //retourne une requete pour liste des budgets de l'entité
145        static function listByEntite($id_entite) {
146               
147                $q = "select * from budgets where num_entite = '".$id_entite."' order by statut, libelle  ";
148                return $q;
149        }
150
151
152        //retourne la liste des budgets d'un exercice
153        static function listByExercice($num_exercice) {
154               
155                global $dbh;
156
157                $q = "select id_budget from budgets where num_exercice = '".$num_exercice."' ";
158                $r = pmb_mysql_query($q, $dbh);
159                return $r;
160                               
161        }
162
163
164        //Vérifie si un budget existe                   
165        static function exists($id_budget){
166               
167                global $dbh;
168                $q = "select count(1) from budgets where id_budget = '".$id_budget."' ";
169                $r = pmb_mysql_query($q, $dbh); 
170                return pmb_mysql_result($r, 0, 0);
171               
172        }
173       
174               
175        //Vérifie si le libellé d'un budget existe déjà pour une entité et un même exercice             
176        static function existsLibelle($id_entite, $libelle, $id_exer, $id_budget=0){
177               
178                global $dbh;
179                $q = "select count(1) from budgets where libelle = '".$libelle."' and num_entite = '".$id_entite."' ";
180                $q.= "and num_exercice = '".$id_exer."' ";
181                if ($id_budget) $q.= "and id_budget != '".$id_budget."' ";
182                $r = pmb_mysql_query($q, $dbh); 
183                return pmb_mysql_result($r, 0, 0);
184               
185        }
186
187       
188        //compte le nb de budgets activés pour une entité                       
189        static function countActifs($id_entite, $id_budget=0){
190               
191                global $dbh;
192                $q = "select count(1) from budgets where num_entite = '".$id_entite."' and statut = '1' ";
193                if ($id_budget) $q.= "and id_budget != '".$id_budget."' ";
194                $r = pmb_mysql_query($q, $dbh); 
195                return pmb_mysql_result($r, 0, 0);
196               
197        }
198       
199
200        //Compte le nb de lignes d'actes affectées à un budget                 
201        static function hasLignes($id_budget=0){
202               
203                global $dbh;
204                $q = "select id_rubrique from rubriques where num_budget = '".$id_budget."' ";
205                $r = pmb_mysql_query($q, $dbh);
206                $nb = pmb_mysql_num_rows($r);
207               
208                if ($nb != '0') {                       
209                        $liste= '';
210                        for ($i=0; $i<$nb; $i++) { 
211                                $row =pmb_mysql_fetch_row($r);
212                                $liste.= $row[0];
213                                if ($i<$nb-1) $liste.= ', ';
214                        }
215                       
216                        $q = "select count(1) from lignes_actes where num_rubrique in (".$liste.") ";
217                        $r = pmb_mysql_query($q, $dbh); 
218                        return pmb_mysql_result($r, 0, 0);
219                } else return '0';
220               
221        }       
222
223       
224        //Retourne une requete pour les rubriques d'un budget ayant pour parent la rubrique mentionnée
225        static function listRubriques($id_budget=0, $num_parent=0){
226                $q = "select * from rubriques where num_budget = '".$id_budget."' ";
227                $q.= "and num_parent = '".$num_parent."' ";
228                $q.= "order by libelle ";
229                return $q;
230        }
231
232
233        //Retourne une requete pour l'ensemble des rubriques d'un budget       
234        static function listAllRubriques($id_budget=0){
235                $q = "select * from rubriques where num_budget = '".$id_budget."' order by num_parent asc ";
236                return $q;
237        }
238
239
240        //Retourne le nombre de rubriques d'un budget   
241        static function countRubriques($id_budget=0){
242               
243                global $dbh;
244                $q = "select count(1) from rubriques where num_budget = '".$id_budget."' ";
245                $r = pmb_mysql_query($q, $dbh);
246                return pmb_mysql_result($r, 0, 0); 
247               
248        }
249
250
251        //Retourne le nombre de rubriques finales du budget specifie en fonction de l'utilisateur       
252        static function countRubriquesFinales($id_budget=0, $userid=0){
253               
254                global $dbh;                   
255                $q = "select count(1) from rubriques left join rubriques as rubriques2 on rubriques.id_rubrique=rubriques2.num_parent ";
256                $q.= "where rubriques.num_budget = '".$id_budget."' and rubriques2.num_parent is NULL ";
257                if($userid) {
258                        $q.= "and rubriques.autorisations like('% ".$userid." %') ";                   
259                }
260                $r = pmb_mysql_query($q, $dbh); 
261                return pmb_mysql_result($r, 0, 0);
262        }       
263       
264               
265        //Retourne une requete pour liste des identifiants des rubriques finales du budget specifie en fonction de l'utilisateur       
266        static function listRubriquesFinales($id_budget=0, $userid=0){
267                       
268                $q = "select rubriques.id_rubrique from rubriques left join rubriques as rubriques2 on rubriques.id_rubrique=rubriques2.num_parent ";
269                $q.= "where rubriques.num_budget = '".$id_budget."' and rubriques2.num_parent is NULL ";
270                if($userid) {
271                        $q.= "and rubriques.autorisations like('% ".$userid." %') ";                   
272                }
273                return $q;
274        }       
275       
276       
277        //calcule le montant engagé pour un budget
278        static function calcEngagement($id_budget=0) {
279               
280                global $dbh;   
281                //      Montant Total engagé pour un budget =
282                //      Somme des Montants engagés non facturés pour les rubriques du budget par ligne de commande              (nb_commandé-nb_facturé)*prix_commande*(1-remise_commande)
283                //+ Somme des Montants engagés pour les rubriques du budget par ligne de facture                                        (nb_facturé)*prix_facture*(1-remise_facture)
284
285                $q1 = "select ";
286                $q1.= "lignes_actes.id_ligne, lignes_actes.nb as nb, lignes_actes.prix as prix, lignes_actes.remise as rem ";
287                $q1.= "from actes, lignes_actes, rubriques ";
288                $q1.= "where ";
289                $q1.= "actes.type_acte = '".TYP_ACT_CDE."' ";
290                $q1.= "and actes.statut > '".STA_ACT_AVA."' and ( (actes.statut & ".STA_ACT_FAC.") != ".STA_ACT_FAC.") ";
291                $q1.= "and rubriques.num_budget = '".$id_budget."' ";
292                $q1.= "and actes.id_acte = lignes_actes.num_acte ";
293                $q1.= "and lignes_actes.num_rubrique = rubriques.id_rubrique ";
294                $r1 = pmb_mysql_query($q1, $dbh);
295
296                $tab_cde = array();
297                while (($row1 = pmb_mysql_fetch_object($r1))) {
298                       
299                        $tab_cde[$row1->id_ligne]['nb']=$row1->nb;
300                        $tab_cde[$row1->id_ligne]['prix']=$row1->prix;                         
301                        $tab_cde[$row1->id_ligne]['rem']=$row1->rem;
302               
303                }                       
304               
305                $q2 = "select ";
306                $q2.= "lignes_actes.lig_ref, sum(nb) as nb ";
307                $q2.= "from actes, lignes_actes ";
308                $q2.= "where ";
309                $q2.= "actes.type_acte = '".TYP_ACT_FAC."' ";
310                $q2.= "and actes.id_acte = lignes_actes.num_acte ";
311                $q2.= "group by lignes_actes.lig_ref ";
312                $r2 = pmb_mysql_query($q2, $dbh);       
313
314                while(($row2 = pmb_mysql_fetch_object($r2))) {
315                        if(array_key_exists($row2->lig_ref,$tab_cde)) {
316                                $tab_cde[$row2->lig_ref]['nb'] = $tab_cde[$row2->lig_ref]['nb'] - $row2->nb; 
317                        }
318                }
319
320                $q3 = "select ";
321                $q3.= "lignes_actes.id_ligne, lignes_actes.nb as nb, lignes_actes.prix as prix, lignes_actes.remise as rem ";
322                $q3.= "from actes, lignes_actes, rubriques ";
323                $q3.= "where ";
324                $q3.= "actes.type_acte = '".TYP_ACT_FAC."' ";
325                $q3.= "and rubriques.num_budget = '".$id_budget."' ";
326                $q3.= "and actes.id_acte = lignes_actes.num_acte ";
327                $q3.= "and lignes_actes.num_rubrique = rubriques.id_rubrique ";
328                $r3 = pmb_mysql_query($q3, $dbh);
329                $tab_fac = array();
330                while (($row3 = pmb_mysql_fetch_object($r3))) {
331                       
332                        $tab_fac[$row3->id_ligne]['nb']=$row3->nb;
333                        $tab_fac[$row3->id_ligne]['prix']=$row3->prix;                         
334                        $tab_fac[$row3->id_ligne]['rem']=$row3->rem;
335               
336                }                       
337
338                $tot_bud = 0;
339                $tab = array_merge($tab_cde, $tab_fac);
340               
341                foreach($tab as $key=>$value) {
342                        $tot_lig = $tab[$key]['nb']*$tab[$key]['prix'];
343                        if($tab[$key]['rem'] != 0) $tot_lig = $tot_lig * (1- ($tab[$key]['rem']/100));
344                        $tot_bud = $tot_bud + $tot_lig;
345                }
346                return $tot_bud;
347        }
348       
349
350        //Recalcul du montant global du budget
351        static function calcMontant($id_budget=0) {
352               
353                global $dbh;
354               
355                if($id_budget) {
356                        $q = "select sum(montant) from rubriques where num_budget = '".$id_budget."' and num_parent = '0' ";
357                        $r = pmb_mysql_query($q, $dbh);
358                        $total = pmb_mysql_result($r,0,0);
359                        $budget = new budgets($id_budget);
360                        $budget->montant_global = $total;
361                        $budget->save();
362                }       
363        }       
364
365
366        //optimization de la table budgets
367        function optimize() {
368               
369                global $dbh;
370               
371                $opt = pmb_mysql_query('OPTIMIZE TABLE budgets', $dbh);
372                return $opt;
373                               
374        }
375       
376                               
377}
378?>
Note: See TracBrowser for help on using the repository browser.