| 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' } | 
| } |