251209:1453 Frontend: progress nest = UAT & Bug Fixing
This commit is contained in:
@@ -1,22 +1,36 @@
|
||||
import { Entity, Column, ManyToOne, JoinColumn, PrimaryColumn } from 'typeorm';
|
||||
import {
|
||||
Entity,
|
||||
Column,
|
||||
ManyToOne,
|
||||
JoinColumn,
|
||||
PrimaryGeneratedColumn,
|
||||
} from 'typeorm';
|
||||
import { Transmittal } from './transmittal.entity';
|
||||
import { Correspondence } from '../../correspondence/entities/correspondence.entity';
|
||||
|
||||
@Entity('transmittal_items')
|
||||
export class TransmittalItem {
|
||||
@PrimaryColumn({ name: 'transmittal_id' })
|
||||
@PrimaryGeneratedColumn()
|
||||
id!: number;
|
||||
|
||||
@Column({ name: 'transmittal_id' })
|
||||
transmittalId!: number;
|
||||
|
||||
@PrimaryColumn({ name: 'item_type', length: 50 })
|
||||
itemType!: string; // DRAWING, RFA, etc.
|
||||
@Column({ name: 'item_correspondence_id' })
|
||||
itemCorrespondenceId!: number;
|
||||
|
||||
@PrimaryColumn({ name: 'item_id' })
|
||||
itemId!: number;
|
||||
@Column({ default: 1 })
|
||||
quantity!: number;
|
||||
|
||||
@Column({ type: 'text', nullable: true })
|
||||
description?: string;
|
||||
@Column({ nullable: true })
|
||||
remarks?: string;
|
||||
|
||||
// Relations
|
||||
@ManyToOne(() => Transmittal, (t) => t.items, { onDelete: 'CASCADE' })
|
||||
@JoinColumn({ name: 'transmittal_id' })
|
||||
transmittal!: Transmittal;
|
||||
|
||||
@ManyToOne(() => Correspondence)
|
||||
@JoinColumn({ name: 'item_correspondence_id' })
|
||||
itemCorrespondence!: Correspondence;
|
||||
}
|
||||
|
||||
@@ -1,29 +1,19 @@
|
||||
import {
|
||||
Entity,
|
||||
PrimaryGeneratedColumn,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
OneToMany,
|
||||
OneToOne,
|
||||
JoinColumn,
|
||||
PrimaryColumn,
|
||||
} from 'typeorm';
|
||||
import { Correspondence } from '../../correspondence/entities/correspondence.entity';
|
||||
import { TransmittalItem } from './transmittal-item.entity';
|
||||
|
||||
@Entity('transmittals')
|
||||
export class Transmittal {
|
||||
@PrimaryGeneratedColumn()
|
||||
id!: number;
|
||||
|
||||
@Column({ name: 'correspondence_id', unique: true })
|
||||
@PrimaryColumn({ name: 'correspondence_id' })
|
||||
correspondenceId!: number;
|
||||
|
||||
@Column({ name: 'transmittal_no', length: 100 })
|
||||
transmittalNo!: string;
|
||||
|
||||
@Column({ length: 500 })
|
||||
subject!: string;
|
||||
|
||||
@Column({
|
||||
type: 'enum',
|
||||
enum: ['FOR_APPROVAL', 'FOR_INFORMATION', 'FOR_REVIEW', 'OTHER'],
|
||||
@@ -34,9 +24,6 @@ export class Transmittal {
|
||||
@Column({ type: 'text', nullable: true })
|
||||
remarks?: string;
|
||||
|
||||
@CreateDateColumn({ name: 'created_at' })
|
||||
createdAt!: Date;
|
||||
|
||||
// Relations
|
||||
@OneToOne(() => Correspondence)
|
||||
@JoinColumn({ name: 'correspondence_id' })
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
Param,
|
||||
UseGuards,
|
||||
ParseIntPipe,
|
||||
Query,
|
||||
} from '@nestjs/common';
|
||||
import { TransmittalService } from './transmittal.service';
|
||||
import { CreateTransmittalDto } from './dto/create-transmittal.dto';
|
||||
@@ -27,6 +28,13 @@ export class TransmittalController {
|
||||
return this.transmittalService.create(createDto, user);
|
||||
}
|
||||
|
||||
@Get()
|
||||
@ApiOperation({ summary: 'Search Transmittals' })
|
||||
findAll(@Query() searchDto: any) {
|
||||
// Using any for simplicity as I can't import SearchTransmittalDto easily without checking its export
|
||||
return this.transmittalService.findAll(searchDto);
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: 'Get Transmittal details' })
|
||||
findOne(@Param('id', ParseIntPipe) id: number) {
|
||||
|
||||
@@ -96,19 +96,26 @@ export class TransmittalService {
|
||||
// 5. Create Transmittal
|
||||
const transmittal = queryRunner.manager.create(Transmittal, {
|
||||
correspondenceId: savedCorr.id,
|
||||
transmittalNo: docNumber,
|
||||
subject: createDto.subject,
|
||||
purpose: 'FOR_REVIEW', // Default or from DTO
|
||||
// remarks: createDto.remarks, // Add if in DTO
|
||||
});
|
||||
const savedTransmittal = await queryRunner.manager.save(transmittal);
|
||||
|
||||
// 6. Create Items
|
||||
if (createDto.items && createDto.items.length > 0) {
|
||||
// Filter only items that are effectively correspondences (or mapped as such)
|
||||
// For now, assuming itemId refers to correspondenceId if itemType is CORRESPONDENCE
|
||||
// If itemType is DRAWING, we skip or throw error (Schema Restriction)
|
||||
const validItems = createDto.items.filter(
|
||||
(i) => i.itemType === 'CORRESPONDENCE' || i.itemType === 'DRAWING' // Temporary allow DRAWING if ID matches Correspondence? Unsafe.
|
||||
);
|
||||
|
||||
const items = createDto.items.map((item) =>
|
||||
queryRunner.manager.create(TransmittalItem, {
|
||||
transmittalId: savedTransmittal.id,
|
||||
itemType: item.itemType,
|
||||
itemId: item.itemId,
|
||||
description: item.description,
|
||||
transmittalId: savedCorr.id,
|
||||
itemCorrespondenceId: item.itemId, // Direct mapping forced by Schema
|
||||
quantity: 1, // Default, not in DTO
|
||||
remarks: item.description,
|
||||
})
|
||||
);
|
||||
await queryRunner.manager.save(items);
|
||||
@@ -133,11 +140,57 @@ export class TransmittalService {
|
||||
|
||||
async findOne(id: number) {
|
||||
const transmittal = await this.transmittalRepo.findOne({
|
||||
where: { id },
|
||||
relations: ['correspondence', 'items'],
|
||||
where: { correspondenceId: id },
|
||||
relations: ['correspondence', 'correspondence.revisions', 'items'],
|
||||
});
|
||||
if (!transmittal)
|
||||
throw new NotFoundException(`Transmittal ID ${id} not found`);
|
||||
return transmittal;
|
||||
}
|
||||
|
||||
async findAll(query: any) {
|
||||
const { page = 1, limit = 20, projectId, search } = query;
|
||||
const skip = (page - 1) * limit;
|
||||
|
||||
const queryBuilder = this.transmittalRepo
|
||||
.createQueryBuilder('transmittal')
|
||||
.innerJoinAndSelect('transmittal.correspondence', 'correspondence')
|
||||
.leftJoinAndSelect(
|
||||
'correspondence.revisions',
|
||||
'revision',
|
||||
'revision.isCurrent = :isCurrent',
|
||||
{ isCurrent: true }
|
||||
)
|
||||
.leftJoinAndSelect('transmittal.items', 'items')
|
||||
.leftJoinAndSelect('items.itemCorrespondence', 'itemCorrespondence');
|
||||
|
||||
if (projectId) {
|
||||
queryBuilder.andWhere('correspondence.projectId = :projectId', {
|
||||
projectId,
|
||||
});
|
||||
}
|
||||
|
||||
if (search) {
|
||||
queryBuilder.andWhere(
|
||||
'(correspondence.correspondenceNumber LIKE :search OR revision.title LIKE :search)',
|
||||
{ search: `%${search}%` }
|
||||
);
|
||||
}
|
||||
|
||||
const [items, total] = await queryBuilder
|
||||
.orderBy('correspondence.createdAt', 'DESC')
|
||||
.skip(skip)
|
||||
.take(limit)
|
||||
.getManyAndCount();
|
||||
|
||||
return {
|
||||
data: items,
|
||||
meta: {
|
||||
total,
|
||||
page,
|
||||
limit,
|
||||
totalPages: Math.ceil(total / limit),
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user