Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod CreateOrUpdateForStockingPointInPeriod ( 
 | 
  StockingPointInPeriod stockingpointinperiod, 
 | 
  Real maxcapacity, 
 | 
  Boolean isthisperiodonwards 
 | 
) 
 | 
{ 
 | 
  Description: "Create or update the stocking point capacity when we want only the particular stocking point in period user's value ( get from stocking point capacity ) change." 
 | 
  TextBody: 
 | 
  [* 
 | 
    // soh yee Feb-20-2013 (modified) 
 | 
    // This method will be used to change the max capacity based on product capacity for stocking point in period too. 
 | 
     
 | 
    stockingpointcapacity := stockingpointinperiod.StockingPointCapacity(); 
 | 
    stockingpoint := stockingpointinperiod.StockingPoint_MP(); 
 | 
     
 | 
    /* 
 | 
    Case1: all stocking point in period are referring to Jan, max capacity 100. 
 | 
    stocking point in period     sp capacity 
 | 
      Jan                        Jan, 100 
 | 
      Feb 
 | 
      Mar 
 | 
      Apr 
 | 
     
 | 
    Case2: when user edit max capacity of the stocking point in period via context menu in spip list on Mar (max capacity = 200), (a) and (b) are created. 
 | 
    stocking point in period     sp capacity 
 | 
      Jan                        Jan, 100 
 | 
      Feb                        Mar, 200 (a) 
 | 
      Mar                        Apr, 100 (b) 
 | 
      Apr 
 | 
     
 | 
     
 | 
    Case3: when user edit max capacity for Mar via context menu in spip list again (now set max capacity = 300), (a) is updated. 
 | 
    stocking point in period     sp capacity 
 | 
      Jan                        Jan, 100 
 | 
      Feb                        Mar, 300 (a) 
 | 
      Mar                        Apr, 100 (b) 
 | 
      Apr 
 | 
     
 | 
     
 | 
    Special case: When the scenario have parallel periods, for example Weeks and Days. 
 | 
    stocking point in period     sp 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 
 | 
    */ 
 | 
     
 | 
    nextspip := stockingpointinperiod.Next(); 
 | 
    nextstockingpointcapacity := guard( nextspip.StockingPointCapacity(), null( StockingPointCapacity ) ); 
 | 
     
 | 
    // Get all period dimension children's stocking point capacity, for handling special case and when isthisperiodonwads is true 
 | 
    spcapacitys := selectset( stockingpoint, StockingPointCapacity, sc, 
 | 
                              sc.Start() >= stockingpointinperiod.Start().Date() 
 | 
                              and ( sc.Start() < stockingpointinperiod.Period_MP().EndDate() // Ignore the end if isthisperiodonwards 
 | 
                                    or isthisperiodonwards ) ); 
 | 
    // To handle special case 
 | 
    if( spcapacitys.Size() > 0 
 | 
        and not isnull( nextspip ) ) 
 | 
    { 
 | 
      lastchildsc := null( StockingPointCapacity ); 
 | 
       
 | 
      // If have next sc, we want to shift the last sc from the childsc as next period sc 
 | 
      if( not isthisperiodonwards ) 
 | 
      { 
 | 
        // Shift the last sc of the child period to next period 
 | 
        lastchildsc := maxselect( stockingpoint, StockingPointCapacity, sc, stockingpointinperiod.End().Date() >= sc.Start(), sc.Start() ); 
 | 
       
 | 
        if( StockingPointCapacity::IsPrimaryKeysUnique( stockingpoint, nextspip.Start().Date(), null( StockingPointCapacity ) ) ) 
 | 
        { 
 | 
          // 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 sc to next period 
 | 
          lastchildsc.Update( lastchildsc.StockingPoint_MP(), 
 | 
                              nextspip.Start().Date(), 
 | 
                              lastchildsc.MaxCapacity(), 
 | 
                              false ); // it is an operation from UI 
 | 
        } 
 | 
      } 
 | 
     
 | 
      // Delete all sc except the shifted one (also for handle isthisperiodonwads for week 3, 4 Day 1~7 for the given example) 
 | 
      traverse( spcapacitys, Elements, e, 
 | 
                e <> stockingpointcapacity 
 | 
                and e <> lastchildsc ) 
 | 
      { 
 | 
        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( nextspip ) 
 | 
        and nextstockingpointcapacity = stockingpointcapacity 
 | 
        and StockingPointCapacity::IsPrimaryKeysUnique( stockingpoint, nextspip.Start().Date(), null( StockingPointCapacity ) ) ) 
 | 
    { 
 | 
      // Case2: creating (b) 
 | 
      StockingPointCapacity::Create( stockingpoint, 
 | 
                                     nextspip.Start().Date(), 
 | 
                                     guard( stockingpointcapacity.MaxCapacity(), nextspip.MaxCapacity() ), 
 | 
                                     false ); // it is an manual operation from UI 
 | 
     
 | 
     
 | 
      // Propogate the relation to stocking point in periods. 
 | 
      // This is needed for the following checking. 
 | 
      Transaction::Transaction().Propagate(); 
 | 
    } 
 | 
     
 | 
    // Create a new stocking point capacity for that particular stocking point in period if it does not bind to any stocking point capacity, or if it already has a stocking point capacity, 
 | 
    // the related stocking point capacity doesn't have the same start as the stocking point in period. 
 | 
    if( not stockingpointinperiod.HasStockingPointCapacity() 
 | 
        or StockingPointCapacity::IsPrimaryKeysUnique( stockingpoint, stockingpointinperiod.Start().Date(), null( StockingPointCapacity ) ) ) 
 | 
    { 
 | 
      // Case2: creating (a) 
 | 
      StockingPointCapacity::Create( stockingpoint, 
 | 
                                     stockingpointinperiod.Start().Date(), 
 | 
                                     maxcapacity, 
 | 
                                     false ); // operation from UI is Manual 
 | 
    } 
 | 
     
 | 
    else 
 | 
    { 
 | 
      // Case3, (a) is updated. 
 | 
      // The to-be created stocking point capacity has the same primary keys with existing data. Therefore, we update it instead of creating a new data to avoid duplication. 
 | 
      stockingpointcapacity.Update( stockingpoint, 
 | 
                                    stockingpointcapacity.Start(), 
 | 
                                    maxcapacity, 
 | 
                                    false ); // operation from UI is Manual  
 | 
    } 
 | 
  *] 
 | 
} 
 |