prepare("SELECT * FROM pelanggan WHERE id = :id"); $stmt->execute(['id' => $page[1]]); $isi = $stmt->fetch(PDO::FETCH_ASSOC); $user = $isi['akun']; $stmt1 = $pdo->prepare("SELECT catatan FROM order_list WHERE akun = :akun"); $stmt1->execute(['akun' => $user]); $isi1 = $stmt1->fetch(PDO::FETCH_ASSOC); $catatanada = ($isi1) ? $isi1['catatan'] : ''; $lat = $isi['latitude'] ?? null; $long = $isi['longitude'] ?? null; function isValidLat($lat) { return is_numeric($lat) && (float)$lat >= -90 && (float)$lat <= 90; } function isValidLong($long) { return is_numeric($long) && (float)$long >= -180 && (float)$long <= 180; } if (!isValidLat($lat)) { $lat = null; } if (!isValidLong($long)) { $long = null; } ?>
Detail Pelanggan
modify('+1 month'); $mulaiBayar = $date->format('Y-m-d'); $mulaiBayarFormatted = date('d-m-Y', strtotime($mulaiBayar)); ?>


Anda bisa pilih salah satu untuk mengisi bagian ini
Click to upload image Image preview
Click to upload image Image preview
Click to upload image Image preview
Click to upload image Image preview
prepare("SELECT * FROM setting_mikrotik WHERE id = :id"); $stmt->execute(['id' => $_POST['ism']]); $mik = $stmt->fetch(PDO::FETCH_ASSOC); // Fetching profile_paket $stmt = $pdo->prepare("SELECT nama_profile FROM profile_paket WHERE id = :id"); $stmt->execute(['id' => $_POST['idp']]); $pro = $stmt->fetch(PDO::FETCH_ASSOC); // Fetching master_topologi $stmt = $pdo->prepare("SELECT nama FROM master_topologi WHERE id = :id"); $stmt->execute(['id' => $_POST['odp']]); $top = $stmt->fetch(PDO::FETCH_ASSOC); $API = new RouterosAPI(); $API->debug = false; $komen = $top['nama'] . ' Port ' . $isi['port_odp'] . '-' . $isi['nama']; $akun = $isi['akun']; $profile = $pro['nama_profile']; $idsv = $isi['id_data_server']; $profRemote = $mik['profile_remote']; $hotspot = $isi['user_hotspot']; // Connect to Mikrotik if ($API->connect2($mik['ip_address'], $mik['username'], $mik['password'], $mik['port_api'])) { // PPPOE add mikrotik if ($isi['jenis_layanan'] == "PPPOE") { $in = $API->comm('/ppp/secret/add', [ "name" => $akun, "password" => $akun, "profile" => $profile, "service" => "pppoe", "comment" => $komen, ]); } else { // Hotspot add mikrotik $in = $API->comm('/ppp/secret/add', [ "name" => $akun, "password" => $akun, "profile" => $profRemote, "service" => "pppoe", "comment" => $komen, ]); $in2 = $API->comm('/ip/hotspot/user/add', [ "name" => $hotspot, "password" => $hotspot, "profile" => $profile, "server" => "all", "comment" => $komen, ]); } $API->disconnect(); // Memeriksa hasil dari API if (!isset($in['!trap']) && (!isset($in2['!trap']) || $isi['jenis_layanan'] == "PPPOE")) { // IF Success bikin akun // Kirim Pesan WhatsApp $nomor = [$isi['nomor_whatsapp']]; $time_start = date('Y-m-d H:i:s'); //clean serial nnumber $serialnumber = $_POST['serial_number'] ?? null; $serialnumber = str_replace(' ', '', $serialnumber); $serialnumber = preg_replace('/[^A-Za-z0-9]/', '', $serialnumber); $serialnumber = strtoupper($serialnumber); // DI kurangi 1 bulan agar cronjob berjalan sesuai harapan $Formatted = date('Y-m-d', strtotime($_POST['mulai_pembayaran'])); $date1 = new DateTime($Formatted); $date1->modify('-1 month'); $mulaiBayarFix = $date1->format('Y-m-d'); $APIwa = new PesanWA(); $APIwa->Create_Pesan($isi['id_data_server'], $isi['id'], 'Pesan Aktivasi'); $Pesan = $APIwa->Get_Pesan(); $APIwa->Send_Pesan($isi['id_data_server'], ['sendMessage','Pesan Aktivasi'], $nomor, $Pesan); // Menggunakan prepared statement untuk keamanan $stmt = $pdo->prepare("SELECT kode_unik_tagihan FROM pelanggan WHERE id_data_server = :id ORDER BY kode_unik_tagihan DESC LIMIT 1"); $stmt->execute(['id' => $idsv]); $pckut1 = $stmt->fetch(PDO::FETCH_ASSOC); if ($pckut1) { $lastCode = $pckut1['kode_unik_tagihan']; $arr2 = range(1, $lastCode); $stmt = $pdo->prepare("SELECT kode_unik_tagihan FROM pelanggan WHERE id_data_server = :id ORDER BY kode_unik_tagihan"); $stmt->execute(['id' => $idsv]); $arr1 = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); $missing = array_diff($arr2, $arr1); $kodeuser = !empty($missing) ? reset($missing) : $lastCode + 1; } else { $kodeuser = 1; } // Update Pelanggan $stmt = $pdo->prepare("UPDATE pelanggan SET id_setting_mikrotik = :id_setting_mikrotik, id_profile_paket = :id_profile_paket, id_marketing = :id_marketing, id_master_desa = :id_master_desa, id_profile_tagihan = :id_profile_tagihan, status = 'aktif', user_hotspot = :user_hotspot, kode_unik_tagihan = :kodeuser, time_start = :time_start, serial_number = :serial_number, mulai_pembayaran = :mulai_pembayaran WHERE id = :id"); $stmt->execute([ ':id_setting_mikrotik' => $_POST['ism'], ':id_profile_paket' => $_POST['idp'], ':id_marketing' => $_POST['idm'], ':id_master_desa' => $_POST['desa'], ':id_profile_tagihan' => $_POST['profiletag'], 'user_hotspot' => $hotspot, 'kodeuser' => $kodeuser, 'time_start' => $time_start, 'serial_number' => $serialnumber, 'mulai_pembayaran' => $mulaiBayarFix, 'id' => $isi['id'] ]); sweetAlert("Aktivasi Pelanggan Berhasil..!!", "success"); } else { // IF Gagal bikin akun $meror = isset($in['!trap']) ? $in['!trap'][0]['message']." In PPPOE" : $in2['!trap'][0]['message']." In Hotspot"; sweetAlert($meror, "error"); } } else { // IF Koneksi mikrotik gagal sweetAlert("Aktivasi gagal..!! Aplikasi ke Mikrotik Tidak Terhubung", "error"); } } catch (PDOException $e) { // Tangani pengecualian PDO sweetAlert("Kesalahan Database: " . $e->getMessage(), "error"); } catch (Exception $e) { // Tangani pengecualian lainnya sweetAlert("Terjadi kesalahan: " . $e->getMessage(), "error"); } } if (isset($_POST['berita_acara_pemasangan'])) { try { require('controller/surat_pdf/BA_Template.php'); $stmt = $pdo->prepare("SELECT * FROM v_pelanggan WHERE id = :id"); $stmt->execute(['id' => $page[1]]); $userData = $stmt->fetch(PDO::FETCH_ASSOC); $stmt = $pdo->prepare("SELECT * FROM profile_tagihan WHERE id = :id"); $stmt->execute(['id' => $isi['id_profile_tagihan']]); $tagData = $stmt->fetch(PDO::FETCH_ASSOC); $hargaDasar = $userData['nominal_tagihan'] + ($userData['nominal_tagihan'] / 100 * 11); $hargaPaket = substr($hargaDasar, 0, -3) . '000'; $limit = $tagData['limit_tagihan'] - 1; $langganan = $userData['time_start']; // $mulaiLangganan = $langganan . ' WIB'; $mulaiLangganan = $langganan . ' WIB'; $tanggal = new DateTime($userData['mulai_pembayaran']); $tanggal->modify('+1 month'); $tanggalNow = $tanggal->format('Y-m-d'); $startPay = formatIndo($tanggalNow, 'F Y'); $freeWifi = formatIndo($langganan) . ' hingga 01 ' . $startPay; // 26 Oktober 2025 hingga 01 Desember 2025 // Data dari POST (contoh simulasi) $data = [ 'template_name' => 'ba_pemasangan', 'header' => [ 'nama_perusahaan' => 'PT. LINTAS JARINGAN NUSANTARA', 'kantor' => 'KANTOR LAYANAN CIKEMBAR', 'telp' => '+62 812-1161-0233', 'email' => 'info@rjn-net.id', 'website' => 'www.rjn-net.id', 'imglogo' => 'controller/surat_pdf/logo.png' ], 'body' => [ 'bodyHead' => [ 'parameter' => ['PT Lintas Jaringan Nusantara Kantor Layanan Cikembar'] ], 'bodyData' => [ 'Nomor Layanan' => $userData['akun'], 'Nama Pelanggan' => ucwords(strtolower($userData['nama'])), 'Nomor NIK / KTP' => $userData['nik'], 'Nomor WhatsApp' => $userData['nomor_whatsapp'], 'Alamat Rumah' => $userData['alamat'], 'Kordinat Rumah' => $userData['latitude'] . ', ' . $userData['longitude'], 'Wilayah / ID Area' => $userData['nama_topologi'], 'Nama Paket iNet' => $userData['nama_paket'], 'Tagihan Internet' => 'Rp. ' . number_format($hargaPaket) . ' (sudah termasuk PPN 11%)', 'Jatuh Tempo' => 'Setiap Bulan Tanggal ' . $limit, 'Nomor WA Penagih' => $userData['nomor_marketing'] . ' (' . $userData['nama_marketing'] . ')', 'Status Berlangganan' => ucwords($userData['status']), 'Terdaftar Sejak' => $mulaiLangganan, 'Status Alat' => 'Dipinjamkan (alat dalam rumah tanggung jawab pelanggan)', 'Kode Seri' => $userData['serial_number'], 'Status Pembayaran' => 'Via Transfer' ], 'bodyNote' => [ [ 'judul' => 'CATATAN PENTING', 'parameter' => [ 'Rp. 150.000', $startPay, $freeWifi, $startPay ] ], [ 'judul' => 'CARA PEMBAYARAN', 'parameter' => [$startPay] ], [ 'judul' => 'LAYANAN PELANGGAN', 'parameter' => [$userData['akun']] ], [ 'judul' => 'TENTANG KAMI', 'parameter' => [] ] ], 'bodyTTD' => [ 'nama' => 'PT. LINTAS JARINGAN NUSANTARA', 'jabatan' => 'Admin Kantor Layanan Cikembar', 'imgttd' => 'ttd_admin.png' ] ], 'footer' => [ 'parameter' => [] ] ]; // Gabung data + template $result = mergeTemplateWithData($data); // Buat PDF $pdf = new BA_Template($result); $pdf->BodyContent(); // Simpan file PDF // $pdfPath = 'berita_acara/pemasangan/BA-Pemasangan-' . ucwords(strtolower($userData['nama'])) . '-' . $userData['akun'] . '.pdf'; // $pdf->Output('F', $pdfPath); $objectPath = 'berita_acara/BA-Pemasangan-' . ucwords(strtolower($userData['nama'])) . '-' . $userData['akun'] . '.pdf'; require 'controller/uploadMinioFiles.php'; $pdfData = $pdf->Output('S'); // $objectPath = 'berita_acara/' . $filename; $uploadResult = uploadToMinioStorageRaw($pdfData, $objectPath); $fileOpen = 'https://storage.manjapro.net/files/' . $objectPath; // Tampilkan ke tab baru echo ''; } catch (Exception $e) { echo ''; } } // Buat Berita Acara Pengambilan Alat di Rumah pelanggan OFF if (isset($_POST['berita_acara'])) { try { // Ambil data perusahaan $ainvp = mysqli_query($con,"SELECT nama_perusahaan, alamat_perusahaan, telepon_perusahaan, logo_perusahaan FROM data_server WHERE id = '$isi[id_data_server]'"); // Cek apakah query berhasil if (!$ainvp) { throw new Exception('Gagal mengambil data perusahaan: ' . mysqli_error($con)); } $invp = mysqli_fetch_assoc($ainvp); $nama = $invp['nama_perusahaan']; $alamat = $invp['alamat_perusahaan']; $telepon = $invp['telepon_perusahaan']; $logo = $invp['logo_perusahaan']; // Membuat PDF require ('berita_acara/berita_acara.php'); $pdf = new PDF(); // Set header data perusahaan $pdf->setHeaderData($nama, $alamat, $telepon, $logo); $pdf->AddPage(); // Tambahkan data pelanggan $pdf->AddBeritaAcara($isi['akun'], $isi['nomor_whatsapp'], $isi['nama'], $isi['alamat']); // Output PDF ke file $objectPath = 'berita_acara/BA-Pengambilan-Alat-' . $isi['nama'] . '-' . $isi['akun'] . '.pdf'; // $pdf->Output('F', $objectPath); require 'controller/uploadMinioFiles.php'; $pdfData = $pdf->Output('S'); // $objectPath = 'berita_acara/' . $filename; $uploadResult = uploadToMinioStorageRaw($pdfData, $objectPath); $fileOpen = 'https://storage.manjapro.net/files/' . $objectPath; // Tampilkan PDF di tab baru echo ''; } catch (Exception $e) { sweetAlert("Error: ' . $e->getMessage() . '", "error"); } } if (isset($_POST['ubah'])) { $fotoodp1 = $_SESSION['uploaded_files']['odp'.$isi['id']]; $fotorumah1 = $_SESSION['uploaded_files']['rmh'.$isi['id']]; $fotoonu1 = $_SESSION['uploaded_files']['onu'.$isi['id']]; $fototes1 = $_SESSION['uploaded_files']['tes'.$isi['id']]; //clean serial nnumber $serialnumber = $_POST['serial_number'] ?? null; $serialnumber = str_replace(' ', '', $serialnumber); $serialnumber = preg_replace('/[^A-Za-z0-9]/', '', $serialnumber); $serialnumber = strtoupper($serialnumber); $stmt = $pdo->prepare("SELECT ip_address,username,password,port_api FROM setting_mikrotik WHERE id = :id"); $stmt->execute(['id' => $isi['id_setting_mikrotik']]); $mikEdit = $stmt->fetch(PDO::FETCH_ASSOC); if($_POST['jenis'] == "Hotspot"){ $hotspot = $_POST['user_hotspot']; } else { $hotspot = ""; $logubahpaket = ""; if ($isi['id_profile_paket'] != $_POST['idp']) { $userEdit = $isi['akun']; $stmt = $pdo->prepare("SELECT nama_profile FROM profile_paket WHERE id = :id"); $stmt->execute(['id' => $_POST['idp']]); $proPaket = $stmt->fetch(PDO::FETCH_ASSOC); if ($proPaket && !empty($proPaket['nama_profile'])) { $profileNew = $proPaket['nama_profile']; $API = new RouterosAPI(); $API->debug = false; if ($API->connect2($mikEdit['ip_address'], $mikEdit['username'], $mikEdit['password'], $mikEdit['port_api'])) { $arrID = $API->comm("/ppp/secret/getall", [ ".proplist"=> ".id", "?name" => $userEdit, ]); if (!empty($arrID)) { $API->comm("/ppp/secret/set", [ ".id" => $arrID[0][".id"], "profile" => $profileNew, ]); $arrID1 = $API->comm("/ppp/active/getall", [ ".proplist" => ".id", "?name" => $userEdit, ]); if (!empty($arrID1)) { $API->comm("/ppp/active/remove", [ ".id" => $arrID1[0][".id"], ]); } } $API->disconnect(); $logubahpaket = "dan paket di Mikrotik "; } else { sweetAlert("Perubahan paket gagal, Aplikasi tidak terhubung ke mikrotik", "error"); exit(); } } } } // DI kurangi 1 bulan agar cronjob berjalan sesuai harapan $Formatted = date('Y-m-d', strtotime($_POST['mulai_pembayaran'])); $date1 = new DateTime($Formatted); $date1->modify('-1 month'); $mulaiBayarFix = $date1->format('Y-m-d'); $SQL = "UPDATE pelanggan SET id_data_server = :id_data_server, id_setting_mikrotik = :id_setting_mikrotik, id_profile_paket = :id_profile_paket, id_master_topologi = :id_master_topologi, id_marketing = :id_marketing, id_master_desa = :id_master_desa, id_profile_tagihan = :id_profile_tagihan, port_odp = :port_odp, jenis_layanan = :jenis_layanan, nama = :nama, nik = :nik, alamat = :alamat, latitude = :latitude, longitude = :longitude, nomor_whatsapp = :nomor_whatsapp, email = :email, akun = :akun, user_hotspot = :user_hotspot, foto_odp = :foto_odp, foto_rumah = :foto_rumah, foto_onu = :foto_onu, foto_test = :foto_test, serial_number = :serial_number, mulai_pembayaran = :mulai_pembayaran WHERE id = :id"; try { $stmt = $pdo->prepare($SQL); $stmt->execute([ ':id_data_server' => $_POST['ids'], ':id_setting_mikrotik' => $_POST['ism'], ':id_profile_paket' => $_POST['idp'], ':id_master_topologi' => $_POST['odp'], ':id_marketing' => $_POST['idm'], ':id_master_desa' => $_POST['desa'], ':id_profile_tagihan' => $_POST['profiletag'], ':port_odp' => $_POST['port'], ':jenis_layanan' => $_POST['jenis'], ':nama' => $_POST['nama'], ':nik' => $_POST['nik'], ':alamat' => $_POST['alamat'], ':latitude' => $_POST['latitude'], ':longitude' => $_POST['longitude'], ':nomor_whatsapp' => $_POST['nowa'], ':email' => $_POST['email'], ':akun' => $_POST['akun'], ':user_hotspot' => $hotspot, ':foto_odp' => $fotoodp1, ':foto_rumah' => $fotorumah1, ':foto_onu' => $fotoonu1, ':foto_test' => $fototes1, ':serial_number' => $serialnumber, ':mulai_pembayaran' => $mulaiBayarFix, ':id' => $page[1] ]); sweetAlert("Data pelanggan " . $logubahpaket . "berhasil diubah ", "success"); } catch (PDOException $e) { // Handle error appropriately sweetAlert("Error: " . $e->getMessage(), "error"); // echo "Error: " . $e->getMessage(); } } //Nonaktifkan Pelanggan if (isset($_POST['nonaktifkan'])) { $set1 = $con->query("SELECT ip_address,username,password,port_api FROM setting_mikrotik WHERE id = '$isi[id_setting_mikrotik]'"); $pset = $set1->fetch_assoc(); $m_ip = $pset['ip_address']; $m_user = $pset['username']; $m_pass = $pset['password']; $m_port = $pset['port_api']; // require('router_api/routeros_api.class.php'); $API = new RouterosAPI(); $API->debug = false; if ($API->connect2($m_ip, $m_user, $m_pass, $m_port)) { $arrID=$API->comm("/ppp/secret/getall", array( ".proplist"=> ".id", "?name" => $user , )); $API->comm("/ppp/secret/set", array( ".id" => $arrID[0][".id"], "disabled" => "true", )); $arrID1=$API->comm("/ppp/active/getall", array( ".proplist"=> ".id", "?name" => $user , )); $API->comm("/ppp/active/remove", array( ".id" => $arrID1[0][".id"], )); $API->disconnect(); } $up = $con->query("UPDATE pelanggan SET status = 'tidak aktif', status_koneksi = 'Off' WHERE id = '$page[1]'"); if ($up) { sweetAlert("Pelanggan Telah di Non Aktifkan", "success"); } } //Aktifkan Pelanggan if (isset($_POST['aktifkan'])) { $set1 = $con->query("SELECT ip_address,username,password,port_api FROM setting_mikrotik WHERE id = '$isi[id_setting_mikrotik]'"); $pset = $set1->fetch_assoc(); $m_ip = $pset['ip_address']; $m_user = $pset['username']; $m_pass = $pset['password']; $m_port = $pset['port_api']; // require('router_api/routeros_api.class.php'); $API = new RouterosAPI(); $API->debug = false; if ($API->connect2($m_ip, $m_user, $m_pass, $m_port)) { $arrID=$API->comm("/ppp/secret/getall", array( ".proplist"=> ".id", "?name" => $user , )); $API->comm("/ppp/secret/set", array( ".id" => $arrID[0][".id"], "disabled" => "false", )); $API->disconnect(); } $up = $con->query("UPDATE pelanggan SET status = 'aktif' WHERE id = '$page[1]'"); if ($up) { sweetAlert("Pelanggan Telah di Aktifkan", "success"); } } if (isset($_POST['sampah'])) { $set1 = $con->query("SELECT ip_address,username,password,port_api FROM setting_mikrotik WHERE id = '$isi[id_setting_mikrotik]'"); $pset = $set1->fetch_assoc(); $m_ip = $pset['ip_address']; $m_user = $pset['username']; $m_pass = $pset['password']; $m_port = $pset['port_api']; // require('router_api/routeros_api.class.php'); $API = new RouterosAPI(); $API->debug = false; if ($API->connect2($m_ip, $m_user, $m_pass, $m_port)) { $arrID=$API->comm("/ppp/secret/getall", array( ".proplist"=> ".id", "?name" => $user , )); $API->comm("/ppp/secret/set", array( ".id" => $arrID[0][".id"], "disabled" => "true", )); $arrID1=$API->comm("/ppp/active/getall", array( ".proplist"=> ".id", "?name" => $user , )); $API->comm("/ppp/active/remove", array( ".id" => $arrID1[0][".id"], )); $API->disconnect(); } $up = $con->query("UPDATE pelanggan SET status = 'sampah', status_koneksi = 'Off' WHERE id = '$page[1]'"); if ($up) { sweetAlert("Pelanggan Telah di pindahkan ke Sampah", "info", "?".encrypt_url('user_sampah')); } } if (isset($_POST['hapus'])) { $iddata = $page[1]; deleteAlert("pelanggan",$iddata, '?'.encrypt_url($page[2])); } $_SESSION['uploaded_files']['odp'.$isi['id']] = $isi['foto_odp']; $_SESSION['uploaded_files']['rmh'.$isi['id']] = $isi['foto_rumah']; $_SESSION['uploaded_files']['onu'.$isi['id']] = $isi['foto_onu']; $_SESSION['uploaded_files']['tes'.$isi['id']] = $isi['foto_test']; ?>