diff --git a/src/app/api/reports/hours-by-client.csv/route.ts b/src/app/api/reports/hours-by-client.csv/route.ts index 4228d72..c14194b 100644 --- a/src/app/api/reports/hours-by-client.csv/route.ts +++ b/src/app/api/reports/hours-by-client.csv/route.ts @@ -22,6 +22,7 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url) const range = searchParams.get("range") ?? undefined const q = searchParams.get("q")?.toLowerCase().trim() ?? "" + const companyId = searchParams.get("companyId") ?? "" const client = new ConvexHttpClient(convexUrl) const tenantId = session.user.tenantId ?? DEFAULT_TENANT_ID @@ -54,7 +55,10 @@ export async function GET(request: Request) { if (q) rows.push(["Filtro", q]) rows.push([]) rows.push(["Cliente", "Avulso", "Horas internas", "Horas externas", "Horas totais", "Horas contratadas/mês", "% uso"]) - const items = q ? report.items.filter((i: any) => String(i.name).toLowerCase().includes(q)) : report.items + type Item = { companyId: string; name: string; isAvulso: boolean; internalMs: number; externalMs: number; totalMs: number; contractedHoursPerMonth: number | null } + let items = (report.items as Item[]) + if (companyId) items = items.filter((i) => String(i.companyId) === companyId) + if (q) items = items.filter((i) => i.name.toLowerCase().includes(q)) for (const item of items) { const internalH = msToHours(item.internalMs) const externalH = msToHours(item.externalMs) @@ -67,7 +71,7 @@ export async function GET(request: Request) { return new NextResponse(csv, { headers: { "Content-Type": "text/csv; charset=UTF-8", - "Content-Disposition": `attachment; filename="hours-by-client-${tenantId}-${report.rangeDays ?? '90'}d${q ? `-${encodeURIComponent(q)}` : ''}.csv"`, + "Content-Disposition": `attachment; filename="hours-by-client-${tenantId}-${report.rangeDays ?? '90'}d${companyId ? `-${companyId}` : ''}${q ? `-${encodeURIComponent(q)}` : ''}.csv"`, "Cache-Control": "no-store", }, }) diff --git a/src/components/reports/hours-report.tsx b/src/components/reports/hours-report.tsx index 691850a..796cfb7 100644 --- a/src/components/reports/hours-report.tsx +++ b/src/components/reports/hours-report.tsx @@ -12,6 +12,7 @@ import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group" import { Input } from "@/components/ui/input" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" function formatHours(ms: number) { const hours = ms / 3600000 @@ -31,6 +32,7 @@ type HoursItem = { export function HoursReport() { const [timeRange, setTimeRange] = useState("90d") const [query, setQuery] = useState("") + const [companyId, setCompanyId] = useState("all") const { session, convexUserId } = useAuth() const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID @@ -40,11 +42,14 @@ export function HoursReport() { ) as { rangeDays: number; items: HoursItem[] } | undefined const items = data?.items ?? [] + const companies = useQuery(api.companies.list, convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip") as Array<{ id: Id<"companies">; name: string }> | undefined const filtered = useMemo(() => { const q = query.trim().toLowerCase() - if (!q) return items - return items.filter((it) => it.name.toLowerCase().includes(q)) - }, [items, query]) + let list = items + if (companyId !== "all") list = list.filter((it) => String(it.companyId) === companyId) + if (q) list = list.filter((it) => it.name.toLowerCase().includes(q)) + return list + }, [items, query, companyId]) return (
@@ -60,13 +65,24 @@ export function HoursReport() { onChange={(e) => setQuery(e.target.value)} className="h-9 w-full min-w-56 sm:w-72" /> + 90 dias 30 dias 7 dias