feat: ( reschedule ) implement booking reschedule

This commit is contained in:
Abubeker
2026-08-21 08:18:03 +00:00
parent e174efb8e0
commit 80a7a2f702
27 changed files with 1450 additions and 51 deletions

View File

@@ -5,6 +5,7 @@ import { PrismaService } from '../../common/prisma.service';
import { SmsClientService } from '../notifications/sms-client.service';
import { CurrencyService } from '../currency/currency.service';
import { PaymentsService } from '../payments/payments.service';
import { RescheduleService } from '../reschedule/reschedule.service';
import { MAX_PAYMENT_HOURS, CUTOFF_MINUTES, computePaymentDeadline } from '../../common/utils/payment-deadline.utils';
// Retention windows
@@ -510,6 +511,21 @@ export class TasksService {
// ─────────────────────────────────────────────────────────────────────────
// Daily at 02:00 EAT: purge expired/stale records to enforce data retention.
// ─────────────────────────────────────────────────────────────────────────
// ─────────────────────────────────────────────────────────────────────────
// Every 1 min: reschedule requests whose payment deadline passed → EXPIRED
// (their supplementary charge too). The new-seat hold lapses on its own.
// ─────────────────────────────────────────────────────────────────────────
@Cron('*/1 * * * *')
async expireStaleReschedules() {
try {
const reschedule = await this.moduleRef.resolve(RescheduleService, undefined, { strict: false });
const n = await reschedule.expireStale();
if (n > 0) this.logger.log(`Expired ${n} unpaid reschedule request(s)`);
} catch (err) {
this.logger.error(`expireStaleReschedules failed: ${err instanceof Error ? err.message : err}`);
}
}
@Cron('0 2 * * *')
async purgeExpiredData() {
const now = new Date();