/** * 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; }
/** * Get all balances for WALLET_ACTIVE asset and then reset it to zero. */ private function _resetWalletBalances() { /* get WALLET_ACTIVE asset ID */ $assetId = $this->_repoTypeAsset->getIdByCode(Cfg::CODE_TYPE_ASSET_WALLET_ACTIVE); /* get WALLET_ACTIVE representative account */ $reqGetRepres = new AccGetRepresentativeRequest(); $reqGetRepres->setAssetTypeCode(Cfg::CODE_TYPE_ASSET_WALLET_ACTIVE); $respGetRepres = $this->_callAccAccount->getRepresentative($reqGetRepres); $accountIdRepres = $respGetRepres->getData(Account::ATTR_ID); /* get all customer balances for WALLET_ACTIVE and create transactions */ $whereByAsset = Account::ATTR_ASSET_TYPE_ID . '=' . $assetId; $whereByRepres = Account::ATTR_ID . '<>' . $accountIdRepres; $accounts = $this->_repoBasic->getEntities(Account::ENTITY_NAME, null, "{$whereByAsset} AND {$whereByRepres}"); $trans = []; $datePerformed = $this->_toolPeriod->getTimestampTo(self::DATE_FEB_PERIOD_BEGIN); $dateApplied = $datePerformed; foreach ($accounts as $account) { $balance = $account[Account::ATTR_BALANCE]; if ($balance != 0) { $tran = [Transaction::ATTR_DEBIT_ACC_ID => $account[Account::ATTR_ID], Transaction::ATTR_CREDIT_ACC_ID => $accountIdRepres, Transaction::ATTR_VALUE => $account[Account::ATTR_BALANCE], Transaction::ATTR_DATE_APPLIED => $dateApplied]; $trans[] = $tran; } } /* create operation to write off all WALLET_ACTIVE balances */ $reqOper = new AccOperationAddRequest(); $reqOper->setOperationTypeCode(Cfg::CODE_TYPE_OPER_WALLET_TRANSFER); $reqOper->setDatePerformed($datePerformed); $reqOper->setTransactions($trans); $respOper = $this->_callAccOperation->add($reqOper); $this->assertTrue($respOper->isSucceed()); }
public function debitFromCustomer(Request\DebitFromCustomer $request) { $result = new Response\DebitFromCustomer(); /* get representative customer account for PV asset */ $reqRepres = new AccountGetRepresentativeRequest(); $reqRepres->setAssetTypeCode(Cfg::CODE_TYPE_ASSET_PV); $respRepres = $this->_callAccount->getRepresentative($reqRepres); /* extract input parameters */ $requestData = $request->getData(); $requestData[Request\BetweenCustomers::TO_CUSTOMER_ID] = $respRepres->getData(Account::ATTR_CUST_ID); $requestData[Request\BetweenCustomers::COND_FORCE_ALL] = true; $reqBetween = new Request\BetweenCustomers($requestData); $respBetween = $this->betweenCustomers($reqBetween); if ($respBetween->isSucceed()) { $result->markSucceed(); } return $result; }