mirror of
https://github.com/siop-spelev/siop2.git
synced 2026-08-08 12:41:54 +00:00
- migration r3_gestion (7 tables) : Partner, Part (SANS colonne de quantité), StockMovement (signé, tracé, PU figé), PurchaseOrder/Line, LaborTime (taux figé), Document (R3.2) ; User.hourlyRate administrable - API (66 opérations) : tiers ; pièces (stock = Σ mouvements, alerte sous seuil) ; entrée/ajustement (motif requis, stock jamais négatif, en transaction) ; BC Brouillon→Envoyé→Reçu (la réception crée les RECEIPT et met à jour lastUnitPrice) ; consommation sur OT (stock suffisant, PRIX FIGÉ) ; main-d'œuvre (TAUX FIGÉ, refus si taux non défini) ; WorkOrderDetail.costs ; coûts verrouillés après clôture (409) - seed : tiers/pièces/BC/taux de la maquette — OT-0341 = 505 MAD (testé) - durcissement : références OT/DEM/BC/P par SÉQUENCES Postgres (nextval) — fin des courses « max+1 » (500 sporadiques sous charge parallèle) ; 3 runs Jest complets consécutifs verts - 55 tests (92 % stmts / 74,9 % branches) dont la recette officielle : consommer sous seuil → BC → réception → réappro, prix/taux figés prouvés Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
135 lines
3.8 KiB
TypeScript
135 lines
3.8 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
HttpCode,
|
|
Param,
|
|
ParseUUIDPipe,
|
|
Patch,
|
|
Post,
|
|
Put,
|
|
} from '@nestjs/common';
|
|
import {
|
|
AssigneesUpdateSchema,
|
|
ChecklistPatchSchema,
|
|
CommentCreateSchema,
|
|
ConsumePartSchema,
|
|
LaborTimeCreateSchema,
|
|
ReportUpsertSchema,
|
|
TransitionRequestSchema,
|
|
WorkOrderCreateSchema,
|
|
type AssigneesUpdate,
|
|
type ChecklistPatch,
|
|
type CommentCreate,
|
|
type ConsumePart,
|
|
type LaborTimeCreate,
|
|
type ReportUpsert,
|
|
type TransitionRequest,
|
|
type WorkOrderCreate,
|
|
} from '@siop/shared';
|
|
import {
|
|
AuthenticatedUser,
|
|
CurrentUser,
|
|
} from '../auth/current-user.decorator';
|
|
import { ZodValidationPipe } from '../common/zod-validation.pipe';
|
|
import { RequirePermission } from '../permissions/require-permission.decorator';
|
|
import { WorkOrdersService } from './work-orders.service';
|
|
|
|
@Controller('work-orders')
|
|
export class WorkOrdersController {
|
|
constructor(private readonly workOrders: WorkOrdersService) {}
|
|
|
|
@Get()
|
|
@RequirePermission('WORK_ORDERS', 'view')
|
|
list(@CurrentUser() user: AuthenticatedUser) {
|
|
return this.workOrders.list(user);
|
|
}
|
|
|
|
@Get(':id')
|
|
@RequirePermission('WORK_ORDERS', 'view')
|
|
get(@Param('id', ParseUUIDPipe) id: string, @CurrentUser() user: AuthenticatedUser) {
|
|
return this.workOrders.get(id, user);
|
|
}
|
|
|
|
@Post()
|
|
@RequirePermission('WORK_ORDERS', 'create')
|
|
create(
|
|
@Body(new ZodValidationPipe(WorkOrderCreateSchema)) body: WorkOrderCreate,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.create(body, user);
|
|
}
|
|
|
|
@Post(':id/transition')
|
|
@HttpCode(200) // le contrat : 200, l'état change — rien n'est « créé »
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
transition(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body(new ZodValidationPipe(TransitionRequestSchema)) body: TransitionRequest,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.transition(id, body, user);
|
|
}
|
|
|
|
@Post(':id/comments')
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
comment(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body(new ZodValidationPipe(CommentCreateSchema)) body: CommentCreate,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.comment(id, body.message, user);
|
|
}
|
|
|
|
@Put(':id/assignees')
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
setAssignees(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body(new ZodValidationPipe(AssigneesUpdateSchema)) body: AssigneesUpdate,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.setAssignees(id, body, user);
|
|
}
|
|
|
|
@Put(':id/report')
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
upsertReport(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body(new ZodValidationPipe(ReportUpsertSchema)) body: ReportUpsert,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.upsertReport(id, body, user);
|
|
}
|
|
|
|
@Post(':id/consume-part')
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
consumePart(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body(new ZodValidationPipe(ConsumePartSchema)) body: ConsumePart,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.consumePart(id, body, user);
|
|
}
|
|
|
|
@Post(':id/labor')
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
addLabor(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body(new ZodValidationPipe(LaborTimeCreateSchema)) body: LaborTimeCreate,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.addLabor(id, body, user);
|
|
}
|
|
|
|
@Patch(':id/checklist/:itemId')
|
|
@RequirePermission('WORK_ORDERS', 'edit')
|
|
patchChecklist(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Param('itemId', ParseUUIDPipe) itemId: string,
|
|
@Body(new ZodValidationPipe(ChecklistPatchSchema)) body: ChecklistPatch,
|
|
@CurrentUser() user: AuthenticatedUser,
|
|
) {
|
|
return this.workOrders.patchChecklist(id, itemId, body, user);
|
|
}
|
|
}
|