Merge branch 'master' of github.com:akaunting/akaunting

This commit is contained in:
Cüneyt Şentürk 2021-06-30 09:35:01 +03:00
commit f9b5611611
10 changed files with 210 additions and 80 deletions

View File

@ -107,35 +107,53 @@ abstract class Import implements HasLocalePreference, ShouldQueue, SkipsEmptyRow
protected function replaceForBatchRules(array $rules): array
{
$dependent_rules = [
'after',
'after_or_equal',
'before',
'before_or_equal',
'different',
'exclude_if',
'exclude_unless',
'gt',
'gte',
'in_array',
'lt',
'lte',
'prohibited_if',
'prohibited_unless',
'required_if',
'required_unless',
'required_with',
'required_with_all',
'required_without',
'required_without_all',
'same',
'after:',
'after_or_equal:',
'before:',
'before_or_equal:',
'different:',
'exclude_if:',
'exclude_unless:',
'gt:',
'gte:',
'in_array:',
'lt:',
'lte:',
'prohibited_if:',
'prohibited_unless:',
'required_if:',
'required_unless:',
'required_with:',
'required_with_all:',
'required_without:',
'required_without_all:',
'same:',
];
foreach ($rules as $field => $rule) {
foreach ($dependent_rules as $dependent_rule) {
$rules[$field] = Str::replaceFirst($dependent_rule . ':', $dependent_rule . ':*.', $rules[$field]);
}
}
$batch_rules = [
'after:*.',
'after_or_equal:*.',
'before:*.',
'before_or_equal:*.',
'different:*.',
'exclude_if:*.',
'exclude_unless:*.',
'gt:*.',
'gte:*.',
'in_array:*.',
'lt:*.',
'lte:*.',
'prohibited_if:*.',
'prohibited_unless:*.',
'required_if:*.',
'required_unless:*.',
'required_with:*.',
'required_with_all:*.',
'required_without:*.',
'required_without_all:*.',
'same:*.',
];
return $rules;
return str_replace($dependent_rules, $batch_rules, $rules);
}
}

View File

@ -327,4 +327,11 @@ class Customers extends Controller
return redirect()->route('invoices.create')->withInput($data);
}
public function createRevenue(Contact $customer)
{
$data['contact'] = $customer;
return redirect()->route('revenues.create')->withInput($data);
}
}

View File

@ -1,5 +1,5 @@
<template>
<div :id="'search-field-' + _uid" class="searh-field tags-input__wrapper">
<div :id="'search-field-' + _uid" class="searh-field tags-input__wrapper" :style="[!search_hidden ? {'height': '0px'} : {'height': 'auto'}]">
<div class="tags-group" v-for="(filter, index) in filtered" :index="index">
<span v-if="filter.option" class="el-tag el-tag--primary el-tag--small el-tag--light el-tag-option">
{{ filter.option }}
@ -148,7 +148,8 @@ export default {
description: 'List of filters'
},
dateConfig: null,
dateConfig: null
},
model: {
@ -177,10 +178,20 @@ export default {
values: [],
current_value: null,
show_date: false,
search_hidden: false
};
},
methods: {
searchBoxShow() {
if(document.querySelector('.js-search-input-box')) {
let search_box_html = document.querySelector('.js-search-input-box');
search_box_html.remove();
}
this.search_hidden = true;
},
onInputFocus() {
if (!this.filter_list.length) {
return;
@ -577,6 +588,8 @@ export default {
},
created() {
this.searchBoxShow();
let path = window.location.href.replace(window.location.search, '');
let cookie = Cookies.get('search-string');
@ -715,6 +728,10 @@ export default {
}
},
mounted() {
this.searchBoxShow();
},
computed: {
filteredOptions() {
this.filter_list.sort(function (a, b) {

View File

@ -5,5 +5,6 @@ return [
'revenue_received' => 'Revenue Received',
'paid_by' => 'Paid By',
'related_invoice' => 'Releated Invoice',
'create_revenue' => 'Create Revenue',
];

View File

@ -1,3 +1,9 @@
<div class="position-relative js-search-input-box" style="height: 45px;">
<div class="border-bottom-0 w-100 position-absolute left-0 right-0" style="z-index: 9;">
<input type="text" placeholder="Search or filter results..." class="form-control" />
</div>
</div>
<akaunting-search
placeholder="{{ (!empty($filters)) ? trans('general.placeholder.search_and_filter') : trans('general.search_placeholder')}}"
search-text="{{ trans('general.search_text') }}"

View File

@ -13,9 +13,11 @@
@php
$vue_key = '@input';
$vue_value = !empty($attributes['v-model']) ? $attributes['v-model'] . ' = $event.target.value' : (!empty($attributes['data-field']) ? 'form.' . $attributes['data-field'] . '.'. $name . ' = $event.target.value' : 'form.' . $name . ' = $event.target.value');
if (!empty($attributes['enable-v-model'])) {
$vue_key = 'v-model';
$vue_value = !empty($attributes['v-model']) ? $attributes['v-model'] : (!empty($attributes['data-field']) ? 'form.' . $attributes['data-field'] . '.'. $name : 'form.' . $name);
}
@endphp
@ -23,7 +25,7 @@
'class' => 'form-control',
'data-name' => $name,
'placeholder' => trans('general.form.enter', ['field' => $text]),
$vue_key => !empty($attributes['v-model']) ? $attributes['v-model'] : (!empty($attributes['data-field']) ? 'form.' . $attributes['data-field'] . '.'. $name : 'form.' . $name),
$vue_key => $vue_value,
], $attributes)) !!}
<div class="invalid-feedback d-block"

View File

@ -47,9 +47,11 @@
<td class="col-sm-2 col-md-1 col-lg-1 col-xl-1 d-none d-sm-block">
{{ Form::bulkActionGroup($item->id, $item->name) }}
</td>
<td class="col-xs-4 col-sm-3 col-md-4 col-lg-3 col-xl-3">
<a class="col-aka long-texts d-block" href="{{ route('customers.show', $item->id) }}">{{ $item->name }}</a>
</td>
<td class="col-md-3 col-lg-3 col-xl-3 d-none d-md-block long-texts">
<el-tooltip content="{{ !empty($item->phone) ? $item->phone : trans('general.na') }}"
effect="dark"
@ -57,9 +59,11 @@
<span>{{ !empty($item->email) ? $item->email : trans('general.na') }}</span>
</el-tooltip>
</td>
<td class="col-lg-2 col-xl-2 d-none d-lg-block text-right long-texts">
@money($item->unpaid, setting('default.currency'), true)
</td>
<td class="col-xs-4 col-sm-2 col-md-2 col-lg-2 col-xl-2 text-center">
@if (user()->can('update-sales-customers'))
{{ Form::enabledGroup($item->id, $item->name, $item->enabled) }}
@ -71,21 +75,34 @@
@endif
@endif
</td>
<td class="col-xs-4 col-sm-2 col-md-2 col-lg-1 col-xl-1 text-center">
<div class="dropdown">
<a class="btn btn-neutral btn-sm text-light items-align-center py-2" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-h text-muted"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="{{ route('customers.show', $item->id) }}">{{ trans('general.show') }}</a>
<a class="dropdown-item" href="{{ route('customers.edit', $item->id) }}">{{ trans('general.edit') }}</a>
<a class="dropdown-item" href="{{ route('customers.show', $item->id) }}">
{{ trans('general.show') }}
</a>
@can('create-sales-customers')
<a class="dropdown-item" href="{{ route('customers.edit', $item->id) }}">
{{ trans('general.edit') }}
</a>
@endcan
<div class="dropdown-divider"></div>
@can('create-sales-customers')
<a class="dropdown-item" href="{{ route('customers.duplicate', $item->id) }}">{{ trans('general.duplicate') }}</a>
<a class="dropdown-item" href="{{ route('customers.duplicate', $item->id) }}">
{{ trans('general.duplicate') }}
</a>
<div class="dropdown-divider"></div>
@endcan
@can('delete-sales-customers')
{!! Form::deleteLink($item, 'customers.destroy') !!}
@endcan

View File

@ -2,6 +2,62 @@
@section('title', $customer->name)
@section('new_button')
<div class="dropup header-drop-top">
<button type="button" class="btn btn-white btn-sm" data-toggle="dropdown" aria-expanded="false">
<i class="fa fa-chevron-down"></i>&nbsp; {{ trans('general.more_actions') }}
</button>
<div class="dropdown-menu" role="menu">
@stack('button_dropdown_start')
@stack('duplicate_button_start')
@can('create-sales-customers')
<a class="dropdown-item" href="{{ route('customers.duplicate', $customer->id) }}">
{{ trans('general.duplicate') }}
</a>
@endcan
@stack('duplicate_button_end')
<div class="dropdown-divider"></div>
@stack('invoice_button_start')
@can('create-sales-invoices')
<a class="dropdown-item" href="{{ route('customers.create-invoice', $customer->id) }}">
{{ trans('invoices.create_invoice') }}
</a>
@endcan
@stack('invoice_button_end')
@stack('revenue_button_start')
@can('create-sales-revenues')
<a class="dropdown-item" href="{{ route('customers.create-revenue', $customer->id) }}">
{{ trans('revenues.create_revenue') }}
</a>
@endcan
@stack('revenue_button_end')
<div class="dropdown-divider"></div>
@stack('delete_button_start')
@can('delete-sales-customers')
{!! Form::deleteLink($customer, 'customers.destroy') !!}
@endcan
@stack('delete_button_end')
@stack('button_dropdown_end')
</div>
</div>
@stack('edit_button_start')
@can('update-sales-customers')
<a href="{{ route('customers.edit', $customer->id) }}" class="btn btn-white btn-sm">
{{ trans('general.edit') }}
</a>
@endcan
@stack('edit_button_end')
@endsection
@section('content')
<div class="row">
<div class="col-xl-3">
@ -68,12 +124,7 @@
</ul>
@stack('customer_edit_button_start')
<a href="{{ route('customers.edit', $customer->id) }}" class="btn btn-info btn-block"><b>{{ trans('general.edit') }}</b></a>
@stack('customer_edit_button_end')
@stack('customer_create_invoice_button_start')
<a href="{{ route('customers.create-invoice', $customer->id) }}" class="btn btn-white btn-block"><b>{{ trans('invoices.create_invoice') }}</b></a>
@stack('customer_create_invoice_button_end')
</div>
<div class="col-xl-9">
@ -131,55 +182,28 @@
<div class="col-md-12">
<div class="nav-wrapper">
<ul class="nav nav-pills nav-fill flex-column flex-md-row" id="tabs-icons-text" role="tablist">
@stack('customer_transactions_tab_start')
<li class="nav-item">
<a class="nav-link mb-sm-3 mb-md-0 active" id="transactions-tab" data-toggle="tab" href="#transactions-content" role="tab" aria-controls="transactions-content" aria-selected="true">{{ trans_choice('general.transactions', 2) }}</a>
</li>
@stack('customer_transactions_tab_end')
@stack('customer_invoices_tab_start')
<li class="nav-item">
<a class="nav-link mb-sm-3 mb-md-0" id="invoices-tab" data-toggle="tab" href="#invoices-content" role="tab" aria-controls="invoices-content" aria-selected="false">{{ trans_choice('general.invoices', 2) }}</a>
<a class="nav-link mb-sm-3 mb-md-0 active" id="invoices-tab" data-toggle="tab" href="#invoices-content" role="tab" aria-controls="invoices-content" aria-selected="true">
{{ trans_choice('general.invoices', 2) }}
</a>
</li>
@stack('customer_invoices_tab_end')
@stack('customer_transactions_tab_start')
<li class="nav-item">
<a class="nav-link mb-sm-3 mb-md-0" id="transactions-tab" data-toggle="tab" href="#transactions-content" role="tab" aria-controls="transactions-content" aria-selected="false">
{{ trans_choice('general.transactions', 2) }}
</a>
</li>
@stack('customer_transactions_tab_end')
</ul>
</div>
<div class="card">
<div class="tab-content" id="myTabContent">
@stack('customer_transactions_content_start')
<div class="tab-pane fade show active" id="transactions-content" role="tabpanel" aria-labelledby="transactions-tab">
<div class="table-responsive">
<table class="table table-flush table-hover" id="tbl-transactions">
<thead class="thead-light">
<tr class="row table-head-line">
<th class="col-xs-6 col-sm-2">{{ trans('general.date') }}</th>
<th class="col-xs-6 col-sm-2 text-right">{{ trans('general.amount') }}</th>
<th class="col-sm-4 d-none d-sm-block">{{ trans_choice('general.categories', 1) }}</th>
<th class="col-sm-4 d-none d-sm-block">{{ trans_choice('general.accounts', 1) }}</th>
</tr>
</thead>
<tbody>
@foreach($transactions as $item)
<tr class="row align-items-center border-top-1 tr-py">
<td class="col-xs-6 col-sm-2">@date($item->paid_at)</td>
<td class="col-xs-6 col-sm-2 text-right">@money($item->amount, $item->currency_code, true)</td>
<td class="col-sm-4 d-none d-sm-block">{{ $item->category->name }}</td>
<td class="col-sm-4 d-none d-sm-block">{{ $item->account->name }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="card-footer py-4 table-action">
<div class="row">
@include('partials.admin.pagination', ['items' => $transactions, 'type' => 'transactions'])
</div>
</div>
</div>
@stack('customer_transactions_content_end')
<div class="card">
<div class="tab-content" id="cutomer-tab-content">
@stack('customer_invoices_content_start')
<div class="tab-pane fade" id="invoices-content" role="tabpanel" aria-labelledby="invoices-tab">
<div class="tab-pane fade show active" id="invoices-content" role="tabpanel" aria-labelledby="invoices-tab">
<div class="table-responsive">
<table class="table table-flush table-hover" id="tbl-invoices">
<thead class="thead-light">
@ -191,6 +215,7 @@
<th class="col-xs-4 col-sm-2">{{ trans_choice('general.statuses', 1) }}</th>
</tr>
</thead>
<tbody>
@foreach($invoices as $item)
<tr class="row align-items-center border-top-1 tr-py">
@ -204,6 +229,7 @@
</tbody>
</table>
</div>
<div class="card-footer py-4 table-action">
<div class="row">
@include('partials.admin.pagination', ['items' => $invoices, 'type' => 'invoices'])
@ -211,6 +237,40 @@
</div>
</div>
@stack('customer_invoices_content_end')
@stack('customer_transactions_content_start')
<div class="tab-pane fade" id="transactions-content" role="tabpanel" aria-labelledby="transactions-tab">
<div class="table-responsive">
<table class="table table-flush table-hover" id="tbl-transactions">
<thead class="thead-light">
<tr class="row table-head-line">
<th class="col-xs-6 col-sm-2">{{ trans('general.date') }}</th>
<th class="col-xs-6 col-sm-2 text-right">{{ trans('general.amount') }}</th>
<th class="col-sm-4 d-none d-sm-block">{{ trans_choice('general.categories', 1) }}</th>
<th class="col-sm-4 d-none d-sm-block">{{ trans_choice('general.accounts', 1) }}</th>
</tr>
</thead>
<tbody>
@foreach($transactions as $item)
<tr class="row align-items-center border-top-1 tr-py">
<td class="col-xs-6 col-sm-2">@date($item->paid_at)</td>
<td class="col-xs-6 col-sm-2 text-right">@money($item->amount, $item->currency_code, true)</td>
<td class="col-sm-4 d-none d-sm-block">{{ $item->category->name }}</td>
<td class="col-sm-4 d-none d-sm-block">{{ $item->account->name }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="card-footer py-4 table-action">
<div class="row">
@include('partials.admin.pagination', ['items' => $transactions, 'type' => 'transactions'])
</div>
</div>
</div>
@stack('customer_transactions_content_end')
</div>
</div>
</div>

View File

@ -26,7 +26,7 @@
{{ Form::selectAddNewGroup('account_id', trans_choice('general.accounts', 1), 'university', $accounts, setting('default.account'), ['required' => 'required', 'path' => route('modals.accounts.create'), 'change' => 'onChangeAccount']) }}
{{ Form::selectRemoteAddNewGroup('contact_id', trans_choice('general.customers', 1), 'user', $customers, null, ['path' => route('modals.customers.create'), 'remote_action' => route('customers.index')]) }}
{{ Form::selectRemoteAddNewGroup('contact_id', trans_choice('general.customers', 1), 'user', $customers, old('contact.id', old('contact_id', null)), ['path' => route('modals.customers.create'), 'remote_action' => route('customers.index')]) }}
{{ Form::textareaGroup('description', trans('general.description')) }}

View File

@ -97,6 +97,7 @@ Route::group(['prefix' => 'sales'], function () {
Route::get('customers/{customer}/disable', 'Sales\Customers@disable')->name('customers.disable');
Route::get('customers/{customer}/currency', 'Sales\Customers@currency')->name('customers.currency');
Route::get('customers/{customer}/create-invoice', 'Sales\Customers@createInvoice')->name('customers.create-invoice');
Route::get('customers/{customer}/create-revenue', 'Sales\Customers@createRevenue')->name('customers.create-revenue');
Route::resource('customers', 'Sales\Customers');
});
@ -128,6 +129,7 @@ Route::group(['prefix' => 'purchases'], function () {
Route::get('vendors/{vendor}/currency', 'Purchases\Vendors@currency')->name('vendors.currency');
Route::get('vendors/{vendor}/disable', 'Purchases\Vendors@disable')->name('vendors.disable');
Route::get('vendors/{vendor}/create-bill', 'Purchases\Vendors@createBill')->name('vendors.create-bill');
Route::get('vendors/{vendor}/create-payment', 'Purchases\Vendors@createPayment')->name('vendors.create-payment');
Route::resource('vendors', 'Purchases\Vendors', ['middleware' => ['dropzone']]);
});