/**
  * @param Request\PvWriteOff $request
  *
  * @return Response\PvWriteOff
  */
 public function pvWriteOff(Request\PvWriteOff $request)
 {
     $result = new Response\PvWriteOff();
     $datePerformed = $request->getDatePerformed();
     $this->_logger->info("'PV Write Off' calculation is started.");
     $reqGetPeriod = new PeriodGetForWriteOffRequest();
     $respGetPeriod = $this->_callPeriod->getForWriteOff($reqGetPeriod);
     if ($respGetPeriod->isSucceed()) {
         if ($respGetPeriod->hasNoPvTransactionsYet()) {
             $this->_logger->info("There is no PV transactions yet. Nothing to calculate.");
             $result->markSucceed();
         } else {
             $def = $this->_manTrans->begin();
             try {
                 /* working vars */
                 $periodData = $respGetPeriod->getPeriodData();
                 $periodId = $periodData[Period::ATTR_ID];
                 $calcData = $respGetPeriod->getCalcData();
                 $calcId = $calcData[Calculation::ATTR_ID];
                 $periodBegin = $periodData[Period::ATTR_DSTAMP_BEGIN];
                 $periodEnd = $periodData[Period::ATTR_DSTAMP_END];
                 $this->_logger->info("Processing period #{$periodId} ({$periodBegin}-{$periodEnd}), calculation #{$calcId}.");
                 $transData = $this->_subDb->getDataForWriteOff($calcId, $periodBegin, $periodEnd);
                 $updates = $this->_subCalc->pvWriteOff($transData);
                 $dateApplied = $this->_toolPeriod->getTimestampTo($periodEnd);
                 $operId = $this->_subDb->saveOperationPvWriteOff($updates, $datePerformed, $dateApplied);
                 $this->_subDb->saveLogPvWriteOff($transData, $operId, $calcId);
                 $this->_subDb->markCalcComplete($calcId);
                 $this->_manTrans->commit($def);
                 $result->setPeriodId($periodId);
                 $result->setCalcId($calcId);
                 $result->markSucceed();
             } finally {
                 $this->_manTrans->end($def);
             }
         }
     }
     $this->_logMemoryUsage();
     $this->_logger->info("'PV Write Off' calculation is completed.");
     return $result;
 }
 public function test_pvWriteOff()
 {
     /** === Test Data === */
     $TRANSACTIONS = [[Transaction::ATTR_DEBIT_ACC_ID => 2, Transaction::ATTR_CREDIT_ACC_ID => 4, Transaction::ATTR_VALUE => 10], [Transaction::ATTR_DEBIT_ACC_ID => 2, Transaction::ATTR_CREDIT_ACC_ID => 8, Transaction::ATTR_VALUE => 20], [Transaction::ATTR_DEBIT_ACC_ID => 4, Transaction::ATTR_CREDIT_ACC_ID => 8, Transaction::ATTR_VALUE => 30]];
     /** === Mocks === */
     $mLogger = $this->_mockLogger();
     $mToolbox = $this->_mockToolbox();
     $mCallDownlineSnap = $this->_mockFor('\\Praxigento\\Downline\\Service\\ISnap');
     /**
      * Prepare request and perform call.
      */
     /** @var  $sub Calc */
     $sub = new Calc($mLogger, $mToolbox, $mCallDownlineSnap);
     $res = $sub->pvWriteOff($TRANSACTIONS);
     $this->assertTrue(is_array($res));
 }