public function uploadCsvAction() { $form = new Form\UploadCsv(); $em = $this->getServiceLocator()->get('Doctrine\\ORM\\EntityManager'); $accounts = $em->getRepository("ErsBase\\Entity\\BankAccount")->findBy(array()); $options = array(); foreach ($accounts as $account) { $options[] = array('value' => $account->getId(), 'label' => $account->getName()); } $form->get('bankaccount_id')->setAttribute('options', $options); $request = $this->getRequest(); if ($request->isPost()) { // Make certain to merge the files info! $post = array_merge_recursive($request->getPost()->toArray(), $request->getFiles()->toArray()); $form->setData($post); if ($form->isValid()) { $data = $form->getData(); $id = $data['bankaccount_id']; $bankaccount = $em->getRepository("ErsBase\\Entity\\BankAccount")->findOneBy(array('id' => $id)); $file = $data['csv-upload']; $bankAccountCsv = new Entity\BankAccountCsv(); $bankAccountCsv->setCsvFile($file['name']); $bankAccountCsv->setBankAccount($bankaccount); $em->persist($bankAccountCsv); /* * open file for reading */ $handle = fopen($file['tmp_name'], "r"); if (!$handle) { throw new \Exception('Unable to open csv'); } $statement_format = json_decode($bankaccount->getStatementFormat()); $fix_amount = false; if (is_array($statement_format)) { $fix_amount = true; } /* * read every line in the file and generate bank statement entities */ $row = 1; $hashes = array(); while (($row_data = fgetcsv($handle, 1000, ",")) !== FALSE) { #$hash = md5(implode($row_data)); $bs = new Entity\BankStatement(); #$bs->setBankStatementCols($row_data); $bs->setBankAccount($bankaccount); $bs->setBankAccountCsv($bankAccountCsv); #$bs->setHash($hash); $bs->setStatus('new'); foreach ($row_data as $column => $value) { $bsc = new Entity\BankStatementCol(); $bsc->setColumn($column + 1); $bsc->setValue($value); $bsc->setBankStatement($bs); $bs->addBankStatementCol($bsc); } if ($fix_amount) { $bs->getAmount()->setValue((double) $bs->getAmount()->getValue()); } $bs->generateHash(); $bankstatement = $em->getRepository("ErsBase\\Entity\\BankStatement")->findOneBy(array('hash' => $bs->getHash())); if ($bankstatement) { continue; } /* * bank statement already exists in this file */ if (in_array($bs->getHash(), $hashes)) { error_log('The bank statement you want to upload exists twice in this file: ' . $bs->getHash()); continue; } $hashes[] = $bs->getHash(); if (isset($statement_format->sign->col) && isset($statement_format->sign->value)) { if ($bs->getBankStatementColByNumber($statement_format->sign->col)->getValue() != $statement_format->sign->value) { $bs->setStatus('disabled'); } } $em->persist($bs); $row++; } fclose($handle); $em->flush(); return $this->redirect()->toRoute('admin/bankaccount'); } } return new ViewModel(array('form' => $form)); }