templates/classroom/reportcard/quaterly_2024.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html lang="fr">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Bulletin Scolaire</title>
  7. <style>
  8. /* Style global du corps de la page */
  9. body {
  10. font-family: Arial, sans-serif;
  11. margin: 0;
  12. padding: 0;
  13. width: 100%;
  14. box-sizing: border-box;
  15. }
  16. /* Header */
  17. header {
  18. display: flex;
  19. justify-content: space-between;
  20. align-items: center;
  21. border-bottom: 2px solid #000;
  22. padding-bottom: 10px;
  23. flex-wrap: wrap; /* Permet de gérer la responsivité */
  24. }
  25. .header-section {
  26. display: flex;
  27. flex-direction: column;
  28. align-items: center;
  29. text-align: center;
  30. margin: 0 10px;
  31. }
  32. .header-section h3 {
  33. margin: 0;
  34. font-size: 1rem;
  35. font-weight: bold;
  36. }
  37. .header-section p {
  38. margin: 0;
  39. font-size: 0.8rem;
  40. }
  41. .school-logo {
  42. border: 2px dashed #000;
  43. width: 80px;
  44. height: 80px;
  45. margin: 10px 0;
  46. display: flex;
  47. justify-content: center;
  48. align-items: center;
  49. font-weight: bold;
  50. }
  51. /* Conteneur principal pour le bulletin */
  52. .main-container {
  53. width: 95%; /* Utilise 90% de la largeur de l'écran */
  54. max-width: 1250px; /* Largeur maximale pour les grands écrans */
  55. border: 1px solid black;
  56. padding: 20px;
  57. margin: 0 auto; /* Centre le conteneur */
  58. }
  59. /* Titre du bulletin */
  60. .bulletin-title {
  61. text-align: center;
  62. font-weight: bold;
  63. font-size: 20px;
  64. }
  65. /* Style pour les tables */
  66. table {
  67. width: 100%; /* La table prend toute la largeur du conteneur */
  68. border-collapse: collapse; /* Supprime les espaces entre les cellules */
  69. margin-top: 10px; /* Espace au-dessus de la table */
  70. page-break-inside: auto;
  71. }
  72. thead {
  73. display: table-row-group;
  74. }
  75. /* Style pour les cellules de la table */
  76. td, th {
  77. border: 1px solid black;
  78. padding: 10px; /* Espace intérieur */
  79. text-align: center; /* Centrer le texte */
  80. }
  81. .student-photo {
  82. width: 100px; /* Largeur pour la photo de l'élève */
  83. }
  84. /* Style pour les cases à cocher */
  85. .checkbox-label {
  86. margin: 0 10px; /* Espace entre les cases */
  87. }
  88. #section1, #section2 {
  89. font-weight: bold;
  90. }
  91. /* Responsive */
  92. @media (max-width: 768px) {
  93. .header-section {
  94. font-size: 0.8rem; /* Réduit la taille de la police pour les petits écrans */
  95. }
  96. }
  97. </style>
  98. </head>
  99. <body>
  100. {% for std in reverse ? students|reverse : students %}
  101. <page size="A4">
  102. {{ include('classroom/partials/reportcard_header.html.twig') }}
  103. <div class="main-container">
  104. <div class="bulletin-title">
  105. {% if room.level.cycle.section.name == "Francophone" %}
  106. BULLETIN SCOLAIRE
  107. {{ quater.wording |raw }}<br>
  108. ANNÉE SCOLAIRE : {{ year.wording }}
  109. {% else %}
  110. REPORT CARD
  111. {{ quater.wording |raw }}<br>
  112. SCHOOL YEAR : {{ year.wording }}
  113. {% endif %}
  114. </div>
  115. <table id="section1" border="1" style="line-height: {{ lineHeight }}em; ">
  116. <tr>
  117. <td rowspan="4" class="student-photo">
  118. {% if(fileExists[std.id])%}
  119. {% set imagePath = absolute_url(asset('assets/images/student/'~ std.imageName )) %}
  120. {% else %}
  121. {% if std.gender %}
  122. {% set imagePath = absolute_url(asset('assets/images/student/female-default-avatar.jpg')) %}
  123. {% else %}
  124. {% set imagePath = absolute_url(asset('assets/images/student/male-default-avatar.jpg')) %}
  125. {% endif %}
  126. {% endif %}
  127. <img style="height:150px;width:150px;" src={{ imagePath }} />
  128. </td>
  129. <td colspan="2">
  130. {{ std.lastname|raw }} &nbsp;&nbsp; {{ std.firstname|raw }}
  131. </td>
  132. <td>
  133. {{ room.name|raw }}
  134. </td>
  135. </tr>
  136. <tr>
  137. <td width="40%"> <span>
  138. {% if room.level.cycle.section.name == "Francophone" %}
  139. N&eacute(e) le &nbsp;&nbsp; : &nbsp;&nbsp;
  140. {% if std.birthday %}
  141. {{ std.birthday|date('Y-m-d') }}
  142. {% endif %}
  143. {% endif %}
  144. <br/>
  145. {% if room.level.cycle.section.name == "Francophone" %}
  146. &agrave; &nbsp;&nbsp;
  147. {% else %}
  148. at &nbsp;&nbsp;
  149. {% endif %}
  150. : &nbsp;&nbsp;
  151. {{ std.birthplace|raw }}
  152. </span></td>
  153. <td width="20%">
  154. {% if room.level.cycle.section.name == "Francophone" %}
  155. Genre
  156. {% else %}
  157. Gender
  158. {% endif %} :
  159. <span>
  160. {% if std.gender %}
  161. F
  162. {% else %}
  163. M
  164. {% endif %}
  165. </span>
  166. </td>
  167. <td width="40%">Effectif :{{ students|length }} </td>
  168. </tr>
  169. <tr>
  170. <td>Id : {{ std.matricule }}</td>
  171. <td>Redoublant :
  172. <label class="checkbox-label"><input type="checkbox"> Oui</label>
  173. <label class="checkbox-label"><input type="checkbox"> Non</label>
  174. </td>
  175. <td rowspan="2">
  176. {% if room.level.cycle.section.name == "Francophone" %}
  177. Professeur principal : {{ mainTeacher.fullName }}
  178. {% else %}
  179. Head teacher : {{ mainTeacher.fullName }}
  180. {% endif %}
  181. </td>
  182. </tr>
  183. <tr>
  184. <td colspan="2">
  185. {% if room.level.cycle.section.name == "Francophone" %}
  186. Parents / Tuteurs : {{ std.fatherName }} ({{ std.primaryContact }})
  187. {% else %}
  188. Parents / Guardians : {{ mainTeacher.fullName }}
  189. {% endif %}
  190. </td>
  191. </tr>
  192. </table>
  193. <table style="line-height: {{ lineHeight }}em; ">
  194. <thead>
  195. <tr>
  196. {% if room.level.cycle.section.name == "Francophone" %}
  197. <th rowspan="2">MATIÈRES ET NOM DE L'ENSEIGNANT</th>
  198. <th>COMPÉTENCES ÉVALUÉES</th>
  199. <th>N/20</th>
  200. <th>M/20</th>
  201. <th>Coef</th>
  202. <th>M x coef</th>
  203. <th>COTE</th>
  204. <th>[Min – Max]</th>
  205. <th>Appréciations de l'enseignant</th>
  206. {% else %}
  207. <th rowspan="2">SUBJECTS AND TEACHER NAME</th>
  208. <th>SKILLS ASSESSED</th>
  209. <th>N/20</th>
  210. <th>M/20</th>
  211. <th>Coef</th>
  212. <th>M x coef</th>
  213. <th>RANK</th>
  214. <th>[Min – Max]</th>
  215. <th>Teacher's Appreciations</th>
  216. {% endif %}
  217. </tr>
  218. </thead>
  219. <tbody>
  220. <!-- Matière 1 -->
  221. {% set totalNCoef = 0 %}
  222. {% set totalCoef = 0 %}
  223. {% for mark in dataMarks %}
  224. {% if std.matricule == mark.matricule %}
  225. {% if loop.index < dataMarks|length %}
  226. {# Récupérer l'élément suivant #}
  227. {% set next_mark = dataMarks[loop.index] %}
  228. <tr>
  229. {% if next_mark.course_id == mark.course_id %}
  230. {% set totalNCoef = totalNCoef + mark.coefficient * (next_mark.value * next_mark.weight + mark.value * mark.weight)/2 %}
  231. {% set totalCoef = totalCoef + mark.coefficient * max(mark.weight ,next_mark.weight) %}
  232. <td rowspan="2"> <b>{{ mark.wording }}</b><br>M/Mme &nbsp;&nbsp;{{ mark.full_name }}</td>
  233. <td>
  234. {% if "RAS" != mark.competence|trim %}
  235. {{ mark.competence }}
  236. {% else %}
  237. {% endif %}
  238. </td>
  239. <td>{{ mark.value }}</td>
  240. <td class="notetrim" rowspan="2">
  241. {% if (mark.weight + next_mark.weight) != 0 %}
  242. {{ (mark.value + next_mark.value)/(mark.weight + next_mark.weight) }}</td>
  243. {% else %}
  244. {% endif %}
  245. <td rowspan="2"> {{ mark.coefficient }}</td>
  246. <td>{{ mark.coefficient * mark.value * max(mark.weight ,next_mark.weight) }}</td>
  247. <td>{{ mark.rank2 }}</td>
  248. {% else %}
  249. <td> {{ mark.competence }}</td>
  250. <td >{{ mark.value }}</td>
  251. <td>{{ mark.coefficient * mark.value * mark.weight }}</td>
  252. <td>{{ mark.rank2 }}</td>
  253. {% endif %}
  254. <td>{{ mark.mini ~ '-' ~ mark.maxi }}</td>
  255. {% if next_mark.course_id == mark.course_id %}
  256. <td rowspan="2"></td>
  257. {% endif %}
  258. </tr>
  259. {% endif %}
  260. {% endif %}
  261. {% endfor %}
  262. </tbody>
  263. </table>
  264. <table id="section2" style="line-height: {{ lineHeight }}em; font-size:{{ headerFontSize }}em;">
  265. <tbody>
  266. <tr>
  267. {% if room.level.cycle.section.name == "Francophone" %}
  268. <td colspan="4">Discipline</td>
  269. <td colspan="4">Travail de l’élève</td>
  270. <td colspan="2">Profil de la classe</td>
  271. {% else %}
  272. <td colspan="4">Discipline</td>
  273. <td colspan="4">Student work</td>
  274. <td colspan="2">Class profile</td>
  275. {% endif %}
  276. </tr>
  277. <tr>
  278. {% if room.level.cycle.section.name == "Francophone" %}
  279. <td>Abs. non. J. (h)</td>
  280. <td>{{ dataAbs[std.id] is defined ? dataAbs[std.id] : 0 }}</td>
  281. <td>Avertissement de conduite</td>
  282. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  283. <td>TOTAL GENERAL</td>
  284. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  285. <td colspan="2"><b>DÉCISION DU CONSEIL DE CLASSE</b></td>
  286. <td>Moy. Gen.</td>
  287. {% else %}
  288. <td>Unj. Absences (h)</td>
  289. <td>{{ dataAbs[std.id] is defined ? dataAbs[std.id] : 0 }}</td>
  290. <td>Warning</td>
  291. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  292. <td>GRAND TOTAL</td>
  293. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  294. <td colspan="2"><b>CLASS COUNCIL DECISION</b></td>
  295. <td>Avg. Gen.</td>
  296. {% endif %}
  297. <td>{{ ( genMean )|round(2,'floor') }}</td>
  298. </tr>
  299. <tr>
  300. {% if room.level.cycle.section.name == "Francophone" %}
  301. <td>Abs just. (h) </td>
  302. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  303. <td>Blâme de conduite</td>
  304. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  305. <td>COEF.</td>
  306. <td>{{ totalCoef }}</td>
  307. <td >Promu (e) </td>
  308. {% else %}
  309. <td>Just. Abs (h) </td>
  310. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  311. <td>Blame</td>
  312. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  313. <td>COEF.</td>
  314. <td>{{ totalCoef }}</td>
  315. <td >Promoted </td>
  316. {% endif %}
  317. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  318. <td>[Min – Max]</td>
  319. <td>[{{minAvg}} – {{maxAvg}} ]</td>
  320. </tr>
  321. <tr>
  322. {% if room.level.cycle.section.name == "Francophone" %}
  323. <td>Retards (nbre de fois)</td>
  324. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  325. <td>Exclusions (jours)</td>
  326. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  327. <td>MOYENNE TRIMESTRIELLE</td>
  328. <td>{{(totalNCoef/totalCoef)|round(2,'floor') }}</td>
  329. <td >Redouble</td>
  330. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  331. <td>Nombre de moyennes</td>
  332. {% else %}
  333. <td>Late arrivals </td>
  334. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  335. <td>Exclusions (days)</td>
  336. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  337. <td>QUARTERLY AVERAGE</td>
  338. <td>{{(totalNCoef/totalCoef)|round(2,'floor') }}</td>
  339. <td >Redouble</td>
  340. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  341. <td>Number of averages</td>
  342. {% endif %}
  343. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  344. </tr>
  345. <tr>
  346. {% if room.level.cycle.section.name == "Francophone" %}
  347. <td>Consignes (h)</td>
  348. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  349. <td>Exclusion définitive</td>
  350. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  351. <td>COTE</td>
  352. <td>
  353. {% if ( std.id in ranks|keys ) %}
  354. {{ ranks[std.id] }} / {{ ranks|length }}
  355. {% endif %}
  356. </td>
  357. <td >Exclu(e) pour :</td>
  358. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  359. <td>Taux de réussite</td>
  360. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  361. {% else %}
  362. <td>Instructions (h)</td>
  363. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  364. <td>Permanent exclusion</td>
  365. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  366. <td>RANK</td>
  367. <td> {% if ( std.id in ranks|keys ) %}
  368. {{ ranks[std.id] }} / {{ ranks|length }}
  369. {% endif %} </td>
  370. <td >Excluded for:</td>
  371. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  372. <td>Success rate</td>
  373. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  374. {% endif %}
  375. </tr>
  376. <tr>
  377. {% if room.level.cycle.section.name == "Francophone" %}
  378. <td colspan="4" >Appréciation du travail de l’élève <br><br> <br></td>
  379. <td colspan="2" >Visa du parent / Tuteur<br><br> <br><br></td>
  380. <td colspan="2" >Visa de l'enseignant pricipal<br><br> <br><br> <i>{{ mainTeacher.fullName }}</i></td>
  381. <td colspan="2" >Le Chef d’établissement<br><br> <br><br></td>
  382. {% else %}
  383. <td colspan="4" >Appreciation of student work <br><br> <br></td>
  384. <td colspan="2" >Parent/Guardian Visa<br><br> <br><br></td>
  385. <td colspan="2" >Head teacher visa<br><br> <br><br> <i>{{ mainTeacher.fullName }}</i></td>
  386. <td colspan="2" >The Head of Establishment<br><br> <br><br></td>
  387. {% endif %}
  388. </tr>
  389. </tbody>
  390. </table>
  391. </div>
  392. {% if copyright %}
  393. <div>
  394. <h9>
  395. <i>
  396. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  397. {% if room.level.cycle.section.name == "Francophone" %}
  398. Conception et implementation du groupe Polyinformatique, Tel : +1(450)6267192, [email protected]
  399. {% else %}
  400. Design and implementation of Polyinformatique group, Tel: +1(450)6267192, [email protected]
  401. {% endif %}
  402. </i>
  403. </h9>
  404. </div>
  405. {% endif %}
  406. </page>
  407. <br/>
  408. <br/>
  409. {% endfor %}
  410. <script type="text/javascript" src="{{ absolute_url(asset('assets/js/jquery-3.1.1.js')) }}"></script>
  411. <script type="text/javascript" src="{{ absolute_url(asset('assets/js/repportCard2024.js')) }}"></script>
  412. </body
  413. </html>