@pimia/sdk 0.20.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1928 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ *
5
+ * Generado con `npm run generate:types` (scripts/generate-types.mjs), que
6
+ * añade UN transform al generador: `format: binary` sale como `Blob` y no
7
+ * como `string`. El porqué, en ese fichero.
8
+ */
9
+ export interface paths {
10
+ "/billing/portal": {
11
+ parameters: {
12
+ query?: never;
13
+ header?: never;
14
+ path?: never;
15
+ cookie?: never;
16
+ };
17
+ get?: never;
18
+ put?: never;
19
+ /**
20
+ * POST /api/billing/portal — Get Stripe Customer Portal URL
21
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
22
+ *
23
+ * Allows users to manage payment methods, view invoices, cancel subscriptions.
24
+ */
25
+ post: operations["billing.portal"];
26
+ delete?: never;
27
+ options?: never;
28
+ head?: never;
29
+ patch?: never;
30
+ trace?: never;
31
+ };
32
+ "/billing/sponsorship": {
33
+ parameters: {
34
+ query?: never;
35
+ header?: never;
36
+ path?: never;
37
+ cookie?: never;
38
+ };
39
+ get?: never;
40
+ put?: never;
41
+ /**
42
+ * POST /api/billing/sponsorship — asumir la licencia de un cliente
43
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
44
+ *
45
+ * Mismo mecanismo para las dos figuras intermediarias (gestoría y
46
+ * desarrollador): una suscripción de canal con `quantity` = asientos y una
47
+ * factura consolidada, en vez de N suscripciones sueltas.
48
+ */
49
+ post: operations["billing.sponsor"];
50
+ /**
51
+ * DELETE /api/billing/sponsorship — soltar un cliente patrocinado
52
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
53
+ */
54
+ delete: operations["billing.releaseSponsorship"];
55
+ options?: never;
56
+ head?: never;
57
+ patch?: never;
58
+ trace?: never;
59
+ };
60
+ "/desarrollador/overview": {
61
+ parameters: {
62
+ query?: never;
63
+ header?: never;
64
+ path?: never;
65
+ cookie?: never;
66
+ };
67
+ /**
68
+ * GET /api/desarrollador/overview — cartera y cuota
69
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
70
+ *
71
+ * Cada fila de `cartera` lleva `origen`: el client OAuth de ESTE
72
+ * desarrollador por el que se le atribuye el tenant —con
73
+ * `atribuido: true` si el alta lo dejó escrito (`origin_client_id`,
74
+ * #726) y `false` si se infiere porque el vínculo está vivo y el
75
+ * desarrollador tiene un único client con orígenes (la red de
76
+ * `IntegradorDelTenant::clientDe`)— o `null`. Nunca el client de otro
77
+ * desarrollador aunque el tenant lo recuerde: es su relación comercial,
78
+ * no la de quien mira.
79
+ *
80
+ * El cuerpo se declara entero porque el generador no sigue el `map()`
81
+ * sobre la colección de tenants: en la 1.3.0 `cartera` salía como una
82
+ * lista de `string` y el panel no podía tipar ni una fila.
83
+ */
84
+ get: operations["desarrollador.overview"];
85
+ put?: never;
86
+ post?: never;
87
+ delete?: never;
88
+ options?: never;
89
+ head?: never;
90
+ patch?: never;
91
+ trace?: never;
92
+ };
93
+ "/desarrollador/salud": {
94
+ parameters: {
95
+ query?: never;
96
+ header?: never;
97
+ path?: never;
98
+ cookie?: never;
99
+ };
100
+ /**
101
+ * GET /api/desarrollador/salud — estado técnico de sus integraciones
102
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
103
+ *
104
+ * Lo que un desarrollador necesita y un asesor no: si sus clients siguen
105
+ * usándose, si sus webhooks llegan y si tiene propuestas esperando decisión
106
+ * del cliente. Todo son METADATOS de la integración — último uso, códigos
107
+ * de estado, contadores. Nunca el contenido de lo que viaja.
108
+ *
109
+ * Declarado entero por lo mismo que `overview`: el generador publicaba
110
+ * `revoked_at` como `string` a secas (es `null` casi siempre) y
111
+ * `approvals.por_tenant` como una unión con `string[]`.
112
+ */
113
+ get: operations["desarrollador.salud"];
114
+ put?: never;
115
+ post?: never;
116
+ delete?: never;
117
+ options?: never;
118
+ head?: never;
119
+ patch?: never;
120
+ trace?: never;
121
+ };
122
+ "/desarrollador/facturacion": {
123
+ parameters: {
124
+ query?: never;
125
+ header?: never;
126
+ path?: never;
127
+ cookie?: never;
128
+ };
129
+ /**
130
+ * GET /api/desarrollador/facturacion — su suscripción de canal
131
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
132
+ */
133
+ get: operations["desarrollador.facturacion"];
134
+ put?: never;
135
+ post?: never;
136
+ delete?: never;
137
+ options?: never;
138
+ head?: never;
139
+ patch?: never;
140
+ trace?: never;
141
+ };
142
+ "/desarrollador/links": {
143
+ parameters: {
144
+ query?: never;
145
+ header?: never;
146
+ path?: never;
147
+ cookie?: never;
148
+ };
149
+ /** @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador. */
150
+ get: operations["desarrolladorLink.index"];
151
+ put?: never;
152
+ post?: never;
153
+ delete?: never;
154
+ options?: never;
155
+ head?: never;
156
+ patch?: never;
157
+ trace?: never;
158
+ };
159
+ "/desarrollador/links/generate-code": {
160
+ parameters: {
161
+ query?: never;
162
+ header?: never;
163
+ path?: never;
164
+ cookie?: never;
165
+ };
166
+ get?: never;
167
+ put?: never;
168
+ /** @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador. */
169
+ post: operations["desarrolladorLink.generateCode"];
170
+ delete?: never;
171
+ options?: never;
172
+ head?: never;
173
+ patch?: never;
174
+ trace?: never;
175
+ };
176
+ "/desarrollador/links/{id}/accept": {
177
+ parameters: {
178
+ query?: never;
179
+ header?: never;
180
+ path?: never;
181
+ cookie?: never;
182
+ };
183
+ get?: never;
184
+ put?: never;
185
+ /**
186
+ * Aceptar la solicitud de una instancia
187
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
188
+ *
189
+ * Aquí está LA diferencia con la gestoría: no se crea ningún usuario dentro
190
+ * del tenant ni se toca `tenant_users`. El vínculo solo pasa a `active`.
191
+ */
192
+ post: operations["desarrolladorLink.accept"];
193
+ delete?: never;
194
+ options?: never;
195
+ head?: never;
196
+ patch?: never;
197
+ trace?: never;
198
+ };
199
+ "/desarrollador/links/{id}/reject": {
200
+ parameters: {
201
+ query?: never;
202
+ header?: never;
203
+ path?: never;
204
+ cookie?: never;
205
+ };
206
+ get?: never;
207
+ put?: never;
208
+ /** @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador. */
209
+ post: operations["desarrolladorLink.reject"];
210
+ delete?: never;
211
+ options?: never;
212
+ head?: never;
213
+ patch?: never;
214
+ trace?: never;
215
+ };
216
+ "/desarrollador/clients": {
217
+ parameters: {
218
+ query?: never;
219
+ header?: never;
220
+ path?: never;
221
+ cookie?: never;
222
+ };
223
+ /**
224
+ * GET — los clients OAuth de este desarrollador
225
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
226
+ */
227
+ get: operations["desarrolladorLink.clients"];
228
+ put?: never;
229
+ post?: never;
230
+ delete?: never;
231
+ options?: never;
232
+ head?: never;
233
+ patch?: never;
234
+ trace?: never;
235
+ };
236
+ "/desarrollador/clients/claim": {
237
+ parameters: {
238
+ query?: never;
239
+ header?: never;
240
+ path?: never;
241
+ cookie?: never;
242
+ };
243
+ get?: never;
244
+ put?: never;
245
+ /**
246
+ * POST — «este client es mío»
247
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
248
+ *
249
+ * Requiere demostrar posesión del client, no solo conocer su id: el
250
+ * client_id viaja en cada pantalla de consentimiento y en la URL de
251
+ * autorización, así que es público de facto. Para un client confidencial se
252
+ * exige el secret; para uno público (PKCE, sin secret) solo puede
253
+ * reclamarlo quien lo registró desde un tenant vinculado a esta cuenta.
254
+ */
255
+ post: operations["desarrolladorLink.claimClient"];
256
+ delete?: never;
257
+ options?: never;
258
+ head?: never;
259
+ patch?: never;
260
+ trace?: never;
261
+ };
262
+ "/desarrollador/tenants/{slug}/activaciones": {
263
+ parameters: {
264
+ query?: never;
265
+ header?: never;
266
+ path?: never;
267
+ cookie?: never;
268
+ };
269
+ /**
270
+ * GET /api/desarrollador/tenants/{slug}/activaciones — lo activado a este cliente
271
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
272
+ *
273
+ * `base` es su licencia (el asiento de canal); `items`, los módulos y apps
274
+ * activos con lo que cuestan al integrador al mes; `total` lo suma.
275
+ */
276
+ get: operations["integradorActivacion.index"];
277
+ put?: never;
278
+ /**
279
+ * POST /api/desarrollador/tenants/{slug}/activaciones — activar algo al cliente
280
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
281
+ *
282
+ * `kind` ∈ `base|module|app` y `slug` (`pimia` para la base). La base es el
283
+ * asiento: la primera vez devuelve `checkout_url` (el canal aún no tiene
284
+ * suscripción) y las siguientes es un asiento más. Un módulo o una app
285
+ * exigen la base viva (`409 base_required`) y se cobran al integrador
286
+ * como una partida más de su canal, sin prorrateo, en la factura del mes;
287
+ * el módulo se enciende en el acto y la app la instala el cliente por
288
+ * empresa sin pasar por caja. Idempotente: lo ya activo contesta
289
+ * `already_active: true` sin tocar Stripe (y remata lo que se quedó a
290
+ * medias); un módulo que el cliente ya tenía encendido por su cuenta
291
+ * contesta `already_active` con `inherited: true` y NO se cobra. Cortes, con su código en
292
+ * `error`: `not_the_integrator` (403), `not_sellable` (422),
293
+ * `base_required` y `channel_required` (409), `channel_subscription_ending`
294
+ * (402), `stripe_price_missing` (503), `stripe_addon_failed` (502),
295
+ * `addon_busy` (409), `module_not_enabled` (422).
296
+ *
297
+ * Contesta **201** cuando activa algo nuevo y **200** cuando ya estaba
298
+ * activo o cuando lo que devuelve es el Checkout del canal; los dos
299
+ * `return` llevan el código escrito para que el generador publique los
300
+ * dos cuerpos (⛔ no con `@response 201`: esa etiqueta Scramble la lee
301
+ * como el TIPO `201` y el cuerpo desaparece del contrato — pasó en la
302
+ * 1.3.0, lo midió el estudio del panel central). `return_url` (1.4.0):
303
+ * a dónde vuelve desde el Checkout; solo se acepta el origen del panel
304
+ * central o el del ápice.
305
+ */
306
+ post: operations["integradorActivacion.store"];
307
+ delete?: never;
308
+ options?: never;
309
+ head?: never;
310
+ patch?: never;
311
+ trace?: never;
312
+ };
313
+ "/desarrollador/tenants/{slug}/activaciones/{kind}/{item}": {
314
+ parameters: {
315
+ query?: never;
316
+ header?: never;
317
+ path?: never;
318
+ cookie?: never;
319
+ };
320
+ get?: never;
321
+ put?: never;
322
+ post?: never;
323
+ /**
324
+ * DELETE /api/desarrollador/tenants/{slug}/activaciones/{kind}/{item} — dar de baja
325
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
326
+ *
327
+ * Un módulo se apaga en el acto y deja de cobrarse desde la próxima
328
+ * factura; una app se desinstala de todas las empresas del cliente. La
329
+ * base suelta el asiento (el cliente baja a Free y con él caen sus
330
+ * activaciones). Cortes: `not_active` (404), `has_dependents` (422),
331
+ * `not_the_integrator` (403).
332
+ */
333
+ delete: operations["integradorActivacion.destroy"];
334
+ options?: never;
335
+ head?: never;
336
+ patch?: never;
337
+ trace?: never;
338
+ };
339
+ "/desarrollador/catalogo": {
340
+ parameters: {
341
+ query?: never;
342
+ header?: never;
343
+ path?: never;
344
+ cookie?: never;
345
+ };
346
+ /**
347
+ * GET /api/desarrollador/catalogo — el catálogo propio y lo que se puede revender
348
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
349
+ *
350
+ * `perfil` y `currency` van a `null` mientras el integrador no haya
351
+ * guardado nada; `disponibles` dice qué puede entrar en `items` (es la
352
+ * lista contra la que valida el `PUT`).
353
+ */
354
+ get: operations["integradorCatalogo.show"];
355
+ /**
356
+ * PUT /api/desarrollador/catalogo — reemplaza el catálogo entero
357
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
358
+ *
359
+ * Cabecera (nombre comercial, soporte, moneda ISO 4217 y enlace de
360
+ * contratación por defecto) y filas (`kind` ∈ `base|module|app`, `slug`,
361
+ * `price_cents` en subunidades de esa moneda —siempre una cifra—,
362
+ * `contract_url` propio opcional, `enabled`). Una fila que no venga deja de
363
+ * existir. Un slug que no sea revendible responde 422.
364
+ */
365
+ put: operations["integradorCatalogo.update"];
366
+ post?: never;
367
+ delete?: never;
368
+ options?: never;
369
+ head?: never;
370
+ patch?: never;
371
+ trace?: never;
372
+ };
373
+ "/desarrollador/dominios": {
374
+ parameters: {
375
+ query?: never;
376
+ header?: never;
377
+ path?: never;
378
+ cookie?: never;
379
+ };
380
+ /**
381
+ * GET /api/desarrollador/dominios — los nombres de login del integrador
382
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
383
+ */
384
+ get: operations["integradorDominio.index"];
385
+ put?: never;
386
+ /**
387
+ * POST /api/desarrollador/dominios — declarar un nombre de login
388
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
389
+ *
390
+ * `slug` es la etiqueta interna (`login-<slug>.<dominio central>`, de 1 a
391
+ * 32 caracteres `a-z0-9-`, única en Pimia) y `host` el nombre público que
392
+ * el integrador sirve. Un nombre bajo un dominio de Pimia responde 422
393
+ * (`host`), igual que uno que ya declaró otro integrador. La respuesta
394
+ * trae `proxy_secret`, que el proxy manda en `X-Pimia-Login-Secret`: se
395
+ * genera aquí y se rota retirando el nombre y declarándolo otra vez.
396
+ *
397
+ * Sin `@response 201`: Scramble la lee como el tipo `201` y el cuerpo
398
+ * —con el `proxy_secret`— desaparecía del contrato (1.3.0). El cuerpo
399
+ * sale de `presentar()`, que el generador sí lee.
400
+ */
401
+ post: operations["integradorDominio.store"];
402
+ delete?: never;
403
+ options?: never;
404
+ head?: never;
405
+ patch?: never;
406
+ trace?: never;
407
+ };
408
+ "/desarrollador/dominios/{slug}": {
409
+ parameters: {
410
+ query?: never;
411
+ header?: never;
412
+ path?: never;
413
+ cookie?: never;
414
+ };
415
+ get?: never;
416
+ put?: never;
417
+ post?: never;
418
+ /**
419
+ * DELETE /api/desarrollador/dominios/{slug} — retirar un nombre de login
420
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
421
+ *
422
+ * Desde ese momento el host interno contesta 404 y el proxy del
423
+ * integrador deja de tener a dónde reenviar. 404 si el nombre no es suyo.
424
+ */
425
+ delete: operations["integradorDominio.destroy"];
426
+ options?: never;
427
+ head?: never;
428
+ patch?: never;
429
+ trace?: never;
430
+ };
431
+ "/desarrollador/tokens": {
432
+ parameters: {
433
+ query?: never;
434
+ header?: never;
435
+ path?: never;
436
+ cookie?: never;
437
+ };
438
+ /**
439
+ * GET /api/desarrollador/tokens — los tokens de máquina vivos
440
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
441
+ */
442
+ get: operations["integradorToken.index"];
443
+ put?: never;
444
+ /**
445
+ * POST /api/desarrollador/tokens — acuñar un token de máquina
446
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
447
+ *
448
+ * `name` es para reconocerlo en la lista («webhook de producción»). El
449
+ * token en claro (`token`) se devuelve UNA vez: Pimia solo guarda su hash.
450
+ * Pide la sesión del integrador (403 `session_required` con un token de
451
+ * máquina): uno filtrado no acuña hermanos.
452
+ *
453
+ * El cuerpo del 201 se escribe LITERAL y sin `@response`: Scramble lee
454
+ * esa etiqueta como el tipo `201` y el token en claro desaparecía del
455
+ * contrato (1.3.0; medido por el estudio del panel central).
456
+ */
457
+ post: operations["integradorToken.store"];
458
+ delete?: never;
459
+ options?: never;
460
+ head?: never;
461
+ patch?: never;
462
+ trace?: never;
463
+ };
464
+ "/desarrollador/tokens/{id}": {
465
+ parameters: {
466
+ query?: never;
467
+ header?: never;
468
+ path?: never;
469
+ cookie?: never;
470
+ };
471
+ get?: never;
472
+ put?: never;
473
+ post?: never;
474
+ /**
475
+ * DELETE /api/desarrollador/tokens/{id} — revocar un token de máquina
476
+ * @description **Exige la habilidad `desarrollador`** en el token, y que la cuenta sea de desarrollador.
477
+ *
478
+ * 404 si no es suyo o no es de máquina (una sesión del panel se cierra
479
+ * desde el panel, no desde aquí).
480
+ */
481
+ delete: operations["integradorToken.destroy"];
482
+ options?: never;
483
+ head?: never;
484
+ patch?: never;
485
+ trace?: never;
486
+ };
487
+ "/tenants/{slug}/transfer-ownership": {
488
+ parameters: {
489
+ query?: never;
490
+ header?: never;
491
+ path?: never;
492
+ cookie?: never;
493
+ };
494
+ get?: never;
495
+ put?: never;
496
+ /**
497
+ * POST /api/tenants/{slug}/transfer-ownership — traspaso de propiedad
498
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
499
+ *
500
+ * Versión mínima y deliberada: el dueño actual (o el superadmin) pasa la
501
+ * propiedad a un usuario que YA pertenece a la instancia. No es un flujo
502
+ * self-service con aceptación por parte del destinatario; es la pieza que
503
+ * faltaba para que el desarrollador que dio de alta un tenant pueda
504
+ * devolvérselo a su cliente.
505
+ *
506
+ * Por qué hace falta: la decisión nº 4 del fundador permite al
507
+ * desarrollador crear tenants, y entonces él queda de owner. El rescate por
508
+ * impago («tu proveedor dejó de pagar; asume tú la licencia») exige que el
509
+ * cliente pueda ser dueño de lo suyo — si no, la instancia queda de rehén.
510
+ */
511
+ post: operations["tenant.transferOwnership"];
512
+ delete?: never;
513
+ options?: never;
514
+ head?: never;
515
+ patch?: never;
516
+ trace?: never;
517
+ };
518
+ "/tenants/{slug}/users": {
519
+ parameters: {
520
+ query?: never;
521
+ header?: never;
522
+ path?: never;
523
+ cookie?: never;
524
+ };
525
+ /**
526
+ * GET /api/tenants/{slug}/users — List users with access to this tenant
527
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
528
+ *
529
+ * En el contrato del plano central desde la 1.4.0: es a quién puede
530
+ * traspasar la instancia el integrador que la creó
531
+ * (`POST /tenants/{slug}/transfer-ownership` pide un `user_id` de aquí).
532
+ * Contesta SOLO para las instancias que el que pregunta administra
533
+ * —dueño o con asiento (`manageableTenants`)—; una instancia de la
534
+ * cartera solo VINCULADA (`relacion: vinculada` en `overview`) responde
535
+ * 404, que es lo mismo que le pasaría al traspaso.
536
+ */
537
+ get: operations["tenant.users"];
538
+ put?: never;
539
+ post?: never;
540
+ delete?: never;
541
+ options?: never;
542
+ head?: never;
543
+ patch?: never;
544
+ trace?: never;
545
+ };
546
+ "/tenant-invitations": {
547
+ parameters: {
548
+ query?: never;
549
+ header?: never;
550
+ path?: never;
551
+ cookie?: never;
552
+ };
553
+ /**
554
+ * GET /api/tenant-invitations — Invitaciones de la gestoría autenticada
555
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
556
+ */
557
+ get: operations["tenantInvitation.index"];
558
+ put?: never;
559
+ /**
560
+ * POST /api/tenant-invitations — Crear y enviar una invitación (gestoría)
561
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
562
+ */
563
+ post: operations["tenantInvitation.store"];
564
+ delete?: never;
565
+ options?: never;
566
+ head?: never;
567
+ patch?: never;
568
+ trace?: never;
569
+ };
570
+ "/tenant-invitations/{invitation}": {
571
+ parameters: {
572
+ query?: never;
573
+ header?: never;
574
+ path?: never;
575
+ cookie?: never;
576
+ };
577
+ get?: never;
578
+ put?: never;
579
+ post?: never;
580
+ /**
581
+ * DELETE /api/tenant-invitations/{invitation} — Revocar una invitación
582
+ * @description **Exige la habilidad `central`** en el token (grupo compartido del plano central: lo abre la sesión de cualquier figura; aquí, la del integrador).
583
+ */
584
+ delete: operations["tenantInvitation.destroy"];
585
+ options?: never;
586
+ head?: never;
587
+ patch?: never;
588
+ trace?: never;
589
+ };
590
+ }
591
+ export type webhooks = Record<string, never>;
592
+ export interface components {
593
+ schemas: {
594
+ /**
595
+ * IntegradorCatalogoRequest
596
+ * @description Cuerpo de `PUT /api/desarrollador/catalogo`: el catálogo del integrador
597
+ * ENTERO —cabecera y filas—, que sustituye al que hubiera.
598
+ *
599
+ * Lo que se defiende: que cada fila revenda algo que existe (un módulo
600
+ * opcional ofrecido, una app activa del catálogo de Pimia, o `base`/`pimia`),
601
+ * que no haya dos filas para lo mismo, que el precio sea SIEMPRE una cifra en
602
+ * subunidades (👤, 2026-09-06: sin filas «incluido»; 0 vale) y que la moneda
603
+ * sea un código ISO 4217. El precio minorista no se valida contra ningún
604
+ * precio de Pimia: es del integrador (regla 4 del punto 12).
605
+ */
606
+ IntegradorCatalogoRequest: {
607
+ nombre_comercial: string;
608
+ /** Format: uri */
609
+ soporte_url?: string | null;
610
+ /** Format: email */
611
+ soporte_email?: string | null;
612
+ currency: string;
613
+ /** Format: uri */
614
+ contract_url?: string | null;
615
+ items: {
616
+ /** @enum {string} */
617
+ kind: "base" | "module" | "app";
618
+ slug: string;
619
+ price_cents: number;
620
+ /** Format: uri */
621
+ contract_url?: string | null;
622
+ enabled?: boolean;
623
+ }[];
624
+ };
625
+ };
626
+ responses: {
627
+ /** @description Validation error */
628
+ ValidationException: {
629
+ headers: {
630
+ [name: string]: unknown;
631
+ };
632
+ content: {
633
+ "application/json": {
634
+ /** @description Errors overview. */
635
+ message: string;
636
+ /** @description A detailed description of each field that failed validation. */
637
+ errors: {
638
+ [key: string]: string[];
639
+ };
640
+ };
641
+ };
642
+ };
643
+ /** @description Unauthenticated */
644
+ AuthenticationException: {
645
+ headers: {
646
+ [name: string]: unknown;
647
+ };
648
+ content: {
649
+ "application/json": {
650
+ /** @description Error overview. */
651
+ message: string;
652
+ };
653
+ };
654
+ };
655
+ /** @description Not found */
656
+ ModelNotFoundException: {
657
+ headers: {
658
+ [name: string]: unknown;
659
+ };
660
+ content: {
661
+ "application/json": {
662
+ /** @description Error overview. */
663
+ message: string;
664
+ };
665
+ };
666
+ };
667
+ };
668
+ parameters: never;
669
+ requestBodies: never;
670
+ headers: never;
671
+ pathItems: never;
672
+ }
673
+ export type $defs = Record<string, never>;
674
+ export interface operations {
675
+ "billing.portal": {
676
+ parameters: {
677
+ query?: never;
678
+ header?: never;
679
+ path?: never;
680
+ cookie?: never;
681
+ };
682
+ requestBody?: {
683
+ content: {
684
+ "application/json": {
685
+ return_url?: string | null;
686
+ };
687
+ };
688
+ };
689
+ responses: {
690
+ 200: {
691
+ headers: {
692
+ [name: string]: unknown;
693
+ };
694
+ content: {
695
+ "application/json": {
696
+ data: {
697
+ portal_url: string;
698
+ };
699
+ };
700
+ };
701
+ };
702
+ 401: components["responses"]["AuthenticationException"];
703
+ 404: {
704
+ headers: {
705
+ [name: string]: unknown;
706
+ };
707
+ content: {
708
+ "application/json": {
709
+ /** @constant */
710
+ message: "No billing account found. Subscribe to a plan first.";
711
+ };
712
+ };
713
+ };
714
+ 422: components["responses"]["ValidationException"];
715
+ };
716
+ };
717
+ "billing.sponsor": {
718
+ parameters: {
719
+ query?: never;
720
+ header?: never;
721
+ path?: never;
722
+ cookie?: never;
723
+ };
724
+ requestBody: {
725
+ content: {
726
+ "application/json": {
727
+ tenant_slug: string;
728
+ plan_id: number;
729
+ /**
730
+ * @description A dónde vuelve desde el Checkout del canal: el panel central en
731
+ * React (1.4.0). Solo se acepta su origen; si no, el panel Vue.
732
+ */
733
+ return_url?: string | null;
734
+ };
735
+ };
736
+ };
737
+ responses: {
738
+ 200: {
739
+ headers: {
740
+ [name: string]: unknown;
741
+ };
742
+ content: {
743
+ "application/json": {
744
+ /** @enum {string} */
745
+ message: "Completa el alta de tu suscripción de canal para activar el patrocinio." | "Asumida la licencia de la instancia.";
746
+ data: {
747
+ checkout_url: string | null;
748
+ };
749
+ } | string;
750
+ };
751
+ };
752
+ 401: components["responses"]["AuthenticationException"];
753
+ 404: components["responses"]["ModelNotFoundException"];
754
+ 422: components["responses"]["ValidationException"];
755
+ };
756
+ };
757
+ "billing.releaseSponsorship": {
758
+ parameters: {
759
+ query: {
760
+ tenant_slug: string;
761
+ };
762
+ header?: never;
763
+ path?: never;
764
+ cookie?: never;
765
+ };
766
+ requestBody?: never;
767
+ responses: {
768
+ 200: {
769
+ headers: {
770
+ [name: string]: unknown;
771
+ };
772
+ content: {
773
+ "application/json": {
774
+ /** @constant */
775
+ message: "Has dejado de pagar la licencia de esta instancia.";
776
+ } | string;
777
+ };
778
+ };
779
+ 401: components["responses"]["AuthenticationException"];
780
+ 404: components["responses"]["ModelNotFoundException"];
781
+ 422: components["responses"]["ValidationException"];
782
+ };
783
+ };
784
+ "desarrollador.overview": {
785
+ parameters: {
786
+ query?: never;
787
+ header?: never;
788
+ path?: never;
789
+ cookie?: never;
790
+ };
791
+ requestBody?: never;
792
+ responses: {
793
+ 200: {
794
+ headers: {
795
+ [name: string]: unknown;
796
+ };
797
+ content: {
798
+ "application/json": {
799
+ data: {
800
+ cartera: {
801
+ id: string;
802
+ name: string;
803
+ status: string;
804
+ plan: string | null;
805
+ created_at: string | null;
806
+ trial_ends_at: string | null;
807
+ relacion: string;
808
+ billing_mode: string | null;
809
+ la_pago_yo: boolean;
810
+ marca_blanca: boolean;
811
+ origen: {
812
+ client_id: string;
813
+ name: string;
814
+ atribuido: boolean;
815
+ } | null;
816
+ }[];
817
+ resumen: {
818
+ total: number;
819
+ activos: number;
820
+ suspendidos: number;
821
+ };
822
+ cuota: {
823
+ usada: number;
824
+ limite: number;
825
+ ilimitada: boolean;
826
+ };
827
+ };
828
+ };
829
+ };
830
+ };
831
+ 401: components["responses"]["AuthenticationException"];
832
+ };
833
+ };
834
+ "desarrollador.salud": {
835
+ parameters: {
836
+ query?: never;
837
+ header?: never;
838
+ path?: never;
839
+ cookie?: never;
840
+ };
841
+ requestBody?: never;
842
+ responses: {
843
+ 200: {
844
+ headers: {
845
+ [name: string]: unknown;
846
+ };
847
+ content: {
848
+ "application/json": {
849
+ data: {
850
+ clients: {
851
+ client_id: string;
852
+ name: string;
853
+ revoked_at: string | null;
854
+ tokens_vivos: number;
855
+ ultimo_uso: string | null;
856
+ }[];
857
+ webhooks: {
858
+ id: number;
859
+ tenant_id: string | null;
860
+ url: string;
861
+ events: string[];
862
+ disabled_at: string | null;
863
+ consecutive_failures: number;
864
+ entregas_7d: {
865
+ delivered: number;
866
+ pending: number;
867
+ dead: number;
868
+ };
869
+ }[];
870
+ approvals: {
871
+ abiertas: number;
872
+ por_tenant: {
873
+ tenant_id: string;
874
+ abiertas: number;
875
+ }[];
876
+ };
877
+ };
878
+ };
879
+ };
880
+ };
881
+ 401: components["responses"]["AuthenticationException"];
882
+ };
883
+ };
884
+ "desarrollador.facturacion": {
885
+ parameters: {
886
+ query?: never;
887
+ header?: never;
888
+ path?: never;
889
+ cookie?: never;
890
+ };
891
+ requestBody?: never;
892
+ responses: {
893
+ 200: {
894
+ headers: {
895
+ [name: string]: unknown;
896
+ };
897
+ content: {
898
+ "application/json": {
899
+ data: {
900
+ canal: {
901
+ estado: string;
902
+ asientos: number;
903
+ quantity: number;
904
+ descuadre: boolean;
905
+ termina_en: string | null;
906
+ } | null;
907
+ asientos: {
908
+ tenant_id: string;
909
+ rol: string;
910
+ en_mora: boolean;
911
+ gracia_hasta: string | null;
912
+ suspendido_desde: string | null;
913
+ }[];
914
+ en_mora: number;
915
+ anadidos: {
916
+ activaciones: number;
917
+ total_cents: number;
918
+ total: string;
919
+ por_tenant: {
920
+ tenant_id: string;
921
+ activaciones: number;
922
+ total_cents: number;
923
+ }[];
924
+ };
925
+ };
926
+ };
927
+ };
928
+ };
929
+ 401: components["responses"]["AuthenticationException"];
930
+ };
931
+ };
932
+ "desarrolladorLink.index": {
933
+ parameters: {
934
+ query?: never;
935
+ header?: never;
936
+ path?: never;
937
+ cookie?: never;
938
+ };
939
+ requestBody?: never;
940
+ responses: {
941
+ 200: {
942
+ headers: {
943
+ [name: string]: unknown;
944
+ };
945
+ content: {
946
+ "application/json": {
947
+ data: {
948
+ id: number;
949
+ link_code: string;
950
+ status: string;
951
+ tenant: {
952
+ id: string;
953
+ name: string;
954
+ status: string;
955
+ } | null;
956
+ requester: {
957
+ id: number;
958
+ name: string;
959
+ email: string;
960
+ } | null;
961
+ /** Format: date-time */
962
+ requested_at: string | null;
963
+ /** Format: date-time */
964
+ accepted_at: string | null;
965
+ /** Format: date-time */
966
+ revoked_at: string | null;
967
+ /** Format: date-time */
968
+ created_at: string | null;
969
+ }[];
970
+ };
971
+ };
972
+ };
973
+ 401: components["responses"]["AuthenticationException"];
974
+ };
975
+ };
976
+ "desarrolladorLink.generateCode": {
977
+ parameters: {
978
+ query?: never;
979
+ header?: never;
980
+ path?: never;
981
+ cookie?: never;
982
+ };
983
+ requestBody?: never;
984
+ responses: {
985
+ 201: {
986
+ headers: {
987
+ [name: string]: unknown;
988
+ };
989
+ content: {
990
+ "application/json": {
991
+ /** @constant */
992
+ message: "Código de vinculación generado.";
993
+ data: {
994
+ id: number;
995
+ link_code: string;
996
+ status: string;
997
+ tenant: {
998
+ id: string;
999
+ name: string;
1000
+ status: string;
1001
+ } | null;
1002
+ requester: {
1003
+ id: number;
1004
+ name: string;
1005
+ email: string;
1006
+ } | null;
1007
+ /** Format: date-time */
1008
+ requested_at: string | null;
1009
+ /** Format: date-time */
1010
+ accepted_at: string | null;
1011
+ /** Format: date-time */
1012
+ revoked_at: string | null;
1013
+ /** Format: date-time */
1014
+ created_at: string | null;
1015
+ };
1016
+ };
1017
+ };
1018
+ };
1019
+ 401: components["responses"]["AuthenticationException"];
1020
+ };
1021
+ };
1022
+ "desarrolladorLink.accept": {
1023
+ parameters: {
1024
+ query?: never;
1025
+ header?: never;
1026
+ path: {
1027
+ id: number;
1028
+ };
1029
+ cookie?: never;
1030
+ };
1031
+ requestBody?: never;
1032
+ responses: {
1033
+ 200: {
1034
+ headers: {
1035
+ [name: string]: unknown;
1036
+ };
1037
+ content: {
1038
+ "application/json": {
1039
+ /** @constant */
1040
+ message: "Vinculación aceptada.";
1041
+ data: {
1042
+ id: number;
1043
+ link_code: string;
1044
+ status: string;
1045
+ tenant: {
1046
+ id: string;
1047
+ name: string;
1048
+ status: string;
1049
+ } | null;
1050
+ requester: {
1051
+ id: number;
1052
+ name: string;
1053
+ email: string;
1054
+ } | null;
1055
+ /** Format: date-time */
1056
+ requested_at: string | null;
1057
+ /** Format: date-time */
1058
+ accepted_at: string | null;
1059
+ /** Format: date-time */
1060
+ revoked_at: string | null;
1061
+ /** Format: date-time */
1062
+ created_at: string | null;
1063
+ };
1064
+ };
1065
+ };
1066
+ };
1067
+ 401: components["responses"]["AuthenticationException"];
1068
+ /**
1069
+ * @description An error
1070
+ *
1071
+ * An error
1072
+ */
1073
+ 422: {
1074
+ headers: {
1075
+ [name: string]: unknown;
1076
+ };
1077
+ content: {
1078
+ "application/json": {
1079
+ /**
1080
+ * @description Error overview.
1081
+ * @example La solicitud no está pendiente.
1082
+ */
1083
+ message: string;
1084
+ } | {
1085
+ /**
1086
+ * @description Error overview.
1087
+ * @example La solicitud no tiene instancia asociada.
1088
+ */
1089
+ message: string;
1090
+ };
1091
+ };
1092
+ };
1093
+ };
1094
+ };
1095
+ "desarrolladorLink.reject": {
1096
+ parameters: {
1097
+ query?: never;
1098
+ header?: never;
1099
+ path: {
1100
+ id: number;
1101
+ };
1102
+ cookie?: never;
1103
+ };
1104
+ requestBody?: never;
1105
+ responses: {
1106
+ 200: {
1107
+ headers: {
1108
+ [name: string]: unknown;
1109
+ };
1110
+ content: {
1111
+ "application/json": {
1112
+ /** @constant */
1113
+ message: "Solicitud rechazada.";
1114
+ };
1115
+ };
1116
+ };
1117
+ 401: components["responses"]["AuthenticationException"];
1118
+ /** @description An error */
1119
+ 422: {
1120
+ headers: {
1121
+ [name: string]: unknown;
1122
+ };
1123
+ content: {
1124
+ "application/json": {
1125
+ /**
1126
+ * @description Error overview.
1127
+ * @example La solicitud no está pendiente.
1128
+ */
1129
+ message: string;
1130
+ };
1131
+ };
1132
+ };
1133
+ };
1134
+ };
1135
+ "desarrolladorLink.clients": {
1136
+ parameters: {
1137
+ query?: never;
1138
+ header?: never;
1139
+ path?: never;
1140
+ cookie?: never;
1141
+ };
1142
+ requestBody?: never;
1143
+ responses: {
1144
+ 200: {
1145
+ headers: {
1146
+ [name: string]: unknown;
1147
+ };
1148
+ content: {
1149
+ "application/json": {
1150
+ data: {
1151
+ client_id: string;
1152
+ name: string;
1153
+ confidential: boolean;
1154
+ scope: string;
1155
+ registration_tenant_id: string;
1156
+ revoked_at: string;
1157
+ created_at: string;
1158
+ }[];
1159
+ };
1160
+ };
1161
+ };
1162
+ 401: components["responses"]["AuthenticationException"];
1163
+ };
1164
+ };
1165
+ "desarrolladorLink.claimClient": {
1166
+ parameters: {
1167
+ query?: never;
1168
+ header?: never;
1169
+ path?: never;
1170
+ cookie?: never;
1171
+ };
1172
+ requestBody: {
1173
+ content: {
1174
+ "application/json": {
1175
+ client_id: string;
1176
+ client_secret?: string | null;
1177
+ };
1178
+ };
1179
+ };
1180
+ responses: {
1181
+ 200: {
1182
+ headers: {
1183
+ [name: string]: unknown;
1184
+ };
1185
+ content: {
1186
+ "application/json": {
1187
+ message: string;
1188
+ };
1189
+ };
1190
+ };
1191
+ 401: components["responses"]["AuthenticationException"];
1192
+ 403: {
1193
+ headers: {
1194
+ [name: string]: unknown;
1195
+ };
1196
+ content: {
1197
+ "application/json": {
1198
+ /** @constant */
1199
+ error: "ownership_not_provable";
1200
+ /** @constant */
1201
+ message: "Este client es público (sin secret). Solo puedes reclamarlo si se registró desde una instancia vinculada a tu cuenta.";
1202
+ } | {
1203
+ /** @constant */
1204
+ error: "invalid_client_secret";
1205
+ /** @constant */
1206
+ message: "El client_secret no coincide. Solo quien lo tiene puede reclamar el client.";
1207
+ };
1208
+ };
1209
+ };
1210
+ 404: components["responses"]["ModelNotFoundException"];
1211
+ 409: {
1212
+ headers: {
1213
+ [name: string]: unknown;
1214
+ };
1215
+ content: {
1216
+ "application/json": {
1217
+ /** @constant */
1218
+ error: "already_owned";
1219
+ /** @constant */
1220
+ message: "Ese client ya pertenece a otra cuenta.";
1221
+ };
1222
+ };
1223
+ };
1224
+ 422: components["responses"]["ValidationException"];
1225
+ };
1226
+ };
1227
+ "integradorActivacion.index": {
1228
+ parameters: {
1229
+ query?: never;
1230
+ header?: never;
1231
+ path: {
1232
+ slug: string;
1233
+ };
1234
+ cookie?: never;
1235
+ };
1236
+ requestBody?: never;
1237
+ responses: {
1238
+ 200: {
1239
+ headers: {
1240
+ [name: string]: unknown;
1241
+ };
1242
+ content: {
1243
+ "application/json": {
1244
+ data: {
1245
+ base: {
1246
+ active: boolean;
1247
+ price_cents: number | null;
1248
+ price: string | null;
1249
+ plan: string | null;
1250
+ };
1251
+ items: {
1252
+ kind: string;
1253
+ slug: string;
1254
+ name: string;
1255
+ active_since: string;
1256
+ price_cents: number | null;
1257
+ price: string | null;
1258
+ }[];
1259
+ total_cents: number;
1260
+ total: string;
1261
+ };
1262
+ };
1263
+ };
1264
+ };
1265
+ 401: components["responses"]["AuthenticationException"];
1266
+ };
1267
+ };
1268
+ "integradorActivacion.store": {
1269
+ parameters: {
1270
+ query?: never;
1271
+ header?: never;
1272
+ path: {
1273
+ slug: string;
1274
+ };
1275
+ cookie?: never;
1276
+ };
1277
+ requestBody: {
1278
+ content: {
1279
+ "application/json": {
1280
+ /** @enum {string} */
1281
+ kind: "base" | "module" | "app";
1282
+ slug: string;
1283
+ plan_id?: number | null;
1284
+ return_url?: string | null;
1285
+ };
1286
+ };
1287
+ };
1288
+ responses: {
1289
+ 200: {
1290
+ headers: {
1291
+ [name: string]: unknown;
1292
+ };
1293
+ content: {
1294
+ "application/json": {
1295
+ /** @enum {string} */
1296
+ message: "Completa el alta de tu suscripción de canal para activar la licencia de este cliente." | "El cliente ya lo tenía encendido por su cuenta: no se te cobra ni se le toca." | "Ya estaba activo." | "Activado: se cobra en tu canal desde la próxima factura.";
1297
+ data: {
1298
+ already_active: boolean;
1299
+ inherited: boolean;
1300
+ checkout_url: string | null;
1301
+ quantity: number | null;
1302
+ activation: {
1303
+ [key: string]: unknown;
1304
+ } | null;
1305
+ };
1306
+ } | string;
1307
+ };
1308
+ };
1309
+ 201: {
1310
+ headers: {
1311
+ [name: string]: unknown;
1312
+ };
1313
+ content: {
1314
+ "application/json": {
1315
+ /** @enum {string} */
1316
+ message: "Completa el alta de tu suscripción de canal para activar la licencia de este cliente." | "El cliente ya lo tenía encendido por su cuenta: no se te cobra ni se le toca." | "Ya estaba activo." | "Activado: se cobra en tu canal desde la próxima factura.";
1317
+ data: {
1318
+ already_active: boolean;
1319
+ inherited: boolean;
1320
+ checkout_url: string | null;
1321
+ quantity: number | null;
1322
+ activation: {
1323
+ [key: string]: unknown;
1324
+ } | null;
1325
+ };
1326
+ };
1327
+ };
1328
+ };
1329
+ 401: components["responses"]["AuthenticationException"];
1330
+ 422: components["responses"]["ValidationException"];
1331
+ };
1332
+ };
1333
+ "integradorActivacion.destroy": {
1334
+ parameters: {
1335
+ query?: never;
1336
+ header?: never;
1337
+ path: {
1338
+ slug: string;
1339
+ kind: string;
1340
+ item: string;
1341
+ };
1342
+ cookie?: never;
1343
+ };
1344
+ requestBody?: never;
1345
+ responses: {
1346
+ 200: {
1347
+ headers: {
1348
+ [name: string]: unknown;
1349
+ };
1350
+ content: {
1351
+ "application/json": {
1352
+ message: string;
1353
+ data: {
1354
+ quantity: number | null;
1355
+ };
1356
+ };
1357
+ };
1358
+ };
1359
+ 401: components["responses"]["AuthenticationException"];
1360
+ 404: components["responses"]["ModelNotFoundException"];
1361
+ };
1362
+ };
1363
+ "integradorCatalogo.show": {
1364
+ parameters: {
1365
+ query?: never;
1366
+ header?: never;
1367
+ path?: never;
1368
+ cookie?: never;
1369
+ };
1370
+ requestBody?: never;
1371
+ responses: {
1372
+ 200: {
1373
+ headers: {
1374
+ [name: string]: unknown;
1375
+ };
1376
+ content: {
1377
+ "application/json": {
1378
+ data: {
1379
+ perfil: {
1380
+ nombre_comercial: string;
1381
+ soporte_url: string | null;
1382
+ soporte_email: string | null;
1383
+ } | null;
1384
+ currency: string | null;
1385
+ contract_url: string | null;
1386
+ items: {
1387
+ kind: string;
1388
+ slug: string;
1389
+ name: string;
1390
+ description: string | null;
1391
+ price_cents: number;
1392
+ price: string | null;
1393
+ contract_url: string | null;
1394
+ enabled: boolean;
1395
+ }[];
1396
+ disponibles: {
1397
+ base: {
1398
+ slug: string;
1399
+ name: string;
1400
+ description: string | null;
1401
+ wholesale_price_cents: number | null;
1402
+ wholesale_price: string | null;
1403
+ }[];
1404
+ modules: {
1405
+ slug: string;
1406
+ name: string;
1407
+ description: string | null;
1408
+ wholesale_price_cents: number | null;
1409
+ wholesale_price: string | null;
1410
+ }[];
1411
+ apps: {
1412
+ slug: string;
1413
+ name: string;
1414
+ description: string | null;
1415
+ wholesale_price_cents: number | null;
1416
+ wholesale_price: string | null;
1417
+ }[];
1418
+ };
1419
+ };
1420
+ };
1421
+ };
1422
+ };
1423
+ 401: components["responses"]["AuthenticationException"];
1424
+ };
1425
+ };
1426
+ "integradorCatalogo.update": {
1427
+ parameters: {
1428
+ query?: never;
1429
+ header?: never;
1430
+ path?: never;
1431
+ cookie?: never;
1432
+ };
1433
+ requestBody: {
1434
+ content: {
1435
+ "application/json": components["schemas"]["IntegradorCatalogoRequest"];
1436
+ };
1437
+ };
1438
+ responses: {
1439
+ 200: {
1440
+ headers: {
1441
+ [name: string]: unknown;
1442
+ };
1443
+ content: {
1444
+ "application/json": {
1445
+ data: {
1446
+ perfil: {
1447
+ nombre_comercial: string;
1448
+ soporte_url: string | null;
1449
+ soporte_email: string | null;
1450
+ } | null;
1451
+ currency: string | null;
1452
+ contract_url: string | null;
1453
+ items: {
1454
+ kind: string;
1455
+ slug: string;
1456
+ name: string;
1457
+ description: string | null;
1458
+ price_cents: number;
1459
+ price: string | null;
1460
+ contract_url: string | null;
1461
+ enabled: boolean;
1462
+ }[];
1463
+ disponibles: {
1464
+ base: {
1465
+ slug: string;
1466
+ name: string;
1467
+ description: string | null;
1468
+ wholesale_price_cents: number | null;
1469
+ wholesale_price: string | null;
1470
+ }[];
1471
+ modules: {
1472
+ slug: string;
1473
+ name: string;
1474
+ description: string | null;
1475
+ wholesale_price_cents: number | null;
1476
+ wholesale_price: string | null;
1477
+ }[];
1478
+ apps: {
1479
+ slug: string;
1480
+ name: string;
1481
+ description: string | null;
1482
+ wholesale_price_cents: number | null;
1483
+ wholesale_price: string | null;
1484
+ }[];
1485
+ };
1486
+ };
1487
+ };
1488
+ };
1489
+ };
1490
+ 401: components["responses"]["AuthenticationException"];
1491
+ 422: components["responses"]["ValidationException"];
1492
+ };
1493
+ };
1494
+ "integradorDominio.index": {
1495
+ parameters: {
1496
+ query?: never;
1497
+ header?: never;
1498
+ path?: never;
1499
+ cookie?: never;
1500
+ };
1501
+ requestBody?: never;
1502
+ responses: {
1503
+ 200: {
1504
+ headers: {
1505
+ [name: string]: unknown;
1506
+ };
1507
+ content: {
1508
+ "application/json": {
1509
+ data: {
1510
+ slug: string;
1511
+ host: string;
1512
+ enabled: boolean;
1513
+ login_url: string;
1514
+ upstream: string;
1515
+ proxy_secret: string;
1516
+ proxy: string;
1517
+ created_at: string | null;
1518
+ }[];
1519
+ };
1520
+ };
1521
+ };
1522
+ 401: components["responses"]["AuthenticationException"];
1523
+ };
1524
+ };
1525
+ "integradorDominio.store": {
1526
+ parameters: {
1527
+ query?: never;
1528
+ header?: never;
1529
+ path?: never;
1530
+ cookie?: never;
1531
+ };
1532
+ requestBody: {
1533
+ content: {
1534
+ "application/json": {
1535
+ slug: string;
1536
+ host: string;
1537
+ };
1538
+ };
1539
+ };
1540
+ responses: {
1541
+ 201: {
1542
+ headers: {
1543
+ [name: string]: unknown;
1544
+ };
1545
+ content: {
1546
+ "application/json": {
1547
+ /** @constant */
1548
+ message: "Nombre declarado. Apunta tu proxy al upstream y reenvía el nombre público en X-Forwarded-Host.";
1549
+ data: {
1550
+ slug: string;
1551
+ host: string;
1552
+ enabled: boolean;
1553
+ login_url: string;
1554
+ upstream: string;
1555
+ proxy_secret: string;
1556
+ proxy: string;
1557
+ created_at: string | null;
1558
+ };
1559
+ };
1560
+ };
1561
+ };
1562
+ 401: components["responses"]["AuthenticationException"];
1563
+ 422: components["responses"]["ValidationException"];
1564
+ };
1565
+ };
1566
+ "integradorDominio.destroy": {
1567
+ parameters: {
1568
+ query?: never;
1569
+ header?: never;
1570
+ path: {
1571
+ slug: string;
1572
+ };
1573
+ cookie?: never;
1574
+ };
1575
+ requestBody?: never;
1576
+ responses: {
1577
+ 200: {
1578
+ headers: {
1579
+ [name: string]: unknown;
1580
+ };
1581
+ content: {
1582
+ "application/json": {
1583
+ message: string;
1584
+ };
1585
+ };
1586
+ };
1587
+ 401: components["responses"]["AuthenticationException"];
1588
+ };
1589
+ };
1590
+ "integradorToken.index": {
1591
+ parameters: {
1592
+ query?: never;
1593
+ header?: never;
1594
+ path?: never;
1595
+ cookie?: never;
1596
+ };
1597
+ requestBody?: never;
1598
+ responses: {
1599
+ 200: {
1600
+ headers: {
1601
+ [name: string]: unknown;
1602
+ };
1603
+ content: {
1604
+ "application/json": {
1605
+ data: {
1606
+ id: number;
1607
+ name: string;
1608
+ abilities: string[];
1609
+ last_used_at: string | null;
1610
+ expires_at: string | null;
1611
+ created_at: string | null;
1612
+ }[];
1613
+ };
1614
+ };
1615
+ };
1616
+ 401: components["responses"]["AuthenticationException"];
1617
+ };
1618
+ };
1619
+ "integradorToken.store": {
1620
+ parameters: {
1621
+ query?: never;
1622
+ header?: never;
1623
+ path?: never;
1624
+ cookie?: never;
1625
+ };
1626
+ requestBody: {
1627
+ content: {
1628
+ "application/json": {
1629
+ name: string;
1630
+ };
1631
+ };
1632
+ };
1633
+ responses: {
1634
+ 201: {
1635
+ headers: {
1636
+ [name: string]: unknown;
1637
+ };
1638
+ content: {
1639
+ "application/json": {
1640
+ /** @constant */
1641
+ message: "Token creado. Guárdalo ahora: no se vuelve a enseñar.";
1642
+ data: {
1643
+ token: string;
1644
+ id: number;
1645
+ name: string;
1646
+ abilities: unknown[];
1647
+ last_used_at: string | null;
1648
+ expires_at: string | null;
1649
+ created_at: string | null;
1650
+ };
1651
+ };
1652
+ };
1653
+ };
1654
+ 401: components["responses"]["AuthenticationException"];
1655
+ 403: {
1656
+ headers: {
1657
+ [name: string]: unknown;
1658
+ };
1659
+ content: {
1660
+ "application/json": {
1661
+ /** @constant */
1662
+ error: "session_required";
1663
+ /** @constant */
1664
+ message: "Un token de máquina no acuña otros: entra con tu cuenta (o usa el token de la sesión del panel) para crearlo.";
1665
+ };
1666
+ };
1667
+ };
1668
+ 422: components["responses"]["ValidationException"];
1669
+ };
1670
+ };
1671
+ "integradorToken.destroy": {
1672
+ parameters: {
1673
+ query?: never;
1674
+ header?: never;
1675
+ path: {
1676
+ id: number;
1677
+ };
1678
+ cookie?: never;
1679
+ };
1680
+ requestBody?: never;
1681
+ responses: {
1682
+ 200: {
1683
+ headers: {
1684
+ [name: string]: unknown;
1685
+ };
1686
+ content: {
1687
+ "application/json": {
1688
+ message: string;
1689
+ };
1690
+ };
1691
+ };
1692
+ 401: components["responses"]["AuthenticationException"];
1693
+ };
1694
+ };
1695
+ "tenant.transferOwnership": {
1696
+ parameters: {
1697
+ query?: never;
1698
+ header?: never;
1699
+ path: {
1700
+ slug: string;
1701
+ };
1702
+ cookie?: never;
1703
+ };
1704
+ requestBody: {
1705
+ content: {
1706
+ "application/json": {
1707
+ user_id: number;
1708
+ };
1709
+ };
1710
+ };
1711
+ responses: {
1712
+ 200: {
1713
+ headers: {
1714
+ [name: string]: unknown;
1715
+ };
1716
+ content: {
1717
+ "application/json": {
1718
+ message: string;
1719
+ data: {
1720
+ tenant_id: string;
1721
+ owner_id: number;
1722
+ /** @enum {string} */
1723
+ billing_mode: "sponsor" | "self";
1724
+ };
1725
+ };
1726
+ };
1727
+ };
1728
+ 401: components["responses"]["AuthenticationException"];
1729
+ /** @description An error */
1730
+ 403: {
1731
+ headers: {
1732
+ [name: string]: unknown;
1733
+ };
1734
+ content: {
1735
+ "application/json": {
1736
+ /**
1737
+ * @description Error overview.
1738
+ * @example Solo el propietario actual puede traspasar la instancia.
1739
+ */
1740
+ message: string;
1741
+ };
1742
+ };
1743
+ };
1744
+ 422: components["responses"]["ValidationException"];
1745
+ };
1746
+ };
1747
+ "tenant.users": {
1748
+ parameters: {
1749
+ query?: never;
1750
+ header?: never;
1751
+ path: {
1752
+ slug: string;
1753
+ };
1754
+ cookie?: never;
1755
+ };
1756
+ requestBody?: never;
1757
+ responses: {
1758
+ 200: {
1759
+ headers: {
1760
+ [name: string]: unknown;
1761
+ };
1762
+ content: {
1763
+ "application/json": {
1764
+ data: {
1765
+ id: number;
1766
+ name: string;
1767
+ email: string;
1768
+ role: string;
1769
+ invited_at: string | null;
1770
+ is_owner: boolean;
1771
+ }[];
1772
+ };
1773
+ };
1774
+ };
1775
+ 401: components["responses"]["AuthenticationException"];
1776
+ };
1777
+ };
1778
+ "tenantInvitation.index": {
1779
+ parameters: {
1780
+ query?: never;
1781
+ header?: never;
1782
+ path?: never;
1783
+ cookie?: never;
1784
+ };
1785
+ requestBody?: never;
1786
+ responses: {
1787
+ 200: {
1788
+ headers: {
1789
+ [name: string]: unknown;
1790
+ };
1791
+ content: {
1792
+ "application/json": {
1793
+ data: {
1794
+ id: string;
1795
+ email: string;
1796
+ company_name: string;
1797
+ billing: string;
1798
+ status: string;
1799
+ expires_at: string;
1800
+ accepted_tenant_id: string;
1801
+ accepted_at: string;
1802
+ created_at: string;
1803
+ }[];
1804
+ };
1805
+ };
1806
+ };
1807
+ 401: components["responses"]["AuthenticationException"];
1808
+ };
1809
+ };
1810
+ "tenantInvitation.store": {
1811
+ parameters: {
1812
+ query?: never;
1813
+ header?: never;
1814
+ path?: never;
1815
+ cookie?: never;
1816
+ };
1817
+ requestBody: {
1818
+ content: {
1819
+ "application/json": {
1820
+ /** Format: email */
1821
+ email: string;
1822
+ company_name?: string | null;
1823
+ /**
1824
+ * @description `despacho|cliente` es el vocabulario de la gestoría; `sponsor|self`
1825
+ * el general del modelo de facturación (Tenant::BILLING_*). Se
1826
+ * aceptan los dos y se guarda el de siempre, para no partir la
1827
+ * columna ni el asistente en dos.
1828
+ * @enum {string}
1829
+ */
1830
+ billing?: "despacho" | "cliente" | "sponsor" | "self";
1831
+ };
1832
+ };
1833
+ };
1834
+ responses: {
1835
+ 201: {
1836
+ headers: {
1837
+ [name: string]: unknown;
1838
+ };
1839
+ content: {
1840
+ "application/json": {
1841
+ message: string;
1842
+ data: {
1843
+ id: string;
1844
+ email: string;
1845
+ company_name: string;
1846
+ billing: string;
1847
+ status: string;
1848
+ expires_at: string;
1849
+ accepted_tenant_id: string;
1850
+ accepted_at: string;
1851
+ created_at: string;
1852
+ };
1853
+ };
1854
+ };
1855
+ };
1856
+ 401: components["responses"]["AuthenticationException"];
1857
+ /** @description An error */
1858
+ 403: {
1859
+ headers: {
1860
+ [name: string]: unknown;
1861
+ };
1862
+ content: {
1863
+ "application/json": {
1864
+ /** @constant */
1865
+ error: "invitation_quota_exceeded";
1866
+ message: string;
1867
+ } | {
1868
+ /**
1869
+ * @description Error overview.
1870
+ * @example Solo las gestorías y los desarrolladores pueden enviar invitaciones a clientes.
1871
+ */
1872
+ message: string;
1873
+ };
1874
+ };
1875
+ };
1876
+ 422: components["responses"]["ValidationException"];
1877
+ 502: {
1878
+ headers: {
1879
+ [name: string]: unknown;
1880
+ };
1881
+ content: {
1882
+ "application/json": {
1883
+ /** @constant */
1884
+ message: "No se pudo enviar el email de invitación. Revisa la configuración de correo e inténtalo de nuevo.";
1885
+ };
1886
+ };
1887
+ };
1888
+ };
1889
+ };
1890
+ "tenantInvitation.destroy": {
1891
+ parameters: {
1892
+ query?: never;
1893
+ header?: never;
1894
+ path: {
1895
+ /** @description The invitation ID */
1896
+ invitation: number;
1897
+ };
1898
+ cookie?: never;
1899
+ };
1900
+ requestBody?: never;
1901
+ responses: {
1902
+ 200: {
1903
+ headers: {
1904
+ [name: string]: unknown;
1905
+ };
1906
+ content: {
1907
+ "application/json": {
1908
+ /** @constant */
1909
+ message: "Invitación revocada.";
1910
+ };
1911
+ };
1912
+ };
1913
+ 401: components["responses"]["AuthenticationException"];
1914
+ 404: components["responses"]["ModelNotFoundException"];
1915
+ 422: {
1916
+ headers: {
1917
+ [name: string]: unknown;
1918
+ };
1919
+ content: {
1920
+ "application/json": {
1921
+ /** @constant */
1922
+ message: "Solo se pueden revocar invitaciones pendientes.";
1923
+ };
1924
+ };
1925
+ };
1926
+ };
1927
+ };
1928
+ }