export function hasCompletedStep()

in src/app/functions/server/getRelevantGuidedSteps.ts [261:355]


export function hasCompletedStep(
  data: StepDeterminationData,
  stepId: StepLink["id"],
  enabledFeatureFlags?: FeatureFlagName[],
): boolean {
  /* c8 ignore start */
  if (
    // TODO: MNTOR-3886 - Remove EnableRemovalUnderMaintenanceStep feature flag
    enabledFeatureFlags?.includes("EnableRemovalUnderMaintenanceStep") &&
    stepId === "DataBrokerManualRemoval"
  ) {
    return (
      data.latestScanData?.results?.every(
        (result) =>
          !(result.broker_status === "removal_under_maintenance") ||
          result.status === "removed" ||
          result.manually_resolved,
        // MNTOR-3892
        // Already covered by unit tests
      ) ?? false
    );
  }
  /* c8 ignore stop */
  if (stepId === "Scan") {
    const hasRunScan =
      typeof data.latestScanData?.scan === "object" &&
      data.latestScanData?.scan !== null;
    const hasResolvedAllScanResults =
      (data.latestScanData?.scan?.onerep_scan_status === "finished" ||
        data.latestScanData?.scan?.onerep_scan_status === "in_progress") &&
      data.latestScanData.results.every(
        (scanResult) =>
          scanResult.manually_resolved || scanResult.status !== "new",
      );
    return hasRunScan && hasResolvedAllScanResults;
  }

  function isBreachResolved(
    dataClass: (typeof BreachDataTypes)[keyof typeof BreachDataTypes],
  ): boolean {
    return !data.subscriberBreaches.some((breach) => {
      const affectedDataClasses = breach.dataClassesEffected.map(
        (affectedDataClass) => Object.keys(affectedDataClass)[0],
      );
      return (
        affectedDataClasses.includes(dataClass) &&
        !breach.resolvedDataClasses.includes(dataClass)
      );
    });
  }

  if (stepId === "HighRiskSsn") {
    return isBreachResolved(HighRiskDataTypes.SSN);
  }

  if (stepId === "HighRiskCreditCard") {
    return isBreachResolved(HighRiskDataTypes.CreditCard);
  }

  if (stepId === "HighRiskBankAccount") {
    return isBreachResolved(HighRiskDataTypes.BankAccount);
  }

  if (stepId === "HighRiskPin") {
    return isBreachResolved(HighRiskDataTypes.PIN);
  }

  if (stepId === "LeakedPasswordsPassword") {
    return isBreachResolved(BreachDataTypes.Passwords);
  }

  if (stepId === "LeakedPasswordsSecurityQuestion") {
    return isBreachResolved(BreachDataTypes.SecurityQuestions);
  }

  if (stepId === "SecurityTipsPhone") {
    return isBreachResolved(BreachDataTypes.Phone);
  }

  if (stepId === "SecurityTipsEmail") {
    return isBreachResolved(BreachDataTypes.Email);
  }

  if (stepId === "SecurityTipsIp") {
    return isBreachResolved(BreachDataTypes.IP);
  }

  if (stepId === "Done") {
    return false;
    // All steps should have been covered by the above conditions:
    /* c8 ignore next 4 */
  }

  return false as never;
}