- Endpoint GET /orders/erp/:idPedido para pedidos do histórico ERP
(endpoint estático antes de /:id com ParseUUIDPipe, sem conflito)
- JOIN vw_peditens_erp + vw_produtos: itens com codigo + descricao do produto
- forma_pagamento direto da vw_pedidos_erp (ex: "28/35/42 DIAS")
- Retorna PedidoDetail completo: totais, ipi, icmsst, comissao, obs
- Frontend: useOrderDetail detecta 'erp-*' → chama /orders/erp/{id}
- OrderDetailPage: Cond. Pagamento nas Descriptions; oculta botões
Transmitir/Aprovar/Recusar para pedidos ERP (read-only)
- PedidoItemSchema.id relaxado de uuid() para string() (ERP usa '{id}-{ordem}')
- PedidoDetailSchema: campo formaPagamento opcional adicionado
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
ForbiddenException,
|
|
Get,
|
|
HttpCode,
|
|
Param,
|
|
ParseIntPipe,
|
|
ParseUUIDPipe,
|
|
Patch,
|
|
Post,
|
|
Query,
|
|
} from '@nestjs/common';
|
|
import { ClsService } from 'nestjs-cls';
|
|
import { createZodDto } from 'nestjs-zod';
|
|
import {
|
|
AprovarPedidoSchema,
|
|
CreatePedidoSchema,
|
|
PedidoListQuerySchema,
|
|
RecusarPedidoSchema,
|
|
type AprovarPedido,
|
|
type CreatePedido,
|
|
type PedidoDetail,
|
|
type PedidoListQuery,
|
|
type PedidoListResponse,
|
|
type RecusarPedido,
|
|
} from '@sar/api-interface';
|
|
import type { WorkspaceClsStore } from '../workspace/workspace.types';
|
|
import { OrdersService } from './orders.service';
|
|
|
|
class PedidoListQueryDto extends createZodDto(PedidoListQuerySchema) {}
|
|
class CreatePedidoDto extends createZodDto(CreatePedidoSchema) {}
|
|
class AprovarPedidoDto extends createZodDto(AprovarPedidoSchema) {}
|
|
class RecusarPedidoDto extends createZodDto(RecusarPedidoSchema) {}
|
|
|
|
@Controller({ path: 'orders' })
|
|
export class OrdersController {
|
|
constructor(
|
|
private readonly orders: OrdersService,
|
|
private readonly cls: ClsService<WorkspaceClsStore>,
|
|
) {}
|
|
|
|
@Get()
|
|
list(@Query() query: PedidoListQueryDto): Promise<PedidoListResponse> {
|
|
const parsed = PedidoListQuerySchema.parse(query) as PedidoListQuery;
|
|
return this.orders.list(parsed);
|
|
}
|
|
|
|
@Post()
|
|
@HttpCode(201)
|
|
create(@Body() body: CreatePedidoDto): Promise<PedidoDetail> {
|
|
const parsed = CreatePedidoSchema.parse(body) as CreatePedido;
|
|
return this.orders.create(parsed);
|
|
}
|
|
|
|
@Patch(':id/transmit')
|
|
transmit(@Param('id', ParseUUIDPipe) id: string): Promise<PedidoDetail> {
|
|
return this.orders.transmit(id);
|
|
}
|
|
|
|
@Patch(':id/approve')
|
|
approve(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body() body: AprovarPedidoDto,
|
|
): Promise<PedidoDetail> {
|
|
const role = this.cls.get('role') ?? 'rep';
|
|
if (role === 'rep') throw new ForbiddenException('Apenas supervisores podem aprovar pedidos');
|
|
const parsed = AprovarPedidoSchema.parse(body) as AprovarPedido;
|
|
return this.orders.approve(id, parsed);
|
|
}
|
|
|
|
@Patch(':id/reject')
|
|
reject(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body() body: RecusarPedidoDto,
|
|
): Promise<PedidoDetail> {
|
|
const role = this.cls.get('role') ?? 'rep';
|
|
if (role === 'rep') throw new ForbiddenException('Apenas supervisores podem recusar pedidos');
|
|
const parsed = RecusarPedidoSchema.parse(body) as RecusarPedido;
|
|
return this.orders.reject(id, parsed);
|
|
}
|
|
|
|
@Get('erp/:idPedido')
|
|
findOneErp(@Param('idPedido', ParseIntPipe) idPedido: number): Promise<PedidoDetail> {
|
|
return this.orders.findOneErp(idPedido);
|
|
}
|
|
|
|
@Get(':id')
|
|
findOne(@Param('id', ParseUUIDPipe) id: string): Promise<PedidoDetail> {
|
|
return this.orders.findOne(id);
|
|
}
|
|
}
|