상속: extends yii\db\ActiveRecord
예제 #1
0
 public function actionIndex()
 {
     $user_id = Yii::$app->user->getId();
     $user = User::findIdentity($user_id);
     $active_purse = Purse::find()->where(['user_id' => $user_id, 'active' => 1])->one();
     $purses = Purse::find()->where(['user_id' => $user_id])->all();
     if ($user->payday) {
         // если есть дата зп
         $datePayDay = DateComponent::getDateFilterWithPayday();
     } else {
         $datePayDay = [date('Y'), date("m"), 1];
         // иначе ставим 1 число текущего месяца
     }
     $operations = Expense::find()->orderBy('datetime desc')->limit(6)->all();
     $types = TypeExpense::find()->where(['user_id' => $user_id])->select(['type_expense.*', TypeExpense::SELECT_SUM])->innerJoinWith(['expenses' => function ($query) use($datePayDay) {
         $query->where('date(datetime)>=:date_before', [':date_before' => implode('-', $datePayDay)]);
     }])->where(['purse_id' => $active_purse->id])->groupBy('type_expense.id')->all();
     $arrTypes = [];
     $sum = 0;
     foreach ($types as $type) {
         $sum += $type->sum;
         array_push($arrTypes, ['value' => $type->sum, 'color' => ColorComponent::random_color(), 'label' => $type->name]);
     }
     //        var_dump($types->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);die;
     return $this->render('index', ['arrTypes' => $arrTypes, 'date' => $datePayDay[2] . "." . $datePayDay[1] . "." . $datePayDay[0], 'active_purse' => $active_purse, 'purses' => $purses, 'sum' => $sum, 'operations' => $operations]);
 }
 public function loadBankAccounts($bankId, $username, $password, $includeTransactions = true)
 {
     if (!$bankId || !$username || !$password) {
         return false;
     }
     $expenses = Expense::scope()->whereBankId($bankId)->where('transaction_id', '!=', '')->withTrashed()->get(['transaction_id'])->toArray();
     $expenses = array_flip(array_map(function ($val) {
         return $val['transaction_id'];
     }, $expenses));
     $bankAccounts = BankSubaccount::scope()->whereHas('bank_account', function ($query) use($bankId) {
         $query->where('bank_id', '=', $bankId);
     })->get();
     $bank = Utils::getFromCache($bankId, 'banks');
     $data = [];
     // load OFX trnansactions
     try {
         $finance = new Finance();
         $finance->banks[$bankId] = $bank->getOFXBank($finance);
         $finance->banks[$bankId]->logins[] = new Login($finance->banks[$bankId], $username, $password);
         foreach ($finance->banks as $bank) {
             foreach ($bank->logins as $login) {
                 $login->setup();
                 foreach ($login->accounts as $account) {
                     $account->setup($includeTransactions);
                     if ($account = $this->parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions)) {
                         $data[] = $account;
                     }
                 }
             }
         }
         return $data;
     } catch (\Exception $e) {
         return false;
     }
 }
 /**
  * @param null $bankId
  * @return array
  */
 private function getExpenses($bankId = null)
 {
     $expenses = Expense::scope()->bankId($bankId)->where('transaction_id', '!=', '')->withTrashed()->get(['transaction_id'])->toArray();
     $expenses = array_flip(array_map(function ($val) {
         return $val['transaction_id'];
     }, $expenses));
     return $expenses;
 }
 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 index()
 {
     $expenses = Expense::scope()->withTrashed()->orderBy('created_at', 'desc');
     $expenses = $expenses->paginate();
     $transformer = new ExpenseTransformer(Auth::user()->account, Input::get('serializer'));
     $paginator = Expense::scope()->withTrashed()->paginate();
     $data = $this->createCollection($expenses, $transformer, ENTITY_EXPENSE, $paginator);
     return $this->response($data);
 }
예제 #6
0
 private function updateId()
 {
     $expenses = Expense::all();
     foreach ($expenses as $expense) {
         $new = Expense::find($expense->id);
         $new->id = Expense::get_uid();
         $new->save();
     }
 }
예제 #7
0
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = Expense::find();
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to return any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id, 'money' => $this->money, 'uid' => Yii::$app->user->id]);
     $query->andFilterWhere(['like', 'remark', $this->remark])->andFilterWhere(['like', 'who', $this->who]);
     return $dataProvider;
 }
 public function bulk($ids, $action)
 {
     $expenses = Expense::withTrashed()->scope($ids)->get();
     foreach ($expenses as $expense) {
         if ($action == 'restore') {
             $expense->restore();
             $expense->is_deleted = false;
             $expense->save();
         } else {
             if ($action == 'delete') {
                 $expense->is_deleted = true;
                 $expense->save();
             }
             $expense->delete();
         }
     }
     return count($tasks);
 }
예제 #9
0
 /**
  * карточка траты
  * @param $id
  * @return string
  */
 public function actionCart($id)
 {
     $expense = Expense::find()->where(['id' => $id])->one();
     return $this->render('cart', ['expense' => $expense]);
 }
예제 #10
0
 public function search(Request $request)
 {
     $arr = [];
     if ($request->has('q')) {
         $q = $request->input('q');
         $branchid = $request->input('branchid');
         $components = Component::where('descriptor', 'like', '%' . $q . '%')->orderBy('descriptor')->get(['descriptor', 'id']);
         foreach ($components as $component) {
             array_push($arr, ['table' => 'component', 'item' => $component->descriptor, 'id' => strtolower($component->id)]);
         }
         $compcats = Compcat::where('descriptor', 'like', '%' . $q . '%')->orderBy('descriptor')->get(['descriptor', 'id']);
         foreach ($compcats as $compcat) {
             array_push($arr, ['table' => 'compcat', 'item' => $compcat->descriptor, 'id' => strtolower($compcat->id)]);
         }
         $expenses = Expense::where('descriptor', 'like', '%' . $q . '%')->orderBy('descriptor')->get(['descriptor', 'id']);
         foreach ($expenses as $expense) {
             array_push($arr, ['table' => 'expense', 'item' => $expense->descriptor, 'id' => strtolower($expense->id)]);
         }
         $expscats = Expscat::where('descriptor', 'like', '%' . $q . '%')->orderBy('descriptor')->get(['descriptor', 'id']);
         foreach ($expscats as $expscat) {
             array_push($arr, ['table' => 'expscat', 'item' => $expscat->descriptor, 'id' => strtolower($expscat->id)]);
         }
         $suppliers = Supplier::where('descriptor', 'like', '%' . $q . '%')->where('branchid', $branchid)->orderBy('descriptor')->get(['descriptor', 'id']);
         foreach ($suppliers as $supplier) {
             array_push($arr, ['table' => 'supplier', 'item' => $supplier->descriptor, 'id' => strtolower($supplier->id)]);
         }
         //$payments = ['110A573E855511E68FF47E841D02B37D'=>'cash', '19ADA60B855511E68FF47E841D02B37D'=>'check'];
         $payments = ['c' => 'cash', 'k' => 'check'];
         $s = preg_grep("/^" . strtolower($q) . "/", $payments);
         if ($s) {
             $k = key($s);
             array_push($arr, ['table' => 'payment', 'item' => ucwords($s[$k]), 'id' => strtolower($k)]);
         }
     }
     //return $arr;
     if ($request->ajax()) {
         return $arr;
     } else {
         return abort('404');
     }
 }
예제 #11
0
 /**
  * Display the specified resource.
  *
  * @param  int      $id
  * @return Response
  */
 public function show($publicId)
 {
     $client = Client::withTrashed()->scope($publicId)->with('contacts', 'size', 'industry')->firstOrFail();
     if (!$this->checkViewPermission($client, $response)) {
         return $response;
     }
     Utils::trackViewed($client->getDisplayName(), ENTITY_CLIENT);
     $actionLinks = [];
     if (Task::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.new_task'), 'url' => '/tasks/create/' . $client->public_id];
     }
     if (Utils::isPro() && Invoice::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.new_quote'), 'url' => '/quotes/create/' . $client->public_id];
     }
     if (!empty($actionLinks)) {
         $actionLinks[] = \DropdownButton::DIVIDER;
     }
     if (Payment::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.enter_payment'), 'url' => '/payments/create/' . $client->public_id];
     }
     if (Credit::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.enter_credit'), 'url' => '/credits/create/' . $client->public_id];
     }
     if (Expense::canCreate()) {
         $actionLinks[] = ['label' => trans('texts.enter_expense'), 'url' => '/expenses/create/0/' . $client->public_id];
     }
     $data = array('actionLinks' => $actionLinks, 'showBreadcrumbs' => false, 'client' => $client, 'credit' => $client->getTotalCredit(), 'title' => trans('texts.view_client'), 'hasRecurringInvoices' => Invoice::scope()->where('is_recurring', '=', true)->whereClientId($client->id)->count() > 0, 'hasQuotes' => Invoice::scope()->where('is_quote', '=', true)->whereClientId($client->id)->count() > 0, 'hasTasks' => Task::scope()->whereClientId($client->id)->count() > 0, 'gatewayLink' => $client->getGatewayLink());
     return View::make('clients.show', $data);
 }
 /**
  * @SWG\Post(
  *   path="/expenses",
  *   tags={"expense"},
  *   summary="Create a expense",
  *   @SWG\Parameter(
  *     in="body",
  *     name="body",
  *     @SWG\Schema(ref="#/definitions/Expense")
  *   ),
  *   @SWG\Response(
  *     response=200,
  *     description="New expense",
  *      @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Expense"))
  *   ),
  *   @SWG\Response(
  *     response="default",
  *     description="an ""unexpected"" error"
  *   )
  * )
  */
 public function store(CreateExpenseRequest $request)
 {
     $expense = $this->expenseRepo->save($request->input());
     $expense = Expense::scope($expense->public_id)->with('client', 'invoice', 'vendor')->first();
     return $this->itemResponse($expense);
 }
예제 #13
0
 protected function storeExpense(array $data)
 {
     $id = Auth::user()->id_user;
     $order = User::findOrFail($id)->orders()->where('order_state', 1)->get()->first();
     $orderId = $order->id;
     $cat = $data['expenseCategory'];
     Log::info('User: '******' submitted new expense, category: ' . $cat . ', amount: ' . $data['expenseAmount']);
     // LOG
     switch ($cat) {
         case 1:
             $data['expenseCategory'] = 'Transport';
             break;
         case 2:
             $data['expenseCategory'] = 'Food';
             break;
         case 3:
             $data['expenseCategory'] = 'Accommodation';
             break;
         case 40:
             $data['expenseCategory'] = 'Other';
             break;
     }
     $order = Expense::create(['amount' => $data['expenseAmount'], 'category' => $data['expenseCategory'], 'order_id' => $orderId]);
 }
예제 #14
0
 /**
  * Finds the Expense model based on its primary key value.
  * If the model is not found, a 404 HTTP exception will be thrown.
  * @param integer $id
  * @return Expense the loaded model
  * @throws NotFoundHttpException if the model cannot be found
  */
 protected function findModel($id)
 {
     if (($model = Expense::findOne($id)) !== null) {
         return $model;
     } else {
         throw new NotFoundHttpException('The requested page does not exist.');
     }
 }
 private static function getViewModel($invoice)
 {
     $recurringHelp = '';
     $recurringDueDateHelp = '';
     $recurringDueDates = [];
     foreach (preg_split("/((\r?\n)|(\r\n?))/", trans('texts.recurring_help')) as $line) {
         $parts = explode('=>', $line);
         if (count($parts) > 1) {
             $line = $parts[0] . ' => ' . Utils::processVariables($parts[0]);
             $recurringHelp .= '<li>' . strip_tags($line) . '</li>';
         } else {
             $recurringHelp .= $line;
         }
     }
     foreach (preg_split("/((\r?\n)|(\r\n?))/", trans('texts.recurring_due_date_help')) as $line) {
         $parts = explode('=>', $line);
         if (count($parts) > 1) {
             $line = $parts[0] . ' => ' . Utils::processVariables($parts[0]);
             $recurringDueDateHelp .= '<li>' . strip_tags($line) . '</li>';
         } else {
             $recurringDueDateHelp .= $line;
         }
     }
     // Create due date options
     $recurringDueDates = [trans('texts.use_client_terms') => ['value' => '', 'class' => 'monthly weekly']];
     $ends = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];
     for ($i = 1; $i < 31; $i++) {
         if ($i >= 11 && $i <= 13) {
             $ordinal = $i . 'th';
         } else {
             $ordinal = $i . $ends[$i % 10];
         }
         $dayStr = str_pad($i, 2, '0', STR_PAD_LEFT);
         $str = trans('texts.day_of_month', ['ordinal' => $ordinal]);
         $recurringDueDates[$str] = ['value' => "1998-01-{$dayStr}", 'data-num' => $i, 'class' => 'monthly'];
     }
     $recurringDueDates[trans('texts.last_day_of_month')] = ['value' => '1998-01-31', 'data-num' => 31, 'class' => 'monthly'];
     $daysOfWeek = [trans('texts.sunday'), trans('texts.monday'), trans('texts.tuesday'), trans('texts.wednesday'), trans('texts.thursday'), trans('texts.friday'), trans('texts.saturday')];
     foreach (['1st', '2nd', '3rd', '4th'] as $i => $ordinal) {
         foreach ($daysOfWeek as $j => $dayOfWeek) {
             $str = trans('texts.day_of_week_after', ['ordinal' => $ordinal, 'day' => $dayOfWeek]);
             $day = $i * 7 + $j + 1;
             $dayStr = str_pad($day, 2, '0', STR_PAD_LEFT);
             $recurringDueDates[$str] = ['value' => "1998-02-{$dayStr}", 'data-num' => $day, 'class' => 'weekly'];
         }
     }
     // Tax rate $options
     $account = Auth::user()->account;
     $rates = TaxRate::scope()->orderBy('name')->get();
     $options = [];
     $defaultTax = false;
     foreach ($rates as $rate) {
         $options[$rate->rate . ' ' . $rate->name] = $rate->name . ' ' . ($rate->rate + 0) . '%';
         // load default invoice tax
         if ($rate->id == $account->default_tax_rate_id) {
             $defaultTax = $rate;
         }
     }
     // Check for any taxes which have been deleted
     if ($invoice->exists) {
         foreach ($invoice->getTaxes() as $key => $rate) {
             if (isset($options[$key])) {
                 continue;
             }
             $options[$key] = $rate['name'] . ' ' . $rate['rate'] . '%';
         }
     }
     return ['data' => Input::old('data'), 'account' => Auth::user()->account->load('country'), 'products' => Product::scope()->with('default_tax_rate')->orderBy('product_key')->get(), 'taxRateOptions' => $options, 'defaultTax' => $defaultTax, 'currencies' => Cache::get('currencies'), 'sizes' => Cache::get('sizes'), 'paymentTerms' => Cache::get('paymentTerms'), 'invoiceDesigns' => InvoiceDesign::getDesigns(), 'invoiceFonts' => Cache::get('fonts'), 'frequencies' => [1 => trans('texts.freq_weekly'), 2 => trans('texts.freq_two_weeks'), 3 => trans('texts.freq_four_weeks'), 4 => trans('texts.freq_monthly'), 5 => trans('texts.freq_three_months'), 6 => trans('texts.freq_six_months'), 7 => trans('texts.freq_annually')], 'recurringDueDates' => $recurringDueDates, 'recurringHelp' => $recurringHelp, 'recurringDueDateHelp' => $recurringDueDateHelp, 'invoiceLabels' => Auth::user()->account->getInvoiceLabels(), 'tasks' => Session::get('tasks') ? json_encode(Session::get('tasks')) : null, 'expenseCurrencyId' => Session::get('expenseCurrencyId') ?: null, 'expenses' => Session::get('expenses') ? Expense::scope(Session::get('expenses'))->with('documents', 'expense_category')->get() : []];
 }
예제 #16
0
 public function deletedInvoice(InvoiceWasDeleted $event)
 {
     // Release any tasks associated with the deleted invoice
     Expense::where('invoice_id', '=', $event->invoice->id)->update(['invoice_id' => null]);
 }
 public function bulk()
 {
     $action = Input::get('action');
     $ids = Input::get('public_id') ? Input::get('public_id') : Input::get('ids');
     switch ($action) {
         case 'invoice':
         case 'add_to_invoice':
             $expenses = Expense::scope($ids)->with('client')->get();
             $clientPublicId = null;
             $currencyId = null;
             // Validate that either all expenses do not have a client or if there is a client, it is the same client
             foreach ($expenses as $expense) {
                 if ($expense->client) {
                     if (!$clientPublicId) {
                         $clientPublicId = $expense->client->public_id;
                     } elseif ($clientPublicId != $expense->client->public_id) {
                         Session::flash('error', trans('texts.expense_error_multiple_clients'));
                         return Redirect::to('expenses');
                     }
                 }
                 if (!$currencyId) {
                     $currencyId = $expense->invoice_currency_id;
                 } elseif ($currencyId != $expense->invoice_currency_id && $expense->invoice_currency_id) {
                     Session::flash('error', trans('texts.expense_error_multiple_currencies'));
                     return Redirect::to('expenses');
                 }
                 if ($expense->invoice_id) {
                     Session::flash('error', trans('texts.expense_error_invoiced'));
                     return Redirect::to('expenses');
                 }
             }
             if ($action == 'invoice') {
                 return Redirect::to("invoices/create/{$clientPublicId}")->with('expenseCurrencyId', $currencyId)->with('expenses', $ids);
             } else {
                 $invoiceId = Input::get('invoice_id');
                 return Redirect::to("invoices/{$invoiceId}/edit")->with('expenseCurrencyId', $currencyId)->with('expenses', $ids);
             }
             break;
         default:
             $count = $this->expenseService->bulk($ids, $action);
     }
     if ($count > 0) {
         $message = Utils::pluralize($action . 'd_expense', $count);
         Session::flash('message', $message);
     }
     return Redirect::to('expenses');
 }
 /**
  * @param $startDate
  * @param $endDate
  * @param $isExport
  * @return array
  */
 private function generateExpenseReport($startDate, $endDate, $isExport)
 {
     $columns = ['vendor', 'client', 'date', 'expense_amount', 'invoiced_amount'];
     $account = Auth::user()->account;
     $displayData = [];
     $reportTotals = [];
     $expenses = Expense::scope()->withTrashed()->with('client.contacts', 'vendor')->where('expense_date', '>=', $startDate)->where('expense_date', '<=', $endDate);
     foreach ($expenses->get() as $expense) {
         $amount = $expense->amount;
         $invoiced = $expense->present()->invoiced_amount;
         $displayData[] = [$expense->vendor ? $isExport ? $expense->vendor->name : $expense->vendor->present()->link : '', $expense->client ? $isExport ? $expense->client->getDisplayName() : $expense->client->present()->link : '', $expense->present()->expense_date, Utils::formatMoney($amount, $expense->currency_id), Utils::formatMoney($invoiced, $expense->invoice_currency_id)];
         $reportTotals = $this->addToTotals($reportTotals, $expense->expense_currency_id, 'amount', $amount);
         $reportTotals = $this->addToTotals($reportTotals, $expense->invoice_currency_id, 'amount', 0);
         $reportTotals = $this->addToTotals($reportTotals, $expense->invoice_currency_id, 'invoiced', $invoiced);
         $reportTotals = $this->addToTotals($reportTotals, $expense->expense_currency_id, 'invoiced', 0);
     }
     return ['columns' => $columns, 'displayData' => $displayData, 'reportTotals' => $reportTotals];
 }
예제 #19
0
 /**
  * создаем расход по плану
  * @return array
  */
 public function actionToExpense()
 {
     \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
     $id = Yii::$app->request->post('id');
     $planValue = Yii::$app->request->post('planValue');
     $return = [];
     if ($id && $planValue) {
         $plan = Plan::find()->where(['id' => $id])->one();
         $purse = Purse::find()->where(['id' => $plan->purse_id])->one();
         if ($purse->balance >= $planValue) {
             $expense = new Expense();
             $expense->setAttributes($plan->getAttributes());
             $expense->money = $planValue;
             $save = $expense->save();
             if ($save) {
                 $purse->balance -= $planValue;
                 $purse->save();
                 $plan->delete();
             }
             $return = ['success' => 1, 'message' => ''];
         } else {
             $return = ['success' => 0, 'message' => 'Недостаточно средств на кошельке'];
         }
     }
     return ['success' => $return];
 }
 public function index()
 {
     $expenses = Expense::scope()->withTrashed()->with('client', 'invoice', 'vendor')->orderBy('created_at', 'desc');
     return $this->listResponse($expenses);
 }
예제 #21
0
 public function bulk()
 {
     $action = Input::get('action');
     $ids = Input::get('public_id') ? Input::get('public_id') : Input::get('ids');
     switch ($action) {
         case 'invoice':
             $expenses = Expense::scope($ids)->with('client')->get();
             $clientPublicId = null;
             $currencyId = null;
             $data = [];
             // Validate that either all expenses do not have a client or if there is a client, it is the same client
             foreach ($expenses as $expense) {
                 if ($expense->client) {
                     if (!$clientPublicId) {
                         $clientPublicId = $expense->client->public_id;
                     } elseif ($clientPublicId != $expense->client->public_id) {
                         Session::flash('error', trans('texts.expense_error_multiple_clients'));
                         return Redirect::to('expenses');
                     }
                 }
                 if (!$currencyId) {
                     $currencyId = $expense->invoice_currency_id;
                 } elseif ($currencyId != $expense->invoice_currency_id && $expense->invoice_currency_id) {
                     Session::flash('error', trans('texts.expense_error_multiple_currencies'));
                     return Redirect::to('expenses');
                 }
                 if ($expense->invoice_id) {
                     Session::flash('error', trans('texts.expense_error_invoiced'));
                     return Redirect::to('expenses');
                 }
                 $account = Auth::user()->account;
                 $data[] = ['publicId' => $expense->public_id, 'description' => $expense->public_notes, 'qty' => 1, 'cost' => $expense->present()->converted_amount];
             }
             return Redirect::to("invoices/create/{$clientPublicId}")->with('expenseCurrencyId', $currencyId)->with('expenses', $data);
             break;
         default:
             $count = $this->expenseService->bulk($ids, $action);
     }
     if ($count > 0) {
         $message = Utils::pluralize($action . 'd_expense', $count);
         Session::flash('message', $message);
     }
     return Redirect::to('expenses');
 }
 /**
  * @param array $data
  * @param Invoice|null $invoice
  * @return Invoice|mixed
  */
 public function save(array $data, Invoice $invoice = null)
 {
     /** @var Account $account */
     $account = \Auth::user()->account;
     $publicId = isset($data['public_id']) ? $data['public_id'] : false;
     $isNew = !$publicId || $publicId == '-1';
     if ($invoice) {
         // do nothing
         $entityType = $invoice->getEntityType();
     } elseif ($isNew) {
         $entityType = ENTITY_INVOICE;
         if (isset($data['is_recurring']) && filter_var($data['is_recurring'], FILTER_VALIDATE_BOOLEAN)) {
             $entityType = ENTITY_RECURRING_INVOICE;
         } elseif (isset($data['is_quote']) && filter_var($data['is_quote'], FILTER_VALIDATE_BOOLEAN)) {
             $entityType = ENTITY_QUOTE;
         }
         $invoice = $account->createInvoice($entityType, $data['client_id']);
         $invoice->invoice_date = date_create()->format('Y-m-d');
         if (isset($data['has_tasks']) && filter_var($data['has_tasks'], FILTER_VALIDATE_BOOLEAN)) {
             $invoice->has_tasks = true;
         }
         if (isset($data['has_expenses']) && filter_var($data['has_expenses'], FILTER_VALIDATE_BOOLEAN)) {
             $invoice->has_expenses = true;
         }
     } else {
         $invoice = Invoice::scope($publicId)->firstOrFail();
         \Log::warning('Entity not set in invoice repo save');
     }
     $invoice->fill($data);
     if (isset($data['set_default_terms']) && $data['set_default_terms'] || isset($data['set_default_footer']) && $data['set_default_footer']) {
         if (isset($data['set_default_terms']) && $data['set_default_terms']) {
             $account->{"{$invoice->getEntityType()}_terms"} = trim($data['terms']);
         }
         if (isset($data['set_default_footer']) && $data['set_default_footer']) {
             $account->invoice_footer = trim($data['invoice_footer']);
         }
         $account->save();
     }
     if (isset($data['invoice_number']) && !$invoice->is_recurring) {
         $invoice->invoice_number = trim($data['invoice_number']);
     }
     if (isset($data['discount'])) {
         $invoice->discount = round(Utils::parseFloat($data['discount']), 2);
     }
     if (isset($data['is_amount_discount'])) {
         $invoice->is_amount_discount = $data['is_amount_discount'] ? true : false;
     }
     if (isset($data['partial'])) {
         $invoice->partial = round(Utils::parseFloat($data['partial']), 2);
     }
     if (isset($data['invoice_date_sql'])) {
         $invoice->invoice_date = $data['invoice_date_sql'];
     } elseif (isset($data['invoice_date'])) {
         $invoice->invoice_date = Utils::toSqlDate($data['invoice_date']);
     }
     if (isset($data['invoice_status_id'])) {
         if ($data['invoice_status_id'] == 0) {
             $data['invoice_status_id'] = INVOICE_STATUS_DRAFT;
         }
         $invoice->invoice_status_id = $data['invoice_status_id'];
     }
     if ($invoice->is_recurring) {
         if ($invoice->start_date && $invoice->start_date != Utils::toSqlDate($data['start_date'])) {
             $invoice->last_sent_date = null;
         }
         $invoice->frequency_id = $data['frequency_id'] ? $data['frequency_id'] : 0;
         $invoice->start_date = Utils::toSqlDate($data['start_date']);
         $invoice->end_date = Utils::toSqlDate($data['end_date']);
         $invoice->client_enable_auto_bill = isset($data['client_enable_auto_bill']) && $data['client_enable_auto_bill'] ? true : false;
         $invoice->auto_bill = isset($data['auto_bill']) ? intval($data['auto_bill']) : AUTO_BILL_OFF;
         if ($invoice->auto_bill < AUTO_BILL_OFF || $invoice->auto_bill > AUTO_BILL_ALWAYS) {
             $invoice->auto_bill = AUTO_BILL_OFF;
         }
         if (isset($data['recurring_due_date'])) {
             $invoice->due_date = $data['recurring_due_date'];
         } elseif (isset($data['due_date'])) {
             $invoice->due_date = $data['due_date'];
         }
     } else {
         if (isset($data['due_date']) || isset($data['due_date_sql'])) {
             $invoice->due_date = isset($data['due_date_sql']) ? $data['due_date_sql'] : Utils::toSqlDate($data['due_date']);
         }
         $invoice->frequency_id = 0;
         $invoice->start_date = null;
         $invoice->end_date = null;
     }
     if (isset($data['terms']) && trim($data['terms'])) {
         $invoice->terms = trim($data['terms']);
     } elseif ($isNew && $account->{"{$entityType}_terms"}) {
         $invoice->terms = $account->{"{$entityType}_terms"};
     } else {
         $invoice->terms = '';
     }
     $invoice->invoice_footer = isset($data['invoice_footer']) && trim($data['invoice_footer']) ? trim($data['invoice_footer']) : (!$publicId && $account->invoice_footer ? $account->invoice_footer : '');
     $invoice->public_notes = isset($data['public_notes']) ? trim($data['public_notes']) : null;
     // process date variables if not recurring
     if (!$invoice->is_recurring) {
         $invoice->terms = Utils::processVariables($invoice->terms);
         $invoice->invoice_footer = Utils::processVariables($invoice->invoice_footer);
         $invoice->public_notes = Utils::processVariables($invoice->public_notes);
     }
     if (isset($data['po_number'])) {
         $invoice->po_number = trim($data['po_number']);
     }
     $invoice->invoice_design_id = isset($data['invoice_design_id']) ? $data['invoice_design_id'] : $account->invoice_design_id;
     // provide backwards compatability
     if (isset($data['tax_name']) && isset($data['tax_rate'])) {
         $data['tax_name1'] = $data['tax_name'];
         $data['tax_rate1'] = $data['tax_rate'];
     }
     $total = 0;
     $itemTax = 0;
     foreach ($data['invoice_items'] as $item) {
         $item = (array) $item;
         if (!$item['cost'] && !$item['product_key'] && !$item['notes']) {
             continue;
         }
         $invoiceItemCost = round(Utils::parseFloat($item['cost']), 2);
         $invoiceItemQty = round(Utils::parseFloat($item['qty']), 2);
         $lineTotal = $invoiceItemCost * $invoiceItemQty;
         $total += round($lineTotal, 2);
     }
     foreach ($data['invoice_items'] as $item) {
         $item = (array) $item;
         $invoiceItemCost = round(Utils::parseFloat($item['cost']), 2);
         $invoiceItemQty = round(Utils::parseFloat($item['qty']), 2);
         $lineTotal = $invoiceItemCost * $invoiceItemQty;
         if ($invoice->discount > 0) {
             if ($invoice->is_amount_discount) {
                 $lineTotal -= round($lineTotal / $total * $invoice->discount, 2);
             } else {
                 $lineTotal -= round($lineTotal * ($invoice->discount / 100), 2);
             }
         }
         if (isset($item['tax_rate1']) && Utils::parseFloat($item['tax_rate1']) > 0) {
             $invoiceItemTaxRate = Utils::parseFloat($item['tax_rate1']);
             $itemTax += round($lineTotal * $invoiceItemTaxRate / 100, 2);
         }
         if (isset($item['tax_rate2']) && Utils::parseFloat($item['tax_rate2']) > 0) {
             $invoiceItemTaxRate = Utils::parseFloat($item['tax_rate2']);
             $itemTax += round($lineTotal * $invoiceItemTaxRate / 100, 2);
         }
     }
     if ($invoice->discount > 0) {
         if ($invoice->is_amount_discount) {
             $total -= $invoice->discount;
         } else {
             $total *= (100 - $invoice->discount) / 100;
             $total = round($total, 2);
         }
     }
     if (isset($data['custom_value1'])) {
         $invoice->custom_value1 = round($data['custom_value1'], 2);
         if ($isNew) {
             $invoice->custom_taxes1 = $account->custom_invoice_taxes1 ?: false;
         }
     }
     if (isset($data['custom_value2'])) {
         $invoice->custom_value2 = round($data['custom_value2'], 2);
         if ($isNew) {
             $invoice->custom_taxes2 = $account->custom_invoice_taxes2 ?: false;
         }
     }
     if (isset($data['custom_text_value1'])) {
         $invoice->custom_text_value1 = trim($data['custom_text_value1']);
     }
     if (isset($data['custom_text_value2'])) {
         $invoice->custom_text_value2 = trim($data['custom_text_value2']);
     }
     // custom fields charged taxes
     if ($invoice->custom_value1 && $invoice->custom_taxes1) {
         $total += $invoice->custom_value1;
     }
     if ($invoice->custom_value2 && $invoice->custom_taxes2) {
         $total += $invoice->custom_value2;
     }
     $taxAmount1 = round($total * $invoice->tax_rate1 / 100, 2);
     $taxAmount2 = round($total * $invoice->tax_rate2 / 100, 2);
     $total = round($total + $taxAmount1 + $taxAmount2, 2);
     $total += $itemTax;
     // custom fields not charged taxes
     if ($invoice->custom_value1 && !$invoice->custom_taxes1) {
         $total += $invoice->custom_value1;
     }
     if ($invoice->custom_value2 && !$invoice->custom_taxes2) {
         $total += $invoice->custom_value2;
     }
     if ($publicId) {
         $invoice->balance = $total - ($invoice->amount - $invoice->balance);
     } else {
         $invoice->balance = $total;
     }
     $invoice->amount = $total;
     $invoice->save();
     if ($publicId) {
         $invoice->invoice_items()->forceDelete();
     }
     $document_ids = !empty($data['document_ids']) ? array_map('intval', $data['document_ids']) : [];
     foreach ($document_ids as $document_id) {
         $document = Document::scope($document_id)->first();
         if ($document && Auth::user()->can('edit', $document)) {
             if ($document->invoice_id && $document->invoice_id != $invoice->id) {
                 // From a clone
                 $document = $document->cloneDocument();
                 $document_ids[] = $document->public_id;
                 // Don't remove this document
             }
             $document->invoice_id = $invoice->id;
             $document->expense_id = null;
             $document->save();
         }
     }
     if (!$invoice->wasRecentlyCreated) {
         foreach ($invoice->documents as $document) {
             if (!in_array($document->public_id, $document_ids)) {
                 // Removed
                 // Not checking permissions; deleting a document is just editing the invoice
                 if ($document->invoice_id == $invoice->id) {
                     // Make sure the document isn't on a clone
                     $document->delete();
                 }
             }
         }
     }
     foreach ($data['invoice_items'] as $item) {
         $item = (array) $item;
         if (empty($item['cost']) && empty($item['product_key']) && empty($item['notes']) && empty($item['custom_value1']) && empty($item['custom_value2'])) {
             continue;
         }
         $task = false;
         if (isset($item['task_public_id']) && $item['task_public_id']) {
             $task = Task::scope($item['task_public_id'])->where('invoice_id', '=', null)->firstOrFail();
             if (Auth::user()->can('edit', $task)) {
                 $task->invoice_id = $invoice->id;
                 $task->client_id = $invoice->client_id;
                 $task->save();
             }
         }
         $expense = false;
         if (isset($item['expense_public_id']) && $item['expense_public_id']) {
             $expense = Expense::scope($item['expense_public_id'])->where('invoice_id', '=', null)->firstOrFail();
             if (Auth::user()->can('edit', $expense)) {
                 $expense->invoice_id = $invoice->id;
                 $expense->client_id = $invoice->client_id;
                 $expense->save();
             }
         }
         if ($productKey = trim($item['product_key'])) {
             if (\Auth::user()->account->update_products && !$invoice->has_tasks && !$invoice->has_expenses) {
                 $product = Product::findProductByKey($productKey);
                 if (!$product) {
                     if (Auth::user()->can('create', ENTITY_PRODUCT)) {
                         $product = Product::createNew();
                         $product->product_key = trim($item['product_key']);
                     } else {
                         $product = null;
                     }
                 }
                 if ($product && Auth::user()->can('edit', $product)) {
                     $product->notes = $task || $expense ? '' : $item['notes'];
                     $product->cost = $expense ? 0 : $item['cost'];
                     $product->save();
                 }
             }
         }
         $invoiceItem = InvoiceItem::createNew();
         $invoiceItem->product_id = isset($product) ? $product->id : null;
         $invoiceItem->product_key = isset($item['product_key']) ? trim($invoice->is_recurring ? $item['product_key'] : Utils::processVariables($item['product_key'])) : '';
         $invoiceItem->notes = trim($invoice->is_recurring ? $item['notes'] : Utils::processVariables($item['notes']));
         $invoiceItem->cost = Utils::parseFloat($item['cost']);
         $invoiceItem->qty = Utils::parseFloat($item['qty']);
         if (isset($item['custom_value1'])) {
             $invoiceItem->custom_value1 = $item['custom_value1'];
         }
         if (isset($item['custom_value2'])) {
             $invoiceItem->custom_value2 = $item['custom_value2'];
         }
         // provide backwards compatability
         if (isset($item['tax_name']) && isset($item['tax_rate'])) {
             $item['tax_name1'] = $item['tax_name'];
             $item['tax_rate1'] = $item['tax_rate'];
         }
         $invoiceItem->fill($item);
         $invoice->invoice_items()->save($invoiceItem);
     }
     return $invoice;
 }
예제 #23
0
    public function getRoute()
    {
        return "/expenses/{$this->public_id}";
    }
    public function getEntityType()
    {
        return ENTITY_EXPENSE;
    }
    public function isExchanged()
    {
        return $this->invoice_currency_id != $this->expense_currency_id;
    }
}
Expense::creating(function ($expense) {
    $expense->setNullValues();
});
Expense::created(function ($expense) {
    event(new ExpenseWasCreated($expense));
});
Expense::updating(function ($expense) {
    $expense->setNullValues();
});
Expense::updated(function ($expense) {
    event(new ExpenseWasUpdated($expense));
});
Expense::deleting(function ($expense) {
    $expense->setNullValues();
});
Expense::deleted(function ($expense) {
    event(new ExpenseWasDeleted($expense));
});
 public function create(InvoiceRequest $request, $clientPublicId = 0, $isRecurring = false)
 {
     $account = Auth::user()->account;
     $entityType = $isRecurring ? ENTITY_RECURRING_INVOICE : ENTITY_INVOICE;
     $clientId = null;
     if ($request->client_id) {
         $clientId = Client::getPrivateId($request->client_id);
     }
     $invoice = $account->createInvoice($entityType, $clientId);
     $invoice->public_id = 0;
     if (Session::get('expenses')) {
         $invoice->expenses = Expense::scope(Session::get('expenses'))->with('documents')->get();
     }
     $clients = Client::scope()->with('contacts', 'country')->orderBy('name');
     if (!Auth::user()->hasPermission('view_all')) {
         $clients = $clients->where('clients.user_id', '=', Auth::user()->id);
     }
     $data = ['clients' => $clients->get(), 'entityType' => $invoice->getEntityType(), 'invoice' => $invoice, 'method' => 'POST', 'url' => 'invoices', 'title' => trans('texts.new_invoice')];
     $data = array_merge($data, self::getViewModel($invoice));
     return View::make('invoices.edit', $data);
 }
예제 #25
0
 protected function getDatatableActions($entityType)
 {
     return [[trans('texts.edit_expense'), function ($model) {
         return URL::to("expenses/{$model->public_id}/edit");
     }, function ($model) {
         return Expense::canEditItem($model);
     }], [trans('texts.view_invoice'), function ($model) {
         return URL::to("/invoices/{$model->invoice_public_id}/edit");
     }, function ($model) {
         return $model->invoice_public_id && Invoice::canEditItemByOwner($model->invoice_user_id);
     }], [trans('texts.invoice_expense'), function ($model) {
         return "javascript:invoiceEntity({$model->public_id})";
     }, function ($model) {
         return !$model->invoice_id && (!$model->deleted_at || $model->deleted_at == '0000-00-00') && Invoice::canCreate();
     }]];
 }
예제 #26
0
파일: Purse.php 프로젝트: RStuffGit/money
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getExpenses()
 {
     return $this->hasMany(Expense::className(), ['purse_id' => 'id']);
 }
예제 #27
0
     * @param $query
     * @param null $bankdId
     * @return mixed
     */
    public function scopeBankId($query, $bankdId = null)
    {
        if ($bankdId) {
            $query->whereBankId($bankId);
        }
        return $query;
    }
    public function amountWithTax()
    {
        return Utils::calculateTaxes($this->amount, $this->tax_rate1, $this->tax_rate2);
    }
}
Expense::creating(function ($expense) {
    $expense->setNullValues();
});
Expense::created(function ($expense) {
    event(new ExpenseWasCreated($expense));
});
Expense::updating(function ($expense) {
    $expense->setNullValues();
});
Expense::updated(function ($expense) {
    event(new ExpenseWasUpdated($expense));
});
Expense::deleting(function ($expense) {
    $expense->setNullValues();
});
예제 #28
0
 public function save($data, $checkSubPermissions = false)
 {
     $account = \Auth::user()->account;
     $publicId = isset($data['public_id']) ? $data['public_id'] : false;
     $isNew = !$publicId || $publicId == '-1';
     if ($isNew) {
         $entityType = ENTITY_INVOICE;
         if (isset($data['is_recurring']) && filter_var($data['is_recurring'], FILTER_VALIDATE_BOOLEAN)) {
             $entityType = ENTITY_RECURRING_INVOICE;
         } elseif (isset($data['is_quote']) && filter_var($data['is_quote'], FILTER_VALIDATE_BOOLEAN)) {
             $entityType = ENTITY_QUOTE;
         }
         $invoice = $account->createInvoice($entityType, $data['client_id']);
         if (isset($data['has_tasks']) && filter_var($data['has_tasks'], FILTER_VALIDATE_BOOLEAN)) {
             $invoice->has_tasks = true;
         }
         if (isset($data['has_expenses']) && filter_var($data['has_expenses'], FILTER_VALIDATE_BOOLEAN)) {
             $invoice->has_expenses = true;
         }
     } else {
         $invoice = Invoice::scope($publicId)->firstOrFail();
     }
     if (isset($data['set_default_terms']) && $data['set_default_terms'] || isset($data['set_default_footer']) && $data['set_default_footer']) {
         if (isset($data['set_default_terms']) && $data['set_default_terms']) {
             $account->{"{$invoice->getEntityType()}_terms"} = trim($data['terms']);
         }
         if (isset($data['set_default_footer']) && $data['set_default_footer']) {
             $account->invoice_footer = trim($data['invoice_footer']);
         }
         $account->save();
     }
     if (isset($data['invoice_number']) && !$invoice->is_recurring) {
         $invoice->invoice_number = trim($data['invoice_number']);
     }
     if (isset($data['discount'])) {
         $invoice->discount = round(Utils::parseFloat($data['discount']), 2);
     }
     if (isset($data['is_amount_discount'])) {
         $invoice->is_amount_discount = $data['is_amount_discount'] ? true : false;
     }
     if (isset($data['partial'])) {
         $invoice->partial = round(Utils::parseFloat($data['partial']), 2);
     }
     if (isset($data['invoice_date_sql'])) {
         $invoice->invoice_date = $data['invoice_date_sql'];
     } elseif (isset($data['invoice_date'])) {
         $invoice->invoice_date = Utils::toSqlDate($data['invoice_date']);
     }
     if (isset($data['invoice_status_id'])) {
         if ($data['invoice_status_id'] == 0) {
             $data['invoice_status_id'] = INVOICE_STATUS_DRAFT;
         }
         $invoice->invoice_status_id = $data['invoice_status_id'];
     }
     if ($invoice->is_recurring) {
         if ($invoice->start_date && $invoice->start_date != Utils::toSqlDate($data['start_date'])) {
             $invoice->last_sent_date = null;
         }
         $invoice->frequency_id = $data['frequency_id'] ? $data['frequency_id'] : 0;
         $invoice->start_date = Utils::toSqlDate($data['start_date']);
         $invoice->end_date = Utils::toSqlDate($data['end_date']);
         $invoice->auto_bill = isset($data['auto_bill']) && $data['auto_bill'] ? true : false;
         if (isset($data['recurring_due_date'])) {
             $invoice->due_date = $data['recurring_due_date'];
         } elseif (isset($data['due_date'])) {
             $invoice->due_date = $data['due_date'];
         }
     } else {
         if (isset($data['due_date']) || isset($data['due_date_sql'])) {
             $invoice->due_date = isset($data['due_date_sql']) ? $data['due_date_sql'] : Utils::toSqlDate($data['due_date']);
         }
         $invoice->frequency_id = 0;
         $invoice->start_date = null;
         $invoice->end_date = null;
     }
     $invoice->terms = isset($data['terms']) && trim($data['terms']) ? trim($data['terms']) : (!$publicId && $account->invoice_terms ? $account->invoice_terms : '');
     $invoice->invoice_footer = isset($data['invoice_footer']) && trim($data['invoice_footer']) ? trim($data['invoice_footer']) : (!$publicId && $account->invoice_footer ? $account->invoice_footer : '');
     $invoice->public_notes = isset($data['public_notes']) ? trim($data['public_notes']) : null;
     // process date variables
     $invoice->terms = Utils::processVariables($invoice->terms);
     $invoice->invoice_footer = Utils::processVariables($invoice->invoice_footer);
     $invoice->public_notes = Utils::processVariables($invoice->public_notes);
     if (isset($data['po_number'])) {
         $invoice->po_number = trim($data['po_number']);
     }
     $invoice->invoice_design_id = isset($data['invoice_design_id']) ? $data['invoice_design_id'] : $account->invoice_design_id;
     if (isset($data['tax_name']) && isset($data['tax_rate']) && $data['tax_name']) {
         $invoice->tax_rate = Utils::parseFloat($data['tax_rate']);
         $invoice->tax_name = trim($data['tax_name']);
     } else {
         $invoice->tax_rate = 0;
         $invoice->tax_name = '';
     }
     $total = 0;
     $itemTax = 0;
     foreach ($data['invoice_items'] as $item) {
         $item = (array) $item;
         if (!$item['cost'] && !$item['product_key'] && !$item['notes']) {
             continue;
         }
         $invoiceItemCost = round(Utils::parseFloat($item['cost']), 2);
         $invoiceItemQty = round(Utils::parseFloat($item['qty']), 2);
         $lineTotal = $invoiceItemCost * $invoiceItemQty;
         $total += round($lineTotal, 2);
     }
     foreach ($data['invoice_items'] as $item) {
         $item = (array) $item;
         if (isset($item['tax_rate']) && Utils::parseFloat($item['tax_rate']) > 0) {
             $invoiceItemCost = round(Utils::parseFloat($item['cost']), 2);
             $invoiceItemQty = round(Utils::parseFloat($item['qty']), 2);
             $invoiceItemTaxRate = Utils::parseFloat($item['tax_rate']);
             $lineTotal = $invoiceItemCost * $invoiceItemQty;
             if ($invoice->discount > 0) {
                 if ($invoice->is_amount_discount) {
                     $lineTotal -= round($lineTotal / $total * $invoice->discount, 2);
                 } else {
                     $lineTotal -= round($lineTotal * ($invoice->discount / 100), 2);
                 }
             }
             $itemTax += round($lineTotal * $invoiceItemTaxRate / 100, 2);
         }
     }
     if ($invoice->discount > 0) {
         if ($invoice->is_amount_discount) {
             $total -= $invoice->discount;
         } else {
             $total *= (100 - $invoice->discount) / 100;
             $total = round($total, 2);
         }
     }
     if (isset($data['custom_value1'])) {
         $invoice->custom_value1 = round($data['custom_value1'], 2);
         if ($isNew) {
             $invoice->custom_taxes1 = $account->custom_invoice_taxes1 ?: false;
         }
     }
     if (isset($data['custom_value2'])) {
         $invoice->custom_value2 = round($data['custom_value2'], 2);
         if ($isNew) {
             $invoice->custom_taxes2 = $account->custom_invoice_taxes2 ?: false;
         }
     }
     if (isset($data['custom_text_value1'])) {
         $invoice->custom_text_value1 = trim($data['custom_text_value1']);
     }
     if (isset($data['custom_text_value2'])) {
         $invoice->custom_text_value2 = trim($data['custom_text_value2']);
     }
     // custom fields charged taxes
     if ($invoice->custom_value1 && $invoice->custom_taxes1) {
         $total += $invoice->custom_value1;
     }
     if ($invoice->custom_value2 && $invoice->custom_taxes2) {
         $total += $invoice->custom_value2;
     }
     $total += $total * $invoice->tax_rate / 100;
     $total = round($total, 2);
     $total += $itemTax;
     // custom fields not charged taxes
     if ($invoice->custom_value1 && !$invoice->custom_taxes1) {
         $total += $invoice->custom_value1;
     }
     if ($invoice->custom_value2 && !$invoice->custom_taxes2) {
         $total += $invoice->custom_value2;
     }
     if ($publicId) {
         $invoice->balance = $total - ($invoice->amount - $invoice->balance);
     } else {
         $invoice->balance = $total;
     }
     $invoice->amount = $total;
     $invoice->save();
     if ($publicId) {
         $invoice->invoice_items()->forceDelete();
     }
     foreach ($data['invoice_items'] as $item) {
         $item = (array) $item;
         if (empty($item['cost']) && empty($item['product_key']) && empty($item['notes']) && empty($item['custom_value1']) && empty($item['custom_value2'])) {
             continue;
         }
         $task = false;
         if (isset($item['task_public_id']) && $item['task_public_id']) {
             $task = Task::scope($item['task_public_id'])->where('invoice_id', '=', null)->firstOrFail();
             if (!$checkSubPermissions || $task->canEdit()) {
                 $task->invoice_id = $invoice->id;
                 $task->client_id = $invoice->client_id;
                 $task->save();
             }
         }
         $expense = false;
         if (isset($item['expense_public_id']) && $item['expense_public_id']) {
             $expense = Expense::scope($item['expense_public_id'])->where('invoice_id', '=', null)->firstOrFail();
             if (!$checkSubPermissions || $expense->canEdit()) {
                 $expense->invoice_id = $invoice->id;
                 $expense->client_id = $invoice->client_id;
                 $expense->save();
             }
         }
         if ($productKey = trim($item['product_key'])) {
             if (\Auth::user()->account->update_products && !strtotime($productKey)) {
                 $product = Product::findProductByKey($productKey);
                 if (!$product) {
                     if (!$checkSubPermissions || Product::canCreate()) {
                         $product = Product::createNew();
                         $product->product_key = trim($item['product_key']);
                     } else {
                         $product = null;
                     }
                 }
                 if ($product && (!$checkSubPermissions || $product->canEdit())) {
                     $product->notes = $task || $expense ? '' : $item['notes'];
                     $product->cost = $expense ? 0 : $item['cost'];
                     $product->save();
                 }
             }
         }
         $invoiceItem = InvoiceItem::createNew();
         $invoiceItem->product_id = isset($product) ? $product->id : null;
         $invoiceItem->product_key = isset($item['product_key']) ? trim($invoice->is_recurring ? $item['product_key'] : Utils::processVariables($item['product_key'])) : '';
         $invoiceItem->notes = trim($invoice->is_recurring ? $item['notes'] : Utils::processVariables($item['notes']));
         $invoiceItem->cost = Utils::parseFloat($item['cost']);
         $invoiceItem->qty = Utils::parseFloat($item['qty']);
         $invoiceItem->tax_rate = 0;
         if (isset($item['custom_value1'])) {
             $invoiceItem->custom_value1 = $item['custom_value1'];
         }
         if (isset($item['custom_value2'])) {
             $invoiceItem->custom_value2 = $item['custom_value2'];
         }
         if (isset($item['tax_rate']) && isset($item['tax_name']) && $item['tax_name']) {
             $invoiceItem['tax_rate'] = Utils::parseFloat($item['tax_rate']);
             $invoiceItem['tax_name'] = trim($item['tax_name']);
         }
         $invoice->invoice_items()->save($invoiceItem);
     }
     return $invoice;
 }
예제 #29
0
 protected function getDatatableActions($entityType)
 {
     return [[trans('texts.edit_client'), function ($model) {
         return URL::to("clients/{$model->public_id}/edit");
     }, function ($model) {
         return Client::canEditItem($model);
     }], ['--divider--', function () {
         return false;
     }, function ($model) {
         return Client::canEditItem($model) && (Task::canCreate() || Invoice::canCreate());
     }], [trans('texts.new_task'), function ($model) {
         return URL::to("tasks/create/{$model->public_id}");
     }, function ($model) {
         return Task::canCreate();
     }], [trans('texts.new_invoice'), function ($model) {
         return URL::to("invoices/create/{$model->public_id}");
     }, function ($model) {
         return Invoice::canCreate();
     }], [trans('texts.new_quote'), function ($model) {
         return URL::to("quotes/create/{$model->public_id}");
     }, function ($model) {
         return Auth::user()->isPro() && Invoice::canCreate();
     }], ['--divider--', function () {
         return false;
     }, function ($model) {
         return (Task::canCreate() || Invoice::canCreate()) && (Payment::canCreate() || Credit::canCreate() || Expense::canCreate());
     }], [trans('texts.enter_payment'), function ($model) {
         return URL::to("payments/create/{$model->public_id}");
     }, function ($model) {
         return Payment::canCreate();
     }], [trans('texts.enter_credit'), function ($model) {
         return URL::to("credits/create/{$model->public_id}");
     }, function ($model) {
         return Credit::canCreate();
     }], [trans('texts.enter_expense'), function ($model) {
         return URL::to("expenses/create/0/{$model->public_id}");
     }, function ($model) {
         return Expense::canCreate();
     }]];
 }