valtech-components 4.0.989 → 4.0.991

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.
@@ -3,7 +3,7 @@ import { FormControl } from '@angular/forms';
3
3
  import { ButtonMetadata } from '../../types';
4
4
  import type { Color } from '@ionic/core';
5
5
  import { EditableFieldDef, FieldSchemaEditorMetadata } from '../field-schema-editor/types';
6
- import { SurveyBuilderMetadata, SurveyBuilderSaveEvent } from './types';
6
+ import { SurveyBuilderMetadata, SurveyBuilderSaveEvent, SurveyDraftEvent } from './types';
7
7
  import * as i0 from "@angular/core";
8
8
  /**
9
9
  * val-survey-builder
@@ -25,6 +25,13 @@ import * as i0 from "@angular/core";
25
25
  export declare class SurveyBuilderComponent implements OnInit {
26
26
  props: SurveyBuilderMetadata;
27
27
  readonly saved: EventEmitter<SurveyBuilderSaveEvent>;
28
+ /**
29
+ * Emite lo escrito, ya validado, SIN guardarlo. Solo con `props.persist:
30
+ * false` — ver el comentario de ese campo: cuando la app tiene endpoint
31
+ * propio, guardar desde acá se salta la validación de la entidad dueña y el
32
+ * permiso de la vertical.
33
+ */
34
+ readonly draft: EventEmitter<SurveyDraftEvent>;
28
35
  private readonly i18n;
29
36
  private readonly requests;
30
37
  private readonly formBuilder;
@@ -61,5 +68,5 @@ export declare class SurveyBuilderComponent implements OnInit {
61
68
  save(): Promise<void>;
62
69
  private rowFromField;
63
70
  static ɵfac: i0.ɵɵFactoryDeclaration<SurveyBuilderComponent, never>;
64
- static ɵcmp: i0.ɵɵComponentDeclaration<SurveyBuilderComponent, "val-survey-builder", never, { "props": { "alias": "props"; "required": false; }; }, { "saved": "saved"; }, never, never, true, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<SurveyBuilderComponent, "val-survey-builder", never, { "props": { "alias": "props"; "required": false; }; }, { "saved": "saved"; "draft": "draft"; }, never, never, true, never>;
65
72
  }
@@ -1,4 +1,4 @@
1
- import { EntityRef, RequestTypeConfig, RequestVisibility } from '../../../services/requests/types';
1
+ import { EntityRef, FieldSchemaDef, RequestTypeConfig, RequestVisibility } from '../../../services/requests/types';
2
2
  /**
3
3
  * Tipos de pregunta que ofrece una encuesta.
4
4
  *
@@ -46,7 +46,34 @@ export interface SurveyBuilderMetadata {
46
46
  allowAnonymous?: boolean;
47
47
  /** Acota el catálogo de `SURVEY_QUESTION_TYPES` si una app quiere ofrecer menos. */
48
48
  questionTypes?: string[];
49
+ /**
50
+ * Si el builder guarda por su cuenta contra `/v2/request-types`.
51
+ *
52
+ * Default `true` por compatibilidad, pero **una app con endpoint propio debe
53
+ * pasar `false`** y guardar ella: el endpoint de la vertical es el que valida
54
+ * la entidad dueña, evita que dos encuestas de distinto evento colisionen en
55
+ * el mismo `typeId`, y autoriza con SU permiso. Con `false`, `save()` valida
56
+ * y emite `draft` sin tocar la red.
57
+ */
58
+ persist?: boolean;
49
59
  }
50
60
  export interface SurveyBuilderSaveEvent {
51
61
  typeConfig: RequestTypeConfig;
52
62
  }
63
+ /**
64
+ * Lo que se escribió, sin persistir.
65
+ *
66
+ * Existe porque **el builder no siempre debe guardar por su cuenta**. Cuando la
67
+ * app tiene su propio endpoint de dominio (el de bingo valida el evento, acota
68
+ * el `typeId` para que dos eventos no colisionen y autoriza con el permiso de
69
+ * la vertical en vez de `apps:manage`), guardar desde acá se salta todo eso.
70
+ *
71
+ * Los tres campos son exactamente los de `CreateEventSurveyRequest` en
72
+ * `services/bingo/survey.go` — no es casualidad: es el contrato que la app
73
+ * necesita reenviar.
74
+ */
75
+ export interface SurveyDraftEvent {
76
+ label: string;
77
+ subtitle: string;
78
+ questions: FieldSchemaDef[];
79
+ }
@@ -16,7 +16,15 @@ export declare const EXPECTED_NOT_FOUND: HttpContextToken<boolean>;
16
16
  * Interceptor HTTP de observabilidad (Capa 1 del estándar de manejo de errores).
17
17
  *
18
18
  * Para CADA respuesta HTTP con error:
19
- * 1. Normaliza el error con `interpretError`.
19
+ * 0. Si es un GET (idempotente) que falló con 502/503/504, reintenta hasta 2
20
+ * veces con un backoff corto (400ms/800ms) ANTES de pasar al resto del
21
+ * pipeline — el caso típico es un cold-start de Lambda en dev: 3-4
22
+ * requests en paralelo al bootstrap (auth/profile + runs + org/{id})
23
+ * pegan contra lambdas frías al mismo tiempo, todas 504, y ~2s después ya
24
+ * están tibias y funcionan. Detectado en Merotz dev 2026-08-17. Nunca
25
+ * reintenta POST/PUT/DELETE/PATCH (no son idempotentes) ni 4xx (error de
26
+ * negocio, reintentar no lo arregla).
27
+ * 1. Si sigue fallando tras los reintentos: normaliza el error con `interpretError`.
20
28
  * 2. Loguea un evento estructurado a consola con el prefijo `[HTTP]`.
21
29
  * 3. Reporta el error a Firebase Analytics (`source: 'http'`), si hay analytics.
22
30
  *
@@ -0,0 +1,14 @@
1
+ import { EnvironmentProviders, InjectionToken } from '@angular/core';
2
+ import { ValtechPaymentsConfig } from './types';
3
+ /** Token de inyección de la configuración de pagos. */
4
+ export declare const VALTECH_PAYMENTS_CONFIG: InjectionToken<ValtechPaymentsConfig>;
5
+ export declare const DEFAULT_PAYMENTS_CONFIG: Partial<ValtechPaymentsConfig>;
6
+ /**
7
+ * Provee el cliente de pasarelas de pago.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * providePaymentsGateway({ apiUrl: environment.apiUrl }),
12
+ * ```
13
+ */
14
+ export declare function providePaymentsGateway(config: ValtechPaymentsConfig): EnvironmentProviders;
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './config';
3
+ export * from './payments-gateway.service';
@@ -0,0 +1,53 @@
1
+ import { Observable } from 'rxjs';
2
+ import { ConnectionStatusResponse, OAuthAuthorizeURLResponse } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Cliente del onboarding de pasarelas de pago (ADR-028).
6
+ *
7
+ * Conecta la cuenta de UNA ORGANIZACIÓN con una pasarela, para que el dinero
8
+ * le llegue directo. Ese es el punto: si el dinero pasara por una cuenta de
9
+ * Valtech, Valtech sería un PSP regulado por la CMF (ver ADR-028). Por eso
10
+ * todas las operaciones son por `orgId`, y no existe acá un modo "cuenta de la
11
+ * plataforma".
12
+ *
13
+ * Vive en la lib y no en una app porque el flujo es idéntico en todas: Bingo
14
+ * lo usa para que cada colegio cobre sus cartones, y Chesed para que cada
15
+ * refugio reciba aportes. Lo que cambia entre apps es qué se cobra, no cómo se
16
+ * conecta la cuenta.
17
+ *
18
+ * Autenticación: no agrega el Bearer a mano — lo pone el interceptor de
19
+ * `provideValtechAuth`. Errores: no se capturan acá; los maneja la pantalla.
20
+ */
21
+ export declare class PaymentsGatewayService {
22
+ private http;
23
+ private config;
24
+ private get base();
25
+ /**
26
+ * Estado de conexión de la organización con una pasarela.
27
+ *
28
+ * Es lo que decide si la app puede ofrecer el cobro: `connected` habilita,
29
+ * `expired` y `revoked` NO. Mostrar un botón de pago con un token revocado
30
+ * lleva al usuario a un cobro que falla después de que ya decidió pagar.
31
+ */
32
+ getConnectionStatus(orgId: string, gateway: string): Observable<ConnectionStatusResponse>;
33
+ /**
34
+ * URL de autorización OAuth, con su `state` CSRF.
35
+ *
36
+ * El caller guarda el `state` antes de redirigir y lo compara al volver: sin
37
+ * eso, cualquiera podría completar la conexión de otra organización.
38
+ */
39
+ getOAuthAuthorizeURL(orgId: string, gateway: string): Observable<OAuthAuthorizeURLResponse>;
40
+ /** Desconecta la credencial de la organización para esa pasarela. */
41
+ disconnect(orgId: string, gateway: string): Observable<{
42
+ operationId: string;
43
+ }>;
44
+ /**
45
+ * Guarda una credencial de acceso directo (pasarelas sin OAuth, ej. Khipu).
46
+ * El token es el secreto del cobrador.
47
+ */
48
+ setCredential(orgId: string, gateway: string, accessToken: string): Observable<{
49
+ operationId: string;
50
+ }>;
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<PaymentsGatewayService, never>;
52
+ static ɵprov: i0.ɵɵInjectableDeclaration<PaymentsGatewayService>;
53
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Contratos del onboarding de pasarelas de pago (ADR-028).
3
+ *
4
+ * Espejo reducido del backend: solo lo que una app necesita para conectar la
5
+ * cuenta de una organización y saber si puede cobrar.
6
+ */
7
+ /** Estado del ciclo de vida de una credencial OAuth. */
8
+ export type OAuthStatus = 'never' | 'connected' | 'expired' | 'revoked';
9
+ /**
10
+ * Respuesta de `connection-status`. No expone el token: solo un enmascarado
11
+ * informativo, porque la UI nunca necesita el secreto.
12
+ */
13
+ export interface ConnectionStatusResponse {
14
+ operationId: string;
15
+ connected: boolean;
16
+ oauthStatus: OAuthStatus;
17
+ connectedAt?: string;
18
+ maskedToken?: string;
19
+ }
20
+ /** Respuesta de `oauth/authorize-url`. */
21
+ export interface OAuthAuthorizeURLResponse {
22
+ operationId: string;
23
+ authorizeUrl: string;
24
+ /** CSRF. El caller lo guarda antes de redirigir y lo compara al volver. */
25
+ state: string;
26
+ }
27
+ /** Configuración del cliente de pagos. */
28
+ export interface ValtechPaymentsConfig {
29
+ /** Base del backend, sin barra final (ej. `https://api-dev.myvaltech.com`). */
30
+ apiUrl: string;
31
+ /** Prefijo de la API de pagos. Default `/v1/payments`. */
32
+ paymentsPrefix?: string;
33
+ }
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "4.0.989";
5
+ export declare const VERSION = "4.0.991";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "4.0.989",
3
+ "version": "4.0.991",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -500,6 +500,7 @@ export * from './lib/components/organisms/verify-view/verify-view.component';
500
500
  export * from './lib/components/organisms/verify-view/types';
501
501
  export * from './lib/services/content-platform';
502
502
  export * from './lib/services/feedback';
503
+ export * from './lib/services/payments';
503
504
  export * from './lib/services/whatsapp';
504
505
  export * from './lib/components/organisms/whatsapp-fab/whatsapp-fab.component';
505
506
  export * from './lib/services/phone-format/phone-format.service';