private function createMatch(Entity\BankStatement $statement, Entity\Code $code) { $em = $this->getServiceLocator()->get('Doctrine\\ORM\\EntityManager'); $bankaccount = $statement->getBankAccount(); #$statement_format = json_decode($bankaccount->getStatementFormat()); $order = $em->getRepository("ErsBase\\Entity\\Order")->findOneBy(array('Code_id' => $code->getId())); $statement->setStatus('matched'); $em->persist($statement); $match = new Entity\Match(); $match->setBankStatement($statement); $match->setOrder($order); $match->setStatus('active'); $match->setComment('matched by auto-matching'); /* * set andi as admin for auto-matching */ $admin = $em->getRepository("ErsBase\\Entity\\User")->findOneBy(array('id' => 1)); $match->setAdmin($admin); $order->addMatch($match); $em->persist($match); #$statement_amount = (float) $statement->getBankStatementColByNumber($statement_format->amount)->getValue(); $statement_amount = $order->getStatementAmount(); $order_amount = $order->getSum(); if ($order_amount == $statement_amount) { $paid = true; #echo "perfect match!".PHP_EOL; echo "."; } elseif ($order_amount < $statement_amount) { $paid = true; #echo "overpaid, ok!".PHP_EOL; echo "!"; } else { $paid = false; echo "-"; } if ($paid) { #$orderStatus = new Entity\OrderStatus(); #$orderStatus->setOrder($order); #$orderStatus->setValue('paid'); #$order->addOrderStatus($orderStatus); $order->setPaymentStatus('paid'); foreach ($order->getItems() as $item) { $item->setStatus('paid'); $em->persist($item); } $em->persist($order); #$em->persist($orderStatus); } else { foreach ($order->getItems() as $item) { $item->setStatus('ordered'); $em->persist($item); } } $em->flush(); }
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)); }