apacuana-sdk-core 0.6.2 → 0.7.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.
Files changed (35) hide show
  1. package/README.md +105 -288
  2. package/coverage/clover.xml +142 -136
  3. package/coverage/coverage-final.json +5 -5
  4. package/coverage/lcov-report/index.html +34 -34
  5. package/coverage/lcov-report/src/api/certs.js.html +34 -7
  6. package/coverage/lcov-report/src/api/index.html +19 -19
  7. package/coverage/lcov-report/src/api/revocations.js.html +135 -30
  8. package/coverage/lcov-report/src/api/signatures.js.html +76 -4
  9. package/coverage/lcov-report/src/api/users.js.html +1 -1
  10. package/coverage/lcov-report/src/config/index.html +13 -13
  11. package/coverage/lcov-report/src/config/index.js.html +69 -18
  12. package/coverage/lcov-report/src/errors/index.html +1 -1
  13. package/coverage/lcov-report/src/errors/index.js.html +1 -1
  14. package/coverage/lcov-report/src/index.html +15 -15
  15. package/coverage/lcov-report/src/index.js.html +14 -68
  16. package/coverage/lcov-report/src/utils/constant.js.html +1 -1
  17. package/coverage/lcov-report/src/utils/helpers.js.html +1 -1
  18. package/coverage/lcov-report/src/utils/httpClient.js.html +1 -1
  19. package/coverage/lcov-report/src/utils/index.html +1 -1
  20. package/coverage/lcov.info +224 -216
  21. package/dist/api/certs.d.ts +11 -1
  22. package/dist/api/revocations.d.ts +32 -12
  23. package/dist/api/signatures.d.ts +37 -5
  24. package/dist/config/index.d.ts +13 -2
  25. package/dist/index.d.ts +4 -1
  26. package/dist/index.js +160 -75
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +160 -75
  29. package/dist/index.mjs.map +1 -1
  30. package/package.json +1 -1
  31. package/src/api/certs.js +12 -3
  32. package/src/api/revocations.js +55 -20
  33. package/src/api/signatures.js +25 -1
  34. package/src/config/index.js +25 -8
  35. package/src/index.js +4 -22
package/README.md CHANGED
@@ -53,22 +53,19 @@ Inicializa el SDK con la configuración proporcionada.
53
53
 
54
54
  - `Promise<boolean>` que se resuelve a `true` cuando la inicialización es exitosa.
55
55
 
56
+ ### close()
57
+
58
+ Cierra la sesión actual del SDK y restablece la configuración a sus valores por defecto, dejando la instancia lista para una nueva inicialización.
59
+
60
+ **Parámetros:** Ninguno
61
+
62
+ **Retorna:** Nada
63
+
56
64
  **Ejemplo:**
57
65
 
58
66
  ```javascript
59
- try {
60
- await apacuana.init({
61
- apiUrl: "https://api.apacuana.com",
62
- secretKey: "YOUR_SECRET_KEY",
63
- apiKey: "YOUR_API_KEY",
64
- verificationId: "VERIFICATION_ID",
65
- customerId: "CUSTOMER_ID",
66
- integrationType: "ONBOARDING",
67
- });
68
- console.log("SDK inicializado correctamente");
69
- } catch (error) {
70
- console.error("Error al inicializar el SDK:", error);
71
- }
67
+ apacuana.close();
68
+ console.log("La sesión del SDK ha sido cerrada.");
72
69
  ```
73
70
 
74
71
  ### getConfig()
@@ -81,18 +78,11 @@ Obtiene la configuración actual del SDK.
81
78
 
82
79
  - `Object`: Configuración actual del SDK
83
80
 
84
- **Ejemplo:**
85
-
86
- ```javascript
87
- const config = apacuana.getConfig();
88
- console.log("Configuración actual:", config);
89
- ```
90
-
91
81
  ### getCustomer()
92
82
 
93
83
  Obtiene la información del cliente utilizando los datos de configuración.
94
84
 
95
- **Parámetros:** Ninguno (utiliza `verificationId` y `customerId` de la configuración)
85
+ **Parámetros:** Ninguno
96
86
 
97
87
  **Retorna:**
98
88
 
@@ -101,37 +91,19 @@ Obtiene la información del cliente utilizando los datos de configuración.
101
91
  - `userData` (Object): Datos del usuario.
102
92
  - `success` (Boolean): Indicador de éxito de la operación.
103
93
 
104
- **Ejemplo:**
105
-
106
- ```javascript
107
- try {
108
- const { token, userData, success } = await apacuana.getCustomer();
109
- if (success) {
110
- console.log("Token de sesión:", token);
111
- console.log("Datos del usuario:", userData);
112
- }
113
- } catch (error) {
114
- console.error("Error al obtener información del cliente:", error);
115
- }
116
- ```
117
-
118
- ### generateCert(csr)
94
+ ### generateCert(encryptedCSR)
119
95
 
120
- Genera un certificado digital basado en el tipo de integración configurado. Para la integración `ONBOARDING`, esta función valida la Solicitud de Firma de Certificado (CSR) y la envía a la API de Apacuana para su registro.
96
+ Genera un certificado digital. El comportamiento y el parámetro esperado varían según el `integrationType`.
121
97
 
122
98
  **Parámetros:**
123
99
 
124
- - `csr` (String): Una cadena de texto en formato Base64 que representa la Solicitud de Firma de Certificado.
125
-
126
- **Validaciones:**
100
+ - `encryptedCSR` (`EncryptedCSRObject`): Un objeto que contiene la Solicitud de Firma de Certificado (CSR) encriptada.
101
+ - `csr` (String): La CSR en formato Base64.
127
102
 
128
- - **csr**:
129
- - Es un parámetro requerido.
130
- - Debe ser una cadena de texto (`string`).
131
- - No puede ser una cadena vacía.
132
- - Debe estar codificada en formato Base64 válido.
103
+ **Comportamiento por `integrationType`:**
133
104
 
134
- Si alguna de estas validaciones falla, la función lanzará una `ApacuanaAPIError` con el código `INVALID_PARAMETER` o `INVALID_PARAMETER_FORMAT`.
105
+ - **`ONBOARDING`**: Valida la CSR y la envía a la API para su registro.
106
+ - **`ONPREMISE`**: No soportado. Lanza una `ApacuanaAPIError` con el código `NOT_IMPLEMENTED`.
135
107
 
136
108
  **Retorna:**
137
109
 
@@ -142,20 +114,15 @@ Si alguna de estas validaciones falla, la función lanzará una `ApacuanaAPIErro
142
114
  **Ejemplo:**
143
115
 
144
116
  ```javascript
145
- // Asumiendo que 'myBase64Csr' es una variable que contiene tu CSR en formato Base64
146
- const myBase64Csr = "MIIC...==";
117
+ const myCsrObject = { csr: "MIIC...==" };
147
118
 
148
119
  try {
149
- const { cert, success } = await apacuana.generateCert(myBase64Csr);
120
+ const { cert, success } = await apacuana.generateCert(myCsrObject);
150
121
  if (success) {
151
122
  console.log("Certificado generado exitosamente:", cert);
152
123
  }
153
124
  } catch (error) {
154
- if (error.name === "ApacuanaAPIError") {
155
- console.error(`Error de API (${error.code}):`, error.message);
156
- } else {
157
- console.error("Ocurrió un error inesperado:", error);
158
- }
125
+ console.error("Error al generar el certificado:", error.message);
159
126
  }
160
127
  ```
161
128
 
@@ -173,60 +140,62 @@ Obtiene el estado actual del certificado del usuario.
173
140
  - `status` (String): El estado del certificado (ver sección de Estados de Certificado).
174
141
  - `success` (Boolean): Indicador de éxito de la operación.
175
142
 
176
- **Ejemplo:**
143
+ ### addSigner(signerData)
177
144
 
178
- ```javascript
179
- try {
180
- const { status, success } = apacuana.getCertStatus(true);
181
- if (success) {
182
- console.log("Estado del certificado:", status);
183
- }
184
- } catch (error) {
185
- console.error("Error al obtener estado del certificado:", error);
186
- }
187
- ```
145
+ Agrega un firmante a un documento. El comportamiento y la estructura del objeto `signerData` varían según el `integrationType`.
188
146
 
189
- ### signDocument(signData)
147
+ **Parámetros:**
190
148
 
191
- Firma un documento utilizando un certificado digital y un digest previamente firmado. Esta función es compatible únicamente con el flujo de integración `ONBOARDING`.
149
+ - `signerData` (`OnboardingSignerData` | `object`): Un objeto que contiene la información del firmante.
192
150
 
193
- **Parámetros:**
151
+ ---
194
152
 
195
- - `signData` (`SignDocumentData`): Un objeto que contiene los datos necesarios para la firma.
196
- - `signature` (Object): Objeto con información de la firma.
197
- - `id` (String): ID de la firma.
198
- - `positions` (Array<Object>): Posiciones de la firma en el documento.
199
- - `cert` (String): El certificado del firmante en formato base64.
200
- - `signedDigest` (String): El digest del documento, ya firmado.
153
+ #### Flujo de Integración: ONBOARDING
201
154
 
202
- **Retorna:**
155
+ Para el tipo de integración `ONBOARDING`, la función espera un objeto `signerData` con una estructura específica y realiza validaciones estrictas sobre cada campo.
203
156
 
204
- - `Promise<object>`: Una promesa que se resuelve con la respuesta de la API tras completar la firma.
157
+ **Estructura de `signerData` para ONBOARDING:**
205
158
 
206
- **Posibles `ApacuanaAPIError`:**
159
+ ```json
160
+ {
161
+ "name": "Nombre del Documento",
162
+ "reference": "Referencia Externa",
163
+ "typedoc": "V",
164
+ "doc": "26122862",
165
+ "signature": [
166
+ {
167
+ "page": 1,
168
+ "x": 0.5,
169
+ "y": 0.85
170
+ }
171
+ ]
172
+ }
173
+ ```
207
174
 
208
- - `NOT_IMPLEMENTED`: Si se invoca con un `integrationType` diferente a `ONBOARDING`.
209
- - `INVALID_PARAMETER`: Si los datos en `signData` son incorrectos o están incompletos.
175
+ **Campos de `signerData`:**
210
176
 
211
- **Ejemplo:**
177
+ - **`name`** (`string`, requerido): Nombre del documento.
178
+ - **`reference`** (`string`, requerido): Referencia externa del documento en el gestor documental.
179
+ - **`typedoc`** (`string`, requerido): Tipo de documento de identidad. Valores permitidos: `V`, `P`, `E`.
180
+ - **`doc`** (`string`, requerido): Número del documento de identidad.
181
+ - **`signature`** (`Array<SignaturePosition>`, requerido): Un array de objetos que definen la posición de la firma.
182
+ - **`page`** (`number`, requerido): Número de página (entero positivo).
183
+ - **`x`** (`number`, requerido): Coordenada X (entre 0 y 1).
184
+ - **`y`** (`number`, requerido): Coordenada Y (entre 0 y 1).
212
185
 
213
- ```javascript
214
- const signData = {
215
- signature: {
216
- id: "unique-signature-id",
217
- positions: [{ page: 1, x: 0.5, y: 0.8 }],
218
- },
219
- cert: "base64-encoded-certificate",
220
- signedDigest: "signed-digest-of-the-document",
221
- };
186
+ ---
222
187
 
223
- try {
224
- const response = await apacuana.signDocument(signData);
225
- console.log("Documento firmado exitosamente:", response);
226
- } catch (error) {
227
- console.error("Error al firmar el documento:", error.message);
228
- }
229
- ```
188
+ #### Flujo de Integración: ONPREMISE
189
+
190
+ Esta funcionalidad aún no está implementada para el tipo de integración `ONPREMISE`. Invocar `addSigner` en este modo lanzará una `ApacuanaAPIError` con el código `NOT_IMPLEMENTED`.
191
+
192
+ ---
193
+
194
+ **Retorna:**
195
+
196
+ - `Promise<AddSignerResponse>` que se resuelve con un objeto que contiene:
197
+ - `signer` (String): Un identificador del firmante, construido a partir de `typedoc` y `doc`.
198
+ - `success` (Boolean): Indicador de éxito de la operación.
230
199
 
231
200
  ### getDigest(signData)
232
201
 
@@ -244,11 +213,22 @@ Obtiene el `digest` de un documento que se va a firmar. Este `digest` es un resu
244
213
  - `digest` (String): El digest del documento a firmar.
245
214
  - `success` (Boolean): Indicador de éxito de la operación.
246
215
 
247
- **Posibles `ApacuanaAPIError`:**
216
+ ### signDocument(signData)
217
+
218
+ Firma un documento utilizando un certificado digital y un digest previamente firmado. Esta función es compatible únicamente con el flujo de integración `ONBOARDING`.
219
+
220
+ **Parámetros:**
221
+
222
+ - `signData` (`SignDocumentData`): Un objeto que contiene los datos necesarios para la firma.
223
+ - `signature` (Object): Objeto con información de la firma.
224
+ - `id` (String): ID de la firma.
225
+ - `positions` (Array<Object>): Posiciones de la firma en el documento.
226
+ - `cert` (String): El certificado del firmante en formato base64.
227
+ - `signedDigest` (String): El digest del documento, ya firmado.
228
+
229
+ **Retorna:**
248
230
 
249
- - `INVALID_PARAMETER`: Si `cert` o `signatureId` no son válidos.
250
- - `API_RESPONSE_ERROR`: Si la API no devuelve un digest.
251
- - `NOT_IMPLEMENTED`: Si se llama con un `integrationType` no soportado (`ONPREMISE`).
231
+ - `Promise<object>`: Una promesa que se resuelve con la respuesta de la API tras completar la firma.
252
232
 
253
233
  ### requestRevocation(reasonCode)
254
234
 
@@ -264,221 +244,58 @@ Solicita la revocación de un certificado.
264
244
  - `revocationStatus` (String): El estado de la solicitud (ej. "pending").
265
245
  - `requestId` (String | Number): El ID de la solicitud de revocación.
266
246
 
267
- **Ejemplo:**
247
+ ### getRevocationReasons()
268
248
 
269
- ```javascript
270
- try {
271
- const revocationResponse = await apacuana.requestRevocation("COMPROMISED");
272
- console.log("Revocación solicitada:", revocationResponse);
273
- } catch (error) {
274
- console.error("Error al solicitar revocación:", error);
275
- }
276
- ```
249
+ Obtiene la lista de códigos de motivo de revocación disponibles que se pueden usar en la función `requestRevocation`.
277
250
 
278
- ### getDocs(data)
279
-
280
- Obtiene una lista de documentos paginada. El comportamiento de esta función varía según el `integrationType` configurado.
281
-
282
- **Parámetros:**
283
-
284
- - `data` (`GetDocsParams`): Objeto que contiene los parámetros para la consulta.
285
- - `page` (Number): Número de página para la paginación.
286
- - `size` (Number): Cantidad de resultados por página.
287
- - `status` (Number, opcional): Filtra los documentos por su estado. Los valores permitidos son:
288
- - `-1`: Rechazado
289
- - `0`: Pendiente
290
- - `1`: Firmado
291
- - `2`: En proceso
251
+ **Parámetros:** Ninguno
292
252
 
293
253
  **Retorna:**
294
254
 
295
- - `Promise<GetDocsResponse>`: Un objeto que contiene:
296
- - `totalRecords` (Number): El número total de documentos que coinciden con la consulta.
297
- - `records` (Array<Object>): Un array de objetos, donde cada objeto es un documento.
255
+ - `Promise<RevocationReasonsResponse>`: Un objeto que contiene:
256
+ - `reasons` (Array<Object>): Un array de objetos, donde cada objeto representa un motivo de revocación con `code` y `description`.
298
257
  - `success` (Boolean): Indicador de éxito de la operación.
299
258
 
300
259
  **Comportamiento por `integrationType`:**
301
260
 
302
- - **`ONBOARDING`**: Obtiene los documentos asociados al `customerId` configurado.
303
- - **`ONPREMISE`**: No soportado. Lanza un `ApacuanaAPIError` con el código `NOT_IMPLEMENTED`.
304
-
305
- **Ejemplo (`ONBOARDING`):**
306
-
307
- ```javascript
308
- try {
309
- const documents = await apacuana.getDocs({ page: 1, size: 10, status: 1 });
310
- console.log("Documentos:", documents);
311
- } catch (error) {
312
- console.error("Error al obtener documentos:", error.message);
313
- }
314
- ```
315
-
316
- **Posibles `ApacuanaAPIError`:**
317
-
318
- - `INVALID_PARAMETER`: Si `page`, `size` o `status` no son válidos.
319
- - `CONFIGURATION_ERROR`: Si el `customerId` no está configurado en la inicialización.
320
- - `NOT_IMPLEMENTED`: Si se llama con `integrationType` igual a `ONPREMISE`.
261
+ - **`ONBOARDING`**: Obtiene la lista de motivos desde la API.
262
+ - **`ONPREMISE`**: No soportado. Lanza una `ApacuanaAPIError` con el código `NOT_IMPLEMENTED`.
321
263
 
322
- ### addSigner(signerData)
264
+ ### getDocs(data)
323
265
 
324
- Agrega un firmante a un documento. El comportamiento de esta función y la estructura del objeto `signerData` varían según el `integrationType` configurado (`ONBOARDING` u `ONPREMISE`).
266
+ Obtiene una lista de documentos paginada.
325
267
 
326
268
  **Parámetros:**
327
269
 
328
- - `signerData` (Object): Un objeto que contiene la información del firmante. Su estructura es específica para cada tipo de integración.
329
-
330
- ---
331
-
332
- #### Flujo de Integración: ONBOARDING
333
-
334
- Para el tipo de integración `ONBOARDING`, la función espera un objeto `signerData` con la siguiente estructura y realiza validaciones estrictas sobre cada campo.
335
-
336
- **Estructura de `signerData` para ONBOARDING:**
337
-
338
- ```json
339
- {
340
- "name": "Nombre del Documento",
341
- "reference": "Referencia Externa",
342
- "typedoc": "V",
343
- "doc": "26122862",
344
- "signature": [
345
- {
346
- "page": 1,
347
- "x": 0.5,
348
- "y": 0.85
349
- }
350
- ]
351
- }
352
- ```
353
-
354
- **Validaciones (ONBOARDING):**
355
-
356
- - **signerData**: Debe ser un objeto no vacío.
357
- - **name**: Requerido, `string`.
358
- - **reference**: Requerido, `string`. (referencia del documento en el gestor documental)
359
- - **typedoc**: Requerido, debe ser `V`, `P` o `E`.
360
- - **doc**: Requerido, `string`.
361
- - **signature**: Requerido, `array` no vacío.
362
- - Cada objeto en el `array` debe tener:
363
- - `page`: Requerido, `número` entero positivo.
364
- - `x`: Requerido, `número` entre 0 y 1.
365
- - `y`: Requerido, `número` entre 0 y 1.
366
-
367
- Si alguna validación falla, se lanzará una `ApacuanaAPIError` con el código `INVALID_PARAMETER` o `INVALID_PARAMETER_FORMAT`.
368
-
369
- ---
270
+ - `data` (`GetDocsParams`): Objeto que contiene los parámetros para la consulta.
271
+ - `page` (Number): Número de página.
272
+ - `size` (Number): Cantidad de resultados por página.
273
+ - `status` (Number, opcional): Filtra por estado (`-1`: Rechazado, `0`: Pendiente, `1`: Firmado, `2`: En proceso).
370
274
 
371
275
  **Retorna:**
372
276
 
373
- - `Promise<AddSignerResponse>` que se resuelve con un objeto que contiene:
374
- - `signer` (String): Un identificador del firmante, construido a partir de `typedoc` y `doc`.
277
+ - `Promise<GetDocsResponse>`: Un objeto que contiene:
278
+ - `totalRecords` (Number): El número total de documentos.
279
+ - `records` (Array<Object>): Un array de documentos.
375
280
  - `success` (Boolean): Indicador de éxito de la operación.
376
281
 
377
- **Ejemplo (ONBOARDING):**
378
-
379
- ```javascript
380
- const signerInfo = {
381
- name: "Contrato de Servicios",
382
- reference: "CS-2024-001",
383
- typedoc: "V",
384
- doc: "12345678",
385
- signature: [{ page: 5, x: 0.25, y: 0.75 }],
386
- };
387
-
388
- try {
389
- const response = await apacuana.addSigner(signerInfo);
390
- console.log("Firmante agregado exitosamente:", response);
391
- } catch (error) {
392
- if (error.name === "ApacuanaAPIError") {
393
- console.error(`Error de API (${error.code}):`, error.message);
394
- } else {
395
- console.error("Ocurrió un error inesperado:", error);
396
- }
397
- }
398
- ```
399
-
400
282
  ## Estados de Certificado
401
283
 
402
- El SDK utiliza los siguientes estados para los certificados:
403
-
404
- - `PENDING`: El certificado está pendiente de generación o procesamiento
405
- - `ACTIVE`: El certificado está activo y puede ser utilizado
406
- - `EXPIRED`: El certificado ha caducado
407
- - `REVOKED`: El certificado ha sido revocado
408
- - `SUSPENDED`: El certificado está temporalmente suspendido
284
+ - `PENDING`: Pendiente de generación.
285
+ - `ACTIVE`: Activo y listo para usar.
286
+ - `EXPIRED`: Caducado.
287
+ - `REVOKED`: Revocado.
288
+ - `SUSPENDED`: Suspendido temporalmente.
409
289
 
410
290
  ## Tipos de Integración
411
291
 
412
- El SDK soporta los siguientes tipos de integración:
413
-
414
- - `ONBOARDING`: Proceso de registro inicial y generación de certificado.
415
- - `ONPREMISE`: Integración donde el cliente gestiona su propia infraestructura. Algunas funcionalidades no están soportadas en este modo.
292
+ - `ONBOARDING`: Proceso de registro y generación de certificado gestionado por Apacuana.
293
+ - `ONPREMISE`: Integración donde el cliente gestiona su propia infraestructura.
416
294
 
417
295
  ## Manejo de Errores
418
296
 
419
- El SDK utiliza la clase `ApacuanaAPIError` para manejar errores específicos de la API. Esta clase extiende `Error` y proporciona información adicional sobre el error:
420
-
421
- ```javascript
422
- try {
423
- await apacuana.generateCert();
424
- } catch (error) {
425
- if (error.name === "ApacuanaAPIError") {
426
- console.error("Error de API:", error.message);
427
- console.error("Código de error:", error.code);
428
- console.error("Detalles:", error.details);
429
- } else {
430
- console.error("Error general:", error);
431
- }
432
- }
433
- ```
434
-
435
- ## Seguridad
436
-
437
- El SDK implementa las siguientes medidas de seguridad:
438
-
439
- - Generación de pares de claves criptográficas (RSA)
440
- - Creación de CSR (Certificate Signing Request)
441
- - Comunicación segura con la API mediante HTTPS
442
- - Autenticación mediante apiKey y secretKey
297
+ El SDK utiliza la clase `ApacuanaAPIError` para manejar errores específicos de la API, la cual extiende `Error` y añade las propiedades `code` y `details`.
443
298
 
444
299
  ## Licencia
445
300
 
446
- Este SDK está licenciado bajo términos propietarios. Consulte el acuerdo de licencia para más detalles.
447
-
448
- #### `generateCert(encryptedCSR)`
449
-
450
- Genera un nuevo certificado para un usuario ya existente.
451
-
452
- - **Parámetros:**
453
- - `encryptedCSR` (Object): Un objeto que contiene la Solicitud de Firma de Certificado (CSR) encriptada. Este objeto debe tener la siguiente estructura:
454
- ```json
455
- {
456
- "csr": "string"
457
- }
458
- ```
459
- Donde el valor de `csr` es la cadena de texto resultante de la encriptación.
460
-
461
- - **Retorna:** `Promise<Object>`
462
- - `Promise<GenerateCertResponse>` que se resuelve con un objeto que contiene:
463
- - `cert` (String): El certificado generado.
464
- - `success` (Boolean): Indicador de éxito de la operación.
465
-
466
- **Ejemplo:**
467
-
468
- ```javascript
469
- // Asumiendo que 'myBase64Csr' es una variable que contiene tu CSR en formato Base64
470
- const myBase64Csr = "MIIC...==";
471
-
472
- try {
473
- const { cert, success } = await apacuana.generateCert(myBase64Csr);
474
- if (success) {
475
- console.log("Certificado generado exitosamente:", cert);
476
- }
477
- } catch (error) {
478
- if (error.name === "ApacuanaAPIError") {
479
- console.error(`Error de API (${error.code}):`, error.message);
480
- } else {
481
- console.error("Ocurrió un error inesperado:", error);
482
- }
483
- }
484
- ```
301
+ Este SDK está licenciado bajo términos propietarios.