From 14ddf1608e8efa48d5c255ebfe28b3894aa49b5d Mon Sep 17 00:00:00 2001 From: Jordan Diaz Date: Wed, 23 Sep 2026 07:59:03 +0000 Subject: [PATCH] fix(core): altas rellenan fechas que faltan y el error de insert/update trae el mensaje de MySQL --- cms/lib/classes/AcaiAPI.php | 32 ++++++++++++++++++++++++++++++-- cms/lib/classes/Db.php | 6 ++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/cms/lib/classes/AcaiAPI.php b/cms/lib/classes/AcaiAPI.php index 8cd0688..587a860 100644 --- a/cms/lib/classes/AcaiAPI.php +++ b/cms/lib/classes/AcaiAPI.php @@ -102,7 +102,7 @@ class AcaiAPI $result = $db->execute($sql, $params ? $params : null); if ($result === false) { - self::error(['error' => "Error al insertar en `$table`"]); + self::error(['error' => "Error al insertar en `$table`" . self::dbErrorSuffix($db)]); continue; } @@ -214,7 +214,7 @@ class AcaiAPI $result = $db->execute($sql, $allParams ? $allParams : null); if ($result === false) { - self::error(['error' => "Error al actualizar `$table`"]); + self::error(['error' => "Error al actualizar `$table`" . self::dbErrorSuffix($db)]); continue; } $count++; @@ -1438,6 +1438,20 @@ class AcaiAPI $setParts[] = '`dragSortOrder` = ?'; $params[] = time(); } + + // Campos `date` que NO vienen en el alta -> fecha actual, como el + // Admin clasico (save.php: "default date fields to current date"). + // El bloque de campos de usuario, abajo, solo cubre la fecha que + // llega VACIA; si la clave falta, una columna `datetime NOT NULL` + // sin DEFAULT (cms_vacantes.fecha_publicacion) tumbaba el INSERT. + if (!$ignoreSchema && is_array($schema)) { + foreach ($schema as $field => $def) { + if (array_key_exists($field, $record)) continue; + if (!is_array($def) || ($def['type'] ?? '') !== 'date') continue; + $setParts[] = "`$field` = ?"; + $params[] = $now; + } + } } // ── User-supplied fields ───────────────────────────────────────── @@ -1640,6 +1654,20 @@ class AcaiAPI // ERROR HANDLING // ═══════════════════════════════════════════════════════════════════ + /** + * ": " del ultimo execute() fallido, o "" si no lo hay. + * Sin el, un alta que MySQL rechaza (p.ej. "Field 'x' doesn't have a + * default value") llegaba como "Error al insertar" a secas y el agente + * reintentaba a ciegas. isset(): una web con Db.php personalizado (sin + * lastError) sigue funcionando, solo que sin el detalle. + */ + private static function dbErrorSuffix($db) + { + return (is_object($db) && isset($db->lastError) && $db->lastError !== '') + ? ': ' . $db->lastError + : ''; + } + static function error(array $data = []) { if (class_exists('API') && class_exists('ApiError')) { diff --git a/cms/lib/classes/Db.php b/cms/lib/classes/Db.php index ecdbafe..351a6c0 100755 --- a/cms/lib/classes/Db.php +++ b/cms/lib/classes/Db.php @@ -7,6 +7,10 @@ class Db { private $link; // MySQLi Link private static $instance = false; // Db Class Instance + + /** Mensaje del ultimo execute() fallido (null si fue bien). AcaiAPI lo + * devuelve en su error para que el caller sepa POR QUE fallo. */ + public $lastError = null; /** * @param host: DB Host @@ -69,12 +73,14 @@ class Db { * @return bool */ public function execute($sql, $params = null) { + $this->lastError = null; if ($params) { $stmt = $this->link->prepare($sql); try { $stmt->execute($params); } catch(Exception $e) { + $this->lastError = $e->getMessage(); return false; } }