ScoDoc-Lille/app/scodoc/sco_cost_formation.py

196 lines
6.3 KiB
Python
Raw Permalink Normal View History

2020-09-26 16:19:37 +02:00
# -*- mode: python -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Gestion scolarite IUT
#
2023-01-02 13:16:27 +01:00
# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved.
2020-09-26 16:19:37 +02:00
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Emmanuel Viennet emmanuel.viennet@viennet.net
#
##############################################################################
"""Rapports estimation coût de formation basé sur le programme pédagogique
et les nombres de groupes.
(coût théorique en heures équivalent TD)
"""
from flask import request
from app.models import FormSemestre
from app.scodoc.gen_tables import GenTable
from app.scodoc import sco_formsemestre
from app.scodoc import sco_moduleimpl
from app.scodoc import sco_preferences
import app.scodoc.sco_utils as scu
2021-08-21 17:07:44 +02:00
import sco_version
2020-09-26 16:19:37 +02:00
def formsemestre_table_estim_cost(
formsemestre_id,
n_group_td=1,
n_group_tp=1,
coef_tp=1,
coef_cours=1.5,
):
"""
Rapports estimation coût de formation basé sur le programme pédagogique
et les nombres de groupes.
Coût théorique en heures équivalent TD.
Attention: ne prend en compte que les modules utilisés dans ce semestre.
Attention: prend en compte _tous_ les modules utilisés dans ce semestre, ce qui
peut conduire à une sur-estimation du coût s'il y a des modules optionnels
(dans ce cas, retoucher le tableau excel exporté).
"""
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
rows = []
for modimpl in formsemestre.modimpls:
rows.append(
2020-09-26 16:19:37 +02:00
{
"code": modimpl.module.code or "",
"titre": modimpl.module.titre,
"heures_cours": modimpl.module.heures_cours,
"heures_td": modimpl.module.heures_td * n_group_td,
"heures_tp": modimpl.module.heures_tp * n_group_tp,
2020-09-26 16:19:37 +02:00
}
)
# calcul des heures:
for t in rows:
2020-09-26 16:19:37 +02:00
t["HeqTD"] = (
t["heures_td"] + coef_cours * t["heures_cours"] + coef_tp * t["heures_tp"]
)
sum_cours = sum([t["heures_cours"] for t in rows])
sum_td = sum([t["heures_td"] for t in rows])
sum_tp = sum([t["heures_tp"] for t in rows])
2020-09-26 16:19:37 +02:00
sum_heqtd = sum_td + coef_cours * sum_cours + coef_tp * sum_tp
assert abs(sum([t["HeqTD"] for t in rows]) - sum_heqtd) < 0.01, "%s != %s" % (
sum([t["HeqTD"] for t in rows]),
2020-09-26 16:19:37 +02:00
sum_heqtd,
)
rows.append(
2020-09-26 16:19:37 +02:00
{
"code": "TOTAL SEMESTRE",
"heures_cours": sum_cours,
"heures_td": sum_td,
"heures_tp": sum_tp,
"HeqTD": sum_heqtd,
"_table_part": "foot",
}
)
titles = {
"code": "Code",
"titre": "Titre",
"heures_cours": "Cours",
"heures_td": "TD",
"heures_tp": "TP",
"HeqTD": "HeqTD",
}
tab = GenTable(
titles=titles,
columns_ids=(
"code",
"titre",
"heures_cours",
"heures_td",
"heures_tp",
"HeqTD",
),
rows=rows,
2020-09-26 16:19:37 +02:00
html_sortable=True,
preferences=sco_preferences.SemPreferences(formsemestre_id),
2020-09-26 16:19:37 +02:00
html_class="table_leftalign table_listegroupe",
xls_before_table=[
[formsemestre.titre_annee()],
[
f"Formation {formsemestre.formation.titre} version {formsemestre.formation.version}"
],
2020-09-26 16:19:37 +02:00
[],
["", "TD", "TP"],
["Nombre de groupes", n_group_td, n_group_tp],
[],
[],
],
html_caption="""<div class="help">
Estimation du coût de formation basé sur le programme pédagogique
et les nombres de groupes.<br>
Coût théorique en heures équivalent TD.<br>
Attention: ne prend en compte que les modules utilisés dans ce semestre.<br>
2020-09-26 16:19:37 +02:00
Attention: prend en compte <em>tous les modules</em> utilisés dans ce semestre, ce qui
peut conduire à une sur-estimation du coût s'il y a des modules optionnels
(dans ce cas, retoucher le tableau excel exporté).
</div>
""",
origin=f"""Généré par {sco_version.SCONAME} le {scu.timedate_human_repr()}""",
filename=f"EstimCout-S{formsemestre.semestre_id}",
2020-09-26 16:19:37 +02:00
)
return tab
def formsemestre_estim_cost(
formsemestre_id,
n_group_td=1,
n_group_tp=1,
coef_tp=1,
coef_cours=1.5,
format="html",
):
"""Page (formulaire) estimation coûts"""
n_group_td = int(n_group_td)
n_group_tp = int(n_group_tp)
coef_tp = float(coef_tp)
coef_cours = float(coef_cours)
tab = formsemestre_table_estim_cost(
formsemestre_id,
n_group_td=n_group_td,
n_group_tp=n_group_tp,
coef_tp=coef_tp,
coef_cours=coef_cours,
)
h = """
<form name="f" method="get" action="%s">
<input type="hidden" name="formsemestre_id" value="%s"></input>
Nombre de groupes de TD: <input type="text" name="n_group_td" value="%s" onchange="document.f.submit()"/><br>
2020-09-26 16:19:37 +02:00
Nombre de groupes de TP: <input type="text" name="n_group_tp" value="%s" onchange="document.f.submit()"/>
&nbsp;Coefficient heures TP: <input type="text" name="coef_tp" value="%s" onchange="document.f.submit()"/>
<br>
2020-09-26 16:19:37 +02:00
</form>
""" % (
request.base_url,
2020-09-26 16:19:37 +02:00
formsemestre_id,
n_group_td,
n_group_tp,
coef_tp,
)
tab.html_before_table = h
2021-06-13 19:12:20 +02:00
tab.base_url = "%s?formsemestre_id=%s&n_group_td=%s&n_group_tp=%s&coef_tp=%s" % (
request.base_url,
2021-06-13 19:12:20 +02:00
formsemestre_id,
n_group_td,
n_group_tp,
coef_tp,
2020-09-26 16:19:37 +02:00
)
return tab.make_page(format=format)