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); }
private function updateId() { $expenses = Expense::all(); foreach ($expenses as $expense) { $new = Expense::find($expense->id); $new->id = Expense::get_uid(); $new->save(); } }
/** * 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); }
/** * карточка траты * @param $id * @return string */ public function actionCart($id) { $expense = Expense::find()->where(['id' => $id])->one(); return $this->render('cart', ['expense' => $expense]); }
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'); } }
/** * 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); }
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]); }
/** * 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() : []]; }
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]; }
/** * создаем расход по плану * @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); }
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; }
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); }
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(); }]]; }
/** * @return \yii\db\ActiveQuery */ public function getExpenses() { return $this->hasMany(Expense::className(), ['purse_id' => 'id']); }
* @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(); });
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; }
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(); }]]; }