@muni-sanfer/types-gestor-documental 0.0.1-beta.14 → 0.0.1-beta.16
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.
- package/dist/base/entities.d.ts +78 -3
- package/dist/base/entities.js +9 -1
- package/dist/contracts/archivalSeries.contract.d.ts +50 -0
- package/dist/contracts/archivalSeries.contract.js +11 -0
- package/dist/contracts/caseFile.contract.d.ts +63 -1
- package/dist/contracts/caseFile.contract.js +6 -0
- package/dist/contracts/document.contract.d.ts +34 -1
- package/dist/contracts/document.contract.js +3 -0
- package/dist/contracts/documentType.contract.d.ts +1 -0
- package/dist/contracts/index.d.ts +29 -1
- package/dist/contracts/index.js +6 -0
- package/dist/contracts/scan.contract.d.ts +63 -0
- package/dist/contracts/scan.contract.js +12 -0
- package/dist/entities/archivalSeries/archivalSeries.entity.d.ts +27 -0
- package/dist/entities/archivalSeries/archivalSeries.entity.js +2 -0
- package/dist/entities/archivalSeries/index.d.ts +1 -0
- package/dist/entities/archivalSeries/index.js +17 -0
- package/dist/entities/caseFile/caseFile.entity.d.ts +85 -0
- package/dist/entities/document/document.entity.d.ts +47 -0
- package/dist/entities/documentType/documentType.entity.d.ts +5 -0
- package/dist/entities/index.d.ts +2 -0
- package/dist/entities/index.js +2 -0
- package/dist/entities/scan/index.d.ts +1 -0
- package/dist/entities/scan/index.js +17 -0
- package/dist/entities/scan/scan.entity.d.ts +29 -0
- package/dist/entities/scan/scan.entity.js +2 -0
- package/package.json +1 -1
- package/src/base/entities.ts +88 -3
- package/src/contracts/archivalSeries.contract.ts +53 -0
- package/src/contracts/caseFile.contract.ts +54 -0
- package/src/contracts/document.contract.ts +32 -0
- package/src/contracts/documentType.contract.ts +2 -0
- package/src/contracts/index.ts +9 -1
- package/src/contracts/scan.contract.ts +52 -0
- package/src/entities/archivalSeries/archivalSeries.entity.ts +32 -0
- package/src/entities/archivalSeries/index.ts +1 -0
- package/src/entities/caseFile/caseFile.entity.ts +83 -0
- package/src/entities/document/document.entity.ts +45 -0
- package/src/entities/documentType/documentType.entity.ts +2 -0
- package/src/entities/index.ts +2 -0
- package/src/entities/scan/index.ts +1 -0
- package/src/entities/scan/scan.entity.ts +32 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./archivalSeries.entity"), exports);
|
|
@@ -102,7 +102,10 @@ export interface CaseFileAccessResponseEntity {
|
|
|
102
102
|
entryId: CaseFileAccessEntity['entryId'];
|
|
103
103
|
/** Título del documento que se abrió, si el acceso fue a uno. */
|
|
104
104
|
entryTitle: string | null;
|
|
105
|
+
/** El funcionario o, si fue por un enlace temporal, su destinatario externo. */
|
|
105
106
|
employeeFullName: CaseFileAccessEntity['employeeFullName'];
|
|
107
|
+
/** Fue por un enlace temporal, sin sesión. */
|
|
108
|
+
external: boolean;
|
|
106
109
|
createdAt: CaseFileAccessEntity['createdAt'];
|
|
107
110
|
}
|
|
108
111
|
export interface CaseFileGetByIdResponseEntity extends CaseFileGetAllResponseEntity {
|
|
@@ -117,6 +120,14 @@ export interface CaseFileGetByIdResponseEntity extends CaseFileGetAllResponseEnt
|
|
|
117
120
|
closingNote: CaseFileEntity['closingNote'];
|
|
118
121
|
/** Expediente híbrido: tiene documentos en papel que no se pudieron digitalizar. */
|
|
119
122
|
isHybrid: boolean;
|
|
123
|
+
/** MGDEE1_2: serie del Cuadro de Clasificación. */
|
|
124
|
+
archivalSeries: {
|
|
125
|
+
id: string;
|
|
126
|
+
code: string;
|
|
127
|
+
name: string;
|
|
128
|
+
} | null;
|
|
129
|
+
/** MGDEE8_2: fin de la restricción de acceso. */
|
|
130
|
+
restrictionEndsAt: string | null;
|
|
120
131
|
index: CaseFileEntryResponseEntity[];
|
|
121
132
|
sharedWith: CaseFileParticipantResponseEntity[];
|
|
122
133
|
actors: CaseFileActorResponseEntity[];
|
|
@@ -182,3 +193,77 @@ export interface CaseFileExportResponseEntity {
|
|
|
182
193
|
}
|
|
183
194
|
/** Expediente en que está incorporado un documento, visto desde el documento. */
|
|
184
195
|
export type DocumentCaseFileEntity = CaseFileLinkEntity;
|
|
196
|
+
/** Estado de un enlace temporal: vigente, vencido o revocado. */
|
|
197
|
+
export type CaseFileShareLinkStatus = 'Active' | 'Expired' | 'Revoked';
|
|
198
|
+
/** Enlace temporal de un expediente, como lo ve su responsable. El token no se vuelve a mostrar. */
|
|
199
|
+
export interface CaseFileShareLinkResponseEntity {
|
|
200
|
+
id: string;
|
|
201
|
+
recipient: string;
|
|
202
|
+
recipientEmail: string | null;
|
|
203
|
+
purpose: string | null;
|
|
204
|
+
allowExport: boolean;
|
|
205
|
+
expiresAt: string;
|
|
206
|
+
status: CaseFileShareLinkStatus;
|
|
207
|
+
createdByFullName: string;
|
|
208
|
+
createdAt: string;
|
|
209
|
+
revokedAt: string | null;
|
|
210
|
+
revokedByFullName: string | null;
|
|
211
|
+
/** Cuántas consultas, descargas y exportaciones se hicieron con él. */
|
|
212
|
+
accessCount: number;
|
|
213
|
+
lastAccessAt: string | null;
|
|
214
|
+
}
|
|
215
|
+
/** Enlace recién creado: el token va solo aquí; la dirección la arma quien lo muestra. */
|
|
216
|
+
export interface CaseFileShareLinkCreateResponseEntity {
|
|
217
|
+
id: string;
|
|
218
|
+
token: string;
|
|
219
|
+
recipient: string;
|
|
220
|
+
recipientEmail: string | null;
|
|
221
|
+
purpose: string | null;
|
|
222
|
+
expiresAt: string;
|
|
223
|
+
/** Para avisarle al destinatario: qué expediente, de qué órgano y quién se lo comparte. */
|
|
224
|
+
caseFile: {
|
|
225
|
+
code: string;
|
|
226
|
+
title: string;
|
|
227
|
+
};
|
|
228
|
+
organName: string;
|
|
229
|
+
createdByFullName: string;
|
|
230
|
+
}
|
|
231
|
+
/** Actuación del índice como la ve el destinatario externo. */
|
|
232
|
+
export interface CaseFileSharedEntryEntity {
|
|
233
|
+
id: string;
|
|
234
|
+
sequence: number;
|
|
235
|
+
folder: string | null;
|
|
236
|
+
kind: CaseFileEntryEntity['kind'];
|
|
237
|
+
actuationType: CaseFileEntryEntity['actuationType'];
|
|
238
|
+
title: string;
|
|
239
|
+
/** Tipo y número del documento («D.E. N° 590/2026») o el tipo declarado del archivo. */
|
|
240
|
+
reference: string | null;
|
|
241
|
+
originDate: string | null;
|
|
242
|
+
createdAt: string;
|
|
243
|
+
hasFile: boolean;
|
|
244
|
+
sha256: string | null;
|
|
245
|
+
hasAdvancedSignature: boolean;
|
|
246
|
+
physicalLocation: string | null;
|
|
247
|
+
pageCount: number | null;
|
|
248
|
+
voidedAt: string | null;
|
|
249
|
+
voidReason: string | null;
|
|
250
|
+
}
|
|
251
|
+
/** Expediente abierto con un enlace temporal: metadatos e índice, sin participantes ni registros internos. */
|
|
252
|
+
export interface CaseFileSharedResponseEntity {
|
|
253
|
+
code: string;
|
|
254
|
+
title: string;
|
|
255
|
+
subject: string;
|
|
256
|
+
summary: string | null;
|
|
257
|
+
procedureName: string;
|
|
258
|
+
status: CaseFileEntity['status'];
|
|
259
|
+
organName: string;
|
|
260
|
+
responsibleFullName: string;
|
|
261
|
+
responsiblePosition: string | null;
|
|
262
|
+
createdAt: string;
|
|
263
|
+
closedAt: string | null;
|
|
264
|
+
recipient: string;
|
|
265
|
+
purpose: string | null;
|
|
266
|
+
expiresAt: string;
|
|
267
|
+
allowExport: boolean;
|
|
268
|
+
entries: CaseFileSharedEntryEntity[];
|
|
269
|
+
}
|
|
@@ -115,6 +115,12 @@ export interface DocumentInboxItemEntity extends DocumentDeliveryResponseEntity
|
|
|
115
115
|
export interface DocumentGetByIdResponseEntity {
|
|
116
116
|
id: DocumentEntity['id'];
|
|
117
117
|
issuerName: string;
|
|
118
|
+
archivalSeries: {
|
|
119
|
+
id: string;
|
|
120
|
+
code: string;
|
|
121
|
+
name: string;
|
|
122
|
+
} | null;
|
|
123
|
+
restrictionEndsAt: string | null;
|
|
118
124
|
subject: DocumentEntity['subject'];
|
|
119
125
|
keywords: DocumentEntity['keywords'];
|
|
120
126
|
accessLevel: DocumentEntity['accessLevel'];
|
|
@@ -174,6 +180,7 @@ export interface DocumentGetByIdResponseEntity {
|
|
|
174
180
|
/** Instituciones de DocDigital a quienes va dirigido, y su despacho por Oficina de Partes. */
|
|
175
181
|
externalRecipients: DocumentExternalRecipientResponseEntity[];
|
|
176
182
|
dispatch: DocumentDispatchResponseEntity | null;
|
|
183
|
+
emailCopies: DocumentEmailCopyResponseEntity[];
|
|
177
184
|
documentType: DocumentTypeSummaryEntity;
|
|
178
185
|
participants: DocumentParticipantResponseEntity[];
|
|
179
186
|
attachments: {
|
|
@@ -403,3 +410,43 @@ export interface DocumentComposeResponseEntity {
|
|
|
403
410
|
fileId?: string;
|
|
404
411
|
contentBase64?: string;
|
|
405
412
|
}
|
|
413
|
+
/** Copia por correo de un documento, como la ve quien lo consulta en el gestor. */
|
|
414
|
+
export interface DocumentEmailCopyResponseEntity {
|
|
415
|
+
id: string;
|
|
416
|
+
name: string;
|
|
417
|
+
email: string;
|
|
418
|
+
/** Cuándo se envió (sin valor: aún no corresponde). */
|
|
419
|
+
issuedAt: string | null;
|
|
420
|
+
expiresAt: string | null;
|
|
421
|
+
openedAt: string | null;
|
|
422
|
+
downloadCount: number;
|
|
423
|
+
}
|
|
424
|
+
/** Copia recién emitida: el gateway le envía el enlace a su destinatario. El token viaja solo aquí. */
|
|
425
|
+
export interface DocumentEmailCopyIssuedEntity {
|
|
426
|
+
copyId: string;
|
|
427
|
+
documentId: string;
|
|
428
|
+
name: string;
|
|
429
|
+
email: string;
|
|
430
|
+
token: string;
|
|
431
|
+
expiresAt: string;
|
|
432
|
+
/** Cómo se cita: «D.E. N° 590/2026», o el tipo si no lleva número. */
|
|
433
|
+
folio: string;
|
|
434
|
+
subject: string;
|
|
435
|
+
issuerName: string;
|
|
436
|
+
}
|
|
437
|
+
/** El documento como lo ve quien abre su copia por correo. */
|
|
438
|
+
export interface DocumentEmailCopyViewEntity {
|
|
439
|
+
recipientName: string;
|
|
440
|
+
expiresAt: string;
|
|
441
|
+
documentTypeName: string;
|
|
442
|
+
folio: string;
|
|
443
|
+
subject: string;
|
|
444
|
+
issuerName: string;
|
|
445
|
+
finishedAt: string | null;
|
|
446
|
+
verificationCode: string | null;
|
|
447
|
+
signers: {
|
|
448
|
+
fullName: string;
|
|
449
|
+
position: string | null;
|
|
450
|
+
signedAt: string | null;
|
|
451
|
+
}[];
|
|
452
|
+
}
|
|
@@ -22,6 +22,11 @@ export interface DocumentTypeGetAllResponseEntity {
|
|
|
22
22
|
resetsYearly: DocumentTypeEntity['resetsYearly'];
|
|
23
23
|
numbered: DocumentTypeEntity['numbered'];
|
|
24
24
|
directorateCodeReference: DocumentTypeEntity['directorateCodeReference'];
|
|
25
|
+
archivalSeries: {
|
|
26
|
+
id: string;
|
|
27
|
+
code: string;
|
|
28
|
+
name: string;
|
|
29
|
+
} | null;
|
|
25
30
|
issuingEntity: {
|
|
26
31
|
id: string;
|
|
27
32
|
name: string;
|
package/dist/entities/index.d.ts
CHANGED
package/dist/entities/index.js
CHANGED
|
@@ -23,3 +23,5 @@ __exportStar(require("./partsOffice"), exports);
|
|
|
23
23
|
__exportStar(require("./registerBook"), exports);
|
|
24
24
|
__exportStar(require("./signatureBatch"), exports);
|
|
25
25
|
__exportStar(require("./workFolder"), exports);
|
|
26
|
+
__exportStar(require("./scan"), exports);
|
|
27
|
+
__exportStar(require("./archivalSeries"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './scan.entity';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./scan.entity"), exports);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Sesión recién abierta: el token y el QR viajan solo aquí. */
|
|
2
|
+
export interface ScanSessionCreateResponseEntity {
|
|
3
|
+
id: string;
|
|
4
|
+
token: string;
|
|
5
|
+
/** Dirección que abre el celular, con el token. */
|
|
6
|
+
url: string;
|
|
7
|
+
/** El QR de esa dirección, como imagen PNG en data URL. */
|
|
8
|
+
qrDataUrl: string;
|
|
9
|
+
expiresAt: string;
|
|
10
|
+
}
|
|
11
|
+
/** Estado de la sesión, como lo ve en el escritorio quien la abrió. */
|
|
12
|
+
export interface ScanSessionResponseEntity {
|
|
13
|
+
id: string;
|
|
14
|
+
status: 'Open' | 'Ready';
|
|
15
|
+
pageCount: number;
|
|
16
|
+
expiresAt: string;
|
|
17
|
+
fileName: string | null;
|
|
18
|
+
}
|
|
19
|
+
export interface ScanSessionFileResponseEntity {
|
|
20
|
+
fileId: string;
|
|
21
|
+
fileName: string;
|
|
22
|
+
}
|
|
23
|
+
/** La sesión como la ve el celular. */
|
|
24
|
+
export interface ScanSessionPublicEntity {
|
|
25
|
+
status: 'Open' | 'Ready';
|
|
26
|
+
pageCount: number;
|
|
27
|
+
maxPages: number;
|
|
28
|
+
expiresAt: string;
|
|
29
|
+
}
|
package/package.json
CHANGED
package/src/base/entities.ts
CHANGED
|
@@ -63,7 +63,9 @@ export type DocumentTrackingAction =
|
|
|
63
63
|
| 'Reassigned'
|
|
64
64
|
| 'Dispatched'
|
|
65
65
|
| 'DispatchReturned'
|
|
66
|
-
| 'Received'
|
|
66
|
+
| 'Received'
|
|
67
|
+
| 'EmailCopySent'
|
|
68
|
+
| 'EmailCopyOpened';
|
|
67
69
|
|
|
68
70
|
export const DocumentTrackingAction = {
|
|
69
71
|
Created: 'Created',
|
|
@@ -83,6 +85,8 @@ export const DocumentTrackingAction = {
|
|
|
83
85
|
Dispatched: 'Dispatched',
|
|
84
86
|
DispatchReturned: 'DispatchReturned',
|
|
85
87
|
Received: 'Received',
|
|
88
|
+
EmailCopySent: 'EmailCopySent',
|
|
89
|
+
EmailCopyOpened: 'EmailCopyOpened',
|
|
86
90
|
} satisfies Record<string, DocumentTrackingAction>;
|
|
87
91
|
|
|
88
92
|
export type DocumentOrigin = 'Internal' | 'DocDigital';
|
|
@@ -222,7 +226,9 @@ export type CaseFileTrackingAction =
|
|
|
222
226
|
| 'ParticipantAdded'
|
|
223
227
|
| 'ParticipantRemoved'
|
|
224
228
|
| 'Closed'
|
|
225
|
-
| 'Exported'
|
|
229
|
+
| 'Exported'
|
|
230
|
+
| 'ShareLinkCreated'
|
|
231
|
+
| 'ShareLinkRevoked';
|
|
226
232
|
|
|
227
233
|
export const CaseFileTrackingAction = {
|
|
228
234
|
Created: 'Created',
|
|
@@ -234,6 +240,8 @@ export const CaseFileTrackingAction = {
|
|
|
234
240
|
ParticipantRemoved: 'ParticipantRemoved',
|
|
235
241
|
Closed: 'Closed',
|
|
236
242
|
Exported: 'Exported',
|
|
243
|
+
ShareLinkCreated: 'ShareLinkCreated',
|
|
244
|
+
ShareLinkRevoked: 'ShareLinkRevoked',
|
|
237
245
|
} satisfies Record<string, CaseFileTrackingAction>;
|
|
238
246
|
|
|
239
247
|
export type CaseFileAccessAction = 'Viewed' | 'FileDownloaded' | 'Exported';
|
|
@@ -244,6 +252,13 @@ export const CaseFileAccessAction = {
|
|
|
244
252
|
Exported: 'Exported',
|
|
245
253
|
} satisfies Record<string, CaseFileAccessAction>;
|
|
246
254
|
|
|
255
|
+
export type ScanSessionStatus = 'Open' | 'Ready';
|
|
256
|
+
|
|
257
|
+
export const ScanSessionStatus = {
|
|
258
|
+
Open: 'Open',
|
|
259
|
+
Ready: 'Ready',
|
|
260
|
+
} satisfies Record<string, ScanSessionStatus>;
|
|
261
|
+
|
|
247
262
|
export type WorkFolderItemKind = 'Document' | 'File';
|
|
248
263
|
|
|
249
264
|
export const WorkFolderItemKind = {
|
|
@@ -262,6 +277,8 @@ export interface DocumentTypeEntity {
|
|
|
262
277
|
resetsYearly: boolean;
|
|
263
278
|
numbered: boolean;
|
|
264
279
|
directorateCodeReference?: number | null;
|
|
280
|
+
archivalSeries?: ArchivalSeriesEntity | null;
|
|
281
|
+
archivalSeriesId?: string | null;
|
|
265
282
|
issuingEntity?: IssuingEntityEntity | null;
|
|
266
283
|
issuingEntityId?: string | null;
|
|
267
284
|
sharesNumberingWith?: DocumentTypeEntity | null;
|
|
@@ -283,6 +300,7 @@ export interface DocumentEntity {
|
|
|
283
300
|
keywords: string[];
|
|
284
301
|
accessLevel: DocumentAccessLevel;
|
|
285
302
|
hasSensitiveData: boolean;
|
|
303
|
+
restrictionEndsAt?: string | null;
|
|
286
304
|
status: DocumentStatus;
|
|
287
305
|
correlative?: number | null;
|
|
288
306
|
correlativeYear?: number | null;
|
|
@@ -327,6 +345,7 @@ export interface DocumentEntity {
|
|
|
327
345
|
caseFileEntries?: CaseFileEntryEntity[];
|
|
328
346
|
workFolderItems?: WorkFolderItemEntity[];
|
|
329
347
|
externalRecipients?: DocumentExternalRecipientEntity[];
|
|
348
|
+
emailCopies?: DocumentEmailCopyEntity[];
|
|
330
349
|
dispatch?: DocumentDispatchEntity | null;
|
|
331
350
|
docDigitalInbound?: DocDigitalInboundEntity | null;
|
|
332
351
|
deleted: boolean;
|
|
@@ -481,6 +500,9 @@ export interface CaseFileEntity {
|
|
|
481
500
|
status: CaseFileStatus;
|
|
482
501
|
accessLevel: DocumentAccessLevel;
|
|
483
502
|
hasSensitiveData: boolean;
|
|
503
|
+
restrictionEndsAt?: string | null;
|
|
504
|
+
archivalSeries?: ArchivalSeriesEntity | null;
|
|
505
|
+
archivalSeriesId?: string | null;
|
|
484
506
|
incorporationMechanism: CaseFileIncorporationMechanism;
|
|
485
507
|
schemaVersion: string;
|
|
486
508
|
procedure?: ProcedureEntity;
|
|
@@ -499,6 +521,7 @@ export interface CaseFileEntity {
|
|
|
499
521
|
trackings?: CaseFileTrackingEntity[];
|
|
500
522
|
metadataChanges?: CaseFileMetadataChangeEntity[];
|
|
501
523
|
accesses?: CaseFileAccessEntity[];
|
|
524
|
+
shareLinks?: CaseFileShareLinkEntity[];
|
|
502
525
|
createdAt: string;
|
|
503
526
|
updatedAt: string;
|
|
504
527
|
workFolder?: WorkFolderEntity | null;
|
|
@@ -590,13 +613,61 @@ export interface CaseFileAccessEntity {
|
|
|
590
613
|
id: string;
|
|
591
614
|
action: CaseFileAccessAction;
|
|
592
615
|
entryId?: string | null;
|
|
593
|
-
employeeId
|
|
616
|
+
employeeId?: string | null;
|
|
594
617
|
employeeFullName: string;
|
|
618
|
+
shareLink?: CaseFileShareLinkEntity | null;
|
|
619
|
+
shareLinkId?: string | null;
|
|
595
620
|
caseFile?: CaseFileEntity;
|
|
596
621
|
caseFileId: string;
|
|
597
622
|
createdAt: string;
|
|
598
623
|
}
|
|
599
624
|
|
|
625
|
+
export interface CaseFileShareLinkEntity {
|
|
626
|
+
id: string;
|
|
627
|
+
tokenHash: string;
|
|
628
|
+
recipient: string;
|
|
629
|
+
recipientEmail?: string | null;
|
|
630
|
+
purpose?: string | null;
|
|
631
|
+
allowExport: boolean;
|
|
632
|
+
expiresAt: string;
|
|
633
|
+
createdByEmployeeId: string;
|
|
634
|
+
createdByFullName: string;
|
|
635
|
+
revokedAt?: string | null;
|
|
636
|
+
revokedByEmployeeId?: string | null;
|
|
637
|
+
revokedByFullName?: string | null;
|
|
638
|
+
caseFile?: CaseFileEntity;
|
|
639
|
+
caseFileId: string;
|
|
640
|
+
accesses?: CaseFileAccessEntity[];
|
|
641
|
+
createdAt: string;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
export interface DocumentEmailCopyEntity {
|
|
645
|
+
id: string;
|
|
646
|
+
name: string;
|
|
647
|
+
email: string;
|
|
648
|
+
tokenHash?: string | null;
|
|
649
|
+
expiresAt?: string | null;
|
|
650
|
+
issuedAt?: string | null;
|
|
651
|
+
openedAt?: string | null;
|
|
652
|
+
downloadCount: number;
|
|
653
|
+
document?: DocumentEntity;
|
|
654
|
+
documentId: string;
|
|
655
|
+
createdAt: string;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
export interface ScanSessionEntity {
|
|
659
|
+
id: string;
|
|
660
|
+
tokenHash: string;
|
|
661
|
+
status: ScanSessionStatus;
|
|
662
|
+
employeeId: string;
|
|
663
|
+
pages: JsonValue;
|
|
664
|
+
fileId?: string | null;
|
|
665
|
+
fileName?: string | null;
|
|
666
|
+
expiresAt: string;
|
|
667
|
+
finishedAt?: string | null;
|
|
668
|
+
createdAt: string;
|
|
669
|
+
}
|
|
670
|
+
|
|
600
671
|
export interface DocumentExternalRecipientEntity {
|
|
601
672
|
id: string;
|
|
602
673
|
entityId: number;
|
|
@@ -665,6 +736,20 @@ export interface DocDigitalInboundEntity {
|
|
|
665
736
|
updatedAt: string;
|
|
666
737
|
}
|
|
667
738
|
|
|
739
|
+
export interface ArchivalSeriesEntity {
|
|
740
|
+
id: string;
|
|
741
|
+
code: string;
|
|
742
|
+
name: string;
|
|
743
|
+
section?: string | null;
|
|
744
|
+
description?: string | null;
|
|
745
|
+
enabled: boolean;
|
|
746
|
+
documentTypes?: DocumentTypeEntity[];
|
|
747
|
+
caseFiles?: CaseFileEntity[];
|
|
748
|
+
deleted: boolean;
|
|
749
|
+
createdAt: string;
|
|
750
|
+
updatedAt: string;
|
|
751
|
+
}
|
|
752
|
+
|
|
668
753
|
export interface IssuingEntityEntity {
|
|
669
754
|
id: string;
|
|
670
755
|
name: string;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type ArchivalSeriesEntity } from '../base/entities';
|
|
2
|
+
import {
|
|
3
|
+
type ArchivalSeriesCreateResponseEntity,
|
|
4
|
+
type ArchivalSeriesGetAllResponseEntity,
|
|
5
|
+
type ArchivalSeriesGetByIdResponseEntity,
|
|
6
|
+
type ArchivalSeriesUpdateResponseEntity,
|
|
7
|
+
} from '../entities';
|
|
8
|
+
import { type RpcPage } from './contract';
|
|
9
|
+
|
|
10
|
+
/** Patrones NATS de `archivalSeries` (series del Cuadro de Clasificación): `<servicio>.<recurso>.<acción>`. */
|
|
11
|
+
export const ArchivalSeriesPatterns = {
|
|
12
|
+
getAll: 'gestorDocumental.archivalSeries.getAll',
|
|
13
|
+
getById: 'gestorDocumental.archivalSeries.getById',
|
|
14
|
+
create: 'gestorDocumental.archivalSeries.create',
|
|
15
|
+
update: 'gestorDocumental.archivalSeries.update',
|
|
16
|
+
setEnabled: 'gestorDocumental.archivalSeries.setEnabled',
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
/** Datos de una serie documental al crearla o editarla. */
|
|
20
|
+
export interface ArchivalSeriesWritePayload {
|
|
21
|
+
code: string;
|
|
22
|
+
name: string;
|
|
23
|
+
section?: string | null;
|
|
24
|
+
description?: string | null;
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ArchivalSeriesContract {
|
|
29
|
+
[ArchivalSeriesPatterns.getAll]: {
|
|
30
|
+
// sin `page` y `limit` responde todas en una sola página
|
|
31
|
+
payload: {
|
|
32
|
+
pagination?: { page?: number; limit?: number };
|
|
33
|
+
filters?: { search?: string; enabled?: boolean };
|
|
34
|
+
};
|
|
35
|
+
response: RpcPage<ArchivalSeriesGetAllResponseEntity[]>;
|
|
36
|
+
};
|
|
37
|
+
[ArchivalSeriesPatterns.getById]: {
|
|
38
|
+
payload: Pick<ArchivalSeriesEntity, 'id'>;
|
|
39
|
+
response: ArchivalSeriesGetByIdResponseEntity;
|
|
40
|
+
};
|
|
41
|
+
[ArchivalSeriesPatterns.create]: {
|
|
42
|
+
payload: ArchivalSeriesWritePayload;
|
|
43
|
+
response: ArchivalSeriesCreateResponseEntity;
|
|
44
|
+
};
|
|
45
|
+
[ArchivalSeriesPatterns.update]: {
|
|
46
|
+
payload: ArchivalSeriesWritePayload & Pick<ArchivalSeriesEntity, 'id'>;
|
|
47
|
+
response: ArchivalSeriesUpdateResponseEntity;
|
|
48
|
+
};
|
|
49
|
+
[ArchivalSeriesPatterns.setEnabled]: {
|
|
50
|
+
payload: Pick<ArchivalSeriesEntity, 'id' | 'enabled'>;
|
|
51
|
+
response: ArchivalSeriesUpdateResponseEntity;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -14,6 +14,9 @@ import {
|
|
|
14
14
|
type CaseFileExportResponseEntity,
|
|
15
15
|
type CaseFileGetAllResponseEntity,
|
|
16
16
|
type CaseFileGetByIdResponseEntity,
|
|
17
|
+
type CaseFileShareLinkCreateResponseEntity,
|
|
18
|
+
type CaseFileShareLinkResponseEntity,
|
|
19
|
+
type CaseFileSharedResponseEntity,
|
|
17
20
|
type CaseFileUpdateResponseEntity,
|
|
18
21
|
} from '../entities';
|
|
19
22
|
import { type RpcPage } from './contract';
|
|
@@ -34,8 +37,27 @@ export const CaseFilePatterns = {
|
|
|
34
37
|
close: 'gestorDocumental.caseFile.close',
|
|
35
38
|
getEntryFile: 'gestorDocumental.caseFile.getEntryFile',
|
|
36
39
|
getExport: 'gestorDocumental.caseFile.getExport',
|
|
40
|
+
createShareLink: 'gestorDocumental.caseFile.createShareLink',
|
|
41
|
+
getShareLinks: 'gestorDocumental.caseFile.getShareLinks',
|
|
42
|
+
revokeShareLink: 'gestorDocumental.caseFile.revokeShareLink',
|
|
43
|
+
getShared: 'gestorDocumental.caseFile.getShared',
|
|
44
|
+
getSharedEntryFile: 'gestorDocumental.caseFile.getSharedEntryFile',
|
|
45
|
+
getSharedExport: 'gestorDocumental.caseFile.getSharedExport',
|
|
37
46
|
} as const;
|
|
38
47
|
|
|
48
|
+
/** Enlace temporal para que alguien de fuera consulte el expediente sin sesión. */
|
|
49
|
+
export interface CaseFileShareLinkPayload {
|
|
50
|
+
/** A quién se entrega. Ej: «Contraloría Regional». */
|
|
51
|
+
recipient: string;
|
|
52
|
+
/** Si se indica, el gateway le envía el enlace por correo. */
|
|
53
|
+
recipientEmail?: string | null;
|
|
54
|
+
purpose?: string | null;
|
|
55
|
+
/** Cuántos días dura: de 1 a 30. */
|
|
56
|
+
days: number;
|
|
57
|
+
/** Puede descargar el expediente completo (ZIP). Por omisión, sí. */
|
|
58
|
+
allowExport?: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
39
61
|
/** Persona u organización relacionada con el expediente (MGDEE54). */
|
|
40
62
|
export interface CaseFileActorInput {
|
|
41
63
|
relation: CaseFileActorRelation;
|
|
@@ -52,6 +74,10 @@ export interface CaseFileWritePayload {
|
|
|
52
74
|
procedureId: string;
|
|
53
75
|
accessLevel: DocumentAccessLevel;
|
|
54
76
|
hasSensitiveData: boolean;
|
|
77
|
+
/** MGDEE8_2: fin de la restricción de acceso (ISO 8601), si no es público. */
|
|
78
|
+
restrictionEndsAt?: string | null;
|
|
79
|
+
/** MGDEE1_2: serie del Cuadro de Clasificación. */
|
|
80
|
+
archivalSeriesId?: string | null;
|
|
55
81
|
actors?: CaseFileActorInput[];
|
|
56
82
|
}
|
|
57
83
|
|
|
@@ -161,4 +187,32 @@ export interface CaseFileContract {
|
|
|
161
187
|
payload: Pick<CaseFileEntity, 'id'> & CaseFileActorPayload;
|
|
162
188
|
response: CaseFileExportResponseEntity;
|
|
163
189
|
};
|
|
190
|
+
/** Crea un enlace temporal: solo su responsable. El token viaja solo en esta respuesta. */
|
|
191
|
+
[CaseFilePatterns.createShareLink]: {
|
|
192
|
+
payload: Pick<CaseFileEntity, 'id'> & CaseFileShareLinkPayload & { actor: DocumentActor };
|
|
193
|
+
response: CaseFileShareLinkCreateResponseEntity;
|
|
194
|
+
};
|
|
195
|
+
/** Enlaces del expediente, vigentes o no, con cuántas veces se usaron: su responsable o quien ve todos. */
|
|
196
|
+
[CaseFilePatterns.getShareLinks]: {
|
|
197
|
+
payload: Pick<CaseFileEntity, 'id'> & CaseFileActorPayload;
|
|
198
|
+
response: CaseFileShareLinkResponseEntity[];
|
|
199
|
+
};
|
|
200
|
+
[CaseFilePatterns.revokeShareLink]: {
|
|
201
|
+
payload: Pick<CaseFileEntity, 'id'> & { linkId: string; actor: DocumentActor };
|
|
202
|
+
response: CaseFileUpdateResponseEntity;
|
|
203
|
+
};
|
|
204
|
+
/** Sin sesión, con el token del enlace: metadatos e índice. Queda en el registro de accesos. */
|
|
205
|
+
[CaseFilePatterns.getShared]: {
|
|
206
|
+
payload: { token: string };
|
|
207
|
+
response: CaseFileSharedResponseEntity;
|
|
208
|
+
};
|
|
209
|
+
[CaseFilePatterns.getSharedEntryFile]: {
|
|
210
|
+
payload: { token: string; entryId: string };
|
|
211
|
+
response: CaseFileEntryFileResponseEntity;
|
|
212
|
+
};
|
|
213
|
+
/** El expediente completo, si el enlace lo permite. Queda en la trazabilidad y en el registro de accesos. */
|
|
214
|
+
[CaseFilePatterns.getSharedExport]: {
|
|
215
|
+
payload: { token: string };
|
|
216
|
+
response: CaseFileExportResponseEntity;
|
|
217
|
+
};
|
|
164
218
|
}
|
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
type DocumentCreateResponseEntity,
|
|
14
14
|
type DocumentDeriveResponseEntity,
|
|
15
15
|
type DocumentDiscardResponseEntity,
|
|
16
|
+
type DocumentEmailCopyIssuedEntity,
|
|
17
|
+
type DocumentEmailCopyViewEntity,
|
|
16
18
|
type DocumentGetAllResponseEntity,
|
|
17
19
|
type DocumentGetByIdResponseEntity,
|
|
18
20
|
type DocumentGetSummaryResponseEntity,
|
|
@@ -51,6 +53,9 @@ export const DocumentPatterns = {
|
|
|
51
53
|
getAgenda: 'gestorDocumental.document.getAgenda',
|
|
52
54
|
exportTrail: 'gestorDocumental.document.exportTrail',
|
|
53
55
|
compose: 'gestorDocumental.document.compose',
|
|
56
|
+
issueEmailCopies: 'gestorDocumental.document.issueEmailCopies',
|
|
57
|
+
getEmailCopy: 'gestorDocumental.document.getEmailCopy',
|
|
58
|
+
getEmailCopyFile: 'gestorDocumental.document.getEmailCopyFile',
|
|
54
59
|
} as const;
|
|
55
60
|
|
|
56
61
|
/**
|
|
@@ -119,10 +124,20 @@ export interface DocumentWritePayload extends Pick<DocumentEntity, 'subject' | '
|
|
|
119
124
|
replyToDocumentId?: string | null;
|
|
120
125
|
// Instituciones (y usuarios) de DocDigital a quienes va: al terminar la firma pasa a Oficina de Partes.
|
|
121
126
|
externalRecipients?: DocumentExternalRecipientInput[];
|
|
127
|
+
// Fin de la restricción de acceso (ISO 8601), si no es público.
|
|
128
|
+
restrictionEndsAt?: string | null;
|
|
129
|
+
// Copia por correo a quienes están fuera del Estado: sale al finalizar o, si también va por DocDigital, al despacharlo.
|
|
130
|
+
emailCopies?: DocumentEmailCopyInput[];
|
|
122
131
|
action?: 'Submit';
|
|
123
132
|
actor: DocumentActor;
|
|
124
133
|
}
|
|
125
134
|
|
|
135
|
+
/** Persona u organización fuera del Estado que recibe una copia por correo. */
|
|
136
|
+
export interface DocumentEmailCopyInput {
|
|
137
|
+
name: string;
|
|
138
|
+
email: string;
|
|
139
|
+
}
|
|
140
|
+
|
|
126
141
|
/** Destinatario externo: una institución de DocDigital y, si se indica, uno de sus usuarios. */
|
|
127
142
|
export interface DocumentExternalRecipientInput {
|
|
128
143
|
entityId: number;
|
|
@@ -303,6 +318,23 @@ export interface DocumentContract {
|
|
|
303
318
|
payload: { code: string };
|
|
304
319
|
response: DocumentPublicFileResponseEntity;
|
|
305
320
|
};
|
|
321
|
+
/**
|
|
322
|
+
* Emite las copias por correo pendientes de estos documentos, si ya corresponde (finalizado y, si va por DocDigital,
|
|
323
|
+
* despachado): genera el enlace de cada una. Se puede pedir de más: lo ya emitido no se repite.
|
|
324
|
+
*/
|
|
325
|
+
[DocumentPatterns.issueEmailCopies]: {
|
|
326
|
+
payload: { documentIds: string[] };
|
|
327
|
+
response: DocumentEmailCopyIssuedEntity[];
|
|
328
|
+
};
|
|
329
|
+
/** Sin sesión, con el token de la copia: el documento y quién lo emitió. */
|
|
330
|
+
[DocumentPatterns.getEmailCopy]: {
|
|
331
|
+
payload: { token: string };
|
|
332
|
+
response: DocumentEmailCopyViewEntity;
|
|
333
|
+
};
|
|
334
|
+
[DocumentPatterns.getEmailCopyFile]: {
|
|
335
|
+
payload: { token: string };
|
|
336
|
+
response: DocumentPublicFileResponseEntity;
|
|
337
|
+
};
|
|
306
338
|
/** Carpeta de Drive de los documentos y sus anexos: el gateway la pide antes de subir cada archivo. */
|
|
307
339
|
[DocumentPatterns.getFilesFolder]: {
|
|
308
340
|
payload: Record<string, never>;
|
|
@@ -41,6 +41,8 @@ export interface DocumentTypeWritePayload {
|
|
|
41
41
|
// Sus documentos llevan número (por omisión, sí).
|
|
42
42
|
numbered?: boolean;
|
|
43
43
|
directorateCodeReference?: number | null;
|
|
44
|
+
// Serie documental del Cuadro de Clasificación (sin valor: sin clasificar).
|
|
45
|
+
archivalSeriesId?: string | null;
|
|
44
46
|
// Entidad emisora (sin valor: la municipalidad).
|
|
45
47
|
issuingEntityId?: string | null;
|
|
46
48
|
// Tipo cuyo correlativo comparte (sin valor: el suyo propio).
|