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 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
| Public Sub Calcul()
Dim locIntCompteurEmploy, locIntCompteurJour As Integer
Dim locStrMaitriseEmploy As String
Dim locStrSecteurEmploy As String
Dim locStrContratEmploy As String
Dim locDbleTotalInHourAbsEmploy As Double = 0
Dim locSectResult As secteurResult
Dim locIntPosSecteur As Integer
Dim locDateDateJ As Date
Dim locDateJResult As Calendrier_Jour_Result
Dim locSemJResult As Calendrier_Semaine_Result
Dim locMoisJResult As Calendrier_Mois_Result
Dim locIntPosDateJResult As Integer
Dim locIntCompteurAbs As Integer
Dim locIntCompteurPosAbs As Integer
Dim locIntPosAbs As Integer
Dim locLgPosDateJCalEmploy As Long
Dim locIntNumSemaine As Integer
Dim locStrMoisDeD As String
Dim locStrAnneDeD As String
Dim locStrNomMois As String
Dim locLgPosMoisDateJResult As Long
Dim locLgPosSemDateJResult As Long
Dim locDbleTempsPresence As Double = 0
'variable de gestion des informations de jour d'absence
Dim locStrAbsDate_1 As String = ""
Dim locStrAbsAbbre_1 As String = ""
Dim locDbleAbsTotalHour_1 As Double = 0
Dim locStrAbsDate_2 As String = ""
Dim locStrAbsAbbre_2 As String = ""
Dim locDbleAbsTotalHour_2 As Double = 0
Dim locBoolAbsDateCompare As Boolean = False
Dim locBoolAbsAbbreSubStr As Boolean = False
Dim locBoolAbsTotalHourCompare As Boolean = False
'variable pour la gestion des temps
Dim loclgPerfTotalDebut As Long
Dim loclgPerfTotalFin As Long
Dim loclgPerfTotalTraitement As Long
'stock la position des absences pour la date du jour de l'employe
Dim locCollPosAbsDateJ As New System.Collections.Generic.List(Of Integer)
QueryPerformanceCounter(loclgPerfTotalDebut)
For locIntCompteurEmploy = 0 To collInfoEmploy.Count - 1
Console.WriteLine(collInfoEmploy(locIntCompteurEmploy).Ressource & " : ")
locStrMaitriseEmploy = collInfoEmploy(locIntCompteurEmploy).Maitrise
Console.WriteLine(" Maitrise : " & collInfoEmploy(locIntCompteurEmploy).Maitrise)
locStrSecteurEmploy = collInfoEmploy(locIntCompteurEmploy).Secteur
Console.WriteLine(" Secteur : " & locStrSecteurEmploy)
locStrContratEmploy = collInfoEmploy(locIntCompteurEmploy).Contrat
Console.WriteLine(" Contrat : " & locStrContratEmploy)
'si le secteur n'existe pas je la crée
QueryPerformanceCounter(glDebut)
If SecteurEstDansResult(locStrSecteurEmploy) = False Then
'utilisation des expressions lambda
'If Not (collgSecteurResult.Exists(Function(s) s.nomSecteur = locStrSecteurEmploy)) Then
Console.WriteLine(" Le Secteur : " & locStrSecteurEmploy & " n'existe pas dans la collection de résultat")
locSectResult = New secteurResult
locSectResult.nomSecteur = locStrSecteurEmploy
collgSecteurResult.Add(locSectResult)
Console.WriteLine(" Le Secteur : " & locStrSecteurEmploy & " est créé dans la collection de résultat")
Else
Console.WriteLine(" Le Secteur : " & locStrSecteurEmploy & " existe dans la collection de résultat")
End If
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
'je récupère la position du secteur
locIntPosSecteur = PosSecteurResult(locStrSecteurEmploy)
Console.WriteLine(" le Secteur : " & locStrSecteurEmploy & " est à la position : " & locIntPosSecteur & " dans la collection de résultat")
'j'ajoute l'employe en cours
collgSecteurResult(locIntPosSecteur).listeEmploy.Add(collInfoEmploy(locIntCompteurEmploy))
Console.WriteLine(" Ajout de " & collInfoEmploy(locIntCompteurEmploy).Ressource & " au secteur de résultat : " & locStrSecteurEmploy)
For locIntCompteurJour = 0 To collDate.Count - 1
locDateDateJ = collDate(locIntCompteurJour)
Console.WriteLine(vbCrLf & " Date du jour : " & locDateDateJ)
locIntNumSemaine = DatePart("ww", locDateDateJ, vbMonday, FirstWeekOfYear.FirstFourDays).ToString
Console.WriteLine(" Numéro de la semaine : " & locIntNumSemaine)
locStrMoisDeD = MonthName(Month(locDateDateJ))
locStrAnneDeD = Year(locDateDateJ)
locStrNomMois = locStrMoisDeD + " " + locStrAnneDeD
Console.WriteLine(" Mois en cours : " & locStrNomMois & vbCrLf)
QueryPerformanceCounter(glDebut)
'si la date n'existe pas je la crée
If DateEstDansCalJourResult(locDateDateJ, locIntPosSecteur) = False Then
Console.WriteLine(" La date : " & locDateDateJ & " n'existe pas dans la collection de résultat")
locDateJResult = New Calendrier_Jour_Result
locDateJResult.dateJ = locDateDateJ
collgSecteurResult(locIntPosSecteur).calJourResult.Add(locDateJResult)
Console.WriteLine(" La date : " & locDateDateJ & " est crééé dans la collection de résultat")
Else
Console.WriteLine(" La date : " & locDateDateJ & " existe dans la collection de résultat")
End If
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
QueryPerformanceCounter(glDebut)
'je récupère la position de la date
locIntPosDateJResult = PosDateCalJourResult(locDateDateJ, locIntPosSecteur)
Console.WriteLine(" la date : " & locDateDateJ & " est à la position : " & locIntPosDateJResult & " dans la collection de résultat" & vbCrLf)
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
QueryPerformanceCounter(glDebut)
locLgPosSemDateJResult = SemEstDansCalSemResult(locIntNumSemaine, locIntPosSecteur)
'si la semaine du jour en cour n'existe pas
If locLgPosSemDateJResult = -1 Then
Console.WriteLine(" La semaine numéro " & locIntNumSemaine & " n'existe pas dans la collection de résultat")
locSemJResult = New Calendrier_Semaine_Result
locSemJResult.numSemaine = locIntNumSemaine
collgSecteurResult(locIntPosSecteur).calSemResult.Add(locSemJResult)
Console.WriteLine(" La semaine numéro " & locIntNumSemaine & " est créée dans la collection de résultat")
locLgPosSemDateJResult = collgSecteurResult(locIntPosSecteur).calSemResult.Count - 1
Else
Console.WriteLine(" La semaine numéro " & locIntNumSemaine & " existe dans la collection de résultat")
End If
Console.WriteLine(" La position de la semaine numéro " & locIntNumSemaine & " est : " & locLgPosSemDateJResult & vbCrLf)
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
QueryPerformanceCounter(glDebut)
locLgPosMoisDateJResult = MoisEstDansCalMoisResult(locStrNomMois, locIntPosSecteur)
'si le mois du jour en cour n'existe pas
If locLgPosMoisDateJResult = -1 Then
Console.WriteLine(" Le mois " & locStrNomMois & " n'existe pas dans la collection de résultat")
locMoisJResult = New Calendrier_Mois_Result
locMoisJResult.nom_mois_annee = locStrNomMois
collgSecteurResult(locIntPosSecteur).calMoisResult.Add(locMoisJResult)
Console.WriteLine(" Le mois " & locStrNomMois & " est créée dans la collection de résultat")
locLgPosMoisDateJResult = collgSecteurResult(locIntPosSecteur).calMoisResult.Count - 1
Else
Console.WriteLine(" Le mois " & locStrNomMois & " existe dans la collection de résultat")
End If
Console.WriteLine(" La position du mois " & locStrNomMois & " est : " & locLgPosMoisDateJResult & vbCrLf)
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
QueryPerformanceCounter(glDebut)
If EstJourFerie(locDateDateJ) Then
Console.WriteLine(" " & locDateDateJ & " est un jour férié")
With collgSecteurResult(locIntPosSecteur).calJourResult(locIntPosDateJResult)
.dateJ = locDateDateJ
.nbCDI = 0
.nbINTER = 0
End With
Else
Console.WriteLine(" " & locDateDateJ & " n'est pas un jour férié")
End If
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
QueryPerformanceCounter(glDebut)
locLgPosDateJCalEmploy = DateEstDansCalEmploy(locDateDateJ, locIntCompteurEmploy)
If locLgPosDateJCalEmploy <> -1 Then
Console.WriteLine(" Est salarié d'Evobus au : " & locDateDateJ)
'si la date du jour est dans le calendrier de l'employé => si l'employé est embauché
locDbleTempsPresence = collInfoEmploy(locIntCompteurEmploy).collCalEmploy(locLgPosDateJCalEmploy).contracted_time
Console.WriteLine(" Temps de travail théorique au " & locDateDateJ & " : " & locDbleTempsPresence)
'on récupère la liste des absences pour la journée
'si la date du jour est inférieure ou égale à la date actuellement lu dans la liste des jours d'absences
'on peut sortir de la boucle les dates étant triées par ordre croissant
Dim locBoolIsDateSup As Boolean = False
'entre chaque employé il faut pensé à réinitialiser le compteur
'pas d'initialisation comme pour la boucle for
locIntCompteurAbs = 0
While ((locIntCompteurAbs <= collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy.Count - 1) And _
(locBoolIsDateSup = False))
'date du jour d'absence en cours de lecture
Dim locDateTmp As Date = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).dateAbsence
'si la date du jour en cours est supérieure à la date du jour lu dans la liste des jours d'absences
If locDateDateJ >= locDateTmp Then
If collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).dateAbsence = locDateDateJ Then
Console.WriteLine(" " & locDateDateJ & " est un jour d'absence")
Console.WriteLine(" type d'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).absTypeAbbr)
Console.WriteLine(" durée de l'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).totalInHour)
locCollPosAbsDateJ.Add(locIntCompteurAbs)
End If
locIntCompteurAbs += 1
Else
'sinon le jour lu dans la liste des jours d'absences est plus grand que la date du jour
'la date du jour d'absence est plus grande que la date du jour pour la recherche on n'a pas besoin
'de continuer la recherche des jours d'absences
locBoolIsDateSup = True
End If
End While
'For locIntCompteurAbs = 0 To collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy.Count - 1
' If collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).dateAbsence = locStrDateJ Then
' Console.WriteLine(" " & locStrDateJ & " est un jour d'absence : ")
' Console.WriteLine(" type d'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).absTypeAbbr)
' Console.WriteLine(" durée de l'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).totalInHour)
' locCollPosAbsDateJ.Add(locIntCompteurAbs)
' End If
'Next
'Si il y a plus d'une absence pour la journée
If locCollPosAbsDateJ.Count > 1 Then
Console.WriteLine(" Il y a plusieurs absences le : " & locDateDateJ)
locStrAbsAbbre_1 = ""
locStrAbsDate_1 = ""
locDbleAbsTotalHour_1 = 0
'pour chaque journée d'absence
For locIntCompteurPosAbs = 0 To locCollPosAbsDateJ.Count - 1
locStrAbsDate_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(locIntCompteurPosAbs)).dateAbsence
locStrAbsAbbre_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(locIntCompteurPosAbs)).absTypeAbbr
locDbleAbsTotalHour_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(locIntCompteurPosAbs)).totalInHour
'on compare les informations de ligne d'absence 2 à 2
locBoolAbsDateCompare = dateCompare(locStrAbsDate_1, locStrAbsDate_2)
locBoolAbsAbbreSubStr = estSubStr(locStrAbsAbbre_1, locStrAbsAbbre_2)
locBoolAbsTotalHourCompare = totalHourCompare(locDbleAbsTotalHour_1, locDbleAbsTotalHour_2)
'si les 2 lignes d'informations ne font pas référence à la même absence
'il faut soustraire la valeur d'absence
If ((locBoolAbsDateCompare And locBoolAbsAbbreSubStr And locBoolAbsTotalHourCompare) = False) Then
Console.WriteLine(" Il ne s'agit pas d'absences liées à la même absence")
locDbleTempsPresence -= locDbleAbsTotalHour_2
Console.WriteLine(" Le temps de présence est de : " & locDbleTempsPresence)
Else
Console.WriteLine(" Il s'agit d'absences liées à la même absence")
End If
'on récupère les informations de la lignes en cours pour les comparer à la ligne suivante
locStrAbsDate_1 = locStrAbsDate_2
locStrAbsAbbre_1 = locStrAbsAbbre_2
locDbleAbsTotalHour_1 = locDbleAbsTotalHour_2
Next
ElseIf locCollPosAbsDateJ.Count = 1 Then
Console.WriteLine(" Il n'y a qu'une absence le :" & locDateDateJ)
locDbleAbsTotalHour_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(0)).totalInHour
locDbleTempsPresence -= locDbleAbsTotalHour_2
Console.WriteLine(" le temps de présence est de : " & locDbleTempsPresence)
ElseIf locCollPosAbsDateJ.Count = 0 Then
Console.WriteLine(" " & locDateDateJ & " n'est pas un jour d'absence")
End If
End If
QueryPerformanceCounter(glFin)
Console.WriteLine(TempsTrace())
'il faut vider la liste des positions de jours d'absences pour le jour en cours
locCollPosAbsDateJ.Clear()
Next
Next
QueryPerformanceCounter(loclgPerfTotalFin)
loclgPerfTotalTraitement = loclgPerfTotalFin - loclgPerfTotalDebut
temps_seconde = (loclgPerfTotalTraitement - (loclgPerfTotalTraitement Mod 1000000)) / 1000000
temps_milliseconde = ((loclgPerfTotalTraitement Mod 1000000) - (loclgPerfTotalTraitement Mod 1000)) / 1000
temps_nanoseconde = (loclgPerfTotalTraitement Mod 1000000) Mod 1000
Console.WriteLine(temps_seconde & " s " & temps_milliseconde & " ms " & temps_nanoseconde & "na")
End Sub |
Partager