Big changes added events for decisions

This commit is contained in:
Simon Pocrnjič
2025-10-22 23:20:04 +02:00
parent 872b76b012
commit 67ebe4b225
36 changed files with 2240 additions and 189 deletions
+84
View File
@@ -489,6 +489,90 @@ public function getEvents(Import $import)
return response()->json(['events' => $events]);
}
// List unresolved keyref contract rows (based on events containing keyref-not-found)
public function missingKeyrefRows(Import $import)
{
// Identify row IDs from events. Prefer specific event key, fallback to message pattern
$rowIds = \App\Models\ImportEvent::query()
->where('import_id', $import->id)
->where(function ($q) {
$q->where('event', 'contract_keyref_not_found')
->orWhereRaw('LOWER(message) LIKE ?', ['%keyref%not found%']);
})
->whereNotNull('import_row_id')
->pluck('import_row_id')
->filter()
->unique()
->values();
if ($rowIds->isEmpty()) {
return response()->json([
'columns' => (array) ($import->meta['columns'] ?? []),
'rows' => [],
]);
}
$rows = \App\Models\ImportRow::query()
->where('import_id', $import->id)
->whereIn('id', $rowIds)
->orderBy('row_number')
->get(['id', 'row_number', 'raw_data']);
$columns = (array) ($import->meta['columns'] ?? []);
// If no stored header, derive from first row raw_data keys
if (empty($columns)) {
$first = $rows->first();
if ($first && is_array($first->raw_data)) {
$columns = array_keys($first->raw_data);
}
}
// Normalize each row to ordered array by $columns
$dataRows = [];
foreach ($rows as $r) {
$line = [];
foreach ($columns as $col) {
$line[] = (string) ($r->raw_data[$col] ?? '');
}
$dataRows[] = [
'id' => $r->id,
'row_number' => $r->row_number,
'values' => $line,
];
}
return response()->json([
'columns' => $columns,
'rows' => $dataRows,
]);
}
// Export unresolved keyref rows as CSV (includes header if available)
public function exportMissingKeyrefCsv(Import $import)
{
$json = $this->missingKeyrefRows($import)->getData(true);
$columns = $json['columns'] ?? [];
$rows = $json['rows'] ?? [];
$fh = fopen('php://temp', 'r+');
if (! empty($columns)) {
fputcsv($fh, $columns);
}
foreach ($rows as $r) {
fputcsv($fh, $r['values'] ?? []);
}
rewind($fh);
$csv = stream_get_contents($fh);
fclose($fh);
$filename = 'missing-keyref-rows-'.$import->id.'.csv';
return response($csv, 200, [
'Content-Type' => 'text/csv; charset=UTF-8',
'Content-Disposition' => 'attachment; filename="'.$filename.'"',
]);
}
// Preview (up to N) raw CSV rows for an import for mapping review
public function preview(Import $import, Request $request)
{