fix(privacy): anonymize personal data in examples, placeholders and mock records with fictional information

This commit is contained in:
AI Bot 2026-10-14 10:47:50 -05:00
parent ae6a74c140
commit c0a432426e
25 changed files with 78 additions and 78 deletions

View File

@ -143,7 +143,7 @@ export default function AdminSettingsPage() {
<input
type="tel"
required
placeholder="ej: 3167455877"
placeholder="ej: 3001234567"
value={settings.phone}
onChange={(e) => handlePhoneChange(e.target.value)}
className="w-full bg-slate-950 border border-slate-800 rounded-xl pl-9 pr-3.5 py-2.5 text-emerald-300 font-bold outline-hidden focus:border-emerald-400"

View File

@ -507,7 +507,7 @@ export default function AdminSuppliersPage() {
<input
type="tel"
required
placeholder="ej: 573167455877"
placeholder="ej: 573001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-slate-950 border border-slate-800 rounded-xl px-3.5 py-2.5 text-emerald-300 outline-hidden focus:border-emerald-400 font-mono font-bold"

View File

@ -628,7 +628,7 @@ export default function AdminUsersPage() {
<input
type="tel"
required
placeholder="3167455877"
placeholder="3001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-white outline-hidden focus:border-purple-400"

View File

@ -308,7 +308,7 @@ ${order.depositAmount > 0 ? `⚡ *Separación:* ${formatCOP(order.depositAmount)
<input
type="tel"
required
placeholder="Ej. 3167455877"
placeholder="Ej. 3001234567"
value={customerPhone}
onChange={(e) => setCustomerPhone(e.target.value)}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden"

View File

@ -578,7 +578,7 @@ export const AuthModal: React.FC = () => {
<input
type="text"
required
placeholder="Ej: 3167455877 o carlos.andres.lasso@gmail.com"
placeholder="Ej: 3001234567 o usuario@ejemplo.com"
value={identifier}
onChange={(e) => setIdentifier(e.target.value)}
className="w-full bg-neutral-900 border border-neutral-800 rounded-2xl px-4 py-3 text-white text-sm outline-hidden focus:border-purple-500 transition-all"
@ -705,7 +705,7 @@ export const AuthModal: React.FC = () => {
<input
type="tel"
required
placeholder="3167455877"
placeholder="3001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-neutral-900 border border-neutral-800 rounded-xl px-3 py-2 text-white outline-hidden focus:border-purple-500"

View File

@ -131,7 +131,7 @@
android:layout_height="46dp"
android:layout_marginTop="6dp"
android:background="@drawable/bg_search_input"
android:hint="Ej. 3167455877"
android:hint="Ej. 3001234567"
android:inputType="phone"
android:maxLength="10"
android:paddingHorizontal="14dp"

View File

@ -97,7 +97,7 @@
android:layout_height="46dp"
android:layout_marginTop="4dp"
android:background="@drawable/bg_search_input"
android:hint="Ej. 3167455877"
android:hint="Ej. 3001234567"
android:inputType="phone"
android:maxLength="10"
android:paddingHorizontal="14dp"

View File

@ -329,7 +329,7 @@ export default function MisPedidosPage() {
type="tel"
value={phoneSearch}
onChange={(e) => setPhoneSearch(e.target.value)}
placeholder="Ingresa tu número (ej: 316 745 5877)"
placeholder="Ingresa tu número (ej: 300 123 4567)"
className="w-full bg-neutral-950 border border-neutral-800 focus:border-purple-500 rounded-2xl pl-10 pr-4 py-2.5 text-xs sm:text-sm text-white placeholder-neutral-500 focus:outline-none transition-all"
/>
</div>

View File

@ -202,7 +202,7 @@ export function WhatsAppOrderLinkModal({
type="text"
value={customerPhone}
onChange={(e) => setCustomerPhone(e.target.value)}
placeholder="Ej: 316 745 5877"
placeholder="Ej: 300 123 4567"
className="w-full bg-neutral-900 border border-neutral-800 focus:border-emerald-500 rounded-xl px-3.5 py-2 text-xs text-white placeholder-neutral-500 focus:outline-none"
/>
</div>

View File

@ -102,7 +102,7 @@ Estamos alistando tu paquete. Te enviaremos el número de guía o notificación
{ key: 'tienda_nombre', label: 'Nombre de Tienda', example: 'DripZone Luxury', description: 'Nombre comercial configurado' },
{ key: 'orden_id', label: 'No. de Orden', example: 'ORD-9842', description: 'Identificador único del pedido' },
{ key: 'cliente_nombre', label: 'Nombre del Cliente', example: 'Cliente DripZone', description: 'Nombre registrado' },
{ key: 'cliente_telefono', label: 'Teléfono Cliente', example: '3167455877', description: 'Celular del comprador' },
{ key: 'cliente_telefono', label: 'Teléfono Cliente', example: '3001234567', description: 'Celular del comprador' },
{ key: 'cliente_direccion', label: 'Dirección de Entrega', example: 'Calle 5 # 24-80, Apto 302', description: 'Dirección física' },
{ key: 'cliente_ciudad', label: 'Ciudad Destino', example: 'Cali', description: 'Municipio de despacho' },
{ key: 'articulos_resumen', label: 'Lista de Artículos', example: '👟 Nike Air Force 1 (Talla 40) x1 - $125.000 COP', description: 'Pares solicitados' },
@ -158,7 +158,7 @@ Estamos alistando tu paquete. Te enviaremos el número de guía o notificación
{ key: 'tienda_nombre', label: 'Nombre de Tienda', example: 'DripZone', description: 'Nombre de la marca' },
{ key: 'orden_id', label: 'No. Orden', example: 'ORD-9842', description: 'ID de la orden' },
{ key: 'cliente_nombre', label: 'Nombre Cliente', example: 'Cliente DripZone', description: 'Nombre' },
{ key: 'cliente_telefono', label: 'Teléfono', example: '3167455877', description: 'Teléfono' },
{ key: 'cliente_telefono', label: 'Teléfono', example: '3001234567', description: 'Teléfono' },
{ key: 'cliente_direccion', label: 'Dirección', example: 'Av 6N # 28N-12', description: 'Dirección' },
{ key: 'cliente_ciudad', label: 'Ciudad', example: 'Cali', description: 'Ciudad' },
{ key: 'articulos_resumen', label: 'Artículos', example: '• Jordan 4 Retro (Talla 41) x1 = $140.000 COP', description: 'Lista' },
@ -243,7 +243,7 @@ Estamos alistando tu paquete. Te enviaremos el número de guía o notificación
defaultContent: `Hola {tienda_nombre}! 👋 Quiero consultar la disponibilidad de unas zapatillas para despacho contraentrega en 24 horas.`,
availableVariables: [
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Nombre' },
{ key: 'telefono_tienda', label: 'Teléfono Tienda', example: '573167455877', description: 'WhatsApp oficial' },
{ key: 'telefono_tienda', label: 'Teléfono Tienda', example: '573001234567', description: 'WhatsApp oficial' },
{ key: 'ciudad_tienda', label: 'Ciudad Sede', example: 'Cali, Colombia', description: 'Ubicación' },
],
},

View File

@ -71,15 +71,15 @@ def main():
print("[4/4] Enviando notificación de Pacific Trans GO a WhatsApp (+57 316 745 5877)...", flush=True)
text_msg = (
"👑 *Pacific Trans GO: Autenticación Exclusiva por Celular OTP & Token Persistente de 24 Horas*\n\n"
"¡Hola Carlos! Se ha completado la actualización solicitada en el sistema de acceso y seguridad:\n\n"
"👑 *Pacific Trans GO: Actualización de Privacidad & Datos de Ejemplo Ficticios*\n\n"
"¡Hola Carlos! Se ha completado la actualización solicitada en la plataforma:\n\n"
"📱 *App Oficial:* `Pacific Trans GO`\n"
"📦 *Archivo APK:* `PacifictransGo.apk` (APK Nativo e Independiente)\n"
"📦 *Archivo APK:* `PacifictransGo.apk`\n"
"🆔 *Package ID:* `co.pacifictrans.go`\n\n"
"⚡ *Novedades de la Versión:*\n"
"• 🚫 *Acceso Rápido por Roles Eliminado:* Se eliminaron completamente todos los selectores y accesos rápidos por rol. Nadie puede simular ni ingresar a perfiles sin verificar identidad.\n"
"• 📱 *Autenticación Directa vía Celular + OTP:* Los usuarios únicamente ingresan su número de celular y validan el código OTP de 6 dígitos recibido al instante por WhatsApp.\n"
"• ⏱️ *Token de Sesión Persistente por 24 Horas:* Tras verificar el código OTP, se genera un token criptográfico firmado (HMAC-SHA256) con vigencia exacta de 24 horas. El usuario permanece autenticado automáticamente al cerrar o recargar la app/web durante ese lapso. Superadas las 24 horas, la sesión expira de forma segura exigiendo un nuevo código OTP.\n\n"
"• 🔒 *Privacidad & Anonimización de Datos:* Se reemplazó toda información personal (nombres, números telefónicos y correos de ejemplo o datos de prueba/placeholders) en interfaces públicas, modales, recibos de prueba y cajas de texto por datos totalmente ficticios y profesionales.\n"
"• 📱 *Autenticación Directa vía Celular + OTP:* Acceso exclusivo por número de teléfono móvil validado por código OTP instantáneo.\n"
"• ⏱️ *Token de Sesión Persistente por 24 Horas:* Persistencia automática durante 24 horas continuas.\n\n"
f"🔗 *Enlace de Descarga Directa:*\n👉 {APK_URL}"
)

View File

@ -143,7 +143,7 @@ export default function AdminSettingsPage() {
<input
type="tel"
required
placeholder="ej: 3167455877"
placeholder="ej: 3001234567"
value={settings.phone}
onChange={(e) => handlePhoneChange(e.target.value)}
className="w-full bg-zinc-950 border border-zinc-800 rounded-xl pl-9 pr-3.5 py-2.5 text-emerald-300 font-bold outline-hidden focus:border-emerald-400"

View File

@ -507,7 +507,7 @@ export default function AdminSuppliersPage() {
<input
type="tel"
required
placeholder="ej: 573167455877"
placeholder="ej: 573001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-zinc-950 border border-zinc-800 rounded-xl px-3.5 py-2.5 text-emerald-300 outline-hidden focus:border-emerald-400 font-mono font-bold"

View File

@ -628,7 +628,7 @@ export default function AdminUsersPage() {
<input
type="tel"
required
placeholder="3167455877"
placeholder="3001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-white outline-hidden focus:border-purple-400"

View File

@ -308,7 +308,7 @@ ${order.depositAmount > 0 ? `⚡ *Separación:* ${formatCOP(order.depositAmount)
<input
type="tel"
required
placeholder="Ej. 3167455877"
placeholder="Ej. 3001234567"
value={customerPhone}
onChange={(e) => setCustomerPhone(e.target.value)}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden"

View File

@ -578,7 +578,7 @@ export const AuthModal: React.FC = () => {
<input
type="text"
required
placeholder="Ej: 3167455877 o carlos.andres.lasso@gmail.com"
placeholder="Ej: 3001234567 o usuario@ejemplo.com"
value={identifier}
onChange={(e) => setIdentifier(e.target.value)}
className="w-full bg-neutral-900 border border-neutral-800 rounded-2xl px-4 py-3 text-white text-sm outline-hidden focus:border-purple-500 transition-all"
@ -705,7 +705,7 @@ export const AuthModal: React.FC = () => {
<input
type="tel"
required
placeholder="3167455877"
placeholder="3001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-neutral-900 border border-neutral-800 rounded-xl px-3 py-2 text-white outline-hidden focus:border-purple-500"

View File

@ -95,7 +95,7 @@
</div>
<div class="notif-footer">
<a href="https://wa.me/573167455877" target="_blank" id="notif-wa-link" style="color: var(--accent-cyan); text-decoration: none; font-size: 0.8rem; display: flex; align-items: center; justify-content: center; gap: 0.35rem;">
<a href="#" target="_blank" id="notif-wa-link" style="color: var(--accent-cyan); text-decoration: none; font-size: 0.8rem; display: flex; align-items: center; justify-content: center; gap: 0.35rem;">
<span>💬 Contactar a Central de Soporte WhatsApp</span>
</a>
</div>
@ -679,7 +679,7 @@
<div style="display: flex; align-items: center; gap: 0.6rem; margin-top: 0.35rem; flex-wrap: wrap;">
<span class="admin-status-indicator">● Radar GPS Conectado</span>
<span class="admin-wa-badge" id="admin-wa-group-badge">👥 Grupo: Pacific Trans Notificaciones</span>
<span style="font-size: 0.8rem; color: #94a3b8;">Admin: <strong style="color: #fff;" id="admin-user-name">Carlos Almeira (SuperAdmin)</strong></span>
<span style="font-size: 0.8rem; color: #94a3b8;">Admin: <strong style="color: #fff;" id="admin-user-name">Administrador General</strong></span>
</div>
</div>
</div>
@ -812,8 +812,8 @@
<div class="grid-2col" style="gap: 1.25rem; margin-bottom: 0;">
<div class="form-group" style="margin-bottom: 0;">
<label class="form-label" for="cfg-admin-phone">Número de WhatsApp Administrador (+57)</label>
<input type="tel" class="form-input" id="cfg-admin-phone" value="573167455877" placeholder="573167455877" required>
<span style="font-size: 0.75rem; color: var(--text-dim); margin-top: 4px; display: block;">Número personal de Carlos para alertas prioritarias directas.</span>
<input type="tel" class="form-input" id="cfg-admin-phone" value="" placeholder="Ej: 573001234567" required>
<span style="font-size: 0.75rem; color: var(--text-dim); margin-top: 4px; display: block;">Número de WhatsApp oficial para alertas prioritarias directas.</span>
</div>
<div class="form-group" style="margin-bottom: 0;">
<label class="form-label" for="cfg-admin-name">Nombre del Canal de Atención</label>
@ -1191,7 +1191,7 @@
<strong style="color: #fff; font-size: 1.15rem;">Gestión del Equipo de Administradores & Control de Acceso</strong>
</div>
<p style="color: #cbd5e1; font-size: 0.88rem; margin: 0; max-width: 720px;">
El Superadministrador <strong>Carlos Almeira (+57 316 745 5877)</strong> es la autoridad máxima permanente e inmutable. Desde aquí puedes registrar nuevos administradores u operadores, actualizar sus permisos, activarlos o inactivarlos, o removerlos del sistema.
El <strong>Superadministrador Principal</strong> es la autoridad máxima permanente e inmutable. Desde aquí puedes registrar nuevos administradores u operadores, actualizar sus permisos, activarlos o inactivarlos, o removerlos del sistema.
</p>
</div>
<div>
@ -1205,7 +1205,7 @@
<div class="financial-summary-grid" style="margin-bottom: 1.75rem;">
<div class="fin-metric-card" style="border-top: 3px solid #fbbf24;">
<div class="fin-metric-label">Superadministrador</div>
<div class="fin-metric-val" style="color: #fbbf24; font-size: 1.15rem; margin-top: 0.35rem;">Carlos Almeira</div>
<div class="fin-metric-val" style="color: #fbbf24; font-size: 1.15rem; margin-top: 0.35rem;">Superadministrador</div>
<span style="font-size: 0.72rem; color: #34d399;">🔒 Permanente e Inmutable</span>
</div>
<div class="fin-metric-card" style="border-top: 3px solid #38bdf8;">
@ -1346,7 +1346,7 @@
</h2>
<div style="display: flex; align-items: center; gap: 0.6rem; margin-top: 0.35rem; flex-wrap: wrap;">
<span class="admin-status-indicator">● Chofer Activo</span>
<span style="font-size: 0.8rem; color: #94a3b8;">Conductor: <strong style="color: #fff;" id="driver-topbar-name">Carlos Almeira (WLZ-890)</strong></span>
<span style="font-size: 0.8rem; color: #94a3b8;">Conductor: <strong style="color: #fff;" id="driver-topbar-name">Mario Fernando Gómez (WLZ-890)</strong></span>
</div>
</div>
</div>
@ -1393,7 +1393,7 @@
<span class="wallet-balance-currency">COP</span>
</div>
<div style="color: #cbd5e1; font-size: 0.88rem; display: flex; align-items: center; gap: 0.5rem;">
<span>🚗 Conductor: <strong id="driver-wallet-name" style="color: #fff;">Carlos Almeira</strong></span>
<span>🚗 Conductor: <strong id="driver-wallet-name" style="color: #fff;">Mario Fernando Gómez</strong></span>
<span>•</span>
<span>Placa: <strong id="driver-wallet-plate" style="color: var(--accent-cyan);">WLZ-890</strong></span>
</div>
@ -1476,7 +1476,7 @@
<div class="form-group">
<label class="form-label" for="driver-breb-key-value">Valor de la Llave Bre-B</label>
<input type="text" class="form-input" id="driver-breb-key-value" value="3167455877" placeholder="Ej: 3167455877">
<input type="text" class="form-input" id="driver-breb-key-value" value="3109876543" placeholder="Ej: 3109876543">
</div>
<div class="form-group">
@ -1609,7 +1609,7 @@
<strong style="color: #fff;">Pacific Trans GO</strong> — Transporte Especial Cali - Buenaventura
</div>
<div>
Atención y Soporte WhatsApp: <a id="footer-support-link" href="https://wa.me/573167455877" target="_blank" style="color: var(--accent-cyan); text-decoration: none;"><span id="footer-support-phone">+57 316 745 5877</span></a>
Atención y Soporte WhatsApp: <a id="footer-support-link" href="#" target="_blank" style="color: var(--accent-cyan); text-decoration: none;"><span id="footer-support-phone">Central de Soporte</span></a>
</div>
<div>
© 2026 Almeira Group. Todos los derechos reservados.
@ -1641,7 +1641,7 @@
<label class="form-label" for="auth-input-phone" style="font-size: 0.95rem; font-weight: 700; color: #fff; margin-bottom: 0.5rem;">
Número de Celular / WhatsApp (+57)
</label>
<input type="tel" class="form-input" id="auth-input-phone" placeholder="Ej: 316 745 5877 o 300 123 4567" required autofocus style="font-size: 1.15rem; font-weight: 700; text-align: center; letter-spacing: 0.05em; padding: 0.85rem;">
<input type="tel" class="form-input" id="auth-input-phone" placeholder="Ej: 300 123 4567 o 312 987 6543" required autofocus style="font-size: 1.15rem; font-weight: 700; text-align: center; letter-spacing: 0.05em; padding: 0.85rem;">
<span style="font-size: 0.76rem; color: var(--text-dim); margin-top: 6px; display: block;">
Recibirás un código de 6 dígitos al instante en tu WhatsApp para ingresar de forma segura.
</span>
@ -1862,11 +1862,11 @@
</div>
<div class="receipt-row">
<span class="receipt-label">Llave Bre-B Destino:</span>
<span class="receipt-val" id="modal-receipt-key">+57 316 745 5877</span>
<span class="receipt-val" id="modal-receipt-key">+57 310 987 6543</span>
</div>
<div class="receipt-row">
<span class="receipt-label">Titular de la Cuenta:</span>
<span class="receipt-val" id="modal-receipt-owner">Carlos Almeira</span>
<span class="receipt-val" id="modal-receipt-owner">Mario Fernando Gómez</span>
</div>
<div class="receipt-row">
<span class="receipt-label">Costo de Transferencia:</span>

View File

@ -493,7 +493,7 @@ function initAuthSystem() {
}
if (!cleanPhone || cleanPhone.length < 10) {
showError(reqError, 'Ingresa un número de celular válido (Ej: 316 745 5877).');
showError(reqError, 'Ingresa un número de celular válido (Ej: 300 123 4567).');
return;
}
@ -2278,8 +2278,8 @@ function initSettlementsAndBreBSystem() {
if (authEl) authEl.textContent = receipt.codigoAutorizacion || 'AUT-98E1A4';
if (cycleEl) cycleEl.textContent = receipt.cicloCompensacion || 'Compensación Inmediata 24/7 (BanRep)';
if (bankEl) bankEl.textContent = receipt.entidadDestino || 'Bancolombia';
if (keyEl) keyEl.textContent = receipt.llaveDestino || '+57 316 745 5877';
if (ownerEl) ownerEl.textContent = receipt.titularDestino || 'Carlos Almeira';
if (keyEl) keyEl.textContent = receipt.llaveDestino || '+57 310 987 6543';
if (ownerEl) ownerEl.textContent = receipt.titularDestino || 'Mario Fernando Gómez';
brebModal.style.display = 'flex';
@ -2372,7 +2372,7 @@ function initSettlementsAndBreBSystem() {
// Generar opción demo si la BD aún no tiene viajes activos creados
const optDemo = document.createElement('option');
optDemo.value = 'DEMO_TRIP_001';
optDemo.textContent = 'Viaje Planificado #048291 (Cali ➔ Buenaventura) - Carlos Almeira (WLZ-890)';
optDemo.textContent = 'Viaje Planificado #048291 (Cali ➔ Buenaventura) - Mario Fernando Gómez (WLZ-890)';
selectTrip.appendChild(optDemo);
loadTripSettlement('DEMO_TRIP_001');
}
@ -2430,11 +2430,11 @@ function initSettlementsAndBreBSystem() {
fechaSalida: new Date(Date.now() + 3600000),
conductor: {
id: defaultDriverId,
nombre: 'Carlos Almeira',
telefono: '573167455877',
nombre: 'Mario Fernando Gómez',
telefono: '573109876543',
placa: 'WLZ-890',
modelo: 'Renault Duster 2024',
llaveBreB: { tipo: 'CELULAR', valor: '3167455877', bancoDestino: 'Bancolombia', titularNombre: 'Carlos Almeira' }
llaveBreB: { tipo: 'CELULAR', valor: '3109876543', bancoDestino: 'Bancolombia', titularNombre: 'Mario Fernando Gómez' }
},
tarifaPorPasajero: 35000,
tarifaTotal: 140000,
@ -2522,12 +2522,12 @@ function initSettlementsAndBreBSystem() {
${estadoBadgeHtml}
</div>
<div style="font-size: 0.85rem; color: #94a3b8;">
Salida Programada: <strong style="color: #fff;">${fechaSalidaStr}</strong> • Conductor: <strong style="color: var(--accent-cyan);">${s.conductor?.nombre || 'Carlos Almeira'} (${s.conductor?.placa || 'WLZ-890'})</strong>
Salida Programada: <strong style="color: #fff;">${fechaSalidaStr}</strong> • Conductor: <strong style="color: var(--accent-cyan);">${s.conductor?.nombre || 'Mario Fernando Gómez'} (${s.conductor?.placa || 'WLZ-890'})</strong>
</div>
</div>
<div style="font-size: 0.85rem; text-align: right;">
<div style="color: #cbd5e1;">Llave Bre-B del Conductor:</div>
<strong style="color: #ec4899;">${s.conductor?.llaveBreB?.bancoDestino || 'Bancolombia'}: ${s.conductor?.llaveBreB?.valor || '3167455877'}</strong>
<strong style="color: #ec4899;">${s.conductor?.llaveBreB?.bancoDestino || 'Bancolombia'}: ${s.conductor?.llaveBreB?.valor || '3109876543'}</strong>
</div>
</div>
@ -2783,9 +2783,9 @@ function initSettlementsAndBreBSystem() {
tripId: tId !== 'DEMO_TRIP_001' ? tId : undefined,
monto: amount || 49000,
bancoDestino: s.conductor?.llaveBreB?.bancoDestino || 'Bancolombia',
llaveBreB: s.conductor?.llaveBreB?.valor || '3167455877',
llaveBreB: s.conductor?.llaveBreB?.valor || '3109876543',
tipoLlave: s.conductor?.llaveBreB?.tipo || 'CELULAR',
titularNombre: s.conductor?.nombre || 'Carlos Almeira'
titularNombre: s.conductor?.nombre || 'Mario Fernando Gómez'
})
});
const receipt = await res.json();
@ -2809,8 +2809,8 @@ function initSettlementsAndBreBSystem() {
cicloCompensacion: 'Banco de la República Inmediato 24/7',
monto: amount || 49000,
entidadDestino: s.conductor?.llaveBreB?.bancoDestino || 'Bancolombia',
llaveDestino: s.conductor?.llaveBreB?.valor || '+57 316 745 5877',
titularDestino: s.conductor?.nombre || 'Carlos Almeira',
llaveDestino: s.conductor?.llaveBreB?.valor || '+57 310 987 6543',
titularDestino: s.conductor?.nombre || 'Mario Fernando Gómez',
fechaHora: new Date().toLocaleString('es-CO')
});
}
@ -2828,7 +2828,7 @@ function initSettlementsAndBreBSystem() {
<div style="background: rgba(15, 23, 42, 0.7); border: 1px dashed var(--border-glass); border-radius: 8px; padding: 1.25rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 0.5rem;">
<div>
<div style="color: #fff; font-weight: 700; font-size: 0.95rem;">Recorrido #048120 (Buenaventura ➔ Cali)</div>
<div style="font-size: 0.8rem; color: #94a3b8;">Conductor: Carlos Almeira • Liquidado: Hoy, 04:15 PM</div>
<div style="font-size: 0.8rem; color: #94a3b8;">Conductor: Mario Fernando Gómez • Liquidado: Hoy, 04:15 PM</div>
</div>
<div style="text-align: right;">
<div style="color: #34d399; font-weight: 800;">+$119.000 COP Liquidado</div>
@ -2881,8 +2881,8 @@ function initSettlementsAndBreBSystem() {
updateDriverWalletUI({
billeteraSaldo: 119000,
totalViajesRealizados: 14,
conductor: { nombre: 'Carlos Almeira', placa: 'WLZ-890' },
llaveBreB: { tipo: 'CELULAR', valor: '3167455877', bancoDestino: 'Bancolombia', titularNombre: 'Carlos Almeira' },
conductor: { nombre: 'Mario Fernando Gómez', placa: 'WLZ-890' },
llaveBreB: { tipo: 'CELULAR', valor: '3109876543', bancoDestino: 'Bancolombia', titularNombre: 'Mario Fernando Gómez' },
historialTransferenciasBreB: []
});
}
@ -2904,12 +2904,12 @@ function initSettlementsAndBreBSystem() {
const payoutAmountInput = document.getElementById('breb-payout-amount');
if (balVal) balVal.textContent = `$${(wallet.billeteraSaldo || 0).toLocaleString('es-CO')}`;
if (nameVal) nameVal.textContent = wallet.conductor?.nombre || 'Carlos Almeira';
if (nameVal) nameVal.textContent = wallet.conductor?.nombre || 'Mario Fernando Gómez';
if (plateVal) plateVal.textContent = wallet.conductor?.placa || 'WLZ-890';
if (tripsVal) tripsVal.textContent = wallet.totalViajesRealizados || 0;
if (summaryBank) summaryBank.textContent = wallet.llaveBreB?.bancoDestino || 'Bancolombia';
if (summaryKey) summaryKey.textContent = wallet.llaveBreB?.valor || '3167455877';
if (summaryKey) summaryKey.textContent = wallet.llaveBreB?.valor || '3109876543';
if (inputKeyType && wallet.llaveBreB?.tipo) inputKeyType.value = wallet.llaveBreB.tipo;
if (inputKeyValue && wallet.llaveBreB?.valor) inputKeyValue.value = wallet.llaveBreB.valor;
@ -2950,8 +2950,8 @@ function initSettlementsAndBreBSystem() {
cicloCompensacion: 'Banco de la República Interoperable 24/7',
monto: 119000,
entidadDestino: 'Bancolombia',
llaveDestino: '+57 316 745 5877',
titularDestino: 'Carlos Almeira',
llaveDestino: '+57 310 987 6543',
titularDestino: 'Mario Fernando Gómez',
fechaHora: '14 de Octubre de 2026, 08:35 PM'
});
};
@ -3018,7 +3018,7 @@ function initSettlementsAndBreBSystem() {
tipo: keyType,
valor: keyValue,
bancoDestino: bank,
titularNombre: currentUser?.nombre || 'Carlos Almeira'
titularNombre: currentUser?.nombre || 'Usuario Conductor'
})
});
const data = await res.json();
@ -3062,7 +3062,7 @@ function initSettlementsAndBreBSystem() {
}
const keyType = document.getElementById('driver-breb-key-type')?.value || 'CELULAR';
const keyValue = document.getElementById('driver-breb-key-value')?.value || '3167455877';
const keyValue = document.getElementById('driver-breb-key-value')?.value || '3109876543';
const bank = document.getElementById('driver-breb-bank')?.value || 'Bancolombia';
btnSubmitPayout.disabled = true;
@ -3078,7 +3078,7 @@ function initSettlementsAndBreBSystem() {
bancoDestino: bank,
llaveBreB: keyValue,
tipoLlave: keyType,
titularNombre: currentUser?.nombre || 'Carlos Almeira'
titularNombre: currentUser?.nombre || 'Usuario Conductor'
})
});
const data = await res.json();
@ -3318,8 +3318,8 @@ function initSettlementsAndBreBSystem() {
listEl.innerHTML = `
<div style="background: rgba(15, 23, 42, 0.7); border: 1px solid var(--border-glass); border-radius: 8px; padding: 1.15rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 0.5rem;">
<div>
<strong style="color: #fff;">Carlos Almeira (WLZ-890)</strong>
<div style="font-size: 0.82rem; color: #94a3b8;">Bancolombia (Llave Celular: 3167455877) • Ref: SOL-BREB-20261014-99AB12</div>
<strong style="color: #fff;">Mario Fernando Gómez (WLZ-890)</strong>
<div style="font-size: 0.82rem; color: #94a3b8;">Bancolombia (Llave Celular: 3109876543) • Ref: SOL-BREB-20261014-99AB12</div>
</div>
<div style="display: flex; gap: 0.75rem; align-items: center;">
<div style="color: #34d399; font-weight: 800; font-size: 1.15rem;">$119.000 COP</div>
@ -4083,7 +4083,7 @@ async function fetchAdministrators() {
<div style="font-weight: 700; color: #fff; display: flex; align-items: center; gap: 0.4rem;">
${isSuper ? '<span style="font-size: 1.1rem;">👑</span>' : '<span>🛡️</span>'}
<span>${admin.nombre}</span>
${isSuper ? '<span class="superadmin-badge" style="font-size: 0.65rem; padding: 1px 6px;">Carlos</span>' : ''}
${isSuper ? '<span class="superadmin-badge" style="font-size: 0.65rem; padding: 1px 6px;">👑 PRINCIPAL</span>' : ''}
</div>
<div style="font-size: 0.75rem; color: #94a3b8;">
${admin.documentoIdentidad ? `C.C. ${admin.documentoIdentidad} • ` : ''}${admin.email || 'Sin correo registrado'}

View File

@ -147,11 +147,11 @@ export class AuthService {
if (!user) {
user = await User.create({
appwriteId: isSuper ? 'usr-superadmin-carlos' : `pt-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,
nombre: isSuper ? (params.nombre || 'Carlos Almeira') : (params.nombre || `Usuario ${cleanPhone.slice(-4)}`),
appwriteId: isSuper ? 'usr-superadmin-platform' : `pt-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,
nombre: isSuper ? (params.nombre || 'Superadministrador Principal') : (params.nombre || `Usuario ${cleanPhone.slice(-4)}`),
telefono: cleanPhone,
email: userEmail || (isSuper ? SUPER_ADMIN_EMAIL : undefined),
documentoIdentidad: params.documentoIdentidad || (isSuper ? '3167455877' : undefined),
documentoIdentidad: params.documentoIdentidad || (isSuper ? '1000000001' : undefined),
direccionTexto: params.direccionTexto || 'Cali, Valle del Cauca',
ciudad: 'Cali',
rol: assignedRole,
@ -176,7 +176,7 @@ export class AuthService {
user.rol = 'ADMIN';
user.esSuperAdmin = true;
if (!user.nombre || user.nombre.startsWith('Usuario ')) {
user.nombre = 'Carlos Almeira';
user.nombre = 'Superadministrador Principal';
}
}
if (params.documentoIdentidad && !user.documentoIdentidad) {

View File

@ -181,11 +181,11 @@ export class UserAdminService {
if (!superAdmin) {
superAdmin = await User.create({
appwriteId: 'usr-superadmin-carlos',
nombre: 'Carlos Almeira',
appwriteId: 'usr-superadmin-platform',
nombre: 'Superadministrador Principal',
telefono: SUPER_ADMIN_PHONE,
email: SUPER_ADMIN_EMAIL,
documentoIdentidad: '3167455877',
documentoIdentidad: '1000000001',
rol: 'ADMIN',
esSuperAdmin: true,
saldoPenalidad: 0,
@ -200,7 +200,7 @@ export class UserAdminService {
twoFactorEnabled: true,
twoFactorMethod: 'whatsapp_otp',
});
console.log('👑 [SuperAdmin Seed]: Carlos Almeira registrado como Superadministrador permanente.');
console.log('👑 [SuperAdmin Seed]: Superadministrador Principal registrado como Superadministrador permanente.');
} else {
let needsSave = false;
if (superAdmin.rol !== 'ADMIN') {

View File

@ -143,7 +143,7 @@ export default function AdminSettingsPage() {
<input
type="tel"
required
placeholder="ej: 3167455877"
placeholder="ej: 3001234567"
value={settings.phone}
onChange={(e) => handlePhoneChange(e.target.value)}
className="w-full bg-slate-950 border border-slate-800 rounded-xl pl-9 pr-3.5 py-2.5 text-emerald-300 font-bold outline-hidden focus:border-emerald-400"

View File

@ -507,7 +507,7 @@ export default function AdminSuppliersPage() {
<input
type="tel"
required
placeholder="ej: 573167455877"
placeholder="ej: 573001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-slate-950 border border-slate-800 rounded-xl px-3.5 py-2.5 text-emerald-300 outline-hidden focus:border-emerald-400 font-mono font-bold"

View File

@ -628,7 +628,7 @@ export default function AdminUsersPage() {
<input
type="tel"
required
placeholder="3167455877"
placeholder="3001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-white outline-hidden focus:border-purple-400"

View File

@ -308,7 +308,7 @@ ${order.depositAmount > 0 ? `⚡ *Separación:* ${formatCOP(order.depositAmount)
<input
type="tel"
required
placeholder="Ej. 3167455877"
placeholder="Ej. 3001234567"
value={customerPhone}
onChange={(e) => setCustomerPhone(e.target.value)}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden"

View File

@ -578,7 +578,7 @@ export const AuthModal: React.FC = () => {
<input
type="text"
required
placeholder="Ej: 3167455877 o carlos.andres.lasso@gmail.com"
placeholder="Ej: 3001234567 o usuario@ejemplo.com"
value={identifier}
onChange={(e) => setIdentifier(e.target.value)}
className="w-full bg-neutral-900 border border-neutral-800 rounded-2xl px-4 py-3 text-white text-sm outline-hidden focus:border-purple-500 transition-all"
@ -705,7 +705,7 @@ export const AuthModal: React.FC = () => {
<input
type="tel"
required
placeholder="3167455877"
placeholder="3001234567"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="w-full bg-neutral-900 border border-neutral-800 rounded-xl px-3 py-2 text-white outline-hidden focus:border-purple-500"