public function setPmReleaseDate($dueDate, $pmRow, $pmAssetRow, $setLastClosed = false)
 {
     $schedBo = new CalemPmScheduleBo($pmRow['release_schedule']);
     $nextDueDate = $schedBo->getNextDueDate($dueDate);
     if (!$nextDueDate) {
         $nextDueDate = $dueDate;
     }
     //In case there's no schedule planned
     $pmAssetDbo = CalemFactory::getDbo('pm_asset');
     $pmAssetRow = $pmAssetDbo->fetchById($pmAssetRow['id']);
     $pmAssetDbo->setChangeBulk(array('last_released' => CalemText::getServerDate($dueDate), 'next_due_date' => CalemText::getServerDate($nextDueDate), 'release_count' => $pmAssetRow['release_count'] + 1));
     $pmAssetDbo->setIdForUpdate($pmAssetRow['id']);
     $pmAssetDbo->update();
     //Going through meters if any
     $pmMeterDbo = CalemFactory::getDbo("pm_meter");
     try {
         $pmMeterRows = $pmMeterDbo->fetchBySqlParam('select * from pm_meter where pm_asset_id=?', $pmAssetRow['id']);
         $assetMeterDbo = CalemFactory::getDbo('asset_meter');
         foreach ($pmMeterRows as $pmMeterRow) {
             if ($pmMeterRow['release_by_meter']) {
                 try {
                     $assetMeterRow = $assetMeterDbo->fetchById($pmMeterRow['meter_id']);
                     $pmMeterDbo->setChangeBulk(array('reading_released' => $assetMeterRow['reading'], 'rollover_count' => $assetMeterRow['rollover_count']));
                     $pmMeterDbo->setIdForUpdate($pmMeterRow['id']);
                     $pmMeterDbo->update();
                 } catch (CalemDboDataNotFoundException $ex) {
                 }
             }
         }
     } catch (CalemDboDataNotFoundException $ex) {
     }
 }
 /**
  * Release at the same time
  */
 public function depReleasePm($childPmId, $scopeId, $typeId, $woId, $dueDate, $finishTime, $pmRow, $pmAssetRow, $wogenBo)
 {
     $depPmRow = $this->getPmRow($childPmId);
     if ($scopeId == 'pm_dependency_scope_same') {
         $depPmAssetRows = $this->getPmAssetRow($childPmId, $pmAssetRow['asset_id']);
     } else {
         if ($scopeId == 'pm_dependency_scope_all') {
             $depPmAssetRows = $this->getPmAssetRow($childPmId);
         }
     }
     if (!$depPmRow || !$depPmAssetRows) {
         return;
     }
     if (!$wogenBo->isDependencySchedulePm($depPmRow)) {
         return;
     }
     //this dependent PmRow cannot be released.
     $assetDbo = CalemFactory::getDbo('asset');
     //Get schedule object
     $schedBo = new CalemPmScheduleBo($depPmRow['release_schedule']);
     //release each based on scope and type.
     foreach ($depPmAssetRows as $depPmAssetRow) {
         //Let's check for asset here
         if (!$wogenBo->isDependencyScheduleAsset($depPmAssetRow, $assetDbo)) {
             continue;
         }
         //Let's go ahead and release the asset
         $depDueDate = $dueDate;
         //@todo - do we need a configuration to check for floating case so it's not released?
         if ($typeId == 'pm_dependency_before') {
             //Figure out a dueDate by
             $startDate = $this->releaseBo->getStartDate($dueDate, $depPmRow['duration_hours']);
             $depDueDate = $schedBo->adjustReleaseDate($startDate);
         } else {
             if ($typeId == 'pm_dependency_after') {
                 $depDueDate = $schedBo->adjustReleaseDate($finishTime);
             }
         }
         $depFinishTime = $this->releaseBo->getPlannedFinishTime($depDueDate, $depPmRow['duration_hours']);
         $depWoId = $this->releaseBo->releasePm($depDueDate, $depFinishTime, $depPmRow, $depPmAssetRow);
         if ($depWoId) {
             $wogenBo->incWoCount();
             $this->setDepWoId($typeId, $woId, $depWoId);
             //Need to recursively release for dependency
             $wogenBo->releaseByDependency($depWoId, $depDueDate, $depFinishTime, $depPmRow, $depPmAssetRow);
         }
     }
 }