Working on expense categories

This commit is contained in:
Hillel Coren 2016-07-07 11:03:43 +03:00
parent cd9aae1e22
commit e6b60c6f1a
6 changed files with 39 additions and 24 deletions

View File

@ -86,6 +86,7 @@ class ExpenseController extends BaseController
'vendor' => $vendor, 'vendor' => $vendor,
'clients' => Client::scope()->with('contacts')->orderBy('name')->get(), 'clients' => Client::scope()->with('contacts')->orderBy('name')->get(),
'clientPublicId' => $request->client_id, 'clientPublicId' => $request->client_id,
'categoryPublicId' => $request->category_id,
]; ];
$data = array_merge($data, self::getViewModel()); $data = array_merge($data, self::getViewModel());
@ -125,6 +126,7 @@ class ExpenseController extends BaseController
'vendorPublicId' => $expense->vendor ? $expense->vendor->public_id : null, 'vendorPublicId' => $expense->vendor ? $expense->vendor->public_id : null,
'clients' => Client::scope()->with('contacts')->orderBy('name')->get(), 'clients' => Client::scope()->with('contacts')->orderBy('name')->get(),
'clientPublicId' => $expense->client ? $expense->client->public_id : null, 'clientPublicId' => $expense->client ? $expense->client->public_id : null,
'categoryPublicId' => $expense->expense_category ? $expense->expense_category->public_id : null,
]; ];
$data = array_merge($data, self::getViewModel()); $data = array_merge($data, self::getViewModel());
@ -234,7 +236,7 @@ class ExpenseController extends BaseController
'countries' => Cache::get('countries'), 'countries' => Cache::get('countries'),
'customLabel1' => Auth::user()->account->custom_vendor_label1, 'customLabel1' => Auth::user()->account->custom_vendor_label1,
'customLabel2' => Auth::user()->account->custom_vendor_label2, 'customLabel2' => Auth::user()->account->custom_vendor_label2,
'categories' => ExpenseCategory::scope()->get() 'categories' => ExpenseCategory::scope()->orderBy('name')->get(),
]; ];
} }

View File

@ -245,7 +245,7 @@ class InvoiceController extends BaseController
$invoice->public_id = 0; $invoice->public_id = 0;
if (Session::get('expenses')) { if (Session::get('expenses')) {
$invoice->expenses = Expense::scope(Session::get('expenses'))->with('documents')->get(); $invoice->expenses = Expense::scope(Session::get('expenses'))->with('documents', 'expense_category')->get();
} }

View File

@ -58,19 +58,6 @@ class ExpenseService extends BaseService
$data['vendor_id'] = Vendor::getPrivateId($data['vendor_id']); $data['vendor_id'] = Vendor::getPrivateId($data['vendor_id']);
} }
if ( ! empty($data['category'])) {
$name = trim($data['category']);
$category = ExpenseCategory::scope()->withTrashed()->whereName($name)->first();
if ( ! $category) {
$category = ExpenseCategory::createNew();
$category->name = $name;
$category->save();
}
$data['expense_category_id'] = $category->id;
} elseif (isset($data['category'])) {
$data['expense_category_id'] = null;
}
return $this->expenseRepo->save($data, $expense); return $this->expenseRepo->save($data, $expense);
} }

View File

@ -26,7 +26,6 @@
@if ($expense) @if ($expense)
{!! Former::populate($expense) !!} {!! Former::populate($expense) !!}
{!! Former::populateField('should_be_invoiced', intval($expense->should_be_invoiced)) !!} {!! Former::populateField('should_be_invoiced', intval($expense->should_be_invoiced)) !!}
{!! Former::populateField('category', $expense->expense_category ? $expense->expense_category->name : '') !!}
{!! Former::hidden('public_id') !!} {!! Former::hidden('public_id') !!}
@endif @endif
@ -40,9 +39,10 @@
->label(trans('texts.vendor')) ->label(trans('texts.vendor'))
->addGroupClass('vendor-select') !!} ->addGroupClass('vendor-select') !!}
{!! Former::text('category') {!! Former::select('expense_category_id')->addOption('', '')
->data_bind("typeahead: category, items: categories, key: 'name', valueUpdate: 'afterkeydown'") ->data_bind('combobox: expense_category_id')
->label(trans('texts.category')) !!} ->label(trans('texts.category'))
->addGroupClass('category-select') !!}
{!! Former::text('expense_date') {!! Former::text('expense_date')
->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT)) ->data_date_format(Session::get(SESSION_DATE_PICKER_FORMAT, DEFAULT_DATE_PICKER_FORMAT))
@ -132,12 +132,12 @@
</div> </div>
<center class="buttons"> <center class="buttons">
{!! Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/expenses'))->appendIcon(Icon::create('remove-circle')) !!} {!! Button::normal(trans('texts.cancel'))->asLinkTo(URL::to('/expenses'))->appendIcon(Icon::create('remove-circle')) !!}
{!! Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) !!} {!! Button::success(trans('texts.save'))->submit()->appendIcon(Icon::create('floppy-disk')) !!}
{!! Button::normal(trans('texts.categories'))->asLinkTo(URL::to('/expense_categories'))->appendIcon(Icon::create('list')) !!}
@if ($expense) @if ($expense)
{!! DropdownButton::normal(trans('texts.more_actions')) {!! DropdownButton::normal(trans('texts.more_actions'))
->withContents($actions) ->withContents($actions)
->large()
->dropup() !!} ->dropup() !!}
@endif @endif
</center> </center>
@ -149,6 +149,7 @@
var vendors = {!! $vendors !!}; var vendors = {!! $vendors !!};
var clients = {!! $clients !!}; var clients = {!! $clients !!};
var categories = {!! $categories !!};
var clientMap = {}; var clientMap = {};
for (var i=0; i<clients.length; i++) { for (var i=0; i<clients.length; i++) {
@ -193,6 +194,13 @@
} }
$vendorSelect.combobox(); $vendorSelect.combobox();
var $categorySelect = $('select#expense_category_id');
for (var i = 0; i < categories.length; i++) {
var category = categories[i];
$categorySelect.append(new Option(category.name, category.public_id));
}
$categorySelect.combobox();
$('#expense_date').datepicker('update', '{{ $expense ? $expense->expense_date : 'new Date()' }}'); $('#expense_date').datepicker('update', '{{ $expense ? $expense->expense_date : 'new Date()' }}');
$('.expense_date .input-group-addon').click(function() { $('.expense_date .input-group-addon').click(function() {
@ -285,8 +293,6 @@
var ViewModel = function(data) { var ViewModel = function(data) {
var self = this; var self = this;
self.categories = {!! $categories !!};
self.category = ko.observable();
self.expense_currency_id = ko.observable(); self.expense_currency_id = ko.observable();
self.invoice_currency_id = ko.observable(); self.invoice_currency_id = ko.observable();
self.documents = ko.observableArray(); self.documents = ko.observableArray();
@ -310,6 +316,7 @@
self.account_currency_id = ko.observable({{ $account->getCurrencyId() }}); self.account_currency_id = ko.observable({{ $account->getCurrencyId() }});
self.client_id = ko.observable({{ $clientPublicId }}); self.client_id = ko.observable({{ $clientPublicId }});
self.vendor_id = ko.observable({{ $vendorPublicId }}); self.vendor_id = ko.observable({{ $vendorPublicId }});
self.expense_category_id = ko.observable({{ $categoryPublicId }});
self.convertedAmount = ko.computed({ self.convertedAmount = ko.computed({
read: function () { read: function () {

View File

@ -862,6 +862,7 @@
for (var i=0; i<expenses.length; i++) { for (var i=0; i<expenses.length; i++) {
var expense = expenses[i]; var expense = expenses[i];
var item = model.invoice().addItem(); var item = model.invoice().addItem();
item.product_key(expense.expense_category ? expense.expense_category.name() : '');
item.notes(expense.public_notes()); item.notes(expense.public_notes());
item.qty(1); item.qty(1);
item.expense_public_id(expense.public_id()); item.expense_public_id(expense.public_id());

View File

@ -799,6 +799,19 @@ function DocumentModel(data) {
} }
} }
function CategoryModel(data) {
var self = this;
self.name = ko.observable('')
self.update = function(data){
ko.mapping.fromJS(data, {}, this);
}
if (data) {
self.update(data);
}
}
var ExpenseModel = function(data) { var ExpenseModel = function(data) {
var self = this; var self = this;
@ -807,6 +820,11 @@ var ExpenseModel = function(data) {
create: function(options) { create: function(options) {
return new DocumentModel(options.data); return new DocumentModel(options.data);
} }
},
'expense_category': {
create: function(options) {
return new CategoryModel(options.data);
}
} }
} }