161 lines
5.9 KiB
PHP
161 lines
5.9 KiB
PHP
<?php
|
|
|
|
function cc_test_ensure_column(PDO $pdo, string $table, string $column, string $definition): void
|
|
{
|
|
static $cache = [];
|
|
$key = $table . '.' . $column;
|
|
if (isset($cache[$key])) {
|
|
return;
|
|
}
|
|
|
|
$stmt = $pdo->prepare("SHOW COLUMNS FROM `{$table}` LIKE ?");
|
|
$stmt->execute([$column]);
|
|
if (!$stmt->fetch()) {
|
|
$pdo->exec("ALTER TABLE `{$table}` ADD COLUMN `{$column}` {$definition}");
|
|
}
|
|
|
|
$cache[$key] = true;
|
|
}
|
|
|
|
function cc_test_ensure_tracking_table(PDO $pdo): void
|
|
{
|
|
static $checked = false;
|
|
if ($checked) {
|
|
return;
|
|
}
|
|
|
|
$pdo->exec("CREATE TABLE IF NOT EXISTS `callcenter_test_tracking` (
|
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`source_key` CHAR(40) NOT NULL,
|
|
`estado` VARCHAR(40) NOT NULL DEFAULT 'POR LLAMAR',
|
|
`nota_seguimiento` TEXT NULL,
|
|
`user_id` INT NULL,
|
|
`direccion` TEXT NULL,
|
|
`referencia` TEXT NULL,
|
|
`sede` VARCHAR(120) NULL,
|
|
`ciudad` VARCHAR(120) NULL,
|
|
`distrito` VARCHAR(120) NULL,
|
|
`dni` VARCHAR(40) NULL,
|
|
`observaciones` TEXT NULL,
|
|
`proxima_llamada_at` DATETIME NULL,
|
|
`fecha_entrega_programada` DATE NULL,
|
|
`ultima_gestion_at` DATETIME NULL,
|
|
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uniq_callcenter_test_tracking_source_key` (`source_key`),
|
|
KEY `idx_callcenter_test_tracking_estado` (`estado`),
|
|
KEY `idx_callcenter_test_tracking_proxima` (`proxima_llamada_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
|
|
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'direccion', 'TEXT NULL AFTER `user_id`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'referencia', 'TEXT NULL AFTER `direccion`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'sede', 'VARCHAR(120) NULL AFTER `referencia`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'ciudad', 'VARCHAR(120) NULL AFTER `sede`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'distrito', 'VARCHAR(120) NULL AFTER `ciudad`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'dni', 'VARCHAR(40) NULL AFTER `distrito`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'observaciones', 'TEXT NULL AFTER `dni`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'proxima_llamada_at', 'DATETIME NULL AFTER `observaciones`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'fecha_entrega_programada', 'DATE NULL AFTER `proxima_llamada_at`');
|
|
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'ultima_gestion_at', 'DATETIME NULL AFTER `fecha_entrega_programada`');
|
|
|
|
$checked = true;
|
|
}
|
|
|
|
function cc_test_ensure_historial_llamadas_table(PDO $pdo): void
|
|
{
|
|
static $checked = false;
|
|
if ($checked) {
|
|
return;
|
|
}
|
|
|
|
$pdo->exec("CREATE TABLE IF NOT EXISTS `historial_llamadas` (
|
|
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
`pedido_id` VARCHAR(80) NOT NULL,
|
|
`asesor_id` INT UNSIGNED NOT NULL,
|
|
`resultado` VARCHAR(120) NOT NULL,
|
|
`observacion` TEXT NULL,
|
|
`fecha_llamada` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX `idx_historial_llamadas_pedido` (`pedido_id`),
|
|
INDEX `idx_historial_llamadas_asesor` (`asesor_id`),
|
|
INDEX `idx_historial_llamadas_fecha` (`fecha_llamada`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
|
|
|
|
$checked = true;
|
|
}
|
|
|
|
function cc_test_valid_states(): array
|
|
{
|
|
return [
|
|
'POR LLAMAR',
|
|
'DEVOLVER LLAMADA',
|
|
'OBSERVADO',
|
|
'SE ENVIO NUMERO DE CUENTA',
|
|
'CONFIRMADO CONTRAENTREGA',
|
|
'CONFIRMADO ENVIO',
|
|
'CANCELADO',
|
|
'REPETIDO',
|
|
];
|
|
}
|
|
|
|
function cc_test_open_states(): array
|
|
{
|
|
return ['POR LLAMAR', 'DEVOLVER LLAMADA', 'OBSERVADO', 'SE ENVIO NUMERO DE CUENTA'];
|
|
}
|
|
|
|
function cc_test_confirmed_states(): array
|
|
{
|
|
return ['CONFIRMADO CONTRAENTREGA', 'CONFIRMADO ENVIO', 'CONFIRMADO FECHA', 'CONTRAENTREGA CONFIRMADO'];
|
|
}
|
|
|
|
function cc_test_closed_states(): array
|
|
{
|
|
return ['CANCELADO', 'REPETIDO'];
|
|
}
|
|
|
|
function cc_test_requires_delivery_date(string $estado): bool
|
|
{
|
|
return in_array($estado, ['CONFIRMADO CONTRAENTREGA', 'CONFIRMADO FECHA'], true);
|
|
}
|
|
|
|
function cc_test_state_label(string $estado): string
|
|
{
|
|
return match ($estado) {
|
|
'SE ENVIO NUMERO DE CUENTA' => 'SE ENVIÓ NÚMERO DE CUENTA',
|
|
'CONFIRMADO CONTRAENTREGA' => 'CONFIRMADO CONTRAENTREGA 📅',
|
|
'CONFIRMADO CONTRAENTREGA FECHA' => 'CONFIRMADO CONTRAENTREGA 📅',
|
|
'CONFIRMADO FECHA' => 'CONFIRMADO CONTRAENTREGA 📅',
|
|
'CONFIRMADO ENVIO' => 'CONFIRMADO ENVIO',
|
|
'CONTRAENTREGA CONFIRMADO' => 'CONFIRMADO ENVIO',
|
|
'REPETIDO' => 'REPETIDO',
|
|
'ENVIO REPETIDO' => 'REPETIDO',
|
|
default => $estado,
|
|
};
|
|
}
|
|
|
|
function cc_test_table_exists(PDO $pdo, string $tableName): bool
|
|
{
|
|
static $cache = [];
|
|
if (array_key_exists($tableName, $cache)) {
|
|
return $cache[$tableName];
|
|
}
|
|
|
|
$stmt = $pdo->prepare('SHOW TABLES LIKE ?');
|
|
$stmt->execute([$tableName]);
|
|
$cache[$tableName] = (bool) $stmt->fetchColumn();
|
|
return $cache[$tableName];
|
|
}
|
|
|
|
function cc_test_fetch_historial(PDO $pdo, string $pedidoId): array
|
|
{
|
|
if (cc_test_table_exists($pdo, 'usuarios')) {
|
|
$stmt = $pdo->prepare("SELECT h.*, u.nombre as asesor FROM historial_llamadas h LEFT JOIN usuarios u ON h.asesor_id = u.id WHERE h.pedido_id = ? ORDER BY h.fecha_llamada DESC");
|
|
$stmt->execute([$pedidoId]);
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
$stmt = $pdo->prepare("SELECT h.*, NULL as asesor FROM historial_llamadas h WHERE h.pedido_id = ? ORDER BY h.fecha_llamada DESC");
|
|
$stmt->execute([$pedidoId]);
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|