import type { Route } from './+types/route' import { DateTime } from 'luxon' import { Suspense } from 'react' import { ClockIcon } from 'lucide-react' import { request as req } from '@repo/util/request' import { Skeleton } from '@repo/ui/components/skeleton' import { Await } from 'react-router' import { billingPeriod, formatDate } from './util' import { Card, CardContent } from '@repo/ui/components/ui/card' import { Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow } from '@repo/ui/components/ui/table' import { Abbr } from '@repo/ui/components/abbr' import { Button } from '@repo/ui/components/ui/button' import { RangePeriod } from './range-period' import { statuses } from './data' import { cn } from '@repo/ui/lib/utils' export function meta({}) { return [{ title: 'Resumo de cobranças' }] } export async function loader({ context, request, params }: Route.LoaderArgs) { const { searchParams } = new URL(request.url) const subscription = await req({ url: `/orgs/${params.orgid}/subscription`, context, request }).then((r) => r.json()) const [startDate, endDate] = billingPeriod( subscription?.billing_day || 1, new Date() ) const start = searchParams.get('start') || formatDate(startDate) const end = searchParams.get('end') || formatDate(endDate) const billing = req({ url: `/orgs/${params.orgid}/billing?start_date=${start}&end_date=${end}`, context, request }).then((r) => r.json()) return { subscription, billing, startDate: DateTime.fromISO(start).toJSDate(), endDate: DateTime.fromISO(end).toJSDate() } } export default function Route({ loaderData: { subscription, billing, startDate, endDate } }: Route.ComponentProps) { const sk = `START#${formatDate(startDate)}#END#${formatDate(endDate)}` return ( <> }>

Resumo de cobranças

Acompanhe as cobranças em tempo real e garanta mais eficiência no controle financeiro.

{({ items = [], ...billing }) => { const { icon: Icon, label: status, color } = statuses?.[billing?.status || 'CLOSED'] return (
Colaborador Curso Matriculado por Matriculado em Valor unit. {items ?.filter((item) => 'course' in item) ?.map( ( { user, course, author: created_by, unit_price, enrolled_at }, index ) => ( {user.name} {course.name} {created_by ? created_by.name : 'N/A'} {datetime.format(new Date(enrolled_at))} {currency.format(unit_price)} ) )} {items.length === 0 && ( Nenhum resultado. )} Total {currency.format( items ?.filter((item) => 'course' in item) ?.reduce( (acc, { unit_price }) => acc + unit_price, 0 ) )}
) }}
) } const currency = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }) const datetime = new Intl.DateTimeFormat('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })