app/api/trailer-trips/route.ts:20: const ids = idsParam.split(',').map(Number).filter(n => !isNaN(n) && n > 0);
app/api/trailer-trips/clients/route.ts:17: return NextResponse.json(rows.map(r => r.client).filter(Boolean));
app/api/data-export/route.ts:55: ? trips.map(t => ({
app/api/data-export/route.ts:83: ? trailerTrips.map(t => ({
app/api/data-export/route.ts:104: ? fuel.map(f => ({
app/api/data-export/route.ts:121: ? expenses.map(e => ({
app/api/data-export/route.ts:136: ? income.map(i => ({
app/api/trailer-trips/pdf/route.ts:28: for (let i = 0; i < arr.length; i += n) r.push(arr.slice(i, i + n));
app/api/trailer-trips/pdf/route.ts:63: const cols = activeFields.map(f => `
`).join('');
app/api/trailer-trips/pdf/route.ts:64: const ths = activeFields.map(f => `${f.label} | `).join('');
app/api/trailer-trips/pdf/route.ts:66: const dataRows = Array.from({ length: rows }).map((_, i) => {
app/api/trailer-trips/pdf/route.ts:69: const tds = activeFields.map(f => {
app/api/trailer-trips/pdf/route.ts:133: const body = (pages.length > 0 ? pages : [[]]).map(
app/api/trailer-trips/pdf/route.ts:177: ? fieldsParam.split(',').map(k => TRAILER_FIELDS.find(f => f.key === k)).filter((f): f is FieldDef => !!f)
app/api/trailer-trips/pdf/route.ts:182: const idList = idsParam.split(',').map(v => parseInt(v)).filter(n => !isNaN(n));
app/api/trailer-trips/bulk-pay/route.ts:29: where: { id: { in: trips.map(t => t.id) } },
app/api/trailer-trips/bulk-pay/route.ts:32: return NextResponse.json({ ok: true, groupId, updated: trips.map(t => t.id) });
app/api/trailer-trips/bulk-pay/route.ts:47: where: { id: { in: unpaid.map(t => t.id) } },
app/api/trailer-trips/bulk-pay/route.ts:62: return NextResponse.json({ ok: true, groupId, updated: unpaid.map(t => t.id) });
app/api/trailer-trips/calendar/route.ts:24: for (const trip of trips) {
app/api/income/route.ts:57: const tripGroupIds = Array.from(new Set(rawLogs.map(l => l.tripGroupId).filter((x): x is string => !!x)));
app/api/income/route.ts:58: const trailerGroupIds = Array.from(new Set(rawLogs.map(l => l.trailerGroupId).filter((x): x is string => !!x)));
app/api/income/route.ts:76: for (const t of tripGroupRows) {
app/api/income/route.ts:82: for (const t of trailerGroupRows) {
app/api/income/route.ts:88: const incomeLogs = rawLogs.map(l => ({
app/api/trailer-trips/fields/route.ts:26: const values = [...new Set(trips.map((t: any) => t[field]).filter(Boolean))] as string[];
app/api/trips/analyze/route.ts:30: const imageBlocks = images.map(img => ({
app/api/trailer-trips/excel/route.ts:48: ws.columns = activeFields.map(f => ({ width: Math.max(5, Math.round(f.weight / totalWeight * 80)) }));
app/api/trailer-trips/excel/route.ts:80: const hRow = ws.addRow(activeFields.map(f => f.label));
app/api/trailer-trips/excel/route.ts:85: trips.forEach((t, idx) => {
app/api/trailer-trips/excel/route.ts:86: const row = ws.addRow(activeFields.map(f => getCellValue(t, f.key, idx + 1)));
app/api/trailer-trips/excel/route.ts:129: ? fieldsParam.split(',').map(k => TRAILER_FIELDS.find(f => f.key === k)).filter((f): f is FieldDef => !!f)
app/api/trailer-trips/excel/route.ts:134: const idList = idsParam.split(',').map(v => parseInt(v)).filter(n => !isNaN(n));
app/api/trips/bulk-pay/route.ts:42: where: { id: { in: trips.map(t => t.id) } },
app/api/trips/bulk-pay/route.ts:60: where: { id: { in: unpaid.map(t => t.id) } },
app/api/income/sources/route.ts:18: const tripIds = incomes.map(i => i.tripId).filter((x): x is number => x != null);
app/api/income/sources/route.ts:19: const trailerTripIds = incomes.map(i => i.trailerTripId).filter((x): x is number => x != null);
app/api/income/sources/route.ts:20: const tripGroupIds = Array.from(new Set(incomes.map(i => i.tripGroupId).filter((x): x is string => !!x)));
app/api/income/sources/route.ts:21: const trailerGroupIds = Array.from(new Set(incomes.map(i => i.trailerGroupId).filter((x): x is string => !!x)));
app/api/income/sources/route.ts:40: for (const rows of [tc, ttc, gtc, gttc]) {
app/api/income/sources/route.ts:41: for (const r of rows) if (r.client) set.add(r.client);
app/api/income/calendar/route.ts:25: for (const log of logs) {
app/api/trips/route.ts:44: const ids = idsParam.split(',').map(Number).filter(n => !isNaN(n) && n > 0);
app/api/trips/excel/route.ts:43: ws.columns = activeFields.map(f => ({ width: Math.max(5, Math.round(f.weight / totalWeight * 80)) }));
app/api/trips/excel/route.ts:76: const hRow = ws.addRow(activeFields.map(f => f.label));
app/api/trips/excel/route.ts:81: trips.forEach((t, idx) => {
app/api/trips/excel/route.ts:82: const row = ws.addRow(activeFields.map(f => getCellValue(t, f.key, idx + 1)));
app/api/trips/excel/route.ts:132: ? fieldsParam.split(',').map(k => GENERAL_FIELDS.find(f => f.key === k)).filter((f): f is FieldDef => !!f)
app/api/trips/excel/route.ts:137: const idList = idsParam.split(',').map(v => parseInt(v)).filter(n => !isNaN(n));
app/api/trips/clients/route.ts:17: const clients = rows.map(r => r.client!).filter(Boolean).sort((a, b) => a.localeCompare(b, 'ko'));
app/api/expenses/route.ts:42: return NextResponse.json({ categories: rows.map(r => r.category) });
app/api/trips/pdf/route.ts:30: for (let i = 0; i < arr.length; i += n) r.push(arr.slice(i, i + n));
app/api/trips/pdf/route.ts:60: const cols = activeFields.map(f => ``).join('');
app/api/trips/pdf/route.ts:61: const ths = activeFields.map(f => `${f.label} | `).join('');
app/api/trips/pdf/route.ts:63: const dataRows = Array.from({ length: rows }).map((_, i) => {
app/api/trips/pdf/route.ts:66: const tds = activeFields.map(f => {
app/api/trips/pdf/route.ts:136: const body = (pages.length > 0 ? pages : [[]]).map(
app/api/trips/pdf/route.ts:181: ? fieldsParam.split(',').map(k => GENERAL_FIELDS.find(f => f.key === k)).filter((f): f is FieldDef => !!f)
app/api/trips/pdf/route.ts:186: const idList = idsParam.split(',').map(v => parseInt(v)).filter(n => !isNaN(n));
app/api/trips/[id]/route.ts:51: for (const k of allowed) {
app/api/clients/route.ts:24: .map(r => r.client)
app/api/trips/calendar/route.ts:25: for (const trip of trips) {
app/api/expenses/calendar/route.ts:25: for (const exp of expenses) {
app/api/cron/purge-data-reset/route.ts:17: for (const p of due) {
app/api/stats/route.ts:72: for (let i = 5; i >= 0; i--) {
app/api/stats/route.ts:89: allTrips.forEach(t => {
app/api/stats/route.ts:93: allExpenses.forEach(e => {
app/api/stats/route.ts:98: const chartData = Object.entries(monthlyStats).map(([name, data]) => ({
app/api/data-import/route.ts:92: for (const sheetName of wb.SheetNames) {
app/api/data-import/route.ts:98: const data = rows.map(r => ({
app/api/data-import/route.ts:129: const data = rows.map(r => ({
app/api/data-import/route.ts:147: const data = rows.map(r => ({
app/api/data-import/route.ts:161: const data = rows.map(r => {
app/api/data-import/route.ts:192: const data = rows.map(r => ({
app/api/expenses/[id]/route.ts:32: for (const k of allowed) {
app/api/user/default-view/route.ts:20: for (const k of ALLOWED_KEYS) {
app/api/invoices/calendar/route.ts:25: for (const trip of trips) {
app/api/fuel/analyze/route.ts:136: const items: FuelItem[] = parsed.items.map((it: FuelItem) => ({ ...autoCorrect(it), type: it.type ?? null }));
app/api/fuel/subsidy/route.ts:47: for (const log of historyLogs) {
app/api/fuel/subsidy/route.ts:53: for (let i = 11; i >= 0; i--) {
app/api/fuel/calendar/route.ts:28: for (const log of logs) {
app/api/locations/route.ts:27: loadingLocs.forEach(t => { if (t.loadingLoc) locSet.add(t.loadingLoc); });
app/api/locations/route.ts:28: unloadingLocs.forEach(t => { if (t.unloadingLoc) locSet.add(t.unloadingLoc); });
app/api/invoices/route.ts:50: for (const t of trailerTrips) {
app/api/invoices/route.ts:60: for (const t of trips) {
app/api/invoices/route.ts:68: ...tripIndividual.map(t => ({
app/api/invoices/route.ts:75: ...Array.from(tripGroupMap.entries()).map(([groupId, ts]) => {
app/api/invoices/route.ts:85: ...trailerIndividual.map(t => ({
app/api/invoices/route.ts:92: ...Array.from(trailerGroupMap.entries()).map(([groupId, ts]) => {
app/api/feature-requests/[id]/route.ts:62: return NextResponse.json({ error: parsed.error.issues.map(i => i.message).join(', ') }, { status: 400 });
app/api/maintenance/route.ts:48: data: details.map((d: { itemName: string; partsCost?: number; laborCost?: number; amount?: number }) => ({
app/api/maintenance/[id]/route.ts:39: data: details.map((d: { itemName: string; partsCost?: number; laborCost?: number; amount?: number }) => ({
app/api/maintenance/intervals/route.ts:31: data: settings.map(s => ({
app/api/admin/permissions/[userId]/route.ts:37: for (const key of TOGGLABLE_PERMISSIONS) {
app/api/feature-requests/route.ts:50: return NextResponse.json({ error: parsed.error.issues.map(i => i.message).join(', ') }, { status: 400 });
app/api/admin/users/bulk/route.ts:74: ids.forEach(id => invalidateUserCache(id));
app/api/admin/users/bulk/route.ts:79: ids.forEach(id => invalidateUserCache(id));
app/api/admin/worklog/route.ts:49: return NextResponse.json({ error: parsed.error.issues.map(i => i.message).join(', ') }, { status: 400 });
app/api/admin/worklog/[id]/route.ts:31: return NextResponse.json({ error: parsed.error.issues.map(i => i.message).join(', ') }, { status: 400 });
app/api/help-ai/route.ts:22: if (hits.size > 200) for (const [k, v] of hits) if (v.every(t => now - t >= RATE_WINDOW_MS)) hits.delete(k);
app/api/help-ai/route.ts:47: .map((m): ChatMsg | null => {
lib/validators.ts:116: return err.issues.map(i => i.message).join(', ');
lib/permissions.ts:124: for (const key of TOGGLABLE_PERMISSIONS) {
lib/permissions.ts:141: for (const p of TOGGLABLE_PERMISSIONS) {
lib/permissions.ts:145: for (const p of ADMIN_ONLY_PERMISSIONS) {
lib/chosung.ts:5: return [...str].map(ch => {
lib/helpAi.ts:28: const docs = articles.map(a => `### ${a.title}\n${a.content}`).join('\n\n');
lib/helpAi.ts:35: contents: messages.map(m => ({ role: m.role, parts: [{ text: m.text }] })),
lib/authOptions.ts:19: for (const [k] of sorted.slice(0, userCache.size - USER_CACHE_MAX + 500)) userCache.delete(k);
lib/rateLimit.ts:18: for (const [k] of toDelete) buckets.delete(k);
lib/rateLimit.test.ts:19: for (let i = 0; i < 5; i++) {
lib/rateLimit.test.ts:28: for (let i = 0; i < 5; i++) checkRateLimit(key, 5, 60_000);
lib/rateLimit.test.ts:39: for (let i = 0; i < 5; i++) checkRateLimit(a, 5, 60_000);
lib/fuelSubsidy.ts:19: for (let i = 0; i < TONNAGE_THRESHOLDS.length; i++) {
lib/push.ts:62: await Promise.all(subs.map(async sub => {
lib/fuelSubsidy.test.ts:15: for (let i = 1; i < TONNAGE_OPTIONS.length; i++) {