<?php
namespace App\Imports;
use Illuminate\Support\Collection;
use App\Models\Opd;
use App\Models\Bidang;
use App\Models\Ppk;
use App\Models\Kpa;
use App\Models\Proker;
use App\Models\Program;
use App\Models\Kegiatan;
use App\Models\ProkerProgram;
use App\Models\ProkerKegiatan;
use App\Models\SubKegiatan;
use App\Models\SumberDana;
use App\Models\ProkerSubKegiatan;
use App\Models\RincianKegiatan;
use App\Models\RealisasiRincianKegiatan;
use App\Models\RealisasiKeuangan;
use App\Models\RealisasiFisik;
use App\Models\User;
use App\Models\Level;
use DB,Str;
use App\Models\Notifikasi;
use App\Models\Duplikasi\DupProgram;
use App\Models\Duplikasi\DupKegiatan;
use App\Models\Duplikasi\DupSubKegiatan;
use App\Models\Duplikasi\DupRincianKegiatan;
use App\Models\Duplikasi\DupItem;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\ToCollection;
class ImportSipd implements ToCollection, WithHeadingRow
{
// private $tipe;
// public function __construct($tipe)
// {
// $this->tipe = $tipe;
// }
/**
* @param Collection $collection
*/
public function collection(collection $rows)
{
// dd($rows->count());
// dd($rows->pluck('nama_sumber_dana')->unique());
// dd($rows->pluck('nama_sumber_dana')->unique());
// $tipe = $this->tipe;
$previous_sub_kegiatan_name = null;
$batas_anggaran = 0;
function extractNumbersAndText($input)
{
// Menggunakan regular expression untuk mengekstrak angka dan teks
preg_match_all('/(\d+)\s*(\D*)/', $input, $matches, PREG_SET_ORDER);
$results = [];
foreach ($matches as $match) {
// $match[1] adalah angka dan $match[2] adalah teks setelah angka
$results[] = [
'number' => $match[1],
'text' => trim($match[2])
];
}
return $results;
}
function trimSpaces($string) {
return trim($string, " \t\n\r\0\x0B");
}
function jaccardSimilarity($string1, $string2) {
$set1 = array_unique(explode(' ', $string1));
$set2 = array_unique(explode(' ', $string2));
$intersection = count(array_intersect($set1, $set2));
$union = count(array_unique(array_merge($set1, $set2)));
return $union > 0 ? $intersection / $union : 0;
}
// Fungsi untuk memproses string
function processString($input) {
// Memisahkan angka dan kalimat menggunakan regex
preg_match_all('/(\d+)\s*([A-Za-z]+)/', $input, $matches);
$total = 1; // Untuk menyimpan hasil kali angka
$kalimat = []; // Untuk menyimpan kalimat
// Mengiterasi hasil pencocokan
foreach ($matches[1] as $index => $angka) {
$total *= (int)$angka; // Mengalikan angka
$kalimat[] = $matches[2][$index]; // Menyimpan kalimat
}
// Jika kalimat kosong, tetapkan "paket" sebagai default
if (empty($kalimat)) {
$kalimat[] = 'paket';
}
return [
'total' => $total,
'kalimat' => $kalimat
];
}
foreach ($rows as $row => $data) {
// dd($data);
if ($data['total_harga'] != 0 and $data['total_harga'] != '0' and $data['total_harga'] != "" and $data['total_harga'] != null) {
$year = '2025';
$opd = Opd::where('kode', $data['kode_skpd'])->first();
if (!$opd) {
$opd = Opd::create([
'nama_perangkat_daerah' => $data['nama_skpd'],
'kode' => trim($data['kode_skpd']),
]);
}
$proker = Proker::firstOrCreate(
[
'opd_id' => $opd->id,
'tahun' => $year
]
);
$program = Program::firstOrCreate(
[
'kode' => $data['kode_program']
],
[
'nama_program' => trim(substr($data['nama_program'], 0, 255))
]
);
$proker_program = ProkerProgram::firstOrCreate(
[
'proker_id' => $proker->id,
'program_id' => $program->id
],
);
$kegiatan = Kegiatan::firstOrCreate(
[
'kode' => $data['kode_kegiatan']
],
[
'nama_kegiatan' => trim(substr($data['nama_kegiatan'], 0, 255))
]
);
$proker_kegiatan = ProkerKegiatan::firstOrCreate(
[
'proker_program_id' => $proker_program->id,
'kegiatan_id' => $kegiatan->id
],
);
$sub_kegiatan = SubKegiatan::firstOrCreate(
[
'kode' => $data['kode_sub_kegiatan']
],
[
'nama_sub_kegiatan' => trim(substr($data['nama_sub_kegiatan'], 0, 255))
]
);
// dd($data['nama_sumber_dana']);
if ($data['sumber_dana'] == null ) {
$sumber_dana = 'PAD';
}elseif (trim($data['sumber_dana']) == 'PENDAPATAN ASLI DAERAH (PAD)') {
$sumber_dana = 'PAD';
}elseif (trim($data['sumber_dana']) == 'Pendapatan dari BLUD') {
$sumber_dana = 'PAD';
}elseif (trim($data['sumber_dana']) == 'Pajak Daerah') {
$sumber_dana = 'PAD';
}elseif (trim($data['sumber_dana']) == 'Bantuan Keuangan Khusus dari Pemerintah Daerah Provinsi') {
$sumber_dana = 'BanKeu';
}elseif (trim($data['sumber_dana']) == 'Dana Transfer Khusus-Dana Alokasi Khusus Fisik') {
$sumber_dana = 'DAK Fisik';
}elseif (trim($data['sumber_dana']) == 'DAK Non Fisik-Fasilitasi Penanaman Modal') {
$sumber_dana = 'DAK Non Fisik';
}elseif (trim($data['sumber_dana']) == 'Dana Transfer Umum-Dana Bagi Hasil') {
$sumber_dana = 'DAU';
}elseif (trim($data['sumber_dana']) == 'Dana Transfer Umum-Dana Alokasi Umum') {
$sumber_dana = 'DAU';
}elseif (trim($data['sumber_dana']) == 'DAU Tambahan Dukungan Pendanaan Bagi Kelurahan') {
$sumber_dana = 'DAU';
}else{
$sumber_dana = 'PAD';
}
$sumber_dana = SumberDana::where('sumber_dana', $sumber_dana)->first();
// if ($data['total_harga'] == 0 or $data['total_harga'] == '0' or $data['total_harga'] == "") {
// $pagu = $data['harga_satuan'];
// }else {
// $pagu = $data['total_harga'];
// }
$pagu = $data['total_harga'];
// if ($pagu == null) {
// $pagu == 1;
// }
if ($previous_sub_kegiatan_name == trim($data['nama_sub_kegiatan'])) {
$batas_anggaran += $pagu;
} else {
$batas_anggaran = $pagu;
}
$previous_sub_kegiatan_name = trim($data['nama_sub_kegiatan']);
$prokerSubKegiatan = ProkerSubKegiatan::firstOrCreate(
[
'proker_kegiatan_id' => $proker_kegiatan->id,
'sub_kegiatan_id' => $sub_kegiatan->id,
'bagian' => $data['nama_unit_skpd'],
],
[
'sumber_dana_id' => $sumber_dana->id,
'kpa_id' => null,
'user_id' => null,
'bagian' => $data['nama_unit_skpd'],
// 'batas_anggaran' => $batas_anggaran,
]
);
$volume_satuan = processString($data['koefisien']);
if ($pagu >= 15000000000) {
$umkm = 0;
}else{
$umkm = 1;
}
// dd($data);
$rincian_kegiatan = RincianKegiatan::create([
'proker_sub_kegiatan_id' => $prokerSubKegiatan->id,
'kode_rekening' => trim($data['kode_akun']),
'uraian' => trim(substr($data['spesifikasi'] ?? $data['nama_standar_harga'] ?? $data['keterangan_belanja'], 0, 255)),
'volume' => $volume_satuan['total'],
'satuan' => implode(' ', $volume_satuan['kalimat']),
'pagu' => $pagu,
'volume_murni' => $volume_satuan['total'],
'satuan_murni' => implode(' ', $volume_satuan['kalimat']),
'pagu_murni' => $pagu,
'tanggal_mulai_pelaksanaan'=> null,
'tanggal_akhir_pelaksanaan'=> null,
'rincian_sub_bidang_id' => null,
'sumber_dana_id' => $sumber_dana->id,
'umkm' => $umkm,
'pengadaan' => 1,
'kategori' => 'non-fisik',
'status_mendesak' => 0,
'kunci_rincian' => 0,
'jenis_umk_id' => null,
]);
$rincian_kegiatan->RealisasiRincianKegiatan()->create([
'rincian_kegiatan_id'=> $rincian_kegiatan->id,
'metode'=> 'swakelola',
'nilai_kontrak'=> 0,
'pdn'=> 1,
]);
}
// if (
// $data['koefisien_murni'] == "" &&
// $data['harga_satuan_murni'] == "" &&
// $data['total_harga_murni'] == "" &&
// $data['total_harga'] != "0" &&
// $data['total_harga'] != "0"
// ) {
// // dd($sumber_dana->id);
// $rincian_kegiatan = RincianKegiatan::create([
// 'proker_sub_kegiatan_id' => $prokerSubKegiatan->id,
// 'kode_rekening' => trim($data['kode_akun']),
// 'uraian' => trim(substr($data['spesifikasi'] ?? $data['nama_standar_harga'] ?? $data['keterangan_belanja'], 0, 255)),
// 'volume' => $volume_satuan['total'],
// 'satuan' => implode(' ', $volume_satuan['kalimat']),
// 'pagu' => $pagu ?? 1,
// 'volume_murni' => $volume_satuan['total'],
// 'satuan_murni' => implode(' ', $volume_satuan['kalimat']),
// 'pagu_murni' => $pagu ?? 1,
// 'tanggal_mulai_pelaksanaan'=> null,
// 'tanggal_akhir_pelaksanaan'=> null,
// 'rincian_sub_bidang_id' => null,
// 'sumber_dana_id' => $sumber_dana->id,
// 'umkm' => 1,
// 'pengadaan' => 1,
// ]);
// $rincian_kegiatan->RealisasiRincianKegiatan()->create([
// 'rincian_kegiatan_id'=> $rincian_kegiatan->id,
// 'metode'=> 'swakelola',
// 'nilai_kontrak'=> $pagu ?? 1,
// 'pdn'=> 1,
// ]);
// }
// if ($prokerSubKegiatan->pagu > $prokerSubKegiatan->batas_anggaran) {
// $link = '/proker/'.$prokerSubKegiatan->id;
// $notifikasi = Notifikasi::where('link_tautan', $link)->where('status_baca', 0)->orderBy('created_at', 'DESC')->first();
// if (!$notifikasi) {
// $notifikasi = Notifikasi::create([
// 'deskripsi' => ' Pagu Sub Kegiatan tidak sesuai dari batas pagu '. $prokerSubKegiatan->SubKegiatan->nama_sub_kegiatan,
// 'link_tautan' => $link,
// 'link_tautan' => $link,
// 'status_baca' => 0
// ]);
// }
// }else {
// $link = '/proker/'.$prokerSubKegiatan->id;
// $notifikasi = Notifikasi::where('link_tautan', $link)->where('status_baca', 0)->orderBy('created_at', 'DESC')->first();
// if (!$notifikasi) {
// $notifikasi = Notifikasi::create([
// 'deskripsi' => ' Pagu Sub Kegiatan tidak sesuai dari batas pagu '. $prokerSubKegiatan->SubKegiatan->nama_sub_kegiatan,
// 'link_tautan' => $link,
// 'link_tautan' => $link,
// 'status_baca' => 0
// ]);
// }
// }
// $rincianKegiatanAll = RincianKegiatan::where('proker_sub_kegiatan_id', $prokerSubKegiatan->id)->get();
// $maxSimilarity = 0;
// $rincianKegiatan = null;
// // foreach ($rincianKegiatanAll as $record) {
// // $uraian = $record->uraian;
// // $similarity1 = jaccardSimilarity(trimSpaces($data['nama_paketkelompok']), $uraian);
// // $maxPercentage = $similarity1;
// // $threshold = 0.2;
// // if ($maxPercentage >= $threshold && $maxPercentage > $maxSimilarity) {
// // $maxSimilarity = $maxPercentage;
// // $rincianKegiatan = $record;
// // }
// // }
// // dd($rincianKegiatan);
// if ($rincianKegiatan == null or $tipe == 0) {
// if ($tipe == 0) {
// # murni
// $rincian_kegiatan = RincianKegiatan::create([
// 'proker_sub_kegiatan_id' => $prokerSubKegiatan->id,
// 'kode_rekening' => trim($data['kode_rekening']),
// 'uraian' => trim(substr($data['nama_paketkelompok']. ' ['. $data['nama_rekening'] .']', 0, 255)),
// 'volume' => 0,
// 'satuan' => $data['paketkelompok'],
// 'pagu' => $data['pagu'],
// 'volume_murni' => 0,
// 'satuan_murni' => $data['paketkelompok'],
// 'pagu_murni' => $data['pagu'],
// 'tanggal_mulai_pelaksanaan'=> null,
// 'tanggal_akhir_pelaksanaan'=> null,
// 'rincian_sub_bidang_id' => null,
// 'sumber_dana_id' => $sumber_dana->id,
// ]);
// }elseif ($tipe == 1) {
// # pergeseran
// $koefisien = extractNumbersAndText($data['koefisien']);
// // dd($koefisien['0']);
// $rincian_kegiatan = RincianKegiatan::create([
// 'proker_sub_kegiatan_id' => $prokerSubKegiatan->id,
// 'kode_rekening' => trim($data['kode_standar_harga']),
// 'uraian' => trim(substr($data['spesifikasi'], 0, 255)),
// 'volume' => $koefisien['0']['number'],
// 'satuan' => $koefisien['0']['text'],
// 'pagu' => $data['total_harga'],
// 'volume_murni' => 0,
// 'satuan_murni' => 0,
// 'pagu_murni' => 0,
// 'volume_pergeseran' => $koefisien['0']['number'],
// 'satuan_pergeseran' => $koefisien['0']['text'],
// 'pagu_pergeseran' => $data['total_harga'],
// 'tanggal_mulai_pelaksanaan'=> null,
// 'tanggal_akhir_pelaksanaan'=> null,
// 'rincian_sub_bidang_id' => null,
// 'sumber_dana_id' => $sumber_dana->id,
// ]);
// if ($previousProkerSubKegiatan && $previousProkerSubKegiatan->id == $prokerSubKegiatan->id) {
// $prokerSubKegiatan->batas_anggaran += $data['total_harga'];
// } else {
// $prokerSubKegiatan->batas_anggaran = 0;
// $link = '/proker/'.$prokerSubKegiatan->id;
// $notifikasi = Notifikasi::create([
// 'deskripsi' => ' Pagu Sub Kegiatan tidak sesuai dari batas pagu '. $prokerSubKegiatan->SubKegiatan->nama_sub_kegiatan,
// 'link_tautan' => $link,
// 'status_baca' => 0
// ]);
// }
// $prokerSubKegiatan->save();
// $previousProkerSubKegiatan = $prokerSubKegiatan;
// }elseif ($tipe == 2) {
// # perubahan
// $rincian_kegiatan = RincianKegiatan::create([
// 'proker_sub_kegiatan_id' => $prokerSubKegiatan->id,
// 'kode_rekening' => trim($data['kode_rekening']),
// 'uraian' => trim(substr($data['nama_paketkelompok'], 0, 255)),
// 'volume' => 0,
// 'satuan' => $data['paketkelompok'],
// 'pagu' => $data['pagu'],
// 'volume_murni' => 0,
// 'satuan_murni' => 0,
// 'pagu_murni' => 0,
// 'volume_perubahan' => 0,
// 'satuan_perubahan' => $data['paketkelompok'],
// 'pagu_perubahan' => $data['pagu'],
// 'tanggal_mulai_pelaksanaan'=> null,
// 'tanggal_akhir_pelaksanaan'=> null,
// 'rincian_sub_bidang_id' => null,
// 'sumber_dana_id' => $sumber_dana->id,
// ]);
// }else{
// # perubahan pergeseran
// $rincian_kegiatan = RincianKegiatan::create([
// 'proker_sub_kegiatan_id' => $prokerSubKegiatan->id,
// 'kode_rekening' => trim($data['kode_rekening']),
// 'uraian' => trim(substr($data['nama_paketkelompok'], 0, 255)),
// 'volume' => 0,
// 'satuan' => $data['paketkelompok'],
// 'pagu' => $data['pagu'],
// 'volume_murni' => 0,
// 'satuan_murni' => $data['paketkelompok'],
// 'pagu_murni' => $data['pagu'],
// 'volume_perubahan_pergeseran' => 0,
// 'satuan_perubahan_pergeseran' => $data['paketkelompok'],
// 'pagu_perubahan_pergeseran' => $data['pagu'],
// 'tanggal_mulai_pelaksanaan'=> null,
// 'tanggal_akhir_pelaksanaan'=> null,
// 'rincian_sub_bidang_id' => null,
// 'sumber_dana_id' => $sumber_dana->id,
// ]);
// }
// $rincian_kegiatan->RealisasiRincianKegiatan()->create([
// 'rincian_kegiatan_id'=> $rincian_kegiatan->id,
// 'metode'=> 'swakelola',
// 'nilai_kontrak'=> $data['total_harga'],
// ]);
// } elseif ($rincianKegiatan->status_gabungan == 1) {
// $detailrinciankegiatanall = DetailRincianKegiatan::where('rincian_kegiatan_id', $rincianKegiatan->id)->get();
// $maxSimilarity = 0;
// foreach ($detailrinciankegiatanall as $record) {
// $uraian = $record->uraian;
// $similarity1 = jaccardSimilarity(trimSpaces($data['nama_paketkelompok']), $uraian);
// $maxPercentage = $similarity1;
// $threshold = 0.2;
// if ($maxPercentage >= $threshold && $maxPercentage > $maxSimilarity) {
// $maxSimilarity = $maxPercentage;
// $detailrincianKegiatan = $record;
// $detailrincianKegiatan->update(['volume' => 0]);
// $detailrincianKegiatan->update(['satuan' => $data['paketkelompok']]);
// $detailrincianKegiatan->update(['pagu' => $data['pagu']]);
// }
// }
// } else{
// if ($tipe == 0) {
// # murni
// $rincianKegiatan->update(['volume_murni' => 0 ]);
// $rincianKegiatan->update(['satuan_murni' => $data['paketkelompok']]);
// $rincianKegiatan->update(['pagu_murni' => $data['pagu']]);
// }elseif ($tipe == 1) {
// # pergeseran
// $rincianKegiatan->update(['volume_pergeseran' => 0 ]);
// $rincianKegiatan->update(['satuan_pergeseran' => $data['paketkelompok']]);
// $rincianKegiatan->update(['pagu_pergeseran' => $data['pagu']]);
// }elseif ($tipe == 2) {
// # perubahan
// $rincianKegiatan->update(['volume_perubahan' => 0 ]);
// $rincianKegiatan->update(['satuan_perubahan' => $data['paketkelompok']]);
// $rincianKegiatan->update(['pagu_perubahan' => $data['pagu']]);
// }else{
// # perubahan pergeseran
// $rincianKegiatan->update(['volume_perubahan_pergeseran' => 0 ]);
// $rincianKegiatan->update(['satuan_perubahan_pergeseran' => $data['paketkelompok']]);
// $rincianKegiatan->update(['pagu_perubahan_pergeseran' => $data['pagu']]);
// }
// }
}
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]