[MVPTN-37] feat(Pedido): Cria endpoints e recursos para estornar e ativar um item do pedido

This commit is contained in:
Keven 2025-12-05 16:03:26 -03:00
parent 6b6f2e4fc8
commit 58630f8602
11 changed files with 215 additions and 31 deletions

View file

@ -3,13 +3,10 @@
import { zodResolver } from '@hookform/resolvers/zod';
import { useForm } from 'react-hook-form';
import { z } from 'zod';
import { Input } from '@/components/ui/input';
import { GUsuarioSchema } from '../../../../../../packages/administrativo/schemas/GUsuario/GUsuarioSchema';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import {
Form,
FormControl,
@ -18,8 +15,10 @@ import {
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { useGUsuarioSaveHook } from '../../../../../../packages/administrativo/hooks/GUsuario/useGUsuarioSaveHook';
import { GUsuarioSchema } from '../../../../../../packages/administrativo/schemas/GUsuario/GUsuarioSchema';
type FormValues = z.infer<typeof GUsuarioSchema>;

View file

@ -1,7 +1,10 @@
'use client';
import { Card, CardContent } from '@/components/ui/card';
import Link from 'next/link';
import { useEffect } from 'react';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import {
Table,
TableBody,
@ -10,14 +13,14 @@ import {
TableHeader,
TableRow,
} from '@/components/ui/table';
import Usuario from '../../../../../packages/administrativo/interfaces/GUsuario/GUsuarioInterface';
import { Button } from '@/components/ui/button';
import Link from 'next/link';
import { useGUsuarioIndexHook } from '../../../../../packages/administrativo/hooks/GUsuario/useGUsuarioIndexHook';
import { useEffect } from 'react';
import Loading from '@/shared/components/loading/loading';
import { useGUsuarioIndexHook } from '../../../../../packages/administrativo/hooks/GUsuario/useGUsuarioIndexHook';
import Usuario from '../../../../../packages/administrativo/interfaces/GUsuario/GUsuarioInterface';
export default function UsuarioPage() {
const { usuarios, fetchUsuarios } = useGUsuarioIndexHook();

View file

@ -8,7 +8,6 @@ import { Button } from '@/components/ui/button';
import { ButtonGroup } from '@/components/ui/button-group';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
import { useTServicoItemPedidoAtivarHook } from '@/packages/servicos/hooks/TServicoItemPedido/useTServicoItemPedidoAtivarHook';
import { useTServicoItemPedidoCancelarHook } from '@/packages/servicos/hooks/TServicoItemPedido/useTServicoItemPedidoCancelarHook';
import TServicoItemPedidoInterface from '@/packages/servicos/interfaces/TServicoItemPedido/TServicoItemPedidoIntefarce';
import TServicoItemPedidoListInterface from '@/packages/servicos/interfaces/TServicoItemPedido/TServicoItemPedidoListInterface';
@ -16,7 +15,7 @@ import FormatMoney from '@/shared/actions/money/FormatMoney';
import { useResponse } from '@/shared/components/response/ResponseContext';
import { ServicosPedidosSituacoesBadge } from '@/shared/components/servicosPedidosSituacoes/ServicosPedidosSituacoesBadge';
import { useTServicoItemPedidoAtivarHook } from '../../hooks/TServicoItemPedido/useTServicoItemPedidoAtivarHook';
export default function TServicoItemPedidoList({ items, openConfirmDialog }: TServicoItemPedidoListInterface) {

View file

@ -1,7 +1,7 @@
'use client';
import { BookmarkX, CalendarIcon, ReceiptText } from 'lucide-react';
import { BookmarkX, CalendarIcon, ReceiptText, RotateCcwIcon } from 'lucide-react';
import { useCallback, useEffect, useState } from 'react';
import { Button } from '@/components/ui/button';
@ -17,14 +17,63 @@ import { FormatDateTime } from '@/shared/actions/dateTime/FormatDateTime';
import GetCapitalize from '@/shared/actions/text/GetCapitalize';
import GetNameInitials from '@/shared/actions/text/GetNameInitials';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useResponse } from '@/shared/components/response/ResponseContext';
import { useTServicoPedidoAtivarHook } from '../../hooks/TServicoPedido/useTServicoPedidoAtivarHook';
import { useTServicoPedidoCancelarHook } from '../../hooks/TServicoPedido/useTServicoPedidoCancelarHook';
export default function TServicoPedidoDetails({ servico_pedido_id }: TServicoPedidoInterface) {
const { TServicoItemPedido, indexTServicoItemPedido } = useTServicoItemPedidoIndexHook()
const { TServicoPedido, showTServicoPedido } = useTServicoPedidoShowHook()
const [isCancelServicoPedidoDialogOpen, setIsCancelServicoPedidoDialogOpen] = useState(false)
const { setResponse } = useResponse();
const { ativarTServicoPedido } = useTServicoPedidoAtivarHook()
const { cancelarTServicoPedido } = useTServicoPedidoCancelarHook()
const { TServicoItemPedido, indexTServicoItemPedido } = useTServicoItemPedidoIndexHook()
const { TServicoPedido, setTServicoPedido, showTServicoPedido } = useTServicoPedidoShowHook()
const handleSituacaoTServicoPedido = useCallback(async (pedido: any) => {
const servicoPedido: TServicoPedidoInterface = {
servico_pedido_id: pedido.servico_pedido_id
}
let response: any = null
switch (pedido.situacao) {
case 'C':
response = await ativarTServicoPedido(servicoPedido)
break
case 'F':
response = await cancelarTServicoPedido(servicoPedido)
break
default:
setResponse({
status: 422,
error: 'Situação',
detail: 'Situação não tratada'
})
break
}
if (response) {
pedido.situacao = response.situacao
setTServicoPedido(pedido)
}
}, [cancelarTServicoPedido])
// 🔹 Estado genérico e dinâmico do ConfirmDialog
const [confirmDialog, setConfirmDialog] = useState({
isOpen: false,
title: '',
@ -89,6 +138,10 @@ export default function TServicoPedidoDetails({ servico_pedido_id }: TServicoPed
TServicoPedidoShowData()
}, [])
const isCancelado = TServicoPedido?.situacao === 'C'
const actionLabel = isCancelado ? 'Ativar Pedido' : 'Estornar Pedido'
const actionIcon = isCancelado ? <RotateCcwIcon /> : <BookmarkX />
return (
<div className="relative h-full flex flex-col px-2 sm:px-4 py-2 sm:py-4 md:px-6 container mx-auto">
<h3 className='text-4xl font-bold mb-4'>
@ -101,7 +154,6 @@ export default function TServicoPedidoDetails({ servico_pedido_id }: TServicoPed
<div className="flex flex-col flex-auto gap-4">
<TServicoItemPedidoList
items={TServicoItemPedido}
openConfirmDialog={openConfirmDialog}
/>
<TServicoPedidoDetailsPagamento
situacao={TServicoPedido?.situacao}
@ -176,23 +228,21 @@ export default function TServicoPedidoDetails({ servico_pedido_id }: TServicoPed
</CardHeader>
<CardContent className="flex flex-col gap-2">
<Button
className="w-full"
variant="outline"
className="w-full cursor-pointer"
variant={`outline`}
onClick={() =>
openConfirmDialog({
title: 'Estorno de Pedido',
description: 'Atenção',
message: 'Deseja realmente estornar este pedido?',
confirmText: 'Sim, estornar',
title: 'Estorno do pedido',
description: 'Confirmação necessária',
message: 'Deseja continuar com o estorno ?',
confirmText: 'Sim, continuar',
cancelText: 'Cancelar',
onConfirm: () => {
console.log('Pedido estornado!')
// chamada da sua action/controller
handleSituacaoTServicoPedido(TServicoPedido)
},
})
}
>
<BookmarkX /> Estornar Pedido
}>
{actionIcon} {actionLabel}
</Button>
<Button className="w-full cursor-pointer">
<ReceiptText /> Imprimir Recibo

View file

@ -0,0 +1,19 @@
import TServicoPedidoInterface from '@/packages/servicos/interfaces/TServicoPedido/TServicoPedidoInterface';
import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler';
import API from '@/shared/services/api/Api';
import { Methods } from '@/shared/services/api/enums/ApiMethodEnum';
import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface';
async function executeTServicoPedidoAtivarData(data: TServicoPedidoInterface): Promise<ApiResponseInterface> {
const api = new API();
return api.send({
method: Methods.PUT,
endpoint: `servicos/balcao/t_servico_pedido/${data.servico_pedido_id}/ativar`,
body: data,
});
}
export const TServicoPedidoAtivarData = withClientErrorHandler(executeTServicoPedidoAtivarData);

View file

@ -0,0 +1,19 @@
import TServicoPedidoInterface from '@/packages/servicos/interfaces/TServicoPedido/TServicoPedidoInterface';
import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler';
import API from '@/shared/services/api/Api';
import { Methods } from '@/shared/services/api/enums/ApiMethodEnum';
import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface';
async function executeTServicoPedidoCancelarData(data: TServicoPedidoInterface): Promise<ApiResponseInterface> {
const api = new API();
return api.send({
method: Methods.PUT,
endpoint: `servicos/balcao/t_servico_pedido/${data.servico_pedido_id}/cancelar`,
body: data,
});
}
export const TServicoPedidoCancelarData = withClientErrorHandler(executeTServicoPedidoCancelarData);

View file

@ -0,0 +1,37 @@
'use client';
import { useState } from 'react';
import TServicoPedidoInterface from '@/packages/servicos/interfaces/TServicoPedido/TServicoPedidoInterface';
import { TServicoPedidoAtivarService } from '@/packages/servicos/services/TServicoPedido/TServicoPedidoAtivarService';
import { useResponse } from '@/shared/components/response/ResponseContext';
export const useTServicoPedidoAtivarHook = () => {
const { setResponse } = useResponse();
const [TServicoPedido, setTServicoPedido] = useState<TServicoPedidoInterface | null>(null);
// controla se o formulário está aberto ou fechado
const [isOpen, setIsOpen] = useState(false);
const ativarTServicoPedido = async (data: TServicoPedidoInterface) => {
const response = await TServicoPedidoAtivarService(data);
// Armazena os dados da resposta
setTServicoPedido(response.data);
// Define os dados da resposta (toast, modal, etc.)
setResponse(response);
// Fecha o formulário automaticamente após salvar
setIsOpen(false);
// Retorna os valores de forma imediata
return response.data;
};
return { TServicoPedido, ativarTServicoPedido, isOpen, setIsOpen };
};

View file

@ -0,0 +1,37 @@
'use client';
import { useState } from 'react';
import TServicoPedidoInterface from '@/packages/servicos/interfaces/TServicoPedido/TServicoPedidoInterface';
import { TServicoPedidoCancelarService } from '@/packages/servicos/services/TServicoPedido/TServicoPedidoCancelarService';
import { useResponse } from '@/shared/components/response/ResponseContext';
export const useTServicoPedidoCancelarHook = () => {
const { setResponse } = useResponse();
const [TServicoPedido, setTServicoPedido] = useState<TServicoPedidoInterface | null>(null);
// controla se o formulário está aberto ou fechado
const [isOpen, setIsOpen] = useState(false);
const cancelarTServicoPedido = async (data: TServicoPedidoInterface) => {
const response = await TServicoPedidoCancelarService(data);
// Armazena os dados da resposta
setTServicoPedido(response.data);
// Define os dados da resposta (toast, modal, etc.)
setResponse(response);
// Fecha o formulário automaticamente após salvar
setIsOpen(false);
// Retorna os valores de forma imediata
return response.data;
};
return { TServicoPedido, cancelarTServicoPedido, isOpen, setIsOpen };
};

View file

@ -24,6 +24,6 @@ export const useTServicoPedidoShowHook = () => {
};
return { TServicoPedido, showTServicoPedido };
return { TServicoPedido, setTServicoPedido, showTServicoPedido };
};

View file

@ -0,0 +1,11 @@
import { TServicoPedidoAtivarData } from '@/packages/servicos/data/TServicoPedido/TServicoPedidoAtivarData';
import TServicoPedidoInterface from '@/packages/servicos/interfaces/TServicoPedido/TServicoPedidoInterface';
import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler';
async function executeTServicoPedidoAtivarService(data: TServicoPedidoInterface) {
const response = await TServicoPedidoAtivarData(data);
return response;
}
export const TServicoPedidoAtivarService = withClientErrorHandler(executeTServicoPedidoAtivarService);

View file

@ -0,0 +1,10 @@
import { TServicoPedidoCancelarData } from '@/packages/servicos/data/TServicoPedido/TServicoPedidoCancelarData';
import TServicoPedidoInterface from '@/packages/servicos/interfaces/TServicoPedido/TServicoPedidoInterface';
import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler';
async function executeTServicoPedidoCancelarService(data: TServicoPedidoInterface) {
const response = await TServicoPedidoCancelarData(data);
return response;
}
export const TServicoPedidoCancelarService = withClientErrorHandler(executeTServicoPedidoCancelarService);