Beispiel #1
0
 /**
  * @param Ticket $expenseTicket
  * @throws NotFoundException
  */
 public function save(Ticket $expenseTicket)
 {
     if (!$this->getServiceLocator() instanceof ServiceLocatorInterface) {
         throw new NotFoundException('Service locator not defined for expense item.');
     }
     $itemDao = $this->getItemDao();
     $costDao = $this->getCostDao();
     // Normalize values
     $this->prepare();
     $data = $this->getData();
     $itemAmount = null;
     $costCenters = [];
     $itemData = [];
     if ($this->getMode() == self::MODE_ADD) {
         $costCenters = $data['costCenters'];
         $itemAmount = $data['amount'];
         $itemData = ['transaction_id' => $data['transactionId'], 'account_id' => $data['accountId'], 'account_reference' => $data['accountReference'], 'sub_category_id' => $data['subCategoryId'], 'currency_id' => $data['currencyId'], 'amount' => Helper::formatAmount($itemAmount), 'is_startup' => $data['isStartup'], 'is_deposit' => $data['isDeposit'], 'is_refund' => $data['isRefund'], 'comment' => $data['accountComment'], 'type' => $data['type'], 'status' => $data['status']];
         if ($data['period']['from']) {
             $itemData['period_from'] = $data['period']['from'];
             $itemData['period_to'] = $data['period']['to'];
         }
     }
     switch ($this->getMode()) {
         case self::MODE_ADD:
             $itemData['expense_id'] = $expenseTicket->getExpenseId();
             $itemData['creator_id'] = $expenseTicket->getCreatorId();
             $itemData['date_created'] = date('Y-m-d H:i:s');
             if (!$data['period']['from']) {
                 $itemData['period_from'] = $itemData['period_to'] = date('Y-m-d');
             }
             $expenseItemId = $itemDao->save($itemData);
             $this->setId($expenseItemId);
             if (count($costCenters)) {
                 $costCenterAmount = $itemAmount / count($costCenters);
                 foreach ($costCenters as $costCenter) {
                     $costDao->save(['expense_item_id' => $expenseItemId, 'cost_center_id' => $costCenter['id'], 'cost_center_type' => $this->translateCCT($costCenter['type']), 'amount' => $this->calculateCostAmount($costCenterAmount, $data['currencyId'], $costCenter['currencyId'], $data['isRefund'])]);
                 }
             }
             break;
         case self::MODE_DELETE:
             $costDao->delete(['expense_item_id' => $this->getId()]);
             $itemDao->delete(['id' => $this->getId()]);
             break;
     }
 }
Beispiel #2
0
 /**
  * @param Ticket $expenseTicket
  * @return bool|void
  * @throws \Exception
  */
 public function save(Ticket $expenseTicket)
 {
     /**
      * @var Transactor\Expense $transaction
      */
     if (!$this->finance instanceof Finance) {
         throw new \Exception('Finance not defined for expense transaction.');
     }
     $transactionData = $this->getData();
     $transaction = new Transactor\Expense(GeneralTransaction::ACCOUNT_MONEY_ACCOUNT, GeneralTransaction::getAccountTypeById($transactionData['accountTo']['type']));
     $transaction->setServiceLocator($expenseTicket->getServiceLocator());
     $transaction->setMode($this->getMode());
     switch ($this->getMode()) {
         case self::MODE_ADD:
             $transaction->setAccountIdentity($transactionData['accountFrom']['id'], $transactionData['accountTo']['id']);
             $transaction->setIsRefund(isset($transactionData['isRefund']) ? $transactionData['isRefund'] : 0);
             $transaction->setTransactionAccountId($transactionData['accountTo']['transactionAccountId']);
             $transaction->setTransactionDate(isset($transactionData['date']) ? $transactionData['date'] : date('Y-m-d H:i:s'));
             $transaction->setDescription("Expense Transaction #{$expenseTicket->getExpenseId()}");
             $transaction->setExpenseId($expenseTicket->getExpenseId());
             $transaction->setAmount($transactionData['amount']);
             // If transaction is virtual it shouldn't have money_transaction_id
             if ($this->getMoneyTransactionId() !== false) {
                 $transaction->setIsVirtual();
                 $transaction->setMoneyTransactionId($this->getMoneyTransactionId());
             }
             $transaction->prepare();
             break;
         case self::MODE_EDIT:
             $isVerified = $transactionData['isVerified'];
             $isVoided = $transactionData['isVoided'];
             if (!$isVerified && !$isVoided) {
                 throw new \RuntimeException('Impossible to modify transaction.');
             }
             $transaction->setTransactionId($this->getId());
             if ($isVerified) {
                 $transaction->setIsVerified();
                 $transaction->setVerifierId($expenseTicket->getCreatorId());
             }
             if ($isVoided) {
                 $transaction->setIsVoid();
                 $transaction->setVerifierId($expenseTicket->getCreatorId());
             }
             $transaction->prepare();
             break;
         case self::MODE_DELETE:
             throw new \RuntimeException('Impossible to delete transaction.');
             break;
     }
     return $transaction->process();
 }
Beispiel #3
0
 /**
  * @param array $files
  * @param Ticket $expenseTicket
  * @param string $dateCreated
  * @return array
  * @throws \Exception
  */
 private function saveItemFilesPhisically(array $files, Ticket $expenseTicket, $dateCreated)
 {
     $fileReport = [];
     if (count($files)) {
         $expenseItemAttachmentsDao = $this->getServiceLocator()->get('dao_finance_expense_expense_item_attachments');
         $expenseId = $expenseTicket->getExpenseId();
         $expenseItems = $expenseTicket->getItems();
         list($date, ) = explode(' ', $dateCreated);
         list($y, $m, $d) = explode('-', $date);
         foreach ($expenseItems as $item) {
             $itemId = $item->getId();
             if (isset($files[$itemId])) {
                 $path = "/ginosi/uploads/expense/items/{$y}/{$m}/{$d}/{$expenseId}/{$itemId}/";
                 if (!is_readable($path)) {
                     if (!mkdir($path, 0755, true)) {
                         throw new \Exception('Cannot create directories');
                     }
                 }
                 $file = $files[$itemId];
                 $fileName = $this->generateItemFileName($file['name'], $itemId, $expenseId);
                 if ($this->isValidFile($file)) {
                     if (move_uploaded_file($file['tmp_name'], $path . $fileName)) {
                         $expenseItemAttachmentsDao->save(['expense_id' => $expenseId, 'item_id' => $itemId, 'filename' => $fileName]);
                         array_push($fileReport, ['value' => $fileName, 'status' => 'success']);
                     } else {
                         array_push($fileReport, ['value' => 'Cannot upload a file ' . $file['name'], 'status' => 'fail']);
                     }
                 } else {
                     array_push($fileReport, ['value' => 'Unsupported file ' . $file['name'], 'status' => 'fail']);
                 }
             }
         }
     }
     return $fileReport;
 }