public function test_calcSnapshots()
 {
     /** === Test Data === */
     $CURRENT_STATE = [1 => [Snap::ATTR_CUSTOMER_ID => 1, Snap::ATTR_PARENT_ID => 1, Snap::ATTR_PATH => '/', Snap::ATTR_DEPTH => 0], 2 => [Snap::ATTR_CUSTOMER_ID => 2, Snap::ATTR_PARENT_ID => 1, Snap::ATTR_PATH => '/1/', Snap::ATTR_DEPTH => 1], 3 => [Snap::ATTR_CUSTOMER_ID => 3, Snap::ATTR_PARENT_ID => 1, Snap::ATTR_PATH => '/1/', Snap::ATTR_DEPTH => 1]];
     $CHANGES = [[Change::ATTR_CUSTOMER_ID => 99, Change::ATTR_PARENT_ID => 99, Change::ATTR_DATE_CHANGED => '2015-12-07 12:00:00'], [Change::ATTR_CUSTOMER_ID => 4, Change::ATTR_PARENT_ID => 2, Change::ATTR_DATE_CHANGED => '2015-12-07 12:01:00'], [Change::ATTR_CUSTOMER_ID => 3, Change::ATTR_PARENT_ID => 2, Change::ATTR_DATE_CHANGED => '2015-12-07 12:02:00'], [Change::ATTR_CUSTOMER_ID => 3, Change::ATTR_PARENT_ID => 3, Change::ATTR_DATE_CHANGED => '2015-12-07 12:03:00'], [Change::ATTR_CUSTOMER_ID => 1, Change::ATTR_PARENT_ID => 3, Change::ATTR_DATE_CHANGED => '2015-12-07 12:04:00']];
     $PERIOD = '20151207';
     /** === Setup Mocks === */
     $this->mToolPeriod->shouldReceive('getPeriodCurrent')->times(5)->andReturn($PERIOD);
     /** === Call and asserts  === */
     $res = $this->obj->calcSnapshots($CURRENT_STATE, $CHANGES);
     $this->assertTrue(is_array($res));
 }
 /**
  * Calculate downline snapshots up to requested date (including).
  *
  * @param Request\Calc $request
  *
  * @return Response\Calc
  */
 public function calc(Request\Calc $request)
 {
     $result = new Response\Calc();
     $this->_logger->info("New downline snapshot calculation is requested.");
     $periodTo = $request->getDatestampTo();
     $def = $this->_manTrans->begin();
     try {
         /* get the last date with calculated snapshots */
         $reqLast = new Request\GetLastDate();
         /** @var  $resp Response\GetLastDate */
         $respLast = $this->getLastDate($reqLast);
         $lastDatestamp = $respLast->getLastDate();
         /* get the snapshot on the last date */
         $snapshot = $this->_repoSnap->getStateOnDate($lastDatestamp);
         /* get change log for the period */
         $tsFrom = $this->_toolPeriod->getTimestampNextFrom($lastDatestamp);
         $tsTo = $this->_toolPeriod->getTimestampTo($periodTo);
         $changelog = $this->_repoChange->getChangesForPeriod($tsFrom, $tsTo);
         /* calculate snapshots for the period */
         $updates = $this->_subCalc->calcSnapshots($snapshot, $changelog);
         /* save new snapshots in DB */
         $this->_repoSnap->saveCalculatedUpdates($updates);
         $this->_manTrans->commit($def);
         $result->markSucceed();
     } finally {
         $this->_manTrans->end($def);
     }
     return $result;
 }