This commit is contained in:
2025-12-11 23:19:43 -03:00
parent 7a9a3ba543
commit 979ef22126
3 changed files with 36 additions and 12 deletions

View File

@@ -307,6 +307,8 @@ def enroll_later(enrollment: Enrollment, context: Context):
exc_cls=DeduplicationConflictError, exc_cls=DeduplicationConflictError,
) )
return enrollment
def date_to_midnight(dt: date) -> datetime: def date_to_midnight(dt: date) -> datetime:
return datetime.combine(dt, time(0, 0)).replace(tzinfo=pytz.timezone(TZ)) return datetime.combine(dt, time(0, 0)).replace(tzinfo=pytz.timezone(TZ))

View File

@@ -7,7 +7,8 @@ import {
CalendarIcon, CalendarIcon,
UserIcon, UserIcon,
BanIcon, BanIcon,
PlusIcon PlusIcon,
XIcon
} from 'lucide-react' } from 'lucide-react'
import { Link } from 'react-router' import { Link } from 'react-router'
import { Suspense } from 'react' import { Suspense } from 'react'
@@ -46,6 +47,7 @@ import { Skeleton } from '@repo/ui/components/skeleton'
import { Await } from 'react-router' import { Await } from 'react-router'
import { Abbr } from '@repo/ui/components/abbr' import { Abbr } from '@repo/ui/components/abbr'
import { Button } from '@repo/ui/components/ui/button' import { Button } from '@repo/ui/components/ui/button'
import { Badge } from '@repo/ui/components/ui/badge'
export function meta({}: Route.MetaArgs) { export function meta({}: Route.MetaArgs) {
return [{ title: 'Relatório de matrículas' }] return [{ title: 'Relatório de matrículas' }]
@@ -88,12 +90,13 @@ export default function Route({ loaderData: { data } }: Route.ComponentProps) {
</BreadcrumbList> </BreadcrumbList>
</Breadcrumb> </Breadcrumb>
<Await resolve={data} errorElement={<NotFound />}> {/*<Await resolve={data} errorElement={<NotFound />}>*/}
<Await resolve={data}>
{({ enrolled, scheduled, sk, created_by }) => { {({ enrolled, scheduled, sk, created_by }) => {
const succeed = enrolled.filter( const succeed = enrolled?.filter(
({ status }) => status === 'success' ({ status }) => status === 'success'
) )
const failed = enrolled.filter(({ status }) => status === 'fail') const failed = enrolled?.filter(({ status }) => status === 'fail')
return ( return (
<div className="lg:max-w-4xl mx-auto space-y-2.5"> <div className="lg:max-w-4xl mx-auto space-y-2.5">
@@ -156,8 +159,25 @@ export default function Route({ loaderData: { data } }: Route.ComponentProps) {
</AlertTitle> </AlertTitle>
<AlertDescription> <AlertDescription>
<ul className="list-decimal list-inside"> <ul className="list-decimal list-inside">
<li>...</li> {scheduled.map(
<li>...</li> ({ output, input_record, status }, index) =>
status === 'success' ? (
<li className="space-x-1" key={index}>
<Abbr>{output.user.name}</Abbr>
<span>&mdash;</span>
<Abbr>{output.course.name}</Abbr>
</li>
) : (
<li className="space-x-1" key={index}>
<Abbr>{input_record.user.name}</Abbr>
<span>&mdash;</span>
<Abbr>{input_record.course.name}</Abbr>
<span className=" text-red-500 lowercase">
(Agendado anteriormente)
</span>
</li>
)
)}
</ul> </ul>
</AlertDescription> </AlertDescription>
</Alert> </Alert>
@@ -174,11 +194,9 @@ export default function Route({ loaderData: { data } }: Route.ComponentProps) {
<CalendarIcon className="size-3.5" /> <CalendarIcon className="size-3.5" />
{formatted.format(new Date(sk))} {formatted.format(new Date(sk))}
</li> </li>
{created_by && (
<li> <li>
<UserIcon className="size-3.5" /> {created_by.name} <UserIcon className="size-3.5" /> {created_by.name}
</li> </li>
)}
</ul> </ul>
</CardFooter> </CardFooter>
</Card> </Card>

View File

@@ -1,4 +1,5 @@
import { z } from 'zod' import { z } from 'zod'
import { format } from 'date-fns'
export const MAX_ITEMS = 50 export const MAX_ITEMS = 50
@@ -30,7 +31,10 @@ export const enrollment = z.object({
offset_days: z.number() offset_days: z.number()
}) })
.optional(), .optional(),
scheduled_for: z.date().optional() scheduled_for: z
.date()
.optional()
.transform((date) => (date ? format(date, 'yyyy-MM-dd') : undefined))
}) })
export const formSchema = z.object({ export const formSchema = z.object({