diff --git a/src/app/(authenticated)/admin/food/_components/dre-report.tsx b/src/app/(authenticated)/admin/food/_components/dre-report.tsx
index be395e03..233309da 100644
--- a/src/app/(authenticated)/admin/food/_components/dre-report.tsx
+++ b/src/app/(authenticated)/admin/food/_components/dre-report.tsx
@@ -15,6 +15,7 @@ import { format, startOfMonth, endOfMonth } from "date-fns"
import { ptBR } from "date-fns/locale"
import { Calculator, FileText, Eye, FileSpreadsheet, ChevronDown, ChevronRight, ExternalLink } from "lucide-react"
import * as XLSX from "xlsx"
+import { formatOrderDate } from "@/lib/date-utils"
import {
Dialog,
DialogContent,
@@ -731,7 +732,7 @@ export default function DREReport({ selectedDate, onOpenOrder }: DREReportProps)
{order.menuItem.name}
- Pedido do dia {format(new Date(order.orderDate), "dd/MM/yyyy", { locale: ptBR })} - feito às {format(new Date(order.orderTime), "HH:mm", { locale: ptBR })} + Pedido do dia {formatOrderDate(order.orderDate)} - feito às {format(new Date(order.orderTime), "HH:mm", { locale: ptBR })}
{order.observations && (diff --git a/src/app/(authenticated)/food/page.tsx b/src/app/(authenticated)/food/page.tsx index 8996dd0d..39ded356 100644 --- a/src/app/(authenticated)/food/page.tsx +++ b/src/app/(authenticated)/food/page.tsx @@ -12,6 +12,7 @@ import { toast } from "sonner" import { format } from "date-fns" import { ptBR } from "date-fns/locale" import { addDays, startOfDay } from "date-fns" +import { formatOrderDate } from "@/lib/date-utils" const FOOD_ORDER_DEADLINE_HOUR = Number(process.env.NEXT_PUBLIC_FOOD_ORDER_DEADLINE_HOUR ?? 9) @@ -138,11 +139,10 @@ export default function FoodPage() { const restaurants = api.restaurant.listActive.useQuery() // Buscar itens do menu do restaurante selecionado - // Definir a data do pedido conforme a regra de horário (UTC-3) + // Definir a data do pedido conforme a regra de horário const now = new Date() - const brasiliaTime = new Date(now.getTime() - 3 * 60 * 60 * 1000) // UTC-3 - const today = startOfDay(brasiliaTime) - const tomorrow = startOfDay(addDays(brasiliaTime, 1)) + const today = startOfDay(now) + const tomorrow = startOfDay(addDays(now, 1)) const menuDate = now.getHours() < FOOD_ORDER_DEADLINE_HOUR ? today : tomorrow; const menuItems = api.menuItem.byRestaurant.useQuery( { restaurantId: selectedRestaurant, date: menuDate }, @@ -607,7 +607,7 @@ export default function FoodPage() {
{order.restaurant?.name}
{order.menuItem.name}
- {format(new Date(order.orderDate), "dd/MM/yyyy", { locale: ptBR })} + {formatOrderDate(order.orderDate)}
{order.observations && (Obs: {order.observations}
diff --git a/src/components/forms/create-manual-response-dialog.tsx b/src/components/forms/create-manual-response-dialog.tsx index 2010f9d0..db1d08aa 100644 --- a/src/components/forms/create-manual-response-dialog.tsx +++ b/src/components/forms/create-manual-response-dialog.tsx @@ -1,6 +1,6 @@ "use client" - -import { useState } from "react" + +import { useState, useMemo, useEffect } from "react" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { z } from "zod" @@ -25,6 +25,7 @@ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, Command import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Check, ChevronsUpDown } from "lucide-react" import { cn } from "@/lib/utils" +import { matchesSearch } from "@/lib/search-utils" import type { Field } from "@/lib/form-types" interface CreateManualResponseDialogProps { @@ -47,8 +48,17 @@ export function CreateManualResponseDialog({ const [userSearchOpen, setUserSearchOpen] = useState(false) const [userSearchValue, setUserSearchValue] = useState("") - // Buscar todos os usuários - const { data: allUsers = [], isLoading: isLoadingUsers } = api.user.listAll.useQuery() + // Buscar todos os usuários ativos com revalidação garantida + const { data: allUsers = [], isLoading: isLoadingUsers, refetch: refetchUsers } = api.user.listAll.useQuery(undefined, { + staleTime: 0, + refetchOnWindowFocus: true, + }) + + useEffect(() => { + if (open) { + void refetchUsers() + } + }, [open, refetchUsers]) // Criar schema dinâmico baseado nos campos do formulário const createSchema = () => { @@ -174,17 +184,29 @@ export function CreateManualResponseDialog({ } } - // Filtrar usuários baseado na busca - const filteredUsers = allUsers.filter((user) => { - if (!userSearchValue.trim()) return true - const search = userSearchValue.toLowerCase() - const fullName = `${user.firstName ?? ""} ${user.lastName ?? ""}`.trim().toLowerCase() - return ( - fullName.includes(search) || - user.email.toLowerCase().includes(search) || - (user.setor?.toLowerCase().includes(search)) - ) - }) + // Filtrar usuários baseado na busca normalizada (sem acento, case-insensitive, sem caracteres especiais) + const filteredUsers = useMemo(() => { + if (!userSearchValue.trim()) return allUsers + + return allUsers.filter((user) => { + const fullName = `${user.firstName ?? ""} ${user.lastName ?? ""}`.trim() + const filialName = user.filial?.name ?? "" + const filialCode = user.filial?.code ?? "" + const matricula = user.matricula ?? "" + const email = user.email ?? "" + const setor = user.setor ?? "" + + return matchesSearch( + userSearchValue, + fullName, + email, + setor, + matricula, + filialName, + filialCode + ) + }) + }, [allUsers, userSearchValue]) const selectedUser = allUsers.find((u) => u.id === selectedUserId) @@ -220,47 +242,61 @@ export function CreateManualResponseDialog({