Autosave: 20260602-014831
This commit is contained in:
parent
f244f447ec
commit
923ddb7b18
@ -20,22 +20,80 @@ function splitProvinciaDistrito(?string $value): array
|
|||||||
$clean = preg_replace('/\s+/', ' ', $value);
|
$clean = preg_replace('/\s+/', ' ', $value);
|
||||||
$parts = preg_split('/\s*[\/\-,|]\s*/', $clean, 2);
|
$parts = preg_split('/\s*[\/\-,|]\s*/', $clean, 2);
|
||||||
|
|
||||||
if (is_array($parts) && count($parts) === 2) {
|
if (is_array($parts) and count($parts) === 2) {
|
||||||
return [trim($parts[0]), trim($parts[1])];
|
return [trim($parts[0]), trim($parts[1])];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [$clean, ''];
|
return [$clean, ''];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseTotalQuantity(mixed $value): int
|
||||||
|
{
|
||||||
|
if (is_int($value)) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_float($value)) {
|
||||||
|
return (int)$value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$s = trim((string)$value);
|
||||||
|
if ($s === '') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Old/legacy format can be: "1+2+3"
|
||||||
|
if (strpos($s, '+') !== false) {
|
||||||
|
$sum = 0;
|
||||||
|
foreach (explode('+', $s) as $part) {
|
||||||
|
$part = trim($part);
|
||||||
|
if ($part === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (is_numeric($part)) {
|
||||||
|
$sum += (int)$part;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (preg_match('/\d+/', $part, $m)) {
|
||||||
|
$sum += (int)$m[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_numeric($s)) {
|
||||||
|
return (int)$s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/\d+/', $s, $m)) {
|
||||||
|
return (int)$m[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatPriceSegment(float $value): string
|
||||||
|
{
|
||||||
|
$rounded = round($value, 2);
|
||||||
|
if (abs($rounded - (int)$rounded) < 0.00001) {
|
||||||
|
return (string)(int)$rounded;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep up to 2 decimals, but remove trailing zeros
|
||||||
|
$s = number_format($rounded, 2, '.', '');
|
||||||
|
$s = rtrim(rtrim($s, '0'), '.');
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
function extractProductNames(array $pedido): array
|
function extractProductNames(array $pedido): array
|
||||||
{
|
{
|
||||||
$names = [];
|
$names = [];
|
||||||
$notas = (string)($pedido['notas'] ?? '');
|
$notas = (string)($pedido['notas'] ?? '');
|
||||||
|
|
||||||
if (preg_match('/Detalle de productos:\s*(.+)$/mi', $notas, $match)) {
|
if (preg_match('/Detalle de productos:\\s*(.+)$/mi', $notas, $match)) {
|
||||||
$items = explode(',', $match[1]);
|
$items = explode(',', $match[1]);
|
||||||
foreach ($items as $item) {
|
foreach ($items as $item) {
|
||||||
$name = preg_replace('/\s*\(x\d+\)\s*$/i', '', trim($item));
|
$name = preg_replace('/\\s*\\(x\\d+\\)\\s*$/i', '', trim($item));
|
||||||
if ($name !== '') {
|
if ($name !== '') {
|
||||||
$names[] = $name;
|
$names[] = $name;
|
||||||
}
|
}
|
||||||
@ -54,6 +112,115 @@ function extractProductNames(array $pedido): array
|
|||||||
return array_values(array_unique($names));
|
return array_values(array_unique($names));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractProductDetailsWithQuantities(array $pedido): array
|
||||||
|
{
|
||||||
|
$notas = (string)($pedido['notas'] ?? '');
|
||||||
|
|
||||||
|
// Prefer parsing from "Detalle de productos:" (it stores quantities as (xN))
|
||||||
|
if (preg_match_all('/Detalle de productos:\\s*(.+)$/mi', $notas, $matches) && !empty($matches[1])) {
|
||||||
|
$lastLine = trim((string)end($matches[1]));
|
||||||
|
if ($lastLine !== '') {
|
||||||
|
$parts = preg_split('/\\s*,\\s*/u', $lastLine);
|
||||||
|
$out = [];
|
||||||
|
|
||||||
|
if (is_array($parts)) {
|
||||||
|
foreach ($parts as $part) {
|
||||||
|
$part = trim((string)$part);
|
||||||
|
if ($part === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expected format: "Nombre de producto (x2)"
|
||||||
|
if (preg_match('/^(.*?)\\s*\\(x\\s*(\\d+)\\s*\\)\\s*$/iu', $part, $m)) {
|
||||||
|
$name = trim((string)$m[1]);
|
||||||
|
$qty = (int)$m[2];
|
||||||
|
} else {
|
||||||
|
$name = $part;
|
||||||
|
$qty = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($name !== '') {
|
||||||
|
if ($qty <= 0) {
|
||||||
|
$qty = 1;
|
||||||
|
}
|
||||||
|
$out[] = ['name' => $name, 'qty' => $qty];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($out)) {
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: use "producto" + "cantidad" (best-effort)
|
||||||
|
$productoStr = (string)($pedido['producto'] ?? '');
|
||||||
|
$names = [];
|
||||||
|
foreach (preg_split('/\\s*,\\s*/u', $productoStr) as $n) {
|
||||||
|
$n = trim((string)$n);
|
||||||
|
if ($n !== '') {
|
||||||
|
$names[] = $n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($names)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$cantidad_total = parseTotalQuantity($pedido['cantidad'] ?? 0);
|
||||||
|
|
||||||
|
// Legacy possibility: "cantidad" can be like "1+2"
|
||||||
|
$cantidadField = $pedido['cantidad'] ?? '';
|
||||||
|
$qtyParts = [];
|
||||||
|
if (is_string($cantidadField) && strpos(trim($cantidadField), '+') !== false) {
|
||||||
|
$qtyParts = array_map('trim', explode('+', $cantidadField));
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = [];
|
||||||
|
$countNames = count($names);
|
||||||
|
foreach ($names as $i => $name) {
|
||||||
|
if ($countNames === 1) {
|
||||||
|
$qty = $cantidad_total > 0 ? $cantidad_total : 1;
|
||||||
|
} elseif (!empty($qtyParts) && isset($qtyParts[$i]) && is_numeric($qtyParts[$i])) {
|
||||||
|
$qty = (int)$qtyParts[$i];
|
||||||
|
if ($qty <= 0) {
|
||||||
|
$qty = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$qty = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out[] = ['name' => $name, 'qty' => $qty];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEanMap(PDO $pdo, array $productNames): array
|
||||||
|
{
|
||||||
|
$productNames = array_values(array_filter(array_map('trim', $productNames)));
|
||||||
|
if (empty($productNames)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$uniqueNames = array_values(array_unique($productNames));
|
||||||
|
$placeholders = implode(',', array_fill(0, count($uniqueNames), '?'));
|
||||||
|
$stmt = $pdo->prepare("SELECT nombre, ean FROM products WHERE nombre IN ($placeholders)");
|
||||||
|
$stmt->execute($uniqueNames);
|
||||||
|
|
||||||
|
$map = [];
|
||||||
|
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
|
$nombre = (string)($row['nombre'] ?? '');
|
||||||
|
$ean = trim((string)($row['ean'] ?? ''));
|
||||||
|
if ($nombre !== '' && $ean !== '') {
|
||||||
|
$map[$nombre] = $ean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
|
||||||
function getEansForProducts(PDO $pdo, array $productNames): string
|
function getEansForProducts(PDO $pdo, array $productNames): string
|
||||||
{
|
{
|
||||||
if (empty($productNames)) {
|
if (empty($productNames)) {
|
||||||
@ -68,7 +235,7 @@ function getEansForProducts(PDO $pdo, array $productNames): string
|
|||||||
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
$ean = trim((string)($row['ean'] ?? ''));
|
$ean = trim((string)($row['ean'] ?? ''));
|
||||||
if ($ean !== '') {
|
if ($ean !== '') {
|
||||||
$map[$row['nombre']] = $ean;
|
$map[(string)($row['nombre'] ?? '')] = $ean;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +246,7 @@ function getEansForProducts(PDO $pdo, array $productNames): string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return implode(' | ', array_values(array_unique($eans)));
|
return implode('|', array_values(array_unique($eans)));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -88,10 +255,11 @@ try {
|
|||||||
$user_id = $_SESSION['user_id'];
|
$user_id = $_SESSION['user_id'];
|
||||||
$user_role = $_SESSION['user_role'] ?? 'Asesor';
|
$user_role = $_SESSION['user_role'] ?? 'Asesor';
|
||||||
|
|
||||||
$selected_month = $_GET['mes'] ?? '';
|
|
||||||
$selected_year = $_GET['año'] ?? '';
|
|
||||||
$search_query = trim($_GET['q'] ?? '');
|
$search_query = trim($_GET['q'] ?? '');
|
||||||
|
|
||||||
|
// Exportar solo los pedidos con fecha de entrega "mañana"
|
||||||
|
$date_condition = "DATE(p.fecha_entrega) = DATE_ADD(CURDATE(), INTERVAL 1 DAY)";
|
||||||
|
|
||||||
$sql = "SELECT p.* FROM pedidos p WHERE p.estado IN ('RUTA_CONTRAENTREGA', 'PENDIENTE', 'NO CONTESTO, VOLVER A LLAMAR', 'NO CONTESTO, DEVOLVER LLAMADA', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO')";
|
$sql = "SELECT p.* FROM pedidos p WHERE p.estado IN ('RUTA_CONTRAENTREGA', 'PENDIENTE', 'NO CONTESTO, VOLVER A LLAMAR', 'NO CONTESTO, DEVOLVER LLAMADA', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO')";
|
||||||
$params = [];
|
$params = [];
|
||||||
|
|
||||||
@ -107,15 +275,8 @@ try {
|
|||||||
$params[] = "%$search_query%";
|
$params[] = "%$search_query%";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($selected_month !== '') {
|
// Siempre: pedidos cuya fecha de entrega sea mañana
|
||||||
$sql .= " AND MONTH(p.created_at) = ?";
|
$sql .= " AND $date_condition";
|
||||||
$params[] = $selected_month;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($selected_year !== '') {
|
|
||||||
$sql .= " AND YEAR(p.created_at) = ?";
|
|
||||||
$params[] = $selected_year;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql .= " ORDER BY p.created_at DESC";
|
$sql .= " ORDER BY p.created_at DESC";
|
||||||
$stmt = $pdo->prepare($sql);
|
$stmt = $pdo->prepare($sql);
|
||||||
@ -141,10 +302,68 @@ try {
|
|||||||
|
|
||||||
foreach ($pedidos as $pedido) {
|
foreach ($pedidos as $pedido) {
|
||||||
[$provincia, $distrito] = splitProvinciaDistrito($pedido['codigo_rastreo'] ?? '');
|
[$provincia, $distrito] = splitProvinciaDistrito($pedido['codigo_rastreo'] ?? '');
|
||||||
$cantidad = (int)($pedido['cantidad'] ?? 0);
|
|
||||||
|
$cantidad_total = parseTotalQuantity($pedido['cantidad'] ?? 0);
|
||||||
$total = (float)($pedido['monto_total'] ?? 0);
|
$total = (float)($pedido['monto_total'] ?? 0);
|
||||||
$precio = $cantidad > 0 ? round($total / $cantidad, 2) : 0;
|
$unit_price_rounded = $cantidad_total > 0 ? round($total / $cantidad_total, 2) : 0;
|
||||||
$ean = getEansForProducts($pdo, extractProductNames($pedido));
|
|
||||||
|
$eanOut = '';
|
||||||
|
$cantidadOut = $cantidad_total;
|
||||||
|
$precioOut = $unit_price_rounded;
|
||||||
|
|
||||||
|
$details = extractProductDetailsWithQuantities($pedido);
|
||||||
|
|
||||||
|
$eanSegments = [];
|
||||||
|
$qtySegments = [];
|
||||||
|
$priceSegments = [];
|
||||||
|
|
||||||
|
if (!empty($details)) {
|
||||||
|
$names = [];
|
||||||
|
foreach ($details as $d) {
|
||||||
|
if (!empty($d['name'])) {
|
||||||
|
$names[] = (string)$d['name'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$eanMap = getEanMap($pdo, $names);
|
||||||
|
|
||||||
|
foreach ($details as $d) {
|
||||||
|
$name = (string)($d['name'] ?? '');
|
||||||
|
if ($name === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$qty = (int)($d['qty'] ?? 0);
|
||||||
|
if ($qty <= 0) {
|
||||||
|
$qty = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ean = trim((string)($eanMap[$name] ?? ''));
|
||||||
|
if ($ean === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$eanSegments[] = $ean;
|
||||||
|
$qtySegments[] = $qty;
|
||||||
|
$priceSegments[] = formatPriceSegment((float)$unit_price_rounded); // unit price repeated
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have segment data, format with pipes (no spaces)
|
||||||
|
if (count($eanSegments) > 1) {
|
||||||
|
$eanOut = implode('|', $eanSegments);
|
||||||
|
$cantidadOut = implode('|', $qtySegments);
|
||||||
|
$precioOut = implode('|', $priceSegments);
|
||||||
|
} elseif (count($eanSegments) === 1) {
|
||||||
|
$eanOut = $eanSegments[0];
|
||||||
|
$cantidadOut = $qtySegments[0] ?? $cantidad_total;
|
||||||
|
$precioOut = $unit_price_rounded;
|
||||||
|
} else {
|
||||||
|
// Fallback (keep old behavior, but with "|" formatting)
|
||||||
|
$eanOut = getEansForProducts($pdo, extractProductNames($pedido));
|
||||||
|
$cantidadOut = $cantidad_total;
|
||||||
|
$precioOut = $cantidad_total > 0 ? round($total / $cantidad_total, 2) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
$rows[] = [
|
$rows[] = [
|
||||||
(string)($pedido['nombre_completo'] ?? ''),
|
(string)($pedido['nombre_completo'] ?? ''),
|
||||||
@ -156,13 +375,27 @@ try {
|
|||||||
(string)($pedido['direccion_exacta'] ?? ''),
|
(string)($pedido['direccion_exacta'] ?? ''),
|
||||||
(string)($pedido['referencia_domicilio'] ?? ''),
|
(string)($pedido['referencia_domicilio'] ?? ''),
|
||||||
(string)($pedido['coordenadas'] ?? ''),
|
(string)($pedido['coordenadas'] ?? ''),
|
||||||
(string)$ean,
|
(string)$eanOut,
|
||||||
$cantidad,
|
$cantidadOut,
|
||||||
$precio,
|
$precioOut,
|
||||||
$total
|
$total
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Right-align certain columns (Codigo EAN, Cantidad, Precio, Total) in the exported Excel
|
||||||
|
$rightAlignedCols = [9, 10, 11, 12];
|
||||||
|
foreach ($rows as $rIdx => &$row) {
|
||||||
|
foreach ($rightAlignedCols as $cIdx) {
|
||||||
|
if (!array_key_exists($cIdx, $row)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (is_string($row[$cIdx]) && strpos($row[$cIdx], '<right>') !== false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$row[$cIdx] = '<right>' . (string)$row[$cIdx] . '</right>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset($row);
|
||||||
$filename = 'ruta_contraentrega_' . date('Y-m-d_H-i') . '.xlsx';
|
$filename = 'ruta_contraentrega_' . date('Y-m-d_H-i') . '.xlsx';
|
||||||
SimpleXLSXGen::fromArray($rows, 'Ruta Contraentrega')->downloadAs($filename);
|
SimpleXLSXGen::fromArray($rows, 'Ruta Contraentrega')->downloadAs($filename);
|
||||||
exit;
|
exit;
|
||||||
|
|||||||
@ -165,6 +165,8 @@ include 'layout_header.php';
|
|||||||
<?php if ($user_role === 'Administrador' || $user_role === 'Logistica'): ?>
|
<?php if ($user_role === 'Administrador' || $user_role === 'Logistica'): ?>
|
||||||
<a href="imprimir_rotulos_grandes.php?<?php echo http_build_query($_GET); ?>" class="btn btn-dark" target="_blank">Generar Todos los Rótulos</a>
|
<a href="imprimir_rotulos_grandes.php?<?php echo http_build_query($_GET); ?>" class="btn btn-dark" target="_blank">Generar Todos los Rótulos</a>
|
||||||
<a href="download_report.php" class="btn btn-success">Descargar Todos los Rotulados</a>
|
<a href="download_report.php" class="btn btn-success">Descargar Todos los Rotulados</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (in_array($user_role, ['Administrador', 'admin', 'Logistica', 'Control Logistico'], true)): ?>
|
||||||
<a href="download_shalom.php?type=terrestre" class="btn btn-primary">Descargar Shalom Terrestre</a>
|
<a href="download_shalom.php?type=terrestre" class="btn btn-primary">Descargar Shalom Terrestre</a>
|
||||||
<a href="download_shalom.php?type=aereo" class="btn btn-warning" style="background-color: #fd7e14; border-color: #fd7e14; color: white;">Descargar Shalom Aéreo</a>
|
<a href="download_shalom.php?type=aereo" class="btn btn-warning" style="background-color: #fd7e14; border-color: #fd7e14; color: white;">Descargar Shalom Aéreo</a>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|||||||
@ -30,6 +30,7 @@ $pedido = [
|
|||||||
'fecha_recojo' => '',
|
'fecha_recojo' => '',
|
||||||
'asesor_id' => $user_id, // Default to current user
|
'asesor_id' => $user_id, // Default to current user
|
||||||
'notas' => '',
|
'notas' => '',
|
||||||
|
'nota_adicional' => '',
|
||||||
];
|
];
|
||||||
|
|
||||||
$provinciasPorDepartamentoContraentrega = contraentregaProvinciasPorDepartamento();
|
$provinciasPorDepartamentoContraentrega = contraentregaProvinciasPorDepartamento();
|
||||||
@ -347,6 +348,11 @@ include 'layout_header.php';
|
|||||||
<textarea class="form-control" id="notas" name="notas" rows="3"><?php echo htmlspecialchars($pedido['notas']); ?></textarea>
|
<textarea class="form-control" id="notas" name="notas" rows="3"><?php echo htmlspecialchars($pedido['notas']); ?></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="nota_adicional" class="form-label">COLOCAR AQUI (DEDICATORIA O GRABADO), OBSERVACION DEL CLIENTE</label>
|
||||||
|
<textarea class="form-control" id="nota_adicional" name="nota_adicional" rows="2" placeholder="Ej.: Solicita dedicatoria para hija María, Ej.: Desea antes de las 4PM"><?php echo htmlspecialchars($pedido['nota_adicional'] ?? ''); ?></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="submit" class="btn btn-primary">Guardar Pedido Contraentrega</button>
|
<button type="submit" class="btn btn-primary">Guardar Pedido Contraentrega</button>
|
||||||
<a href="<?php echo htmlspecialchars($_SERVER['HTTP_REFERER'] ?? 'pedidos.php'); ?>" class="btn btn-secondary">Cancelar</a>
|
<a href="<?php echo htmlspecialchars($_SERVER['HTTP_REFERER'] ?? 'pedidos.php'); ?>" class="btn btn-secondary">Cancelar</a>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@ -102,6 +102,35 @@ $selected_month = $_GET['mes'] ?? '';
|
|||||||
$selected_year = $_GET['año'] ?? '';
|
$selected_year = $_GET['año'] ?? '';
|
||||||
$search_query = $_GET['q'] ?? '';
|
$search_query = $_GET['q'] ?? '';
|
||||||
|
|
||||||
|
$period = $_GET['period'] ?? '';
|
||||||
|
$date_condition = '';
|
||||||
|
$label_period = '';
|
||||||
|
|
||||||
|
if (!empty($period)) {
|
||||||
|
switch ($period) {
|
||||||
|
case 'today':
|
||||||
|
$date_condition = "DATE(p.created_at) = CURDATE()";
|
||||||
|
$label_period = "Hoy";
|
||||||
|
break;
|
||||||
|
case 'yesterday':
|
||||||
|
$date_condition = "DATE(p.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)";
|
||||||
|
$label_period = "Ayer";
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
$date_condition = "DATE(p.created_at) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
|
||||||
|
$label_period = "Últimos 7 días";
|
||||||
|
break;
|
||||||
|
case '15':
|
||||||
|
$date_condition = "DATE(p.created_at) >= DATE_SUB(CURDATE(), INTERVAL 15 DAY)";
|
||||||
|
$label_period = "Últimos 15 días";
|
||||||
|
break;
|
||||||
|
case 'month':
|
||||||
|
$date_condition = "MONTH(p.created_at) = MONTH(CURDATE()) AND YEAR(p.created_at) = YEAR(CURDATE())";
|
||||||
|
$label_period = "Este Mes";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$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 IN ('RUTA_CONTRAENTREGA', 'PENDIENTE', 'NO CONTESTO, VOLVER A LLAMAR', 'NO CONTESTO, DEVOLVER LLAMADA', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO')";
|
$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 IN ('RUTA_CONTRAENTREGA', 'PENDIENTE', 'NO CONTESTO, VOLVER A LLAMAR', 'NO CONTESTO, DEVOLVER LLAMADA', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO')";
|
||||||
$params = [];
|
$params = [];
|
||||||
|
|
||||||
@ -117,13 +146,17 @@ if (!empty($search_query)) {
|
|||||||
$params[] = "%$search_query%";
|
$params[] = "%$search_query%";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($selected_month)) {
|
if (!empty($date_condition)) {
|
||||||
$sql .= " AND MONTH(p.created_at) = ?";
|
$sql .= " AND $date_condition";
|
||||||
$params[] = $selected_month;
|
} else {
|
||||||
}
|
if (!empty($selected_month)) {
|
||||||
if (!empty($selected_year)) {
|
$sql .= " AND MONTH(p.created_at) = ?";
|
||||||
$sql .= " AND YEAR(p.created_at) = ?";
|
$params[] = $selected_month;
|
||||||
$params[] = $selected_year;
|
}
|
||||||
|
if (!empty($selected_year)) {
|
||||||
|
$sql .= " AND YEAR(p.created_at) = ?";
|
||||||
|
$params[] = $selected_year;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql .= " ORDER BY p.created_at DESC";
|
$sql .= " ORDER BY p.created_at DESC";
|
||||||
@ -237,7 +270,20 @@ include 'layout_header.php';
|
|||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto mt-4">
|
<?php
|
||||||
|
$qParam = !empty($search_query) ? '&q=' . urlencode((string)$search_query) : '';
|
||||||
|
?>
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="d-flex flex-wrap gap-2 align-items-center">
|
||||||
|
<span class="text-muted fw-semibold me-2">Fecha:</span>
|
||||||
|
<a href="ruta_contraentrega.php?period=today<?php echo htmlspecialchars($qParam, ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-outline-primary btn-sm <?php echo $period == 'today' ? 'active' : ''; ?>">Hoy</a>
|
||||||
|
<a href="ruta_contraentrega.php?period=yesterday<?php echo htmlspecialchars($qParam, ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-outline-primary btn-sm <?php echo $period == 'yesterday' ? 'active' : ''; ?>">Ayer</a>
|
||||||
|
<a href="ruta_contraentrega.php?period=7<?php echo htmlspecialchars($qParam, ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-outline-primary btn-sm <?php echo $period == '7' ? 'active' : ''; ?>">7 Días</a>
|
||||||
|
<a href="ruta_contraentrega.php?period=15<?php echo htmlspecialchars($qParam, ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-outline-primary btn-sm <?php echo $period == '15' ? 'active' : ''; ?>">15 Días</a>
|
||||||
|
<a href="ruta_contraentrega.php?period=month<?php echo htmlspecialchars($qParam, ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-outline-primary btn-sm <?php echo $period == 'month' ? 'active' : ''; ?>">Este Mes</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto mt-2">
|
||||||
<button type="submit" class="btn btn-info">Filtrar</button>
|
<button type="submit" class="btn btn-info">Filtrar</button>
|
||||||
<a href="ruta_contraentrega.php" class="btn btn-secondary">Limpiar</a>
|
<a href="ruta_contraentrega.php" class="btn btn-secondary">Limpiar</a>
|
||||||
<?php if (in_array($user_role, ['Administrador', 'admin', 'Asesor'], true)): ?>
|
<?php if (in_array($user_role, ['Administrador', 'admin', 'Asesor'], true)): ?>
|
||||||
@ -248,15 +294,13 @@ include 'layout_header.php';
|
|||||||
<?php
|
<?php
|
||||||
$excelParams = array_filter([
|
$excelParams = array_filter([
|
||||||
'q' => $search_query,
|
'q' => $search_query,
|
||||||
'mes' => $selected_month,
|
|
||||||
'año' => $selected_year,
|
|
||||||
], static function ($value) {
|
], static function ($value) {
|
||||||
return $value !== '' && $value !== null;
|
return $value !== '' && $value !== null;
|
||||||
});
|
});
|
||||||
$excelUrl = 'download_ruta_contraentrega.php' . (!empty($excelParams) ? '?' . http_build_query($excelParams) : '');
|
$excelUrl = 'download_ruta_contraentrega.php' . (!empty($excelParams) ? '?' . http_build_query($excelParams) : '');
|
||||||
?>
|
?>
|
||||||
<a href="<?php echo htmlspecialchars($excelUrl); ?>" class="btn btn-success">
|
<a href="<?php echo htmlspecialchars($excelUrl); ?>" class="btn btn-success">
|
||||||
<i class="fas fa-file-excel me-1"></i> Descargar Excel
|
<i class="fas fa-file-excel me-1"></i> Descargar Excel (Mañana)
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -283,6 +327,7 @@ include 'layout_header.php';
|
|||||||
<th style="width: 140px;">Distrito</th>
|
<th style="width: 140px;">Distrito</th>
|
||||||
<th style="width: 150px;">Coordenadas</th>
|
<th style="width: 150px;">Coordenadas</th>
|
||||||
<th style="width: 200px;">Producto</th>
|
<th style="width: 200px;">Producto</th>
|
||||||
|
<th style="width: 320px;">Dedicatoria / Obs.</th>
|
||||||
<th style="width: 80px;">Cant.</th>
|
<th style="width: 80px;">Cant.</th>
|
||||||
<?php if ($user_role !== 'Logistica'): ?>
|
<?php if ($user_role !== 'Logistica'): ?>
|
||||||
<th style="width: 100px;">Total</th>
|
<th style="width: 100px;">Total</th>
|
||||||
@ -354,6 +399,16 @@ include 'layout_header.php';
|
|||||||
<td><?php echo htmlspecialchars($distritoPedido); ?></td>
|
<td><?php echo htmlspecialchars($distritoPedido); ?></td>
|
||||||
<td><?php echo htmlspecialchars($pedido['coordenadas'] ?? 'N/A'); ?></td>
|
<td><?php echo htmlspecialchars($pedido['coordenadas'] ?? 'N/A'); ?></td>
|
||||||
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
|
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
|
||||||
|
<?php
|
||||||
|
$nota_adicional = trim((string)($pedido['nota_adicional'] ?? ''));
|
||||||
|
if ($nota_adicional === '') {
|
||||||
|
$nota_adicional = trim((string)($pedido['descargo'] ?? ''));
|
||||||
|
}
|
||||||
|
$nota_adicional_display = $nota_adicional !== '' ? $nota_adicional : 'N/A';
|
||||||
|
?>
|
||||||
|
<td style="max-width: 320px; white-space: normal; word-break: break-word;">
|
||||||
|
<?php echo htmlspecialchars($nota_adicional_display); ?>
|
||||||
|
</td>
|
||||||
<td><?php echo htmlspecialchars($pedido['cantidad']); ?></td>
|
<td><?php echo htmlspecialchars($pedido['cantidad']); ?></td>
|
||||||
<?php if ($user_role !== 'Logistica'): ?>
|
<?php if ($user_role !== 'Logistica'): ?>
|
||||||
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
|
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
|
||||||
|
|||||||
@ -100,6 +100,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$numero_operacion = trim($_POST['numero_operacion'] ?? '');
|
$numero_operacion = trim($_POST['numero_operacion'] ?? '');
|
||||||
$banco = trim($_POST['banco'] ?? '');
|
$banco = trim($_POST['banco'] ?? '');
|
||||||
$notas = trim($_POST['notas'] ?? '');
|
$notas = trim($_POST['notas'] ?? '');
|
||||||
|
$nota_adicional = trim($_POST['nota_adicional'] ?? '');
|
||||||
|
|
||||||
|
// Campo combinado del formulario: (Dedicatoria o grabado) + Observación del cliente
|
||||||
|
// Guardamos en ambas columnas para mantener compatibilidad con el resto del sistema.
|
||||||
|
$descargo = $nota_adicional;
|
||||||
|
|
||||||
// Normalizar Paquete: el selector "Seleccionar" llega como cadena vacía,
|
// Normalizar Paquete: el selector "Seleccionar" llega como cadena vacía,
|
||||||
// pero la columna ENUM permite NULL y no permite ''.
|
// pero la columna ENUM permite NULL y no permite ''.
|
||||||
@ -175,6 +180,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
'banco' => $banco,
|
'banco' => $banco,
|
||||||
'monto_debe' => $monto_debe,
|
'monto_debe' => $monto_debe,
|
||||||
'notas' => $notas,
|
'notas' => $notas,
|
||||||
|
'nota_adicional' => $nota_adicional,
|
||||||
|
'descargo' => $descargo,
|
||||||
'seguimiento' => $seguimiento,
|
'seguimiento' => $seguimiento,
|
||||||
'fecha_entrega' => $fecha_entrega,
|
'fecha_entrega' => $fecha_entrega,
|
||||||
'tipo_paquete' => $tipo_paquete,
|
'tipo_paquete' => $tipo_paquete,
|
||||||
@ -204,6 +211,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
"banco = :banco",
|
"banco = :banco",
|
||||||
"monto_debe = :monto_debe",
|
"monto_debe = :monto_debe",
|
||||||
"notas = :notas",
|
"notas = :notas",
|
||||||
|
"nota_adicional = :nota_adicional",
|
||||||
|
"descargo = :descargo",
|
||||||
"seguimiento = :seguimiento",
|
"seguimiento = :seguimiento",
|
||||||
"fecha_entrega = :fecha_entrega",
|
"fecha_entrega = :fecha_entrega",
|
||||||
"estado = :estado",
|
"estado = :estado",
|
||||||
@ -227,8 +236,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$params['asesor_id'] = $_SESSION['user_id'];
|
$params['asesor_id'] = $_SESSION['user_id'];
|
||||||
$params['estado'] = $_POST['estado'] ?? 'RUTA_CONTRAENTREGA';
|
$params['estado'] = $_POST['estado'] ?? 'RUTA_CONTRAENTREGA';
|
||||||
|
|
||||||
$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, tipo_paquete";
|
$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, nota_adicional, descargo, estado, seguimiento, fecha_entrega, tipo_paquete";
|
||||||
$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, :tipo_paquete";
|
$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, :nota_adicional, :descargo, :estado, :seguimiento, :fecha_entrega, :tipo_paquete";
|
||||||
|
|
||||||
$sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)";
|
$sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)";
|
||||||
$stmt = $pdo->prepare($sql);
|
$stmt = $pdo->prepare($sql);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user