diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..2a4e713 --- /dev/null +++ b/.env.prod @@ -0,0 +1,70 @@ +APP_NAME=Laravel +APP_ENV=production +#APP_KEY=base64:x3sTPftRy/BL+DsI7+jXtiiCtUxO9Bei0OcjM15I1rQ= +APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa +APP_DEBUG=false +APP_URL=http://admin.arrahn +API_ARRAHN_PORTAL_URL=https://pay.arrahn.com.my +API_URL=http://apiujrah.arrahn + +LOG_CHANNEL=stack + +DB_CONNECTION=mysql +DB_HOST=172.16.4.102 +DB_PORT=3306 +DB_DATABASE=kaunterpkb +DB_USERNAME=zone2 +DB_PASSWORD=G0dz!ll4@2020 + +BROADCAST_DRIVER=pusher +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=480 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=smtp.mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=null +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= + +#PUSHER_APP_ID=1132716 +#PUSHER_APP_KEY=27b70f118373dcb31ab3 +#PUSHER_APP_SECRET=ef2e62ddbc1647979bf4 + +#PUSHER_APP_ID=1220266 +#PUSHER_APP_KEY=3fb52a0bf6cc1363c736 +#PUSHER_APP_SECRET=0a27feb7c4b2f0177467 + +#PUSHER_APP_ID=4163674 +#PUSHER_APP_KEY=3nqb1ss0jlhi9w9vpi8v +#PUSHER_APP_SECRET=7dfx03w2i7ue0z6qoit3 + +PUSHER_APP_ID=1220266 +PUSHER_APP_KEY=da67a7e1a3a138b9b28e +PUSHER_APP_SECRET=114c38f6edcf085e4d7f + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" +# MIX_API_URL=http://api.arrahn +MIX_API_URL=http://apiujrah.arrahn +MIX_API_URL_ZONE1=http://apiujrah.arrahn +MIX_API_URL_ZONE2=http://apiujrah.arrahn +MIX_API_URL_ZONE3=http://apiujrah.arrahn + + +#TWILIO_WHATSAPP_NUMBER="+14155238886" +#TWILIO_SID="AC0b21863a1f21c39f153f9f7ce2551479" +#TWILIO_AUTH_TOKEN="ce474f07f586b3b150bf15a560e6d3b3" diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..9a03714 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +10 \ No newline at end of file diff --git a/app/Exports/DataPelangganBycawDetailExport.php b/app/Exports/DataPelangganBycawDetailExport.php new file mode 100644 index 0000000..efdae3c --- /dev/null +++ b/app/Exports/DataPelangganBycawDetailExport.php @@ -0,0 +1,130 @@ +pelanggan = collect($pelanggan); + $this->year = $year; + } + + /** + * Data source + */ + public function collection(): Collection + { + return $this->pelanggan; + } + + /** + * Start data from row 5 (sebab ada tajuk) + */ + public function startCell(): string + { + return 'A5'; + } + + /** + * Header column + */ + public function headings(): array + { + return [ + 'No', + 'Cawangan', + 'No.Pelanggan', + 'Umur', + 'Jantina', + 'Pekerjaan', + 'Lokasi', + 'Tempoh Pajakan', + 'Tarikh Mula', + 'Tarikh Tamat', + 'Hari Sejak Transaksi Terakhir', + 'Bil Transaksi', + 'Bil Outstanding', + 'Bil Tebus', + 'Jumlah Pinjaman (RM)', + 'Jumlah Ujrah (RM)', + 'Tujuan Gadaian', + 'Status Aktif', + 'Cara Bayaran', + 'Tarikh Lelong', + ]; + } + + /** + * Map setiap row + */ + public function map($row): array + { + return [ + ++$this->no, + $row['cawangan'], + $row['nopelanggan'], + $row['umur'], + $row['jantina'], + $row['pekerjaan'], + $row['daerah'], + $row['tempoh_pajakan'], + $row['tarikh_mula'], + $row['tarikh_tamat'], + $row['hari_sejak_transaksi'], + $row['bil_transaksi'], + $row['bil_outstanding'], + $row['bil_tebus'], + number_format($row['jumlah_pinjaman'], 2), + number_format($row['jumlah_ujrah'], 2), + $row['tujuan_gadai'], + $row['status_aktif'], + $row['cara_bayaran'], + $row['tarikh_lelong'] ?? '-', + ]; + } + + /** + * Styling Excel + */ + public function styles(Worksheet $sheet) + { + // Tajuk utama + $sheet->mergeCells('A1:R1'); + $sheet->setCellValue('A1', 'LAPORAN DATA PELANGGAN MENGIKUT CAWANGAN'); + $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Tahun + $sheet->mergeCells('A2:R2'); + $sheet->setCellValue('A2', 'TAHUN : ' . $this->year); + $sheet->getStyle('A2')->getFont()->setBold(true); + $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); + + // Header table + $sheet->getStyle('A5:R5')->getFont()->setBold(true); + $sheet->getStyle('A5:R5')->getAlignment()->setHorizontal('center'); + + // Auto width + foreach (range('A', 'R') as $col) { + $sheet->getColumnDimension($col)->setAutoSize(true); + } + } +} diff --git a/app/Exports/DataPelangganDetailExport.php b/app/Exports/DataPelangganDetailExport.php new file mode 100644 index 0000000..fc2eacc --- /dev/null +++ b/app/Exports/DataPelangganDetailExport.php @@ -0,0 +1,130 @@ +pelanggan = collect($pelanggan); + $this->year = $year; + } + + /** + * Data source + */ + public function collection(): Collection + { + return $this->pelanggan; + } + + /** + * Start data from row 5 (sebab ada tajuk) + */ + public function startCell(): string + { + return 'A5'; + } + + /** + * Header column + */ + public function headings(): array + { + return [ + 'No', + 'Nama Pelanggan', + 'No.Pelanggan', + 'Umur', + 'Jantina', + 'Pekerjaan', + 'Lokasi', + 'Tempoh Pajakan', + 'Tarikh Mula', + 'Tarikh Tamat', + 'Hari Sejak Transaksi Terakhir', + 'Bil Transaksi', + 'Bil Outstanding', + 'Bil Tebus', + 'Jumlah Pinjaman (RM)', + 'Jumlah Ujrah (RM)', + 'Tujuan Gadaian', + 'Status Aktif', + 'Cara Bayaran', + 'Tarikh Lelong', + ]; + } + + /** + * Map setiap row + */ + public function map($row): array + { + return [ + ++$this->no, + strtoupper($row['nama']), + $row['nopelanggan'], + $row['umur'], + $row['jantina'], + $row['pekerjaan'], + $row['daerah'], + $row['tempoh_pajakan'], + $row['tarikh_mula'], + $row['tarikh_tamat'], + $row['hari_sejak_transaksi'], + $row['bil_transaksi'], + $row['bil_outstanding'], + $row['bil_tebus'], + number_format($row['jumlah_pinjaman'], 2), + number_format($row['jumlah_ujrah'], 2), + $row['tujuan_gadai'], + $row['status_aktif'], + $row['cara_bayaran'], + $row['tarikh_lelong'] ?? '-', + ]; + } + + /** + * Styling Excel + */ + public function styles(Worksheet $sheet) + { + // Tajuk utama + $sheet->mergeCells('A1:R1'); + $sheet->setCellValue('A1', 'LAPORAN DATA PELANGGAN'); + $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Tahun + $sheet->mergeCells('A2:R2'); + $sheet->setCellValue('A2', 'TAHUN : ' . $this->year); + $sheet->getStyle('A2')->getFont()->setBold(true); + $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); + + // Header table + $sheet->getStyle('A5:R5')->getFont()->setBold(true); + $sheet->getStyle('A5:R5')->getAlignment()->setHorizontal('center'); + + // Auto width + foreach (range('A', 'R') as $col) { + $sheet->getColumnDimension($col)->setAutoSize(true); + } + } +} diff --git a/app/Exports/GadaianDetailExport.php b/app/Exports/GadaianDetailExport.php new file mode 100644 index 0000000..5adc077 --- /dev/null +++ b/app/Exports/GadaianDetailExport.php @@ -0,0 +1,80 @@ +kodcaw = $kodcaw; + $this->startDate = $startDate; + $this->endDate = $endDate; + } + + public function view(): View + { + $generatedAt = now()->format('d-m-Y'); + + $data = Http::get(config('api.url') . '/api/reports/saringan/gadaian', [ + 'startDate' => $this->startDate, + 'endDate' => $this->endDate, + ])->json(); + + $branch = collect($data)->firstWhere('kodcaw', $this->kodcaw); + $details = collect($branch['details'] ?? []); + + $tgb_lelong = $details->where('jenis', 'TGB_LELONG')->values(); + $tgb_biasa = $details->where('jenis', 'TGB_BIASA')->values(); + $gadai_biasa = $details->where('jenis', 'GADAI_BIASA')->values(); + + $subtotal = [ + 'tgb_lelong' => [ + 'berat' => $tgb_lelong->sum('berat'), + 'nilai' => $tgb_lelong->sum('nilaimarhun'), + 'pinjaman' => $tgb_lelong->sum('pinjaman'), + ], + 'tgb_biasa' => [ + 'berat' => $tgb_biasa->sum('berat'), + 'nilai' => $tgb_biasa->sum('nilaimarhun'), + 'pinjaman' => $tgb_biasa->sum('pinjaman'), + ], + 'gadai_biasa' => [ + 'berat' => $gadai_biasa->sum('berat'), + 'nilai' => $gadai_biasa->sum('nilaimarhun'), + 'pinjaman' => $gadai_biasa->sum('pinjaman'), + ], + ]; + + $grandTotal = [ + 'berat' => $subtotal['tgb_lelong']['berat'] + + $subtotal['tgb_biasa']['berat'] + + $subtotal['gadai_biasa']['berat'], + + 'nilai' => $subtotal['tgb_lelong']['nilai'] + + $subtotal['tgb_biasa']['nilai'] + + $subtotal['gadai_biasa']['nilai'], + + 'pinjaman' => $subtotal['tgb_lelong']['pinjaman'] + + $subtotal['tgb_biasa']['pinjaman'] + + $subtotal['gadai_biasa']['pinjaman'], + ]; + + return view('reports.saringan-gadaian.excel', compact( + 'branch', + 'generatedAt', + 'tgb_lelong', + 'tgb_biasa', + 'gadai_biasa', + 'subtotal', + 'grandTotal' + )); + } +} diff --git a/app/Exports/LaporanKeseluruhan/AgingTebusAllExportExcel.php b/app/Exports/LaporanKeseluruhan/AgingTebusAllExportExcel.php new file mode 100644 index 0000000..f3a1c4b --- /dev/null +++ b/app/Exports/LaporanKeseluruhan/AgingTebusAllExportExcel.php @@ -0,0 +1,222 @@ +aging = $aging; + $this->startDate = $startDate; + $this->endDate = $endDate; + } + + public function array(): array + { + $rows = []; + $totals = []; + + foreach ($this->aging as $branch) { + $row = [$branch['cawangan']]; + $i = 0; + + foreach ($branch['summary_by_tempoh'] as $summary) { + $row[] = $summary['count']; + $row[] = $summary['sum_bayaran_keuntungan_rebet']; + + // Totals per column + $totals[$i]['count'] = ($totals[$i]['count'] ?? 0) + $summary['count']; + $totals[$i]['sum_bayaran_keuntungan_rebet'] = ($totals[$i]['sum_bayaran_keuntungan_rebet'] ?? 0) + $summary['sum_bayaran_keuntungan_rebet']; + $i++; + } + + // Total per row (cawangan) + $jumlahBil = collect($branch['summary_by_tempoh'])->sum('count'); + $jumlahRM = collect($branch['summary_by_tempoh'])->sum('sum_bayaran_keuntungan_rebet'); + $row[] = $jumlahBil; + $row[] = $jumlahRM; + + // Add to column totals + $totals['jumlah']['count'] = ($totals['jumlah']['count'] ?? 0) + $jumlahBil; + $totals['jumlah']['sum_bayaran_keuntungan_rebet'] = ($totals['jumlah']['sum_bayaran_keuntungan_rebet'] ?? 0) + $jumlahRM; + + $rows[] = $row; + } + + // Add final total row + $totalRow = ['Jumlah']; + foreach ($totals as $key => $val) { + $totalRow[] = $val['count']; + $totalRow[] = $val['sum_bayaran_keuntungan_rebet']; + } + + $rows[] = $totalRow; + + return $rows; + } + + + /** + * Multi-row headings (2 rows) + */ + public function headings(): array + { + $row1 = ['Cawangan']; + $row2 = ['']; + + if (!empty($this->aging[0]['summary_by_tempoh'])) { + foreach ($this->aging[0]['summary_by_tempoh'] as $summary) { + $row1[] = $summary['label']; + $row1[] = ''; // empty to allow merged cell + $row2[] = 'Bil'; + $row2[] = 'RM'; + } + } + + $row1[] = 'Jumlah'; + $row1[] = ''; // for merged "Jumlah" cell + $row2[] = 'Bil'; + $row2[] = 'RM'; + + return [$row1, $row2]; + } + + public function columnFormats(): array +{ + $formats = []; + $colIndex = 2; // Start at column B (Cawangan is A) + + $tempohCount = count($this->aging[0]['summary_by_tempoh'] ?? []); + for ($i = 0; $i < $tempohCount; $i++) { + // Bil column + $bilCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++); + $formats[$bilCol] = NumberFormat::FORMAT_NUMBER; // ✅ No decimal + + // RM column + $rmCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++); + $formats[$rmCol] = NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1; // RM with comma and decimals + } + + // Jumlah Bil + $jumlahBilCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++); + $formats[$jumlahBilCol] = NumberFormat::FORMAT_NUMBER; // ✅ No decimal + + // Jumlah RM + $jumlahRMCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++); + $formats[$jumlahRMCol] = NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1; + + return $formats; +} + + + public function bindValue(Cell $cell, $value) + { + if (is_numeric($value)) { + $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); + return true; + } + + return parent::bindValue($cell, $value); + } + + /** + * Merge heading cells using AfterSheet event + */ + public function registerEvents(): array + { + return [ + AfterSheet::class => function(AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + + // Tajuk laporan + $sheet->setCellValue('A1', 'KEUNTUNGAN PENYELESAIAN PEMBIAYAAN BY TEMPOH'); + + // Tarikh laporan + $sheet->setCellValue( + 'A2', + 'Tarikh : ' . + \Carbon\Carbon::parse($this->startDate)->format('d/m/Y') . + ' hingga ' . + \Carbon\Carbon::parse($this->endDate)->format('d/m/Y') + ); + + // Merge tajuk + $lastColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex( + (count($this->aging[0]['summary_by_tempoh'] ?? []) * 2) + 3 + ); + + $sheet->mergeCells("A1:{$lastColumn}1"); + + // Style tajuk + $sheet->getStyle("A1:{$lastColumn}1")->applyFromArray([ + 'font' => [ + 'bold' => true, + 'size' => 14, + ], + 'alignment' => [ + 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, + ], + ]); + + // Merge header tempoh + $colIndex = 2; // Start from column B + $tempohCount = count($this->aging[0]['summary_by_tempoh'] ?? []); + + $headingRow = 3; + + for ($i = 0; $i < $tempohCount; $i++) { + + $startCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex); + + $endCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex + 1); + + $sheet->mergeCells("{$startCol}{$headingRow}:{$endCol}{$headingRow}"); + + $colIndex += 2; + } + + // Merge Jumlah + $startCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex); + + $endCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex + 1); + + $sheet->mergeCells("{$startCol}{$headingRow}:{$endCol}{$headingRow}"); + }, + ]; + } + + // Mulakan sel untuk data bermula dari A4 (Baris 3 adalah header) + public function startCell(): string + { + return 'A3'; // Data bermula dari baris 4 + } +} diff --git a/app/Exports/LaporanKeseluruhan/LelonganAllExportExcel.php b/app/Exports/LaporanKeseluruhan/LelonganAllExportExcel.php index 667bb35..c7cdf43 100644 --- a/app/Exports/LaporanKeseluruhan/LelonganAllExportExcel.php +++ b/app/Exports/LaporanKeseluruhan/LelonganAllExportExcel.php @@ -34,6 +34,7 @@ class LelonganAllExportExcel extends DefaultValueBinder implements FromArray, Wi 'Baki Pembiayaan (RM)', 'Keuntungan (RM)', 'Caj Lelong (RM)', + 'Harga Asas (RM)', 'Harga Jual (RM)', 'Baki (RM)', ]; @@ -57,6 +58,7 @@ class LelonganAllExportExcel extends DefaultValueBinder implements FromArray, Wi $sum_pinjaman = 0; $sum_bakiupah = 0; $sum_cajlelong = 0; + $sum_hargaasas = 0; $sum_hargajual = 0; $sum_baki = 0; @@ -73,6 +75,7 @@ class LelonganAllExportExcel extends DefaultValueBinder implements FromArray, Wi number_format((float) ($data['sum_bakipjm'] ?? 0), 2), number_format((float) ($data['sum_bakiupah'] ?? 0), 2), number_format((float) ($data['sum_cajlelong'] ?? 0), 2), + number_format((float) ($data['sum_hargaasas'] ?? 0), 2), number_format((float) ($data['sum_hargajual'] ?? 0), 2), number_format((float) ($data['sum_baki'] ?? 0), 2), @@ -87,6 +90,7 @@ class LelonganAllExportExcel extends DefaultValueBinder implements FromArray, Wi $sum_bakipjm += (float) $data['sum_bakipjm']; $sum_bakiupah += (float) $data['sum_bakiupah']; $sum_cajlelong += (float) $data['sum_cajlelong']; + $sum_hargaasas += (float) $data['sum_hargaasas']; $sum_hargajual += (float) $data['sum_hargajual']; $sum_baki += (float) $data['sum_baki']; @@ -102,6 +106,7 @@ class LelonganAllExportExcel extends DefaultValueBinder implements FromArray, Wi number_format($sum_bakipjm, 2), number_format($sum_bakiupah, 2), number_format($sum_cajlelong, 2), + number_format($sum_hargaasas, 2), number_format($sum_hargajual, 2), number_format($sum_baki, 2), @@ -128,6 +133,7 @@ class LelonganAllExportExcel extends DefaultValueBinder implements FromArray, Wi (float) str_replace(',', '', $data[7] ?? 0), // Total Untung 1% (float) str_replace(',', '', $data[8] ?? 0), // Total Ujrah (float) str_replace(',', '', $data[9] ?? 0), // Total Ujrah + (float) str_replace(',', '', $data[10] ?? 0), // Total Ujrah ]; } diff --git a/app/Exports/LaporanKeseluruhan/OutstandingAllExportExcel.php b/app/Exports/LaporanKeseluruhan/OutstandingAllExportExcel.php index 39f7911..e97c643 100644 --- a/app/Exports/LaporanKeseluruhan/OutstandingAllExportExcel.php +++ b/app/Exports/LaporanKeseluruhan/OutstandingAllExportExcel.php @@ -24,6 +24,8 @@ class OutstandingAllExportExcel implements FromCollection, WithHeadings return [ 'Kod Cawangan', 'Cawangan', + 'Bil Pembiayaan (BRG KES)', + 'Jumlah Pembiayaan (RM)', 'Bil Pembiayaan (SAG LAMA)', 'Jumlah Pembiayaan (RM)', 'Bil Pembiayaan (SAG BARU)', diff --git a/app/Exports/LelonganExport.php b/app/Exports/LelonganExport.php index 8109596..992d4f2 100644 --- a/app/Exports/LelonganExport.php +++ b/app/Exports/LelonganExport.php @@ -48,6 +48,24 @@ class LelonganExport implements WithMultipleSheets $sheets[] = new LelonganPerTellerExport($this->cawangan_detail, $this->query, $teller_with_lelongan_data); } + // Sheet untuk senarai penuh lelongan (gabung semua teller) + $full_lelongan_data = []; + + foreach ($this->lelongan as $teller => $data) { + if (isset($data['lelongan']) && is_array($data['lelongan'])) { + foreach ($data['lelongan'] as $item) { + $item['teller'] = $teller; // optional: simpan info teller + $full_lelongan_data[] = $item; + } + } + } + + $sheets[] = new LelonganFullExport( + $this->cawangan_detail, + $this->query, + $full_lelongan_data + ); + return $sheets; } } diff --git a/app/Exports/LelonganFullExport.php b/app/Exports/LelonganFullExport.php new file mode 100644 index 0000000..a2a9228 --- /dev/null +++ b/app/Exports/LelonganFullExport.php @@ -0,0 +1,56 @@ +cawangan_detail = $cawangan_detail; + $this->query = $query; + $this->lelongan_full_data = $lelongan_full_data; + } + + public function view(): View + { + return view('exports.lelongan.full', [ + 'cawangan_detail' => $this->cawangan_detail, + 'query' => $this->query, + 'lelongan_data' => $this->lelongan_full_data, + ]); + } + + public function title(): string + { + return 'SENARAI LELONGAN PENUH'; + } + + public function columnFormats(): array + { + return [ + 'E' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Berat + 'F' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Marhun + 'G' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Pinjaman + 'H' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Keuntungan + 'I' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // caj lelong + 'J' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // baki + 'K' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // baki + 'L' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // baki + 'M' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // baki + 'N' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // baki + 'O' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // baki + + ]; + } +} diff --git a/app/Exports/LelonganPerTellerExport.php b/app/Exports/LelonganPerTellerExport.php index 9c79588..09674a8 100644 --- a/app/Exports/LelonganPerTellerExport.php +++ b/app/Exports/LelonganPerTellerExport.php @@ -71,6 +71,7 @@ class LelonganPerTellerExport extends DefaultValueBinder implements FromView, Sh 'J' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'K' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'L' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'M' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, ]; } diff --git a/app/Exports/LelonganSummaryExport.php b/app/Exports/LelonganSummaryExport.php index f6dad6d..8c11d07 100644 --- a/app/Exports/LelonganSummaryExport.php +++ b/app/Exports/LelonganSummaryExport.php @@ -68,6 +68,7 @@ class LelonganSummaryExport extends DefaultValueBinder implements FromView, Shou 'J' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'C' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'D' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'K' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, ]; } diff --git a/app/Exports/SAExportAudit.php b/app/Exports/SAExportAudit.php new file mode 100644 index 0000000..fc09759 --- /dev/null +++ b/app/Exports/SAExportAudit.php @@ -0,0 +1,189 @@ +stokaudit = $stokaudit; + $this->jenisLaporan = strtoupper($jenisLaporan); + $this->tebus_date = $tebus_date; + $this->namacaw = $namacaw; + } + + public function collection() + { + $data = collect($this->stokaudit); + + $totals = [ + 'No Rujukan' => 'TOTAL', + 'No KP' => '', + 'Marhun' => '', + 'Tempoh' => '', + 'Berat (g)' => $data->sum(fn($row) => floatval($row['Berat (g)'] ?? 0)), + 'Nilai Marhun' => $data->sum(fn($row) => floatval($row['Nilai Marhun'] ?? 0)), + 'Pinjaman' => $data->sum(fn($row) => floatval($row['Pinjaman'] ?? 0)), + 'Baki Pinjaman' => $data->sum(fn($row) => floatval($row['Baki Pinjaman'] ?? 0)), + ]; + + $data->push($totals); + + return $data; + } + + public function headings(): array + { + return [ + ['LAPORAN STOK AUDIT'], + ["CAWANGAN:", $this->namacaw], + ["TARIKH:", $this->tebus_date], + [], + [ + 'BIL', + 'NORUJUKAN', + 'NO KP', + 'MARHUN', + 'BERAT (G)', + 'BERAT AUDIT', + 'NILAI MARHUN (RM)', + 'PEMBIAYAAN (RM)', + 'BAKI PEMBIAYAAN (RM)', + 'JBG', + 'CATATAN' + ] + ]; + } + + public function startCell(): string + { + return 'A1'; + } + + public function map($row): array + { + static $counter = 1; + + if (($row['No Rujukan'] ?? '') === 'TOTAL') { + return [ + '', + 'JUMLAH', + '', + '', + $row['Berat (g)'] ?? 0, + '', + $row['Nilai Marhun'] ?? 0, + $row['Pinjaman'] ?? 0, + $row['Baki Pinjaman'] ?? 0, + '', + '', + ]; + } + + return [ + $row['Bil'] ?? $counter++, + $row['No Rujukan'] ?? '', + isset($row['No KP']) ? "'" . $row['No KP'] : '', + $row['Marhun'] ?? '', + $row['Berat (g)'] ?? 0, + '', + $row['Nilai Marhun'] ?? 0, + $row['Pinjaman'] ?? 0, + $row['Baki Pinjaman'] ?? 0, + $row['Tempoh'] ?? '', + '', + ]; + } + + public function title(): string + { + return $this->jenisLaporan; + } + + public function styles(Worksheet $sheet) + { + $sheet->mergeCells('A1:K1'); + $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); + $sheet->getStyle('A1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $sheet->getStyle('A5:K5')->getFont()->setBold(true); + + $lastRow = $sheet->getHighestRow(); + $lastCol = 'K'; + + // Border untuk semua data + $sheet->getStyle("A5:{$lastCol}{$lastRow}") + ->getBorders() + ->getAllBorders() + ->setBorderStyle(Border::BORDER_THIN); + + // Bold TOTAL row + $sheet->getStyle("A{$lastRow}:{$lastCol}{$lastRow}")->getFont()->setBold(true); + + // Align center untuk column tertentu + $sheet->getStyle("A5:A{$lastRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); + $sheet->getStyle("B5:B{$lastRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); + $sheet->getStyle("C5:C{$lastRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); + $sheet->getStyle("D5:D{$lastRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); + + // Wrap text untuk semua column + $sheet->getStyle("A5:{$lastCol}{$lastRow}")->getAlignment()->setWrapText(true); + + // Auto-fit semua column kecuali Marhun + foreach (range('A', $lastCol) as $col) { + if ($col !== 'D') { // skip Marhun + $sheet->getColumnDimension($col)->setAutoSize(true); + } + } + + // Untuk column Marhun (D), kita boleh set width minimum supaya tak terlalu besar + $sheet->getColumnDimension('D')->setWidth(18); // boleh adjust ikut perlu + + return []; + } + + public function columnWidths(): array + { + return [ + 'A' => 5, + 'B' => 20, + 'C' => 18, + 'D' => 18, + 'E' => 12, + 'F' => 15, + 'G' => 18, + 'H' => 18, + 'I' => 18, + 'J' => 12, + 'K' => 15, + ]; + } + + public function columnFormats(): array + { + return [ + 'E' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'F' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'G' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'H' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'I' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + ]; + } +} \ No newline at end of file diff --git a/app/Exports/WTDDetailExport.php b/app/Exports/WTDDetailExport.php new file mode 100644 index 0000000..3155ac9 --- /dev/null +++ b/app/Exports/WTDDetailExport.php @@ -0,0 +1,41 @@ +kodcaw = $kodcaw; + $this->startDate = $startDate; + $this->endDate = $endDate; + } + + public function view(): View + { + $data = Http::get(config('api.url') . '/admin/wtd/summaryWtd', [ + 'startDate' => $this->startDate, + 'endDate' => $this->endDate, + ])->json(); + + $branch = collect($data)->firstWhere('kodcaw', $this->kodcaw); + $details = collect($branch['details'] ?? []); + + return view('reports.wtd.excel', [ + 'details' => $details, // data WTD + 'branch' => $branch, + 'generatedAt' => now()->format('d/m/Y H:i'), + 'startDate' => $this->startDate, + 'endDate' => $this->endDate, + ]); + } + +} diff --git a/app/Http/Controllers/AccountStatementController.php b/app/Http/Controllers/AccountStatementController.php new file mode 100644 index 0000000..f081da1 --- /dev/null +++ b/app/Http/Controllers/AccountStatementController.php @@ -0,0 +1,57 @@ +norujukan)->json()[0][0]; + $transaction = Http::get(config('api.url').'/portal/transaksipelanggan',['norujukan' => $request->norujukan])->json(); + $cawangan=Http::get(config('api.url').'/api/cawangan/detail/'. $gadaian['kodcaw'])->json()[0]; + $customer = Http::get(config('api.url') . '/api/customers/' . $gadaian['nokp'])->json(); + $poskod = Http::get(config('api.url') . '/api/poskod/' . $customer['poskod'])->json(); + + $accountHolder = [ + 'name' => $customer['nama'], + 'address' => $customer['alamat1'] . '
' . $customer['alamat2'], + 'city_state_zip' => $customer['poskod'] . ', ' . $poskod['daerah']['namadaerah'] . ', ' . $poskod['negeri']['negeri'], + ]; + + $bankDetails = [ + 'name' => $cawangan['cawangan'], + 'address' => $cawangan['alamat1'] . '
' . $cawangan['alamat2'], + 'branch' => $cawangan['namacaw'], + ]; + + + $transaction_count = count(array_filter($transaction, fn($trans) => $trans['trans_type'] == 'A')); + $totalPages = ceil($transaction_count / 10); + + $ansuranTransaction = array_values(array_filter($transaction, fn($trans) => $trans['trans_type'] == 'A')); + $originLoan = $gadaian['pinjaman']; + $bakipinjaman = $originLoan; + $ansuranTransaction = array_map(function($trans) use(&$bakipinjaman) { + $bakipinjaman -= $trans['bayaran_pembiayaan']; + return array_merge($trans, ['bakipinjaman' => $bakipinjaman]); + }, $ansuranTransaction); + + $tebusTransaction = array_values(array_filter($transaction, fn($trans) => $trans['trans_type'] == 'T'))[0]; + + return view('accounts-statements', compact('tebusTransaction','ansuranTransaction','transaction_count','gadaian','transaction','accountHolder', 'bankDetails')); + } + + /** + * Helper function to format currency. + * In a real app, this would be a Blade helper or filter. + * We'll format it directly in the view for simplicity in this example. + */ +} \ No newline at end of file diff --git a/app/Http/Controllers/AkaunController.php b/app/Http/Controllers/AkaunController.php index 7946316..15a5f66 100644 --- a/app/Http/Controllers/AkaunController.php +++ b/app/Http/Controllers/AkaunController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\DB; use Carbon\Carbon; use Barryvdh\DomPDF\Facade as PDF; @@ -22,6 +23,7 @@ use Maatwebsite\Excel\Facades\Excel; use App\Exports\PendSerExport; use App\Exports\SAExport; use App\Exports\SAcombineExport; +use App\Exports\SAExportAudit; class AkaunController extends Controller { @@ -314,7 +316,7 @@ class AkaunController extends Controller // return view('akaun.laporan_imbanduga',compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','untungrugifield','tanggungansemasa','totalhartasemasa','totaluntungrugi','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail')); } - +////ainizazi public function cetakLaporanGadai(Request $request){ $api_url = $request->hostname; $auth_user = Auth::user(); @@ -337,10 +339,20 @@ class AkaunController extends Controller } // $gadai = Http::get($request->hostname. '/api/gadai/laporan/'. $request->kodcaw .'/'. $gadai_date)->json(); - $gadai = Http::get($request->hostname. '/api/gadailaporanRangeDate/'. $request->kodcaw,['mula' => $tarikh_mula,'akhir' => $tarikh_akhir])->json(); + $reportGadai = Http::get($request->hostname. '/api/gadailaporanRangeDate/'. $request->kodcaw,['mula' => $tarikh_mula,'akhir' => $tarikh_akhir])->json(); + $gadai = $reportGadai['gadai']; + // dd($reportsGadai); + $statistik =$reportGadai['statistik']; + $reportPembiayaan= $statistik['reportPembiayaan']; + $reportLoanAmount=$statistik['reportLoanAmount']; + $reportMarhunValue=$statistik['reportMarhunValue']; + $reportMarhunMargin=$statistik['reportMarhunMargin']; + $reportCustomerJob=$statistik['reportCustomerJob']; + $reportCustomerRace=$statistik['reportCustomerRace']; + $cawangan=Http::get($request->hostname.'/api/cawangan/detail/'.$request->kodcaw)->json(); - $cawangan_detail=$cawangan[0]; + $cawangan_detail=$cawangan[0]; if(isset($request->jenis)) { @@ -349,10 +361,9 @@ class AkaunController extends Controller $pdf = PDF::loadView('akaun.laporan_gadaian', compact('gadai','cawangan_detail','tarikh_cetak','tarikh_mula','tarikh_akhir','api_url'))->setPaper('a4', 'landscape'); return $pdf->download('laporan_gadaian_' . $request->kodcaw .'_'. $tarikh_mula .'-'. $tarikh_akhir .'.pdf'); }else{ - return view('akaun.laporan_gadaian', compact('gadai','cawangan_detail','tarikh_cetak','tarikh_mula','tarikh_akhir','api_url')); + return view('akaun.laporan_gadaian', compact('gadai','cawangan_detail','tarikh_cetak','tarikh_mula','tarikh_akhir','api_url','reportGadai','gadai','statistik','reportPembiayaan','reportLoanAmount','reportMarhunValue','reportMarhunMargin','reportCustomerJob','reportCustomerRace')); } - } - + } } public function cetakLaporanPenebusan(Request $request){ @@ -416,8 +427,6 @@ class AkaunController extends Controller return view('akaun.laporan_ansuran', compact('tebus','cawangan_detail','tarikh_cetak','tebus_date','api_url')); } } - - } @@ -492,7 +501,7 @@ class AkaunController extends Controller return view('akaun.laporan_petibesi', compact('petibesi','cawangan_detail','tarikh_cetak','tebus_date','api_url','hutang')); } - + public function cetaklaporan_laporan_pendserahan(Request $request) { @@ -572,9 +581,9 @@ class AkaunController extends Controller $request->hostname = config('app.env') == 'production' ? 'http://apiujrah.arrahn' : $request->hostname; - $tuntutbaki = Http::get($request->hostname. '/api/TuntutBakiRangeDate/'. $request->kodcaw,['mula' => $tarikh_mula,'akhir' => $tarikh_akhir])->json(); + $tuntutbaki = Http::get($api_url. '/api/TuntutBakiRangeDate/'. $request->kodcaw,['mula' => $tarikh_mula,'akhir' => $tarikh_akhir])->json(); - $cawangan=Http::get($request->hostname.'/api/cawangan/detail/'.$request->kodcaw)->json(); + $cawangan=Http::get($api_url.'/api/cawangan/detail/'.$request->kodcaw)->json(); $cawangan_detail=$cawangan[0]; if(isset($request->jenis)) @@ -760,6 +769,49 @@ class AkaunController extends Controller $cawangan_detail['namacaw']// ✅ Use the correct branch name from API ), 'laporan_stokaudit_' . $request->kodcaw . '_' . $tebus_date . '.xlsx'); } + elseif ($request->jenis == 'excelaudit') { + + if ($request->radaktif === 'aktif') { + $stokaudit = Http::get($api_url . '/api/stokaudit/aktif/' . $request->kodcaw, [ + 'tarikh' => $tebus_date + ])->json(); + } else { + $stokaudit = Http::get($api_url . '/api/stokaudit/takaktif/' . $request->kodcaw, [ + 'tarikh' => $tebus_date + ])->json(); + } + + $stokauditRecords = $stokaudit['rekod'] ?? []; + + if (empty($stokauditRecords)) { + return back()->with('error', 'No records found to export.'); + } + + // pilih column untuk audit sahaja + $auditRecords = collect($stokauditRecords)->values()->map(function ($item, $index) { + return [ + 'Bil' => $index + 1, + 'No Rujukan' => $item['norujukan'] ?? '', + 'No KP' => $item['nokp'] ?? '', + 'Marhun' => $item['marhun'] ?? '', + 'Berat (g)' => $item['berat'] ?? '', + 'Nilai Marhun' => $item['nilaimarhun'] ?? '', + 'Pinjaman' => $item['pinjaman'] ?? '', + 'Baki Pinjaman' => $item['bakipjm'] ?? '', + 'Tempoh' => $item['tempoh'] ?? '', + ]; + }); + + return Excel::download( + new SAExportAudit( + $auditRecords, + 'Laporan Stok Audit', + $tebus_date, + $cawangan_detail['namacaw'] + ), + 'laporan_stokaudit_audit_' . $request->kodcaw . '_' . $tebus_date . '.xlsx' + ); + } else { if ($request->radaktif === 'aktif') { $stokaudit = Http::get($api_url . '/api/stokaudit/aktif/' . $request->kodcaw, ['tarikh' => $tebus_date])->json(); @@ -831,7 +883,6 @@ class AkaunController extends Controller // ])->json(); // $laporan_ringkasan = $laporan_ringkasan[0]; - $cawangan=Http::get(config('api.url').'/api/cawangan/detail/'.$request->kodcaw)->json(); $cawangan_detail=$cawangan[0]; @@ -860,9 +911,8 @@ class AkaunController extends Controller $petibesi = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/laporanpetibesi/'. $request->kodcaw .'/'. $tebus_date)->json(); - if(!$petibesi) - { - return redirect()->back()->with('errormessage', 'Tiada data pada tarikh tersebut.'); + if (($petibesi['error'] ?? null) === 'Tiada data pada tarikh tersebut') { + return redirect()->back()->with('peti_besi_error_message', 'Tiada data pada tarikh tersebut.'); } if(isset($request->jenis)) @@ -1656,44 +1706,71 @@ class AkaunController extends Controller } - public function cetakLaporanAnsuranRangeDate(Request $request){ - $api_url = $request->hostname; - $auth_user = Auth::user(); - $current = Carbon::now(); - $current = new Carbon(); - $tarikh_cetak = $current->toDateString(); - - if($request->datemula == null){ - $mula_date = $current->toDateString(); - }else{ - $split_date = explode('-',$request->datemula); - $mula_date = $request->datemula; - } - - if($request->datehingga == null){ - $hingga_date = $current->toDateString(); - }else{ - $split_date2 = explode('-',$request->datehingga); - $hingga_date = $request->datehingga; - } - $request->hostname = config('app.env') == 'production' ? 'http://apiujrah.arrahn' : $request->hostname; - $tebus = Http::get($request->hostname. '/api/ansuranujrah/laporan/'. $request->kodcaw,['mula' => $mula_date,'akhir' => $hingga_date])->json(); - $cawangan=Http::get($request->hostname.'/api/cawangan/detail/'.$request->kodcaw)->json(); - $cawangan_detail=$cawangan[0]; - if(isset($request->jenis)) - { - if($request->jenis == 'pdf') - { - $pdf = PDF::loadView('akaun.laporan_ansuran', compact('tebus','cawangan_detail','tarikh_cetak','mula_date','hingga_date','api_url'))->setPaper('a4', 'potrait'); - return $pdf->download('laporan_ansuran_' . $request->kodcaw .'_'. $mula_date .'-'. $hingga_date .'.pdf'); - - }else{ - return view('akaun.laporan_ansuran', compact('tebus','cawangan_detail','tarikh_cetak','api_url','mula_date','hingga_date')); - } - } +public function cetakLaporanAnsuranRangeDate(Request $request){ + $api_url = $request->hostname; + $auth_user = Auth::user(); + $current = Carbon::now(); + $tarikh_cetak = $current->toDateString(); + // Tarikh mula + if ($request->datemula == null) { + $mula_date = $current->toDateString(); + } else { + $mula_date = $request->datemula; } + // Tarikh hingga + if ($request->datehingga == null) { + $hingga_date = $current->toDateString(); + } else { + $hingga_date = $request->datehingga; + } + + // Tetapkan hostname ikut environment + $request->hostname = config('app.env') == 'production' ? 'http://apiujrah.arrahn' : $request->hostname; + + $response = Http::get($api_url . '/api/ansuranujrah/laporan/' . $request->kodcaw, [ + 'mula' => $mula_date, + 'akhir' => $hingga_date, + 'jenis' => $request->laporanansuran + ]); + + if ($response->failed() || !$response->json()) { + $tebus = []; // fallback elak error di view + } else { + $tebus = $response->json(); + } + + $cawangan = Http::get($api_url . '/api/cawangan/detail/' . $request->kodcaw)->json(); + $cawangan_detail = $cawangan[0] ?? ['nama' => 'Tiada data']; + + // Tajuk laporan ikut jenis + $reportTitles = [ + 'online' => 'Laporan Ansuran Pembiayaan (Arrahn Pay)', + 'kaunter' => 'Laporan Ansuran Pembiayaan (Kaunter aros)', + 'all' => 'Laporan Ansuran Pembiayaan Semua' + ]; + + $jenisLaporan = $request->laporanansuran; + $fileTitle = $reportTitles[$jenisLaporan] ?? 'Laporan_Tidak_Diketahui'; + + // PDF atau view biasa + if (isset($request->jenis)) { + if ($request->jenis == 'pdf') { + $pdf = PDF::loadView('akaun.laporan_ansuran', compact( + 'tebus', 'cawangan_detail', 'tarikh_cetak', 'mula_date', 'hingga_date', 'api_url', 'jenisLaporan' + ))->setPaper('a4', 'potrait'); + + return $pdf->download('laporan_ansuran_' . $request->kodcaw . '_' . $mula_date . '-' . $hingga_date . '.pdf'); + } else { + return view('akaun.laporan_ansuran', compact( + 'tebus', 'cawangan_detail', 'tarikh_cetak', 'api_url', 'jenisLaporan', 'mula_date', 'hingga_date' + )); + } + } +} + + public function cetakLaporanPenebusanRangeDate(Request $request){ $api_url = $request->hostname; $auth_user = Auth::user(); @@ -1890,6 +1967,55 @@ class AkaunController extends Controller )); } + public function cetak_laporanbarangkes(Request $request) + { + $api_url = $request->hostname; + // $api_url = ($request->hostname) ? $request->hostname : config('api.url'); + $auth_user = Auth::user(); + $current = Carbon::now(); + $current = new Carbon(); + $tarikh_cetak = $current->toDateString(); + + if($request->datemula == null){ + $mula_date = '2017-01-01'; + }else{ + $mula_date = $request->datemula; + } + + if($request->datehingga == null){ + $hingga_date = $current->toDateString(); + }else{ + $hingga_date = $request->datehingga; + } + + $status = $request->status ?? 'all'; + // $barangkes = Http::get($request->hostname . '/api/barangkes/laporan/', ['kodcaw' => $request->kodcaw,'alasan' => $request->sltalasan,'tarikh_mula' => $mula_date,'tarikh_akhir' => $hingga_date, 'status' => $status,])->json(); + $palsu = Http::get($request->hostname . '/api/palsu/laporan/', ['kodcaw' => $request->kodcaw,'tarikh_mula' => $mula_date,'tarikh_akhir' => $hingga_date, 'status' => $status,])->json(); + + if (!is_array($palsu)) { + $palsu = []; // utk nak tengok data tubik ke dok + } + + $cawangan_info = Http::get($request->hostname . '/api/cawangan/'. $request->kodcaw)->json(); + $cawangan = Http::get($request->hostname . '/api/cawangan/detail/'. $request->kodcaw)->json(); + $cawangan_detail=$cawangan[0]; + + $hostname = $request->hostname; + + if(isset($request->jenis)) + { + if($request->jenis == 'pdf') + { + $pdf = PDF::loadView('akaun.laporan_brgkes', compact('hostname','palsu','cawangan_detail','tarikh_cetak','mula_date','hingga_date','api_url','status'))->setPaper('a4', 'potrait'); + return $pdf->download('laporan_brgkes' . $request->kodcaw .'_'. $mula_date .'_'. $hingga_date . '.pdf'); + }else{ + return view('akaun.laporan_brgkes', compact('hostname','palsu','cawangan_detail','tarikh_cetak','mula_date','hingga_date','api_url','status')); + } + } + + return view('akaun.laporan_brgkes', compact('hostname','cawangan_detail','mula_date','hingga_date','tarikh_cetak','api_url','palsu','status')); + + } } diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php new file mode 100644 index 0000000..69d8ea1 --- /dev/null +++ b/app/Http/Controllers/BarangkesController.php @@ -0,0 +1,56 @@ +json(); + // dd($customer_info); + // ambil gadai info (by kodcaw + norujukan dari route) + // $gadai = null; + if (!empty($customer_info['kodcaw']) && !empty($norujukan)) { + $gadai = Http::get($api_url . '/api/gadai/norujukan/' + . $customer_info['kodcaw'] . '/' . $norujukan)->json(); + } + + $gadai = Http::get($api_url . '/api/gadai/norujukan/' . $request->kodcaw . '/' . $request->norujukan)->json(); + $gadai = $gadai[0]; + + return view('pelanggan.detailssag', compact('api_url', 'auth_user', 'customer_info', 'gadai')); +} + + public function store(Request $request, $id){ + + $api_url = config('api.url'); + $customer_info = Http::get($api_url . '/admin/Customers/' . $id)->json(); + // $auth_user = Auth::user(); + // dd($customer_info); + + return view('pelanggan.detailssag', ['customer' => $customer_info,'kodcaw' => $request->query('kodcaw'),'norujukan' => $request->query('norujukan'), + ]); + + } + +} diff --git a/app/Http/Controllers/Reports/AgingController.php b/app/Http/Controllers/Reports/AgingController.php index b74b5cc..a8f5905 100644 --- a/app/Http/Controllers/Reports/AgingController.php +++ b/app/Http/Controllers/Reports/AgingController.php @@ -9,7 +9,7 @@ use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Http; use Maatwebsite\Excel\Facades\Excel; use Illuminate\Support\Facades\Auth; -use App\Exports\LaporanKeseluruhan\AgingAllExportExcel; +use App\Exports\LaporanKeseluruhan\AgingTebusAllExportExcel; class AgingController extends Controller { @@ -81,4 +81,77 @@ class AgingController extends Controller } return view('reports.aging.index', compact('aging', 'endDate')); } + + public function agingtebus(Request $request) + { + $current = new Carbon(); + $request->hostname = config('api.url'); + // dd($request->hostname ); + $kod_cawangan = $request->kod_cawangan; + $action = $request->input('action', 'search'); + // dd($action); + + $getReportDate = function ($date_string) use ($current) { + if ($date_string == null) { + return $current->toDateString(); + } + + return $date_string; + }; + + $request->hostname = config('api.url'); + + $startDate = $getReportDate($request->startDate); + + $endDate = $getReportDate($request->endDate); + + $aging = Http::get($request->hostname . '/api/reports/agingtebus', [ + 'startDate' => $startDate, + 'endDate' => $endDate, + ])->json(); + + $aging = $aging ?? []; + + if ($action === 'excel') { + $file_title = sprintf("LaporanAging(%s).xlsx", $kod_cawangan, $startDate, $endDate); + return Excel::download(new AgingTebusAllExportExcel($aging,$startDate,$endDate), $file_title); + } + + return view('reports.agingtebus.index', compact('aging', 'startDate', 'endDate')); + } + public function showagingtebus(Request $request) + { + $current = Carbon::now(); + $action = $request->input('action', 'search'); + + $getReportDate = function ($date_string) use ($current) { + return $date_string ? $date_string : $current->toDateString(); + }; + + $hostname = config('api.url'); + + $startDate = $getReportDate($request->startDate); + $endDate = $getReportDate($request->endDate); + + $response = Http::get("$hostname/api/reports/agingtebus", [ + 'startDate' => $startDate, + 'endDate' => $endDate, + ]); + + $aging = $response->json() ?? []; // Ensure it's an array + + // Debugging: Check the response before using it + if (empty($aging)) { + return back()->with('error', 'Failed to fetch data from API.'); + } + + if ($action === 'excel') { + // Ensure $kod_cawangan is defined (Modify as per your data structure) + $kod_cawangan = $request->input('kod_cawangan', 'DEFAULT'); + + $file_title = sprintf("LaporanAgingTebus(%s).xlsx", $kod_cawangan, $startDate, $endDate); + return Excel::download(new AgingTebusAllExportExcel($aging, $startDate, $endDate), $file_title); + } + return view('reports.agingtebus.index', compact('aging', 'startDate', 'endDate')); + } } diff --git a/app/Http/Controllers/Reports/AnalisaController.php b/app/Http/Controllers/Reports/AnalisaController.php index 8293b60..504adc8 100644 --- a/app/Http/Controllers/Reports/AnalisaController.php +++ b/app/Http/Controllers/Reports/AnalisaController.php @@ -11,6 +11,8 @@ use Maatwebsite\Excel\Facades\Excel; use Illuminate\Support\Facades\Auth; use App\Exports\LaporanKeseluruhan\PelangganbaruAllExportExcel; use App\Exports\LaporanKeseluruhan\PelangganaktifAllExportExcel; +use App\Exports\DataPelangganDetailExport; +use App\Exports\DataPelangganBycawDetailExport; class AnalisaController extends Controller { @@ -90,5 +92,114 @@ class AnalisaController extends Controller return view('reports.pelangganaktif.index', compact('pelangganaktif', 'startDate', 'endDate')); } + public function dataPelanggan(Request $request) + { + $request->hostname = config('api.url'); + $current = new Carbon(); + + $month = $request->filled('month') ? $request->month : $current->month; + $year = $request->filled('year') ? $request->year : $current->year; + + return view('reports.data-pelanggan.index', compact('month', 'year')); + } + + public function dataPelangganShow(Request $request) + { + $validated = $request->validate([ + 'year' => 'required|digits:4' + ]); + + $year = $validated['year']; + $tarikh_cetak = now()->format('d/m/Y'); + $tebus_date = 'Tahun ' . $year; + + $request->hostname = config('api.url'); + + $response = Http::get($request->hostname . '/api/reports/data-pelanggan', [ + 'year' => $year, + ])->json(); + + $summary = $response['summary']; + $pelanggan = $response['pelanggan']; + + if ($request->generateType === 'pdf') { + return view( + 'reports.data-pelanggan.show', + compact('summary','pelanggan','tarikh_cetak','tebus_date','year') + ); + } + elseif ($request->generateType === 'excel') { + return Excel::download( + new DataPelangganDetailExport($pelanggan, $year), + "Laporan-Data-Pelanggan-{$year}.xlsx" + ); + } + + } + + public function dataPelangganBycaw(Request $request) + { + $request->hostname = config('api.url'); + $current = new Carbon(); + + $month = $request->filled('month') ? $request->month : $current->month; + $year = $request->filled('year') ? $request->year : $current->year; + + return view('reports.data-pelanggan-bycaw.index', compact('month', 'year')); + } + + public function dataPelangganBycawShow(Request $request) + { + $validated = $request->validate([ + 'year' => 'required|digits:4', + 'cawangan' => 'required|array|min:1' + ]); + + $year = $validated['year']; + $cawangan = $validated['cawangan']; // array kod cawangan + + $tarikh_cetak = now()->format('d/m/Y'); + $tebus_date = 'Tahun ' . $year; + + $request->hostname = config('api.url'); + + // 🔑 Forward ke API + $response = Http::get( + $request->hostname . '/api/reports/data-pelanggan-bycaw', + [ + 'year' => $year, + 'cawangan' => $cawangan, // array terus + ] + )->json(); + + if (!isset($response['summary'], $response['pelanggan'])) { + abort(500, 'Data API tidak sah'); + } + + $summary = $response['summary']; + $pelanggan = $response['pelanggan']; + + if ($request->generateType === 'pdf') { + return view( + 'reports.data-pelanggan-bycaw.show', + compact('summary','pelanggan','tarikh_cetak','tebus_date','year','cawangan') + ); + } + + if ($request->generateType === 'excel') { + return Excel::download( + new DataPelangganBycawDetailExport($pelanggan, $year, $cawangan), + "Laporan-Data-Pelanggan-Bycaw-{$year}.xlsx" + ); + } + + abort(400, 'Jenis laporan tidak sah'); + } + + + + + + } diff --git a/app/Http/Controllers/Reports/StokAuditController.php b/app/Http/Controllers/Reports/StokAuditController.php index 763fc04..2a04943 100644 --- a/app/Http/Controllers/Reports/StokAuditController.php +++ b/app/Http/Controllers/Reports/StokAuditController.php @@ -25,38 +25,53 @@ class StokAuditController extends Controller public function show(Request $request) { + $tarikh_cetak = Carbon::now()->toDateString(); // tarikh cetak + + if ($request->dateOption === 'current') { + $date = Carbon::now(); + $tebus_date = $date->format('d-m-Y'); // tarikh semasa + $monthName = $date->translatedFormat('F'); // bulan semasa + } else { $validated = $request->validate( ['monthYear' => 'required'], ['monthYear.required' => 'Sila isi tarikh sebelum hantar', ]); - $current = Carbon::now(); - $tarikh_cetak = $current->toDateString(); $tokens = explode('-', $validated['monthYear']); $month = ltrim($tokens[0], '0'); $year = $tokens[1]; - // Set the locale to Malaysian - App::setLocale('ms'); - - // Create a Carbon instance representing the date - $date = Carbon::createFromDate($year, $month, 1); // Set the day to 1st of the month - - // Get the name of the month in Malaysian local + $date = Carbon::createFromDate($year, $month, 1); // set day = 1 $monthName = $date->translatedFormat('F'); + $tebus_date = $monthName . ' ' . $year; + } + + $month = $date->month; + $year = $date->year; $request->hostname = config('api.url'); $stokAudit = Http::get($request->hostname . '/api/reports/stok-audit', [ 'month' => $month, 'year' => $year, + 'dateOption' => $request->dateOption ])->json(); - $tebus_date = $monthName . ' ' . $year; - $file_title = sprintf("Laporan-StokAudit %s (%s - %s).xlsx", 'Semua cawangan', $monthName, $year); + $file_title = sprintf( + "Laporan-StokAudit %s (%s).xlsx", + 'Semua cawangan', + $tebus_date + ); if ($request->generateType === 'pdf') { - return view('reports.stok-audit.show', compact('tebus_date', 'tarikh_cetak', 'stokAudit', 'month', 'year')); + return view('reports.stok-audit.show', compact( + 'stokAudit', + 'month', + 'year', + 'monthName', + 'tarikh_cetak', + 'tebus_date' + )); } else { return Excel::download(new StokAuditExport($stokAudit), $file_title); } diff --git a/app/Http/Controllers/ResitController.php b/app/Http/Controllers/ResitController.php index a792ba0..9482f08 100644 --- a/app/Http/Controllers/ResitController.php +++ b/app/Http/Controllers/ResitController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; @@ -17,7 +18,7 @@ class ResitController extends Controller public function resit($id) { - + $auth_user = Auth::user(); $totaltransaction = 0; $transaction = Http::get(config('api.url') . '/api/transaction/id/'. $id)->json(); @@ -32,7 +33,16 @@ class ResitController extends Controller $customers_info = Http::get(config('api.url') . '/api/customers/'. $gadai['nokp'])->json(); - return view('resit.resitansuran',compact('transaction','gadai','customers_info')); + $cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $gadai['kodcaw'])->json(); + + $wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getwakil/' . $auth_user['cawangan'] . '/code/' . $transaction['nowakil'])->json(); + + if($gadai['tagbaru'] == 1){ + return view('resit.resitansuran_ujrah',compact('transaction','gadai','customers_info','cawangan_info','wakil')); + + }else{ + return view('resit.resitansuran',compact('transaction','gadai','customers_info','cawangan_info','wakil')); + } } public function resittebusseparuh($id) @@ -114,7 +124,7 @@ class ResitController extends Controller public function resittebus($id) { - + $auth_user = Auth::user(); $gadai = Http::get(config('api.url') . '/api/gadai/norujukan/'. $id)->json(); if(sizeof($gadai) != 0) @@ -126,6 +136,8 @@ class ResitController extends Controller $transaction = Http::get(config('api.url') . '/api/transaction/'. $id)->json(); + $transaction_tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/one/'. $id)->json(); + foreach($transaction as $trans) { $totaltransaction += $trans['duit_masuk']; @@ -142,10 +154,25 @@ class ResitController extends Controller $totalBayaranAnsuran = Http::get(config('api.url') . '/api/transaction/norujukan/total/ansuran',['norujukan'=>$id])->json(); - if(sizeof($wakil) != 0) - $wakil = $wakil[0]; + // $totalrebate = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/reports/totalrebate',['norujukan'=>$id])->json(); + + $surat_wakil = []; + if(sizeof($wakil) != 0) { + $wakil = $wakil[0]; + $surat_wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getsuratwakil/' . $auth_user['cawangan'] . '/' . $id)->json(); + } - return view('resit.resittebus',compact('transaction','gadai','cawangan_info','customers_info','penebusan','wakil','totaltransaction','totalBayaranAnsuran')); + $transaction_tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/one/'. $id)->json(); + $totalrebate = ['ujrah' => ($transaction_tebus['ujrah'] - $transaction_tebus['ujrah_rebet']), 'onepercent' => ($transaction_tebus['onepercent'] - $transaction_tebus['onepercent_rebet'])]; + + $khazanah_user = User::where('role_harian', 'khazanah')->where('cawangan', $auth_user['cawangan'])->select('name')->first(); + + if($gadai['tagbaru'] == 1){ + return view('resit.resittebus_ujrah',compact('transaction','transaction_tebus','totalrebate','khazanah_user','gadai','cawangan_info','customers_info','penebusan','wakil','totaltransaction','totalBayaranAnsuran')); + + }else{ + return view('resit.resittebus',compact('transaction','transaction_tebus','totalrebate','khazanah_user','gadai','cawangan_info','customers_info','penebusan','wakil','totaltransaction','totalBayaranAnsuran')); + } } public function resitbelumtebus($id) diff --git a/app/Http/Controllers/SaringanGadaianController.php b/app/Http/Controllers/SaringanGadaianController.php new file mode 100644 index 0000000..4f4e14a --- /dev/null +++ b/app/Http/Controllers/SaringanGadaianController.php @@ -0,0 +1,115 @@ +toDateString(); + }; + + $request->hostname = config('api.url'); + + $startDate = $getReportDate($request->startDate); + $endDate = $getReportDate($request->endDate); + + + $gadaian = Http::get($request->hostname . '/api/reports/saringan/gadaian', [ + 'startDate' => $startDate, + 'endDate' => $endDate, + ])->json(); + + return view('reports.saringan-gadaian.index', compact('gadaian', 'startDate', 'endDate')); + } + + public function exportExcel(Request $request, $kodcaw) + { + return Excel::download( + new GadaianDetailExport( + $kodcaw, + $request->startDate, + $request->endDate + ), + "Saringan_Gadaian_{$kodcaw}.xlsx" + ); + } + + + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/StatistikController.php b/app/Http/Controllers/StatistikController.php new file mode 100644 index 0000000..1d5ef03 --- /dev/null +++ b/app/Http/Controllers/StatistikController.php @@ -0,0 +1,105 @@ +toDateString(); + }; + + $request->hostname = config('api.url'); + + $startDate = $getReportDate($request->startDate); + $endDate = $getReportDate($request->endDate); + + + $gadaian = Http::get($request->hostname . '/api/statistik', [ + 'startDate' => $startDate, + 'endDate' => $endDate, + ])->json(); + dd($gadaian); + + return view('akaun.laporan_gadaian', compact('gadaian', 'startDate', 'endDate')); + } + + + + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/WTDController.php b/app/Http/Controllers/WTDController.php index 7ad1bee..be243a2 100644 --- a/app/Http/Controllers/WTDController.php +++ b/app/Http/Controllers/WTDController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers; - use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; @@ -10,7 +9,8 @@ use Illuminate\Support\Facades\Http; use Carbon\Carbon; use PDF; -use Maatwebsite\Excel\Excel; +use Maatwebsite\Excel\Facades\Excel; +use App\Exports\WTDDetailExport; class WTDController extends Controller { @@ -19,8 +19,8 @@ class WTDController extends Controller // $this->middleware('auth'); // } - public function index(){ - + public function index() + { return view('wtd.index'); } @@ -30,27 +30,25 @@ class WTDController extends Controller $norujukan = json_decode($request->norujukan); - $tuntutbaki = Http::get(config('api.url').'/admin/wtd/senarai',['norujukan' => $norujukan,'kodcaw' => $request->cawangan])->json(); + $tuntutbaki = Http::get(config('api.url') . '/admin/wtd/senarai', ['norujukan' => $norujukan, 'kodcaw' => $request->cawangan])->json(); - $cawangan=Http::get(config('api.url').'/api/cawangan/detail/'. $request->cawangan)->json(); - $cawangan_detail=$cawangan[0]; + $cawangan = Http::get(config('api.url') . '/api/cawangan/detail/' . $request->cawangan)->json(); + $cawangan_detail = $cawangan[0]; $current = Carbon::now(); $tarikh_cetak = $current->toDateString(); $api_url = config('api.url'); - $mula = $request->mula; + $mula = $request->mula; $hingga = $request->hingga; // $myDateTime = DateTime::createFromFormat('Y-m-d', $tarikh_cetak); // $tarikhcetakan = $myDateTime->format('d-m-Y'); - - if(isset($request->jenis)) - { - if($request->jenis == 'pdf') - { - $pdf = PDF::loadView('wtd.cetakan', compact('tuntutbaki','cawangan_detail','tarikh_cetak','api_url','mula','hingga'))->setPaper('a4', 'potrait'); - return $pdf->download('wtd_' . $request->cawangan .'_'. $tarikh_cetak . '.pdf'); - }else{ - return view('wtd.cetakanexcel', compact('tuntutbaki','cawangan_detail','tarikh_cetak','api_url','mula','hingga')); + + if (isset($request->jenis)) { + if ($request->jenis == 'pdf') { + $pdf = PDF::loadView('wtd.cetakan', compact('tuntutbaki', 'cawangan_detail', 'tarikh_cetak', 'api_url', 'mula', 'hingga'))->setPaper('a4', 'potrait'); + return $pdf->download('wtd_' . $request->cawangan . '_' . $tarikh_cetak . '.pdf'); + } else { + return view('wtd.cetakanexcel', compact('tuntutbaki', 'cawangan_detail', 'tarikh_cetak', 'api_url', 'mula', 'hingga')); } } } @@ -61,21 +59,196 @@ class WTDController extends Controller $current = Carbon::now(); $tarikh_cetak = $current->toDateString(); - $cawangan=Http::get(config('api.url').'/api/cawangan/detail/'. $request->cawangan)->json(); - $cawangan_detail=$cawangan[0]; + $cawangan = Http::get(config('api.url') . '/api/cawangan/detail/' . $request->cawangan)->json(); + $cawangan_detail = $cawangan[0]; - $wtdDalamProses = Http::get(config('api.url'). '/admin/wtd/dalamproses' ,['batchno' => $request->batchno,'kodcaw' => $request->cawangan])->json(); - if(isset($request->jenis)) - { - if($request->jenis == 'pdf') - { - $pdf = PDF::loadView('wtd.dalamprosespdf', compact('tarikh_cetak','cawangan_detail','wtdDalamProses','api_url'))->setPaper('a4', 'landscape'); - return $pdf->download('wtd_' . $request->cawangan .'_'. $tarikh_cetak . '.pdf'); - }else{ + $wtdDalamProses = Http::get(config('api.url') . '/admin/wtd/dalamproses', ['batchno' => $request->batchno, 'kodcaw' => $request->cawangan])->json(); + if (isset($request->jenis)) { + if ($request->jenis == 'pdf') { + $pdf = PDF::loadView('wtd.dalamprosespdf', compact('tarikh_cetak', 'cawangan_detail', 'wtdDalamProses', 'api_url'))->setPaper('a4', 'landscape'); + return $pdf->download('wtd_' . $request->cawangan . '_' . $tarikh_cetak . '.pdf'); + } else { - return view('wtd.dalamprosesexcel', compact('tarikh_cetak','cawangan_detail','wtdDalamProses','api_url')); + return view('wtd.dalamprosesexcel', compact('tarikh_cetak', 'cawangan_detail', 'wtdDalamProses', 'api_url')); } } } + + public function janaSimulasi(Request $request) + { + $cawangan = Http::get(config('api.url') . '/api/cawangan/')->json(); + + return view('wtd.simulasi.janaSimulasi', compact('cawangan')); + } + + public function showSimulasi(Request $request) + { + $request->validate([ + 'kodcaw' => 'required', + 'tahun' => 'required', + ], [ + 'kodcaw.required' => 'Sila Pilih Cawangan Terlebih Dahulu.', + 'tahun.required' => 'Sila Masukkan Tahun Terlebih Dahulu.', + ]); + + $senaraiSimulasi = Http::get(config('api.url') . '/admin/wtd/janaSimulasi', ['kodcaw' => $request->kodcaw, 'tahun' => $request->tahun])->json(); + + $year = $request->tahun; + + // dd($senaraiSimulasi, $request->kodcaw, $request->tahun); + + return view('wtd.simulasi.show', compact('senaraiSimulasi', 'year')); + } + + public function showRekod(Request $request) + { + $bulan = $request->input('month'); + $bulanNumber = date('n', strtotime($bulan)); + + $rekod = Http::get(config('api.url') . '/admin/wtd/rekodSimulasi', ['kodcaw' => $request->kodcaw, 'month' => $bulanNumber, 'year' => $request->year])->json(); + + $totalBaki = collect($rekod)->sum('baki'); + + // dd($rekod, $bulanNumber, $totalBaki, $bulan); + + return view('wtd.simulasi.rekod', compact('bulan', 'rekod', 'totalBaki')); + } + + public function prosesWTD(Request $request) + { + // dd($request->input()); + $request->validate([ + 'data.*.bulan' => 'required|string', + 'data.*.jumlah_norujukan' => 'required|numeric', + 'data.*.pembiayaan' => 'required|numeric', + 'data.*.baki' => 'required|numeric', + 'data.*.selected' => 'nullable', + ]); + + // Process the selected data + $data = $request->input('data', []); + $insertedRecords = []; + $kodcaw = $request->data[0]['kodcaw']; + + foreach ($data as $item) { + if (isset($item['selected'])) { + $insertedRecords[] = [ + 'bulan' => $item['bulan'], + 'tahun' => $request->tahun, + 'kodcaw' => $kodcaw, + 'jumlah_sag' => $item['jumlah_norujukan'], + 'pembiayaan' => $item['pembiayaan'], + 'baki' => $item['baki'], + 'created_at' => now(), + 'updated_at' => now(), + ]; + } + } + $response = Http::post(config('api.url') . '/admin/wtd/prosesSimulasi', [ + 'input' => $insertedRecords + ])->json(); + + // dd($data, $insertedRecords, $kodcaw, $response); + + return view('wtd.simulasi.pengesahan', compact('insertedRecords', 'response', 'kodcaw')); + } + + public function pengesahanSimulasi(Request $request) + { + $response = Http::post(config('api.url') . '/admin/wtd/pengesahanSimulasi', [ + 'records' => $request->records, + 'kodcaw' => $request->kodcaw, + ])->json(); + + return view('wtd.index'); + } + + public function serahbaki() + { + return view('wtd.simulasi.serahbaki'); + } + + public function simulasiToDraft(Request $request) + { + $response = Http::post(config('api.url') . '/admin/wtd/simulasiToDraft', [ + 'bulan' => $request->bulan, + + ])->json(); + + dd($response); + } + + public function summaryWtd(Request $request) + { + $current = Carbon::now(); + + $getReportDate = function ($date_string) use ($current) { + return $date_string ? $date_string : $current->toDateString(); + }; + + $request->hostname = config('api.url'); + + $startDate = $getReportDate($request->startDate); + $endDate = $getReportDate($request->endDate); + + // $summarywtd = Http::get($request->hostname . '/admin/wtd/summaryWtd', [ + // 'startDate' => $startDate, + // 'endDate' => $endDate, + // ])->effectiveUri()->__toString(); + + $summarywtd = Http::get($request->hostname . '/admin/wtd/summaryWtd', [ + 'startDate' => $startDate, + 'endDate' => $endDate, + ])->json(); + + + if (!is_array($summarywtd)) { + $summarywtd = []; + } + + return view('reports.wtd.index', compact('summarywtd', 'startDate', 'endDate')); + } + + public function exportExcel(Request $request, $kodcaw) + { + return Excel::download( + new WTDDetailExport( + $kodcaw, + $request->startDate, + $request->endDate + ),"Detail_Laporan_WTD_{$kodcaw}.xlsx"); + } + + public function home() + { + return view('wtd.debug.home'); + } + + public function trail(Request $request) + { + $current = Carbon::now(); + + $getReportDate = function ($date_string) use ($current) { + return $date_string ? $date_string : $current->toDateString(); + }; + + $request->hostname = config('api.url'); + + $startDate = $getReportDate($request->startDate); + $endDate = $getReportDate($request->endDate); + + $debugwtd = Http::get($request->hostname . '/admin/wtd/debugWtd', [ + 'startDate' => $startDate, + 'endDate' => $endDate, + ])->json(); + + + if (!is_array($debugwtd)) { + $debugwtd = []; + } + + return view('wtd.debug.index', compact('debugwtd', 'startDate', 'endDate')); + } + } diff --git a/app/Services/ImbangdugaServices.php b/app/Services/ImbangdugaServices.php index e536012..0369697 100644 --- a/app/Services/ImbangdugaServices.php +++ b/app/Services/ImbangdugaServices.php @@ -277,10 +277,12 @@ class ImbangdugaServices { if($variable !== 'recno' && $variable !== 'kodcaw' && $variable !== 'tarikh' && $variable !== 'totalharta' && $variable !== 'totaltanggungan' && $variable !== 'tagtally' && $variable !== 'created_at' && $variable !== 'updated_at'){ if($variable == 'bakilelong'){ - $imbangdugadata = ImbangDuga::orderBy('glcode')->where([['single_var',$variable],['variable',$variable]])->first()->toArray(); + $imbangdugaRow = ImbangDuga::orderBy('glcode')->where([['single_var',$variable],['variable',$variable]])->first(); }else{ - $imbangdugadata = ImbangDuga::orderBy('glcode')->where('variable',$variable)->orWhere('single_var',$variable)->first()->toArray(); + $imbangdugaRow = ImbangDuga::orderBy('glcode')->where('variable',$variable)->orWhere('single_var',$variable)->first(); } + if(!$imbangdugaRow) continue; + $imbangdugadata = $imbangdugaRow->toArray(); if($imbangdugadata['jenis'] == 'harta'){ array_push($array_harta,['glcode' => $imbangdugadata['glcode'],'descpt' => $imbangdugadata['descpt'],'amaun' => $res]); }else{ diff --git a/app/View/Components/JanaSimulasi.php b/app/View/Components/JanaSimulasi.php new file mode 100644 index 0000000..d54a7af --- /dev/null +++ b/app/View/Components/JanaSimulasi.php @@ -0,0 +1,28 @@ + + * @license MIT + */ + +/*! + * Vue.js v2.7.8 + * (c) 2014-2022 Evan You + * Released under the MIT License. + */ + +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ + +/*! + * vue-friendly-iframe v0.20.0 (https://github.com/officert/vue-friendly-iframe) + * (c) 2021 Tim Officer + * Released under the MIT License. + */ + +/*! + * vuex v3.6.2 + * (c) 2021 Evan You + * @license MIT + */ + +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ + +/*! svg.draggable.js - v2.2.2 - 2019-01-08 + * https://github.com/svgdotjs/svg.draggable.js + * Copyright (c) 2019 Wout Fierens; Licensed MIT */ + +/*! svg.filter.js - v2.0.2 - 2016-02-24 + * https://github.com/wout/svg.filter.js + * Copyright (c) 2016 Wout Fierens; Licensed MIT */ + +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/**! + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.16.1 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +//! moment.js diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 1cc3d6f..2d60117 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,4 +1,4 @@ { - "/js/app.js": "/js/app.js?id=41f31e4c4d0a3f1615de3f2a5b78988c", - "/css/app.css": "/css/app.css?id=9cdabf7932d415c4f5598da3580b0fa1" + "/js/app.js": "/js/app.js", + "/css/app.css": "/css/app.css" } diff --git a/resources/js/Akaun/AkruBulan.vue b/resources/js/Akaun/AkruBulan.vue index f3cc1eb..033f62d 100644 --- a/resources/js/Akaun/AkruBulan.vue +++ b/resources/js/Akaun/AkruBulan.vue @@ -20,8 +20,7 @@
@@ -34,14 +51,24 @@
+ + + + + \ No newline at end of file diff --git a/resources/js/Akaun/Home.vue b/resources/js/Akaun/Home.vue index 52d9bb7..547b9eb 100644 --- a/resources/js/Akaun/Home.vue +++ b/resources/js/Akaun/Home.vue @@ -1,200 +1,114 @@ - - + + + + + + \ No newline at end of file diff --git a/resources/js/Akaun/StokAudit.vue b/resources/js/Akaun/StokAudit.vue index 493dc9e..0269a48 100644 --- a/resources/js/Akaun/StokAudit.vue +++ b/resources/js/Akaun/StokAudit.vue @@ -35,16 +35,22 @@ -
- - + + +
@@ -111,6 +117,18 @@ export default { }); document.getElementById("formstokaudit").submit(); }, + async generateexcelaudit(){ + await this.setJenis('excelaudit'); + Vue.swal({ + title: 'Memuatkan...', + allowEscapeKey : false, + allowOutsideClick: false, + showCancelButton: false, + showConfirmButton: false, + timer: 8000, + }); + document.getElementById("formstokaudit").submit(); + }, Urlredirect: function() { return window.route('cetak.stokaudit'); }, diff --git a/resources/js/WTD/Rekod.vue b/resources/js/WTD/Rekod.vue index ae43e3a..68c2608 100644 --- a/resources/js/WTD/Rekod.vue +++ b/resources/js/WTD/Rekod.vue @@ -14,14 +14,35 @@
Jumlah WTD
:
-
RM {{ formattext(sb.baki) }}
+ +
+ RM{{ formattext(sb.baki) }} +
-
Tarikh Proses WTD +
Tahun Lelong +
+
:
+
{{ (sb.tahun) ? sb.tahun : 'Tiada' }}
+
+
+
Bulan Lelong +
+
:
+
{{ (sb.bulan) ? sb.bulan : 'Tiada' }}
+
+
+
Tarikh Proses
:
{{ (sb.t_jual) ? sb.t_jual : 'Tiada' }}
+
+
Tarikh Hantar +
+
:
+
{{ (sb.t_htr_ag) ? sb.t_htr_ag : 'Tiada' }}
+
Status
diff --git a/resources/js/WTD/SelectWTD.vue b/resources/js/WTD/SelectWTD.vue index 6a8a49c..77e623b 100644 --- a/resources/js/WTD/SelectWTD.vue +++ b/resources/js/WTD/SelectWTD.vue @@ -19,7 +19,7 @@
- + Batchno: {{ this.batchno }}
@@ -38,9 +38,9 @@ Tarikh Lelong - + Baki @@ -60,9 +60,9 @@ {{ bl.t_jual }} - + {{ formattext(bl.baki) }} @@ -103,7 +103,7 @@ export default { kodcaw: this.$kodcaw, } }).then(response => { - console.log(response); + //console.log(response); this.arraybakilelong = response.data; }) }, @@ -153,7 +153,7 @@ export default { if (boolkatalaluan == 1) { await this.$swal({ - title: 'Proses WTD?', + title: 'Serahan WTD?', text: "anda tidak boleh ulang kembali setelah di proses!", icon: 'warning', showCancelButton: true, @@ -165,16 +165,59 @@ export default { if (result.isConfirmed) { + //new added this.$swal({ - title: "Masukkan No Cek:", - // text: "Write something interesting:", - input: 'text', - showCancelButton: true - }).then((result) => { - if (result.value) { - this.proseswtd(result.value); - } - }); + title: 'Sila Isi Butiran Berikut', + html: ` +
+
+ + +
+ +
+ + +
+
+ `, + focusConfirm: false, + showCancelButton: true, + confirmButtonText: 'Simpan', + cancelButtonText: 'Batal', + + customClass: { + popup: 'swal-popup', + confirmButton: 'swal-confirm', + cancelButton: 'swal-cancel' + }, + + preConfirm: () => { + const noCek = document.getElementById('noCek').value.trim(); + const tarikhAG = document.getElementById('tarikhAG').value; + + if (!noCek || !tarikhAG) { + this.$swal.showValidationMessage( + 'Sila masukkan No Cek dan Tarikh Hantar ke AG' + ); + return false; + } + + return { noCek, tarikhAG }; + } +}).then((result) => { + if (result.isConfirmed) { + this.proseswtd(result.value.noCek, result.value.tarikhAG); + } +}); + + + //end new added } }); } else { @@ -197,11 +240,12 @@ export default { } }); }, - proseswtd: function (nocek) { + proseswtd: function (nocek,tarikhAG) { this.axios.post(this.$hostname + '/admin/wtd/process', { kodcaw: this.$kodcaw, batch: this.batchno, - nocek: nocek + nocek: nocek, + tarikhAG: tarikhAG }).then(response => { if (response.data == 'success') { diff --git a/resources/js/WTD/selection.vue b/resources/js/WTD/selection.vue index 70c1c51..0c368c7 100644 --- a/resources/js/WTD/selection.vue +++ b/resources/js/WTD/selection.vue @@ -2,12 +2,17 @@
+ + + + - + +
diff --git a/resources/js/app.js b/resources/js/app.js index b7436e0..031ddcd 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -215,14 +215,20 @@ Vue.component('tunai-component', require('./components/Tunai.vue').default) Vue.component('petibesi-component', require('./components/Petibesi.vue').default) Vue.component('cawangan-component', require('./components/Cawangan.vue').default) Vue.component('modal-component', require('./components/util/Modal.vue').default) -Vue.component('searchpelanggan-component', require('./components/Searchpelanggan.vue').default) +Vue.component('searchpelanggan-component', require('./components/Searchpelanggan.vue').default) //refer sini nnti + +Vue.component('searchbarangkes-component', require('./components/Searchbarangkes.vue').default) //refer sini nnti copy nnti buat utk sag + Vue.component('laporanakaun-component', require('./Akaun/Laporan.vue').default) Vue.component('online-component', require('./Online/Online.vue').default) Vue.component('noticelelong-component', require('./pages/NotisLelong.vue').default) Vue.component('noticelelong2-component', require('./pages/NotisLelongFasa2.vue').default) Vue.component('kelulusan-component', require('./Kelulusan/TableKelulusan.vue').default) -Vue.component('details-pelanggan', require('./pages/Detailspelanggan.vue').default) +Vue.component('details-pelanggan', require('./pages/Detailspelanggan.vue').default) // refer sini jugak nnti utk sag searching + +Vue.component('details-sag', require('./pages/Detailssag.vue').default) // refer sini jugak nnnti utk sag searching + Vue.component('blacklist-pelanggan', require('./pages/Blacklist.vue').default) Vue.component('harian-component', require('./components/Analisa/Harian.vue').default) diff --git a/resources/js/components/Cawangan.vue b/resources/js/components/Cawangan.vue index a9d3621..a26cc5c 100644 --- a/resources/js/components/Cawangan.vue +++ b/resources/js/components/Cawangan.vue @@ -1,5 +1,5 @@