admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
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
Quintiq file version 2.0
#parent: #root
Method InitConstraintsGoalsForDriverStaffing (
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
  const RunContextForCapacityPlanning runcontext,
  const LibOpt_Scope scope
) const
{
  Description: 'Init constraints goals for account depends on staffing'
  TextBody:
  [*
    if( runcontext.UseShiftOptimization() )
    {
      constname := typeof( MPDriverStaffingConstraint );
      
      scalefactor_spisused_spisused := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constname );
      scalefactor_staffing_spisused := this.ScaleConstraintTerm( typeof( MPDriverStaffingVariable ), constname );
      
      driver := select( this, MacroPlan.AccountCostDriver, driver, driver.Name() = Translations::MP_AccountAssignmentCostDriverStaffing() );
      traverse( scope.GetAccountsInOptimizerRunConst(), Elements, account, account.HasStaffingAssignment() )
      {
        // Staffing constraint UoM : Monetary
        staffingconstr := program.DriverStaffingConstraints().New( account, driver );
        staffingconstr.Sense( "=" );
        staffingconstr.RHSValue( 0.0 ); 
        
        staffingconstr.NewTerm( 1.0 * scalefactor_staffing_spisused, program.DriverStaffingVariables().Get( account, driver ) );
        traverse( account, AccountAssignment, aa, aa.AccountCostDriver() = driver and aa.AccountCost( relsize ) > 0 )
        {
          traverse( aa, astype( UnitAccount ).Unit.PlanningUnitPeriod.astype( UnitPeriodTimeBase ), up, up.IsInScopeForShiftOptimization( scope ) )
          {
            traverse( this.MacroPlan(), ShiftPattern, sp )
            {
              cost := up.GetStaffingBaseCostForShiftPattern( aa, null( AccountCost ), sp );
              spisusedvar := program.ShiftPatternIsUsedVariables().Find( sp, up );
              
              if( not isnull( spisusedvar ) )
              {
                staffingconstr.NewTerm( -cost * scalefactor_spisused_spisused, spisusedvar );
              }
            }
          }
        }
      }
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}