3
0
mirror of https://github.com/snipe/snipe-it.git synced 2026-08-18 11:15:42 +00:00

Write headers to output

This commit is contained in:
Marcus Moore
2026-05-05 17:50:35 -07:00
parent e98f73d2fc
commit 2909edf049
2 changed files with 189 additions and 1 deletions

View File

@ -5,6 +5,8 @@ namespace App\Http\Controllers\Reports;
use App\Http\Controllers\Controller;
use App\Models\ReportTemplate;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\StreamedResponse;
class CustomComponentReportController extends Controller
{
@ -37,5 +39,136 @@ class CustomComponentReportController extends Controller
ini_set('max_execution_time', env('REPORT_TIME_LIMIT', 12000)); // 12000 seconds = 200 minutes
$this->disableDebugbar();
$response = new StreamedResponse(function () use ($request) {
Log::debug('Starting streamed response');
Log::debug('CSV escaping is set to: '.config('app.escape_formulas'));
// Open output stream
$handle = fopen('php://output', 'w');
stream_set_timeout($handle, 2000);
fprintf($handle, chr(0xEF).chr(0xBB).chr(0xBF));
$header = [];
if ($request->filled('id')) {
$header[] = trans('general.id');
}
if ($request->filled('company')) {
$header[] = trans('general.company');
}
if ($request->filled('category')) {
$header[] = trans('general.category');
}
if ($request->filled('component_name')) {
$header[] = trans('admin/components/general.component_name');
}
if ($request->filled('manufacturer')) {
$header[] = trans('general.manufacturer');
}
if ($request->filled('model')) {
$header[] = trans('general.model_no');
}
if ($request->filled('serial')) {
$header[] = trans('general.serial_number');
}
if ($request->filled('purchase_date')) {
$header[] = trans('general.purchase_date');
}
if ($request->filled('quantity')) {
$header[] = trans('general.quantity');
}
if ($request->filled('min_amount')) {
$header[] = trans('general.min_amt');
}
if ($request->filled('unit_cost')) {
$header[] = trans('general.unit_cost');
}
if ($request->filled('order')) {
$header[] = trans('admin/hardware/form.order');
}
if ($request->filled('supplier')) {
$header[] = trans('general.suppliers');
}
if ($request->filled('location')) {
$header[] = trans('general.location');
}
if ($request->filled('location_address')) {
$header[] = trans('general.address');
$header[] = trans('general.address');
$header[] = trans('general.city');
$header[] = trans('general.state');
$header[] = trans('general.country');
$header[] = trans('general.zip');
}
if ($request->filled('checkout_date')) {
$header[] = trans('admin/hardware/table.checkout_date');
}
if ($request->filled('created_at')) {
$header[] = trans('general.created_at');
}
if ($request->filled('updated_at')) {
$header[] = trans('general.updated_at');
}
if ($request->filled('deleted_at')) {
$header[] = trans('general.deleted');
}
if ($request->filled('notes')) {
$header[] = trans('general.notes');
}
if ($request->filled('asset_name')) {
$header[] = trans('admin/hardware/form.name');
}
if ($request->filled('asset_tag')) {
$header[] = trans('admin/hardware/form.tag');
}
if ($request->filled('asset_company')) {
$header[] = trans('admin/reports/general.custom_export.asset_company');
}
if ($request->filled('asset_serial')) {
$header[] = trans('admin/reports/general.custom_export.asset_serial');
}
$executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
Log::debug('Starting headers: '.$executionTime);
fputcsv($handle, $header);
$executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
Log::debug('Added headers: '.$executionTime);
// Close the output stream
fclose($handle);
$executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
Log::debug('-- SCRIPT COMPLETED IN '.$executionTime);
}, 200, [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename="custom-accessories-report-'.date('Y-m-d-his').'.csv"',
]);
return $response;
}
}

View File

@ -67,7 +67,62 @@ class CustomComponentReportTest extends TestCase
public function test_custom_component_report_headers()
{
$this->markTestIncomplete();
$this->actingAs(User::factory()->canViewReports()->create())
->post(route('reports.custom.component.run'), [
'id' => '1',
'company' => '1',
'category' => '1',
'component_name' => '1',
'manufacturer' => '1',
'model' => '1',
'serial' => '1',
'purchase_date' => '1',
'quantity' => '1',
'min_amount' => '1',
'unit_cost' => '1',
'order' => '1',
'supplier' => '1',
'location' => '1',
'location_address' => '1',
'checkout_date' => '1',
'created_at' => '1',
'updated_at' => '1',
'deleted_at' => '1',
'notes' => '1',
'asset_name' => '1',
'asset_tag' => '1',
'asset_company' => '1',
'asset_serial' => '1',
])->assertOk()
->assertHeader('content-type', 'text/csv; charset=utf-8')
->assertSeeTextInStreamedResponse(trans('general.id'))
->assertSeeTextInStreamedResponse(trans('general.company'))
->assertSeeTextInStreamedResponse(trans('general.category'))
->assertSeeTextInStreamedResponse(trans('admin/components/general.component_name'))
->assertSeeTextInStreamedResponse(trans('general.manufacturer'))
->assertSeeTextInStreamedResponse(trans('general.model_no'))
->assertSeeTextInStreamedResponse(trans('general.serial_number'))
->assertSeeTextInStreamedResponse(trans('general.purchase_date'))
->assertSeeTextInStreamedResponse(trans('general.quantity'))
->assertSeeTextInStreamedResponse(trans('general.min_amt'))
->assertSeeTextInStreamedResponse(trans('general.unit_cost'))
->assertSeeTextInStreamedResponse(trans('admin/hardware/form.order'))
->assertSeeTextInStreamedResponse(trans('general.suppliers'))
->assertSeeTextInStreamedResponse(trans('general.location'))
->assertSeeTextInStreamedResponse(trans('general.address'))
->assertSeeTextInStreamedResponse(trans('general.city'))
->assertSeeTextInStreamedResponse(trans('general.state'))
->assertSeeTextInStreamedResponse(trans('general.country'))
->assertSeeTextInStreamedResponse(trans('general.zip'))
->assertSeeTextInStreamedResponse(trans('admin/hardware/table.checkout_date'))
->assertSeeTextInStreamedResponse(trans('general.created_at'))
->assertSeeTextInStreamedResponse(trans('general.updated_at'))
->assertSeeTextInStreamedResponse(trans('general.deleted'))
->assertSeeTextInStreamedResponse(trans('general.notes'))
->assertSeeTextInStreamedResponse(trans('admin/hardware/form.name'))
->assertSeeTextInStreamedResponse(trans('admin/hardware/form.tag'))
->assertSeeTextInStreamedResponse(trans('admin/reports/general.custom_export.asset_company'))
->assertSeeTextInStreamedResponse(trans('admin/reports/general.custom_export.asset_serial'));
}
public function test_custom_component_report_content()