Client Portal Payments List View

This commit is contained in:
David Bomba 2019-08-16 15:20:28 +10:00
parent 0892993afe
commit c2441bdef0
6 changed files with 207 additions and 4 deletions

View File

@ -35,7 +35,9 @@ class PaymentFilters extends QueryFilters
return $this->builder;
return $this->builder->where(function ($query) use ($filter) {
$query->where('payments.custom_value1', 'like', '%'.$filter.'%')
$query->where('payments.amount', 'like', '%'.$filter.'%')
->orWhere('payments.payment_date', 'like', '%'.$filter.'%')
->orWhere('payments.custom_value1', 'like', '%'.$filter.'%')
->orWhere('payments.custom_value2', 'like' , '%'.$filter.'%')
->orWhere('payments.custom_value3', 'like' , '%'.$filter.'%')
->orWhere('payments.custom_value4', 'like' , '%'.$filter.'%');
@ -113,8 +115,26 @@ class PaymentFilters extends QueryFilters
public function entityFilter()
{
return $this->builder->whereCompanyId(auth()->user()->company()->id);
if(auth('contact')->user())
return $this->contactViewFilter();
else
return $this->builder->whereCompanyId(auth()->user()->company()->id);
}
}
/**
* We need additional filters when showing invoices for the
* client portal. Need to automatically exclude drafts and cancelled invoices
*
* @return Illuminate\Database\Query\Builder
*/
private function contactViewFilter() : Builder
{
return $this->builder
->whereCompanyId(auth('contact')->user()->company->id)
->whereIsDeleted(false);
}
}

View File

@ -0,0 +1,80 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Controllers\ClientPortal;
use App\Filters\PaymentFilters;
use App\Http\Controllers\Controller;
use App\Models\Payment;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Yajra\DataTables\Facades\DataTables;
use Yajra\DataTables\Html\Builder;
/**
* Class InvoiceController
* @package App\Http\Controllers\ClientPortal\InvoiceController
*/
class PaymentController extends Controller
{
use MakesHash;
/**
* Show the list of Invoices
*
* @param \App\Filters\InvoiceFilters $filters The filters
*
* @return \Illuminate\Http\Response
*/
public function index(PaymentFilters $filters, Builder $builder)
{
$payments = Payment::filter($filters);
if (request()->ajax()) {
return DataTables::of($payments)->addColumn('action', function ($payment) {
return '<a href="/client/payments/'. $payment->hashed_id .'/edit" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>';
})->editColumn('payment_type_id', function ($payment) {
return Payment::typeForKey($payment->payment_type_id);
})
->editColumn('status_id', function ($payment){
return Payment::badgeForStatus($invoice->status);
})
->rawColumns(['action', 'status_id'])
->make(true);
}
$data['html'] = $builder;
return view('portal.default.payments.index', $data);
}
/**
* Display the specified resource.
*
* @param \App\Models\Invoice $invoice The invoice
*
* @return \Illuminate\Http\Response
*/
public function show(RecurringInvoice $invoice)
{
}
}

View File

@ -60,6 +60,7 @@ class PortalComposer
$data[] = [ 'title' => ctrans('texts.dashboard'), 'url' => 'client.dashboard', 'icon' => 'fa fa-tachometer fa-fw fa-2x'];
$data[] = [ 'title' => ctrans('texts.invoices'), 'url' => 'client.invoices.index', 'icon' => 'fa fa-file-pdf-o fa-fw fa-2x'];
$data[] = [ 'title' => ctrans('texts.recurring_invoices'), 'url' => 'client.recurring_invoices.index', 'icon' => 'fa fa-files-o fa-fw fa-2x'];
$data[] = [ 'title' => ctrans('texts.payments'), 'url' => 'client.payments.index', 'icon' => 'fa fa-credit-card fa-fw fa-2x'];
return $data;

View File

@ -64,4 +64,22 @@ class Payment extends BaseModel
{
return $this->morphMany(CompanyLedger::class, 'company_ledgerable');
}
public static function typeForId(int $payment_type_id)
{
}
public static function badgeForStatus(int $status)
{
switch ($status) {
case 'value':
# code...
break;
default:
# code...
break;
}
}
}

View File

@ -0,0 +1,82 @@
@extends('portal.default.layouts.master')
@section('header')
@parent
<link href="//cdn.datatables.net/1.10.19/css/dataTables.bootstrap4.min.css" rel="stylesheet" type="text/css"/>
@stop
@section('body')
<main class="main">
<div class="container-fluid">
<div class="row" style="padding-top: 30px;">
<div class="col-lg-12" style="padding-bottom: 10px;">
<div class="animated fadeIn">
<div class="col-md-12 card">
{!! $html->table(['class' => 'table table-hover table-striped', 'id' => 'datatable'], true) !!}
</div>
</div>
</div>
</div>
</div>
</main>
</body>
@endsection
@push('scripts')
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js" type="text/javascript"></script>
<script src="//cdn.datatables.net/1.10.18/js/dataTables.bootstrap4.min.js"></script>
@endpush
@section('footer')
<script>
/*global json payload*/
var data;
var data_table;
$(function() {
data_table = $('#datatable').DataTable({
processing: true,
serverSide: true,
searching: false,
bLengthChange: false,
language: {
processing: " {{ trans('texts.processing_request') }}",
search: "{{ trans('texts.search') }}:",
// info: "{{ trans('texts.info') }}",
infoPostFix: "",
loadingRecords: "{{ trans('texts.loading') }}",
zeroRecords: "{{ trans('texts.no_records_found') }}"
},
ajax: {
url: '{!! route('client.recurring_invoices.index') !!}',
data: function(data) {
}
},
drawCallback: function(settings){
data = this.api().ajax.json().data;
},
columns: [
{data: 'payment_date', name: 'payment_date', title: '{{trans('texts.payment_date')}}', visible: true},
{data: 'payment_type_id', name: 'payment_type_id', title: '{{trans('texts.payment_type_id')}}', visible: true},
{data: 'amount', name: 'amount', title: '{{trans('texts.amount')}}', visible: true},
{data: 'status_id', name: 'status_id', title: '{{trans('texts.status')}}', visible: true},
{data: 'transaction_reference', name: 'transaction_reference', title: '{{trans('texts.transaction_reference')}}', visible: true},
{data: 'action', name: 'action', title: '', searchable: false, orderable: false},
]
});
});
</script>
@endsection

View File

@ -20,6 +20,8 @@ Route::group(['middleware' => ['auth:contact'], 'prefix' => 'client', 'as' => 'c
Route::post('invoices/payment', 'ClientPortal\InvoiceController@bulk')->name('invoices.bulk');
Route::get('recurring_invoices', 'ClientPortal\RecurringInvoiceController@index')->name('recurring_invoices.index');
Route::get('payments', 'ClientPortal\PaymentController@index')->name('payments.index');
Route::get('profile/{client_contact}/edit', 'ClientPortal\ProfileController@edit')->name('profile.edit');