crabs_todo-2.0 ©2008-2011 - Christophe Cazajus (crabs-mettre_le_signe_at-crabs-world.com)
1 <?php 2 // 3 // ============================================================================= 4 // crabs_todo-2.0 : Gestion simplissime des Todo 5 // Copyright (C) 2008-2011 : Christophe Cazajus (crabs-mettre_le_signe_at-crabs-world.com) 6 // 7 // Ce source fait partie d'un projet logiciel libre. Vous pouvez le distribuer 8 // et/ou le modifier en respectant les termes de la GNU General Public License 9 // version 2 ou (suite a votre propre choix) une version ulterieure. 10 // 11 // Ce programme est distribue dans l'espoir qu'il puisse etre utile, mais 12 // sans aucune garantie, meme si il est associe a un produit qui vous en 13 // propose une. Conformez-vous a la GNU General Public License pour avoir 14 // plus de precisions. 15 // 16 // L'auteur ne peut etre tenu responsable de l'utilisation faite des 17 // composantes associees a ce projet (en partie ou dans leur totalite). 18 // 19 // Une copie du fichier de la GNU GPL est fournie dans le repertoire DOC 20 // de ce projet sous le nom gnu_gpl.txt 21 // 22 // ============================================================================= 23 // 24 $ROOT='../' ; 25 include( "{$ROOT}LIB/param.php" ) ; 26 include( "{$ROOT}LIB/util.php" ) ; 27 include( "{$ROOT}LIB/mysql.php" ) ; 28 29 $sql = array() ; 30 31 $sql["DROP ${DB_PRFX}state function"] = <<<SQL 32 DROP FUNCTION IF EXISTS ${DB_PRFX}state 33 SQL; 34 35 $sql["CREATE ${DB_PRFX}state function"] = <<<SQL 36 CREATE FUNCTION ${DB_PRFX}state( w TINYINT, p TINYINT, o DATE, pl DATE ) 37 RETURNS REAL DETERMINISTIC 38 BEGIN 39 DECLARE n DATE ; -- NOW() 40 DECLARE delta REAL ; -- nombre de jours 41 DECLARE jour_max REAL; -- au dela on ne compte plus 42 DECLARE ratio_o REAL; -- jour max ouverture en fonction de la priorite 43 DECLARE ratio_m REAL; -- jour max ouverture en fonction de la priorite 44 DECLARE s REAL ; -- variable temporaire pour l'etat 45 46 -- on se donne un trimestre pour realiser une tache non urgente 47 SET jour_max = 91 ; 48 SET n = NOW() ; 49 50 -- c'est fait, etat=0 51 IF w = 1 THEN RETURN 0 ; END IF ; 52 53 -- sert dans tous les calculs 54 CASE p 55 WHEN 1 THEN SET ratio_o = jour_max ; 56 WHEN 2 THEN SET ratio_o = jour_max / 2 ; 57 ELSE SET ratio_o = jour_max / 4 ; 58 END CASE ; 59 60 -- traitement du pour_le 61 IF pl IS NOT NULL THEN 62 SET delta = DATEDIFF( n, pl ) ; 63 IF delta <= 0 THEN 64 SET delta = -delta ; 65 IF delta > ratio_o THEN SET delta = ratio_o ; END IF ; 66 SET s = ( 8.8 + delta / ratio_o ) / 10 ; 67 ELSE 68 -- 1 mois max de depassement en p=1 69 SET ratio_m = ratio_o * 30 / jour_max ; 70 IF delta > ratio_m THEN SET delta = ratio_m ; END IF ; 71 SET s = ( ratio_m - delta ) / ratio_m * 0.88 ; 72 END IF ; 73 -- on tient compte de l'ouverture (2%) 74 SET delta = DATEDIFF( n, o ) ; 75 IF delta > ratio_o THEN SET delta = ratio_o ; END IF ; 76 SET s = s + 0.02 * delta / ratio_o ; 77 RETURN s ; 78 END IF; 79 80 -- pas de pour_le => priorite 81 82 SET delta = DATEDIFF( n, o ) ; 83 IF delta > ratio_o THEN SET delta = ratio_o ; END IF ; 84 RETURN delta / ratio_o ; 85 86 END 87 SQL; 88 89 // COMMENTER LES 6 LIGNES SUIVANTES POUR ACTIVER UN JEU DE TEST 90 /* 91 $c = new MYSQL( false, false ) ; 92 foreach( $sql as $info => $s ) 93 { 94 echo "$info\n" ; 95 $c->query( $s ) ; 96 } 97 */ 98 /****************************************************************************** 99 ** DECOMMENTER POUR LES JEUX DE TESTS 100 */ 101 102 header( 'Content-type: text/plain; charset="iso-8859-15"' ) ; 103 $pour_le = array( 104 'NULL ', 105 'NOW() + interval 1 DAY', 106 'NOW() - interval 1 DAY', 107 'NOW() - interval 3 DAY', 108 'NOW() - interval 4 DAY', 109 'NOW() - interval 7 DAY', 110 'NOW() - interval 8 DAY' 111 ) ; 112 113 $ouverture = array( 114 'NOW() ', 115 'NOW() - interval 90 DAY ', 116 'NOW() - interval 180 DAY', 117 'NOW() - interval 1 YEAR ' 118 ) ; 119 foreach( $pour_le as $pl ) 120 for( $w=2; $w<=3; $w++ ) 121 for( $p=1; $p<=3; $p++ ) 122 foreach( $ouverture as $o ) 123 $sql[] = <<<SQL 124 SELECT $w AS w, $p AS p, 125 DATE_FORMAT( $o, '%d/%m/%Y') AS o, 126 DATEDIFF( NOW(), $o ) AS do, 127 IFNULL( DATE_FORMAT( $pl, '%d/%m/%Y'), '--/--/----' ) AS pl, 128 IFNULL( DATEDIFF( NOW(), $pl ), '----' ) AS dpl, 129 ${DB_PRFX}state( $w, $p, $o, $pl ) AS s 130 SQL; 131 132 $sql[] = '-' ; 133 $sql[] = <<<SQL 134 SELECT w, p, 135 DATE_FORMAT( ouverture, '%d/%m/%Y') AS o, 136 DATEDIFF( NOW(), ouverture ) AS do, 137 IFNULL( DATE_FORMAT( pour_le, '%d/%m/%Y' ), '--/--/----' ) AS pl, 138 IFNULL( DATEDIFF( NOW(), pour_le ), '----' ) AS dpl, 139 ${DB_PRFX}state( w, p, ouverture, pour_le ) AS s 140 FROM ${DB_PRFX}todo 141 ORDER BY s DESC, w DESC, p DESC, ouverture DESC 142 SQL; 143 144 145 $c = new MYSQL(true, false ) ; 146 foreach( $sql as $s ) 147 { 148 if ( $s == '-' ) 149 { 150 echo "--------------------------------------------------------------------------------\n" ; 151 continue ; 152 } 153 $res = $c->query( $s ) ; 154 while ( $r = @mysql_fetch_assoc( $res ) ) 155 { 156 $rep = array() ; 157 foreach( $r as $k => $v ) 158 { 159 // permet de traiter les nombres 160 $v = "$v" ; 161 $rep[] = sprintf( "%3.3s: %10.10s", $k, $v ) ; 162 } 163 echo implode( " | ", $rep ), " \n" ; 164 } 165 } 166 /* 167 ** FIN DE COMMENTAIRE POUR LES JEUX DE TEST 168 ******************************************************************************** 169 */ 170 ?>
Date de génération : 22/09/2011 21:49