FIx: delete champs par default

This commit is contained in:
Matthieu
2025-09-25 11:26:22 +02:00
parent e64fba3ae7
commit 2ce164784f
9 changed files with 226 additions and 200 deletions

View File

@@ -0,0 +1,3 @@
ALTER TABLE "machines" DROP COLUMN IF EXISTS "emplacement";
ALTER TABLE "composants" DROP COLUMN IF EXISTS "emplacement";
ALTER TABLE "pieces" DROP COLUMN IF EXISTS "emplacement";

View File

@@ -52,13 +52,12 @@ model TypeMachine {
} }
model Machine { model Machine {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
reference String? reference String?
prix Decimal? @db.Decimal(10, 2) prix Decimal? @db.Decimal(10, 2)
emplacement String? createdAt DateTime @default(now())
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
updatedAt DateTime @updatedAt
// Relations // Relations
siteId String siteId String
@@ -79,13 +78,12 @@ model Machine {
} }
model Composant { model Composant {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
reference String? reference String?
prix Decimal? @db.Decimal(10, 2) prix Decimal? @db.Decimal(10, 2)
emplacement String? createdAt DateTime @default(now())
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
updatedAt DateTime @updatedAt
// Relations hiérarchiques // Relations hiérarchiques
machineId String? machineId String?
@@ -115,13 +113,12 @@ model Composant {
} }
model Piece { model Piece {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
reference String? reference String?
prix Decimal? @db.Decimal(10, 2) prix Decimal? @db.Decimal(10, 2)
emplacement String? createdAt DateTime @default(now())
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt
updatedAt DateTime @updatedAt
// Relations // Relations
machineId String? machineId String?

View File

@@ -9,8 +9,16 @@ import {
MachinePieceSelectionDto, MachinePieceSelectionDto,
} from '../shared/dto/machine.dto'; } from '../shared/dto/machine.dto';
const CUSTOM_FIELD_SELECT = {
id: true,
name: true,
type: true,
required: true,
options: true,
} as const;
const TYPE_MACHINE_CONFIGURATION_INCLUDE = { const TYPE_MACHINE_CONFIGURATION_INCLUDE = {
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
componentRequirements: { componentRequirements: {
include: { include: {
typeComposant: true, typeComposant: true,
@@ -41,7 +49,7 @@ const MACHINE_DEFAULT_INCLUDE = {
sousComposants: true, sousComposants: true,
customFieldValues: { customFieldValues: {
include: { include: {
customField: true, customField: { select: CUSTOM_FIELD_SELECT },
}, },
}, },
constructeur: true, constructeur: true,
@@ -49,7 +57,7 @@ const MACHINE_DEFAULT_INCLUDE = {
include: { include: {
customFieldValues: { customFieldValues: {
include: { include: {
customField: true, customField: { select: CUSTOM_FIELD_SELECT },
}, },
}, },
constructeur: true, constructeur: true,
@@ -67,7 +75,7 @@ const MACHINE_DEFAULT_INCLUDE = {
include: { include: {
customFieldValues: { customFieldValues: {
include: { include: {
customField: true, customField: { select: CUSTOM_FIELD_SELECT },
}, },
}, },
constructeur: true, constructeur: true,
@@ -81,7 +89,7 @@ const MACHINE_DEFAULT_INCLUDE = {
}, },
customFieldValues: { customFieldValues: {
include: { include: {
customField: true, customField: { select: CUSTOM_FIELD_SELECT },
}, },
}, },
documents: true, documents: true,
@@ -472,6 +480,19 @@ export class MachinesService {
} }
} }
private extractCustomFieldValue(field: any): string | undefined {
if (
field &&
Object.prototype.hasOwnProperty.call(field, 'value')
) {
const rawValue = field.value;
return rawValue === undefined || rawValue === null
? ''
: String(rawValue);
}
return undefined;
}
private normalizeComponentSelection( private normalizeComponentSelection(
selection: MachineComponentSelectionDto, selection: MachineComponentSelectionDto,
requirement: any, requirement: any,
@@ -491,8 +512,6 @@ export class MachinesService {
'Composant'; 'Composant';
prepared.reference = prepared.reference =
prepared.reference ?? model?.structure?.reference ?? ''; prepared.reference ?? model?.structure?.reference ?? '';
prepared.emplacement =
prepared.emplacement ?? model?.structure?.emplacement ?? '';
prepared.prix = prepared.prix ?? model?.structure?.prix ?? null; prepared.prix = prepared.prix ?? model?.structure?.prix ?? null;
prepared.customFields = Array.isArray(prepared.customFields) prepared.customFields = Array.isArray(prepared.customFields)
@@ -565,6 +584,14 @@ export class MachinesService {
const customFields = Array.isArray(component.customFields) const customFields = Array.isArray(component.customFields)
? component.customFields ? component.customFields
: []; : [];
const componentFieldMap = new Map(
customFields
.filter((field) => field && typeof field.name === 'string')
.map((field) => [field.name, field]),
);
const resolveComponentValue = (fieldName: string) =>
this.extractCustomFieldValue(componentFieldMap.get(fieldName));
const componentPieces = Array.isArray(component.pieces) const componentPieces = Array.isArray(component.pieces)
? component.pieces ? component.pieces
: []; : [];
@@ -582,7 +609,7 @@ export class MachinesService {
let typeComposantId: string | null = providedTypeComposantId ?? null; let typeComposantId: string | null = providedTypeComposantId ?? null;
if (!typeComposantId && customFields.length > 0) { if (!typeComposantId && componentFieldMap.size > 0) {
let typeComposant = await prisma.modelType.findFirst({ let typeComposant = await prisma.modelType.findFirst({
where: { where: {
name: component.name, name: component.name,
@@ -604,12 +631,12 @@ export class MachinesService {
}); });
for (const customField of customFields) { for (const customField of customFields) {
if (!customField?.name) continue;
await prisma.customField.create({ await prisma.customField.create({
data: { data: {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typeComposantId: typeComposant.id, typeComposantId: typeComposant.id,
}, },
@@ -628,7 +655,6 @@ export class MachinesService {
prisma, prisma,
component.constructeur, component.constructeur,
), ),
emplacement: component.emplacement || '',
prix: component.prix ?? null, prix: component.prix ?? null,
machineId, machineId,
parentComposantId, parentComposantId,
@@ -644,16 +670,16 @@ export class MachinesService {
}); });
for (const customField of typeCustomFields) { for (const customField of typeCustomFields) {
const defaultValue = const providedValue = resolveComponentValue(customField.name);
customFields.find((cf) => cf.name === customField.name) if (providedValue !== undefined) {
?.defaultValue || ''; await prisma.customFieldValue.create({
await prisma.customFieldValue.create({ data: {
data: { value: providedValue,
value: defaultValue, customFieldId: customField.id,
customFieldId: customField.id, composantId: createdComposant.id,
composantId: createdComposant.id, },
}, });
}); }
} }
} }
@@ -663,6 +689,13 @@ export class MachinesService {
const pieceCustomFields = Array.isArray(piece.customFields) const pieceCustomFields = Array.isArray(piece.customFields)
? piece.customFields ? piece.customFields
: []; : [];
const pieceFieldMap = new Map(
pieceCustomFields
.filter((field) => field && typeof field.name === 'string')
.map((field) => [field.name, field]),
);
const resolvePieceValue = (fieldName: string) =>
this.extractCustomFieldValue(pieceFieldMap.get(fieldName));
const pieceModelId = piece.__pieceModelId ?? null; const pieceModelId = piece.__pieceModelId ?? null;
const pieceRequirementId = piece.__requirementId ?? null; const pieceRequirementId = piece.__requirementId ?? null;
const providedTypePieceId = const providedTypePieceId =
@@ -671,7 +704,7 @@ export class MachinesService {
let typePieceId: string | null = providedTypePieceId ?? null; let typePieceId: string | null = providedTypePieceId ?? null;
if (!typePieceId && pieceCustomFields.length > 0) { if (!typePieceId && pieceFieldMap.size > 0) {
let typePiece = await prisma.typePiece.findFirst({ let typePiece = await prisma.typePiece.findFirst({
where: { name: piece.name }, where: { name: piece.name },
}); });
@@ -685,12 +718,12 @@ export class MachinesService {
}); });
for (const customField of pieceCustomFields) { for (const customField of pieceCustomFields) {
if (!customField?.name) continue;
await prisma.customField.create({ await prisma.customField.create({
data: { data: {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typePieceId: typePiece.id, typePieceId: typePiece.id,
}, },
@@ -709,7 +742,6 @@ export class MachinesService {
prisma, prisma,
piece.constructeur, piece.constructeur,
), ),
emplacement: piece.emplacement || '',
prix: piece.prix ?? null, prix: piece.prix ?? null,
composantId: createdComposant.id, composantId: createdComposant.id,
typePieceId, typePieceId,
@@ -724,16 +756,16 @@ export class MachinesService {
}); });
for (const customField of typePieceCustomFields) { for (const customField of typePieceCustomFields) {
const defaultValue = const providedValue = resolvePieceValue(customField.name);
pieceCustomFields.find((cf) => cf.name === customField.name) if (providedValue !== undefined) {
?.defaultValue || ''; await prisma.customFieldValue.create({
await prisma.customFieldValue.create({ data: {
data: { value: providedValue,
value: defaultValue, customFieldId: customField.id,
customFieldId: customField.id, pieceId: createdPiece.id,
pieceId: createdPiece.id, },
}, });
}); }
} }
} }
} }
@@ -760,6 +792,13 @@ export class MachinesService {
const customFields = Array.isArray(piece.customFields) const customFields = Array.isArray(piece.customFields)
? piece.customFields ? piece.customFields
: []; : [];
const fieldMap = new Map(
customFields
.filter((field) => field && typeof field.name === 'string')
.map((field) => [field.name, field]),
);
const resolveProvidedValue = (fieldName: string) =>
this.extractCustomFieldValue(fieldMap.get(fieldName));
const pieceModelId = piece.__pieceModelId ?? null; const pieceModelId = piece.__pieceModelId ?? null;
const requirementId = piece.__requirementId ?? null; const requirementId = piece.__requirementId ?? null;
const providedTypePieceId = const providedTypePieceId =
@@ -768,7 +807,7 @@ export class MachinesService {
let typePieceId: string | null = providedTypePieceId ?? null; let typePieceId: string | null = providedTypePieceId ?? null;
if (!typePieceId && customFields.length > 0) { if (!typePieceId && fieldMap.size > 0) {
let typePiece = await prisma.typePiece.findFirst({ let typePiece = await prisma.typePiece.findFirst({
where: { name: piece.name }, where: { name: piece.name },
}); });
@@ -782,12 +821,12 @@ export class MachinesService {
}); });
for (const customField of customFields) { for (const customField of customFields) {
if (!customField?.name) continue;
await prisma.customField.create({ await prisma.customField.create({
data: { data: {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typePieceId: typePiece.id, typePieceId: typePiece.id,
}, },
@@ -806,7 +845,6 @@ export class MachinesService {
prisma, prisma,
piece.constructeur, piece.constructeur,
), ),
emplacement: piece.emplacement || '',
prix: piece.prix ?? null, prix: piece.prix ?? null,
machineId, machineId,
typePieceId, typePieceId,
@@ -821,37 +859,40 @@ export class MachinesService {
}); });
for (const customField of typePieceCustomFields) { for (const customField of typePieceCustomFields) {
const defaultValue = const providedValue = resolveProvidedValue(customField.name);
customFields.find((cf) => cf.name === customField.name) if (providedValue !== undefined) {
?.defaultValue || ''; await prisma.customFieldValue.create({
await prisma.customFieldValue.create({ data: {
data: { value: providedValue,
value: defaultValue, customFieldId: customField.id,
customFieldId: customField.id, pieceId: createdPiece.id,
pieceId: createdPiece.id, },
}, });
}); }
} }
} else if (customFields.length > 0) { } else if (fieldMap.size > 0) {
for (const customField of customFields) { for (const customField of customFields) {
if (!customField?.name) continue;
const createdCustomField = await prisma.customField.create({ const createdCustomField = await prisma.customField.create({
data: { data: {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typePieceId: null, typePieceId: null,
}, },
}); });
await prisma.customFieldValue.create({ const providedValue = this.extractCustomFieldValue(customField);
data: { if (providedValue !== undefined) {
value: customField.defaultValue || '', await prisma.customFieldValue.create({
customFieldId: createdCustomField.id, data: {
pieceId: createdPiece.id, value: providedValue,
}, customFieldId: createdCustomField.id,
}); pieceId: createdPiece.id,
},
});
}
} }
} }
} }
@@ -865,26 +906,26 @@ export class MachinesService {
for (const customField of machineCustomFields) { for (const customField of machineCustomFields) {
if (!customField || !customField.name) continue; if (!customField || !customField.name) continue;
// Créer le champ personnalisé pour la machine
const createdCustomField = await prisma.customField.create({ const createdCustomField = await prisma.customField.create({
data: { data: {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typeMachineId: null, // Ce champ sera lié à la machine individuelle typeMachineId: null, // Ce champ sera lié à la machine individuelle
}, },
}); });
// Créer la valeur par défaut pour la machine const providedValue = this.extractCustomFieldValue(customField);
await prisma.customFieldValue.create({ if (providedValue !== undefined) {
data: { await prisma.customFieldValue.create({
value: customField.defaultValue || '', data: {
customFieldId: createdCustomField.id, value: providedValue,
machineId: machineId, customFieldId: createdCustomField.id,
}, machineId,
}); },
});
}
} }
} }
@@ -1160,7 +1201,7 @@ export class MachinesService {
}, },
}, },
include: { include: {
customField: true, customField: { select: CUSTOM_FIELD_SELECT },
}, },
}); });
@@ -1171,20 +1212,21 @@ export class MachinesService {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typeMachineId: null, // Ce champ sera lié à la machine individuelle typeMachineId: null, // Ce champ sera lié à la machine individuelle
}, },
}); });
// Créer la valeur par défaut pour la machine const providedValue = this.extractCustomFieldValue(customField);
await this.prisma.customFieldValue.create({ if (providedValue !== undefined) {
data: { await this.prisma.customFieldValue.create({
value: customField.defaultValue || '', data: {
customFieldId: createdCustomField.id, value: providedValue,
machineId: machineId, customFieldId: createdCustomField.id,
}, machineId,
}); },
});
}
} }
} }
} }
@@ -1199,6 +1241,15 @@ export class MachinesService {
typeComponent.customFields && typeComponent.customFields &&
typeComponent.customFields.length > 0 typeComponent.customFields.length > 0
) { ) {
const typeComponentFields = Array.isArray(typeComponent.customFields)
? typeComponent.customFields
: [];
const typeComponentFieldMap = new Map(
typeComponentFields
.filter((field: any) => field && typeof field.name === 'string')
.map((field: any) => [field.name, field]),
);
// Créer le type de composant s'il n'existe pas // Créer le type de composant s'il n'existe pas
let typeComposant = await this.prisma.modelType.findFirst({ let typeComposant = await this.prisma.modelType.findFirst({
where: { where: {
@@ -1222,7 +1273,7 @@ export class MachinesService {
} }
// Créer les champs personnalisés pour le type de composant // Créer les champs personnalisés pour le type de composant
for (const customField of typeComponent.customFields) { for (const customField of typeComponentFields) {
const existingField = await this.prisma.customField.findFirst({ const existingField = await this.prisma.customField.findFirst({
where: { where: {
name: customField.name, name: customField.name,
@@ -1236,7 +1287,6 @@ export class MachinesService {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typeComposantId: typeComposant.id, typeComposantId: typeComposant.id,
}, },
@@ -1264,17 +1314,18 @@ export class MachinesService {
}); });
if (!existingValue) { if (!existingValue) {
const defaultValue = const providedValue = this.extractCustomFieldValue(
typeComponent.customFields.find( typeComponentFieldMap.get(customField.name),
(cf: any) => cf.name === customField.name, );
)?.defaultValue || ''; if (providedValue !== undefined) {
await this.prisma.customFieldValue.create({ await this.prisma.customFieldValue.create({
data: { data: {
value: defaultValue, value: providedValue,
customFieldId: customField.id, customFieldId: customField.id,
composantId: component.id, composantId: component.id,
}, },
}); });
}
} }
} }
@@ -1288,6 +1339,15 @@ export class MachinesService {
typePiece.customFields && typePiece.customFields &&
typePiece.customFields.length > 0 typePiece.customFields.length > 0
) { ) {
const typePieceFields = Array.isArray(typePiece.customFields)
? typePiece.customFields
: [];
const typePieceFieldMap = new Map(
typePieceFields
.filter((field: any) => field && typeof field.name === 'string')
.map((field: any) => [field.name, field]),
);
// Créer le type de pièce s'il n'existe pas // Créer le type de pièce s'il n'existe pas
let typePieceEntity = await this.prisma.modelType.findFirst({ let typePieceEntity = await this.prisma.modelType.findFirst({
where: { where: {
@@ -1312,7 +1372,7 @@ export class MachinesService {
} }
// Créer les champs personnalisés pour le type de pièce // Créer les champs personnalisés pour le type de pièce
for (const customField of typePiece.customFields) { for (const customField of typePieceFields) {
const existingField = await this.prisma.customField.findFirst({ const existingField = await this.prisma.customField.findFirst({
where: { where: {
name: customField.name, name: customField.name,
@@ -1326,7 +1386,6 @@ export class MachinesService {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typePieceId: typePieceEntity.id, typePieceId: typePieceEntity.id,
}, },
@@ -1355,17 +1414,18 @@ export class MachinesService {
}); });
if (!existingValue) { if (!existingValue) {
const defaultValue = const providedValue = this.extractCustomFieldValue(
typePiece.customFields.find( typePieceFieldMap.get(customField.name),
(cf: any) => cf.name === customField.name, );
)?.defaultValue || ''; if (providedValue !== undefined) {
await this.prisma.customFieldValue.create({ await this.prisma.customFieldValue.create({
data: { data: {
value: defaultValue, value: providedValue,
customFieldId: customField.id, customFieldId: customField.id,
pieceId: piece.id, pieceId: piece.id,
}, },
}); });
}
} }
} }
} }
@@ -1381,6 +1441,15 @@ export class MachinesService {
typePiece.customFields && typePiece.customFields &&
typePiece.customFields.length > 0 typePiece.customFields.length > 0
) { ) {
const typePieceFields = Array.isArray(typePiece.customFields)
? typePiece.customFields
: [];
const typePieceFieldMap = new Map(
typePieceFields
.filter((field: any) => field && typeof field.name === 'string')
.map((field: any) => [field.name, field]),
);
// Créer le type de pièce s'il n'existe pas // Créer le type de pièce s'il n'existe pas
let typePieceEntity = await this.prisma.modelType.findFirst({ let typePieceEntity = await this.prisma.modelType.findFirst({
where: { where: {
@@ -1405,7 +1474,7 @@ export class MachinesService {
} }
// Créer les champs personnalisés pour le type de pièce // Créer les champs personnalisés pour le type de pièce
for (const customField of typePiece.customFields) { for (const customField of typePieceFields) {
const existingField = await this.prisma.customField.findFirst({ const existingField = await this.prisma.customField.findFirst({
where: { where: {
name: customField.name, name: customField.name,
@@ -1419,7 +1488,6 @@ export class MachinesService {
name: customField.name, name: customField.name,
type: customField.type, type: customField.type,
required: customField.required || false, required: customField.required || false,
defaultValue: customField.defaultValue,
options: customField.options || [], options: customField.options || [],
typePieceId: typePieceEntity.id, typePieceId: typePieceEntity.id,
}, },
@@ -1447,17 +1515,18 @@ export class MachinesService {
}); });
if (!existingValue) { if (!existingValue) {
const defaultValue = const providedValue = this.extractCustomFieldValue(
typePiece.customFields.find( typePieceFieldMap.get(customField.name),
(cf: any) => cf.name === customField.name, );
)?.defaultValue || ''; if (providedValue !== undefined) {
await this.prisma.customFieldValue.create({ await this.prisma.customFieldValue.create({
data: { data: {
value: defaultValue, value: providedValue,
customFieldId: customField.id, customFieldId: customField.id,
pieceId: piece.id, pieceId: piece.id,
}, },
}); });
}
} }
} }
} }

View File

@@ -26,10 +26,6 @@ export class CreateComposantDto {
@IsNumber({}, { message: 'prix must be a valid number' }) @IsNumber({}, { message: 'prix must be a valid number' })
prix?: number | null; prix?: number | null;
@IsOptional()
@IsString()
emplacement?: string;
@IsOptional() @IsOptional()
@IsString() @IsString()
typeComposantId?: string; typeComposantId?: string;
@@ -60,10 +56,6 @@ export class UpdateComposantDto {
@IsNumber({}, { message: 'prix must be a valid number' }) @IsNumber({}, { message: 'prix must be a valid number' })
prix?: number | null; prix?: number | null;
@IsOptional()
@IsString()
emplacement?: string;
@IsOptional() @IsOptional()
@IsString() @IsString()
typeComposantId?: string; typeComposantId?: string;

View File

@@ -41,10 +41,6 @@ export class CreateMachineDto {
@IsDecimal() @IsDecimal()
prix?: string; prix?: string;
@IsOptional()
@IsString()
emplacement?: string;
@IsOptional() @IsOptional()
@IsString() @IsString()
typeMachineId?: string; typeMachineId?: string;
@@ -79,10 +75,6 @@ export class UpdateMachineDto {
@IsDecimal() @IsDecimal()
prix?: string; prix?: string;
@IsOptional()
@IsString()
emplacement?: string;
@IsOptional() @IsOptional()
@IsString() @IsString()
typeMachineId?: string; typeMachineId?: string;

View File

@@ -26,10 +26,6 @@ export class CreatePieceDto {
@IsNumber({}, { message: 'prix must be a valid number' }) @IsNumber({}, { message: 'prix must be a valid number' })
prix?: number | null; prix?: number | null;
@IsOptional()
@IsString()
emplacement?: string;
@IsOptional() @IsOptional()
@IsString() @IsString()
typePieceId?: string; typePieceId?: string;
@@ -60,10 +56,6 @@ export class UpdatePieceDto {
@IsNumber({}, { message: 'prix must be a valid number' }) @IsNumber({}, { message: 'prix must be a valid number' })
prix?: number | null; prix?: number | null;
@IsOptional()
@IsString()
emplacement?: string;
@IsOptional() @IsOptional()
@IsString() @IsString()
typePieceId?: string; typePieceId?: string;

View File

@@ -29,10 +29,6 @@ export class CreateCustomFieldDto {
@IsBoolean() @IsBoolean()
required?: boolean; required?: boolean;
@IsOptional()
@IsString()
defaultValue?: string;
@IsOptional() @IsOptional()
@IsArray() @IsArray()
options?: string[]; // Pour les champs de type SELECT options?: string[]; // Pour les champs de type SELECT
@@ -51,10 +47,6 @@ export class UpdateCustomFieldDto {
@IsBoolean() @IsBoolean()
required?: boolean; required?: boolean;
@IsOptional()
@IsString()
defaultValue?: string;
@IsOptional() @IsOptional()
@IsArray() @IsArray()
options?: string[]; options?: string[];

View File

@@ -14,6 +14,14 @@ import {
UpdatePieceModelDto, UpdatePieceModelDto,
} from '../shared/dto/type.dto'; } from '../shared/dto/type.dto';
const CUSTOM_FIELD_SELECT = {
id: true,
name: true,
type: true,
required: true,
options: true,
} as const;
@Injectable() @Injectable()
export class TypesService { export class TypesService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
@@ -63,7 +71,6 @@ export class TypesService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required || false, required: field.required || false,
defaultValue: field.defaultValue,
options: field.options, options: field.options,
})), })),
} }
@@ -100,7 +107,7 @@ export class TypesService {
: undefined, : undefined,
}, },
include: { include: {
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
componentRequirements: { componentRequirements: {
include: { include: {
typeComposant: true, typeComposant: true,
@@ -119,7 +126,7 @@ export class TypesService {
return this.prisma.typeMachine.findMany({ return this.prisma.typeMachine.findMany({
include: { include: {
machines: true, machines: true,
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
componentRequirements: { componentRequirements: {
include: { include: {
typeComposant: true, typeComposant: true,
@@ -139,7 +146,7 @@ export class TypesService {
where: { id }, where: { id },
include: { include: {
machines: true, machines: true,
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
componentRequirements: { componentRequirements: {
include: { include: {
typeComposant: true, typeComposant: true,
@@ -179,7 +186,6 @@ export class TypesService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required || false, required: field.required || false,
defaultValue: field.defaultValue,
options: field.options, options: field.options,
typeMachineId: id, typeMachineId: id,
})), })),
@@ -233,7 +239,7 @@ export class TypesService {
where: { id }, where: { id },
data: typeData, data: typeData,
include: { include: {
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
componentRequirements: { componentRequirements: {
include: { include: {
typeComposant: true, typeComposant: true,
@@ -292,14 +298,13 @@ export class TypesService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required || false, required: field.required || false,
defaultValue: field.defaultValue,
options: field.options, options: field.options,
})), })),
} }
: undefined, : undefined,
}, },
include: { include: {
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
}, },
}); });
} }
@@ -309,7 +314,7 @@ export class TypesService {
where: { category: ModelCategory.COMPONENT }, where: { category: ModelCategory.COMPONENT },
include: { include: {
composants: true, composants: true,
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
models: true, models: true,
}, },
}); });
@@ -323,7 +328,7 @@ export class TypesService {
}, },
include: { include: {
composants: true, composants: true,
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
models: true, models: true,
}, },
}); });
@@ -346,7 +351,6 @@ export class TypesService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required || false, required: field.required || false,
defaultValue: field.defaultValue,
options: field.options, options: field.options,
typeComposantId: id, typeComposantId: id,
})), })),
@@ -367,7 +371,7 @@ export class TypesService {
where: { id }, where: { id },
data, data,
include: { include: {
customFields: true, customFields: { select: CUSTOM_FIELD_SELECT },
}, },
}); });
} }
@@ -419,14 +423,13 @@ export class TypesService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required || false, required: field.required || false,
defaultValue: field.defaultValue,
options: field.options, options: field.options,
})), })),
} }
: undefined, : undefined,
}, },
include: { include: {
pieceCustomFields: true, pieceCustomFields: { select: CUSTOM_FIELD_SELECT },
pieceModels: true, pieceModels: true,
pieceRequirements: true, pieceRequirements: true,
pieces: true, pieces: true,
@@ -440,7 +443,7 @@ export class TypesService {
const items = await this.prisma.modelType.findMany({ const items = await this.prisma.modelType.findMany({
where: { category: ModelCategory.PIECE }, where: { category: ModelCategory.PIECE },
include: { include: {
pieceCustomFields: true, pieceCustomFields: { select: CUSTOM_FIELD_SELECT },
pieceModels: true, pieceModels: true,
pieceRequirements: true, pieceRequirements: true,
pieces: true, pieces: true,
@@ -455,7 +458,7 @@ export class TypesService {
const item = await this.prisma.modelType.findFirst({ const item = await this.prisma.modelType.findFirst({
where: { id, category: ModelCategory.PIECE }, where: { id, category: ModelCategory.PIECE },
include: { include: {
pieceCustomFields: true, pieceCustomFields: { select: CUSTOM_FIELD_SELECT },
pieceModels: true, pieceModels: true,
pieceRequirements: true, pieceRequirements: true,
pieces: true, pieces: true,
@@ -479,7 +482,6 @@ export class TypesService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required || false, required: field.required || false,
defaultValue: field.defaultValue,
options: field.options, options: field.options,
typePieceId: id, typePieceId: id,
})), })),
@@ -500,7 +502,7 @@ export class TypesService {
where: { id }, where: { id },
data: updatePayload, data: updatePayload,
include: { include: {
pieceCustomFields: true, pieceCustomFields: { select: CUSTOM_FIELD_SELECT },
pieceModels: true, pieceModels: true,
pieceRequirements: true, pieceRequirements: true,
pieces: true, pieces: true,

View File

@@ -75,7 +75,6 @@ type MachineRecord = {
reference: Nullable<string>; reference: Nullable<string>;
constructeurId: Nullable<string>; constructeurId: Nullable<string>;
prix: Nullable<string>; prix: Nullable<string>;
emplacement: Nullable<string>;
siteId: string; siteId: string;
typeMachineId: Nullable<string>; typeMachineId: Nullable<string>;
createdAt: Date; createdAt: Date;
@@ -87,7 +86,6 @@ type ComposantRecord = {
name: string; name: string;
reference: Nullable<string>; reference: Nullable<string>;
prix: Nullable<string>; prix: Nullable<string>;
emplacement: Nullable<string>;
machineId: Nullable<string>; machineId: Nullable<string>;
parentComposantId: Nullable<string>; parentComposantId: Nullable<string>;
typeComposantId: Nullable<string>; typeComposantId: Nullable<string>;
@@ -103,7 +101,6 @@ type PieceRecord = {
name: string; name: string;
reference: Nullable<string>; reference: Nullable<string>;
prix: Nullable<string>; prix: Nullable<string>;
emplacement: Nullable<string>;
machineId: Nullable<string>; machineId: Nullable<string>;
composantId: Nullable<string>; composantId: Nullable<string>;
typePieceId: Nullable<string>; typePieceId: Nullable<string>;
@@ -119,7 +116,6 @@ type CustomFieldRecord = {
name: string; name: string;
type: string; type: string;
required: boolean; required: boolean;
defaultValue: Nullable<string>;
options: string[]; options: string[];
typeMachineId: Nullable<string>; typeMachineId: Nullable<string>;
typeComposantId: Nullable<string>; typeComposantId: Nullable<string>;
@@ -258,7 +254,6 @@ class InMemoryPrismaService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required ?? false, required: field.required ?? false,
defaultValue: field.defaultValue ?? null,
options: field.options ?? [], options: field.options ?? [],
typeMachineId: null, typeMachineId: null,
typeComposantId: record.id, typeComposantId: record.id,
@@ -319,7 +314,6 @@ class InMemoryPrismaService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required ?? false, required: field.required ?? false,
defaultValue: field.defaultValue ?? null,
options: field.options ?? [], options: field.options ?? [],
typeMachineId: null, typeMachineId: null,
typeComposantId: null, typeComposantId: null,
@@ -380,7 +374,6 @@ class InMemoryPrismaService {
name: field.name, name: field.name,
type: field.type, type: field.type,
required: field.required ?? false, required: field.required ?? false,
defaultValue: field.defaultValue ?? null,
options: field.options ?? [], options: field.options ?? [],
typeMachineId: record.id, typeMachineId: record.id,
typeComposantId: null, typeComposantId: null,
@@ -485,7 +478,6 @@ class InMemoryPrismaService {
reference: data.reference ?? null, reference: data.reference ?? null,
constructeurId: data.constructeurId ?? null, constructeurId: data.constructeurId ?? null,
prix: data.prix ?? null, prix: data.prix ?? null,
emplacement: data.emplacement ?? null,
siteId: data.siteId, siteId: data.siteId,
typeMachineId: data.typeMachineId ?? null, typeMachineId: data.typeMachineId ?? null,
createdAt: now, createdAt: now,
@@ -530,7 +522,6 @@ class InMemoryPrismaService {
name: data.name, name: data.name,
reference: data.reference ?? null, reference: data.reference ?? null,
prix: data.prix ?? null, prix: data.prix ?? null,
emplacement: data.emplacement ?? null,
machineId: data.machineId ?? null, machineId: data.machineId ?? null,
parentComposantId: data.parentComposantId ?? null, parentComposantId: data.parentComposantId ?? null,
typeComposantId: data.typeComposantId ?? null, typeComposantId: data.typeComposantId ?? null,
@@ -568,7 +559,6 @@ class InMemoryPrismaService {
name: data.name, name: data.name,
reference: data.reference ?? null, reference: data.reference ?? null,
prix: data.prix ?? null, prix: data.prix ?? null,
emplacement: data.emplacement ?? null,
machineId: data.machineId ?? null, machineId: data.machineId ?? null,
composantId: data.composantId ?? null, composantId: data.composantId ?? null,
typePieceId: data.typePieceId ?? null, typePieceId: data.typePieceId ?? null,
@@ -604,7 +594,6 @@ class InMemoryPrismaService {
name: data.name, name: data.name,
type: data.type, type: data.type,
required: data.required ?? false, required: data.required ?? false,
defaultValue: data.defaultValue ?? null,
options: data.options ?? [], options: data.options ?? [],
typeMachineId: data.typeMachineId ?? null, typeMachineId: data.typeMachineId ?? null,
typeComposantId: data.typeComposantId ?? null, typeComposantId: data.typeComposantId ?? null,
@@ -1100,7 +1089,6 @@ describe('Inventory flow (e2e)', () => {
name: 'Puissance nominale', name: 'Puissance nominale',
type: 'text', type: 'text',
required: true, required: true,
defaultValue: '5 kW',
}, },
], ],
}); });
@@ -1118,7 +1106,6 @@ describe('Inventory flow (e2e)', () => {
{ {
name: 'Référence fournisseur', name: 'Référence fournisseur',
type: 'text', type: 'text',
defaultValue: 'STD-001',
}, },
], ],
}); });
@@ -1174,7 +1161,7 @@ describe('Inventory flow (e2e)', () => {
name: 'Puissance nominale', name: 'Puissance nominale',
type: 'text', type: 'text',
required: true, required: true,
defaultValue: '7 kW', value: '7 kW',
}, },
], ],
}, },
@@ -1190,7 +1177,7 @@ describe('Inventory flow (e2e)', () => {
{ {
name: 'Référence fournisseur', name: 'Référence fournisseur',
type: 'text', type: 'text',
defaultValue: 'STD-002', value: 'STD-002',
}, },
], ],
}, },