@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.
Files changed (42) hide show
  1. package/dist/base/entities.d.ts +78 -3
  2. package/dist/base/entities.js +9 -1
  3. package/dist/contracts/archivalSeries.contract.d.ts +50 -0
  4. package/dist/contracts/archivalSeries.contract.js +11 -0
  5. package/dist/contracts/caseFile.contract.d.ts +63 -1
  6. package/dist/contracts/caseFile.contract.js +6 -0
  7. package/dist/contracts/document.contract.d.ts +34 -1
  8. package/dist/contracts/document.contract.js +3 -0
  9. package/dist/contracts/documentType.contract.d.ts +1 -0
  10. package/dist/contracts/index.d.ts +29 -1
  11. package/dist/contracts/index.js +6 -0
  12. package/dist/contracts/scan.contract.d.ts +63 -0
  13. package/dist/contracts/scan.contract.js +12 -0
  14. package/dist/entities/archivalSeries/archivalSeries.entity.d.ts +27 -0
  15. package/dist/entities/archivalSeries/archivalSeries.entity.js +2 -0
  16. package/dist/entities/archivalSeries/index.d.ts +1 -0
  17. package/dist/entities/archivalSeries/index.js +17 -0
  18. package/dist/entities/caseFile/caseFile.entity.d.ts +85 -0
  19. package/dist/entities/document/document.entity.d.ts +47 -0
  20. package/dist/entities/documentType/documentType.entity.d.ts +5 -0
  21. package/dist/entities/index.d.ts +2 -0
  22. package/dist/entities/index.js +2 -0
  23. package/dist/entities/scan/index.d.ts +1 -0
  24. package/dist/entities/scan/index.js +17 -0
  25. package/dist/entities/scan/scan.entity.d.ts +29 -0
  26. package/dist/entities/scan/scan.entity.js +2 -0
  27. package/package.json +1 -1
  28. package/src/base/entities.ts +88 -3
  29. package/src/contracts/archivalSeries.contract.ts +53 -0
  30. package/src/contracts/caseFile.contract.ts +54 -0
  31. package/src/contracts/document.contract.ts +32 -0
  32. package/src/contracts/documentType.contract.ts +2 -0
  33. package/src/contracts/index.ts +9 -1
  34. package/src/contracts/scan.contract.ts +52 -0
  35. package/src/entities/archivalSeries/archivalSeries.entity.ts +32 -0
  36. package/src/entities/archivalSeries/index.ts +1 -0
  37. package/src/entities/caseFile/caseFile.entity.ts +83 -0
  38. package/src/entities/document/document.entity.ts +45 -0
  39. package/src/entities/documentType/documentType.entity.ts +2 -0
  40. package/src/entities/index.ts +2 -0
  41. package/src/entities/scan/index.ts +1 -0
  42. package/src/entities/scan/scan.entity.ts +32 -0
@@ -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
@@ -7,3 +7,5 @@ export * from './partsOffice';
7
7
  export * from './registerBook';
8
8
  export * from './signatureBatch';
9
9
  export * from './workFolder';
10
+ export * from './scan';
11
+ export * from './archivalSeries';
@@ -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
+ }