113 lines
5.3 KiB
Markdown
Executable File
113 lines
5.3 KiB
Markdown
Executable File
# INDEX_plugin.md — Plugin.php
|
||
> **Archivo:** `src/Plugin.php` | 672 líneas | Entry point del plugin UCRM
|
||
|
||
---
|
||
|
||
## Propósito
|
||
Clase orquestadora principal. UCRM la invoca en cada evento (hook). Detecta si viene de HTTP o CLI y delega al handler correspondiente.
|
||
|
||
## Namespace & Dependencias
|
||
```
|
||
namespace SmsNotifier
|
||
Depende de: PluginNotifierFacade, PluginOxxoNotifierFacade, TwilioNotifierFacade,
|
||
NotificationDataFactory, Logger, OptionsManager, PluginDataValidator, UcrmApi
|
||
```
|
||
|
||
## Propiedades
|
||
| Propiedad | Tipo | Descripción |
|
||
|---|---|---|
|
||
| `$logger` | Logger | Logger del plugin |
|
||
| `$optionsManager` | OptionsManager | Carga config del plugin |
|
||
| `$pluginDataValidator` | PluginDataValidator | Valida configuración |
|
||
| `$pluginNotifierFacade` | PluginNotifierFacade | Fachada Stripe + Callbell |
|
||
| `$pluginOxxoNotifierFacade` | PluginOxxoNotifierFacade | Fachada OXXO |
|
||
| `$notifierFacade` | TwilioNotifierFacade | Fachada notificaciones base |
|
||
| `$notificationDataFactory` | NotificationDataFactory | Crea objetos NotificationData |
|
||
| `$ucrmApi` | UcrmApi (SDK) | Cliente API UCRM |
|
||
|
||
## Métodos
|
||
| Método | Línea | Descripción |
|
||
|---|---|---|
|
||
| `__construct(...)` | 58 | Inicializa dependencias + UcrmApi con config |
|
||
| `run(): void` | 84 | Entry point: detecta SAPI (fpm/cli) y delega |
|
||
| `processCli(): void` | 96 | CLI: solo valida config |
|
||
| `processHttpRequest(): void` | 104 | HTTP: procesa payload JSON del webhook |
|
||
|
||
---
|
||
|
||
## Flujo de `processHttpRequest()` (L.104–670)
|
||
|
||
### Paso 1 — Detectar tipo de payload (L.111–268)
|
||
Lee `php://input`. Si **no tiene `uuid`** → es webhook externo (Stripe/OXXO):
|
||
|
||
| `type` en JSON | Línea | Acción |
|
||
|---|---|---|
|
||
| `customer_cash_balance_transaction.created` → `funded` | 133 | `pluginNotifierFacade->createPaymentIntent()` |
|
||
| `customer_cash_balance_transaction.created` → `applied_to_payment` | 139 | `pluginNotifierFacade->registerPaymentFromWebhook()` |
|
||
| `customer_cash_balance_transaction.created` → `unapplied_from_payment` | 142 | Log de transferencia cancelada |
|
||
| `payment_intent.succeeded` | 166 | `pluginNotifierFacade->registerPaymentFromIntent()` |
|
||
| `oxxo.retrieve` | 172 | `pluginOxxoNotifierFacade->getOxxoOrderStatus()` → responde JSON |
|
||
| `oxxo.request` | 188 | Flujo async: `createStripeReference()` → `createOxxoOrder()` → responde → `generateOxxoVoucher()` en background |
|
||
| `payout.failed` | 150 | Solo log |
|
||
| `payment_intent.partially_funded` | 155 | Solo log |
|
||
| `cash_balance.funds_available` | 163 | Solo log |
|
||
|
||
### Paso 2 — Payload con `uuid` → Webhook UCRM (L.270–670)
|
||
Construye `NotificationData` via factory, luego switch por `eventName`:
|
||
|
||
| `eventName` | Línea | Acción |
|
||
|---|---|---|
|
||
| `payment.add` | 297 | Switch por `methodId` UUID → `notifierFacade->verifyPaymentActionToDo()` |
|
||
| `payment.delete/unmatch/edit` | 418 | `notifierFacade->verifyClientActionToDo()` |
|
||
| `client.edit` | 423 | Detecta cambios de tags/datos → `updatePasswordAntenaIfNeeded()`, `createStripeClient()`, `syncStripeCustomerData()`, `verifyClientActionToDo()` |
|
||
| `client.add` | 539 | Solo log |
|
||
| `service.edit` | 542 | `notifierFacade->verifyServiceActionToDo()` + `updatePasswordAntenaIfNeeded()` |
|
||
| `service.suspend` | 552 | `notifierFacade->verifyServiceActionToDo()` |
|
||
| `service.suspend_cancel` | 555 | `notifierFacade->verifyServiceActionToDo()` |
|
||
| `service.postpone` | 558 | `notifierFacade->verifyServiceActionToDo()` |
|
||
| `invoice.near_due` | 561 | `notifierFacade->notifyOverDue()` |
|
||
| `invoice.overdue` | 564 | `notifierFacade->notifyOverDue()` |
|
||
| `invoice.add` | 569 | `notifierFacade->verifyInvoiceActionToDo()` |
|
||
| `invoice.edit` | 579 | `notifierFacade->verifyInvoiceActionToDo()` |
|
||
| `invoice.add_draft` | 582 | `notifierFacade->verifyInvoiceActionToDo()` |
|
||
| `invoice.draft_approved` | 585 | `notifierFacade->verifyInvoiceActionToDo()` |
|
||
| `invoice.delete` | 588 | `notifierFacade->verifyInvoiceActionToDo()` |
|
||
| `job.add` | 591 | PATCH title en UCRM con prefijo `[NOTIFICACION-PENDIENTE]` |
|
||
| `job.edit` | 599 | Detecta cambios status/técnico/fecha → `notifierFacade->verifyJobActionToDo()` |
|
||
|
||
---
|
||
|
||
## UUIDs de Métodos de Pago (L.309–416)
|
||
| UUID | Método |
|
||
|---|---|
|
||
| `11721cdf-...` | Cheque |
|
||
| `6efe0fa8-...` | Efectivo |
|
||
| `4145b5f5-...` | Transferencia bancaria |
|
||
| `78e84000-...` | PayPal |
|
||
| `6da98bb9-...` | Tarjeta de crédito PayPal |
|
||
| `1dd098fa-...` | Stripe Credit Card (detecta sub-tipo por metadata) |
|
||
| `b9e1e9d1-...` | Suscripción Stripe (tarjeta) |
|
||
| `939f7701-...` | Suscripción PayPal |
|
||
| `1c963e35-...` | MercadoPago |
|
||
| `d8c1eae9-...` | Personalizado |
|
||
| `72271b72-...` | Cortesía |
|
||
| `b01c0b35-...` | OXXO Pay |
|
||
| `93814765-...` | Tarjeta de crédito/débito |
|
||
|
||
---
|
||
|
||
## Tags de Cliente que disparan acciones (L.460–492)
|
||
| Tag | Acción |
|
||
|---|---|
|
||
| `CREAR CLABE STRIPE` | `pluginNotifierFacade->createStripeClient(..., true)` |
|
||
| `CREAR CLIENTE STRIPE` | `pluginNotifierFacade->createStripeClient(..., false)` |
|
||
| `OBTENER PASSWORD ANTENA` | `pluginNotifierFacade->processClientPasswordAntenna()` |
|
||
| `isLead: true→false` | Auto-crea cliente en Stripe |
|
||
|
||
---
|
||
|
||
## Notas de implementación
|
||
- `job.edit` con `statusAfter==1` y `$isPending` en título dispara notificación
|
||
- El flujo `oxxo.request` usa `fastcgi_finish_request()` para responder antes de generar el voucher
|
||
- `client.edit` refresca datos del cliente vía UCRM API antes de sincronizar con CallBell
|