{"version":3,"file":"__federation_expose_NavigationWarmupShellHome.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/App.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/components/DynamicModuleLoader.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/components/MfeErrorBoundary.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/components/MfeLoadErrorView.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/components/ProtectedRoute.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/constants/breadcrumbLabels.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/features/background-sync/application/derivePresentationOutcome.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/features/background-sync/application/pullToRefreshSyncRunner.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/features/background-sync/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/features/background-sync/presentation/BackgroundSyncFloating.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/features/background-sync/presentation/useBackgroundSync.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/hooks/useBackgroundSync.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/hooks/useNotificationTapHandler.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/navigation/AppNavigator.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/navigation/AppStack.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/navigation/AuthStack.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/DashboardWebViewScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/DataLoadingScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/HomeScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/ReportsHistoryScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/SyncDataScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/auth/LoginScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/screens/warmup/ModuleWarmupScreen.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/services/ddlFingerprints.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/navigationWarmupShell/src/services/ddlSync.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/services/ddlCacheMap.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/services/machineryApi.ts","/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/mfe-permissions/src/adapter/parseAccessControl.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/components/AccessRestricted.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/components/Can.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/hooks/useCan.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/hooks/useCanResolver.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/resolver/canAccess.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-permissions/src/resolver/resolvePermission.ts"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport { StatusBar, StyleSheet, View } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { useAuth } from '@data-oil-front/core-host';\nimport { NavigationContainer } from '@react-navigation/native';\nimport AppNavigator from './navigation/AppNavigator';\nimport ModuleWarmupScreen from './screens/warmup/ModuleWarmupScreen';\nimport { shouldRunWarmup } from './services/warmupStatus';\nimport { useBackgroundSync } from './hooks/useBackgroundSync';\nimport { useNotificationTapHandler } from './hooks/useNotificationTapHandler';\nimport BackgroundSyncFloating from './features/background-sync/presentation/BackgroundSyncFloating';\n\nexport default function NavigationWarmupShellApp() {\n  return (\n    <NavigationContainer>\n      <StatusBar barStyle={'dark-content'} backgroundColor={'white'} />\n      <WarmupGate />\n    </NavigationContainer>\n  );\n}\n\nfunction WarmupGate() {\n  const { user, hydrated } = useAuth();\n  const { startSync } = useBackgroundSync();\n  useNotificationTapHandler();\n  const [warmupRequired, setWarmupRequired] = useState<boolean | null>(null);\n\n  useEffect(() => {\n    if (!hydrated || !user) {\n      setWarmupRequired(null);\n      return;\n    }\n\n    let cancelled = false;\n    shouldRunWarmup()\n      .then((requiredByVersion) => {\n        if (cancelled) return;\n        setWarmupRequired(requiredByVersion);\n      })\n      .catch(() => {\n        if (cancelled) return;\n        setWarmupRequired(true);\n      });\n\n    return () => {\n      cancelled = true;\n    };\n  }, [hydrated, user]);\n\n  useEffect(() => {\n    if (!hydrated || !user) return;\n    if (warmupRequired !== false) return;\n    void startSync();\n  }, [hydrated, user, warmupRequired, startSync]);\n\n  const handleWarmupComplete = useCallback(() => {\n    setWarmupRequired(false);\n  }, []);\n\n  if (hydrated && user) {\n    if (warmupRequired === true) {\n      return <ModuleWarmupScreen onComplete={handleWarmupComplete} />;\n    }\n  }\n\n  return (\n    <SafeAreaView style={styles.safeArea}>\n      <View style={styles.appContainer}>\n        <AppNavigator />\n        {user ? <BackgroundSyncFloating /> : null}\n      </View>\n    </SafeAreaView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  safeArea: {\n    flex: 1,\n    backgroundColor: '#fff',\n  },\n  appContainer: {\n    flex: 1,\n    backgroundColor: '#fff',\n  },\n});\n","import React, { Suspense, useMemo } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { LoadingSpinner } from '@data-oil-front/ui-mobile';\nimport { useConfig, normalizeMfeModule } from '@data-oil-front/core-host';\nimport MfeErrorBoundary from './MfeErrorBoundary';\nimport MfeLoadErrorView from './MfeLoadErrorView';\n\ninterface DynamicModuleLoaderProps {\n  moduleName: string;\n  exposePath: string;\n  fallbackText?: string;\n}\n\nconst getModulePromise = (moduleName: string, exposePath: string) => {\n  switch (`${moduleName}/${exposePath}`) {\n    case 'OtherReports/./OtherReportsNavigator':\n      return import('OtherReports/OtherReportsNavigator');\n    case 'LabReports/./LabReportsNavigator':\n      return import('LabReports/LabReportsNavigator');\n    case 'ODS/./ODSNavigator':\n      return import('ODS/ODSNavigator');\n    case 'Machinery/./MachineryNavigator':\n      return import('Machinery/MachineryNavigator');\n    case 'Reports/./ReportsHome':\n      return import('Reports/ReportsHome');\n    default:\n      throw new Error(`Unknown module: ${moduleName}/${exposePath}`);\n  }\n};\n\nexport default function DynamicModuleLoader({\n  moduleName,\n  exposePath,\n  fallbackText = 'Cargando módulo...',\n}: DynamicModuleLoaderProps) {\n  const { config } = useConfig();\n  const primaryColor = config?.primaryColor || '#000';\n\n  const RemoteModule = useMemo(() => {\n    return React.lazy(() => normalizeMfeModule(getModulePromise(moduleName, exposePath)));\n  }, [moduleName, exposePath]);\n\n  return (\n    <MfeErrorBoundary\n      fallback={(error, reset) => (\n        <MfeLoadErrorView\n          error={error}\n          onRetry={reset}\n        />\n      )}\n    >\n      <Suspense\n        fallback={\n          <View style={styles.loadingContainer}>\n            <LoadingSpinner size=\"large\" color={primaryColor} />\n            <Text style={styles.loadingText}>{fallbackText}</Text>\n          </View>\n        }\n      >\n        <RemoteModule />\n      </Suspense>\n    </MfeErrorBoundary>\n  );\n}\n\nconst styles = StyleSheet.create({\n  loadingContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: '#F9FAFB',\n    gap: 12,\n  },\n  loadingText: {\n    color: '#6B7280',\n    fontSize: 16,\n  },\n});","import React, { Component, type ReactNode } from 'react';\n\ntype FallbackRender = (error: unknown, reset: () => void) => ReactNode;\n\ninterface MfeErrorBoundaryProps {\n  children: ReactNode;\n  fallback: FallbackRender;\n}\n\ninterface MfeErrorBoundaryState {\n  hasError: boolean;\n  error: unknown;\n  resetCounter: number;\n}\n\nexport class MfeErrorBoundary extends Component<MfeErrorBoundaryProps, MfeErrorBoundaryState> {\n  constructor(props: MfeErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null, resetCounter: 0 };\n  }\n\n  static getDerivedStateFromError(error: unknown): Partial<MfeErrorBoundaryState> {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: unknown, info: any) {\n    // eslint-disable-next-line no-console\n    console.error('[MfeErrorBoundary] Caught error:', error, info);\n  }\n\n  reset = () => {\n    this.setState(prev => ({ hasError: false, error: null, resetCounter: prev.resetCounter + 1 }));\n  };\n\n  render() {\n    const { children, fallback } = this.props;\n    const { hasError, error, resetCounter } = this.state;\n\n    if (hasError) {\n      return <>{fallback(error, this.reset)}</>;\n    }\n\n    return <React.Fragment key={resetCounter}>{children}</React.Fragment>;\n  }\n}\n\nexport default MfeErrorBoundary;\n\n\n","import React from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\n\ninterface Props {\n  error: unknown;\n  onRetry: () => void;\n}\n\nfunction getErrorMessage(error: unknown): string {\n  if (error instanceof Error) return error.message;\n  if (typeof error === 'string') return error;\n  try {\n    return JSON.stringify(error);\n  } catch {\n    return 'Error desconocido';\n  }\n}\n\nexport default function MfeLoadErrorView({ error, onRetry }: Props) {\n  const message = getErrorMessage(error);\n\n  return (\n    <View style={styles.container}>\n      <Text style={styles.title}>No se pudo cargar el módulo</Text>\n      <Text style={styles.subtitle}>Verifica tu conexión o inténtalo nuevamente.</Text>\n      <View style={styles.messageBox}>\n        <Text style={styles.messageText} numberOfLines={3}>\n          {message}\n        </Text>\n      </View>\n      <TouchableOpacity onPress={onRetry} activeOpacity={0.8} style={styles.button}>\n        <Text style={styles.buttonText}>Reintentar</Text>\n      </TouchableOpacity>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    width: '100%',\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#fecaca',\n    backgroundColor: '#fff1f2',\n    padding: 12,\n  },\n  title: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: '#7f1d1d',\n    marginBottom: 4,\n  },\n  subtitle: {\n    fontSize: 14,\n    color: '#7f1d1d',\n    marginBottom: 8,\n  },\n  messageBox: {\n    backgroundColor: '#ffe4e6',\n    padding: 8,\n    borderRadius: 6,\n    marginBottom: 10,\n  },\n  messageText: {\n    fontSize: 12,\n    color: '#7f1d1d',\n  },\n  button: {\n    alignSelf: 'flex-start',\n    paddingHorizontal: 12,\n    paddingVertical: 8,\n    backgroundColor: '#ef4444',\n    borderRadius: 6,\n  },\n  buttonText: {\n    color: '#ffffff',\n    fontWeight: '600',\n  },\n});\n\n\n","import React from 'react';\nimport { useAuth } from '@data-oil-front/core-host';\n\ninterface ProtectedRouteProps {\n  children: React.ReactNode;\n}\n\nexport default function ProtectedRoute({ children }: ProtectedRouteProps) {\n  const { user, isLoggedIn, hydrated } = useAuth();\n\n  if (!hydrated || !isLoggedIn || !user) {\n    return null;\n  }\n\n  return <>{children}</>;\n}\n","import type { BreadcrumbLabelRegistry } from '@data-oil-front/ui-mobile';\nimport { NAVIGATION } from '@data-oil-front/core-utils';\n\n/**\n * Registro de labels de las rutas del shell (host). El label de\n * DashboardWebView se deriva del route param `label`.\n */\nexport const SHELL_BREADCRUMB_LABELS: BreadcrumbLabelRegistry = {\n  [NAVIGATION.HOME]: 'Home',\n  [NAVIGATION.SYNC_DATA]: 'Datos de sincronización',\n  [NAVIGATION.DATA_LOADING]: 'Cargando Datos',\n  [NAVIGATION.DASHBOARD_WEB_VIEW]: (params) =>\n    (typeof params?.label === 'string' && params.label) || 'Dashboard',\n};\n","/**\n * Agrega señales del pipeline de sync en un único resultado de UI (un solo lugar de reglas).\n */\nimport type { CheckForUpdatesResult } from '../../../services/moduleSync';\nimport type { DDLSyncResult } from '../../../services/ddlSync';\nimport type { SyncPresentationOutcome } from '../model/syncPresentation.types';\n\nexport type DeriveOutcomeInput = {\n  checkForUpdatesResult: CheckForUpdatesResult | null;\n  /** Si hubo excepción antes de asignar resultado, debe ser true. */\n  checkForUpdatesThrew: boolean;\n  moduleSyncThrew: boolean;\n  ddlResult: DDLSyncResult;\n};\n\nexport function derivePresentationOutcome(\n  input: DeriveOutcomeInput,\n): SyncPresentationOutcome {\n  const {\n    checkForUpdatesThrew,\n    moduleSyncThrew,\n    checkForUpdatesResult,\n    ddlResult,\n  } = input;\n\n  if (checkForUpdatesThrew || moduleSyncThrew) {\n    return 'error';\n  }\n\n  if (ddlResult.skipped === 'offline') {\n    return 'error';\n  }\n\n  if (checkForUpdatesResult === 'unknown') {\n    return 'partial';\n  }\n\n  if (ddlResult.unknownTables.length > 0) {\n    return 'partial';\n  }\n\n  return 'success';\n}\n","/**\n * Orquestación completa del pull-to-refresh: checkForUpdates → MFE/config → refresh UI → DDL.\n * Contrato: actualiza syncPresentationStore; no monta componentes React.\n */\nimport { checkForUpdates } from '../../../services/moduleSync';\nimport { clearWarmupStatus } from '../../../services/warmupStatus';\nimport { restartApp } from '../../../services/appRestart';\nimport { purgeMfeBundleCache } from '../../../services/mfeBundleCache';\nimport {\n  syncDDLs,\n  getDDLSyncFlagsFromConfig,\n  type DDLSyncOptions,\n} from '../../../services/ddlSync';\nimport { executeBackgroundModuleSync } from './backgroundModuleSyncRunner';\nimport { derivePresentationOutcome } from './derivePresentationOutcome';\nimport {\n  beginPullPresentationChecking,\n  endPullSyncSession,\n  resetSyncPresentationIdle,\n  setSyncPresentationResult,\n  setSyncPresentationSyncing,\n} from '../state/syncPresentationStore';\n\nexport type PullToRefreshSyncOptions = {\n  refreshAvailability: () => Promise<void>;\n  /** Toasts opcionales (misma UX que antes en HomeScreen). */\n  ddlSyncHooks?: Pick<DDLSyncOptions, 'onStart' | 'onComplete'>;\n};\n\nconst PTR_TIMEOUT_MS = 25_000;\n\nlet pullInFlight: Promise<void> | null = null;\n\nfunction safetyTimeout(): Promise<void> {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      endPullSyncSession();\n      pullInFlight = null;\n      resolve();\n    }, PTR_TIMEOUT_MS);\n  });\n}\n\nexport function runPullToRefreshSync(\n  options: PullToRefreshSyncOptions,\n): Promise<void> {\n  if (pullInFlight) return pullInFlight;\n\n  pullInFlight = (async () => {\n    beginPullPresentationChecking();\n    try {\n      let checkForUpdatesResult: Awaited<ReturnType<typeof checkForUpdates>> | null =\n        null;\n      let checkForUpdatesThrew = false;\n\n      try {\n        checkForUpdatesResult = await checkForUpdates();\n        if (checkForUpdatesResult === 'updates-available') {\n          resetSyncPresentationIdle();\n          // Nukear la cache de bundles ANTES de reiniciar. clearWarmupStatus\n          // fuerza re-correr el warmup, pero sin evictar la cache de ScriptManager\n          // el warmup le sigue sirviendo el bundle VIEJO (el nav no hot-swappea).\n          // Con la purga, el warmup baja todo fresco → el nav queda actualizado.\n          // Sessionless: no desloguea (ver mfeBundleCache.ts).\n          await purgeMfeBundleCache();\n          await clearWarmupStatus();\n          void restartApp('updates-found-from-pull-to-refresh');\n          return;\n        }\n      } catch {\n        checkForUpdatesThrew = true;\n      }\n\n      setSyncPresentationSyncing();\n\n      let moduleSyncThrew = false;\n      try {\n        await executeBackgroundModuleSync();\n      } catch {\n        moduleSyncThrew = true;\n      }\n\n      try {\n        await options.refreshAvailability();\n      } catch {\n        /* no bloquear DDL */\n      }\n\n      const ddlResult = await syncDDLs({\n        flags: getDDLSyncFlagsFromConfig(),\n        onStart: options.ddlSyncHooks?.onStart,\n        onComplete: options.ddlSyncHooks?.onComplete,\n      });\n\n      const presentationOutcome = derivePresentationOutcome({\n        checkForUpdatesResult,\n        checkForUpdatesThrew,\n        moduleSyncThrew,\n        ddlResult,\n      });\n\n      setSyncPresentationResult(presentationOutcome);\n    } finally {\n      endPullSyncSession();\n    }\n  })().finally(() => {\n    pullInFlight = null;\n  });\n\n  return Promise.race([pullInFlight, safetyTimeout()]);\n}\n","/**\n * API pública del feature background-sync.\n */\nexport type {\n  SyncPresentationPhase,\n  SyncPresentationOutcome,\n  SyncPresentationSnapshot,\n} from './model/syncPresentation.types';\n\nexport { runPullToRefreshSync } from './application/pullToRefreshSyncRunner';\nexport type { PullToRefreshSyncOptions } from './application/pullToRefreshSyncRunner';\n\nexport { derivePresentationOutcome } from './application/derivePresentationOutcome';\nexport type { DeriveOutcomeInput } from './application/derivePresentationOutcome';\n\nexport { useBackgroundSync } from './presentation/useBackgroundSync';\nexport { default as BackgroundSyncFloating } from './presentation/BackgroundSyncFloating';\n","import React, { useEffect, useRef } from 'react';\nimport { ActivityIndicator, StyleSheet, Text, View } from 'react-native';\nimport { useBackgroundSync } from './useBackgroundSync';\nimport { resetSyncPresentationIdle } from '../state/syncPresentationStore';\nimport type { SyncPresentationSnapshot } from '../model/syncPresentation.types';\n\nconst RESULT_DISPLAY_MS = 2800;\n\nexport default function BackgroundSyncFloating() {\n  const { snapshot } = useBackgroundSync();\n  const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  useEffect(() => {\n    if (snapshot.phase !== 'result') {\n      if (hideTimerRef.current) {\n        clearTimeout(hideTimerRef.current);\n        hideTimerRef.current = null;\n      }\n      return;\n    }\n    hideTimerRef.current = setTimeout(() => {\n      hideTimerRef.current = null;\n      resetSyncPresentationIdle();\n    }, RESULT_DISPLAY_MS);\n    return () => {\n      if (hideTimerRef.current) {\n        clearTimeout(hideTimerRef.current);\n        hideTimerRef.current = null;\n      }\n    };\n  }, [snapshot.phase, snapshot.outcome]);\n\n  if (snapshot.phase === 'idle') {\n    return null;\n  }\n\n  const { label, badgeStyle, spinnerColor } = mapSnapshotToPresentation(snapshot);\n\n  const showSpinner =\n    snapshot.phase === 'checking' || snapshot.phase === 'syncing';\n\n  return (\n    <View pointerEvents=\"none\" style={styles.container}>\n      <View style={[styles.badge, badgeStyle]}>\n        {showSpinner ? (\n          <View style={styles.spinnerWrap}>\n            <ActivityIndicator size={16} color={spinnerColor} />\n          </View>\n        ) : null}\n        <Text style={[styles.label, { color: spinnerColor }]}>{label}</Text>\n      </View>\n    </View>\n  );\n}\n\nfunction mapSnapshotToPresentation(snapshot: SyncPresentationSnapshot): {\n  label: string;\n  badgeStyle: object;\n  spinnerColor: string;\n} {\n  if (snapshot.phase === 'checking') {\n    return {\n      label: 'Checking',\n      badgeStyle: styles.badgeWarning,\n      spinnerColor: '#78350f',\n    };\n  }\n  if (snapshot.phase === 'syncing') {\n    return {\n      label: 'SYNC',\n      badgeStyle: styles.badgeInfo,\n      spinnerColor: '#1e3a5f',\n    };\n  }\n  if (snapshot.phase === 'result' && snapshot.outcome === 'success') {\n    return {\n      label: 'SYNC Exitoso',\n      badgeStyle: styles.badgeSuccess,\n      spinnerColor: '#14532d',\n    };\n  }\n  return {\n    label: 'SYNC con problemas',\n    badgeStyle: styles.badgeError,\n    spinnerColor: '#7f1d1d',\n  };\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    position: 'absolute',\n    right: 24,\n    bottom: 12,\n  },\n  badge: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    paddingHorizontal: 12,\n    paddingVertical: 8,\n    borderRadius: 999,\n    borderWidth: 1,\n  },\n  spinnerWrap: {\n    marginRight: 8,\n  },\n  badgeWarning: {\n    backgroundColor: 'rgba(254, 243, 199, 0.95)',\n    borderColor: 'rgba(245, 158, 11, 0.6)',\n  },\n  badgeInfo: {\n    backgroundColor: '#dbeafe',\n    borderColor: '#3b82f6',\n  },\n  badgeSuccess: {\n    backgroundColor: 'rgba(220, 252, 231, 0.95)',\n    borderColor: 'rgba(34, 197, 94, 0.45)',\n  },\n  badgeError: {\n    backgroundColor: 'rgba(254, 226, 226, 0.95)',\n    borderColor: 'rgba(239, 68, 68, 0.5)',\n  },\n  label: {\n    fontSize: 10,\n    fontWeight: '800',\n    letterSpacing: 0.6,\n    textTransform: 'uppercase',\n  },\n});\n","import { useEffect, useState } from 'react';\nimport { startBackgroundSync } from '../../../services/backgroundSync';\nimport type { SyncPresentationSnapshot } from '../model/syncPresentation.types';\nimport {\n  getSyncPresentationSnapshot,\n  subscribeSyncPresentation,\n} from '../state/syncPresentationStore';\n\nexport function useBackgroundSync(): {\n  snapshot: SyncPresentationSnapshot;\n  isSyncing: boolean;\n  startSync: () => Promise<void>;\n} {\n  const [snapshot, setSnapshot] = useState(getSyncPresentationSnapshot);\n\n  useEffect(() => subscribeSyncPresentation(setSnapshot), []);\n\n  return {\n    snapshot,\n    isSyncing: snapshot.isBusy,\n    startSync: startBackgroundSync,\n  };\n}\n","export { useBackgroundSync } from '../features/background-sync/presentation/useBackgroundSync';\n","import { useEffect } from 'react';\nimport { Linking } from 'react-native';\nimport messaging from '@react-native-firebase/messaging';\nimport notifee, { EventType } from '@notifee/react-native';\n\nfunction openUrlIfPresent(url?: string): void {\n  if (url) {\n    Linking.openURL(url).catch(() => {});\n  }\n}\n\nexport function useNotificationTapHandler(): void {\n  useEffect(() => {\n    // App was killed and launched by tapping a notification\n    messaging()\n      .getInitialNotification()\n      .then(remoteMessage => {\n        openUrlIfPresent(remoteMessage?.data?.url as string | undefined);\n      })\n      .catch(() => {});\n\n    // App was in background and brought to foreground by tapping a notification\n    const unsubscribeBackground = messaging().onNotificationOpenedApp(remoteMessage => {\n      openUrlIfPresent(remoteMessage?.data?.url as string | undefined);\n    });\n\n    // Foreground notification displayed via Notifee — user tapped it\n    const unsubscribeForeground = notifee.onForegroundEvent(({ type, detail }) => {\n      if (type === EventType.PRESS) {\n        openUrlIfPresent(detail.notification?.data?.url as string | undefined);\n      }\n    });\n\n    return () => {\n      unsubscribeBackground();\n      unsubscribeForeground();\n    };\n  }, []);\n}\n","import React from 'react';\nimport { createStackNavigator } from '@react-navigation/stack';\nimport { useAuth } from '@data-oil-front/core-host';\nimport { NAVIGATION } from '@data-oil-front/core-utils';\nimport AuthStack from './AuthStack';\nimport AppStack from './AppStack';\nimport LoadingScreen from '../screens/DataLoadingScreen';\n\nconst Stack = createStackNavigator();\n\nexport default function AppNavigator() {\n  const { user, hydrated } = useAuth();\n\n  if (!hydrated) {\n    return <LoadingScreen />;\n  }\n\n  return (\n    <Stack.Navigator \n      screenOptions={{ \n        headerShown: false,\n        gestureEnabled: true,\n        gestureDirection: 'horizontal',\n      }}\n    >\n      {user ? (\n        <Stack.Screen name={NAVIGATION.HOME} component={AppStack} />\n      ) : (\n        <Stack.Screen name={NAVIGATION.LOGIN} component={AuthStack} />\n      )}\n    </Stack.Navigator>\n  );\n}\n","import React from 'react';\nimport { createStackNavigator } from '@react-navigation/stack';\nimport { useConfig, useAuth } from '@data-oil-front/core-host';\nimport { NAVIGATION } from '@data-oil-front/core-utils';\nimport { Header } from '../components/header';\nimport { Breadcrumb } from '@data-oil-front/ui-mobile';\nimport ProtectedRoute from '../components/ProtectedRoute';\n\nimport HomeScreen from '../screens/HomeScreen';\nimport DataLoadingScreen from '../screens/DataLoadingScreen';\nimport ReportsHistoryScreen from '../screens/ReportsHistoryScreen';\nimport SyncDataScreen from '../screens/SyncDataScreen';\nimport DashboardWebViewScreen from '../screens/DashboardWebViewScreen';\nimport { DEFAULT_PRIMARY_COLOR } from '../constants/appConfig';\nimport { SHELL_BREADCRUMB_LABELS } from '../constants/breadcrumbLabels';\nimport { isRemoteEnabledInDev } from '../utils/mfeAvailability';\nimport DynamicModuleLoader from '../components/DynamicModuleLoader';\n\nconst Stack = createStackNavigator();\n\nfunction useHeaderUser() {\n  const { user } = useAuth();\n  const { config: clientConfig } = useConfig();\n  let displayName = user?.displayName\n    ? user.displayName.split(' ')[0]\n    : 'Usuario';\n  displayName = displayName.includes('@')\n    ? displayName.split('@')[0]\n    : displayName;\n  const primaryColor = clientConfig.primaryColor ?? DEFAULT_PRIMARY_COLOR;\n  return { displayName, primaryColor };\n}\n\nconst CustomHeader = ({ navigation }: any) => {\n  const { displayName, primaryColor } = useHeaderUser();\n  return (\n    <>\n      <Header\n        onSyncData={() => {\n          navigation.navigate(NAVIGATION.SYNC_DATA);\n        }}\n        user={{ displayName }}\n      />\n      <Breadcrumb routeLabels={SHELL_BREADCRUMB_LABELS} color={primaryColor} />\n    </>\n  );\n};\n\n// Header para la ruta de reports: el shell aporta SOLO el chrome (logo, wifi,\n// menú de usuario). El breadcrumb lo dibuja el MFE de reports. Así el header no\n// se duplica cuando conviven versiones distintas del shell y del MFE.\nconst ReportsChromeHeader = ({ navigation }: any) => {\n  const { displayName } = useHeaderUser();\n  return (\n    <Header\n      onSyncData={() => {\n        navigation.navigate(NAVIGATION.SYNC_DATA);\n      }}\n      user={{ displayName }}\n    />\n  );\n};\n\nexport default function AppStack() {\n  const initialRoute = NAVIGATION.HOME;\n  const { config: clientConfig } = useConfig();\n\n  const safeCoreConfig = (clientConfig?.CORE_CONFIG as any) ?? {};\n  const canUseOtherReportsRoutes = isRemoteEnabledInDev('OtherReports') && (safeCoreConfig?.otherReports?.enabled ?? false);\n  const canUseLabRoutes = isRemoteEnabledInDev('LabReports') && (safeCoreConfig?.labReports?.enabled ?? false);\n  const canUseODSRoutes = isRemoteEnabledInDev('ODS') && (safeCoreConfig?.odsModule?.enabled ?? false);\n  const canUseMachineryRoutes = isRemoteEnabledInDev('Machinery') && (safeCoreConfig?.machinery?.enabled ?? false);\n  const canUseReportsRoutes = isRemoteEnabledInDev('Reports') && ((safeCoreConfig?.reports?.enabled ?? safeCoreConfig?.dailyReport?.enabled) ?? true);\n\n  return (\n    <ProtectedRoute>\n      <Stack.Navigator\n        screenOptions={{\n          headerShown: true,\n          gestureEnabled: true,\n          gestureDirection: 'horizontal',\n        }}\n        initialRouteName={initialRoute}\n      >\n        <Stack.Screen\n          name={NAVIGATION.HOME}\n          component={HomeScreen}\n          options={{\n            title: 'Inicio',\n            header: CustomHeader,\n          }}\n        />\n        <Stack.Screen\n          name={NAVIGATION.DASHBOARD_WEB_VIEW}\n          component={DashboardWebViewScreen}\n          options={({ route }: any) => ({\n            title: route?.params?.label ?? 'Dashboard',\n            headerBackTitle: 'Atrás',\n            header: CustomHeader,\n          })}\n        />\n        <Stack.Screen\n          name={NAVIGATION.DATA_LOADING}\n          component={DataLoadingScreen}\n          options={{\n            title: 'Cargando Datos',\n            header: CustomHeader,\n          }}\n        />\n        <Stack.Screen\n          name={NAVIGATION.SYNC_DATA}\n          component={SyncDataScreen}\n          options={{\n            title: 'Datos de sincronización',\n            headerBackTitle: 'Atrás',\n            header: CustomHeader,\n          }}\n        />\n\n        {canUseReportsRoutes && (\n          <Stack.Screen\n            name={NAVIGATION.REPORTS_HISTORY}\n            component={ReportsHistoryScreen}\n            options={{ headerShown: true, header: ReportsChromeHeader }}\n          />\n        )}\n\n        {canUseOtherReportsRoutes && (\n          <Stack.Screen\n            name={NAVIGATION.OTHER_REPORTS_FLOW}\n            options={{ headerShown: false }}\n          >\n            {() => (\n              <DynamicModuleLoader\n                moduleName=\"OtherReports\"\n                exposePath=\"./OtherReportsNavigator\"\n              />\n            )}\n          </Stack.Screen>\n        )}\n\n        {canUseLabRoutes && (\n          <Stack.Screen\n            name={NAVIGATION.LAB_REPORTS_FLOW}\n            options={{ headerShown: false }}\n          >\n            {() => (\n              <DynamicModuleLoader\n                moduleName=\"LabReports\"\n                exposePath=\"./LabReportsNavigator\"\n              />\n            )}\n          </Stack.Screen>\n        )}\n\n        {canUseODSRoutes && (\n          <Stack.Screen\n            name={NAVIGATION.ODS_FLOW}\n            options={{ headerShown: false }}\n          >\n            {() => (\n              <DynamicModuleLoader moduleName=\"ODS\" exposePath=\"./ODSNavigator\" />\n            )}\n          </Stack.Screen>\n        )}\n\n        {canUseMachineryRoutes && (\n          <Stack.Screen\n            name={NAVIGATION.MACHINERY_FLOW}\n            options={{ headerShown: false }}\n          >\n            {() => (\n              <DynamicModuleLoader\n                moduleName=\"Machinery\"\n                exposePath=\"./MachineryNavigator\"\n              />\n            )}\n          </Stack.Screen>\n        )}\n      </Stack.Navigator>\n    </ProtectedRoute>\n  );\n}\n","import React from 'react';\nimport { createStackNavigator } from '@react-navigation/stack';\nimport { NAVIGATION } from '@data-oil-front/core-utils';\nimport LoginScreen from '../screens/auth/LoginScreen';\n\nconst Stack = createStackNavigator();\n\nexport default function AuthStack() {\n  return (\n    <Stack.Navigator \n      screenOptions={{ \n        headerShown: false,\n        gestureEnabled: true,\n        gestureDirection: 'horizontal',\n      }}\n    >\n      <Stack.Screen name={NAVIGATION.LOGIN} component={LoginScreen} />\n    </Stack.Navigator>\n  );\n}\n","import React, { useMemo } from 'react';\nimport { View, StyleSheet, Text } from 'react-native';\nimport { useRoute, type RouteProp } from '@react-navigation/native';\nimport { WebView } from 'react-native-webview';\n\nimport { LoadingSpinner } from '@data-oil-front/ui-mobile';\n\nimport type { RootStackParamList } from '../interfaces/navigation';\n\ntype DashboardWebViewRouteProp = RouteProp<RootStackParamList, 'DashboardWebView'>;\n\nexport default function DashboardWebViewScreen() {\n  const route = useRoute<DashboardWebViewRouteProp>();\n  const { label = 'Dashboard', url = '' } = route.params ?? {};\n\n  const source = useMemo(() => {\n    if (!url) return undefined;\n    return { uri: url } as const;\n  }, [url]);\n\n  if (!source) {\n    return (\n      <View style={styles.fallbackContainer}>\n        <Text style={styles.fallbackTitle}>{label}</Text>\n        <Text style={styles.fallbackSubtitle}>\n          No se pudo cargar el dashboard solicitado.\n        </Text>\n      </View>\n    );\n  }\n\n  return (\n    <View style={styles.container}>\n      <WebView\n        source={source}\n        startInLoadingState\n        renderLoading={() => (\n          <View style={styles.loaderContainer}>\n            <LoadingSpinner />\n          </View>\n        )}\n      />\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#ffffff',\n  },\n  loaderContainer: {\n    flex: 1,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  fallbackContainer: {\n    flex: 1,\n    alignItems: 'center',\n    justifyContent: 'center',\n    padding: 24,\n    backgroundColor: '#ffffff',\n  },\n  fallbackTitle: {\n    fontSize: 20,\n    fontWeight: '600',\n    marginBottom: 12,\n    color: '#111827',\n    textAlign: 'center',\n  },\n  fallbackSubtitle: {\n    fontSize: 16,\n    color: '#4B5563',\n    textAlign: 'center',\n  },\n});\n\n","import React from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { LoadingSpinner } from '@data-oil-front/ui-mobile';\n\nexport default function LoadingScreen() {\n  return (\n    <View style={styles.container}>\n      <LoadingSpinner size=\"large\" color=\"#007AFF\" />\n      <Text style={styles.text}>Cargando...</Text>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: '#f5f5f5',\n  },\n  text: {\n    marginTop: 16,\n    fontSize: 16,\n    color: '#666',\n  },\n});\n","import React, {\n  useCallback,\n  useEffect,\n  lazy,\n  Suspense,\n  useMemo,\n  useState,\n} from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  ScrollView,\n  Dimensions,\n  TouchableOpacity,\n  RefreshControl,\n} from 'react-native';\nimport { useFocusEffect, useNavigation } from '@react-navigation/native';\nimport { RootStackNavigationProp } from '../interfaces/navigation';\n\nimport {\n  IconCardButton,\n  useNetworkStatus,\n  LoadingSpinner,\n} from '@data-oil-front/ui-mobile';\nimport {\n  useConfig,\n  useAuth,\n  storageService,\n  safeNormalizeMfeModule,\n} from '@data-oil-front/core-host';\nimport {\n  NAVIGATION,\n  REPORTS_SCREENS,\n  ODS_SCREENS,\n} from '@data-oil-front/core-utils';\nimport { useCan } from '@data-oil-front/mfe-permissions';\nimport {\n  DocumentTextIcon,\n  ClipboardDocumentListIcon,\n  ClockIcon,\n  CogIcon,\n  ChevronRightIcon,\n} from 'react-native-heroicons/outline';\nimport Toast from 'react-native-toast-message';\nimport { ODSWidget } from '@data-oil-front/ui-mobile';\nimport { FolderIconButton } from '@data-oil-front/ui-mobile';\nimport MfeErrorBoundary from '../components/MfeErrorBoundary';\nimport MfeLoadErrorView from '../components/MfeLoadErrorView';\nimport { getCachedReportsManifest } from '../services/reportsManifest';\nimport { getCachedODSManifest } from '../services/odsManifest';\nimport { getCachedMachineryManifest } from '../services/machineryManifest';\nimport { runPullToRefreshSync } from '../features/background-sync';\nimport {\n  REPORTS_READY_FLAG,\n  LAB_REPORTS_READY_FLAG,\n  ODS_READY_FLAG,\n  MACHINERY_READY_FLAG,\n} from './warmup/constants';\nimport {\n  getRemoteEntryUrl,\n  isRemoteEntryReachable,\n  isRemoteEnabledInDev,\n} from '../utils/mfeAvailability';\n\nimport { useBackgroundSync } from '../hooks/useBackgroundSync';\n\ntype DashboardLink = {\n  label?: string;\n  url?: string;\n};\n\nexport default function HomeScreen() {\n  const navigation = useNavigation<RootStackNavigationProp>();\n  const { user } = useAuth();\n  const canViewReport = useCan('report', 'view');\n  const canCreateReport = useCan('report', 'create');\n  const canViewOtherReport = useCan('otherReport', 'view');\n  const canViewLabReport = useCan('labReport', 'view');\n  const canViewODS = useCan('ods', 'view');\n  const canViewMachinery = useCan('machinery', 'view');\n  const canViewDashboard = useCan('dashboard', 'view');\n  const { isConnected } = useNetworkStatus();\n  const { snapshot } = useBackgroundSync();\n  const { config: clientConfig } = useConfig();\n  const { CORE_CONFIG: coreConfig, primaryColor } = clientConfig;\n  const safeCoreConfig = (coreConfig as any) ?? {};\n  const isODSModuleEnabled = safeCoreConfig?.odsModule?.enabled ?? false;\n  const isReportsModuleEnabled = safeCoreConfig?.reports?.enabled ?? true;\n  const isMachineryModuleEnabled = safeCoreConfig?.machinery?.enabled ?? false;\n  const isOtherReportsModuleEnabled =\n    safeCoreConfig?.otherReports?.enabled ?? false;\n  const isLabReportsModuleEnabled =\n    safeCoreConfig?.labReports?.enabled ?? false;\n\n  const isReportsDevEnabled = isRemoteEnabledInDev('Reports');\n  const isOtherReportsDevEnabled = isRemoteEnabledInDev('OtherReports');\n  const isLabReportsDevEnabled = isRemoteEnabledInDev('LabReports');\n  const isODSDevEnabled = isRemoteEnabledInDev('ODS');\n  const isMachineryDevEnabled = isRemoteEnabledInDev('Machinery');\n\n  const canUseReportsModule = isReportsModuleEnabled && isReportsDevEnabled;\n  const canUseOtherReportsModule =\n    isOtherReportsModuleEnabled && isOtherReportsDevEnabled;\n  const canUseLabReportsModule =\n    isLabReportsModuleEnabled && isLabReportsDevEnabled;\n  const canUseODSModule = isODSModuleEnabled && isODSDevEnabled;\n  const canUseMachineryModule =\n    isMachineryModuleEnabled && isMachineryDevEnabled;\n\n  const [labRemoteAvailable, setLabRemoteAvailable] = useState(false);\n  const [odsRemoteAvailable, setOdsRemoteAvailable] = useState(false);\n  const [reportsRemoteAvailable, setReportsRemoteAvailable] = useState(false);\n  const [otherRemoteAvailable, setOtherRemoteAvailable] = useState(false);\n  const [machineryRemoteAvailable, setMachineryRemoteAvailable] =\n    useState(false);\n  const [reportsOfflineReady, setReportsOfflineReady] = useState(false);\n  const [labOfflineReady, setLabOfflineReady] = useState(false);\n  const [odsOfflineReady, setOdsOfflineReady] = useState(false);\n  const [machineryOfflineReady, setMachineryOfflineReady] = useState(false);\n  const dashboardLinks: DashboardLink[] = Array.isArray(\n    safeCoreConfig?.DASHBOARDS_LINKS,\n  )\n    ? (safeCoreConfig.DASHBOARDS_LINKS as DashboardLink[])\n        .filter(\n          link =>\n            typeof link?.label === 'string' && typeof link?.url === 'string',\n        )\n        .map(link => {\n          let updatedUrl = link.url as string;\n          if (user?.id && !updatedUrl.includes('_u=')) {\n            const separator = updatedUrl.includes('?') ? '&' : '?';\n            updatedUrl = `${updatedUrl}${separator}_u=${user.id}`;\n          }\n          return {\n            ...link,\n            url: updatedUrl,\n          };\n        })\n    : [];\n\n  const hasDashboards = dashboardLinks.length > 0;\n\n  const refreshAvailability = useCallback(async () => {\n    if (canUseReportsModule) {\n      try {\n        const { hash } = await getCachedReportsManifest();\n        const warmupReady = await storageService.get<string>(\n          'host',\n          REPORTS_READY_FLAG,\n          true,\n        );\n        console.log('[Home] Reports offline check:', { hash, warmupReady });\n        setReportsOfflineReady(!!hash || warmupReady === '1');\n      } catch (error) {\n        console.error('[Home] Error checking reports offline ready:', error);\n        setReportsOfflineReady(false);\n      }\n    } else {\n      setReportsOfflineReady(false);\n    }\n\n    if (canUseLabReportsModule) {\n      try {\n        const ready = await storageService.get<string>(\n          'host',\n          LAB_REPORTS_READY_FLAG,\n          true,\n        );\n        setLabOfflineReady(ready === '1');\n      } catch {\n        setLabOfflineReady(false);\n      }\n    } else {\n      setLabOfflineReady(false);\n    }\n\n    if (canUseODSModule) {\n      try {\n        const [ready, cached] = await Promise.all([\n          storageService.get<string>('host', ODS_READY_FLAG, true),\n          getCachedODSManifest().catch(() => ({ hash: null, manifest: null })),\n        ]);\n        const offlineReady = ready === '1' || !!cached?.hash;\n        setOdsOfflineReady(offlineReady);\n        if (offlineReady && ready !== '1') {\n          storageService\n            .set('host', ODS_READY_FLAG, '1', 30 * 24 * 60)\n            .catch(() => undefined);\n        }\n      } catch {\n        setOdsOfflineReady(false);\n      }\n    } else {\n      setOdsOfflineReady(false);\n    }\n\n    if (canUseMachineryModule) {\n      try {\n        const [ready, cached] = await Promise.all([\n          storageService.get<string>('host', MACHINERY_READY_FLAG, true),\n          getCachedMachineryManifest().catch(() => ({\n            hash: null,\n            manifest: null,\n          })),\n        ]);\n        const offlineReady = ready === '1' || !!cached?.hash;\n        setMachineryOfflineReady(offlineReady);\n        if (offlineReady && ready !== '1') {\n          storageService\n            .set('host', MACHINERY_READY_FLAG, '1', 30 * 24 * 60)\n            .catch(() => undefined);\n        }\n      } catch {\n        setMachineryOfflineReady(false);\n      }\n    } else {\n      setMachineryOfflineReady(false);\n    }\n\n    if (!isConnected) {\n      setLabRemoteAvailable(false);\n      setOdsRemoteAvailable(false);\n      setOtherRemoteAvailable(false);\n      setMachineryRemoteAvailable(false);\n      setReportsRemoteAvailable(false);\n      return;\n    }\n\n    const labUrl = canUseLabReportsModule\n      ? getRemoteEntryUrl('LabReports')\n      : null;\n    const odsUrl = canUseODSModule ? getRemoteEntryUrl('ODS') : null;\n    const otherUrl = canUseOtherReportsModule\n      ? getRemoteEntryUrl('OtherReports')\n      : null;\n    const machineryUrl = canUseMachineryModule\n      ? getRemoteEntryUrl('Machinery')\n      : null;\n    const reportsUrl = canUseReportsModule\n      ? getRemoteEntryUrl('Reports')\n      : null;\n\n    if (__DEV__) {\n      console.log('[Home][MFE] reachability URLs & flags', {\n        labUrl,\n        odsUrl,\n        otherUrl,\n        machineryUrl,\n        reportsUrl,\n        offlineReady: {\n          reports: reportsOfflineReady,\n          lab: labOfflineReady,\n          ods: odsOfflineReady,\n          machinery: machineryOfflineReady,\n        },\n      });\n    }\n\n    const [labOk, odsOk, otherOk, machineryOk, reportsOk] = await Promise.all([\n      canUseLabReportsModule\n        ? isRemoteEntryReachable(labUrl as string)\n        : Promise.resolve(false),\n      canUseODSModule\n        ? isRemoteEntryReachable(odsUrl as string)\n        : Promise.resolve(false),\n      canUseOtherReportsModule\n        ? isRemoteEntryReachable(otherUrl as string)\n        : Promise.resolve(false),\n      canUseMachineryModule\n        ? isRemoteEntryReachable(machineryUrl as string)\n        : Promise.resolve(false),\n      canUseReportsModule\n        ? isRemoteEntryReachable(reportsUrl as string)\n        : Promise.resolve(false),\n    ]);\n\n    setLabRemoteAvailable(labOk);\n    setOdsRemoteAvailable(odsOk);\n    setOtherRemoteAvailable(otherOk);\n    setMachineryRemoteAvailable(machineryOk);\n    setReportsRemoteAvailable(reportsOk);\n  }, [\n    isConnected,\n    canUseReportsModule,\n    canUseLabReportsModule,\n    canUseODSModule,\n    canUseOtherReportsModule,\n    canUseMachineryModule,\n    labOfflineReady,\n    machineryOfflineReady,\n    odsOfflineReady,\n    reportsOfflineReady,\n  ]);\n\n  const showToast = useCallback(\n    (payload: {\n      type: 'success' | 'info' | 'error';\n      title: string;\n      message?: string;\n      durationMs?: number;\n    }) => {\n      Toast.show({\n        type: payload.type,\n        text1: payload.title,\n        text2: payload.message,\n        visibilityTime: payload.durationMs ?? 3000,\n      });\n    },\n    [],\n  );\n\n  const onRefresh = useCallback(async () => {\n    await runPullToRefreshSync({\n      refreshAvailability,\n      ddlSyncHooks: {\n        onStart: changedTables => {\n          showToast({\n            type: 'info',\n            title: 'Actualizando catálogos',\n            message: `Descargando ${changedTables.length} ${\n              changedTables.length === 1 ? 'tabla' : 'tablas'\n            } en segundo plano…`,\n            durationMs: 3500,\n          });\n        },\n        onComplete: ({ ok, changed }) => {\n          if (!ok) return;\n          if (changed.length > 0) {\n            showToast({\n              type: 'success',\n              title: 'Catálogos actualizados',\n              message:\n                changed.length === 1\n                  ? 'Se actualizó 1 tabla de referencia.'\n                  : `Se actualizaron ${changed.length} tablas de referencia.`,\n              durationMs: 3000,\n            });\n          }\n        },\n      },\n    });\n  }, [refreshAvailability, showToast]);\n\n  useEffect(() => {\n    void refreshAvailability();\n  }, [refreshAvailability]);\n\n  useFocusEffect(\n    useCallback(() => {\n      void refreshAvailability();\n    }, [refreshAvailability]),\n  );\n\n  const LabStatusWidget = useMemo(\n    () =>\n      lazy(() =>\n        safeNormalizeMfeModule(\n          () => import('LabReports/LabStatusWidget'),\n          (mod: any) => mod?.default ?? mod?.LabStatusWidget ?? mod,\n          () => {\n            storageService\n              .set('host', LAB_REPORTS_READY_FLAG, '1', 30 * 24 * 60)\n              .catch(() => undefined);\n          },\n        ),\n      ),\n    [],\n  );\n\n  const isReportsHistoryAvailable =\n    canUseReportsModule && (reportsOfflineReady || reportsRemoteAvailable);\n  const isOtherReportsAvailable =\n    canUseOtherReportsModule && otherRemoteAvailable; // TODO: Agregar otherOfflineReady si aplica en el futuro\n  const isLabReportsAvailable =\n    canUseLabReportsModule && (labOfflineReady || labRemoteAvailable);\n  const isODSAvailable =\n    canUseODSModule && (odsOfflineReady || odsRemoteAvailable);\n  const isMachineryAvailable =\n    canUseMachineryModule &&\n    (machineryOfflineReady || machineryRemoteAvailable);\n\n  return (\n    <View style={styles.container}>\n      <ScrollView\n        style={styles.scrollView}\n        contentContainerStyle={styles.scrollContent}\n        showsVerticalScrollIndicator={false}\n        refreshControl={\n          <RefreshControl\n            refreshing={snapshot.phase === 'checking'}\n            onRefresh={onRefresh}\n            tintColor={primaryColor || ''}\n            titleColor={primaryColor || ''}\n            colors={[primaryColor || '#000000']}\n          />\n        }\n      >\n        <Text style={styles.title}>Reportes</Text>\n        <View style={styles.buttonsContainer}>\n          {canUseReportsModule && canCreateReport && (\n            <IconCardButton\n              icon={<DocumentTextIcon />}\n              title=\"Reporte Diario\"\n              disabled={!isReportsHistoryAvailable}\n              onPress={() => {\n                navigation.navigate(NAVIGATION.REPORTS_HISTORY, {\n                  screen: REPORTS_SCREENS.DAILY_REPORT,\n                });\n              }}\n              style={styles.buttonColumn}\n            />\n          )}\n          {canUseOtherReportsModule && canViewOtherReport && (\n            <IconCardButton\n              icon={<ClipboardDocumentListIcon />}\n              title=\"Otros Reportes\"\n              isConnected={isConnected}\n              disabled={!isOtherReportsAvailable}\n              onPress={() => {\n                navigation.navigate(NAVIGATION.OTHER_REPORTS_FLOW);\n              }}\n              style={styles.buttonColumn}\n            />\n          )}\n          {canUseReportsModule && canViewReport && (\n            <IconCardButton\n              icon={<ClockIcon />}\n              title=\"Historial de Reportes\"\n              isConnected={isConnected}\n              disabled={!isReportsHistoryAvailable}\n              onPress={() => {\n                navigation.navigate(NAVIGATION.REPORTS_HISTORY);\n              }}\n              style={styles.buttonColumn}\n            />\n          )}\n        </View>\n\n        {isLabReportsAvailable && canViewLabReport && (\n            <>\n              <Text style={styles.title}>Laboratorio</Text>\n\n              <View style={styles.labStatusWidgetContainer}>\n                <MfeErrorBoundary\n                  fallback={(error, reset) => (\n                    <MfeLoadErrorView error={error} onRetry={reset} />\n                  )}\n                >\n                  <Suspense fallback={<LoadingSpinner />}>\n                    <TouchableOpacity\n                      onPress={() => {\n                        navigation.navigate(NAVIGATION.LAB_REPORTS_FLOW);\n                      }}\n                      activeOpacity={1}\n                      disabled={!isConnected}\n                    >\n                      <LabStatusWidget />\n                    </TouchableOpacity>\n                  </Suspense>\n                </MfeErrorBoundary>\n              </View>\n            </>\n          )}\n\n        {isODSAvailable && canViewODS && (\n          <View style={styles.buttonsContainer}>\n            <ODSWidget\n              onViewODS={() => {\n                if (!isConnected) {\n                  return;\n                }\n                navigation.navigate(NAVIGATION.ODS_FLOW);\n              }}\n              onCreateODS={() => {\n                navigation.navigate(NAVIGATION.ODS_FLOW, {\n                  screen: ODS_SCREENS.HOME,\n                  params: {\n                    screen: ODS_SCREENS.REPORT,\n                  },\n                });\n              }}\n            />\n          </View>\n        )}\n\n        {hasDashboards && canViewDashboard && (\n          <>\n            <Text style={styles.title}>Dashboards</Text>\n\n            <View style={styles.dashboardsGrid}>\n              {dashboardLinks.map(({ label = '', url = '' }, index) => (\n                <View style={styles.dashboardColumn} key={`${label}-${index}`}>\n                  <FolderIconButton\n                    label={label}\n                    onPress={() => {\n                      if (url) {\n                        navigation.navigate(NAVIGATION.DASHBOARD_WEB_VIEW, {\n                          label,\n                          url,\n                        });\n                      }\n                    }}\n                    size=\"large\"\n                  />\n                </View>\n              ))}\n            </View>\n          </>\n        )}\n\n        {isMachineryAvailable && canViewMachinery && (\n            <TouchableOpacity\n              onPress={() => {\n                navigation.navigate(NAVIGATION.MACHINERY_FLOW);\n              }}\n              activeOpacity={1}\n              disabled={!isConnected}\n              style={{\n                ...styles.machineryButton,\n                ...{ backgroundColor: primaryColor || '' },\n              }}\n            >\n              <CogIcon color=\"#fff\" />\n              <Text style={styles.buttonText}>Control de maquinarias</Text>\n              <ChevronRightIcon color=\"#fff\" />\n            </TouchableOpacity>\n          )}\n      </ScrollView>\n    </View>\n  );\n}\n\nconst screenWidth = Dimensions.get('window').width;\nconst horizontalPadding = 32;\nconst gap = 12;\nconst buttonWidth = Math.floor((screenWidth - horizontalPadding - gap) / 2);\nconst dashboardsColumns = screenWidth >= 400 ? 3 : 2;\nconst dashboardsGap = 2;\nconst dashboardsTotalHorizontalPadding = horizontalPadding;\nconst dashboardColumnWidth = Math.floor(\n  (screenWidth -\n    dashboardsTotalHorizontalPadding -\n    dashboardsGap * (dashboardsColumns - 1)) /\n    dashboardsColumns,\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    backgroundColor: '#f9fafb',\n    flex: 1,\n  },\n  scrollView: {\n    flex: 1,\n    width: '100%',\n  },\n  scrollContent: {\n    alignItems: 'center',\n    paddingBottom: 20,\n  },\n  buttonsContainer: {\n    flexDirection: 'row',\n    flexWrap: 'wrap',\n    width: '100%',\n    paddingHorizontal: 16,\n    gap: 12,\n    marginBottom: 20,\n    justifyContent: 'flex-start',\n  },\n  buttonColumn: {\n    width: buttonWidth,\n    flexShrink: 0,\n  },\n  title: {\n    fontSize: 18,\n    fontWeight: 'bold',\n    color: '#000',\n    marginTop: 10,\n    marginBottom: 20,\n    textAlign: 'left',\n    paddingLeft: 16,\n    width: '100%',\n  },\n  labStatusWidgetContainer: {\n    width: '100%',\n    paddingHorizontal: 16,\n    marginBottom: 20,\n  },\n  dashboardsGrid: {\n    flexDirection: 'row',\n    width: '100%',\n    paddingHorizontal: 16,\n    marginBottom: 20,\n    flexWrap: 'wrap',\n    gap: dashboardsGap,\n    justifyContent: 'flex-start',\n  },\n  dashboardColumn: {\n    alignItems: 'center',\n    paddingHorizontal: 8,\n    width: dashboardColumnWidth,\n    flexShrink: 0,\n  },\n  machineryButton: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    width: Dimensions.get('window').width - 32,\n    justifyContent: 'center',\n    gap: 8,\n    paddingVertical: 12,\n    paddingHorizontal: 24,\n    marginHorizontal: 16,\n    borderRadius: 8,\n  },\n  buttonText: {\n    fontSize: 16,\n    fontWeight: 'bold',\n    color: '#fff',\n    textAlign: 'center',\n  },\n});\n","import React from 'react';\nimport DynamicModuleLoader from '../components/DynamicModuleLoader';\n\nexport default function ReportsHistoryScreen() {\n  return (\n    <DynamicModuleLoader\n      moduleName=\"Reports\"\n      exposePath=\"./ReportsHome\"\n    />\n  );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  ScrollView,\n  TouchableOpacity,\n  ActivityIndicator,\n} from 'react-native';\nimport {\n  CloudArrowUpIcon,\n  ExclamationTriangleIcon,\n  CheckCircleIcon,\n  ArrowPathIcon,\n  ClockIcon,\n  WifiIcon,\n  SignalSlashIcon,\n} from 'react-native-heroicons/outline';\nimport Animated, { useSharedValue, useAnimatedStyle, withRepeat, withTiming, Easing } from 'react-native-reanimated';\nimport { useNetworkStatus, ProgressBar } from '@data-oil-front/ui-mobile';\nimport Toast from 'react-native-toast-message';\nimport { useOfflineMutationQueue, OfflineMutation, OfflineMutationStatus } from '@data-oil-front/core-host';\n\nexport default function SyncDataScreen() {\n  const { isConnected } = useNetworkStatus();\n\n  const [reports, setReports] = useState<OfflineMutation[]>([]);\n  const [isLoading, setIsLoading] = useState<boolean>(true);\n  const [isSyncing, setIsSyncing] = useState<boolean>(false);\n  const [initialTargetAtSync, setInitialTargetAtSync] = useState<number | null>(null);\n  const [syncResult, setSyncResult] = useState<{\n    success: number;\n    failed: number;\n    total: number;\n  } | null>(null);\n  const {\n    getPendingMutations,\n    getMutationsStats,\n    syncAllPendingMutations,\n    cleanOldMutations,\n  } = useOfflineMutationQueue();\n\n  useEffect(() => {\n    loadData();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const [stats, setStats] = useState({\n    total: 0,\n    pending: 0,\n    failed: 0,\n    sending: 0,\n    oldestReport: undefined as string | undefined,\n  });\n\n  const loadData = useCallback(async () => {\n    setIsLoading(true);\n    try {\n      const [data, computed] = await Promise.all([\n        getPendingMutations(),\n        getMutationsStats(),\n      ]);\n      setReports(Array.isArray(data) ? data : []);\n      setStats({\n        total: computed.total,\n        pending: computed.pending,\n        failed: computed.failed,\n        sending: computed.sending,\n        oldestReport: computed.oldestMutation,\n      });\n    } catch (_e) {\n      setReports([]);\n      setStats({ total: 0, pending: 0, failed: 0, sending: 0, oldestReport: undefined });\n    } finally {\n      setIsLoading(false);\n    }\n  }, [getPendingMutations, getMutationsStats]);\n\n  useEffect(() => {\n    if (!isSyncing) return;\n    let cancelled = false;\n    const interval = setInterval(async () => {\n      try {\n        const [data, computed] = await Promise.all([\n          getPendingMutations(),\n          getMutationsStats(),\n        ]);\n        if (cancelled) return;\n        setReports(Array.isArray(data) ? data : []);\n        setStats({\n          total: computed.total,\n          pending: computed.pending,\n          failed: computed.failed,\n          sending: computed.sending,\n          oldestReport: computed.oldestMutation,\n        });\n      } catch {\n      }\n    }, 500);\n    return () => {\n      cancelled = true;\n      clearInterval(interval);\n    };\n  }, [isSyncing, getPendingMutations, getMutationsStats]);\n\n  const getReportTypeLabel = (module: string): string => {\n    const labels: Record<string, string> = {\n      dailyReport: 'Reporte Diario',\n      ods: 'Reporte ODS',\n      machinery: 'Reporte de Maquinaria',\n      otherReports: 'Otro Reporte',\n      labReports: 'Reporte de Laboratorio',\n    };\n    return labels[module] || module;\n  };\n\n  const rotation = useSharedValue(0);\n  useEffect(() => {\n    rotation.value = withRepeat(withTiming(360, { duration: 1000, easing: Easing.linear }), -1);\n  }, [rotation]);\n  const spinningStyle = useAnimatedStyle(() => ({ transform: [{ rotate: `${rotation.value}deg` }] }));\n\n  const getStatusIcon = (status: OfflineMutationStatus) => {\n    switch (status) {\n      case 'pending':\n        return <ClockIcon size={20} color=\"#EAB308\" />;\n      case 'sending':\n        return (\n          <Animated.View style={spinningStyle}>\n            <ArrowPathIcon size={20} color=\"#3B82F6\" />\n          </Animated.View>\n        );\n      case 'failed':\n        return <ExclamationTriangleIcon size={20} color=\"#EF4444\" />;\n      case 'sent':\n        return <CheckCircleIcon size={20} color=\"#22C55E\" />;\n      default:\n        return null;\n    }\n  };\n\n  const formatDate = (dateString: string) => {\n    const date = new Date(dateString);\n    return date.toLocaleDateString('es-ES', {\n      day: '2-digit',\n      month: '2-digit',\n      year: 'numeric',\n      hour: '2-digit',\n      minute: '2-digit',\n    });\n  };\n\n  const handleSyncAll = useCallback(async () => {\n    if (!isConnected) return;\n    const target = Math.max(0, (stats?.pending || 0) + (stats?.failed || 0));\n    setInitialTargetAtSync(target > 0 ? target : null);\n    setIsSyncing(true);\n    setSyncResult(null);\n    try {\n      const result = await syncAllPendingMutations();\n      setSyncResult(result);\n      await loadData();\n      if (result.success > 0) {\n        await cleanOldMutations();\n      }\n      if (result.total > 0 && result.failed === 0) {\n        Toast.show({\n          type: 'success',\n          text1: 'Sincronización completada',\n          text2: 'Éxito: todos los reportes fueron sincronizados correctamente.',\n          visibilityTime: 3500,\n        });\n      } else if (result.total > 0 && result.failed > 0) {\n        Toast.show({\n          type: 'error',\n          text1: 'Sincronización incompleta',\n          text2: `Se enviaron ${result.success} de ${result.total}. Fallaron ${result.failed}.`,\n          visibilityTime: 4000,\n        });\n      }\n    } finally {\n      setIsSyncing(false);\n      setInitialTargetAtSync(null);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [cleanOldMutations, isConnected, loadData, syncAllPendingMutations]);\n\n  return (\n    <View style={styles.container}>\n      <ScrollView contentContainerStyle={styles.content} showsVerticalScrollIndicator={false}>\n        {}\n        <Text style={styles.headerTitle}>Datos de sincronización</Text>\n        <Text style={styles.headerSubtitle}>Gestiona tus reportes offline</Text>\n\n        {}\n        <View\n          style={[\n            styles.connBox,\n            isConnected ? styles.connBoxOnline : styles.connBoxOffline,\n          ]}\n        >\n          {isConnected ? (\n            <>\n              <WifiIcon size={18} color=\"#166534\" />\n              <Text style={[styles.connText, styles.connTextOnline]}>Conectado a internet</Text>\n            </>\n          ) : (\n            <>\n              <SignalSlashIcon size={18} color=\"#7F1D1D\" />\n              <Text style={[styles.connText, styles.connTextOffline]}>Sin conexión a internet</Text>\n            </>\n          )}\n        </View>\n\n        {}\n        <View style={styles.statsGrid}>\n          <View style={styles.statCard}> \n            <Text style={[styles.statValue, { color: '#2563EB' }]}>{stats.total}</Text>\n            <Text style={styles.statLabel}>Total reportes</Text>\n          </View>\n          <View style={styles.statCard}>\n            <Text style={[styles.statValue, { color: '#CA8A04' }]}>{stats.pending}</Text>\n            <Text style={styles.statLabel}>Pendientes</Text>\n          </View>\n        </View>\n\n        {}\n        {stats.total > 0 && (\n          <TouchableOpacity\n            onPress={handleSyncAll}\n            disabled={!isConnected || isSyncing}\n            activeOpacity={0.85}\n            style={[\n              styles.syncBtn,\n              !isConnected || isSyncing ? styles.syncBtnDisabled : styles.syncBtnEnabled,\n            ]}\n          >\n            {isSyncing ? (\n              <>\n                <ArrowPathIcon size={18} color=\"#FFFFFF\" />\n                <Text style={styles.syncBtnText}>Sincronizando...</Text>\n              </>\n            ) : (\n              <>\n                <CloudArrowUpIcon size={18} color=\"#FFFFFF\" />\n                <Text style={styles.syncBtnText}>Sincronizar todos los reportes</Text>\n              </>\n            )}\n          </TouchableOpacity>\n        )}\n\n        {}\n        {isSyncing && initialTargetAtSync && initialTargetAtSync > 0 && (\n          <View style={styles.progressBox}>\n            <ProgressBar value={Math.round(((initialTargetAtSync - (stats.pending + stats.sending)) / initialTargetAtSync) * 100)} />\n            <Text style={styles.progressText}>\n              Procesados {Math.max(0, initialTargetAtSync - (stats.pending + stats.sending))}/{initialTargetAtSync}\n            </Text>\n          </View>\n        )}\n\n        {}\n        {syncResult && (\n          <View style={styles.resultBox}>\n            <Text style={styles.resultTitle}>Resultado de sincronización</Text>\n            <View style={styles.resultItems}>\n              <Text style={styles.resultText}>Enviados: {syncResult.success}</Text>\n              <Text style={styles.resultText}>Fallidos: {syncResult.failed}</Text>\n              <Text style={styles.resultText}>Procesados: {syncResult.total}</Text>\n            </View>\n          </View>\n        )}\n\n        {}\n        {isLoading ? (\n          <View style={styles.loadingBox}>\n            <ActivityIndicator color=\"#9CA3AF\" />\n            <Text style={styles.loadingText}>Cargando reportes...</Text>\n          </View>\n        ) : reports.length === 0 ? (\n          <View style={styles.emptyBox}>\n            <CloudArrowUpIcon size={48} color=\"#9CA3AF\" />\n            <Text style={styles.emptyTextPrimary}>No hay reportes pendientes</Text>\n            <Text style={styles.emptyTextSecondary}>¡Todos tus datos están sincronizados!</Text>\n          </View>\n        ) : (\n          <View style={styles.listContainer}>\n            <Text style={styles.listTitle}>Reportes pendientes ({reports.length})</Text>\n            {reports.map(report => (\n              <View key={report.id} style={styles.reportCard}>\n                <View style={styles.reportHeader}>\n                  <View style={styles.reportHeaderLeft}>\n                    <View style={styles.iconWrapper}>{getStatusIcon(report.status)}</View>\n                    <Text style={styles.reportTitle}>{getReportTypeLabel(report.module)}</Text>\n                  </View>\n                  <View>\n                    <Text\n                      style={[\n                        styles.badge,\n                        report.status === 'pending'\n                          ? styles.badgeYellow\n                          : report.status === 'sending'\n                          ? styles.badgeBlue\n                          : report.status === 'failed'\n                          ? styles.badgeRed\n                          : styles.badgeGreen,\n                      ]}\n                    >\n                      {report.status === 'pending'\n                        ? 'Pendiente'\n                        : report.status === 'sending'\n                        ? 'Enviando'\n                        : report.status === 'failed'\n                        ? 'Error'\n                        : 'Enviado'}\n                    </Text>\n                  </View>\n                </View>\n                <Text style={styles.reportMeta}>Creado: {formatDate(report.createdAt)}</Text>\n                {!!report.attempts && report.attempts > 0 && (\n                  <Text style={styles.reportMeta}>Intentos: {report.attempts}</Text>\n                )}\n                {!!report.error && (\n                  <Text style={styles.reportError}>Error: {report.error}</Text>\n                )}\n              </View>\n            ))}\n          </View>\n        )}\n\n        {!!stats.oldestReport && (\n          <Text style={styles.footerMeta}>Reporte más antiguo: {formatDate(stats.oldestReport)}</Text>\n        )}\n      </ScrollView>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#fff',\n  },\n  content: {\n    padding: 16,\n    gap: 16,\n  },\n  headerTitle: {\n    fontSize: 20,\n    fontWeight: '700',\n    color: '#111827',\n    textAlign: 'center',\n  },\n  headerSubtitle: {\n    textAlign: 'center',\n    color: '#6B7280',\n    marginTop: 4,\n    marginBottom: 8,\n  },\n  connBox: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n    padding: 12,\n    borderRadius: 10,\n    borderWidth: 1,\n  },\n  connBoxOnline: {\n    backgroundColor: '#ECFDF5',\n    borderColor: '#A7F3D0',\n  },\n  connBoxOffline: {\n    backgroundColor: '#FEF2F2',\n    borderColor: '#FECACA',\n  },\n  connText: {\n    fontSize: 13,\n    fontWeight: '600',\n  },\n  connTextOnline: {\n    color: '#065F46',\n  },\n  connTextOffline: {\n    color: '#7F1D1D',\n  },\n  statsGrid: {\n    flexDirection: 'row',\n    gap: 12,\n  },\n  statCard: {\n    flex: 1,\n    backgroundColor: '#fff',\n    padding: 12,\n    borderRadius: 10,\n    borderColor: '#E5E7EB',\n    borderWidth: 1,\n    alignItems: 'center',\n  },\n  statValue: {\n    fontSize: 20,\n    fontWeight: '700',\n  },\n  statLabel: {\n    fontSize: 14,\n    color: '#6B7280',\n    marginTop: 4,\n  },\n  syncBtn: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    gap: 8,\n    paddingVertical: 12,\n    borderRadius: 10,\n  },\n  syncBtnEnabled: {\n    backgroundColor: '#1D4ED8',\n  },\n  syncBtnDisabled: {\n    backgroundColor: '#E5E7EB',\n  },\n  syncBtnText: {\n    color: '#fff',\n    fontWeight: '600',\n  },\n  resultBox: {\n    backgroundColor: '#EFF6FF',\n    borderColor: '#BFDBFE',\n    borderWidth: 1,\n    padding: 12,\n    borderRadius: 10,\n  },\n  resultTitle: {\n    fontWeight: '600',\n    color: '#1E40AF',\n    marginBottom: 6,\n  },\n  resultItems: {\n    gap: 2,\n  },\n  resultText: {\n    color: '#1D4ED8',\n    fontSize: 14,\n  },\n  progressBox: {\n    gap: 6,\n  },\n  progressText: {\n    color: '#6B7280',\n    fontSize: 12,\n    textAlign: 'center',\n  },\n  loadingBox: {\n    alignItems: 'center',\n    paddingVertical: 24,\n    gap: 8,\n  },\n  loadingText: {\n    color: '#6B7280',\n    marginTop: 4,\n  },\n  emptyBox: {\n    alignItems: 'center',\n    paddingVertical: 24,\n    gap: 6,\n    backgroundColor: '#F9FAFB',\n    borderRadius: 10,\n  },\n  emptyTextPrimary: {\n    color: '#6B7280',\n  },\n  emptyTextSecondary: {\n    color: '#9CA3AF',\n    fontSize: 14,\n  },\n  listContainer: {\n    gap: 8,\n  },\n  listTitle: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: '#111827',\n    marginBottom: 4,\n  },\n  reportCard: {\n    backgroundColor: '#fff',\n    borderColor: '#E5E7EB',\n    borderWidth: 1,\n    borderRadius: 10,\n    padding: 12,\n  },\n  reportHeader: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    marginBottom: 6,\n  },\n  reportHeaderLeft: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n  },\n  iconWrapper: {\n    width: 24,\n    height: 24,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  reportTitle: {\n    fontWeight: '600',\n    color: '#111827',\n  },\n  reportMeta: {\n    color: '#6B7280',\n    fontSize: 14,\n  },\n  reportError: {\n    color: '#EF4444',\n    fontSize: 14,\n    marginTop: 4,\n  },\n  badge: {\n    paddingHorizontal: 8,\n    paddingVertical: 4,\n    borderRadius: 999,\n    fontSize: 10,\n    fontWeight: '700',\n    overflow: 'hidden',\n  },\n  badgeYellow: {\n    backgroundColor: '#FEF3C7',\n    color: '#92400E',\n  },\n  badgeBlue: {\n    backgroundColor: '#DBEAFE',\n    color: '#1E40AF',\n  },\n  badgeRed: {\n    backgroundColor: '#FEE2E2',\n    color: '#7F1D1D',\n  },\n  badgeGreen: {\n    backgroundColor: '#DCFCE7',\n    color: '#065F46',\n  },\n  footerMeta: {\n    textAlign: 'center',\n    color: '#6B7280',\n    fontSize: 14,\n  },\n});\n\n\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport {\n  View,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  StyleSheet,\n  Image,\n  Dimensions,\n  ScrollView,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport { useAuth, useApp, configService, useConfig } from '@data-oil-front/core-host';\nimport {\n  UserIcon,\n  LockClosedIcon,\n  EyeIcon,\n  EyeSlashIcon,\n} from 'react-native-heroicons/outline';\nimport { StatusButton } from '@data-oil-front/ui-mobile';\nimport Toast from 'react-native-toast-message';\n\ntype LoginToastType = 'success' | 'error' | 'info';\nimport { Controller, useForm } from 'react-hook-form';\nimport { resolveLocalAsset } from '../../utils/configImages';\nimport { logoService } from '../../services/logoService';\nimport { DEFAULT_PRIMARY_COLOR } from '../../constants/appConfig';\n\nconst { width, height } = Dimensions.get('window');\n\nconst defaultHeroImg =\n  resolveLocalAsset('login-hero-img.png') ??\n  require(`../../assets/login-hero-img.png`);\n\ninterface LoginForm {\n  email: string;\n  password: string;\n}\n\nexport default function LoginScreen() {\n  const [showPassword, setShowPassword] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const { login } = useAuth();\n  const { dispatch } = useApp();\n  const { config: clientConfig } = useConfig();\n\n  const openToast = (\n    type: LoginToastType,\n    title: string,\n    message: string,\n    duration = 3000,\n  ) => {\n    Toast.show({\n      type,\n      text1: title,\n      text2: message,\n      visibilityTime: duration,\n    });\n  };\n  const primaryColor = clientConfig?.primaryColor ?? DEFAULT_PRIMARY_COLOR;\n  const inputBorderColor = useMemo(() => `${primaryColor}40`, [primaryColor]);\n  const [logoError, setLogoError] = useState(false);\n  const [heroError, setHeroError] = useState(false);\n\n  useEffect(() => {\n    setLogoError(false);\n    setHeroError(false);\n  }, [clientConfig]);\n\n  const heroImageSource = useMemo(() => {\n    const configValues = clientConfig as unknown as Record<\n      string,\n      string | undefined\n    >;\n    const value =\n      configValues?.LOGIN_HERO_URL ||\n      configValues?.loginHeroUrl ||\n      configValues?.LOGIN_HERO_IMAGE ||\n      configValues?.loginHeroImage;\n\n    if (value && (value.startsWith('http') || value.startsWith('file://')))\n      return { uri: value };\n    return resolveLocalAsset(value ?? undefined) || defaultHeroImg;\n  }, [clientConfig]);\n\n  const logoImageSource = useMemo(() => {\n    return logoService.getLogoSource(clientConfig?.LOGO_BASE_URL, 'base');\n  }, [clientConfig]);\n\n  const {\n    control,\n    handleSubmit,\n    formState: { errors },\n    setFocus,\n    clearErrors,\n  } = useForm<LoginForm>({\n    mode: 'onSubmit',\n    defaultValues: { email: '', password: '' },\n  });\n\n  const userInputRef = useRef<TextInput>(null);\n  const passwordInputRef = useRef<TextInput>(null);\n\n  useEffect(() => {\n    dispatch({\n      type: 'SET_PLATFORM',\n      payload: { isMobile: true, platform: 'mobile' },\n    });\n  }, [dispatch]);\n\n  useEffect(() => {\n    configService.getEffectiveConfig().catch(error => {\n      console.error('Error cargando configuración de cliente:', error);\n    });\n  }, []);\n\n  const onValid = async ({ email, password }: LoginForm) => {\n    setIsLoading(true);\n    try {\n      await login(email.trim().toLowerCase(), password.trim());\n      await configService.getEffectiveConfig().catch(error => {\n        console.error(\n          'Error actualizando la configuración después del login:',\n          error,\n        );\n      });\n      openToast('success', 'Éxito', 'Inicio de sesión exitoso');\n    } catch (error: any) {\n      const errorMessage = error?.message || '';\n      if (errorMessage.includes('HTTP 401')) {\n        openToast(\n          'error',\n          'Error',\n          'El usuario o la contraseña no son correctos. Intentá nuevamente',\n        );\n      } else {\n        openToast(\n          'error',\n          'Error',\n          'Ocurrió un error inesperado. Por favor, intentá nuevamente.',\n        );\n      }\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  const onInvalid = () => {\n    const message =\n      errors?.email?.type === 'required'\n        ? 'El email es requerido'\n        : errors?.email?.type === 'pattern'\n        ? 'Ingrese un email válido'\n        : errors?.password?.type === 'required'\n        ? 'La contraseña es requerida'\n        : 'Por favor corrige los errores del formulario';\n\n    openToast('error', 'Error', message);\n\n    if (errors?.email) setFocus('email');\n    else if (errors?.password) setFocus('password');\n  };\n\n  return (\n    <KeyboardAvoidingView\n      style={styles.container}\n      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n    >\n      <ScrollView\n        contentContainerStyle={styles.scrollContainer}\n        showsVerticalScrollIndicator={false}\n        keyboardShouldPersistTaps=\"handled\"\n      >\n        <View style={styles.contentContainer}>\n          {}\n          <View style={styles.headerImageContainer}>\n            <Image\n              source={heroError ? defaultHeroImg : heroImageSource}\n              style={styles.headerImage}\n              resizeMode=\"cover\"\n              onError={() => setHeroError(true)}\n            />\n          </View>\n\n          {}\n          <View style={styles.formContainer}>\n            {}\n            <View style={styles.titleContainer}>\n              <Text style={styles.title}>Te damos la bienvenida</Text>\n            </View>\n\n            {}\n            <View style={styles.logoContainer}>\n              <Image\n                source={\n                  logoError\n                    ? logoService.getDefaultAsset('base')\n                    : logoImageSource\n                }\n                style={styles.logo}\n                resizeMode=\"contain\"\n                onError={() => setLogoError(true)}\n              />\n            </View>\n\n            <View style={styles.inputsContainer}>\n              {}\n              <View style={styles.inputGroup}>\n                <Text style={styles.inputLabel}>\n                  Email <Text style={styles.required}>*</Text>\n                </Text>\n                <View style={styles.inputContainer}>\n                  <UserIcon\n                    size={20}\n                    color=\"#9CA3AF\"\n                    style={styles.inputIcon}\n                  />\n                  <Controller\n                    control={control}\n                    name=\"email\"\n                    rules={{\n                      required: true,\n                      pattern:\n                        /^(?:[a-zA-Z0-9_'^&+\\-])+(?:\\.(?:[a-zA-Z0-9_'^&+\\-])+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$/,\n                    }}\n                    render={({ field }) => (\n                      <TextInput\n                        ref={userInputRef}\n                        style={[\n                          styles.input,\n                          {\n                            borderColor: inputBorderColor,\n                            color: '#000000',\n                          },\n                          errors?.email ? styles.inputError : undefined,\n                        ]}\n                        value={field.value}\n                        onChangeText={text => {\n                          field.onChange(text);\n                          if (errors?.email) clearErrors('email');\n                        }}\n                        onBlur={field.onBlur}\n                        placeholder=\"Ingresa tu email\"\n                        placeholderTextColor=\"#9CA3AF\"\n                        autoCapitalize=\"none\"\n                        autoCorrect={false}\n                        keyboardType=\"email-address\"\n                        returnKeyType=\"next\"\n                        onSubmitEditing={() =>\n                          passwordInputRef.current?.focus()\n                        }\n                      />\n                    )}\n                  />\n                </View>\n                {errors?.email ? (\n                  <Text style={styles.errorText}>\n                    {errors.email.type === 'required'\n                      ? 'El email es requerido'\n                      : 'Ingrese un email válido'}\n                  </Text>\n                ) : null}\n              </View>\n\n              {}\n              <View style={styles.inputGroup}>\n                <Text style={styles.inputLabel}>\n                  Contraseña <Text style={styles.required}>*</Text>\n                </Text>\n                <View style={styles.inputContainer}>\n                  <LockClosedIcon\n                    size={20}\n                    color=\"#9CA3AF\"\n                    style={styles.inputIcon}\n                  />\n                  <Controller\n                    control={control}\n                    name=\"password\"\n                    rules={{ required: true }}\n                    render={({ field }) => (\n                      <TextInput\n                        ref={passwordInputRef}\n                        style={[\n                          styles.passwordInput,\n                          {\n                            borderColor: inputBorderColor,\n                            color: '#000000',\n                          },\n                          errors?.password ? styles.inputError : undefined,\n                        ]}\n                        secureTextEntry={!showPassword}\n                        value={field.value}\n                        onChangeText={text => {\n                          field.onChange(text);\n                          if (errors?.password) clearErrors('password');\n                        }}\n                        onBlur={field.onBlur}\n                        placeholder=\"Ingresa tu contraseña\"\n                        placeholderTextColor=\"#9CA3AF\"\n                        autoCapitalize=\"none\"\n                        autoCorrect={false}\n                        returnKeyType=\"done\"\n                        onSubmitEditing={handleSubmit(onValid, onInvalid)}\n                      />\n                    )}\n                  />\n                  <TouchableOpacity\n                    style={styles.eyeButton}\n                    onPress={() => setShowPassword(!showPassword)}\n                  >\n                    {showPassword ? (\n                      <EyeSlashIcon size={20} color=\"#9CA3AF\" />\n                    ) : (\n                      <EyeIcon size={20} color=\"#9CA3AF\" />\n                    )}\n                  </TouchableOpacity>\n                </View>\n                {errors?.password ? (\n                  <Text style={styles.errorText}>\n                    La contraseña es requerida\n                  </Text>\n                ) : null}\n              </View>\n\n              <StatusButton\n                title=\"Ingresar\"\n                loadingTitle=\"Conectando...\"\n                onPress={handleSubmit(onValid, onInvalid)}\n                loading={isLoading}\n                style={styles.loginButton}\n                backgroundColor={primaryColor}\n                textStyle={styles.loginButtonText}\n              />\n            </View>\n          </View>\n        </View>\n      </ScrollView>\n    </KeyboardAvoidingView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n  },\n  scrollContainer: {\n    flexGrow: 1,\n    paddingBottom: 0,\n  },\n  contentContainer: {\n    flex: 1,\n    width: width,\n  },\n  headerImageContainer: {\n    height: height * 0.3,\n    width: '100%',\n    position: 'relative',\n    zIndex: 0,\n  },\n  headerImage: {\n    width: '100%',\n    height: '100%',\n  },\n  formContainer: {\n    position: 'relative',\n    zIndex: 10,\n    marginTop: -64,\n    backgroundColor: 'white',\n    paddingHorizontal: 16,\n    paddingTop: 40,\n    paddingBottom: 32,\n    flex: 1,\n    borderTopLeftRadius: 32,\n    borderTopRightRadius: 32,\n    minHeight: height * 0.52,\n  },\n  titleContainer: {\n    alignItems: 'center',\n    marginBottom: 24,\n  },\n  title: {\n    fontSize: 20,\n    fontWeight: '500',\n    color: '#1F2937',\n  },\n  logoContainer: {\n    marginBottom: 32,\n    alignItems: 'center',\n  },\n  logo: {\n    width: 240,\n    height: 120,\n  },\n  inputsContainer: {\n    flex: 1,\n    gap: 20,\n  },\n  inputGroup: {\n    gap: 8,\n  },\n  inputLabel: {\n    fontSize: 14,\n    fontWeight: '500',\n    color: '#374151',\n  },\n  inputContainer: {\n    position: 'relative',\n    flexDirection: 'row',\n    alignItems: 'center',\n  },\n  inputIcon: {\n    position: 'absolute',\n    left: 16,\n    zIndex: 1,\n  },\n  input: {\n    width: '100%',\n    paddingLeft: 48,\n    paddingRight: 16,\n    paddingVertical: 16,\n    borderWidth: 2,\n    borderRadius: 8,\n    backgroundColor: '#F9FAFB',\n    fontSize: 16,\n    borderColor: '#D1D5DB',\n    color: '#000000',\n  },\n  passwordInput: {\n    width: '100%',\n    paddingLeft: 48,\n    paddingRight: 48,\n    paddingVertical: 16,\n    borderWidth: 2,\n    borderRadius: 8,\n    backgroundColor: '#F9FAFB',\n    fontSize: 16,\n    borderColor: '#D1D5DB',\n    color: '#000000',\n  },\n  eyeButton: {\n    position: 'absolute',\n    right: 16,\n    padding: 4,\n  },\n  loginButton: {\n    marginTop: 24,\n    paddingVertical: 16,\n    borderRadius: 8,\n    alignItems: 'center',\n    justifyContent: 'center',\n    flexDirection: 'row',\n    gap: 8,\n  },\n  loginButtonText: {\n    color: 'white',\n    fontSize: 16,\n    fontWeight: '500',\n  },\n  inputError: {\n    borderColor: '#EF4444',\n  },\n  errorText: {\n    color: '#EF4444',\n    fontSize: 12,\n    marginTop: 6,\n    marginLeft: 4,\n  },\n  required: {\n    color: '#EF4444',\n  },\n});\n","import React, {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport {\n  View,\n  Text,\n  ActivityIndicator,\n  Animated,\n  Easing,\n  StyleSheet,\n  StatusBar,\n  useWindowDimensions,\n  ScrollView,\n  LayoutChangeEvent,\n} from 'react-native';\nimport LinearGradient from 'react-native-linear-gradient';\nimport { logoService } from '../../services/logoService';\nimport { runModuleSync } from '../../services/moduleSync';\nimport {\n  WarmupStepKey,\n  AURORA_GRADIENT,\n  ALL_WARMUP_STEPS,\n  buildWarmupStepper,\n  getWarmupSteps,\n  WarmupModuleFlags,\n  WarmupStepper,\n} from './constants';\n\ntype ModuleWarmupScreenProps = {\n  navigation?: any;\n  onComplete?: () => void;\n};\n\nexport default function ModuleWarmupScreen({\n  onComplete,\n}: ModuleWarmupScreenProps) {\n  const [currentStep, setCurrentStep] = useState<WarmupStepKey>('init');\n  const [moduleFlags, setModuleFlags] = useState<WarmupModuleFlags>({\n    reportsEnabled: true,\n    odsEnabled: true,\n    otherReportsEnabled: true,\n    labReportsEnabled: true,\n    machineryEnabled: true,\n  });\n  const detailFadeAnim = useRef(new Animated.Value(1)).current;\n  const auroraAnim = useRef(new Animated.Value(0)).current;\n  const checkboxAnims = useRef(\n    ALL_WARMUP_STEPS.reduce<Record<WarmupStepKey, Animated.Value>>(\n      (acc, step) => {\n        acc[step.key] = new Animated.Value(0);\n        return acc;\n      },\n      {} as Record<WarmupStepKey, Animated.Value>,\n    ),\n  ).current;\n  const stepperScrollRef = useRef<ScrollView | null>(null);\n  const stepMeasurements = useRef<\n    Partial<Record<WarmupStepKey, { y: number; height: number }>>\n  >({});\n  const [stepListHeight, setStepListHeight] = useState(0);\n  const [measurementTick, setMeasurementTick] = useState(0);\n  const scrollOffsetRef = useRef(0);\n  const { width } = useWindowDimensions();\n  const isLargeLayout = width >= 720;\n\n  const stepsToShow = useMemo(\n    () => getWarmupSteps(moduleFlags),\n    [moduleFlags],\n  );\n  const stepper = useMemo(\n    () => buildWarmupStepper(stepsToShow),\n    [stepsToShow],\n  );\n  const stepperRef = useRef<WarmupStepper>(stepper);\n\n  useEffect(() => {\n    stepperRef.current = stepper;\n  }, [stepper]);\n\n  const currentStepIndex = stepper.stepIndex[currentStep] ?? 0;\n  const activeStep = stepper.stepMap[currentStep];\n  const progressRatio =\n    stepsToShow.length > 1 ? currentStepIndex / (stepsToShow.length - 1) : 1;\n  const progressPercent = useMemo(\n    () => Math.round(Math.min(1, Math.max(0, progressRatio)) * 100),\n    [progressRatio],\n  );\n  const hasFinishedWarmup = currentStep === 'complete';\n  const paddingForActiveStep = 18;\n\n  const advanceStep = useCallback((stepKey: WarmupStepKey) => {\n    const canShowStep = !!stepperRef.current?.stepMap?.[stepKey];\n    if (canShowStep) {\n      setCurrentStep(stepKey);\n    }\n  }, []);\n\n  useEffect(() => {\n    const loop = Animated.loop(\n      Animated.sequence([\n        Animated.timing(auroraAnim, {\n          toValue: 1,\n          duration: 4500,\n          easing: Easing.inOut(Easing.quad),\n          useNativeDriver: true,\n        }),\n        Animated.timing(auroraAnim, {\n          toValue: 0,\n          duration: 4500,\n          easing: Easing.inOut(Easing.quad),\n          useNativeDriver: true,\n        }),\n      ]),\n    );\n    loop.start();\n    return () => {\n      loop.stop();\n    };\n  }, [auroraAnim]);\n\n  useEffect(() => {\n    Animated.sequence([\n      Animated.timing(detailFadeAnim, {\n        toValue: 0.35,\n        duration: 140,\n        useNativeDriver: true,\n      }),\n      Animated.timing(detailFadeAnim, {\n        toValue: 1,\n        duration: 340,\n        delay: 40,\n        useNativeDriver: true,\n      }),\n    ]).start();\n  }, [currentStep, detailFadeAnim]);\n\n  useEffect(() => {\n    stepsToShow.forEach((step, index) => {\n      const shouldCheck =\n        index < currentStepIndex ||\n        (hasFinishedWarmup && index === stepsToShow.length - 1);\n      Animated.spring(checkboxAnims[step.key], {\n        toValue: shouldCheck ? 1 : 0,\n        damping: 16,\n        stiffness: 200,\n        mass: 0.7,\n        useNativeDriver: true,\n      }).start();\n    });\n  }, [checkboxAnims, currentStepIndex, hasFinishedWarmup, stepsToShow]);\n\n  useEffect(() => {\n    if (!stepperScrollRef.current || stepListHeight <= 0) {\n      return;\n    }\n    const targetStep = stepsToShow[currentStepIndex];\n    if (!targetStep) {\n      return;\n    }\n    const measurement = stepMeasurements.current[targetStep.key];\n    if (!measurement) {\n      return;\n    }\n\n    const visibleStart = scrollOffsetRef.current;\n    const visibleEnd = visibleStart + stepListHeight;\n    const stepTop = measurement.y;\n    const stepBottom = measurement.y + measurement.height;\n\n    let nextOffset: number | null = null;\n\n    if (stepBottom + paddingForActiveStep > visibleEnd) {\n      nextOffset = stepBottom + paddingForActiveStep - stepListHeight;\n    } else if (stepTop - paddingForActiveStep < visibleStart) {\n      nextOffset = stepTop - paddingForActiveStep;\n    }\n\n    if (nextOffset !== null) {\n      stepperScrollRef.current.scrollTo({\n        y: Math.max(nextOffset, 0),\n        animated: true,\n      });\n    }\n  }, [\n    currentStepIndex,\n    measurementTick,\n    paddingForActiveStep,\n    stepListHeight,\n    stepsToShow,\n  ]);\n\n  const handleStepLayout = useCallback(\n    (key: WarmupStepKey, event: LayoutChangeEvent) => {\n      const { y, height } = event.nativeEvent.layout;\n      const prev = stepMeasurements.current[key];\n      if (!prev || prev.y !== y || prev.height !== height) {\n        stepMeasurements.current[key] = { y, height };\n        setMeasurementTick(tick => tick + 1);\n      }\n    },\n    [],\n  );\n\n  useEffect(() => {\n    void logoService.initializeLogos();\n  }, []);\n\n  useEffect(() => {\n    let mounted = true;\n    // TODO [ODS-warmup-1] - Revertir cuando backend optimice la sincronización ODS.\n    void runModuleSync({\n      mode: 'foreground',\n      onStep: stepKey => {\n        if (mounted) {\n          advanceStep(stepKey);\n        }\n      },\n      onFlags: flags => {\n        if (mounted) {\n          setModuleFlags(flags);\n        }\n      },\n    })\n      .catch(error => {\n        if (__DEV__) {\n          console.warn('[Warmup] runModuleSync falló', error);\n        }\n      })\n      .finally(() => {\n        if (mounted) {\n          onComplete?.();\n        }\n      });\n\n    return () => {\n      mounted = false;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [onComplete]);\n\n  const remainingSteps = Math.max(stepper.totalSteps - currentStepIndex - 1, 0);\n  const auroraScale = auroraAnim.interpolate({\n    inputRange: [0, 1],\n    outputRange: [0.9, 1.15],\n  });\n  const auroraOpacity = auroraAnim.interpolate({\n    inputRange: [0, 1],\n    outputRange: [0.35, 0.65],\n  });\n  const auroraTranslateY = auroraAnim.interpolate({\n    inputRange: [0, 1],\n    outputRange: [-140, -10],\n  });\n\n  return (\n    <LinearGradient\n      colors={[...AURORA_GRADIENT.colors]}\n      start={AURORA_GRADIENT.start}\n      end={AURORA_GRADIENT.end}\n      style={styles.gradient}\n    >\n      <StatusBar barStyle=\"light-content\" />\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          styles.auroraGlow,\n          {\n            opacity: auroraOpacity,\n            transform: [\n              { scale: auroraScale },\n              { translateY: auroraTranslateY },\n            ],\n          },\n        ]}\n      />\n      <View style={styles.container}>\n        <View style={[styles.card, !isLargeLayout && styles.cardStack]}>\n          <View\n            style={[\n              styles.stepperPanel,\n              !isLargeLayout && styles.stepperPanelFull,\n            ]}\n          >\n            <View style={styles.stepperHeader}>\n              <View>\n                <Text style={styles.stepperTitle}>Cargando módulos</Text>\n                <Text style={styles.stepperCaption}>\n                  {`Paso ${currentStepIndex + 1} de ${stepper.totalSteps}`}\n                </Text>\n              </View>\n              <View style={styles.stepperBadge}>\n                <Text style={styles.stepperBadgeValue}>{progressPercent}%</Text>\n                <Text style={styles.stepperBadgeLabel}>Progreso total</Text>\n              </View>\n            </View>\n            <ScrollView\n              ref={stepperScrollRef}\n              style={styles.stepList}\n              contentContainerStyle={styles.stepListContent}\n              showsVerticalScrollIndicator={false}\n              scrollEventThrottle={16}\n              onLayout={({ nativeEvent }) => {\n                if (stepListHeight !== nativeEvent.layout.height) {\n                  setStepListHeight(nativeEvent.layout.height);\n                }\n              }}\n              onScroll={event => {\n                scrollOffsetRef.current =\n                  event.nativeEvent.contentOffset.y ?? 0;\n              }}\n            >\n              {stepsToShow.map((step, index) => {\n                const isActive = index === currentStepIndex;\n                const isFinalStep = index === stepsToShow.length - 1;\n                const isCompleted =\n                  index < currentStepIndex ||\n                  (isFinalStep && hasFinishedWarmup);\n                const checkboxAnim = checkboxAnims[step.key];\n                const checkmarkScale = checkboxAnim.interpolate({\n                  inputRange: [0, 1],\n                  outputRange: [0.4, 1],\n                });\n                return (\n                  <View\n                    key={step.key}\n                    style={[\n                      styles.stepRow,\n                      index === stepsToShow.length - 1 && styles.stepRowLast,\n                    ]}\n                    onLayout={event => handleStepLayout(step.key, event)}\n                  >\n                    <View style={styles.stepCheckboxWrapper}>\n                      <Animated.View\n                        style={[\n                          styles.stepCheckbox,\n                          isActive && styles.stepCheckboxActive,\n                          isCompleted && styles.stepCheckboxCompleted,\n                        ]}\n                      >\n                        <Animated.Text\n                          style={[\n                            styles.stepCheckboxMark,\n                            {\n                              opacity: checkboxAnim,\n                              transform: [{ scale: checkmarkScale }],\n                            },\n                          ]}\n                        >\n                          ✓\n                        </Animated.Text>\n                      </Animated.View>\n                    </View>\n                    <View style={styles.stepTextGroup}>\n                      <Text\n                        style={[\n                          styles.stepTitleSmall,\n                          isCompleted && styles.stepTitleSmallCompleted,\n                          isActive && styles.stepTitleSmallActive,\n                        ]}\n                      >\n                        {step.title}\n                      </Text>\n                      <Text style={styles.stepSubtitleSmall}>\n                        {step.subtitle}\n                      </Text>\n                    </View>\n                  </View>\n                );\n              })}\n            </ScrollView>\n          </View>\n\n          <View\n            style={[\n              styles.contentPanel,\n              !isLargeLayout && styles.contentPanelFull,\n            ]}\n          >\n            <Animated.Text\n              style={[styles.currentTitle, { opacity: detailFadeAnim }]}\n            >\n              {activeStep?.title ?? 'Preparando módulos...'}\n            </Animated.Text>\n            <Animated.Text\n              style={[styles.currentSubtitle, { opacity: detailFadeAnim }]}\n            >\n              {activeStep?.subtitle ??\n                'Afinando cada componente antes de abrir.'}\n            </Animated.Text>\n\n            {}\n            <View style={styles.contentFooter}>\n              <View style={styles.pulseDot} />\n              <ActivityIndicator color=\"#d5ffe9\" />\n              <Text style={styles.footerText}>\n                {remainingSteps === 0\n                  ? '¡Módulos listos!'\n                  : `Quedan ${remainingSteps} paso${\n                      remainingSteps === 1 ? '' : 's'\n                    }`}\n              </Text>\n            </View>\n          </View>\n        </View>\n      </View>\n    </LinearGradient>\n  );\n}\n\nconst styles = StyleSheet.create({\n  gradient: {\n    flex: 1,\n    backgroundColor: '#01050f',\n  },\n  auroraGlow: {\n    position: 'absolute',\n    width: 480,\n    height: 480,\n    left: -120,\n    top: -80,\n    borderRadius: 240,\n    backgroundColor: '#1df4c4',\n    shadowColor: '#1df4c4',\n    shadowOpacity: 0.5,\n    shadowRadius: 90,\n    shadowOffset: { width: 0, height: 0 },\n  },\n  container: {\n    flex: 1,\n  },\n  card: {\n    flex: 1,\n    flexDirection: 'row',\n    columnGap: 20,\n    borderRadius: 36,\n    borderWidth: 1,\n    borderColor: 'rgba(255,255,255,0.08)',\n    backgroundColor: 'rgba(3, 10, 22, 0.78)',\n    padding: 12,\n    marginHorizontal: 8,\n    marginVertical: 8,\n    overflow: 'hidden',\n  },\n  cardStack: {\n    flexDirection: 'column',\n  },\n  stepperPanel: {\n    flex: 0.5,\n    borderRadius: 30,\n    padding: 26,\n    backgroundColor: 'rgba(7, 21, 36, 0.92)',\n    marginRight: 12,\n    borderWidth: 1,\n    borderColor: 'rgba(255,255,255,0.05)',\n    overflow: 'hidden',\n  },\n  stepperPanelFull: {\n    width: '100%',\n    marginRight: 0,\n    marginBottom: 16,\n  },\n  stepperHeader: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    marginBottom: 24,\n  },\n  stepperTitle: {\n    color: '#e9fff7',\n    fontSize: 20,\n    fontWeight: '700',\n    marginBottom: 4,\n  },\n  stepperCaption: {\n    color: 'rgba(255,255,255,0.65)',\n    fontSize: 13,\n  },\n  stepperBadge: {\n    paddingHorizontal: 16,\n    paddingVertical: 10,\n    borderRadius: 18,\n    borderWidth: 1,\n    borderColor: 'rgba(255,255,255,0.15)',\n    backgroundColor: 'rgba(34, 198, 167, 0.16)',\n    alignItems: 'center',\n  },\n  stepperBadgeValue: {\n    color: '#b4ffe2',\n    fontSize: 18,\n    fontWeight: '700',\n    lineHeight: 22,\n  },\n  stepperBadgeLabel: {\n    color: 'rgba(255,255,255,0.62)',\n    fontSize: 11,\n    letterSpacing: 0.6,\n    textTransform: 'uppercase',\n  },\n  stepList: {\n    flex: 1,\n  },\n  stepListContent: {\n    paddingHorizontal: 12,\n    paddingVertical: 12,\n  },\n  stepRow: {\n    flexDirection: 'row',\n    alignItems: 'flex-start',\n    marginBottom: 22,\n  },\n  stepRowLast: {\n    marginBottom: 0,\n  },\n  stepCheckboxWrapper: {\n    width: 36,\n    alignItems: 'center',\n    justifyContent: 'center',\n    marginRight: 14,\n  },\n  stepCheckbox: {\n    width: 30,\n    height: 30,\n    borderRadius: 8,\n    borderWidth: 2,\n    borderColor: 'rgba(255,255,255,0.35)',\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: 'rgba(255,255,255,0.06)',\n  },\n  stepCheckboxActive: {\n    borderColor: '#8fffd2',\n    shadowColor: '#8fffd2',\n    shadowOpacity: 0.45,\n    shadowRadius: 12,\n    shadowOffset: { width: 0, height: 0 },\n    elevation: 4,\n  },\n  stepCheckboxCompleted: {\n    backgroundColor: '#27d29e',\n    borderColor: '#27d29e',\n  },\n  stepCheckboxMark: {\n    color: '#02170f',\n    fontSize: 16,\n    fontWeight: '700',\n    includeFontPadding: false,\n  },\n  stepTextGroup: {\n    flex: 1,\n  },\n  stepTitleSmall: {\n    color: 'rgba(255,255,255,0.55)',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  stepTitleSmallActive: {\n    color: '#ffffff',\n  },\n  stepTitleSmallCompleted: {\n    color: 'rgba(173, 255, 219, 0.9)',\n  },\n  stepSubtitleSmall: {\n    color: 'rgba(255,255,255,0.45)',\n    fontSize: 12,\n    marginTop: 4,\n    lineHeight: 16,\n  },\n  contentPanel: {\n    flex: 0.5,\n    borderRadius: 30,\n    padding: 28,\n    backgroundColor: 'rgba(2, 8, 18, 0.7)',\n    marginLeft: 12,\n    borderWidth: 1,\n    borderColor: 'rgba(255,255,255,0.04)',\n    justifyContent: 'flex-start',\n  },\n  contentPanelFull: {\n    width: '100%',\n    marginLeft: 0,\n    marginTop: 12,\n  },\n  headerRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    marginBottom: 12,\n  },\n  label: {\n    color: 'rgba(255,255,255,0.68)',\n    fontSize: 13,\n    letterSpacing: 2,\n    textTransform: 'uppercase',\n  },\n  remainingBadge: {\n    paddingHorizontal: 14,\n    paddingVertical: 8,\n    borderRadius: 16,\n    backgroundColor: 'rgba(255,255,255,0.08)',\n    borderWidth: 1,\n    borderColor: 'rgba(255,255,255,0.1)',\n    alignItems: 'center',\n    minWidth: 110,\n  },\n  remainingLabel: {\n    color: 'rgba(255,255,255,0.6)',\n    fontSize: 11,\n    letterSpacing: 0.4,\n  },\n  remainingValue: {\n    color: '#d8ffee',\n    fontSize: 18,\n    fontWeight: '700',\n  },\n  currentTitle: {\n    color: '#ffffff',\n    fontSize: 32,\n    fontWeight: '700',\n    marginTop: 16,\n  },\n  currentSubtitle: {\n    color: 'rgba(255,255,255,0.75)',\n    fontSize: 16,\n    marginTop: 12,\n    marginBottom: 18,\n    lineHeight: 22,\n  },\n\n  nextStepRow: {\n    borderRadius: 22,\n    padding: 18,\n    backgroundColor: 'rgba(11, 30, 50, 0.8)',\n    borderWidth: 1,\n    borderColor: 'rgba(255,255,255,0.04)',\n  },\n  nextStepLabel: {\n    color: 'rgba(255,255,255,0.58)',\n    fontSize: 12,\n    letterSpacing: 1,\n    textTransform: 'uppercase',\n  },\n  nextStepTitle: {\n    color: '#ffffff',\n    fontSize: 20,\n    fontWeight: '700',\n    marginTop: 10,\n  },\n  nextStepSubtitle: {\n    color: 'rgba(255,255,255,0.7)',\n    fontSize: 14,\n    marginTop: 6,\n    lineHeight: 20,\n  },\n  contentFooter: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    marginTop: 26,\n  },\n  pulseDot: {\n    width: 10,\n    height: 10,\n    borderRadius: 5,\n    backgroundColor: '#6ef5c4',\n    marginRight: 10,\n    shadowColor: '#6ef5c4',\n    shadowOpacity: 0.9,\n    shadowRadius: 10,\n    shadowOffset: { width: 0, height: 0 },\n  },\n  footerText: {\n    color: 'rgba(255,255,255,0.85)',\n    marginLeft: 12,\n    fontWeight: '600',\n    fontSize: 15,\n  },\n});\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { configService, storageService } from \"@data-oil-front/core-host\";\nimport { purePost, type ApiPostBody, API_VERBS, type DDLTableName, type TableName } from \"@data-oil-front/core-utils\";\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\n\nconst NAMESPACE = \"host\";\nconst STORAGE_KEY = \"ddl-fp:v1\";\n// 30 days; we refresh it on every run, the TTL is only hygiene in case\n// the entry is forgotten.\nconst TTL_MINUTES = 30 * 24 * 60;\n\nexport interface DDLFingerprintMap {\n  // table ⇒ hash hex string\n  [table: string]: string;\n}\n\nexport interface DetectChangedDDLsOptions {\n  /**\n   * Per-table timeout (ms). If a query takes longer it is considered\n   * \"undetermined\": the table is not marked as dirty and its cached\n   * fingerprint is not updated. Default: 6000ms.\n   */\n  perTableTimeoutMs?: number;\n  /**\n   * Max concurrent in-flight fetches. Default: 4.\n   */\n  concurrency?: number;\n}\n\nexport interface DetectChangedDDLsResult {\n  /**\n   * Tables whose fingerprint differs from the stored one. Empty ⇒\n   * nothing changed (or we were offline).\n   */\n  changed: TableName[];\n  /**\n   * Tables we couldn't reach (timeout / network / error). We don't\n   * flag them as dirty but surface them so the caller can log.\n   */\n  unknownTables: TableName[];\n  /**\n   * All fingerprints computed in this run (including the unchanged\n   * ones). Useful for debugging.\n   */\n  fingerprints: DDLFingerprintMap;\n  /**\n   * True only if the device had connectivity at check time. If false\n   * nothing was queried and both `changed` / `unknownTables` are empty.\n   */\n  online: boolean;\n}\n\n/**\n * Deterministic string hash. djb2 \"xor\" variant.\n * Not cryptographic and doesn't need to be: we only care about\n * detecting changes in a collection of ids. djb2 distributes very well\n * for short/medium numeric lists.\n */\nfunction djb2(input: string): string {\n  let hash = 5381;\n  for (let i = 0; i < input.length; i += 1) {\n    hash = (hash * 33) ^ input.charCodeAt(i);\n  }\n  // >>> 0 coerces the value to unsigned 32-bit.\n  return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Hash of an id list. Sorts ascending so the hash does not depend on\n * the order returned by the backend.\n */\nexport function computeIdsFingerprint(ids: ReadonlyArray<number | string>): string {\n  const sorted = [...ids]\n    .map((x) => (typeof x === \"number\" ? x : Number(x)))\n    .filter((x) => Number.isFinite(x))\n    .sort((a, b) => a - b);\n  return `${sorted.length}:${djb2(sorted.join(\",\"))}`;\n}\n\nasync function fetchIdsForTable(\n  table: TableName,\n  timeoutMs: number,\n): Promise<number[] | null> {\n  try {\n    const rows = await Promise.race([\n      post<Array<{ id: number | string }>>({\n        verb: API_VERBS.SELECT,\n        table,\n        fields: [\"id\"],\n        values: [],\n        filter: [],\n      }),\n      new Promise<null>((resolve) => setTimeout(() => resolve(null), timeoutMs)),\n    ]);\n    if (!rows || !Array.isArray(rows)) return null;\n    return rows\n      .map((r) => Number(r?.id))\n      .filter((n) => Number.isFinite(n));\n  } catch {\n    return null;\n  }\n}\n\nasync function readStoredFingerprints(): Promise<DDLFingerprintMap> {\n  const raw = await storageService.get<DDLFingerprintMap>(\n    NAMESPACE,\n    STORAGE_KEY,\n    true,\n  );\n  return raw ?? {};\n}\n\nasync function writeStoredFingerprints(map: DDLFingerprintMap): Promise<void> {\n  await storageService.set(NAMESPACE, STORAGE_KEY, map, TTL_MINUTES);\n}\n\n/**\n * Walks the table list, computes the current fingerprint and compares\n * with the last stored one. Returns the tables whose fingerprint\n * changed and persists the fresh fingerprints.\n *\n * If the device is offline it returns\n * `{ online: false, changed: [], unknown: [] }` without touching\n * anything.\n */\nexport async function detectChangedDDLs(\n  tables: readonly (DDLTableName | TableName)[],\n  options: DetectChangedDDLsOptions = {},\n): Promise<DetectChangedDDLsResult> {\n  const { perTableTimeoutMs = 6000, concurrency = 4 } = options;\n\n  let online = true;\n  try {\n    const net = await NetInfo.fetch();\n    online = net.isConnected ?? true;\n  } catch {\n    online = true;\n  }\n\n  if (!online) {\n    return { online: false, changed: [], unknownTables: [], fingerprints: {} };\n  }\n\n  const stored = await readStoredFingerprints();\n  const fresh: DDLFingerprintMap = { ...stored };\n  const changed: TableName[] = [];\n  const unknownTables: TableName[] = [];\n\n  // Process in batches so we don't saturate the API. Input order is\n  // preserved (handy for debugging).\n  for (let i = 0; i < tables.length; i += concurrency) {\n    const batch = tables.slice(i, i + concurrency);\n    await Promise.all(\n      batch.map(async (table) => {\n        const ids = await fetchIdsForTable(table, perTableTimeoutMs);\n        if (ids === null) {\n          unknownTables.push(table);\n          return;\n        }\n        const fp = computeIdsFingerprint(ids);\n        if (stored[table] !== fp) {\n          changed.push(table);\n        }\n        fresh[table] = fp;\n      }),\n    );\n  }\n\n  // We persist only the entries we were able to refresh, merged on\n  // top of the previously stored ones we didn't touch.\n  await writeStoredFingerprints(fresh).catch(() => undefined);\n\n  return {\n    online: true,\n    changed,\n    unknownTables,\n    fingerprints: fresh,\n  };\n}\n\n/**\n * Handy for tests / debug: clears stored fingerprints so the next\n * `detectChangedDDLs` call treats every table as \"changed\" (first\n * run).\n */\nexport async function resetDDLFingerprints(): Promise<void> {\n  await storageService.remove(NAMESPACE, STORAGE_KEY);\n}\n","import { configService } from '@data-oil-front/core-host';\nimport {\n  DAILY_REPORT_DDL_TABLES,\n  invalidateReportsDDLCaches,\n} from '@data-oil-front/core-reports';\nimport {\n  invalidateODSDDLCaches,\n  ODS_DDL_TABLES,\n} from '@data-oil-front/core-ods';\nimport {\n  invalidateMachineryDDLCaches,\n  MACHINERY_DDL_TABLES,\n} from '@data-oil-front/core-machinery';\nimport {\n  DDL_TABLES_ALDYL,\n  type TableName,\n} from '@data-oil-front/core-utils';\n\nimport {\n  detectChangedDDLs,\n  type DetectChangedDDLsResult,\n} from './ddlFingerprints';\nimport { logMfeEvent } from './mfeDebug';\nimport type { WarmupModuleFlags } from '../screens/warmup/constants';\n\n/**\n * DDL re-sync triggered from pull-to-refresh when no MFE bundle\n * changed.\n *\n * Why it exists: DDLs (locations, fields, wells, facilities…) are\n * reference data an admin manages from the backoffice/database. The\n * admin can add rows without any frontend change, so there's no way\n * to detect it from the regular `checkForUpdates` flow (which\n * compares MFE manifest hashes). Without this sync the user would see\n * stale catalogs until the TTL expires (30 min) or they reinstall\n * the app.\n *\n * Flow:\n * 1. `detectChangedDDLs` pulls `select id` per table and compares\n *    with stored fingerprints. Returns only the \"dirty\" tables.\n * 2. `invalidateDDLCaches` removes the corresponding AsyncStorage\n *    entries (delegating to each package: core-reports, core-ods).\n * 3. We fire the enabled MFEs' `warmup()` in parallel to rehydrate\n *    the cache with fresh data.\n *\n * Scope (per design decision): we only sync DDLs for the MFEs enabled\n * in the client config. If an MFE is off we don't waste network\n * validating its tables.\n */\n\nexport interface DDLSyncOptions {\n  flags: WarmupModuleFlags;\n  /**\n   * Hook called **before** invalidation + rehydration are fired.\n   * Useful to display a toast \"Refreshing data in the background…\".\n   * Only invoked when real changes are detected.\n   */\n  onStart?: (changedTables: TableName[]) => void;\n  /**\n   * Hook called at the end of the sync. `ok` indicates whether we\n   * could refresh; `changed` lists the tables updated on this run.\n   */\n  onComplete?: (result: {\n    ok: boolean;\n    changed: TableName[];\n    unknownTables: TableName[];\n  }) => void;\n}\n\nexport interface DDLSyncResult {\n  skipped: 'offline' | 'up-to-date' | null;\n  changed: TableName[];\n  unknownTables: TableName[];\n}\n\n/**\n * Filtered list of DDLs to check based on which MFEs are enabled.\n * Each MFE contributes its own slice:\n *   - `reportsEnabled` → core-reports DDL tables.\n *   - `odsEnabled`     → core-ods DDL tables.\n *   - `machineryEnabled` → core-machinery DDL tables (fingerprint only\n *     today: no AsyncStorage cache to invalidate yet — see\n *     `MACHINERY_DDL_CACHE_MAP`).\n * LabReports / OtherReports have no DDLs owned by them today, so they\n * don't participate.\n */\nfunction tablesForFlags(flags: WarmupModuleFlags): TableName[] {\n  const set = new Set<TableName>();\n  if (flags.reportsEnabled) {\n    for (const t of DAILY_REPORT_DDL_TABLES) set.add(t);\n  }\n  if (flags.odsEnabled) {\n    for (const t of ODS_DDL_TABLES) set.add(t);\n  }\n  if (flags.machineryEnabled) {\n    for (const t of MACHINERY_DDL_TABLES) set.add(t);\n  }\n  // Preserve the aldyl-specific DDL order to keep a predictable \"tail\n  // preload\" (most-used first). well_cluster and measurement_point\n  // variants are excluded since the aldyl API does not expose them.\n  return DDL_TABLES_ALDYL.filter(t => set.has(t));\n}\n\n/**\n * Partitions the changed-table list among the packages that know how\n * to invalidate them.\n */\nfunction partitionByPackage(tables: TableName[]): {\n  reports: TableName[];\n  ods: TableName[];\n  machinery: TableName[];\n} {\n  const reports: TableName[] = [];\n  const ods: TableName[] = [];\n  const machinery: TableName[] = [];\n  const reportsSet = new Set<TableName>(DAILY_REPORT_DDL_TABLES);\n  const odsSet = new Set<TableName>(ODS_DDL_TABLES);\n  const machinerySet = new Set<TableName>(MACHINERY_DDL_TABLES);\n  for (const t of tables) {\n    if (reportsSet.has(t)) reports.push(t);\n    if (odsSet.has(t)) ods.push(t);\n    if (machinerySet.has(t)) machinery.push(t);\n  }\n  return { reports, ods, machinery };\n}\n\n/**\n * Rehydrates by invoking the enabled MFEs' `warmup()` (for those\n * whose DDLs changed). Uses dynamic MF imports — the same ones\n * `runModuleSync` uses in foreground mode.\n */\nasync function triggerWarmups(changedByPkg: {\n  reports: TableName[];\n  ods: TableName[];\n  machinery: TableName[];\n}): Promise<void> {\n  const jobs: Array<Promise<unknown>> = [];\n\n  const runWarmup = async (moduleName: string, importer: () => Promise<unknown>) => {\n    try {\n      const mod = (await importer()) as { warmup?: () => Promise<unknown> };\n      const warmupFn = mod?.warmup;\n      if (typeof warmupFn === 'function') {\n        await warmupFn();\n      }\n    } catch (err) {\n      logMfeEvent('ddlSync/warmupErr', {\n        module: moduleName,\n        message: (err as any)?.message ?? String(err),\n      });\n    }\n  };\n\n  if (changedByPkg.reports.length > 0) {\n    jobs.push(runWarmup('Reports', () => import('Reports/Warmup')));\n  }\n  if (changedByPkg.ods.length > 0) {\n    jobs.push(runWarmup('ODS', () => import('ODS/Warmup')));\n  }\n  if (changedByPkg.machinery.length > 0) {\n    jobs.push(runWarmup('Machinery', () => import('Machinery/Warmup')));\n  }\n\n  await Promise.all(jobs);\n}\n\n/**\n * Detects DDL changes (scoped to the MFEs enabled in the client\n * config), invalidates the affected caches and rehydrates by firing\n * the MFE warmups. Silent on any internal error.\n *\n * Never throws: returns a result describing what happened.\n */\nexport async function syncDDLs(\n  options: DDLSyncOptions,\n): Promise<DDLSyncResult> {\n  const { flags, onStart, onComplete } = options;\n  const tables = tablesForFlags(flags);\n\n  if (tables.length === 0) {\n    onComplete?.({ ok: true, changed: [], unknownTables: [] });\n    return { skipped: 'up-to-date', changed: [], unknownTables: [] };\n  }\n\n  let detect: DetectChangedDDLsResult;\n  try {\n    detect = await detectChangedDDLs(tables);\n  } catch (err) {\n    logMfeEvent('ddlSync/detectErr', {\n      message: (err as any)?.message ?? String(err),\n    });\n    onComplete?.({ ok: false, changed: [], unknownTables: [] });\n    return { skipped: 'offline', changed: [], unknownTables: [] };\n  }\n\n  if (!detect.online) {\n    onComplete?.({ ok: false, changed: [], unknownTables: [] });\n    return { skipped: 'offline', changed: [], unknownTables: [] };\n  }\n\n  if (detect.changed.length === 0) {\n    logMfeEvent('ddlSync/upToDate', { unknownTables: detect.unknownTables });\n    onComplete?.({ ok: true, changed: [], unknownTables: detect.unknownTables });\n    return { skipped: 'up-to-date', changed: [], unknownTables: detect.unknownTables };\n  }\n\n  logMfeEvent('ddlSync/changed', {\n    changed: detect.changed,\n    unknownTables: detect.unknownTables,\n  });\n  onStart?.(detect.changed);\n\n  const byPkg = partitionByPackage(detect.changed);\n  try {\n    await Promise.all([\n      byPkg.reports.length > 0\n        ? invalidateReportsDDLCaches(byPkg.reports)\n        : Promise.resolve(),\n      byPkg.ods.length > 0\n        ? invalidateODSDDLCaches(byPkg.ods)\n        : Promise.resolve(),\n      byPkg.machinery.length > 0\n        ? invalidateMachineryDDLCaches(byPkg.machinery)\n        : Promise.resolve(),\n    ]);\n  } catch (err) {\n    logMfeEvent('ddlSync/invalidateErr', {\n      message: (err as any)?.message ?? String(err),\n    });\n  }\n\n  try {\n    await triggerWarmups(byPkg);\n  } catch (err) {\n    logMfeEvent('ddlSync/rehydrateErr', {\n      message: (err as any)?.message ?? String(err),\n    });\n  }\n\n  onComplete?.({ ok: true, changed: detect.changed, unknownTables: detect.unknownTables });\n\n  return {\n    skipped: null,\n    changed: detect.changed,\n    unknownTables: detect.unknownTables,\n  };\n}\n\n/**\n * Shortcut: computes flags from the current client config. Useful\n * when the caller does not have them at hand (e.g. background sync).\n */\nexport function getDDLSyncFlagsFromConfig(): WarmupModuleFlags {\n  const config = configService.getCurrentConfig() as any;\n  const safe = config?.CORE_CONFIG ?? {};\n  return {\n    reportsEnabled:\n      (safe?.reports?.enabled ?? safe?.dailyReport?.enabled) ?? false,\n    odsEnabled: safe?.odsModule?.enabled ?? false,\n    otherReportsEnabled: safe?.otherReports?.enabled ?? false,\n    labReportsEnabled: safe?.labReports?.enabled ?? false,\n    machineryEnabled: safe?.machinery?.enabled ?? false,\n  };\n}\n","export * from './services/machineryApi';\nexport * from './services/ddlCacheMap';","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 \"machinery\"\n * namespace. Same concept as `DAILY_REPORT_DDL_CACHE_MAP` in\n * core-reports.\n *\n * Heads up: as of today core-machinery does NOT persist anything to\n * AsyncStorage. All its getters go straight through `post` without\n * `fetchWithCache`. The entries below are intentionally empty so the\n * DDL sync orchestrator still recognises these tables as owned by the\n * Machinery MFE (fingerprint detection runs, warmup is re-fired) even\n * though there is nothing to invalidate in storage.\n *\n * Whenever persistent caching is added to core-machinery, flesh out\n * each entry with the actual `keys` / `prefixes` and the invalidation\n * pipeline will pick it up automatically.\n */\nexport interface MachineryCacheEntry {\n  keys?: string[];\n  prefixes?: string[];\n}\n\nexport const MACHINERY_NAMESPACE = \"machinery\" as const;\n\nexport const MACHINERY_DDL_CACHE_MAP: Partial<\n  Record<TableName, MachineryCacheEntry>\n> = {\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};\n\nexport const MACHINERY_DDL_TABLES: readonly TableName[] = Object.keys(\n  MACHINERY_DDL_CACHE_MAP,\n) as TableName[];\n\n/**\n * Invalidates the AsyncStorage entries associated to the given\n * Machinery tables. Silent on errors.\n *\n * Today this is effectively a no-op because core-machinery does not\n * persist anything, but the orchestrator still calls it so the\n * contract remains uniform across packages. It becomes meaningful as\n * soon as `keys` / `prefixes` are added to the map above.\n */\nexport async function invalidateMachineryDDLCaches(\n  tables: readonly TableName[],\n): Promise<void> {\n  const work: Array<Promise<void>> = [];\n\n  for (const table of tables) {\n    const entry = MACHINERY_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\n            .remove(MACHINERY_NAMESPACE, key)\n            .catch(() => undefined),\n        );\n      }\n    }\n    if (entry.prefixes) {\n      for (const prefix of entry.prefixes) {\n        work.push(\n          storageService\n            .removeByPrefix(MACHINERY_NAMESPACE, prefix)\n            .catch(() => undefined),\n        );\n      }\n    }\n  }\n\n  await Promise.all(work);\n}\n","import { ApiPostBody, TABLE_NAMES, API_VERBS, 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}\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\n\ndayjs.extend(utc);\n\nexport interface MachineryData {\n  id: number;\n  name?: string;\n  machine_name?: string;\n  machinery_name?: string;\n  description?: string;\n  plate?: string;\n  status?: \"operational\" | \"maintenance\" | \"inactive\";\n  location_id?: number | string;\n  [key: string]: any;\n}\n\nexport interface MachineryLocation {\n  id: number | string;\n  name: string;\n}\n\nexport interface MachineryOperator {\n  id: number;\n  name?: string;\n  operator_name?: string;\n  [key: string]: any;\n}\n\nexport interface MachinerySupplier {\n  id: number;\n  name?: string;\n  supplier_name?: string;\n  [key: string]: any;\n}\n\nexport interface MachineryFuelLoad {\n  id?: number;\n  machinery_id: number;\n  load_quantity: number;\n  load_date: string;\n  fuel_type?: string | null;\n  image?: string | null;\n  user_id?: number | string | null;\n}\n\nexport interface MachineryFuelArrival {\n  id?: number;\n  tank_id: number;\n  arrival_date: string;\n  liters: number;\n  comments?: string | null;\n  user_id?: number | string | null;\n}\n\nexport interface MachineryFuelTank {\n  id: number;\n  name: string;\n  fuel_type: string;\n}\n\nexport interface FuelTankStock {\n  id: number;\n  name: string;\n  fuel_type: string;\n  stock_actual: number;\n  total_entradas: number;\n  total_salidas: number;\n}\n\nexport interface MachineryStatusChange {\n  id: number;\n  machinery_id: number;\n  status_change_date: string;\n  title?: string | null;\n  comment?: string | null;\n  image?: string | null;\n  user_id?: number | string | null;\n  [key: string]: any;\n}\n\nexport interface FormattedFuelLoad {\n  Fecha: string;\n  Hora: string;\n  Cantidad: string;\n  Tipo: string;\n  load_date: string;\n  load_quantity: number;\n  timestamp: number;\n  id: number;\n  image?: string | null;\n}\n\n/**\n * Fetches all machinery from the API\n */\nexport function fetchMachineryList(): Promise<MachineryData[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryData[]>(payload);\n}\n\n/**\n * Fetches all machinery locations from the API\n */\nexport function fetchMachineryLocations(): Promise<MachineryLocation[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_LOCATION,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryLocation[]>(payload);\n}\n\n/**\n * Fetches all machinery fuel loads from the API\n */\nexport function fetchMachineryFuelLoads(): Promise<MachineryFuelLoad[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryFuelLoad[]>(payload);\n}\n\n/**\n * Gets the last fuel load for each machinery\n * Returns a Map of machinery_id -> LastFuelLoad\n */\nexport function getLastFuelLoadsByMachinery(\n  fuelLoads: MachineryFuelLoad[],\n): Map<number, MachineryFuelLoad> {\n  const fuelLoadsMap = new Map<number, MachineryFuelLoad>();\n  const loadsByMachinery = new Map<number, MachineryFuelLoad[]>();\n\n  // Group fuel loads by machinery_id\n  fuelLoads.forEach((load) => {\n    const machineryId = load.machinery_id;\n    if (!loadsByMachinery.has(machineryId)) {\n      loadsByMachinery.set(machineryId, []);\n    }\n    loadsByMachinery.get(machineryId)!.push(load);\n  });\n\n  // Sort by date and get the most recent for each machinery\n  loadsByMachinery.forEach((loads, machineryId) => {\n    if (!loads || !loads[0]) {\n      return;\n    }\n    loads.sort((a, b) => {\n      const dateA = dayjs(a.load_date).valueOf();\n      const dateB = dayjs(b.load_date).valueOf();\n      return dateB - dateA;\n    });\n    const firstLoad = loads[0];\n    if (firstLoad) {\n      fuelLoadsMap.set(machineryId, firstLoad);\n    }\n  });\n\n  return fuelLoadsMap;\n}\n\n/**\n * Creates a Map of location_id -> location name\n */\nexport function createLocationsMap(\n  locations: MachineryLocation[],\n): Map<number | string, string> {\n  const locationsMap = new Map<number | string, string>();\n  locations.forEach((loc) => {\n    locationsMap.set(loc.id, loc.name);\n  });\n  return locationsMap;\n}\n\n/**\n * Fetches a single machinery by ID\n */\nexport async function fetchMachineryById(\n  id: number,\n): Promise<MachineryData | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY,\n    fields: [],\n    filter: [[\"id\", \"=\", id]],\n    values: [],\n  };\n\n  const result = await post<MachineryData[]>(payload);\n  if (Array.isArray(result) && result.length > 0 && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Fetches status change history for a machinery\n */\nexport function fetchMachineryStatusChanges(\n  machineryId: number,\n): Promise<MachineryStatusChange[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_STATUS_CHANGE,\n    fields: [],\n    filter: [[\"machinery_id\", \"=\", machineryId]],\n    values: [],\n  };\n\n  return post<MachineryStatusChange[]>(payload);\n}\n\n/**\n * Fetches operator details by ID\n */\nexport async function fetchMachineryOperator(\n  operatorId: number,\n): Promise<MachineryOperator | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_OPERATOR,\n    fields: [],\n    filter: [[\"id\", \"=\", operatorId]],\n    values: [],\n  };\n\n  const result = await post<MachineryOperator[]>(payload);\n  if (Array.isArray(result) && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Fetches supplier details by ID\n */\nexport async function fetchMachinerySupplier(\n  supplierId: number,\n): Promise<MachinerySupplier | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_SUPPLIER,\n    fields: [],\n    filter: [[\"id\", \"=\", supplierId]],\n    values: [],\n  };\n\n  const result = await post<MachinerySupplier[]>(payload);\n  if (Array.isArray(result) && result.length > 0 && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Fetches fuel loads for a specific machinery\n */\nexport async function fetchMachineryFuelLoadsByMachinery(\n  machineryId: number,\n): Promise<MachineryFuelLoad[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields: [],\n    filter: [[\"machinery_id\", \"=\", machineryId]],\n    values: [],\n  };\n\n  return post<MachineryFuelLoad[]>(payload);\n}\n\n/**\n * Fetches a single fuel load by id\n */\nexport async function fetchMachineryFuelLoadById(\n  fuelLoadId: number,\n): Promise<MachineryFuelLoad | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields: [],\n    filter: [[\"id\", \"=\", fuelLoadId]],\n    values: [],\n  };\n\n  const result = await post<MachineryFuelLoad[]>(payload);\n  if (Array.isArray(result) && result.length > 0 && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Updates an existing fuel load record\n * Date format expected by backend: \"YYYY-MM-DD HH:mm:ss\"\n */\nexport async function updateMachineryFuelLoad(\n  fuelLoadId: number,\n  loadDate: string,\n  loadQuantity: number,\n  image?: string | null,\n): Promise<any> {\n  const fields: string[] = [\"load_date\", \"load_quantity\"];\n  const values: any[] = [loadDate, loadQuantity];\n\n  if (image) {\n    fields.push(\"image\");\n    values.push(image);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.UPDATE,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields,\n    filter: [[\"id\", \"=\", fuelLoadId]],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Formats and sorts fuel load history with proper date/time handling\n * Returns formatted data with date, time, quantity, and type\n */\nexport function formatFuelLoadHistory(\n  fuelLoads: MachineryFuelLoad[],\n  fallbackFuelType?: string | null,\n): FormattedFuelLoad[] {\n  const formatted = fuelLoads.map((item, index) => {\n    const rawDateValue = item.load_date;\n    let loadDate: dayjs.Dayjs;\n\n    if (typeof rawDateValue === \"string\") {\n      if (rawDateValue.includes(\"T\") && rawDateValue.endsWith(\"Z\")) {\n        // Format ISO UTC: \"2025-11-20T00:00:00.000Z\"\n        loadDate = dayjs.utc(rawDateValue);\n      } else if (rawDateValue.includes(\" \")) {\n        // Format \"YYYY-MM-DD HH:mm:ss\"\n        loadDate = dayjs(rawDateValue);\n      } else {\n        loadDate = dayjs(rawDateValue);\n        if (!loadDate.isValid()) {\n          loadDate = dayjs.utc(rawDateValue);\n        }\n      }\n    } else if (rawDateValue) {\n      loadDate = dayjs(rawDateValue);\n      if (!loadDate.isValid()) {\n        loadDate = dayjs.utc(rawDateValue);\n      }\n    } else {\n      loadDate = dayjs();\n    }\n\n    if (!loadDate.isValid()) {\n      loadDate = dayjs();\n    }\n\n    const quantity =\n      typeof item.load_quantity === \"number\"\n        ? item.load_quantity\n        : parseFloat(String(item.load_quantity)) || 0;\n\n    // Format time: if hour is 00:00:00, show \"—\" (backend didn't save time)\n    let formattedTime: string;\n    const hourUTC = loadDate.utc().hour();\n    const minuteUTC = loadDate.utc().minute();\n\n    if (hourUTC === 0 && minuteUTC === 0) {\n      formattedTime = \"—\";\n    } else {\n      formattedTime = `${String(hourUTC).padStart(2, \"0\")}:${String(minuteUTC).padStart(2, \"0\")}HS`;\n    }\n\n    const formattedDate = loadDate.format(\"DD/MM/YYYY\");\n\n    const rawType = item.fuel_type ?? fallbackFuelType ?? null;\n    const fuelType =\n      typeof rawType === \"string\" && rawType.trim().length > 0\n        ? rawType.trim().charAt(0).toUpperCase() +\n          rawType.trim().slice(1).toLowerCase()\n        : \"—\";\n\n    return {\n      Fecha: formattedDate,\n      Hora: formattedTime,\n      Cantidad: `${quantity} L`,\n      Tipo: fuelType,\n      load_date: rawDateValue,\n      load_quantity: quantity,\n      timestamp: loadDate.valueOf(),\n      id: item.id || index,\n      image: item.image ?? null,\n    };\n  });\n\n  // Sort by date descending (most recent first)\n  formatted.sort((a, b) => {\n    if (a.timestamp === b.timestamp) {\n      return (b.id || 0) - (a.id || 0);\n    }\n    return b.timestamp - a.timestamp;\n  });\n\n  return formatted;\n}\n\n/**\n * Calculates total fuel load for the last 30 days\n */\nexport function calculateTotal30Days(\n  formattedLoads: FormattedFuelLoad[],\n): number {\n  const thirtyDaysAgo = dayjs().subtract(30, \"days\").startOf(\"day\");\n  const today = dayjs().startOf(\"day\");\n\n  return formattedLoads\n    .filter((item) => {\n      const itemDate = dayjs(item.load_date).startOf(\"day\");\n      return (\n        (itemDate.isAfter(thirtyDaysAgo) || itemDate.isSame(thirtyDaysAgo)) &&\n        (itemDate.isBefore(today) || itemDate.isSame(today))\n      );\n    })\n    .reduce((sum, item) => sum + item.load_quantity, 0);\n}\n\n/**\n * Inserts a new fuel load record for a machinery.\n * Date format expected by backend: \"YYYY-MM-DD HH:mm:ss\"\n */\nexport async function insertMachineryFuelLoad(\n  machineryId: number,\n  loadDate: string,\n  loadQuantity: number,\n  image?: string | null,\n  tankId?: number,\n  userId: number | string | null = null,\n): Promise<any> {\n  const fields: string[] = [\n    \"machinery_id\",\n    \"load_date\",\n    \"load_quantity\",\n    \"user_id\",\n  ];\n  const values: any[] = [\n    machineryId,\n    loadDate,\n    loadQuantity,\n    userId != null ? String(userId) : null,\n  ];\n\n  if (image) {\n    fields.push(\"image\");\n    values.push(image);\n  }\n\n  if (tankId !== undefined) {\n    fields.push(\"tank_id\");\n    values.push(tankId);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.INSERT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields,\n    filter: [],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Fetches all machinery operators from the API\n */\nexport function fetchMachineryOperators(): Promise<MachineryOperator[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_OPERATOR,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryOperator[]>(payload);\n}\n\n/**\n * Updates machinery status and related fields\n */\nexport async function updateMachineryStatus(\n  machineryId: number,\n  fields: string[],\n  values: any[],\n): Promise<any> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.UPDATE,\n    table: TABLE_NAMES.MACHINERY,\n    fields,\n    filter: [[\"id\", \"=\", machineryId]],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Inserts a machinery status change record\n */\nexport async function insertMachineryStatusChange(\n  machineryId: number,\n  statusChangeDate: string,\n  title?: string | null,\n  comment?: string | null,\n  image?: string | null,\n  userId: number | string | null = null,\n): Promise<any> {\n  const fields: string[] = [\"machinery_id\", \"status_change_date\", \"user_id\"];\n  const values: any[] = [\n    machineryId,\n    statusChangeDate,\n    userId != null ? String(userId) : null,\n  ];\n\n  if (title) {\n    fields.push(\"title\");\n    values.push(title);\n  }\n  if (comment) {\n    fields.push(\"comment\");\n    values.push(comment);\n  }\n  if (image) {\n    fields.push(\"image\");\n    values.push(image);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.INSERT,\n    table: TABLE_NAMES.MACHINERY_STATUS_CHANGE,\n    fields,\n    filter: [],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Inserts a new fuel arrival record (tanker truck delivery).\n */\nexport async function insertMachineryFuelArrival(\n  tankId: number,\n  arrivalDate: string,\n  liters: number,\n  comments?: string | null,\n  userId: number | string | null = null,\n): Promise<any> {\n  const fields: string[] = [\"tank_id\", \"arrival_date\", \"liters\", \"user_id\"];\n  const values: any[] = [\n    tankId,\n    arrivalDate,\n    liters,\n    userId != null ? String(userId) : null,\n  ];\n\n  if (comments) {\n    fields.push(\"comments\");\n    values.push(comments);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.INSERT,\n    table: TABLE_NAMES.MACHINERY_FUEL_ARRIVALS,\n    fields,\n    filter: [],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Fetches all fuel arrival records (tanker truck deliveries).\n */\nexport function fetchMachineryFuelArrivals(): Promise<MachineryFuelArrival[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_ARRIVALS,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryFuelArrival[]>(payload);\n}\n\n/**\n * Most recent arrival per tank_id (by arrival_date descending).\n */\nexport function getLastFuelArrivalsByTankId(\n  arrivals: MachineryFuelArrival[],\n): Map<number, MachineryFuelArrival> {\n  const byTank = new Map<number, MachineryFuelArrival[]>();\n  arrivals.forEach((a) => {\n    const raw = a.tank_id as unknown;\n    const id =\n      typeof raw === \"number\" && Number.isFinite(raw)\n        ? raw\n        : parseInt(String(raw), 10);\n    if (!Number.isFinite(id)) return;\n    if (!byTank.has(id)) byTank.set(id, []);\n    byTank.get(id)!.push(a);\n  });\n\n  const result = new Map<number, MachineryFuelArrival>();\n  byTank.forEach((list, tid) => {\n    if (!list.length) return;\n    list.sort((a, b) => {\n      const dateA = dayjs(a.arrival_date).valueOf();\n      const dateB = dayjs(b.arrival_date).valueOf();\n      return dateB - dateA;\n    });\n    const latest = list[0];\n    if (latest) result.set(tid, latest);\n  });\n  return result;\n}\n\n/**\n * Fetches all fuel tanks from the reference table.\n */\nexport function fetchMachineryFuelTanks(): Promise<MachineryFuelTank[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_TANK,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryFuelTank[]>(payload);\n}\n\n/**\n * Fetches current stock for all fuel tanks from the dashboard view.\n */\nexport function fetchFuelTankStock(): Promise<FuelTankStock[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.DASH_FUEL_TANK_STOCK,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<FuelTankStock[]>(payload);\n}\n\n/**\n * Resolves tank_id from a fuel_type string by looking up machinery_fuel_tank.\n * Returns the matching tank or null if not found.\n */\nexport async function getTankByFuelType(\n  fuelType: string,\n): Promise<MachineryFuelTank | null> {\n  const tanks = await fetchMachineryFuelTanks();\n  if (!Array.isArray(tanks)) return null;\n  const normalized = fuelType.toLowerCase().trim();\n  const match = tanks.find(\n    (t) => t.fuel_type.toLowerCase().trim() === normalized,\n  );\n  return match ?? null;\n}\n\n/**\n * Validates whether a tank has enough stock for the requested quantity.\n * Returns { ok, stockActual }.\n */\nexport async function validateTankStock(\n  tankId: number,\n  quantity: number,\n): Promise<{ ok: boolean; stockActual: number }> {\n  const stocks = await fetchFuelTankStock();\n  if (!Array.isArray(stocks)) return { ok: false, stockActual: 0 };\n  const tank = stocks.find((s) => s.id === tankId);\n  if (!tank) return { ok: false, stockActual: 0 };\n  const stockActual =\n    typeof tank.stock_actual === \"number\"\n      ? tank.stock_actual\n      : parseFloat(String(tank.stock_actual)) || 0;\n  return { ok: stockActual >= quantity, stockActual };\n}\n","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","import type { Action, Scope } from \"../types/raw\";\nimport type {\n  InternalAccessControl,\n  NormalizedRole,\n  NormalizedResource,\n} from \"../types/internal\";\n\nconst ACTIONS: readonly Action[] = [\"view\", \"create\", \"edit\", \"delete\"];\n\nconst denyAll = (): NormalizedResource => ({\n  view: \"none\",\n  create: \"none\",\n  edit: \"none\",\n  delete: \"none\",\n});\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n  typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isScope = (value: unknown): value is Scope =>\n  value === \"all\" || value === \"own\" || value === \"none\";\n\nconst parseResource = (raw: unknown): NormalizedResource => {\n  const result = denyAll();\n  if (!isPlainObject(raw)) return result;\n  for (const action of ACTIONS) {\n    const candidate = raw[action];\n    if (isScope(candidate)) {\n      result[action] = candidate;\n    }\n  }\n  return result;\n};\n\nconst parseRole = (rawRole: Record<string, unknown>): NormalizedRole => {\n  const resources = new Map<string, NormalizedResource>();\n  let wildcard: NormalizedResource | null = null;\n  let isAdmin = false;\n\n  for (const [key, value] of Object.entries(rawRole)) {\n    if (key === \"*\") {\n      if (value === \"all\") {\n        isAdmin = true;\n        continue;\n      }\n      wildcard = parseResource(value);\n      continue;\n    }\n    resources.set(key, parseResource(value));\n  }\n\n  return {\n    isAdmin,\n    resources,\n    wildcard: wildcard ?? denyAll(),\n  };\n};\n\n/**\n * Normalizes raw `CORE_CONFIG.accessControl` JSON into a typed internal model.\n *\n * Returns `null` if the basic shape is invalid (`ownerField` missing or not a string,\n * `roles` missing or not an object). The resolver treats `null` as deny-all (fail-closed).\n *\n * Individual roles with invalid shape are silently discarded (skipping one does not\n * compromise the others). Resources with missing actions are filled with `\"none\"`.\n *\n * The only package entry point aware of the external JSON shape. If a second shape\n * appears in the future for another flavor, this is the only file that changes.\n *\n * @param raw The raw JSON to normalize, typically `CORE_CONFIG.accessControl`.\n * @returns The normalized internal model, or `null` if the basic shape is invalid.\n */\nexport const parseAccessControl = (\n  raw: unknown,\n): InternalAccessControl | null => {\n  if (!isPlainObject(raw)) return null;\n\n  const { ownerField, roles } = raw;\n  if (typeof ownerField !== \"string\" || ownerField.length === 0) return null;\n  if (!isPlainObject(roles)) return null;\n\n  const normalizedRoles = new Map<string, NormalizedRole>();\n  for (const [roleName, rawRole] of Object.entries(roles)) {\n    if (!isPlainObject(rawRole)) continue;\n    normalizedRoles.set(roleName, parseRole(rawRole));\n  }\n\n  return {\n    ownerField,\n    roles: normalizedRoles,\n  };\n};\n","import React from \"react\";\nimport { StyleSheet, Text, View } from \"react-native\";\n\nexport interface AccessRestrictedProps {\n  /** Mensaje custom; si se omite, se muestra uno genérico. */\n  message?: string;\n  /** Título principal; default: \"Acceso restringido\". */\n  title?: string;\n}\n\n/**\n * Pantalla genérica para deep links a MFEs sin permiso.\n *\n * Pensada para usarse como fallback de `<Can>` o como early return de un navigator\n * cuando un `useCan` o `useCanResolver` devuelve `false` a nivel screen.\n */\nexport function AccessRestricted({\n  title = \"Acceso restringido\",\n  message = \"No tenés permisos para acceder a esta sección.\",\n}: AccessRestrictedProps): React.ReactElement {\n  return (\n    <View style={styles.container}>\n      <Text style={styles.icon}>🔒</Text>\n      <Text style={styles.title}>{title}</Text>\n      <Text style={styles.message}>{message}</Text>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    padding: 24,\n    backgroundColor: \"#f9fafb\",\n  },\n  icon: { fontSize: 56, marginBottom: 16 },\n  title: { fontSize: 20, fontWeight: \"700\", color: \"#111827\", marginBottom: 8 },\n  message: { fontSize: 15, color: \"#6B7280\", textAlign: \"center\" },\n});\n","import React from \"react\";\nimport { useCan } from \"../hooks/useCan\";\nimport type { Action } from \"../types/raw\";\n\nexport interface CanProps {\n  resource: string;\n  action: Action;\n  record?: Record<string, unknown>;\n  /** Contenido a renderizar si el usuario PUEDE realizar la acción. */\n  children: React.ReactNode;\n  /** Opcional. Contenido a renderizar si el usuario NO puede. Por defecto, no se renderiza nada. */\n  fallback?: React.ReactNode;\n}\n\n/**\n * Wrapper declarativo de `useCan`. Renderiza `children` solo si el usuario puede\n * realizar la acción; sino, renderiza `fallback` (o nada).\n *\n * Útil para visibilidad condicional de botones, secciones y rutas:\n *\n * ```tsx\n * <Can resource=\"report\" action=\"delete\" record={report}>\n *   <DeleteButton onPress={...} />\n * </Can>\n * ```\n */\nexport function Can({\n  resource,\n  action,\n  record,\n  children,\n  fallback = null,\n}: CanProps): React.ReactElement | null {\n  const allowed = useCan(resource, action, record);\n  return <>{allowed ? children : fallback}</>;\n}\n","import { useAuth, useConfig } from \"@data-oil-front/core-host\";\nimport { resolvePermission } from \"../resolver/resolvePermission\";\nimport type { Action } from \"../types/raw\";\n\n/**\n * Hook React para chequear si el usuario actual puede realizar `action` sobre `resource`.\n *\n * Re-evalúa automáticamente cuando cambia el config (vía `useSyncExternalStore`\n * dentro de `useConfig`) o el usuario (vía `AuthContext`). Cero infraestructura\n * adicional necesaria — solo importarlo desde un MFE.\n *\n * @param resource Nombre del recurso tal como aparece en `accessControl.roles[role][resource]`.\n * @param action  `\"view\" | \"create\" | \"edit\" | \"delete\"`.\n * @param record  Opcional. Objeto que contiene el campo de ownership configurado\n *                en `accessControl.ownerField`. Necesario solo cuando el scope es `\"own\"`.\n * @returns `true` si el usuario puede; `false` si no, o si todavía estamos hidratando.\n */\nexport function useCan(\n  resource: string,\n  action: Action,\n  record?: Record<string, unknown>,\n): boolean {\n  const { config, hydrated, status } = useConfig();\n  const { user } = useAuth();\n\n  const rawAccessControl = (\n    config as { CORE_CONFIG?: { accessControl?: unknown } }\n  ).CORE_CONFIG?.accessControl;\n\n  return resolvePermission({\n    rawAccessControl,\n    user,\n    hydrated,\n    status,\n    resource,\n    action,\n    record,\n  });\n}\n","import { useAuth, useConfig } from \"@data-oil-front/core-host\";\nimport { useCallback, useMemo } from \"react\";\nimport { parseAccessControl } from \"../adapter/parseAccessControl\";\nimport { canAccess } from \"../resolver/canAccess\";\nimport type { Action } from \"../types/raw\";\n\nexport type CanCheck = (\n  resource: string,\n  action: Action,\n  record?: Record<string, unknown>,\n) => boolean;\n\n/**\n * Variante de `useCan` que devuelve una función reutilizable.\n *\n * Útil cuando hay que chequear permisos sobre múltiples records en iteración\n * (por ejemplo, dentro de un `.map()` o un helper que arma acciones por fila).\n * Las reglas de hooks de React prohíben llamar a `useCan` adentro de un loop —\n * en esos casos, llamá a `useCanResolver` UNA vez a top-level y reusá la función\n * devuelta por cada item.\n *\n * El parseo del `accessControl` se memoiza por referencia del config, así que\n * iterar sobre cientos de records solo paga el cost del lookup en los Maps internos.\n *\n * Fail-closed bajo los mismos guards que `useCan` (config no hidratado, status no\n * success, usuario null, o accessControl no parseable).\n */\nexport function useCanResolver(): CanCheck {\n  const { config, hydrated, status } = useConfig();\n  const { user } = useAuth();\n\n  const accessControl = useMemo(() => {\n    const raw = (config as { CORE_CONFIG?: { accessControl?: unknown } })\n      .CORE_CONFIG?.accessControl;\n    return parseAccessControl(raw);\n  }, [config]);\n\n  return useCallback(\n    (resource, action, record) => {\n      if (!hydrated || status !== \"success\" || !user || !accessControl) {\n        return false;\n      }\n      return canAccess({\n        accessControl,\n        userRoles: user.roles.flatMap((r) => r.tags.map((t) => t.tag_name)),\n        userId: user.id,\n        resource,\n        action,\n        record,\n      });\n    },\n    [accessControl, hydrated, status, user],\n  );\n}\n","// @data-oil-front/mfe-permissions — public barrel.\n// IMPORTANTE: este paquete NO se importa desde el host ni desde core-host.\n// Ver README.md para el detalle de la regla y los guardrails.\n\nexport type {\n  Action,\n  Scope,\n  RawAccessControl,\n  RawRole,\n  RawResource,\n  RawRoleValue,\n} from \"./types/raw\";\n\nexport { useCan } from \"./hooks/useCan\";\nexport { useCanResolver, type CanCheck } from \"./hooks/useCanResolver\";\nexport { Can, type CanProps } from \"./components/Can\";\nexport {\n  AccessRestricted,\n  type AccessRestrictedProps,\n} from \"./components/AccessRestricted\";\n","import type { Action } from \"../types/raw\";\nimport type { InternalAccessControl } from \"../types/internal\";\n\nexport interface CanAccessArgs {\n  accessControl: InternalAccessControl;\n  userRoles: string[];\n  userId: string;\n  resource: string;\n  action: Action;\n  record?: Record<string, unknown>;\n}\n\n/**\n * Resolver puro de permisos. Determina si un usuario con uno o más roles puede\n * realizar `action` sobre `resource`, opcionalmente teniendo en cuenta la ownership\n * de un `record`.\n *\n * Reglas:\n * - Multi-rol: el resolver itera todos los roles del usuario. Si cualquiera habilita\n *   la acción, devuelve `true` (más permisivo gana). El orden no importa.\n * - Rol con `isAdmin: true` (atajo `\"*\": \"all\"`) → fast-path: retorna `true` inmediatamente.\n * - Resource no listado en el rol → cae al `wildcard` del rol.\n * - Scope `\"all\"` → permite.\n * - Scope `\"own\"` → permite solo si `record[ownerField] === userId`. Sin `record`, deniega\n *   (no se puede determinar ownership).\n * - Scope `\"none\"` → deniega para ese rol, pero otro rol del usuario podría habilitar.\n * - Rol no listado en `accessControl.roles` → se ignora (no contribuye al OR).\n *\n * Función pura, sin efectos. No depende de React ni del runtime — testeable en aislamiento.\n */\nexport const canAccess = ({\n  accessControl,\n  userRoles,\n  userId,\n  resource,\n  action,\n  record,\n}: CanAccessArgs): boolean => {\n  for (const roleName of userRoles) {\n    const role = accessControl.roles.get(roleName);\n    if (!role) continue;\n\n    if (role.isAdmin) return true;\n\n    const resourceConfig = role.resources.get(resource) ?? role.wildcard;\n    const scope = resourceConfig[action];\n\n    if (scope === \"all\") return true;\n    if (scope === \"own\") {\n      if (!record) continue;\n      if (record[accessControl.ownerField] === userId) return true;\n    }\n  }\n  return false;\n};\n","import type { useAuth } from \"@data-oil-front/core-host\";\nimport { parseAccessControl } from \"../adapter/parseAccessControl\";\nimport { canAccess } from \"./canAccess\";\nimport type { Action } from \"../types/raw\";\n\nexport type ConfigStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\n// El barrel de `core-host` hoy no re-exporta `User` directamente.\n// Derivamos el tipo via inferencia del retorno público de `useAuth` para no depender\n// de paths internos del package.\nexport type AuthUser = NonNullable<ReturnType<typeof useAuth>[\"user\"]>;\n\nexport interface ResolvePermissionArgs {\n  rawAccessControl: unknown;\n  user: AuthUser | null;\n  hydrated: boolean;\n  status: ConfigStatus;\n  resource: string;\n  action: Action;\n  record?: Record<string, unknown>;\n}\n\n/**\n * Lógica pura del hook `useCan`, extraída para poder testearse sin React.\n *\n * Aplica los siguientes guards en orden, fail-closed:\n * 1. Config no hidratado → false (estamos arrancando, no sabemos qué permisos hay).\n * 2. Config con status distinto a \"success\" → false (fetch fallido o en curso).\n * 3. Usuario null → false (logueado fuera, no hay quién pueda hacer nada).\n * 4. accessControl no parseable → false (JSON inválido del backend).\n *\n * Si todos los guards pasan, delega en `canAccess`.\n */\nexport function resolvePermission({\n  rawAccessControl,\n  user,\n  hydrated,\n  status,\n  resource,\n  action,\n  record,\n}: ResolvePermissionArgs): boolean {\n  if (!hydrated) return false;\n  if (status !== \"success\") return false;\n  if (!user) return false;\n\n  const accessControl = parseAccessControl(rawAccessControl);\n  if (!accessControl) return false;\n\n  return canAccess({\n    accessControl,\n    userRoles: user.roles.flatMap((r) => r.tags.map((t) => t.tag_name)),\n    userId: user.id,\n    resource,\n    action,\n    record,\n  });\n}\n"],"names":["NavigationWarmupShellApp","NavigationContainer","StatusBar","barStyle","backgroundColor","WarmupGate","useAuth","user","hydrated","useBackgroundSync","startSync","useNotificationTapHandler","warmupRequired","setWarmupRequired","useState","useEffect","cancelled","shouldRunWarmup","then","requiredByVersion","catch","handleWarmupComplete","useCallback","onComplete","SafeAreaView","style","styles","safeArea","View","appContainer","StyleSheet","create","flex","DynamicModuleLoader","getModulePromise","moduleName","exposePath","Error","fallbackText","useConfig","config","primaryColor","RemoteModule","useMemo","React","lazy","normalizeMfeModule","error","reset","onRetry","Suspense","fallback","loadingContainer","LoadingSpinner","size","color","Text","loadingText","justifyContent","alignItems","gap","fontSize","props","setState","prev","hasError","resetCounter","state","info","console","render","children","this","Fragment","MfeErrorBoundary","Component","MfeLoadErrorView","message","JSON","stringify","getErrorMessage","container","title","subtitle","messageBox","messageText","numberOfLines","TouchableOpacity","onPress","activeOpacity","button","buttonText","width","borderRadius","borderWidth","borderColor","padding","fontWeight","marginBottom","alignSelf","paddingHorizontal","paddingVertical","ProtectedRoute","isLoggedIn","NAVIGATION","HOME","SYNC_DATA","DATA_LOADING","DASHBOARD_WEB_VIEW","params","label","derivePresentationOutcome","input","checkForUpdatesThrew","moduleSyncThrew","checkForUpdatesResult","ddlResult","skipped","unknownTables","length","PTR_TIMEOUT_MS","pullInFlight","runPullToRefreshSync","options","beginPullPresentationChecking","checkForUpdates","resetSyncPresentationIdle","purgeMfeBundleCache","clearWarmupStatus","restartApp","setSyncPresentationSyncing","executeBackgroundModuleSync","refreshAvailability","syncDDLs","flags","getDDLSyncFlagsFromConfig","onStart","ddlSyncHooks","presentationOutcome","setSyncPresentationResult","endPullSyncSession","finally","Promise","race","resolve","setTimeout","BackgroundSyncFloating","RESULT_DISPLAY_MS","snapshot","hideTimerRef","useRef","phase","current","clearTimeout","outcome","mapSnapshotToPresentation","badgeStyle","badgeWarning","spinnerColor","badgeInfo","badgeSuccess","badgeError","showSpinner","pointerEvents","badge","spinnerWrap","ActivityIndicator","position","right","bottom","flexDirection","marginRight","letterSpacing","textTransform","getSyncPresentationSnapshot","setSnapshot","subscribeSyncPresentation","isSyncing","isBusy","startBackgroundSync","openUrlIfPresent","url","Linking","openURL","messaging","getInitialNotification","remoteMessage","data","unsubscribeBackground","onNotificationOpenedApp","unsubscribeForeground","notifee","onForegroundEvent","type","detail","EventType","PRESS","notification","AppNavigator","Stack","createStackNavigator","Navigator","screenOptions","headerShown","gestureEnabled","gestureDirection","Screen","name","component","AppStack","LOGIN","AuthStack","useHeaderUser","clientConfig","displayName","split","includes","DEFAULT_PRIMARY_COLOR","CustomHeader","navigation","Header","onSyncData","navigate","Breadcrumb","routeLabels","SHELL_BREADCRUMB_LABELS","ReportsChromeHeader","safeCoreConfig","initialRoute","CORE_CONFIG","canUseOtherReportsRoutes","isRemoteEnabledInDev","otherReports","enabled","canUseLabRoutes","labReports","canUseODSRoutes","odsModule","canUseMachineryRoutes","machinery","canUseReportsRoutes","reports","dailyReport","initialRouteName","HomeScreen","header","DashboardWebViewScreen","route","headerBackTitle","DataLoadingScreen","SyncDataScreen","REPORTS_HISTORY","ReportsHistoryScreen","OTHER_REPORTS_FLOW","LAB_REPORTS_FLOW","ODS_FLOW","MACHINERY_FLOW","LoginScreen","useRoute","source","uri","WebView","startInLoadingState","renderLoading","loaderContainer","fallbackContainer","fallbackTitle","fallbackSubtitle","textAlign","LoadingScreen","text","marginTop","useNavigation","canViewReport","useCan","canCreateReport","canViewOtherReport","canViewLabReport","canViewODS","canViewMachinery","canViewDashboard","useNetworkStatus","isConnected","coreConfig","isODSModuleEnabled","isReportsModuleEnabled","isMachineryModuleEnabled","isOtherReportsModuleEnabled","isLabReportsModuleEnabled","isReportsDevEnabled","isOtherReportsDevEnabled","isLabReportsDevEnabled","isODSDevEnabled","isMachineryDevEnabled","canUseReportsModule","canUseOtherReportsModule","canUseLabReportsModule","canUseODSModule","canUseMachineryModule","labRemoteAvailable","setLabRemoteAvailable","odsRemoteAvailable","setOdsRemoteAvailable","reportsRemoteAvailable","setReportsRemoteAvailable","otherRemoteAvailable","setOtherRemoteAvailable","machineryRemoteAvailable","setMachineryRemoteAvailable","reportsOfflineReady","setReportsOfflineReady","labOfflineReady","setLabOfflineReady","odsOfflineReady","setOdsOfflineReady","machineryOfflineReady","setMachineryOfflineReady","dashboardLinks","Array","isArray","DASHBOARDS_LINKS","filter","link","map","updatedUrl","id","separator","hasDashboards","getCachedReportsManifest","hash","warmupReady","storageService","get","REPORTS_READY_FLAG","log","ready","LAB_REPORTS_READY_FLAG","all","ODS_READY_FLAG","getCachedODSManifest","manifest","cached","offlineReady","set","MACHINERY_READY_FLAG","getCachedMachineryManifest","labUrl","getRemoteEntryUrl","odsUrl","otherUrl","machineryUrl","reportsUrl","isRemoteEntryReachable","labOk","odsOk","otherOk","machineryOk","reportsOk","showToast","payload","Toast","show","text1","text2","visibilityTime","durationMs","onRefresh","changedTables","ok","changed","useFocusEffect","LabStatusWidget","safeNormalizeMfeModule","mod","default","isReportsHistoryAvailable","isOtherReportsAvailable","isLabReportsAvailable","isODSAvailable","isMachineryAvailable","ScrollView","scrollView","contentContainerStyle","scrollContent","showsVerticalScrollIndicator","refreshControl","RefreshControl","refreshing","tintColor","titleColor","colors","buttonsContainer","IconCardButton","icon","DocumentTextIcon","disabled","screen","REPORTS_SCREENS","DAILY_REPORT","buttonColumn","ClipboardDocumentListIcon","ClockIcon","labStatusWidgetContainer","ODSWidget","ODS_SCREENS","REPORT","dashboardsGrid","index","dashboardColumn","FolderIconButton","machineryButton","CogIcon","ChevronRightIcon","screenWidth","Dimensions","buttonWidth","Math","floor","dashboardsColumns","dashboardColumnWidth","paddingBottom","flexWrap","flexShrink","paddingLeft","marginHorizontal","_worklet_14477503367041_init_data","code","setReports","isLoading","setIsLoading","setIsSyncing","initialTargetAtSync","setInitialTargetAtSync","syncResult","setSyncResult","useOfflineMutationQueue","getPendingMutations","getMutationsStats","syncAllPendingMutations","cleanOldMutations","loadData","total","pending","failed","sending","oldestReport","undefined","stats","setStats","computed","oldestMutation","_e","interval","setInterval","clearInterval","rotation","useSharedValue","value","withRepeat","withTiming","duration","easing","Easing","linear","SyncDataScreenTsx1","spinningStyle","useAnimatedStyle","transform","rotate","__closure","__workletHash","__initData","getStatusIcon","status","ArrowPathIcon","ExclamationTriangleIcon","CheckCircleIcon","formatDate","dateString","Date","toLocaleDateString","day","month","year","hour","minute","handleSyncAll","target","max","result","success","content","headerTitle","headerSubtitle","connBox","connBoxOnline","connBoxOffline","WifiIcon","connText","connTextOnline","SignalSlashIcon","connTextOffline","statsGrid","statCard","statValue","statLabel","syncBtn","syncBtnDisabled","syncBtnEnabled","syncBtnText","CloudArrowUpIcon","progressBox","ProgressBar","round","progressText","resultBox","resultTitle","resultItems","resultText","loadingBox","emptyBox","emptyTextPrimary","emptyTextSecondary","listContainer","listTitle","report","reportCard","reportHeader","reportHeaderLeft","iconWrapper","reportTitle","module","ods","badgeYellow","badgeBlue","badgeRed","badgeGreen","reportMeta","createdAt","attempts","reportError","getReportTypeLabel","footerMeta","height","overflow","defaultHeroImg","resolveLocalAsset","require","showPassword","setShowPassword","login","useApp","dispatch","openToast","inputBorderColor","logoError","setLogoError","heroError","setHeroError","heroImageSource","configValues","LOGIN_HERO_URL","loginHeroUrl","LOGIN_HERO_IMAGE","loginHeroImage","startsWith","logoImageSource","logoService","getLogoSource","LOGO_BASE_URL","useForm","mode","defaultValues","email","password","control","handleSubmit","formState","errors","setFocus","clearErrors","userInputRef","passwordInputRef","isMobile","platform","configService","getEffectiveConfig","onValid","trim","toLowerCase","onInvalid","KeyboardAvoidingView","behavior","Platform","OS","scrollContainer","keyboardShouldPersistTaps","contentContainer","headerImageContainer","Image","headerImage","resizeMode","formContainer","titleContainer","logoContainer","getDefaultAsset","logo","inputsContainer","inputGroup","inputLabel","required","inputContainer","UserIcon","inputIcon","Controller","rules","pattern","field","TextInput","ref","inputError","onChange","onBlur","placeholder","placeholderTextColor","autoCapitalize","autoCorrect","keyboardType","returnKeyType","focus","errorText","LockClosedIcon","passwordInput","secureTextEntry","onSubmitEditing","eyeButton","EyeSlashIcon","EyeIcon","StatusButton","loadingTitle","loading","loginButton","textStyle","loginButtonText","flexGrow","zIndex","paddingTop","borderTopLeftRadius","borderTopRightRadius","minHeight","left","paddingRight","marginLeft","ModuleWarmupScreen","stepper","setCurrentStep","reportsEnabled","odsEnabled","otherReportsEnabled","labReportsEnabled","machineryEnabled","moduleFlags","setModuleFlags","detailFadeAnim","Animated","Value","auroraAnim","checkboxAnims","ALL_WARMUP_STEPS","reduce","Record","acc","step","key","stepperScrollRef","stepMeasurements","stepListHeight","setStepListHeight","measurementTick","setMeasurementTick","scrollOffsetRef","isLargeLayout","useWindowDimensions","stepsToShow","getWarmupSteps","buildWarmupStepper","stepperRef","currentStepIndex","stepIndex","currentStep","activeStep","stepMap","progressRatio","progressPercent","min","hasFinishedWarmup","advanceStep","stepKey","loop","sequence","timing","toValue","inOut","quad","useNativeDriver","start","stop","delay","forEach","shouldCheck","spring","damping","stiffness","mass","targetStep","measurement","visibleStart","visibleEnd","stepTop","y","stepBottom","nextOffset","scrollTo","animated","handleStepLayout","event","nativeEvent","layout","tick","initializeLogos","mounted","runModuleSync","__DEV__","remainingSteps","totalSteps","auroraScale","interpolate","inputRange","outputRange","auroraOpacity","auroraTranslateY","AURORA_GRADIENT","end","gradient","auroraGlow","opacity","scale","translateY","card","cardStack","stepperPanel","stepperPanelFull","stepperHeader","stepperTitle","stepperCaption","stepperBadge","stepperBadgeValue","stepperBadgeLabel","stepList","stepListContent","scrollEventThrottle","contentOffset","isActive","isFinalStep","isCompleted","checkboxAnim","checkmarkScale","stepRow","stepRowLast","stepCheckboxWrapper","stepCheckbox","stepCheckboxActive","stepCheckboxCompleted","stepCheckboxMark","stepTextGroup","stepTitleSmall","stepTitleSmallCompleted","stepTitleSmallActive","stepSubtitleSmall","contentPanel","contentPanelFull","currentTitle","currentSubtitle","contentFooter","pulseDot","footerText","top","shadowColor","shadowOpacity","shadowRadius","shadowOffset","columnGap","marginVertical","lineHeight","elevation","includeFontPadding","headerRow","remainingBadge","minWidth","remainingLabel","remainingValue","nextStepRow","nextStepLabel","nextStepTitle","nextStepSubtitle","computeIdsFingerprint","detectChangedDDLs","NAMESPACE","STORAGE_KEY","TTL_MINUTES","ids","sorted","x","Number","isFinite","sort","a","b","i","charCodeAt","toString","padStart","djb2","join","fetchIdsForTable","table","TableName","rows","body","verb","API_VERBS","SELECT","fields","values","API_BASE_URL","response","purePost","timeoutMs","r","n","Partial","tables","DetectChangedDDLsOptions","perTableTimeoutMs","concurrency","online","net","NetInfo","fetch","fingerprints","stored","raw","fresh","batch","slice","fp","push","resetDDLFingerprints","remove","detect","Set","t","DAILY_REPORT_DDL_TABLES","add","ODS_DDL_TABLES","MACHINERY_DDL_TABLES","DDL_TABLES_ALDYL","has","tablesForFlags","err","logMfeEvent","String","changedByPkg","byPkg","reportsSet","odsSet","machinerySet","partitionByPackage","invalidateReportsDDLCaches","invalidateODSDDLCaches","invalidateMachineryDDLCaches","jobs","runWarmup","importer","warmupFn","warmup","safe","getCurrentConfig","MACHINERY_DDL_CACHE_MAP","MACHINERY_NAMESPACE","TABLE_NAMES","MACHINERY","MACHINERY_LOCATION","MACHINERY_FUEL_LOAD","MACHINERY_STATUS_CHANGE","MACHINERY_OPERATOR","MACHINERY_SUPPLIER","Object","keys","work","entry","prefixes","prefix","removeByPrefix","calculateTotal30Days","fetchFuelTankStock","fetchMachineryById","fetchMachineryFuelLoadById","fetchMachineryFuelLoadsByMachinery","fetchMachineryFuelTanks","fetchMachineryLocations","fetchMachineryOperator","fetchMachineryOperators","fetchMachineryStatusChanges","fetchMachinerySupplier","formatFuelLoadHistory","getLastFuelArrivalsByTankId","getLastFuelLoadsByMachinery","getTankByFuelType","insertMachineryFuelArrival","insertMachineryFuelLoad","insertMachineryStatusChange","updateMachineryFuelLoad","updateMachineryStatus","validateTankStock","post","fetchMachineryList","fetchMachineryFuelLoads","fuelLoads","fuelLoadsMap","Map","loadsByMachinery","load","machineryId","machinery_id","loads","dateA","dayjs","load_date","valueOf","firstLoad","createLocationsMap","locations","locationsMap","loc","operatorId","supplierId","fuelLoadId","loadDate","loadQuantity","image","UPDATE","fallbackFuelType","formatted","item","rawDateValue","endsWith","utc","isValid","formattedTime","quantity","load_quantity","parseFloat","hourUTC","minuteUTC","formattedDate","format","rawType","fuel_type","Fecha","Hora","Cantidad","Tipo","charAt","toUpperCase","timestamp","formattedLoads","thirtyDaysAgo","subtract","startOf","today","itemDate","isAfter","isSame","isBefore","sum","tankId","userId","INSERT","statusChangeDate","comment","liters","arrivalDate","comments","MACHINERY_FUEL_ARRIVALS","fetchMachineryFuelArrivals","arrivals","byTank","tank_id","parseInt","list","tid","arrival_date","latest","MACHINERY_FUEL_TANK","DASH_FUEL_TANK_STOCK","fuelType","tanks","normalized","match","find","stocks","stockActual","tank","s","stock_actual","extend","ODS_DDL_CACHE_MAP","ODS_NAMESPACE","ODS_COST_CENTER","ODS_ITEM","ODS_GROUP","ODS_ACTIVITY","fetchDaysWithReports","fetchODSReports","getActivityById","getCostCentersByType","getMacroActivitiesByOdsItem","getOdsItemById","getOdsItemsByCostCenterAndType","getPartidas","getTotalExecutedForActivity","submitODSReport","selectedDate","filters","d","ODS_ACTIVITY_REPORT","monthKey","startDate","endDate","endOf","report_date","from","ODS_NS","fetchWithCache","items","it","cost_center_id","flatMap","NoCachedDataError","costCenterId","isCached","OdsItem","odsItemId","group_id","groupId","ods_item_id","planned","getOdsActivityQuantity","activityId","res","quantity_executed","getRemainingUnitValue","qty","executed","getOdsReportById","ODSActivityReport","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","normalize","replace","MIN_CANONICAL_LEN_FOR_FLEX_MATCH","matchesWellCategoryCanonical","categoryName","canonicalLabel","c","categories","cat","used","canonical","findWellCategoryIdByCanonicalName","found","DAILY_REPORT_DDL_CACHE_MAP","createFlowStationTankPayload","isEditing","reportId","editionNumber","reportDateTime","nowDate","sampleTaken","netOperatedProduction","basePairs","tankLevel","rawOperatedProduction","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","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","clientName","includeOtherReports","ALL_REPORT_HISTORY_TABLES","DAILY_REPORT_MEASUREMENT_POINT","DAILY_REPORT_VACUUM_LOAD","DELETE","DAILY_REPORT_VACUUM_UNLOAD","DeviceEventEmitter","emit","unloadReportResponse","unloadReport","vacuumLoadId","vacuum_load_id","nowTimestamp","WELLS_ALL_CACHE_KEY","filterWellsInMemory","row","every","op","rowValue","rowString","valueString","LOCATION","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","incoming","base","assign","getVacuumLoadById","VACUUM_INFO","FACILITIES_LIST_CACHE_KEY","facilitiesListMemoryCache","facilitiesListFetchedAt","facilitiesListInflight","netState","cacheTtlMs","FACILITIES_LIST_DEFAULT_TTL_MS","isOnline","now","cacheIsFresh","GET_FACILITIES_LIST","FacilityListItem","DRIVERS_INFO","pad2","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","toInt","isNaN","toStr","toFacilityId","wellId","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","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","getCachedUsersInfo","userIds","namesMap","missingUserIds","USER_INFO","entra_id","display_name","tanksMemoryCache","getCachedTanksInfo","tankIds","missingIds","wellsMemoryCache","getCachedWellsInfo","wellIds","measurementPointsMemoryCache","measurementPointIds","mp","pitsMemoryCache","pitIds","pit","uptTanksMemoryCache","uptTanksFacilityTypeViewsMemoryCache","getCachedUptTanksInfo","names","facilityTypeViews","uptTankIds","facilityTypeViewMap","facility_type_view","view","flowStationNamesByTankIdMemoryCache","getCachedFlowStationNames","flowStationTankIds","tankResult","flowStationIds","tankToFlowStationMap","flow_station_id","flowStationResult","flowStationNames","fs","flowStationId","flowStationName","ACTIVITY","getAssociatedStrategyById","getFlowStationByIdCached","allFlowStations","getDailyReportMeasurementPointById","maybeErrorDetail","cachedDetailWrapper","submitReport","sendReportOnline","onSuccess","onError","inferModuleFromTable","offlineMutationQueueService","saveMutationForLater","offline","httpStatus","parsed","getHttpStatusFromError","offlineError","DAILY_REPORT_NAMESPACE","THIRD_PARTY_COMPANY","TREATMENT_PLANT","UPT","VACUUM_COMPANY","findReportHistoryTables","ensureDate","installationType","promises","ApiPostBody","signal","date_created","dateCreated","creator","created_by","dateKey","random","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","flat","parse","dateB","localeCompare","DAILY_REPORT_PIT","parseAccessControl","ACTIONS","isPlainObject","isScope","parseResource","edit","delete","action","candidate","parseRole","rawRole","wildcard","isAdmin","entries","ownerField","roles","normalizedRoles","roleName","AccessRestricted","Can","resource","record","allowed","rawAccessControl","accessControl","resolvePermission","useCanResolver","canAccess","userRoles","tags","tag_name","role","scope"],"mappings":"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"}