summaryrefslogtreecommitdiff
path: root/src/app/windowMissions.py
blob: c3d225c180ddc999007c8d987414a4730089fa94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227

############################################################################
#                                                                          #
# Description: Fenêtres et fonctions permettant de gérer ses missions      #
#                                                                          #
############################################################################

# Import de PyQt5
from PyQt5.QtWidgets import (
    QDialog, QGroupBox, QLabel,
    QVBoxLayout, QHBoxLayout,
    QPushButton, QMessageBox,
    QLineEdit, QComboBox
)
# Import des éléments locaux
from src.database.dbmission import DbMission
from src.database.dbsearch  import DbSearch


def core_review(dial: object, dbmission: object, missionId: int) -> None:
    """
    Fenêtre permettant de donner un avis et une note à une mission
    en tant que Client.
    """
    # Instanciation d'une nouvealle fenêtre simple
    dialReview: object = QDialog(parent=dial)
    # Widgets pour pouvoir laisser un commentaire
    labNote:  object = QLabel("Note: ")
    cmbNote:  object = QComboBox()
    for i in range(6):
        cmbNote.addItem(str(i), i)

    labReview:  object = QLabel("Avis: ")
    inpReview:  object = QLineEdit(maxLength=256)
    btnValider: object = QPushButton("Valider")
    btnValider.clicked.connect(
        lambda: [
            dbmission.review_mission(missionId, inpReview.text(), cmbNote.currentData()),
            dbmission.validate_mission_client_by_missionid(missionId),
            QMessageBox.information(
                dial,
                "Mission",
                "La mission a été validée"
            ),
            dialReview.close()
        ]
    )
    # Layout des lignes avec leurs widgets
    lineNote: object = QHBoxLayout()
    lineNote.addWidget(labNote)
    lineNote.addStretch()
    lineNote.addWidget(cmbNote)
    lineReview: object = QHBoxLayout()
    lineReview.addWidget(labReview)
    lineReview.addStretch()
    lineReview.addWidget(inpReview)
    lineBtn: object = QHBoxLayout()
    lineBtn.addStretch()
    lineBtn.addWidget(btnValider)
    lineBtn.addStretch()
    # Layout accueillant les lignes
    layReview: object = QVBoxLayout()
    layReview.addLayout(lineNote)
    layReview.addLayout(lineReview)
    layReview.addLayout(lineBtn)
    # GroupBox principal
    grpMain: object = QGroupBox("Donnez votre avis")
    grpMain.setLayout(layReview)
    # Layout principal
    layMain: object = QVBoxLayout()
    layMain.addWidget(grpMain)
    dialReview.setLayout(layMain)
    # Affichage de la fenêtre
    dialReview.show()


def core_validate(mainWindow: object, dial: object, missionId: int, status: str) -> None:
    """
    Valide une mission et en fonction du statut de l'utilisateur
    et de l'etat de la mission, renvoie vers le bon message ou
    la possibilitée de laisser un commentaire
    """
    # Instanciation des méthodes pour pouvoir gérer les missions dans la BDD
    dbmission: object = DbMission(mainWindow)
    # Validation en fonction de l'étape à laquelle se trouve actuellement la mission
    if status == "acceptedByPro":
        dbmission.accept_mission_by_missionid(missionId)
        QMessageBox.information(
            dial,
            "Mission",
            "La mission a bien été acceptée"
        )
    elif status == "validatedByPro":
        dbmission.validate_mission_pro_by_missionid(missionId)
        QMessageBox.information(
            dial,
            "Mission",
            "La mission a été validée"
        )
    elif status == "validatedByClient":
        core_review(dial, dbmission, missionId)

    # On ferme la fenetre pour éviter d'avoir à la rafraichir
    dial.close()


def core_get_missions_by_status(mainWindow: object, status: str) -> list:
    """
    Récupération des missions liées à l'utilisateur et sélection
    des missions ayant le statut demandé
    """
    # Instanciation des méthodes pour pouvoir gérer les missions dans la BDD
    dbmission: object = DbMission(mainWindow)
    # Récupération des missions en fonction du status et selon l'ID
    # de l'utilisateur actuellement connecté
    if mainWindow.userStatus == "Pro":
        missionsAll: list = dbmission.get_mission_by_proid(mainWindow.userId)
    elif mainWindow.userStatus == "Client":
        missionsAll: list = dbmission.get_mission_by_clientid(mainWindow.userId)

    # Selon la fenêtre appelée dans le menu bar, on sélectionne les missions ayant ce status
    # en regardant si les champs de validation sont vide ou non, on converti aussi les tuple des resultats
    # que renvoi la BDD en list
    if status == "pending":
        missionsPending: list = [list(i) for i in missionsAll if i[5] == None]
        return missionsPending
    elif status == "ongoing":
        missionsOngoing: list = [list(i) for i in missionsAll if i[5] != None and (i[6] == None or i[7] == None)]
        return missionsOngoing
    elif status == "completed":
        missionsCompleted: list = [list(i) for i in missionsAll if (i[6] != None and i[7] != None)]
        return missionsCompleted


def window_main(mainWindow: object, status: str) -> None:
    """
    Fenêtre permettant de gérer ses missions
    """
    dbsearch: object = DbSearch(mainWindow)
    # Instanciation d'une nouvealle fenêtre simple
    dial: object = QDialog(parent=mainWindow)
    # Récupération des missions en fonction su status sélectionné
    missions: list = core_get_missions_by_status(mainWindow, status)
    # Liste qui va accueillir les lignes
    linesMission: list   = []
    # Mission à la place de "i" pour eviter d'avoir un "j" par la suite
    for i in missions:
        # Widgets de la ligne
        line: object = QHBoxLayout()
        # On récupère le nom FR de l'emploi
        job = dbsearch.get_job_by_jobid(i[8])[0][2]
        # On formate la ligne avec les infos intéréssantes selon le status de la mission
        if status == "pending":
            labMission: object = QLabel(
                f"Emise le: {i[1].strftime('%m/%d/%Y')} Pro: {i[10]} Job: {job} Sujet: {i[2]}"
                )
        elif status == "ongoing":
            if i[6] != None:
                valClient = i[6].strftime('%m/%d/%Y')
            else:
                valClient = "N/A"

            if i[7] != None:
                valPro = i[7].strftime('%m/%d/%Y')
            else:
                valPro = "N/A"

            labMission: object = QLabel(
                f"Emise le: {i[1].strftime('%m/%d/%Y')} Pro: {i[10]} Job: {job} Sujet: {i[2]} Validé Client: {valClient} Validé Pro: {valPro}"
                )
        elif status == "completed":
            labMission: object = QLabel(
                f"Emise le: {i[1].strftime('%m/%d/%Y')} Pro: {i[10]} Job: {job} Sujet: {i[2]} Validé Client: {i[6].strftime('%m/%d/%Y')} Validé Pro: {i[7].strftime('%m/%d/%Y')} Note: {i[3]} Avis: {i[4]}"
                )

        line.addWidget(labMission)
        # On vérifie si le status de la mission peut étre validé par l'utilisateur actuel
        # Si c'est une mission en attente et que l'on est le Pro
        if status == "pending" and mainWindow.userStatus == "Pro":
            btnValidate: object = QPushButton("Valider")
            btnValidate.clicked.connect(
                lambda checked, missionId=i[0]:
                    core_validate(mainWindow, dial, missionId, "acceptedByPro")
            )
            line.addStretch()
            line.addWidget(btnValidate)
        # Si la mission est en cours et qu'elle n'est pas encore validé par le pro et que l'on est ce dernier
        elif status == "ongoing" and mainWindow.userStatus == "Pro" and i[7] == None:
            btnValidate: object = QPushButton("Valider")
            btnValidate.clicked.connect(
                lambda checked, missionId=i[0]:
                    core_validate(mainWindow, dial, missionId, "validatedByPro")
            )
            line.addStretch()
            line.addWidget(btnValidate)
        # Si la mission est en cours et que l'on est le client
        elif status == "ongoing" and mainWindow.userStatus == "Client" and i[6] == None:
            btnValidate: object = QPushButton("Valider")
            btnValidate.clicked.connect(
                lambda checked, missionId=i[0]:
                    core_validate(mainWindow, dial, missionId, "validatedByClient")
            )
            line.addStretch()
            line.addWidget(btnValidate)

        linesMission.append(line)

    # On ajoute chaque lignes au layout des missions
    layMission: object = QVBoxLayout()
    for i in linesMission:
        layMission.addLayout(i)

    # On crée un GroupBox en le nommant en fonction du status des missions
    if status == "pending":
        grpMain: object = QGroupBox("Missions en attente")
    elif status == "ongoing":
        grpMain: object = QGroupBox("Missions en cours")
    elif status == "completed":
        grpMain: object = QGroupBox("Missions terminées")

    grpMain.setLayout(layMission)
    # On ajout le GroupBox au layout principal
    layMain: object = QVBoxLayout()
    layMain.addWidget(grpMain)
    dial.setLayout(layMain)
    # On affiche la fenêtre
    dial.show()