PageRenderTime 53ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/admin/include/avaliacoes.inc.php

https://gitlab.com/paulormm/papers-php
PHP | 269 lines | 229 code | 27 blank | 13 comment | 11 complexity | 94203e77d428434daea6a1c49971f3da MD5 | raw file
  1. <?
  2. class Avaliacoes {
  3. /* Calculo do escore: veja
  4. http://twiki.softwarelivre.org/bin/view/Fisl7/Classifica%e7%e3oDasPropostas
  5. para detalhes.
  6. */
  7. function media_e_desvio($db, $macrotema) {
  8. $sql = "
  9. select
  10. avg(a1.confianca * a1.recomendacao *
  11. (a1.relevancia * 0.2 + a1.qualidade * 0.5 + a1.experiencia * 0.3 )) as average,
  12. stddev(a1.confianca * a1.recomendacao *
  13. (a1.relevancia * 0.2 + a1.qualidade * 0.5 + a1.experiencia * 0.3 )) as standard_deviation
  14. from avaliacoes a1
  15. join propostas p1 on p1.cod = a1.proposta
  16. join pessoas pe1 on pe1.cod = p1.pessoa
  17. where p1.tema = $macrotema and
  18. p1.tipo = 's' and
  19. p1.status in ('p','a','i','r') and
  20. (select count(*)
  21. from avaliacoes
  22. join propostas p2 on p2.cod = avaliacoes.proposta
  23. where p2.tema = p1.tema and
  24. p2.tipo = 's' and
  25. p2.status in ('p','a','i','r') and
  26. avaliador = a1.avaliador
  27. )
  28. =
  29. (select count(*)
  30. from propostas p3
  31. where p3.tema = p1.tema and
  32. p3.tipo = 's' and
  33. p3.status in ('p','a','i','r')
  34. )
  35. ";
  36. $rs= $db->conn->Execute($sql);
  37. $rsa = $rs->GetArray();
  38. $avg = $rsa[0]['average'];
  39. $stddev = $rsa[0]['standard_deviation'];
  40. return array($avg, $stddev);
  41. }
  42. function ranking($db, $macrotema) {
  43. global $papers;
  44. $type = $papers['event']['review_type'];
  45. if ( $type == 'fisl' ) {
  46. $md = Avaliacoes::media_e_desvio($db, $macrotema);
  47. $avg = $md[0];
  48. $stddev = $md[1];
  49. $sql = "
  50. select
  51. a1.proposta as cod,
  52. p1.titulo as titulo,
  53. p1.nivel_proposta as nivel_proposta,
  54. pe1.nome as autor,
  55. (((avg( a1.confianca * a1.recomendacao *
  56. (a1.relevancia * 0.2 + a1.qualidade * 0.5 + a1.experiencia * 0.3 )
  57. ) - $avg ) / $stddev) * 100) + 500 as score
  58. from avaliacoes a1
  59. join propostas p1 on p1.cod = a1.proposta
  60. join pessoas pe1 on pe1.cod = p1.pessoa
  61. where p1.tema = $macrotema and
  62. p1.tipo = 's' and
  63. p1.status = 'i' and
  64. (select count(*)
  65. from avaliacoes
  66. join propostas p2 on p2.cod = avaliacoes.proposta
  67. where p2.tema = p1.tema and
  68. p2.tipo = 's' and
  69. p2.status in ('p','a','i','r') and
  70. avaliador = a1.avaliador)
  71. =
  72. (select count(*)
  73. from propostas p3
  74. where p3.tema = p1.tema and
  75. p3.tipo = 's' and
  76. p3.status in ('p','a','i','r')
  77. )
  78. group by a1.proposta
  79. order by score desc
  80. ";
  81. $rs = $db->conn->Execute($sql);
  82. return $rs->GetArray();
  83. } elseif ( $type == 'simple' ) {
  84. $sql = "
  85. select
  86. propostas.cod as cod,
  87. propostas.titulo as titulo,
  88. propostas.nivel_proposta as nivel_proposta,
  89. pessoas.nome as autor,
  90. avg(recomendacao) as score
  91. from avaliacoes
  92. join propostas on propostas.cod = avaliacoes.proposta
  93. join pessoas on pessoas.cod = propostas.pessoa
  94. where propostas.tipo = 's' and tema = $macrotema
  95. group by propostas.cod
  96. order by score desc
  97. ";
  98. $rs = $db->conn->Execute($sql);
  99. return $rs->GetArray();
  100. } else {
  101. return array();
  102. }
  103. }
  104. function ranking_todas($db, $macrotema) {
  105. global $papers;
  106. $type = $papers['event']['review_type'];
  107. if ( $type == 'fisl' ) {
  108. $md = Avaliacoes::media_e_desvio($db, $macrotema);
  109. $avg = $md[0];
  110. $stddev = $md[1];
  111. $sql = "
  112. select
  113. a1.proposta as cod,
  114. p1.titulo as titulo,
  115. p1.nivel_proposta as nivel_proposta,
  116. pe1.nome as autor,
  117. (avg( a1.confianca * a1.recomendacao *
  118. (a1.relevancia * 0.2 + a1.qualidade * 0.5 + a1.experiencia * 0.3 )
  119. ) - $avg ) / $stddev as score
  120. from avaliacoes a1
  121. join propostas p1 on p1.cod = a1.proposta
  122. join pessoas pe1 on pe1.cod = p1.pessoa
  123. where p1.tema = $macrotema and
  124. p1.tipo = 's' and
  125. p1.status in ('p','a','i','r') and
  126. (select count(*)
  127. from avaliacoes
  128. join propostas p2 on p2.cod = avaliacoes.proposta
  129. where p2.tema = p1.tema and
  130. p2.tipo = 's' and
  131. p2.status in ('p','a','i','r') and
  132. avaliador = a1.avaliador)
  133. =
  134. (select count(*)
  135. from propostas p3
  136. where p3.tema = p1.tema and
  137. p3.tipo = 's' and
  138. p3.status in ('p','a','i','r')
  139. )
  140. group by a1.proposta
  141. order by score desc
  142. ";
  143. $rs = $db->conn->Execute($sql);
  144. return $rs->GetArray();
  145. } elseif ($type == 'simple') {
  146. $sql = "
  147. select
  148. propostas.cod as cod,
  149. propostas.titulo as titulo,
  150. propostas.nivel_proposta as nivel_proposta,
  151. pessoas.nome as autor,
  152. avg(recomendacao) as score
  153. from avaliacoes
  154. join propostas on propostas.cod = avaliacoes.proposta
  155. join pessoas on pessoas.cod = propostas.pessoa
  156. where propostas.tipo = 's'
  157. group by propostas.cod
  158. order by score desc
  159. ";
  160. $rs = $db->conn->Execute($sql);
  161. return $rs->GetArray();
  162. } else {
  163. return array();
  164. }
  165. }
  166. function aprovadas($db, $macrotema) {
  167. $sql = "
  168. select
  169. propostas.cod,
  170. titulo,
  171. nivel_proposta,
  172. pessoas.nome as autor,
  173. propostas.score as score,
  174. propostas.status as status
  175. from propostas
  176. join pessoas on propostas.pessoa = pessoas.cod
  177. where propostas.tema = $macrotema
  178. and propostas.status in ('p','a')
  179. order by score desc
  180. ";
  181. $rs = $db->conn->Execute($sql);
  182. return $rs->GetArray();
  183. }
  184. function recusadas($db, $macrotema) {
  185. $sql = "
  186. select
  187. propostas.cod,
  188. titulo,
  189. nivel_proposta,
  190. pessoas.nome as autor,
  191. propostas.score as score,
  192. propostas.status as status
  193. from propostas
  194. join pessoas on propostas.pessoa = pessoas.cod
  195. where propostas.tema = $macrotema
  196. and propostas.status = 'r'
  197. order by score desc
  198. ";
  199. $rs = $db->conn->Execute($sql);
  200. return $rs->GetArray();
  201. }
  202. /* Retorna a posicao no ranking da proposta
  203. Recebe: $ranking_array -- array do macrotema em que eh necessario
  204. procurar a proposta
  205. $proposta -- codigo da proposta procurada
  206. Eh uma pena, mas o PHP naum tem um array_search decente. Que
  207. saudades do Ruby...
  208. */
  209. function ranking_position($ranking_array, $proposta) {
  210. $position = 0;
  211. while (list($key, $val) = each($ranking_array)) {
  212. if ($ranking_array[$key]['cod'] == $proposta) {
  213. $position = $key + 1;
  214. break;
  215. }
  216. }
  217. return $position;
  218. }
  219. function confirmadas($db, $macrotema) {
  220. $sql = "
  221. select
  222. propostas.cod,
  223. titulo,
  224. nivel_proposta,
  225. pessoas.nome as autor,
  226. propostas.score as score,
  227. propostas.status as status,
  228. propostas.descricao as descricao,
  229. propostas.resumo as resumo
  230. from propostas
  231. join pessoas on propostas.pessoa = pessoas.cod
  232. where propostas.tema = $macrotema
  233. and propostas.confirmada = 1
  234. order by score desc
  235. ";
  236. $rs = $db->conn->Execute($sql);
  237. return $rs->GetArray();
  238. }
  239. }
  240. ?>