/** * @param Request\GetForWriteOff $request * * @return Response\GetForWriteOff */ public function getForWriteOff(Request\GetForWriteOff $request) { $result = new Response\GetForWriteOff(); $this->_logger->info("'Get latest period for Write Off calculation' operation is started."); /* get the last Write Off period data */ $calcWriteOffCode = Cfg::CODE_TYPE_CALC_PV_WRITE_OFF; $calcWriteOffId = $this->_subDb->getCalcIdByCode($calcWriteOffCode); $respWriteOffLastPeriod = $this->_subDb->getLastPeriodData($calcWriteOffId); $periodWriteOffData = $respWriteOffLastPeriod->getPeriodData(); if (is_null($periodWriteOffData)) { $this->_logger->info("There is no period for PV Write Off calculation yet."); /* calc period for PV Write Off */ $tsFirstPv = $this->_subDb->getFirstDateForPvTransactions(); if ($tsFirstPv === false) { $this->_logger->info("There is no PV transactions yet. Nothing to do."); $result->setHasNoPvTransactionsYet(); } else { $this->_logger->info("First PV transaction was performed at '{$tsFirstPv}'."); $periodMonth = $this->_toolPeriod->getPeriodCurrent($tsFirstPv, ToolPeriod::TYPE_MONTH); $dsBegin = $this->_toolPeriod->getPeriodFirstDate($periodMonth); $dsEnd = $this->_toolPeriod->getPeriodLastDate($periodMonth); $periodWriteOffData = $this->_subDb->addNewPeriodAndCalc($calcWriteOffId, $dsBegin, $dsEnd); $result->setPeriodData($periodWriteOffData->getData(Sub\Db::DATA_PERIOD)); $result->setCalcData($periodWriteOffData->getData(Sub\Db::DATA_CALC)); $result->markSucceed(); } } else { $result->setPeriodData($periodWriteOffData); $periodId = $periodWriteOffData->getId(); $this->_logger->info("There is registered period #{$periodId} for '{$calcWriteOffCode}' calculation."); $calcData = $respWriteOffLastPeriod->getCalcData(); if ($calcData === false) { $this->_logger->info("There is no calculation data for existing period. Use existing period data."); $result->markSucceed(); } else { if ($calcData && $calcData->getState() == Cfg::CALC_STATE_COMPLETE) { $this->_logger->info("There is complete calculation for existing period. Create new period."); $periodEnd = $periodWriteOffData->getDstampEnd(); /* calculate new period bounds */ $periodNext = $this->_toolPeriod->getPeriodNext($periodEnd, ToolPeriod::TYPE_MONTH); $dsNextBegin = $this->_toolPeriod->getPeriodFirstDate($periodNext); $dsNextEnd = $this->_toolPeriod->getPeriodLastDate($periodNext); $periodWriteOffData = $this->_subDb->addNewPeriodAndCalc($calcWriteOffId, $dsNextBegin, $dsNextEnd); $result->setPeriodData($periodWriteOffData->getData(Sub\Db::DATA_PERIOD)); $result->setCalcData($periodWriteOffData->getData(Sub\Db::DATA_CALC)); $result->markSucceed(); } else { $this->_logger->info("There is no complete calculation for existing period. Use existing period data."); $result->setCalcData($calcData); $result->markSucceed(); } } } $this->_logger->info("'Get latest period for Write Off calculation' operation is completed."); return $result; }
public function test_getLastPeriodData() { /** === Test Data === */ $CALC_ID = 512; /** === Mocks === */ $mLogger = $this->_mockLogger(); $mConn = $this->_mockConnection(); $mDba = $this->_mockDbAdapter(null, $mConn); $mToolbox = $this->_mockToolbox(); $mCallRepo = $this->_mockCallRepo(); $mCallBonusBasePeriod = $this->_mockFor('\\Praxigento\\BonusBase\\Service\\IPeriod'); $mCallTypeCalc = $this->_mockFor('\\Praxigento\\BonusBase\\Service\\ITypeCalc'); // $result = $this->_callBonusBasePeriod->getLatest($reqLastPeriod); $mResult = new BonusBasePeriodGetLatestResponse(); $mResult->markSucceed(); $mCallBonusBasePeriod->expects($this->once())->method('getLatest')->willReturn($mResult); /** * Prepare request and perform call. */ /** @var $sub Db */ $sub = new Db($mLogger, $mDba, $mToolbox, $mCallRepo, $mCallBonusBasePeriod, $mCallTypeCalc); $data = $sub->getLastPeriodData($CALC_ID); $this->assertTrue($data->isSucceed()); }
/** * * @param $dependentCalcTypeCode * @param $baseCalcTypeCode * * @return PeriodGetForDependentCalcResponse */ public function getDependentCalcData($dependentCalcTypeCode, $baseCalcTypeCode) { $result = new PeriodGetForDependentCalcResponse(); /* get IDs for calculations codes */ $dependentCalcTypeId = $this->_subDb->getCalcIdByCode($dependentCalcTypeCode); $baseCalcTypeId = $this->_subDb->getCalcIdByCode($baseCalcTypeCode); /* get the last base period data */ $respBasePeriod = $this->_subDb->getLastPeriodData($baseCalcTypeId); $basePeriodData = $respBasePeriod->getPeriodData(); if (is_null($basePeriodData)) { $this->_logger->warning("There is no period for '{$baseCalcTypeCode}' calculation yet. '{$dependentCalcTypeCode}' could not be calculated."); } else { $result->setBasePeriodData($basePeriodData); $baseCalcData = $respBasePeriod->getCalcData(); $result->setBaseCalcData($baseCalcData); $baseDsBegin = $basePeriodData->getDstampBegin(); $baseDsEnd = $basePeriodData->getDstampEnd(); if ($baseCalcData && $baseCalcData->getState() == Cfg::CALC_STATE_COMPLETE) { /* there is complete Base Calculation */ $respDependentPeriod = $this->_subDb->getLastPeriodData($dependentCalcTypeId); $dependPeriodData = $respDependentPeriod->getPeriodData(); $dependentCalcData = $respDependentPeriod->getCalcData(); if (is_null($dependPeriodData)) { /* there is no dependent period */ $this->_logger->warning("There is no period data for calculation '{$dependentCalcTypeCode}'. New period and related calculation will be created."); $dependPeriodData = $this->_subDb->addNewPeriodAndCalc($dependentCalcTypeId, $baseDsBegin, $baseDsEnd); $result->setDependentPeriodData($dependPeriodData->getData(Db::DATA_PERIOD)); $result->setDependentCalcData($dependPeriodData->getData(Db::DATA_CALC)); $result->markSucceed(); } else { /* there is dependent period */ $dependentDsBegin = $dependPeriodData->getDstampBegin(); $dependentDsEnd = $dependPeriodData->getDstampEnd(); if ($dependentDsBegin == $baseDsBegin && $dependentDsEnd == $baseDsEnd) { /* dependent period has the same begin/end as related base period */ $this->_logger->info("There is base '{$baseCalcTypeCode}' period for dependent '{$dependentCalcTypeCode}' period ({$dependentDsBegin}-{$dependentDsEnd})."); if ($dependentCalcData && $dependentCalcData->getState() == Cfg::CALC_STATE_COMPLETE) { /* complete dependent period for complete base period */ $this->_logger->warning("There is '{$dependentCalcTypeCode}' period with complete calculation. No more '{$dependentCalcTypeCode}' could be calculated."); } else { /* incomplete dependent period for complete base period */ $this->_logger->warning("There is '{$dependentCalcTypeCode}' period without complete calculation. Continue calculation for this period."); $result->setDependentPeriodData($dependPeriodData); $result->setDependentCalcData($dependentCalcData); $result->markSucceed(); } } else { /* dependent period has different begin/end then related base period */ $this->_logger->warning("There is no period for '{$dependentCalcTypeCode}' calculation based on '{$baseCalcTypeCode}' ({$baseDsBegin}-{$baseDsEnd}). New period and related calculation will be created."); $dependPeriodData = $this->_subDb->addNewPeriodAndCalc($dependentCalcTypeId, $baseDsBegin, $baseDsEnd); $result->setDependentPeriodData($dependPeriodData->getData(Db::DATA_PERIOD)); $result->setDependentCalcData($dependPeriodData->getData(Db::DATA_CALC)); $result->markSucceed(); } } } else { /* there is no complete Base Calculation */ $this->_logger->warning("There is no complete base '{$baseCalcTypeCode}' calculation for dependent '{$dependentCalcTypeCode}' calculation. New period could not be created."); } } return $result; }