<?php namespace App\Http\Controllers;

use App\Models\Upahtebangtma;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Validator, Input, Redirect ; 

class UpahtebangtmaController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'upahtebangtma';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Upahtebangtma();
		
		$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'		=> 'upahtebangtma',
			'pageUrl'			=>  url('upahtebangtma'),
			'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('upahtebangtma.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']); 
		// Generate unique document number based on date and unique sequence
		$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 updateNodok( Request $request ) 
	{
		$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';
		}

		return response()->json(array('no_dokumen'=>$today . $no_urut));
	}

	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 'getDataTimbangan':
				return $this->getDataTimbangan( $request );
				break;
			case 'viewDetailDokumen':
				return $this->viewDetailDokumen( $request );
				break;
			case 'cetak':
				return $this->cetak( $request );
				break;
			case 'validasi':
				return $this->validasi( $request );
				break;
			case 'rekapitulasi':
				return $this->rekapitulasi( $request );
				break;
			case 'formRekapitulasi':
				return $this->formRekapitulasi( $request );
				break;
			case 'updateNodok':
				return $this->updateNodok( $request );
				break;
			case 'rekapitulasiPerKebunKategori':
				return $this->rekapitulasiPerKebunKategori( $request );
				break;
			case 'rekapKebun':
				return $this->rekapKebun( $request );
				break;
			case 'ceknominal':
				return $this->ceknominal( $request );
				break;
			case 'upahPotonganForm':
				return $this->upahPotonganForm( $request );
				break;
			case 'setUpahPotongan':
				return $this->setUpahPotongan( $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('spta', []));
					$data['status'] = '0';
					$data['unit'] = session('fid');
					
					
				

					// Loop through each SPTA entry
					$sptaList = $request->input('spta', []);
					$nettoList = $request->input('netto', []);
					$noTrukList = $request->input('no_truk', []);
					$petakList = $request->input('petak', []);
					$tglTimbangList = $request->input('tgl_timbang', []);
					$kualitasList = $request->input('kualitas', []);
					$upahPotongan = $request->input('upahpotongan', []);

					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_tebang_tma_detail where no_dokumen = $data['no_dokumen']
						\DB::table('tx_upah_tebang_tma_detail')->where('no_dokumen', $data['no_dokumen'])->delete();
					}
					
					//$data['nominal'] = array_sum($nettoList)*array_sum($upahPotongan);
					$id = $this->model->insertRow($data , $request->input( $this->info['key']));

					foreach ($sptaList as $idx => $spta) {
						$dataarray = [
							'no_dokumen'   => $data['no_dokumen'],
							'no_spta'      => $spta,
							'no_kendaraan' => $noTrukList[$idx] ?? null,
							'no_petak'     => $petakList[$idx] ?? null,
							'tgl_timbang'  => $tglTimbangList[$idx] ?? null,
							'kualitas'     => $kualitasList[$idx] ?? null,
							'mandor'       => $data['mandor'],
							'jenis_tebang' => $data['jenis_tebang'],
							'netto'        => $nettoList[$idx] ?? null,
						];

						// Simpan upah potongan ke field sesuai kode
						foreach ($upahPotongan as $kode => $nominalArray) {
							$dataarray[$kode] = $nominalArray[$idx] ?? null;
						}

						\DB::table('tx_upah_tebang_tma_detail')->insert($dataarray);
					}
					

					
					/* 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 'setUpahPotongan':
				return $this->setUpahPotongan( $request );
				break;
			case 'gettemplateUpah':
				return $this->gettemplateUpah( $request );
				break;

		}
	}
	public function postData( $request)
	{ 
		config(['app.debug' => true]);
		$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 . "' ";
		}

		if(!is_null($request->input('mandor')) && $request->input('mandor') != ''){
			$mandor = $request->input('mandor');
			if ($filter != '') {
				$filter .= " AND ";
			}
			$filter .= " mandor = '" . $mandor . "' ";
		}

		if(!is_null($request->input('kebun')) && $request->input('kebun') != ''){
			$kebun = $request->input('kebun');
			if ($filter != '') {
				$filter .= " AND ";
			}
			$filter .= " unit = '" . $kebun . "' ";
		}

		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')
				{
							$masterCols = \DB::table('master_upah_potongan')
								->where('kode_kebun', $row->unit)
								->where('tebang', $row->jenis_tebang)
										->where('nominal', '>=', 0)
								->get();

							$categoryTotals = [];
							$totalNetto = 0;
							foreach ($masterCols as $mc) {
								$col = $mc->kode;
								// sum netto * nominal-per-kg (column nama sesuai kode di detail)
								$colSum = \DB::table('tx_upah_tebang_tma_detail')
									->where('no_dokumen', $row->no_dokumen)
									->sum(\DB::raw("netto * `{$col}`"));
								$cat = $mc->jenis;
								if (!isset($categoryTotals[$cat])) $categoryTotals[$cat] = 0;
								//if ($colSum > 0) {
									$categoryTotals[$cat] += $colSum;
								//}
							}

							// Get total netto
							$totalNetto = \DB::table('tx_upah_tebang_tma_detail')
								->where('no_dokumen', $row->no_dokumen)
								->sum(\DB::raw("netto"));

							// build display: show per-kategori and grand total (potongan shown as negative)
							$grand = 0;
							$htmlParts = [];
							foreach ($categoryTotals as $cat => $tot) {
								$isPotongan = (strtolower($cat) === 'potongan');
								$displayVal = $isPotongan ? -$tot : $tot;
								$grand += $displayVal; 
							}

							
					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'] == 'mandor'){
						$values[$field['field']] = \SiteHelpers::formatRows($row->{$field['field']}, $field , $row);
					} 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'] == 'jenis_tebang'){
						$values[$field['field']] = htmlspecialchars($row->{$field['field']});
						if ($row->{$field['field']} == 'Manual') {
							$values[$field['field']] = '<span class="font-bold text-info">' . htmlspecialchars($row->{$field['field']}) . '</span>';
						} elseif ($row->{$field['field']} == 'Semi Mekanis') {
							$values[$field['field']] = '<span class="font-bold text-success">' . htmlspecialchars($row->{$field['field']}) . '</span>';
						} else {
							$values[$field['field']] = '<span class="font-bold text-default">' . htmlspecialchars($row->{$field['field']}) . '</span>';
						}
					} 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($grand, 0, ',', '.') . '</div>';
					} else if($field['field'] == 'updatedOn'){
							$values[$field['field']] = '<div style="font-weight:800;color:#0366d6;text-align:right;">' . number_format($totalNetto, 0, ',', '.') . '</div>';
					}else if($field['field'] == 'pta_by'){
						$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(\'#upahtebangtma\',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 function ceknominal(Request $request)
	{
		$masterCols = \DB::table('master_upah_potongan')
								->where('kode_kebun', 'SK02')
								->where('tebang', 'manual')
								->get();

							$categoryTotals = [];
							$totalNetto = 0;
							foreach ($masterCols as $mc) {
								$col = $mc->kode;
								// sum netto * nominal-per-kg (column nama sesuai kode di detail)
								$colSum = \DB::table('tx_upah_tebang_tma_detail')
									->where('no_dokumen','20260225020005')
									->sum(\DB::raw("netto * `{$col}`"));
								$cat = $mc->jenis;
								if (!isset($categoryTotals[$cat])) $categoryTotals[$cat] = 0;
								// Abaikan nilai yang minus (hanya ambil yang positif)
								if ($colSum > 0) {
									$categoryTotals[$cat] += $colSum;
								}
							}

							// Get total netto
							$totalNetto = \DB::table('tx_upah_tebang_tma_detail')
								->where('no_dokumen', '20260225020005')
								->sum(\DB::raw("netto"));

							// build display: show per-kategori and grand total (potongan shown as negative)
							$grand = 0;
							$htmlParts = [];
							foreach ($categoryTotals as $cat => $tot) {
								$isPotongan = (strtolower($cat) === 'potongan');
								$displayVal = $isPotongan ? -$tot : $tot;
								$grand += $displayVal;
 
							}

							return response()->json(array('nominal' => $grand));
	}

	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)
		{
			$ids = $request->input('ids');
			foreach ($ids as $id) {
				$row = $this->model->find($id);
				if ($row && $row->status == 0) {
					$this->model->destroy($id);
				}else{
					return response()->json(array(
						'status'=>'error',
						'message'=> 'Dokumen dengan No. ' . $row->no_dokumen . ' tidak dapat dihapus karena sudah diproses.'
					));
				}
			}
			
			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)
	{
		
		$nik = $request->input('mandor');
		$jenis_tebang = $request->input('jenis_tebang');
		$tanggal_awal = $request->input('tanggal_awal');
		$tanggal_akhir = $request->input('tanggal_akhir');

		$edit = $request->input('edit');

		if($edit){
		// Jika edit, ambil data dari tabel tx_upah_tebang_tma_detail yang sudah ada
		$results = \DB::table('tx_upah_tebang_tma_detail as a')
			->join('data_timbangan as b', 'b.no_spta', '=', 'a.no_spta')
			->join('tx_pos_keluar as c', 'c.spta', '=', 'b.no_spta')
			->join('tx_petak_tebang as d', 'd.nomor_booking', '=', 'c.kode_booking')
			->join('tx_ajuan_tebang as f', 'd.id_petak', '=', 'f.lahan_id')
			->join('master_mandor_tebang as e', 'e.nik', '=', 'd.mandor_tebang')
			->join('tx_upah_tebang_tma as g', 'g.no_dokumen', '=', 'a.no_dokumen')
			->leftJoin('data_meja_tebu', 'b.no_spta', '=', 'data_meja_tebu.no_spta')
			->leftJoin('master_pg', 'kode_pg', '=', 'd.pg_penggiling')
			->select(
				'a.no_spta',
				'master_pg.nama_pg as pg_penggiling',
				'b.no_truk',
				'd.id_petak as petak',
				'b.tgl_timbang',
				'e.nama as mandor',
				'd.jenis_tebang',
				'b.netto_final_kg as netto',
				'a.no_dokumen',
				'data_meja_tebu.kualitas',
				'd.antar_jemput',
				'g.unit'
			)
			->where('e.nik', $nik)
			->where('d.jenis_tebang', $jenis_tebang)
			// ->whereRaw("LEFT(f.rayon,4) = ?", [substr(session('fid'),0,4)])	
			->where('g.id', $edit)		
			->whereBetween('b.tgl_timbang', [$tanggal_awal, $tanggal_akhir])
			->groupBy('a.no_spta')
			->get();


		}else{
			$results = \DB::table('data_timbangan as a')
			->join('tx_pos_keluar as b', 'b.spta', '=', 'a.no_spta')
			->join('tx_petak_tebang as c', 'c.nomor_booking', '=', 'b.kode_booking')
			->join('tx_ajuan_tebang as f', 'c.id_petak', '=', 'f.lahan_id')
			->join('master_mandor_tebang as d', 'd.nik', '=', 'c.mandor_tebang')
			->leftJoin('data_meja_tebu', 'a.no_spta', '=', 'data_meja_tebu.no_spta')
			->leftJoin('master_pg', 'kode_pg', '=', 'c.pg_penggiling')
			->leftJoin('tx_upah_tebang_tma_detail as e', function($join) use ($request) {
				$join->on('e.no_spta', '=', 'a.no_spta');
			})
			->select(
				'a.no_spta',
				'master_pg.nama_pg as pg_penggiling',
				'a.no_truk',
				'c.id_petak as petak',
				'a.tgl_timbang',
				'd.nama as mandor',
				'c.jenis_tebang',
				'a.netto_final_kg as netto',
				'e.no_dokumen',
				'data_meja_tebu.kualitas',
				'c.antar_jemput'
			)
			->where('d.nik', $nik)
			->where('c.jenis_tebang', $jenis_tebang)
			->whereRaw("LEFT(f.rayon,4) = ?", [substr(session('fid'),0,4)])
			->whereBetween('a.tgl_timbang', [$tanggal_awal, $tanggal_akhir])
			->whereNull('e.no_dokumen')
			->groupBy('a.no_spta')
			->get();
		}
		

		
	$html = '<style>
		.timbangan-table {
			border-collapse: collapse;
			width: 100%;
			font-family: Arial, sans-serif;
			background: #fafbfc;
			box-shadow: 0 2px 8px rgba(0,0,0,0.05);
		}
		.timbangan-table th, .timbangan-table td {
			border: 1px solid #e1e4e8;
			padding: 8px 12px;
			text-align: left;
		}
		.timbangan-table th {
			background: #0366d6;
			color: #fff;
			font-weight: bold;
		}
		.timbangan-table tr:nth-child(even) {
			background: #f6f8fa;
		}
		.timbangan-table tr:hover {
			background: #eaf5ff;
			transition: background 0.2s;
		}
	</style>';

	
	if($edit){
		$upahpotongan = \DB::table('master_upah_potongan')
		->select('kode','kategori','deskripsi','nominal','jenis')
		->where('kode_kebun', $results[0]->unit)
		->where('tebang',$jenis_tebang)
		->orderByRaw("CAST(SUBSTRING(kode, 2) AS UNSIGNED)")
		->get();
	
	}else{
		$upahpotongan = \DB::table('master_upah_potongan')
		->select('kode','kategori','deskripsi','nominal','jenis')
		->where('kode_kebun', session('fid'))
		->where('tebang',$jenis_tebang)
		->orderByRaw("CAST(SUBSTRING(kode, 2) AS UNSIGNED)")
		->get();

	}	

	

	// Define background and text colors for each kategori
	$kategoriColors = [
		'Upah Pokok'      => ['bg' => '#198754', 'color' => '#fff'], // solid green
		'Upah Insidentil'  => ['bg' => '#ffc107', 'color' => '#212529'], // solid yellow
		'Potongan'        => ['bg' => '#dc3545', 'color' => '#fff'], // solid red
	];

	config(['app.debug' => true]);
	// Saat edit, ambil nominal yang sudah tersimpan per SPTA dan per kode agar form menampilkan data lama yang benar
	$upahNominalBySpta = [];
	if ($edit && !empty($results)) {
		$sptaList = collect($results)->pluck('no_spta')->all();
		$detailRows = \DB::table('tx_upah_tebang_tma_detail')
			->whereIn('no_spta', $sptaList)
			->get();

		foreach ($results as $row) {
			$upahNominalBySpta[$row->no_spta] = [];
		}

		foreach ($detailRows as $detail) {
			if (!isset($upahNominalBySpta[$detail->no_spta])) {
				$upahNominalBySpta[$detail->no_spta] = [];
			}
			foreach ($upahpotongan as $upah) {
				$kode = $upah->kode;
				if (isset($detail->{$kode})) {
					$upahNominalBySpta[$detail->no_spta][$kode] = (float) $detail->{$kode};
				}
			}
		}
	}

	// Build header with kategori color
	$html .= '<div style="overflow-y:auto;">';
	$html .= '<table class="table table-responsive timbangan-table" style="border-radius:12px;box-shadow:0 4px 24px rgba(0,0,0,0.08);background:#fff;max-height: 600px;">';
	// Baris kategori
	// Hitung colspan untuk kategori yang sama
	$kategoriCounts = [];
	foreach ($upahpotongan as $upah) {
		if (!isset($kategoriCounts[$upah->kategori])) {
			$kategoriCounts[$upah->kategori] = 1;
		} else {
			$kategoriCounts[$upah->kategori]++;
		}
	}

	$html .= '<tr style="background:linear-gradient(90deg,#0366d6 0,#2188ff 100%);color:#fff;position:sticky;top:0;z-index:10;">';
	$html .= '<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">No SPTA</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">PG Penggiling</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">No Truk</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Petak</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Tanggal Timbang</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Mandor</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Jenis Tebang</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Netto (kg)</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Kualitas</th>
		<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;background:inherit;">Antar Jemput Penebang</th>';
		

	$printedKategori = [];
	foreach ($upahpotongan as $upah) {
		if (!in_array($upah->kategori, $printedKategori)) {
			$bg = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['bg'] : '#e9ecef';
			$color = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['color'] : '#212529';
			$colspan = $kategoriCounts[$upah->kategori];
			$html .= '<th style="position:sticky;top:0;background:' . $bg . ';color:' . $color . ';text-align:center;font-weight:bold !important;font-size:15px;border:none;" colspan="' . $colspan . '">' . htmlspecialchars($upah->kategori) . ' (Rp/Kg)</th>';
			$printedKategori[] = $upah->kategori;
		}
	}
	$html .= '<th rowspan="2" style="position:sticky;top:0;text-align:center;vertical-align:middle;font-size:15px;letter-spacing:1px;border:none;">Aksi</th>';
	$html .= '</tr>';

	// Baris deskripsi
	$html .= '<tr style="background:#f3f6fa;">';
	foreach ($upahpotongan as $upah) {
		$bg = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['bg'] : '#e9ecef';
		$color = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['color'] : '#212529';
		$html .= '<th style="position:sticky;top:38px;background:' . $bg . ';color:' . $color . ';text-align:center;font-size:13px;font-weight:500;border:none;">' . htmlspecialchars($upah->deskripsi) . '</th>';
	}
	$html .= '</tr>';

	foreach ($results as $row) {
		$html .= '<tr style="transition:background 0.2s;">';
		$html .= '<td style="background:#f8fafc;font-weight:500;">' . htmlspecialchars($row->no_spta) . '</td>';
		$html .= '<td>' . htmlspecialchars($row->pg_penggiling) . '</td>';
		$html .= '<td>' . htmlspecialchars($row->no_truk) . '</td>';
		$html .= '<td>' . htmlspecialchars($row->petak) . '</td>';
		$html .= '<td>' . htmlspecialchars($row->tgl_timbang) . '</td>';
		$html .= '<td>' . htmlspecialchars($row->mandor) . '</td>';
		$html .= '<td>' . htmlspecialchars($row->jenis_tebang) . '</td>';
		$html .= '<td style="text-align:right;font-weight:600;color:#0366d6;">' . number_format($row->netto, 0, ',', '.') . '<input type="hidden" name="spta[]" value="' . htmlspecialchars($row->no_spta) . '" />
				<input type="hidden" name="netto[]" value="' . htmlspecialchars($row->netto) . '" class="netto-input" data-row="' . htmlspecialchars($row->no_spta) . '" /><input type="hidden" name="no_truk[]" value="' . htmlspecialchars($row->no_truk) . '" /><input type="hidden" name="petak[]" value="' . htmlspecialchars($row->petak) . '" /><input type="hidden" name="tgl_timbang[]" value="' . htmlspecialchars($row->tgl_timbang) . '" /></td>';
		$html .= '<td style="text-align:center;"><input type="text" style="width: 34px;" name="kualitas[]" value="' . htmlspecialchars($row->kualitas) . '" /></td>';
		$html .= '<td>' . htmlspecialchars($row->antar_jemput) . '</td>';
		foreach ($upahpotongan as $upah) {
			if ($edit && isset($upahNominalBySpta[$row->no_spta][$upah->kode])) {
				$upah->nominal = $upahNominalBySpta[$row->no_spta][$upah->kode];
			}
			$bg = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['bg'] : '#e9ecef';
			$color = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['color'] : '#212529';
			$hasil = (float)$row->netto * (float)$upah->nominal;
			$html .= '<td style="background:' . $bg . ';color:' . $color . ';padding:4px 8px;text-align:right;">
				<input type="number" step="0.001" name="upahpotongan['.htmlspecialchars($upah->kode).'][]" value="' . $upah->nominal . '" class="nominal-input" data-row="' . htmlspecialchars($row->no_spta) . '" data-kode="' . htmlspecialchars($upah->kode) . '" data-kategori="' . htmlspecialchars($upah->jenis) . '" style="text-align:right;min-width:80px;border-radius:6px;border:1px solid #d1d5db;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,0.03); width:100px;" oninput="updateHasil(this); updateTotals();" />
				<div class="hasil-perkalian" data-row="' . htmlspecialchars($row->no_spta) . '" data-kode="' . htmlspecialchars($upah->kode) . '" data-kategori="' . htmlspecialchars($upah->jenis) . '" style="text-align:right;font-size:11px;margin-top:4px;font-weight:600;">Rp ' . number_format($hasil, 0, ',', '.') . '</div>
			</td>';
		}
		$html .= '<td style="text-align:center;"><button type="button" class="btn btn-sm btn-danger" onclick="deleteRow(this)"><i class="fa fa-trash"></i></button></td>';
		$html .= '</tr>';
	}

	// Add totals row
	$html .= '<tr style="font-weight:700;background:#f8f9fa;">';
	$html .= '<td colspan="10" style="text-align:right;padding:10px;border-top:2px solid #e1e4e8;">Total</td>';
	foreach ($upahpotongan as $upah) {		
		$bg = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['bg'] : '#e9ecef';
		$color = isset($kategoriColors[$upah->kategori]) ? $kategoriColors[$upah->kategori]['color'] : '#212529';
		$html .= '<td style="background:' . $bg . ';color:' . $color . ';padding:10px;text-align:right;border-top:2px solid #e1e4e8;">
			<div class="total-kolom" data-kode="' . htmlspecialchars($upah->kode) . '" data-kategori="' . htmlspecialchars($upah->jenis) . '" style="font-weight:700;">Rp 0</div>
		</td>';
	}
	$html .= '<td style="border-top:2px solid #e1e4e8;"></td>';
	$html .= '</tr>';

	// Add grand total row
	$html .= '<tr style="font-weight:800;background:#e3f2fd;">';
	$html .= '<td colspan="10" style="text-align:right;padding:12px;border-top:2px solid #0366d6;color:#0366d6;">Grand Total (Upah - Potongan)</td>';
	$html .= '<td colspan="' . (count($upahpotongan) + 1) . '" style="text-align:right;padding:12px;border-top:2px solid #0366d6;color:#0366d6;font-size:16px;">
		<span id="grandTotal">Rp 0</span>
	</td>';
	$html .= '</tr>';

	$html .= '</table>';
	$html .= '<script>
		function deleteRow(btn) {
			if(confirm("Hapus item ini?")) {
				$(btn).closest("tr").remove();
				updateTotals();
			}
		}
		
		function updateHasil(input) {
			var row = $(input).data("row");
			var kode = $(input).data("kode");
			var nominal = parseFloat($(input).val()) || 0;
			var netto = parseFloat($(".netto-input[data-row=\""+row+"\"]").val()) || 0;
			var hasil = netto * nominal;
			var hasilFormatted = "Rp " + hasil.toLocaleString("id-ID", {minimumFractionDigits: 0, maximumFractionDigits: 0});
			$(".hasil-perkalian[data-row=\""+row+"\"][data-kode=\""+kode+"\"]").text(hasilFormatted);
		}

		function updateTotals() {
			var totals = {};
			var grandTotal = 0;

			// Calculate totals per kode
			$(".hasil-perkalian").each(function() {
				var kode = $(this).data("kode");
				var kategori = $(this).data("kategori");
				var text = $(this).text().replace(/[^0-9-]/g, "");
				var nilai = parseInt(text) || 0;
				
				if (!totals[kode]) {
					totals[kode] = { total: 0, kategori: kategori };
				}
				totals[kode].total += nilai;
			});

			// Update total per kolom and calculate grand total
			$(".total-kolom").each(function() {
				var kode = $(this).data("kode");
				var kategori = $(this).data("kategori");
				var total = totals[kode] ? totals[kode].total : 0;
				$(this).text("Rp " + total.toLocaleString("id-ID", {minimumFractionDigits: 0, maximumFractionDigits: 0}));
				
				// Add or subtract based on kategori (Potongan = subtract)
				if (kategori && kategori.toLowerCase() === "potongan") {
					grandTotal -= total;
				} else {
					grandTotal += total;
				}
			});

			// Update grand total
			$("#grandTotal").text("Rp " + grandTotal.toLocaleString("id-ID", {minimumFractionDigits: 0, maximumFractionDigits: 0}));
		}

		// Initialize totals on page load
		$(document).ready(function() {
			updateTotals();
		});
	</script>';
	// Add a little hover effect
	$html .= '<style>
		.timbangan-table tr:hover td {
			background: #eaf5ff !important;
			transition: background 0.2s;
		}
		.timbangan-table th, .timbangan-table td {
			border: none !important;
		}
		.timbangan-table th {
			box-shadow: 0 2px 0 #e1e4e8;
		}
		.timbangan-table td {
			font-size: 14px;
		}
		.timbangan-table input[type="number"]:focus {
			border-color: #0366d6;
			box-shadow: 0 0 0 2px #cce3ff;
			outline: none;
		}
	</style>';

	return $html;
	}

	public function viewDetailDokumen(Request $request)
	{
config(['app.debug' => true]);
		$no_dokumen = $request->input('no_dokumen');

				
		$header = \DB::table('tx_upah_tebang_tma as a')
			->join('master_mandor_tebang as b', 'a.mandor', '=', 'b.nik')
			->join('master_kebun as c', 'a.unit', '=', 'c.kode_kebun')
			->select(
				'c.nama_kebun',
				'a.no_dokumen',
				'a.tanggal',
				'b.nama as mandor',
				'a.jenis_tebang',
				'a.tgl_timbang_awal',
				'a.tgl_timbang_akhir',
				'a.jml_spta',
				'pta_by',
				'tma_by',
				'keu_by',
				'approve_bayar',
				'approve_ho',
				'a.unit'
			)
			->where('a.no_dokumen', $no_dokumen)
			->first();

		$masterKolom = \DB::table('master_upah_potongan')
		->where('kode_kebun', $header->unit)
		->where('tebang', $header->jenis_tebang)
		->where('nominal', '>=', 0)
		->orderByRaw("CAST(SUBSTRING(kode, 2) AS UNSIGNED)")
		->get();

		$selectKolom = [];
		foreach ($masterKolom as $m) {
			$selectKolom[] = "a.{$m->kode} AS `{$m->deskripsi}`";
		}

		$results = \DB::table('tx_upah_tebang_tma_detail as a')
			->join('master_mandor_tebang as b', 'a.mandor', '=', 'b.nik')
			->leftJoin('data_meja_tebu', 'a.no_spta', '=', 'data_meja_tebu.no_spta')
			->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,
				b.nama AS mandor,
				a.jenis_tebang,
				a.tgl_timbang,
				a.netto,
				a.kualitas,
				" . implode(",\n", $selectKolom)
			)
			->where('a.no_dokumen', $no_dokumen)
			->groupBy('a.no_spta')
			->get();

		$showKolom = [];
		foreach ($masterKolom as $m) {
			// Cek jika hasil select kolom (nilai pada $results) untuk kolom ini tidak sama dengan 0
			$hasValue = false;
			foreach ($results as $row) {
				$alias = $m->deskripsi;
				if (isset($row->{$alias}) && $row->{$alias} != 0) {
					$hasValue = true;
					break;
				}
			}
			if ($hasValue) {
				$showKolom[] = $m->deskripsi;
			}
		}

			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;">Mandor Tebang</td>
								<td>:</td>
								<td>' . htmlspecialchars($header->mandor) . '</td>
							</tr>
							
						</table>
						<table style="width:auto;font-size:15px;flex:1 1 45%;">
							<tr>
								<td style="font-weight:600;">Jenis Tebang</td>
								<td>:</td>
								<td>' . htmlspecialchars($header->jenis_tebang) . '</td>
							</tr>
							<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>
						</table>
					</div>
				</div>';
			} else {
				$html = '';
			}
		$html .= '<table class="table table-bordered table-responsive table-striped">';
		// Build counts per kategori to set colspan and preserve order
		$kategoriCounts = [];
		$kategoriOrder = [];
		foreach ($masterKolom as $m) {
			if (in_array($m->deskripsi, $showKolom)) {
				if (!isset($kategoriCounts[$m->kategori])) {
					$kategoriCounts[$m->kategori] = 0;
					$kategoriOrder[] = $m->kategori;
				}
				$kategoriCounts[$m->kategori]++;
			}
		}

		// initialize column totals (keyed by deskripsi)
		$colTotals = [];
		foreach ($masterKolom as $m) {
			if (in_array($m->deskripsi, $showKolom)) {
				$colTotals[$m->deskripsi] = 0;
			}
		}
		$totalNetto = 0;
		$grandTotal = 0;

		$html .= '<thead>';
		// First header row: fixed cols + kategori merged cells
		$html .= '<tr>
			<th style="background:#0366d6;color:#fff;text-align:center;vertical-align: middle;" rowspan="2">No SPTA</th>
			<th style="background:#0366d6;color:#fff;text-align:center;vertical-align: middle;" rowspan="2">PG Penggiling</th>
			<th style="background:#0366d6;color:#fff;text-align:center;vertical-align: middle;" rowspan="2">No Kendaraan</th>
			<th style="background:#0366d6;color:#fff;text-align:center;vertical-align: middle;" rowspan="2">No Petak</th>
			<th style="background:#0366d6;color:#fff;text-align:center;vertical-align: middle;" rowspan="2">Tanggal Timbang</th>
			<th style="background:#0366d6;color:#fff;text-align:center;vertical-align: middle;" rowspan="2">Kualitas</th>
			<th style="background:#0366d6;color:#fff;text-align:right;vertical-align: middle;" rowspan="2">Netto (kg)</th>';

			
		foreach ($kategoriOrder as $kat) {
			$colspan = $kategoriCounts[$kat];
			// warna kategori (solid)
			$bg = '#6c757d'; $color = '#fff';
			if ($kat == 'Upah Pokok') { $bg = '#198754'; $color = '#fff'; }
			elseif ($kat == 'Upah Insidentil') { $bg = '#ffc107'; $color = '#212529'; }
			elseif ($kat == 'Potongan') { $bg = '#dc3545'; $color = '#fff'; }
			$html .= '<th style="background:' . $bg . ';color:' . $color . ';text-align:center;" colspan="' . $colspan . '">' . htmlspecialchars($kat) . '</th>';
		}
			$html .= '<th style="background:#0366d6;color:#fff;text-align:right;vertical-align: middle;" rowspan="2">Total (Rp)</th>';
			$html .= '<th style="background:#6a1b9a;color:#fff;text-align:right;vertical-align: middle;" rowspan="2">Rp/kg</th>';
		$html .= '</tr>';

		// Second header row: individual deskripsi under each kategori
		$html .= '<tr>';
		foreach ($masterKolom as $m) {
			if (!in_array($m->deskripsi, $showKolom)) continue;
			$bg = '#f3f6fa'; $color = '#212529';
			if ($m->kategori == 'Upah Pokok') { $bg = '#e6f4ea'; $color = '#198754'; }
			elseif ($m->kategori == 'Upah Insidentil') { $bg = '#fff9e6'; $color = '#b8860b'; }
			elseif ($m->kategori == 'Potongan') { $bg = '#fae6e8'; $color = '#dc3545'; }
			$html .= '<th style="background:' . $bg . ';color:' . $color . ';text-align:center;">' . htmlspecialchars($m->deskripsi) . '</th>';
		}

		$html .= '</tr></thead><tbody>';

		// Rows
		foreach ($results as $row) {
			$rowTotal = 0;
			$upahPokok = 0;
			$upahInsidentil = 0;
			$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>';

				

			$totalNetto += (float)$row->netto;

			// calculate each column cell and accumulate totals
			foreach ($masterKolom as $m) {
				if (!in_array($m->deskripsi, $showKolom)) continue;
				$alias = $m->deskripsi;
				$nilai = isset($row->{$alias}) ? (float)$row->{$alias} : 0.0;
				$bg = '#f8f9fa'; $color = '#212529';
				if ($m->kategori == 'Upah Pokok') { $bg = '#e6f4ea'; $color = '#198754'; }
				elseif ($m->kategori == 'Upah Insidentil') { $bg = '#fff9e6'; $color = '#b8860b'; }
				elseif ($m->kategori == 'Potongan') { $bg = '#fae6e8'; $color = '#dc3545'; }

				$amount = $nilai * (float)$row->netto;

				// For potongan treat as negative in totals
				if ($m->kategori == 'Potongan') {
					$rowTotal -= $amount;
					$colTotals[$alias] -= $amount;
				} else {
					$rowTotal += $amount;
					$colTotals[$alias] += $amount;
					// Accumulate upah pokok and upah insidentil separately
					if ($m->kategori == 'Upah Pokok') {
						$upahPokok += $amount;
					} elseif ($m->kategori == 'Upah Insidentil') {
						$upahInsidentil += $amount;
					}
				}

				// show negative sign for potongan cells
				$html .= '<td style="text-align:right;background:' . $bg . ';color:' . $color . ';">' . number_format(abs($amount), 0, ',', '.') . '</td>';
			}

			$grandTotal += $rowTotal;
			$upahSebelumPotongan = $upahPokok + $upahInsidentil;
			$rpPerKg = ((float)$row->netto > 0) ? $upahSebelumPotongan / (float)$row->netto : 0;
			$html .= '<td style="text-align:right;font-weight:700;color:#0366d6;">' . number_format($rowTotal, 0, ',', '.') . '</td>';
			$html .= '<td style="text-align:right;font-weight:700;color:#6a1b9a;">' . number_format($rpPerKg, 0, ',', '.') . '</td>';
			$html .= '</tr>';
		}

		// Totals row (bottom)
		$kategoriColors = [
			'Upah Pokok'       => ['bg' => '#e6f4ea', 'color' => '#198754'],
			'Upah Insidentil'  => ['bg' => '#fff9e6', 'color' => '#b8860b'],
			'Potongan'         => ['bg' => '#fae6e8', 'color' => '#dc3545'],
		];

		$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>';
		
		$totalUpahPokok = 0;
		$totalUpahInsidentil = 0;
		foreach ($masterKolom as $m) {
			if (!in_array($m->deskripsi, $showKolom)) continue;
			$alias = $m->deskripsi;
			$colTotal = isset($colTotals[$alias]) ? $colTotals[$alias] : 0;
			$bg = isset($kategoriColors[$m->kategori]) ? $kategoriColors[$m->kategori]['bg'] : '#f3f6fa';
			$color = isset($kategoriColors[$m->kategori]) ? $kategoriColors[$m->kategori]['color'] : '#212529';
			$html .= '<td style="text-align:right;background:' . $bg . ';color:' . $color . ';padding:10px;border-top:2px solid #e1e4e8;">' . number_format(abs($colTotal), 0, ',', '.') . '</td>';
			
			// Accumulate upah pokok dan upah insidentil untuk grand total
			if ($m->kategori == 'Upah Pokok') {
				$totalUpahPokok += $colTotal;
			} elseif ($m->kategori == 'Upah Insidentil') {
				$totalUpahInsidentil += $colTotal;
			}
		}
		$html .= '<td style="text-align:right;padding:10px;border-top:2px solid #e1e4e8;">' . number_format($grandTotal, 0, ',', '.') . '</td>';
		
		// Grand total Rp/kg
		$totalUpahSebelumPotongan = $totalUpahPokok + $totalUpahInsidentil;
		$grandRpPerKg = ($totalNetto > 0) ? $totalUpahSebelumPotongan / $totalNetto : 0;
		$html .= '<td style="text-align:right;padding:10px;border-top:2px solid #e1e4e8;">' . number_format($grandRpPerKg, 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> Proses Validasi Ho</button>';
			}
			
		}

		if(session('gid') < 3){
			$html .= '<button class="btn btn-xs btn-info" onclick="validateDokumen(\''.htmlspecialchars($no_dokumen, ENT_QUOTES).'\', 5)"><i class="fa fa-sync"></i> Reset Validasi</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> Proses Validasi Ho</button>';
		}else if($header->approve_ho){
			$html .= '<button class="btn btn-xs btn-secondary" disabled><i class="fa fa-times"></i> Approve Ho</button>';
		}
		
		$html .= '<button class="btn btn-xs btn-primary" onclick="window.open(\''.url('upahtebangtma/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_tebang_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_tebang_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_tebang_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_tebang_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_tebang_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_tebang_tma')
				->where('no_dokumen', $no_dokumen)
				->update([
					'status' => 4,
					'approve_ho' => date('Y-m-d H:i:s')
				]);	

			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_tebang_tma as a')
			->join('master_mandor_tebang as b', 'a.mandor', '=', 'b.nik')
			->join('master_kebun as c', 'a.unit', '=', 'c.kode_kebun')
			->select(
				'c.nama_kebun',
				'a.no_dokumen',
				'a.tanggal',
				'b.nama as mandor',
				'a.jenis_tebang',
				'a.tgl_timbang_awal',
				'a.tgl_timbang_akhir',
				'a.jml_spta',
				'a.status',
				'a.unit'
			)
			->where('a.no_dokumen', $no_dokumen)
			->first();

		if (!$header) {
			return response('Document not found', 404);
		}

		$masterKolom = \DB::table('master_upah_potongan')
			->where('kode_kebun', $header->unit)
			->where('tebang', $header->jenis_tebang)
			->orderByRaw("CAST(SUBSTRING(kode, 2) AS UNSIGNED)")
			->get();

		$selectKolom = [];
		foreach ($masterKolom as $m) {
			// alias by safe column name (use deskripsi as alias like in viewDetailDokumen)
			$selectKolom[] = "a.{$m->kode} AS `{$m->deskripsi}`";
		}

		$results = \DB::table('tx_upah_tebang_tma_detail as a')
			->join('master_mandor_tebang as b', 'a.mandor', '=', 'b.nik')
			->leftJoin('data_meja_tebu', 'a.no_spta', '=', 'data_meja_tebu.no_spta')
			->leftJoin('master_pg as 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,
				b.nama AS mandor,
				a.jenis_tebang,
				a.tgl_timbang,
				a.netto,
				a.kualitas,
				" . implode(",\n", $selectKolom)
			)
			->where('a.no_dokumen', $no_dokumen)
			->groupBy('a.no_spta')
			->get();

		$showKolom = [];
		foreach ($masterKolom as $m) {
			// Cek jika hasil select kolom (nilai pada $results) untuk kolom ini tidak sama dengan 0
			$hasValue = false;
			foreach ($results as $row) {
				$alias = $m->deskripsi;
				if (isset($row->{$alias}) && $row->{$alias} != 0) {
					$hasValue = true;
					break;
				}
			}
			if ($hasValue) {
				$showKolom[] = $m->deskripsi;
			}
		}	

		// initialize column totals (keyed by deskripsi)
		$colTotals = [];
		foreach ($masterKolom as $m) {
			if (in_array($m->deskripsi, $showKolom)) {
				$colTotals[$m->deskripsi] = 0;
			}
		}
		$totalNetto = 0;
		$grandTotal = 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; }
			.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 < 3) {
			$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 Upah Tebang</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">Mandor Tebang</td><td>:</td><td>' . htmlspecialchars($header->mandor) . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">Jenis Tebang</td><td>:</td><td>' . htmlspecialchars($header->jenis_tebang) . '</td></tr>';
		$html .= '<tr><td style="font-weight:600">Jumlah SPTA</td><td>:</td><td>' . number_format($header->jml_spta, 0, ',', '.') . '</td></tr>';
		$html .= '</table>';
		$html .= '</div>';

		// Table header
		// Build kategori counts and order
		$kategoriCounts = [];
		$kategoriOrder = [];
		foreach ($masterKolom as $m) {
			if (in_array($m->deskripsi, $showKolom)) {
				if (!isset($kategoriCounts[$m->kategori])) {
					$kategoriCounts[$m->kategori] = 0;
					$kategoriOrder[] = $m->kategori;
				}
				$kategoriCounts[$m->kategori]++;
			}
		}

		// initialize column totals (keyed by deskripsi)
		$colTotals = [];
		foreach ($masterKolom as $m) {
			if (in_array($m->deskripsi, $showKolom)) {
				$colTotals[$m->deskripsi] = 0;
			}
		}
		$totalNetto = 0;
		$grandTotal = 0;

		// Table header with merged kategori cells
		$html .= '<table class="grid"><thead>';
		$html .= '<tr>';
		$html .= '<th rowspan="2">No SPTA</th><th rowspan="2">PG Penggiling</th><th rowspan="2">No Kendaraan</th><th rowspan="2">No Petak</th><th rowspan="2">Tanggal Timbang</th><th class="text-center" rowspan="2">Kualitas</th><th class="text-right" rowspan="2">Netto (kg)</th>';
		foreach ($kategoriOrder as $kat) {
			$colspan = $kategoriCounts[$kat];
			$html .= '<th colspan="' . $colspan . '">' . htmlspecialchars($kat) . '</th>';
		}
		$html .= '<th rowspan="2" class="text-right">Total Sebelum Potongan (Rp)</th>';
		$html .= '<th rowspan="2" class="text-right">Total (Rp)</th>';
		$html .= '<th rowspan="2" class="text-right">Rp/kg</th>';
		$html .= '</tr>';

		// Second header row: individual deskripsi
		$html .= '<tr>';
		foreach ($masterKolom as $m) {
			if (!in_array($m->deskripsi, $showKolom)) continue;
			$html .= '<th>' . htmlspecialchars($m->deskripsi) . '</th>';
		}
		$html .= '</tr>';
		$html .= '</thead><tbody>';

		// initialize additional totals
		$totalBeforePotongan = 0;
		$totalRpPerKg = 0;

		foreach ($results as $row) {
			$rowTotal = 0;
			$rowBeforePotongan = 0;
			$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>';


			$totalNetto += (float)$row->netto;

			foreach ($masterKolom as $m) {
				if (!in_array($m->deskripsi, $showKolom)) continue;
				$alias = $m->deskripsi;
				$nilai = isset($row->{$alias}) ? (float)$row->{$alias} : 0.0;
				$amount = $nilai * (float)$row->netto;

				if ($m->kategori == 'Potongan') {
					// potongan reduces total
					$rowTotal -= $amount;
					$colTotals[$alias] -= $amount;
				} else {
					// normal upah increases both before-potongan and total
					$rowTotal += $amount;
					$rowBeforePotongan += $amount;
					$colTotals[$alias] += $amount;
				}

				$html .= '<td class="text-right">' . number_format(abs($amount), 0, ',', '.') . '</td>';
			}

			$grandTotal += $rowTotal;
			$totalBeforePotongan += $rowBeforePotongan;

			// Calculate Rp/kg: Total dibagi Netto
			$rpPerKg = ((float)$row->netto > 0) ? $rowTotal / (float)$row->netto : 0;
			$totalRpPerKg += $rpPerKg;

			// show total before potongan then final total then rp/kg
			$html .= '<td class="text-right">' . number_format($rowBeforePotongan, 0, ',', '.') . '</td>';
			$html .= '<td class="text-right">' . number_format($rowTotal, 0, ',', '.') . '</td>';
			$html .= '<td class="text-right">' . number_format($rpPerKg, 0, ',', '.') . '</td>';
			$html .= '</tr>';
		}

		// Totals row (bottom)
		$html .= '<tr class="totals">';
		$html .= '<td colspan="6" class="text-right">Total</td>';
		$html .= '<td class="text-right">' . number_format($totalNetto, 0, ',', '.') . '</td>';
		foreach ($masterKolom as $m) {
			if (!in_array($m->deskripsi, $showKolom)) continue;
			$alias = $m->deskripsi;
			$colTotal = isset($colTotals[$alias]) ? $colTotals[$alias] : 0;
			$html .= '<td class="text-right">' . number_format(abs($colTotal), 0, ',', '.') . '</td>';
		}
		// totals for before potongan and final grand total
		$html .= '<td class="text-right">' . number_format($totalBeforePotongan, 0, ',', '.') . '</td>';
		$html .= '<td class="text-right">' . number_format($grandTotal, 0, ',', '.') . '</td>';
		// Average Rp/kg
		$avgRpPerKg = (count($results) > 0) ? $totalRpPerKg / count($results) : 0;
		$html .= '<td class="text-right">' . number_format($avgRpPerKg, 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 = [
			'Petugas Tebang Angkut',
			'Asisten TMA',
			'Asisten Keuangan'
		];

		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]);
		// Optional filters: tgl_awal, tgl_akhir, mandor_tebang, periode_tebang
		$tglAwal = $request->input('tgl_awal');
		$tglAkhir = $request->input('tgl_akhir');
		$kategori_filter = $request->input('kategori_filter');
		$rayon = $request->input('rayon');
		$mandor = $request->input('mandor_tebang');
		$jenis_tebang = $request->input('jenis_tebang');
		$jenis_report = $request->input('jenis_report','SPTA'); // 'SPTA', 'DOKUMEN', 'LAHAN', 'AFDELING', 'RAYON', 'MANDOR'
		$isPrint = $request->input('print', false); // Flag untuk print mode

		$masterKolom = \DB::table('master_upah_potongan')
			->where('kode_kebun', session('fid'))
			->where('tebang', $jenis_tebang)
			->orderByRaw("CAST(SUBSTRING(kode, 2) AS UNSIGNED)")
			->get();

		$selectKolom = [];
		foreach ($masterKolom as $m) {
			$selectKolom[] = "f.{$m->kode} AS `{$m->deskripsi}`";
		}

		$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')
			->leftJoin('data_meja_tebu as e', 'e.no_spta', '=', 'c.spta')
			->join('tx_upah_tebang_tma_detail as f', 'f.no_spta', '=', 'c.spta')
			->join('tx_upah_tebang_tma as g', 'g.no_dokumen', '=', 'f.no_dokumen')
			->join('master_mandor_tebang as h', 'h.nik', '=', 'b.mandor_tebang')
			->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,
				b.jenis_tebang,
				h.nama as mandor_tebang,
				h.nik as mandor_nik,
				b.nomor_kendaraan,
				j.nama_pg as pg_penggiling,
				c.spta,
				d.netto_final_kg as netto,
				d.tgl_timbang,
				f.kualitas,
				g.periode_bayar_awal,
				g.periode_bayar_akhir,
				'.implode(",", $selectKolom)
			)
			->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 ($mandor) {
			$qb->where('b.mandor_tebang', $mandor);
		}

		if ($jenis_tebang) {
			$qb->where('b.jenis_tebang', $jenis_tebang);
		}

		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 '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;
			case 'MANDOR':
				foreach($results as $r) {
					$groupKey = $r->mandor_nik . ' - ' . $r->mandor_tebang;
					if (!isset($groupedData[$groupKey])) {
						$groupedData[$groupKey] = [];
					}
					$groupedData[$groupKey][] = $r;
				}
				break;
			default: // SPTA - no grouping, each row is separate
				foreach($results as $r) {
					$groupKey = $r->spta;
					$groupedData[$groupKey] = [$r];
				}
				break;
		}

		// Build kategori counts and order
		$kategoriCounts = [];
		$kategoriOrder = [];
		foreach ($masterKolom as $m) {
			if (!isset($kategoriCounts[$m->kategori])) {
				$kategoriCounts[$m->kategori] = 0;
				$kategoriOrder[] = $m->kategori;
			}
			$kategoriCounts[$m->kategori]++;
		}

		// Get info for header
		$kebunName = '';
		$periodeTimbang = '';
		$mandorName = '';
		if(count($results) > 0) {
			$kebunName = $results[0]->nama_kebun ?? '';
			if($tglAwal && $tglAkhir) {
				$periodeTimbang = self::formatTanggalIndo($tglAwal) . ' s/d ' . self::formatTanggalIndo($tglAkhir);
			}
			if($mandor) {
				$mandorName = $results[0]->mandor_tebang ?? '';
			}
		}

		$html = '<!doctype html><html><head><meta charset="utf-8">';
		$html .= '<title>Rekapitulasi Upah Tebang</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; }
			.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 Upah Tebang Angkut per '.htmlspecialchars($jenis_report).'</h2>';
		if($kebunName) $html .= '<div class="info">Kebun: '.htmlspecialchars($kebunName).'</div>';
		if($jenis_tebang) $html .= '<div class="info">Jenis Tebang: '.htmlspecialchars($jenis_tebang).'</div>';
		if($periodeTimbang) $html .= '<div class="info"><strong>Periode '.($kategori_filter == '1' ? 'Tanggal Transaksi' : 'Tanggal Timbang').': '.$periodeTimbang.'</strong></div>';
		if($mandorName) $html .= '<div class="info">Mandor: '.htmlspecialchars($mandorName).'</div>';
		
		// Only show print button if in print mode (opened in new tab)
		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 table-responsive">';
		$html .= '<thead>';
		
		// First header row: fixed columns + kategori merged cells + Total columns
		$html .= '<tr>';
		$fixedCols = [
			'No','Lahan ID','Afdeling','Rayon','Periode Tebang',
			'Jenis Tebang','Mandor Tebang','Nomor Kendaraan','PG Penggiling',
			'SPTA','Netto (kg)','Tgl Timbang','Kualitas','Periode Bayar'
		];
		foreach($fixedCols as $c){
			$html .= '<th rowspan="2" style="vertical-align:middle;">'.htmlspecialchars($c).'</th>';
		}
		
		// Kategori headers with colors
		$kategoriColors = [
			'Upah Pokok'      => ['bg' => '#198754', 'color' => '#fff'],
			'Upah Insidentil' => ['bg' => '#ffc107', 'color' => '#212529'],
			'Potongan'        => ['bg' => '#dc3545', 'color' => '#fff'],
		];
		
		foreach ($kategoriOrder as $kat) {
			$colspan = $kategoriCounts[$kat];
			$bg = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['bg'] : '#6c757d';
			$color = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['color'] : '#fff';
			$html .= '<th style="background:'.$bg.';color:'.$color.';" colspan="'.$colspan.'">'.htmlspecialchars($kat).'</th>';
		}
		
		$html .= '<th rowspan="2" style="vertical-align:middle;background:#e65100;color:#fff;">Total Sebelum Potongan (Rp)</th>';
		$html .= '<th rowspan="2" style="vertical-align:middle;">Total (Rp)</th>';
		$html .= '<th rowspan="2" style="vertical-align:middle;background:#6a1b9a;color:#fff;">Rp/kg</th>';
		$html .= '</tr>';
		
		// Second header row: individual deskripsi
		$html .= '<tr>';
		foreach($masterKolom as $m){
			$bg = '#f3f6fa'; $color = '#212529';
			if ($m->kategori == 'Upah Pokok') { $bg = '#e6f4ea'; $color = '#198754'; }
			elseif ($m->kategori == 'Upah Insidentil') { $bg = '#fff9e6'; $color = '#b8860b'; }
			elseif ($m->kategori == 'Potongan') { $bg = '#fae6e8'; $color = '#dc3545'; }
			$html .= '<th style="background:'.$bg.';color:'.$color.';">'.htmlspecialchars($m->deskripsi).'</th>';
		}
		$html .= '</tr>';
		$html .= '</thead><tbody>';

		$colTotals = [];
		foreach($masterKolom as $m){
			$colTotals[$m->deskripsi] = 0;
		}
		$totalNetto = 0;
		$grandTotal = 0;
		$grandTotalBeforePotongan = 0;

		// Iterate through grouped data
		foreach($groupedData as $groupName => $groupRows) {
			// If grouping by something other than SPTA, add a group header row
			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 'LAHAN':
						$groupLabel = 'Lahan ID: ' . htmlspecialchars($groupName);
						break;
					case 'AFDELING':
						$groupLabel = 'Afdeling: ' . htmlspecialchars($groupName);
						break;
					case 'RAYON':
						$groupLabel = 'Rayon: ' . htmlspecialchars($groupName);
						break;
					case 'MANDOR':
						$groupLabel = 'Mandor: ' . htmlspecialchars($groupName);
						break;
				}
				$totalFixedCols = count($fixedCols);
				$totalKolomCols = count($masterKolom);
				$html .= '<td colspan="'.($totalFixedCols + $totalKolomCols + 3).'" style="color:#1976d2;">'.$groupLabel.'</td>';
				$html .= '</tr>';
			}

			// Initialize group totals
			$groupColTotals = [];
			foreach($masterKolom as $m){
				$groupColTotals[$m->deskripsi] = 0;
			}
			$groupNetto = 0;
			$groupTotal = 0;
			$groupTotalBeforePotongan = 0;

			// Display each row in the group
			foreach($groupRows as $r){
				$html .= '<tr>';
				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->jenis_tebang ?? '').'</td>';
				$html .= '<td>'.htmlspecialchars($r->mandor_tebang ?? '').'</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>'.htmlspecialchars($r->kualitas ?? '').'</td>';
				$html .= '<td>'.self::formatTanggalIndo($r->periode_bayar_awal ?? '').' s/d '.self::formatTanggalIndo($r->periode_bayar_akhir ?? '').'</td>';

				$rowTotal = 0;
				$rowTotalBeforePotongan = 0;
				$netto = (float)($r->netto ?? 0);
				$totalNetto += $netto;
				$groupNetto += $netto;

				foreach($masterKolom as $m){
					$alias = $m->deskripsi;
					$nilai = (float)($r->{$alias} ?? 0);
					$amount = $nilai * $netto;
					
					$bg = '#fff'; $color = '#212529';
					if ($m->kategori == 'Upah Pokok') { $bg = '#e6f4ea'; $color = '#198754'; }
					elseif ($m->kategori == 'Upah Insidentil') { $bg = '#fff9e6'; $color = '#b8860b'; }
					elseif ($m->kategori == 'Potongan') { $bg = '#fae6e8'; $color = '#dc3545'; }
					
					if (strtolower($m->kategori) === 'potongan') {
						$rowTotal -= $amount;
						$colTotals[$alias] -= $amount;
						$groupColTotals[$alias] -= $amount;
					} else {
						$rowTotal += $amount;
						$rowTotalBeforePotongan += $amount;
						$colTotals[$alias] += $amount;
						$groupColTotals[$alias] += $amount;
					}
					$html .= '<td style="background:'.$bg.';color:'.$color.';" class="text-right">'.number_format($amount,0,',','.').'</td>';
				}
				
				$html .= '<td class="text-right" style="background:#fbe9e7;color:#e65100;font-weight:600;">'.number_format($rowTotalBeforePotongan,0,',','.').'</td>';
				$html .= '<td class="text-right" style="font-weight:700;color:#0366d6;">'.number_format($rowTotal,0,',','.').'</td>';
				
				$rpPerKg = ($netto > 0) ? $rowTotal / $netto : 0;
				$html .= '<td class="text-right" style="font-weight:600;color:#6a1b9a;">'.number_format($rpPerKg,0,',','.').'</td>';
				
				$grandTotal += $rowTotal;
				$groupTotal += $rowTotal;
				$grandTotalBeforePotongan += $rowTotalBeforePotongan;
				$groupTotalBeforePotongan += $rowTotalBeforePotongan;
				$html .= '</tr>';
			}

			// 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>';

				foreach($masterKolom as $m){
					$alias = $m->deskripsi;
					$bg = '#e8f5e9'; $color = '#558b2f';
					if ($m->kategori == 'Upah Pokok') { $bg = '#c8e6c9'; $color = '#2e7d32'; }
					elseif ($m->kategori == 'Upah Insidentil') { $bg = '#fff9c4'; $color = '#9e6c00'; }
					elseif ($m->kategori == 'Potongan') { $bg = '#ffcdd2'; $color = '#c62828'; }
					$html .= '<td style="background:'.$bg.';color:'.$color.';" class="text-right">'.number_format(abs($groupColTotals[$alias] ?? 0),0,',','.').'</td>';
				}
				
				$html .= '<td class="text-right" style="background:#fbe9e7;color:#558b2f;font-weight:600;">'.number_format($groupTotalBeforePotongan,0,',','.').'</td>';
				$html .= '<td class="text-right" style="font-weight:700;color:#558b2f;">'.number_format($groupTotal,0,',','.').'</td>';
				
				$groupRpPerKg = ($groupNetto > 0) ? $groupTotal / $groupNetto : 0;
				$html .= '<td class="text-right" style="font-weight:600;color:#558b2f;">'.number_format($groupRpPerKg,0,',','.').'</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>';

		foreach($masterKolom as $m){
			$alias = $m->deskripsi;
			$bg = '#f3f6fa'; $color = '#212529';
			if ($m->kategori == 'Upah Pokok') { $bg = '#e6f4ea'; $color = '#198754'; }
			elseif ($m->kategori == 'Upah Insidentil') { $bg = '#fff9e6'; $color = '#b8860b'; }
			elseif ($m->kategori == 'Potongan') { $bg = '#fae6e8'; $color = '#dc3545'; }
			$html .= '<td style="background:'.$bg.';color:'.$color.';" class="text-right">'.number_format(abs($colTotals[$alias] ?? 0),0,',','.').'</td>';
		}
		
		$html .= '<td class="text-right" style="background:#fbe9e7;color:#e65100;font-weight:700;">'.number_format($grandTotalBeforePotongan,0,',','.').'</td>';
		$html .= '<td class="text-right" style="font-weight:700;color:#0366d6;">'.number_format($grandTotal,0,',','.').'</td>';
		
		$grandRpPerKg = ($totalNetto > 0) ? $grandTotal / $totalNetto : 0;
		$html .= '<td class="text-right" style="font-weight:700;color:#6a1b9a;">'.number_format($grandRpPerKg,0,',','.').'</td>';
		
		$html .= '</tr>';
		$html .= '</tfoot></table>';

		// Signature section with two rows
		$html .= '<div class="signatures">';
		
		// First row: 3 signatures
		$html .= '<div class="signature-row">';
		$ttdRow1 = ['Petugas Tebang Angkut', 'Asisten TMA', 'Asisten Keuangan'];
		foreach($ttdRow1 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>';
		
		// Second row: 2 signatures (centered with empty space on sides)
		$html .= '<div class="signature-row" style="justify-content: center; gap: 80px;">';
		$ttdRow2 = ['Manajer Tanaman/TMA', 'Manajer Keuangan', 'General Manager'];
		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>';
		
		// Only auto-print if in print mode
		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');

		// load filter data
		$mandors = \DB::table('master_mandor_tebang')
			->select('nik','nama')
			->whereRaw("LEFT(rayon,4) = ?", [substr(session('fid'),0,4)])
			->orderBy('nama')
			->get();

		$rayons = \DB::table('master_rayon')
			->select('kode_rayon', 'nama_rayon')
			->whereRaw("LEFT(kode_rayon,4) = ?", [substr(session('fid'),0,4)])
			->orderBy('kode_rayon')
			->get();	

		$jenisTebang = \DB::table('master_upah_potongan')
			->select('tebang')
			->where('kode_kebun', session('fid'))
			->distinct()
			->pluck('tebang');

		$today = date('Y-m-d');
		$start = date('Y-m-d');

		$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 Ajuan 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 Ajuan 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;">Jenis Tebang</label><select id="jenis_tebang" name="jenis_tebang" class="form-control"><option value="">-- Semua --</option>';
		foreach($jenisTebang as $jt){
			$html .= '<option value="'.htmlspecialchars($jt).'">'.htmlspecialchars($jt).'</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($rayons as $r){
			$html .= '<option value="'.htmlspecialchars($r->kode_rayon).'">'.htmlspecialchars($r->nama_rayon).' ('.$r->kode_rayon.')</option>';
		}
		$html .= '</select></div>';

		$html .= '<div><label style="display:block;font-weight:600;margin-bottom:6px;">Mandor Tebang</label><select id="mandor_tebang" name="mandor_tebang" class="form-control"><option value="">-- Semua --</option>';
		foreach($mandors as $m){
			$html .= '<option value="'.htmlspecialchars($m->nik).'">'.htmlspecialchars($m->nama).' ('.$m->nik.')</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 No Dokumen</option>';
		$html .= '<option value="LAHAN">Per Lahan ID</option>';
		$html .= '<option value="AFDELING">Per Afdeling</option>';
		$html .= '<option value="RAYON">Per Rayon</option>';
		$html .= '<option value="MANDOR">Per Mandor Tebang</option>';
		$html .= '</select></div>';
		// Button group di samping input terakhir
		$html .= '<div style="display:flex;gap:6px;align-items:center;">';
		$html .= '<button type="submit" class="btn btn-sm btn-primary">Tampilkan</button>';
		$html .= '<button type="button" id="rekapPrint" class="btn btn-sm btn-secondary">Cetak (Tab)</button>';
		$html .= '<button type="button" id="rekapDownload" class="btn btn-sm btn-success">Download Excel</button>';
		$html .= '</div>';
		$html .= '</div>';
		$html .= '</form>';
		$html .= '<div id="rekapResult" style="margin-top:16px;"></div>';
		$html .= '</div>';

		$html .= '<script>
			(function(){
				function validateForm(){
					var tglAwal = $.trim($("#tgl_awal").val());
					var tglAkhir = $.trim($("#tgl_akhir").val());
					var jenis = $.trim($("#jenis_tebang").val());
					var kategori = $.trim($("#kategori_filter").val());
					var rayon = $.trim($("#rayon").val());
					var errors = [];
					if(!tglAwal) errors.push("Tanggal Awal wajib diisi");
					if(!tglAkhir) errors.push("Tanggal Akhir wajib diisi");
					if(!jenis) errors.push("Jenis Tebang wajib diisi");
					return { ok: errors.length === 0, errors: errors };
				}

				$("#rekapForm").on("submit", function(e){
					e.preventDefault();
					var v = validateForm();
					if(!v.ok){
						$("#rekapResult").html("<div style=\"padding:12px;background:#fff;border:1px solid #eee;color:#b00020;\">"+v.errors.join("<br>")+"</div>");
						return;
					}
					$("#rekapResult").html("<div style=\"padding:18px;background:#fff;border:1px solid #eee;\">Memuat...</div>");
					$.get("'.url($this->module.'/rekapitulasi').'", $(this).serialize(), function(res){
						$("#rekapResult").html(res);
					}).fail(function(){ $("#rekapResult").html("<div class=\"text-danger\">Gagal memuat data</div>"); });
				});
				// Print dengan parameter print=1
				$("#rekapPrint").on("click", function(){
					var v = validateForm();
					if(!v.ok){
						$("#rekapResult").html("<div style=\"padding:12px;background:#fff;border:1px solid #eee;color:#b00020;\">"+v.errors.join("<br>")+"</div>");
						return;
					}
					var q = $("#rekapForm").serialize();
					window.open("'.url($this->module.'/rekapitulasi').'?"+q, "_blank");
				});

				// Download Excel using SheetJS (xlsx)
				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/rekapDownload.full.min.js";
					s.onload = callback;
					document.head.appendChild(s);
				}

				$("#rekapDownload").on("click", function(){
					var v = validateForm();
					if(!v.ok){
						$("#rekapResult").html("<div style=\"padding:12px;background:#fff;border:1px solid #eee;color:#b00020;\">"+v.errors.join("<br>")+"</div>");
						return;
					}
					$("#rekapResult").html("<div style=\"padding:18px;background:#fff;border:1px solid #eee;\">Menyiapkan file Excel...</div>");
					var params = $("#rekapForm").serialize();
					$.get("'.url($this->module.'/rekapitulasi').'", params, function(res){
						// parse returned HTML to find table
						var tmp = $("<div></div>").html(res);
						var tbl = tmp.find("table.grid, table.table, table").first()[0];
						if(!tbl){
							$("#rekapResult").html("<div class=\"text-danger\">Tidak menemukan tabel untuk diekspor.</div>");
							return;
						}
						// Hapus format ribuan pada semua sel angka
						$(tbl).find("td,th").each(function(){
							var txt = $(this).text();
							// Jika hanya angka dengan ribuan, hilangkan koma/titik ribuan
							if(/^-?\d{1,3}([.,]\d{3})+([.,]\d+)?$/.test(txt)){
								// Hilangkan semua koma/titik ribuan, kecuali desimal terakhir
								var clean = txt.replace(/(\d)[.,](?=\d{3}(\D|$))/g, "$1");
								$(this).text(clean);
							}
						});
						loadSheetJS(function(){
							try{
								var wb = XLSX.utils.table_to_book(tbl, {sheet:"Rekap"});
								var tglA = $("#tgl_awal").val().replace(/-/g,"");
								var tglB = $("#tgl_akhir").val().replace(/-/g,"");
								var jenis = $("#jenis_tebang").val() || "ALL";
								var fname = "rekap_"+jenis+"_"+tglA+"_"+tglB+".xlsx";
								XLSX.writeFile(wb, fname);
								$("#rekapResult").html("<div style=\"padding:12px;background:#fff;border:1px solid #eee;color:#198754;\">Download dimulai: "+fname+"</div>");
							} catch(e){
								$("#rekapResult").html("<div class=\"text-danger\">Gagal membuat file Excel: "+(e.message||e)+"</div>");
							}
						});
					}).fail(function(){ $("#rekapResult").html("<div class=\"text-danger\">Gagal memuat data untuk ekspor</div>"); });
				});
			})();
		</script>';

		return response($html);
	}

	/**
	 * REKAPITULASI PER KEBUN DAN KATEGORI UPAH
	 * Menampilkan ringkasan upah per nama_kebun dengan breakdown kategori
	 */
public function rekapitulasiPerKebunKategori(Request $request)
{
	config(['app.debug' => true]);
	$tglAwal = $request->input('tgl_awal',date('Y-01-01'));
	$tglAkhir = $request->input('tgl_akhir',date('Y-m-d'));
	$jenisTebang = $request->input('jenis_tebang', '');
	$isPrint = $request->input('print', false);

	$kebunList = [];
	for ($i = 1; $i <= 15; $i++) {
		$kebunList[] = sprintf('SK%02d', $i);
	}

		// Get kategori dari master_upah_potongan
			$masterKolom = \DB::table('master_upah_potongan')
			->whereIn('kode_kebun', $kebunList)	
			->get();

			if ($masterKolom->isEmpty()) {
				return response('<div style="padding:20px;text-align:center;color:#666;">Tidak ada master kolom upah ditemukan.</div>');
			}

			// Get semua jenis tebang yang berbeda
			$jenisTebangAll = $masterKolom->pluck('tebang')->unique()->values()->toArray();

			// Build kategori list
			$kategoriList = [];
			foreach ($masterKolom as $m) {
				$kodeKebun = strtoupper(trim((string) $m->kode_kebun));
				$kategoriList[$kodeKebun][$m->kode] = [
					'label'    => $m->deskripsi,
					'kategori' => $m->kategori,
					'tebang'   => $m->tebang,
				];
			}

			// Get unique kategori order
			$kategoriOrder = [];
			foreach ($masterKolom as $m) {
				$kodeKebun = strtoupper(trim((string) $m->kode_kebun));
				if (!isset($kategoriOrder[$kodeKebun])) {
					$kategoriOrder[$kodeKebun] = [];
				}
				if (!in_array($m->kategori, $kategoriOrder[$kodeKebun])) {
					$kategoriOrder[$kodeKebun][] = $m->kategori;
				}
			}
			foreach ($kebunList as $kodeKebun) {
				$kategoriOrder[$kodeKebun] = $kategoriOrder[$kodeKebun] ?? [];
			}

	// Query data upah angkutan GL TMA per unit dan jenis_tebang
	$upahAngkutanQuery = \DB::table('tx_upah_angkutan_gl_tma_detail as a')
		->join('tx_upah_angkutan_gl_tma as d', 'd.no_dokumen', '=', 'a.no_dokumen')
->join(\DB::raw('(SELECT * FROM tx_pos_keluar GROUP BY spta) as b'), 'b.spta', '=', 'a.no_spta')
		->join('tx_petak_tebang as c', 'c.nomor_booking', '=', 'b.kode_booking')
		->selectRaw('c.jenis_tebang, d.unit, SUM(a.netto * a.tarif) as upah')
		->whereIn('d.unit', $kebunList)
		->groupBy('d.unit', 'c.jenis_tebang');

	if ($tglAwal && $tglAkhir) {
		$upahAngkutanQuery->whereBetween('d.tanggal', [$tglAwal, $tglAkhir]);
	} elseif ($tglAwal) {
		$upahAngkutanQuery->where('d.tanggal', '>=', $tglAwal);
	} elseif ($tglAkhir) {
		$upahAngkutanQuery->where('d.tanggal', '<=', $tglAkhir);
	}

	if ($jenisTebang) {
		$upahAngkutanQuery->where('c.jenis_tebang', $jenisTebang);
	}

	$upahAngkutanResults = $upahAngkutanQuery->get();

	// Build lookup: upahAngkutan[unit][jenis_tebang] = upah
	$upahAngkutanMap = [];
	foreach ($upahAngkutanResults as $ua) {
		$unit = trim($ua->unit);
		$upahAngkutanMap[$unit][$ua->jenis_tebang] = (float)$ua->upah;
	}

	// Query data upah angkutan TMA per unit dan jenis_tebang
	$upahAngkutanTmaQuery = \DB::table('tx_upah_angkutan_tma_detail as a')
		->join('tx_upah_angkutan_tma as d', 'd.no_dokumen', '=', 'a.no_dokumen')
		->join(\DB::raw('(SELECT * FROM tx_pos_keluar GROUP BY spta) as b'), 'b.spta', '=', 'a.no_spta')
		->join('tx_petak_tebang as c', 'c.nomor_booking', '=', 'b.kode_booking')
		->selectRaw('c.jenis_tebang, d.unit, SUM(a.netto * a.tarif) as upah')
		->whereIn('d.unit', $kebunList)
		->groupBy('d.unit', 'c.jenis_tebang');

	if ($tglAwal && $tglAkhir) {
		$upahAngkutanTmaQuery->whereBetween('d.tanggal', [$tglAwal, $tglAkhir]);
	} elseif ($tglAwal) {
		$upahAngkutanTmaQuery->where('d.tanggal', '>=', $tglAwal);
	} elseif ($tglAkhir) {
		$upahAngkutanTmaQuery->where('d.tanggal', '<=', $tglAkhir);
	}

	if ($jenisTebang) {
		$upahAngkutanTmaQuery->where('c.jenis_tebang', $jenisTebang);
	}

	$upahAngkutanTmaResults = $upahAngkutanTmaQuery->get();

	// Build lookup: upahAngkutanTma[unit][jenis_tebang] = upah
	$upahAngkutanTmaMap = [];
	foreach ($upahAngkutanTmaResults as $ua) {
		$unit = trim($ua->unit);
		$upahAngkutanTmaMap[$unit][$ua->jenis_tebang] = (float)$ua->upah;
	}


	// Query data
	$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')
		->leftJoin('tx_upah_tebang_tma_detail as f', 'f.no_spta', '=', 'c.spta')
		->leftJoin('tx_upah_tebang_tma as g', 'g.no_dokumen', '=', 'f.no_dokumen')
		->join('master_kebun as i', 'i.kode_kebun', '=', \DB::raw('LEFT(a.rayon, 4)'))
		->selectRaw('i.nama_kebun, COALESCE(b.jenis_tebang, f.jenis_tebang, \'-\') as jenis_tebang, LEFT(a.rayon, 4) as kode_kebun, d.netto_final_kg as netto, IFNULL(K1,0) as K1,
				IFNULL(K2,0) as K2,
				IFNULL(K3,0) as K3,
				IFNULL(K4,0) as K4,
				IFNULL(K5,0) as K5,
				IFNULL(K6,0) as K6,
				IFNULL(K7,0) as K7,
				IFNULL(K8,0) as K8,
				IFNULL(K9,0) as K9,
				IFNULL(K10,0) as K10,
				IFNULL(K11,0) as K11,
				IFNULL(K12,0) as K12,
				IFNULL(K13,0) as K13,
				IFNULL(K14,0) as K14,
				IFNULL(K15,0) as K15,
				IFNULL(K16,0) as K16,
				IFNULL(K17,0) as K17,
				IFNULL(K18,0) as K18,
				IFNULL(K19,0) as K19,
				IFNULL(K20,0) as K20,
				IFNULL(K21,0) as K21,
				IFNULL(K22,0) as K22,
				IFNULL(K23,0) as K23')
		->whereIn(\DB::raw('LEFT(a.rayon, 4)'), $kebunList);

	if ($tglAwal && $tglAkhir) {
		$qb->whereBetween('g.tanggal', [$tglAwal, $tglAkhir]);
	} elseif ($tglAwal) {
		$qb->where('g.tanggal', '>=', $tglAwal);
	} elseif ($tglAkhir) {
		$qb->where('g.tanggal', '<=', $tglAkhir);
	}

	if ($jenisTebang) {
		$qb->where(function($q) use ($jenisTebang) {
			$q->where('b.jenis_tebang', $jenisTebang)
			  ->orWhere('f.jenis_tebang', $jenisTebang);
		});
	}

	$results = $qb->orderBy(\DB::raw('LEFT(a.rayon, 4)'), 'asc')->orderBy('b.jenis_tebang', 'asc')->get();

	if ($results->isEmpty()) {
		return response('<div style="padding:20px;text-align:center;color:#666;">Tidak ada data untuk filter yang dipilih.</div>');
	}

	// Group data by kode_kebun -> nama_kebun -> jenis_tebang -> kategori (sum amount per kategori)
	$summary = [];
	$kebunOrder = [];
	// Also store kode_kebun per namaKebun for upahAngkutan lookup
	$kebunKodeMap = [];
	$kebunNamaMap = [];

	foreach ($results as $r) {
			
		$namaKebun  = $r->nama_kebun;
		$jt         = !empty($r->jenis_tebang) ? $r->jenis_tebang : '-';
		$netto      = (float)($r->netto ?? 0);
		$kodeKebun  = strtoupper(trim((string) ($r->kode_kebun ?? '')));

		if (!isset($summary[$kodeKebun])) {
			$summary[$kodeKebun] = [];
			$kebunOrder[] = $kodeKebun;
			$kebunKodeMap[$kodeKebun] = $kodeKebun;
			$kebunNamaMap[$kodeKebun] = $namaKebun;
		}
		if (!isset($summary[$kodeKebun][$jt])) {
			$summary[$kodeKebun][$jt] = ['_netto' => 0];
			foreach (($kategoriOrder[$kodeKebun] ?? []) as $kat) {
				$summary[$kodeKebun][$jt][$kat] = 0;
			}
		}

		$summary[$kodeKebun][$jt]['_netto'] += $netto;

		foreach (($kategoriList[$kodeKebun] ?? []) as $kode => $info) {
			$nilai = (($r->{$kode} ?? null) === null) ? 0 : (float) $r->{$kode};
			
			$amount = $nilai * $netto;
			$summary[$kodeKebun][$jt][$info['kategori']] += $amount;
		}
	}

	$kebunOrder = array_unique($kebunOrder);

	// Grand total per kategori
	$grandTotalAll = ['_netto' => 0, '_upah_angkutan' => 0, '_upah_angkutan_tma' => 0];
	foreach ($kategoriOrder as $kodeKebun => $kats) {
		foreach ($kats as $kat) {
			$grandTotalAll[$kat] = 0;
		}
	}

	// Total per jenis tebang (across all kebun)
	$jenisTebangTotal = [];

	// Warna per jenis tebang
	$jtColors = [
		'Manual'       => '#fff',
		'Semi Mekanis' => '#fff',
		'Mekanis'      => '#fff',
		'-'            => '#f5f5f5',
	];
	$defaultColor = '#546e7a';

	// Warna per kategori
	$kategoriColors = [
		'Upah Pokok'      => ['bg' => '#fff', 'color' => '#212529'],
		'Upah Insidentil' => ['bg' => '#fff', 'color' => '#212529'],
		'Potongan'        => ['bg' => '#fff', 'color' => '#212529'],
	];

	// Build HTML
	$html = '<!doctype html><html><head><meta charset="utf-8">';
	$html .= '<title>Rekapitulasi Upah TMA</title>';
	$html .= '<style>
		@page { size: A4 landscape; margin: 8mm; }
		body { font-family: Arial, sans-serif; font-size: 12px; margin: 0; padding: 0; }
		.container { padding: 4mm; }
		.header { text-align: center; margin-bottom: 10px; border-bottom: 2px solid #0366d6; padding-bottom: 8px; }
		.header h2 { margin: 0; font-size: 14px; color: #0366d6; }
		.header .info { font-size: 12px; margin: 2px 0; color: #555; }
		table.grid { width: 100%; border-collapse: collapse; font-size: 12px; }
		table.grid th, table.grid td { border: 1px solid #bbb; padding: 3px 5px; white-space: nowrap; }
		table.grid th { background: #e8f0fe; font-weight: 700; text-align: center; vertical-align: middle; }
		.th-jenis { font-size: 12px; }
		.text-right { text-align: right; }
		.text-center { text-align: center; }
		tfoot td { font-weight: 700; background: #f1f3f4; }
		.row-subtotal td { font-weight: 700; background: #fffde7; color: #e65100; }
		.row-jenis-total td { font-weight: 700; background: #e3f2fd; color: #0d47a1; }
		.footer { margin-top: 10px; font-size: 12px; color: #888; text-align: right; }
		@media print { button { display: none; } }
	</style>';
	$html .= '</head><body><div class="">';

	$html .= '<div class="header">';
	$html .= '<h2>Rekapitulasi Upah TMA</h2>';
	if ($tglAwal && $tglAkhir) {
		$html .= '<div class="info">Periode: ' . date('d-m-Y', strtotime($tglAwal)) . ' s/d ' . date('d-m-Y', strtotime($tglAkhir)) . '</div>';
	}
	$html .= '</div>';

	$html .= '<table class="grid" id="table-rekapitulasi"><thead>';

	$html .= '<tr>';
	$html .= '<th>No</th>';
	$html .= '<th style="text-align:left;">Kode Kebun</th>';
	$html .= '<th style="text-align:left;">Nama Kebun</th>';
	$html .= '<th>Jenis Tebang</th>';
	$html .= '<th>Netto<br>(kg)</th>';

	foreach ($kategoriOrder[$kodeKebun] as $kat) {
		$bg = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['bg'] : '#6c757d';
		$color = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['color'] : '#fff';
		$html .= '<th style="background:' . $bg . ';color:' . $color . ';">' . htmlspecialchars($kat) . '<br>(Rp)</th>';
	}

	$html .= '<th style="background:#f57f17;color:#fff;">Upah Sebelum<br>Potongan (Rp)</th>';
	$html .= '<th style="background:#e65100;color:#fff;">Total Upah Tebang<br>(Rp)</th>';
	$html .= '<th style="background:#1565c0;color:#fff;">Upah Muat<br>Mekanis (Rp)</th>';
	$html .= '<th style="background:#0277bd;color:#fff;">Upah Angkutan<br>(Rp)</th>';
	$html .= '<th style="background:#2e7d32;color:#fff;">Total<br>(Rp)</th>';
	$html .= '<th style="background:#6a1b9a;color:#fff;">Rata-rata<br>(Rp/kg)</th>';
	$html .= '</tr>';
	$html .= '</thead><tbody>';

	$no = 0;
	foreach ($kebunOrder as $namaKebun) {
		$no++;
		$kodeKebun = trim((string) ($kebunKodeMap[$namaKebun] ?? $namaKebun));
		$NamaKebun2 = $kebunNamaMap[$namaKebun] ?? '';
		$jenisTebangKebun = array_keys($summary[$namaKebun] ?? []);
		$rowspanKebun = count($jenisTebangKebun) + 1; // +1 untuk baris subtotal kebun

		$subtotalKebun = ['_netto' => 0, '_upah_angkutan' => 0, '_upah_angkutan_tma' => 0];
		foreach ($kategoriOrder[$kodeKebun] as $kat) {
			$subtotalKebun[$kat] = 0;
		}

		$firstRow = true;
		foreach ($jenisTebangKebun as $jt) {
			$d = $summary[$namaKebun][$jt];
			$bg = isset($jtColors[$jt]) ? $jtColors[$jt] : $defaultColor;

			// Get upah angkutan GL TMA for this kebun + jenis_tebang
			$upahAngkutan = $upahAngkutanMap[$kodeKebun][$jt] ?? 0;
	
			// Get upah angkutan TMA for this kebun + jenis_tebang
			$upahAngkutanTma = $upahAngkutanTmaMap[$kodeKebun][$jt] ?? 0;

			// Accumulate per-jenis-tebang totals
			if (!isset($jenisTebangTotal[$jt])) {
				$jenisTebangTotal[$jt] = ['_netto' => 0, '_upah_angkutan' => 0, '_upah_angkutan_tma' => 0];
				foreach ($kategoriOrder[$kodeKebun] as $kat) {
					$jenisTebangTotal[$jt][$kat] = 0;
				}
			}
			$jenisTebangTotal[$jt]['_netto'] += $d['_netto'];
			$jenisTebangTotal[$jt]['_upah_angkutan'] += $upahAngkutan;
			$jenisTebangTotal[$jt]['_upah_angkutan_tma'] += $upahAngkutanTma;
			foreach ($kategoriOrder[$kodeKebun] as $kat) {
				$jenisTebangTotal[$jt][$kat] += $d[$kat] ?? 0;
			}

			$html .= '<tr>';
			if ($firstRow) {
				$html .= '<td class="text-center" rowspan="' . $rowspanKebun . '">' . $no . '</td>';
				$html .= '<td rowspan="' . $rowspanKebun . '" style="font-weight:600;">' . htmlspecialchars($kodeKebun) . '</td>';
				$html .= '<td rowspan="' . $rowspanKebun . '" style="font-weight:600;">' . htmlspecialchars($NamaKebun2) . '</td>';
				$firstRow = false;
			}
			$jtLabel = ($jt === '-') ? '<span style="color:#999;font-style:italic;">Tidak Diketahui</span>' : htmlspecialchars($jt);
			$html .= '<td class="text-center th-jenis" style="background:' . $bg . ';">' . $jtLabel . '</td>';
			$html .= '<td class="text-right">' . number_format($d['_netto'], 0, ',', '.') . '</td>';

			$totalUpahTebangRow = 0;
			foreach ($kategoriOrder[$kodeKebun] as $kat) {
				$val = $d[$kat] ?? 0;
				$bgKat = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['bg'] : '#f3f6fa';
				$colorKat = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['color'] : '#212529';
				$html .= '<td class="text-right" style="background:' . $bgKat . ';color:' . $colorKat . ';">' . number_format($val, 0, ',', '.') . '</td>';
				if ($kat === 'Potongan') {
					$totalUpahTebangRow -= $val;
				} else {
					$totalUpahTebangRow += $val;
				}
			}

			//Kolom Upah Sebelum Potongan
			$upahSebelumPotongan = 0;
			foreach ($kategoriOrder[$kodeKebun] as $kat) {
				if ($kat !== 'Potongan') {
					$upahSebelumPotongan += $d[$kat] ?? 0;
				}
			}
			$html .= '<td class="text-right" style="background:#fff3e0;color:#bf360c;font-weight:600;">' . number_format($upahSebelumPotongan, 0, ',', '.') . '</td>';

			// Kolom Total Upah Tebang (sebelum upah angkutan)
			$html .= '<td class="text-right" style="background:#fbe9e7;color:#e65100;font-weight:700;">' . number_format($totalUpahTebangRow, 0, ',', '.') . '</td>';

			// Kolom Upah Muat Mekanis (GL TMA)
			$html .= '<td class="text-right" style="background:#e3f2fd;color:#1565c0;font-weight:600;">' . number_format($upahAngkutan, 0, ',', '.') . '</td>';

			// Kolom Upah Angkutan (TMA)
			$html .= '<td class="text-right" style="background:#e1f5fe;color:#0277bd;font-weight:600;">' . number_format($upahAngkutanTma, 0, ',', '.') . '</td>';

			// Kolom Total (upah tebang + upah angkutan GL + upah angkutan TMA)
			$totalRow = $totalUpahTebangRow + $upahAngkutan + $upahAngkutanTma;
			$totalRowSebelumPotongan = $upahSebelumPotongan + $upahAngkutan + $upahAngkutanTma;
			$html .= '<td class="text-right" style="background:#e8f5e9;color:#2e7d32;font-weight:700;">' . number_format($totalRow, 0, ',', '.') . '</td>';

			$rataRataRow = ($d['_netto'] > 0) ? $totalRowSebelumPotongan / $d['_netto'] : 0;
			$html .= '<td class="text-right" style="font-weight:700;color:#6a1b9a;">' . number_format($rataRataRow, 0, ',', '.') . '</td>';
			$html .= '</tr>';

			// Akumulasi subtotal kebun
			$subtotalKebun['_netto'] += $d['_netto'];
			$subtotalKebun['_upah_angkutan'] += $upahAngkutan;
			$subtotalKebun['_upah_angkutan_tma'] += $upahAngkutanTma;
			foreach ($kategoriOrder[$kodeKebun] as $kat) {
				$subtotalKebun[$kat] += $d[$kat] ?? 0;
			}

			// Akumulasi grand total all
			$grandTotalAll['_netto'] += $d['_netto'];
			$grandTotalAll['_upah_angkutan'] += $upahAngkutan;
			$grandTotalAll['_upah_angkutan_tma'] += $upahAngkutanTma;
			foreach ($kategoriOrder[$kodeKebun] as $kat) {
				$grandTotalAll[$kat] += $d[$kat] ?? 0;
			}
		}

		// Baris subtotal per kebun
		$subtotalTotalUpahTebang = 0;
		$html .= '<tr class="row-subtotal">';
		$html .= '<td class="text-center">Jumlah</td>';
		$html .= '<td class="text-right">' . number_format($subtotalKebun['_netto'], 0, ',', '.') . '</td>';
		foreach ($kategoriOrder[$kodeKebun] as $kat) {
			$val = $subtotalKebun[$kat] ?? 0;
			$html .= '<td class="text-right">' . number_format($val, 0, ',', '.') . '</td>';
			if ($kat === 'Potongan') {
				$subtotalTotalUpahTebang -= $val;
			} else {
				$subtotalTotalUpahTebang += $val;
			}
		}

		// Kolom Upah Sebelum Potongan subtotal kebun
		$subtotalUpahSebelumPotongan = 0;
		foreach ($kategoriOrder[$kodeKebun] as $kat) {
			if ($kat !== 'Potongan') {
				$subtotalUpahSebelumPotongan += $subtotalKebun[$kat] ?? 0;
			}
		}
		$html .= '<td class="text-right" style="background:#fff3e0;color:#bf360c;font-weight:600;">' . number_format($subtotalUpahSebelumPotongan, 0, ',', '.') . '</td>';
		// Subtotal Total Upah Tebang
		$html .= '<td class="text-right" style="background:#fbe9e7;color:#e65100;font-weight:700;">' . number_format($subtotalTotalUpahTebang, 0, ',', '.') . '</td>';
		// Subtotal upah angkutan GL TMA
		$html .= '<td class="text-right" style="background:#e3f2fd;color:#1565c0;font-weight:700;">' . number_format($subtotalKebun['_upah_angkutan'], 0, ',', '.') . '</td>';
		// Subtotal upah angkutan TMA
		$html .= '<td class="text-right" style="background:#e1f5fe;color:#0277bd;font-weight:700;">' . number_format($subtotalKebun['_upah_angkutan_tma'], 0, ',', '.') . '</td>';
		$subtotalTotal = $subtotalTotalUpahTebang + $subtotalKebun['_upah_angkutan'] + $subtotalKebun['_upah_angkutan_tma'];
		$subtotalTotalSebelumPotongan = $subtotalUpahSebelumPotongan + $subtotalKebun['_upah_angkutan'] + $subtotalKebun['_upah_angkutan_tma'];
		$subtotalRataRata = ($subtotalKebun['_netto'] > 0) ? $subtotalTotalSebelumPotongan / $subtotalKebun['_netto'] : 0;
		$html .= '<td class="text-right" style="background:#e8f5e9;color:#2e7d32;font-weight:700;">' . number_format($subtotalTotal, 0, ',', '.') . '</td>';
		$html .= '<td class="text-right" style="color:#6a1b9a;">' . number_format($subtotalRataRata, 0, ',', '.') . '</td>';
		$html .= '</tr>';
	}

	// Baris Total per Jenis Tebang
	foreach ($jenisTebangTotal as $jt => $jtData) {
		$bg = isset($jtColors[$jt]) ? $jtColors[$jt] : $defaultColor;
		$totalUpahTebangJt = 0;
		$jtLabel = ($jt === '-') ? 'Tidak Diketahui' : $jt;
		$html .= '<tr class="row-jenis-total">';
		$html .= '<td colspan="3" class="text-right" style="font-weight:700;">Total ' . htmlspecialchars($jtLabel) . '</td>';
		$html .= '<td class="text-center th-jenis" style="background:' . $bg . ';">' . htmlspecialchars($jtLabel) . '</td>';
		$html .= '<td class="text-right">' . number_format($jtData['_netto'], 0, ',', '.') . '</td>';
		foreach ($kategoriOrder[$kodeKebun] as $kat) {
			$val = $jtData[$kat] ?? 0;
			$bgKat = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['bg'] : '#f3f6fa';
			$colorKat = isset($kategoriColors[$kat]) ? $kategoriColors[$kat]['color'] : '#212529';
			$html .= '<td class="text-right" style="background:' . $bgKat . ';color:' . $colorKat . ';">' . number_format($val, 0, ',', '.') . '</td>';
			if ($kat === 'Potongan') {
				$totalUpahTebangJt -= $val;
			} else {
				$totalUpahTebangJt += $val;
			}
		}
		// Upah sebelum potongan per jenis tebang
		$totalUpahSebelumPotonganJt = 0;
		foreach ($kategoriOrder[$kodeKebun] as $kat) {
			if ($kat !== 'Potongan') {
				$totalUpahSebelumPotonganJt += $jtData[$kat] ?? 0;
			}
		}
		$html .= '<td class="text-right" style="background:#fff3e0;color:#bf360c;font-weight:600;">' . number_format($totalUpahSebelumPotonganJt, 0, ',', '.') . '</td>';
		// Total Upah Tebang per jenis tebang
		$html .= '<td class="text-right" style="background:#fbe9e7;color:#e65100;font-weight:700;">' . number_format($totalUpahTebangJt, 0, ',', '.') . '</td>';
		// Upah angkutan GL TMA per jenis tebang
		$html .= '<td class="text-right" style="background:#e3f2fd;color:#1565c0;font-weight:700;">' . number_format($jtData['_upah_angkutan'] ?? 0, 0, ',', '.') . '</td>';
		// Upah angkutan TMA per jenis tebang
		$html .= '<td class="text-right" style="background:#e1f5fe;color:#0277bd;font-weight:700;">' . number_format($jtData['_upah_angkutan_tma'] ?? 0, 0, ',', '.') . '</td>';
		$totalJt = $totalUpahTebangJt + ($jtData['_upah_angkutan'] ?? 0) + ($jtData['_upah_angkutan_tma'] ?? 0);
		$totalJtSebelumPotongan = $totalUpahSebelumPotonganJt + ($jtData['_upah_angkutan'] ?? 0) + ($jtData['_upah_angkutan_tma'] ?? 0);
		$rataRataJt = ($jtData['_netto'] > 0) ? $totalJtSebelumPotongan / $jtData['_netto'] : 0;
		$html .= '<td class="text-right" style="background:#e8f5e9;color:#2e7d32;font-weight:700;">' . number_format($totalJt, 0, ',', '.') . '</td>';
		$html .= '<td class="text-right" style="font-weight:700;color:#6a1b9a;">' . number_format($rataRataJt, 0, ',', '.') . '</td>';
		$html .= '</tr>';
	}

	$html .= '</tbody><tfoot>';

	// Grand total semua
	$grandTotalUpahTebang = 0;
	$html .= '<tr style="background:#e65100;">';
	$html .= '<td colspan="3" style="text-align:right;font-weight:700;">GRAND TOTAL</td>';
	$html .= '<td class="text-center"></td>';
	$html .= '<td class="text-right">' . number_format($grandTotalAll['_netto'], 0, ',', '.') . '</td>';
	foreach ($kategoriOrder[$kodeKebun] as $kat) {
		$val = $grandTotalAll[$kat] ?? 0;
		$html .= '<td class="text-right">' . number_format($val, 0, ',', '.') . '</td>';
		if ($kat === 'Potongan') {
			$grandTotalUpahTebang -= $val;
		} else {
			$grandTotalUpahTebang += $val;
		}
	}
	// Kolom Upah Sebelum Potongan grand total
	$grandTotalSebelumPotongan = 0;
	foreach ($kategoriOrder[$kodeKebun] as $kat) {
		if ($kat !== 'Potongan') {
			$grandTotalSebelumPotongan += $grandTotalAll[$kat] ?? 0;
		}
	}
	$html .= '<td class="text-right" style="background:#fff3e0;color:#bf360c;font-weight:600;">' . number_format($grandTotalSebelumPotongan, 0, ',', '.') . '</td>';
	// Grand Total Upah Tebang
	$html .= '<td class="text-right" style="font-weight:700;">' . number_format($grandTotalUpahTebang, 0, ',', '.') . '</td>';
	// Grand total upah angkutan GL TMA
	$html .= '<td class="text-right" style="font-weight:700;">' . number_format($grandTotalAll['_upah_angkutan'] ?? 0, 0, ',', '.') . '</td>';
	// Grand total upah angkutan TMA
	$html .= '<td class="text-right" style="font-weight:700;">' . number_format($grandTotalAll['_upah_angkutan_tma'] ?? 0, 0, ',', '.') . '</td>';
	$grandTotal = $grandTotalUpahTebang + ($grandTotalAll['_upah_angkutan'] ?? 0) + ($grandTotalAll['_upah_angkutan_tma'] ?? 0);
	$grandTotalSebelumPotongan = $grandTotalSebelumPotongan + ($grandTotalAll['_upah_angkutan'] ?? 0) + ($grandTotalAll['_upah_angkutan_tma'] ?? 0);
	$grandRataRata = ($grandTotalAll['_netto'] > 0) ? $grandTotalSebelumPotongan / $grandTotalAll['_netto'] : 0;

	$html .= '<td class="text-right" style="font-weight:700;">' . number_format($grandTotal, 0, ',', '.') . '</td>';
	$html .= '<td class="text-right" style="font-weight:700;">' . number_format($grandRataRata, 0, ',', '.') . '</td>';
	$html .= '</tr>';

	$html .= '</tfoot></table>';

	if ($isPrint) {
		$html .= '<script>window.onload=function(){ setTimeout(function(){ window.print(); },300); };</script>';
	}

	$html .= '</div></body></html>';
	return response($html);
}

	public function rekapKebun(Request $request)
	{
		config(['app.debug' => true]);
		$this->data = array(
			'pageTitle'			=> 	'Rekapitulasi Upah per Kebun',
			'pageNote'			=>  	'Menampilkan rekapitulasi upah tebang per kebun dan kategori upah',
			'pageModule'		=> 'rekapkebun',
		);
		return view($this->module.'.rekapkebun',$this->data);

	}

	public function upahPotonganForm(Request $request)
	{
		$jenis_tebang = str_replace('_', ' ', $request->input('jenis_tebang'));

		$upahpotongan = \DB::table('master_upah_potongan')
			->select('kode','kategori','deskripsi','nominal','jenis','satuan')
			->where('kode_kebun', session('fid'))
			->where('tebang', $jenis_tebang)
			->get();

		$rayonList = \DB::table('master_rayon')
			->where('kode_kebun', session('fid'))
			->select('kode_rayon', 'nama_rayon')
			->get();

		$html = '<div class="form-group">';
		$html .= '<label>Pilih Rayon</label>';
		$html .= '<select class="form-control" id="rayon_select" name="rayon">';
		$html .= '<option value="">-- Pilih Rayon --</option>';
		foreach ($rayonList as $rayon) {
			$html .= '<option value="' . $rayon->kode_rayon . '">' . $rayon->nama_rayon . '</option>';
		}
		$html .= '</select>';
		$html .= '</div><div class="row">';

		if (count($upahpotongan) > 0) {
			// Group by kategori
			$grouped = [];
			foreach ($upahpotongan as $item) {
				$kategori = $item->kategori ?? 'Lainnya';
				if (!isset($grouped[$kategori])) {
					$grouped[$kategori] = [];
				}
				$grouped[$kategori][] = $item;
			}

			foreach ($grouped as $kategori => $items) {
				$html .= '<div class="mb-6 col-lg-4">';
				$html .= '<h5 class="font-bold mb-3">' . ucfirst($kategori) . '</h5>';
				$html .= '<div class="grid grid-cols-1 md:grid-cols-4 gap-4" id="upahContainer_' . str_replace(' ', '_', $kategori) . '">';

				foreach ($items as $item) {
					$html .= '<div class="px-5">';
					$html .= '<label class="form-label font-bold ">' . strtoupper($item->deskripsi) . '</label>';
					$html .= '<div class="input-group">';
					$html .= '<input type="text" class="form-control" value="' . $item->nominal . '" name="upah[' . $item->kode . ']" data-kode="' . $item->kode . '">';
					$html .= '<span class="input-group-text" style="font-size: 13px;background: transparent;">' . strtoupper($item->satuan) . '</span>';
					$html .= '</div>';
					$html .= '</div>';
				}

				$html .= '</div>';
				$html .= '</div>';
			}
		} else {
			$html .= '<div class="alert alert-info">Tidak ada data upah potongan untuk jenis tebang ini.</div>';
		}

		$html .= '</div><div class="form-group" style="margin-top: 20px;">';
		$html .= '<button type="button" class="btn btn-sm btn-warning" id="setUpahBtn"><i class="fa fa-save"></i> Simpan Template</button>  <button type="button" class="btn btn-sm btn-success" id="aturUpahBtn"><i class="fa fa-check"></i> Atur Upah Potongan</button>';
		$html .= '</div>';

		$html .= '<script>

			$(document).ready(function() {
				function updateBtnState() {
					var rayon = $("#rayon_select").val();
					if (!rayon || rayon === "" || rayon === null) {
						$("#setUpahBtn, #aturUpahBtn").prop("disabled", true);
					} else {
						$("#setUpahBtn, #aturUpahBtn").prop("disabled", false);
					}
				}


				updateBtnState();
				$("#rayon_select").on("change", function() {
					updateBtnState();

					var rayon = $(this).val();
					if (rayon && rayon !== "") {
						$.ajax({
							url: "' . url('upahtebangtma?action_task=gettemplateUpah') . '",
							method: "POST",
							data: {
								rayon: rayon,
								jenis_tebang: "' . $jenis_tebang . '"
							},
							success: function(response) {
								if (response.status === "success" && response.data) {
									$.each(response.data, function(kode, nilai) {
										$("input[data-kode=\'" + kode + "\']").val(nilai);
									});
								}
							},
							error: function(xhr, status, error) {
								notyMessage("AJAX Error: " + error);
							}
						});
					}
				});

				$("#setUpahBtn").click(function() {				

					var nominals = {};
					$("input[name^=\'upah\']").each(function() {
						var name = $(this).attr("name");
						var match = name.match(/upah\\[(.*)\\]/);
						if (!match) return;
						var kode = match[1];
						nominals[kode] = $(this).val();
					});

					var dataToSend = {
						rayon: $("#rayon_select").val(),
						nominals: nominals,
						jenis_tebang: "' . $jenis_tebang . '"
					};

					$.ajax({
						url: "' . url('upahtebangtma?action_task=setUpahPotongan') . '",
						method: "POST",
						data: dataToSend,
						success: function(response) {
							if (response.status === "success") {
								notyMessage(response.message);
							} else {
								notyMessage("Error: " + response.message);
							}
						},
						error: function(xhr, status, error) {
							notyMessage("AJAX Error: " + error);
						}
				});
			});

				$("#aturUpahBtn").click(function() {
					var nominals = {};
					$("input[name^=\'upah\']").each(function() {
						var name = $(this).attr("name");
						var match = name.match(/upah\\[(.*)\\]/);
						if (!match) return;
						var kode = match[1];
						nominals[kode] = $(this).val();
					});

					// Update input fields in getDataTimbangan with the values from nominals
					$.each(nominals, function(kode, nilai) {
						$(".nominal-input[data-kode=\'" + kode + "\']").val(nilai);
						// Update hasil-perkalian fields

						$(".nominal-input[data-kode=\'" + kode + "\']").each(function() {
							var row = $(this).closest("tr");
							var dataRow = $(this).data("row");
							var berat = parseFloat($(".netto-input[data-row=\'" + dataRow + "\']").val()) || 0;
							var upah = parseFloat(nilai) || 0;
							var hasil = berat * upah;
							var hasilFormatted = "Rp " + hasil.toLocaleString("id-ID", {minimumFractionDigits: 0, maximumFractionDigits: 0});
							$(".hasil-perkalian[data-row=\'" + dataRow + "\'][data-kode=\'" + kode + "\']").text(hasilFormatted);
						});
					});
					updateTotals();

					notyMessage("Upah potongan berhasil diatur");
				});
			});';
		$html .= '</script>';

		return $html;
	}

	public function setUpahPotongan(Request $request)
	{
		$rayon = $request->input('rayon');
		$nominals = $request->input('nominals');
		$jenis_tebang = str_replace('_', ' ', $request->input('jenis_tebang'));

		if (!$rayon || !$nominals || !$jenis_tebang) {
			return response()->json(array(
				'status' => 'error',
				'message' => 'Data tidak lengkap'
			));
		}

		try {
			foreach ($nominals as $kode => $nominal) {
				$exists = \DB::table('master_template_upah_potongan')
					->where('kode', $kode)
					->where('kode_rayon', $rayon)
					->where('tebang', $jenis_tebang)
					->exists();

				if ($exists) {
					\DB::table('master_template_upah_potongan')
						->where('kode', $kode)
						->where('kode_rayon', $rayon)
						->where('tebang', $jenis_tebang)
						->update([
							'nominal' => $nominal,
							'updated_at' => now()
						]);
				} else {
					\DB::table('master_template_upah_potongan')
						->insert([
							'kode' => $kode,
							'kode_rayon' => $rayon,
							'tebang' => $jenis_tebang,
							'nominal' => $nominal,
							'created_at' => now(),
							'updated_at' => now()
						]);
				}
			}

			return response()->json(array(
				'status' => 'success',
				'message' => 'Upah potongan berhasil diatur'
			));
		} catch (\Exception $e) {
			return response()->json(array(
				'status' => 'error',
				'message' => 'Terjadi kesalahan: ' . $e->getMessage()
			));
		}
	}

	public function gettemplateUpah(Request $request)
	{
		$rayon = $request->input('rayon');
		$jenis_tebang = str_replace('_', ' ', $request->input('jenis_tebang'));

		if (!$rayon || !$jenis_tebang) {
			return response()->json(array(
				'status' => 'error',
				'message' => 'Data tidak lengkap'
			));
		}

		try {
			$data = \DB::table('master_template_upah_potongan')
				->where('kode_rayon', $rayon)
				->where('tebang', $jenis_tebang)
				->pluck('nominal', 'kode');

			return response()->json(array(
				'status' => 'success',
				'data' => $data
			));
		} catch (\Exception $e) {
			return response()->json(array(
				'status' => 'error',
				'message' => 'Terjadi kesalahan: ' . $e->getMessage()
			));
		}
	}
}