<?php namespace App\Http\Controllers;

use App\Models\Ipspengadaan;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Illuminate\Support\Facades\DB;
use Validator, Input, Redirect ; 

class IpspengadaanController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'ipspengadaan';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Ipspengadaan();
		
		$this->info = $this->model->makeInfo( $this->module);
		$this->access = $this->model->validAccess($this->info['id']);
	
		$this->data = array(
			'pageTitle'			=> 	$this->info['title'],
			'pageNote'			=>  $this->info['note'],
			'pageModule'		=> 'ipspengadaan',
			'pageUrl'			=>  url('ipspengadaan'),
			'return' 			=> 	self::returnUrl()	
		);	
			config(['app.debug' => true]);
				
	} 
	public function index()
	{
		if(!\Auth::check()) 
			return redirect('user/login')->with('status', 'error')->with('message','You are not login');

		$this->access = $this->model->validAccess($this->info['id'] , session('gid'));
		if($this->access['is_view'] ==0) 
			return redirect('dashboard')->with('message',__('core.note_restric'))->with('status','error');
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['tableForm'] 	= $this->info['config']['forms'];
		$this->data['tableGrid'] 	= $this->info['config']['grid'];
		usort($this->data['tableGrid'], "SiteHelpers::_sort");
			$cols = '{"data":"rowId"},';
			if($this->data['setting']['view-method'] =='expand'){
				$cols .= '{"className": "details-control","orderable": false,"data": null,"defaultContent": ""},';
			}		
				
			foreach($this->data['tableGrid'] as $field)
			{				
				
				if($field['view'] =='1')
				{
					$cols .= '{"data":"'.$field['field'].'"},';
				}						
			}
			$cols .= '{"data":"action"},';
		$this->data['column'] = $cols ;	
		$this->data['access']		= $this->access;	
		$this->data['setting'] 		= $this->info['setting'];
		return view('ipspengadaan.index',$this->data);
	}
	function create( Request $request ) 
	{
		$this->hook( $request  );
		if($this->access['is_add'] ==0) 
			return redirect('dashboard')->with('message', __('core.note_restric'))->with('status','error');

		$this->data['row'] = $this->model->getColumnTable( $this->info['table']); 
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['id'] = '';
		return view($this->module.'.form',$this->data);
	}
	function edit( Request $request , $id ) 
	{
		$this->hook( $request , $id );
		if(!isset($this->data['row']))
			return redirect($this->module)->with('message','Record Not Found !')->with('status','error');
		if($this->access['is_edit'] ==0 )
			return redirect('dashboard')->with('message',__('core.note_restric'))->with('status','error');
		$this->data['row'] = (array) $this->data['row'];
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['id'] = $id;
		return view($this->module.'.form',$this->data);
	}
	function show( Request $request , $id ) 
	{
		/* Handle import , export and view */
		$task =$id ;
		switch( $task)
		{
			case 'search':
				return $this->getSearch();
				break;
			case 'lookup':
				return $this->getLookup($request );
				break;
			case 'comboselect':
				return $this->getComboselect( $request );
				break;
			case 'import':
				return $this->getImport( $request );
			case 'removefiles':
				return $this->getRemovefiles( $request );	
				break;
			case 'export':
				return $this->getExport( $request );
				break;
			case 'syncDataPkIps':
				return $this->syncDataPkIps( $request );
				break;
			case 'syncPrIps':
				return $this->syncPrIps( $request );
				break;
			case 'syncHpsIps':
				return $this->syncHpsIps( $request );
				break;
			case 'syncPP':
				return $this->syncPP( $request );
				break;
			case 'getDataPengadaan':
				return $this->getDataPengadaan( $request );
				break;
			case 'formDataPengadaan':
				return $this->formDataPengadaan( $request );
				break;
			default:
				$this->hook( $request , $id );
				if(!isset($this->data['row']))
					return redirect($this->module)->with('message','Record Not Found !')->with('status','error');

				if($this->access['is_detail'] ==0) 
					return redirect('dashboard')->with('message', __('core.note_restric'))->with('status','error');

				return view($this->module.'.view',$this->data);	
				break;		
		}
	}	
	public function store( Request $request){

		$task = $request->input('action_task');
		switch ($task)
		{
			default:
				return $this->postData( $request);
				break;
			case 'save':
				$rules = $this->validateForm();
				$validator = Validator::make($request->all(), $rules);
				if ($validator->passes()) 
				{
					$data = $this->validatePost( $request );
					$id = $this->model->insertRow($data , $request->input( $this->info['key']));
					
					/* Insert logs */
					$this->model->logs($request , $id);
					return response()->json(array('status'=>'success','message'=> __('core.note_success')));	
					
				} 
				else {
					$message = $this->validateListError(  $validator->getMessageBag()->toArray() );
					return response()->json(array(
						'message'	=> $message,
						'status'	=> 'error'
					));	
				}
				break;
			case 'delete':
				return $result = $this->destroy( $request );
				break;

			case 'import':
				return $this->PostImport( $request );
				break;

			case 'copy':
				$result = $this->copy( $request );
				return response()->json($result);
				break;		
			case 'saveChecklist':
				return $this->saveChecklist( $request );
				break;
			case 'deleteChecklist':
				return $this->deleteChecklist( $request );
				break;
			case 'saveNoKontrak':
				return $this->saveNoKontrak( $request );
				break;

		}
	}
	public function postData( $request)
	{ 
		
		$this->access = $this->model->validAccess($this->info['id'] , session('gid'));

		$tables 	= $this->info['config']['grid'];
		$cols = array();
		foreach($tables as $field)
		{				
			//$cols[$this->info['key']]	= array('db'=> $field['alias'] ,$this->info['key'] );
			if($field['view'] =='1')
			{
				$cols[] = array('db'=> $field['alias'],'dt'=> $field['field'] );
			}					
		}
		$conf = DataHelpers::simple($request->all(),$cols);
		$filter =  '';
		if(!is_null($request->input('search')))
		{
			$filter .= $this->liveSearch( $request);
		}

		$params = array(
			'page'		=> $conf['page'] ,
			'limit'		=> $conf['limit'] ,
			'sort'		=> ($conf['order']['sort'] !='' ? $conf['order']['sort'] : $this->info['setting']['orderby']) ,
			'order'		=> ($conf['order']['by'] !='' ? $conf['order']['by'] : $this->info['setting']['ordertype']),
			'params'	=> $filter,
			'global'	=> (isset($this->access['is_global']) ? $this->access['is_global'] : 0 )
		);


		$results = $this->model->getRows($params);
		
		$array = array();
		foreach($results['rows'] as $row)
		{
			$values = array();
			$values['rowId'] = $row->{$this->info['key']};
			foreach($tables as $field)
			{			
				
				if($field['view'] =='1')
				{
					$values[$field['field']] = \SiteHelpers::formatRows($row->{$field['field']}, $field , $row);
				}	
			}
			$values['action'] =  \SiteHelpers::buttonAction($this->module,$this->access ,$row->{$this->info['key']} ,$this->info['setting']) ;
			$array[] = $values; 	
		}
		
		$data = array(
			'draw'			=> (!is_null($request->input('draw')) ? intval($request->input('draw') ) : 0), 
			'recordsTotal'	=> $results['total'] ,
			'recordsFiltered'	=> $results['total'],
			'data'				=> $array

		);
		return response()->json($data);
	}

	public function destroy( Request $request)
	{

		if(!\Auth::check()) 
			return response()->json(array(
				'status'=>'error',
				'message'=> 'You are not login'
			));

		$this->access = $this->model->validAccess($this->info['id'] , session('gid'));
		if($this->access['is_remove'] ==0) 
			return response()->json(array('status'=>'error','message'=> __('core.note_restric')));	


		// delete multipe rows 
		if(count($request->input('ids')) >=1)
		{
			$this->model->destroy($request->input('ids'));
			
			return response()->json(array(
				'status'=>'success',
				'message'=> __('core.note_success_delete')
			));
		} else {
			return response()->json(array(
				'status'=>'error',
				'message'=> __('core.note_error')
			));

		} 		

	}

	public function syncDataPkIps(Request $request)
	{
		
		$url = 'https://ips.ptpn.id/tendering/report_pk';
		$cookieRow = \DB::table('master_cookie_prodis_pg')->where('kode_pg', 'IPS')->first();

		$cookie = '';
		if ($cookieRow) {
			$cookies = json_decode($cookieRow->cookie, true);
			if (is_array($cookies)) {
				foreach ($cookies as $c) {
					if ($c['name'] === 'ci_session') {
						$cookie = 'ci_session=' . $c['value'];
						break;
					}
				}
			}
		}

		// Build POST data
		$postData = [
			'filters' => [
				'created_at' => ['active' => 1],
				'created_at_start' => ['value' => '02-09-2025'],
				'created_at_end' => ['value' => ''],
				'submited_at' => ['active' => 1],
				'submited_at_start' => ['value' => ''],
				'submited_at_end' => ['value' => ''],
				'tgl_submit_pp' => ['active' => 1],
				'tgl_submit_pp_start' => ['value' => ''],
				'tgl_submit_pp_end' => ['value' => ''],
				'sub_sumber_dana' => ['active' => 1, 'value' => ''],
				'sub_sumber_dana_eks' => ['active' => 1, 'value' => '35'],
				'tahun_anggaran' => ['active' => 1, 'value' => ''],
				'porg' => ['active' => 1, 'value' => ''],
				'filter_harga' => ['active' => 1, 'value' => ''],
				'filter_bersama' => ['active' => 1, 'value' => ''],
				'filter_pp' => ['active' => 1, 'value' => ''],
			],
			'draw' => 3,
			'columns' => [
				['data' => 'id', 'name' => 'paket_pekerjaan.id', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'pk_number', 'name' => 'paket_pekerjaan.pk_number', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'title', 'name' => 'paket_pekerjaan.title', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'name', 'name' => 'users.name', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'role_user_ftk', 'name' => 'role_user.role_user_ftk', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'nilai_pk', 'name' => 'pr_per_pk.nilai_pk', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'created_at', 'name' => 'created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'submited_at', 'name' => 'submited_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'panitia_hps', 'name' => 'panitia_tender.description', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'tgl_submit_pp', 'name' => 'tgl_submit_pp', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'panitia_tender_pengadaan', 'name' => 'panitia_pengadaan.description', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'status', 'name' => 'paket_pekerjaan.status', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'pengadaan_bersama', 'name' => 'paket_pekerjaan.pengadaan_bersama', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'sumber_dana', 'name' => 'paket_pekerjaan.sumber_dana', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'sub_sumber_dana', 'name' => 'sub_sumber_dana.sub_sumber_dana', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'sub_sumber_dana_eks', 'name' => 'sub_sumber_dana_eks.sub_sumber_dana', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'tahun_anggaran', 'name' => 'paket_pekerjaan.tahun_anggaran', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'pk_bersama', 'name' => 'pk_parent.pk_number', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				['data' => 'pp_no', 'name' => 'paket_pengadaan.pp_no', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
			],
			'order' => [['column' => 1, 'dir' => 'ASC']],
			'start' => 0,
			'length' => 10,
			'search' => ['value' => '', 'regex' => false],
			'_' => 1772422778869
		];

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_POST, true);
		curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
		curl_setopt($ch, CURLOPT_COOKIE, $cookie);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36');
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			'accept: application/json, text/javascript, */*; q=0.01',
			'accept-language: id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,und;q=0.6,ms;q=0.5',
			'x-requested-with: XMLHttpRequest',
			'referer: https://ips.ptpn.id/tendering/report_pk',
		]);

		$response = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
			$rawJson = trim($response);
				$start   = strpos($rawJson, '{');
				$end     = strrpos($rawJson, '}');

				if ($start !== false && $end !== false && $end > $start) {
					$rawJson = substr($rawJson, $start, $end - $start + 1);
				}

				// jika mau lihat text JSON mentah:
				# return response($rawJson, 200)->header('Content-Type', 'application/json');

				$data = json_decode($rawJson, true);

				if (json_last_error() !== JSON_ERROR_NONE) {
					return response()->json([
						'status' => 'error',
						'message' => 'JSON tidak valid: ' . json_last_error_msg(),
						'sample' => substr($rawJson, 0, 500)
					], 422);
				}

			\DB::table('data_pk_ips')->truncate();
			if(isset($data['data']) && is_array($data['data'])) {
				foreach($data['data'] as $row) {
					$insertData = [
						'pk_number' => $row['pk_number'] ?? null,
						'pk_bersama' => $row['pk_bersama'] ?? null,
						'pp_no' => $row['pp_no'] ?? null,
						'title' => $row['title'] ?? null,
						'nilai_pk' => $row['original']['nilai_pk'] ?? null,
						'pengadaan_bersama' => $row['pengadaan_bersama'] ?? null,
						'req_to' => $row['req_to'] ?? null,
						'pengadaan_ho' => $row['pengadaan_ho'] ?? null,
						'sumber_dana' => $row['sumber_dana'] ?? null,
						'tahun_anggaran' => $row['tahun_anggaran'] ?? null,
						'sub_sumber_dana' => $row['sub_sumber_dana'] ?? null,
						'sub_sumber_dana_eks' => $row['sub_sumber_dana_eks'] ?? null,
						'ref_item' => $row['ref_item'] ?? null,
						'ref' => $row['ref'] ?? null,
						'role_user_ftk' => $row['role_user_ftk'] ?? null,
						'name' => $row['name'] ?? null,
						'created_at' => $row['created_at'] ?? null,
						'submited_at' => $row['submited_at'] ?? null,
						'panitia_hps' => $row['panitia_hps'] ?? null,
						'panitia_tender_pengadaan' => $row['panitia_tender_pengadaan'] ?? null,
						'status_pp' => $row['status_pp'] ?? null,
						'pp_id' => $row['pp_id'] ?? null,
						'tgl_submit_pp' => $row['tgl_submit_pp'] ?? null,
						'status' => $row['status'] ?? null,
					];

					$subSumberDanaEks = $row['sub_sumber_dana_eks'] ?? '';
					if (strpos($subSumberDanaEks, 'Kebun') !== false) {
						
						\DB::table('data_pk_ips')->updateOrInsert(
							['pk_number' => $insertData['pk_number'], 'pp_no' => $insertData['pp_no']],
							$insertData
						);
					}
				}
				return response()->json(['status' => 'success', 'message' => 'Data synced successfully']);
			}
			return response()->json(['status' => 'error', 'message' => 'No data received']);
			
		}

		public function syncPrIps(Request $request)
		{
			$url = 'https://ips.ptpn.id/tendering/monitoring_pr_all';
			$cookieRow = \DB::table('master_cookie_prodis_pg')->where('kode_pg', 'IPS')->first();

			$cookie = '';
			if ($cookieRow) {
				$cookies = json_decode($cookieRow->cookie, true);
				if (is_array($cookies)) {
					foreach ($cookies as $c) {
						if ($c['name'] === 'ci_session') {
							$cookie = 'ci_session=' . $c['value'];
							break;
						}
					}
				}
			}

			$postData = [
				'filters[company_id][active]' => 1,
				'filters[company_id][value]' => 'SGN',
				'filters[plant_id][value]' => '',
				'filters[porg][active]' => 1,
				'filters[porg][value]' => 'SGN1',
				'filters[created_at][active]' => 1,
				'filters[created_at_start][value]' => '01-01-2025',
				'filters[created_at_end][value]' => '03-03-2026',
				'filters[approved_at_start][value]' => '',
				'filters[approved_at_end][value]' => '',
				'draw' => 2,
				'columns' => [
					['data' => 'id', 'name' => 'material_requests.id', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'company_id', 'name' => 'purchase_requisitions.company_id', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'purchasing_organization', 'name' => 'purchasing_organization', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'plant', 'name' => 'plants.plant', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'no_pr', 'name' => 'purchase_requisitions.pr_number', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_pr', 'name' => 'purchase_requisitions.created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_verif_pr', 'name' => 'tgl_verif_pr', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'pk_number', 'name' => 'paket_pekerjaan.pk_number', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_pk', 'name' => 'tgl_pk', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'pk_bersama', 'name' => 'case when pk_parent.id is not null and paket_pekerjaan.pengadaan_bersama=1 then pk_parent.pk_number else \'\' end', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'pk_konsolidasi', 'name' => 'case when pk_parent.id is not null and paket_pekerjaan.pengadaan_bersama=0 then pk_parent.pk_number else \'\' end', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_pk_bersama', 'name' => 'tgl_pk_bersama', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_verif_pk', 'name' => 'tgl_verif_pk', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'pp_no', 'name' => 'paket_pengadaan.pp_no', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_pp', 'name' => 'paket_pengadaan.created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_pelaksanaan_pp', 'name' => 'paket_pengadaan.tanggal_pengumuman', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_award', 'name' => 'pemenang.created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sppbj_no', 'name' => 'sppbj.sppbj_no', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_sppbj', 'name' => 'sppbj.created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_approval_sppbj', 'name' => 'sppbj.approved_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'perikatan_no', 'name' => 'CASE WHEN perikatan.perikatan_type = \'PO\' THEN COALESCE(po.po_sap_no,po.po_no) ELSE COALESCE(perikatan.oa_sap_no,perikatan.agreement_no) END', 'searchable' => true, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_kontrak', 'name' => 'perikatan.created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_release_kontrak', 'name' => 'po.created_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor', 'name' => 'vendors.vendor', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				],
				'order' => [['column' => 1, 'dir' => 'ASC']],
				'start' => 0,
				'length' => 20000,
				'search' => ['value' => '', 'regex' => false],
				'_' => time() . '000'
			];

			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
			curl_setopt($ch, CURLOPT_COOKIE, $cookie);
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36');
			curl_setopt($ch, CURLOPT_HTTPHEADER, [
				'accept: application/json, text/javascript, */*; q=0.01',
				'accept-language: id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,und;q=0.6,ms;q=0.5',
				'x-requested-with: XMLHttpRequest',
				'referer: https://ips.ptpn.id/tendering/monitoring_pr_all',
			]);

			$response = curl_exec($ch);
			$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
			curl_close($ch);

			$rawJson = trim($response);
			$start   = strpos($rawJson, '{');
			$end     = strrpos($rawJson, '}');

			if ($start !== false && $end !== false && $end > $start) {
				$rawJson = substr($rawJson, $start, $end - $start + 1);
			}

			$data = json_decode($rawJson, true);

			if (json_last_error() !== JSON_ERROR_NONE) {
				return response()->json([
					'status' => 'error',
					'message' => 'JSON tidak valid: ' . json_last_error_msg(),
					'sample' => substr($rawJson, 0, 500)
				], 422);
			}

			if(isset($data['data']) && is_array($data['data'])) {
				foreach($data['data'] as $row) {
					
					$insertData = [
						'company_id' => $row['company_id'] ?? null,
						'plant_id' => $row['plant_id'] ?? null,
						'no_pr' => $row['no_pr'] ?? null,
						'tgl_pr' => $row['original']['tgl_pr'] ?? null,
						'pri_purchasing_org' => $row['purchasing_organization'] ?? null,
						'plant' => $row['plant'] ?? null,
						'tgl_verif_pr' => $row['original']['tgl_verif_pr'] ?? null,
						'pk_number' => $row['pk_number'] ?? null,
						'pk_bersama' => $row['pk_bersama'] ?? null,
						'pk_konsolidasi' => $row['pk_konsolidasi'] ?? null,
						'tgl_pk' => $row['tgl_pk'] ?? null,
						'tgl_pk_bersama' => $row['original']['tgl_pk_bersama'] ?? null,
						'tgl_verif_pk' => $row['original']['tgl_verif_pk'] ?? null,
						'pp_no' => $row['pp_no'] ?? null,
						'tgl_pp' => $row['original']['tgl_pp'] ?? null,
						'tgl_pelaksanaan_pp' => $row['original']['tgl_pelaksanaan_pp'] ?? null,
						'tgl_award' => $row['original']['tgl_award'] ?? null,
						'vendor' => $row['vendor'] ?? null,
						'sppbj_no' => $row['sppbj_no'] ?? null,
						'tgl_sppbj' => $row['original']['tgl_sppbj'] ?? null,
						'tgl_approval_sppbj' => $row['original']['tgl_approval_sppbj'] ?? null,
						'perikatan_no' => $row['perikatan_no'] ?? null,
						'tgl_kontrak' => $row['original']['tgl_kontrak'] ?? null,
						'tgl_release_kontrak' => $row['original']['tgl_release_kontrak'] ?? null,
						'purchasing_organization' => $row['purchasing_organization'] ?? null,
					];

					$plant = $row['plant'] ?? '';
					if (strpos($plant, 'Kebun') !== false || strpos($plant, 'MKSO') !== false) {						
						\DB::table('data_pr_ips')->updateOrInsert(
							['no_pr' => $insertData['no_pr']],
							$insertData
						);
					}
				}
				return response()->json(['status' => 'success', 'message' => 'Data PR IPS synced successfully']);
			}
			return response()->json(['status' => 'error', 'message' => 'No data received']);
		}

		public function syncHpsIps(Request $request)
		{
			$url = 'https://ips.ptpn.id/contracts/sppbj';
			$cookieRow = \DB::table('master_cookie_prodis_pg')->where('kode_pg', 'IPS')->first();

			$cookie = '';
			if ($cookieRow) {
				$cookies = json_decode($cookieRow->cookie, true);
				if (is_array($cookies)) {
					foreach ($cookies as $c) {
						if ($c['name'] === 'ci_session') {
							$cookie = 'ci_session=' . $c['value'];
							break;
						}
					}
				}
			}

			$postData = [
				'filters[company_id][active]' => 1,
				'filters[company_id][value]' => 'SGN',
				'filters[created_at][active]' => 1,
				'filters[created_at_start][value]' => '',
				'filters[created_at_end][value]' => '',
				'filters[tahun_anggaran][active]' => 1,
				'filters[tahun_anggaran][value]' => '',
				'filters[pengadaan_bersama][active]' => 1,
				'filters[pengadaan_bersama][value]' => '',
				'filters[status][active]' => 1,
				'filters[status][value]' => '',
				'draw' => 2,
				'columns' => [
					['data' => 'id', 'name' => 'sppbj.id', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'no_ref', 'name' => 'case when sppbj_ref = \'pp\' then sppbj.pp_no when sppbj_ref = \'pk\' then sppbj.pk_no else \'-\' end', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'pk_number', 'name' => 'pk_child.pk_number', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sppbj_no', 'name' => 'sppbj.sppbj_no', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'title', 'name' => 'sppbj.title', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor', 'name' => 'vendors.vendor', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'value_hps', 'name' => 'sppbj.value_hps', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sppbj_date', 'name' => 'sppbj.sppbj_date', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sppbj_status', 'name' => '', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => '_action', 'name' => '', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'panitia', 'name' => '', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
				],
				'order' => [['column' => 0, 'dir' => 'DESC']],
				'start' => 0,
				'length' => 10,
				'search' => ['value' => '', 'regex' => false],
				'_' => 1772504624780
			];

			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
			curl_setopt($ch, CURLOPT_COOKIE, $cookie);
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36');
			curl_setopt($ch, CURLOPT_HTTPHEADER, [
				'accept: application/json, text/javascript, */*; q=0.01',
				'accept-language: id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,und;q=0.6,ms;q=0.5',
				'x-requested-with: XMLHttpRequest',
				'referer: https://ips.ptpn.id/contracts/sppbj',
			]);

			$response = curl_exec($ch);
			$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
			curl_close($ch);

			$rawJson = trim($response);
			$start = strpos($rawJson, '{');
			$end = strrpos($rawJson, '}');

			if ($start !== false && $end !== false && $end > $start) {
				$rawJson = substr($rawJson, $start, $end - $start + 1);
			}

			$data = json_decode($rawJson, true);

			if (json_last_error() !== JSON_ERROR_NONE) {
				return response()->json([
					'status' => 'error',
					'message' => 'JSON tidak valid: ' . json_last_error_msg(),
					'sample' => substr($rawJson, 0, 500)
				], 422);
			}

			if(isset($data['data']) && is_array($data['data'])) {
				foreach($data['data'] as $row) {
					$insertData = [
						'sppbj_no' => $row['sppbj_no'] ?? null,
						'title' => $row['title'] ?? null,
						'value_hps' => $row['original']['value_hps'] ?? null,
						'sppbj_date' => $row['original']['sppbj_date'] ?? null,
						'sppbj_status' => $row['original']['sppbj_status'] ?? null,
						'panitia' => $row['original']['panitia'] ?? null,
						'pk_number' => $row['pk_number'] ?? null,
						'vendor' => $row['vendor'] ?? null,
						'tgl_sppbj' => $row['sppbj_date'] ?? null,
						'no_ref' => $row['no_ref'] ?? null,
						'_action' => $row['_action'] ?? null,
					];

					\DB::table('data_hps_ips')->updateOrInsert(
						['sppbj_no' => $insertData['sppbj_no']],
						$insertData
					);
				}
				return response()->json(['status' => 'success', 'message' => 'Data HPS IPS synced successfully']);
			}
			return response()->json(['status' => 'error', 'message' => 'No data received']);
		}

		public function syncPP(Request $request)
		{
			$url = 'https://ips.ptpn.id/tendering/report_pengadaan';
			$cookieRow = \DB::table('master_cookie_prodis_pg')->where('kode_pg', 'IPS')->first();

			$cookie = '';
			if ($cookieRow) {
				$cookies = json_decode($cookieRow->cookie, true);
				if (is_array($cookies)) {
					foreach ($cookies as $c) {
						if ($c['name'] === 'ci_session') {
							$cookie = 'ci_session=' . $c['value'];
							break;
						}
					}
				}
			}

			$postData = [
				'filters[company_id][active]' => 1,
				'filters[company_id][value]' => 'SGN',
				'filters[porg][active]' => 1,
				'filters[porg][value]' => 'SGN1',
				'filters[created_at][active]' => 1,
				'filters[created_at_start][value]' => '07-10-2025',
				'filters[created_at_end][value]' => '',
				'filters[pp_no][active]' => 1,
				'filters[pp_no][value]' => '',
				'filters[sppbj_no][active]' => 1,
				'filters[sppbj_no][value]' => '',
				'filters[approved_at][active]' => 1,
				'filters[approved_at_start][value]' => '',
				'filters[approved_at_end][value]' => '',
				'filters[tahun_anggaran][active]' => 1,
				'filters[tahun_anggaran][value]' => '',
				'draw' => 2,
				'columns' => [
					['data' => 'id', 'name' => 'sppbj.id', 'searchable' => false, 'orderable' => false],
					['data' => 'company_id', 'name' => 'sppbj.company_id', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'metode_pengadaan', 'name' => 'metode_pengadaan.metode_pengadaan', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'pp_no', 'name' => 'paket_pengadaan.pp_no', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'ref', 'name' => 'paket_pekerjaan.ref', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'title', 'name' => 'paket_pekerjaan.title', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'panitia_tender', 'name' => 'panitia_tender.description', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sppbj_no', 'name' => 'sppbj.sppbj_no', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_pp', 'name' => 'paket_pengadaan.tanggal_pengumuman', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tgl_sppbj', 'name' => 'sppbj.approved_at', 'searchable' => false, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor', 'name' => 'vendors.vendor', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'provider_type', 'name' => 'provider_types.provider_type', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor_qualification', 'name' => 'vendor_qualifications.vendor_qualification', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'metode_evaluation', 'name' => 'paket_pengadaan.metode_evaluation', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'metode_penyampaian', 'name' => 'paket_pengadaan.metode_penyampaian', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor_diundang', 'name' => '(select count(x.id) from tendering.pp_vendors x where x.pp_id = paket_pengadaan.id)', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor_daftar', 'name' => '(select count(x.id) from tendering.pp_vendors x where x.pp_id = paket_pengadaan.id and x.status_register=1)', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor_minat', 'name' => '(select count(x.id) from tendering.pp_vendors x where x.pp_id = paket_pengadaan.id and x.status_minat=1)', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'vendor_menawar', 'name' => '(select count(DISTINCT x.vendor_id) from tendering.nego_penawaran x where x.pp_id = paket_pengadaan.id)', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'ref_item', 'name' => 'paket_pekerjaan.ref_item', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'durasi', 'name' => 'durasi', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'kpi', 'name' => 'kpi', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'kinerja', 'name' => 'kinerja', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'anggaran', 'name' => 'hps.anggaran', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'hps_total', 'name' => 'hps.hps_total', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'value_hps', 'name' => 'sppbj.value_hps', 'searchable' => false, 'orderable' => false, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sumber_dana', 'name' => 'paket_pekerjaan.sumber_dana', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sub_sumber_dana', 'name' => 'sub_sumber_dana.sub_sumber_dana', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'sub_sumber_dana_eks', 'name' => 'sub_sumber_dana_eks.sub_sumber_dana', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'tahun_anggaran', 'name' => 'paket_pekerjaan.tahun_anggaran', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
					['data' => 'purchasing_group', 'name' => 'purchasing_groups.purchasing_group', 'searchable' => true, 'orderable' => true, 'search' => ['value' => '', 'regex' => false]],
				],
				'order' => [['column' => 1, 'dir' => 'ASC']],
				'start' => 0,
				'length' => 100,
				'search' => ['value' => '', 'regex' => false],
				'_' => time() . '000'
			];

			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
			curl_setopt($ch, CURLOPT_COOKIE, $cookie);
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36');
			curl_setopt($ch, CURLOPT_HTTPHEADER, [
				'accept: application/json, text/javascript, */*; q=0.01',
				'accept-language: id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,und;q=0.6,ms;q=0.5',
				'x-requested-with: XMLHttpRequest',
				'referer: https://ips.ptpn.id/tendering/report_pengadaan',
			]);

			$response = curl_exec($ch);
			$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
			curl_close($ch);

			$rawJson = trim($response);
			$start   = strpos($rawJson, '{');
			$end     = strrpos($rawJson, '}');

			if ($start !== false && $end !== false && $end > $start) {
				$rawJson = substr($rawJson, $start, $end - $start + 1);
			}

			$data = json_decode($rawJson, true);
			print_r($data); // Debug: Tampilkan data mentah yang diterima

			if (json_last_error() !== JSON_ERROR_NONE) {
				return response()->json([
					'status' => 'error',
					'message' => 'JSON tidak valid: ' . json_last_error_msg(),
					'sample' => substr($rawJson, 0, 500)
				], 422);
			}

		
			return response()->json(['status' => 'error', 'message' => 'No data received']);
		}


		public function formDataPengadaan(Request $request)
		{
			$this->data['pageTitle'] = 'Rekap Pengadaan IPS';
			$this->data['pageNote'] = 'Menampilkan rekap pengadaan IPS berdasarkan data PR, PK, dan HPS yang sudah di-sync';

			$this->data['pembuat'] = DB::table('data_pk_ips')
				->select('name')
				->groupBy('name')
				->get();
			return view('ipspengadaan.rekap_pengadaan', $this->data);
		}
		public function getDataPengadaan(Request $request)
		{
			$tahun = $request->input('tahun');
			$kebun = $request->input('kebun');
			$pembuat = $request->input('pembuat');
			$subbagian = $request->input('subbagian');
			$nopr = $request->input('nopr');
			$nopk = $request->input('nopk');
			$pp = $request->input('pp');
			$status_pp = $request->input('status_pp');
			$status_pk = $request->input('status_pk');
			$status_sppbj = $request->input('status_sppbj');

			$query = "
				SELECT
					d.nama_cluster,
					d.kode_kebun,
					a.plant,

					e.sub_bagian,
					e.kategori,
					a.no_pr,
					b.pk_number,
					b.pp_no,
					b.title,
					a.tgl_pr,
					a.tgl_pk,
					date(a.tgl_verif_pk) as tgl_verif_pk,
					a.tgl_pp,
					a.tgl_pelaksanaan_pp,
					a.tgl_sppbj,
					a.tgl_award as tgl_pemenang,
					a.sppbj_no,
					c.value_hps as nilai_sppbj,
					c.vendor as vendor_pemenang,
					b.sumber_dana,
					b.status_pp,
					b.status,
					c.sppbj_status,
					'' as no_kontrak,
					'' as draf,
					'' as review,
					'' as vendor,
					'' as MKSO,
					'' as keterangan
				FROM 
					data_pk_ips b 
				LEFT JOIN data_pr_ips a ON a.pk_number = b.pk_number
				LEFT JOIN data_hps_ips c ON a.pk_number = c.pk_number
				LEFT JOIN master_kebun d ON REPLACE(d.nama_kebun,' ','') = REPLACE(REPLACE(a.plant,'Kebun ',''),' ','')
				LEFT JOIN master_kategori_pk_ips e ON e.pk_number = a.pk_number
				WHERE 1=1
			";

			if (!empty($kebun)) {
				if ($kebun== "SK00") {
					$query .= " AND a.plant LIKE '%MKSO%'";
				} else {
					$query .= " AND d.kode_kebun = '$kebun'";
				}
			}
			if (!empty($pembuat)) {
				$query .= " AND b.name = '$pembuat'";
			}
			if (!empty($nopr)) {
				$query .= " AND a.no_pr LIKE '%$nopr%'";
			}
			if (!empty($nopk)) {
				$query .= " AND b.pk_number LIKE '%$nopk%'";
			}
			if (!empty($pp)) {
				$query .= " AND b.pp_no LIKE '%$pp%'";
			}
			if (!empty($tahun)) {
				$query .= " AND b.tahun_anggaran = '$tahun'";
			}
			if (!empty($status_pp)) {
				$query .= " AND b.status_pp IN ('" . implode("','", (array)$status_pp) . "')";
			}
			if (!empty($status_pk)) {
				$query .= " AND b.status  IN ('" . implode("','", (array)$status_pk) . "')";
			}
			if (!empty($status_sppbj)) {
				$query .= " AND c.sppbj_status IN ('" . implode("','", (array)$status_sppbj) . "')";
			}
			if(!empty($subbagian)) {
				$query .= " AND e.sub_bagian = '$subbagian'";
			}

			$query .= " ORDER BY d.kode_kebun, e.kategori";

			$results = DB::select($query);

			$html = '<div class="table-responsive" style="max-height: 600px; overflow-y: auto; position: relative;">';
			$html .= '<table id="rekap-table" class="table table-bordered table-striped table-hover" style="width: 100%;">';
			$html .= '<thead style="position: sticky; top: 0; z-index: 10; background-color: #2c3e50; color: white;">';
			$html .= '<tr>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Cluster</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 100px;">Kode Kebun</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 100px;">Plant</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Sub Bagian</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 100px;">Kategori</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 100px;">No PR</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">No PK</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 100px;">No PP</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 150px;">Judul Pekerjaan</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Tgl Sinkron PR SAP ke IPS</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Tgl Create PK</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Tgl Submit HPS Ke pengadaan</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Tgl Create PP</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 140px;">Tgl Pengumuman PP</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 130px;">Tgl Pengumuman Pemenang</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Tgl SPPBJ</th>';

			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">No SPPBJ</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Nilai SPPBJ</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 140px;">Vendor Pemenang</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 120px;">Sumber Dana</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 100px;">Status PK</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 110px;">Status PP</th>';

			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 80px;">Status SPPBJ</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 80px;">No Kontrak</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 80px;">Draf</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 80px;">Review Legal</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 80px;">Vendor</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 80px;">MKSO</th>';
			$html .= '<th style="color:#FFF;padding: 12px; font-weight: 600; text-align: center; min-width: 150px;">Keterangan</th>';
			$html .= '</tr></thead>';
			$html .= '<tbody>';

			foreach ($results as $row) {
				$html .= '<tr style="border-bottom: 1px solid #ecf0f1; transition: background-color 0.2s;">';
				$html .= '<td style="text-align: left;">' . ($row->nama_cluster ?? '-') . '</td>';
				$html .= '<td style="text-align: center; font-weight: 500;">' . ($row->kode_kebun ?? '-') . '</td>';
				$html .= '<td style="text-align: left;">' . ($row->plant ?? '-') . '</td>';
				$html .= '<td style="text-align: left;">' . ($row->sub_bagian ?? '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->kategori ?? '-') . '</td>';
				$html .= '<td style="text-align: center; font-weight: 500;">' . ($row->no_pr ?? '-') . '</td>';
				$html .= '<td style="text-align: center; font-weight: 500;">' . ($row->pk_number ?? '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->pp_no ?? '-') . '</td>';
				$html .= '<td style="text-align: left;">' . ($row->title ?? '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_pr ? \Carbon\Carbon::parse($row->tgl_pr)->locale('id_ID')->isoFormat('D MMM YYYY') : '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_pk ? \Carbon\Carbon::parse($row->tgl_pk)->locale('id_ID')->isoFormat('D MMM YYYY') : '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_verif_pk ? \Carbon\Carbon::parse($row->tgl_verif_pk)->locale('id_ID')->isoFormat('D MMM YYYY') : '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_pp ? \Carbon\Carbon::parse($row->tgl_pp)->locale('id_ID')->isoFormat('D MMM YYYY') : '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_pelaksanaan_pp ? \Carbon\Carbon::parse($row->tgl_pelaksanaan_pp)->locale('id_ID')->isoFormat('D MMM YYYY') : '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_pemenang ?? '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->tgl_sppbj ?? '-') . '</td>';

				$html .= '<td style="text-align: center; font-weight: 500;">' . ($row->sppbj_no ?? '-') . '</td>';
				$html .= '<td style="text-align: right; font-weight: 500;">Rp ' . number_format($row->nilai_sppbj ?? 0, 0, ',', '.') . '</td>';
				$html .= '<td style="text-align: left;">' . ($row->vendor_pemenang ?? '-') . '</td>';
				$html .= '<td style="text-align: center;">' . ($row->sumber_dana ?? '-') . '</td>';


				$html .= '<td style="text-align: center;">';
				$status = $row->status ?? '-';
				$badgeClass = 'badge-secondary';

				if ($status === 'canceled') {
					$badgeClass = 'badge-danger';
				} elseif ($status === 'draft') {
					$badgeClass = 'badge-info';
				} elseif ($status === 'harga') {
					$badgeClass = 'badge-warning';
				} elseif ($status === 'pengadaan') {
					$badgeClass = 'badge-primary';
				} elseif ($status === 'reject') {
					$badgeClass = 'badge-danger';
				} elseif ($status === 'submit') {
					$badgeClass = 'badge-success';
				}

				$html .= '<span class="badge ' . $badgeClass . '">' . $status . '</span>';
				$html .= '</td>';
								$html .= '<td style="text-align: center;">';
				$status = $row->status_pp ?? '-';
				$badgeClass = 'badge-secondary';

				if ($status === 'canceled_hps') {
					$badgeClass = 'badge-danger';
				} elseif ($status === 'canceled_teknis') {
					$badgeClass = 'badge-danger';
				} elseif ($status === 'draft') {
					$badgeClass = 'badge-info';
				} elseif ($status === 'finish') {
					$badgeClass = 'badge-success';
				} elseif ($status === 'laksanakan') {
					$badgeClass = 'badge-primary';
				} elseif ($status === 'retender') {
					$badgeClass = 'badge-warning';
				}

				$html .= '<span class="badge ' . $badgeClass . '">' . $status . '</span>';
				$html .= '</td>';
				
				$html .= '<td style="text-align: center;">';
				
				$status = $row->sppbj_status ?? '-';
				$badgeClass = 'badge-secondary';

				if ($status === 'approved') {
					$badgeClass = 'badge-success';
				} elseif ($status === 'cancel') {
					$badgeClass = 'badge-danger';
				} elseif ($status === 'proposed') {
					$badgeClass = 'badge-info';
				} elseif ($status === 'rejected') {
					$badgeClass = 'badge-warning';
				}
				$html .= '<span class="badge ' . $badgeClass . '">' . $status . '</span>';
				$html .= '</td>';
				$nokontrak = \DB::table('data_ips_checklist')->where('no_pr', $row->no_pr)->where('pk_number', $row->pk_number)->where('pp_no', $row->pp_no)->value('no_kontrak');
				$html .= '<td style="text-align: center;"><input type="text" class="form-control form-control-sm nokontrak" value="' . ($nokontrak ?? '') . '"></td>';
				$draftChecked = \DB::table('data_ips_checklist')->where('no_pr', $row->no_pr)->where('pk_number', $row->pk_number)->where('pp_no', $row->pp_no)->where('draf', 1)->exists() ? 'checked' : '';
				$reviewChecked = \DB::table('data_ips_checklist')->where('no_pr', $row->no_pr)->where('pk_number', $row->pk_number)->where('pp_no', $row->pp_no)->where('review', 1)->exists() ? 'checked' : '';
				$vendorChecked = \DB::table('data_ips_checklist')->where('no_pr', $row->no_pr)->where('pk_number', $row->pk_number)->where('pp_no', $row->pp_no)->where('vendor', 1)->exists() ? 'checked' : '';
				$mksoChecked = \DB::table('data_ips_checklist')->where('no_pr', $row->no_pr)->where('pk_number', $row->pk_number)->where('pp_no', $row->pp_no)->where('mkso', 1)->exists() ? 'checked' : '';
				
				$html .= '<td style="text-align: center;"><input type="checkbox" class="c1 filled-in" data-no-pr="' . ($row->no_pr ?? '') . '" data-pk-number="' . ($row->pk_number ?? '') . '" data-pp-no="' . ($row->pp_no ?? '') . '" style="cursor: pointer;position:static;opacity:1;" ' . $draftChecked . '></td>';
				$html .= '<td style="text-align: center;"><input type="checkbox" class="c2 filled-in" data-no-pr="' . ($row->no_pr ?? '') . '" data-pk-number="' . ($row->pk_number ?? '') . '" data-pp-no="' . ($row->pp_no ?? '') . '" style="cursor: pointer;position:static;opacity:1;" ' . $reviewChecked . '></td>';
				$html .= '<td style="text-align: center;"><input type="checkbox" class="c3 filled-in" data-no-pr="' . ($row->no_pr ?? '') . '" data-pk-number="' . ($row->pk_number ?? '') . '" data-pp-no="' . ($row->pp_no ?? '') . '" style="cursor: pointer;position:static;opacity:1;" ' . $vendorChecked . '></td>';
				$html .= '<td style="text-align: center;"><input type="checkbox" class="c4 filled-in" data-no-pr="' . ($row->no_pr ?? '') . '" data-pk-number="' . ($row->pk_number ?? '') . '" data-pp-no="' . ($row->pp_no ?? '') . '" style="cursor: pointer;position:static;opacity:1;" ' . $mksoChecked . '></td>';
				$html .= '<td style="text-align: left;">' . ($row->keterangan ?? '-') . '</td>';
				$html .= '</tr>';
			}

			$html .= '</tbody></table>';
			$html .= '</div>';
			$html .= '<script>
				$(document).ready(function() {
					$(document).on("change", ".c1, .c2, .c3, .c4", function() {
						var nopr = $(this).data("no-pr");
						var pknumber = $(this).data("pk-number");
						var ppno = $(this).data("pp-no");
						var isChecked = $(this).is(":checked");
						var type = "";

						if ($(this).hasClass("c1")) type = "draf";
						else if ($(this).hasClass("c2")) type = "review";
						else if ($(this).hasClass("c3")) type = "vendor";
						else if ($(this).hasClass("c4")) type = "mkso";

						$.ajax({
							url: "'.url('ipspengadaan').'",
							type: "POST",
							data: {
								action_task: isChecked ? "saveChecklist" : "deleteChecklist",
								no_pr: nopr,
								pk_number: pknumber,
								pp_no: ppno,
								type: type
							},
							success: function(response) {
								notyMessage(response.message);
							}
						});
					});

					$(document).on("focus", ".nokontrak", function() {
						$(this).select();
					});

					$(document).on("keydown", ".nokontrak", function(e) {
						if (e.key === "Enter") {
							e.preventDefault();

							var input = $(this);
							var nokontrak = input.val();
							var row = input.closest("tr");
							var nopr = row.find(".c1").data("no-pr");
							var pknumber = row.find(".c1").data("pk-number");
							var ppno = row.find(".c1").data("pp-no");

							if (nopr && pknumber && ppno) {
								$.ajax({
									url: "'.url('ipspengadaan').'",
									type: "POST",
									data: {
										action_task: "saveNoKontrak",
										no_pr: nopr,
										pk_number: pknumber,
										pp_no: ppno,
										no_kontrak: nokontrak
									},
									success: function(response) {
										notyMessage(response.message);
										input.blur();
									}
								});
							} else {
								alert("Data tidak lengkap");
							}
						}
					});
				});
				function toggleSelectAll(source) {
					var checkboxes = document.querySelectorAll(".c1, .c2, .c3, .c4");
					checkboxes.forEach(function(checkbox) {
						checkbox.checked = source.checked;
						$(checkbox).trigger("change");
					});
				}
				</script>';


			return $html;
		}

		//saveChecklist
		public function saveChecklist(Request $request)
		{
			$no_pr = $request->input('no_pr');
			$pk_number = $request->input('pk_number');
			$pp_no = $request->input('pp_no');
			$type = $request->input('type');

			if (empty($no_pr) || empty($pk_number) || empty($pp_no) || empty($type)) {
				return response()->json(['status' => 'error', 'message' => 'Data tidak lengkap'], 422);
			}

			$checklistData = [
				'no_pr' => $no_pr,
				'pk_number' => $pk_number,
				'pp_no' => $pp_no,
				'type' => $type,
			];

			try {
				$updateData = [];
				$updateData[$type] = 1;
				$updateData[$type . '_at'] = now();

				DB::table('data_ips_checklist')->updateOrInsert(
					[
						'no_pr' => $no_pr,
						'pk_number' => $pk_number,
						'pp_no' => $pp_no,
					],
					$updateData
				);
				return response()->json(['status' => 'success', 'message' => 'Checklist saved successfully']);
			} catch (\Exception $e) {
				return response()->json(['status' => 'error', 'message' => 'Failed to save checklist: ' . $e->getMessage()], 500);
			}
		}
		//deleteChecklist
		public function deleteChecklist(Request $request)
		{
			$no_pr = $request->input('no_pr');
			$pk_number = $request->input('pk_number');
			$pp_no = $request->input('pp_no');
			$type = $request->input('type');

			if (empty($no_pr) || empty($pk_number) || empty($pp_no) || empty($type)) {
				return response()->json(['status' => 'error', 'message' => 'Data tidak lengkap'], 422);
			}

			try {
				DB::table('data_ips_checklist')->where([
					'no_pr' => $no_pr,
					'pk_number' => $pk_number,
					'pp_no' => $pp_no,
				])->update([
					$type => 0,
					$type . '_at' => null,
				]);
				return response()->json(['status' => 'success', 'message' => 'Checklist deleted successfully']);
			} catch (\Exception $e) {
				return response()->json(['status' => 'error', 'message' => 'Failed to delete checklist: ' . $e->getMessage()], 500);
			}
		}

		//saveNoKontrak
		public function saveNoKontrak(Request $request)
		{
			$no_pr = $request->input('no_pr');
			$pk_number = $request->input('pk_number');
			$pp_no = $request->input('pp_no');
			$no_kontrak = $request->input('no_kontrak');

			if (empty($no_pr) || empty($pk_number) || empty($pp_no)) {
				return response()->json(['status' => 'error', 'message' => 'Data tidak lengkap'], 422);
			}

			try {
				DB::table('data_ips_checklist')->updateOrInsert(
					[
						'no_pr' => $no_pr,
						'pk_number' => $pk_number,
						'pp_no' => $pp_no,
					],
					[
						'no_kontrak' => $no_kontrak
					]
				);
				return response()->json(['status' => 'success', 'message' => 'No kontrak saved successfully']);
			} catch (\Exception $e) {
				return response()->json(['status' => 'error', 'message' => 'Failed to save no kontrak: ' . $e->getMessage()], 500);
			}	
		}
}