Payment summary improvements, removed invoice/payment API calls
This commit is contained in:
parent
444f2cf52d
commit
c97835edd1
@ -7,16 +7,6 @@ use App\User;
|
||||
|
||||
class UserServicesController extends Controller
|
||||
{
|
||||
public function invoices(User $o)
|
||||
{
|
||||
return ['data'=>$o->invoices_due->values()];
|
||||
}
|
||||
|
||||
public function payments(User $o)
|
||||
{
|
||||
return ['data'=>$o->payment_history->values()];
|
||||
}
|
||||
|
||||
public function services(User $o)
|
||||
{
|
||||
return ['data'=>$o->services_active->values()];
|
||||
|
@ -27,21 +27,6 @@ class Invoice extends Model
|
||||
// Array of items that can be updated with PushNew
|
||||
protected $pushable = ['items'];
|
||||
|
||||
protected $appends = [
|
||||
'date_due',
|
||||
'due',
|
||||
'invoice_id_url',
|
||||
'total',
|
||||
];
|
||||
|
||||
protected $visible = [
|
||||
'date_due',
|
||||
'due',
|
||||
'id',
|
||||
'invoice_id_url',
|
||||
'total',
|
||||
];
|
||||
|
||||
protected $with = [
|
||||
'account.country.currency',
|
||||
'items.taxes',
|
||||
@ -97,21 +82,11 @@ class Invoice extends Model
|
||||
return $this->date_orig->format('Y-m-d');
|
||||
}
|
||||
|
||||
public function getInvoiceIdAttribute()
|
||||
{
|
||||
return sprintf('%06s',$this->id);
|
||||
}
|
||||
|
||||
public function getInvoiceAccountIdAttribute()
|
||||
{
|
||||
return sprintf('%02s-%04s-%06s',$this->site_id,$this->account_id,$this->invoice_id);
|
||||
}
|
||||
|
||||
public function getInvoiceIdUrlAttribute()
|
||||
{
|
||||
return sprintf('<a href="/u/invoice/%s">%s</a>',$this->id,$this->invoice_account_id);
|
||||
}
|
||||
|
||||
public function getInvoiceTextAttribute()
|
||||
{
|
||||
return sprintf('Thank you for using %s for your Internet Services.',config('SITE_SETUP')->site_name);
|
||||
|
@ -20,19 +20,6 @@ class Payment extends Model
|
||||
protected $dateFormat = 'U';
|
||||
protected $with = ['account.country.currency','items'];
|
||||
|
||||
protected $appends = [
|
||||
'date_paid',
|
||||
'payment_id_url',
|
||||
'total',
|
||||
];
|
||||
|
||||
protected $visible = [
|
||||
'date_paid',
|
||||
'id',
|
||||
'payment_id_url',
|
||||
'total',
|
||||
];
|
||||
|
||||
public function account()
|
||||
{
|
||||
return $this->belongsTo(Account::class);
|
||||
@ -48,16 +35,6 @@ class Payment extends Model
|
||||
return $this->date_payment->format('Y-m-d');
|
||||
}
|
||||
|
||||
public function getPaymentIdAttribute()
|
||||
{
|
||||
return sprintf('%02s-%04s+%05s',$this->site_id,$this->account_id,$this->id);
|
||||
}
|
||||
|
||||
public function getPaymentIdUrlAttribute()
|
||||
{
|
||||
return sprintf('<a href="/u/payment/view/%s">%s</a>',$this->id,$this->payment_id);
|
||||
}
|
||||
|
||||
public function getTotalAttribute()
|
||||
{
|
||||
return sprintf('%3.'.$this->currency()->rounding.'f',$this->total_amt);
|
||||
|
26
app/User.php
26
app/User.php
@ -614,6 +614,32 @@ class User extends Authenticatable
|
||||
->from($summary,'summary');
|
||||
}
|
||||
|
||||
public function query_payment_summary()
|
||||
{
|
||||
$payment = (new Payment)
|
||||
->select([
|
||||
'payment_id',
|
||||
DB::raw('SUM(allocate) AS allocate'),
|
||||
|
||||
])
|
||||
->from($this->query_payment_items(),'PI')
|
||||
//->where('ab_payment.active',TRUE) // @todo To implement
|
||||
->groupBy(['payment_id']);
|
||||
|
||||
return (new Payment)
|
||||
->select([
|
||||
DB::raw('payment_id AS id'),
|
||||
'date_orig',
|
||||
'date_payment',
|
||||
'total_amt',
|
||||
//'fees_amt',
|
||||
DB::raw('total_amt-allocate AS balance'),
|
||||
])
|
||||
->join('ab_payment',['ab_payment.id'=>'payment_id'])
|
||||
->whereIN('account_id',$this->all_accounts()->pluck('id')->unique()->toArray())
|
||||
->from($payment,'summary');
|
||||
}
|
||||
|
||||
public function role()
|
||||
{
|
||||
// If I have agents and no parent, I am the wholesaler
|
||||
|
@ -1,59 +0,0 @@
|
||||
<div class="card card-primary card-outline">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Invoice History</h4>
|
||||
|
||||
<div class="card-tools">
|
||||
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
|
||||
<button type="button" class="btn btn-tool" data-widget="remove"><i class="fa fa-remove"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if ($o->invoices->count())
|
||||
<table class="table table-bordered table-striped table-hover" id="invoice_history" style="width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Date</th>
|
||||
<th>Amount</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@foreach ($o->invoices as $io)
|
||||
<tr>
|
||||
<td><a href="{{ url ('u/invoice',$io->id) }}">{{ $io->id }}</a></td>
|
||||
<td>{{ $io->due_date ? $io->due_date->format('Y-m-d') : ' ' }}</td>
|
||||
<td class="text-right">{{ number_format($io->total,2) }}</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
@else
|
||||
<p>No payments recorded</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@section('page-scripts')
|
||||
@css('//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css','jq-dt-css','jquery')
|
||||
@js('//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js','jq-dt-js','jquery')
|
||||
@css('//cdn.datatables.net/responsive/2.2.1/css/responsive.dataTables.min.css','dt-responsive-css','jq-dt-css')
|
||||
@js('//cdn.datatables.net/responsive/2.2.1/js/dataTables.responsive.min.js','dt-responsive-js','jq-dt-js')
|
||||
@css('/plugin/dataTables/dataTables.bootstrap4.css','dt-bootstrap4-css','jq-dt-css')
|
||||
@js('/plugin/dataTables/dataTables.bootstrap4.js','dt-bootstrap4-js','jq-dt-js')
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#invoice_history').DataTable( {
|
||||
responsive: true,
|
||||
order: [1, 'desc']
|
||||
});
|
||||
|
||||
$('#invoices tbody').on('click','tr', function () {
|
||||
$(this).toggleClass('selected');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@append
|
@ -1,59 +0,0 @@
|
||||
<div class="card card-primary card-outline">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Payment History</h4>
|
||||
|
||||
<div class="card-tools">
|
||||
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
|
||||
<button type="button" class="btn btn-tool" data-widget="remove"><i class="fa fa-remove"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if ($o->payment_history->count())
|
||||
<table class="table table-bordered table-striped table-hover" id="payments" style="width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Date</th>
|
||||
<th>Amount</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
@else
|
||||
<p>No payments recorded</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@section('page-scripts')
|
||||
@css('//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css','jq-dt-css','jquery')
|
||||
@js('//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js','jq-dt-js','jquery')
|
||||
@css('//cdn.datatables.net/responsive/2.2.1/css/responsive.dataTables.min.css','dt-responsive-css','jq-dt-css')
|
||||
@js('//cdn.datatables.net/responsive/2.2.1/js/dataTables.responsive.min.js','dt-responsive-js','jq-dt-js')
|
||||
@css('/plugin/dataTables/dataTables.bootstrap4.css','dt-bootstrap4-css','jq-dt-css')
|
||||
@js('/plugin/dataTables/dataTables.bootstrap4.js','dt-bootstrap4-js','jq-dt-js')
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#payments').DataTable( {
|
||||
responsive: true,
|
||||
ajax: {
|
||||
url: "/api/u/payments/{{ $o->id }}"
|
||||
},
|
||||
columns: [
|
||||
{ data: "payment_id_url" },
|
||||
{ data: "date_paid" },
|
||||
{ data: "total" },
|
||||
],
|
||||
language: {
|
||||
emptyTable: "No Payments On File"
|
||||
},
|
||||
order: [0, 'desc']
|
||||
});
|
||||
|
||||
$('#payments tbody').on('click','tr', function () {
|
||||
$(this).toggleClass('selected');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@append
|
@ -56,7 +56,41 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@include('common.payment.widget.history')
|
||||
<!-- Show last 10 invoices -->
|
||||
<div class="card card-warning card-outline">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Invoices - Last 12 Months</h4>
|
||||
|
||||
<div class="card-tools">
|
||||
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fas fa-minus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@include('widgets.invoice',[
|
||||
'o'=>$o->query_invoice_summary()->whereIN('account_id',$o->accounts()->pluck('id')->toArray())->where('due_date','>',now()->subYear()->timestamp)->having('balance','=',0),
|
||||
'widget_invoice_name'=>'widget-invoice-last'
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Show last 10 invoices -->
|
||||
<div class="card card-warning card-outline">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Payments - Last 12 Months</h4>
|
||||
|
||||
<div class="card-tools">
|
||||
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fas fa-minus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@include('widgets.payment',[
|
||||
'o'=>$o->query_payment_summary()->whereIN('account_id',$o->accounts()->pluck('id')->toArray())->where('date_payment','>',now()->subYear()->timestamp)->with(['items']),
|
||||
'widget_payment_name'=>'widget-payment-last'
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -69,13 +69,29 @@
|
||||
|
||||
<div class="card-body">
|
||||
@include('widgets.invoice',[
|
||||
'o'=>$o->query_invoice_summary()->whereIN('account_id',$o->accounts()->pluck('id')->toArray())->where('due_date','>',now()->subYear()->timestamp),
|
||||
'o'=>$o->query_invoice_summary()->whereIN('account_id',$o->accounts()->pluck('id')->toArray())->where('due_date','>',now()->subYear()->timestamp)->having('balance','=',0),
|
||||
'widget_invoice_name'=>'widget-invoice-last'
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@include('common.payment.widget.history')
|
||||
<!-- Show last 10 invoices -->
|
||||
<div class="card card-warning card-outline">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Payments - Last 12 Months</h4>
|
||||
|
||||
<div class="card-tools">
|
||||
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fas fa-minus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@include('widgets.payment',[
|
||||
'o'=>$o->query_payment_summary()->where('date_payment','>',now()->subYear()->timestamp)->with(['items']),
|
||||
'widget_payment_name'=>'widget-payment-last'
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -0,0 +1,53 @@
|
||||
@if(($x=$o->get())->count())
|
||||
<table class="table table-bordered w-100" id="{{ $widget_payment_name ?? 'widget-payment'}}">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-right">#</th>
|
||||
<th class="text-right">Received</th>
|
||||
<th class="text-right">Total</th>
|
||||
{{--<th class="text-right">Balance</th>--}}
|
||||
<th>Invoice(s)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@foreach ($x as $oo)
|
||||
<tr>
|
||||
<td class="text-right"><a href="{{ url('u/payment',$oo->id) }}">{{ $oo->id }}</a></td>
|
||||
<td class="text-right">{{ $oo->date_orig->format('Y-m-d') }}</td>
|
||||
<td class="text-right">${{ number_format($oo->total_amt,2) }}</td>
|
||||
{{--<td class="text-right">${{ number_format($oo->balance,2) }}</td>--}}
|
||||
<td>{!! join(',',$oo->items
|
||||
->filter(function($item) { return $item->invoice_id; })
|
||||
->transform(function($item) { return sprintf('<a href="%s">%s</a>',url('u/invoice',$item->invoice_id),$item->invoice_id); })
|
||||
->toArray()) !!}</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@section('page-scripts')
|
||||
@css('//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css','jq-dt-css','jquery')
|
||||
@js('//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js','jq-dt-js','jquery')
|
||||
@css('//cdn.datatables.net/responsive/2.2.1/css/responsive.dataTables.min.css','jq-dt-r-css','jq-dt-css')
|
||||
@js('//cdn.datatables.net/responsive/2.2.1/js/dataTables.responsive.min.js','jq-dt-r-js','jq-dt-js')
|
||||
@css('/plugin/dataTables/dataTables.bootstrap4.css','dt-bootstrap4-css','jq-dt-css')
|
||||
@js('/plugin/dataTables/dataTables.bootstrap4.js','dt-bootstrap4-js','jq-dt-js')
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#{{ $widget_payment_name ?? 'widget-payment'}}').DataTable({
|
||||
responsive: true,
|
||||
order: [1, 'desc']
|
||||
});
|
||||
|
||||
$('#{{ $widget_payment_name ?? 'widget-payment'}} tbody').on('click','tr', function () {
|
||||
$(this).toggleClass('selected');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@append
|
||||
|
||||
@else
|
||||
No data to display
|
||||
@endif
|
@ -27,12 +27,6 @@ Route::group(['middleware'=>['auth:api','role:reseller']], function() {
|
||||
});
|
||||
|
||||
Route::group(['middleware'=>'auth:api'], function() {
|
||||
Route::get('/u/invoices/{o}','UserServicesController@invoices')
|
||||
->where('o','[0-9]+')
|
||||
->middleware('can:view,o');;
|
||||
Route::get('/u/payments/{o}','UserServicesController@payments')
|
||||
->where('o','[0-9]+')
|
||||
->middleware('can:view,o');;
|
||||
Route::get('/u/services/{o}','UserServicesController@services')
|
||||
->where('o','[0-9]+')
|
||||
->middleware('can:view,o');;
|
||||
|
Loading…
Reference in New Issue
Block a user