419 lines
14 KiB
PHP
419 lines
14 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use App\Controllers\BaseController;
|
|
use CodeIgniter\HTTP\ResponseInterface;
|
|
|
|
use App\Models\ReportsModel;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\IOFactory;
|
|
|
|
class ReportsController extends BaseController
|
|
{
|
|
protected $reportsModel;
|
|
|
|
public function __construct()
|
|
{
|
|
// Load any necessary models or libraries here
|
|
$this->reportsModel = new ReportsModel();
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
//
|
|
}
|
|
|
|
public function advancePurchaseReport()
|
|
{
|
|
try {
|
|
$data = $this->request->getJSON(true);
|
|
|
|
$fromDate = $data['fromDate'] ?? '';
|
|
$toDate = $data['toDate'] ?? '';
|
|
|
|
$result = $this->reportsModel->advancePurchaseReport($fromDate, $toDate);
|
|
|
|
if (empty($result)) {
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'No data found for the given criteria.'
|
|
])->setStatusCode(ResponseInterface::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
// Separate domestic
|
|
$domestic = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'domestic'));
|
|
|
|
// Separate international
|
|
$international = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'international'));
|
|
|
|
if(isset($data['export']))
|
|
{
|
|
if($data['export'] == 'domestic'){ $exportData = $domestic; }else{ $exportData = $international; }
|
|
|
|
if(count($exportData) == 0){ return $this->response->setJSON(['status' => 'failed','message' => 'No Data','data' => [ ]]); }
|
|
|
|
return $this->downloadExcel($exportData);
|
|
}
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'success',
|
|
'message' => 'Data found for the given criteria.',
|
|
'data' => [
|
|
'domestic' => $domestic,
|
|
'international' => $international
|
|
]
|
|
])->setStatusCode(ResponseInterface::HTTP_OK);
|
|
|
|
} catch (\Throwable $th) {
|
|
log_message('error', 'advancePurchaseReport Exception: ' . $th->getMessage());
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong while processing the request.'
|
|
])->setStatusCode(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);
|
|
|
|
} finally {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public function misServicesAnalysis()
|
|
{
|
|
try {
|
|
$data = $this->request->getJSON(true);
|
|
|
|
$fromDate = $data['fromDate'] ?? '';
|
|
$toDate = $data['toDate'] ?? '';
|
|
|
|
$result = $this->reportsModel->misServicesAnalysis( $fromDate, $toDate);
|
|
|
|
|
|
if (empty($result)) {
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'No data found for the given criteria.'
|
|
])->setStatusCode(ResponseInterface::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
// Flatten the array
|
|
$flat_result = [];
|
|
|
|
foreach ($result as $group) {
|
|
foreach ($group as $row) {
|
|
$flat_result[] = $row;
|
|
}
|
|
}
|
|
|
|
// Separate domestic
|
|
$domestic = array_values(array_filter($flat_result, fn($row) => $row['plan_trip_type'] === 'domestic'));
|
|
|
|
// Separate international
|
|
$international = array_values(array_filter($flat_result, fn($row) => $row['plan_trip_type'] === 'international'));
|
|
|
|
|
|
|
|
if(isset($data['export']))
|
|
{
|
|
if($data['export'] == 'domestic'){ $exportData = $domestic; }else{ $exportData = $international; }
|
|
|
|
if(count($exportData) == 0){ return $this->response->setJSON(['status' => 'failed','message' => 'No Data','data' => [ ]]); }
|
|
|
|
return $this->downloadExcel($exportData);
|
|
}
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'success',
|
|
'message' => 'Data found for the given criteria.',
|
|
'data' => [
|
|
'domestic' => $domestic,
|
|
'international' => $international
|
|
]
|
|
])->setStatusCode(ResponseInterface::HTTP_OK);
|
|
|
|
|
|
} catch (\Throwable $th) {
|
|
log_message('error', 'misServicesAnalysis Exception: ' . $th->getMessage());
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong while processing the request.'
|
|
])->setStatusCode(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);
|
|
|
|
} finally {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public function misAirReport()
|
|
{
|
|
|
|
try {
|
|
$data = $this->request->getJSON(true);
|
|
|
|
$fromDate = $data['fromDate'] ?? '';
|
|
$toDate = $data['toDate'] ?? '';
|
|
|
|
$result = $this->reportsModel->misAirReport($fromDate, $toDate);
|
|
|
|
if (empty($result)) {
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'No data found for the given criteria.'
|
|
])->setStatusCode(ResponseInterface::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
// Separate domestic
|
|
$domestic = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'domestic'));
|
|
|
|
// Separate international
|
|
$international = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'international'));
|
|
|
|
if(isset($data['export']))
|
|
{
|
|
if($data['export'] == 'domestic'){ $exportData = $domestic; }else{ $exportData = $international; }
|
|
|
|
if(count($exportData) == 0){ return $this->response->setJSON(['status' => 'failed','message' => 'No Data','data' => [ ]]); }
|
|
|
|
return $this->downloadExcel($exportData);
|
|
}
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'success',
|
|
'message' => 'Data found for the given criteria.',
|
|
'data' => [
|
|
'domestic' => $domestic,
|
|
'international' => $international
|
|
]
|
|
])->setStatusCode(ResponseInterface::HTTP_OK);
|
|
|
|
} catch (\Throwable $th) {
|
|
log_message('error', 'misAirReport Exception: ' . $th->getMessage());
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong while processing the request.'
|
|
])->setStatusCode(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);
|
|
|
|
} finally {
|
|
|
|
}
|
|
}
|
|
|
|
public function misHotelReport()
|
|
{
|
|
|
|
try {
|
|
$data = $this->request->getJSON(true);
|
|
|
|
$fromDate = $data['fromDate'] ?? '';
|
|
$toDate = $data['toDate'] ?? '';
|
|
|
|
$result = $this->reportsModel->misHotelReport($fromDate, $toDate);
|
|
|
|
if (empty($result)) {
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'No data found for the given criteria.'
|
|
])->setStatusCode(ResponseInterface::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
// Separate domestic
|
|
$domestic = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'domestic'));
|
|
|
|
// Separate international
|
|
$international = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'international'));
|
|
|
|
|
|
if(isset($data['export']))
|
|
{
|
|
if($data['export'] == 'domestic'){ $exportData = $domestic; }else{ $exportData = $international; }
|
|
|
|
if(count($exportData) == 0){ return $this->response->setJSON(['status' => 'failed','message' => 'No Data','data' => [ ]]); }
|
|
|
|
return $this->downloadExcel($exportData);
|
|
}
|
|
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'success',
|
|
'message' => 'Data found for the given criteria.',
|
|
'data' => [
|
|
'domestic' => $domestic,
|
|
'international' => $international
|
|
]
|
|
])->setStatusCode(ResponseInterface::HTTP_OK);
|
|
|
|
} catch (\Throwable $th) {
|
|
log_message('error', 'misAirReport Exception: ' . $th->getMessage());
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong while processing the request.'
|
|
])->setStatusCode(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);
|
|
|
|
} finally {
|
|
|
|
}
|
|
}
|
|
|
|
public function misForexReport()
|
|
{
|
|
|
|
try {
|
|
$data = $this->request->getJSON(true);
|
|
|
|
$fromDate = $data['fromDate'] ?? '';
|
|
$toDate = $data['toDate'] ?? '';
|
|
|
|
$result = $this->reportsModel->misForexReport($fromDate, $toDate);
|
|
|
|
if (empty($result)) {
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'No data found for the given criteria.'
|
|
])->setStatusCode(ResponseInterface::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
if(isset($data['export']))
|
|
{
|
|
if(count($result) == 0){ return $this->response->setJSON(['status' => 'failed','message' => 'No Data','data' => [ ]]); }
|
|
|
|
return $this->downloadExcel($result);
|
|
}
|
|
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'success',
|
|
'message' => 'Data found for the given criteria.',
|
|
'data' => $result
|
|
])->setStatusCode(ResponseInterface::HTTP_OK);
|
|
|
|
} catch (\Throwable $th) {
|
|
log_message('error', 'misAirReport Exception: ' . $th->getMessage());
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong while processing the request.'
|
|
])->setStatusCode(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);
|
|
|
|
} finally {
|
|
|
|
}
|
|
}
|
|
|
|
public function guestHouseReport()
|
|
{
|
|
|
|
try {
|
|
$data = $this->request->getJSON(true);
|
|
|
|
$fromDate = $data['fromDate'] ?? '';
|
|
$toDate = $data['toDate'] ?? '';
|
|
|
|
$result = $this->reportsModel->guestHouseReport($fromDate, $toDate);
|
|
|
|
if (empty($result)) {
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'No data found for the given criteria.'
|
|
])->setStatusCode(ResponseInterface::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
// Separate domestic
|
|
$domestic = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'domestic'));
|
|
|
|
// Separate international
|
|
$international = array_values(array_filter($result, fn($row) => $row['plan_trip_type'] === 'international'));
|
|
|
|
if(isset($data['export']))
|
|
{
|
|
if($data['export'] == 'domestic'){ $exportData = $domestic; }else{ $exportData = $international; }
|
|
|
|
if(count($exportData) == 0){ return $this->response->setJSON(['status' => 'failed','message' => 'No Data','data' => [ ]]); }
|
|
|
|
return $this->downloadExcel($exportData);
|
|
}
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'success',
|
|
'message' => 'Data found for the given criteria.',
|
|
'data' => [
|
|
'domestic' => $domestic,
|
|
'international' => $international
|
|
]
|
|
])->setStatusCode(ResponseInterface::HTTP_OK);
|
|
|
|
} catch (\Throwable $th) {
|
|
log_message('error', 'misAirReport Exception: ' . $th->getMessage());
|
|
|
|
return $this->response->setJSON([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong while processing the request.'
|
|
])->setStatusCode(ResponseInterface::HTTP_INTERNAL_SERVER_ERROR);
|
|
|
|
} finally {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//excel download
|
|
public function downloadExcel($data)
|
|
{
|
|
|
|
if (empty($data) || !is_array($data)) {
|
|
return 'No valid data provided.';
|
|
}
|
|
|
|
// Create Spreadsheet
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
|
|
// Generate headers from the first row
|
|
$headers = array_keys($data[0]);
|
|
$col = 'A';
|
|
|
|
foreach ($headers as $header) {
|
|
$sheet->setCellValue($col . '1', $header);
|
|
$col++;
|
|
}
|
|
|
|
// Fill data
|
|
$rowNum = 2;
|
|
foreach ($data as $row) {
|
|
$col = 'A';
|
|
foreach ($headers as $header) {
|
|
$sheet->setCellValue($col . $rowNum, $row[$header]);
|
|
$col++;
|
|
}
|
|
$rowNum++;
|
|
}
|
|
|
|
// Write to output
|
|
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
|
|
|
|
// Set headers for download
|
|
$filename = 'dynamic_excel_' . date('YmdHis') . '.xlsx';
|
|
|
|
return $this->response
|
|
->setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
|
->setHeader('Content-Disposition', "attachment;filename=\"$filename\"")
|
|
->setHeader('Cache-Control', 'max-age=0')
|
|
->setBody($this->writeToTempFile($writer));
|
|
}
|
|
|
|
private function writeToTempFile($writer): string
|
|
{
|
|
$temp_file = tempnam(sys_get_temp_dir(), 'excel_') . '.xlsx';
|
|
$writer->save($temp_file);
|
|
return file_get_contents($temp_file);
|
|
}
|
|
|
|
|
|
|
|
}
|