All files / src/domains/inventory/batches/services batch-serial.service.ts

0% Statements 0/27
0% Branches 0/16
0% Functions 0/6
0% Lines 0/23

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                                                                                                                     
import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { InventoryBatch } from '../schemas/batch.schema';
import { InventorySerial } from '../../serials/schemas/serial.schema';
 
@Injectable()
export class BatchSerialService {
  constructor(
    @InjectModel(InventoryBatch.name)
    private readonly batchModel: Model<InventoryBatch>,
    @InjectModel(InventorySerial.name)
    private readonly serialModel: Model<InventorySerial>
  ) {}
 
  async createBatch(tenantId: string, data: any): Promise<InventoryBatch> {
    const existing = await this.batchModel.findOne({ tenantId, batchNumber: data.batchNumber, itemCode: data.itemCode }).exec();
    if (existing) {
      return existing;
    }
    return this.batchModel.create({
      ...data,
      tenantId,
      status: 'active',
    });
  }
 
  async createSerial(tenantId: string, data: any): Promise<InventorySerial> {
    const existing = await this.serialModel.findOne({ tenantId, serialNumber: data.serialNumber, itemCode: data.itemCode }).exec();
    if (existing) {
      throw new BadRequestException(`Serial number ${data.serialNumber} already registered for item ${data.itemCode}`);
    }
    return this.serialModel.create({
      ...data,
      tenantId,
      status: 'available',
    });
  }
 
  async resolveFefoBatch(tenantId: string, itemCode: string): Promise<InventoryBatch[]> {
    // FEFO: Sort by expiry date ascending
    return this.batchModel.find({ tenantId, itemCode, status: 'active' })
      .sort({ expiryDate: 1 })
      .exec();
  }
 
  async getBatches(tenantId: string, itemCode?: string): Promise<InventoryBatch[]> {
    const filter: any = { tenantId };
    if (itemCode) filter.itemCode = itemCode;
    return this.batchModel.find(filter).exec();
  }
 
  async getSerials(tenantId: string, itemCode?: string): Promise<InventorySerial[]> {
    const filter: any = { tenantId };
    if (itemCode) filter.itemCode = itemCode;
    return this.serialModel.find(filter).exec();
  }
}