import { Injectable } from '@nestjs/common';
import { randomUUID } from 'node:crypto';
import { DatabaseService } from '../../../infrastructure/database/database.service';
import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
import {
assertOperationsScope,
assertOperationsText,
assertOptionalOperationsText,
} from './operations-input-validation';
@Injectable()
export class HandoverAmendmentService {
constructor(private readonly database: DatabaseService) {}
async amend(input: {
organizationId: string;
locationId: string;
handoverId: string;
body: string;
employeeId?: string;
}) {
assertOperationsScope(input, 'operations.input_invalid');
assertOperationsText(input.handoverId, 200, 'operations.input_invalid');
assertOperationsText(input.body, 4000, 'operations.input_invalid');
assertOptionalOperationsText(input.employeeId, 200, 'operations.input_invalid');
const handover = await this.database.query<any>(
`select id,status
from shift_handovers
where id=$1 and organization_id=$2 and location_id=$3`,
[input.handoverId,input.organizationId,input.locationId],
);
if (!handover[0] || !['published','acknowledged','closed'].includes(handover[0].status)) {
throw new DomainConflictError('operations.handover_amend_invalid');
}
const seq = await this.database.query<{ next_number: number }>(
`select coalesce(max(amendment_number),0)+1 as next_number
from handover_amendments
where shift_handover_id=$1`,
[input.handoverId],
);
const id = randomUUID();
await this.database.query(
`insert into handover_amendments(
id,shift_handover_id,amendment_number,body,created_by_employee_id
) values($1,$2,$3,$4,$5)`,
[id,input.handoverId,seq[0].next_number,input.body,input.employeeId ?? null],
);
return { id, amendmentNumber: seq[0].next_number };
}
async close(input: {
organizationId: string;
locationId: string;
handoverId: string;
}) {
assertOperationsScope(input, 'operations.input_invalid');
assertOperationsText(input.handoverId, 200, 'operations.input_invalid');
const rows = await this.database.query<any>(
`update shift_handovers
set status='closed',closed_at=now(),version=version+1
where id=$1 and organization_id=$2 and location_id=$3
and status in ('published','acknowledged')
returning id,status`,
[input.handoverId,input.organizationId,input.locationId],
);
if (!rows[0]) throw new DomainConflictError('operations.handover_close_invalid');
return rows[0];
}
}
