/**
  * 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();
 }