@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
package/src/contracts/index.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { CaseFilePatterns, type CaseFileContract } from './caseFile.contract';
|
|
|
2
2
|
import { DocumentPatterns, type DocumentContract } from './document.contract';
|
|
3
3
|
import { DocumentTypePatterns, type DocumentTypeContract } from './documentType.contract';
|
|
4
4
|
import { IssuingEntityPatterns, type IssuingEntityContract } from './issuingEntity.contract';
|
|
5
|
+
import { ArchivalSeriesPatterns, type ArchivalSeriesContract } from './archivalSeries.contract';
|
|
6
|
+
import { ScanPatterns, type ScanContract } from './scan.contract';
|
|
5
7
|
import { PartsOfficePatterns, type PartsOfficeContract } from './partsOffice.contract';
|
|
6
8
|
import { ProcedurePatterns, type ProcedureContract } from './procedure.contract';
|
|
7
9
|
import { RegisterBookPatterns, type RegisterBookContract } from './registerBook.contract';
|
|
@@ -18,6 +20,8 @@ export * from './partsOffice.contract';
|
|
|
18
20
|
export * from './registerBook.contract';
|
|
19
21
|
export * from './signatureBatch.contract';
|
|
20
22
|
export * from './workFolder.contract';
|
|
23
|
+
export * from './scan.contract';
|
|
24
|
+
export * from './archivalSeries.contract';
|
|
21
25
|
|
|
22
26
|
/** Patrones NATS de gestor-documental-ms, por recurso: `gestorDocumental.<recurso>.<acción>`. */
|
|
23
27
|
export const GestorDocumentalPatterns = {
|
|
@@ -30,6 +34,8 @@ export const GestorDocumentalPatterns = {
|
|
|
30
34
|
registerBook: RegisterBookPatterns,
|
|
31
35
|
signatureBatch: SignatureBatchPatterns,
|
|
32
36
|
workFolder: WorkFolderPatterns,
|
|
37
|
+
scan: ScanPatterns,
|
|
38
|
+
archivalSeries: ArchivalSeriesPatterns,
|
|
33
39
|
} as const;
|
|
34
40
|
|
|
35
41
|
/** Contrato completo de gestor-documental-ms: la unión de los contratos de sus recursos. */
|
|
@@ -41,4 +47,6 @@ export type GestorDocumentalContract = DocumentTypeContract &
|
|
|
41
47
|
PartsOfficeContract &
|
|
42
48
|
RegisterBookContract &
|
|
43
49
|
SignatureBatchContract &
|
|
44
|
-
WorkFolderContract
|
|
50
|
+
WorkFolderContract &
|
|
51
|
+
ScanContract &
|
|
52
|
+
ArchivalSeriesContract;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ScanSessionCreateResponseEntity,
|
|
3
|
+
type ScanSessionFileResponseEntity,
|
|
4
|
+
type ScanSessionPublicEntity,
|
|
5
|
+
type ScanSessionResponseEntity,
|
|
6
|
+
} from '../entities';
|
|
7
|
+
import { type DocumentActor } from './document.contract';
|
|
8
|
+
|
|
9
|
+
/** Patrones NATS de `scan`: escanear con el celular. */
|
|
10
|
+
export const ScanPatterns = {
|
|
11
|
+
create: 'gestorDocumental.scan.create',
|
|
12
|
+
getById: 'gestorDocumental.scan.getById',
|
|
13
|
+
getFile: 'gestorDocumental.scan.getFile',
|
|
14
|
+
getByToken: 'gestorDocumental.scan.getByToken',
|
|
15
|
+
addPage: 'gestorDocumental.scan.addPage',
|
|
16
|
+
finish: 'gestorDocumental.scan.finish',
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
export interface ScanContract {
|
|
20
|
+
/**
|
|
21
|
+
* Abre una sesión de escaneo para el funcionario. `url` es la dirección pública del celular (sin el token): con ella
|
|
22
|
+
* se arma el QR que se muestra en el escritorio.
|
|
23
|
+
*/
|
|
24
|
+
[ScanPatterns.create]: {
|
|
25
|
+
payload: { url: string; actor: DocumentActor };
|
|
26
|
+
response: ScanSessionCreateResponseEntity;
|
|
27
|
+
};
|
|
28
|
+
/** Estado de la sesión, para quien la abrió: el escritorio la consulta hasta que el PDF esté listo. */
|
|
29
|
+
[ScanPatterns.getById]: {
|
|
30
|
+
payload: { id: string; actor: DocumentActor };
|
|
31
|
+
response: ScanSessionResponseEntity;
|
|
32
|
+
};
|
|
33
|
+
[ScanPatterns.getFile]: {
|
|
34
|
+
payload: { id: string; actor: DocumentActor };
|
|
35
|
+
response: ScanSessionFileResponseEntity;
|
|
36
|
+
};
|
|
37
|
+
/** Sin sesión, desde el celular, con el token del QR. */
|
|
38
|
+
[ScanPatterns.getByToken]: {
|
|
39
|
+
payload: { token: string };
|
|
40
|
+
response: ScanSessionPublicEntity;
|
|
41
|
+
};
|
|
42
|
+
/** Agrega una foto ya subida al gestor de archivos (la sube el gateway). */
|
|
43
|
+
[ScanPatterns.addPage]: {
|
|
44
|
+
payload: { token: string; fileId: string; contentType: string; size: number };
|
|
45
|
+
response: ScanSessionPublicEntity;
|
|
46
|
+
};
|
|
47
|
+
/** Junta las fotos en un PDF y cierra la sesión. */
|
|
48
|
+
[ScanPatterns.finish]: {
|
|
49
|
+
payload: { token: string };
|
|
50
|
+
response: ScanSessionPublicEntity;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ArchivalSeriesEntity } from '../../base/entities';
|
|
2
|
+
|
|
3
|
+
export interface ArchivalSeriesGetAllResponseEntity {
|
|
4
|
+
id: ArchivalSeriesEntity['id'];
|
|
5
|
+
code: ArchivalSeriesEntity['code'];
|
|
6
|
+
name: ArchivalSeriesEntity['name'];
|
|
7
|
+
section: ArchivalSeriesEntity['section'];
|
|
8
|
+
description: ArchivalSeriesEntity['description'];
|
|
9
|
+
enabled: ArchivalSeriesEntity['enabled'];
|
|
10
|
+
/** Cuántos tipos documentales y expedientes la usan. */
|
|
11
|
+
documentTypes: number;
|
|
12
|
+
caseFiles: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type ArchivalSeriesGetByIdResponseEntity = ArchivalSeriesGetAllResponseEntity;
|
|
16
|
+
|
|
17
|
+
/** Cómo se cita una serie donde se usa: código y nombre. */
|
|
18
|
+
export interface ArchivalSeriesSummaryEntity {
|
|
19
|
+
id: string;
|
|
20
|
+
code: string;
|
|
21
|
+
name: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ArchivalSeriesCreateResponseEntity {
|
|
25
|
+
id: ArchivalSeriesEntity['id'];
|
|
26
|
+
ok: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ArchivalSeriesUpdateResponseEntity {
|
|
30
|
+
id: ArchivalSeriesEntity['id'];
|
|
31
|
+
ok: boolean;
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './archivalSeries.entity';
|
|
@@ -121,7 +121,10 @@ export interface CaseFileAccessResponseEntity {
|
|
|
121
121
|
entryId: CaseFileAccessEntity['entryId'];
|
|
122
122
|
/** Título del documento que se abrió, si el acceso fue a uno. */
|
|
123
123
|
entryTitle: string | null;
|
|
124
|
+
/** El funcionario o, si fue por un enlace temporal, su destinatario externo. */
|
|
124
125
|
employeeFullName: CaseFileAccessEntity['employeeFullName'];
|
|
126
|
+
/** Fue por un enlace temporal, sin sesión. */
|
|
127
|
+
external: boolean;
|
|
125
128
|
createdAt: CaseFileAccessEntity['createdAt'];
|
|
126
129
|
}
|
|
127
130
|
|
|
@@ -137,6 +140,10 @@ export interface CaseFileGetByIdResponseEntity extends CaseFileGetAllResponseEnt
|
|
|
137
140
|
closingNote: CaseFileEntity['closingNote'];
|
|
138
141
|
/** Expediente híbrido: tiene documentos en papel que no se pudieron digitalizar. */
|
|
139
142
|
isHybrid: boolean;
|
|
143
|
+
/** MGDEE1_2: serie del Cuadro de Clasificación. */
|
|
144
|
+
archivalSeries: { id: string; code: string; name: string } | null;
|
|
145
|
+
/** MGDEE8_2: fin de la restricción de acceso. */
|
|
146
|
+
restrictionEndsAt: string | null;
|
|
140
147
|
index: CaseFileEntryResponseEntity[];
|
|
141
148
|
sharedWith: CaseFileParticipantResponseEntity[];
|
|
142
149
|
actors: CaseFileActorResponseEntity[];
|
|
@@ -210,3 +217,79 @@ export interface CaseFileExportResponseEntity {
|
|
|
210
217
|
|
|
211
218
|
/** Expediente en que está incorporado un documento, visto desde el documento. */
|
|
212
219
|
export type DocumentCaseFileEntity = CaseFileLinkEntity;
|
|
220
|
+
|
|
221
|
+
/** Estado de un enlace temporal: vigente, vencido o revocado. */
|
|
222
|
+
export type CaseFileShareLinkStatus = 'Active' | 'Expired' | 'Revoked';
|
|
223
|
+
|
|
224
|
+
/** Enlace temporal de un expediente, como lo ve su responsable. El token no se vuelve a mostrar. */
|
|
225
|
+
export interface CaseFileShareLinkResponseEntity {
|
|
226
|
+
id: string;
|
|
227
|
+
recipient: string;
|
|
228
|
+
recipientEmail: string | null;
|
|
229
|
+
purpose: string | null;
|
|
230
|
+
allowExport: boolean;
|
|
231
|
+
expiresAt: string;
|
|
232
|
+
status: CaseFileShareLinkStatus;
|
|
233
|
+
createdByFullName: string;
|
|
234
|
+
createdAt: string;
|
|
235
|
+
revokedAt: string | null;
|
|
236
|
+
revokedByFullName: string | null;
|
|
237
|
+
/** Cuántas consultas, descargas y exportaciones se hicieron con él. */
|
|
238
|
+
accessCount: number;
|
|
239
|
+
lastAccessAt: string | null;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Enlace recién creado: el token va solo aquí; la dirección la arma quien lo muestra. */
|
|
243
|
+
export interface CaseFileShareLinkCreateResponseEntity {
|
|
244
|
+
id: string;
|
|
245
|
+
token: string;
|
|
246
|
+
recipient: string;
|
|
247
|
+
recipientEmail: string | null;
|
|
248
|
+
purpose: string | null;
|
|
249
|
+
expiresAt: string;
|
|
250
|
+
/** Para avisarle al destinatario: qué expediente, de qué órgano y quién se lo comparte. */
|
|
251
|
+
caseFile: { code: string; title: string };
|
|
252
|
+
organName: string;
|
|
253
|
+
createdByFullName: string;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Actuación del índice como la ve el destinatario externo. */
|
|
257
|
+
export interface CaseFileSharedEntryEntity {
|
|
258
|
+
id: string;
|
|
259
|
+
sequence: number;
|
|
260
|
+
folder: string | null;
|
|
261
|
+
kind: CaseFileEntryEntity['kind'];
|
|
262
|
+
actuationType: CaseFileEntryEntity['actuationType'];
|
|
263
|
+
title: string;
|
|
264
|
+
/** Tipo y número del documento («D.E. N° 590/2026») o el tipo declarado del archivo. */
|
|
265
|
+
reference: string | null;
|
|
266
|
+
originDate: string | null;
|
|
267
|
+
createdAt: string;
|
|
268
|
+
hasFile: boolean;
|
|
269
|
+
sha256: string | null;
|
|
270
|
+
hasAdvancedSignature: boolean;
|
|
271
|
+
physicalLocation: string | null;
|
|
272
|
+
pageCount: number | null;
|
|
273
|
+
voidedAt: string | null;
|
|
274
|
+
voidReason: string | null;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** Expediente abierto con un enlace temporal: metadatos e índice, sin participantes ni registros internos. */
|
|
278
|
+
export interface CaseFileSharedResponseEntity {
|
|
279
|
+
code: string;
|
|
280
|
+
title: string;
|
|
281
|
+
subject: string;
|
|
282
|
+
summary: string | null;
|
|
283
|
+
procedureName: string;
|
|
284
|
+
status: CaseFileEntity['status'];
|
|
285
|
+
organName: string;
|
|
286
|
+
responsibleFullName: string;
|
|
287
|
+
responsiblePosition: string | null;
|
|
288
|
+
createdAt: string;
|
|
289
|
+
closedAt: string | null;
|
|
290
|
+
recipient: string;
|
|
291
|
+
purpose: string | null;
|
|
292
|
+
expiresAt: string;
|
|
293
|
+
allowExport: boolean;
|
|
294
|
+
entries: CaseFileSharedEntryEntity[];
|
|
295
|
+
}
|
|
@@ -138,6 +138,10 @@ export interface DocumentGetByIdResponseEntity {
|
|
|
138
138
|
id: DocumentEntity['id'];
|
|
139
139
|
// Quién lo emite: la entidad emisora del tipo (Educación, Salud, Juzgado) o la municipalidad.
|
|
140
140
|
issuerName: string;
|
|
141
|
+
// Serie documental del Cuadro de Clasificación (la de su tipo documental; MGDDE1_2).
|
|
142
|
+
archivalSeries: { id: string; code: string; name: string } | null;
|
|
143
|
+
// Fin de la restricción de acceso: desde entonces se consulta como público si no tiene datos sensibles.
|
|
144
|
+
restrictionEndsAt: string | null;
|
|
141
145
|
subject: DocumentEntity['subject'];
|
|
142
146
|
keywords: DocumentEntity['keywords'];
|
|
143
147
|
accessLevel: DocumentEntity['accessLevel'];
|
|
@@ -199,6 +203,8 @@ export interface DocumentGetByIdResponseEntity {
|
|
|
199
203
|
/** Instituciones de DocDigital a quienes va dirigido, y su despacho por Oficina de Partes. */
|
|
200
204
|
externalRecipients: DocumentExternalRecipientResponseEntity[];
|
|
201
205
|
dispatch: DocumentDispatchResponseEntity | null;
|
|
206
|
+
// Copias por correo a quienes están fuera del Estado, con su envío y apertura.
|
|
207
|
+
emailCopies: DocumentEmailCopyResponseEntity[];
|
|
202
208
|
documentType: DocumentTypeSummaryEntity;
|
|
203
209
|
participants: DocumentParticipantResponseEntity[];
|
|
204
210
|
attachments: {
|
|
@@ -450,3 +456,42 @@ export interface DocumentComposeResponseEntity {
|
|
|
450
456
|
fileId?: string;
|
|
451
457
|
contentBase64?: string;
|
|
452
458
|
}
|
|
459
|
+
|
|
460
|
+
/** Copia por correo de un documento, como la ve quien lo consulta en el gestor. */
|
|
461
|
+
export interface DocumentEmailCopyResponseEntity {
|
|
462
|
+
id: string;
|
|
463
|
+
name: string;
|
|
464
|
+
email: string;
|
|
465
|
+
/** Cuándo se envió (sin valor: aún no corresponde). */
|
|
466
|
+
issuedAt: string | null;
|
|
467
|
+
expiresAt: string | null;
|
|
468
|
+
openedAt: string | null;
|
|
469
|
+
downloadCount: number;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/** Copia recién emitida: el gateway le envía el enlace a su destinatario. El token viaja solo aquí. */
|
|
473
|
+
export interface DocumentEmailCopyIssuedEntity {
|
|
474
|
+
copyId: string;
|
|
475
|
+
documentId: string;
|
|
476
|
+
name: string;
|
|
477
|
+
email: string;
|
|
478
|
+
token: string;
|
|
479
|
+
expiresAt: string;
|
|
480
|
+
/** Cómo se cita: «D.E. N° 590/2026», o el tipo si no lleva número. */
|
|
481
|
+
folio: string;
|
|
482
|
+
subject: string;
|
|
483
|
+
issuerName: string;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/** El documento como lo ve quien abre su copia por correo. */
|
|
487
|
+
export interface DocumentEmailCopyViewEntity {
|
|
488
|
+
recipientName: string;
|
|
489
|
+
expiresAt: string;
|
|
490
|
+
documentTypeName: string;
|
|
491
|
+
folio: string;
|
|
492
|
+
subject: string;
|
|
493
|
+
issuerName: string;
|
|
494
|
+
finishedAt: string | null;
|
|
495
|
+
verificationCode: string | null;
|
|
496
|
+
signers: { fullName: string; position: string | null; signedAt: string | null }[];
|
|
497
|
+
}
|
|
@@ -27,6 +27,8 @@ export interface DocumentTypeGetAllResponseEntity {
|
|
|
27
27
|
// Sin numeración, sus documentos solo llevan fecha, código de verificación y QR.
|
|
28
28
|
numbered: DocumentTypeEntity['numbered'];
|
|
29
29
|
directorateCodeReference: DocumentTypeEntity['directorateCodeReference'];
|
|
30
|
+
// Serie documental del Cuadro de Clasificación a la que van sus documentos (MGDDE1_2).
|
|
31
|
+
archivalSeries: { id: string; code: string; name: string } | null;
|
|
30
32
|
// Entidad que emite sus documentos (Educación, Salud, Juzgado). `null`: la municipalidad.
|
|
31
33
|
issuingEntity: { id: string; name: string; shortName: string | null } | null;
|
|
32
34
|
// Tipo cuyo correlativo comparte: sus números salen de esa serie (y `nextCorrelative`, `correlativeYear` y
|
package/src/entities/index.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './scan.entity';
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
|
|
12
|
+
/** Estado de la sesión, como lo ve en el escritorio quien la abrió. */
|
|
13
|
+
export interface ScanSessionResponseEntity {
|
|
14
|
+
id: string;
|
|
15
|
+
status: 'Open' | 'Ready';
|
|
16
|
+
pageCount: number;
|
|
17
|
+
expiresAt: string;
|
|
18
|
+
fileName: string | null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ScanSessionFileResponseEntity {
|
|
22
|
+
fileId: string;
|
|
23
|
+
fileName: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** La sesión como la ve el celular. */
|
|
27
|
+
export interface ScanSessionPublicEntity {
|
|
28
|
+
status: 'Open' | 'Ready';
|
|
29
|
+
pageCount: number;
|
|
30
|
+
maxPages: number;
|
|
31
|
+
expiresAt: string;
|
|
32
|
+
}
|