public function save($input)
 {
     $publicId = isset($input['public_id']) ? $input['public_id'] : false;
     if ($publicId) {
         $expense = Expense::scope($publicId)->firstOrFail();
     } else {
         $expense = Expense::createNew();
     }
     // First auto fill
     $expense->fill($input);
     $expense->expense_date = Utils::toSqlDate($input['expense_date']);
     if (isset($input['private_notes'])) {
         $expense->private_notes = trim($input['private_notes']);
     }
     $expense->public_notes = trim($input['public_notes']);
     $expense->should_be_invoiced = isset($input['should_be_invoiced']) || $expense->client_id ? true : false;
     if (!$expense->expense_currency_id) {
         $expense->expense_currency_id = \Auth::user()->account->getCurrencyId();
     }
     if (!$expense->invoice_currency_id) {
         $expense->invoice_currency_id = \Auth::user()->account->getCurrencyId();
     }
     $rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1;
     $expense->exchange_rate = round($rate, 4);
     $expense->amount = round(Utils::parseFloat($input['amount']), 2);
     $expense->save();
     return $expense;
 }
 public function save($input, $expense = null)
 {
     $publicId = isset($input['public_id']) ? $input['public_id'] : false;
     if ($expense) {
         // do nothing
     } elseif ($publicId) {
         $expense = Expense::scope($publicId)->firstOrFail();
         if (Utils::isNinjaDev()) {
             \Log::warning('Entity not set in expense repo save');
         }
     } else {
         $expense = Expense::createNew();
     }
     if ($expense->is_deleted) {
         return $expense;
     }
     // First auto fill
     $expense->fill($input);
     if (isset($input['expense_date'])) {
         $expense->expense_date = Utils::toSqlDate($input['expense_date']);
     }
     $expense->should_be_invoiced = isset($input['should_be_invoiced']) && floatval($input['should_be_invoiced']) || $expense->client_id ? true : false;
     if (!$expense->expense_currency_id) {
         $expense->expense_currency_id = \Auth::user()->account->getCurrencyId();
     }
     if (!$expense->invoice_currency_id) {
         $expense->invoice_currency_id = \Auth::user()->account->getCurrencyId();
     }
     $rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1;
     $expense->exchange_rate = round($rate, 4);
     if (isset($input['amount'])) {
         $expense->amount = round(Utils::parseFloat($input['amount']), 2);
     }
     $expense->save();
     // Documents
     $document_ids = !empty($input['document_ids']) ? array_map('intval', $input['document_ids']) : [];
     foreach ($document_ids as $document_id) {
         // check document completed upload before user submitted form
         if ($document_id) {
             $document = Document::scope($document_id)->first();
             if ($document && Auth::user()->can('edit', $document)) {
                 $document->invoice_id = null;
                 $document->expense_id = $expense->id;
                 $document->save();
             }
         }
     }
     // prevent loading all of the documents if we don't have to
     if (!$expense->wasRecentlyCreated) {
         foreach ($expense->documents as $document) {
             if (!in_array($document->public_id, $document_ids)) {
                 // Not checking permissions; deleting a document is just editing the invoice
                 $document->delete();
             }
         }
     }
     return $expense;
 }
 public function save($input, $expense = null)
 {
     $publicId = isset($input['public_id']) ? $input['public_id'] : false;
     if ($expense) {
         // do nothing
     } elseif ($publicId) {
         $expense = Expense::scope($publicId)->firstOrFail();
         \Log::warning('Entity not set in expense repo save');
     } else {
         $expense = Expense::createNew();
     }
     // First auto fill
     $expense->fill($input);
     $expense->expense_date = Utils::toSqlDate($input['expense_date']);
     if (isset($input['private_notes'])) {
         $expense->private_notes = trim($input['private_notes']);
     }
     $expense->public_notes = trim($input['public_notes']);
     $expense->should_be_invoiced = isset($input['should_be_invoiced']) || $expense->client_id ? true : false;
     if (!$expense->expense_currency_id) {
         $expense->expense_currency_id = \Auth::user()->account->getCurrencyId();
     }
     if (!$expense->invoice_currency_id) {
         $expense->invoice_currency_id = \Auth::user()->account->getCurrencyId();
     }
     $rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1;
     $expense->exchange_rate = round($rate, 4);
     $expense->amount = round(Utils::parseFloat($input['amount']), 2);
     $expense->save();
     // Documents
     $document_ids = !empty($input['document_ids']) ? array_map('intval', $input['document_ids']) : array();
     foreach ($document_ids as $document_id) {
         $document = Document::scope($document_id)->first();
         if ($document && Auth::user()->can('edit', $document)) {
             $document->invoice_id = null;
             $document->expense_id = $expense->id;
             $document->save();
         }
     }
     if (!empty($input['documents']) && Auth::user()->can('create', ENTITY_DOCUMENT)) {
         // Fallback upload
         $doc_errors = array();
         foreach ($input['documents'] as $upload) {
             $result = $this->documentRepo->upload($upload);
             if (is_string($result)) {
                 $doc_errors[] = $result;
             } else {
                 $result->expense_id = $expense->id;
                 $result->save();
                 $document_ids[] = $result->public_id;
             }
         }
         if (!empty($doc_errors)) {
             Session::flash('error', implode('<br>', array_map('htmlentities', $doc_errors)));
         }
     }
     foreach ($expense->documents as $document) {
         if (!in_array($document->public_id, $document_ids)) {
             // Not checking permissions; deleting a document is just editing the invoice
             $document->delete();
         }
     }
     return $expense;
 }