'use client'; import type { DeclarationDto } from '@impuestos/contracts'; import { formatGs, formatMonthName, type Locale } from '@impuestos/i18n'; import { addMonths, formatPeriod } from '@impuestos/rules'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { FileCheck } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { EmptyState } from '@/components/ui/empty-state'; import { Skeleton } from '@/components/ui/skeleton'; import { Link, useRouter } from '@/i18n/navigation'; import { useT } from '@/i18n/t'; import { api } from '@/lib/api'; import { cn } from '@/lib/utils'; /** Flow D1: grouped by year, newest first, with a way to prepare the open period. */ export function DeclarationsScreen({ locale }: { locale: string }) { const t = useT(); const router = useRouter(); const queryClient = useQueryClient(); const declarations = useQuery({ queryKey: ['declarations'], queryFn: ({ signal }) => api.listDeclarations(undefined, signal), }); // The month just closed is the one there is a complete picture for. const now = new Date(); const openPeriod = addMonths(formatPeriod(now.getUTCFullYear(), now.getUTCMonth() + 1), -1); const alreadyPrepared = declarations.data?.items.some( (item) => item.formCode === '120' && item.period === openPeriod, ); const generate = useMutation({ mutationFn: () => api.generateDeclaration({ formCode: '120', period: openPeriod }), onSuccess: async (declaration) => { await queryClient.invalidateQueries({ queryKey: ['declarations'] }); router.push(`/declaraciones/${declaration.id}`); }, }); const byYear = groupByYear(declarations.data?.items ?? []); return (
{t('decl.generate', { form: '120', period: formatMonthName(locale as Locale, openPeriod) })}
{generate.isError ? ({t('common.error.generic')}
) : null}{t('common.error.generic')}