Autosave: 20260205-071845
This commit is contained in:
parent
eb777eb9a8
commit
d0a0fa9577
1
db/migrations/054_add_contraentrega_status.sql
Normal file
1
db/migrations/054_add_contraentrega_status.sql
Normal file
@ -0,0 +1 @@
|
||||
ALTER TABLE pedidos MODIFY COLUMN estado ENUM('ROTULADO 📦', 'EN TRANSITO 🚛', 'EN DESTINO 🏬', 'COMPLETADO ✅', 'Gestion', 'RUTA_CONTRAENTREGA') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'ROTULADO 📦';
|
||||
1
db/migrations/056_add_direccion_exacta_to_pedidos.sql
Normal file
1
db/migrations/056_add_direccion_exacta_to_pedidos.sql
Normal file
@ -0,0 +1 @@
|
||||
ALTER TABLE pedidos ADD COLUMN direccion_exacta VARCHAR(255) DEFAULT NULL;
|
||||
1
db/migrations/057_add_seguimiento_to_pedidos.sql
Normal file
1
db/migrations/057_add_seguimiento_to_pedidos.sql
Normal file
@ -0,0 +1 @@
|
||||
ALTER TABLE pedidos ADD COLUMN seguimiento VARCHAR(255) NULL;
|
||||
@ -147,6 +147,10 @@ include 'layout_header.php';
|
||||
<label for="clave" class="form-label">Clave</label>
|
||||
<input type="text" class="form-control" id="clave" name="clave" value="<?php echo htmlspecialchars($pedido['clave'] ?? ''); ?>">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="seguimiento" class="form-label">Seguimiento</label>
|
||||
<input type="text" class="form-control" id="seguimiento" name="seguimiento" value="<?php echo htmlspecialchars($pedido['seguimiento'] ?? ''); ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
@ -30,6 +30,9 @@ function getStatusStyle($status) {
|
||||
case 'GESTION':
|
||||
$bgColor = '#6c757d'; // secondary grey
|
||||
break;
|
||||
case 'RUTA_CONTRAENTREGA':
|
||||
$bgColor = '#007bff'; // primary blue
|
||||
break;
|
||||
}
|
||||
return "background-color: {$bgColor} !important; {$style}";
|
||||
}
|
||||
@ -56,7 +59,7 @@ $selected_month = $_GET['mes'] ?? '';
|
||||
$selected_year = $_GET['año'] ?? '';
|
||||
$search_query = $_GET['q'] ?? '';
|
||||
|
||||
$sql = "SELECT p.*, u.nombre_asesor as asesor_nombre FROM pedidos p LEFT JOIN users u ON p.asesor_id = u.id WHERE p.estado = 'RUTA CONTRAENTREGA'";
|
||||
$sql = "SELECT p.*, u.nombre_asesor as asesor_nombre FROM pedidos p LEFT JOIN users u ON p.asesor_id = u.id WHERE p.estado = 'RUTA_CONTRAENTREGA'";
|
||||
$params = [];
|
||||
|
||||
if ($user_role === 'Asesor') {
|
||||
@ -147,8 +150,9 @@ include 'layout_header.php';
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Seguimiento</th>
|
||||
<th>Cliente</th>
|
||||
<th>DNI</th>
|
||||
|
||||
<th>Celular</th>
|
||||
<th>Dirección</th>
|
||||
<th>Referencia</th>
|
||||
@ -157,6 +161,7 @@ include 'layout_header.php';
|
||||
<th>Coordenadas</th>
|
||||
<th>Producto</th>
|
||||
<th>Monto Total</th>
|
||||
<th>Monto Debe</th>
|
||||
<th>Estado</th>
|
||||
<?php if ($user_role !== 'Asesor'): ?><th>Asesor</th><?php endif; ?>
|
||||
<th>Fecha Creación</th>
|
||||
@ -167,16 +172,18 @@ include 'layout_header.php';
|
||||
<?php foreach ($pedidos as $pedido): ?>
|
||||
<tr>
|
||||
<td><?php echo htmlspecialchars($pedido['id']); ?></td>
|
||||
<td class="editable" data-id="<?php echo $pedido['id']; ?>" data-field="seguimiento"><?php echo htmlspecialchars($pedido['seguimiento'] ?? ''); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['nombre_completo']); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['dni_cliente'] ?? 'N/A'); ?></td>
|
||||
|
||||
<td><?php echo htmlspecialchars($pedido['celular']); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['direccion_cliente'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['direccion_exacta'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['referencia_domicilio'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['codigo_rastreo'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['provincia'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['codigo_tracking'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['monto_debe']); ?></td>
|
||||
<td><span class="badge" style="<?php echo getStatusStyle($pedido['estado']); ?>"><?php echo htmlspecialchars($pedido['estado']); ?></span></td>
|
||||
<?php if ($user_role !== 'Asesor'): ?><td><?php echo htmlspecialchars($pedido['asesor_nombre'] ?? 'N/A'); ?></td><?php endif; ?>
|
||||
<td><?php echo htmlspecialchars($pedido['created_at']); ?></td>
|
||||
@ -191,12 +198,15 @@ include 'layout_header.php';
|
||||
</tbody>
|
||||
</table>
|
||||
<?php if (empty($pedidos)): ?>
|
||||
<p class="text-center">No hay pedidos en ruta contraentrega.</p>
|
||||
<p class="text-center">No hay pedidos que coincidan con el filtro.</p>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<?php include 'layout_footer.php'; ?>
|
||||
|
||||
<script>
|
||||
@ -211,4 +221,70 @@ $(document).ready(function() {
|
||||
"info": false
|
||||
});
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const table = document.querySelector('.table');
|
||||
|
||||
table.addEventListener('click', function(e) {
|
||||
if (e.target && e.target.classList.contains('editable')) {
|
||||
const cell = e.target;
|
||||
if (cell.querySelector('input')) {
|
||||
return; // Already in edit mode
|
||||
}
|
||||
|
||||
const originalContent = cell.textContent.trim();
|
||||
const input = document.createElement('input');
|
||||
input.type = 'text';
|
||||
input.className = 'form-control form-control-sm';
|
||||
input.value = originalContent === 'N/A' ? '' : originalContent;
|
||||
|
||||
cell.innerHTML = '';
|
||||
cell.appendChild(input);
|
||||
input.focus();
|
||||
|
||||
const saveChanges = function() {
|
||||
const newValue = input.value.trim();
|
||||
const pedidoId = cell.dataset.id;
|
||||
const field = cell.dataset.field;
|
||||
|
||||
let endpoint = 'update_tracking.php'; // Default endpoint
|
||||
if (field === 'clave') {
|
||||
endpoint = 'update_clave.php';
|
||||
}
|
||||
|
||||
// Restore original content visually
|
||||
cell.textContent = newValue === '' ? 'N/A' : newValue;
|
||||
|
||||
// Send data to server
|
||||
fetch(endpoint, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ id: pedidoId, field: field, value: newValue })
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.error) {
|
||||
console.error('Error:', data.error);
|
||||
// Optionally revert the change and show an error message
|
||||
cell.textContent = originalContent;
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Fetch Error:', error);
|
||||
cell.textContent = originalContent;
|
||||
});
|
||||
};
|
||||
|
||||
input.addEventListener('blur', saveChanges);
|
||||
input.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Enter') {
|
||||
input.blur();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@ -51,6 +51,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$codigo_rastreo = trim($_POST['codigo_rastreo'] ?? '');
|
||||
$codigo_tracking = trim($_POST['codigo_tracking'] ?? '');
|
||||
$clave = trim($_POST['clave'] ?? '');
|
||||
$seguimiento = trim($_POST['seguimiento'] ?? '');
|
||||
|
||||
// --- Manejo de multiples productos ---
|
||||
$productos_post = $_POST['productos'] ?? [];
|
||||
@ -107,6 +108,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
'codigo_rastreo' => $codigo_rastreo,
|
||||
'codigo_tracking' => $codigo_tracking,
|
||||
'clave' => $clave,
|
||||
'seguimiento' => $seguimiento,
|
||||
'producto' => $producto,
|
||||
'cantidad' => $cantidad,
|
||||
'monto_total' => $monto_total,
|
||||
@ -131,6 +133,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
"codigo_rastreo = :codigo_rastreo",
|
||||
"codigo_tracking = :codigo_tracking",
|
||||
"clave = :clave",
|
||||
"seguimiento = :seguimiento",
|
||||
"producto = :producto",
|
||||
"cantidad = :cantidad",
|
||||
"monto_total = :monto_total",
|
||||
@ -170,8 +173,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
// INSERT: The advisor is the user creating the order.
|
||||
$params['asesor_id'] = $_SESSION['user_id'];
|
||||
|
||||
$columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, codigo_rastreo, codigo_tracking, clave, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, estado, asesor_id, notas, voucher_adelanto_path, voucher_restante_path";
|
||||
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :estado, :asesor_id, :notas, :voucher_adelanto_path, :voucher_restante_path";
|
||||
$columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, codigo_rastreo, codigo_tracking, clave, seguimiento, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, estado, asesor_id, notas, voucher_adelanto_path, voucher_restante_path";
|
||||
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :seguimiento, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :estado, :asesor_id, :notas, :voucher_adelanto_path, :voucher_restante_path";
|
||||
|
||||
$completed_states = ['Completado', 'COMPLETADO ✅'];
|
||||
if (in_array($estado, $completed_states)) {
|
||||
|
||||
@ -62,7 +62,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
'nombre_completo' => $nombre_completo,
|
||||
'celular' => $celular,
|
||||
'sede_envio' => $sede_envio,
|
||||
'direccion_cliente' => $direccion_exacta,
|
||||
'direccion_exacta' => $direccion_exacta,
|
||||
'referencia_domicilio' => $referencia_domicilio,
|
||||
'codigo_rastreo' => $codigo_rastreo,
|
||||
'codigo_tracking' => $codigo_tracking,
|
||||
@ -84,7 +84,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
"nombre_completo = :nombre_completo",
|
||||
"celular = :celular",
|
||||
"sede_envio = :sede_envio",
|
||||
"direccion_cliente = :direccion_cliente",
|
||||
"direccion_exacta = :direccion_exacta",
|
||||
"referencia_domicilio = :referencia_domicilio",
|
||||
"codigo_rastreo = :codigo_rastreo",
|
||||
"codigo_tracking = :codigo_tracking",
|
||||
@ -111,10 +111,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
} else {
|
||||
// INSERT: The advisor is the user creating the order.
|
||||
$params['asesor_id'] = $_SESSION['user_id'];
|
||||
$params['estado'] = 'RUTA CONTRAENTREGA';
|
||||
$params['estado'] = 'RUTA_CONTRAENTREGA';
|
||||
|
||||
$columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, direccion_cliente, referencia_domicilio, codigo_rastreo, codigo_tracking, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, asesor_id, notas, estado";
|
||||
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :direccion_cliente, :referencia_domicilio, :codigo_rastreo, :codigo_tracking, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :asesor_id, :notas, :estado";
|
||||
$columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, direccion_exacta, referencia_domicilio, codigo_rastreo, codigo_tracking, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, asesor_id, notas, estado";
|
||||
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :direccion_exacta, :referencia_domicilio, :codigo_rastreo, :codigo_tracking, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :asesor_id, :notas, :estado";
|
||||
|
||||
$sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)";
|
||||
$stmt = $pdo->prepare($sql);
|
||||
|
||||
@ -20,7 +20,9 @@ $pedido_id = $data['id'];
|
||||
$field = $data['field'];
|
||||
$value = $data['value'];
|
||||
|
||||
$allowed_fields = ['codigo_rastreo', 'codigo_tracking'];
|
||||
|
||||
|
||||
$allowed_fields = ['codigo_rastreo', 'codigo_tracking', 'seguimiento'];
|
||||
if (!in_array($field, $allowed_fields)) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Campo no válido.']);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user