feat: add product domain and machine integration

- extend Prisma schema with products, product constructs and link tables\n- introduce product service, DTOs and includes with constructeur support\n- integrate product selections across model type skeletons, composants, pièces and machines\n- validate product requirements when building machine skeletons and payloads
This commit is contained in:
Matthieu
2025-11-05 15:34:42 +01:00
parent e81f71e3e7
commit 6cf2b566ce
38 changed files with 2601 additions and 120 deletions

View File

@@ -45,6 +45,10 @@ export class CreateComposantDto {
@IsOptional()
@IsObject()
structure?: Record<string, any>;
@IsOptional()
@IsString()
productId?: string;
}
export class UpdateComposantDto {
@@ -73,4 +77,9 @@ export class UpdateComposantDto {
@IsOptional()
@IsObject()
structure?: Record<string, any>;
@IsOptional()
@Transform(({ value }) => (value === '' ? null : value))
@IsString()
productId?: string | null;
}

View File

@@ -11,6 +11,7 @@ export enum CustomFieldEntityType {
MACHINE = 'machine',
COMPOSANT = 'composant',
PIECE = 'piece',
PRODUCT = 'product',
}
export class CustomFieldEntityParamsDto {
@@ -76,6 +77,10 @@ export class CreateCustomFieldValueDto {
@IsOptional()
@IsString()
pieceId?: string;
@IsOptional()
@IsString()
productId?: string;
}
export class UpdateCustomFieldValueDto {

View File

@@ -31,6 +31,10 @@ export class CreateDocumentDto {
@IsOptional()
@IsString()
siteId?: string;
@IsOptional()
@IsString()
productId?: string;
}
export class UpdateDocumentDto {
@@ -57,4 +61,20 @@ export class UpdateDocumentDto {
@IsOptional()
@IsString()
siteId?: string;
@IsOptional()
@IsString()
machineId?: string;
@IsOptional()
@IsString()
composantId?: string;
@IsOptional()
@IsString()
pieceId?: string;
@IsOptional()
@IsString()
productId?: string;
}

View File

@@ -28,6 +28,10 @@ export class MachineComponentLinkPayloadDto {
@IsString()
composantId?: string;
@IsOptional()
@IsString()
productId?: string;
@IsOptional()
@IsString()
componentId?: string;
@@ -97,6 +101,10 @@ export class MachinePieceLinkPayloadDto {
@IsString()
composantId?: string;
@IsOptional()
@IsString()
productId?: string;
@IsOptional()
@IsString()
parentLinkId?: string;
@@ -142,6 +150,59 @@ export class MachinePieceLinkPayloadDto {
overrides?: Record<string, unknown>;
}
export class MachineProductLinkPayloadDto {
@IsOptional()
@IsString()
id?: string;
@IsOptional()
@IsString()
linkId?: string;
@IsString()
requirementId: string;
@IsOptional()
@IsString()
productId?: string;
@IsOptional()
@IsString()
typeProductId?: string;
@IsOptional()
@IsString()
parentLinkId?: string;
@IsOptional()
@IsString()
parentComponentLinkId?: string;
@IsOptional()
@IsString()
parentPieceLinkId?: string;
@IsOptional()
@IsString()
parentRequirementId?: string;
@IsOptional()
@IsString()
parentComponentRequirementId?: string;
@IsOptional()
@IsString()
parentPieceRequirementId?: string;
@IsOptional()
@IsString()
parentMachineComponentRequirementId?: string;
@IsOptional()
@IsString()
parentMachinePieceRequirementId?: string;
}
export class CreateMachineDto {
@IsString()
name: string;
@@ -177,6 +238,12 @@ export class CreateMachineDto {
@ValidateNested({ each: true })
@Type(() => MachinePieceLinkPayloadDto)
pieceLinks?: MachinePieceLinkPayloadDto[];
@IsOptional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => MachineProductLinkPayloadDto)
productLinks?: MachineProductLinkPayloadDto[];
}
export class UpdateMachineDto {
@@ -214,7 +281,14 @@ export class ReconfigureMachineDto {
@ValidateNested({ each: true })
@Type(() => MachinePieceLinkPayloadDto)
pieceLinks?: MachinePieceLinkPayloadDto[];
@IsOptional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => MachineProductLinkPayloadDto)
productLinks?: MachineProductLinkPayloadDto[];
}
export type MachineComponentLinkInput = MachineComponentLinkPayloadDto;
export type MachinePieceLinkInput = MachinePieceLinkPayloadDto;
export type MachineProductLinkInput = MachineProductLinkPayloadDto;

View File

@@ -35,6 +35,10 @@ export class CreatePieceDto {
@IsOptional()
@IsString()
typeMachinePieceRequirementId?: string;
@IsOptional()
@IsString()
productId?: string;
}
export class UpdatePieceDto {
@@ -60,4 +64,9 @@ export class UpdatePieceDto {
@IsOptional()
@IsString()
typePieceId?: string;
@IsOptional()
@Transform(({ value }) => (value === '' ? null : value))
@IsString()
productId?: string | null;
}

View File

@@ -0,0 +1,28 @@
import { IsArray, IsNumber, IsOptional, IsString } from 'class-validator';
import { Transform } from 'class-transformer';
import { PartialType } from '@nestjs/mapped-types';
export class CreateProductDto {
@IsString()
name!: string;
@IsOptional()
@IsString()
reference?: string;
@IsOptional()
@Transform(({ value }) => (value === '' ? null : value))
@IsNumber({}, { message: 'supplierPrice must be a valid number' })
supplierPrice?: number | null;
@IsOptional()
@IsString()
typeProductId?: string;
@IsOptional()
@IsArray()
@IsString({ each: true })
constructeurIds?: string[];
}
export class UpdateProductDto extends PartialType(CreateProductDto) {}

View File

@@ -122,6 +122,35 @@ export class TypeMachinePieceRequirementDto {
orderIndex?: number;
}
export class TypeMachineProductRequirementDto {
@IsString()
typeProductId: string;
@IsOptional()
@IsString()
label?: string;
@IsOptional()
@IsInt()
minCount?: number;
@IsOptional()
@IsInt()
maxCount?: number | null;
@IsOptional()
@IsBoolean()
required?: boolean;
@IsOptional()
@IsBoolean()
allowNewModels?: boolean;
@IsOptional()
@IsInt()
orderIndex?: number;
}
export class CreateTypeMachineDto {
@IsString()
name: string;
@@ -161,6 +190,12 @@ export class CreateTypeMachineDto {
@ValidateNested({ each: true })
@Type(() => TypeMachinePieceRequirementDto)
pieceRequirements?: TypeMachinePieceRequirementDto[];
@IsOptional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => TypeMachineProductRequirementDto)
productRequirements?: TypeMachineProductRequirementDto[];
}
export class UpdateTypeMachineDto {
@@ -203,6 +238,12 @@ export class UpdateTypeMachineDto {
@ValidateNested({ each: true })
@Type(() => TypeMachinePieceRequirementDto)
pieceRequirements?: TypeMachinePieceRequirementDto[];
@IsOptional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => TypeMachineProductRequirementDto)
productRequirements?: TypeMachineProductRequirementDto[];
}
export class CreateTypeComposantDto {