Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | import { Injectable, BadRequestException } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model, Types } from 'mongoose'; import { AssetWarranty, AssetAmcContract, AssetInsurancePolicy, Asset } from '../schemas'; @Injectable() export class AssetContractsService { constructor( @InjectModel(Asset.name) private readonly assetModel: Model<Asset>, @InjectModel(AssetWarranty.name) private readonly warrantyModel: Model<AssetWarranty>, @InjectModel(AssetAmcContract.name) private readonly amcModel: Model<AssetAmcContract>, @InjectModel(AssetInsurancePolicy.name) private readonly insuranceModel: Model<AssetInsurancePolicy> ) {} async createWarranty(tenantId: string, data: any): Promise<AssetWarranty> { const asset = await this.assetModel.findOne({ _id: data.assetId, tenantId }).exec(); if (!asset) throw new BadRequestException('Asset not found'); const doc = new this.warrantyModel({ ...data, tenantId, assetId: new Types.ObjectId(data.assetId) }); return doc.save(); } async createAmcContract(tenantId: string, data: any): Promise<AssetAmcContract> { const asset = await this.assetModel.findOne({ _id: data.assetId, tenantId }).exec(); if (!asset) throw new BadRequestException('Asset not found'); const duplicate = await this.amcModel.findOne({ tenantId, contractNumber: data.contractNumber }).exec(); if (duplicate) throw new BadRequestException(`AMC contract ${data.contractNumber} already exists`); const doc = new this.amcModel({ ...data, tenantId, assetId: new Types.ObjectId(data.assetId) }); return doc.save(); } async createInsurancePolicy(tenantId: string, data: any): Promise<AssetInsurancePolicy> { const asset = await this.assetModel.findOne({ _id: data.assetId, tenantId }).exec(); if (!asset) throw new BadRequestException('Asset not found'); const duplicate = await this.insuranceModel.findOne({ tenantId, policyNumber: data.policyNumber }).exec(); if (duplicate) throw new BadRequestException(`Insurance policy ${data.policyNumber} already exists`); const doc = new this.insuranceModel({ ...data, tenantId, assetId: new Types.ObjectId(data.assetId) }); return doc.save(); } // Contract expiry checker async checkExpirations(tenantId: string): Promise<any> { const threshold = new Date(); threshold.setDate(threshold.getDate() + 30); // 30 days window const expiringWarranties = await this.warrantyModel.find({ tenantId, endDate: { $lte: threshold, $gte: new Date() } }).exec(); const expiringAmc = await this.amcModel.find({ tenantId, endDate: { $lte: threshold, $gte: new Date() }, status: 'active' }).exec(); const expiringInsurance = await this.insuranceModel.find({ tenantId, endDate: { $lte: threshold, $gte: new Date() } }).exec(); return { expiringWarranties: expiringWarranties.map(w => w.assetId), expiringAmc: expiringAmc.map(a => a.assetId), expiringInsurance: expiringInsurance.map(i => i.assetId) }; } } |