@@ -359,7 +359,7 @@ def getRemainingEffortForFeat(self, feature: Feature) -> int:
359359 feature .__remainingEffort__ / self .__chargedWorkItems__ [feature ]
360360 )
361361
362- def getEndDateForFeat (self , feature : Feature ) -> date :
362+ def getEndDateForFeat_initialGuess (self , feature : Feature ) -> date :
363363
364364 requireChargedDays = self .getRemainingEffortForFeat (feature )
365365
@@ -369,6 +369,23 @@ def getEndDateForFeat(self, feature: Feature) -> date:
369369 startDate = startDate , requiredWorkDays = requireChargedDays
370370 )
371371
372+
373+ def getEndDateForFeat (self , feature : Feature ) -> date :
374+
375+ if feature .isLate () :
376+
377+ requireChargedDays = self .getRemainingEffortForFeat (feature )
378+
379+ startDate = datetime .today ().date ()
380+
381+ return self .__calendar__ .getDate_after_workDays (
382+ startDate = startDate , requiredWorkDays = requireChargedDays
383+ )
384+
385+ else :
386+ return self .getEndDateForFeat_initialGuess (feature )
387+
388+
372389 def getStartDateForFirstAssignedFeat (self , filter = defaultFilter ) -> date :
373390
374391 if not len (self .__chargedWorkItems__ ):
@@ -538,6 +555,13 @@ def getStartDateForFirstAssignedFeat(self) -> date :
538555 def getRemainingEffortForFeat (self , feature : Feature ) -> int :
539556 return self .getWorkload ().getRemainingEffortForFeat (feature )
540557
558+ """ returns the initial guesss for the date of end for a specific feature assigned to this dev
559+ if the feature is not late, this is equal to the end date
560+ """
561+
562+ def getEndDateForFeat_initialGuess (self , feature : Feature ) -> date :
563+ return self .getWorkload ().getEndDateForFeat_initialGuess (feature )
564+
541565 """ returns the date of end for a specific feature assigned to this dev"""
542566
543567 def getEndDateForFeat (self , feature : Feature ) -> date :
@@ -875,6 +899,13 @@ def getStartDate(self) -> date:
875899
876900 return self .__startDate__
877901
902+ def getEndDate_initialGuess (self ) -> date :
903+
904+ if self .__assignee__ is None :
905+ raise ValueError ("No assingee assigned to feature : " + self .__name__ )
906+
907+ return self .__assignee__ .getEndDateForFeat_initialGuess (self )
908+
878909 def getEndDate (self ) -> date :
879910
880911 if self .__assignee__ is None :
@@ -1190,21 +1221,25 @@ def gantt(self) -> None:
11901221
11911222 tasks = []
11921223 for i in self .__features__ :
1193- tasks .append (
1194- dict (
1195- Task = i .__name__ + "_LATE_" if i .isLate () else i .__name__ ,
1196- Start = i .__startDate__ .__str__ (),
1197- Finish = i .getEndDate ().__str__ (),
1198- Assignee = i .__assignee__ .__name__ ,
1199- )
1200- )
12011224
1202- if i .isLate () :
1225+ isLate = i .isLate ()
1226+
1227+ if isLate :
1228+
12031229 tasks .append (
12041230 dict (
1205- Task = i .__name__ + "_LATE_" ,
1231+ Task = i .__name__ + "_LATE_" ,
1232+ Start = i .__startDate__ .__str__ (),
1233+ Finish = i .getEndDate_initialGuess ().__str__ (),
1234+ Assignee = i .__assignee__ .__name__ ,
1235+ )
1236+ )
1237+
1238+ tasks .append (
1239+ dict (
1240+ Task = i .__name__ + "_LATE_" if isLate else i .__name__ ,
12061241 Start = datetime .today ().date ().__str__ (),
1207- Finish = ( datetime . today (). date () + timedelta ( days = i . __assignee__ . getRemainingEffortForFeat ( i )) ).__str__ (),
1242+ Finish = i . getEndDate ( ).__str__ (),
12081243 Assignee = i .__assignee__ .__name__ ,
12091244 )
12101245 )
0 commit comments