From c3c0ece14a2fef7b4270acc3f02d65f37feed23d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 27 Oct 2016 16:45:06 +0300 Subject: [PATCH 1/4] Round qty in product report --- app/Http/Controllers/ReportController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index d506d6719e3b..6813983880de 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -385,7 +385,7 @@ class ReportController extends BaseController $isExport ? $client->getDisplayName() : $client->present()->link, $isExport ? $invoice->invoice_number : $invoice->present()->link, $invoice->present()->invoice_date, - $invoiceItem->qty, + round($invoiceItem->qty, 2), $invoiceItem->product_key, ]; //$reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'paid', $payment ? $payment->amount : 0); From 7465eb16312fe6102f15845227ab22cedb1b99d9 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 27 Oct 2016 17:26:42 +0300 Subject: [PATCH 2/4] Include taxes in expense amount --- app/Http/Controllers/ReportController.php | 11 +++-------- app/Libraries/Utils.php | 8 ++++++++ app/Models/Expense.php | 6 ++++++ app/Ninja/Datatables/ExpenseDatatable.php | 12 +++++++----- app/Ninja/Presenters/ExpensePresenter.php | 8 -------- app/Ninja/Repositories/DashboardRepository.php | 8 ++++++-- app/Ninja/Repositories/ExpenseRepository.php | 2 ++ 7 files changed, 32 insertions(+), 23 deletions(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 6813983880de..3431d5c18323 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -464,36 +464,31 @@ class ReportController extends BaseController */ private function generateExpenseReport($startDate, $endDate, $isExport) { - $columns = ['vendor', 'client', 'date', 'expense_amount', 'invoiced_amount']; + $columns = ['vendor', 'client', 'date', 'expense_amount']; $account = Auth::user()->account; $displayData = []; $reportTotals = []; $expenses = Expense::scope() - ->withTrashed() + ->withArchived() ->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; + $amount = $expense->amountWithTax(); $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 [ diff --git a/app/Libraries/Utils.php b/app/Libraries/Utils.php index 332cc9d980d0..88567ad27741 100644 --- a/app/Libraries/Utils.php +++ b/app/Libraries/Utils.php @@ -1089,4 +1089,12 @@ class Utils return url(NINJA_DOCS_URL . $page); } + + public static function calculateTaxes($amount, $taxRate1, $taxRate2) + { + $tax1 = round($amount * $taxRate1 / 100, 2); + $tax2 = round($amount * $taxRate2 / 100, 2); + + return round($amount + $tax1 + $tax2, 2); + } } diff --git a/app/Models/Expense.php b/app/Models/Expense.php index 2854819cfd0f..b19b7e2637f9 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -1,5 +1,6 @@ amount, $this->tax_rate1, $this->tax_rate2); + } } Expense::creating(function ($expense) { diff --git a/app/Ninja/Datatables/ExpenseDatatable.php b/app/Ninja/Datatables/ExpenseDatatable.php index 799552f86f8e..5832fd8e63af 100644 --- a/app/Ninja/Datatables/ExpenseDatatable.php +++ b/app/Ninja/Datatables/ExpenseDatatable.php @@ -56,14 +56,16 @@ class ExpenseDatatable extends EntityDatatable [ 'amount', function ($model) { + $amount = Utils::calculateTaxes($model->amount, $model->tax_rate1, $model->tax_rate2); + $str = Utils::formatMoney($amount, $model->expense_currency_id); + // show both the amount and the converted amount if ($model->exchange_rate != 1) { - $converted = round($model->amount * $model->exchange_rate, 2); - return Utils::formatMoney($model->amount, $model->expense_currency_id) . ' | ' . - Utils::formatMoney($converted, $model->invoice_currency_id); - } else { - return Utils::formatMoney($model->amount, $model->expense_currency_id); + $converted = round($amount * $model->exchange_rate, 2); + $str .= ' | ' . Utils::formatMoney($converted, $model->invoice_currency_id); } + + return $str; } ], [ diff --git a/app/Ninja/Presenters/ExpensePresenter.php b/app/Ninja/Presenters/ExpensePresenter.php index 3de07736257f..4760515720bb 100644 --- a/app/Ninja/Presenters/ExpensePresenter.php +++ b/app/Ninja/Presenters/ExpensePresenter.php @@ -24,12 +24,4 @@ class ExpensePresenter extends EntityPresenter return Utils::fromSqlDate($this->entity->expense_date); } - /** - * @return int - */ - public function invoiced_amount() - { - return $this->entity->invoice_id ? $this->entity->convertedAmount() : 0; - } - } diff --git a/app/Ninja/Repositories/DashboardRepository.php b/app/Ninja/Repositories/DashboardRepository.php index ffbbe348dd90..e115d963fcf7 100644 --- a/app/Ninja/Repositories/DashboardRepository.php +++ b/app/Ninja/Repositories/DashboardRepository.php @@ -137,7 +137,7 @@ class DashboardRepository ->where('invoices.is_deleted', '=', false) ->whereNotIn('payment_status_id', [PAYMENT_STATUS_VOIDED, PAYMENT_STATUS_FAILED]); } elseif ($entityType == ENTITY_EXPENSE) { - $records->select(DB::raw('sum(expenses.amount) as total, count(expenses.id) as count, '.$timeframe.' as '.$groupBy)); + $records->select(DB::raw('sum(expenses.amount + (expenses.amount * expenses.tax_rate1 / 100) + (expenses.amount * expenses.tax_rate2 / 100)) as total, count(expenses.id) as count, '.$timeframe.' as '.$groupBy)); } return $records; @@ -335,8 +335,12 @@ class DashboardRepository public function expenses($accountId, $userId, $viewAll) { + $amountField = DB::getQueryGrammar()->wrap('expenses.amount', true); + $taxRate1Field = DB::getQueryGrammar()->wrap('expenses.tax_rate1', true); + $taxRate2Field = DB::getQueryGrammar()->wrap('expenses.tax_rate2', true); + $select = DB::raw( - 'SUM('.DB::getQueryGrammar()->wrap('expenses.amount', true).') as value,' + "SUM({$amountField} + ({$amountField} * {$taxRate1Field} / 100) + ({$amountField} * {$taxRate2Field} / 100)) as value," .DB::getQueryGrammar()->wrap('expenses.expense_currency_id', true).' as currency_id' ); $paidToDate = DB::table('accounts') diff --git a/app/Ninja/Repositories/ExpenseRepository.php b/app/Ninja/Repositories/ExpenseRepository.php index 7d72ed6b38a0..de36b38c8706 100644 --- a/app/Ninja/Repositories/ExpenseRepository.php +++ b/app/Ninja/Repositories/ExpenseRepository.php @@ -76,6 +76,8 @@ class ExpenseRepository extends BaseRepository 'expenses.expense_currency_id', 'expenses.invoice_currency_id', 'expenses.user_id', + 'expenses.tax_rate1', + 'expenses.tax_rate2', 'expense_categories.name as category', 'invoices.public_id as invoice_public_id', 'invoices.user_id as invoice_user_id', From dedb85c8d6f898b8821c7860edc043f47a38f1cf Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 28 Oct 2016 12:59:57 +1100 Subject: [PATCH 3/4] Add / Update expense categories from API (#1124) * Expense categories * add dependencies * expense categories * expense categories * expense categories --- app/Http/Controllers/ExpenseApiController.php | 7 +++- .../ExpenseCategoryApiController.php | 39 +++++++++++++++++++ app/Http/routes.php | 3 +- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/ExpenseCategoryApiController.php diff --git a/app/Http/Controllers/ExpenseApiController.php b/app/Http/Controllers/ExpenseApiController.php index 5734d577feb7..465edcc852de 100644 --- a/app/Http/Controllers/ExpenseApiController.php +++ b/app/Http/Controllers/ExpenseApiController.php @@ -1,5 +1,6 @@ expenseRepo->save($request->input()); $expense = Expense::scope($expense->public_id) - ->with('client', 'invoice', 'vendor') - ->first(); + ->with('client', 'invoice', 'vendor') + ->first(); return $this->itemResponse($expense); } @@ -146,4 +147,6 @@ class ExpenseApiController extends BaseAPIController } + + } diff --git a/app/Http/Controllers/ExpenseCategoryApiController.php b/app/Http/Controllers/ExpenseCategoryApiController.php new file mode 100644 index 000000000000..f752347355f5 --- /dev/null +++ b/app/Http/Controllers/ExpenseCategoryApiController.php @@ -0,0 +1,39 @@ +categoryRepo = $categoryRepo; + $this->categoryService = $categoryService; + } + + public function update(UpdateExpenseCategoryRequest $request) + { + $category = $this->categoryRepo->save($request->input(), $request->entity()); + + return $this->itemResponse($category); + } + + public function store(CreateExpenseCategoryRequest $request) + { + $category = $this->categoryRepo->save($request->input()); + + return $this->itemResponse($category); + + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index dbb061e0ae29..378b679a0198 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -309,7 +309,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() Route::get('dashboard', 'DashboardApiController@index'); Route::resource('documents', 'DocumentAPIController'); Route::resource('vendors', 'VendorApiController'); - Route::resource('expenses', 'ExpenseApiController'); + Route::post('createExpenseCategory', 'ExpenseCategoryApiController@store'); + Route::put('updateExpenseCategory/{expense_category_id}', 'ExpenseCategoryApiController@update'); }); // Redirects for legacy links From 522cabe0a1423825403c9efb89728c4c131fd530 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Fri, 28 Oct 2016 09:42:49 +0300 Subject: [PATCH 4/4] Fix for permissions change --- app/Policies/AccountGatewayPolicy.php | 4 ++-- app/Policies/BankAccountPolicy.php | 4 ++-- app/Policies/DocumentPolicy.php | 2 +- app/Policies/ExpenseCategoryPolicy.php | 2 +- app/Policies/PaymentTermPolicy.php | 4 ++-- app/Policies/TokenPolicy.php | 2 +- resources/views/accounts/email_settings.blade.php | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Policies/AccountGatewayPolicy.php b/app/Policies/AccountGatewayPolicy.php index 5fc2d43b107e..0cfd2951367a 100644 --- a/app/Policies/AccountGatewayPolicy.php +++ b/app/Policies/AccountGatewayPolicy.php @@ -23,7 +23,7 @@ class AccountGatewayPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { + public static function create(User $user, $item) { return $user->hasPermission('admin'); } -} \ No newline at end of file +} diff --git a/app/Policies/BankAccountPolicy.php b/app/Policies/BankAccountPolicy.php index 33ca0a22fe9c..9c8e6794dc57 100644 --- a/app/Policies/BankAccountPolicy.php +++ b/app/Policies/BankAccountPolicy.php @@ -22,7 +22,7 @@ class BankAccountPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { + public static function create(User $user, $item) { return $user->hasPermission('admin'); } -} \ No newline at end of file +} diff --git a/app/Policies/DocumentPolicy.php b/app/Policies/DocumentPolicy.php index 0af6e80a2af6..abb440800412 100644 --- a/app/Policies/DocumentPolicy.php +++ b/app/Policies/DocumentPolicy.php @@ -13,7 +13,7 @@ class DocumentPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) + public static function create(User $user, $item) { return !empty($user); } diff --git a/app/Policies/ExpenseCategoryPolicy.php b/app/Policies/ExpenseCategoryPolicy.php index bac89b183c2f..2eeb3d7e968b 100644 --- a/app/Policies/ExpenseCategoryPolicy.php +++ b/app/Policies/ExpenseCategoryPolicy.php @@ -11,7 +11,7 @@ class ExpenseCategoryPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { + public static function create(User $user, $item) { return $user->is_admin; } diff --git a/app/Policies/PaymentTermPolicy.php b/app/Policies/PaymentTermPolicy.php index 36d1ae210a58..e1ee2e494bdd 100644 --- a/app/Policies/PaymentTermPolicy.php +++ b/app/Policies/PaymentTermPolicy.php @@ -23,7 +23,7 @@ class PaymentTermPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { + public static function create(User $user, $item) { return $user->hasPermission('admin'); } -} \ No newline at end of file +} diff --git a/app/Policies/TokenPolicy.php b/app/Policies/TokenPolicy.php index fff0ffc1f6e6..419a288262cb 100644 --- a/app/Policies/TokenPolicy.php +++ b/app/Policies/TokenPolicy.php @@ -9,7 +9,7 @@ class TokenPolicy extends EntityPolicy { return $user->hasPermission('admin'); } - public static function create(User $user) { + public static function create(User $user, $item) { return $user->hasPermission('admin'); } } diff --git a/resources/views/accounts/email_settings.blade.php b/resources/views/accounts/email_settings.blade.php index 79d8dc6e571d..fcb7c77acf6e 100644 --- a/resources/views/accounts/email_settings.blade.php +++ b/resources/views/accounts/email_settings.blade.php @@ -106,7 +106,7 @@ <center> <script language="javascript"> var iframe = document.getElementById('invoiceIFrame'); - iframe.src = '{{ SITE_URL }}/view/' + iframe.src = '{{ rtrim(SITE_URL ,'/') }}/view/' + window.location.search.substring(1); </script>

{{ trans('texts.iframe_url_help2') }}