templates/classroom/reportcard/annual_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 Annuelle</title>
  7. <style>
  8. /* Style global du corps de la page */
  9. body {
  10. font-family: Arial, sans-serif;
  11. font-size: {{ bodyFontSize }}em;
  12. margin: 0;
  13. padding: 0;
  14. width: 100%;
  15. box-sizing: border-box;
  16. }
  17. /* Header */
  18. header {
  19. display: flex;
  20. justify-content: space-between;
  21. align-items: center;
  22. border-bottom: 2px solid #000;
  23. padding-bottom: 10px;
  24. flex-wrap: wrap; /* Permet de gérer la responsivité */
  25. }
  26. .header-section {
  27. display: flex;
  28. flex-direction: column;
  29. align-items: center;
  30. text-align: center;
  31. margin: 0 10px;
  32. }
  33. .header-section h3 {
  34. margin: 0;
  35. font-size: 1rem;
  36. font-weight: bold;
  37. }
  38. .header-section p {
  39. margin: 0;
  40. font-size: 0.8rem;
  41. }
  42. .school-logo {
  43. border: 2px dashed #000;
  44. width: 80px;
  45. height: 80px;
  46. margin: 10px 0;
  47. display: flex;
  48. justify-content: center;
  49. align-items: center;
  50. font-weight: bold;
  51. }
  52. /* Conteneur principal pour le bulletin */
  53. .main-container {
  54. width: 95%; /* Utilise 90% de la largeur de l'écran */
  55. max-width: 1250px; /* Largeur maximale pour les grands écrans */
  56. border: 1px solid black;
  57. padding: 20px;
  58. margin: 0 auto; /* Centre le conteneur */
  59. }
  60. /* Titre du bulletin */
  61. .bulletin-title {
  62. text-align: center;
  63. font-weight: bold;
  64. font-size: {{ headerFontSize }}em;
  65. }
  66. /* Style pour les tables */
  67. table {
  68. width: 100%; /* La table prend toute la largeur du conteneur */
  69. border-collapse: collapse; /* Supprime les espaces entre les cellules */
  70. margin-top: 10px; /* Espace au-dessus de la table */
  71. page-break-inside: auto;
  72. }
  73. thead {
  74. display: table-row-group;
  75. }
  76. /* Style pour les cellules de la table */
  77. td, th {
  78. border: 1px solid black;
  79. padding: 10px;
  80. text-align: center;
  81. line-height: {{ lineHeight }}em;
  82. }
  83. .student-photo {
  84. width: 100px; /* Largeur pour la photo de l'élève */
  85. }
  86. /* Style pour les cases à cocher */
  87. .checkbox-label {
  88. margin: 0 10px; /* Espace entre les cases */
  89. }
  90. #section1, #section2 {
  91. font-weight: bold;
  92. }
  93. /* Responsive */
  94. @media (max-width: 768px) {
  95. .header-section {
  96. font-size: 0.8rem; /* Réduit la taille de la police pour les petits écrans */
  97. }
  98. }
  99. </style>
  100. </head>
  101. <body>
  102. {% for std in reverse ? students|reverse : students %}
  103. <page size="A4">
  104. {{ include('classroom/partials/reportcard_header.html.twig') }}
  105. <div class="main-container">
  106. <div class="bulletin-title">
  107. {% if room.level.cycle.section.name == "Francophone" %}
  108. BULLETIN SCOLAIRE
  109. ANNÉE SCOLAIRE : {{ year.wording }}
  110. {% else %}
  111. REPORT CARD
  112. SCHOOL YEAR : {{ year.wording }}
  113. {% endif %}
  114. </div>
  115. <table id="section1" border="1">
  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>
  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>Notes trim./20</th>
  199. <th>Moy. Ann./20</th>
  200. <th>Coef.</th>
  201. <th>Moy. Ann. x Coef.</th>
  202. <th>Rang Ann.</th>
  203. <th>[Min – Max]</th>
  204. <th>Appréciations de l'enseignant</th>
  205. {% else %}
  206. <th rowspan="2">SUBJECTS AND TEACHER NAME</th>
  207. <th>Quat. /20</th>
  208. <th>Ann Avg./20</th>
  209. <th>Coef.</th>
  210. <th>Ann Avg. x Coef.</th>
  211. <th>Ann. Rank</th>
  212. <th>[Min – Max]</th>
  213. <th>Teacher's Appreciations</th>
  214. {% endif %}
  215. </tr>
  216. </thead>
  217. <tbody>
  218. {% set totalNCoef = 0 %}
  219. {% set totalCoef = 0 %}
  220. {% for mark in data %}
  221. {% if std.id == mark.std and (mark.weight) != 0 %}
  222. <tr>
  223. {% set totalNCoef = totalNCoef + mark.coef * (mark.value * mark.weight ) %}
  224. {% set totalCoef = totalCoef + mark.coef * mark.weight %}
  225. <td rowspan="3"> <b>{{ mark.wording }}</b><br>M/Mme &nbsp;&nbsp;<i>{{ mark.full_name }}</i></td>
  226. <td>{{ mark.value1|round(2)}}</td>
  227. <td rowspan="3" class="notetrim" >{{ mark.value |round(2)}}</td>
  228. <td rowspan="3">
  229. {% if (mark.weight) != 0 %}
  230. {{ mark.coef }}
  231. {% else %}
  232. {% endif %}
  233. </td>
  234. <td rowspan="3">
  235. {% if (mark.weight) != 0 %}
  236. {{ (mark.value * mark.coef)|round(2) }}
  237. {% endif %}
  238. </td>
  239. <td rowspan="3">{{mark.rank}}</td>
  240. <td rowspan="3">[ {{ mark.mini|round(2) ~ ' - ' ~ mark.maxi|round(2) }} ]</td>
  241. <td rowspan="3"></td>
  242. </tr>
  243. <tr>
  244. <td>{{ mark.value2|round(2) }}</td>
  245. </tr>
  246. <tr>
  247. <td>{{ mark.value3|round(2) }}</td>
  248. </tr>
  249. {% endif %}
  250. {% endfor %}
  251. </tbody>
  252. </table>
  253. <table id="section2">
  254. <tbody>
  255. <tr>
  256. {% if room.level.cycle.section.name == "Francophone" %}
  257. <td colspan="4">Discipline</td>
  258. <td colspan="4">Travail de l’élève</td>
  259. <td colspan="2">Profil de la classe</td>
  260. {% else %}
  261. <td colspan="4">Discipline</td>
  262. <td colspan="4">Student work</td>
  263. <td colspan="2">Class profile</td>
  264. {% endif %}
  265. </tr>
  266. <tr>
  267. {% if room.level.cycle.section.name == "Francophone" %}
  268. <td>Abs. Ann. Non. J. (h)</td>
  269. <td></td>
  270. <td>Avertissement de conduite</td>
  271. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  272. <td>TOTAL GENERAL</td>
  273. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  274. <td colspan="2"><b>DÉCISION DU CONSEIL DE CLASSE</b></td>
  275. <td>Moy. Gen. An.</td>
  276. {% else %}
  277. <td>Unj. Ann. Absences (h)</td>
  278. <td></td>
  279. <td>Warning</td>
  280. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  281. <td>GRAND TOTAL</td>
  282. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  283. <td colspan="2"><b>CLASS COUNCIL DECISION</b></td>
  284. <td>Gen. An. Avg. </td>
  285. {% endif %}
  286. <td>{{ ( genMean )|round(2,'floor') }}</td>
  287. </tr>
  288. <tr>
  289. {% if room.level.cycle.section.name == "Francophone" %}
  290. <td>Abs Ann. Just. (h) </td>
  291. <td>{{ abscences[std.id] is defined ? abscences[std.id] : 0 }}</td>
  292. <td>Blâme de conduite</td>
  293. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  294. <td>COEF.</td>
  295. <td>{{ totalCoef }}</td>
  296. <td >Promu (e) </td>
  297. {% else %}
  298. <td>Just. Ann. Abs. (h) </td>
  299. <td>{{ abscences[std.id] is defined ? abscences[std.id] : 0 }}</td>
  300. <td>Blame</td>
  301. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  302. <td>COEF.</td>
  303. <td>{{ totalCoef }}</td>
  304. <td >Promoted </td>
  305. {% endif %}
  306. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  307. <td>[Min – Max]</td>
  308. <td>[ ]</td>
  309. </tr>
  310. <tr>
  311. {% if room.level.cycle.section.name == "Francophone" %}
  312. <td>Retards (nbre de fois)</td>
  313. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  314. <td>Exclusions (jours)</td>
  315. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  316. <td>MOYENNE ANNUELLE</td>
  317. <td>
  318. {% if totalCoef > 0 %}
  319. {{(totalNCoef/totalCoef)|round(2,'floor') }}
  320. {% endif %}
  321. </td>
  322. <td >Redouble</td>
  323. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  324. <td>Nombre de moyennes</td>
  325. {% else %}
  326. <td>Late arrivals </td>
  327. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  328. <td>Exclusions (days)</td>
  329. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  330. <td>ANNUAL AVERAGE</td>
  331. <td>{{(totalNCoef/totalCoef)|round(2,'floor') }}</td>
  332. <td >Redouble</td>
  333. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  334. <td>Number of averages</td>
  335. {% endif %}
  336. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  337. </tr>
  338. <tr>
  339. {% if room.level.cycle.section.name == "Francophone" %}
  340. <td>Consignes (h)</td>
  341. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  342. <td>Exclusion définitive</td>
  343. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  344. <td>Cote annuelle</td>
  345. <td>
  346. {% if ( std.id in ranks|keys ) %}
  347. {{ ranks[std.id] }} / {{ ranks|length }}
  348. {% endif %}
  349. </td>
  350. <td >Exclu(e) pour :</td>
  351. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  352. <td>Taux de réussite</td>
  353. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  354. {% else %}
  355. <td>Instructions (h)</td>
  356. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  357. <td>Permanent exclusion</td>
  358. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  359. <td>Annual rank</td>
  360. <td> {% if ( std.id in ranks|keys ) %}
  361. {{ ranks[std.id] }} / {{ ranks|length }}
  362. {% endif %} </td>
  363. <td >Excluded for:</td>
  364. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  365. <td>Success rate</td>
  366. <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  367. {% endif %}
  368. </tr>
  369. <tr>
  370. {% if room.level.cycle.section.name == "Francophone" %}
  371. <td colspan="4" >Appréciation du travail de l’élève <br><br> <br></td>
  372. <td colspan="2" >Visa du parent / Tuteur<br><br> <br><br></td>
  373. <td colspan="2" >Visa de l'enseignant pricipal<br><br> <br><br> <i>{{ mainTeacher.fullName }}</i></td>
  374. <td colspan="2" >Le Chef d’établissement<br><br> <br><br></td>
  375. {% else %}
  376. <td colspan="4" >Appreciation of student work <br><br> <br></td>
  377. <td colspan="2" >Parent/Guardian Visa<br><br> <br><br></td>
  378. <td colspan="2" >Head teacher visa<br><br> <br><br> <i>{{ mainTeacher.fullName }}</i></td>
  379. <td colspan="2" >The Head of Establishment<br><br> <br><br></td>
  380. {% endif %}
  381. </tr>
  382. </tbody>
  383. </table>
  384. </div>
  385. {% if copyright %}
  386. <div>
  387. <h9>
  388. <i>
  389. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  390. {% if room.level.cycle.section.name == "Francophone" %}
  391. Conception et implementation du groupe Polyinformatique, Tel : +1(450)6267192, email: [email protected]
  392. {% else %}
  393. Design and implementation of Polyinformatique group, Tel: +1(450)6267192, mail: [email protected]
  394. {% endif %}
  395. </i>
  396. </h9>
  397. </div>
  398. {% endif %}
  399. </page>
  400. <br/>
  401. <br/>
  402. {% endfor %}
  403. <script type="text/javascript" src="{{ absolute_url(asset('assets/js/jquery-3.1.1.js')) }}"></script>
  404. <script type="text/javascript" src="{{ absolute_url(asset('assets/js/repportCard2024.js')) }}"></script>
  405. </body
  406. </html>