@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
@@ -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;
@@ -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';
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muni-sanfer/types-gestor-documental",
3
- "version": "0.0.1-beta.14",
3
+ "version": "0.0.1-beta.16",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -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: string;
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).