.cursor/skills/nazim-reports/SKILL.md
PDF and Excel report generation for Nazim. Use when adding or changing reports. Backend uses ReportService and ReportConfig; frontend uses useServerReport. Covers branding, DateConversionService, RTL, acceptance criteria.
npx skillsauth add AHMADJAN-New/nazim-web nazim-reportsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use the unified report system: ReportService (backend) and useServerReport (frontend). Never generate PDF/Excel directly.
use App\Services\Reports\ReportService;
use App\Services\Reports\ReportConfig;
use App\Services\Reports\DateConversionService;
public function __construct(private ReportService $reportService) {}
$config = ReportConfig::fromArray([
'report_key' => 'student_list',
'report_type' => 'pdf', // or 'excel'
'branding_id' => $request->branding_id,
'report_template_id' => $request->template_id,
'title' => 'Student List Report',
'calendar_preference' => $request->calendar_preference ?? 'jalali', // gregorian, jalali, qamari
'language' => $request->language ?? 'ps',
]);
// Format dates before passing data
$dateService = app(DateConversionService::class);
foreach ($data['rows'] as &$row) {
if (!empty($row['enrollment_date'])) {
$row['enrollment_date'] = $dateService->formatDate(
$row['enrollment_date'], $config->calendar_preference, 'full', $config->language
);
}
}
$reportRun = $this->reportService->generateReport($config, $data, $profile->organization_id);
return response()->json(['id' => $reportRun->id, 'status' => $reportRun->status], 202);
reports.generate) and organization_id before generatingimport { useServerReport } from '@/hooks/useServerReport';
import { ReportProgressDialog } from '@/components/reports/ReportProgressDialog';
const { generateReport, status, progress, downloadUrl, isGenerating, error } = useServerReport();
await generateReport({
report_key: 'student_list',
report_type: 'pdf',
branding_id: selectedBrandingId,
title: 'Student Report',
calendar_preference: 'jalali',
language: 'ps',
async: true,
data: { columns: [...], rows: [...] },
});
// Use ReportProgressDialog for UX
<ReportProgressDialog open={showProgress} onOpenChange={setShowProgress} status={status} progress={progress} downloadUrl={downloadUrl} />
tools
Toast notifications for Nazim. Use when showing success/error/info messages. ALWAYS use showToast from @/lib/toast with translation keys; never toast from sonner directly. RTL positioning is automatic.
tools
Enforces status badge patterns for Nazim UI. Use when displaying status in tables, cards, or dialogs. Covers Badge variants, semantic colors, statusBadgeVariant, statusOptions with color.
development
Enforces mobile-first responsive patterns for Nazim UI. Use when building pages, tables, forms, charts, or buttons. Covers page container, FilterPanel, tabs, grids, tables, charts, cards, buttons.
development
Enforces patterns for creating and maintaining platform admin pages in Nazim. Use when adding new platform management pages, routes, or API endpoints. Covers 5-step checklist, platformApi, usePlatformAdminPermissions, no organization_id.