All files / utils calculateEstimatedDuration.ts

100% Statements 17/17
100% Branches 19/19
100% Functions 3/3
100% Lines 14/14

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                            73x   67x 67x   73x           46x     21x   21x 18x 44x 8x   8x         2x     6x         19x    
import { OfficeImpl } from "@/types/OfficeImpl";
import { ServiceImpl } from "@/types/ServiceImpl";
import { SubService } from "@/types/SubService";
 
/**
 * Calculates the total estimated duration for the selected service and subservices for a given provider.
 * @param service The main service (with subServices and counts)
 * @param provider The selected provider/office
 * @returns The total estimated duration in minutes
 */
export function calculateEstimatedDuration(
  service: ServiceImpl | undefined,
  provider: OfficeImpl | undefined
): number | null {
  if (!service || !provider) return null;
 
  let total = 0;
  const mainProvider = service.providers?.find((p) => p.id == provider.id);
 
  if (
    !mainProvider ||
    !service.count ||
    !mainProvider.slots ||
    !mainProvider.slotTimeInMinutes
  ) {
    return null;
  }
 
  total += service.count * mainProvider.slots * mainProvider.slotTimeInMinutes;
 
  if (service.subServices) {
    for (const sub of service.subServices) {
      if (sub.count > 0) {
        const subProvider = sub.providers?.find((p) => p.id == provider.id);
 
        if (
          !subProvider ||
          !subProvider.slots ||
          !subProvider.slotTimeInMinutes
        ) {
          return null;
        }
 
        total += sub.count * subProvider.slots * subProvider.slotTimeInMinutes;
      }
    }
  }
 
  return total;
}