- Chat público en /chat con flujos de compra, recarga y credenciales - Verificación de identidad por código OTP enviado al correo registrado - Botones enriquecidos: cards, links, credenciales, validación de comprobante - Gemini IA para detección de intención en texto libre - Gemini Vision para extraer datos de foto de comprobante - Validador de pagos cruzando IA con correos IMAP (Bancolombia) - MercadoPago como pasarela de pago (reemplaza Wompi en el chat) - Migraciones: payload en chat_messages, user_id en chat_contacts - Config admin: API key Gemini, toggles IA y validación de foto Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
37 lines
845 B
PHP
37 lines
845 B
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
|
|
class ChatContact extends Model
|
|
{
|
|
protected $table = 'chat_contacts';
|
|
|
|
protected $fillable = [
|
|
'canal', 'canal_id', 'nombre', 'telefono', 'metadata', 'user_id',
|
|
];
|
|
|
|
protected $casts = ['metadata' => 'array'];
|
|
|
|
public function user(): BelongsTo
|
|
{
|
|
return $this->belongsTo(User::class);
|
|
}
|
|
|
|
public function conversations(): HasMany
|
|
{
|
|
return $this->hasMany(ChatConversation::class, 'contact_id');
|
|
}
|
|
|
|
public function activeConversation(): ?ChatConversation
|
|
{
|
|
return $this->conversations()
|
|
->whereIn('estado', ['bot', 'agente'])
|
|
->latest()
|
|
->first();
|
|
}
|
|
}
|