Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod CreateOrUpdateForUnitPeriodTime ( 
 | 
  UnitPeriodTime unitperiodtime, 
 | 
  Boolean isbatcheditmaintenance, 
 | 
  String timeunit, 
 | 
  Duration maintenance, 
 | 
  Boolean isbatcheditefficiency, 
 | 
  Real efficiency, 
 | 
  Boolean isbatcheditallocation, 
 | 
  Real allocation, 
 | 
  Boolean isbatcheditshiftpattern, 
 | 
  ShiftPattern shiftpattern, 
 | 
  Boolean isbatcheditmaxloadpercentage, 
 | 
  Real maxloadpercentage, 
 | 
  Boolean isbatcheditnrofunitsopen, 
 | 
  Number nrofunitsopen, 
 | 
  Boolean isthisperiodonwards, 
 | 
  Boolean isbatcheditminimumloadthreshold, 
 | 
  Real minimumloadthreshold 
 | 
) 
 | 
{ 
 | 
  Description: "Create or update the unit availability when we want only the particular unit period time user's value ( get from unit availability ) change." 
 | 
  TextBody: 
 | 
  [* 
 | 
    // soh yee Feb-20-2013 (modified) 
 | 
    // This method can be used to change either shift pattern or number of units open / close for the unit period time too. 
 | 
     
 | 
    unitavailability := unitperiodtime.UnitAvailability(); 
 | 
    unit := unitperiodtime.Unit(); 
 | 
     
 | 
    // If the batch edit checkbox in UI is unchecked, we get back the current unit availability data. 
 | 
    // Did not use guard for better readability. 
 | 
    if( not isbatcheditmaintenance ) 
 | 
    { 
 | 
      timeunit := unitperiodtime.Period_MP().TimeUnit() ; 
 | 
      maintenance := Duration::Zero(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        timeunit := unitavailability.TimeUnit(); 
 | 
        maintenance := unitavailability.Maintenance(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( not isbatcheditefficiency ) 
 | 
    { 
 | 
      efficiency := unitperiodtime.Efficiency(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        efficiency := unitavailability.Efficiency(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( not isbatcheditallocation ) 
 | 
    { 
 | 
      allocation := unitperiodtime.Allocation(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        allocation := unitavailability.Allocation(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( not isbatcheditshiftpattern ) 
 | 
    { 
 | 
      shiftpattern := unitperiodtime.ShiftPattern(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        shiftpattern := unitavailability.ShiftPattern(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( not isbatcheditmaxloadpercentage ) 
 | 
    { 
 | 
      maxloadpercentage := unitperiodtime.MaximumLoadPercentage(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        maxloadpercentage := unitavailability.MaximumLoadPercentage(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( not isbatcheditnrofunitsopen ) 
 | 
    { 
 | 
      nrofunitsopen := unitperiodtime.NrOfOpen(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        nrofunitsopen := unitavailability.NrOfUnitsOpen(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( not isbatcheditminimumloadthreshold ) 
 | 
    {   
 | 
      minimumloadthreshold := unitperiodtime.MinimumLoadThreshold(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        minimumloadthreshold := unitavailability.MinimumLoadThreshold(); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    /* 
 | 
    Case1: all unit period time are referring to Jan, S12 
 | 
    Unit period time      Unit availability 
 | 
      Jan                     Jan, S12 
 | 
      Feb 
 | 
      Mar 
 | 
      Apr 
 | 
     
 | 
    Case2: when user drop S15 to Mar, (a) and (b) are created. 
 | 
    Unit period time      Unit availability 
 | 
      Jan                     Jan, S12 
 | 
      Feb                     Mar, S15 (a) 
 | 
      Mar                     Apr, S12 (b) 
 | 
      Apr 
 | 
     
 | 
     
 | 
    Case3: when user drop S15 to Jan, (c) is updated. 
 | 
    Unit period time      Unit availability 
 | 
      Jan                     Jan, S15 (c) 
 | 
      Feb                     Mar, S15 (a) 
 | 
      Mar                     Apr, S12 (b) 
 | 
      Apr 
 | 
     
 | 
    Special case: When the scenario have parallel periods, for example Weeks and Days. 
 | 
    Unit period quantity      Unit capacity 
 | 
    Week 1 (isbase)           Week 1 
 | 
    Week 2 (isbase)           Week 2 
 | 
    Week 3 (not base)         Day 1, Day 2, Day 3, Day 5, Day 6, Day 7 
 | 
    Week 4 (not base)         Day 1, Day 2, Day 3, Day 5, Day 6, Day 7 
 | 
    */ 
 | 
     
 | 
    nextupt := unitperiodtime.Next().astype( UnitPeriodTime ); 
 | 
    nextunitavailability := guard( nextupt.UnitAvailability(), null( UnitAvailability ) ); 
 | 
     
 | 
    // Get all period dimension children's unit capacity, for handling special case and when isthisperiodonwads is true 
 | 
    unitavailabilities := selectset( unit, UnitAvailability, ua, 
 | 
                                     ua.Start() >= unitperiodtime.Start() 
 | 
                                     and ( ua.Start() < unitperiodtime.Period_MP().End() // Ignore the end if isthisperiodonwards 
 | 
                                           or isthisperiodonwards ) ); 
 | 
     
 | 
    // To handle special case and when isthisperiodonwads is true 
 | 
    if( unitavailabilities.Size() > 0 
 | 
        and not isnull( nextupt ) ) 
 | 
    { 
 | 
      lastchilduc := null( UnitAvailability ); 
 | 
     
 | 
      // If have next uc, we want to shift the last uc from the childuc as next period uc 
 | 
      if( not isthisperiodonwards ) 
 | 
      { 
 | 
        // Shift the last uc of the child period to next period 
 | 
        lastchilduc := maxselect( unit, UnitAvailability, ua, unitperiodtime.End() >= ua.Start(), ua.Start() ); 
 | 
     
 | 
        if( UnitAvailability::IsPrimaryKeysUnique( unit, nextupt.Start(), null( UnitAvailability ) ) ) 
 | 
        { 
 | 
          // Keep all value except the start, to handle period > day where it have uc start in the middle of the period 
 | 
          // We will shift the last uc to next period 
 | 
          lastchilduc.Update( lastchilduc.Unit(), 
 | 
                              nextupt.Start(), 
 | 
                              lastchilduc.TimeUnit(), 
 | 
                              lastchilduc.Maintenance(), 
 | 
                              lastchilduc.Efficiency(), 
 | 
                              lastchilduc.Allocation(), 
 | 
                              lastchilduc.ShiftPattern(), 
 | 
                              lastchilduc.MaximumLoadPercentage(), 
 | 
                              lastchilduc.NrOfUnitsOpen(), 
 | 
                              lastchilduc.MinimumLoadThreshold(), 
 | 
                              false  
 | 
                            ); 
 | 
        } 
 | 
      } 
 | 
     
 | 
      // Delete all uc except the shifted one (also for handle isthisperiodonwads for week 3, 4 Day 1~7 for the given example) 
 | 
      traverse( unitavailabilities, Elements, e, 
 | 
                e <> unitavailability 
 | 
                and e <> lastchilduc ) 
 | 
      { 
 | 
        e.Delete(); 
 | 
      } 
 | 
     
 | 
      // Propogate the relation to unit period quantity. 
 | 
      // This is needed for the following checking. 
 | 
      Transaction::Transaction().Propagate(); 
 | 
    } 
 | 
     
 | 
    if( not isthisperiodonwards 
 | 
        and not isnull( nextupt ) 
 | 
        and nextunitavailability = unitavailability 
 | 
        and UnitAvailability::IsPrimaryKeysUnique( unit, nextupt.Start(), null( UnitAvailability ) ) ) 
 | 
    { 
 | 
      // Case2: creating (b) 
 | 
      periodspec := nextupt.Period_MP().PeriodSpecification_MP();  
 | 
      nexttimeunit := ifexpr( not isnull( periodspec ), periodspec.TimeUnit(), nextupt.Period_MP().TimeUnit() ); 
 | 
      nextmaintenance := Duration::Zero(); 
 | 
      nextefficiency := nextupt.Efficiency(); 
 | 
      nextallocation := nextupt.Allocation(); 
 | 
      nextshiftpattern := nextupt.ShiftPattern(); 
 | 
      nextmaxloadpercentage := nextupt.MaximumLoadPercentage() 
 | 
      nextnrofunitsopen := nextupt.NrOfOpen(); 
 | 
      nextminimumloadthreshold := nextupt.MinimumLoadThreshold(); 
 | 
     
 | 
      if( unitperiodtime.HasCapacityDefinition() ) 
 | 
      { 
 | 
        nexttimeunit := unitavailability.TimeUnit(); 
 | 
        nextmaintenance := unitavailability.Maintenance(); 
 | 
        nextefficiency := unitavailability.Efficiency(); 
 | 
        nextallocation := unitavailability.Allocation(); 
 | 
        nextshiftpattern := unitavailability.ShiftPattern(); 
 | 
        nextmaxloadpercentage := unitavailability.MaximumLoadPercentage(); 
 | 
        nextnrofunitsopen := unitavailability.NrOfUnitsOpen(); 
 | 
        nextminimumloadthreshold := unitavailability.MinimumLoadThreshold(); 
 | 
      } 
 | 
     
 | 
      UnitAvailability::Create( unit, 
 | 
                                nextupt.Start(), 
 | 
                                nexttimeunit, 
 | 
                                nextmaintenance, 
 | 
                                nextefficiency, 
 | 
                                nextallocation, 
 | 
                                nextshiftpattern, 
 | 
                                nextmaxloadpercentage, 
 | 
                                nextnrofunitsopen, 
 | 
                                nextminimumloadthreshold, 
 | 
                                false 
 | 
                              ); 
 | 
     
 | 
      // Propogate the relation to unit period time. 
 | 
      // This is needed for the following checking. 
 | 
      Transaction::Transaction().Propagate(); 
 | 
    } 
 | 
     
 | 
    // Create a new unit availability for that particular unit period time if it does not bind to any unit availability, or if it has a unit availability, 
 | 
    // the related unit availability doesn't have the same start as the unit period time. 
 | 
    if( not unitperiodtime.HasCapacityDefinition() 
 | 
        or UnitAvailability::IsPrimaryKeysUnique( unit, unitperiodtime.Start(), null( UnitAvailability ) ) ) 
 | 
    { 
 | 
      // Case2: creating (a) 
 | 
      UnitAvailability::Create( unit, 
 | 
                                unitperiodtime.Start(), 
 | 
                                timeunit, 
 | 
                                maintenance, 
 | 
                                efficiency, 
 | 
                                allocation, 
 | 
                                shiftpattern, 
 | 
                                maxloadpercentage, 
 | 
                                nrofunitsopen, 
 | 
                                minimumloadthreshold, 
 | 
                                false 
 | 
                              ); 
 | 
    } 
 | 
     
 | 
    else 
 | 
    { 
 | 
      // Case3 
 | 
      unitavailability.Update( unit, 
 | 
                               unitavailability.Start(), 
 | 
                               timeunit, 
 | 
                               maintenance, 
 | 
                               efficiency, 
 | 
                               allocation, 
 | 
                               shiftpattern, 
 | 
                               maxloadpercentage, 
 | 
                               nrofunitsopen, 
 | 
                               minimumloadthreshold, 
 | 
                               false 
 | 
                             ); 
 | 
    } 
 | 
  *] 
 | 
} 
 |