/** * Nếu hợp đồng đã có mission => bỏ qua * Nếu chưa, lấy salemanId, tìm ra employee, lấy commisstion là maximum của product, * Tìm trong contract_product, lấy ra endDate lớn nhất, nạp cho endDate của contract */ public function convertcrmcontract06082015Action() { set_time_limit(300); $dbAdapter = $this->getServiceLocator()->get('dbAdapter'); $dbSql = $this->getServiceLocator()->get('dbSql'); $select = $dbSql->select(['c' => \Crm\Model\ContractMapper::TABLE_NAME]); $select->order(['c.id asc']); $paginatorAdapter = new \Zend\Paginator\Adapter\DbSelect($select, $dbAdapter); $paginator = new \Zend\Paginator\Paginator($paginatorAdapter); $paginator->setItemCountPerPage(100); $page = $this->getRequest()->getQuery('page', 1); $totalConvert = $this->getRequest()->getQuery('totalConvert', 0); $paginator->setCurrentPageNumber($page); $contractMapper = $this->getServiceLocator()->get('\\Crm\\Model\\ContractMapper'); $commissionMapper = $this->getServiceLocator()->get('\\Crm\\Model\\Contract\\CommissionMapper'); foreach ($paginator as $row) { $row = (array) $row; $contract = new \Crm\Model\Contract(); $contract->exchangeArray($row); $select = $dbSql->select(['cc' => \Crm\Model\Contract\CommissionMapper::TABLE_NAME]); $select->where(['contractId' => $contract->getId()]); $rows = $dbAdapter->query($dbSql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE); if ($rows->count()) { continue; } // update startDate, endDate if (!$contract->getStartDate()) { $select = $dbSql->select(['cp' => \Crm\Model\Contract\ProductMapper::TABLE_NAME]); $select->columns(['minStartDate' => new Expression('MIN(startDate)')]); $select->where(['contractId' => $contract->getId()]); $select->where(['startDate IS NOT NULL']); $select->where(['startDate != ?' => '0000-00-00']); $row = $dbAdapter->query($dbSql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE); if ($row->count()) { $row = (array) $row->current(); $contract->setStartDate($row['minStartDate']); } } if (!$contract->getEndDate()) { $select = $dbSql->select(['cp' => \Crm\Model\Contract\ProductMapper::TABLE_NAME]); $select->columns(['maxEndDate' => new Expression('MAX(endDate)')]); $select->where(['contractId' => $contract->getId()]); $select->where(['endDate IS NOT NULL']); $select->where(['endDate != ?' => '0000-00-00']); $row = $dbAdapter->query($dbSql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE); if ($row->count()) { $row = (array) $row->current(); $contract->setEndDate($row['maxEndDate']); } } $contractMapper->save($contract); if ($contract->getSalemanId()) { $select = $dbSql->select(['e' => \Hrm\Model\EmployeeMapper::TABLE_NAME]); $select->where(['userId' => $contract->getSalemanId()]); $select->limit(1); $row = $dbAdapter->query($dbSql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE); if ($row->count()) { $row = (array) $row->current(); $employeeId = $row['id']; $select = $dbSql->select(['cp' => \Crm\Model\Contract\ProductMapper::TABLE_NAME]); $select->join(['p' => \Company\Model\ProductMapper::TABLE_NAME], 'cp.productId = p.id', ['p.commissionValue' => 'commissionValue']); $select->where(['contractId' => $contract->getId()]); $rowCps = $dbAdapter->query($dbSql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE); if ($rowCps->count()) { foreach ($rowCps->toArray() as $rowCp) { $contractProduct = new \Crm\Model\Contract\Product($rowCp); $productValue = $contractProduct->calculateValue(); $commission = new \Crm\Model\Contract\Commission(); if ($rowCp['p.commissionValue']) { $commission->setCommissionPercent(100); } else { $commission->setCommissionPercent($rowCp['p.commissionValue']); } $commissionValue = round($productValue * $commission->getCommissionPercent() / 100); $commission->setCommission($commissionValue); $commission->setProductId($rowCp['productId']); $commission->setEmployeeId($employeeId); $commission->setContractId($contract->getId()); if (!$commissionMapper->isExisted($commission)) { $commissionMapper->save($commission); } } } } } $contractMapper->updateCommission($contract); $totalConvert++; } $this->getViewModel()->setTerminal(true); $this->getViewModel()->setVariable('paginator', $paginator); $this->getViewModel()->setVariable('page', $page); $this->getViewModel()->setVariable('totalPages', $paginator->count() + 1); $this->getViewModel()->setVariable('totalConvert', $totalConvert); if ($page <= $paginator->count()) { $this->getViewModel()->setVariable('redirectUri', Uri::build('/system/tool/convertcrmcontract06082015', ['page' => $page + 1, 'totalConvert' => $totalConvert])); } return $this->getViewModel(); }