Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/backend/src/controllers/projects.controllers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ export default class ProjectsController {
price,
subtotal,
linkUrl,
req.organization,
req.organization.organizationId,
notes,
unitName,
assemblyId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-- DropForeignKey
ALTER TABLE "Material" DROP CONSTRAINT "Material_manufacturerId_fkey";

-- DropForeignKey
ALTER TABLE "Material" DROP CONSTRAINT "Material_materialTypeId_fkey";

-- AlterTable
ALTER TABLE "Material" ALTER COLUMN "materialTypeId" DROP NOT NULL,
ALTER COLUMN "manufacturerId" DROP NOT NULL,
ALTER COLUMN "manufacturerPartNumber" DROP NOT NULL,
ALTER COLUMN "quantity" DROP NOT NULL,
ALTER COLUMN "price" DROP NOT NULL,
ALTER COLUMN "subtotal" DROP NOT NULL,
ALTER COLUMN "linkUrl" DROP NOT NULL;

-- AddForeignKey
ALTER TABLE "Material" ADD CONSTRAINT "Material_materialTypeId_fkey" FOREIGN KEY ("materialTypeId") REFERENCES "Material_Type"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Material" ADD CONSTRAINT "Material_manufacturerId_fkey" FOREIGN KEY ("manufacturerId") REFERENCES "Manufacturer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
2 changes: 1 addition & 1 deletion src/backend/src/prisma/migrations/migration_lock.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"
provider = "postgresql"
18 changes: 9 additions & 9 deletions src/backend/src/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -822,18 +822,18 @@ model Material {
userCreated User @relation(fields: [userCreatedId], references: [userId], name: "materialCreator")
userCreatedId String
status Material_Status
materialType Material_Type @relation(fields: [materialTypeId], references: [id])
materialTypeId String
manufacturer Manufacturer @relation(fields: [manufacturerId], references: [id])
manufacturerId String
manufacturerPartNumber String
materialType Material_Type? @relation(fields: [materialTypeId], references: [id])
materialTypeId String?
manufacturer Manufacturer? @relation(fields: [manufacturerId], references: [id])
manufacturerId String?
manufacturerPartNumber String?
pdmFileName String?
quantity Decimal
quantity Decimal?
unit Unit? @relation(fields: [unitId], references: [id])
unitId String?
price Int
subtotal Int
linkUrl String
price Int?
subtotal Int?
linkUrl String?
notes String?
reimbursementRequest Reimbursement_Request? @relation(fields: [reimbursementRequestId], references: [reimbursementRequestId])
reimbursementRequestId String?
Expand Down
58 changes: 35 additions & 23 deletions src/backend/src/services/boms.services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,15 @@
name,
assemblyId,
status,
materialTypeId: materialType.id,
manufacturerId: manufacturer.id,
manufacturerPartNumber,
materialTypeId: materialType ? materialType.id : null,
manufacturerId: manufacturer ? manufacturer.id : null,
manufacturerPartNumber: manufacturerPartNumber ?? null,
pdmFileName,
quantity,
quantity: quantity ?? null,
unitId: unit ? unit.id : null,
price,
subtotal,
linkUrl,
price: price ?? null,
subtotal: subtotal ?? null,
linkUrl: linkUrl ?? null,
notes,
dateCreated: new Date(),
wbsElementId: project.wbsElementId,
Expand Down Expand Up @@ -556,14 +556,14 @@
materialId: string,
name: string,
status: Material_Status,
materialTypeName: string,
manufacturerName: string,
manufacturerPartNumber: string,
quantity: Decimal,
price: number,
subtotal: number,
linkUrl: string,
organization: Organization,
materialTypeName: string,
manufacturerName?: string,
manufacturerPartNumber?: string,
quantity?: Decimal,
price?: number,
subtotal?: number,
linkUrl?: string,
notes?: string,
unitName?: string,
assemblyId?: string,
Expand All @@ -588,7 +588,13 @@
if (assembly.wbsElementId !== project.wbsElementId) throw new HttpException(400, 'Assembly not found on this project');
}

const materialType = await BillOfMaterialsService.getSingleMaterialTypeWithQueryArgs(materialTypeName, organization);
let materialType = null;

if (materialTypeName) {
materialType = await BillOfMaterialsService.getSingleMaterialTypeWithQueryArgs(materialTypeName, organization);

if (!materialType) throw new NotFoundException('Material Type', materialTypeName);
}

let unit = null;
if (unitName) {
Expand All @@ -608,21 +614,27 @@
}
}

const manufacturer = await BillOfMaterialsService.getSingleManufacturerWithQueryArgs(manufacturerName, organization);
let manufacturer = null;

if (manufacturerName) {
manufacturer = await BillOfMaterialsService.getSingleMaterialTypeWithQueryArgs(manufacturerName, organization);

if (!manufacturer) throw new NotFoundException('Manufacturer', manufacturerName);
}

const updatedMaterial = await prisma.material.update({
where: { materialId },
data: {
name,
status,
materialTypeId: materialType.id,
manufacturerId: manufacturer.id,
manufacturerPartNumber,
quantity,
materialTypeId: materialType ? materialType.id : null,
manufacturerId: manufacturer ? manufacturer.id : null,
manufacturerPartNumber: manufacturerPartNumber ?? null,
quantity: quantity ?? null,
unitId: unit ? unit.id : null,
price,
subtotal,
linkUrl,
price: price ?? null,
subtotal: subtotal ?? null,
linkUrl: linkUrl ?? null,
notes,
wbsElementId: project.wbsElementId,
assemblyId,
Expand Down Expand Up @@ -793,7 +805,7 @@

if (!material) throw new NotFoundException('Material', materialId);
if (material.wbsElement.organizationId !== organization.organizationId)
throw new InvalidOrganizationException('Material');

Check failure on line 808 in src/backend/src/services/boms.services.ts

View workflow job for this annotation

GitHub Actions / run-tests

tests/unmocked/project.test.ts > Material Tests > Edit a material > Updates the reimbursement request when originally undefined

Error: Material does not exist in current organization! ❯ Function.getSingleMaterialWithQueryArgs src/services/boms.services.ts:808:13 ❯ Function.editMaterial src/services/boms.services.ts:573:22 ❯ tests/unmocked/project.test.ts:118:27 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { status: 400 }
if (material.dateDeleted) throw new DeletedException('Material', materialId);

return material;
Expand Down
33 changes: 21 additions & 12 deletions src/backend/src/transformers/material.transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,21 @@ export const materialTransformer = (material: Prisma.MaterialGetPayload<Material
dateCreated: material.dateCreated,
userCreated: userTransformer(material.userCreated),
status: material.status as MaterialStatus,
materialTypeName: material.materialType.name,
manufacturerName: material.manufacturer.name,
manufacturerPartNumber: material.manufacturerPartNumber,
materialTypeName: material.materialType ? material.materialType.name : undefined,
manufacturerName: material.manufacturer ? material.manufacturer.name : undefined,
manufacturerPartNumber: material.manufacturerPartNumber ?? undefined,
pdmFileName: material.pdmFileName ?? undefined,
price: material.price,
subtotal: material.subtotal,
quantity: material.quantity,
linkUrl: material.linkUrl,
price: material.price ?? undefined,
subtotal: material.subtotal ?? undefined,
quantity: material.quantity ?? undefined,
linkUrl: material.linkUrl ?? undefined,
unitName: material.unit?.name ?? undefined,
materialType: { ...material.materialType, dateDeleted: material.materialType.dateDeleted ?? undefined },
manufacturer: { ...material.manufacturer, dateDeleted: material.manufacturer.dateDeleted ?? undefined },
materialType: material.materialType
? { ...material.materialType, dateDeleted: material.materialType.dateDeleted ?? undefined }
: undefined,
manufacturer: material.manufacturer
? { ...material.manufacturer, dateDeleted: material.manufacturer.dateDeleted ?? undefined }
: undefined,
notes: material.notes ?? undefined,
reimbursementRequest: material.reimbursementRequest
? reimbursementRequestTransformer(material.reimbursementRequest)
Expand All @@ -64,10 +68,15 @@ export const materialPreviewTransformer = (
pdmFileName: material.pdmFileName ?? undefined,
status: material.status as MaterialStatus,
unitName: material.unit?.name ?? undefined,
materialTypeName: material.materialType.name,
manufacturerName: material.manufacturer.name,
materialTypeName: material.materialType ? material.materialType.name : undefined,
manufacturerName: material.manufacturer ? material.manufacturer.name : undefined,
reimbursementRequest: material.reimbursementRequest
? reimbursementRequestTransformer(material.reimbursementRequest)
: undefined
: undefined,
manufacturerPartNumber: material.manufacturerPartNumber ?? undefined,
quantity: material.quantity ?? undefined,
price: material.price ?? undefined,
subtotal: material.subtotal ?? undefined,
linkUrl: material.linkUrl ?? undefined
};
};
14 changes: 7 additions & 7 deletions src/backend/src/utils/validation.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,15 +197,15 @@ export const materialValidators = [
nonEmptyString(body('name')),
nonEmptyString(body('assemblyId').optional()),
isMaterialStatus(body('status')),
nonEmptyString(body('materialTypeName')),
nonEmptyString(body('manufacturerName')),
nonEmptyString(body('manufacturerPartNumber')),
nonEmptyString(body('materialTypeName').optional()),
nonEmptyString(body('manufacturerName').optional()),
nonEmptyString(body('manufacturerPartNumber').optional()),
nonEmptyString(body('pdmFileName').optional()),
decimalMinZero(body('quantity')),
decimalMinZero(body('quantity').optional()),
nonEmptyString(body('unitName')).optional(),
intMinZero(body('price')), // in cents
intMinZero(body('subtotal')), // in cents
nonEmptyString(body('linkUrl')),
intMinZero(body('price').optional()), // in cents
intMinZero(body('subtotal').optional()), // in cents
nonEmptyString(body('linkUrl').optional()),
nonEmptyString(body('reimbursementRequestId')).optional(),
body('notes').isString().optional()
];
Expand Down
18 changes: 9 additions & 9 deletions src/shared/src/types/bom-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,18 @@ export interface Material {
dateCreated: Date;
userCreated: UserPreview;
status: MaterialStatus;
materialTypeName: string;
materialType: MaterialTypePreview;
manufacturerName: string;
manufacturer: ManufacturerPreview;
manufacturerPartNumber: string;
materialTypeName?: string;
materialType?: MaterialTypePreview;
manufacturerName?: string;
manufacturer?: ManufacturerPreview;
manufacturerPartNumber?: string;
pdmFileName?: string;
quantity: Decimal;
quantity?: Decimal;
unitName?: string;
quantityUnit?: UnitPreview;
price: number;
subtotal: number;
linkUrl: string;
price?: number;
subtotal?: number;
linkUrl?: string;
notes?: string;
reimbursementRequest?: ReimbursementRequest;
}
Expand Down
Loading