<?php
namespace App\Models;
use DateTime;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Pelanggan extends Model
{
use HasFactory;
use SoftDeletes;
protected $fillable = [
"nama_pelanggan",
"telp_pelanggan",
"alamat_pelanggan",
"kecamatan_pelanggan",
"pengguna_id"
];
public function scopeRiwayatSum($query){
return $query->join('riwayat_transaksis','riwayat_transaksis.pelanggan_id','=','pelanggans.id')
->select('pelanggans.*')
->selectRaw('SUM(riwayat_transaksis.biaya) as total');
}
public function scopeTotalSum($query){
//sum penjualan dan service
return $query->join('penjualans','penjualans.pelanggan_id','=','pelanggans.id')
->join('services',function($j){
$j->where('services.pelanggan_id','=','pelanggans.id')->where('services.status_transaksi','=','success');
})
->join('detail_services','detail_services.service_id','=','services.id')
->select('pelanggans.*')
->selectRaw('SUM(penjualans.total) as total_penjualan')
->selectRaw('SUM(services.total) as total_service')
->selectRaw('SUM(detail_services.total) as total_detail_service');
}
public function penjualan()
{
return $this->hasMany(Penjualan::class);
}
public function retur_penjualan()
{
return $this->hasMany(ReturPenjualan::class);
}
public function riwayat()
{
return $this->hasMany(RiwayatTransaksi::class);
}
public function service()
{
return $this->hasMany(Service::class);
}
public function scopeCari($query, $name)
{
return $query->where("nama_pelanggan", "like", "%" . $name . "%")
->orWhere("telp_pelanggan", "like", "%" . $name . "%")
->orWhere("alamat_pelanggan", "like", "%" . $name . "%");
}
public function scopeKecamatan($query, $kecamatan)
{
return $query->where("kecamatan_pelanggan", "like", "%" . $kecamatan . "%");
}
public function scopeTanggal($query, $begin, $end)
{
return $query->whereBetween("created_at", [$begin->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')]);
}
public static function boot()
{
parent::boot();
self::deleting(function ($pelanggan) {
$pelanggan->penjualan()->each(function ($penjualan) {
$penjualan->delete();
});
$pelanggan->service()->each(function ($service) {
$service->delete();
});
$pelanggan->retur_penjualan()->each(function ($retur_penjualan) {
$retur_penjualan->delete();
});
$pelanggan->riwayat()->each(function ($riwayat) {
$riwayat->delete();
});
});
}
public function getDurasiLabelAttribute()
{
$date1 = (string)$this->created_at;
if($this->created_at == null){
if($this->service->count() > 0){
$date1 = (string)$this->service->sortBy('id')->first()->created_at;
} else if($this->penjualan->count() > 0){
$date1 = (string)$this->penjualan->sortBy('id')->first()->created_at;
}
}
if($date1 == null || $date1 == ""){
return "-";
}
$date1 = new DateTime($date1);
$date2 = now();
$interval = $date1->diff($date2);
$parts = [];
if ($interval->y > 0) {
$parts[] = $interval->y . ' tahun';
}
if ($interval->m > 0) {
$parts[] = $interval->m . ' bulan';
}
if ($interval->d > 0) {
$parts[] = $interval->d . ' hari';
}
$formatted = implode(', ', $parts);
return $formatted;
}
public function getTotalReviewAttribute(){
$jumlahReview = $this->review_pelanggans->count();
$nialiReview = $this->review_pelanggans->sum('nilai_review');
$totalReview = ($jumlahReview > 0)?$nialiReview/($jumlahReview*5):0;
return $totalReview;
}
public function getJumlahReferralAttribute(){
$jumlahReferral = Referralable::whereIn('referral_pelanggan_id',$this->referral_pelanggans->pluck('id')->toArray())->count();
return $jumlahReferral;
}
public function getSkorLoyalitasAttribute(){
$jumlah_transaksi = $this->jumlah_transaksi ?? 0;
$total_nominal = $this->total_nominal ?? 0;
$skorFrekuensi = ($jumlah_transaksi > 0)?min(5,$jumlah_transaksi)/5:0;
$skorPengeluaran = ($total_nominal > 0)?min(3000000,$total_nominal)/3000000:0;
$jumlahReferral = Referralable::whereIn('referral_pelanggan_id',$this->referral_pelanggans->pluck('id')->toArray())->count();
$skorReferral = ($jumlahReferral > 0)?min(3,$jumlahReferral)/3:0;
$date1 = new DateTime($this->created_at ?? @($this->service->sortByDesc('created_at')->first() ?? $this->penjualan->sortByDesc('created_at')->first())->created_at);
$date2 = now();
$interval = $date1->diff($date2);
$skorDurasi = $interval->y > 0 ? min(5,$interval->y)/2: 0;
$jumlahReview = $this->review_pelanggans->count();
$nialiReview = $this->review_pelanggans->sum('nilai_review');
$totalReview = ($jumlahReview > 0)?$nialiReview/($jumlahReview*5):0;
$skorReview = $totalReview > 0?min(5,$totalReview)/5: 0;
$skor = ($skorFrekuensi * 30) + ($skorPengeluaran * 25) + ($skorReferral * 20) + ($skorDurasi * 15) + ($skorReview * 10);
return $skor;
}
public function referral_pelanggans(){
return $this->hasMany(ReferralPelanggan::class);
}
public function review_pelanggans(){
return $this->hasMany(ReviewPelanggan::class);
}
public function getKategoriPelangganAttribute(){
$skor = $this->skor_loyalitas;
if($skor > 80){
return "Super Loyal";
} else if($skor > 70){
return "Loyal Aktif";
} else if($skor > 40){
return "Potensi Loyal";
} else if($skor > 20){
return "Pasif";
} else {
return "Baru";
}
}
public function riwayat_poin_pelanggans(){
return $this->hasMany(RiwayatPoinPelanggan::class);
}
public function getTotalPoinAttribute(){
$poin = $this->riwayat_poin_pelanggans->sum('bertambah') - $this->riwayat_poin_pelanggans->sum('berkurang');
// foreach ($this->referral_pelanggans as $rp) {
// foreach ($rp->referrables as $referrable) {
// $poin += $referrable->bonus_value;
// }
// }
return $poin;
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]