diff --git a/apps/backend/src/config/migrations.ts b/apps/backend/src/config/migrations.ts index 85684cd7..2ecd043e 100644 --- a/apps/backend/src/config/migrations.ts +++ b/apps/backend/src/config/migrations.ts @@ -33,6 +33,7 @@ import { UpdateOrderEntity1769990652833 } from '../migrations/1769990652833-Upda import { DonationItemFoodTypeNotNull1771524930613 } from '../migrations/1771524930613-DonationItemFoodTypeNotNull'; import { MoveRequestFieldsToOrders1770571145350 } from '../migrations/1770571145350-MoveRequestFieldsToOrders'; import { RenameDonationMatchingStatus1771260403657 } from '../migrations/1771260403657-RenameDonationMatchingStatus'; +import { AddAssigneeToOrders1773009000618 } from '../migrations/1773009000618-AddAssigneeToOrders'; const schemaMigrations = [ User1725726359198, @@ -70,6 +71,7 @@ const schemaMigrations = [ DonationItemFoodTypeNotNull1771524930613, MoveRequestFieldsToOrders1770571145350, RenameDonationMatchingStatus1771260403657, + AddAssigneeToOrders1773009000618, ]; export default schemaMigrations; diff --git a/apps/backend/src/migrations/1773009000618-AddAssigneeToOrders.ts b/apps/backend/src/migrations/1773009000618-AddAssigneeToOrders.ts new file mode 100644 index 00000000..fb9e3ee0 --- /dev/null +++ b/apps/backend/src/migrations/1773009000618-AddAssigneeToOrders.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddAssigneeToOrders1773009000618 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE orders + ADD COLUMN assignee_id INT, + ADD CONSTRAINT fk_assignee_id + FOREIGN KEY (assignee_id) REFERENCES users(user_id) ON DELETE SET NULL + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE orders + DROP CONSTRAINT IF EXISTS fk_assignee_id, + DROP COLUMN assignee_id + `); + } +} diff --git a/apps/backend/src/orders/order.entity.ts b/apps/backend/src/orders/order.entity.ts index 6a7636be..f5f1465a 100644 --- a/apps/backend/src/orders/order.entity.ts +++ b/apps/backend/src/orders/order.entity.ts @@ -11,6 +11,7 @@ import { FoodRequest } from '../foodRequests/request.entity'; import { FoodManufacturer } from '../foodManufacturers/manufacturers.entity'; import { OrderStatus } from './types'; import { Allocation } from '../allocations/allocations.entity'; +import { User } from '../users/user.entity'; @Entity('orders') export class Order { @@ -95,4 +96,8 @@ export class Order { nullable: true, }) shippingCost!: number | null; + + @ManyToOne(() => User, { nullable: true }) + @JoinColumn({ name: 'assignee_id', referencedColumnName: 'id' }) + assignee!: User | null; } diff --git a/apps/backend/src/orders/order.service.ts b/apps/backend/src/orders/order.service.ts index 601b7ba4..c3e910f6 100644 --- a/apps/backend/src/orders/order.service.ts +++ b/apps/backend/src/orders/order.service.ts @@ -29,9 +29,10 @@ export class OrdersService { async getAll(filters?: { status?: string; pantryNames?: string[] }) { const qb = this.repo .createQueryBuilder('order') - .leftJoinAndSelect('order.request', 'request') - .leftJoinAndSelect('request.pantry', 'pantry') - .leftJoinAndSelect('pantry.volunteers', 'volunteers') + .leftJoin('order.request', 'request') + .leftJoin('request.pantry', 'pantry') + .leftJoin('pantry.volunteers', 'volunteers') + .leftJoin('order.assignee', 'assignee') .select([ 'order.orderId', 'order.status', @@ -43,6 +44,9 @@ export class OrdersService { 'volunteers.id', 'volunteers.firstName', 'volunteers.lastName', + 'assignee.id', + 'assignee.firstName', + 'assignee.lastName', ]); if (filters?.status) { diff --git a/apps/frontend/src/containers/adminOrderManagement.tsx b/apps/frontend/src/containers/adminOrderManagement.tsx index 772861e4..5d19a8f9 100644 --- a/apps/frontend/src/containers/adminOrderManagement.tsx +++ b/apps/frontend/src/containers/adminOrderManagement.tsx @@ -664,7 +664,7 @@ const OrderStatusSection: React.FC = ({ alignItems="center" justifyContent="center" > - {volunteers && volunteers.length > 0 ? ( + {order.assignee ? ( = ({ color="white" p={2} > - {/* TODO: Change logic later to only get one volunteer */} - {volunteers[0].firstName.charAt(0).toUpperCase()} - {volunteers[0].lastName.charAt(0).toUpperCase()} + {order.assignee?.firstName.charAt(0).toUpperCase()} + {order.assignee?.lastName.charAt(0).toUpperCase()} ) : ( No Assignees @@ -706,7 +705,7 @@ const OrderStatusSection: React.FC = ({ {/* TODO: IMPLEMENT WHAT GOES HERE */} diff --git a/apps/frontend/src/types/types.ts b/apps/frontend/src/types/types.ts index 2cc47fbb..10af3ffb 100644 --- a/apps/frontend/src/types/types.ts +++ b/apps/frontend/src/types/types.ts @@ -361,6 +361,11 @@ export interface OrderSummary { }[]; }; }; + assignee: { + id: number; + firstName: string; + lastName: string; + } | null; } export enum ApplicationStatus {