@muni-sanfer/types-gestor-documental 0.0.1-beta.0 → 0.0.1-beta.10
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 +459 -2
- package/dist/base/entities.js +102 -1
- package/dist/contracts/caseFile.contract.d.ts +159 -0
- package/dist/contracts/caseFile.contract.js +18 -0
- package/dist/contracts/document.contract.d.ts +167 -3
- package/dist/contracts/document.contract.js +10 -0
- package/dist/contracts/documentType.contract.d.ts +18 -1
- package/dist/contracts/index.d.ts +86 -1
- package/dist/contracts/index.js +18 -0
- package/dist/contracts/partsOffice.contract.d.ts +171 -0
- package/dist/contracts/partsOffice.contract.js +22 -0
- package/dist/contracts/procedure.contract.d.ts +50 -0
- package/dist/contracts/procedure.contract.js +11 -0
- package/dist/contracts/registerBook.contract.d.ts +27 -0
- package/dist/contracts/registerBook.contract.js +8 -0
- package/dist/contracts/signatureBatch.contract.d.ts +109 -0
- package/dist/contracts/signatureBatch.contract.js +12 -0
- package/dist/contracts/workFolder.contract.d.ts +114 -0
- package/dist/contracts/workFolder.contract.js +16 -0
- package/dist/entities/caseFile/caseFile.entity.d.ts +176 -0
- package/dist/entities/caseFile/caseFile.entity.js +2 -0
- package/dist/entities/caseFile/index.d.ts +1 -0
- package/dist/entities/caseFile/index.js +17 -0
- package/dist/entities/document/document.entity.d.ts +250 -1
- package/dist/entities/documentType/documentType.entity.d.ts +18 -1
- package/dist/entities/index.d.ts +6 -0
- package/dist/entities/index.js +6 -0
- package/dist/entities/partsOffice/index.d.ts +1 -0
- package/dist/entities/partsOffice/index.js +17 -0
- package/dist/entities/partsOffice/partsOffice.entity.d.ts +98 -0
- package/dist/entities/partsOffice/partsOffice.entity.js +2 -0
- package/dist/entities/procedure/index.d.ts +1 -0
- package/dist/entities/procedure/index.js +17 -0
- package/dist/entities/procedure/procedure.entity.d.ts +20 -0
- package/dist/entities/procedure/procedure.entity.js +2 -0
- package/dist/entities/registerBook/index.d.ts +1 -0
- package/dist/entities/registerBook/index.js +17 -0
- package/dist/entities/registerBook/registerBook.entity.d.ts +42 -0
- package/dist/entities/registerBook/registerBook.entity.js +2 -0
- package/dist/entities/signatureBatch/index.d.ts +1 -0
- package/dist/entities/signatureBatch/index.js +17 -0
- package/dist/entities/signatureBatch/signatureBatch.entity.d.ts +107 -0
- package/dist/entities/signatureBatch/signatureBatch.entity.js +2 -0
- package/dist/entities/workFolder/index.d.ts +1 -0
- package/dist/entities/workFolder/index.js +17 -0
- package/dist/entities/workFolder/workFolder.entity.d.ts +83 -0
- package/dist/entities/workFolder/workFolder.entity.js +2 -0
- package/package.json +1 -1
- package/src/base/entities.ts +544 -2
- package/src/contracts/caseFile.contract.ts +141 -0
- package/src/contracts/document.contract.ts +153 -0
- package/src/contracts/documentType.contract.ts +14 -1
- package/src/contracts/index.ts +26 -1
- package/src/contracts/partsOffice.contract.ts +120 -0
- package/src/contracts/procedure.contract.ts +53 -0
- package/src/contracts/registerBook.contract.ts +24 -0
- package/src/contracts/signatureBatch.contract.ts +96 -0
- package/src/contracts/workFolder.contract.ts +75 -0
- package/src/entities/caseFile/caseFile.entity.ts +204 -0
- package/src/entities/caseFile/index.ts +1 -0
- package/src/entities/document/document.entity.ts +271 -0
- package/src/entities/documentType/documentType.entity.ts +20 -1
- package/src/entities/index.ts +6 -0
- package/src/entities/partsOffice/index.ts +1 -0
- package/src/entities/partsOffice/partsOffice.entity.ts +103 -0
- package/src/entities/procedure/index.ts +1 -0
- package/src/entities/procedure/procedure.entity.ts +24 -0
- package/src/entities/registerBook/index.ts +1 -0
- package/src/entities/registerBook/registerBook.entity.ts +46 -0
- package/src/entities/signatureBatch/index.ts +1 -0
- package/src/entities/signatureBatch/signatureBatch.entity.ts +110 -0
- package/src/entities/workFolder/index.ts +1 -0
- package/src/entities/workFolder/workFolder.entity.ts +84 -0
- package/tsconfig.json +1 -3
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type CaseFileActorRelation,
|
|
3
|
+
type CaseFileActorType,
|
|
4
|
+
type CaseFileActuationType,
|
|
5
|
+
type CaseFileEntity,
|
|
6
|
+
type CaseFileStatus,
|
|
7
|
+
type DocumentAccessLevel,
|
|
8
|
+
} from '../base/entities';
|
|
9
|
+
import {
|
|
10
|
+
type CaseFileAddBatchResponseEntity,
|
|
11
|
+
type CaseFileAddEntryResponseEntity,
|
|
12
|
+
type CaseFileCreateResponseEntity,
|
|
13
|
+
type CaseFileEntryFileResponseEntity,
|
|
14
|
+
type CaseFileExportResponseEntity,
|
|
15
|
+
type CaseFileGetAllResponseEntity,
|
|
16
|
+
type CaseFileGetByIdResponseEntity,
|
|
17
|
+
type CaseFileUpdateResponseEntity,
|
|
18
|
+
} from '../entities';
|
|
19
|
+
import { type RpcPage } from './contract';
|
|
20
|
+
import { type DocumentActor } from './document.contract';
|
|
21
|
+
|
|
22
|
+
/** Patrones NATS de `caseFile`: `<servicio>.<recurso>.<acción>`. */
|
|
23
|
+
export const CaseFilePatterns = {
|
|
24
|
+
getAll: 'gestorDocumental.caseFile.getAll',
|
|
25
|
+
getById: 'gestorDocumental.caseFile.getById',
|
|
26
|
+
create: 'gestorDocumental.caseFile.create',
|
|
27
|
+
update: 'gestorDocumental.caseFile.update',
|
|
28
|
+
addEntry: 'gestorDocumental.caseFile.addEntry',
|
|
29
|
+
addBatch: 'gestorDocumental.caseFile.addBatch',
|
|
30
|
+
voidEntry: 'gestorDocumental.caseFile.voidEntry',
|
|
31
|
+
share: 'gestorDocumental.caseFile.share',
|
|
32
|
+
unshare: 'gestorDocumental.caseFile.unshare',
|
|
33
|
+
close: 'gestorDocumental.caseFile.close',
|
|
34
|
+
getEntryFile: 'gestorDocumental.caseFile.getEntryFile',
|
|
35
|
+
getExport: 'gestorDocumental.caseFile.getExport',
|
|
36
|
+
} as const;
|
|
37
|
+
|
|
38
|
+
/** Persona u organización relacionada con el expediente (MGDEE54). */
|
|
39
|
+
export interface CaseFileActorInput {
|
|
40
|
+
relation: CaseFileActorRelation;
|
|
41
|
+
actorType: CaseFileActorType;
|
|
42
|
+
identifier?: string | null;
|
|
43
|
+
name: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Metadatos del expediente que se ingresan a mano. */
|
|
47
|
+
export interface CaseFileWritePayload {
|
|
48
|
+
title: string;
|
|
49
|
+
subject: string;
|
|
50
|
+
summary?: string | null;
|
|
51
|
+
procedureId: string;
|
|
52
|
+
accessLevel: DocumentAccessLevel;
|
|
53
|
+
hasSensitiveData: boolean;
|
|
54
|
+
actors?: CaseFileActorInput[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Actuación que se incorpora al índice: un documento del gestor, un archivo subido u otro expediente. */
|
|
58
|
+
export type CaseFileEntryInput =
|
|
59
|
+
| { kind: 'Document'; actuationType: CaseFileActuationType; documentId: string }
|
|
60
|
+
| {
|
|
61
|
+
kind: 'File';
|
|
62
|
+
actuationType: CaseFileActuationType;
|
|
63
|
+
fileId: string;
|
|
64
|
+
fileName: string;
|
|
65
|
+
title: string;
|
|
66
|
+
documentTypeName?: string | null;
|
|
67
|
+
originDate?: string | null;
|
|
68
|
+
author?: string | null;
|
|
69
|
+
keywords: string[];
|
|
70
|
+
accessLevel: DocumentAccessLevel;
|
|
71
|
+
hasSensitiveData: boolean;
|
|
72
|
+
}
|
|
73
|
+
| { kind: 'CaseFile'; actuationType: CaseFileActuationType; linkedCaseFileId: string };
|
|
74
|
+
|
|
75
|
+
/** Quién hace la operación (de la sesión) y si puede ver todos los expedientes. */
|
|
76
|
+
interface CaseFileActorPayload {
|
|
77
|
+
actor: DocumentActor;
|
|
78
|
+
viewAll?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Ámbito del listado: los expedientes del funcionario (responsable o compartidos con él) o todos. */
|
|
82
|
+
export type CaseFileScope = 'mine' | 'all';
|
|
83
|
+
|
|
84
|
+
export interface CaseFileContract {
|
|
85
|
+
[CaseFilePatterns.getAll]: {
|
|
86
|
+
payload: {
|
|
87
|
+
pagination?: { page?: number; limit?: number };
|
|
88
|
+
filters?: { search?: string; status?: CaseFileStatus; procedureId?: string; scope?: CaseFileScope };
|
|
89
|
+
} & CaseFileActorPayload;
|
|
90
|
+
response: RpcPage<CaseFileGetAllResponseEntity[]>;
|
|
91
|
+
};
|
|
92
|
+
/** Por id o por su identificador (`EXP-2026-00001`), que es el del enlace persistente. Queda en el registro de accesos. */
|
|
93
|
+
[CaseFilePatterns.getById]: {
|
|
94
|
+
payload: { id: string } & CaseFileActorPayload;
|
|
95
|
+
response: CaseFileGetByIdResponseEntity;
|
|
96
|
+
};
|
|
97
|
+
[CaseFilePatterns.create]: {
|
|
98
|
+
payload: CaseFileWritePayload & { actor: DocumentActor };
|
|
99
|
+
response: CaseFileCreateResponseEntity;
|
|
100
|
+
};
|
|
101
|
+
[CaseFilePatterns.update]: {
|
|
102
|
+
payload: CaseFileWritePayload & Pick<CaseFileEntity, 'id'> & { actor: DocumentActor };
|
|
103
|
+
response: CaseFileUpdateResponseEntity;
|
|
104
|
+
};
|
|
105
|
+
/** Incorpora los documentos finalizados de un lote de firma, en su orden; omite los que ya están en el expediente. */
|
|
106
|
+
[CaseFilePatterns.addBatch]: {
|
|
107
|
+
payload: { id: string; batchId: string; actuationType: CaseFileActuationType } & CaseFileActorPayload;
|
|
108
|
+
response: CaseFileAddBatchResponseEntity;
|
|
109
|
+
};
|
|
110
|
+
[CaseFilePatterns.addEntry]: {
|
|
111
|
+
payload: Pick<CaseFileEntity, 'id'> & { entry: CaseFileEntryInput } & CaseFileActorPayload;
|
|
112
|
+
response: CaseFileAddEntryResponseEntity;
|
|
113
|
+
};
|
|
114
|
+
/** Deja una actuación sin efecto, con su motivo. No se elimina del índice. */
|
|
115
|
+
[CaseFilePatterns.voidEntry]: {
|
|
116
|
+
payload: Pick<CaseFileEntity, 'id'> & { entryId: string; reason: string; actor: DocumentActor };
|
|
117
|
+
response: CaseFileUpdateResponseEntity;
|
|
118
|
+
};
|
|
119
|
+
[CaseFilePatterns.share]: {
|
|
120
|
+
payload: Pick<CaseFileEntity, 'id'> & { employeeIds: string[]; actor: DocumentActor };
|
|
121
|
+
response: CaseFileUpdateResponseEntity;
|
|
122
|
+
};
|
|
123
|
+
[CaseFilePatterns.unshare]: {
|
|
124
|
+
payload: Pick<CaseFileEntity, 'id'> & { participantId: string; actor: DocumentActor };
|
|
125
|
+
response: CaseFileUpdateResponseEntity;
|
|
126
|
+
};
|
|
127
|
+
[CaseFilePatterns.close]: {
|
|
128
|
+
payload: Pick<CaseFileEntity, 'id'> & { note?: string | null; actor: DocumentActor };
|
|
129
|
+
response: CaseFileUpdateResponseEntity;
|
|
130
|
+
};
|
|
131
|
+
/** Archivo de una actuación del índice. Queda en el registro de accesos. */
|
|
132
|
+
[CaseFilePatterns.getEntryFile]: {
|
|
133
|
+
payload: Pick<CaseFileEntity, 'id'> & { entryId: string } & CaseFileActorPayload;
|
|
134
|
+
response: CaseFileEntryFileResponseEntity;
|
|
135
|
+
};
|
|
136
|
+
/** Metadatos y archivos para exportar el expediente completo. Queda en la trazabilidad y en el registro de accesos. */
|
|
137
|
+
[CaseFilePatterns.getExport]: {
|
|
138
|
+
payload: Pick<CaseFileEntity, 'id'> & CaseFileActorPayload;
|
|
139
|
+
response: CaseFileExportResponseEntity;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
@@ -1,30 +1,53 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type DocumentAccessLevel,
|
|
3
3
|
type DocumentAttachmentEntity,
|
|
4
|
+
type DocumentDeliveryEntity,
|
|
4
5
|
type DocumentEntity,
|
|
6
|
+
type DocumentInstruction,
|
|
7
|
+
type DocumentParticipantEntity,
|
|
5
8
|
type DocumentStatus,
|
|
6
9
|
} from '../base/entities';
|
|
7
10
|
import {
|
|
11
|
+
type DocumentAnnulResponseEntity,
|
|
12
|
+
type DocumentCloseDeliveryResponseEntity,
|
|
8
13
|
type DocumentCreateResponseEntity,
|
|
14
|
+
type DocumentDeriveResponseEntity,
|
|
9
15
|
type DocumentDiscardResponseEntity,
|
|
10
16
|
type DocumentGetAllResponseEntity,
|
|
11
17
|
type DocumentGetByIdResponseEntity,
|
|
12
18
|
type DocumentGetSummaryResponseEntity,
|
|
19
|
+
type DocumentInboxItemEntity,
|
|
20
|
+
type DocumentPublicFileResponseEntity,
|
|
21
|
+
type DocumentReassignResponseEntity,
|
|
13
22
|
type DocumentReviewResponseEntity,
|
|
23
|
+
type DocumentSignManyResponseEntity,
|
|
24
|
+
type DocumentAgendaResponseEntity,
|
|
25
|
+
type DocumentTrailExportEntity,
|
|
14
26
|
type DocumentUpdateResponseEntity,
|
|
27
|
+
type DocumentVerifyResponseEntity,
|
|
15
28
|
} from '../entities';
|
|
16
29
|
import { type RpcPage } from './contract';
|
|
17
30
|
|
|
18
31
|
/** Patrones NATS de `document`: `<servicio>.<recurso>.<acción>`. */
|
|
19
32
|
export const DocumentPatterns = {
|
|
20
33
|
getAll: 'gestorDocumental.document.getAll',
|
|
34
|
+
getInbox: 'gestorDocumental.document.getInbox',
|
|
21
35
|
getSummary: 'gestorDocumental.document.getSummary',
|
|
22
36
|
getById: 'gestorDocumental.document.getById',
|
|
23
37
|
create: 'gestorDocumental.document.create',
|
|
24
38
|
update: 'gestorDocumental.document.update',
|
|
25
39
|
review: 'gestorDocumental.document.review',
|
|
40
|
+
signMany: 'gestorDocumental.document.signMany',
|
|
41
|
+
reassign: 'gestorDocumental.document.reassign',
|
|
26
42
|
discard: 'gestorDocumental.document.discard',
|
|
43
|
+
annul: 'gestorDocumental.document.annul',
|
|
44
|
+
derive: 'gestorDocumental.document.derive',
|
|
45
|
+
closeDelivery: 'gestorDocumental.document.closeDelivery',
|
|
46
|
+
verify: 'gestorDocumental.document.verify',
|
|
47
|
+
getPublicFile: 'gestorDocumental.document.getPublicFile',
|
|
27
48
|
getFilesFolder: 'gestorDocumental.document.getFilesFolder',
|
|
49
|
+
getAgenda: 'gestorDocumental.document.getAgenda',
|
|
50
|
+
exportTrail: 'gestorDocumental.document.exportTrail',
|
|
28
51
|
} as const;
|
|
29
52
|
|
|
30
53
|
/**
|
|
@@ -40,11 +63,24 @@ export interface DocumentActor {
|
|
|
40
63
|
/** Bandeja desde la que se lista. Todas son del funcionario (`actor`), salvo `all`. */
|
|
41
64
|
export type DocumentBucket =
|
|
42
65
|
| 'created' // los que redactó
|
|
66
|
+
| 'sent' // de los que redactó, los ya finalizados que tienen destinatarios
|
|
43
67
|
| 'toVisa' // le toca visarlos
|
|
44
68
|
| 'toSign' // le toca firmarlos
|
|
45
69
|
| 'participated' // ya los visó, firmó o rechazó
|
|
46
70
|
| 'all'; // todos los que están en tramitación o finalizados (historial)
|
|
47
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Destinatario de un documento o de una derivación: una persona o un área completa. El gateway resuelve el nombre del
|
|
74
|
+
* área y quiénes la integran hoy; el navegador solo indica cuál es.
|
|
75
|
+
*/
|
|
76
|
+
export type DocumentRecipientInput =
|
|
77
|
+
| { type: 'Employee'; employeeId: string }
|
|
78
|
+
| { type: 'Directorate'; directorateCodeReference: number; name: string; memberEmployeeIds: string[] }
|
|
79
|
+
| { type: 'Department'; departmentId: string; name: string; memberEmployeeIds: string[] };
|
|
80
|
+
|
|
81
|
+
/** Qué parte de la bandeja de recibidos se lista: lo que falta atender, lo ya atendido, o todo. */
|
|
82
|
+
export type DocumentInboxState = 'pending' | 'closed' | 'all';
|
|
83
|
+
|
|
48
84
|
/** Qué hace con el documento quien tiene el turno. */
|
|
49
85
|
export type DocumentReviewAction = 'Visa' | 'Sign' | 'Reject';
|
|
50
86
|
|
|
@@ -63,15 +99,48 @@ export interface DocumentWritePayload extends Pick<DocumentEntity, 'subject' | '
|
|
|
63
99
|
attachments?: Pick<DocumentAttachmentEntity, 'name' | 'type' | 'fileId' | 'url'>[];
|
|
64
100
|
// Funcionarios que visan y que firman, en el orden en que les toca. Primero visan todos y después firman.
|
|
65
101
|
visaEmployeeIds: string[];
|
|
102
|
+
// Etapa de cada visador, en su orden ([1, 1, 2]: los dos primeros visan a la vez). Sin etapas, visan en cadena.
|
|
103
|
+
visaStages?: number[] | null;
|
|
104
|
+
// Al reenviar un documento rechazado, pedir de nuevo las visaciones ya hechas en vez de seguir donde quedó.
|
|
105
|
+
restartFlow?: boolean;
|
|
66
106
|
signatureEmployeeIds: string[];
|
|
107
|
+
// Firmas y visaciones en una hoja aparte al final, en vez de al pie de la última página.
|
|
108
|
+
signatureSheet?: boolean;
|
|
109
|
+
// A quién va dirigido: le llega a su bandeja cuando el documento termina su tramitación.
|
|
110
|
+
recipients?: DocumentRecipientInput[];
|
|
111
|
+
// Plazo en que se espera respuesta de los destinatarios (ISO 8601).
|
|
112
|
+
responseDueAt?: string | null;
|
|
113
|
+
// Documento al que este responde.
|
|
114
|
+
replyToDocumentId?: string | null;
|
|
115
|
+
// Instituciones (y usuarios) de DocDigital a quienes va: al terminar la firma pasa a Oficina de Partes.
|
|
116
|
+
externalRecipients?: DocumentExternalRecipientInput[];
|
|
67
117
|
action?: 'Submit';
|
|
68
118
|
actor: DocumentActor;
|
|
69
119
|
}
|
|
70
120
|
|
|
121
|
+
/** Destinatario externo: una institución de DocDigital y, si se indica, uno de sus usuarios. */
|
|
122
|
+
export interface DocumentExternalRecipientInput {
|
|
123
|
+
entityId: number;
|
|
124
|
+
userId?: number | null;
|
|
125
|
+
}
|
|
126
|
+
|
|
71
127
|
/**
|
|
72
128
|
* Qué se envía y qué se responde en cada patrón. Generado desde los handlers y los DTO del microservicio.
|
|
73
129
|
*/
|
|
74
130
|
export interface DocumentContract {
|
|
131
|
+
/** Plazos del funcionario entre `from` y `to` (hasta 62 días), y lo que tiene vencido sin atender. */
|
|
132
|
+
[DocumentPatterns.getAgenda]: {
|
|
133
|
+
payload: { from: string; to: string; actor: DocumentActor };
|
|
134
|
+
response: DocumentAgendaResponseEntity;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Trazabilidad del documento en PDF: datos, flujo, hechos y huella de sus archivos. Con las mismas reglas de acceso
|
|
138
|
+
* del detalle. `generatedBy`: quién la descarga (va al pie).
|
|
139
|
+
*/
|
|
140
|
+
[DocumentPatterns.exportTrail]: {
|
|
141
|
+
payload: Pick<DocumentEntity, 'id'> & { actor?: DocumentActor; viewAll?: boolean; generatedBy: string };
|
|
142
|
+
response: DocumentTrailExportEntity;
|
|
143
|
+
};
|
|
75
144
|
[DocumentPatterns.getAll]: {
|
|
76
145
|
payload: {
|
|
77
146
|
pagination?: { page?: number; limit?: number };
|
|
@@ -83,12 +152,29 @@ export interface DocumentContract {
|
|
|
83
152
|
// Rango de fechas de creación (ISO 8601).
|
|
84
153
|
dateFrom?: string;
|
|
85
154
|
dateTo?: string;
|
|
155
|
+
// Búsqueda avanzada: número (del documento o folio de ingreso) y año, firmante, redactor y unidad emisora.
|
|
156
|
+
number?: number;
|
|
157
|
+
year?: number;
|
|
158
|
+
signerEmployeeId?: string;
|
|
159
|
+
authorEmployeeId?: string;
|
|
160
|
+
directorateCodeReference?: number;
|
|
161
|
+
// Texto completo, en el asunto y en el contenido del PDF.
|
|
162
|
+
text?: string;
|
|
86
163
|
};
|
|
87
164
|
// Obligatorio en todas las bandejas salvo `all`.
|
|
88
165
|
actor?: DocumentActor;
|
|
89
166
|
};
|
|
90
167
|
response: RpcPage<DocumentGetAllResponseEntity[]>;
|
|
91
168
|
};
|
|
169
|
+
/** Bandeja de recibidos de un funcionario: lo que le llegó como destinatario o por derivación. */
|
|
170
|
+
[DocumentPatterns.getInbox]: {
|
|
171
|
+
payload: {
|
|
172
|
+
pagination?: { page?: number; limit?: number };
|
|
173
|
+
filters?: { search?: string; state?: DocumentInboxState };
|
|
174
|
+
actor: DocumentActor;
|
|
175
|
+
};
|
|
176
|
+
response: RpcPage<DocumentInboxItemEntity[]>;
|
|
177
|
+
};
|
|
92
178
|
[DocumentPatterns.getSummary]: {
|
|
93
179
|
payload: { actor: DocumentActor };
|
|
94
180
|
response: DocumentGetSummaryResponseEntity;
|
|
@@ -121,10 +207,77 @@ export interface DocumentContract {
|
|
|
121
207
|
};
|
|
122
208
|
response: DocumentReviewResponseEntity;
|
|
123
209
|
};
|
|
210
|
+
/**
|
|
211
|
+
* Firma con un solo OTP varios documentos que el funcionario tiene en su turno de firma (los de un lote, o los que
|
|
212
|
+
* marcó en su bandeja). Cada uno queda firmado aparte; los que no caben en la solicitud quedan en `remaining`.
|
|
213
|
+
*/
|
|
214
|
+
[DocumentPatterns.signMany]: {
|
|
215
|
+
payload: {
|
|
216
|
+
ids: DocumentEntity['id'][];
|
|
217
|
+
observation?: string | null;
|
|
218
|
+
// Datos de quien firma, para el sello de la firma (los resuelve el gateway desde la sesión).
|
|
219
|
+
signer: { rut: string; fullName: string; role: string; areaName: string };
|
|
220
|
+
otp?: string;
|
|
221
|
+
actor: DocumentActor;
|
|
222
|
+
};
|
|
223
|
+
response: DocumentSignManyResponseEntity;
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* Pasa un turno pendiente (de visación o de firma) a otro funcionario, por ausencia o por error, y lo deja en la
|
|
227
|
+
* trazabilidad con su motivo. Puede hacerlo quien redactó el documento; con `anyDocument`, quien lleva el registro.
|
|
228
|
+
*/
|
|
229
|
+
[DocumentPatterns.reassign]: {
|
|
230
|
+
payload: Pick<DocumentEntity, 'id'> & {
|
|
231
|
+
participantId: DocumentParticipantEntity['id'];
|
|
232
|
+
// Funcionario que toma el turno.
|
|
233
|
+
employeeId: string;
|
|
234
|
+
reason: string;
|
|
235
|
+
actor: DocumentActor;
|
|
236
|
+
anyDocument?: boolean;
|
|
237
|
+
};
|
|
238
|
+
response: DocumentReassignResponseEntity;
|
|
239
|
+
};
|
|
124
240
|
[DocumentPatterns.discard]: {
|
|
125
241
|
payload: Pick<DocumentEntity, 'id'> & { actor: DocumentActor };
|
|
126
242
|
response: DocumentDiscardResponseEntity;
|
|
127
243
|
};
|
|
244
|
+
/** Deja sin efecto un documento ya finalizado. Conserva su número, que no se reutiliza. */
|
|
245
|
+
[DocumentPatterns.annul]: {
|
|
246
|
+
payload: Pick<DocumentEntity, 'id'> & { reason: string; actor: DocumentActor };
|
|
247
|
+
response: DocumentAnnulResponseEntity;
|
|
248
|
+
};
|
|
249
|
+
/**
|
|
250
|
+
* Deriva un documento finalizado a otros funcionarios o áreas, con su providencia (qué se espera de ellos) y,
|
|
251
|
+
* si corresponde, un plazo. Puede hacerlo quien lo tiene a su alcance: su redactor, quien lo visó o firmó, quien lo
|
|
252
|
+
* recibió y, con `viewAll`, quien consulta el historial.
|
|
253
|
+
*/
|
|
254
|
+
[DocumentPatterns.derive]: {
|
|
255
|
+
payload: Pick<DocumentEntity, 'id'> & {
|
|
256
|
+
recipients: DocumentRecipientInput[];
|
|
257
|
+
instruction: DocumentInstruction;
|
|
258
|
+
note?: string | null;
|
|
259
|
+
// Plazo para atenderlo (ISO 8601).
|
|
260
|
+
dueAt?: string | null;
|
|
261
|
+
actor: DocumentActor;
|
|
262
|
+
viewAll?: boolean;
|
|
263
|
+
};
|
|
264
|
+
response: DocumentDeriveResponseEntity;
|
|
265
|
+
};
|
|
266
|
+
/** Quien recibió un documento lo marca como atendido, con una nota opcional. */
|
|
267
|
+
[DocumentPatterns.closeDelivery]: {
|
|
268
|
+
payload: { deliveryId: DocumentDeliveryEntity['id']; note?: string | null; actor: DocumentActor };
|
|
269
|
+
response: DocumentCloseDeliveryResponseEntity;
|
|
270
|
+
};
|
|
271
|
+
/** Comprobación pública de un documento con el código que lleva impreso. No exige sesión. */
|
|
272
|
+
[DocumentPatterns.verify]: {
|
|
273
|
+
payload: { code: string };
|
|
274
|
+
response: DocumentVerifyResponseEntity;
|
|
275
|
+
};
|
|
276
|
+
/** Archivo de un documento finalizado y de acceso público, para quien lo verificó con su código. */
|
|
277
|
+
[DocumentPatterns.getPublicFile]: {
|
|
278
|
+
payload: { code: string };
|
|
279
|
+
response: DocumentPublicFileResponseEntity;
|
|
280
|
+
};
|
|
128
281
|
/** Carpeta de Drive de los documentos y sus anexos: el gateway la pide antes de subir cada archivo. */
|
|
129
282
|
[DocumentPatterns.getFilesFolder]: {
|
|
130
283
|
payload: Record<string, never>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DocumentCategory, type DocumentTypeEntity } from '../base/entities';
|
|
1
|
+
import { type DocumentCategory, type DocumentParticipantRole, type DocumentTypeEntity } from '../base/entities';
|
|
2
2
|
import {
|
|
3
3
|
type DocumentTypeCreateResponseEntity,
|
|
4
4
|
type DocumentTypeGetAllResponseEntity,
|
|
@@ -16,6 +16,15 @@ export const DocumentTypePatterns = {
|
|
|
16
16
|
setEnabled: 'gestorDocumental.documentType.setEnabled',
|
|
17
17
|
} as const;
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Paso del flujo sugerido de un tipo documental: un funcionario en particular, o quien dirija una dirección al
|
|
21
|
+
* momento de redactar (su jefatura o, con subrogancia activa, el subrogante). El nombre de la dirección lo resuelve
|
|
22
|
+
* el gateway; el navegador solo indica cuál es.
|
|
23
|
+
*/
|
|
24
|
+
export type DocumentFlowStepInput =
|
|
25
|
+
| { role: DocumentParticipantRole; type: 'Employee'; employeeId: string }
|
|
26
|
+
| { role: DocumentParticipantRole; type: 'DirectorateHead'; directorateCodeReference: number; name: string };
|
|
27
|
+
|
|
19
28
|
/** Datos de un tipo documental al crearlo o editarlo. */
|
|
20
29
|
export interface DocumentTypeWritePayload {
|
|
21
30
|
name: string;
|
|
@@ -25,8 +34,12 @@ export interface DocumentTypeWritePayload {
|
|
|
25
34
|
// Próximo número que se asignará: permite partir desde el correlativo que la municipalidad ya lleva.
|
|
26
35
|
nextCorrelative?: number;
|
|
27
36
|
resetsYearly?: boolean;
|
|
37
|
+
// Sus documentos llevan número (por omisión, sí).
|
|
38
|
+
numbered?: boolean;
|
|
28
39
|
directorateCodeReference?: number | null;
|
|
29
40
|
enabled?: boolean;
|
|
41
|
+
// Flujo sugerido, en el orden en que les toca dentro de cada rol. Al editar, si no viene, el flujo no cambia.
|
|
42
|
+
flowSteps?: DocumentFlowStepInput[];
|
|
30
43
|
}
|
|
31
44
|
|
|
32
45
|
/**
|
package/src/contracts/index.ts
CHANGED
|
@@ -1,15 +1,40 @@
|
|
|
1
|
+
import { CaseFilePatterns, type CaseFileContract } from './caseFile.contract';
|
|
1
2
|
import { DocumentPatterns, type DocumentContract } from './document.contract';
|
|
2
3
|
import { DocumentTypePatterns, type DocumentTypeContract } from './documentType.contract';
|
|
4
|
+
import { PartsOfficePatterns, type PartsOfficeContract } from './partsOffice.contract';
|
|
5
|
+
import { ProcedurePatterns, type ProcedureContract } from './procedure.contract';
|
|
6
|
+
import { RegisterBookPatterns, type RegisterBookContract } from './registerBook.contract';
|
|
7
|
+
import { SignatureBatchPatterns, type SignatureBatchContract } from './signatureBatch.contract';
|
|
8
|
+
import { WorkFolderPatterns, type WorkFolderContract } from './workFolder.contract';
|
|
3
9
|
|
|
4
10
|
export * from './contract';
|
|
5
11
|
export * from './document.contract';
|
|
6
12
|
export * from './documentType.contract';
|
|
13
|
+
export * from './procedure.contract';
|
|
14
|
+
export * from './caseFile.contract';
|
|
15
|
+
export * from './partsOffice.contract';
|
|
16
|
+
export * from './registerBook.contract';
|
|
17
|
+
export * from './signatureBatch.contract';
|
|
18
|
+
export * from './workFolder.contract';
|
|
7
19
|
|
|
8
20
|
/** Patrones NATS de gestor-documental-ms, por recurso: `gestorDocumental.<recurso>.<acción>`. */
|
|
9
21
|
export const GestorDocumentalPatterns = {
|
|
10
22
|
documentType: DocumentTypePatterns,
|
|
11
23
|
document: DocumentPatterns,
|
|
24
|
+
procedure: ProcedurePatterns,
|
|
25
|
+
caseFile: CaseFilePatterns,
|
|
26
|
+
partsOffice: PartsOfficePatterns,
|
|
27
|
+
registerBook: RegisterBookPatterns,
|
|
28
|
+
signatureBatch: SignatureBatchPatterns,
|
|
29
|
+
workFolder: WorkFolderPatterns,
|
|
12
30
|
} as const;
|
|
13
31
|
|
|
14
32
|
/** Contrato completo de gestor-documental-ms: la unión de los contratos de sus recursos. */
|
|
15
|
-
export type GestorDocumentalContract = DocumentTypeContract &
|
|
33
|
+
export type GestorDocumentalContract = DocumentTypeContract &
|
|
34
|
+
DocumentContract &
|
|
35
|
+
ProcedureContract &
|
|
36
|
+
CaseFileContract &
|
|
37
|
+
PartsOfficeContract &
|
|
38
|
+
RegisterBookContract &
|
|
39
|
+
SignatureBatchContract &
|
|
40
|
+
WorkFolderContract;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { type DocumentAccessLevel, type DocumentInstruction } from '../base/entities';
|
|
2
|
+
import {
|
|
3
|
+
type DocDigitalDocumentTypeEntity,
|
|
4
|
+
type DocDigitalEntityEntity,
|
|
5
|
+
type PartsOfficeInboundEntity,
|
|
6
|
+
type DocDigitalUserEntity,
|
|
7
|
+
type PartsOfficeDispatchEntity,
|
|
8
|
+
type PartsOfficeFileEntity,
|
|
9
|
+
type PartsOfficeOkResponseEntity,
|
|
10
|
+
type PartsOfficeRegisterResponseEntity,
|
|
11
|
+
type PartsOfficeStatusEntity,
|
|
12
|
+
type PartsOfficeSummaryEntity,
|
|
13
|
+
type PartsOfficeSyncResponseEntity,
|
|
14
|
+
} from '../entities';
|
|
15
|
+
import { type RpcPage } from './contract';
|
|
16
|
+
import { type DocumentActor, type DocumentExternalRecipientInput } from './document.contract';
|
|
17
|
+
|
|
18
|
+
/** Patrones NATS de `partsOffice` (Oficina de Partes y DocDigital): `<servicio>.<recurso>.<acción>`. */
|
|
19
|
+
export const PartsOfficePatterns = {
|
|
20
|
+
getStatus: 'gestorDocumental.partsOffice.getStatus',
|
|
21
|
+
getSummary: 'gestorDocumental.partsOffice.getSummary',
|
|
22
|
+
getEntities: 'gestorDocumental.partsOffice.getEntities',
|
|
23
|
+
getUsers: 'gestorDocumental.partsOffice.getUsers',
|
|
24
|
+
getDocumentTypes: 'gestorDocumental.partsOffice.getDocumentTypes',
|
|
25
|
+
getDispatches: 'gestorDocumental.partsOffice.getDispatches',
|
|
26
|
+
dispatch: 'gestorDocumental.partsOffice.dispatch',
|
|
27
|
+
returnDispatch: 'gestorDocumental.partsOffice.returnDispatch',
|
|
28
|
+
resendDispatch: 'gestorDocumental.partsOffice.resendDispatch',
|
|
29
|
+
getDispatchFile: 'gestorDocumental.partsOffice.getDispatchFile',
|
|
30
|
+
getInbound: 'gestorDocumental.partsOffice.getInbound',
|
|
31
|
+
syncInbound: 'gestorDocumental.partsOffice.syncInbound',
|
|
32
|
+
registerInbound: 'gestorDocumental.partsOffice.registerInbound',
|
|
33
|
+
acknowledgeInbound: 'gestorDocumental.partsOffice.acknowledgeInbound',
|
|
34
|
+
returnInbound: 'gestorDocumental.partsOffice.returnInbound',
|
|
35
|
+
getInboundFile: 'gestorDocumental.partsOffice.getInboundFile',
|
|
36
|
+
} as const;
|
|
37
|
+
|
|
38
|
+
/** Destinatario interno de un ingreso, ya resuelto por el gateway (las áreas con sus integrantes). */
|
|
39
|
+
export type PartsOfficeRecipientInput =
|
|
40
|
+
| { type: 'Employee'; employeeId: string }
|
|
41
|
+
| { type: 'Directorate'; directorateCodeReference: number; name: string; memberEmployeeIds: string[] }
|
|
42
|
+
| { type: 'Department'; departmentId: string; name: string; memberEmployeeIds: string[] };
|
|
43
|
+
|
|
44
|
+
interface IListPayload<S> {
|
|
45
|
+
pagination?: { page?: number; limit?: number };
|
|
46
|
+
filters?: { search?: string; status?: S };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface PartsOfficeContract {
|
|
50
|
+
[PartsOfficePatterns.getStatus]: { payload: Record<string, never>; response: PartsOfficeStatusEntity };
|
|
51
|
+
[PartsOfficePatterns.getSummary]: { payload: Record<string, never>; response: PartsOfficeSummaryEntity };
|
|
52
|
+
/** Directorio de DocDigital: instituciones por nombre. */
|
|
53
|
+
[PartsOfficePatterns.getEntities]: { payload: { search?: string }; response: DocDigitalEntityEntity[] };
|
|
54
|
+
[PartsOfficePatterns.getUsers]: {
|
|
55
|
+
payload: { entityId: number; search?: string };
|
|
56
|
+
response: DocDigitalUserEntity[];
|
|
57
|
+
};
|
|
58
|
+
[PartsOfficePatterns.getDocumentTypes]: { payload: Record<string, never>; response: DocDigitalDocumentTypeEntity[] };
|
|
59
|
+
[PartsOfficePatterns.getDispatches]: {
|
|
60
|
+
payload: IListPayload<'Pending' | 'Dispatched' | 'Returned'>;
|
|
61
|
+
response: RpcPage<PartsOfficeDispatchEntity[]>;
|
|
62
|
+
};
|
|
63
|
+
/** Despacha por DocDigital, con el número del documento como folio. `operatorRun`: RUN de quien despacha. */
|
|
64
|
+
[PartsOfficePatterns.dispatch]: {
|
|
65
|
+
payload: { id: string; docDigitalTypeId: number; operatorRun?: string | null; actor: DocumentActor };
|
|
66
|
+
response: PartsOfficeOkResponseEntity & { docDigitalDocumentId: string };
|
|
67
|
+
};
|
|
68
|
+
/** Devuelve el despacho al redactor, con el motivo (por ejemplo, un destinatario equivocado). */
|
|
69
|
+
[PartsOfficePatterns.returnDispatch]: {
|
|
70
|
+
payload: { id: string; reason: string; actor: DocumentActor };
|
|
71
|
+
response: PartsOfficeOkResponseEntity;
|
|
72
|
+
};
|
|
73
|
+
/** El redactor corrige las instituciones de destino de un despacho devuelto y lo envía de nuevo a Partes. */
|
|
74
|
+
[PartsOfficePatterns.resendDispatch]: {
|
|
75
|
+
payload: { id: string; externalRecipients: DocumentExternalRecipientInput[]; actor: DocumentActor };
|
|
76
|
+
response: PartsOfficeOkResponseEntity;
|
|
77
|
+
};
|
|
78
|
+
/** PDF firmado de un documento por despachar, para que Oficina de Partes lo revise. */
|
|
79
|
+
[PartsOfficePatterns.getDispatchFile]: { payload: { id: string }; response: PartsOfficeFileEntity };
|
|
80
|
+
[PartsOfficePatterns.getInbound]: {
|
|
81
|
+
payload: IListPayload<'Pending' | 'Registered' | 'Returned'>;
|
|
82
|
+
response: RpcPage<PartsOfficeInboundEntity[]>;
|
|
83
|
+
};
|
|
84
|
+
/** Trae de DocDigital lo recibido que aún no tiene acuse de recibo. */
|
|
85
|
+
[PartsOfficePatterns.syncInbound]: { payload: Record<string, never>; response: PartsOfficeSyncResponseEntity };
|
|
86
|
+
/**
|
|
87
|
+
* Ingresa un recibido al gestor: le da folio de ingreso, lo deriva a quienes corresponda y da el acuse de recibo
|
|
88
|
+
* en DocDigital.
|
|
89
|
+
*/
|
|
90
|
+
[PartsOfficePatterns.registerInbound]: {
|
|
91
|
+
payload: {
|
|
92
|
+
id: string;
|
|
93
|
+
documentTypeId: string;
|
|
94
|
+
keywords: string[];
|
|
95
|
+
accessLevel: DocumentAccessLevel;
|
|
96
|
+
hasSensitiveData: boolean;
|
|
97
|
+
recipients: PartsOfficeRecipientInput[];
|
|
98
|
+
instruction: DocumentInstruction;
|
|
99
|
+
note?: string | null;
|
|
100
|
+
dueAt?: string | null;
|
|
101
|
+
actor: DocumentActor;
|
|
102
|
+
};
|
|
103
|
+
response: PartsOfficeRegisterResponseEntity;
|
|
104
|
+
};
|
|
105
|
+
/** Reintenta el acuse de recibo de un recibido ya ingresado. */
|
|
106
|
+
[PartsOfficePatterns.acknowledgeInbound]: {
|
|
107
|
+
payload: { id: string; actor: DocumentActor };
|
|
108
|
+
response: PartsOfficeOkResponseEntity;
|
|
109
|
+
};
|
|
110
|
+
/** Devuelve el recibido a la institución que lo envió, con el motivo (entre 3 y 255 caracteres). */
|
|
111
|
+
[PartsOfficePatterns.returnInbound]: {
|
|
112
|
+
payload: { id: string; reason: string; actor: DocumentActor };
|
|
113
|
+
response: PartsOfficeOkResponseEntity;
|
|
114
|
+
};
|
|
115
|
+
/** Archivo de un recibido: el principal o, con `attachment`, uno de sus anexos (por su posición). */
|
|
116
|
+
[PartsOfficePatterns.getInboundFile]: {
|
|
117
|
+
payload: { id: string; attachment?: number };
|
|
118
|
+
response: PartsOfficeFileEntity;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type ProcedureEntity } from '../base/entities';
|
|
2
|
+
import {
|
|
3
|
+
type ProcedureCreateResponseEntity,
|
|
4
|
+
type ProcedureGetAllResponseEntity,
|
|
5
|
+
type ProcedureGetByIdResponseEntity,
|
|
6
|
+
type ProcedureUpdateResponseEntity,
|
|
7
|
+
} from '../entities';
|
|
8
|
+
import { type RpcPage } from './contract';
|
|
9
|
+
|
|
10
|
+
/** Patrones NATS de `procedure`: `<servicio>.<recurso>.<acción>`. */
|
|
11
|
+
export const ProcedurePatterns = {
|
|
12
|
+
getAll: 'gestorDocumental.procedure.getAll',
|
|
13
|
+
getById: 'gestorDocumental.procedure.getById',
|
|
14
|
+
create: 'gestorDocumental.procedure.create',
|
|
15
|
+
update: 'gestorDocumental.procedure.update',
|
|
16
|
+
setEnabled: 'gestorDocumental.procedure.setEnabled',
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
/** Datos de un procedimiento administrativo al crearlo o editarlo. */
|
|
20
|
+
export interface ProcedureWritePayload {
|
|
21
|
+
name: string;
|
|
22
|
+
cpatId?: string | null;
|
|
23
|
+
cpatCode?: string | null;
|
|
24
|
+
description?: string | null;
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ProcedureContract {
|
|
29
|
+
[ProcedurePatterns.getAll]: {
|
|
30
|
+
// sin `page` y `limit` responde todos en una sola página
|
|
31
|
+
payload: {
|
|
32
|
+
pagination?: { page?: number; limit?: number };
|
|
33
|
+
filters?: { search?: string; enabled?: boolean };
|
|
34
|
+
};
|
|
35
|
+
response: RpcPage<ProcedureGetAllResponseEntity[]>;
|
|
36
|
+
};
|
|
37
|
+
[ProcedurePatterns.getById]: {
|
|
38
|
+
payload: Pick<ProcedureEntity, 'id'>;
|
|
39
|
+
response: ProcedureGetByIdResponseEntity;
|
|
40
|
+
};
|
|
41
|
+
[ProcedurePatterns.create]: {
|
|
42
|
+
payload: ProcedureWritePayload;
|
|
43
|
+
response: ProcedureCreateResponseEntity;
|
|
44
|
+
};
|
|
45
|
+
[ProcedurePatterns.update]: {
|
|
46
|
+
payload: ProcedureWritePayload & Pick<ProcedureEntity, 'id'>;
|
|
47
|
+
response: ProcedureUpdateResponseEntity;
|
|
48
|
+
};
|
|
49
|
+
[ProcedurePatterns.setEnabled]: {
|
|
50
|
+
payload: Pick<ProcedureEntity, 'id' | 'enabled'>;
|
|
51
|
+
response: ProcedureUpdateResponseEntity;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type RegisterBookEntity, type RegisterBookExportEntity, type RegisterBookKind } from '../entities';
|
|
2
|
+
|
|
3
|
+
/** Patrones NATS de `registerBook` (libros de registro): `<servicio>.<recurso>.<acción>`. */
|
|
4
|
+
export const RegisterBookPatterns = {
|
|
5
|
+
get: 'gestorDocumental.registerBook.get',
|
|
6
|
+
export: 'gestorDocumental.registerBook.export',
|
|
7
|
+
} as const;
|
|
8
|
+
|
|
9
|
+
/** Qué libro y qué período: un año y, si se indica, un mes. El de un tipo documental exige el tipo. */
|
|
10
|
+
export interface RegisterBookQuery {
|
|
11
|
+
kind: RegisterBookKind;
|
|
12
|
+
documentTypeId?: string;
|
|
13
|
+
year: number;
|
|
14
|
+
month?: number | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface RegisterBookContract {
|
|
18
|
+
[RegisterBookPatterns.get]: { payload: RegisterBookQuery; response: RegisterBookEntity };
|
|
19
|
+
/** El libro en Excel o PDF. `generatedBy`: quién lo descarga (va en el encabezado). */
|
|
20
|
+
[RegisterBookPatterns.export]: {
|
|
21
|
+
payload: RegisterBookQuery & { format: 'xlsx' | 'pdf'; generatedBy: string };
|
|
22
|
+
response: RegisterBookExportEntity;
|
|
23
|
+
};
|
|
24
|
+
}
|