Set the trigger date to the previous date according to the periodicity and rules

Return TypeFunction nameArguments
hzEcodehzCron::Retard(hzXDate&,uint32_t,)

Declared in file: hzCron.h
Defined in file : hzCron.cpp

Function Logic:

0:START 1:unknown 2:items m_error 3:Return E_NOINIT 4:unknown 5:m_error 6:Return E_ARGUMENT 7:unknown 8:items 9:factor 10:Y M dow 11:unknown 12:alt items 13:m_Period==HZPERIOD_MONSAT 14:items items 15:m_Period==HZPERIOD_WEEKDAY 16:items items 17:m_Period==HZPERIOD_EMON 18:items items 19:m_Period==HZPERIOD_ETUE 20:items items 21:m_Period==HZPERIOD_EWED 22:items items 23:m_Period==HZPERIOD_ETHR 24:items items 25:m_Period==HZPERIOD_EFRI 26:items items 27:m_Period==HZPERIOD_ESAT 28:items items 29:m_Period==HZPERIOD_ESUN 30:dow 31:alt items 32:m_Period==HZPERIOD_ALT_MON 33:items alt items 34:m_Period==HZPERIOD_ALT_TUE 35:items alt items 36:m_Period==HZPERIOD_ALT_WED 37:items alt items 38:m_Period==HZPERIOD_ALT_THR 39:items alt items 40:m_Period==HZPERIOD_ALT_FRI 41:items alt items 42:m_Period==HZPERIOD_ALT_SAT 43:items alt items 44:m_Period==HZPERIOD_ALT_SUN 45:dow 46:alt alt items 47:m_Period 48:HZPERIOD_MONTH 49:items 50:HZPERIOD_MONTH1 51:HZPERIOD_MONTH2 52:M 53:alt items 54:HZPERIOD_QTR1 55:HZPERIOD_QTR2 56:HZPERIOD_QTR3 57:M 58:alt items 59:HZPERIOD_HYEAR1 60:HZPERIOD_HYEAR2 61:HZPERIOD_HYEAR3 62:HZPERIOD_HYEAR4 63:HZPERIOD_HYEAR5 64:HZPERIOD_HYEAR6 65:M 66:alt items 67:HZPERIOD_YEAR1 68:HZPERIOD_YEAR2 69:HZPERIOD_YEAR3 70:HZPERIOD_YEAR4 71:HZPERIOD_YEAR5 72:HZPERIOD_YEAR6 73:HZPERIOD_YEAR7 74:HZPERIOD_YEAR8 75:HZPERIOD_YEAR9 76:HZPERIOD_YEAR10 77:HZPERIOD_YEAR11 78:HZPERIOD_YEAR12 79:items 80:unknown 81:items M 82:items 83:unknown 84:items 85:Return E_OK

Function body:

hzEcode hzCron::Retard (hzXDate& date)uint32_t factor, 
{
   //  Set the trigger date to the previous date according to the periodicity and rules
   //  
   //  Arguments: 1) date Full date and time
   //     2) factor No of intervals to retard
   //  
   //  Returns: E_ARGUMENT If the number of intervals to retard is zero
   //     E_NOINIT If this hzCron is not active or cannot be retarded
   //     E_OK  If this hzCron set the date of the previous occurance
   _hzfunc("hzCron::Advance(hzXDate)") ;
   uint32_t    Y ;     //  Year
   uint32_t    M ;     //  Month
   uint32_t    dow ;   //  Day of week
   uint32_t    alt ;   //  No of days to retard
   if (!m_bActive)
   {
       date.Clear() ;
       m_error = "Interval not active" ;
       return E_NOINIT ;
   }
   if (factor < 1)
   {
       m_error = "Factor must be 1 or more" ;
       return E_ARGUMENT ;
   }
   if (!date.IsSet())
       date.SysDateTime() ;
   do
   {
       Y = date.Year() ;
       M = date.Month() ;
       dow = date.Dow() ;
       //  Every day
       if      (m_Period == HZPERIOD_DAY)      { alt = 1; date.altdate(DAY, -alt) ; }
       //  Mon - Sat",
       else if (m_Period == HZPERIOD_MONSAT)   { alt = dow==0? 2: 1; date.altdate(DAY, -alt) ; }
       //  Weekdays only
       else if (m_Period == HZPERIOD_WEEKDAY)  { alt = dow>4? dow - 4: dow ? 1: 3; date.altdate(DAY, -alt) ; }
       //  Every [Monday - Friday]
       else if (m_Period == HZPERIOD_EMON)     { alt = dow>0? dow : 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ETUE)     { alt = dow>1? dow - 1: dow + 6; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_EWED)     { alt = dow>2? dow - 2: dow + 5; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ETHR)     { alt = dow>3? dow - 3: dow + 4; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_EFRI)     { alt = dow>4? dow - 4: dow + 3; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ESAT)     { alt = dow>5? dow - 5: dow + 2; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ESUN)     { alt = dow + 1; date.altdate(DAY, -alt) ; }
       //  Every other [Monday - Friday]
       else if (m_Period == HZPERIOD_ALT_MON)  { alt = dow>0? dow : 7; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_TUE)  { alt = dow>1? dow - 1: dow + 6; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_WED)  { alt = dow>2? dow - 2: dow + 5; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_THR)  { alt = dow>3? dow - 3: dow + 4; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_FRI)  { alt = dow>4? dow - 4: dow + 3; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_SAT)  { alt = dow>5? dow - 5: dow + 2; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_SUN)  { alt = dow + 1; alt += 7; date.altdate(DAY, -alt) ; }
       else
       {
           switch  (m_Period)
           {
           //  Monthly
           case HZPERIOD_MONTH:
               M-- ; break ;
           //  Bi-monthly [odd/even]
           case HZPERIOD_MONTH1:
           case HZPERIOD_MONTH2:
               alt = M % 2; M -= alt ? alt : 2; break ;
           //  Quarterly [month1 - month3]
           case HZPERIOD_QTR1: case HZPERIOD_QTR2: case HZPERIOD_QTR3:
               alt = M % 3; M -= alt ? alt : 3; break ;
           //  Half yearly [month1 - month6]
           case HZPERIOD_HYEAR1: case HZPERIOD_HYEAR2: case HZPERIOD_HYEAR3: case HZPERIOD_HYEAR4: case HZPERIOD_HYEAR5: case HZPERIOD_HYEAR6:
               alt = M % 6; M -= alt ? alt : 6; break ;
           //  Every [Jan - Dec]
           case HZPERIOD_YEAR1: case HZPERIOD_YEAR2: case HZPERIOD_YEAR3: case HZPERIOD_YEAR4: case HZPERIOD_YEAR5: case HZPERIOD_YEAR6:
           case HZPERIOD_YEAR7: case HZPERIOD_YEAR8: case HZPERIOD_YEAR9: case HZPERIOD_YEAR10: case HZPERIOD_YEAR11: case HZPERIOD_YEAR12:
               Y-- ; break ;
           }
           if (M < 1)
               { Y-- ; M += 12;}
           date.SetDate(Y, M, 1);
       }
       //  Have arrived at a possible date. Check if this is not excluded. If it is we do not decrement the factor
       if (!IsHoliday(date, m_exclhols))
           factor-- ;
   }
   while (factor) ;
   return E_OK ;
}