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
49
50
51
52
Quintiq file version 2.0
#parent: #root
Method SynchronizePeriodTaskInCampaignQuantity (
  DateTime start,
  DateTime end,
  SupplyBase supply
)
{
  Description: 'Distribute periodtask quantity to periodtaskincampaign'
  TextBody:
  [*
    if ( not this.MacroPlan().IsOptimizerRunning() )
    {
      if ( not isnull( supply ) and supply.istype( NewSupply ) )
      {
        periodtask := supply.astype( NewSupply ).GetPeriodTaskOperation();
        // Synchornize number of PeriodTaskInCampaign and PeriodTaskInTransition 
        if ( periodtask.UnitPeriod().CampaignPeriod_MP( relsize ) > periodtask.PeriodTaskInCampaign( relsize ) )
        {
          periodtask.CreatePeriodTaskInCampaigns();  
          Transaction::Transaction().Propagate( relation(  CampaignPeriod_MP, PeriodTaskInCampaign ) );
        }
        
        if ( periodtask.UnitPeriod().TransitionPeriod_MP( relsize ) > periodtask.PeriodTaskInTransition( relsize ) )
        {
          periodtask.CreatePeriodTaskInTransitions();
          Transaction::Transaction().Propagate( relation( TransitionPeriod_MP, PeriodTaskInTransition ) );  
        }
        
       // Reset as there might be part of the period task is planned to the transition, if the periodtask replan should replan transition
        periodtask.ResetPeriodTaskInTransition();
        
        periodtaskincampaigns := selectsortedset( periodtask, PeriodTaskInCampaign, ptc, ptc.CampaignPeriod_MP().Start() );
        totalduration := sum( periodtaskincampaigns, Elements.CampaignPeriod_MP, duration, true, duration.Duration() ).HoursAsReal();
        
        remainingqty := periodtask.UserQuantity(); 
        
        traverse( periodtaskincampaigns, Elements, ptc )  
        {
           ptcampaigncapacity := ptc.CampaignPeriod_MP().Duration().HoursAsReal()/ totalduration;
           ptcampaigncapacity := maxvalue( ptcampaigncapacity, 0.0 );
           ptcqty  :=  minvalue( ptcampaigncapacity * periodtask.UserQuantity(), remainingqty );
           ptc.Update( ptcqty, false, false );
           remainingqty := maxvalue(  remainingqty - ptcqty, 0.0 );
        }
        
        this.SynchronizePeriodTaskInTransitionQuantity(  periodtaskincampaigns );
      }
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}