{"version":3,"file":"packages_core-ods_src_index_ts.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-ods/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-ods/src/services/ddlCacheMap.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-ods/src/services/odsApi.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/navigation.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":["export * from './services/odsApi';\nexport * from './services/ddlCacheMap';\nexport * from './types/ods';","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 \"ods\"\n * namespace. Same concept as `DAILY_REPORT_DDL_CACHE_MAP` in\n * core-reports.\n *\n * ODS cache keys all depend on parameters (opex/capex type,\n * costCenterId, odsItemId…), so every entry is prefix-based.\n */\nexport interface ODSCacheEntry {\n  keys?: string[];\n  prefixes?: string[];\n}\n\nexport const ODS_NAMESPACE = \"ods\" as const;\n\nexport const ODS_DDL_CACHE_MAP: Partial<Record<TableName, ODSCacheEntry>> = {\n  // `costCenters:{type}` is indirectly derived from ods_item (filters\n  // by cost_center_ids present in items). We still invalidate\n  // ods_cost_center with the \"costCenters:*\" key for consistency.\n  [TABLE_NAMES.ODS_COST_CENTER]: { prefixes: [\"costCenters:\"] },\n  [TABLE_NAMES.ODS_ITEM]: {\n    prefixes: [\"costCenters:\", \"odsItems:\"],\n  },\n  [TABLE_NAMES.ODS_GROUP]: { prefixes: [\"macro:\"] },\n  [TABLE_NAMES.ODS_ACTIVITY]: { prefixes: [\"macro:\", \"partidas:\"] },\n};\n\nexport const ODS_DDL_TABLES: readonly TableName[] = Object.keys(\n  ODS_DDL_CACHE_MAP,\n) as TableName[];\n\n/**\n * Invalidates the AsyncStorage entries associated to the given ODS\n * tables. Silent on errors.\n *\n * Re-hydration runs through the ODS MFE `warmup()` (prefetchByType),\n * which calls the getters again with the cache already emptied.\n */\nexport async function invalidateODSDDLCaches(\n  tables: readonly TableName[],\n): Promise<void> {\n  const work: Array<Promise<void>> = [];\n\n  for (const table of tables) {\n    const entry = ODS_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(ODS_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(ODS_NAMESPACE, prefix)\n            .catch(() => undefined),\n        );\n      }\n    }\n  }\n\n  await Promise.all(work);\n}\n","import { submitReportWithOfflineFallback } from '@data-oil-front/core-reports';\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\nimport {\n  TABLE_NAMES,\n  API_VERBS,\n  type ApiPostBody,\n} from \"@data-oil-front/core-utils\";\nimport type { ODSActivityReport } from \"../types/ods\";\nimport { fetchWithCache, Namespace, purePost } from \"@data-oil-front/core-utils\";\nimport { configService } from \"@data-oil-front/core-host\";\n\nasync 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\ndayjs.extend(utc);\n\n// TODO: Unificar con el de core-report en core-utils y ELIMINAR\nexport interface NoCachedDataError {\n  message: string;\n  namespace: Namespace;\n  key: string;\n  error: string | Error;\n}\n\nexport async function fetchODSReports(\n  selectedDate?: Date,\n): Promise<ODSActivityReport[]> {\n  const filters: any[] = [];\n  if (selectedDate) {\n    const d = dayjs(selectedDate);\n    const start = d.format(\"YYYY-MM-DD 00:00:00\");\n    const end = d.format(\"YYYY-MM-DD 23:59:59\");\n    filters.push([\"report_date\", \">=\", start]);\n    filters.push([\"report_date\", \"<=\", end]);\n  }\n\n  const payload = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.ODS_ACTIVITY_REPORT,\n    fields: [],\n    filter: filters,\n  };\n\n  return await post<ODSActivityReport[]>(payload);\n}\n\nexport async function fetchDaysWithReports(\n  monthKey: string,\n): Promise<string[]> {\n  const startDate = dayjs(monthKey + \"-01\")\n    .startOf(\"month\")\n    .format(\"YYYY-MM-DD 00:00:00\");\n  const endDate = dayjs(monthKey + \"-01\")\n    .endOf(\"month\")\n    .format(\"YYYY-MM-DD 23:59:59\");\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.ODS_ACTIVITY_REPORT,\n    fields: [\"report_date\"],\n    values: [],\n    filter: [\n      [\"report_date\", \">=\", startDate],\n      [\"report_date\", \"<=\", endDate],\n    ],\n  };\n\n  const result = await post<Array<{ report_date: string }>>(payload);\n  const set = new Set<string>();\n  for (const r of result ?? []) {\n    const day = dayjs.utc(r.report_date).format(\"YYYY-MM-DD\");\n    set.add(day);\n  }\n  return Array.from(set);\n}\n\n// =====================\n// ODS Combos y utilidades (offline-friendly)\n// =====================\n// Removed local fetchWithCache\n// Removed local NoCachedDataError\n\nexport interface OdsCostCenter {\n  id: number;\n  name: string;\n}\nexport interface OdsItem {\n  id: number;\n  name: string;\n  cost_center_id: number;\n  type?: string;\n}\nexport interface OdsGroup {\n  id: number;\n  name: string;\n}\nexport interface OdsActivity {\n  id: number;\n  name: string;\n  group_id: number;\n  ods_item_id: number;\n  unit?: string;\n  quantity?: number;\n  state?: string;\n  planned?: string;\n}\n\nconst ODS_NS = \"ods\";\n\nexport async function getCostCentersByType(\n  type: \"opex\" | \"capex\",\n): Promise<OdsCostCenter[]> {\n  const key = `costCenters:${type}`;\n  const result = await fetchWithCache<OdsCostCenter[] | NoCachedDataError>(\n    ODS_NS,\n    key,\n    async () => {\n      // 1) obtener ids únicos desde ods_item filtrado por type\n      const items = await post<Array<{ cost_center_id: number }>>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.ODS_ITEM,\n        fields: [\"cost_center_id\"],\n        values: [],\n        filter: [[\"type\", \"=\", type]],\n      });\n      const ids = Array.from(\n        new Set((items || []).map((it) => Number(it.cost_center_id))),\n      );\n      if (!ids.length) return [] as OdsCostCenter[];\n      // 2) resolver cada centro de costo\n      const batches = await Promise.all(\n        ids.map((id) =>\n          post<OdsCostCenter[]>({\n            verb: API_VERBS.SELECT,\n            table: TABLE_NAMES.ODS_COST_CENTER,\n            fields: [\"id\", \"name\"],\n            values: [],\n            filter: [[\"id\", \"=\", id]],\n          }),\n        ),\n      );\n      return batches.flatMap((r) => r || []);\n    },\n  );\n  if ((result as NoCachedDataError)?.error) return [];\n  return result as OdsCostCenter[];\n}\n\nexport async function getOdsItemsByCostCenterAndType(\n  costCenterId: number,\n  type: \"opex\" | \"capex\",\n): Promise<OdsItem[]> {\n  const key = `odsItems:${type}:${costCenterId}`;\n  const result = await fetchWithCache<\n    OdsItem[] | (NoCachedDataError & { isCached?: boolean })\n  >(\n    ODS_NS,\n    key,\n    async () =>\n      await post<OdsItem[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.ODS_ITEM,\n        fields: [\"id\", \"name\", \"cost_center_id\", \"type\"],\n        values: [],\n        filter: [\n          [\"type\", \"=\", type],\n          [\"cost_center_id\", \"=\", Number(costCenterId)],\n        ],\n      }),\n  );\n  if ((result as any)?.isCached) {\n    const rows = (result as OdsItem[]) || [];\n    return rows.filter(\n      (r) =>\n        String(r.cost_center_id) === String(costCenterId) &&\n        String(r.type || \"\").toLowerCase() === String(type),\n    );\n  }\n  if ((result as NoCachedDataError)?.error) {\n    // Fallback: intentar sin el filtro de type (posibles inconsistencias en BD)\n    const withoutType = await post<OdsItem[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ODS_ITEM,\n      fields: [\"id\", \"name\", \"cost_center_id\", \"type\"],\n      values: [],\n      filter: [[\"cost_center_id\", \"=\", Number(costCenterId)]],\n    }).catch(() => [] as OdsItem[]);\n    return withoutType || [];\n  }\n  return result as OdsItem[];\n}\n\nexport async function getOdsItemById(id: number): Promise<OdsItem | null> {\n  try {\n    const rows = await post<OdsItem[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ODS_ITEM,\n      fields: [\"id\", \"name\", \"cost_center_id\", \"type\"],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n    return rows?.[0] ?? null;\n  } catch {\n    return null;\n  }\n}\n\nexport async function getMacroActivitiesByOdsItem(\n  odsItemId: number,\n): Promise<OdsGroup[]> {\n  const key = `macro:${odsItemId}`;\n  const result = await fetchWithCache<OdsGroup[] | NoCachedDataError>(\n    ODS_NS,\n    key,\n    async () => {\n      const rows = await post<Array<{ group_id: number }>>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.ODS_ACTIVITY,\n        fields: [\"group_id\"],\n        values: [],\n        filter: [[\"ods_item_id\", \"=\", Number(odsItemId)]],\n      });\n      const ids = Array.from(\n        new Set((rows || []).map((r) => Number(r.group_id))),\n      );\n      if (!ids.length) return [] as OdsGroup[];\n      const batches = await Promise.all(\n        ids.map((id) =>\n          post<OdsGroup[]>({\n            verb: API_VERBS.SELECT,\n            table: TABLE_NAMES.ODS_GROUP,\n            fields: [\"id\", \"name\"],\n            values: [],\n            filter: [[\"id\", \"=\", id]],\n          }),\n        ),\n      );\n      return batches.flatMap((r) => r || []);\n    },\n  );\n  if ((result as NoCachedDataError)?.error) return [];\n  return result as OdsGroup[];\n}\n\nexport async function getPartidas(\n  groupId: number,\n  odsItemId: number,\n): Promise<OdsActivity[]> {\n  const key = `partidas:${groupId}:${odsItemId}`;\n  const result = await fetchWithCache<\n    OdsActivity[] | (NoCachedDataError & { isCached?: boolean })\n  >(\n    ODS_NS,\n    key,\n    async () =>\n      await post<OdsActivity[]>({\n        verb: API_VERBS.SELECT,\n        table: TABLE_NAMES.ODS_ACTIVITY,\n        fields: [\n          \"id\",\n          \"name\",\n          \"group_id\",\n          \"ods_item_id\",\n          \"unit\",\n          \"quantity\",\n          \"state\",\n          \"planned\",\n        ],\n        values: [],\n        filter: [\n          [\"group_id\", \"=\", Number(groupId)],\n          [\"ods_item_id\", \"=\", Number(odsItemId)],\n          [\"state\", \"!=\", \"deactivated\"],\n          [\"planned\", \"=\", \"planned\"],\n        ],\n      }),\n  );\n  if ((result as any)?.isCached) {\n    const rows = (result as OdsActivity[]) || [];\n    return rows.filter(\n      (r) =>\n        String(r.group_id) === String(groupId) &&\n        String(r.ods_item_id) === String(odsItemId) &&\n        r.state !== \"deactivated\" &&\n        r.planned === \"planned\",\n    );\n  }\n  if ((result as NoCachedDataError)?.error) return [];\n  return result as OdsActivity[];\n}\n\nexport async function getOdsActivityQuantity(\n  activityId: number,\n): Promise<number> {\n  try {\n    const res = await post<Array<{ quantity: number }>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ODS_ACTIVITY,\n      fields: [\"quantity\"],\n      values: [],\n      filter: [[\"id\", \"=\", Number(activityId)]],\n    });\n    return res?.[0]?.quantity ?? 0;\n  } catch {\n    return 0;\n  }\n}\n\nexport async function getTotalExecutedForActivity(\n  activityId: number,\n): Promise<number> {\n  try {\n    const rows = await post<Array<{ quantity_executed: number }>>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ODS_ACTIVITY_REPORT,\n      fields: [\"quantity_executed\"],\n      values: [],\n      filter: [[\"activity_id\", \"=\", Number(activityId)]],\n    });\n    return (rows || []).reduce((acc, r) => acc + (r.quantity_executed || 0), 0);\n  } catch {\n    return 0;\n  }\n}\n\nexport async function getRemainingUnitValue(\n  activityId: number,\n): Promise<number> {\n  const qty = await getOdsActivityQuantity(activityId);\n  const executed = await getTotalExecutedForActivity(activityId);\n  return Math.max(0, qty - executed);\n}\n\nexport async function getOdsReportById(\n  id: number,\n): Promise<ODSActivityReport | null> {\n  try {\n    const rows = await post<ODSActivityReport[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ODS_ACTIVITY_REPORT,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(id)]],\n    });\n    return rows?.[0] ?? null;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * @deprecated Decide later if this function should be removed\n * Obtiene una actividad ODS por su ID.\n * @param activityId El ID de la actividad ODS.\n * @returns La actividad ODS correspondiente al ID proporcionado, o null si no se encuentra.\n */\nexport async function getActivityById(\n  activityId: number,\n): Promise<OdsActivity | null> {\n  try {\n    const rows = await post<OdsActivity[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.ODS_ACTIVITY,\n      fields: [],\n      values: [],\n      filter: [[\"id\", \"=\", Number(activityId)]],\n    });\n    return rows?.[0] ?? null;\n  } catch {\n    return null;\n  }\n}\n\n// =====================\n// Envío de reporte ODS (online/offline)\n// =====================\n\nexport interface SubmitODSReportInput {\n  activity_id: number;\n  report_date: string; // YYYY-MM-DD\n  quantity_executed: number;\n  commentary?: string | null;\n  resources?: string | null;\n  use_machines?: boolean;\n  use_materials?: boolean;\n  use_consumables?: boolean;\n  use_services?: boolean;\n  use_labour?: boolean;\n  user_id?: number | string | null;\n  images?: string | null;\n  edition?: { id: number | string } | null;\n}\n\nexport async function submitODSReport(\n  input: SubmitODSReportInput,\n): Promise<{ success: boolean; offline: boolean; message: string }> {\n  const table = TABLE_NAMES.ODS_ACTIVITY_REPORT;\n  const pairs: [string, string | number | boolean | null][] = [\n    [\"activity_id\", input.activity_id],\n    [\"report_date\", input.report_date],\n    [\"quantity_executed\", input.quantity_executed],\n    [\"commentary\", input.commentary ?? null],\n    [\"resources\", input.resources ?? null],\n    [\"use_machines\", !!input.use_machines],\n    [\"use_materials\", !!input.use_materials],\n    [\"use_consumables\", !!input.use_consumables],\n    [\"use_services\", !!input.use_services],\n    [\"use_labour\", !!input.use_labour],\n    [\"user_id\", input.user_id == null ? null : String(input.user_id)],\n    [\"edition_number\", 0],\n    [\"images\", input.images ?? null],\n  ];\n  const payload: ApiPostBody = {\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 as ApiPostBody;\n  return await submitReportWithOfflineFallback(table, payload);\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/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","export const NAVIGATION = {\n  HOME: 'Home',\n  SYNC_DATA: 'SyncData',\n  DASHBOARD_WEB_VIEW: 'DashboardWebView',\n  DATA_LOADING: 'DataLoading',\n  REPORTS_HISTORY: 'ReportsHistory',\n  OTHER_REPORTS_FLOW: 'OtherReportsFlow',\n  LAB_REPORTS_FLOW: 'LabReportsFlow',\n  ODS_FLOW: 'ODSFlow',\n  MACHINERY_FLOW: 'MachineryFlow',\n  LOGIN: 'Login',\n} as const;\n\nexport const MACHINERY_SCREENS = {\n  HOME: 'MachineryHome',\n  PREVIEW: 'MachineryPreviewScreen',\n  NEW_FUEL: 'MachineNewFuel',\n  CHANGE_STATUS: 'MachineChangeStatus',\n  FUEL_ARRIVAL: 'MachineryFuelArrival',\n} as const;\n\nexport const ODS_SCREENS = {\n  HOME: 'ODSHome',\n  REPORT: 'ODSReport',\n} as const;\n\nexport const LAB_REPORTS_SCREENS = {\n  HOME: 'LabReportsHome',\n  VIEW_REPORT: 'LabViewReport',\n  ACTIVE_FORM: 'LabActiveForm',\n} as const;\n\nexport const OTHER_REPORTS_SCREENS = {\n  HOME: 'OtherReports',\n  LIFTING_COST: 'LiftingCostFormScreen',\n  OWN_INSPECTION: 'OwnInspectionFormScreen',\n  THIRD_PARTY_AUDIT: 'ThirdPartyAuditFormScreen',\n  MARKET_REFERENCE_PRICE: 'MarketReferencePriceFormScreen',\n  SHIP_TO_SHIP: 'ShipToShipFormScreen',\n  BILLED_RECOVERY_EXPENSES: 'BilledRecoveryAndExpensesFormScreen',\n  COMMENTS: 'CommentsFormScreen',\n} as const;\n\nexport const REPORTS_SCREENS = {\n  HISTORY_LIST: 'ReportsHistoryList',\n  HISTORY_VIEW: 'ReportsHistoryView',\n  DAILY_REPORT: 'DailyReport',\n  PAGE_2_EF: 'DRPage2EF',\n  PAGE_2_EPT1: 'DRPage2EPT1',\n  PAGE_2_FOSA: 'DRPage2Fosa',\n  PAGE_2_PM: 'DRPage2PM',\n  PAGE_2_UPT: 'DRPage2UPT',\n  PAGE_2_VACUUM: 'DRPage2Vacuum',\n  PAGE_2_WELL: 'DRPage2Well',\n  PAGE_3_EF_UNIC_MODEL: 'DRPage3EFUnicModel',\n  PAGE_3_EPT1: 'DRPage3EPT1',\n  PAGE_3_FOSA: 'DRPage3Fosa',\n  PAGE_3_PM: 'DRPage3PM',\n  PAGE_3_UPT: 'DRPage3UPT',\n  PAGE_3_VACUUM_LOADING: 'DRPage3VacuumLoading',\n  PAGE_3_VACUUM_UNLOADING: 'DRPage3VacuumUnloading',\n  PAGE_3_WELL: 'DRPage3Well',\n  PAGE_4_VACUUM_LOADING: 'DRPage4VacuumLoading',\n  PAGE_5_VACUUM_LOADING: 'DRPage5VacuumLoading',\n} as const;\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\";\nexport * from \"./constants/navigation\";\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":["ODS_DDL_CACHE_MAP","invalidateODSDDLCaches","ODS_NAMESPACE","TABLE_NAMES","ODS_COST_CENTER","prefixes","ODS_ITEM","ODS_GROUP","ODS_ACTIVITY","ODS_DDL_TABLES","Object","keys","tables","work","table","entry","key","push","storageService","remove","catch","prefix","removeByPrefix","Promise","all","fetchDaysWithReports","fetchODSReports","getActivityById","getCostCentersByType","getMacroActivitiesByOdsItem","getOdsItemById","getOdsItemsByCostCenterAndType","getPartidas","getTotalExecutedForActivity","submitODSReport","post","body","options","config","configService","getEffectiveConfig","url","API_BASE_URL","Error","response","purePost","success","message","data","selectedDate","filters","d","dayjs","start","format","end","payload","verb","API_VERBS","SELECT","ODS_ACTIVITY_REPORT","fields","filter","monthKey","startDate","startOf","endDate","endOf","values","result","Array","set","Set","r","day","utc","report_date","add","from","extend","ODS_NS","type","fetchWithCache","items","ids","map","it","Number","cost_center_id","length","id","flatMap","NoCachedDataError","error","costCenterId","isCached","String","toLowerCase","OdsItem","rows","odsItemId","group_id","groupId","ods_item_id","state","planned","getOdsActivityQuantity","activityId","res","quantity","reduce","acc","quantity_executed","getRemainingUnitValue","qty","executed","Math","max","getOdsReportById","ODSActivityReport","input","pairs","activity_id","commentary","resources","use_machines","use_materials","use_consumables","use_services","use_labour","user_id","images","edition","submitReportWithOfflineFallback","filterWellCategoriesForDailyReportDropdown","WELL_CATEGORY_DROPDOWN_ORDER","normalizeWellCategoryName","name","trim","normalize","replace","MIN_CANONICAL_LEN_FOR_FLEX_MATCH","matchesWellCategoryCanonical","categoryName","canonicalLabel","n","c","includes","categories","match","find","cat","used","has","canonical","findWellCategoryIdByCanonicalName","found","DAILY_REPORT_DDL_CACHE_MAP","DAILY_REPORT_DDL_TABLES","invalidateReportsDDLCaches","createFlowStationTankPayload","isEditing","reportId","editionNumber","reportDateTime","nowDate","userId","tankId","status","sampleTaken","netOperatedProduction","basePairs","tankLevel","rawOperatedProduction","comments","UPDATE","INSERT","DAILY_REPORT_FLOW_STATION_TANK","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","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","isAldyl","getCurrentConfig","clientName","includeOtherReports","ALL_REPORT_HISTORY_TABLES","DAILY_REPORT_MEASUREMENT_POINT","DAILY_REPORT_VACUUM_LOAD","DELETE","DAILY_REPORT_VACUUM_UNLOAD","DeviceEventEmitter","emit","unloadReportResponse","unloadReport","isArray","vacuumLoadId","vacuum_load_id","nowTimestamp","WELLS_ALL_CACHE_KEY","filterWellsInMemory","row","every","field","op","value","rowValue","rowString","valueString","LOCATION","console","locationId","FIELD","maybeErrorMeasurement","Field","location_id","active","WELL_CATEGORY","PUMPING_METHOD","getAllAssociatedStrategies","ASSOCIATED_STRATEGY","FLOW_STATION","shouldFetch","forceRefresh","ttl","activeOnly","cacheKey","TREATMENT_PLANT_SYSTEM","TREATMENT_PLANT_DYNAMIC_STORAGE_TANK","maybeError","UPT_TANK","PIT","getAllVacuumLoads","getVacuumLoadsSummary","mergeVacuumLoadDetail","fallback","incoming","base","assign","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","DRIVERS_INFO","pad2","padStart","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","toInt","parseInt","isNaN","toStr","toFacilityId","wellId","split","pop","ts","fieldsPairs","summary","activity","step4","vacuumPlate","chutoPlate","step5","nationality","driverId","driverName","driverLastName","step3","origin_facility_id","origin_facility_type","origin_facility_type_view","startTime","initialMeasurement","endTime","finalMeasurement","volume","fluidType","destination_facility_id","destination_facility_type","destination_facility_type_view","vacuumCondition","excludeOnEdit","k","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","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","flowStationNames","fs","flowStationId","flowStationName","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","THIRD_PARTY_COMPANY","TREATMENT_PLANT","UPT","VACUUM_COMPANY","findReportHistoryTables","ensureDate","installationType","t","promises","ApiPostBody","signal","date_created","dateCreated","creator","created_by","dateKey","isValid","random","toString","slice","dateDisplay","dayKey","time","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","UserRoles","ADMINISTRADOR","GERENTE_DE_PLANIFICACION","ANALISTA_DE_PLANIFICACION","SUPERVISOR_DE_PRODUCCION","OPERADOR_DE_PRODUCCION","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","TABLE_LABELS","Partial","Record","defaultConfig","LOGO_BASE_URL","LOGO_SMALL","primaryColor","CORE_CONFIG","LAB_REPORTS_SCREENS","REPORTS_SCREENS","NAVIGATION","HOME","SYNC_DATA","DASHBOARD_WEB_VIEW","DATA_LOADING","REPORTS_HISTORY","OTHER_REPORTS_FLOW","LAB_REPORTS_FLOW","ODS_FLOW","MACHINERY_FLOW","LOGIN","MACHINERY_SCREENS","PREVIEW","NEW_FUEL","CHANGE_STATUS","FUEL_ARRIVAL","ODS_SCREENS","REPORT","VIEW_REPORT","ACTIVE_FORM","OTHER_REPORTS_SCREENS","OWN_INSPECTION","THIRD_PARTY_AUDIT","BILLED_RECOVERY_EXPENSES","COMMENTS","HISTORY_LIST","HISTORY_VIEW","DAILY_REPORT","PAGE_2_EF","PAGE_2_EPT1","PAGE_2_FOSA","PAGE_2_PM","PAGE_2_UPT","PAGE_2_VACUUM","PAGE_2_WELL","PAGE_3_EF_UNIC_MODEL","PAGE_3_EPT1","PAGE_3_FOSA","PAGE_3_PM","PAGE_3_UPT","PAGE_3_VACUUM_LOADING","PAGE_3_VACUUM_UNLOADING","PAGE_3_WELL","PAGE_4_VACUUM_LOADING","PAGE_5_VACUUM_LOADING","STALE_TIME_DDL","headers","restOptions","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","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","getName","sensitivity","strings","naturalCollator","Intl","Collator","numeric","normalizeString","replaceAll","compareNaturalAsc","left","compare","right","sortByNaturalOrder","getValue"],"mappings":"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"}