Commit e25c7f10 authored by snuxxx's avatar snuxxx
Browse files

Deskripsi perubahan

parents
No related merge requests found
Showing with 1315 additions and 0 deletions
+1315 -0
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=http://localhost
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
CACHE_STORE=database
CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
* text=auto eol=lf
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
.env
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.nova
/.vscode
/.zed
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[WebReinvent](https://webreinvent.com/)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Jump24](https://jump24.co.uk)**
- **[Redberry](https://redberry.international/laravel/)**
- **[Active Logic](https://activelogic.com)**
- **[byte5](https://byte5.de)**
- **[OP.GG](https://op.gg)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
<?php
namespace App\Exports;
use App\Models\Employee;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class EmployeeExport implements FromCollection, WithHeadings
{
/**
* Mengambil koleksi data dari Employee dan SalaryComponent
*
* @return \Illuminate\Support\Collection
*/
public function collection()
{
$employees = Employee::with('salaryComponent')->get();
// Cek jika data kosong
if ($employees->isEmpty()) {
throw new \Exception('Tidak ada data karyawan untuk diekspor.');
}
return $employees->map(function ($employee) {
return [
$employee->kode_perusahaan,
$employee->kode_divisi,
$employee->kode_karyawan,
$employee->nama_lengkap,
$employee->email,
$employee->no_telepon,
$employee->jabatan,
$employee->divisi,
$employee->tanggal_masuk,
$employee->status,
$employee->salaryComponent->gaji_pokok ?? 0,
$employee->salaryComponent->tunjangan ?? 0,
$employee->salaryComponent->potongan ?? 0,
];
});
}
/**
* Menyediakan Heading untuk setiap kolom di Excel
*
* @return array
*/
public function headings(): array
{
return [
'Kode Perusahaan',
'Kode Divisi',
'Kode Karyawan',
'Nama Lengkap',
'Email',
'No Telepon',
'Jabatan',
'Divisi',
'Tanggal Masuk',
'Status',
'Gaji Pokok',
'Tunjangan',
'Potongan',
];
}
}
<?php
namespace App\Exports;
use App\Models\LeaveRequest;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class LeaveRequestsExport implements FromCollection, WithHeadings
{
/**
* Mengambil koleksi data dari leave_request dan SalaryComponent
*
* @return \Illuminate\Support\Collection
*/
public function collection()
{
// Ambil data leave requests dengan relasi leaveBalance dan employee
$leave_requests = LeaveRequest::with('leaveBalance', 'employee')->get();
// Cek jika data kosong
if ($leave_requests->isEmpty()) {
throw new \Exception('Tidak ada data cuti karyawan untuk diekspor.');
}
// Map data leave_requests ke format array untuk Excel
return $leave_requests->map(function ($leave_request, $index) {
return [
$index + 1, // Nomor urut
$leave_request->employee->nama_lengkap, // Mengakses relasi 'employee'
$leave_request->employee->email,
$leave_request->employee->no_telepon,
$leave_request->employee->jabatan,
$leave_request->leaveBalance->total_cuti ?? 0, // Mengakses relasi 'leaveBalance'
$leave_request->leaveBalance->sisa_cuti ?? 0,
$leave_request->leaveBalance->cuti_tahunan ?? 0,
$leave_request->leaveBalance->cuti_darurat ?? 0,
];
});
}
/**
* Menyediakan Heading untuk setiap kolom di Excel
*
* @return array
*/
public function headings(): array
{
return [
'No',
'Nama Lengkap',
'Email',
'No Telepon',
'Jabatan',
'Total Cuti',
'Sisa Cuti',
'Cuti Tahunan',
'Cuti Darurat',
];
}
}
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
class AuthenticatedSessionController extends Controller
{
/**
* Handle an incoming authentication request.
*/
public function store(LoginRequest $request): Response
{
$request->authenticate();
$request->session()->regenerate();
return response()->noContent();
}
/**
* Destroy an authenticated session.
*/
public function destroy(Request $request): Response
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return response()->noContent();
}
}
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class EmailVerificationNotificationController extends Controller
{
/**
* Send a new email verification notification.
*/
public function store(Request $request): JsonResponse|RedirectResponse
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended('/dashboard');
}
$request->user()->sendEmailVerificationNotification();
return response()->json(['status' => 'verification-link-sent']);
}
}
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
use Illuminate\Validation\ValidationException;
class NewPasswordController extends Controller
{
/**
* Handle an incoming new password request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'token' => ['required'],
'email' => ['required', 'email'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Here we will attempt to reset the user's password. If it is successful we
// will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response.
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user) use ($request) {
$user->forceFill([
'password' => Hash::make($request->string('password')),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
if ($status != Password::PASSWORD_RESET) {
throw ValidationException::withMessages([
'email' => [__($status)],
]);
}
return response()->json(['status' => __($status)]);
}
}
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Illuminate\Validation\ValidationException;
class PasswordResetLinkController extends Controller
{
/**
* Handle an incoming password reset link request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'email' => ['required', 'email'],
]);
// We will send the password reset link to this user. Once we have attempted
// to send the link, we will examine the response then see the message we
// need to show to the user. Finally, we'll send out a proper response.
$status = Password::sendResetLink(
$request->only('email')
);
if ($status != Password::RESET_LINK_SENT) {
throw ValidationException::withMessages([
'email' => [__($status)],
]);
}
return response()->json(['status' => __($status)]);
}
}
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
class RegisteredUserController extends Controller
{
/**
* Handle an incoming registration request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): Response
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->string('password')),
]);
event(new Registered($user));
Auth::login($user);
return response()->noContent();
}
}
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\RedirectResponse;
class VerifyEmailController extends Controller
{
/**
* Mark the authenticated user's email address as verified.
*/
public function __invoke(EmailVerificationRequest $request): RedirectResponse
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(
config('app.frontend_url').'/dashboard?verified=1'
);
}
if ($request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect()->intended(
config('app.frontend_url').'/dashboard?verified=1'
);
}
}
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
<?php
namespace App\Http\Controllers;
use App\Models\Employee;
use App\Models\SalaryComponent;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\EmployeeImport;
use App\Exports\EmployeeExport;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use App\Models\LeaveBalance;
class EmployeeController extends Controller
{
function formatRupiah($number)
{
return 'Rp. ' . number_format($number, 0, ',', '.');
}
public function index()
{
try {
$employees = Employee::with('salaryComponent')->get()->map(function ($employee) {
$salaryComponent = $employee->salaryComponent;
return [
'id' => $employee->id,
'Nama Lengkap' => $employee->nama_lengkap,
'Kode Karyawan' => $employee->kode_karyawan,
'Email' => $employee->email,
'No Telepon' => $employee->no_telepon,
'Tanggal Masuk' => $employee->tanggal_masuk,
'Gaji Pokok' => $this->formatRupiah($salaryComponent->gaji_pokok),
'Tunjangan' => $this->formatRupiah($salaryComponent->tunjangan),
'Potongan' => $this->formatRupiah($salaryComponent->potongan),
];
});
return response()->json([
'message' => 'Berikut adalah data semua Karyawan',
'data' => $employees,
], 200);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi kesalahan saat mengambil data karyawan.',
'error' => $e->getMessage(),
], 500);
}
}
public function store(Request $request)
{
// Validasi input dari request
$request->validate([
// Validasi untuk data karyawan
'kode_perusahaan' => 'required',
'kode_divisi' => 'required',
'nama_lengkap' => 'required',
'email' => 'required|email|unique:employees',
'tanggal_masuk' => 'required|date',
// Validasi untuk komponen gaji
'gaji_pokok' => 'required|numeric|min:0',
'tunjangan' => 'nullable|numeric|min:0',
'potongan' => 'nullable|numeric|min:0',
]);
try {
// Generate kode karyawan unik
$kodeKaryawan = Employee::generateEmployeeCode($request->kode_perusahaan, $request->kode_divisi);
// Buat data karyawan
$employee = Employee::create(array_merge($request->all(), ['kode_karyawan' => $kodeKaryawan]));
// Tambahkan komponen gaji
$salaryComponent = SalaryComponent::create([
'employee_id' => $employee->id,
'gaji_pokok' => $request->gaji_pokok,
'tunjangan' => $request->tunjangan ?? 0,
'potongan' => $request->potongan ?? 0,
]);
// Tambahkan data LeaveBalance untuk karyawan yang baru
LeaveBalance::create([
'employee_id' => $employee->id,
'total_cuti' => 0, // Total cuti
'sisa_cuti' => 12, // Sisa cuti
'cuti_tahunan' => 0, // Cuti tahunan
'cuti_darurat' => 0, // Cuti darurat
]);
// Respon jika berhasil
return response()->json([
'message' => 'Karyawan berhasil ditambahkan.',
'data' => [
'employee' => $employee,
'gaji_pokok' => $this->formatRupiah($salaryComponent->gaji_pokok),
'tunjangan' => $this->formatRupiah($salaryComponent->tunjangan),
'potongan' => $this->formatRupiah($salaryComponent->potongan),
]
], 201);
} catch (\Exception $e) {
// Respon jika terjadi kesalahan
return response()->json([
'message' => 'Karyawan gagal ditambahkan.',
'error' => $e->getMessage()
], 500);
}
}
public function show($id)
{
$employee = Employee::with('salaryComponent')->find($id);
if (!$employee) {
return response()->json(['message' => 'Employee not found'], 404);
}
$salaryComponent = $employee->salaryComponent;
return response()->json([
'id' => $employee->id,
'Nama Lengkap' => $employee->nama_lengkap,
'Kode Karyawan' => $employee->kode_karyawan,
'Email' => $employee->email,
'No Telepon' => $employee->no_telepon,
'Tanggal Masuk' => $employee->tanggal_masuk,
'Gaji Pokok' => $this->formatRupiah($salaryComponent->gaji_pokok),
'Tunjangan' => $this->formatRupiah($salaryComponent->tunjangan),
'Potongan' => $this->formatRupiah($salaryComponent->potongan),
]);
}
public function edit(Employee $employee)
{
return view('employees.edit', compact('employee'));
}
public function update(Request $request, Employee $employee)
{
$request->validate([
'kode_perusahaan' => 'required',
'kode_divisi' => 'required',
'nama_lengkap' => 'required',
'email' => 'required|email|unique:employees,email,' . $employee->id,
'tanggal_masuk' => 'required|date',
'gaji_pokok' => 'required|numeric|min:0',
'tunjangan' => 'nullable|numeric|min:0',
'potongan' => 'nullable|numeric|min:0',
]);
try {
$employee->update($request->all());
$salaryComponent = $employee->salaryComponent;
$salaryComponent->update($request->only(['gaji_pokok', 'tunjangan', 'potongan']));
return response()->json([
'message' => 'Karyawan berhasil diperbarui.',
'data' => [
'employee' => $employee,
]
], 200);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi kesalahan saat memperbarui karyawan.',
'error' => $e->getMessage()
], 500);
}
}
public function destroy(Employee $employee)
{
try {
$employee->delete();
return response()->json([
'message' => 'Karyawan berhasil dihapus.'
], 200);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi kesalahan saat menghapus karyawan.',
'error' => $e->getMessage()
], 500);
}
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|mimes:xlsx,xls', // Pastikan ekstensi file yang valid
]);
try {
// Ambil file yang di-upload
$file = $request->file('file');
// Tentukan format pembaca (reader type)
Excel::import(new EmployeeImport, $file->getRealPath());
return response()->json([
'message' => 'Data karyawan berhasil diimpor.',
], 200);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi kesalahan saat mengimpor file.',
'error' => $e->getMessage(),
], 500);
}
}
public function export()
{
try {
// Menggunakan EmployeeExport untuk mendownload file Excel
return Excel::download(new EmployeeExport, 'employees.xlsx');
} catch (\Exception $e) {
return response()->json([
'message' => $e->getMessage(),
], 404);
}
}
}
<?php
namespace App\Http\Controllers;
use App\Models\LeaveRequest;
use App\Models\LeaveBalance;
use App\Models\LeaveDocument;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Illuminate\Support\Facades\Notification;
use App\Notifications\UrgentLeaveRequestNotification;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\LeaveRequestsExport;
use App\Models\User;
use Barryvdh\DomPDF\Facade\Pdf;
use PhpParser\Node\Stmt\Switch_;
class LeaveRequestController extends Controller
{
// Mengajukan cuti
public function store(Request $request)
{
// Validasi inputan
$request->validate([
'employee_id' => 'required|exists:employees,id',
'jumlah_cuti' => 'required|numeric|min:1',
'jenis_pengajuan' => 'required|in:Cuti Tahunan,Cuti Darurat',
'tanggal_mulai' => 'required|date',
'tanggal_selesai' => 'required|date|after_or_equal:tanggal_mulai', // pastikan tanggal selesai >= tanggal mulai
]);
try {
// Cari data saldo cuti karyawan
$leaveBalance = LeaveBalance::where('employee_id', $request->employee_id)->first();
if (!$leaveBalance) {
return response()->json(['message' => 'Data saldo cuti tidak ditemukan.'], 404);
}
// Cek apakah saldo cuti cukup
$jumlahCuti = $request->jumlah_cuti;
if (!$leaveBalance->useLeave($jumlahCuti)) {
return response()->json(['message' => 'Saldo cuti tidak mencukupi.'], 400);
}
// Membuat permintaan cuti
$leaveRequest = LeaveRequest::create([
'employee_id' => $request->employee_id,
'jumlah_cuti' => $jumlahCuti,
'jenis_pengajuan' => $request->jenis_pengajuan, // Menyimpan jenis pengajuan
'tanggal_mulai' => $request->tanggal_mulai, // Menyimpan tanggal mulai
'tanggal_selesai' => $request->tanggal_selesai, // Menyimpan tanggal selesai
'status' => 'Menunggu', // Status default
'alasan' => $request->alasan ?? null, // Alasan jika ada
]);
// Kirim respons sukses
return response()->json([
'message' => 'Permintaan cuti berhasil diajukan.',
'data' => $leaveRequest
], 201);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi kesalahan saat mengajukan cuti.',
'error' => $e->getMessage(),
], 500);
}
}
// Menyetujui atau menolak cuti
public function update(Request $request, $id)
{
// Validasi input status
$validated = $request->validate([
'status' => 'required|in:Menunggu,Disetujui,Ditolak,Persetujuan Sementara',
]);
// Cari data pengajuan cuti berdasarkan ID
$leaveRequest = LeaveRequest::findOrFail($id);
$jenisPengajuan = $leaveRequest->jenis_pengajuan;
// Update status pengajuan cuti
$leaveRequest->status = $request->status;
// Jika status disetujui dan jenis pengajuan adalah Cuti Tahunan, baru kurangi jatah cuti
if ($request->status === 'Disetujui') {
// Menghitung durasi cuti dalam hari
$duration = Carbon::parse($leaveRequest->tanggal_mulai)->diffInDays(Carbon::parse($leaveRequest->tanggal_selesai)) + 1;
// Ambil saldo cuti karyawan
$leaveBalance = LeaveBalance::where('employee_id', $leaveRequest->employee_id)->first();
// Cek apakah saldo cuti cukup
if ($leaveBalance && $leaveBalance->sisa_cuti >= $duration) {
// Kurangi sisa cuti jika cukup
$leaveBalance->sisa_cuti -= $duration;
$leaveBalance->total_cuti += $duration; // Tambah total cuti sesuai durasi
$leaveBalance->save();
} else {
return response()->json(['message' => 'Saldo cuti tidak mencukupi.'], 400);
}
if ($jenisPengajuan === 'Cuti Tahunan') {
// Tambahkan cuti tahunan
$leaveBalance->cuti_tahunan += $duration;
$leaveBalance->save();
}
// Logika jika jenis pengajuan adalah "Cuti Darurat"
if ($jenisPengajuan === 'Cuti Darurat') {
// Tambahkan cuti darurat
$leaveBalance->cuti_darurat += $duration;
$leaveBalance->save();
}
}
// Simpan perubahan status pengajuan
$leaveRequest->save();
return response()->json(['message' => 'Status pengajuan berhasil diperbarui.']);
}
public function destroy($id)
{
try {
// Temukan data berdasarkan ID
$leaveRequest = LeaveRequest::findOrFail($id);
// Hapus data
$leaveRequest->delete();
// Berikan respon sukses
return response()->json([
'message' => 'Data berhasil dihapus',
], 200);
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
// Data tidak ditemukan
return response()->json([
'message' => 'Data tidak ditemukan',
], 404);
} catch (\Exception $e) {
// Tangani error lain
return response()->json([
'message' => 'Terjadi kesalahan saat menghapus data',
'error' => $e->getMessage(),
], 500);
}
}
public function index()
{
// Mengambil semua data pengajuan cuti dan relasi karyawan
$leaveRequests = LeaveRequest::with('employee')->get(); // Pastikan ada relasi employee
return response()->json([
'success' => true,
'data' => $leaveRequests,
], 200);
}
public function show($id)
{
// Cari data berdasarkan ID
$leaveRequest = LeaveRequest::with('employee')->find($id);
// Jika data tidak ditemukan, kembalikan error
if (!$leaveRequest) {
return response()->json([
'success' => false,
'message' => 'Data pengajuan cuti tidak ditemukan.',
], 404);
}
// Kembalikan data
return response()->json([
'success' => true,
'data' => $leaveRequest,
], 200);
}
public function exportToExcel()
{
return Excel::download(new LeaveRequestsExport, 'leave_requests.xlsx');
}
public function exportToPDF()
{
$leaveRequests = LeaveRequest::all();
$pdf = Pdf::loadView('leave_requests.pdf', compact('leaveRequests'));
return $pdf->download('leave_requests.pdf');
}
}
<?php
namespace App\Http\Controllers;
use App\Models\Shift;
use Illuminate\Http\Request;
class ShiftController extends Controller
{
// Menampilkan semua shift
public function index()
{
return response()->json(Shift::with('employee')->get());
}
// Membuat shift baru
public function store(Request $request)
{
$request->validate([
'employee_id' => 'required|exists:employees,id',
'tanggal_shift' => 'required|date',
'jam_masuk' => 'required|date_format:H:i:s',
'jam_keluar' => 'required|date_format:H:i:s',
]);
$shift = Shift::create($request->all());
return response()->json([
'message' => 'Shift created successfully',
'data' => $shift,
], 201);
}
public function show($id)
{
// Cari shift berdasarkan ID dan sertakan data employee
$shift = Shift::with('employee')->find($id);
// Jika data tidak ditemukan
if (!$shift) {
return response()->json(['message' => 'Shift not found'], 404);
}
// Jika ditemukan, kembalikan data
return response()->json($shift);
}
// Memperbarui shift
public function update(Request $request, $id)
{
$shift = Shift::findOrFail($id);
$request->validate([
'employee_id' => 'exists:employees,id',
'tanggal_shift' => 'date',
'jam_masuk' => 'date_format:H:i:s',
'jam_keluar' => 'date_format:H:i:s',
]);
$shift->update($request->all());
return response()->json([
'message' => 'Shift updated successfully',
'data' => $shift,
]);
}
// Menghapus shift
public function destroy($id)
{
$shift = Shift::findOrFail($id);
$shift->delete();
return response()->json(['message' => 'Shift deleted successfully']);
}
}
<?php
namespace App\Http\Controllers;
use App\Models\ShiftRequest;
use App\Models\Employee;
use App\Models\Shift;
use Illuminate\Http\Request;
use App\Notifications\ShiftRequestNotification;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Facades\Log;
use App\Models\LeaveRequest;
class ShiftRequestController extends Controller
{
// Mengajukan permohonan pertukaran shift
public function store(Request $request)
{
// Validasi input
$request->validate([
'shift_id' => 'required|exists:shifts,id',
'requester_id' => 'required|exists:employees,id',
'requested_to_id' => 'required|exists:employees,id',
'alasan' => 'nullable|string',
]);
// Mendapatkan data karyawan yang mengajukan permintaan dan yang diminta
$requester = Employee::findOrFail($request->requester_id);
$requestedTo = Employee::findOrFail($request->requested_to_id);
// Validasi divisi dan jabatan yang sama
if ($requester->division_id !== $requestedTo->division_id || $requester->position_id !== $requestedTo->position_id) {
return response()->json(['message' => 'Karyawan harus memiliki divisi dan jabatan yang sama untuk melakukan pertukaran shift.'], 400);
}
// Buat permintaan pertukaran shift
$shiftRequest = ShiftRequest::create([
'shift_id' => $request->shift_id,
'requester_id' => $request->requester_id,
'requested_to_id' => $request->requested_to_id,
'alasan' => $request->alasan,
'status' => 'Pending', // status awal adalah pending
]);
// Kirim notifikasi kepada karyawan yang diminta
Notification::send($requestedTo, new ShiftRequestNotification($shiftRequest));
// Kirim notifikasi ke HRD
$hrd = Employee::where('role', 'HRD')->first(); // asumsikan HRD memiliki role khusus
if ($hrd) {
Notification::send($hrd, new ShiftRequestNotification($shiftRequest));
}
return response()->json([
'message' => 'Permintaan pertukaran shift diajukan',
'data' => $shiftRequest
], 201);
}
// Menyetujuinya atau menolaknya
public function update(Request $request, $id)
{
$leaveRequest = LeaveRequest::find($id);
if (!$leaveRequest) {
return response()->json([
'success' => false,
'message' => 'Pengajuan cuti tidak ditemukan.',
], 404);
}
$validated = $request->validate([
'status' => 'required|in:Menunggu,Disetujui,Ditolak,Persetujuan Sementara',
]);
$leaveRequest->update($validated);
return response()->json([
'success' => true,
'message' => 'Status pengajuan berhasil diperbarui.',
'data' => $leaveRequest,
]);
}
public function destroy($id)
{
$leaveRequest = LeaveRequest::find($id);
if (!$leaveRequest) {
return response()->json([
'success' => false,
'message' => 'Pengajuan cuti tidak ditemukan.',
], 404);
}
$leaveRequest->delete();
return response()->json([
'success' => true,
'message' => 'Pengajuan cuti berhasil dihapus.',
]);
}
// Menampilkan riwayat permintaan pertukaran shift
public function index()
{
return response()->json(ShiftRequest::with(['requester', 'requestedTo', 'shift'])->get());
}
public function show($id)
{
// Cari shift request berdasarkan ID
$shiftRequest = ShiftRequest::with(['requester', 'requestedTo', 'shift'])->find($id);
// Jika data tidak ditemukan, kembalikan respons error
if (!$shiftRequest) {
return response()->json([
'message' => 'Shift request tidak ditemukan.'
], 404);
}
// Kembalikan data shift request jika ditemukan
return response()->json([
'message' => 'Shift request ditemukan.',
'data' => $shiftRequest
], 200);
}
}
<?php
namespace App\Http\Controllers;
use App\Models\ShiftTemplate;
use Illuminate\Http\Request;
class ShiftTemplateController extends Controller
{
// Menampilkan semua template
public function index()
{
return response()->json(ShiftTemplate::all());
}
// Membuat template baru
public function store(Request $request)
{
$request->validate([
'nama_template' => 'required|string',
'jam_masuk' => 'required',
'jam_keluar' => 'required',
]);
$template = ShiftTemplate::create($request->all());
return response()->json($template, 201);
}
public function show($id)
{
$shiftTemplate = ShiftTemplate::find($id);
// Jika template tidak ditemukan
if (!$shiftTemplate) {
return response()->json(['message' => 'Shift Template not found'], 404);
}
// Jika ditemukan, kembalikan data
return response()->json($shiftTemplate);
}
// Memperbarui template
public function update(Request $request, $id)
{
$template = ShiftTemplate::findOrFail($id);
$request->validate([
'nama_template' => 'string',
'jam_masuk' => 'required',
'jam_keluar' => 'required',
]);
$template->update($request->all());
return response()->json($template);
}
// Menghapus template
public function destroy($id)
{
$template = ShiftTemplate::findOrFail($id);
$template->delete();
return response()->json(['message' => 'Template deleted successfully.']);
}
}
<?php
namespace App\Http\Controllers;
use App\Models\Tenant;
use Illuminate\Http\Request;
class TenantController extends Controller
{
public function index()
{
return response()->json(Tenant::with('users')->get());
}
public function store(Request $request)
{
$validated = $request->validate([
'nama_perusahaan' => 'required|string|max:255',
'db_name' => 'required|string|max:255',
'db_user' => 'required|string|max:255',
'db_password' => 'required|string|max:255',
]);
try {
$tenant = Tenant::create($validated);
return response()->json($tenant, 201);
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
public function show($id)
{
$tenant = Tenant::with('users')->find($id);
if (!$tenant) {
return response()->json(['message' => 'Tenant not found'], 404);
}
return response()->json($tenant);
}
public function update(Request $request, $id)
{
$tenant = Tenant::find($id);
if (!$tenant) {
return response()->json(['message' => 'Tenant not found'], 404);
}
$tenant->update($request->all());
return response()->json(['message' => 'Tenant updated successfully', 'data' => $tenant]);
}
public function destroy($id)
{
$tenant = Tenant::find($id);
if (!$tenant) {
return response()->json(['message' => 'Tenant not found'], 404);
}
$tenant->delete();
return response()->json(['message' => 'Tenant deleted successfully']);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment