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; }
/** * Account PV on sale done. * * @param Request\AccountPv $request * * @return Response\AccountPv */ public function accountPv(Request\AccountPv $request) { $result = new Response\AccountPv(); $saleId = $request->getSaleOrderId(); $customerId = $request->getCustomerId(); $dateApplied = $request->getDateApplied(); $this->_logger->info("PV accounting operation for sale order #{$saleId} is started."); $sale = $this->_repoSale->getById($saleId); $pvTotal = $sale->getTotal(); /* get customer for sale order */ if (is_null($customerId)) { $this->_logger->info("There is no customer ID in request, select customer ID from sale order data."); $customerId = $this->_repoMod->getSaleOrderCustomerId($saleId); $this->_logger->info("Order #{$saleId} is created by customer #{$customerId}."); } /* get PV account data for customer */ $reqGetAccCust = new GetAccountRequest(); $reqGetAccCust->setCustomerId($customerId); $reqGetAccCust->setAssetTypeCode(Cfg::CODE_TYPE_ASSET_PV); $reqGetAccCust->setCreateNewAccountIfMissed(true); $respGetAccCust = $this->_callAccount->get($reqGetAccCust); /* get PV account data for representative */ $reqGetAccRepres = new GetAccountRepresentativeRequest(); $reqGetAccRepres->setAssetTypeCode(Cfg::CODE_TYPE_ASSET_PV); $respGetAccRepres = $this->_callAccount->getRepresentative($reqGetAccRepres); /* create one operation with one transaction */ $reqAddOper = new AddOperationRequest(); $reqAddOper->setOperationTypeCode(Cfg::CODE_TYPE_OPER_PV_SALE_PAID); $trans = [Transaction::ATTR_DEBIT_ACC_ID => $respGetAccRepres->getId(), Transaction::ATTR_CREDIT_ACC_ID => $respGetAccCust->getId(), Transaction::ATTR_VALUE => $pvTotal, Transaction::ATTR_DATE_APPLIED => $dateApplied]; $reqAddOper->setTransactions([$trans]); $respAddOper = $this->_callOperation->add($reqAddOper); $operId = $respAddOper->getOperationId(); $result->setOperationId($operId); $result->markSucceed(); $this->_logger->info("PV accounting operation for sale order #{$saleId} is completed."); return $result; }