<?php namespace App\Http\Controllers;

use App\Models\Upahangkutangltma;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Validator, Input, Redirect ; 

class UpahangkutangltmaController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'upahangkutangltma';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Upahangkutangltma();
		
		$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'		=> 'upahangkutangltma',
			'pageUrl'			=>  url('upahangkutangltma'),
			'return' 			=> 	self::returnUrl()	
		);	
			
				
	} 
	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('upahangkutangltma.index',$this->data);
	}
	function create( Request $request ) 
	{
		config(['app.debug' => true]);
		$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']); 

		$today = date('Ymd').trim(substr(session('fid'),2));
		$last = $this->model->whereRaw("LEFT(no_dokumen,10) = ?", [$today])
			->orderBy('no_dokumen', 'desc')
			->first();

		if ($last && preg_match('/^' . $today . '(\d{4})$/', $last->no_dokumen, $matches)) {
			$no_urut = str_pad(((int)$matches[1]) + 1, 4, '0', STR_PAD_LEFT);
		} else {
			$no_urut = '0001';
		}

		$this->data['no_dokumen'] = $today . $no_urut;
		$this->data['tanggal'] = date('Y-m-d');
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['id'] = '';
		return view($this->module.'.form',$this->data);
	}
	function edit( Request $request , $id ) 
	{
		config(['app.debug' => true]);
		$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 'getDataTimbangan':
				return $this->getDataTimbangan( $request );
				break;
			case 'viewDetailDokumen':
				return $this->viewDetailDokumen( $request );
				break;
			case 'formRekapitulasi':
				return $this->formRekapitulasi( $request );
				break;	
			case 'cetak':
				return $this->cetak( $request );
				break;
			case 'validasi':
				return $this->validasi( $request );
				break;	
			case 'rekapitulasi':
				return $this->rekapitulasi( $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){
config(['app.debug' => true]);
		$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 );
					$data['jml_spta'] = count($request->input('no_spta', []));
					$data['nominal'] = $request->input('nominal_total', 0);
					$data['status'] = '0';
					$data['unit'] = session('fid');
					$data['rayon'] = $request->input('id_rayon');
					$data['afdeling'] = $request->input('id_afdeling');

					if($request->input( $this->info['key']) == NULL){
						// Cek apakah no_dokumen sudah ada di database
						$existingDoc = $this->model->where('no_dokumen', $data['no_dokumen'])->first();
						if ($existingDoc) {
							return response()->json(array(
								'status' => 'error',
								'message' => 'No Dokumen ' . $data['no_dokumen'] . ' sudah ada di database. Silakan refresh halaman untuk mendapatkan nomor dokumen baru.'
							));
						}
					}else{
						// remove tx_upah_angkutan_gl_tma_detail where no_dokumen = $data['no_dokumen']
						\DB::table('tx_upah_angkutan_gl_tma_detail')->where('no_dokumen', $data['no_dokumen'])->delete();
					}
					
					
					$id = $this->model->insertRow($data , $request->input( $this->info['key']));
					
					// Insert detail records from array inputs
					$no_dokumen = $data['no_dokumen'];
					$no_spta = $request->input('no_spta', []);
					$no_truk = $request->input('no_truk', []);
					$petak = $request->input('petak', []);
					$tgl_timbang = $request->input('tgl_timbang', []);
					$netto = $request->input('netto', []);
					$kualitas = $request->input('kualitas', []);
					$tarif = $request->input('tarif', []);
					$nominal = $request->input('nominal', []);

					foreach ($no_spta as $index => $spta) {
						$detailData = [
							'no_dokumen' => $no_dokumen,
							'no_spta' => $spta,
							'no_kendaraan' => $no_truk[$index] ?? null,
							'no_petak' => $petak[$index] ?? null,
							'tgl_timbang' => $tgl_timbang[$index] ?? null,
							'netto' => $netto[$index] ?? 0,
							'kualitas' => $kualitas[$index] ?? null,
							'tarif' => $tarif[$index] ?? 0,
						];
						\DB::table('tx_upah_angkutan_gl_tma_detail')->insert($detailData);
					}
					/* 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;		

		}
	}
	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);
		}

		// Custom Tanggal Filter
		if(!is_null($request->input('tanggal')) && $request->input('tanggal') != ''){
			$tanggal = $request->input('tanggal');
			if ($filter != '') {
				$filter .= " AND ";
			}
			$filter .= " tanggal = '" . $tanggal . "' ";
		}
		// Custom Vendor Filter
		if(!is_null($request->input('vendor')) && $request->input('vendor') != ''){
			$vendor = $request->input('vendor');
			if ($filter != '') {
				$filter .= " AND ";
			}
			$filter .= " id_vendor = '" . $vendor . "' ";
		}

		if(session('gid') !=1 && session('gid') != 2)
		{
			if($filter !='') $filter .= " AND ";
			$filter .= " unit = '".session('fid')."' ";
		}

		$conf['order']['sort'] = ' id ';
		$conf['order']['by'] =  ' desc';

		$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')
				{
					if($field['field'] == 'status')
					{
						switch ($row->{$field['field']}) {
							case 0:
								$values[$field['field']] = '<span class="badge badge-info"><i class="fa fa-file-alt"></i> DIBUAT</span>';
								break;
							case 1:
								$values[$field['field']] = '<span class="badge badge-warning"><i class="fa fa-hourglass-half"></i> DIPROSES</span>';
								break;
							case 2:
								$values[$field['field']] = '<span class="badge badge-warning"><i class="fa fa-hourglass-half"></i> DIVALIDASI</span>';
								break;	
							case 3:
								if(!empty($row->approve_bayar)){
									$values[$field['field']] = '<span class="badge badge-primary"><i class="fa fa-check-circle"></i> DIBAYAR</span>';
									break;
								}else{
									$values[$field['field']] = '<span class="badge badge-success"><i class="fa fa-money-bill-wave"></i> PROSES BAYAR</span>';
									break;
								}
								
							case 4:
								$values[$field['field']] = '<span class="badge badge-success"><i class="fa fa-check-circle"></i> APPROVE HO</span>';
								break;
							default:
								$values[$field['field']] = '<span class="badge badge-default"><i class="fa fa-question-circle"></i> UNKNOWN</span>';
								break;
						}
					} else if($field['field'] == 'no_dokumen'){
						$values[$field['field']] = '<span style="font-weight:bold;color:#0366d6;font-family:\'Segoe UI\',Arial,sans-serif;margin-bottom:5px;">' . htmlspecialchars($row->{$field['field']}) . '</span><br><span class="text-muted mt-1">' . self::formatTanggalIndo(htmlspecialchars($row->tanggal)) . '</span>';
					} else if($field['field'] == 'tgl_timbang_awal'){
						$values[$field['field']] = '<i class="fa fa-calendar"></i> ' . self::formatTanggalIndo(htmlspecialchars($row->{$field['field']}));
					} else if($field['field'] == 'tgl_timbang_akhir'){
						$values[$field['field']] = '<i class="fa fa-calendar"></i> ' . self::formatTanggalIndo(htmlspecialchars($row->{$field['field']}));
					} else if($field['field'] == 'jml_spta'){
						$values[$field['field']] = '<div style="font-weight:800;color:#0366d6;text-align:right;">' . number_format($row->{$field['field']}, 0, ',', '.') . ' SPTA</div>';
					}else if($field['field'] == 'periode_bayar_awal'){
						
						$values[$field['field']] = '<i class="fa fa-calendar"></i> ' . self::formatTanggalIndo(htmlspecialchars($row->{$field['field']})) . '</span>';
						$awal = (!empty($row->periode_bayar_awal) && $row->periode_bayar_awal !== '0000-00-00') ? self::formatTanggalIndo(htmlspecialchars($row->periode_bayar_awal)) : '';
						$akhir = (!empty($row->periode_bayar_akhir) && $row->periode_bayar_akhir !== '0000-00-00') ? self::formatTanggalIndo(htmlspecialchars($row->periode_bayar_akhir)) : '';

						if ($awal && $akhir) {
							$values[$field['field']] = '<i class="fa fa-calendar"></i> ' . $awal . ' <span class="text-muted">s/d</span> <br>' .'<i class="fa fa-calendar"></i> ' .  $akhir;
						} elseif ($awal) {
							$values[$field['field']] = '<i class="fa fa-calendar"></i> ' . $awal;
						} else {
							$values[$field['field']] = '<span class="text-muted">-</span>';
						}

					} else if($field['field'] == 'nominal'){
						$values[$field['field']] = '<div style="font-weight:800;color:#0366d6;text-align:right;">Rp ' . number_format($row->{$field['field']}, 0, ',', '.') . '</div>';	
					} else if($field['field'] == 'approve_bayar'){
						$approveParts = [];
						if (!empty($row->keu_by)) {
							$approveParts[] = '<span style="display:inline-block;background:#198754;color:#fff;padding:4px 8px;border-radius:12px;font-size:10px;margin-right:6px;"><i class="fa fa-wallet" style="margin-right:6px"></i> Keu</span>';
						}
						if (!empty($row->tma_by)) {
							$approveParts[] = '<span style="display:inline-block;background:#0d6efd;color:#fff;padding:4px 8px;border-radius:12px;font-size:10px;margin-right:6px;"><i class="fa fa-check-circle" style="margin-right:6px"></i> TMA</span>';
						}
						if (!empty($row->pta_by)) {
							$approveParts[] = '<span style="display:inline-block;background:#6f42c1;color:#fff;padding:4px 8px;border-radius:12px;font-size:10px;margin-right:6px;"><i class="fa fa-user-check" style="margin-right:6px"></i> PTA</span>';
						}

						if (empty($approveParts)) {
							$values[$field['field']] = '<span class="text-muted">-</span>';
						} else {
							$values[$field['field']] = implode(' ', $approveParts);
						}


					}else{
						$values[$field['field']] = \SiteHelpers::formatRows($row->{$field['field']}, $field , $row);
					}
				}	
			}
			$values['action'] = ' <a href="' . url($this->module . '/viewDetailDokumen?no_dokumen=' . $row->no_dokumen) . '" onclick="SximoModal(this.href,\'View Detail Dokumen\'); return false;" class="btn btn-xs btn-success"><i class="fa fa-eye"></i> View</a>';
			if($this->access['is_edit'] ==1 && $row->status == 0)
				{
					$values['action'] .= ' <a href="'. url($this->module .'/'.$row->{$this->info['key']}) . '/edit/'.'" class="btn btn-xs btn-primary" onclick="ajaxViewDetail(\'#upahangkutangltma\',this.href); return false; "><i class="fa fa-edit"></i> Edit</a>';
				}
			$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 static function formatTanggalIndo($tanggal)
	{
		if (!$tanggal || $tanggal == '0000-00-00') return '';
		$bulan = [
			1 => 'Januari', 2 => 'Februari', 3 => 'Maret', 4 => 'April',
			5 => 'Mei', 6 => 'Juni', 7 => 'Juli', 8 => 'Agustus',
			9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'Desember'
		];
		$parts = explode('-', $tanggal);
		if (count($parts) != 3) return $tanggal;
		$tahun = $parts[0];
		$bulanNum = (int)$parts[1];
		$hari = $parts[2];
		$namaBulan = isset($bulan[$bulanNum]) ? $bulan[$bulanNum] : $bulanNum;
		return ltrim($hari, '0') . ' ' . $namaBulan . ' ' . $tahun;
	}

	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 getDataTimbangan(Request $request)
	{
		config(['app.debug' => true]);
		$rayon = substr(session('fid'),0,4);
		$tgl_awal = $request->input('tgl_awal');
		$tgl_akhir = $request->input('tgl_akhir');
		$vendor = $request->input('vendor');
		$rayon = $request->input('rayon', $rayon);
		$afdeling = $request->input('afdeling', '');

		$edit = $request->input('edit');

		if($edit){
		//query untuk edit diambil dari tabel detail
		$data = \DB::table('tx_upah_angkutan_gl_tma_detail as d')
			->join('tx_upah_angkutan_gl_tma as a', 'd.no_dokumen', '=', 'a.no_dokumen')
			->join('data_timbangan as b', 'd.no_spta', '=', 'b.no_spta')
			->join('tx_pos_keluar as c', 'b.no_spta', '=', 'c.spta')
			->join('tx_petak_tebang as e', 'c.kode_booking', '=', 'e.nomor_booking')
			->join('tx_ajuan_tebang as f', 'e.id_petak', '=', 'f.lahan_id')
			->join('data_meja_tebu as g', 'b.no_spta', '=', 'g.no_spta')
			->leftJoin('master_pg', 'e.pg_penggiling', '=', 'master_pg.kode_pg')
			->select(
				'd.no_spta',
				'master_pg.nama_pg AS pg_penggiling',
				'b.no_truk',
				'e.id_petak AS petak',
				'b.tgl_timbang',
				'b.netto_final_kg AS netto',
				'g.kualitas',
				'h.tarif',
				\DB::raw("(b.netto_final_kg*h.tarif) as nominal ")
			)
			->leftJoin('master_tarif_vendor_gl as h', function ($join) {
				$join->on('h.kualitas', '=', 'g.kualitas')
					->on('h.id_vendor', '=', 'e.vendor_gl')
					->on(\DB::raw('LEFT(f.rayon,4)'), '=', 'h.kode_kebun');
			})
			->where('a.id', $edit)
			->groupBy('b.no_spta')
			->get();

		}else{
			$data = \DB::select("
				SELECT
					a.no_spta,
					master_pg.nama_pg AS pg_penggiling,
					a.no_truk,
					c.id_petak AS petak,
					a.tgl_timbang,
					a.netto_final_kg AS netto,
					d.kualitas,
					h.tarif,
					(a.netto_final_kg*h.tarif) as nominal
				FROM data_timbangan AS a
				JOIN tx_pos_keluar AS b ON b.spta = a.no_spta
				JOIN tx_petak_tebang AS c ON c.nomor_booking = b.kode_booking
				JOIN tx_ajuan_tebang AS f ON c.id_petak = f.lahan_id
				JOIN data_meja_tebu AS d ON d.no_spta = a.no_spta
				LEFT JOIN master_tarif_vendor_gl h on h.kualitas = d.kualitas and h.id_vendor = c.vendor_gl and h.kode_kebun = LEFT(f.rayon,4)
				LEFT JOIN master_pg ON master_pg.kode_pg = c.pg_penggiling
				LEFT JOIN tx_upah_angkutan_gl_tma_detail i ON i.no_spta = a.no_spta
				WHERE a.tgl_timbang BETWEEN ? AND ?
				AND c.vendor_gl = ?
				AND f.rayon = ?
				AND f.afdeling = ?
				AND i.no_spta IS NULL
				GROUP BY a.no_spta
			", [$tgl_awal, $tgl_akhir, $vendor, $rayon, $afdeling]);
		}

		$html = '<table class="table table-bordered table-responsive" id="table-data-timbangan" style="max-height: 600px; overflow-y: auto;">
			<thead style="background-color:#001f3f;color:#fff;position:sticky;top:0;z-index:10;"><tr>
			<th style="background-color:#001f3f;color:#fff;">No SPTA</th>
			<th style="background-color:#001f3f;color:#fff;">PG Penggiling</th>
			<th style="background-color:#001f3f;color:#fff;">No Truk</th>
			<th style="background-color:#001f3f;color:#fff;">Petak</th>
			<th style="background-color:#001f3f;color:#fff;">Tgl Timbang</th>
			<th style="background-color:#001f3f;color:#fff;">Netto (kg)</th>
			<th style="background-color:#001f3f;color:#fff;">Kualitas</th>
			<th style="background-color:#001f3f;color:#fff;">Tarif</th>
			<th style="background-color:#001f3f;color:#fff;">Nominal</th>
			<th style="background-color:#001f3f;color:#fff;">Aksi</th>
		</tr></thead><tbody>';

		// Ambil data master tarif vendor angkutan untuk dropdown jarak
		$kode_kebun = substr(session('fid'), 0, 4);

		$totalNominal = 0;
		$totalNetto = 0;
		$rowIndex = 0;

		foreach ($data as $row) {
			// Dropdown untuk kolom jarak

			$html .= '<tr class="data-row" data-row-index="' . $rowIndex . '">
				<td>' . htmlspecialchars($row->no_spta) . '</td>
				<td>' . htmlspecialchars($row->pg_penggiling) . '</td>
				<td>' . htmlspecialchars($row->no_truk) . '</td>
				<td>' . htmlspecialchars($row->petak) . '</td>
				<td>' . htmlspecialchars($row->tgl_timbang) . '</td>
				<td class="text-right netto-col" data-netto="' . htmlspecialchars($row->netto) . '">' . number_format($row->netto, 0, ',', '.') . '</td>
				<td>' . htmlspecialchars($row->kualitas) . '</td>
				<td class="text-right tarif-col">' . number_format($row->tarif, 3, ',', '.') . '</td>
				<td class="text-right nominal-col">' . number_format($row->nominal, 0, ',', '.') . '</td>
				<td class="text-center">
					<button type="button" class="btn btn-danger btn-xs" onclick="deleteRow(' . $rowIndex . ')">
						<i class="fa fa-trash"></i>
					</button>
				</td>
				<input type="hidden" class="input-no-spta" name="no_spta[]" value="' . htmlspecialchars($row->no_spta) . '">
				<input type="hidden" class="input-pg" name="pg_penggiling[]" value="' . htmlspecialchars($row->pg_penggiling) . '">
				<input type="hidden" class="input-truk" name="no_truk[]" value="' . htmlspecialchars($row->no_truk) . '">
				<input type="hidden" class="input-petak" name="petak[]" value="' . htmlspecialchars($row->petak) . '">
				<input type="hidden" class="input-tgl" name="tgl_timbang[]" value="' . htmlspecialchars($row->tgl_timbang) . '">
				<input type="hidden" class="input-netto" name="netto[]" value="' . htmlspecialchars($row->netto) . '">
				<input type="hidden" class="input-kualitas" name="kualitas[]" value="' . htmlspecialchars($row->kualitas) . '">
				<input type="hidden" class="input-tarif" name="tarif[]" value="' . htmlspecialchars($row->tarif) . '">
				<input type="hidden" class="input-nominal" name="nominal[]" value="' . htmlspecialchars($row->nominal) . '">
			</tr>';

			$totalNominal += $row->nominal;
			$totalNetto += $row->netto;
			$rowIndex++;
		}
		// Baris total
		$html .= '<tr style="font-weight:bold;background:#f5f5f5">
			<td colspan="5" class="text-right">Total</td>
			<td class="text-right" id="total-netto">' . number_format($totalNetto, 0, ',', '.') . '</td>
			<td colspan="2" class="text-right"></td>
			<td class="text-right" id="total-nominal">' . number_format($totalNominal, 0, ',', '.') . '</td>
			<td></td>
		</tr>';
		$html .= '<input type="hidden" id="nominal-total-hidden" name="nominal_total" value="' . htmlspecialchars($totalNominal) . '">';

		$html .= '</tbody></table>';

		
		$html .= '
		<script>
		// Data tarif per jarak
		
	
		function deleteRow(rowIndex) {
			if (!confirm("Hapus item ini?")) return;
			
			var row = document.querySelector("tr.data-row[data-row-index=\'" + rowIndex + "\']");
			if (row) {
				row.remove();
				updateTotal();
			}
		}
		
		function updateTotal() {
			var total = 0;
			document.querySelectorAll(".data-row .nominal-col").forEach(function(cell) {
				var val = cell.textContent.replace(/\./g, "").replace(",", ".");
				total += parseFloat(val) || 0;
			});
			
			var totalCell = document.getElementById("total-nominal");
			if (totalCell) {
				totalCell.textContent = total.toLocaleString("id-ID", {minimumFractionDigits: 0});
			}
			
			var totalHidden = document.getElementById("nominal-total-hidden");
			if (totalHidden) {
				totalHidden.value = total;
			}
		}
		</script>
		';
	$jml_spta = count($data);
	$nominal = $totalNominal;

	return response()->json([
		'status' => 'success',
		'html' => $html
	]);
	}
	
	public function viewDetailDokumen(Request $request)
	{
		config(['app.debug' => true]);
		$no_dokumen = $request->input('no_dokumen');

		// Get header information
		$header = \DB::table('tx_upah_angkutan_gl_tma as a')
			->join('master_vendor_gl as b', 'a.id_vendor', '=', 'b.kode_vendor')
			->join('master_kebun as c', 'a.unit', '=', 'c.kode_kebun')
			->select(
				'c.nama_kebun',
				'a.no_dokumen',
				'a.tanggal',
				'b.nama_vendor as vendor',
				'a.tgl_timbang_awal',
				'a.tgl_timbang_akhir',
				'a.jml_spta',
				'a.nominal',
				'pta_by',
				'tma_by',
				'keu_by',
				'approve_bayar',
				'approve_ho'
			)
			->where('a.no_dokumen', $no_dokumen)
			->first();

		// Get detail records
		$results = \DB::table('tx_upah_angkutan_gl_tma_detail as a')
			->leftJoin('master_pg as c', 'c.kode_pg', '=', \DB::raw('LEFT(a.no_spta, 4)'))
			->selectRaw("
				a.no_dokumen,
				a.no_spta,
				c.nama_pg as pg_penggiling,
				a.no_kendaraan,
				a.no_petak,
				a.tgl_timbang,
				a.netto,
				a.kualitas,
				a.tarif,
				(a.netto * a.tarif) as nominal
			")
			->where('a.no_dokumen', $no_dokumen)
			->get();

		if ($header) {
			$html = '<div style="margin-bottom:20px;padding:18px 24px;background:#f8fafc;border-radius:10px;border:1px solid #e1e4e8;">
				<h4 style="margin-top:0;color:#0366d6;font-weight:bold;">Informasi Dokumen</h4>
				<div style="display:flex;flex-wrap:wrap;gap:32px;">
					<table style="width:auto;font-size:15px;flex:1 1 45%;">
						<tr>
							<td style="font-weight:600;width:160px;">No Dokumen</td>
							<td style="width:10px;">:</td>
							<td>' . htmlspecialchars($header->no_dokumen) . '</td>
						</tr>
						<tr>
							<td style="font-weight:600;">Tanggal</td>
							<td>:</td>
							<td>' . self::formatTanggalIndo($header->tanggal) . '</td>
						</tr>
						<tr>
							<td style="font-weight:600;">Kebun</td>
							<td>:</td>
							<td>' . htmlspecialchars($header->nama_kebun) . '</td>
						</tr>
						<tr>
							<td style="font-weight:600;">Vendor Angkutan</td>
							<td>:</td>
							<td>' . htmlspecialchars($header->vendor) . '</td>
						</tr>
					</table>
					<table style="width:auto;font-size:15px;flex:1 1 45%;">
						<tr>
							<td style="font-weight:600;width:160px;">Periode Timbang</td>
							<td style="width:10px;">:</td>
							<td>' . self::formatTanggalIndo($header->tgl_timbang_awal) . ' - ' . self::formatTanggalIndo($header->tgl_timbang_akhir) . '</td>
						</tr>
						<tr>
							<td style="font-weight:600;">Jumlah SPTA</td>
							<td>:</td>
							<td>' . number_format($header->jml_spta, 0, ',', '.') . '</td>
						</tr>
						<tr>
							<td style="font-weight:600;">Total Nominal</td>
							<td>:</td>
							<td style="font-weight:700;color:#0366d6;">Rp ' . number_format($header->nominal, 0, ',', '.') . '</td>
						</tr>
					</table>
				</div>
			</div>';
		} else {
			$html = '';
		}

		$html .= '<table class="table table-bordered table-responsive table-striped">';
		$html .= '<thead>';
		$html .= '<tr>
			<th style="background:#0366d6;color:#fff;text-align:center;">No SPTA</th>
			<th style="background:#0366d6;color:#fff;text-align:center;">PG Penggiling</th>
			<th style="background:#0366d6;color:#fff;text-align:center;">No Kendaraan</th>
			<th style="background:#0366d6;color:#fff;text-align:center;">No Petak</th>
			<th style="background:#0366d6;color:#fff;text-align:center;">Tanggal Timbang</th>
			<th style="background:#0366d6;color:#fff;text-align:center;">Kualitas</th>
			<th style="background:#0366d6;color:#fff;text-align:right;">Netto (kg)</th>
			<th style="background:#0366d6;color:#fff;text-align:right;">Tarif (Rp/kg)</th>
			<th style="background:#0366d6;color:#fff;text-align:right;">Nominal (Rp)</th>
		</tr>';
		$html .= '</thead><tbody>';

		$totalNetto = 0;
		$totalNominal = 0;

		// Rows
		foreach ($results as $row) {
			$html .= '<tr>
				<td>' . htmlspecialchars($row->no_spta) . '</td>
				<td>' . htmlspecialchars($row->pg_penggiling) . '</td>
				<td>' . htmlspecialchars($row->no_kendaraan) . '</td>
				<td>' . htmlspecialchars($row->no_petak) . '</td>
				<td>' . self::formatTanggalIndo($row->tgl_timbang) . '</td>
				<td style="text-align:center;">' . htmlspecialchars($row->kualitas) . '</td>
				<td style="text-align:right;">' . number_format($row->netto, 0, ',', '.') . '</td>
				<td style="text-align:right;">' . number_format($row->tarif, 3, ',', '.') . '</td>
				<td style="text-align:right;font-weight:700;color:#0366d6;">' . number_format($row->nominal, 0, ',', '.') . '</td>
			</tr>';

			$totalNetto += (float)$row->netto;
			$totalNominal += (float)$row->nominal;
		}

		// Totals row
		$html .= '<tr style="font-weight:700;">';
		$html .= '<td colspan="6" style="text-align:right;border-top:2px solid #e1e4e8;padding:10px;">Total</td>';
		$html .= '<td style="text-align:right;background:#f8fafc;color:#0366d6;padding:10px;border-top:2px solid #e1e4e8;">' . number_format($totalNetto, 0, ',', '.') . '</td>';
		$html .= '<td style="text-align:right;background:#f8fafc;padding:10px;border-top:2px solid #e1e4e8;">-</td>';
		$html .= '<td style="text-align:right;background:#f8fafc;color:#0366d6;padding:10px;border-top:2px solid #e1e4e8;">Rp ' . number_format($totalNominal, 0, ',', '.') . '</td>';
		$html .= '</tr>';

		$html .= '</tbody></table>';
		$html .= '<div style="margin-top:16px;display:flex;gap:8px;justify-content:flex-end;">';
		
		if(!$header->pta_by){
			if(session('gid') == 3){
				$html .= '<button class="btn btn-xs btn-success" onclick="validateDokumen(\''.htmlspecialchars($no_dokumen, ENT_QUOTES).'\', 1)"><i class="fa fa-check"></i> Validasi</button>';
			}
		}else if($header->pta_by && !$header->tma_by){
			if(session('gid') == 15){
				$html .= '<button class="btn btn-xs btn-secondary" onclick="validateDokumen(\''.htmlspecialchars($no_dokumen, ENT_QUOTES).'\', 2)"><i class="fa fa-check"></i> Validasi</button>';
			}
		}else if($header->tma_by && !$header->keu_by){
			if(session('gid') == 16){
				$html .= '<div id="periode-bayar" style="display:flex;gap:8px;justify-content:flex-end;align-items:center;">';
				$html .= '<label style="font-weight:600;margin-right:8px;">Periode Bayar</label>';
				$html .= '<input type="date" id="bayar_awal" class="form-sm-control" /> ';
				$html .= '<span style="margin:0 6px;">s/d</span>';
				$html .= '<input type="date" id="bayar_akhir" class="form-sm-control" /> ';
				$html .= '<button class="btn btn-xs btn-warning" id="btnProsesBayar" style="margin-left:8px;">Proses Bayar</button>';
				$html .= '</div>';
			}
		}else if($header->keu_by && !$header->approve_bayar){
			if(session('gid') == 16){
				$html .= '<button class="btn btn-xs btn-warning" onclick="validateDokumen(\''.htmlspecialchars($no_dokumen, ENT_QUOTES).'\', 4)"><i class="fa fa-wallet"></i> Approve Pembayaran</button>';
			}
		}else{
			if(session('gid') < 3){
				$html .= '<button class="btn btn-xs btn-success" onclick="validateDokumen(\''.htmlspecialchars($no_dokumen, ENT_QUOTES).'\', 6)"><i class="fa fa-check-circle"></i> Validasi Ho</button>';
			}else{
				$html .= '<button class="btn btn-xs btn-secondary" disabled><i class="fa fa-check-circle"></i> Dokumen Lengkap</button>';
			}		
		}
		
		if($header->pta_by && !$header->tma_by){
			$html .= '<button class="btn btn-xs btn-secondary" disabled><i class="fa fa-check-circle"></i> Sudah Divalidasi PTA</button>';
		}else if($header->tma_by && !$header->keu_by){
			$html .= '<button class="btn btn-xs btn-primary" disabled><i class="fa fa-check-circle"></i> Sudah Divalidasi Asisten TMA</button>';
		}else if($header->keu_by && !$header->approve_bayar){
			$html .= '<button class="btn btn-xs btn-warning" disabled><i class="fa fa-wallet"></i> Sudah Proses Bayar Asisten Keu</button>';
		}else if($header->approve_bayar){
			$html .= '<button class="btn btn-xs btn-success" disabled><i class="fa fa-check-circle"></i> Dokumen Lengkap</button>';
		}else if($header->approve_ho){
			$html .= '<button class="btn btn-xs btn-secondary" disabled><i class="fa fa-times"></i> Approve Ho</button>';
		}

		if(session('gid') < 3){			
			$html .= '<button class="btn btn-xs btn-danger" onclick="validateDokumen(\''.htmlspecialchars($no_dokumen, ENT_QUOTES).'\', 5)"><i class="fa fa-times"></i> Batalkan Validasi</button>';
		}
		
		$html .= '<button class="btn btn-xs btn-primary" onclick="window.open(\''.url('upahangkutangltma/cetak?no_dokumen='.rawurlencode($no_dokumen)).'\',\'_blank\')"><i class="fa fa-print"></i> Cetak</button>';
		$html .= '<button class="btn btn-xs btn-danger" onclick="closeModal()"><i class="fa fa-times"></i> Close</button>';
	
		$html .= '</div>';

		$html .= '<script>
		function validateDokumen(no, level){
			if(!confirm("Validasi dokumen "+no+"?")) return;
			$.ajax({
				url: "'.url($this->module.'/validasi').'",
				type: "GET",
				data: { no_dokumen: no, level: level, _token: "'.csrf_token().'" },
				success: function(res){
					if(res.status === "success"){
						alert(res.message || "Dokumen berhasil divalidasi");
						location.reload();
					} else {
						alert(res.message || "Gagal memvalidasi dokumen");
					}
				},
				error: function(){
					alert("Terjadi kesalahan saat memproses permintaan");
				}
			});
		}
			function closeModal(){
				$("#sximo-modal").modal("hide");
			}

				(function(){
					$("#btnProsesBayar").on("click", function(){
						var awal = $("#bayar_awal").val();
						var akhir = $("#bayar_akhir").val();
						if(!awal || !akhir){
							alert("Periode bayar wajib diisi.");
							return;
						}
						if(!confirm("Proses pembayaran untuk dokumen '.htmlspecialchars($no_dokumen,ENT_QUOTES).' ?")) return;
						$.ajax({
							url: "'.url($this->module.'/validasi').'",
							type: "GET",
							data: {
								no_dokumen: "'.htmlspecialchars($no_dokumen,ENT_QUOTES).'",
								level: 3,
								periode_bayar_awal: awal,
								periode_bayar_akhir: akhir,
								_token: "'.csrf_token().'"
							},
							success: function(res){
								if(res.status === "success"){
									alert(res.message || "Pembayaran berhasil diproses");
									location.reload();
								} else {
									alert(res.message || "Gagal memproses pembayaran");
								}
							},
							error: function(){
								alert("Terjadi kesalahan saat memproses pembayaran");
							}
						});
					});
				})();
		</script>';

		return $html;
	}

	public function validasi(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_edit'] == 0) 
			return response()->json(array('status'=>'error','message'=> __('core.note_restric')));	

		$no_dokumen = $request->input('no_dokumen');
		$level = (int)$request->input('level', 1);
		
		if(!$no_dokumen) {
			return response()->json(array(
				'status'=>'error',
				'message'=> 'No dokumen is required'
			));
		}

		try {
			if($level === 1) 
				$updated = \DB::table('tx_upah_angkutan_gl_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 1,
					'pta_by' => \Auth::user()->id,
					'pta_date' => date('Y-m-d H:i:s')
				]);
			else if($level === 2) 
				$updated = \DB::table('tx_upah_angkutan_gl_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 2,
					'tma_by' => \Auth::user()->id,
					'tma_date' => date('Y-m-d H:i:s')
				]);
			else if($level === 3) 
				$updated = \DB::table('tx_upah_angkutan_gl_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 3,
					'periode_bayar_awal' => $request->input('periode_bayar_awal'),
					'periode_bayar_akhir' => $request->input('periode_bayar_akhir'),
					'keu_by' => \Auth::user()->id,
					'keu_date' => date('Y-m-d H:i:s')
				]);
			else if($level === 4)
			$updated = \DB::table('tx_upah_angkutan_gl_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 3,
					'approve_bayar' => 1,
					'bayar_date' => date('Y-m-d H:i:s')
				]);
			else if($level === 5)
			$updated = \DB::table('tx_upah_angkutan_gl_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 0,
					'pta_by' => null,
					'pta_date' => null,
					'tma_by' => null,
					'tma_date' => null,
					'keu_by' => null,
					'keu_date' => null,
					'approve_bayar' => 0,
					'bayar_date' => null
				]);
			else if($level === 6)
				$updated = \DB::table('tx_upah_angkutan_gl_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 4,
					'approve_ho' => date('Y-m-d H:i:s')
				]);	
			 else 
				return response()->json(array(
					'status'=>'error',
					'message'=> 'Invalid validation level'
				));	

			if($updated) {
				return response()->json(array(
					'status'=>'success',
					'message'=> __('core.note_success')
				));
			} else {
				return response()->json(array(
					'status'=>'error',
					'message'=> 'Dokumen tidak ditemukan'
				));
			}
		} catch(\Exception $e) {
			return response()->json(array(
				'status'=>'error',
				'message'=> 'Error: ' . $e->getMessage()
			));
		}
	}

	public function cetak(Request $request)
	{
		$no_dokumen = $request->input('no_dokumen');
		if (!$no_dokumen) {
			return response('No document specified', 400);
		}

		$header = \DB::table('tx_upah_angkutan_gl_tma as a')
			->join('master_vendor_gl as b', 'a.id_vendor', '=', 'b.kode_vendor')
			->join('master_kebun as c', 'a.unit', '=', 'c.kode_kebun')
			->select(
				'c.nama_kebun',
				'a.no_dokumen',
				'a.tanggal',
				'b.nama_vendor as vendor',
				'a.tgl_timbang_awal',
				'a.tgl_timbang_akhir',
				'a.jml_spta',
				'a.nominal',
				'a.status'
			)
			->where('a.no_dokumen', $no_dokumen)
			->first();

		if (!$header) {
			return response('Document not found', 404);
		}

		$results = \DB::table('tx_upah_angkutan_gl_tma_detail as a')
			->leftJoin('master_pg as c', 'c.kode_pg', '=', \DB::raw('LEFT(a.no_spta, 4)'))
			->selectRaw("
				a.no_dokumen,
				a.no_spta,
				c.nama_pg as pg_penggiling,
				a.no_kendaraan,
				a.no_petak,
				a.tgl_timbang,
				a.netto,
				a.kualitas,
				a.tarif,
				(a.netto * a.tarif) as nominal
			")
			->where('a.no_dokumen', $no_dokumen)
			->get();

		$totalNetto = 0;
		$totalNominal = 0;

		// Build printable HTML
		$html = '<!doctype html><html><head><meta charset="utf-8"><title>Cetak Dokumen ' . htmlspecialchars($no_dokumen) . '</title>';
		$html .= '<style>
			@page { size: A4 landscape; margin: 18mm; }
			body{ font-family: Arial, sans-serif; color:#222; font-size:12px; margin:0; padding:0; }
			.container{ padding:12mm; }
			h2{ margin:0 0 8px 0; color:#0366d6; }
			.meta{ margin-bottom:12px; display:flex; gap:24px; flex-wrap:wrap; }
			.meta table{ border-collapse:collapse; }
			.meta td{ padding:4px 8px; vertical-align:top; }
			table.grid{ width:100%; border-collapse:collapse; margin-top:8px; }
			table.grid th, table.grid td{ border:1px solid #bbb; padding:6px 8px; }
			table.grid th{ background:#f3f6fa; font-weight:700; }
			.text-right{ text-align:right; }
			.text-center{ text-align:center; }
			.totals td{ font-weight:700; background:#f8f9fa; }
			.print-note{ margin-top:12px; font-size:11px; color:#555; }
			.watermark-draft {
				position: fixed;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%) rotate(-30deg);
				font-size: 120px;
				color: rgba(200,0,0,0.13);
				font-weight: bold;
				z-index: 9999;
				pointer-events: none;
				white-space: nowrap;
			}
			@media print {
				@page { size: A4 landscape; margin: 18mm; }
				body { -webkit-print-color-adjust: exact; }
				button.print-btn{ display:none; }
				.container{ padding:8mm; }
				.watermark-draft { color: rgba(200,0,0,0.10); }
			}
		</style>';
		$html .= '</head><body>';
		
		// Tambahkan watermark jika status dokumen = 0 (draft)
		if (isset($header->status) && $header->status == 0) {
			$html .= '<div class="watermark-draft">DRAFT</div>';
		}
		
		$html .= '<div class="container">';
		$html .= '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;"><h2>Rekapitulasi Muat Mekanis Grab Loader</h2><div><button class="print-btn" onclick="window.print()">Print</button></div></div>';

		$html .= '<div class="meta">';
		$html .= '<table><tr><td style="font-weight:600">Kebun</td><td>:</td><td>' . htmlspecialchars($header->nama_kebun) . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">No Dokumen</td><td>:</td><td>' . htmlspecialchars($header->no_dokumen) . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">Tanggal Dokumen</td><td>:</td><td>' . self::formatTanggalIndo($header->tanggal) . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">Periode Timbang</td><td>:</td><td>' . self::formatTanggalIndo($header->tgl_timbang_awal) . ' - ' . self::formatTanggalIndo($header->tgl_timbang_akhir) . '</td></tr>';		
		$html .= '</table>';
		$html .= '<table><tr><td style="font-weight:600">Vendor</td><td>:</td><td>' . htmlspecialchars($header->vendor) . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">Jumlah SPTA</td><td>:</td><td>' . number_format($header->jml_spta, 0, ',', '.') . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">Total Nominal</td><td>:</td><td style="font-weight:700;color:#0366d6;">Rp ' . number_format($header->nominal, 0, ',', '.') . '</td></tr>';
		$html .= '</table>';
		$html .= '</div>';

		// Table header
		$html .= '<table class="grid"><thead>';
		$html .= '<tr>';
		$html .= '<th>No SPTA</th><th>PG Penggiling</th><th>No Kendaraan</th><th>No Petak</th><th>Tanggal Timbang</th><th>Kualitas</th><th class="text-right">Netto (kg)</th><th class="text-right">Tarif (Rp/kg)</th><th class="text-right">Nominal (Rp)</th>';
		$html .= '</tr>';
		$html .= '</thead><tbody>';

		foreach ($results as $row) {
			$html .= '<tr>';
			$html .= '<td>' . htmlspecialchars($row->no_spta) . '</td>';
			$html .= '<td>' . htmlspecialchars($row->pg_penggiling) . '</td>';
			$html .= '<td>' . htmlspecialchars($row->no_kendaraan) . '</td>';
			$html .= '<td>' . htmlspecialchars($row->no_petak) . '</td>';
			$html .= '<td>' . self::formatTanggalIndo($row->tgl_timbang) . '</td>';
			$html .= '<td class="text-center">' . htmlspecialchars($row->kualitas) . '</td>';
			$html .= '<td class="text-right">' . number_format($row->netto, 0, ',', '.') . '</td>';
			$html .= '<td class="text-right">' . number_format($row->tarif, 3, ',', '.') . '</td>';
			$html .= '<td class="text-right">' . number_format($row->nominal, 0, ',', '.') . '</td>';
			$html .= '</tr>';

			$totalNetto += (float)$row->netto;
			$totalNominal += (float)$row->nominal;
		}

		// Totals row
		$html .= '<tr class="totals">';
		$html .= '<td colspan="6" class="text-right">Total</td>';
		$html .= '<td class="text-right">' . number_format($totalNetto, 0, ',', '.') . '</td>';
		$html .= '<td class="text-right">-</td>';
		$html .= '<td class="text-right">Rp ' . number_format($totalNominal, 0, ',', '.') . '</td>';
		$html .= '</tr>';

		$html .= '</tbody></table>';

		// Signatures: Petugas Tebang Angkut, Asisten TMA, Asisten Keuangan
		$html .= '<div style="margin-top:36px;display:flex;justify-content:space-between;">';

		$ttd = [
			'Vendor',
			'Manajer TMA/Tanaman',
			'Manajer Keuangan dan Umum'
		];

		foreach ($ttd as $label) {
			$html .= '<div style="width:30%;text-align:center;">';
			$html .= '<div style="font-weight:700;margin-bottom:8px;">' . htmlspecialchars($label) . '</div>';
			$html .= '<div style="height:80px;"></div>'; // space for signature
			$html .= '<div style="border-top:1px solid #000;margin-top:8px;padding-top:6px;font-size:12px;">(Nama / NIP)</div>';
			$html .= '</div>';
		}

		$html .= '</div>';

		$html .= '<div class="print-note" style="margin-top:18px;">Dicetak pada: ' . date('d-m-Y H:i') . '</div>';
		$html .= '<script>window.onload=function(){ setTimeout(function(){ window.print(); },300); };</script>';
		$html .= '</div></body></html>';

		return response($html);
	}

	public function rekapitulasi(Request $request)
	{
		config(['app.debug' => true]);
		
		$tglAwal = $request->input('tgl_awal');
		$tglAkhir = $request->input('tgl_akhir');
		$kategori_filter = $request->input('kategori_filter');
		$vendor = $request->input('vendor');
		$rayon = $request->input('rayon');
		$jenis_report = $request->input('jenis_report','SPTA'); // 'SPTA', 'DOKUMEN', 'VENDOR', 'LAHAN', 'AFDELING', 'RAYON'
		$isPrint = $request->input('print', false);

		$qb = \DB::table('tx_ajuan_tebang as a')
			->join('tx_petak_tebang as b', 'b.id_petak', '=', 'a.lahan_id')
			->join('tx_pos_keluar as c', 'c.kode_booking', '=', 'b.nomor_booking')
			->join('data_timbangan as d', 'd.no_spta', '=', 'c.spta')
			->join('tx_upah_angkutan_gl_tma_detail as f', 'f.no_spta', '=', 'c.spta')
			->join('tx_upah_angkutan_gl_tma as g', 'g.no_dokumen', '=', 'f.no_dokumen')
			->join('master_vendor_gl as h', 'h.kode_vendor', '=', 'g.id_vendor')
			->join('master_kebun as i', 'i.kode_kebun', '=', 'g.unit')
			->leftJoin('master_pg as j', 'j.kode_pg', '=', \DB::raw('LEFT(c.spta, 4)'))
			->selectRaw('
				i.nama_kebun,
				g.no_dokumen,
				g.tanggal as tgl_dokumen,
				a.lahan_id,
				a.afdeling,
				a.rayon,
				a.periode_tebang,
				h.nama_vendor,
				h.kode_vendor,
				b.jenis_kendaraan,
				b.nomor_kendaraan,
				j.nama_pg as pg_penggiling,
				c.spta,
				d.netto_final_kg as netto,
				d.tgl_timbang,
				f.kualitas,
				f.tarif,
				(f.netto * f.tarif) as nominal,
				g.periode_bayar_awal,
				g.periode_bayar_akhir
			')
			->groupBy('c.spta')
			->whereRaw("g.unit = ?", [substr(session('fid'),0,4)]);

		if ($tglAwal && $tglAkhir) {
			if($kategori_filter == '1') {
				$qb->whereBetween('g.tanggal', [$tglAwal, $tglAkhir]);
			} else {
				$qb->whereBetween('d.tgl_timbang', [$tglAwal, $tglAkhir]);
			}
		} elseif ($tglAwal) {
			if($kategori_filter == '1') {
				$qb->where('g.tanggal', '>=', $tglAwal);
			} else {
				$qb->where('d.tgl_timbang', '>=', $tglAwal);
			}
		} elseif ($tglAkhir) {
			if($kategori_filter == '1') {
				$qb->where('g.tanggal', '<=', $tglAkhir);
			} else {
				$qb->where('d.tgl_timbang', '<=', $tglAkhir);
			}
		}

		if ($vendor) {
			$qb->where('g.id_vendor', $vendor);
		}
		if ($rayon) {
			$qb->where('a.rayon', $rayon);
		}

		$results = $qb->orderBy('g.id')->get();

		// Group data based on jenis_report
		$groupedData = [];
		$groupKey = '';
		
		switch($jenis_report) {
			case 'DOKUMEN':
				foreach($results as $r) {
					$groupKey = $r->no_dokumen;
					if (!isset($groupedData[$groupKey])) {
						$groupedData[$groupKey] = [];
					}
					$groupedData[$groupKey][] = $r;
				}
				break;
			case 'VENDOR':
				foreach($results as $r) {
					$groupKey = $r->kode_vendor . ' - ' . $r->nama_vendor;
					if (!isset($groupedData[$groupKey])) {
						$groupedData[$groupKey] = [];
					}
					$groupedData[$groupKey][] = $r;
				}
				break;
			case 'LAHAN':
				foreach($results as $r) {
					$groupKey = $r->lahan_id;
					if (!isset($groupedData[$groupKey])) {
						$groupedData[$groupKey] = [];
					}
					$groupedData[$groupKey][] = $r;
				}
				break;
			case 'AFDELING':
				foreach($results as $r) {
					$groupKey = $r->afdeling;
					if (!isset($groupedData[$groupKey])) {
						$groupedData[$groupKey] = [];
					}
					$groupedData[$groupKey][] = $r;
				}
				break;
			case 'RAYON':
				foreach($results as $r) {
					$groupKey = $r->rayon;
					if (!isset($groupedData[$groupKey])) {
						$groupedData[$groupKey] = [];
					}
					$groupedData[$groupKey][] = $r;
				}
				break;
			default: // SPTA
				foreach($results as $r) {
					$groupKey = $r->spta;
					$groupedData[$groupKey] = [$r];
				}
				break;
		}

		// Get info for header
		$kebunName = '';
		$periodeTimbang = '';
		$vendorName = '';
		if(count($results) > 0) {
			$kebunName = $results[0]->nama_kebun ?? '';
			if($tglAwal && $tglAkhir) {
				$periodeTimbang = self::formatTanggalIndo($tglAwal) . ' s/d ' . self::formatTanggalIndo($tglAkhir);
			}
			if($vendor) {
				$vendorName = $results[0]->nama_vendor ?? '';
			}
		}

		$html = '<!doctype html><html><head><meta charset="utf-8">';
		$html .= '<title>Rekapitulasi Muat Mekanis Grab Loader</title>';
		$html .= '<style>
			@page { size: A4 landscape; margin: 12mm; }
			body { font-family: Arial, sans-serif; font-size: 10px; margin: 0; padding: 0; }
			.container { padding: 8mm; }
			.header { text-align: center; margin-bottom: 16px; }
			.header h2 { margin: 0 0 4px 0; font-size: 16px; color: #0366d6; }
			.header .info { font-size: 11px; margin: 2px 0; }
			table.grid { width: 100%; border-collapse: collapse; font-size: 9px; }
			table.grid th, table.grid td { border: 1px solid #999; padding: 4px 6px; }
			table.grid th { background: #f3f6fa; font-weight: 700; text-align: center; }
			table.grid tfoot td { font-weight: 700; background: #f8f9fa; }
			.text-right { text-align: right; }
			.text-center { text-align: center; }
			.signatures { margin-top: 32px; page-break-inside: avoid; }
			.signature-row { display: flex; justify-content: space-between; margin-bottom: 24px; }
			.signature-box { width: 30%; text-align: center; }
			.signature-box .title { font-weight: 700; margin-bottom: 6px; font-size: 11px; }
			.signature-box .space { height: 60px; }
			.signature-box .line { border-top: 1px solid #000; margin-top: 6px; padding-top: 4px; font-size: 10px; }
			.print-note { margin-top: 12px; font-size: 9px; color: #666; text-align: right; }
			button.print-btn { padding: 8px 16px; background: #0366d6; color: #fff; border: none; border-radius: 4px; cursor: pointer; }
			@media print {
				button.print-btn { display: none; }
				.container { padding: 4mm; }
			}
		</style>';
		$html .= '</head><body>';
		$html .= '<div class="container">';
		
		// Header with report info
		$html .= '<div class="header">';
		$html .= '<h2>Rekapitulasi Muat Mekanis Grab Loader per '.htmlspecialchars($jenis_report).'</h2>';
		if($kebunName) $html .= '<div class="info">Kebun: '.htmlspecialchars($kebunName).'</div>';
		if($vendorName) $html .= '<div class="info">Vendor: '.htmlspecialchars($vendorName).'</div>';
		if($periodeTimbang) $html .= '<div class="info"><strong>Periode Pembayaran: '.$periodeTimbang.'</strong></div>';
		
		if($isPrint) {
			$html .= '<div style="margin-top:8px;"><button class="print-btn" onclick="window.print()">Print</button></div>';
		}
		$html .= '</div>';

		$html .= '<table class="grid table-responsive">';
		$html .= '<thead>';
		$html .= '<tr>';
		$fixedCols = [
			'No','Lahan ID','Afdeling','Rayon','Periode Tebang','Vendor',
			'Jenis Kendaraan','Nomor Kendaraan','PG Penggiling',
			'SPTA','Netto (kg)','Tgl Timbang','Kualitas',
			'Tarif (Rp/kg)','Nominal (Rp)','Periode Bayar'
		];
		foreach($fixedCols as $c){
			$html .= '<th>'.htmlspecialchars($c).'</th>';
		}
		$html .= '</tr>';
		$html .= '</thead><tbody>';

		$totalNetto = 0;
		$totalNominal = 0;

		// Iterate through grouped data
		foreach($groupedData as $groupName => $groupRows) {
			if($jenis_report !== 'SPTA' && count($groupRows) > 0) {
				$html .= '<tr style="background:#e3f2fd;font-weight:700;">';
				$groupLabel = '';
				switch($jenis_report) {
					case 'DOKUMEN':
						$tglDok = isset($groupRows[0]->tgl_dokumen) ? self::formatTanggalIndo($groupRows[0]->tgl_dokumen) : '';
						$groupLabel = 'No Dokumen: ' . htmlspecialchars($groupName) . ($tglDok ? ' (' . $tglDok . ')' : '');
						break;
					case 'VENDOR':
						$groupLabel = 'Vendor: ' . htmlspecialchars($groupName);
						break;
					case 'LAHAN':
						$groupLabel = 'Lahan ID: ' . htmlspecialchars($groupName);
						break;
					case 'AFDELING':
						$groupLabel = 'Afdeling: ' . htmlspecialchars($groupName);
						break;
					case 'RAYON':
						$groupLabel = 'Rayon: ' . htmlspecialchars($groupName);
						break;
				}
				$html .= '<td colspan="17" style="color:#1976d2;">'.$groupLabel.'</td>';
				$html .= '</tr>';
			}

			$groupNetto = 0;
			$groupNominal = 0;

			foreach($groupRows as $r){
				$html .= '<tr>';
						static $rowNum = 0;
						if (!isset($GLOBALS['rekapRowNum'])) $GLOBALS['rekapRowNum'] = 0;
						$GLOBALS['rekapRowNum']++;
						$html .= '<td style="text-align:center;">'.$GLOBALS['rekapRowNum'].'</td>';
				$html .= '<td>'.htmlspecialchars($r->lahan_id ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->afdeling ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->rayon ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->periode_tebang ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->nama_vendor ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->jenis_kendaraan ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->nomor_kendaraan ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->pg_penggiling ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->spta ?? '').'</td>';
				$html .= '<td class="text-right">'.number_format((float)($r->netto ?? 0),0,',','.').'</td>';
				$html .= '<td>'.self::formatTanggalIndo($r->tgl_timbang ?? '').'</td>';
				$html .= '<td class="text-center">'.htmlspecialchars($r->kualitas ?? '').'</td>';
				$html .= '<td class="text-right">'.number_format((float)($r->tarif ?? 0),3,',','.').'</td>';
				$html .= '<td class="text-right" style="font-weight:700;color:#0366d6;">'.number_format((float)($r->nominal ?? 0),0,',','.').'</td>';
				$html .= '<td>'.self::formatTanggalIndo($r->periode_bayar_awal ?? '').' s/d '.self::formatTanggalIndo($r->periode_bayar_akhir ?? '').'</td>';
				$html .= '</tr>';

				$netto = (float)($r->netto ?? 0);
				$nominal = (float)($r->nominal ?? 0);
				$totalNetto += $netto;
				$totalNominal += $nominal;
				$groupNetto += $netto;
				$groupNominal += $nominal;
			}

			// Add group subtotal if not SPTA
			if($jenis_report !== 'SPTA' && count($groupRows) > 1) {
				$html .= '<tr style="font-weight:700;background:#f1f8e9;">';
				$html .= '<td colspan="10" class="text-right" style="color:#558b2f;">Subtotal '.htmlspecialchars($groupName).'</td>';
				$html .= '<td class="text-right" style="color:#558b2f;">'.number_format($groupNetto,0,',','.').'</td>';
				$html .= '<td colspan="3"></td>';
				$html .= '<td class="text-right" style="color:#558b2f;">'.number_format($groupNominal,0,',','.').'</td>';
				$html .= '<td></td>';
				$html .= '</tr>';
			}
		}

		$html .= '</tbody><tfoot>';
		$html .= '<tr>';
		$html .= '<td colspan="10" class="text-right">Total</td>';
		$html .= '<td class="text-right">'.number_format($totalNetto,0,',','.').'</td>';
		$html .= '<td colspan="3"></td>';
		$html .= '<td class="text-right" style="font-weight:700;color:#0366d6;">'.number_format($totalNominal,0,',','.').'</td>';
		$html .= '<td></td>';
		$html .= '</tr>';
		$html .= '</tfoot></table>';

		// Signature section
		$html .= '<div class="signatures">';
	
		
		$html .= '<div class="signature-row" style="justify-content: center; gap: 80px;">';
		$ttdRow2 = ['Vendor','Manajer Tanaman/TMA', 'Manajer Keuangan dan Umum'];
		foreach($ttdRow2 as $label) {
			$html .= '<div class="signature-box">';
			$html .= '<div class="title">'.htmlspecialchars($label).'</div>';
			$html .= '<div class="space"></div>';
			$html .= '<div class="line">(Nama / NIP)</div>';
			$html .= '</div>';
		}
		$html .= '</div>';
		$html .= '</div>';

		$html .= '<div class="print-note">Dicetak pada: '.date('d-m-Y H:i').'</div>';
		
		if($isPrint) {
			$html .= '<script>window.onload=function(){ setTimeout(function(){ window.print(); },300); };</script>';
		}
		
		$html .= '</div></body></html>';

		return response($html);
	}

	public function formRekapitulasi(Request $request)
	{
		config(['app.debug' => true]);
		if(!\Auth::check())
			return redirect('user/login')->with('status','error')->with('message','You are not login');

		// $vendors = \DB::table('master_vendor_gl')
		// 	->select('kode_vendor','nama_vendor')
		// 	->orderBy('nama_vendor')
		// 	->get();

		$vendors = \DB::table('master_tarif_vendor_gl as a')
			->join('master_vendor_gl as b', 'a.id_vendor', '=', 'b.kode_vendor')
			->select('b.kode_vendor', 'b.nama_vendor')
			->when(strlen(session('gid')) > 2, function($q) {
				return $q->where('a.kode_kebun', '=', substr(session('fid'),0,4));
			})
			->groupBy('b.id')
			->orderBy('b.id', 'asc')->get();	

		$rayon = \DB::table('master_rayon')
			->select('kode_rayon','nama_rayon')
			->where('kode_kebun', substr(session('fid'),0,4))
			->orderBy('nama_rayon')
			->get();	

		$today = date('Y-m-d');
		$start = date('Y-m-01');

		$html = '<div style="max-width:920px;margin:0 auto;padding:16px;">';
		$html .= '<form id="rekapForm" class="">';
		$html .= '<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">';
		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Kategori Filter</label><select class="form-control" id="kategori_filter" name="kategori_filter"><option value="1">By Tgl Transaksi</option><option value="2">By Tgl Timbang</option></select></div>';
		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Tgl Awal</label><input type="date" id="tgl_awal" name="tgl_awal" value="'.htmlspecialchars($start).'" class="form-control" /></div>';
		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Tgl Akhir</label><input type="date" id="tgl_akhir" name="tgl_akhir" value="'.htmlspecialchars($today).'" class="form-control" /></div>';
		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Vendor GL</label><select id="vendor2" name="vendor2" class="form-control"><option value="">-- Semua --</option>';
		
		foreach($vendors as $v) {
			$html .= '<option value="'.htmlspecialchars($v->kode_vendor).'">'.htmlspecialchars($v->nama_vendor).'</option>';
		}
		
		$html .= '</select></div>';
		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Rayon</label><select id="rayon" name="rayon" class="form-control"><option value="">-- Semua --</option>';
		foreach($rayon as $r) {
			$html .= '<option value="'.htmlspecialchars($r->kode_rayon).'">'.htmlspecialchars($r->nama_rayon).'</option>';
		}
		$html .= '</select></div>';
		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Jenis Report</label><select id="jenis_report" name="jenis_report" class="form-control">';
		$html .= '<option value="SPTA">Per SPTA</option>';
		$html .= '<option value="DOKUMEN">Per Dokumen</option>';
		$html .= '<option value="VENDOR">Per Vendor</option>';
		$html .= '<option value="LAHAN">Per Lahan</option>';
		$html .= '<option value="AFDELING">Per Afdeling</option>';
		$html .= '<option value="RAYON">Per Rayon</option>';
		$html .= '</select></div>';
		$html .= '<div><button type="button" id="btnViewRekap" class="btn btn-primary" style="margin-top:0px;"><i class="fa fa-eye"></i> View</button></div>';
		$html .= '<div><button type="button" id="btnPrintRekap" class="btn btn-success" style="margin-top:0px;"><i class="fa fa-print"></i> Print</button></div>';
		$html .= '<div><button type="button" id="btnExcelRekap" class="btn btn-info" style="margin-top:0px;"><i class="fa fa-file-excel"></i> Download Excel</button></div>';
		$html .= '</div>';
		$html .= '</form>';
		$html .= '<div id="rekapContent" style="margin-top:24px;"></div>';
		$html .= '</div>';

	$html .= '<script>
	// Fungsi loadSheetJS harus didefinisikan di luar agar global

	$(document).ready(function(){
	
		
		$("#btnPrintRekap").on("click", function(){
			var tglAwal = $("#tgl_awal").val();
			var tglAkhir = $("#tgl_akhir").val();
			var vendor = $("#vendor2").val();
			var rayon = $("#rayon").val();
			var jenisReport = $("#jenis_report").val();
			var kategori = $.trim($("#kategori_filter").val());
			
			if(!tglAwal || !tglAkhir) {
				alert("Tanggal awal dan akhir wajib diisi");
				return;
			}
			
			var url = "'.url($this->module.'/rekapitulasi').'?tgl_awal="+tglAwal+"&tgl_akhir="+tglAkhir+"&vendor="+vendor+"&rayon="+rayon+"&jenis_report="+jenisReport+"&kategori_filter="+kategori+"&print=true";
			window.open(url, "_blank");
		});

	
	});
	</script>';

	$html .= '<script>
// Fungsi untuk load library SheetJS
function loadSheetJS(callback){
    if(window.XLSX) return callback();
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = "https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js";
    s.onload = callback;
    document.head.appendChild(s);
}

function validateForm(){
    var tglAwal = $.trim($("#tgl_awal").val());
    var tglAkhir = $.trim($("#tgl_akhir").val());
    var errors = [];
    if(!tglAwal) errors.push("Tanggal Awal wajib diisi");
    if(!tglAkhir) errors.push("Tanggal Akhir wajib diisi");
    return { ok: errors.length === 0, errors: errors };
}

$(document).ready(function(){
    $("#btnViewRekap").on("click", function(){
        var tglAwal = $("#tgl_awal").val();
        var tglAkhir = $("#tgl_akhir").val();
		var kategori = $.trim($("#kategori_filter").val());
        var vendor = $("#vendor2").val();
		var rayon = $("#rayon").val();
        var jenisReport = $("#jenis_report").val();
        
        if(!tglAwal || !tglAkhir) {
            alert("Tanggal awal dan akhir wajib diisi");
            return;
        }
        
        $("#rekapContent").html("<p>Loading...</p>");
        
        $.ajax({
            url: "'.url($this->module.'/rekapitulasi').'",
            type: "GET",
            data: {
                tgl_awal: tglAwal,
                tgl_akhir: tglAkhir,
                vendor: vendor,
				rayon: rayon,
                jenis_report: jenisReport,
                kategori_filter: kategori,
                print: false
            },
            success: function(res){
                $("#rekapContent").html(res);
            },
            error: function(){
                $("#rekapContent").html("<p style=\"color:red;\">Gagal memuat data</p>");
            }
        });
    });
    
    $("#btnPrintRekap").on("click", function(){
        var tglAwal = $("#tgl_awal").val();
        var tglAkhir = $("#tgl_akhir").val();
        var vendor = $("#vendor2").val();
		var kategori = $.trim($("#kategori_filter").val());
        var rayon = $("#rayon").val();
        var jenisReport = $("#jenis_report").val();
        
        if(!tglAwal || !tglAkhir) {
            alert("Tanggal awal dan akhir wajib diisi");
            return;
        }
        
        var url = "'.url($this->module.'/rekapitulasi').'?tgl_awal="+tglAwal+"&tgl_akhir="+tglAkhir+"&vendor="+vendor+"&rayon="+rayon+"&jenis_report="+jenisReport+"&kategori_filter="+kategori+"&print=true";
        window.open(url, "_blank");
    });

    // Download Excel menggunakan SheetJS
    $("#btnExcelRekap").on("click", function(){
        var v = validateForm();
        if(!v.ok){
            alert(v.errors.join("\\n"));
            return;
        }
        
        var tbl = $("#rekapContent table.grid, #rekapContent table").first()[0];
        if(!tbl){
            alert("Tabel rekap belum ditampilkan. Silakan klik View terlebih dahulu.");
            return;
        }
        
        // Clone tabel untuk membersihkan format ribuan
        var tblClone = $(tbl).clone();
        
        // Hapus format ribuan pada semua sel angka
        tblClone.find("td,th").each(function(){
            var txt = $(this).text().trim();
            // Jika ada "Rp" di depan, hapus
            txt = txt.replace(/^Rp\s*/i, "");
            // Jika hanya angka dengan ribuan, hilangkan titik/koma ribuan
			if(/^-?\d{1,3}([.]\d{3})+$/.test(txt)){
				// Hanya format ribuan tanpa desimal (misal: 1.000 atau 1,000)
				var clean = txt.replace(/\./g, "");
				$(this).text(clean);
			} else if(/^\d+[,]\d{3}$/.test(txt)){
				// Format desimal 2 digit seperti 67,00 atau 67.00 - biarkan apa adanya
				// Tidak perlu diubah
				var clean = txt.replace(/\,/g, ".");
				$(this).text(clean);
			}
        });
        
        loadSheetJS(function(){
            var wb = XLSX.utils.table_to_book(tblClone[0], {sheet: "Rekapitulasi"});
            XLSX.writeFile(wb, "Rekap_Upah_Angkutan_GL_TMA.xlsx");
        });
    });
});
</script>';
		return $html;
	}
}