public function test_bonusPersonal_Eu()
 {
     $obm = \Magento\Framework\App\ObjectManager::getInstance();
     /** @var  $call \Praxigento\Bonus\Hybrid\Lib\Service\ICalc */
     $call = $obm->get('Praxigento\\Bonus\\Hybrid\\Lib\\Service\\ICalc');
     $request = new Request\BonusPersonal();
     $request->setScheme(Def::SCHEMA_EU);
     $response = $call->bonusPersonal($request);
     $this->assertTrue($response->isSucceed());
 }
 public function bonusPersonal(Request\BonusPersonal $request)
 {
     $result = new Response\BonusPersonal();
     $scheme = $this->_getCalculationsScheme($request->getScheme());
     $datePerformed = $request->getDatePerformed();
     $dateApplied = $request->getDateApplied();
     $this->_logger->info("'Personal Bonus' calculation is started. Scheme: {$scheme}, performed at: {$datePerformed}, applied at: {$dateApplied}.");
     $reqGetPeriod = new PeriodGetForDependentCalcRequest();
     $calcTypeBase = Cfg::CODE_TYPE_CALC_COMPRESS_FOR_PTC;
     if ($scheme == Def::SCHEMA_EU) {
         $calcType = Cfg::CODE_TYPE_CALC_BONUS_PERSONAL_EU;
     } else {
         $calcType = Cfg::CODE_TYPE_CALC_BONUS_PERSONAL_DEF;
     }
     $reqGetPeriod->setBaseCalcTypeCode($calcTypeBase);
     $reqGetPeriod->setDependentCalcTypeCode($calcType);
     $respGetPeriod = $this->_callPeriod->getForDependentCalc($reqGetPeriod);
     if ($respGetPeriod->isSucceed()) {
         $def = $this->_manTrans->begin();
         try {
             /* working vars */
             $thisPeriodData = $respGetPeriod->getDependentPeriodData();
             $thisPeriodId = $thisPeriodData[Period::ATTR_ID];
             $thisCalcData = $respGetPeriod->getDependentCalcData();
             $thisCalcId = $thisCalcData[Calculation::ATTR_ID];
             $basePeriodData = $respGetPeriod->getBasePeriodData();
             $baseDsBegin = $basePeriodData->getDstampBegin();
             $baseDsEnd = $basePeriodData->getDstampEnd();
             $baseCalcData = $respGetPeriod->getBaseCalcData();
             $baseCalcId = $baseCalcData->getId();
             /* calculation itself */
             $this->_logger->info("Processing period #{$thisPeriodId} ({$baseDsBegin}-{$baseDsEnd})");
             /* get compressed data by calculation ID */
             $compressPtc = $this->_subDb->getCompressedPtcData($baseCalcId);
             /* calculates bonus according to the calculation scheme */
             if ($scheme == Def::SCHEMA_EU) {
                 /* use EU scheme */
                 $treeFlat = $this->_subDb->getDownlineSnapshot($baseDsEnd);
                 $orders = $this->_subDb->getSaleOrdersForRebate($baseDsBegin, $baseDsEnd);
                 $updates = $this->_subCalc->bonusPersonalEu($treeFlat, $compressPtc, $orders);
                 /* convert */
                 $respAdd = $this->_subDb->saveOperationWalletActive($updates, Cfg::CODE_TYPE_OPER_BONUS_REBATE, $datePerformed, $dateApplied);
                 $operId = $respAdd->getOperationId();
                 $transIds = $respAdd->getTransactionsIds();
                 /* save orders and correspondent transactions into the log */
                 $this->_subDb->saveLogSaleOrders($updates, $transIds);
             } else {
                 /* use DEFAULT scheme */
                 /* get levels to calculate Personal bonus */
                 $levelsPersonal = $this->_subDb->getBonusLevels($calcType);
                 $updates = $this->_subCalc->bonusPersonalDef($compressPtc, $levelsPersonal);
                 /* save bonus operation with transactions */
                 $respAdd = $this->_subDb->saveOperationWalletActive($updates, Cfg::CODE_TYPE_OPER_BONUS_PERSONAL, $datePerformed, $dateApplied);
                 $operId = $respAdd->getOperationId();
             }
             /* mark calculation as complete */
             $this->_subDb->saveLogOperations($operId, $thisCalcId);
             $this->_subDb->markCalcComplete($thisCalcId);
             /* finalize response as succeed */
             $this->_manTrans->commit($def);
             $result->markSucceed();
             $result->setPeriodId($thisPeriodId);
             $result->setCalcId($thisCalcId);
         } finally {
             // transaction will be rolled back if commit is not done (otherwise - do nothing)
             $this->_manTrans->end($def);
         }
     }
     $this->_logMemoryUsage();
     $this->_logger->info("'Personal Bonus' calculation is completed.");
     return $result;
 }
 public function test_bonusPersonal_isPeriod_Eu()
 {
     /** === Test Data === */
     $PERIOD_BONUS_ID = 1;
     $CALC_BONUS_ID = 2;
     $OPERATION_ID = 3;
     /** === Mocks === */
     $mLogger = $this->_mockLogger();
     $mConn = $this->_mockConnection();
     $mDba = $this->_mockDbAdapter(null, $mConn);
     $mToolDate = $this->_mockFor('Praxigento\\Core\\Tool\\IDate');
     $mToolPeriod = $this->_mockFor('Praxigento\\Core\\Tool\\IPeriod');
     $mToolbox = $this->_mockToolbox(null, $mToolDate, null, $mToolPeriod);
     $mCallRepo = $this->_mockCallRepo();
     $mCallAccount = $this->_mockFor('Praxigento\\Accounting\\Service\\IAccount');
     $mCallBonusPersonalPeriod = $this->_mockFor('Praxigento\\Bonus\\Hybrid\\Lib\\Service\\IPeriod');
     $mSubDb = $this->_mockFor('Praxigento\\Bonus\\Hybrid\\Lib\\Service\\Calc\\Sub\\Db');
     $mSubCalc = $this->_mockFor('Praxigento\\Bonus\\Hybrid\\Lib\\Service\\Calc\\Sub\\Calc');
     // $respGetPeriod = $this->_callPeriod->getForDependentCalc($reqGetPeriod);
     $mRespGetPeriod = new BonusPersonalPeriodGetForDependentCalcResponse();
     $mCallBonusPersonalPeriod->expects($this->once())->method('getForDependentCalc')->willReturn($mRespGetPeriod);
     // if($respGetPeriod->isSucceed())
     $mRespGetPeriod->markSucceed();
     // $this->_conn->beginTransaction();
     $mConn->expects($this->once())->method('beginTransaction');
     // $persBonusCalcData = $respGetPeriod->getDependentCalcData();
     // $persBonusCalcId = $persBonusCalcData[Calculation::ATTR_ID];
     $mRespGetPeriod->setDependentCalcData([Calculation::ATTR_ID => $CALC_BONUS_ID]);
     // $persBonusPeriodData = $respGetPeriod->getDependentPeriodData();
     // $persBonusPeriodId = $persBonusPeriodData[Period::ATTR_ID];
     $mRespGetPeriod->setDependentPeriodData([Period::ATTR_ID => $PERIOD_BONUS_ID, Period::ATTR_DSTAMP_BEGIN => 'from', Period::ATTR_DSTAMP_END => 'to']);
     // $pvCompressPeriodData = $respGetPeriod->getBasePeriodData();
     // $pvCompressDsBegin = $pvCompressPeriodData[Period::ATTR_DSTAMP_BEGIN];
     // $pvCompressDsEnd = $pvCompressPeriodData[Period::ATTR_DSTAMP_END];
     $mRespGetPeriod->setBasePeriodData([Period::ATTR_DSTAMP_BEGIN => 'from', Period::ATTR_DSTAMP_END => 'to']);
     // $respAdd = $this->_subDb->saveOperationWalletActive(..)
     $mRespAdd = new DataObject();
     $mSubDb->expects($this->once())->method('saveOperationWalletActive')->willReturn($mRespAdd);
     // $operId = $respAdd->getOperationId();
     $mRespAdd->setOperationId($OPERATION_ID);
     /**
      * Prepare request and perform call.
      */
     /** @var  $call Call */
     $call = new Call($mLogger, $mDba, $mToolbox, $mCallRepo, $mCallAccount, $mCallBonusPersonalPeriod, $mSubDb, $mSubCalc);
     $req = new Request\BonusPersonal();
     $req->setScheme(Def::SCHEMA_EU);
     $resp = $call->bonusPersonal($req);
     $this->assertTrue($resp->isSucceed());
     $this->assertEquals($PERIOD_BONUS_ID, $resp->getPeriodId());
     $this->assertEquals($CALC_BONUS_ID, $resp->getCalcId());
 }