[MVPTN-37] feat(Pedido): Cria endpoints e recursos para estornar e ativar um item do pedido
This commit is contained in:
parent
6b6f2e4fc8
commit
58630f8602
11 changed files with 215 additions and 31 deletions
|
|
@ -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>;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -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);
|
||||
|
|
@ -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 };
|
||||
};
|
||||
|
|
@ -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 };
|
||||
};
|
||||
|
|
@ -24,6 +24,6 @@ export const useTServicoPedidoShowHook = () => {
|
|||
|
||||
};
|
||||
|
||||
return { TServicoPedido, showTServicoPedido };
|
||||
return { TServicoPedido, setTServicoPedido, showTServicoPedido };
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -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);
|
||||
Loading…
Add table
Reference in a new issue