fitur import request log dan final log

This commit is contained in:
2024-01-12 06:46:10 +07:00
parent 52f7cacfd8
commit 81fb10fbf0
6 changed files with 404 additions and 49 deletions

View File

@@ -13,7 +13,6 @@ use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\RequestLogResource;
use Modules\Internal\Transformers\RequestLogShowResource;
use Illuminate\Support\Facades\Storage;
use App\Services\RequestLogService;
use App\Exceptions\ImportRowException;
use App\Events\RequestLoged;
use Carbon\Carbon;
@@ -32,6 +31,7 @@ use App\Models\File;
use App\Models\FilesMcu;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
use Modules\Internal\Services\RequestLogService;
class RequestLogController extends Controller
{
@@ -41,6 +41,12 @@ class RequestLogController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function __construct(RequestLogService $requestLogService)
{
$this->requestLogService = $requestLogService;
}
public function index(Request $request)
{
$requestLog = RequestLog::query()
@@ -386,7 +392,6 @@ class RequestLogController extends Controller
}
public function updateStatus($id)
{
$requestLog = RequestLog::findOrFail($id);
@@ -443,37 +448,35 @@ class RequestLogController extends Controller
public function importRequestLog(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$fileWrite = Storage::disk('public')->path('temp/result-' . $file_name);
$fileRead = Storage::path('temp/' . $file_name);
$import = new ImportService();
$import->read($fileRead);
$import->write($fileWrite, 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
if ($sheetIndex == 1) { // Rename First Sheet to Writer
$firstWriterSheet = $import->writer->getCurrentSheet();
$firstWriterSheet->setName($sheet->getName());
} else { // Add New Sheet to Writer
$nextWriterSheet = $import->writer->addNewSheetAndMakeItCurrent();
$nextWriterSheet->setName($sheet->getName());
}
$reader = ReaderEntityFactory::createXLSXReader(Storage::path('temp/' . $file_name));
$reader->open(Storage::path('temp/' . $file_name));
$headers_map_to_table_fields = RequestLog::$doc_headers_to_field_map;
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile(Storage::disk('public')->path('temp/result-' . $file_name));
// Write Header to File
$result_headers = array_keys($headers_map_to_table_fields);
$result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']);
$headers_map_to_table_fields = $this->requestLogService->doc_headers_to_field_map;
$import->addArrayToRow($result_headers);
// Write Header to File with certain Format from MemberEnrollmentService::$result_doc_headers
$result_headers = $this->requestLogService->listing_doc_headers;
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRow($result_headers));
$writer->addRow($singleRow);
$imported_member_data = 0;
$failed_member_data = [];
foreach ($reader->getSheetIterator() as $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
// Clear up the string and remove all spaces
$title = $cell->getValue();
$title = preg_replace("/\r|\n/", " ", $title);
$title = preg_replace('/\xc2\xa0/', " ", $title);
@@ -481,39 +484,58 @@ class RequestLogController extends Controller
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
// Collecting Values from table rows and map it to correct fields
$requestLog = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]]))
$row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]])) {
$requestLog[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
}
try { // Process the Row Data
$requestLog = new RequestLogService();
$requestLog->handleRequestLogRow($row_data);
$result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']);
$import->addArrayToRow($result_headers, $sheet->getName());
try {
$rowResponse = $this->requestLogService->handleImportRow($requestLog);
// Write Success Result to File
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($rowResponse));
$writer->addRow($singleRow);
$imported_member_data++;
} catch (ImportRowException $e) {
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
// Write Data Validation Error to File
$requestLog = array_merge($requestLog, [
'ingestion_code' => $e->getCode(),
'ingestion_status' => $e->getMessage(),
]);
// try {
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($new_member_data));
$writer->addRow($singleRow);
// } catch (\Exception $e) {
$failed_member_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $new_member_data];
// }
} catch (\Exception $e) {
// Write Server Error to File
$requestLog = array_merge($requestLog, [
'ingestion_code' => $e->getCode(),
'ingestion_status' => $e->getMessage(),
]);
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($requestLog));
$writer->addRow($singleRow);
$failed_member_data[] = ['row_number' => $index, 'error' => $e->getMessage()];
}
}
}
}
$import->reader->close();
Storage::delete('temp/' . $file_name);
$import->writer->close();
break; //only read first sheet
}
$reader->close();
$writer->close();
Storage::delete('temp/' . $file_name);
// throw(404);
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
// 'failed_row' => $failed_plan_data,
'total_success_row' => $imported_member_data,
'total_failed_row' => count($failed_member_data),
'failed_row' => $failed_member_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-' . $file_name),
'name' => 'result-' . $file_name,
@@ -747,7 +769,7 @@ class RequestLogController extends Controller
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . $sparator. $data['source'] . $sparator. $data['provideCode'] . $sparator. $data['date'] . $sparator . $data['policy'] . $sparator. $data['member_code'] . $sparator. str_pad($next_number, 3, '0', STR_PAD_LEFT);
return self::$code_prefix . $sparator. $data['source'] . $sparator. $data['provideCode'] . $sparator. $data['date'] . $sparator . $data['policy'] . $sparator. $data['member_code'] . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
public function requestFiles(Request $request, $claim_id)