Exemple #1
0
 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));
 }