| Server IP : 127.0.0.1 / Your IP : 216.73.216.109 Web Server : Apache/2.4.54 (Win64) OpenSSL/1.1.1q PHP/8.1.10 System : Windows NT DESKTOP-E5T4RUN 10.0 build 19045 (Windows 10) AMD64 User : SERVERWEB ( 0) PHP Version : 8.1.10 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : C:/laragon/www/modules/unidades/assets/redMonica/ |
Upload File : |
<?php
// Enable all error reporting
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ob_start();
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
$host = "200.58.81.34";
$port = "5443";
$dbname = "db_provegaq";
$user = "provegaq";
$password = "provegaq123";
function outputFallbackData($message = 'Datos no disponibles temporalmente') {
$today = date('Y-m-d');
$categories = [
[
'idCategoriaAire' => 0,
'uuid' => 'fallback-sin-datos',
'valorMinimo' => 0,
'valorMaximo' => 500,
'categoria' => 'Sin datos',
'descripcion' => $message,
'color' => '#cccccc',
'norma' => '',
'recomendacion' => 'Intente nuevamente mas tarde.',
'activo' => false,
'estado' => false
]
];
ob_end_clean();
echo json_encode([
'fecha' => $today,
'ica' => [
'valor' => 0,
'clasificacion' => 'Sin datos',
'color' => '#cccccc',
'descripcion' => $message,
'recomendaciones_gral' => 'Intente nuevamente mas tarde.',
'grupos_riesgo' => []
],
'monitoringDataList' => [],
'indicesList' => $categories,
'riskGroupsList' => [],
'allCategorias' => $categories,
'allGroups' => []
]);
exit();
}
// $host = "localhost";
// $dbname = "db_provegaq";
// $user = "postgres";
// $password = "ADMIN";
$testConnection = @fsockopen($host, $port, $errno, $errstr, 2);
if (!$testConnection) {
outputFallbackData('No se pudo conectar con la base de datos de monitoreo.');
}
fclose($testConnection);
try {
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_TIMEOUT, 30);
// Test the connection with a simple query
$testQuery = $pdo->query("SELECT 1 as test");
if (!$testQuery) {
throw new Exception("Test query failed");
}
} catch (PDOException $e) {
outputFallbackData('No se pudo obtener la informacion de calidad del aire.');
} catch (Exception $e) {
outputFallbackData('No se pudo obtener la informacion de calidad del aire.');
}
// Get all monitoring data with station and contaminant information
$sqlMonitoringData = "
SELECT
ma.id_medicion_aire,
ma.uuid,
ma.fecha,
ma.mes,
ma.dia,
ma.valor,
ma.estado,
e.id_estacion,
e.uuid as estacion_uuid,
e.nombre as estacion_nombre,
e.tipo as estacion_tipo,
e.ubicacion as estacion_ubicacion,
e.descripcion as estacion_descripcion,
c.id_contaminante,
c.uuid as contaminante_uuid,
c.nombre as contaminante_nombre,
c.descripcion as contaminante_descripcion
FROM medicion_aire ma
JOIN estaciones e ON ma.id_estacion = e.id_estacion
JOIN contaminantes c ON ma.id_contaminante = c.id_contaminante
WHERE ma.estado = false AND e.estado = false AND c.estado = false
ORDER BY ma.fecha DESC
";
$stmtMonitoringData = $pdo->query($sqlMonitoringData);
$monitoringDataList = $stmtMonitoringData->fetchAll(PDO::FETCH_ASSOC);
// Get all categories
$sqlAllCategorias = "SELECT * FROM categoria_aire WHERE estado = false ORDER BY valor_minimo ASC";
$stmtAllCategorias = $pdo->query($sqlAllCategorias);
$allCategorias = $stmtAllCategorias->fetchAll(PDO::FETCH_ASSOC);
// Get all risk groups with category information
$sqlAllGroups = "
SELECT
g.*,
c.categoria,
c.valor_minimo,
c.valor_maximo,
c.color,
c.descripcion as categoria_descripcion
FROM grupos_riesgo g
JOIN categoria_aire c ON g.id_categoria_aire = c.id_categoria_aire
WHERE g.estado = false AND c.estado = false
ORDER BY c.valor_minimo ASC, g.grupo ASC
";
$stmtAllGroups = $pdo->query($sqlAllGroups);
$allGroupsRaw = $stmtAllGroups->fetchAll(PDO::FETCH_ASSOC);
// Organize groups by category
$allGroups = [];
foreach ($allGroupsRaw as $grp) {
$allGroups[$grp['categoria']][] = $grp;
}
// Get latest measurement for dashboard display
$sqlLast = "
SELECT ma.fecha, ma.valor
FROM medicion_aire ma
WHERE ma.estado = false
ORDER BY ma.fecha DESC, ma.id_medicion_aire DESC
LIMIT 1
";
$stmtFecha = $pdo->query($sqlLast);
$rowFecha = $stmtFecha->fetch(PDO::FETCH_ASSOC);
if ($rowFecha) {
$ultima_fecha = $rowFecha['fecha'];
$ultima_fecha = date('Y-m-d', strtotime($ultima_fecha));
$ica_value = floatval($rowFecha['valor']);
} else {
$ultima_fecha = date('Y-m-d');
$ica_value = 0;
}
// Get category for the latest ICA value
$sqlCategoria = "
SELECT * FROM categoria_aire
WHERE :ica_value BETWEEN valor_minimo::DECIMAL AND valor_maximo::DECIMAL
AND estado = false
LIMIT 1
";
$stmtCategoria = $pdo->prepare($sqlCategoria);
$stmtCategoria->bindValue(':ica_value', $ica_value, PDO::PARAM_STR);
$stmtCategoria->execute();
$categoria = $stmtCategoria->fetch(PDO::FETCH_ASSOC);
if (!$categoria) {
// Use default category if none found
$categoria = [
'categoria' => 'Sin datos',
'color' => '#cccccc',
'descripcion' => 'No hay datos disponibles',
'recomendacion' => 'Esperando datos de medición'
];
}
// Get risk groups for the current category
$riesgo = [];
if ($categoria && isset($categoria['id_categoria_aire'])) {
$sqlRiesgo = "
SELECT g.grupo, g.recomendacion
FROM grupos_riesgo g
WHERE g.id_categoria_aire = :id_categoria AND g.estado = false
";
$stmtRiesgo = $pdo->prepare($sqlRiesgo);
$stmtRiesgo->execute(['id_categoria' => $categoria['id_categoria_aire']]);
$riesgo = $stmtRiesgo->fetchAll(PDO::FETCH_ASSOC);
}
// Process monitoring data for the frontend
$processedMonitoringData = [];
foreach ($monitoringDataList as $data) {
$processedMonitoringData[] = [
'idMedicionAire' => $data['id_medicion_aire'],
'uuid' => $data['uuid'],
'fecha' => $data['fecha'],
'mes' => $data['mes'],
'dia' => intval($data['dia']),
'valor' => floatval($data['valor']),
'estado' => $data['estado'],
'estacionDto' => [
'idEstacion' => $data['id_estacion'],
'uuid' => $data['estacion_uuid'],
'nombre' => $data['estacion_nombre'],
'tipo' => $data['estacion_tipo'],
'ubicacion' => $data['estacion_ubicacion'],
'descripcion' => $data['estacion_descripcion']
],
'contaminanteDto' => [
'idContaminante' => $data['id_contaminante'],
'uuid' => $data['contaminante_uuid'],
'nombre' => $data['contaminante_nombre'],
'descripcion' => $data['contaminante_descripcion']
]
];
}
// Process categories for the frontend
$processedCategories = [];
foreach ($allCategorias as $cat) {
$processedCategories[] = [
'idCategoriaAire' => $cat['id_categoria_aire'],
'uuid' => $cat['uuid'],
'valorMinimo' => intval($cat['valor_minimo']),
'valorMaximo' => intval($cat['valor_maximo']),
'categoria' => $cat['categoria'],
'descripcion' => $cat['descripcion'],
'color' => $cat['color'],
'norma' => $cat['norma'],
'recomendacion' => $cat['recomendacion'],
'activo' => $cat['activo'],
'estado' => $cat['estado']
];
}
// Process risk groups for the frontend
$processedRiskGroups = [];
foreach ($allGroupsRaw as $group) {
$processedRiskGroups[] = [
'idGrupoRiesgo' => $group['id_grupo_riesgo'],
'uuid' => $group['uuid'],
'grupo' => $group['grupo'],
'recomendacion' => $group['recomendacion'],
'estado' => $group['estado'],
'categoriaAireDto' => [
'idCategoriaAire' => $group['id_categoria_aire'],
'categoria' => $group['categoria'],
'valorMinimo' => intval($group['valor_minimo']),
'valorMaximo' => intval($group['valor_maximo']),
'color' => $group['color'],
'descripcion' => $group['categoria_descripcion']
]
];
}
$response = [
"fecha" => $ultima_fecha,
"ica" => [
"valor" => $ica_value,
"clasificacion" => $categoria['categoria'],
"color" => $categoria['color'],
"descripcion" => $categoria['descripcion'],
"recomendaciones_gral" => $categoria['recomendacion'],
"grupos_riesgo" => $riesgo
],
"monitoringDataList" => $processedMonitoringData,
"indicesList" => $processedCategories,
"riskGroupsList" => $processedRiskGroups,
"allCategorias" => $processedCategories,
"allGroups" => $allGroups
];
ob_end_clean();
echo json_encode($response);
exit();