feat: Telegram transactional flows + role pricing + services slider
- New TelegramBotService: full OTP auth, registration, main menu with inline keyboards, buy plans, buy promos, recharge (MP + Bre-B), credentials, history, profile, agent transfer, photo receipt analysis - TelegramWebhookController: now handles text, callback_query and photo - Role-based pricing: tarifas filtered by user rol_id in both web chat and Telegram; Preferencial price overrides base tarifa valor - Services and promos now render as horizontal scroll slider (cards_slider tipo_ui) instead of stacked individual cards Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
a3bd91c204
commit
2fc2aba8a3
@@ -292,6 +292,53 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- CARDS SLIDER: servicios / promos en carrusel horizontal --}}
|
||||
@elseif ($tipoUi === 'cards_slider')
|
||||
<div class="w-full max-w-full space-y-2">
|
||||
@if ($msg['contenido'])
|
||||
<div class="bg-[#202c33] text-white rounded-xl rounded-tl-sm px-4 py-2 shadow inline-block max-w-[80%]">
|
||||
<p class="text-sm">{{ $msg['contenido'] }}</p>
|
||||
<span class="text-[#8696a0] text-[11px] float-right mt-1 ml-2">{{ $msg['created_at'] }}</span>
|
||||
</div>
|
||||
@endif
|
||||
{{-- Scroll horizontal de cards --}}
|
||||
<div class="flex gap-3 overflow-x-auto pb-2"
|
||||
style="-webkit-overflow-scrolling:touch; scroll-snap-type:x mandatory; scrollbar-width:none;">
|
||||
@foreach ($payload['cards'] ?? [] as $card)
|
||||
<div class="flex-shrink-0 bg-[#202c33] rounded-xl shadow overflow-hidden"
|
||||
style="width:180px; scroll-snap-align:start;">
|
||||
@if (!empty($card['imagen']))
|
||||
<img src="{{ $card['imagen'] }}" class="w-full object-cover" style="height:100px;">
|
||||
@else
|
||||
<div class="w-full bg-[#2a3942] flex items-center justify-center" style="height:80px;">
|
||||
<svg class="w-8 h-8 text-[#8696a0]" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z" />
|
||||
</svg>
|
||||
</div>
|
||||
@endif
|
||||
<div class="px-3 py-2.5">
|
||||
<p class="text-white text-sm font-semibold truncate">{{ $card['titulo'] ?? '' }}</p>
|
||||
@if (!empty($card['precio']))
|
||||
<p class="text-[#00a884] font-bold text-sm mt-0.5">${{ number_format($card['precio']) }}</p>
|
||||
@endif
|
||||
@if (!empty($card['detalle']))
|
||||
<p class="text-[#8696a0] text-xs mt-0.5 truncate">{{ $card['detalle'] }}</p>
|
||||
@endif
|
||||
@if (!empty($card['descripcion']))
|
||||
<p class="text-[#8696a0] text-xs mt-0.5 line-clamp-2">{{ $card['descripcion'] }}</p>
|
||||
@endif
|
||||
@if (!empty($card['accion']))
|
||||
<button wire:click="clickBoton('{{ $card['accion']['action'] }}', {{ json_encode($card['accion']['data'] ?? []) }})"
|
||||
class="mt-2.5 w-full bg-[#00a884] text-white text-xs font-semibold rounded-lg py-1.5 active:bg-[#06cf9c] transition">
|
||||
{{ $card['accion']['label'] }}
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- LINK: botón de pago externo --}}
|
||||
@elseif ($tipoUi === 'link')
|
||||
<div class="max-w-[85%] bg-[#202c33] rounded-xl rounded-tl-sm px-4 py-3 shadow">
|
||||
|
||||
Reference in New Issue
Block a user