feat(escrituras): añadir columna "Entrada" (########/####)
* SQL: nueva migración 003 que añade `entrada VARCHAR(13)` después de
`estatus` en `escrituras_tramites`. Aplicada en producción.
* API: INSERT/UPDATE persisten el campo; auditoría lo registra con
label "Entrada" en el historial.
* Frontend:
- Nueva columna en el header entre Estatus y Últ. Actualización
- Input con `pattern=^\d{1,8}/\d{4}$`, `maxlength=13`, placeholder
"########/####" y validación nativa del navegador
- newRow() y duplicateRow() incluyen `entrada:''` por defecto
- exportHeaders / rowToArray / Excel widths actualizados
- pdfCols renumerado para incluir Entrada en el PDF
This commit is contained in:
@@ -45,10 +45,10 @@ try {
|
|||||||
$stmt = $pdo->prepare(
|
$stmt = $pdo->prepare(
|
||||||
'INSERT INTO escrituras_tramites
|
'INSERT INTO escrituras_tramites
|
||||||
(tramite, cliente, abogado, notaria, inscribe, altera_turno, instrucciones,
|
(tramite, cliente, abogado, notaria, inscribe, altera_turno, instrucciones,
|
||||||
fecha_solicitud, estatus, observaciones, creado_por)
|
fecha_solicitud, estatus, entrada, observaciones, creado_por)
|
||||||
VALUES
|
VALUES
|
||||||
(:tramite, :cliente, :abogado, :notaria, :inscribe, :altera, :instrucciones,
|
(:tramite, :cliente, :abogado, :notaria, :inscribe, :altera, :instrucciones,
|
||||||
NOW(), :estatus, :obs, :user)'
|
NOW(), :estatus, :entrada, :obs, :user)'
|
||||||
);
|
);
|
||||||
$stmt->execute([
|
$stmt->execute([
|
||||||
':tramite' => $b['tramite'] ?? '',
|
':tramite' => $b['tramite'] ?? '',
|
||||||
@@ -59,6 +59,7 @@ try {
|
|||||||
':altera' => $b['altera_turno'] ?? 'No',
|
':altera' => $b['altera_turno'] ?? 'No',
|
||||||
':instrucciones' => $b['instrucciones'] ?? '',
|
':instrucciones' => $b['instrucciones'] ?? '',
|
||||||
':estatus' => $b['estatus'] ?? 'Solicitado',
|
':estatus' => $b['estatus'] ?? 'Solicitado',
|
||||||
|
':entrada' => $b['entrada'] ?? '',
|
||||||
':obs' => $b['observaciones'] ?? '',
|
':obs' => $b['observaciones'] ?? '',
|
||||||
':user' => $user['email'],
|
':user' => $user['email'],
|
||||||
]);
|
]);
|
||||||
@@ -94,6 +95,7 @@ try {
|
|||||||
'altera_turno' => $b['altera_turno'] ?? 'No',
|
'altera_turno' => $b['altera_turno'] ?? 'No',
|
||||||
'instrucciones' => $b['instrucciones'] ?? '',
|
'instrucciones' => $b['instrucciones'] ?? '',
|
||||||
'estatus' => $b['estatus'] ?? 'Solicitado',
|
'estatus' => $b['estatus'] ?? 'Solicitado',
|
||||||
|
'entrada' => $b['entrada'] ?? '',
|
||||||
'observaciones' => $b['observaciones'] ?? '',
|
'observaciones' => $b['observaciones'] ?? '',
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -101,7 +103,7 @@ try {
|
|||||||
'UPDATE escrituras_tramites SET
|
'UPDATE escrituras_tramites SET
|
||||||
tramite=:tramite, cliente=:cliente, abogado=:abogado, notaria=:notaria,
|
tramite=:tramite, cliente=:cliente, abogado=:abogado, notaria=:notaria,
|
||||||
inscribe=:inscribe, altera_turno=:altera_turno, instrucciones=:instrucciones,
|
inscribe=:inscribe, altera_turno=:altera_turno, instrucciones=:instrucciones,
|
||||||
estatus=:estatus, observaciones=:observaciones,
|
estatus=:estatus, entrada=:entrada, observaciones=:observaciones,
|
||||||
actualizado_por=:actualizado_por
|
actualizado_por=:actualizado_por
|
||||||
WHERE id=:id'
|
WHERE id=:id'
|
||||||
);
|
);
|
||||||
@@ -122,6 +124,7 @@ try {
|
|||||||
'altera_turno' => 'Alt. de Turno',
|
'altera_turno' => 'Alt. de Turno',
|
||||||
'instrucciones' => 'Instrucciones Especiales',
|
'instrucciones' => 'Instrucciones Especiales',
|
||||||
'estatus' => 'Estatus',
|
'estatus' => 'Estatus',
|
||||||
|
'entrada' => 'Entrada',
|
||||||
'observaciones' => 'Observaciones',
|
'observaciones' => 'Observaciones',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- ============================================================
|
||||||
|
-- Donna — Schema 003: Control de Escrituras — campo "entrada"
|
||||||
|
-- Formato esperado: hasta 8 dígitos / año de 4 dígitos. Ej: "12345678/2026"
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
ALTER TABLE escrituras_tramites
|
||||||
|
ADD COLUMN IF NOT EXISTS entrada VARCHAR(13) NOT NULL DEFAULT '' AFTER estatus;
|
||||||
+17
-6
@@ -459,6 +459,7 @@ tr.editing-row td textarea.editable {
|
|||||||
<th>Instrucciones Especiales</th>
|
<th>Instrucciones Especiales</th>
|
||||||
<th>Fecha de Solicitud</th>
|
<th>Fecha de Solicitud</th>
|
||||||
<th>Estatus</th>
|
<th>Estatus</th>
|
||||||
|
<th>Entrada</th>
|
||||||
<th>Últ. Actualización</th>
|
<th>Últ. Actualización</th>
|
||||||
<th>Actualizado por</th>
|
<th>Actualizado por</th>
|
||||||
<th>Observaciones</th>
|
<th>Observaciones</th>
|
||||||
@@ -641,7 +642,7 @@ function newRow() {
|
|||||||
allRows.unshift({ id:null, tramite:'', cliente:'', abogado:'Abrego', notaria:'',
|
allRows.unshift({ id:null, tramite:'', cliente:'', abogado:'Abrego', notaria:'',
|
||||||
inscribe:'Sí', altera_turno:'No', instrucciones:'',
|
inscribe:'Sí', altera_turno:'No', instrucciones:'',
|
||||||
fecha_solicitud: new Date().toISOString(), estatus:'Solicitado',
|
fecha_solicitud: new Date().toISOString(), estatus:'Solicitado',
|
||||||
observaciones:'', creado_por: authUser.email });
|
entrada:'', observaciones:'', creado_por: authUser.email });
|
||||||
render();
|
render();
|
||||||
setTimeout(()=>{
|
setTimeout(()=>{
|
||||||
const inp = document.querySelector('tr.data-row [data-field="tramite"]');
|
const inp = document.querySelector('tr.data-row [data-field="tramite"]');
|
||||||
@@ -716,6 +717,12 @@ function render() {
|
|||||||
</select><br>
|
</select><br>
|
||||||
<span class="badge ${badgeClass(r.estatus)}">${esc(r.estatus)}</span>
|
<span class="badge ${badgeClass(r.estatus)}">${esc(r.estatus)}</span>
|
||||||
</td>
|
</td>
|
||||||
|
<td style="min-width:110px;">
|
||||||
|
<input class="editable" data-field="entrada" value="${esc(r.entrada||'')}"
|
||||||
|
placeholder="########/####" pattern="^\\d{1,8}/\\d{4}$" maxlength="13"
|
||||||
|
title="Hasta 8 dígitos, slash, y año de 4 dígitos. Ej: 12345678/2026"
|
||||||
|
style="min-width:100px;font-variant-numeric:tabular-nums;" ${dis}>
|
||||||
|
</td>
|
||||||
<td class="ts">${fmtDate(r.ultima_actualizacion)}</td>
|
<td class="ts">${fmtDate(r.ultima_actualizacion)}</td>
|
||||||
<td class="user-col" title="${esc(r.actualizado_por||'')}">${esc(r.actualizado_por ? r.actualizado_por.split('@')[0] : '—')}</td>
|
<td class="user-col" title="${esc(r.actualizado_por||'')}">${esc(r.actualizado_por ? r.actualizado_por.split('@')[0] : '—')}</td>
|
||||||
<td style="min-width:140px;max-width:180px;">
|
<td style="min-width:140px;max-width:180px;">
|
||||||
@@ -952,14 +959,14 @@ function getExportRows() {
|
|||||||
function exportHeaders() {
|
function exportHeaders() {
|
||||||
return ['#','Nombre del Trámite','Cliente','Abogado Solicitante','Notaría',
|
return ['#','Nombre del Trámite','Cliente','Abogado Solicitante','Notaría',
|
||||||
'Se Inscribe','Alt. de Turno','Instrucciones Especiales',
|
'Se Inscribe','Alt. de Turno','Instrucciones Especiales',
|
||||||
'Fecha de Solicitud','Estatus','Últ. Actualización','Observaciones','Creado por'];
|
'Fecha de Solicitud','Estatus','Entrada','Últ. Actualización','Observaciones','Creado por'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function rowToArray(r, i) {
|
function rowToArray(r, i) {
|
||||||
return [
|
return [
|
||||||
i+1, r.tramite, r.cliente, r.abogado, r.notaria,
|
i+1, r.tramite, r.cliente, r.abogado, r.notaria,
|
||||||
r.inscribe, r.altera_turno, r.instrucciones,
|
r.inscribe, r.altera_turno, r.instrucciones,
|
||||||
fmtDate(r.fecha_solicitud), r.estatus,
|
fmtDate(r.fecha_solicitud), r.estatus, r.entrada || '',
|
||||||
fmtDate(r.ultima_actualizacion), r.observaciones, r.creado_por
|
fmtDate(r.ultima_actualizacion), r.observaciones, r.creado_por
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -973,10 +980,13 @@ function exportExcel() {
|
|||||||
const data = [exportHeaders(), ...rows.map(rowToArray)];
|
const data = [exportHeaders(), ...rows.map(rowToArray)];
|
||||||
const ws = XLSX.utils.aoa_to_sheet(data);
|
const ws = XLSX.utils.aoa_to_sheet(data);
|
||||||
|
|
||||||
// Column widths
|
// Column widths (#, Trámite, Cliente, Abogado, Notaría,
|
||||||
|
// Inscribe, Altera, Instrucciones, Fecha, Estatus,
|
||||||
|
// Entrada, Últ.Act., Observaciones, Creado por)
|
||||||
ws['!cols'] = [
|
ws['!cols'] = [
|
||||||
{wch:4},{wch:30},{wch:22},{wch:18},{wch:12},
|
{wch:4},{wch:30},{wch:22},{wch:18},{wch:12},
|
||||||
{wch:10},{wch:12},{wch:35},{wch:18},{wch:16},{wch:18},{wch:30},{wch:22}
|
{wch:10},{wch:12},{wch:35},{wch:18},{wch:16},
|
||||||
|
{wch:14},{wch:18},{wch:30},{wch:22}
|
||||||
];
|
];
|
||||||
|
|
||||||
// Header style (row 1)
|
// Header style (row 1)
|
||||||
@@ -1007,7 +1017,8 @@ function exportPDF() {
|
|||||||
const headers = exportHeaders();
|
const headers = exportHeaders();
|
||||||
|
|
||||||
// Columnas a mostrar en PDF (subset para que quepa en landscape)
|
// Columnas a mostrar en PDF (subset para que quepa en landscape)
|
||||||
const pdfCols = [0,1,2,3,4,5,6,9,11];
|
// [#, Trámite, Cliente, Abogado, Notaría, Inscribe, Altera, Estatus, Entrada, Observaciones]
|
||||||
|
const pdfCols = [0,1,2,3,4,5,6,9,10,12];
|
||||||
const pdfHeaders = pdfCols.map(i=>headers[i]);
|
const pdfHeaders = pdfCols.map(i=>headers[i]);
|
||||||
|
|
||||||
const win = window.open('','_blank');
|
const win = window.open('','_blank');
|
||||||
|
|||||||
Reference in New Issue
Block a user