{"version":3,"file":"packages_core-reports_src_index_ts.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/constants/moduleDailyReportsRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/constants/moduleHistoryReportsRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/constants/moduleOtherReportsHistoryRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/constants/wellCategoryDropdown.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/mappers/dailyReportMappers.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/dailyReportApi.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/ddlCacheMap.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/http/post.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/reports/findReportHistoryTables.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/reports/getReportsHistory.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/reports/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-reports/src/services/reports/types.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/api.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/dashboardRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/database.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/defaultConfig.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/staleTimes.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/http/post.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/types/api.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/types/appModules.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/types/role.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/date.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/fetchWithCache.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/fileUpload.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/isAllowedForRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/number.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/safeDateTimeParsers.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/safeParseParamId.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/sortDropdownByName.ts"],"sourcesContent":["import { type UserRole, UserRoles } from \"@data-oil-front/core-utils\";\n\nexport const MODULE_DAILY_REPORT_ROLES: UserRole[] = [\n  UserRoles.ADMINISTRADOR,\n  UserRoles.ANALISTA_DE_PLANIFICACION,\n  UserRoles.SUPERVISOR_DE_PRODUCCION,\n  UserRoles.OPERADOR_DE_PRODUCCION,\n];\n","import { type UserRole, UserRoles } from \"@data-oil-front/core-utils\";\n\nexport const MODULE_HISTORY_REPORT_ROLES: UserRole[] = [\n  UserRoles.ADMINISTRADOR,\n  UserRoles.GERENTE_DE_PLANIFICACION,\n  UserRoles.ANALISTA_DE_PLANIFICACION,\n  UserRoles.SUPERVISOR_DE_PRODUCCION,\n  UserRoles.OPERADOR_DE_PRODUCCION,\n];\n","import { type UserRole, UserRoles } from \"@data-oil-front/core-utils\";\n\nexport const MODULE_OTHER_REPORTS_ROLES: UserRole[] = [\n  UserRoles.ADMINISTRADOR,\n  UserRoles.GERENTE_DE_PLANIFICACION,\n  UserRoles.SUPERVISOR_DE_PRODUCCION,\n];\n","import { OptionDDL } from \"../services/dailyReportApi\";\n\n/**\n * Allowed \"Categoría de pozo\" options for the daily report well step (fixed order).\n * Keep in sync with aldylapp-front `app/constants/wellCategoryDropdown.ts`.\n */\nconst WELL_CATEGORY_DROPDOWN_ORDER = [\n  \"Activo\",\n  \"Pozo de producción de gas\",\n  \"Pozo Inyector\",\n  \"Pozo de Alivio\",\n] as const;\n\nfunction normalizeWellCategoryName(name: string): string {\n  return name.trim().toLowerCase().normalize(\"NFD\").replace(/\\p{M}/gu, \"\");\n}\n\n/** Long labels only: DB may append suffixes or use slightly different wording. Short labels stay exact-only (avoids \"Inactivo\" matching \"Activo\"). */\nconst MIN_CANONICAL_LEN_FOR_FLEX_MATCH = 14;\n\nfunction matchesWellCategoryCanonical(\n  categoryName: string,\n  canonicalLabel: string,\n): boolean {\n  const n = normalizeWellCategoryName(categoryName);\n  const c = normalizeWellCategoryName(canonicalLabel);\n  if (n === c) return true;\n  if (c.length < MIN_CANONICAL_LEN_FOR_FLEX_MATCH) return false;\n  return n.includes(c) || c.includes(n);\n}\n\nexport function filterWellCategoriesForDailyReportDropdown(\n  categories: OptionDDL[],\n): OptionDDL[] {\n  const used = new Set<number>();\n  const result: OptionDDL[] = [];\n\n  for (const canonical of WELL_CATEGORY_DROPDOWN_ORDER) {\n    const match = categories.find(\n      (cat) =>\n        !used.has(cat.id) && matchesWellCategoryCanonical(cat.name, canonical),\n    );\n    if (match) {\n      result.push(match);\n      used.add(match.id);\n    }\n  }\n\n  return result;\n}\n\n/** Resolve DB id for a canonical label (e.g. \"Activo\") from a filtered category list. */\nexport function findWellCategoryIdByCanonicalName<\n  T extends { id: number; name: string },\n>(categories: T[], canonicalLabel: string): string | null {\n  const found = categories.find((c) =>\n    matchesWellCategoryCanonical(c.name, canonicalLabel),\n  );\n  return found != null ? String(found.id) : null;\n}\n","// NEW API\nexport * from './services/reports'\n\n// OLD API\nexport * from './services/dailyReportApi';\nexport {\n  type DailyReportCacheEntry,\n  DAILY_REPORT_DDL_CACHE_MAP,\n  DAILY_REPORT_DDL_TABLES,\n  invalidateReportsDDLCaches,\n} from './services/ddlCacheMap';\nexport * from './mappers/dailyReportMappers';\nexport * from './constants/moduleDailyReportsRoles';\nexport * from './constants/moduleHistoryReportsRoles';\nexport * from './constants/moduleOtherReportsHistoryRoles';\nexport * from './constants/wellCategoryDropdown';\nexport * from './types/dailyReport';\n","import { TABLE_NAMES, API_VERBS } from '@data-oil-front/core-utils';\n\nexport interface FlowStationTankPayloadParams {\n  isEditing?: boolean;\n  reportId?: number | null;\n  editionNumber?: number | null;\n  reportDateTime: string;\n  nowDate: string;\n  activityId: number;\n  userId: string | null;\n  tankId: number;\n  status: string;\n  sampleTaken: string;\n  netOperatedProduction: number | null;\n  tankLevel: number | null;\n  rawOperatedProduction: number | null;\n  comments: string | null;\n}\n\nexport function createFlowStationTankPayload({\n  isEditing = false,\n  reportId = null,\n  editionNumber = 0,\n  reportDateTime,\n  nowDate,\n  activityId,\n  userId,\n  tankId,\n  status,\n  sampleTaken,\n  netOperatedProduction,\n  tankLevel,\n  rawOperatedProduction,\n  comments,\n}: FlowStationTankPayloadParams) {\n  const resolvedEditionNumber = isEditing ? (editionNumber ?? 0) + 1 : 0;\n\n  const basePairs: [string, string | number | boolean | null][] = [\n    ['date_updated', nowDate],\n    ['edition_number', resolvedEditionNumber],\n    ['activity_id', activityId],\n    ['user_id', userId],\n    ['flow_station_tank_id', tankId],\n    ['status', status || 'active'],\n    ['current_stock', null],\n    ['sample_taken', sampleTaken === 'yes'],\n    [\n      'net_operated_production',\n      sampleTaken === 'yes' ? null : netOperatedProduction,\n    ],\n    ['tank_level', tankLevel],\n    ['filling_start_date', null],\n    ['filling_start_level', null],\n    ['filling_end_date', null],\n    ['filling_end_level', null],\n    ['raw_operated_production', rawOperatedProduction],\n    ['lab_analysis', false],\n    ['comments', comments || null],\n  ];\n\n  if (!isEditing) {\n    basePairs.push(['date_created', reportDateTime ?? nowDate]);\n  } else {\n    basePairs.push(['date_created', reportDateTime ?? nowDate]);\n  }\n\n  return {\n    verb: isEditing && reportId != null ? API_VERBS.UPDATE : API_VERBS.INSERT,\n    table: TABLE_NAMES.DAILY_REPORT_FLOW_STATION_TANK,\n    fields: basePairs.map(([key]) => key),\n    values: basePairs.map(([, value]) => value),\n    filter: isEditing && reportId != null ? [['id', '=', reportId]] : [],\n  } as const;\n}\n","import dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\n\nimport { ApiFilter, ApiPostBody, purePost, fetchWithCache } from \"@data-oil-front/core-utils\";\nimport { DeviceEventEmitter } from \"react-native\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { Field, Location } from \"../types/dailyReport\";\nimport { TABLE_NAMES, API_VERBS } from \"@data-oil-front/core-utils\";\nimport { post } from \"./http/post\";\n\nimport { configService, storageService, offlineMutationQueueService } from \"@data-oil-front/core-host\";\nimport { ALL_REPORT_HISTORY_TABLES, ReportHistoryTable } from \"./reports/types\";\n\ndeclare const __DEV__: boolean | undefined;\n\nconst NAMESPACE = \"dailyReport\";\n\nconst OTHER_REPORT_HISTORY_TABLES: ReportHistoryTable[] = [\n  TABLE_NAMES.LIFTING_COST,\n  TABLE_NAMES.SHIP_TO_SHIP,\n  TABLE_NAMES.BILLED_RECOVERY_AND_EXPENSES,\n  TABLE_NAMES.OWN_FISCALIZED_PRODUCTION,\n  TABLE_NAMES.THIRD_PARTY_FISCALIZED_PRODUCTION,\n  TABLE_NAMES.MARKET_REFERENCE_PRICE,\n  TABLE_NAMES.COMMENTS_FORM,\n];\n\n/**\n * @deprecated('DO NOT USE')\n */\ntype GetReportHistoryTablesOptions = {\n  includeOtherReports?: boolean;\n};\n\n/**\n * @deprecated('Use the new findReportHistoryTables service utility function instead (`utils/reports/findReportHistoryTables.ts`)')\n */\nexport function getReportHistoryTables(\n  options?: GetReportHistoryTablesOptions,\n): ReportHistoryTable[] {\n  const config = configService.getCurrentConfig();\n  const clientName = (config.clientName || \"\").toLowerCase();\n  const isAldyl = clientName === \"aldyl\";\n  const includeOtherReports = options?.includeOtherReports ?? true;\n\n  return ALL_REPORT_HISTORY_TABLES.filter((table) => {\n    if (!includeOtherReports && OTHER_REPORT_HISTORY_TABLES.includes(table)) {\n      return false;\n    }\n    if (table === TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT && isAldyl) {\n      return false;\n    }\n    return true;\n  });\n}\n\ndayjs.extend(utc);\n\nexport async function deleteReportHistoryItem(\n  table: ReportHistoryTable,\n  id: string | number,\n): Promise<void> {\n  try {\n    if (table === TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD) {\n      await post<{ success?: boolean } | Array<unknown>>({\n        verb: API_VERBS.DELETE,\n        table: TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD,\n        filter: [[\"vacuum_load_id\", \"=\", Number(id)]],\n      });\n\n      await storageService.removeByPrefix(\n        NAMESPACE,\n        `reportsHistory:${TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD}:`,\n      );\n\n      DeviceEventEmitter.emit(\"reports:refresh\", {\n        table: TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD,\n      });\n    }\n\n    if (table === TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD) {\n      const unloadReportResponse = await post<any[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD,\n        filter: [[\"id\", \"=\", Number(id)]],\n      });\n\n      const unloadReport = Array.isArray(unloadReportResponse)\n        ? unloadReportResponse[0]\n        : null;\n      const vacuumLoadId = unloadReport?.vacuum_load_id;\n\n      if (vacuumLoadId) {\n        await post<any>({\n          verb: \"update\",\n          table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n          fields: [\"unloaded\", \"date_updated\"],\n          values: [false, nowTimestamp()],\n          filter: [[\"id\", \"=\", Number(vacuumLoadId)]],\n        });\n\n        await storageService.remove(NAMESPACE, \"vacuumLoads\");\n\n        await storageService.removeByPrefix(\n          NAMESPACE,\n          `reportsHistory:${TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD}:`,\n        );\n        DeviceEventEmitter.emit(\"reports:refresh\", {\n          table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n        });\n      }\n    }\n\n    await post<{ success?: boolean } | Array<unknown>>({\n      verb: API_VERBS.DELETE,\n      table,\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    await storageService.removeByPrefix(NAMESPACE, `reportsHistory:${table}:`);\n    DeviceEventEmitter.emit(\"reports:refresh\", { table });\n\n    if (table === TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD) {\n      await storageService.remove(NAMESPACE, \"vacuumLoads\");\n    }\n  } catch (error) {\n    throw new Error(\n      error instanceof Error\n        ? error.message\n        : `No se pudo eliminar el reporte ${String(id)} de ${table}`,\n    );\n  }\n}\n\nexport interface OptionDDL {\n  id: number;\n  name: string;\n}\n\ntype WellFilterTuple = [string, string, number | string];\nconst WELLS_ALL_CACHE_KEY = \"wells:all\";\nconst WELLS_LEGACY_CACHE_KEY = \"wells\";\n\nconst buildWellsCacheKey = (filters?: WellFilterTuple[]): string => {\n  if (!filters || filters.length === 0) return WELLS_ALL_CACHE_KEY;\n  const normalized = filters\n    .map(([field, op, value]) => `${field}:${op}:${String(value)}`)\n    .join(\"|\");\n  return `wells:filters:${normalized}`;\n};\n\nconst filterWellsInMemory = (\n  rows: Well[],\n  filters?: WellFilterTuple[],\n): Well[] => {\n  if (!filters || filters.length === 0) return rows;\n  return rows.filter((row) =>\n    filters.every(([field, op, value]) => {\n      const rowValue = (row as any)?.[field];\n      const rowString =\n        rowValue === undefined || rowValue === null ? \"\" : String(rowValue);\n      const valueString = String(value);\n      switch (op.toLowerCase()) {\n        case \"=\":\n        case \"==\":\n        case \"eq\":\n          return rowString === valueString;\n        case \"!=\":\n        case \"<>\":\n        case \"neq\":\n          return rowString !== valueString;\n        default:\n          return rowString === valueString;\n      }\n    }),\n  );\n};\n\ninterface Well {\n  id: number;\n  name: string;\n  field_id: number;\n  well_category_id?: number;\n  pumping_method_id?: number;\n  associated_strategy_id?: number;\n  well_cluster_id?: number;\n  flow_station_id?: number;\n  potencial?: number | null;\n  rgp?: number | null;\n}\n\n// REFACTOR: This should be a Strategy interface.\nexport interface DailyReportWell {\n  id: number;\n  well_id: number | null;\n  activity_id?: number | null;\n  status?: string | null;\n  date_created?: string | null;\n  date_updated?: string | null;\n  edition_number?: number | null;\n  heading_pressure?: number | null;\n  line_pressure?: number | null;\n  injection_pressure?: number | null;\n  casing_pressure?: number | null;\n  gas_injection_rate?: number | null;\n  diluent_injection_rate?: number | null;\n  hole_plate_diameter?: number | null;\n  reducer_diameter?: number | null;\n  pump_speed?: number | null;\n  rebars_torque?: number | null;\n  strokes_per_minute?: number | null;\n  stroke_length?: number | null;\n  electric_intensity?: number | null;\n  operation_fequency?: number | null;\n  sample_taken?: boolean | null;\n  event_reported?: boolean | null;\n  event_title?: string | null;\n  event_comment?: string | null;\n  event_image?: string | null;\n  lab_analysis?: boolean | null;\n  associated_strategy_id?: number | null;\n  user_id?: number | string | null;\n  daily_report_id?: number | null;\n  [key: string]: any;\n}\n\nexport const getAllLocations = async (): Promise<Location[]> => {\n  const result = await fetchWithCache<Location[] >(\n    NAMESPACE,\n    \"locations\",\n    async () => {\n      return await post<Location[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.LOCATION,\n        fields: [],\n        values: [],\n        filter: [],\n      });\n    },\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  } else {\n    return result as Location[];\n  }\n};\n\nexport const getFieldsByLocationId = async (\n  locationId: number,\n): Promise<Field[]> => {\n  const result = await fetchWithCache<\n    Field[] \n  >(\n    NAMESPACE,\n    `fields:${locationId}`,\n    async () =>\n      await post<Field[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.FIELD,\n        fields: [],\n        values: [],\n        filter: [[\"location_id\", \"=\", Number(locationId)]],\n      }),\n  );\n\n  const maybeErrorMeasurement = result as any;\n  if (maybeErrorMeasurement?.error) {\n    console.error(maybeErrorMeasurement);\n    return [];\n  }\n\n  if ((result as any)?.isCached) {\n    const rows = (result as Field[]) || [];\n    return rows.filter(\n      (r) => String((r as any)?.location_id) === String(locationId),\n    );\n  }\n\n  return result as Field[];\n};\n\nexport const getAllWellCategories = async (\n  active = true,\n): Promise<OptionDDL[]> => {\n  const filter: ApiFilter[] = [];\n\n  if (active) {\n    filter.push([\"active\", \"=\", \"true\"]);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.WELL_CATEGORY,\n    fields: [],\n    values: [],\n    filter,\n  };\n\n  const result = await fetchWithCache<OptionDDL[] >(\n    NAMESPACE,\n    \"wellCategories\",\n    async () => await post<OptionDDL[]>(payload),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  } else {\n    return result as OptionDDL[];\n  }\n};\n\nexport const getAllPumpingMethods = async (): Promise<OptionDDL[]> => {\n  const result = await fetchWithCache<OptionDDL[] >(\n    NAMESPACE,\n    \"pumpingMethods\",\n    async () =>\n      await post<OptionDDL[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.PUMPING_METHOD,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  } else {\n    return result as OptionDDL[];\n  }\n};\n\nexport const getAllAssociatedStrategies = async (): Promise<OptionDDL[]> => {\n  const result = await fetchWithCache<OptionDDL[] >(\n    NAMESPACE,\n    \"associatedStrategies\",\n    async () =>\n      await post<OptionDDL[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.ASSOCIATED_STRATEGY,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  } else {\n    return result as OptionDDL[];\n  }\n};\n\nexport const getAllFlowStations = async (options?: {\n  forceRefresh?: boolean;\n}): Promise<OptionDDL[]> => {\n  try {\n    const result = await fetchWithCache<OptionDDL[]>(\n      NAMESPACE,\n      \"flowStations\",\n      async () =>\n        await post<OptionDDL[]>({\n          verb: API_VERBS.SELECT,\n          table: TABLE_NAMES.FLOW_STATION,\n          fields: [],\n          values: [],\n          filter: [],\n        }),\n      { shouldFetch: options?.forceRefresh, ttl: 24 * 60 },\n    );\n    return result as OptionDDL[];\n  } catch (error) {\n    console.error(\"Error fetching flowStations\", error);\n    return [] as any;\n  }\n};\n\nexport interface TreatmentPlantSystem {\n  id: number;\n  name: string;\n  active?: boolean | null;\n}\n\nexport const getTreatmentPlantSystems = async (\n  activeOnly = true,\n): Promise<OptionDDL[]> => {\n  const cacheKey = `treatmentPlantSystems:${activeOnly ? \"active\" : \"all\"}`;\n  const filter: Array<[string, string, string]> = [];\n  if (activeOnly) {\n    filter.push([\"active\", \"=\", \"true\"]);\n  }\n\n  const result = await fetchWithCache<OptionDDL[] >(\n    NAMESPACE,\n    cacheKey,\n    async () =>\n      await post<OptionDDL[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.TREATMENT_PLANT_SYSTEM,\n        fields: [],\n        values: [],\n        filter,\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  }\n\n  return (result as OptionDDL[]) ?? [];\n};\n\nexport interface TreatmentPlantDynamicStorageTank {\n  id: number;\n  name: string;\n  treatment_plant_system_id?: number | null;\n  facility_type_view?: string | null;\n}\n\nexport const getTreatmentPlantDynamicStorageTanksFiltered = async (\n  filters: Array<[string, string, number | string]>,\n): Promise<TreatmentPlantDynamicStorageTank[]> => {\n  const result = await fetchWithCache<\n    | TreatmentPlantDynamicStorageTank[]\n    \n  >(\n    NAMESPACE,\n    \"treatmentPlantDynamicStorageTanks\",\n    async () =>\n      await post<TreatmentPlantDynamicStorageTank[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.TREATMENT_PLANT_DYNAMIC_STORAGE_TANK,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  const maybeError = result as any;\n  if (maybeError?.error) {\n    console.error(maybeError);\n    return [];\n  }\n\n  const rows = (result as TreatmentPlantDynamicStorageTank[]) || [];\n  if (!filters?.length) return rows;\n  return rows.filter((row) =>\n    filters.every(\n      ([key, _op, value]) => String((row as any)[key]) === String(value),\n    ),\n  );\n};\n\nexport interface UptTank {\n  id: number;\n  name: string;\n  facility_type_view?: string | null;\n  facility_type?: string | null;\n  well_id?: number | [number, string] | null;\n  flow_station_tank_id?: number | [number, string] | null;\n}\n\nexport const getUptTanksFiltered = async (\n  filters: any[],\n  options?: { forceRefresh?: boolean },\n): Promise<UptTank[]> => {\n  try {\n    const result = await fetchWithCache<UptTank[]>(\n      NAMESPACE,\n      \"uptTanks\",\n      async () =>\n        await post<UptTank[]>({\n          verb: API_VERBS.SELECT,\n          table: TABLE_NAMES.UPT_TANK,\n          fields: [],\n          values: [],\n          filter: [],\n        }),\n      { shouldFetch: options?.forceRefresh, ttl: 24 * 60 },\n    );\n\n    const rows = (result as UptTank[]) || [];\n    if (!filters?.length) return rows as any;\n    return (rows as any[]).filter((row) =>\n      filters.every(\n        ([key, _op, value]) => String((row as any)[key]) === String(value),\n      ),\n    ) as any;\n  } catch (error) {\n    console.error(\"Error fetching uptTanks\", error);\n    return [] as any;\n  }\n};\n\nexport interface PitOption {\n  id: number;\n  name: string;\n  associated_strategy_id?: number | null;\n}\n\nexport const getPitsFiltered = async (\n  filters: any[],\n  options?: { forceRefresh?: boolean },\n): Promise<PitOption[]> => {\n  try {\n    const result = await fetchWithCache<PitOption[]>(\n      NAMESPACE,\n      \"pits\",\n      async () =>\n        await post<PitOption[]>({\n          verb: API_VERBS.SELECT,\n          table: TABLE_NAMES.PIT,\n          fields: [],\n          values: [],\n          filter: [],\n        }),\n      { shouldFetch: options?.forceRefresh, ttl: 24 * 60 },\n    );\n\n    const rows = (result as PitOption[]) || [];\n    if (!filters?.length) return rows as any;\n    return (rows as any[]).filter((row) =>\n      filters.every(\n        ([key, _op, value]) => String((row as any)[key]) === String(value),\n      ),\n    ) as any;\n  } catch (error) {\n    console.error(\"Error fetching pits\", error);\n    return [] as any;\n  }\n};\n\nexport interface VacuumLoad {\n  id: number;\n  vacuum_plate?: string | null;\n  chuto_plate?: string | null;\n  origin_facility_id?: string | null;\n  origin_facility_type?: string | null;\n  destination_facility_id?: string | null;\n  destination_facility_type?: string | null;\n  unloaded?: boolean | null;\n  date_created?: string | null;\n  date_updated?: string | null;\n  volume?: number | null;\n}\n\nexport interface VacuumLoadDetail extends VacuumLoad {\n  origin_facility_type_view?: string | null;\n  destination_facility_type_view?: string | null;\n  loading_start_time?: string | null;\n  loading_end_time?: string | null;\n  initial_content?: string | number | null;\n  final_content?: string | number | null;\n  fluid_type?: string | null;\n  comments?: string | null;\n  condition?: string | null;\n  driver_nationality?: string | null;\n  driver_id_card_number?: string | number | null;\n  driver_first_name?: string | null;\n  driver_last_name?: string | null;\n  activity_id?: number | null;\n  edition_number?: number | null;\n}\n\nexport const getAllVacuumLoads = async (): Promise<VacuumLoad[]> => {\n  const result = await fetchWithCache<VacuumLoad[] >(\n    NAMESPACE,\n    \"vacuumLoads\",\n    async () =>\n      await post<VacuumLoad[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  } else {\n    return result as VacuumLoad[];\n  }\n};\n\nexport const getVacuumLoadsSummary = async (): Promise<Array<{ id: number; unloaded: boolean | null; date_created: string | null }>> => {\n  try {\n    const rows = await post<Array<{ id: number; unloaded: boolean | null; date_created: string | null }>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n      fields: ['id', 'unloaded', 'date_created'],\n      values: [],\n      filter: [],\n    });\n    return Array.isArray(rows) ? rows : [];\n  } catch {\n    return [];\n  }\n};\n\nexport const getPendingVacuumLoads = async (): Promise<VacuumLoad[]> => {\n  try {\n    const rows = await post<VacuumLoad[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n      fields: [],\n      values: [],\n      filter: [[\"unloaded\", \"=\", false]],\n    });\n    return Array.isArray(rows) ? rows : [];\n  } catch (error) {\n    console.error(\"Error fetching pending vacuum loads\", error);\n    return [];\n  }\n};\n\nconst mergeVacuumLoadDetail = (\n  fallback?: Partial<VacuumLoadDetail>,\n  incoming?: Partial<VacuumLoadDetail>,\n): VacuumLoadDetail | null => {\n  const base = fallback ? { ...fallback } : {};\n  if (incoming) {\n    Object.assign(base, incoming);\n  }\n  return Object.keys(base).length > 0 ? (base as VacuumLoadDetail) : null;\n};\n\nexport const getVacuumLoadById = async (\n  id: number,\n  fallback?: Partial<VacuumLoadDetail>,\n): Promise<VacuumLoadDetail | null> => {\n  try {\n    const net = await NetInfo.fetch();\n    const isOnline = net.isConnected ?? true;\n\n    if (!isOnline) {\n      return mergeVacuumLoadDetail(fallback);\n    }\n\n    const result = await post<VacuumLoadDetail[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", id]],\n    });\n\n    const detail = Array.isArray(result) ? result[0] : (result as any);\n    if (detail) {\n      return mergeVacuumLoadDetail(fallback, detail);\n    }\n\n    return mergeVacuumLoadDetail(fallback);\n  } catch (error) {\n    console.error(\"Error fetching vacuum load detail\", error);\n    return mergeVacuumLoadDetail(fallback);\n  }\n};\n\nexport interface VacuumPlateInfo {\n  id: number;\n  plate_type: string;\n  vacuum_condition: string;\n  plate: string;\n}\n\nexport const getVacuumPlatesInfo = async (): Promise<VacuumPlateInfo[]> => {\n  const result = await fetchWithCache<VacuumPlateInfo[] >(\n    NAMESPACE,\n    \"vacuumPlates\",\n    async () =>\n      await post<VacuumPlateInfo[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.VACUUM_INFO,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  } else {\n    return result as VacuumPlateInfo[];\n  }\n};\n\nexport interface FacilityListItem {\n  id: string; // ej: \"well_164\"\n  name: string;\n  facility_type: string; // ej: 'well', 'pit', etc.\n}\n\nexport interface GetFacilitiesListOptions {\n  forceRefresh?: boolean;\n  cacheTtlMs?: number;\n}\n\nconst FACILITIES_LIST_CACHE_KEY = \"facilitiesList\";\nconst FACILITIES_LIST_DEFAULT_TTL_MS = 5 * 60 * 1000;\nlet facilitiesListMemoryCache: FacilityListItem[] | null = null;\nlet facilitiesListFetchedAt = 0;\nlet facilitiesListInflight: Promise<FacilityListItem[]> | null = null;\n\nexport const getCachedFacilitiesList = () => facilitiesListMemoryCache || [];\n\nexport const invalidateFacilitiesListCache = (): void => {\n  facilitiesListMemoryCache = null;\n  facilitiesListFetchedAt = 0;\n};\n\nexport const getFacilitiesList = async (\n  options?: GetFacilitiesListOptions,\n): Promise<FacilityListItem[]> => {\n  const { forceRefresh = false, cacheTtlMs = FACILITIES_LIST_DEFAULT_TTL_MS } =\n    options ?? {};\n  const netState = await NetInfo.fetch();\n  const isOnline = netState.isConnected ?? true;\n  const now = Date.now();\n  const cacheIsFresh =\n    facilitiesListMemoryCache &&\n    facilitiesListFetchedAt > 0 &&\n    now - facilitiesListFetchedAt < cacheTtlMs;\n\n  if (!isOnline && cacheIsFresh) {\n    return facilitiesListMemoryCache!;\n  }\n\n  if (!isOnline) {\n    const cached = await storageService.get<FacilityListItem[]>(\n      NAMESPACE,\n      FACILITIES_LIST_CACHE_KEY,\n    );\n    if (Array.isArray(cached)) {\n      facilitiesListMemoryCache = cached;\n      facilitiesListFetchedAt = facilitiesListFetchedAt || Date.now();\n      return cached;\n    }\n    return [];\n  }\n\n  if (!forceRefresh) {\n    if (cacheIsFresh && facilitiesListMemoryCache) {\n      return facilitiesListMemoryCache;\n    }\n\n    if (facilitiesListInflight) {\n      return facilitiesListInflight;\n    }\n  }\n\n  const loadFacilities = async (): Promise<FacilityListItem[]> => {\n    const result = await fetchWithCache<FacilityListItem[] >(\n      NAMESPACE,\n      FACILITIES_LIST_CACHE_KEY,\n      async () =>\n        await post<FacilityListItem[]>({\n          verb: API_VERBS.SELECT,\n          table: TABLE_NAMES.GET_FACILITIES_LIST,\n          fields: [],\n          values: [],\n          filter: [],\n        }),\n    );\n\n    const rows = (result as FacilityListItem[]) ?? [];\n    facilitiesListMemoryCache = rows;\n    facilitiesListFetchedAt = Date.now();\n\n    await storageService.set(\n      NAMESPACE,\n      FACILITIES_LIST_CACHE_KEY,\n      rows,\n      24 * 60,\n    );\n    return rows;\n  };\n\n  facilitiesListInflight = loadFacilities();\n  try {\n    return await facilitiesListInflight;\n  } finally {\n    facilitiesListInflight = null;\n  }\n};\n\nexport interface DriverInfo {\n  id: number;\n  card_number: string;\n  first_name: string;\n  last_name: string;\n  nationality: string; // 'venezuelan' | 'foreigner' | string\n}\n\nexport const getDriversInfo = async (): Promise<DriverInfo[]> => {\n  const result = await fetchWithCache<DriverInfo[] >(\n    NAMESPACE,\n    \"driversInfo\",\n    async () =>\n      await post<DriverInfo[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.DRIVERS_INFO,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.error(result as any);\n    return [];\n  }\n  return result as DriverInfo[];\n};\n\nfunction pad2(n: number): string {\n  return String(n).padStart(2, \"0\");\n}\n\nfunction nowTimestamp(): string {\n  const d = new Date();\n  return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;\n}\n\nfunction toInt(value: any): number | null {\n  if (value === null || value === undefined || value === \"\") return null;\n  const n = parseInt(String(value));\n  return Number.isNaN(n) ? null : n;\n}\n\nfunction toStr(value: any, def = \"\"): string {\n  return value === null || value === undefined ? def : String(value);\n}\n\nfunction toFacilityId(wellId: string) {\n  return wellId.trim().split(\"_\").pop() as string;\n}\n\nexport interface SubmitVacuumLoadStep3 {\n  origin_facility_id?: string | null;\n  origin_facility_type?: string | null;\n  origin_facility_type_view?: string | null;\n  destination_facility_id?: string | null;\n  destination_facility_type?: string | null;\n  destination_facility_type_view?: string | null;\n  startDate?: string | null; // YYYY-MM-DD\n  startTime?: string | null; // HH:mm\n  endDate?: string | null; // YYYY-MM-DD\n  endTime?: string | null; // HH:mm\n  initialMeasurement?: string | number | null;\n  finalMeasurement?: string | number | null;\n  volume?: string | number | null;\n  fluidType?: string | null;\n  comments?: string | null;\n}\n\nexport interface SubmitVacuumLoadStep4 {\n  vacuumCondition?: string | null;\n  chutoPlate?: string | null;\n  vacuumPlate?: string | null;\n}\n\nexport interface SubmitVacuumLoadStep5 {\n  nationality?: string | null;\n  driverId?: string | null;\n  driverName?: string | null;\n  driverLastName?: string | null;\n}\n\nexport interface SubmitVacuumLoadInput {\n  summary: { activity: string | null };\n  step3: SubmitVacuumLoadStep3;\n  step4: SubmitVacuumLoadStep4;\n  step5: SubmitVacuumLoadStep5;\n  userId: string | number | null;\n  edition?: { id: string | number; editionNumber?: number | null };\n}\n\nexport async function submitVacuumLoadReport(\n  input: SubmitVacuumLoadInput,\n): Promise<{ success: boolean; offline: boolean; message: string }> {\n  const ts = nowTimestamp();\n  const table = TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD;\n  const fieldsPairs: [string, string | number | boolean | null][] = [\n    [\"date_created\", ts],\n    [\"date_updated\", ts],\n    [\n      \"edition_number\",\n      input.edition ? (Number(input.edition.editionNumber) || 0) + 1 : 0,\n    ],\n    [\"activity_id\", input.summary.activity === \"Producción\" ? 1 : 2],\n    [\"user_id\", toStr(input.userId)],\n    [\"vacuum_plate\", toStr(input.step4.vacuumPlate)],\n    [\"chuto_plate\", toStr(input.step4.chutoPlate)],\n    [\"driver_nationality\", toStr(input.step5.nationality)],\n    [\"driver_id_card_number\", toStr(input.step5.driverId)],\n    [\"driver_first_name\", toStr(input.step5.driverName)],\n    [\"driver_last_name\", toStr(input.step5.driverLastName)],\n    [\"origin_facility_id\", toFacilityId(input.step3.origin_facility_id!)],\n    [\"origin_facility_type\", toStr(input.step3.origin_facility_type)],\n    [\n      \"origin_facility_type_view\",\n      toStr(\n        input.step3.origin_facility_type_view ?? input.step3.origin_facility_id,\n      ),\n    ],\n    [\n      \"loading_start_time\",\n      `${toStr(input.step3.startDate)} ${toStr(input.step3.startTime)}:00`,\n    ],\n    [\"initial_content\", toInt(input.step3.initialMeasurement)],\n    [\n      \"loading_end_time\",\n      `${toStr(input.step3.endDate)} ${toStr(input.step3.endTime)}:00`,\n    ],\n    [\"final_content\", toInt(input.step3.finalMeasurement)],\n    [\"volume\", toInt(input.step3.volume)],\n    [\"fluid_type\", toStr(input.step3.fluidType)],\n    [\n      \"destination_facility_id\",\n      toFacilityId(input.step3.destination_facility_id!),\n    ],\n    [\"destination_facility_type\", toStr(input.step3.destination_facility_type)],\n    [\n      \"destination_facility_type_view\",\n      toStr(\n        input.step3.destination_facility_type_view ??\n          input.step3.destination_facility_id,\n      ),\n    ],\n    [\"condition\", toStr(input.step4.vacuumCondition)],\n    [\"company\", \"\"],\n    [\"company_id\", 1],\n    [\"unloaded\", false],\n  ];\n\n  const excludeOnEdit = new Set([\"date_created\", \"user_id\"]);\n  const pairs = input.edition\n    ? fieldsPairs.filter(([k]) => !excludeOnEdit.has(k))\n    : fieldsPairs;\n\n  const payload = {\n    verb: input.edition ? \"update\" : \"insert\",\n    table,\n    fields: pairs.map(([k]) => k),\n    values: pairs.map(([, v]) => v),\n    filter: input.edition ? [[\"id\", \"=\", input.edition.id]] : [],\n  } as const;\n\n  const result = await submitReportWithOfflineFallback(table, payload as any);\n\n  if (result.success && !input.edition) {\n    try {\n      await storageService.remove(NAMESPACE, \"vacuumLoads\");\n    } catch (error) {\n      console.error(\"Error invalidating vacuum loads cache\", error);\n    }\n  }\n\n  return result;\n}\n\nexport interface SubmitVacuumUnloadStep4 {\n  startDate?: string | null;\n  startTime?: string | null;\n  endDate?: string | null;\n  endTime?: string | null;\n  finalMeasurement?: string | number | null;\n  volume?: string | number | null;\n  fluidType?: string | null;\n  finalDestinationId?: string | null;\n  comments?: string | null;\n}\n\nexport interface SubmitVacuumUnloadStep5 {\n  receiverName?: string | null;\n  receiverId?: string | null;\n  observations?: string | null;\n}\n\nexport interface SubmitVacuumUnloadInput {\n  summary: { activity: string | null };\n  vacuumLoadId: number;\n  step3LoadData: {\n    vacuumPlate?: string | null;\n    chutoPlate?: string | null;\n    originFacilityId?: string | null;\n    originFacilityType?: string | null;\n  };\n  step4: SubmitVacuumUnloadStep4;\n  step5: SubmitVacuumLoadStep5;\n  userId: string | number | null;\n  vacuumCondition?: string | null;\n  edition?: { id: string | number; editionNumber?: number | null };\n}\n\nexport async function submitVacuumUnloadReport(\n  input: SubmitVacuumUnloadInput,\n): Promise<{ success: boolean; offline: boolean; message: string }> {\n  const ts = nowTimestamp();\n  const unloadTable = TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD;\n\n  const unloadPairs: [string, string | number | boolean | null][] = [\n    [\"date_created\", ts],\n    [\"date_updated\", ts],\n    [\n      \"edition_number\",\n      input.edition ? (Number(input.edition.editionNumber) || 0) + 1 : 0,\n    ],\n    [\"activity_id\", input.summary.activity === \"Producción\" ? 1 : 2],\n    [\"user_id\", toStr(input.userId)],\n    [\"vacuum_plate\", toStr(input.step3LoadData.vacuumPlate)],\n    [\"chuto_plate\", toStr(input.step3LoadData.chutoPlate)],\n    [\"driver_nationality\", toStr(input.step5.nationality)],\n    [\"driver_id_card_number\", toStr(input.step5.driverId)],\n    [\"driver_first_name\", toStr(input.step5.driverName)],\n    [\"driver_last_name\", toStr(input.step5.driverLastName)],\n    [\n      \"destination_facility_id\",\n      input.step4.finalDestinationId\n        ? toFacilityId(input.step4.finalDestinationId)\n        : 0,\n    ],\n    [\"destination_facility_type\", \"\"],\n    [\"destination_facility_type_view\", toStr(input.step4.finalDestinationId)],\n    [\n      \"unloading_start_time\",\n      `${toStr(input.step4.startDate)} ${toStr(input.step4.startTime)}:00`,\n    ],\n    [\"initial_content\", null],\n    [\n      \"unloading_end_time\",\n      `${toStr(input.step4.endDate)} ${toStr(input.step4.endTime)}:00`,\n    ],\n    [\"final_content\", toInt(input.step4.finalMeasurement)],\n    [\"volume\", toInt(input.step4.volume)],\n    [\"fluid_type\", toStr(input.step4.fluidType)],\n    [\"condition\", toStr(input.vacuumCondition)],\n    [\"company\", \"\"],\n    [\"company_id\", 1],\n    [\"comment\", toStr(input.step4.comments)],\n    [\"vacuum_load_id\", input.vacuumLoadId],\n  ];\n\n  const excludeOnEdit = new Set([\"date_created\", \"user_id\"]);\n  const pairs = input.edition\n    ? unloadPairs.filter(([k]) => !excludeOnEdit.has(k))\n    : unloadPairs;\n\n  const unloadPayload = {\n    verb: input.edition ? \"update\" : \"insert\",\n    table: unloadTable,\n    fields: pairs.map(([k]) => k),\n    values: pairs.map(([, v]) => v),\n    filter: input.edition ? [[\"id\", \"=\", input.edition.id]] : [],\n  } as const;\n\n  const unloadResult = await submitReportWithOfflineFallback(unloadTable, unloadPayload as any);\n\n  if (unloadResult.success && !input.edition) {\n    try {\n      await post<any>({\n        verb: \"update\",\n        table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n        fields: [\"unloaded\", \"date_updated\"],\n        values: [true, ts],\n        filter: [[\"id\", \"=\", input.vacuumLoadId]],\n      });\n\n      await storageService.remove(NAMESPACE, \"vacuumLoads\");\n      await storageService.removeByPrefix(\n        NAMESPACE,\n        `reportsHistory:${TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD}:`,\n      );\n      DeviceEventEmitter.emit(\"reports:refresh\", {\n        table: TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n      });\n    } catch (error) {\n      console.error(\"Error marking vacuum load as unloaded\", error);\n    }\n  }\n\n  return unloadResult;\n}\n\nexport const getWellsFiltered = async (\n  filters: Array<[string, string, number | string]>,\n): Promise<Well[]> => {\n  const normalizedFilters: WellFilterTuple[] = Array.isArray(filters)\n    ? filters\n    : [];\n\n  if (normalizedFilters.length > 0) {\n    const allWellsCache = await storageService.get<Well[]>(\n      NAMESPACE,\n      WELLS_ALL_CACHE_KEY,\n      true,\n    );\n    if (Array.isArray(allWellsCache) && allWellsCache.length > 0) {\n      return filterWellsInMemory(allWellsCache, normalizedFilters);\n    }\n  }\n\n  const cacheKey = buildWellsCacheKey(normalizedFilters);\n  const result = await fetchWithCache<Well[] >(\n    NAMESPACE,\n    cacheKey,\n    async () =>\n      await post<Well[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.WELL,\n        fields: [],\n        values: [],\n        filter: normalizedFilters,\n      }),\n  );\n\n  const maybeError = result as any;\n  if (maybeError?.error) {\n    console.error(maybeError);\n    return [];\n  }\n\n  if (maybeError?.isCached) {\n    const rows = (maybeError as Well[]) || [];\n    return filterWellsInMemory(rows, normalizedFilters);\n  }\n\n  const rows = (result as Well[]) ?? [];\n  if (normalizedFilters.length === 0) {\n    await storageService.set(NAMESPACE, WELLS_ALL_CACHE_KEY, rows, 24 * 60);\n    await storageService.set(NAMESPACE, WELLS_LEGACY_CACHE_KEY, rows, 24 * 60);\n  }\n  return rows;\n};\n\nexport const getWellCategoryType = async (\n  wellCategoryId: string,\n): Promise<OptionDDL[]> => {\n  const cacheKey = `wellCategoryType:${wellCategoryId}`;\n  const result = await fetchWithCache<OptionDDL[] >(\n    NAMESPACE,\n    cacheKey,\n    async () =>\n      await post<OptionDDL[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.WELL_CATEGORY,\n        fields: [\"name\"],\n        values: [],\n        filter: [[\"id\", \"=\", wellCategoryId]],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    const cachedCategories =\n      (await storageService.get<OptionDDL[]>(NAMESPACE, \"wellCategories\")) ??\n      [];\n    const match = cachedCategories.find(\n      (opt: OptionDDL) => String(opt.id) === String(wellCategoryId),\n    );\n    return match ? [match] : [];\n  }\n\n  return (result as OptionDDL[]) ?? [];\n};\n\nexport const getAllWellClusters = async (): Promise<OptionDDL[]> => {\n  const result = await fetchWithCache<OptionDDL[] >(\n    NAMESPACE,\n    \"wellClusters\",\n    async () =>\n      await post<OptionDDL[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.WELL_CLUSTER,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  if ((result as any)?.error) {\n    console.warn(\"wellClusters fallback:\", result);\n    return [];\n  }\n  return result as OptionDDL[];\n};\n\nexport const getDailyReportWellById = async (\n  id: number,\n): Promise<DailyReportWell | null> => {\n  try {\n    const result = await post<DailyReportWell[] | DailyReportWell>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_WELL,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    if (Array.isArray(result)) {\n      return result[0] ?? null;\n    }\n\n    if (result && typeof result === \"object\") {\n      return result as DailyReportWell;\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"Error fetching getDailyReportWellById\", error);\n    throw error;\n  }\n};\n\nexport const getWellByIdCached = async (\n  wellId: number,\n): Promise<Well | null> => {\n  const rows = await getWellsFiltered([[\"id\", \"=\", Number(wellId)]]);\n  return rows?.[0] ?? null;\n};\n\nexport const getWellPotentialAndRgp = async (\n  wellId: number,\n): Promise<{ potencial: number | null; rgp: number | null }> => {\n  const well = await getWellByIdCached(Number(wellId));\n  return {\n    potencial: (well as Well | null)?.potencial ?? null,\n    rgp: (well as Well | null)?.rgp ?? null,\n  };\n};\n\nexport interface MeasurementPoint {\n  id: number;\n  name: string;\n  field_id?: number | null;\n  flow_station_id?: number | null;\n  location_id?: number | null;\n  [key: string]: any;\n}\n\nexport interface FlowStationTank {\n  id: number;\n  name: string;\n  flow_station_id: number;\n  active: boolean;\n  location: any;\n  conversion_factor: string;\n}\n\nexport interface DailyReportMeasurementPoint {\n  id: number;\n  measurement_point_id: number | null;\n  activity_id?: number | null;\n  status?: string | null;\n  sample_taken?: boolean | null;\n  raw_operated_production?: number | null;\n  net_operated_production?: number | null;\n  lab_analysis?: boolean | null;\n  date_created?: string | null;\n  date_updated?: string | null;\n  edition_number?: number | null;\n  [key: string]: any;\n}\n\nexport const getMeasurementPointsFiltered = async (\n  filters: any[],\n  options?: { forceRefresh?: boolean },\n): Promise<MeasurementPoint[]> => {\n  try {\n    const result = await fetchWithCache<MeasurementPoint[]>(\n      NAMESPACE,\n      \"measurementPoints\",\n      async () =>\n        await post<MeasurementPoint[]>({\n          verb: API_VERBS.SELECT,\n          table: TABLE_NAMES.MEASUREMENT_POINT,\n          fields: [],\n          values: [],\n          filter: [],\n        }),\n      { shouldFetch: options?.forceRefresh, ttl: 24 * 60 },\n    );\n\n    const rows = (result as MeasurementPoint[]) || [];\n    if (!filters?.length) return rows as any;\n    return (rows as any[]).filter((row) =>\n      filters.every(\n        ([key, _op, value]) => String((row as any)[key]) === String(value),\n      ),\n    ) as any;\n  } catch (error) {\n    console.error(\"Error fetching measurementPoints\", error);\n    return [] as any;\n  }\n};\n\nexport const getMeasurementPointByIdCached = async (\n  id: number,\n): Promise<MeasurementPoint | null> => {\n  const rows = await getMeasurementPointsFiltered([[\"id\", \"=\", Number(id)]]);\n  return rows?.[0] ?? null;\n};\n\nexport const getFlowStationTanksFiltered = async (\n  filters: any[],\n  options?: { forceRefresh?: boolean },\n): Promise<FlowStationTank[]> => {\n  const ttl = process.env.NODE_ENV === \"development\" ? 5 : 24 * 60;\n  const config = await configService.getEffectiveConfig();\n  const url = config?.API_BASE_URL;\n  if (!url) {\n    throw Error(\n      \"🚨 [getFlowStationTanksFiltered] ERROR! API_BASE_URL is missing in config.\",\n    );\n  }\n\n  try {\n    const result = await fetchWithCache<FlowStationTank[]>(\n      NAMESPACE,\n      \"flowStationTanks\",\n      async () =>\n        await purePost<FlowStationTank[]>(url, {\n          verb: API_VERBS.SELECT,\n          table: TABLE_NAMES.FLOW_STATION_TANK,\n          fields: [],\n          values: [],\n          filter: [],\n        }),\n      { shouldFetch: options?.forceRefresh, ttl },\n    );\n\n    const rows = (result as FlowStationTank[]) || [];\n    if (!filters?.length) return rows as any;\n    return (rows as any[]).filter((row) =>\n      filters.every(\n        ([key, _op, value]) => String((row as any)[key]) === String(value),\n      ),\n    ) as any;\n  } catch (error) {\n    console.error(\"Error fetching flowStationTanks\", error);\n    return [] as any;\n  }\n};\n\nexport const getFlowStationTankByIdCached = async (\n  id: number,\n): Promise<FlowStationTank | null> => {\n  const rows = await getFlowStationTanksFiltered([[\"id\", \"=\", Number(id)]]);\n  return rows?.[0] ?? null;\n};\n\nexport interface FlowStationTankReport {\n  id: number;\n  date_created: string;\n  date_updated: string;\n  edition_number: number;\n  activity_id: number;\n  user_id: string;\n  flow_station_tank_id: number;\n  status: string;\n  current_stock: string | null;\n  sample_taken: boolean;\n  net_operated_production: string | null;\n  tank_level: string | null;\n  filling_start_date: string | null;\n  filling_start_level: string | null;\n  filling_end_date: string | null;\n  filling_end_level: string | null;\n  raw_operated_production: string | null;\n  lab_analysis: boolean;\n  comments: string | null;\n}\n\nexport const getDailyReportFlowStationTankById = async (\n  id: number,\n): Promise<FlowStationTankReport | null> => {\n  try {\n    const result = await post<FlowStationTankReport[] | FlowStationTankReport>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_FLOW_STATION_TANK,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    if (Array.isArray(result)) {\n      return result[0] ?? null;\n    }\n\n    if (result && typeof result === \"object\") {\n      return result as FlowStationTankReport;\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"Error fetching dailyReportFlowStationTank\", error);\n    throw error; // Let react-query catch the error to handle offline state\n  }\n};\n\nexport const getDailyReportDynamicSettlementTankById = async (\n  id: number,\n): Promise<TreatmentPlantDynamicStorageTank | null> => {\n  try {\n    const result = await post<TreatmentPlantDynamicStorageTank[] | TreatmentPlantDynamicStorageTank>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    if (Array.isArray(result)) {\n      return result[0] ?? null;\n    }\n\n    if (result && typeof result === \"object\") {\n      return result as TreatmentPlantDynamicStorageTank;\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"Error fetching getDailyReportDynamicSettlementTankById\", error);\n    throw error;\n  }\n};\n\nexport const getDailyReportStorageTankById = async (\n  id: number,\n): Promise<TreatmentPlantDynamicStorageTank | null> => {\n  try {\n    const result = await post<TreatmentPlantDynamicStorageTank[] | TreatmentPlantDynamicStorageTank>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_STORAGE_TANK,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    if (Array.isArray(result)) {\n      return result[0] ?? null;\n    }\n\n    if (result && typeof result === \"object\") {\n      return result as TreatmentPlantDynamicStorageTank;\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"Error fetching getDailyReportStorageTankById\", error);\n    throw error;\n  }\n};\n\nexport const getTreatmentPlantDynamicStorageTankById = async (\n  id: number,\n): Promise<TreatmentPlantDynamicStorageTank | null> => {\n  try {\n    const result = await post<TreatmentPlantDynamicStorageTank[] | TreatmentPlantDynamicStorageTank>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.TREATMENT_PLANT_DYNAMIC_STORAGE_TANK,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    if (Array.isArray(result)) {\n      return result[0] ?? null;\n    }\n\n    if (result && typeof result === \"object\") {\n      return result as TreatmentPlantDynamicStorageTank;\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"Error fetching getTreatmentPlantDynamicStorageTankById\", error);\n    throw error;\n  }\n};\n\nexport const getDailyReportUptTankById = async (\n  id: number,\n): Promise<UptTank | null> => {\n  const result = await fetchWithCache<\n    UptTank[] | UptTank \n  >(\n    NAMESPACE,\n    `dailyReportUptTank:${id}`,\n    async () =>\n      await post<UptTank[] | UptTank>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.DAILY_REPORT_UPT_TANK,\n        fields: [],\n        values: [],\n        filter: [[\"id\", \"=\", Number(id)]],\n      }),\n  );\n\n  const maybeError = result as any;\n  if (maybeError?.error) {\n    console.error(maybeError);\n    return null;\n  }\n\n  if (Array.isArray(result)) {\n    return result[0] ?? null;\n  }\n\n  if (result && typeof result === \"object\") {\n    return result as UptTank;\n  }\n\n  return null;\n};\n\nexport const getUptTankById = async (id: number): Promise<UptTank | null> => {\n  const result = await fetchWithCache<\n    UptTank[] | UptTank \n  >(\n    NAMESPACE,\n    `uptTank:${id}`,\n    async () =>\n      await post<UptTank[] | UptTank>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.UPT_TANK,\n        fields: [],\n        values: [],\n        filter: [[\"id\", \"=\", Number(id)]],\n      }),\n  );\n\n  const maybeError = result as any;\n  if (maybeError?.error) {\n    console.error(maybeError);\n    return null;\n  }\n\n  if (Array.isArray(result)) {\n    return result[0] ?? null;\n  }\n\n  if (result && typeof result === \"object\") {\n    return result as UptTank;\n  }\n\n  return null;\n};\n\nconst usersInfoMemoryCache = new Map<string | number, string>();\n\nexport const getCachedUsersInfo = () => new Map(usersInfoMemoryCache);\n\nexport async function getUsersInfoByIds(\n  userIds: Array<string | number>,\n): Promise<Map<string | number, string>> {\n  const namesMap = new Map<string | number, string>();\n\n  if (userIds.length === 0) {\n    return namesMap;\n  }\n\n  const missingUserIds: Array<string | number> = [];\n\n  userIds.forEach((id) => {\n    if (usersInfoMemoryCache.has(id)) {\n      namesMap.set(id, usersInfoMemoryCache.get(id)!);\n    } else {\n      missingUserIds.push(id);\n    }\n  });\n\n  if (missingUserIds.length === 0) {\n    return namesMap;\n  }\n\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.USER_INFO,\n      fields: [\"entra_id\", \"display_name\"],\n      values: [],\n      filter: [[\"entra_id\", \"in\", missingUserIds]],\n    } as ApiPostBody);\n\n    if (Array.isArray(result)) {\n      result.forEach((user) => {\n        if (user?.entra_id && user?.display_name) {\n          const name = String(user.display_name);\n          usersInfoMemoryCache.set(user.entra_id, name);\n          namesMap.set(user.entra_id, name);\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching user names:\", error);\n  }\n\n  return namesMap;\n}\n\nconst tanksMemoryCache = new Map<string | number, string>();\n\nexport const getCachedTanksInfo = () => new Map(tanksMemoryCache);\n\nexport async function getTreatmentPlantDynamicStorageTanksByIds(\n  tankIds: Array<string | number>,\n): Promise<Map<string | number, string>> {\n  const namesMap = new Map<string | number, string>();\n\n  if (tankIds.length === 0) {\n    return namesMap;\n  }\n\n  const missingIds: Array<string | number> = [];\n\n  tankIds.forEach((id) => {\n    if (tanksMemoryCache.has(id)) {\n      namesMap.set(id, tanksMemoryCache.get(id)!);\n    } else {\n      missingIds.push(id);\n    }\n  });\n\n  if (missingIds.length === 0) {\n    return namesMap;\n  }\n\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.TREATMENT_PLANT_DYNAMIC_STORAGE_TANK,\n      fields: [\"id\", \"name\"],\n      values: [],\n      filter: [[\"id\", \"in\", missingIds]],\n    } as ApiPostBody);\n\n    if (Array.isArray(result)) {\n      result.forEach((tank) => {\n        if (tank?.id && tank?.name) {\n          const name = String(tank.name);\n          tanksMemoryCache.set(tank.id, name);\n          namesMap.set(tank.id, name);\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching tank names:\", error);\n  }\n\n  return namesMap;\n}\n\nconst wellsMemoryCache = new Map<string | number, string>();\n\nexport const getCachedWellsInfo = () => new Map(wellsMemoryCache);\n\nexport async function getWellsByIds(\n  wellIds: Array<string | number>,\n): Promise<Map<string | number, string>> {\n  const namesMap = new Map<string | number, string>();\n\n  if (wellIds.length === 0) {\n    return namesMap;\n  }\n\n  const missingIds: Array<string | number> = [];\n\n  wellIds.forEach((id) => {\n    if (wellsMemoryCache.has(id)) {\n      namesMap.set(id, wellsMemoryCache.get(id)!);\n    } else {\n      missingIds.push(id);\n    }\n  });\n\n  if (missingIds.length === 0) {\n    return namesMap;\n  }\n\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.WELL,\n      fields: [\"id\", \"name\"],\n      values: [],\n      filter: [[\"id\", \"in\", missingIds]],\n    } as ApiPostBody);\n\n    if (Array.isArray(result)) {\n      result.forEach((well) => {\n        if (well?.id && well?.name) {\n          const name = String(well.name);\n          wellsMemoryCache.set(well.id, name);\n          namesMap.set(well.id, name);\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching well names:\", error);\n  }\n\n  return namesMap;\n}\n\nconst measurementPointsMemoryCache = new Map<string | number, string>();\n\nexport const getCachedMeasurementPointsInfo = () =>\n  new Map(measurementPointsMemoryCache);\n\nexport async function getMeasurementPointsByIds(\n  measurementPointIds: Array<string | number>,\n): Promise<Map<string | number, string>> {\n  const namesMap = new Map<string | number, string>();\n\n  if (measurementPointIds.length === 0) {\n    return namesMap;\n  }\n\n  const missingIds: Array<string | number> = [];\n\n  measurementPointIds.forEach((id) => {\n    if (measurementPointsMemoryCache.has(id)) {\n      namesMap.set(id, measurementPointsMemoryCache.get(id)!);\n    } else {\n      missingIds.push(id);\n    }\n  });\n\n  if (missingIds.length === 0) {\n    return namesMap;\n  }\n\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.MEASUREMENT_POINT,\n      fields: [\"id\", \"name\"],\n      values: [],\n      filter: [[\"id\", \"in\", missingIds]],\n    } as ApiPostBody);\n\n    if (Array.isArray(result)) {\n      result.forEach((mp) => {\n        if (mp?.id && mp?.name) {\n          const name = String(mp.name);\n          measurementPointsMemoryCache.set(mp.id, name);\n          namesMap.set(mp.id, name);\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching measurement point names:\", error);\n  }\n\n  return namesMap;\n}\n\nconst pitsMemoryCache = new Map<string | number, string>();\n\nexport const getCachedPitsInfo = () => new Map(pitsMemoryCache);\n\nexport async function getPitsByIds(\n  pitIds: Array<string | number>,\n): Promise<Map<string | number, string>> {\n  const namesMap = new Map<string | number, string>();\n\n  if (pitIds.length === 0) {\n    return namesMap;\n  }\n\n  const missingIds: Array<string | number> = [];\n\n  pitIds.forEach((id) => {\n    if (pitsMemoryCache.has(id)) {\n      namesMap.set(id, pitsMemoryCache.get(id)!);\n    } else {\n      missingIds.push(id);\n    }\n  });\n\n  if (missingIds.length === 0) {\n    return namesMap;\n  }\n\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.PIT,\n      fields: [\"id\", \"name\"],\n      values: [],\n      filter: [[\"id\", \"in\", missingIds]],\n    } as ApiPostBody);\n\n    if (Array.isArray(result)) {\n      result.forEach((pit) => {\n        if (pit?.id && pit?.name) {\n          const name = String(pit.name);\n          pitsMemoryCache.set(pit.id, name);\n          namesMap.set(pit.id, name);\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching pit names:\", error);\n  }\n\n  return namesMap;\n}\n\nconst uptTanksMemoryCache = new Map<string | number, string>();\nconst uptTanksFacilityTypeViewsMemoryCache = new Map<\n  string | number,\n  string | null\n>();\n\nexport const getCachedUptTanksInfo = () => ({\n  names: new Map(uptTanksMemoryCache),\n  facilityTypeViews: new Map(uptTanksFacilityTypeViewsMemoryCache),\n});\n\nexport async function getUptTanksByIds(\n  uptTankIds: Array<string | number>,\n): Promise<{\n  names: Map<string | number, string>;\n  facilityTypeViews: Map<string | number, string | null>;\n}> {\n  const namesMap = new Map<string | number, string>();\n  const facilityTypeViewMap = new Map<string | number, string | null>();\n\n  if (uptTankIds.length === 0) {\n    return { names: namesMap, facilityTypeViews: facilityTypeViewMap };\n  }\n\n  const missingIds: Array<string | number> = [];\n\n  uptTankIds.forEach((id) => {\n    if (uptTanksMemoryCache.has(id)) {\n      namesMap.set(id, uptTanksMemoryCache.get(id)!);\n      facilityTypeViewMap.set(\n        id,\n        uptTanksFacilityTypeViewsMemoryCache.get(id) ?? null,\n      );\n    } else {\n      missingIds.push(id);\n    }\n  });\n\n  if (missingIds.length === 0) {\n    return { names: namesMap, facilityTypeViews: facilityTypeViewMap };\n  }\n\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.UPT_TANK,\n      fields: [\"id\", \"name\", \"facility_type_view\"],\n      values: [],\n      filter: [[\"id\", \"in\", missingIds]],\n    } as ApiPostBody);\n\n    if (Array.isArray(result)) {\n      result.forEach((tank) => {\n        if (tank?.id) {\n          if (tank?.name) {\n            const name = String(tank.name);\n            uptTanksMemoryCache.set(tank.id, name);\n            namesMap.set(tank.id, name);\n          }\n          if (tank?.facility_type_view !== undefined) {\n            const view = tank.facility_type_view\n              ? String(tank.facility_type_view)\n              : null;\n            uptTanksFacilityTypeViewsMemoryCache.set(tank.id, view);\n            facilityTypeViewMap.set(tank.id, view);\n          }\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching UPT tank names:\", error);\n  }\n\n  return { names: namesMap, facilityTypeViews: facilityTypeViewMap };\n}\n\nconst flowStationNamesByTankIdMemoryCache = new Map<string | number, string>();\n\nexport const getCachedFlowStationNames = () =>\n  new Map(flowStationNamesByTankIdMemoryCache);\n\nexport async function getFlowStationNamesByTankIds(\n  flowStationTankIds: Array<string | number>,\n): Promise<Map<string | number, string>> {\n  const namesMap = new Map<string | number, string>();\n\n  if (flowStationTankIds.length === 0) {\n    return namesMap;\n  }\n\n  const missingIds: Array<string | number> = [];\n\n  flowStationTankIds.forEach((id) => {\n    if (flowStationNamesByTankIdMemoryCache.has(id)) {\n      namesMap.set(id, flowStationNamesByTankIdMemoryCache.get(id)!);\n    } else {\n      missingIds.push(id);\n    }\n  });\n\n  if (missingIds.length === 0) {\n    return namesMap;\n  }\n\n  try {\n    const tankResult = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.FLOW_STATION_TANK,\n      fields: [\"id\", \"flow_station_id\"],\n      values: [],\n      filter: [[\"id\", \"in\", missingIds]],\n    } as ApiPostBody);\n\n    if (!Array.isArray(tankResult)) {\n      return namesMap;\n    }\n\n    const flowStationIds = new Set<string | number>();\n    const tankToFlowStationMap = new Map<string | number, string | number>();\n\n    tankResult.forEach((tank) => {\n      if (tank?.id && tank?.flow_station_id) {\n        flowStationIds.add(tank.flow_station_id);\n        tankToFlowStationMap.set(tank.id, tank.flow_station_id);\n      }\n    });\n\n    if (flowStationIds.size === 0) {\n      return namesMap;\n    }\n\n    const flowStationResult = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.FLOW_STATION,\n      fields: [\"id\", \"name\"],\n      values: [],\n      filter: [[\"id\", \"in\", Array.from(flowStationIds)]],\n    } as ApiPostBody);\n\n    if (Array.isArray(flowStationResult)) {\n      const flowStationNames = new Map<string | number, string>();\n      flowStationResult.forEach((fs) => {\n        if (fs?.id && fs?.name) {\n          flowStationNames.set(fs.id, String(fs.name));\n        }\n      });\n\n      tankToFlowStationMap.forEach((flowStationId, tankId) => {\n        const flowStationName = flowStationNames.get(flowStationId);\n        if (flowStationName) {\n          flowStationNamesByTankIdMemoryCache.set(tankId, flowStationName);\n          namesMap.set(tankId, flowStationName);\n        }\n      });\n    }\n  } catch (error) {\n    console.error(\"Error fetching flow station names:\", error);\n  }\n\n  return namesMap;\n}\n\nexport async function getReportById(\n  table: ReportHistoryTable,\n  id: string | number,\n): Promise<Record<string, any> | null> {\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n    return Array.isArray(result) && result.length > 0\n      ? (result[0] ?? null)\n      : null;\n  } catch (error) {\n    console.error(\n      `Error fetching report from table ${table} with id ${id}:`,\n      error,\n    );\n    return null;\n  }\n}\n\nexport async function getActivityById(\n  id: string | number,\n): Promise<Record<string, any> | null> {\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ACTIVITY,\n      fields: [\"name\"],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n    return Array.isArray(result) && result.length > 0\n      ? (result[0] ?? null)\n      : null;\n  } catch (error) {\n    console.error(`Error fetching activity with id ${id}:`, error);\n    return null;\n  }\n}\n\nexport async function getAssociatedStrategyById(\n  id: string | number,\n): Promise<Record<string, any> | null> {\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ASSOCIATED_STRATEGY,\n      fields: [\"name\"],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n    return Array.isArray(result) && result.length > 0\n      ? (result[0] ?? null)\n      : null;\n  } catch (error) {\n    console.error(`Error fetching associated strategy with id ${id}:`, error);\n    return null;\n  }\n}\n\nexport async function getUserInfoById(\n  id: string | number,\n): Promise<Record<string, any> | null> {\n  try {\n    const result = await post<Array<Record<string, any>>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.USER_INFO,\n      fields: [\"display_name\"],\n      values: [],\n      filter: [[\"entra_id\", \"=\", String(id)]],\n    });\n    return Array.isArray(result) && result.length > 0\n      ? (result[0] ?? null)\n      : null;\n  } catch (error) {\n    console.error(`Error fetching user info with id ${id}:`, error);\n    return null;\n  }\n}\n\nexport const getPitByIdCached = async (\n  id: number,\n): Promise<PitOption | null> => {\n  const rows = await getPitsFiltered([[\"id\", \"=\", Number(id)]]);\n  return rows?.[0] ?? null;\n};\n\nexport const getFlowStationByIdCached = async (\n  id: number,\n): Promise<OptionDDL | null> => {\n  const allFlowStations = await getAllFlowStations();\n  return allFlowStations.find((fs) => String(fs.id) === String(id)) ?? null;\n};\n\nexport const getDailyReportMeasurementPointById = async (\n  id: number,\n): Promise<DailyReportMeasurementPoint | null> => {\n  try {\n    const result = await post<DailyReportMeasurementPoint[] | DailyReportMeasurementPoint>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n\n    if (Array.isArray(result)) {\n      return result[0] ?? null;\n    }\n\n    if (result && typeof result === \"object\") {\n      return result as DailyReportMeasurementPoint;\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"Error fetching getDailyReportMeasurementPointById\", error);\n    throw error;\n  }\n};\n\nexport const getFieldByIdCached = async (id: number): Promise<Field | null> => {\n  const result = await fetchWithCache<\n    Field[] \n  >(\n    NAMESPACE,\n    \"fieldsAll\",\n    async () =>\n      await post<Field[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.FIELD,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  const maybeErrorDetail = result as any;\n  if (maybeErrorDetail?.error) {\n    console.error(maybeErrorDetail);\n    return null;\n  }\n\n  const rows = (result as Field[]) || [];\n  const fromCache = (result as any)?.isCached;\n  if (!fromCache) {\n    const match = rows.find((row) => String(row.id) === String(id));\n    if (match) return match;\n  }\n\n  return rows.find((row) => String(row.id) === String(id)) ?? null;\n};\n\nexport const getLocationByIdCached = async (\n  id: number,\n): Promise<Location | null> => {\n  const result = await fetchWithCache<\n    Location[] \n  >(\n    NAMESPACE,\n    \"locationsAll\",\n    async () =>\n      await post<Location[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.LOCATION,\n        fields: [],\n        values: [],\n        filter: [],\n      }),\n  );\n\n  const cachedDetailWrapper = result as any;\n\n  if (cachedDetailWrapper?.error) {\n    console.error(cachedDetailWrapper);\n    return null;\n  }\n\n  const rows = (result as Location[]) || [];\n  return rows.find((row) => String(row.id) === String(id)) ?? null;\n};\n\nfunction inferModuleFromTable(table: string): string {\n  if (table.includes('daily_report')) return 'dailyReport';\n  if (table.includes('ods')) return 'ods';\n  if (table.includes('machinery')) return 'machinery';\n  if (table.includes('lab')) return 'labReports';\n  return 'otherReports';\n}\n\nasync function isOnline(): Promise<boolean> {\n  try {\n    const net = await NetInfo.fetch();\n    return net.isConnected ?? true;\n  } catch {\n    return true;\n  }\n}\n\nasync function sendReportOnline(payload: ApiPostBody): Promise<void> {\n  await post<any>(payload);\n}\n\nfunction getHttpStatusFromError(error: unknown): number | null {\n  const message = error instanceof Error ? error.message : String(error);\n  const match = message.match(/^HTTP\\s+(\\d{3})\\s*:/i);\n  if (!match?.[1]) {\n    return null;\n  }\n  const parsed = Number(match[1]);\n  return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport async function submitReport(payload: ApiPostBody): Promise<void> {\n  console.log(\"📤 ONLINE: Sending report directly...\");\n  await sendReportOnline(payload);\n  console.log(\"✅ ONLINE: Report sent successfully\");\n}\n\nexport async function submitReportWithOfflineFallback(\n  table: string,\n  payload: ApiPostBody,\n  onSuccess?: () => void,\n  onError?: (error: string) => void,\n): Promise<{ success: boolean; offline: boolean; message: string }> {\n  const online = await isOnline();\n  const moduleName = inferModuleFromTable(table);\n\n  if (!online) {\n    try {\n      const reportId = await offlineMutationQueueService.saveMutationForLater(\n        moduleName,\n        payload as unknown as Record<string, unknown>\n      );\n\n      console.log(\"💾 OFFLINE: Report saved for later sync:\", reportId);\n\n      await storageService.removeByPrefix(\n        NAMESPACE,\n        `reportsHistory:${table}:`,\n      );\n      DeviceEventEmitter.emit(\"reports:refresh\", { table });\n\n      onSuccess?.();\n      return {\n        success: true,\n        offline: true,\n        message: \"Reporte guardado. Se enviará cuando tengas conexión.\",\n      };\n    } catch (error: any) {\n      console.error(\"❌ Error saving report for later:\", error);\n      onError?.(error?.message ?? String(error));\n      return {\n        success: false,\n        offline: true,\n        message: \"Error al guardar el reporte offline.\",\n      };\n    }\n  }\n\n  try {\n    await submitReport(payload);\n\n    await storageService.removeByPrefix(NAMESPACE, `reportsHistory:${table}:`);\n    DeviceEventEmitter.emit(\"reports:refresh\", { table });\n\n    onSuccess?.();\n    return {\n      success: true,\n      offline: false,\n      message: \"Reporte enviado exitosamente.\",\n    };\n  } catch (error: any) {\n    const httpStatus = getHttpStatusFromError(error);\n    if (httpStatus !== null && httpStatus >= 400) {\n      const message = error?.message ?? String(error);\n      onError?.(message);\n      return {\n        success: false,\n        offline: false,\n        message: \"Error del servidor al procesar el reporte.\",\n      };\n    }\n\n    try {\n      await offlineMutationQueueService.saveMutationForLater(\n        moduleName,\n        payload as unknown as Record<string, unknown>\n      );\n\n      await storageService.removeByPrefix(\n        NAMESPACE,\n        `reportsHistory:${table}:`,\n      );\n      DeviceEventEmitter.emit(\"reports:refresh\", { table });\n\n      onSuccess?.();\n      return {\n        success: true,\n        offline: true,\n        message: \"Error de conexión. Reporte guardado para enviar después.\",\n      };\n    } catch (offlineError: any) {\n      onError?.(`Error de red: ${error?.message ?? String(error)}`);\n      return {\n        success: false,\n        offline: false,\n        message: \"Error de conexión y no se pudo guardar offline.\",\n      };\n    }\n  }\n}\n","import { storageService } from \"@data-oil-front/core-host\";\nimport {\n  TABLE_NAMES,\n  type TableName,\n} from \"@data-oil-front/core-utils\";\n\n/**\n * Canonical TABLE → AsyncStorage cache key(s) map for the\n * \"dailyReport\" namespace (Reports MFE + core-reports).\n *\n * Each entry describes how to invalidate the cache for that table. We\n * use two formats to cover the different patterns:\n *  - `keys`: exact key list (e.g. \"locations\", \"wellCategories\").\n *  - `prefixes`: prefix list (e.g. \"fields:\") resolved via\n *    `storageService.removeByPrefix`. Useful when the cache key\n *    depends on a parameter (location_id, filter, etc.).\n *\n * Source of truth: direct inspection of `dailyReportApi.ts` at design\n * time. If you add a new cached getter, update this map too so the\n * DDL sync picks it up.\n */\nexport interface DailyReportCacheEntry {\n  keys?: string[];\n  prefixes?: string[];\n}\n\nexport const DAILY_REPORT_NAMESPACE = \"dailyReport\" as const;\n\nexport const DAILY_REPORT_DDL_CACHE_MAP: Partial<\n  Record<TableName, DailyReportCacheEntry>\n> = {\n  [TABLE_NAMES.LOCATION]: { keys: [\"locations\"] },\n  [TABLE_NAMES.FIELD]: { prefixes: [\"fields:\"] },\n  [TABLE_NAMES.GET_FACILITIES_LIST]: { keys: [\"facilitiesList\"] },\n  [TABLE_NAMES.WELL]: { keys: [\"wells\", \"wells:all\"], prefixes: [\"wells:\"] },\n  [TABLE_NAMES.WELL_CATEGORY]: { keys: [\"wellCategories\"] },\n  [TABLE_NAMES.WELL_CLUSTER]: { keys: [\"wellClusters\"] },\n  [TABLE_NAMES.PUMPING_METHOD]: { keys: [\"pumpingMethods\"] },\n  [TABLE_NAMES.ASSOCIATED_STRATEGY]: { keys: [\"associatedStrategies\"] },\n  [TABLE_NAMES.FLOW_STATION]: { keys: [\"flowStations\"] },\n  [TABLE_NAMES.FLOW_STATION_TANK]: { keys: [\"flowStationTanks\"] },\n  [TABLE_NAMES.TREATMENT_PLANT_SYSTEM]: { prefixes: [\"treatmentPlantSystems:\"] },\n  [TABLE_NAMES.TREATMENT_PLANT_DYNAMIC_STORAGE_TANK]: {\n    keys: [\"treatmentPlantDynamicStorageTanks\"],\n  },\n  [TABLE_NAMES.UPT_TANK]: { keys: [\"uptTanks\"] },\n  [TABLE_NAMES.PIT]: { keys: [\"pits\"] },\n  [TABLE_NAMES.MEASUREMENT_POINT]: { keys: [\"measurementPoints\"] },\n  [TABLE_NAMES.VACUUM_INFO]: { keys: [\"vacuumPlates\"] },\n  [TABLE_NAMES.DRIVERS_INFO]: { keys: [\"driversInfo\"] },\n  // Tables below are owned by core-reports but do NOT have an\n  // AsyncStorage cache today (their getters go straight through `post`\n  // without `fetchWithCache`). Listing them here with empty entries\n  // lets the DDL sync know they belong to this package so fingerprint\n  // detection still runs on them. Add `{ keys, prefixes }` whenever\n  // caching is introduced.\n  [TABLE_NAMES.ACTIVITY]: {},\n  [TABLE_NAMES.THIRD_PARTY_COMPANY]: {},\n  [TABLE_NAMES.TREATMENT_PLANT]: {},\n  [TABLE_NAMES.UPT]: {},\n  [TABLE_NAMES.VACUUM_COMPANY]: {},\n};\n\n/**\n * Tables this package knows how to keep in sync. Used by the shell\n * orchestrator to filter the global DDL list before passing it in.\n */\nexport const DAILY_REPORT_DDL_TABLES: readonly TableName[] = Object.keys(\n  DAILY_REPORT_DDL_CACHE_MAP,\n) as TableName[];\n\n/**\n * Invalidates the AsyncStorage entries associated to the given tables\n * (only those known to this map). Silent on errors: a missing key is\n * not a problem.\n *\n * Note: it does not re-download the data. Re-hydration is performed\n * by the Reports MFE `warmup()`, which calls the getters again with\n * the cache already emptied. The getter fills AsyncStorage back on\n * the next backend response.\n */\nexport async function invalidateReportsDDLCaches(\n  tables: readonly TableName[],\n): Promise<void> {\n  const work: Array<Promise<void>> = [];\n\n  for (const table of tables) {\n    const entry = DAILY_REPORT_DDL_CACHE_MAP[table];\n    if (!entry) continue;\n\n    if (entry.keys) {\n      for (const key of entry.keys) {\n        work.push(\n          storageService.remove(DAILY_REPORT_NAMESPACE, key).catch(() => undefined),\n        );\n      }\n    }\n    if (entry.prefixes) {\n      for (const prefix of entry.prefixes) {\n        work.push(\n          storageService\n            .removeByPrefix(DAILY_REPORT_NAMESPACE, prefix)\n            .catch(() => undefined),\n        );\n      }\n    }\n  }\n\n  await Promise.all(work);\n}\n","import { configService } from \"@data-oil-front/core-host\";\nimport { ApiPostBody, purePost } from \"@data-oil-front/core-utils\";\n\nexport async function post<T>(\n  body: Partial<ApiPostBody>,\n  options?: RequestInit,\n): Promise<T> {\n  const config = await configService.getEffectiveConfig();\n  const url = config?.API_BASE_URL;\n\n  if (!url) {\n    throw new Error(\"[API Client] API_BASE_URL is missing in config.\");\n  }\n\n  const response = await purePost<T>(url, body, options);\n\n  if (!response.success) {\n    const message =\n      \"message\" in response ? response.message : \"Unknown API error\";\n    throw new Error(message);\n  }\n\n  if (!(\"data\" in response)) {\n    throw new Error(\"Invalid API response shape.\");\n  }\n\n  return response.data as T;\n}\n","import { configService } from \"@data-oil-front/core-host\";\nimport { ALL_REPORT_HISTORY_TABLES, OTHER_REPORT_HISTORY_TABLES, ReportHistoryTable } from \"./types\";\nimport { TABLE_NAMES } from \"@data-oil-front/core-utils\";\n\ntype GetReportHistoryTablesOptions = {\n  includeOtherReports?: boolean;\n};\n\nexport function findReportHistoryTables(\n  options?: GetReportHistoryTablesOptions,\n): ReportHistoryTable[] {\n  const config = configService.getCurrentConfig();\n  const clientName = (config.clientName || \"\").toLowerCase();\n  // TODO: Find the way to get tables list configured for the client from the DOM.\n  const isAldyl = clientName === \"aldyl\";\n  const includeOtherReports = options?.includeOtherReports ?? true;\n\n  return ALL_REPORT_HISTORY_TABLES.filter((table) => {\n    if (!includeOtherReports && (OTHER_REPORT_HISTORY_TABLES as readonly string[]).includes(table)) {\n      return false;\n    }\n    // TODO: Find the way to get tables list configured for the client from the DOM.\n    if (table === TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT && isAldyl) {\n      return false;\n    }\n    return true;\n  });\n}\n","import { configService } from \"@data-oil-front/core-host\";\nimport {\n  DAILY_REPORT_NAMESPACE,\n  GetReportsHistoryOptions,\n  ReportHistoryItem,\n} from \"./types\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport { findReportHistoryTables } from \"./findReportHistoryTables\";\n\nimport {\n  API_VERBS,\n  ApiPostBody,\n  purePost,\n  ApiFilter,\n  fetchWithCache,\n} from \"@data-oil-front/core-utils\";\n\nfunction ensureDate(value?: string | number | Date | Dayjs | null) {\n  if (!value) return dayjs();\n  return dayjs(value);\n}\n\nexport async function getReportsHistory(\n  options: GetReportsHistoryOptions,\n): Promise<ReportHistoryItem[]> {\n  const config = await configService.getEffectiveConfig(); // 1er dependencia\n  const url = config?.API_BASE_URL;\n\n  if (!url) {\n    throw Error(\n      \"[getReportsHistory] 🚨 ERROR! API_BASE_URL is missing in config.\",\n    );\n  }\n\n  const start = options.startDate\n    ? ensureDate(options.startDate)\n        .utc()\n        .startOf(\"day\")\n        .format(\"YYYY-MM-DD HH:mm:ss\")\n    : null;\n\n  const end = options.endDate\n    ? ensureDate(options.endDate)\n        .utc()\n        .endOf(\"day\")\n        .format(\"YYYY-MM-DD HH:mm:ss\")\n    : null;\n\n  let tables = findReportHistoryTables({\n    includeOtherReports: options.includeOtherReports ?? true,\n  });\n  if (options.installationType) {\n    tables = tables.filter((t) => t === options.installationType);\n  }\n\n  const promises = tables.map(async (table) => {\n    const cacheKey = `reportsHistory:${table}:${start || \"all\"}:${end || \"all\"}`;\n\n    // Construir los filtros dinámicamente: solo se envían si existen fechas\n    const filter: ApiFilter[] = [];\n    if (start) filter.push([\"date_created\", \">=\", start]);\n    if (end) filter.push([\"date_created\", \"<=\", end]);\n\n    let result: any[] = [];\n    try {\n      result = await fetchWithCache<any[]>(\n        DAILY_REPORT_NAMESPACE,\n        cacheKey,\n        async () =>\n          await purePost<any[]>(\n            url,\n            new ApiPostBody({\n              verb: API_VERBS.SELECT,\n              table,\n              filter,\n            }),\n            { signal: options.signal },\n          ),\n        { shouldFetch: options.forceRefresh }\n      );\n    } catch (error) {\n      if (__DEV__) {\n        console.info(\n          `Historial vacío/no cache para ${table} entre ${start} y ${end}. Se devuelve [].`,\n        );\n      }\n      return [] as ReportHistoryItem[];\n    }\n\n    const rows = result ?? [];\n\n    return rows.map((row) => {\n      const parsed = dayjs.utc(\n        row?.date_created ?? row?.dateCreated ?? undefined,\n      );\n      const creator = row?.created_by ?? row?.creator ?? \"Desconocido\";\n      const dateKey = parsed.isValid() ? parsed.format(\"YYYY-MM-DD\") : \"\";\n\n      return {\n        id: row?.id ?? `${table}-${Math.random().toString(36).slice(2, 10)}`,\n        table,\n        dateCreated: row?.date_created ?? row?.dateCreated ?? \"\",\n        dateDisplay: parsed.isValid() ? parsed.format(\"DD-MM-YYYY\") : \"\",\n        dayKey: dateKey,\n        time: parsed.isValid() ? parsed.format(\"HH:mm\") : \"\",\n        creator,\n        userId: row?.user_id ?? row?.userId ?? null,\n        facilityId: row?.facility_id ?? null,\n        dailyReportId: row?.daily_report_id ?? null,\n        wellId: row?.well_id ?? null,\n        measurementPointId: row?.measurement_point_id ?? null,\n        pitId: row?.pit_id ?? null,\n        originFacilityType: row?.origin_facility_type ?? null,\n        editionNumber: row?.edition_number ?? null,\n        uptTankId: row?.upt_tank_id ?? null,\n        treatmentPlantDynamicStorageTankId:\n          row?.treatment_plant_dynamic_storage_tank_id ?? null,\n        flowStationTankId: row?.flow_station_tank_id ?? null,\n        raw: row ?? {},\n      } as ReportHistoryItem;\n    });\n  });\n\n  const results = await Promise.all(promises);\n  const flattenedReports = results.flat();\n\n  return flattenedReports.sort((a, b) => {\n    const parse = (value?: string, fallback?: string) => {\n      if (value) return dayjs.utc(value).valueOf();\n      if (fallback) return dayjs.utc(`${fallback} 00:00:00`).valueOf();\n      return 0;\n    };\n    const dateB = parse(b.dateCreated, b.dayKey);\n    const dateA = parse(a.dateCreated, a.dayKey);\n    if (dateB === dateA) {\n      return (b.time || \"\").localeCompare(a.time || \"\");\n    }\n    return dateB - dateA;\n  });\n}\n","export * from \"./getReportsHistory\";\nexport * from \"./findReportHistoryTables\";\nexport * from \"./types\";\n","import { TABLE_NAMES } from \"@data-oil-front/core-utils\";\nimport { Dayjs } from \"dayjs\";\n\n// Namespaces for AsyncStorage\nexport const DAILY_REPORT_NAMESPACE = \"dailyReport\";\n\nexport const OTHER_REPORT_HISTORY_TABLES = [\n  TABLE_NAMES.LIFTING_COST,\n  TABLE_NAMES.SHIP_TO_SHIP,\n  TABLE_NAMES.BILLED_RECOVERY_AND_EXPENSES,\n  TABLE_NAMES.OWN_FISCALIZED_PRODUCTION,\n  TABLE_NAMES.THIRD_PARTY_FISCALIZED_PRODUCTION,\n  TABLE_NAMES.MARKET_REFERENCE_PRICE,\n  TABLE_NAMES.COMMENTS_FORM,\n] as const;\n\nexport const ALL_REPORT_HISTORY_TABLES = [\n  TABLE_NAMES.DAILY_REPORT_WELL,\n  TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT,\n  TABLE_NAMES.DAILY_REPORT_PIT,\n  TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD,\n  TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD,\n  TABLE_NAMES.DAILY_REPORT_STORAGE_TANK,\n  TABLE_NAMES.DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK,\n  TABLE_NAMES.DAILY_REPORT_UPT_TANK,\n  TABLE_NAMES.DAILY_REPORT_FLOW_STATION_TANK,\n  ...OTHER_REPORT_HISTORY_TABLES,\n] as const;\n\nexport type ReportHistoryTable = (typeof ALL_REPORT_HISTORY_TABLES)[number];\n\nexport interface GetReportsHistoryOptions {\n  startDate: string | number | Date | Dayjs | null;\n  endDate: string | number | Date | Dayjs | null;\n  installationType?: ReportHistoryTable | null;\n  includeOtherReports?: boolean;\n  signal?: AbortSignal;\n  forceRefresh?: boolean;\n}\n\nexport interface ReportHistoryItem {\n  id: string | number;\n  table: ReportHistoryTable;\n  dateCreated: string;\n  dateDisplay: string;\n  dayKey: string;\n  time: string;\n  creator: string;\n  userId: string | number | null;\n  facilityId?: string | number | null;\n  dailyReportId?: string | number | null;\n  wellId?: string | number | null;\n  measurementPointId?: string | number | null;\n  pitId?: string | number | null;\n  originFacilityType?: string | null;\n  editionNumber?: number | null;\n  uptTankId?: string | number | null;\n  treatmentPlantDynamicStorageTankId?: string | number | null;\n  flowStationTankId?: string | number | null;\n  raw: Record<string, any>;\n}\n","export const MULTITENANT_API_BASE_URL =\n  \"https://multit-back.digitalflow.ar/api\";\n// export const MULTITENANT_API_BASE_URL = process.env.NODE_ENV === \"production\" && process.env.APP_ENV !== \"stage\"\n//     ? \"https://multit-back.digitalflow.ar/api\"\n//     : \"https://dataoilmanager.proyectolibertador.app/api\";\n","import { UserRole, UserRoles } from \"../types/role\";\n\nexport const DASHBOARD_ROLES: UserRole[] = [\n  UserRoles.ADMINISTRADOR,\n  UserRoles.GERENTE_DE_PLANIFICACION,\n  UserRoles.ANALISTA_DE_PLANIFICACION,\n  UserRoles.SUPERVISOR_DE_PRODUCCION,\n  UserRoles.OPERADOR_DE_PRODUCCION,\n];\n","export const TABLE_NAMES = {\n  // Machinery\n  MACHINERY: 'machinery',\n  MACHINERY_LOCATION: 'machinery_location',\n  MACHINERY_FUEL_LOAD: 'machinery_fuel_load',\n  MACHINERY_STATUS_CHANGE: 'machinery_status_change',\n  MACHINERY_OPERATOR: 'machinery_operator',\n  MACHINERY_SUPPLIER: 'machinery_supplier',\n  MACHINERY_FUEL_ARRIVALS: 'machinery_fuel_arrivals',\n  MACHINERY_FUEL_TANK: 'machinery_fuel_tank',\n  DASH_FUEL_TANK_STOCK: 'dash_fuel_tank_stock',\n\n  // Daily Reports\n  DAILY_REPORT_WELL: 'daily_report_well',\n  DAILY_REPORT_MEASUREMENT_POINT: 'daily_report_measurement_point',\n  DAILY_REPORT_PIT: 'daily_report_pit',\n  DAILY_REPORT_VACUUM_LOAD: 'daily_report_vacuum_load',\n  DAILY_REPORT_VACUUM_UNLOAD: 'daily_report_vacuum_unload',\n  DAILY_REPORT_STORAGE_TANK: 'daily_report_storage_tank',\n  DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK: 'daily_report_dynamic_settlement_tank',\n  DAILY_REPORT_UPT_TANK: 'daily_report_upt_tank',\n  DAILY_REPORT_FLOW_STATION_TANK: 'daily_report_flow_station_tank',\n\n  // Financial / Fiscal\n  LIFTING_COST: 'lifting_cost',\n  SHIP_TO_SHIP: 'ship_to_ship',\n  BILLED_RECOVERY_AND_EXPENSES: 'billed_recovery_and_expenses',\n  OWN_FISCALIZED_PRODUCTION: 'own_fiscalized_production',\n  THIRD_PARTY_FISCALIZED_PRODUCTION: 'third_party_fiscalized_production',\n  MARKET_REFERENCE_PRICE: 'market_reference_price',\n\n  // Misc / Forms\n  COMMENTS_FORM: 'comments_form',\n  LOCATION: 'location',\n  FIELD: 'field',\n  WELL_CATEGORY: 'well_category',\n  PUMPING_METHOD: 'pumping_method',\n  ASSOCIATED_STRATEGY: 'associated_strategy',\n  FLOW_STATION: 'flow_station',\n  TREATMENT_PLANT_SYSTEM: 'treatment_plant_system',\n  VACUUM_INFO: 'vacuum_info',\n  VACUUM_COMPANY: 'vacuum_company',\n  DRIVERS_INFO: 'drivers_info',\n  WELL: 'well',\n  WELL_CLUSTER: 'well_cluster',\n  USER_INFO: 'user_info',\n  ACTIVITY: 'activity',\n  GET_FACILITIES_LIST: 'get_facilities_list',\n  LAB_REPORT: 'lab_report',\n  THIRD_PARTY_COMPANY: 'third_party_company',\n  TREATMENT_PLANT: 'treatment_plant',\n  UPT: 'upt',\n\n  // ODS\n  ODS_ACTIVITY_REPORT: 'ods_activity_report',\n  ODS_ITEM: 'ods_item',\n  ODS_COST_CENTER: 'ods_cost_center',\n  ODS_ACTIVITY: 'ods_activity',\n  ODS_GROUP: 'ods_group',\n  \n  // Facilities\n  MEASUREMENT_POINT: 'measurement_point',\n  FLOW_STATION_TANK: 'flow_station_tank',\n  TREATMENT_PLANT_DYNAMIC_STORAGE_TANK: 'treatment_plant_dynamic_storage_tank',\n  UPT_TANK: 'upt_tank',\n  PIT: 'pit',\n} as const;\n\nexport type TableName = (typeof TABLE_NAMES)[keyof typeof TABLE_NAMES];\n\n/**\n * Subset of tables that are **DDL / reference catalogs**: nearly-static\n * data managed by an admin from the backoffice (locations, wells,\n * facilities, dropdowns…).\n *\n * Their opposite are the transactional tables (daily reports, status\n * changes, fuel loads…) that are created from the app itself and\n * don't make sense to \"re-sync\" from the server.\n *\n * These are the tables we consider worth re-validating on\n * pull-to-refresh even when no MFE bundle changed, because the admin\n * may have added or removed rows directly in the database without\n * producing any frontend hash change.\n *\n * Rough ordering:\n *   - Most-used tables first (locations, fields, wells, facilities…)\n *     so that if the sync gets cut short we still refresh what the\n *     user is most likely to see.\n */\nexport const DDL_TABLES: readonly TableName[] = [\n  // Reports / dailyReport\n  TABLE_NAMES.LOCATION,\n  TABLE_NAMES.FIELD,\n  TABLE_NAMES.GET_FACILITIES_LIST,\n  TABLE_NAMES.WELL,\n  TABLE_NAMES.WELL_CATEGORY,\n  TABLE_NAMES.WELL_CLUSTER,\n  TABLE_NAMES.PUMPING_METHOD,\n  TABLE_NAMES.ASSOCIATED_STRATEGY,\n  TABLE_NAMES.FLOW_STATION,\n  TABLE_NAMES.FLOW_STATION_TANK,\n  TABLE_NAMES.TREATMENT_PLANT_SYSTEM,\n  TABLE_NAMES.TREATMENT_PLANT_DYNAMIC_STORAGE_TANK,\n  TABLE_NAMES.TREATMENT_PLANT,\n  TABLE_NAMES.UPT_TANK,\n  TABLE_NAMES.UPT,\n  TABLE_NAMES.PIT,\n  TABLE_NAMES.MEASUREMENT_POINT,\n  TABLE_NAMES.VACUUM_INFO,\n  TABLE_NAMES.VACUUM_COMPANY,\n  TABLE_NAMES.DRIVERS_INFO,\n  TABLE_NAMES.ACTIVITY,\n  TABLE_NAMES.THIRD_PARTY_COMPANY,\n\n  // ODS\n  TABLE_NAMES.ODS_COST_CENTER,\n  TABLE_NAMES.ODS_ITEM,\n  TABLE_NAMES.ODS_GROUP,\n  TABLE_NAMES.ODS_ACTIVITY,\n\n  // Machinery\n  TABLE_NAMES.MACHINERY,\n  TABLE_NAMES.MACHINERY_LOCATION,\n  TABLE_NAMES.MACHINERY_FUEL_LOAD,\n  TABLE_NAMES.MACHINERY_STATUS_CHANGE,\n  TABLE_NAMES.MACHINERY_OPERATOR,\n  TABLE_NAMES.MACHINERY_SUPPLIER,\n] as const;\n\nexport type DDLTableName = (typeof DDL_TABLES)[number];\n\n/**\n * Subset of DDL_TABLES that excludes tables NOT present in the aldyl API:\n * well_cluster, measurement_point, and daily_report_measurement_point.\n * These tables cause false \"unknownTables\" results in detectChangedDDLs\n * because the aldyl backend returns \"Error al procesar la consulta\".\n */\nexport const DDL_TABLES_ALDYL: readonly TableName[] = [\n  ...DDL_TABLES.filter(\n    (t) =>\n      t !== TABLE_NAMES.WELL_CLUSTER &&\n      t !== TABLE_NAMES.MEASUREMENT_POINT &&\n      t !== TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT,\n  ),\n] as const;\n\nexport type DDLTableNameAldyl = (typeof DDL_TABLES_ALDYL)[number];\n\nexport const API_VERBS = {\n  SELECT: 'select',\n  INSERT: 'insert',\n  UPDATE: 'update',\n  DELETE: 'delete',\n} as const;\n\nexport type ApiVerb = (typeof API_VERBS)[keyof typeof API_VERBS];\n\n/**\n * Human-readable labels for each report table type.\n */\nexport const TABLE_LABELS: Partial<Record<TableName, string>> = {\n  [TABLE_NAMES.DAILY_REPORT_WELL]: 'Reporte de Pozo',\n  [TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT]: 'Punto de Medición',\n  [TABLE_NAMES.DAILY_REPORT_PIT]: 'Reporte de Fosa',\n  [TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD]: 'Carga VACUUM',\n  [TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD]: 'Descarga VACUUM',\n  [TABLE_NAMES.DAILY_REPORT_STORAGE_TANK]: 'Tanque de Almacenamiento',\n  [TABLE_NAMES.DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK]: 'Tanque de Asentamiento Dinámico',\n  [TABLE_NAMES.DAILY_REPORT_UPT_TANK]: 'Tanque UPT',\n  [TABLE_NAMES.DAILY_REPORT_FLOW_STATION_TANK]: 'Tanque Estación de Flujo',\n  [TABLE_NAMES.LIFTING_COST]: 'Lifting Cost',\n  [TABLE_NAMES.SHIP_TO_SHIP]: 'Ship To Ship',\n  [TABLE_NAMES.BILLED_RECOVERY_AND_EXPENSES]: 'Facturado, Recobro y Gastos PDVSA',\n  [TABLE_NAMES.OWN_FISCALIZED_PRODUCTION]: 'Fiscalización Propia',\n  [TABLE_NAMES.THIRD_PARTY_FISCALIZED_PRODUCTION]: 'Fiscalización de Terceros',\n  [TABLE_NAMES.MARKET_REFERENCE_PRICE]: 'Valor del Mercado',\n  [TABLE_NAMES.COMMENTS_FORM]: 'Comentarios',\n  [TABLE_NAMES.MACHINERY]: 'Maquinaria',\n  [TABLE_NAMES.MACHINERY_LOCATION]: 'Ubicación de Maquinaria',\n  [TABLE_NAMES.MACHINERY_FUEL_LOAD]: 'Carga de Combustible',\n  [TABLE_NAMES.MACHINERY_STATUS_CHANGE]: 'Cambio de Estatus',\n  [TABLE_NAMES.MACHINERY_OPERATOR]: 'Operador de Maquinaria',\n  [TABLE_NAMES.MACHINERY_SUPPLIER]: 'Proveedor de Maquinaria',\n  [TABLE_NAMES.MACHINERY_FUEL_ARRIVALS]: 'Llegada de Combustible',\n  [TABLE_NAMES.MACHINERY_FUEL_TANK]: 'Tanque de Combustible',\n  [TABLE_NAMES.DASH_FUEL_TANK_STOCK]: 'Stock de Tanque',\n};\n","import type { AppConfig } from '../types/config';\n\nexport const defaultConfig: AppConfig = {\n  API_BASE_URL: null,\n  LOGO_BASE_URL: null,\n  LOGO_SMALL: null,\n  primaryColor: null,\n  clientName: 'DataOil',\n  CORE_CONFIG: {},\n};\n","const STALE_TIME_DDL_PROD = 5 * 60 * 1000; // 5 minutes\nconst STALE_TIME_DDL_DEV = 60 * 1000; // 1 minute\n\nexport const STALE_TIME_DDL =\n  process.env.NODE_ENV === \"development\"\n    ? STALE_TIME_DDL_DEV\n    : STALE_TIME_DDL_PROD;\n","import { HttpClientOptions } from \"./misc\";\n\ninterface RequestSuccess<T> {\n  data: T | T[];\n}\n\ninterface RequestFail {\n  message: string;\n}\n\ntype PostResponse<T> = (RequestSuccess<T> | RequestFail) & {\n  success: boolean;\n  status: number;\n};\n\nexport type PurePostResponse<T> = Promise<PostResponse<T>>;\n\n/**\n * @description Makes a POST request to the given URL with the given body and options.\n * @param url - The URL to make the request to.\n * @param body - The body of the request.\n * @param options - The options for the request.\n * @returns A promise that resolves to the response data.\n * @example\n * ```ts\n * const result = await purePost(\"https://api.example.com/data\", { foo: \"bar\" });\n * console.log(result);\n * ```\n */\nexport async function purePost<T>(\n  url: string,\n  body: unknown,\n  options?: HttpClientOptions,\n): PurePostResponse<T> {\n  try {\n    const { headers, ...restOptions } = options || {};\n\n    const res = await fetch(url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\", ...headers },\n      body: JSON.stringify(body),\n      ...restOptions,\n    });\n\n    if (!res.ok) {\n      const status = res.status;\n      const text = await res.text();\n\n      throw new Error(`HTTP ${status}: ${text}`, {\n        cause: { status },\n      });\n    }\n\n    const json = await res.json();\n\n    if (json && Array.isArray(json.result)) {\n      return { success: true, data: json.result as T, status: res.status };\n    } else {\n      return {\n        success: true,\n        data: (json?.result || {}) as T,\n        status: res.status,\n      };\n    }\n  } catch (error: unknown) {\n    if (typeof error === \"string\") {\n      return { success: false, message: error, status: 500 };\n    }\n\n    if (error instanceof Error) {\n      if (error.name === \"AbortError\") {\n        throw error; // Re-lanzar para que React Query / fetch reconozcan la cancelación\n      }\n\n      const cause = error.cause as { status?: number } | undefined;\n      const status = cause?.status || 500;\n      return {\n        success: false,\n        message: error.message,\n        status,\n      };\n    }\n\n    return {\n      success: false,\n      message: 'Unknown Error on \"post\" method',\n      status: 500,\n    };\n  }\n}\n","// CONSTANTS\nexport * from \"./constants/api\";\nexport * from \"./constants/dashboardRoles\";\nexport * from \"./constants/database\";\nexport * from \"./constants/defaultConfig\";\nexport * from \"./constants/staleTimes\";\n\n// TYPES\nexport * from \"./types/api\";\nexport type { User } from \"./types/auth\";\nexport type { AppState, LabDataStore } from \"./types/app\";\nexport type {\n  AppConfig,\n  ConfigFetchOptions,\n  ConfigStoreState,\n  ConfigStatus,\n} from \"./types/config\";\nexport { AppModules } from \"./types/appModules\";\nexport * from \"./types/role\";\n\n// UTILS\nexport * from \"./utils/isAllowedForRoles\";\nexport * from \"./utils/safeDateTimeParsers\";\nexport * from \"./utils/sortDropdownByName\";\nexport * from \"./utils/safeParseParamId\";\nexport { getDefaultTime, formatTwoDigits, formatDateWithTime } from \"./utils/date\";\nexport { normalizeNumericString, toNumber } from \"./utils/number\";\nexport * from \"./utils/fileUpload\";\nexport * from \"./utils/fetchWithCache\";\n\n// HTTP METHODS\nexport * from \"./http/post\";\n","import { ApiVerb } from \"../constants/database\";\n\nexport type ApiFilter = [\n  string,\n  string,\n  string | number | boolean | string[] | number[],\n];\n\nexport interface IApiPostBody {\n  verb: ApiVerb;\n  table: string;\n  fields?: string[];\n  values?: unknown[];\n  filter?: ApiFilter[];\n}\n\nexport class ApiPostBody {\n  verb: ApiVerb;\n  table: string;\n  fields: string[] = [];\n  values: unknown[] = [];\n  filter: ApiFilter[] = [];\n\n  constructor(options: IApiPostBody) {\n    const { verb, table, fields = [], values = [], filter = [] } = options;\n    this.verb = verb;\n    this.table = table;\n    this.fields = fields;\n    this.values = values;\n    this.filter = filter;\n  }\n}\n\n// const newApiPostBody = new ApiPostBody(); // Error: Expected 1 arguments, but got 0.\n","export const AppModules = {\n  DailyReport: \"dailyReport\",\n  LabReport: \"labReport\",\n  ReportHistory: \"reportHistory\",\n  OtherReports: \"otherReports\",\n  ODS: \"odsModule\",\n  Dashboard: \"dashboard\",\n  Machinery: \"machinery\",\n} as const;\n\nexport type AppModule = (typeof AppModules)[keyof typeof AppModules];\n","export const UserRoles = {\n  OPERADOR_DE_PRODUCCION: \"OPERADOR_DE_PRODUCCION\",\n  SUPERVISOR_DE_PRODUCCION: \"SUPERVISOR_DE_PRODUCCION\",\n  ANALISTA_DE_PLANIFICACION: \"ANALISTA_DE_PLANIFICACION\",\n  GERENTE_DE_PLANIFICACION: \"GERENTE_DE_PLANIFICACION\",\n  ADMINISTRADOR: \"ADMINISTRADOR\",\n} as const;\n\nexport type UserRole = (typeof UserRoles)[keyof typeof UserRoles];\n","export const formatTwoDigits = (value: number) => value.toString().padStart(2, '0');\n\nexport const getDefaultTime = () => {\n  const now = new Date();\n  return `${formatTwoDigits(now.getHours())}:${formatTwoDigits(\n    now.getMinutes(),\n  )}`;\n};\n\nexport const formatDateWithTime = (date: Date | null, time: string | null) => {\n  if (!date) return null;\n  const safeTime = time ?? '00:00';\n  const [hoursRaw, minutesRaw] = safeTime.split(':');\n  const hours = formatTwoDigits(\n    Math.max(\n      0,\n      Math.min(\n        23,\n        Number.isFinite(Number(hoursRaw)) ? Number(hoursRaw) : 0,\n      ),\n    ),\n  );\n  const minutes = formatTwoDigits(\n    Math.max(\n      0,\n      Math.min(\n        59,\n        Number.isFinite(Number(minutesRaw)) ? Number(minutesRaw) : 0,\n      ),\n    ),\n  );\n  const seconds = '00';\n  return `${date.getFullYear()}-${formatTwoDigits(\n    date.getMonth() + 1,\n  )}-${formatTwoDigits(date.getDate())} ${hours}:${minutes}:${seconds}`;\n};\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { storageService } from \"@data-oil-front/core-host\";\nimport { PurePostResponse } from \"../http/post\";\n\nexport type Namespace = \"dailyReport\" | \"ods\";\n\nexport interface FetchWithCacheOptions {\n  ttl?: number; // Time-to-Live in minutes\n  shouldFetch?: boolean; // Force refresh ignoring cache\n  ignoreExpiration?: boolean; // Ignore expiration if offline\n}\n\n/**\n * Standardizes API responses to extract data and throw on errors.\n */\nasync function executeFetch<T>(\n  fetcher: () => Promise<T> | PurePostResponse<T>,\n): Promise<T> {\n  const response = await fetcher();\n\n  if (response && typeof response === \"object\" && \"success\" in response) {\n    if (!(response as any).success) {\n      throw new Error((response as any).message || \"Failed to fetch data\");\n    }\n    return \"data\" in response ? (response as any).data : (response as T);\n  }\n\n  return response as T;\n}\n\n/**\n * Normalizes cache reading for legacy format { success, data }.\n */\nfunction parseCacheValue<T>(value: any): T {\n  if (value && typeof value === \"object\" && \"success\" in value && \"data\" in value) {\n    return value.data as T;\n  }\n  return value as T;\n}\n\n/**\n * Fetch data with robust Cache-Aside and Stale-While-Revalidate (SWR) support.\n *\n * @param namespace - The namespace for storage.\n * @param key - The key for storage.\n * @param fetcher - The function to fetch data.\n * @param options - Cache options (ttl, shouldFetch, ignoreExpiration).\n * @returns The cached data or the fetched data.\n * @throws Error if the device is offline and no cached data is found.\n */\nexport async function fetchWithCache<T>(\n  namespace: Namespace,\n  key: string,\n  fetcher: () => Promise<T> | PurePostResponse<T>,\n  options: FetchWithCacheOptions = {},\n): Promise<T> {\n  const {\n    ttl = process.env.NODE_ENV === \"development\" ? 5 : 30, // default 30 mins\n    shouldFetch = false,\n    ignoreExpiration = true,\n  } = options;\n\n  let isConnected = true;\n  try {\n    const netState = await NetInfo.fetch();\n    isConnected = netState.isConnected ?? true;\n  } catch (error) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.warn(`⚠️ [fetchWithCache] NetInfo check failed for ${namespace}:${key}, assuming online.`, error);\n    }\n  }\n\n  // 1. Force Fetch (e.g. Pull-to-Refresh)\n  if (shouldFetch && isConnected) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.log(`ℹ️ [fetchWithCache] Force fetch requested for ${namespace}:${key}`);\n    }\n    const data = await executeFetch(fetcher);\n    await storageService.set(namespace, key, data, ttl);\n    return data;\n  }\n\n  // 2. Read from Cache\n  const rawCache = await storageService.getRaw<T>(namespace, key);\n  const hasCache = rawCache && rawCache.value !== undefined;\n  \n  // Calculate expiration\n  const isExpired = !rawCache || (rawCache.expiresAt && Date.now() > rawCache.expiresAt);\n\n  // 3. Valid Cache\n  if (hasCache && (!isExpired || (!isConnected && ignoreExpiration))) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.log(`[fetchWithCache] Serving valid cache for ${namespace}:${key}`);\n    }\n    return parseCacheValue<T>(rawCache.value);\n  }\n\n  // 4. Stale Cache -> SWR (Stale-While-Revalidate)\n  if (hasCache && isExpired) {\n    if (isConnected) {\n      if (process.env.NODE_ENV === \"development\") {\n        console.log(`[fetchWithCache] Cache expired for ${namespace}:${key}, stale-while-revalidate triggered`);\n      }\n      executeFetch(fetcher)\n        .then(async (data) => {\n          await storageService.set(namespace, key, data, ttl);\n        })\n        .catch((err) => {\n          if (err.name === \"AbortError\" || err.message?.includes(\"aborted\")) return;\n          if (process.env.NODE_ENV === \"development\") {\n            console.error(`[fetchWithCache] Background fetch failed for ${namespace}:${key}`, err);\n          }\n        });\n    }\n    return parseCacheValue<T>(rawCache.value);\n  }\n\n  // 5. No Cache -> Fetch Online\n  if (isConnected) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.log(`[fetchWithCache] No cache, fetching online for ${namespace}:${key}`);\n    }\n    const data = await executeFetch(fetcher);\n    await storageService.set(namespace, key, data, ttl);\n    return data;\n  }\n\n  // 6. No Cache & Offline -> Throw\n  if (process.env.NODE_ENV === \"development\") {\n    console.error(`[fetchWithCache] Offline and no cache found for ${namespace}:${key}`);\n  }\n  throw new Error(`No cached data found for ${key} and device is offline.`);\n}\n","import RNFS from 'react-native-fs';\nimport { configService } from '@data-oil-front/core-host';\n\n/**\n * Lee un archivo local (uri) y lo convierte a base64 (sin prefijo data:)\n */\nexport async function readFileAsBase64(localUri: string): Promise<string> {\n  // En Android, DocumentPicker puede devolver content://; RNFS soporta ambos esquemas\n  const path = localUri;\n  const base64 = await RNFS.readFile(path, 'base64');\n  return base64;\n}\n\n/**\n * Sube un archivo como base64 al API_FILE_SERVER /save.\n * Devuelve el fileName remoto para posterior preview.\n */\nexport async function uploadFileToServer(localUri: string, preferredName: string): Promise<string> {\n  const ext = preferredName.includes('.') ? preferredName.split('.').pop() : undefined;\n  const fileName = preferredName || `ods-upload-${Date.now()}${ext ? `.${ext}` : ''}`;\n  const base64 = await readFileAsBase64(localUri);\n\n  const config = configService.getCurrentConfig();\n  const fileServer =\n    (config as any)?.API_FILE_SERVER ||\n    (configService.getDefaultConfig() as any)?.API_FILE_SERVER;\n\n  if (!fileServer) {\n    throw new Error('API_FILE_SERVER no está configurado');\n  }\n\n  const res = await fetch(`${fileServer}/save`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ fileName, fileContent: base64 }),\n  });\n  if (!res.ok) {\n    throw new Error('Error subiendo el archivo');\n  }\n  const json = await res.json();\n  return json?.fileName || fileName;\n}\n","export function isAllowedForRoles(\n  userRoles: string[] | undefined | null,\n  allowedRoles: string[],\n): boolean {\n  if (!userRoles || userRoles.length === 0) {\n    return false;\n  }\n\n  if (!allowedRoles || allowedRoles.length === 0) {\n    return false;\n  }\n\n  return userRoles.some((role) => allowedRoles.includes(role));\n}\n","export const normalizeNumericString = (\n  value: string | number | null | undefined,\n): string => {\n  if (value === null || value === undefined || value === '') return '';\n  const str = String(value);\n  return str.replace(',', '.');\n};\n\nexport const toNumber = (\n  value: string | number | null | undefined,\n): number | null => {\n  if (value === null || value === undefined || value === '') return null;\n  const normalized = normalizeNumericString(value);\n  const num = Number(normalized);\n  return Number.isNaN(num) ? null : num;\n};\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\n\ndayjs.extend(customParseFormat);\n\nexport const parseDate = (\n  value?: string | null,\n  format = \"YYYY-MM-DD\",\n): Date | null => {\n  if (!value) return null;\n  const parsed = dayjs(value, format);\n  return parsed.isValid() ? parsed.toDate() : null;\n};\n\nexport const parseTime = (\n  value?: string | null,\n  format = \"HH:mm\",\n): string | null => {\n  if (!value) return null;\n  const parsed = dayjs(value);\n  return parsed.isValid() ? parsed.format(format) : null;\n};\n","export const safeParseParamId = (value: unknown): number | undefined => {\n  const parsed = Number(value);\n  \n  if (Number.isFinite(parsed) && parsed > 0) {\n    return parsed;\n  }\n\n  return undefined;\n};","/**\n * Sort dropdown rows alphabetically by display name (Spanish locale, case-insensitive).\n * Do not use when order is fixed (e.g. well category whitelist, Sí/No, installation type).\n */\nexport function sortByLocalizedName<T>(\n  items: readonly T[],\n  getName: (item: T) => string,\n): T[] {\n  return [...items].sort((a, b) =>\n    String(getName(a) ?? '').localeCompare(String(getName(b) ?? ''), 'es', {\n      sensitivity: 'base',\n    }),\n  );\n}\n\nexport function sortStringsLocale(strings: readonly string[]): string[] {\n  return [...strings].sort((a, b) =>\n    a.localeCompare(b, 'es', { sensitivity: 'base' }),\n  );\n}\n\nconst naturalCollator = new Intl.Collator(undefined, {\n  numeric: true,\n  sensitivity: 'base',\n});\n\nconst normalizeString = (value: string | null | undefined): string =>\n  String(value ?? '').trim().replaceAll('-', ' ');\n\nexport const compareNaturalAsc = (\n  left: string | null | undefined,\n  right: string | null | undefined,\n): number => naturalCollator.compare(normalizeString(left), normalizeString(right));\n\nexport const sortByNaturalOrder = <T>(\n  items: T[],\n  getValue: (item: T) => string | null | undefined,\n): T[] => [...items].sort((a, b) => compareNaturalAsc(getValue(a), getValue(b)));\n"],"names":["MODULE_DAILY_REPORT_ROLES","UserRoles","ADMINISTRADOR","ANALISTA_DE_PLANIFICACION","SUPERVISOR_DE_PRODUCCION","OPERADOR_DE_PRODUCCION","MODULE_HISTORY_REPORT_ROLES","GERENTE_DE_PLANIFICACION","MODULE_OTHER_REPORTS_ROLES","filterWellCategoriesForDailyReportDropdown","WELL_CATEGORY_DROPDOWN_ORDER","normalizeWellCategoryName","name","trim","toLowerCase","normalize","replace","MIN_CANONICAL_LEN_FOR_FLEX_MATCH","matchesWellCategoryCanonical","categoryName","canonicalLabel","n","c","length","includes","categories","match","find","cat","used","has","id","canonical","result","push","add","Set","findWellCategoryIdByCanonicalName","found","String","DAILY_REPORT_DDL_CACHE_MAP","DAILY_REPORT_DDL_TABLES","invalidateReportsDDLCaches","createFlowStationTankPayload","isEditing","reportId","editionNumber","reportDateTime","nowDate","activityId","userId","tankId","status","sampleTaken","netOperatedProduction","basePairs","tankLevel","rawOperatedProduction","comments","verb","API_VERBS","UPDATE","INSERT","table","TABLE_NAMES","DAILY_REPORT_FLOW_STATION_TANK","fields","map","values","filter","deleteReportHistoryItem","getAllFlowStations","getAllLocations","getAllPumpingMethods","getAllWellCategories","getCachedFacilitiesList","getCachedMeasurementPointsInfo","getCachedPitsInfo","getDailyReportDynamicSettlementTankById","getDailyReportFlowStationTankById","getDailyReportStorageTankById","getDailyReportUptTankById","getDailyReportWellById","getDriversInfo","getFacilitiesList","getFieldByIdCached","getFieldsByLocationId","getFlowStationNamesByTankIds","getFlowStationTankByIdCached","getFlowStationTanksFiltered","getLocationByIdCached","getMeasurementPointsByIds","getMeasurementPointsFiltered","getPendingVacuumLoads","getPitByIdCached","getPitsByIds","getPitsFiltered","getReportById","getReportHistoryTables","getTreatmentPlantDynamicStorageTankById","getTreatmentPlantDynamicStorageTanksByIds","getTreatmentPlantDynamicStorageTanksFiltered","getTreatmentPlantSystems","getUptTankById","getUptTanksByIds","getUptTanksFiltered","getUserInfoById","getUsersInfoByIds","getVacuumPlatesInfo","getWellCategoryType","getWellsByIds","invalidateFacilitiesListCache","submitReportWithOfflineFallback","submitVacuumLoadReport","NAMESPACE","OTHER_REPORT_HISTORY_TABLES","LIFTING_COST","SHIP_TO_SHIP","BILLED_RECOVERY_AND_EXPENSES","OWN_FISCALIZED_PRODUCTION","THIRD_PARTY_FISCALIZED_PRODUCTION","MARKET_REFERENCE_PRICE","COMMENTS_FORM","options","isAldyl","configService","getCurrentConfig","clientName","includeOtherReports","ALL_REPORT_HISTORY_TABLES","DAILY_REPORT_MEASUREMENT_POINT","DAILY_REPORT_VACUUM_LOAD","post","DELETE","DAILY_REPORT_VACUUM_UNLOAD","Number","storageService","removeByPrefix","DeviceEventEmitter","emit","unloadReportResponse","SELECT","unloadReport","Array","isArray","vacuumLoadId","vacuum_load_id","nowTimestamp","remove","error","Error","message","dayjs","extend","utc","WELLS_ALL_CACHE_KEY","filterWellsInMemory","rows","filters","row","every","field","op","value","rowValue","rowString","valueString","fetchWithCache","LOCATION","console","locationId","FIELD","maybeErrorMeasurement","isCached","Field","r","location_id","active","payload","WELL_CATEGORY","PUMPING_METHOD","getAllAssociatedStrategies","ASSOCIATED_STRATEGY","FLOW_STATION","shouldFetch","forceRefresh","ttl","activeOnly","cacheKey","TREATMENT_PLANT_SYSTEM","TREATMENT_PLANT_DYNAMIC_STORAGE_TANK","maybeError","key","UPT_TANK","PIT","getAllVacuumLoads","getVacuumLoadsSummary","mergeVacuumLoadDetail","fallback","incoming","base","Object","assign","keys","getVacuumLoadById","net","NetInfo","fetch","isConnected","detail","VACUUM_INFO","FACILITIES_LIST_CACHE_KEY","facilitiesListMemoryCache","facilitiesListFetchedAt","facilitiesListInflight","netState","cacheTtlMs","FACILITIES_LIST_DEFAULT_TTL_MS","isOnline","now","Date","cacheIsFresh","cached","get","GET_FACILITIES_LIST","FacilityListItem","set","DRIVERS_INFO","pad2","padStart","d","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","toInt","parseInt","isNaN","toStr","toFacilityId","wellId","split","pop","input","ts","fieldsPairs","edition","summary","activity","step4","vacuumPlate","chutoPlate","step5","nationality","driverId","driverName","driverLastName","step3","origin_facility_id","origin_facility_type","origin_facility_type_view","startDate","startTime","initialMeasurement","endDate","endTime","finalMeasurement","volume","fluidType","destination_facility_id","destination_facility_type","destination_facility_type_view","vacuumCondition","excludeOnEdit","pairs","k","success","submitVacuumUnloadReport","unloadTable","unloadPairs","step3LoadData","finalDestinationId","unloadPayload","unloadResult","getWellsFiltered","normalizedFilters","allWellsCache","buildWellsCacheKey","join","WELL","wellCategoryId","OptionDDL","opt","getAllWellClusters","WELL_CLUSTER","warn","DAILY_REPORT_WELL","getWellByIdCached","getWellPotentialAndRgp","well","potencial","rgp","MEASUREMENT_POINT","getMeasurementPointByIdCached","config","getEffectiveConfig","url","API_BASE_URL","purePost","FLOW_STATION_TANK","DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK","DAILY_REPORT_STORAGE_TANK","UptTank","DAILY_REPORT_UPT_TANK","usersInfoMemoryCache","Map","getCachedUsersInfo","userIds","namesMap","missingUserIds","forEach","USER_INFO","user","entra_id","display_name","tanksMemoryCache","getCachedTanksInfo","tankIds","missingIds","tank","wellsMemoryCache","getCachedWellsInfo","wellIds","measurementPointsMemoryCache","measurementPointIds","mp","pitsMemoryCache","pitIds","pit","uptTanksMemoryCache","uptTanksFacilityTypeViewsMemoryCache","getCachedUptTanksInfo","names","facilityTypeViews","uptTankIds","facilityTypeViewMap","undefined","facility_type_view","view","flowStationNamesByTankIdMemoryCache","getCachedFlowStationNames","flowStationTankIds","tankResult","flowStationIds","tankToFlowStationMap","flow_station_id","size","flowStationResult","from","flowStationNames","fs","flowStationId","flowStationName","getActivityById","ACTIVITY","getAssociatedStrategyById","getFlowStationByIdCached","allFlowStations","getDailyReportMeasurementPointById","maybeErrorDetail","cachedDetailWrapper","submitReport","log","sendReportOnline","onSuccess","onError","online","moduleName","inferModuleFromTable","offlineMutationQueueService","saveMutationForLater","offline","httpStatus","parsed","isFinite","getHttpStatusFromError","offlineError","DAILY_REPORT_NAMESPACE","prefixes","THIRD_PARTY_COMPANY","TREATMENT_PLANT","UPT","VACUUM_COMPANY","tables","work","entry","catch","prefix","Promise","all","body","response","data","findReportHistoryTables","ensureDate","start","startOf","format","end","endOf","installationType","t","promises","ApiPostBody","signal","date_created","dateCreated","creator","created_by","dateKey","isValid","Math","random","toString","slice","dateDisplay","dayKey","time","user_id","facilityId","facility_id","dailyReportId","daily_report_id","well_id","measurementPointId","measurement_point_id","pitId","pit_id","originFacilityType","edition_number","uptTankId","upt_tank_id","treatmentPlantDynamicStorageTankId","treatment_plant_dynamic_storage_tank_id","flowStationTankId","flow_station_tank_id","raw","flat","sort","a","b","parse","valueOf","dateB","dateA","localeCompare","DAILY_REPORT_PIT","MULTITENANT_API_BASE_URL","DASHBOARD_ROLES","DDL_TABLES","DDL_TABLES_ALDYL","MACHINERY","MACHINERY_LOCATION","MACHINERY_FUEL_LOAD","MACHINERY_STATUS_CHANGE","MACHINERY_OPERATOR","MACHINERY_SUPPLIER","MACHINERY_FUEL_ARRIVALS","MACHINERY_FUEL_TANK","DASH_FUEL_TANK_STOCK","LAB_REPORT","ODS_ACTIVITY_REPORT","ODS_ITEM","ODS_COST_CENTER","ODS_ACTIVITY","ODS_GROUP","TABLE_LABELS","Partial","Record","defaultConfig","LOGO_BASE_URL","LOGO_SMALL","primaryColor","CORE_CONFIG","STALE_TIME_DDL","headers","restOptions","res","method","JSON","stringify","ok","text","cause","json","AppModules","formatDateWithTime","formatTwoDigits","getDefaultTime","normalizeNumericString","toNumber","this","DailyReport","LabReport","ReportHistory","OtherReports","ODS","Dashboard","Machinery","date","safeTime","hoursRaw","minutesRaw","hours","max","min","minutes","executeFetch","fetcher","parseCacheValue","namespace","Namespace","FetchWithCacheOptions","ignoreExpiration","process","rawCache","getRaw","hasCache","isExpired","expiresAt","T","then","err","readFileAsBase64","localUri","path","RNFS","readFile","uploadFileToServer","preferredName","ext","fileName","base64","fileServer","API_FILE_SERVER","getDefaultConfig","fileContent","isAllowedForRoles","userRoles","allowedRoles","some","role","normalized","num","parseDate","customParseFormat","toDate","parseTime","safeParseParamId","sortStringsLocale","sortByLocalizedName","items","getName","sensitivity","strings","naturalCollator","Intl","Collator","numeric","normalizeString","replaceAll","compareNaturalAsc","left","compare","right","sortByNaturalOrder","getValue"],"mappings":"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"}