228 lines
8.0 KiB
PHP
228 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class Laporan extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
// Tidak menggunakan tabel database karena hanya helper class
|
|
protected $table = null;
|
|
public $timestamps = false;
|
|
|
|
/**
|
|
* Get statistics for dashboard
|
|
*/
|
|
public static function getStatistics()
|
|
{
|
|
return [
|
|
'total_kasbon' => DB::table('kasbons')->count(),
|
|
'total_teknisi' => DB::table('teknisis')->count(),
|
|
'total_pekerjaan' => DB::table('penugasans')->count(),
|
|
'total_absensi' => DB::table('absensis')
|
|
->whereMonth('tanggal', date('m'))
|
|
->whereYear('tanggal', date('Y'))
|
|
->count(),
|
|
|
|
// Kasbon statistics
|
|
'total_lunas' => DB::table('kasbons')
|
|
->where('status', 'lunas')
|
|
->sum('jumlah_kasbon'),
|
|
'total_belum_lunas' => DB::table('kasbons')
|
|
->where('status', 'belum_lunas')
|
|
->sum('jumlah_kasbon'),
|
|
|
|
// Teknisi statistics
|
|
'teknisi_aktif' => DB::table('teknisis')
|
|
->where('status', 'aktif')
|
|
->count(),
|
|
'teknisi_nonaktif' => DB::table('teknisis')
|
|
->where('status', 'nonaktif')
|
|
->count(),
|
|
|
|
// Absensi statistics
|
|
'hadir' => DB::table('absensis')
|
|
->where('status', 'hadir')
|
|
->whereMonth('tanggal', date('m'))
|
|
->whereYear('tanggal', date('Y'))
|
|
->count(),
|
|
'izin' => DB::table('absensis')
|
|
->where('status', 'izin')
|
|
->whereMonth('tanggal', date('m'))
|
|
->whereYear('tanggal', date('Y'))
|
|
->count(),
|
|
'sakit' => DB::table('absensis')
|
|
->where('status', 'sakit')
|
|
->whereMonth('tanggal', date('m'))
|
|
->whereYear('tanggal', date('Y'))
|
|
->count(),
|
|
'alpha' => DB::table('absensis')
|
|
->where('status', 'alpha')
|
|
->whereMonth('tanggal', date('m'))
|
|
->whereYear('tanggal', date('Y'))
|
|
->count(),
|
|
|
|
// Pekerjaan statistics - using penugasans table
|
|
'selesai' => DB::table('penugasans')
|
|
->where('status_pekerjaan', 'selesai')
|
|
->count(),
|
|
'progress' => DB::table('penugasans')
|
|
->where('status_pekerjaan', 'proses')
|
|
->count(),
|
|
'pending' => DB::table('penugasans')
|
|
->where('status_pekerjaan', 'pending')
|
|
->count(),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get kasbon data with filters
|
|
*/
|
|
public static function getKasbonData($filters = [])
|
|
{
|
|
$query = DB::table('kasbons')
|
|
->leftJoin('teknisis', 'kasbons.id_teknisi', '=', 'teknisis.id_teknisi')
|
|
->select(
|
|
'kasbons.*',
|
|
'teknisis.nama as nama_teknisi'
|
|
);
|
|
|
|
if (!empty($filters['search'])) {
|
|
$query->where(function($q) use ($filters) {
|
|
$q->where('teknisis.nama', 'like', '%' . $filters['search'] . '%')
|
|
->orWhere('kasbons.keperluan', 'like', '%' . $filters['search'] . '%');
|
|
});
|
|
}
|
|
|
|
if (!empty($filters['tanggal_dari'])) {
|
|
$query->whereDate('kasbons.tanggal_kasbon', '>=', $filters['tanggal_dari']);
|
|
}
|
|
|
|
if (!empty($filters['tanggal_sampai'])) {
|
|
$query->whereDate('kasbons.tanggal_kasbon', '<=', $filters['tanggal_sampai']);
|
|
}
|
|
|
|
if (!empty($filters['status'])) {
|
|
$query->where('kasbons.status', $filters['status']);
|
|
}
|
|
|
|
if (!empty($filters['id_teknisi'])) {
|
|
$query->where('kasbons.id_teknisi', $filters['id_teknisi']);
|
|
}
|
|
|
|
return $query->orderBy('kasbons.tanggal_kasbon', 'desc');
|
|
}
|
|
|
|
/**
|
|
* Get teknisi data with filters
|
|
*/
|
|
public static function getTeknisiData($filters = [])
|
|
{
|
|
// Use raw SQL for groupBy to avoid MySQL strict mode issues
|
|
$query = DB::table('teknisis')
|
|
->leftJoin('absensis', function($join) use ($filters) {
|
|
$join->on('teknisis.id_teknisi', '=', 'absensis.id_teknisi');
|
|
if (!empty($filters['tanggal_dari'])) {
|
|
$join->whereDate('absensis.tanggal', '>=', $filters['tanggal_dari']);
|
|
}
|
|
if (!empty($filters['tanggal_sampai'])) {
|
|
$join->whereDate('absensis.tanggal', '<=', $filters['tanggal_sampai']);
|
|
}
|
|
})
|
|
->select(
|
|
'teknisis.id_teknisi',
|
|
'teknisis.nama',
|
|
'teknisis.status',
|
|
DB::raw('COUNT(absensis.id_absensi) as total_absensi'),
|
|
DB::raw('COUNT(CASE WHEN absensis.status = "hadir" THEN 1 END) as hadir'),
|
|
DB::raw('COUNT(CASE WHEN absensis.status = "izin" THEN 1 END) as izin'),
|
|
DB::raw('COUNT(CASE WHEN absensis.status = "sakit" THEN 1 END) as sakit'),
|
|
DB::raw('COUNT(CASE WHEN absensis.status = "alpha" THEN 1 END) as alpha')
|
|
)
|
|
->groupBy('teknisis.id_teknisi', 'teknisis.nama', 'teknisis.status');
|
|
|
|
if (!empty($filters['search'])) {
|
|
$query->where('teknisis.nama', 'like', '%' . $filters['search'] . '%');
|
|
}
|
|
|
|
return $query->orderBy('teknisis.nama', 'asc');
|
|
}
|
|
|
|
/**
|
|
* Get absensi data with filters
|
|
*/
|
|
public static function getAbsensiData($filters = [])
|
|
{
|
|
$query = DB::table('absensis')
|
|
->leftJoin('teknisis', 'absensis.id_teknisi', '=', 'teknisis.id_teknisi')
|
|
->select(
|
|
'absensis.*',
|
|
'teknisis.nama as nama_teknisi'
|
|
);
|
|
|
|
if (!empty($filters['search'])) {
|
|
$query->where('teknisis.nama', 'like', '%' . $filters['search'] . '%');
|
|
}
|
|
|
|
if (!empty($filters['tanggal_dari'])) {
|
|
$query->whereDate('absensis.tanggal', '>=', $filters['tanggal_dari']);
|
|
}
|
|
|
|
if (!empty($filters['tanggal_sampai'])) {
|
|
$query->whereDate('absensis.tanggal', '<=', $filters['tanggal_sampai']);
|
|
}
|
|
|
|
if (!empty($filters['status'])) {
|
|
$query->where('absensis.status', $filters['status']);
|
|
}
|
|
|
|
if (!empty($filters['id_teknisi'])) {
|
|
$query->where('absensis.id_teknisi', $filters['id_teknisi']);
|
|
}
|
|
|
|
return $query->orderBy('absensis.tanggal', 'desc');
|
|
}
|
|
|
|
/**
|
|
* Get pekerjaan data with filters
|
|
*/
|
|
public static function getPekerjaanData($filters = [])
|
|
{
|
|
$query = DB::table('penugasans')
|
|
->leftJoin('teknisis', 'penugasans.id_teknisi', '=', 'teknisis.id_teknisi')
|
|
->select(
|
|
'penugasans.*',
|
|
'teknisis.nama as nama_teknisi'
|
|
);
|
|
|
|
if (!empty($filters['search'])) {
|
|
$query->where(function($q) use ($filters) {
|
|
$q->where('teknisis.nama', 'like', '%' . $filters['search'] . '%')
|
|
->orWhere('penugasans.jenis_pekerjaan', 'like', '%' . $filters['search'] . '%')
|
|
->orWhere('penugasans.catatan_admin', 'like', '%' . $filters['search'] . '%');
|
|
});
|
|
}
|
|
|
|
if (!empty($filters['tanggal_dari'])) {
|
|
$query->whereDate('penugasans.tanggal_mulai', '>=', $filters['tanggal_dari']);
|
|
}
|
|
|
|
if (!empty($filters['tanggal_sampai'])) {
|
|
$query->whereDate('penugasans.tanggal_diselesaikan', '<=', $filters['tanggal_sampai']);
|
|
}
|
|
|
|
if (!empty($filters['status'])) {
|
|
$query->where('penugasans.status_pekerjaan', $filters['status']);
|
|
}
|
|
|
|
if (!empty($filters['id_teknisi'])) {
|
|
$query->where('penugasans.id_teknisi', $filters['id_teknisi']);
|
|
}
|
|
|
|
return $query->orderBy('penugasans.created_at', 'desc');
|
|
}
|
|
} |