Example #1
0
 public function betweenCustomers(Request\BetweenCustomers $request)
 {
     $result = new Response\BetweenCustomers();
     /* constraints validation results */
     $isCountriesTheSame = false;
     $isTargetInDownline = false;
     /* extract input parameters */
     $custIdDebit = $request->getFromCustomerId();
     $custIdCredit = $request->getToCustomerId();
     $date = $request->getDateApplied();
     $value = $request->getValue();
     $condForceAll = $request->getConditionForceAll();
     $condForceCountry = $request->getConditionForceCountry();
     $condForceDownline = $request->getConditionForceDownline();
     if (is_null($date)) {
         $date = $this->_toolDate->getUtcNowForDb();
     }
     /* validate conditions */
     if (!$condForceAll) {
         /* validate customer countries */
         $downDebit = $this->_repoMod->getDownlineCustomerById($custIdDebit);
         $downCredit = $this->_repoMod->getDownlineCustomerById($custIdCredit);
         /* countries should be equals */
         $countryDebit = $downDebit->getCountryCode();
         $countryCredit = $downCredit->getCountryCode();
         if ($countryDebit == $countryCredit || $condForceCountry) {
             $isCountriesTheSame = true;
         }
         /* transfer is allowed to own subtree only */
         $path = $downCredit->getPath();
         $key = Cfg::DTPS . $downDebit->getCustomerId() . Cfg::DTPS;
         if (strpos($path, $key) !== false || $condForceDownline) {
             $isTargetInDownline = true;
         }
     }
     /* check validation results and perform transfer */
     if ($condForceAll || $isTargetInDownline && $isCountriesTheSame) {
         /* get PV-accounts */
         $reqAccGet = new AccountGetRequest();
         $reqAccGet->setCustomerId($custIdDebit);
         $reqAccGet->setAssetTypeCode(Cfg::CODE_TYPE_ASSET_PV);
         $reqAccGet->setCreateNewAccountIfMissed(true);
         $respAccDebit = $this->_callAccount->get($reqAccGet);
         $reqAccGet->setCustomerId($custIdCredit);
         $respAccCredit = $this->_callAccount->get($reqAccGet);
         /* add transfer operation */
         $reqAddOper = new OperationAddRequest();
         $reqAddOper->setOperationTypeCode(Cfg::CODE_TYPE_OPER_PV_TRANSFER);
         $reqAddOper->setDatePerformed($date);
         $reqAddOper->setTransactions([[Transaction::ATTR_DEBIT_ACC_ID => $respAccDebit->getId(), Transaction::ATTR_CREDIT_ACC_ID => $respAccCredit->getId(), Transaction::ATTR_VALUE => $value]]);
         $respAddOper = $this->_callOperation->add($reqAddOper);
         if ($respAddOper->isSucceed()) {
             $result->markSucceed();
         }
     }
     return $result;
 }