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()); }