From 1bba21dcef2095dd3e2120daa20a8475b6d9a597 Mon Sep 17 00:00:00 2001 From: Deon George Date: Fri, 2 Jul 2021 14:35:43 +1000 Subject: [PATCH] Added payment recording, minor CSS fixes, enabled Search --- app/Http/Controllers/AdminController.php | 62 ++++- app/Http/Controllers/SearchController.php | 2 +- app/Models/Account.php | 2 +- app/Models/Invoice.php | 2 + app/Models/Payment.php | 2 +- app/Models/PaymentItem.php | 6 +- public/css/custom.css | 2 +- .../backend/adminlte/a/payment/add.blade.php | 230 ++++++++++++++++++ .../a/payment/widgets/invoices.blade.php | 32 +++ .../theme/backend/adminlte/a/setup.blade.php | 4 +- .../layouts/partials/sidebarmenu.blade.php | 18 ++ routes/api.php | 7 +- routes/web.php | 5 +- 13 files changed, 362 insertions(+), 12 deletions(-) create mode 100644 resources/views/theme/backend/adminlte/a/payment/add.blade.php create mode 100644 resources/views/theme/backend/adminlte/a/payment/widgets/invoices.blade.php diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index eba2293..3824d9f 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -5,7 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Arr; -use App\Models\{Service,SiteDetail}; +use App\Models\{Account,Payment,PaymentItem,Service,SiteDetail}; class AdminController extends Controller { @@ -14,6 +14,66 @@ class AdminController extends Controller return View('a.service',['o'=>$o]); } + /** + * Record payments on an account. + * + * @param Request $request + * @param Payment $o + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\RedirectResponse + */ + public function pay_add(Request $request,Payment $o) + { + if ($request->post()) { + $validation = $request->validate([ + 'account_id' => 'required|exists:ab_account,id', + 'date_payment' => 'required|date', + 'checkout_id' => 'required|exists:ab_checkout,id', + 'total_amt' => 'required|numeric|min:0.01', + 'fees_amt' => 'nullable|numeric|lt:total_amt', + 'source_id' => 'nullable|exists:ab_account,id', + 'pending' => 'nullable|boolean', + 'notes' => 'nullable|string', + 'ip' => 'nullable|ip', + 'invoices' => ['nullable','array',function ($attribute,$value,$fail) use ($request) { + if (collect($value)->sum() > $request->post('total_amt')) + $fail('Allocation is greater than payment total.'); + }], + 'invoices.*.id' => 'nullable|exists:ab_invoice,id', + ]); + + $oo = new Payment; + $oo->forceFill($request->only(['account_id','date_payment','checkout_id','checkout_id','total_amt','fees_amt','source_id','pending','notes','ip'])); + $oo->site_id = config('SITE')->site_id; + $oo->save(); + + foreach ($validation['invoices'] as $id => $amount) { + $ooo = new PaymentItem; + $ooo->invoice_id = $id; + $ooo->alloc_amt = $amount; + $ooo->site_id = config('SITE')->site_id; + $oo->items()->save($ooo); + } + + return redirect()->back() + ->with('success','Payment recorded'); + } + + return view('a.payment.add') + ->with('o',$o); + } + + /** + * Show a list of invoices to apply payments to + * + * @param Account $o + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function pay_invoices(Account $o) + { + return view('a.payment.widgets.invoices') + ->with('o',$o); + } + /** * Site setup * diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 8a38a54..fc735a3 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -60,7 +60,7 @@ class SearchController extends Controller ->orderBy('id') ->limit(10)->get() as $o) { - $result->push(['name'=>sprintf('%s #%s',$o->account->name,$o->invoice_id),'value'=>'/u/invoice/'.$o->id,'category'=>'Invoices']); + $result->push(['name'=>sprintf('%s: %s',$o->sid,$o->account->name),'value'=>'/u/invoice/'.$o->id,'category'=>'Invoices']); } # Look for an ADSL/NBN Service diff --git a/app/Models/Account.php b/app/Models/Account.php index 2b14c8e..d2917b5 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -185,7 +185,7 @@ class Account extends Model implements IDs public function getNameAttribute() { - return $this->company ?: $this->user->SurFirstName; + return $this->company ?: ($this->user_id ? $this->user->SurFirstName : 'AID:'.$this->id); } public function getServicesCountHtmlAttribute() diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 89811ae..96aeb20 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -48,11 +48,13 @@ class Invoice extends Model implements IDs // Array of items that can be updated with PushNew protected $pushable = ['items']; + /* protected $with = [ 'account.country.currency', 'items.taxes', 'paymentitems' ]; + */ // Caching variables private int $_paid = 0; diff --git a/app/Models/Payment.php b/app/Models/Payment.php index f60280b..903e1fe 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -32,7 +32,7 @@ class Payment extends Model implements IDs protected $table = 'ab_payment'; protected $dates = ['date_payment']; protected $dateFormat = 'U'; - protected $with = ['account.country.currency','items']; + //protected $with = ['account.country.currency','items']; // Array of items that can be updated with PushNew protected $pushable = ['items']; diff --git a/app/Models/PaymentItem.php b/app/Models/PaymentItem.php index 11dd2c8..e5652b3 100644 --- a/app/Models/PaymentItem.php +++ b/app/Models/PaymentItem.php @@ -4,8 +4,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -use App\Traits\NextKey; -use App\Traits\PushNew; +use App\Traits\{NextKey,PushNew}; class PaymentItem extends Model { @@ -13,11 +12,14 @@ class PaymentItem extends Model const RECORD_ID = 'payment_item'; public $incrementing = FALSE; + protected $dateFormat = 'U'; const CREATED_AT = 'date_orig'; const UPDATED_AT = 'date_last'; protected $table = 'ab_payment_item'; + /* RELATIONS */ + public function payment() { return $this->belongsTo(Payment::class); } diff --git a/public/css/custom.css b/public/css/custom.css index 0109ecc..2dcb4df 100644 --- a/public/css/custom.css +++ b/public/css/custom.css @@ -3,6 +3,6 @@ hr.d-print-block { padding-bottom: 20px; } -.table.table-striped tbody tr:last-child td { +.table:not(.table-borderless) tbody tr:last-child td { border-bottom: 2px solid #dee2e6; } \ No newline at end of file diff --git a/resources/views/theme/backend/adminlte/a/payment/add.blade.php b/resources/views/theme/backend/adminlte/a/payment/add.blade.php new file mode 100644 index 0000000..d43ee59 --- /dev/null +++ b/resources/views/theme/backend/adminlte/a/payment/add.blade.php @@ -0,0 +1,230 @@ +@extends('adminlte::layouts.app') + +@section('htmlheader_title') + Payment +@endsection +@section('page_title') + Payment +@endsection + +@section('contentheader_title') + Record Payment +@endsection +@section('contentheader_description') +@endsection + +@section('main-content') +
+
+ +
+
+

Record Payment

+ @if(session()->has('success')) + {{ session()->get('success') }} + @endif +
+ +
+
+ @csrf + +
+
+
+ +
+
+ +
+ + + @error('date_payment') + {{ $message }} + @else + Payment Date is required. + @enderror + +
+ Date Payment Received. +
+
+ +
+
+ +
+
+ +
+ + + @error('total_amt') + {{ $message }} + @else + Payment Amount is required. + @enderror + +
+ Amount Received. +
+
+
+ +
+
+
+ +
+
+ +
+ + + @error('checkout_id') + {{ $message }} + @else + Payment Method is required. + @enderror + +
+ Payment Method. +
+
+ +
+
+ +
+
+ +
+ + + @error('fees_amt') + {{ $message }} + @else + Payment Amount is required. + @enderror + +
+ Amount Received. +
+
+
+ +
+
+
+ +
+
+ +
+ + + + + @error('account_id') + {{ $message }} + @else + Account is required. + @enderror + +
+ Account to add payment to. + +
+
+
+ +
+
+
+ @error('invoices') + + {{ $message }} + + @enderror +
+
+ +
+
+ Cancel + @can('wholesaler') + + @endcan +
+
+
+
+
+
+
+@endsection + +@section('page-scripts') + @css('//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css','s2-css') + @js('//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js','s2-js','jquery') + + + + +@append diff --git a/resources/views/theme/backend/adminlte/a/payment/widgets/invoices.blade.php b/resources/views/theme/backend/adminlte/a/payment/widgets/invoices.blade.php new file mode 100644 index 0000000..ffd1036 --- /dev/null +++ b/resources/views/theme/backend/adminlte/a/payment/widgets/invoices.blade.php @@ -0,0 +1,32 @@ +
+ + @if(($x=$o->invoices()->where('active',TRUE)->orderBy('due_date')->with(['items.taxes','paymentitems.payment','account'])->get()->where('due','>',0))->count()) + + + + + + + + + + + + + + @foreach ($x as $io) + + + + + + + + + @endforeach + +
IDDate IssueDate DueTotalDueApply
{{ $io->sid }}{{ $io->invoice_date->format('Y-m-d') }}{{ $io->due_date->format('Y-m-d') }}{{ number_format($io->total,2) }}{{ number_format($io->due,2) }}
+ @else +

No invoices due.

+ @endif +
\ No newline at end of file diff --git a/resources/views/theme/backend/adminlte/a/setup.blade.php b/resources/views/theme/backend/adminlte/a/setup.blade.php index 27f170a..7ff61f4 100644 --- a/resources/views/theme/backend/adminlte/a/setup.blade.php +++ b/resources/views/theme/backend/adminlte/a/setup.blade.php @@ -204,9 +204,9 @@
- Cancel + Cancel @can('wholesaler') - + @endcan
diff --git a/resources/views/vendor/adminlte/layouts/partials/sidebarmenu.blade.php b/resources/views/vendor/adminlte/layouts/partials/sidebarmenu.blade.php index cf69247..f454be6 100644 --- a/resources/views/vendor/adminlte/layouts/partials/sidebarmenu.blade.php +++ b/resources/views/vendor/adminlte/layouts/partials/sidebarmenu.blade.php @@ -22,6 +22,24 @@ +@can('wholesaler') + + +@endcan + @can('wholesaler') diff --git a/routes/api.php b/routes/api.php index c9a7ab1..a146a8b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,8 @@ ['auth:api','role:reseller']], function() { Route::get('/r/accounts',[ResellerServicesController::class,'accounts']); Route::get('/r/clients','ResellerServicesController@clients'); Route::get('/r/service_inactive','ResellerServicesController@service_inactive'); + Route::post('r/invoices/{o}',[AdminController::class,'pay_invoices']) + ->where('o','[0-9]+') + ->middleware(['theme:adminlte-be','role:wholesaler']); }); Route::group(['middleware'=>'auth:api'], function() { diff --git a/routes/web.php b/routes/web.php index 4c86a9e..9168a26 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,6 +6,7 @@ use App\Http\Controllers\{AdminController, HomeController, MediaController, PaypalController, + SearchController, WelcomeController}; /* @@ -38,7 +39,7 @@ Route::group(['middleware'=>['theme:adminlte-be','auth','role:wholesaler'],'pref Route::get('service/{o}','AdminHomeController@service'); Route::post('service/{o}','AdminHomeController@service_update'); Route::get('report/products','Wholesale\ReportController@products'); - Route::get('payment/add','PaymentController@add'); + Route::match(['get','post'],'payment/add',[AdminController::class,'pay_add']); //Route::get('accounting/connect','AccountingController@connect'); }); @@ -105,7 +106,7 @@ Route::get('product_order/{o}','OrderController@product_order'); Route::get('product_info/{o}','OrderController@product_info'); Route::redirect('home','u/home'); -Route::get('search','SearchController@search'); +Route::get('search',[SearchController::class,'search']); Route::get('pay/paypal/authorise',[PaypalController::class,'authorise']); Route::get('pay/paypal/cancel',[PaypalController::class,'cancel']);