Autosave: 20260428-045349

This commit is contained in:
Flatlogic Bot 2026-04-28 04:53:51 +00:00
parent f09833681a
commit 388bd415b3
15 changed files with 158 additions and 49 deletions

View File

@ -138,6 +138,7 @@ include 'layout_header.php';
<th>ID</th>
<th>Cliente</th>
<th>Celular</th>
<th>Agencia</th>
<th>Producto</th>
<th>Monto Total</th>
<th>Monto Debe</th>
@ -166,6 +167,7 @@ include 'layout_header.php';
<td><?php echo htmlspecialchars($pedido['id']); ?></td>
<td><?php echo htmlspecialchars($pedido['nombre_completo']); ?></td>
<td><?php echo htmlspecialchars($pedido['celular']); ?></td>
<td><?php echo htmlspecialchars($pedido['agencia'] ?? 'SHALOM'); ?></td>
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
<td><?php echo htmlspecialchars($pedido['monto_debe']); ?></td>

View File

@ -30,6 +30,48 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_visibility'])) {
exit();
}
// Sincronizar sedes de Shalom
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['sync_shalom'])) {
$apiKey = 'sk_mlq1j3na_4a676ewvaop';
$url = "https://shalom-api.lat/api/listar";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
"x-api-key: {$apiKey}"
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$data = json_decode($response, true);
if ($data && isset($data['success']) && $data['success'] && isset($data['data'])) {
$sedes = $data['data'];
$count = 0;
foreach ($sedes as $sede) {
$id = $sede['ter_id'];
$nombre = $sede['lugar'];
$stmt = $conn->prepare("INSERT INTO sedes_shalom (id_terminal, nombre_sede, activo, permite_origen, permite_destino)
VALUES (?, ?, 1, 1, 1)
ON DUPLICATE KEY UPDATE nombre_sede = VALUES(nombre_sede)");
$stmt->execute([$id, $nombre]);
$count++;
}
$_SESSION['success_message'] = "Sincronización completada. Se procesaron $count sedes.";
} else {
$_SESSION['error_message'] = "Error al procesar los datos de la API.";
}
} else {
$_SESSION['error_message'] = "Error al conectar con la API de Shalom (Código: $httpCode).";
}
header("Location: configuracion.php");
exit();
}
// --- Carga de Datos para la Vista ---
@ -70,6 +112,29 @@ if (isset($_SESSION['error_message'])) {
<div class="container mt-5">
<!-- SECCIÓN PARA SINCRONIZAR SEDES DE SHALOM -->
<div class="card mb-5">
<div class="card-header">
<h3>Sincronización de Sedes Shalom</h3>
</div>
<div class="card-body">
<p>Conéctate directamente con la API de Shalom para actualizar el listado de agencias disponibles en el sistema.</p>
<form action="configuracion.php" method="post">
<input type="hidden" name="sync_shalom" value="1">
<button type="submit" class="btn btn-info">
<i class="fas fa-sync"></i> Sincronizar Sedes Ahora
</button>
</form>
<?php
// Mostrar resultado de la sincronización si existe
if (isset($_SESSION['sync_result'])) {
echo "<div class='alert alert-info mt-3'>" . $_SESSION['sync_result'] . "</div>";
unset($_SESSION['sync_result']);
}
?>
</div>
</div>
<!-- SECCIÓN PARA GESTIONAR CONTENIDO DEL KANBAN (TARJETAS) -->
<div class="card mb-5">
<div class="card-header">

View File

@ -0,0 +1,2 @@
-- Migration: Add agencia column to pedidos table
ALTER TABLE pedidos ADD COLUMN agencia VARCHAR(50) DEFAULT 'SHALOM' AFTER celular;

View File

@ -14,6 +14,7 @@ try {
SELECT
p.dni_cliente,
p.nombre_completo,
p.agencia,
p.sede_envio,
p.celular,
p.producto,
@ -37,6 +38,7 @@ try {
$output .= '<tr>';
$output .= '<th>DNI</th>';
$output .= '<th>Cliente</th>';
$output .= '<th>Agencia</th>';
$output .= '<th>Sede de Envío</th>';
$output .= '<th>Numero</th>';
$output .= '<th>Producto</th>';
@ -51,6 +53,7 @@ try {
$output .= '<tr>';
$output .= '<td>' . htmlspecialchars($pedido['dni_cliente'] ?? '') . '</td>';
$output .= '<td>' . htmlspecialchars($pedido['nombre_completo'] ?? '') . '</td>';
$output .= '<td>' . htmlspecialchars($pedido['agencia'] ?? 'SHALOM') . '</td>';
$output .= '<td>' . htmlspecialchars($pedido['sede_envio'] ?? '') . '</td>';
$output .= '<td>' . htmlspecialchars($pedido['celular'] ?? '') . '</td>';
$output .= '<td>' . htmlspecialchars($pedido['producto'] ?? '') . '</td>';

View File

@ -156,6 +156,7 @@ include 'layout_header.php';
<th>Cliente</th>
<th>DNI</th>
<th>Celular</th>
<th>Agencia</th>
<th>Producto</th>
<th>Sede de Envío</th>
<th>Monto Total</th>
@ -178,6 +179,7 @@ include 'layout_header.php';
<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['agencia'] ?? 'SHALOM'); ?></td>
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>

View File

@ -154,6 +154,7 @@ include 'layout_header.php';
<th>Cliente</th>
<th>DNI</th>
<th>Celular</th>
<th>Agencia</th>
<th>Producto</th>
<th>Sede de Envío</th>
<th>Cantidad</th>
@ -181,6 +182,7 @@ include 'layout_header.php';
<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['agencia'] ?? 'SHALOM'); ?></td>
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['cantidad'] ?: 1); ?></td>

View File

@ -16,6 +16,7 @@ $pedido = [
'dni_cliente' => '',
'nombre_completo' => '',
'celular' => '',
'agencia' => 'SHALOM',
'sede_envio' => '',
'codigo_rastreo' => '',
'codigo_tracking' => '',
@ -71,6 +72,10 @@ if ($user_role === 'Administrador' || $user_role === 'Logistica') {
$stmt_products = $pdo->query("SELECT id, nombre FROM products ORDER BY nombre ASC");
$products = $stmt_products->fetchAll();
// Fetch Shalom branches
$stmt_sedes = $pdo->query("SELECT nombre_sede FROM sedes_shalom ORDER BY nombre_sede ASC");
$sedes_shalom = $stmt_sedes->fetchAll(PDO::FETCH_COLUMN);
$estados = ['ROTULADO 📦', 'EN TRANSITO 🚛', 'EN DESTINO 🏬', 'COMPLETADO ✅'];
?>
@ -124,13 +129,26 @@ include 'layout_header.php';
</div>
<div class="row">
<div class="col-md-6 mb-3">
<div class="col-md-4 mb-3">
<label for="celular" class="form-label">Celular</label>
<input type="text" class="form-control" id="celular" name="celular" value="<?php echo htmlspecialchars($pedido['celular']); ?>" required>
</div>
<div class="col-md-6 mb-3">
<div class="col-md-4 mb-3">
<label for="agencia" class="form-label">Agencia</label>
<select class="form-select" id="agencia" name="agencia" required>
<option value="SHALOM" <?php echo ($pedido['agencia'] == 'SHALOM') ? 'selected' : ''; ?>>SHALOM</option>
<option value="OLVA" <?php echo ($pedido['agencia'] == 'OLVA') ? 'selected' : ''; ?>>OLVA</option>
<option value="OTROS" <?php echo ($pedido['agencia'] == 'OTROS') ? 'selected' : ''; ?>>OTROS</option>
</select>
</div>
<div class="col-md-4 mb-3">
<label for="sede_envio" class="form-label">Sede de Envío</label>
<input type="text" class="form-control" id="sede_envio" name="sede_envio" value="<?php echo htmlspecialchars($pedido['sede_envio']); ?>" required>
<input type="text" class="form-control" id="sede_envio" name="sede_envio" list="sedes_list" value="<?php echo htmlspecialchars($pedido['sede_envio']); ?>" required>
<datalist id="sedes_list">
<?php foreach ($sedes_shalom as $sede): ?>
<option value="<?php echo htmlspecialchars($sede); ?>">
<?php endforeach; ?>
</datalist>
</div>
</div>
@ -287,6 +305,19 @@ document.addEventListener('DOMContentLoaded', function() {
const toggleClaveBtn = document.getElementById('toggleClave');
const pedidoId = document.querySelector('input[name="id"]').value;
const submitBtn = document.querySelector('button[type="submit"]');
const agenciaSelect = document.getElementById('agencia');
const sedeEnvioInput = document.getElementById('sede_envio');
function updateSedeList() {
if (agenciaSelect.value === 'SHALOM') {
sedeEnvioInput.setAttribute('list', 'sedes_list');
} else {
sedeEnvioInput.removeAttribute('list');
}
}
agenciaSelect.addEventListener('change', updateSedeList);
updateSedeList(); // Run on load
function validateOperacion() {
const value = numeroOperacionInput.value.trim();

View File

@ -153,6 +153,7 @@ include 'layout_header.php';
<th>Cliente</th>
<th>DNI</th>
<th>Celular</th>
<th>Agencia</th>
<th>Producto</th>
<th>Sede de Envío</th>
<th>Cantidad</th>
@ -177,6 +178,7 @@ include 'layout_header.php';
<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['agencia'] ?? 'SHALOM'); ?></td>
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['cantidad'] ?? '1'); ?></td>

View File

@ -16,6 +16,7 @@ $pedido = [
'dni_cliente' => '',
'nombre_completo' => '',
'celular' => '',
'agencia' => 'CONTRAENTREGA',
'sede_envio' => '',
'codigo_rastreo' => '',
'codigo_tracking' => '',
@ -117,11 +118,20 @@ include 'layout_header.php';
</div>
<div class="row">
<div class="col-md-6 mb-3">
<div class="col-md-4 mb-3">
<label for="celular" class="form-label">Celular</label>
<input type="text" class="form-control" id="celular" name="celular" value="<?php echo htmlspecialchars($pedido['celular']); ?>" required>
</div>
<div class="col-md-6 mb-3">
<div class="col-md-4 mb-3">
<label for="agencia" class="form-label">Agencia</label>
<select class="form-select" id="agencia" name="agencia" required>
<option value="CONTRAENTREGA" <?php echo ($pedido['agencia'] == 'CONTRAENTREGA') ? 'selected' : ''; ?>>CONTRAENTREGA</option>
<option value="SHALOM" <?php echo ($pedido['agencia'] == 'SHALOM') ? 'selected' : ''; ?>>SHALOM</option>
<option value="OLVA" <?php echo ($pedido['agencia'] == 'OLVA') ? 'selected' : ''; ?>>OLVA</option>
<option value="OTROS" <?php echo ($pedido['agencia'] == 'OTROS') ? 'selected' : ''; ?>>OTROS</option>
</select>
</div>
<div class="col-md-4 mb-3">
<label for="sede_envio" class="form-label">Ciudad</label>
<input type="text" class="form-control" id="sede_envio" name="sede_envio" value="<?php echo htmlspecialchars($pedido['sede_envio']); ?>" required>
</div>

View File

@ -175,6 +175,7 @@ include 'layout_header.php';
<th>Cliente</th>
<th>DNI</th>
<th>Celular</th>
<th>Agencia</th>
<th>Producto</th>
<th>Sede de Envío</th>
<th>Cantidad</th>
@ -266,6 +267,7 @@ include 'layout_header.php';
<a href="<?php echo $whatsappUrl; ?>" target="_blank" class="btn btn-sm btn-secondary whatsapp-icon" id="whatsapp-icon-<?php echo $pedido['id']; ?>" title="Enviar WhatsApp">💬</a>
</div>
</td>
<td><?php echo htmlspecialchars($pedido['agencia'] ?? 'SHALOM'); ?></td>
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['cantidad'] ?: 1); ?></td>

View File

@ -47,6 +47,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$dni = trim($_POST['dni']);
$nombre_completo = trim($_POST['nombre_completo']);
$celular = trim($_POST['celular']);
$agencia = trim($_POST['agencia'] ?? 'SHALOM');
$sede_envio = trim($_POST['sede_envio']);
$codigo_rastreo = trim($_POST['codigo_rastreo'] ?? '');
$codigo_tracking = trim($_POST['codigo_tracking'] ?? '');
@ -135,6 +136,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
'dni_cliente' => $dni,
'nombre_completo' => $nombre_completo,
'celular' => $celular,
'agencia' => $agencia,
'sede_envio' => $sede_envio,
'codigo_rastreo' => $codigo_rastreo,
'codigo_tracking' => $codigo_tracking,
@ -163,6 +165,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
"dni_cliente = :dni_cliente",
"nombre_completo = :nombre_completo",
"celular = :celular",
"agencia = :agencia",
"sede_envio = :sede_envio",
"codigo_rastreo = :codigo_rastreo",
"codigo_tracking = :codigo_tracking",
@ -231,8 +234,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, pendientes, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, estado, asesor_id, notas, observacion, voucher_adelanto_path, voucher_restante_path";
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :pendientes, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :estado, :asesor_id, :notas, :observacion, :voucher_adelanto_path, :voucher_restante_path";
$columns_sql = "dni_cliente, nombre_completo, celular, agencia, sede_envio, codigo_rastreo, codigo_tracking, clave, pendientes, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, estado, asesor_id, notas, observacion, voucher_adelanto_path, voucher_restante_path";
$values_sql = ":dni_cliente, :nombre_completo, :celular, :agencia, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :pendientes, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :estado, :asesor_id, :notas, :observacion, :voucher_adelanto_path, :voucher_restante_path";
$completed_states = ['Completado', 'COMPLETADO ✅'];
if (in_array($estado, $completed_states)) {

View File

@ -15,6 +15,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$dni = trim($_POST['dni']);
$nombre_completo = trim($_POST['nombre_completo']);
$celular = trim($_POST['celular']);
$agencia = trim($_POST['agencia'] ?? 'CONTRAENTREGA');
$sede_envio = trim($_POST['sede_envio']);
$codigo_rastreo = trim($_POST['codigo_rastreo'] ?? '');
$codigo_tracking = trim($_POST['codigo_tracking'] ?? '');
@ -90,6 +91,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
'dni_cliente' => $dni,
'nombre_completo' => $nombre_completo,
'celular' => $celular,
'agencia' => $agencia,
'sede_envio' => $sede_envio,
'direccion_exacta' => $direccion_exacta,
'referencia_domicilio' => $referencia_domicilio,
@ -116,6 +118,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
"dni_cliente = :dni_cliente",
"nombre_completo = :nombre_completo",
"celular = :celular",
"agencia = :agencia",
"sede_envio = :sede_envio",
"direccion_exacta = :direccion_exacta",
"referencia_domicilio = :referencia_domicilio",
@ -152,8 +155,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$params['asesor_id'] = $_SESSION['user_id'];
$params['estado'] = $_POST['estado'] ?? 'RUTA_CONTRAENTREGA';
$columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, direccion_exacta, referencia_domicilio, coordenadas, codigo_rastreo, codigo_tracking, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, asesor_id, notas, estado, seguimiento, fecha_entrega";
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :direccion_exacta, :referencia_domicilio, :coordenadas, :codigo_rastreo, :codigo_tracking, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :asesor_id, :notas, :estado, :seguimiento, :fecha_entrega";
$columns_sql = "dni_cliente, nombre_completo, celular, agencia, sede_envio, direccion_exacta, referencia_domicilio, coordenadas, codigo_rastreo, codigo_tracking, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, asesor_id, notas, estado, seguimiento, fecha_entrega";
$values_sql = ":dni_cliente, :nombre_completo, :celular, :agencia, :sede_envio, :direccion_exacta, :referencia_domicilio, :coordenadas, :codigo_rastreo, :codigo_tracking, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :asesor_id, :notas, :estado, :seguimiento, :fecha_entrega";
$sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)";
$stmt = $pdo->prepare($sql);

1
shalom_response.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,26 +1,26 @@
<?php
require_once __DIR__ . '/db/config.php';
$data = "3547,COMAS LIMA NORTE URBANO,1,1,1
3558,CONDEVILLA SMP ZONA 2,1,1,1
3569,CUSCO WANCHAQ URBANO,1,1,1
3580,CUSCO SAN SEBASTIAN NORTE,1,1,1
3591,CUSCO SAN JERONIMO URBANO,1,1,1
3602,CUSCO SANTIAGO CENTRO,1,1,1
3613,DESAGUADERO FRONTERA SUR,1,1,1
3624,EL AGUSTINO ZONA ESTE,1,1,1
3635,EL TAMBO VALLE CENTRAL,1,1,1
3646,ESPERANZA TRUJILLO ZONA SUR,1,1,1
357,FLORENCIA DE MORA SUR,1,1,1
3668,GREGORIO ALBARRACIN URBANO,1,1,1
3679,HUACHO COSTA NORTE,1,1,1
3690,HUAMACHUCO SIERRA NORTE,1,1,1
3701,HUANCAVELICA ZONA CENTRO,1,1,1
3712,HUANCAYO VALLE CENTRAL,1,1,1
3723,HUANTA AYACUCHO ZONA SUR,1,1,1
3734,HUANUCO SELVA CENTRAL,1,1,1
3745,HUAURA COSTA CENTRAL,1,1,1
3756,ICA VALLE CENTRAL,1,1,1";
$data = "3767,ILAVE FRONTERA SUR PUNO,1,1,1
3778,INDEPENDENCIA HUARAZ CENTRO,1,1,1
3789,JAEN SELVA NORTE,1,1,1
3800,JULIACA PUNO SUR,1,1,1
3811,LA MOLINA ZONA ESTE LIMA,1,1,1
3822,LAMBAYEQUE COSTA SUR,1,1,1
3833,LAMAS SELVA ALTA,1,1,1
3844,LINCE CENTRO FINANCIERO,1,1,1
3855,LOS OLIVOS UNIVERSITARIA NORTE,1,1,1
3866,LURIN INDUSTRIAL SUR,1,1,1
3877,MAGDALENA COSTA CENTRAL,1,1,1
3888,MAJES VALLE AGRICOLA,1,1,1
3899,MALA CAÑETE COSTA,1,1,1
3910,MARIANO MELGAR URBANO,1,1,1
3921,MIRAFLORES TURISTICO CENTRO,1,1,1
3932,MOYOBAMBA SELVA NORTE,1,1,1
3943,MOTUPE COSTA NORTE,1,1,1
3954,NAZCA TURISTICO SUR,1,1,1
3965,NUEVO CHIMBOTE INDUSTRIAL NORTE,1,1,1
3976,OTUZCO SIERRA CENTRAL,1,1,1";
$lines = explode("\n", trim($data));
$pdo = db();

View File

@ -1,19 +0,0 @@
<?php
$apiKey = 'sk_mlq1j3na_4a676ewvaop';
$url = "https://shalom-api.lat/api/v1/agencies";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
"Authorization: Bearer {$apiKey}"
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP Code: $httpCode\n";
echo "Response: $response\n";