Update export di module senior officer

This commit is contained in:
majid 2024-09-11 14:39:47 +07:00
parent e7d69c4e83
commit eac8e21b2e
14 changed files with 415 additions and 48 deletions

View File

@ -0,0 +1,46 @@
<?php
namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Modules\Lpj\Models\JenisPenilaian;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class JenisPenilaianExport implements WithColumnFormatting, WithHeadings, FromCollection, withMapping
{
public function collection()
{
return JenisPenilaian::all();
}
public function map($row): array
{
return [
$row->id,
$row->code,
$row->name,
$row->created_at
];
}
public function headings(): array
{
return [
'ID',
'Code',
'Jenis Penilaian',
'Created At'
];
}
public function columnFormats(): array
{
return [
'A' => NumberFormat::FORMAT_NUMBER,
'D' => NumberFormat::FORMAT_DATE_DATETIME
];
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Modules\Lpj\Models\JenisPenilaian;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\Teams;
class TeamPenilaianExport implements WithColumnFormatting, WithHeadings, FromCollection, withMapping
{
public function collection()
{
return Teams::select(
'teams.id as id',
'teams.name as team_name',
'regions.name as region_name',
DB::raw('STRING_AGG(users.name, \', \') as team_group')
)
->join('regions', 'teams.regions_id', '=', 'regions.id')
->leftJoin('teams_users', 'teams.id', '=', 'teams_users.teams_id')
->leftJoin('users', 'teams_users.user_id', '=', 'users.id')
->groupBy('teams.id', 'teams.name', 'regions.name')
->get();
}
public function map($row): array
{
return [
$row->team_name,
$row->region_name,
$row->team_group,
];
}
public function headings(): array
{
return [
'Name',
'Region',
'Anggota Team',
];
}
public function columnFormats(): array
{
return [
'A' => NumberFormat::FORMAT_TEXT,
'B' => NumberFormat::FORMAT_TEXT,
'C' => NumberFormat::FORMAT_TEXT,
];
}
}

View File

@ -6,15 +6,12 @@ use Exception;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Modules\Lpj\Models\JenisPenilaian;
use Modules\Lpj\Http\Requests\JenisPenilaianRequest;
use Modules\Lpj\Exports\JenisPenilaianExport;
use Maatwebsite\Excel\Facades\Excel;
class JenisPenilaianController extends Controller
{
public $user;
/**
* Display a listing of the resource.
@ -62,7 +59,6 @@ class JenisPenilaianController extends Controller
public function update(JenisPenilaianRequest $request, $id)
{
$validate = $request->validate();
// dump($validate);
@ -96,8 +92,6 @@ class JenisPenilaianController extends Controller
public function dataForDatatables(Request $request)
{
if (is_null($this->user) || !$this->user->can('jenis_penilaian.view')) {
//abort(403, 'Sorry! You are not allowed to view users.');
}
@ -112,7 +106,7 @@ class JenisPenilaianController extends Controller
});
}
if($request->has('sortOrder') && !empty($request->get('sortOrder'))){
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
@ -153,4 +147,10 @@ class JenisPenilaianController extends Controller
'data' => $data
]);
}
public function export()
{
return Excel::download(new JenisPenilaianExport(), 'jenis-penilaian.xlsx');
}
}

View File

@ -0,0 +1,67 @@
<?php
namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PenilaianController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view('lpj::penilaian.index');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('lpj::create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): RedirectResponse
{
//
}
/**
* Show the specified resource.
*/
public function show($id)
{
return view('lpj::show');
}
/**
* Show the form for editing the specified resource.
*/
public function edit($id)
{
return view('lpj::edit');
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id): RedirectResponse
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy($id)
{
//
}
}

View File

@ -12,6 +12,8 @@ use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\TeamsUsers;
use Modules\Lpj\Http\Requests\TeamsRequest;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Exports\TeamPenilaianExport;
use Maatwebsite\Excel\Facades\Excel;
class TeamsController extends Controller
{
@ -30,8 +32,13 @@ class TeamsController extends Controller
public function create()
{
$region = Regions::all();
$user = User::all();
// cek region apakah sudah ada di tabel teams
$regionTeam = Teams::pluck('regions_id')->toArray();
$region = Regions::whereNotIn('id', $regionTeam)->get();
// cek user apakah sudah ada di tabel teams_users
$userTeam = TeamsUsers::pluck('user_id')->toArray();
$user = User::whereNotIn('id', $userTeam)->get();
return view('lpj::teams.form', compact('region', 'user'));
}
@ -86,8 +93,13 @@ class TeamsController extends Controller
public function edit($id)
{
$teams = Teams::find($id);
$region = Regions::all();
$user = User::all();
$usedUsers = TeamsUsers::where('teams_id', '!=', $id)->pluck('user_id')->toArray();
$user = User::whereNotIn('id', $usedUsers)->get();
// Ambil user yang sudah ada di tim ini
$selectedUsers = $teams->teamsUsers->pluck('user_id')->toArray();
return view('lpj::teams.form', compact('teams', 'region', 'user', 'selectedUsers'));
@ -149,15 +161,11 @@ class TeamsController extends Controller
DB::commit();
return redirect()
->route('basicdata.teams.index')
->with('success', 'Team has been deleted successfully.');
echo json_encode(['success' => true, 'message' => 'Team has been deleted successfully']);
} catch (Exception $e) {
DB::rollBack();
return redirect()
->route('basicdata.teams.index')
->with('error', 'Failed to delete team. ');
echo json_encode(['success' => false, 'message' => 'Failed to delete Team']);
}
}
@ -236,6 +244,10 @@ class TeamsController extends Controller
}
public function export()
{
return Excel::download(new TeamPenilaianExport, 'team-penilai.xlsx');
}
}

View File

@ -22,8 +22,7 @@ class JenisPenilaianRequest extends FormRequest
if ($this->method() == 'PUT') {
$rules['code'] = 'required|string|max:3|unique:jenis_penilaian,code,' . $this->route('id');
$rules['code'] = 'required|string|max:3|unique:jenis_penilaian,code,' . $this->id;
} else {
$rules['code'] = 'required|string|max:3|unique:jenis_penilaian,code';

View File

@ -0,0 +1,26 @@
<?php
namespace Modules\Lpj\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PenilaianRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*/
public function rules(): array
{
return [
//
];
}
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
}

View File

@ -201,7 +201,15 @@
},
{
"title": "Jenis Penilaian",
"path": "basicdata.jenispenilaian",
"path": "basicdata.jenis-penilaian",
"classes": "",
"attributes": [],
"permission": "",
"roles": []
},
{
"title": "Penilaian Jaminan",
"path": "basicdata.penilaian",
"classes": "",
"attributes": [],
"permission": "",

View File

@ -8,7 +8,7 @@
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<form
action="{{ isset($jenisPenilaian->id) ? route('basicdata.jenispenilaian.update', $jenisPenilaian->id) : route('basicdata.jenispenilaian.store') }}"
action="{{ isset($jenisPenilaian->id) ? route('basicdata.jenis-penilaian.update', $jenisPenilaian->id) : route('basicdata.jenis-penilaian.store') }}"
method="POST">
@if (isset($jenisPenilaian->id))
@ -23,7 +23,7 @@
{{ isset($jenisPenilaian->id) ? 'Edit' : 'Tambah' }} jenis penilaian
</h3>
<div class="flex items-center gap-2">
<a href="{{ route('basicdata.jenispenilaian.index') }}" class="btn btn-xs btn-info"><i
<a href="{{ route('basicdata.jenis-penilaian.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
</div>
</div>

View File

@ -1,14 +1,14 @@
@extends('layouts.main')
@section('breadcrumbs')
{{ Breadcrumbs::render('basicdata.jenispenilaian') }}
{{ Breadcrumbs::render('basicdata.jenis-penilaian') }}
@endsection
@section('content')
<div class="grid">
<div class="card card-grid min-w-full" data-datatable="false" data-datatable-page-size="5"
data-datatable-state-save="false" id="jenis-penilaian-table"
data-api-url="{{ route('basicdata.jenispenilaian.datatables') }}">
data-api-url="{{ route('basicdata.jenis-penilaian.datatables') }}">
<div class="card-header py-5 flex-wrap">
<h3 class="card-title">
Daftar Jenis penilaian
@ -16,14 +16,14 @@
<div class="flex flex-wrap gap-2 lg:gap-5">
<div class="flex">
<label class="input input-sm"> <i class="ki-filled ki-magnifier"> </i>
<input placeholder="Search jenispenilaian" id="search" type="text" value="">
<input placeholder="Search jenis penilaian" id="search" type="text" value="">
</label>
</div>
<div class="flex flex-wrap gap-2.5">
<div class="h-[24px] border border-r-gray-200"></div>
<a class="btn btn-sm btn-light" href="{{ route('basicdata.jenispenilaian.export') }}"> Export to
<a class="btn btn-sm btn-light" href="{{ route('basicdata.jenis-penilaian.export') }}"> Export to
Excel </a>
<a class="btn btn-sm btn-primary" href="{{ route('basicdata.jenispenilaian.create') }}"> Tambah
<a class="btn btn-sm btn-primary" href="{{ route('basicdata.jenis-penilaian.create') }}"> Tambah
Jenis penilaian </a>
</div>
</div>
@ -91,7 +91,7 @@
}
});
$.ajax(`basic-data/jenispenilaian/${data}`, {
$.ajax(`basic-data/jenis-penilaian/${data}`, {
type: 'DELETE'
}).then((response) => {
swal.fire('Deleted!', 'User has been deleted.', 'success').then(() => {
@ -135,7 +135,7 @@
title: 'Status',
render: (item, data) => {
return `<div class="flex flex-nowrap justify-center">
<a class="btn btn-sm btn-icon btn-clear btn-info" href="basic-data/jenispenilaian/${data.id}/edit">
<a class="btn btn-sm btn-icon btn-clear btn-info" href="basic-data/jenis-penilaian/${data.id}/edit">
<i class="ki-outline ki-notepad-edit"></i>
</a>
<a onclick="deleteData(${data.id})" class="delete btn btn-sm btn-icon btn-clear btn-danger">

View File

@ -0,0 +1,128 @@
@extends('layouts.main')
@section('breadcrumbs')
{{-- {{ Breadcrumbs::render('penilaian') }} --}}
@endsection
@section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card pb-2.5">
<div class="card-header" id="basic_settings">
<h3 class="card-title">
{{ isset($debitur->id) ? 'Edit' : 'Tambah' }} Debitur
</h3>
<div class="flex items-center gap-2">
@if (isset($debitur->id))
<a class="btn btn-sm btn-primary" href="{{ route('permohonan.create.debitur', $debitur->id) }}"> Buat
Permohonan </a>
@endif
<a href="{{ route('debitur.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i>
Back</a>
</div>
</div>
<div class="card-body">
<form action="" method="POST" class="grid gap-5">
{{-- @if (isset($debitur->id))
@method('PUT')
@endif
@csrf --}}
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Cabang
</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('branch_id') border-danger bg-danger-light @enderror"
name="branch_id" id="branch_id">
<option value="">Pilih Cabang</option>
</select>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
CIF
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('cif') border-danger bg-danger-light @enderror" type="number"
name="cif" value="">
@error('cif')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nomor Rekening
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('nomor_rekening') border-danger bg-danger-light @enderror"
type="number" name="nomor_rekening" value=""
@error('nomor_rekening')
<em class="alert text-danger text-sm"></em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nama Debitur
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('name') border-danger bg-danger-light @enderror" type="text"
name="name" value="">
@error('name')
<em class="alert text-danger text-sm"></em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
NPWP
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('npwp') border-danger bg-danger-light @enderror" type="number"
name="npwp" value="{{ $debitur->npwp ?? '' }}">
@error('npwp')
<em class="alert text-danger text-sm"></em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Email
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('email') border-danger bg-danger-light @enderror" type="email"
name="email" value="{{ $debitur->email ?? '' }}">
@error('email')
<em class="alert text-danger text-sm"></em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
No Handphone
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('phone') border-danger bg-danger-light @enderror" type="number"
name="phone" value="">
@error('phone')
<em class="alert text-danger text-sm"></em>
@enderror
</div>
</div>
<div class="flex justify-end">
<button type="submit" class="btn btn-primary">
Save
</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View File

@ -78,7 +78,7 @@
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Team Group</label>
<label class="form-label max-w-56">Users</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full border-danger bg-danger-light select2" name="user[]"
multiple="multiple">

View File

@ -297,16 +297,21 @@
});
Breadcrumbs::for('basicdata.jenispenilaian', function (BreadcrumbTrail $trail) {
Breadcrumbs::for('basicdata.jenis-penilaian', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata');
$trail->push('Jenis Penilaian', route('basicdata.jenispenilaian.index'));
$trail->push('Jenis Penilaian', route('basicdata.jenis-penilaian.index'));
});
Breadcrumbs::for('basicdata.jenispenilaian.create', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata.jenispenilaian');
$trail->push('Tambah Jenis Penilaian', route('basicdata.jenispenilaian.create'));
Breadcrumbs::for('basicdata.jenis-penilaian.create', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata.jenis-penilaian');
$trail->push('Tambah Jenis Penilaian', route('basicdata.jenis-penilaian.create'));
});
Breadcrumbs::for('basicdata.jenispenilaian.edit', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata.jenispenilaian');
Breadcrumbs::for('basicdata.jenis-penilaian.edit', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata.jenis-penilaian');
$trail->push('Edit Jenis Penilaian');
});
Breadcrumbs::for('basicdata.penilaian', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata');
$trail->push('Jenis Penilaian', route('basicdata.penilaian.index'));
});

View File

@ -21,6 +21,7 @@ use Modules\Lpj\Http\Controllers\TujuanPenilaianController;
use Modules\Lpj\Http\Controllers\RegionController;
use Modules\Lpj\Http\Controllers\TeamsController;
use Modules\Lpj\Http\Controllers\JenisPenilaianController;
use Modules\Lpj\Http\Controllers\PenilaianController;
/*
|--------------------------------------------------------------------------
@ -205,21 +206,39 @@ Route::middleware(['auth'])->group(function () {
],
]);
Route::name('jenispenilaian.')->prefix('jenispenilaian')->group(function () {
Route::name('jenis-penilaian.')->prefix('jenis-penilaian')->group(function () {
Route::get('restore/{id}', [JenisPenilaianController::class, 'restore'])->name('restore');
Route::get('datatables', [JenisPenilaianController::class, 'dataForDatatables'])->name('datatables');
Route::get('export', [JenisPenilaianController::class, 'export'])->name('export');
});
Route::resource('jenispenilaian', JenisPenilaianController::class, [
Route::resource('jenis-penilaian', JenisPenilaianController::class, [
'names' => [
'index' => 'jenispenilaian.index',
'show' => 'jenispenilaian.show',
'create' => 'jenispenilaian.create',
'store' => 'jenispenilaian.store',
'edit' => 'jenispenilaian.edit',
'update' => 'jenispenilaian.update',
'destroy' => 'jenispenilaian.destroy',
'index' => 'jenis-penilaian.index',
'show' => 'jenis-penilaian.show',
'create' => 'jenis-penilaian.create',
'store' => 'jenis-penilaian.store',
'edit' => 'jenis-penilaian.edit',
'update' => 'jenis-penilaian.update',
'destroy' => 'jenis-penilaian.destroy',
],
]);
Route::name('penilaian.')->prefix('penilaian')->group(function () {
Route::get('restore/{id}', [PenilaianController::class, 'restore'])->name('restore');
Route::get('datatables', [PenilaianController::class, 'dataForDatatables'])->name('datatables');
Route::get('export', [PenilaianController::class, 'export'])->name('export');
});
Route::resource('penilaian', PenilaianController::class, [
'names' => [
'index' => 'penilaian.index',
'show' => 'penilaian.show',
'create' => 'penilaian.create',
'store' => 'penilaian.store',
'edit' => 'penilaian.edit',
'update' => 'penilaian.update',
'destroy' => 'penilaian.destroy',
],
]);