PageRenderTime 26ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/scrutin_liste_proportionelle/formulaires/scrut_prop.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 329 lines | 267 code | 51 blank | 11 comment | 20 complexity | be10673b44b5f219fc262c453ad93c6b MD5 | raw file
  1. <?php
  2. function formulaires_scrut_prop_charger_dist($liste,$sieges='',$quota='',$prime='',$repartition='',$inscrits=''){
  3. $return = array();
  4. $tab_des_obligatoires = array();
  5. include_spip('scrut_prop_fonctions');
  6. $return['liste'] = array_map("scrut_prop_mettre_underscore",explode(';',$liste));
  7. //verifier que les sièges soient bien un entier
  8. $sieges2 = $sieges;
  9. settype($sieges,'int');
  10. if ($sieges2 != '' and !$sieges2==$sieges){
  11. return array('editable'=>false);
  12. }
  13. else{
  14. $return['sieges'] = $sieges2;
  15. $table_des_obligatoires[] = 'sieges';
  16. }
  17. //verifier que les quota soient bien un entier
  18. $quota2 = $quota;
  19. settype($quota,'int');
  20. if ($quota2 != '' and !$quota2==$quota){
  21. return array('editable'=>false);
  22. }
  23. else{
  24. $return['quota'] = $quota2;
  25. $table_des_obligatoires[] = 'quota';
  26. }
  27. //verifier que les prime soient bien un flottant
  28. $prime2 = $prime;
  29. settype($prime,'float');
  30. if ($prime2 != '' and !$prime2==$prime){
  31. return array('editable'=>false);
  32. }
  33. else{
  34. $return['prime'] = $prime2;
  35. $table_des_obligatoires[] = 'prime';
  36. }
  37. //verifier que les inscrits soient bien un entier
  38. $inscrits2 = $inscrits;
  39. settype($inscrits,'int');
  40. if ($inscrits2 != '' and !$inscrits2==$inscrits){
  41. return array('editable'=>false);
  42. }
  43. else{
  44. $return['inscrits'] = $inscrits2;
  45. $table_des_obligatoires[] = 'inscrits';
  46. }
  47. //verifier que la repartition est bien reste ou moyenne
  48. if($repartition != '' and $repartition!='reste' and $repartition!='moyenne'){
  49. return array('editable'=>false);
  50. }
  51. else{
  52. $return['repartition'] = $repartition;
  53. $table_des_obligatoires[] = 'repartition';
  54. }
  55. $return['obligatoires'] = serialize($table_des_obligatoires);
  56. return $return;
  57. }
  58. function formulaires_scrut_prop_verifier_dist(){
  59. $resultats = array_map('supprime_espaces',_request('resultat'));
  60. $erreurs = array();
  61. $liste_fausse = array();
  62. //verification qu'on a bien affaire à des entiers
  63. foreach($resultats as $liste=>$resultat){
  64. settype($resultat,'integer');
  65. if(!$resultats[$liste]==$resultat){
  66. $liste_fausse[$liste] = true ;
  67. }
  68. }
  69. if (count($liste_fausse)){
  70. $erreurs['pas_entiers'] = 'Tout les résultats ne sont pas des entiers !';
  71. $erreurs['liste_fausse'] = $liste_fausse;
  72. $il_y_a_erreur = true;
  73. }
  74. //verification de la somme
  75. $inscrits = $resultats['inscrits'];
  76. $total = array_sum($resultats) - $inscrits;
  77. if ($total>$inscrits){
  78. $erreurs['voix_plus_inscrits'] = "Il y a plus de votants que d'inscrits";
  79. $il_y_a_erreur = true;
  80. }
  81. //verification du fait que le nombre d'inscrit est >0
  82. if($inscrits<=0){
  83. $erreurs['inscrits_nuls'] = "Le nombre d'inscrits est nul ou inférieur à 0";
  84. $il_y_a_erreur = true;
  85. }
  86. //vérification du seuil
  87. $quota = nb_fr_to_en(_request('quota'));
  88. $quota2 = $quota;
  89. settype($quota,'float');
  90. if (!$quota2==$quota){
  91. $erreurs['quota_pas_nombre'] = "Le seuil minimum fourni n'est pas un nombre";
  92. $il_y_a_erreur = true;
  93. }
  94. $quota = nb_en_to_fr($quota);
  95. //vérification du nombre de siège
  96. $siege = nb_fr_to_en(_request('siege'));
  97. $siege2 = $siege;
  98. settype($siege,'int');
  99. if (!($siege == $siege2) or $siege==0){
  100. $il_y_a_erreur = true;
  101. $erreurs['siege_pas_entier'] = 'Le nombre de siège est nul ou non entier';
  102. }
  103. //vérification de la prime
  104. $prime = nb_fr_to_en(_request('prime'));
  105. $prime2 = $prime;
  106. settype($prime,'int');
  107. if (!($prime==$prime2) or $prime>$siege){
  108. $il_y_a_erreur = true;
  109. $erreurs['prime_pas_entier'] = "La prime majoritaire n'est pas un nombre entier de siège, ou bien elle est supérieure au nombre de sièges à pourvoir";
  110. }
  111. //renvoi des résultats
  112. $erreurs['resultats'] = $resultats;
  113. if ($il_y_a_erreur){
  114. $erreurs['repartition'] = _request('repartition');
  115. $erreurs['sieges'] = nb_en_to_fr($siege2);
  116. $erreurs['quota'] = $quota2;
  117. $erreurs['prime'] = $prime2;
  118. //les obligatoires
  119. $obligatoires = unserialize(_request('obligatoires'));
  120. $valeur_champs_obligatoire = array();
  121. foreach ($obligatoires as $champ){
  122. if ($champ == 'inscrits'){
  123. $valeur_champs_obligatoire['inscrits'] = $resultats['inscrits'];
  124. }
  125. else{
  126. $valeur_champs_obligatoire[$champ] = str_replace(' ','',$erreurs[$champ]);
  127. }
  128. }
  129. $erreurs['valeurs_champs_obligatoire'] = $valeur_champs_obligatoire;
  130. return $erreurs;
  131. }
  132. else
  133. return array();
  134. }
  135. function formulaires_scrut_prop_traiter_dist(){
  136. //resultat du formulaire
  137. $resultats = array_map('supprime_espaces',_request('resultat'));
  138. $sieges = _request('siege');
  139. $quota = nb_fr_to_en(_request('quota'));
  140. $repartition = _request('repartition');
  141. $prime = _request('prime');
  142. settype($prime,'int'); //la prime est un entier pouvant être nul
  143. //participation
  144. $votants = array_sum($resultats) - $resultats['inscrits'];
  145. $return['votants_pc'] = nb_en_to_fr(round($votants * 100 /$resultats['inscrits'],2));
  146. $return['votants'] = nb_en_to_fr($votants);
  147. $return['inscrits'] = nb_en_to_fr($resultats['inscrits']);
  148. //exprimes
  149. $return['blancs'] = (int) $resultats['blancs'];
  150. $return['blancs_pc'] = nb_en_to_fr($resultats['blancs'] * 100 / $votants,2);
  151. $return['exprimes'] = $votants - $return['blancs'];
  152. //quota
  153. settype($quota,'float');
  154. $return['quota_pc'] = nb_en_to_fr($quota);
  155. $return['quota'] = floor($quota * $return['exprimes'] / 100) ; // faut-il arrondir au dessus ou au dessous ?
  156. $return['sieges'] = nb_en_to_fr($sieges);
  157. $return['prime'] = nb_en_to_fr($prime);
  158. $sieges = $sieges - $prime ; // on ne distribue pas à la prop la prime majoritaire, par déf !
  159. //on ne prend que les listes qui font plus du seuil
  160. $listes_repartis = array();
  161. $liste_sieges = array();
  162. unset($resultats['blancs']);
  163. unset($resultats['inscrits']);
  164. foreach($resultats as $liste => $voix){
  165. $voix < $return['quota'] ? $liste_sieges[$liste] = 0 : $liste_reparti[$liste] = $voix;
  166. $listes_pc[$liste] = nb_en_to_fr($voix * 100 /$return['exprimes'],2);
  167. }
  168. $return['voix_pc'] = $listes_pc;
  169. //calcul du quotient
  170. $voix_utiles = array_sum($liste_reparti);
  171. $quotient = $voix_utiles / $sieges;
  172. $return['quotient'] = nb_en_to_fr($quotient,2);
  173. $siege_par_listes = array();
  174. //repartition des premiers sièges
  175. foreach($liste_reparti as $liste=>$voix){
  176. $sieges_par_listes[$liste] = floor($voix/$quotient);
  177. $restes[$liste] = $voix % $quotient;
  178. }
  179. //sièges restants : à la plus fort moyen ou au plus fort rest
  180. if ($repartition == 'moyenne'){
  181. $sieges_par_listes = sieges_restants_moyenne($sieges_par_listes,$sieges,$liste_reparti);
  182. $return['restants']= "Scrutin à la plus forte moyenne";
  183. }
  184. else{
  185. $sieges_par_listes = sieges_restants_reste($sieges_par_listes,$restes,$sieges);
  186. $return['restants']= "Scrutin au plus fort reste";
  187. }
  188. $liste_sieges = array_merge($liste_sieges,$sieges_par_listes);
  189. //prime majoritaire
  190. $max = max($resultats);
  191. $return['liste_primee'] = array_search($max,$resultats);
  192. $liste_sieges[$return['liste_primee']] = $liste_sieges[$return['liste_primee']] + $prime;
  193. $return['sieges_par_liste'] = $liste_sieges;
  194. //appliquer un peu de typo
  195. foreach ($resultats as $liste=>$voix){
  196. $resultats[$liste] = nb_en_to_fr($voix);
  197. }
  198. $return['quota'] = nb_en_to_fr($return['quota']);
  199. $return['exprimes'] = nb_en_to_fr($return['exprimes']);
  200. //returner ce qu'il faut
  201. $return['voix_par_liste'] = $resultats;
  202. return array('message_ok'=>$return);
  203. }
  204. //fonction de conversion
  205. function nb_fr_to_en($nb){
  206. return str_replace(',', '.' ,$nb);
  207. }
  208. function nb_en_to_fr($nb,$dec=0){
  209. return number_format($nb,$dec,','," ");
  210. }
  211. //repartition des sièges non attribués
  212. function sieges_restants_moyenne($sieges_par_listes,$sieges,$voix){
  213. $moyenne = array();
  214. while (array_sum($sieges_par_listes) < $sieges){
  215. foreach($sieges_par_listes as $liste => $siege){
  216. $moyenne[$liste] = $voix[$liste] / ($siege+1) ;
  217. }
  218. $plus_forte = max($moyenne);
  219. foreach ($moyenne as $liste => $moy){
  220. if ($moy == $plus_forte){
  221. $sieges_par_listes[$liste] = $sieges_par_listes[$liste]+1;
  222. break;
  223. }
  224. }
  225. }
  226. return $sieges_par_listes;
  227. }
  228. function supprime_espaces($i){
  229. return str_replace(' ','',$i);
  230. }
  231. function sieges_restants_reste($sieges_par_listes,$restes,$sieges){
  232. arsort($restes);
  233. while(array_sum($sieges_par_listes) < $sieges){
  234. $clef = key($restes);
  235. $sieges_par_listes[$clef] = $sieges_par_listes[$clef]+1;
  236. next($restes);
  237. }
  238. return $sieges_par_listes;
  239. }
  240. ?>