fixed errors and enhanced admin panel

This commit is contained in:
ilmedova 2023-03-30 04:17:29 +05:00
parent 84857335a8
commit 4e44af4bef
15 changed files with 228 additions and 157 deletions

View File

@ -77,7 +77,8 @@ public function create()
$application = BrokerApplication::create([
'account_id' => $this->account->id,
'state' => 'draft' //default mysql value is new
'state' => 'draft', //default mysql value is new
'is_local' => true
]);
foreach ($documents as $document){

View File

@ -2,21 +2,13 @@
namespace App\Http\Controllers\API;
use App\Http\Requests\API\ContractRequest;
use App\Http\Resources\ContractResource;
use App\Http\Resources\CountryResource;
use App\Http\Resources\CategoryResource;
use App\Models\Contract;
use App\Models\Country;
use App\Models\Category;
use App\Http\Controllers\Controller;
use App\Http\Resources\QuestionResource;
use App\Models\Account;
use App\Models\Application;
use App\Models\BrokerApplication;
use App\Models\Client;
use App\Models\Question;
use Illuminate\Http\Request;
class ResourceController extends Controller
{
@ -35,44 +27,4 @@ public function faqs()
return QuestionResource::collection(Question::get());//todo investigate do we need all??
}
public function previewAccountAdmin($id)
{
$account = Account::with(['country','profile','clients','applications'])//tormoz etdirer todo fix this
->find($id);
return view('admin.preview',[
'account' => $account
]);
}
public function previewApplicationAdmin($id){
$application = Application::with(['account', 'attachments', 'ticket'])->find($id);
return view('admin.application_preview',[
'application' => $application
]);
}
public function previewBrokerApplicationAdmin($id){
$application = BrokerApplication::with(['account', 'broker_attachments', 'ticket'])->find($id);
return view('admin.broker_application_preview',[
'application' => $application
]);
}
public function createAccountClient($account_id){
return view('admin.account_client_create',[
'account_id' => $account_id
]);
}
public function createClient(Request $request){
$data = $request->only('firstname', 'lastname', 'email', 'password', 'account_id');
$data['is_verified'] = false;
$data['is_suspended'] = false;
$client = new Client($data);
$client->save();
return redirect()->to('/admin/preview/' . $request->account_id . '#users');
}
}

View File

@ -129,6 +129,18 @@ public function createAppTicket(Request $request){
$ticket = new Ticket($request->only('content', 'title','category_id', 'account_id', 'application_id'));
$ticket['status_id'] = 1;
$ticket['client_id'] = $request->account_id;
$ticket['last_sender'] = 'admin';
$ticket->save();
$not_suspended_clients = Client::where('is_suspended', 0)->where('account_id', $request->account_id)->get();
Notification::send($not_suspended_clients, new TicketPosted());
return redirect(route('chat',['ticket_id' => $ticket->id]));
}
public function createBrokerAppTicket(Request $request){
$ticket = new Ticket($request->only('content', 'title','category_id', 'account_id', 'broker_application_id'));
$ticket['status_id'] = 1;
$ticket['client_id'] = $request->account_id;
$ticket['last_sender'] = 'admin';
$ticket->save();
$not_suspended_clients = Client::where('is_suspended', 0)->where('account_id', $request->account_id)->get();
Notification::send($not_suspended_clients, new TicketPosted());

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers\Admin;
use App\Http\Requests\AccountRequest;
use App\Models\Account;
use App\Models\Business;
use App\Models\Company;
use App\Models\Country;
@ -177,5 +178,22 @@ protected function setupUpdateOperation()
$this->setupCreateOperation();
}
public function previewAccountAdmin($id)
{
$account = Account::with(['country','profile','clients','applications', 'broker_applications'])//tormoz etdirer todo fix this
->find($id);
return view('admin.preview',[
'account' => $account
]);
}
public function createAccountClient($account_id)
{
return view('admin.account_client_create',[
'account_id' => $account_id
]);
}
}

View File

@ -92,6 +92,7 @@ function ($value) {
protected function setupListOperation()
{
//$this->crud->addClause('where', 'state', '!=', 'new');
$this->crud->addColumns([
[
@ -133,7 +134,7 @@ protected function setupListOperation()
'label' => trans('app.application.created_at'),
]
]);
// CRUD::addColumn(['name'=>'country_id', 'type'=>'select','label'=> trans('app.account.country'), 'entity' => 'country' ,'model' => 'App\Model\Country','attribute' => 'name']);
$this->crud->addButtonFromModelFunction('line', 'preview_button', 'preview', 'beginning');
}
@ -159,7 +160,6 @@ public function refine($id){
return redirect()->back();
}
public function approveApplication(Request $request){
$application = Application::find($request->id);
$application->state = 'approved';
@ -174,62 +174,10 @@ public function approveApplication(Request $request){
return redirect()->back();
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
// protected function setupCreateOperation()
// {
// CRUD::setValidation(ApplicationRequest::class);
// $this->crud->addFields([
// [ // SelectMultiple = n-n relationship (with pivot table)
// 'label' => trans('app.application.account'),
// 'type' => 'custom_select_account',
// 'name' => 'account_id', // the method that defines the relationship in your Model
// 'entity' => 'account', // the method that defines the relationship in your Model
// 'model' => "App\Models\Account", // foreign key model
// 'attribute_1' => 'name', // foreign key attribute that is shown to user
// 'attribute_2' => 'surname',
// ],
// [
// 'name' => 'state',
// 'label' => trans('app.application.state'),
// 'type' => 'select_from_array',
// 'options' => [
// 'new' => trans('app.application.new'),
// 'applied' => trans('app.application.applied'),
// 'refine' => trans('app.application.refine'),
// 'approved' => trans('app.application.approved'),
// 'archive' => trans('app.application.archived')
// ]
// ]
// ]);
// }
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
// protected function setupUpdateOperation()
// {
// CRUD::setValidation(ApplicationRequest::class);
// $this->crud->addFields([
// [
// 'name' => 'state',
// 'label' => 'State',
// 'type' => 'select_from_array',
// 'options' => [
// 'new' => trans('app.application.new'),
// 'applied' => trans('app.application.applied'),
// 'refine' => trans('app.application.refine'),
// 'approved' => trans('app.application.approved'),
// 'archive' => trans('app.application.archived')
// ]
// ]
// ]);
// }
public function previewApplicationAdmin($id){
$application = Application::with(['account', 'attachments', 'ticket'])->find($id);
return view('admin.application_preview',[
'application' => $application
]);
}
}

View File

@ -3,9 +3,16 @@
namespace App\Http\Controllers\Admin;
use App\Http\Requests\BrokerApplicationRequest;
use App\Models\Account;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use App\Models\BrokerApplication;
use App\Models\Client;
use App\Notifications\ApplicationApproved;
use App\Notifications\ApplicationRefined;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Notification;
/**
* Class BrokerApplicationCrudController
@ -24,7 +31,7 @@ class BrokerApplicationCrudController extends CrudController
*/
public function setup()
{
if(!(backpack_user()->hasPermissionTo('applications'))){
if(!(backpack_user()->hasPermissionTo('broker-applications'))){
$this->crud->denyAccess(['update']);
}
if(!(backpack_user()->hasRole('Super Admin'))){
@ -75,6 +82,17 @@ function ($value) {
$this->crud->addClause('where', 'accepted_by', 'LIKE', '%' . $value . '%');
});
$this->crud->addFilter([
'name' => 'is_local',
'type' => 'dropdown',
'label' => trans('app.broker_application.is_local')
], [
0 => trans('app.no'),
1 => trans('app.yes')
], function ($value) {
$this->crud->addClause('where', 'is_local', $value);
});
}
/**
@ -86,6 +104,7 @@ function ($value) {
protected function setupListOperation()
{
//$this->crud->addClause('where', 'state', '!=', 'new');
$this->crud->addColumns([
[
@ -127,37 +146,50 @@ protected function setupListOperation()
'label' => trans('app.application.created_at'),
]
]);
// CRUD::addColumn(['name'=>'country_id', 'type'=>'select','label'=> trans('app.account.country'), 'entity' => 'country' ,'model' => 'App\Model\Country','attribute' => 'name']);
$this->crud->addButtonFromModelFunction('line', 'preview_button', 'preview', 'beginning');
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(BrokerApplicationRequest::class);
/**
* Fields can be defined using the fluent syntax or array syntax:
* - CRUD::field('price')->type('number');
* - CRUD::addField(['name' => 'price', 'type' => 'number']));
*/
public function accept($id){
$entry = BrokerApplication::findOrfail($id);
$entry->accepted_by = backpack_user()->name;
$entry->state = 'accepted';
$entry->accepted_date = Carbon::now();
$entry->save();
\Alert::add('success', '<strong>Success!</strong><br>Broker application is accepted')->flash();
return redirect()->back();
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
public function refine($id){
$entry = BrokerApplication::findOrfail($id);
$entry->state = 'refine';
$entry->refine_note = request()->get('note');
$entry->save();
$account = Account::with('clients')->find($entry->account_id);
$not_suspended_clients = Client::where('is_suspended', 0)->where('account_id', $account->id)->get();
Notification::send($not_suspended_clients, new ApplicationRefined());
\Alert::add('success', '<strong>Success!</strong><br>Broker application is refined')->flash();
return redirect()->back();
}
public function approveApplication(Request $request){
$application = BrokerApplication::find($request->id);
$application->state = 'approved';
$application->save();
$account = Account::with('clients')->find($application->account_id);
$account->broker_number = $request->broker_number;
$account->broker_expires_at = $request->broker_expires_at;
$account->save();
$not_suspended_clients = Client::where('is_suspended', 0)->where('account_id', $account->id)->get();
Notification::send($not_suspended_clients, new ApplicationApproved());
\Alert::add('success', '<strong>Success!</strong><br>Broker application is approved')->flash();
return redirect()->back();
}
public function previewBrokerApplicationAdmin($id){
$application = BrokerApplication::with(['account', 'broker_attachments', 'ticket'])->find($id);
return view('admin.broker_application_preview',[
'application' => $application
]);
}
}

View File

@ -3,8 +3,10 @@
namespace App\Http\Controllers\Admin;
use App\Http\Requests\ClientRequest;
use App\Models\Client;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use Illuminate\Http\Request;
/**
* Class ClientCrudController
@ -119,4 +121,13 @@ protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
public function createClient(Request $request){
$data = $request->only('firstname', 'lastname', 'email', 'password', 'account_id');
$data['is_verified'] = false;
$data['is_suspended'] = false;
$client = new Client($data);
$client->save();
return redirect()->to('/admin/preview/' . $request->account_id . '#users');
}
}

View File

@ -16,6 +16,7 @@ public function toArray($request)
{
return [
'broker_application_id' => $this->id,
'is_local' => $this->is_local ?? true,
'state' => $this->state,
'accepted_by' => $this->accepted_by,
'accepted_date' => $this->accepted_date,

View File

@ -21,7 +21,7 @@ class BrokerApplication extends Model
// public $timestamps = false;
// protected $guarded = ['id'];
protected $fillable = [
'account_id', 'status','state','accepted_by','approved_by'
'account_id', 'status','state','accepted_by','approved_by', 'ticket_id', 'is_local'
];
// protected $hidden = [];
protected $dates = ['accepted_date','approved_date','created_at','updated_at'];

View File

@ -26,7 +26,8 @@ class Ticket extends Model
'content',
'category_id',
'last_sender',
'application_id'
'application_id',
'broker_application_id'
];
// protected $hidden = [];
// protected $dates = [];

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('broker_applications', function (Blueprint $table) {
$table->foreignId('ticket_id')->nullable()->constrained();
$table->foreignId('is_local')->nullable()->constrained();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('broker_applications', function (Blueprint $table) {
//
});
}
};

View File

@ -77,6 +77,10 @@
'draft' => "Draft",
],
'broker_application' => [
'list_title' => 'Broker applications',
'is_local' => 'Is local?'
],
'dashboard' => [
'title' => 'Dashboard',
'total_tickets' => "Total tickets",

View File

@ -19,14 +19,14 @@
<nav aria-label="breadcrumb" class="d-none d-lg-block">
<ol class="breadcrumb m-0 mb-3">
<li class="breadcrumb-item"><a href="{{backpack_url()}}">@lang('app.dashboard.title')</a></li>
<li class="breadcrumb-item"><a href="{{backpack_url('application')}}">@lang('app.application.list_title')</a></li>
<li class="breadcrumb-item"><a href="{{backpack_url('broker-application')}}">@lang('app.broker_application.list_title')</a></li>
<li class="breadcrumb-item active" aria-current="page">{{ $application->id }}</li>
</ol>
</nav>
<div class="row">
<div class="col-12">
@if ($application->state == 'new')
<form class="form-horizontal" action="{{ route('accepted_application',['id'=>$application->id]) }}"
<form class="form-horizontal" action="{{ route('accepted_broker_application',['id'=>$application->id]) }}"
method="get">
@csrf
<button class="btn btn-primary mb-4" type="submit" data-toggle="modal" data-target="#successModal">
@ -64,7 +64,7 @@ class="bi bi-check2-square" viewBox="0 0 16 16">
<button class="close" type="button" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
</div>
<form class="form-horizontal" action="{{route('refine_application',['id'=>$application->id])}}"
<form class="form-horizontal" action="{{route('refine_broker_application',['id'=>$application->id])}}"
method="post">
@csrf
<div class="modal-body">
@ -98,7 +98,7 @@ class="bi bi-check2-square" viewBox="0 0 16 16">
<button class="close" type="button" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
</div>
<form class="form-horizontal" action="{{route('approve_application',['id'=>$application->id])}}"
<form class="form-horizontal" action="{{route('approve_broker_application',['id'=>$application->id])}}"
method="post">
@csrf
<div class="modal-body">
@ -107,14 +107,14 @@ class="bi bi-check2-square" viewBox="0 0 16 16">
<div class="form-group row">
<label class="col-sm-5 col-form-label" for="input-normal">{{ trans('app.account.legalization_number') }}</label>
<div class="col-sm-6">
<input name="legalization_number" class="form-control" id="input-normal"
<input name="broker_number" class="form-control" id="input-normal"
type="text" name="input-normal" placeholder="Normal">
</div>
</div>
<div class="form-group row">
<label class="col-sm-5 col-form-label" for="input-normal">{{ trans('app.account.expires_at') }}</label>
<div class="col-sm-6">
<input name="expires_at" class="form-control" id="input-normal"
<input name="broker_expires_at" class="form-control" id="input-normal"
type="date" name="input-normal" placeholder="Normal">
</div>
</div>
@ -154,9 +154,9 @@ class="bi bi-ticket-perforated" viewBox="0 0 16 16">
aria-hidden="true">×</span></button>
</div>
<div class="modal-body">
<form method="post" action="{{backpack_url('create-application-ticket')}}" method="POST">
<form method="post" action="{{backpack_url('create-broker-application-ticket')}}" method="POST">
@csrf
<input type="hidden" name="application_id" value="{{ $application->id }}">
<input type="hidden" name="broker_application_id" value="{{ $application->id }}">
<input type="hidden" name="account_id" value={{ $application->account_id }}>
<input type="hidden" name="status_id" value="1">
<input type="hidden" name="category_id" value="2">
@ -209,6 +209,10 @@ class="bi bi-ticket-perforated" viewBox="0 0 16 16">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ trans('app.last_updates.application') }}</h5>
<div class="form-group">
<label for="company"><small>{{ trans('app.broker_application.is_local') }}</small></label>
<h6><strong>{{ $application->is_local == true ? trans('app.yes') : trans('app.no') }}</strong></h6>
</div>
<div class="form-group">
<label for="company"><small>{{ trans('app.ticket.status') }}</small></label>
<h6><strong>{{ trans('app.application.'.$application->state) }}</strong></h6>

View File

@ -37,6 +37,15 @@
<span class="badge badge-pill badge-secondary">{{ count($account->applications) }}</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#broker_applications" role="tab" aria-controls="broker_applications" aria-selected="true">
<svg style="width: 18px" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
</svg>&nbsp;
{{ trans('app.broker_application.list_title') }}
<span class="badge badge-pill badge-secondary">{{ count($account->broker_applications) }}</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#users" role="tab" aria-controls="users" aria-selected="false">
<svg style="width: 18px" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
@ -88,6 +97,46 @@
</tbody>
</table>
</div>
<div class="tab-pane" id="broker_applications" role="tabpanel">
<table class="table table-responsive-sm table-striped mb-0">
<thead class="thead-light">
<tr>
<th>{{ trans('app.ticket.status') }}</th>
<th>{{ trans('app.last_updates.state') }}</th>
<th>{{ trans('app.application.created_at') }}</th>
<th>{{ trans('app.last_updates.actions') }}</th>
</tr>
</thead>
<tbody>
@foreach ($account->broker_applications as $broker_application)
<tr>
<td>
<div>
@if($broker_application->status)
<div>{{ trans('app.last_updates.closed') }}</div>
@else
<div>{{ trans('app.last_updates.open') }}</div>
@endif
</div>
</td>
<td>
{{ $broker_application->state }}
</td>
<td>
<div class="small text-muted"></div><strong>{{ trans('app.company.registration_date') }}: {{ Carbon\Carbon::parse($broker_application->created_at)->format('M d Y') }}</strong>
</td>
<td>
<a class="nav-link p-0" href="{{backpack_url('preview-broker-application')}}/{{ $broker_application->id }}">
<svg style="width: 20px" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" />
</svg>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="tab-pane" id="users" role="tabpanel">
<div class="mb-3">
<a href="{{backpack_url('create-account-client')}}/{{ $account->id }}" class="btn btn-primary">

View File

@ -1,7 +1,10 @@
<?php
use App\Http\Controllers\Admin\AccountCrudController;
use App\Http\Controllers\Admin\ApplicationController;
use App\Http\Controllers\Admin\ApplicationCrudController;
use App\Http\Controllers\Admin\BrokerApplicationCrudController;
use App\Http\Controllers\Admin\ClientCrudController;
use App\Http\Controllers\API\ResourceController;
use App\Http\Controllers\API\TicketController;
use App\Http\Controllers\ExportController;
@ -32,8 +35,6 @@
Route::crud('question', 'QuestionCrudController');
Route::crud('document', 'DocumentCrudController');
Route::crud('documentgroup', 'DocumentgroupCrudController');
// Route::crud('documentgroup-document', 'DocumentgroupDocumentCrudController');
// Route::crud('documentgroup-country', 'DocumentgroupCountryCrudController');
Route::crud('ticket', 'TicketCrudController');
Route::crud('status', 'StatusCrudController');
Route::crud('category', 'CategoryCrudController');
@ -41,17 +42,21 @@
Route::post('/post-message-admin',[TicketController::class,'postMessageAdmin']);
Route::get('/ticket-messages', [TicketController::class, 'getTicketMessages']);
Route::get('/chat', [TicketController::class, 'chat'])->name('chat');
Route::get('/preview/{id}', [ResourceController::class, 'previewAccountAdmin']);
Route::get('/preview-application/{id}',[ResourceController::class, 'previewApplicationAdmin']);
Route::get('/preview-broker-application/{id}',[ResourceController::class, 'previewBrokerApplicationAdmin']);
Route::get('/preview/{id}', [AccountCrudController::class, 'previewAccountAdmin']);
Route::get('/preview-application/{id}',[ApplicationCrudController::class, 'previewApplicationAdmin']);
Route::get('/preview-broker-application/{id}',[BrokerApplicationCrudController::class, 'previewBrokerApplicationAdmin']);
Route::get('/export-account-admin/{id}', [ExportController::class, 'export']);
Route::post('/create-application-ticket', [TicketController::class, 'createAppTicket']);
Route::get('/create-account-client/{id}', [ResourceController::class, 'createAccountClient']);
Route::post('/client/custom-create', [ResourceController::class, 'createClient']);
Route::post('/create-broker-application-ticket', [TicketController::class, 'createBrokerAppTicket']);
Route::get('/create-account-client/{id}', [AccountCrudController::class, 'createAccountClient']);
Route::post('/client/custom-create', [ClientCrudController::class, 'createClient']);
Route::crud('contract', 'ContractCrudController');
Route::get('application/accept/{id}', [ApplicationCrudController::class, 'accept'])->name('accepted_application');
Route::get('broker_application/accept/{id}', [BrokerApplicationCrudController::class, 'accept'])->name('accepted_broker_application');
Route::post('application/refine/{id}', [ApplicationCrudController::class, 'refine'])->name('refine_application');
Route::post('broker_application/refine/{id}', [BrokerApplicationCrudController::class, 'refine'])->name('refine_broker_application');
Route::post('application/approve/{id}', [ApplicationCrudController::class, 'approveApplication'])->name('approve_application');
Route::post('broker_application/approve/{id}', [BrokerApplicationCrudController::class, 'approveApplication'])->name('approve_broker_application');
Route::post('account/fetch', [TicketController::class, 'accountForTicketsAjax']);
Route::crud('department', 'DepartmentCrudController');
Route::crud('resolution', 'ResolutionCrudController');