@ssolis-ti/mcp-compra-agil 1.0.2 → 2.1.0
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/README.md +113 -25
- package/dist/api/compra-agil-client.d.ts +2 -1
- package/dist/api/compra-agil-client.d.ts.map +1 -1
- package/dist/api/compra-agil-client.js +12 -2
- package/dist/api/compra-agil-client.js.map +1 -1
- package/dist/index.js +31 -7
- package/dist/index.js.map +1 -1
- package/dist/reports/components.d.ts +59 -0
- package/dist/reports/components.d.ts.map +1 -0
- package/dist/reports/components.js +125 -0
- package/dist/reports/components.js.map +1 -0
- package/dist/reports/export.d.ts +27 -0
- package/dist/reports/export.d.ts.map +1 -0
- package/dist/reports/export.js +47 -0
- package/dist/reports/export.js.map +1 -0
- package/dist/reports/format.d.ts +24 -0
- package/dist/reports/format.d.ts.map +1 -0
- package/dist/reports/format.js +74 -0
- package/dist/reports/format.js.map +1 -0
- package/dist/reports/render.d.ts +18 -0
- package/dist/reports/render.d.ts.map +1 -0
- package/dist/reports/render.js +30 -0
- package/dist/reports/render.js.map +1 -0
- package/dist/reports/templates/radar-oportunidades.d.ts +41 -0
- package/dist/reports/templates/radar-oportunidades.d.ts.map +1 -0
- package/dist/reports/templates/radar-oportunidades.js +170 -0
- package/dist/reports/templates/radar-oportunidades.js.map +1 -0
- package/dist/reports/theme.d.ts +83 -0
- package/dist/reports/theme.d.ts.map +1 -0
- package/dist/reports/theme.js +284 -0
- package/dist/reports/theme.js.map +1 -0
- package/dist/resources/compras-template.d.ts.map +1 -1
- package/dist/resources/compras-template.js +2 -1
- package/dist/resources/compras-template.js.map +1 -1
- package/dist/resources/documentacion.d.ts.map +1 -1
- package/dist/resources/documentacion.js +5 -36
- package/dist/resources/documentacion.js.map +1 -1
- package/dist/resources/estados.d.ts.map +1 -1
- package/dist/resources/estados.js +24 -10
- package/dist/resources/estados.js.map +1 -1
- package/dist/services/monitor.js +37 -2
- package/dist/services/monitor.js.map +1 -1
- package/dist/tools/analizar-precios-mercado.d.ts +21 -0
- package/dist/tools/analizar-precios-mercado.d.ts.map +1 -0
- package/dist/tools/analizar-precios-mercado.js +217 -0
- package/dist/tools/analizar-precios-mercado.js.map +1 -0
- package/dist/tools/auditar-desiertas.d.ts.map +1 -1
- package/dist/tools/auditar-desiertas.js +64 -46
- package/dist/tools/auditar-desiertas.js.map +1 -1
- package/dist/tools/buscar-compras.d.ts.map +1 -1
- package/dist/tools/buscar-compras.js +2 -1
- package/dist/tools/buscar-compras.js.map +1 -1
- package/dist/tools/detalle-compra.d.ts.map +1 -1
- package/dist/tools/detalle-compra.js +6 -5
- package/dist/tools/detalle-compra.js.map +1 -1
- package/dist/tools/detalle-oc.d.ts.map +1 -1
- package/dist/tools/detalle-oc.js +6 -5
- package/dist/tools/detalle-oc.js.map +1 -1
- package/dist/tools/documentos.d.ts.map +1 -1
- package/dist/tools/documentos.js +51 -50
- package/dist/tools/documentos.js.map +1 -1
- package/dist/tools/generar-borrador.d.ts.map +1 -1
- package/dist/tools/generar-borrador.js +37 -26
- package/dist/tools/generar-borrador.js.map +1 -1
- package/dist/tools/generar-informe.d.ts +13 -0
- package/dist/tools/generar-informe.d.ts.map +1 -0
- package/dist/tools/generar-informe.js +111 -0
- package/dist/tools/generar-informe.js.map +1 -0
- package/dist/tools/monitorear-cambios.d.ts +32 -2
- package/dist/tools/monitorear-cambios.d.ts.map +1 -1
- package/dist/tools/monitorear-cambios.js +79 -10
- package/dist/tools/monitorear-cambios.js.map +1 -1
- package/dist/tools/radar-oportunidades.d.ts +42 -1
- package/dist/tools/radar-oportunidades.d.ts.map +1 -1
- package/dist/tools/radar-oportunidades.js +123 -103
- package/dist/tools/radar-oportunidades.js.map +1 -1
- package/dist/tools/recomendar-precio.d.ts +13 -0
- package/dist/tools/recomendar-precio.d.ts.map +1 -1
- package/dist/tools/recomendar-precio.js +54 -58
- package/dist/tools/recomendar-precio.js.map +1 -1
- package/dist/tools/verificar-oc.d.ts.map +1 -1
- package/dist/tools/verificar-oc.js +9 -7
- package/dist/tools/verificar-oc.js.map +1 -1
- package/dist/tools/verificar-ticket.d.ts +13 -0
- package/dist/tools/verificar-ticket.d.ts.map +1 -0
- package/dist/tools/verificar-ticket.js +79 -0
- package/dist/tools/verificar-ticket.js.map +1 -0
- package/dist/utils/docs-locator.d.ts +41 -0
- package/dist/utils/docs-locator.d.ts.map +1 -0
- package/dist/utils/docs-locator.js +82 -0
- package/dist/utils/docs-locator.js.map +1 -0
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +7 -4
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +9 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/quotation.d.ts +71 -0
- package/dist/utils/quotation.d.ts.map +1 -0
- package/dist/utils/quotation.js +140 -0
- package/dist/utils/quotation.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +8 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +25 -1
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/redact.d.ts +48 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +100 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +55 -53
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design system de los informes — print-first.
|
|
3
|
+
*
|
|
4
|
+
* Decisiones de diseño:
|
|
5
|
+
* - El papel es blanco: no hay modo oscuro. Se optimiza contraste, no "look".
|
|
6
|
+
* - Se evitan fondos de página completos (gasto de tinta); el color se usa
|
|
7
|
+
* como acento semántico y en superficies pequeñas (badges, cabeceras de tabla).
|
|
8
|
+
* - Toda la escala (tipografía, espaciado, color) vive aquí: un template nunca
|
|
9
|
+
* debe inventar un color o un tamaño suelto.
|
|
10
|
+
* - Unidades en mm/pt para impresión; rem solo para texto.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Formatos de papel soportados.
|
|
14
|
+
*
|
|
15
|
+
* OJO con el Oficio: en Chile mide 216 × 330 mm. NO equivale al `legal` de CSS
|
|
16
|
+
* (216 × 356 mm, que es el US Legal) — usarlo agregaría 26 mm de alto y descuadraría
|
|
17
|
+
* la caja de texto. Por eso se declara con dimensiones explícitas.
|
|
18
|
+
*
|
|
19
|
+
* Carta es el formato de oficina más habitual en Chile; A4 es el estándar ISO
|
|
20
|
+
* y el default de la mayoría de impresoras; Oficio/Folio se usa en documentos
|
|
21
|
+
* oficiales y legales.
|
|
22
|
+
*/
|
|
23
|
+
export type FormatoPapel = 'a4' | 'carta' | 'oficio';
|
|
24
|
+
export interface DefinicionPapel {
|
|
25
|
+
/** Valor para la regla CSS `@page { size: ... }`. */
|
|
26
|
+
size: string;
|
|
27
|
+
ancho: string;
|
|
28
|
+
alto: string;
|
|
29
|
+
glosa: string;
|
|
30
|
+
/** Dimensiones en mm para exportadores (ej. Puppeteer width/height). */
|
|
31
|
+
mm: {
|
|
32
|
+
ancho: number;
|
|
33
|
+
alto: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare const PAPEL: Record<FormatoPapel, DefinicionPapel>;
|
|
37
|
+
export declare const FORMATO_POR_DEFECTO: FormatoPapel;
|
|
38
|
+
export declare const TOKENS: {
|
|
39
|
+
readonly color: {
|
|
40
|
+
readonly tinta: "#12263a";
|
|
41
|
+
readonly tintaSuave: "#5b6b7c";
|
|
42
|
+
readonly tintaTenue: "#8a97a5";
|
|
43
|
+
readonly marca: "#1b4965";
|
|
44
|
+
readonly marcaClara: "#e7eef4";
|
|
45
|
+
readonly borde: "#d6dee6";
|
|
46
|
+
readonly exito: "#1b6b4a";
|
|
47
|
+
readonly exitoFondo: "#e6f4ec";
|
|
48
|
+
readonly alerta: "#8a5a00";
|
|
49
|
+
readonly alertaFondo: "#fdf2dd";
|
|
50
|
+
readonly critico: "#9b2226";
|
|
51
|
+
readonly criticoFondo: "#fbe9e9";
|
|
52
|
+
readonly papel: "#ffffff";
|
|
53
|
+
};
|
|
54
|
+
readonly fuente: {
|
|
55
|
+
readonly familia: "'Segoe UI', -apple-system, 'Helvetica Neue', Arial, sans-serif";
|
|
56
|
+
readonly mono: "'Cascadia Mono', 'SF Mono', Consolas, monospace";
|
|
57
|
+
readonly cuerpo: "10.5pt";
|
|
58
|
+
readonly micro: "7.5pt";
|
|
59
|
+
readonly pequena: "8.5pt";
|
|
60
|
+
readonly h3: "11pt";
|
|
61
|
+
readonly h2: "13pt";
|
|
62
|
+
readonly h1: "18pt";
|
|
63
|
+
readonly portada: "26pt";
|
|
64
|
+
};
|
|
65
|
+
readonly espacio: {
|
|
66
|
+
readonly xs: "2mm";
|
|
67
|
+
readonly sm: "3mm";
|
|
68
|
+
readonly md: "5mm";
|
|
69
|
+
readonly lg: "8mm";
|
|
70
|
+
readonly xl: "12mm";
|
|
71
|
+
};
|
|
72
|
+
readonly pagina: {
|
|
73
|
+
readonly margen: "16mm 15mm 18mm 15mm";
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Hoja de estilos base del informe. Se inyecta inline en el HTML
|
|
78
|
+
* (los informes deben ser un único archivo autocontenido y portable).
|
|
79
|
+
*
|
|
80
|
+
* @param formato Tamaño de papel. Por defecto Carta (el más usado en oficinas chilenas).
|
|
81
|
+
*/
|
|
82
|
+
export declare function baseCSS(formato?: FormatoPapel): string;
|
|
83
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/reports/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACrC;AAED,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CAuBvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAAsB,CAAC;AAEzD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCT,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,YAAkC,GAAG,MAAM,CAwM3E"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design system de los informes — print-first.
|
|
3
|
+
*
|
|
4
|
+
* Decisiones de diseño:
|
|
5
|
+
* - El papel es blanco: no hay modo oscuro. Se optimiza contraste, no "look".
|
|
6
|
+
* - Se evitan fondos de página completos (gasto de tinta); el color se usa
|
|
7
|
+
* como acento semántico y en superficies pequeñas (badges, cabeceras de tabla).
|
|
8
|
+
* - Toda la escala (tipografía, espaciado, color) vive aquí: un template nunca
|
|
9
|
+
* debe inventar un color o un tamaño suelto.
|
|
10
|
+
* - Unidades en mm/pt para impresión; rem solo para texto.
|
|
11
|
+
*/
|
|
12
|
+
export const PAPEL = {
|
|
13
|
+
a4: {
|
|
14
|
+
size: 'A4',
|
|
15
|
+
ancho: '210mm',
|
|
16
|
+
alto: '297mm',
|
|
17
|
+
glosa: 'A4 (210 × 297 mm)',
|
|
18
|
+
mm: { ancho: 210, alto: 297 },
|
|
19
|
+
},
|
|
20
|
+
carta: {
|
|
21
|
+
size: 'letter',
|
|
22
|
+
ancho: '216mm',
|
|
23
|
+
alto: '279mm',
|
|
24
|
+
glosa: 'Carta (216 × 279 mm)',
|
|
25
|
+
mm: { ancho: 216, alto: 279 },
|
|
26
|
+
},
|
|
27
|
+
oficio: {
|
|
28
|
+
// Oficio/Folio chileno: dimensiones explícitas, NO el `legal` de CSS.
|
|
29
|
+
size: '216mm 330mm',
|
|
30
|
+
ancho: '216mm',
|
|
31
|
+
alto: '330mm',
|
|
32
|
+
glosa: 'Oficio / Folio (216 × 330 mm)',
|
|
33
|
+
mm: { ancho: 216, alto: 330 },
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export const FORMATO_POR_DEFECTO = 'carta';
|
|
37
|
+
export const TOKENS = {
|
|
38
|
+
// Paleta institucional sobria — azul pizarra + acentos semánticos
|
|
39
|
+
color: {
|
|
40
|
+
tinta: '#12263a', // texto principal
|
|
41
|
+
tintaSuave: '#5b6b7c', // texto secundario
|
|
42
|
+
tintaTenue: '#8a97a5', // metadatos
|
|
43
|
+
marca: '#1b4965', // primario (encabezados, líneas)
|
|
44
|
+
marcaClara: '#e7eef4', // superficies suaves
|
|
45
|
+
borde: '#d6dee6',
|
|
46
|
+
exito: '#1b6b4a',
|
|
47
|
+
exitoFondo: '#e6f4ec',
|
|
48
|
+
alerta: '#8a5a00',
|
|
49
|
+
alertaFondo: '#fdf2dd',
|
|
50
|
+
critico: '#9b2226',
|
|
51
|
+
criticoFondo: '#fbe9e9',
|
|
52
|
+
papel: '#ffffff',
|
|
53
|
+
},
|
|
54
|
+
// Escala tipográfica modular (ratio ~1.25) anclada a 10.5pt de cuerpo
|
|
55
|
+
fuente: {
|
|
56
|
+
familia: "'Segoe UI', -apple-system, 'Helvetica Neue', Arial, sans-serif",
|
|
57
|
+
mono: "'Cascadia Mono', 'SF Mono', Consolas, monospace",
|
|
58
|
+
cuerpo: '10.5pt',
|
|
59
|
+
micro: '7.5pt',
|
|
60
|
+
pequena: '8.5pt',
|
|
61
|
+
h3: '11pt',
|
|
62
|
+
h2: '13pt',
|
|
63
|
+
h1: '18pt',
|
|
64
|
+
portada: '26pt',
|
|
65
|
+
},
|
|
66
|
+
espacio: {
|
|
67
|
+
xs: '2mm',
|
|
68
|
+
sm: '3mm',
|
|
69
|
+
md: '5mm',
|
|
70
|
+
lg: '8mm',
|
|
71
|
+
xl: '12mm',
|
|
72
|
+
},
|
|
73
|
+
pagina: {
|
|
74
|
+
margen: '16mm 15mm 18mm 15mm',
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Hoja de estilos base del informe. Se inyecta inline en el HTML
|
|
79
|
+
* (los informes deben ser un único archivo autocontenido y portable).
|
|
80
|
+
*
|
|
81
|
+
* @param formato Tamaño de papel. Por defecto Carta (el más usado en oficinas chilenas).
|
|
82
|
+
*/
|
|
83
|
+
export function baseCSS(formato = FORMATO_POR_DEFECTO) {
|
|
84
|
+
const t = TOKENS;
|
|
85
|
+
const papel = PAPEL[formato];
|
|
86
|
+
return `
|
|
87
|
+
@page {
|
|
88
|
+
size: ${papel.size};
|
|
89
|
+
margin: ${t.pagina.margen};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
* { box-sizing: border-box; }
|
|
93
|
+
|
|
94
|
+
html, body {
|
|
95
|
+
margin: 0;
|
|
96
|
+
padding: 0;
|
|
97
|
+
background: ${t.color.papel};
|
|
98
|
+
color: ${t.color.tinta};
|
|
99
|
+
font-family: ${t.fuente.familia};
|
|
100
|
+
font-size: ${t.fuente.cuerpo};
|
|
101
|
+
line-height: 1.45;
|
|
102
|
+
-webkit-print-color-adjust: exact;
|
|
103
|
+
print-color-adjust: exact;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* ── Tipografía ────────────────────────────────────────────── */
|
|
107
|
+
h1, h2, h3 {
|
|
108
|
+
color: ${t.color.marca};
|
|
109
|
+
margin: 0 0 ${t.espacio.sm} 0;
|
|
110
|
+
line-height: 1.2;
|
|
111
|
+
break-after: avoid;
|
|
112
|
+
page-break-after: avoid;
|
|
113
|
+
}
|
|
114
|
+
h1 { font-size: ${t.fuente.h1}; }
|
|
115
|
+
h2 {
|
|
116
|
+
font-size: ${t.fuente.h2};
|
|
117
|
+
margin-top: ${t.espacio.lg};
|
|
118
|
+
padding-bottom: ${t.espacio.xs};
|
|
119
|
+
border-bottom: 1.5pt solid ${t.color.marca};
|
|
120
|
+
}
|
|
121
|
+
h3 { font-size: ${t.fuente.h3}; margin-top: ${t.espacio.md}; }
|
|
122
|
+
p { margin: 0 0 ${t.espacio.sm} 0; orphans: 3; widows: 3; }
|
|
123
|
+
strong { color: ${t.color.tinta}; }
|
|
124
|
+
small { font-size: ${t.fuente.pequena}; color: ${t.color.tintaSuave}; }
|
|
125
|
+
|
|
126
|
+
/* ── Portada ───────────────────────────────────────────────── */
|
|
127
|
+
.portada {
|
|
128
|
+
border-top: 4pt solid ${t.color.marca};
|
|
129
|
+
padding-top: ${t.espacio.md};
|
|
130
|
+
margin-bottom: ${t.espacio.lg};
|
|
131
|
+
}
|
|
132
|
+
.portada .eyebrow {
|
|
133
|
+
font-size: ${t.fuente.micro};
|
|
134
|
+
letter-spacing: 0.12em;
|
|
135
|
+
text-transform: uppercase;
|
|
136
|
+
color: ${t.color.tintaTenue};
|
|
137
|
+
margin-bottom: ${t.espacio.xs};
|
|
138
|
+
}
|
|
139
|
+
.portada .titulo {
|
|
140
|
+
font-size: ${t.fuente.portada};
|
|
141
|
+
font-weight: 600;
|
|
142
|
+
color: ${t.color.marca};
|
|
143
|
+
line-height: 1.15;
|
|
144
|
+
margin: 0 0 ${t.espacio.sm} 0;
|
|
145
|
+
}
|
|
146
|
+
.portada .subtitulo {
|
|
147
|
+
font-size: ${t.fuente.h3};
|
|
148
|
+
color: ${t.color.tintaSuave};
|
|
149
|
+
font-weight: 400;
|
|
150
|
+
margin: 0;
|
|
151
|
+
}
|
|
152
|
+
.portada .meta {
|
|
153
|
+
margin-top: ${t.espacio.md};
|
|
154
|
+
padding-top: ${t.espacio.sm};
|
|
155
|
+
border-top: 0.5pt solid ${t.color.borde};
|
|
156
|
+
font-size: ${t.fuente.pequena};
|
|
157
|
+
color: ${t.color.tintaSuave};
|
|
158
|
+
display: flex;
|
|
159
|
+
flex-wrap: wrap;
|
|
160
|
+
gap: ${t.espacio.md};
|
|
161
|
+
}
|
|
162
|
+
.portada .meta b { color: ${t.color.tinta}; font-weight: 600; }
|
|
163
|
+
|
|
164
|
+
/* ── KPIs ──────────────────────────────────────────────────── */
|
|
165
|
+
.kpi-row {
|
|
166
|
+
display: flex;
|
|
167
|
+
gap: ${t.espacio.sm};
|
|
168
|
+
margin: ${t.espacio.md} 0;
|
|
169
|
+
break-inside: avoid;
|
|
170
|
+
page-break-inside: avoid;
|
|
171
|
+
}
|
|
172
|
+
.kpi {
|
|
173
|
+
flex: 1;
|
|
174
|
+
border: 0.5pt solid ${t.color.borde};
|
|
175
|
+
border-left: 2.5pt solid ${t.color.marca};
|
|
176
|
+
border-radius: 1mm;
|
|
177
|
+
padding: ${t.espacio.sm};
|
|
178
|
+
background: ${t.color.marcaClara};
|
|
179
|
+
}
|
|
180
|
+
.kpi .label {
|
|
181
|
+
font-size: ${t.fuente.micro};
|
|
182
|
+
text-transform: uppercase;
|
|
183
|
+
letter-spacing: 0.06em;
|
|
184
|
+
color: ${t.color.tintaSuave};
|
|
185
|
+
margin-bottom: 1mm;
|
|
186
|
+
}
|
|
187
|
+
.kpi .valor {
|
|
188
|
+
font-size: ${t.fuente.h2};
|
|
189
|
+
font-weight: 600;
|
|
190
|
+
color: ${t.color.marca};
|
|
191
|
+
line-height: 1.1;
|
|
192
|
+
}
|
|
193
|
+
.kpi .nota { font-size: ${t.fuente.micro}; color: ${t.color.tintaTenue}; margin-top: 0.5mm; }
|
|
194
|
+
|
|
195
|
+
/* ── Tablas ────────────────────────────────────────────────── */
|
|
196
|
+
table {
|
|
197
|
+
width: 100%;
|
|
198
|
+
border-collapse: collapse;
|
|
199
|
+
font-size: ${t.fuente.pequena};
|
|
200
|
+
margin: ${t.espacio.sm} 0;
|
|
201
|
+
}
|
|
202
|
+
thead { display: table-header-group; } /* repite cabecera al saltar de página */
|
|
203
|
+
tr { break-inside: avoid; page-break-inside: avoid; }
|
|
204
|
+
th {
|
|
205
|
+
background: ${t.color.marca};
|
|
206
|
+
color: #fff;
|
|
207
|
+
text-align: left;
|
|
208
|
+
padding: 1.8mm 2mm;
|
|
209
|
+
font-size: ${t.fuente.micro};
|
|
210
|
+
text-transform: uppercase;
|
|
211
|
+
letter-spacing: 0.05em;
|
|
212
|
+
font-weight: 600;
|
|
213
|
+
}
|
|
214
|
+
td {
|
|
215
|
+
padding: 1.8mm 2mm;
|
|
216
|
+
border-bottom: 0.5pt solid ${t.color.borde};
|
|
217
|
+
vertical-align: top;
|
|
218
|
+
}
|
|
219
|
+
tbody tr:nth-child(even) td { background: #fafbfc; }
|
|
220
|
+
.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
221
|
+
.mono { font-family: ${t.fuente.mono}; font-size: ${t.fuente.micro}; }
|
|
222
|
+
|
|
223
|
+
/* ── Badges ────────────────────────────────────────────────── */
|
|
224
|
+
.badge {
|
|
225
|
+
display: inline-block;
|
|
226
|
+
padding: 0.6mm 1.6mm;
|
|
227
|
+
border-radius: 1mm;
|
|
228
|
+
font-size: ${t.fuente.micro};
|
|
229
|
+
font-weight: 600;
|
|
230
|
+
white-space: nowrap;
|
|
231
|
+
}
|
|
232
|
+
.badge-exito { background: ${t.color.exitoFondo}; color: ${t.color.exito}; }
|
|
233
|
+
.badge-alerta { background: ${t.color.alertaFondo}; color: ${t.color.alerta}; }
|
|
234
|
+
.badge-critico { background: ${t.color.criticoFondo}; color: ${t.color.critico}; }
|
|
235
|
+
.badge-neutro { background: ${t.color.marcaClara}; color: ${t.color.marca}; }
|
|
236
|
+
|
|
237
|
+
/* ── Callouts ──────────────────────────────────────────────── */
|
|
238
|
+
.callout {
|
|
239
|
+
border-left: 2.5pt solid ${t.color.marca};
|
|
240
|
+
background: ${t.color.marcaClara};
|
|
241
|
+
padding: ${t.espacio.sm};
|
|
242
|
+
margin: ${t.espacio.sm} 0;
|
|
243
|
+
border-radius: 0 1mm 1mm 0;
|
|
244
|
+
break-inside: avoid;
|
|
245
|
+
page-break-inside: avoid;
|
|
246
|
+
font-size: ${t.fuente.pequena};
|
|
247
|
+
}
|
|
248
|
+
.callout .titulo { font-weight: 600; color: ${t.color.marca}; margin-bottom: 1mm; }
|
|
249
|
+
.callout-alerta { border-left-color: ${t.color.alerta}; background: ${t.color.alertaFondo}; }
|
|
250
|
+
.callout-alerta .titulo { color: ${t.color.alerta}; }
|
|
251
|
+
.callout-critico { border-left-color: ${t.color.critico}; background: ${t.color.criticoFondo}; }
|
|
252
|
+
.callout-critico .titulo { color: ${t.color.critico}; }
|
|
253
|
+
|
|
254
|
+
/* ── Gráficos ──────────────────────────────────────────────── */
|
|
255
|
+
.chart { margin: ${t.espacio.md} 0; break-inside: avoid; page-break-inside: avoid; }
|
|
256
|
+
.chart svg { width: 100%; height: auto; }
|
|
257
|
+
|
|
258
|
+
/* ── Utilidades de paginación ──────────────────────────────── */
|
|
259
|
+
.salto-pagina { break-before: page; page-break-before: always; }
|
|
260
|
+
.no-cortar { break-inside: avoid; page-break-inside: avoid; }
|
|
261
|
+
|
|
262
|
+
/* ── Pie de documento ──────────────────────────────────────── */
|
|
263
|
+
.pie-doc {
|
|
264
|
+
margin-top: ${t.espacio.lg};
|
|
265
|
+
padding-top: ${t.espacio.sm};
|
|
266
|
+
border-top: 0.5pt solid ${t.color.borde};
|
|
267
|
+
font-size: ${t.fuente.micro};
|
|
268
|
+
color: ${t.color.tintaTenue};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* ── Solo pantalla: simula la hoja al abrir en el navegador ── */
|
|
272
|
+
/* El ancho sigue al formato real (${papel.glosa}) para que lo que se ve
|
|
273
|
+
en pantalla coincida con lo que sale impreso. */
|
|
274
|
+
@media screen {
|
|
275
|
+
body {
|
|
276
|
+
max-width: ${papel.ancho};
|
|
277
|
+
margin: 8mm auto;
|
|
278
|
+
padding: 16mm 15mm;
|
|
279
|
+
box-shadow: 0 0 0 1px #e5e7eb, 0 4px 24px rgba(0,0,0,.07);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
`.trim();
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/reports/theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compras-template.d.ts","sourceRoot":"","sources":["../../src/resources/compras-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"compras-template.d.ts","sourceRoot":"","sources":["../../src/resources/compras-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIhE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAoCjG"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
8
|
import { CompraAgilApiError } from '../utils/error-handler.js';
|
|
9
|
+
import { safeError } from '../utils/redact.js';
|
|
9
10
|
export function registerComprasTemplateResource(server, client) {
|
|
10
11
|
// Crear plantilla de URI para compra-agil://compras/{codigo}
|
|
11
12
|
const template = new ResourceTemplate('compra-agil://compras/{codigo}', {
|
|
@@ -32,7 +33,7 @@ export function registerComprasTemplateResource(server, client) {
|
|
|
32
33
|
catch (error) {
|
|
33
34
|
const message = error instanceof CompraAgilApiError
|
|
34
35
|
? error.actionableMessage
|
|
35
|
-
: `Error al leer recurso de Compra Ágil: ${
|
|
36
|
+
: `Error al leer recurso de Compra Ágil: ${safeError(error)}`;
|
|
36
37
|
throw new Error(message);
|
|
37
38
|
}
|
|
38
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compras-template.js","sourceRoot":"","sources":["../../src/resources/compras-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"compras-template.js","sourceRoot":"","sources":["../../src/resources/compras-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,+BAA+B,CAAC,MAAiB,EAAE,MAAwB;IACzF,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,gCAAgC,EAAE;QACtE,IAAI,EAAE,SAAS,EAAE,kFAAkF;KACpG,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,CACrB,yBAAyB,EACzB,QAAQ,EACR;QACE,WAAW,EAAE,uIAAuI;QACpJ,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,MAAgB,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7C,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;wBACnB,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,kBAAkB;gBACjD,CAAC,CAAC,KAAK,CAAC,iBAAiB;gBACzB,CAAC,CAAC,yCAAyC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentacion.d.ts","sourceRoot":"","sources":["../../src/resources/documentacion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"documentacion.d.ts","sourceRoot":"","sources":["../../src/resources/documentacion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAStF;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkErE"}
|
|
@@ -1,37 +1,10 @@
|
|
|
1
1
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import path from 'path';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
4
|
import { PDFParse } from 'pdf-parse';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
let DOCS_DIR = cwdDocsDir;
|
|
10
|
-
if (fs.existsSync(packageDocsDir) && fs.readdirSync(packageDocsDir).some(f => f.toLowerCase().endsWith('.pdf'))) {
|
|
11
|
-
DOCS_DIR = packageDocsDir;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Obtiene de forma recursiva todos los archivos dentro de un directorio,
|
|
15
|
-
* retornando sus rutas relativas formateadas con barras diagonales (/).
|
|
16
|
-
*/
|
|
17
|
-
function getRelativeFilesRecursively(dir, baseDir = dir) {
|
|
18
|
-
let results = [];
|
|
19
|
-
if (!fs.existsSync(dir))
|
|
20
|
-
return [];
|
|
21
|
-
const list = fs.readdirSync(dir);
|
|
22
|
-
for (const file of list) {
|
|
23
|
-
const filePath = path.join(dir, file);
|
|
24
|
-
const stat = fs.statSync(filePath);
|
|
25
|
-
if (stat && stat.isDirectory()) {
|
|
26
|
-
results = results.concat(getRelativeFilesRecursively(filePath, baseDir));
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
const relativePath = path.relative(baseDir, filePath).replace(/\\/g, '/');
|
|
30
|
-
results.push(relativePath);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return results;
|
|
34
|
-
}
|
|
5
|
+
import { resolveDocsDir, listSupportedDocs } from '../utils/docs-locator.js';
|
|
6
|
+
import { safeError } from '../utils/redact.js';
|
|
7
|
+
const DOCS_DIR = resolveDocsDir();
|
|
35
8
|
/**
|
|
36
9
|
* Registra el recurso dinámico para consultar manuales y guías locales (PDF/TXT/MD).
|
|
37
10
|
*/
|
|
@@ -43,11 +16,7 @@ export function registerDocumentacionResource(server) {
|
|
|
43
16
|
if (!fs.existsSync(DOCS_DIR)) {
|
|
44
17
|
fs.mkdirSync(DOCS_DIR, { recursive: true });
|
|
45
18
|
}
|
|
46
|
-
const files =
|
|
47
|
-
const ext = path.extname(file).toLowerCase();
|
|
48
|
-
const name = path.basename(file).toLowerCase();
|
|
49
|
-
return (ext === '.pdf' || ext === '.txt' || ext === '.md') && name !== 'readme.md';
|
|
50
|
-
});
|
|
19
|
+
const files = listSupportedDocs(DOCS_DIR);
|
|
51
20
|
return {
|
|
52
21
|
resources: files.map(file => ({
|
|
53
22
|
uri: `compra-agil://documentacion/${encodeURIComponent(file)}`,
|
|
@@ -93,7 +62,7 @@ export function registerDocumentacionResource(server) {
|
|
|
93
62
|
};
|
|
94
63
|
}
|
|
95
64
|
catch (error) {
|
|
96
|
-
throw new Error(`Error al leer el manual local: ${
|
|
65
|
+
throw new Error(`Error al leer el manual local: ${safeError(error)}`);
|
|
97
66
|
}
|
|
98
67
|
});
|
|
99
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentacion.js","sourceRoot":"","sources":["../../src/resources/documentacion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"documentacion.js","sourceRoot":"","sources":["../../src/resources/documentacion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,wCAAwC,EAAE;QAC9E,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,CAAC;gBAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAE1C,OAAO;oBACL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC5B,GAAG,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,EAAE;wBAC9D,IAAI,EAAE,IAAI;wBACV,QAAQ,EAAE,YAAY,EAAE,uFAAuF;wBAC/G,WAAW,EAAE,iCAAiC,IAAI,EAAE;qBACrD,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;gBACnE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,CACrB,qBAAqB,EACrB,QAAQ,EACR;QACE,WAAW,EAAE,iHAAiH;QAC9H,QAAQ,EAAE,YAAY;KACvB,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,QAAkB,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,iCAAiC,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,IAAI,GAAG,EAAE,CAAC;YAEd,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;wBACnB,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,IAAI;qBACX,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estados.d.ts","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"estados.d.ts","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkDpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgB/D"}
|
|
@@ -4,47 +4,61 @@
|
|
|
4
4
|
* Catálogo de estados válidos de una Compra Ágil con descripciones
|
|
5
5
|
* y notas sobre comportamiento real de la API.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Catálogo de estados con el comportamiento REAL medido contra la API
|
|
9
|
+
* (julio 2026, re-verificado en septiembre 2026 con idéntico resultado).
|
|
10
|
+
* La documentación oficial difiere en dos puntos importantes,
|
|
11
|
+
* verificados empíricamente y anotados abajo.
|
|
12
|
+
*/
|
|
7
13
|
const ESTADOS = [
|
|
8
14
|
{
|
|
9
15
|
codigo: 'publicada',
|
|
10
16
|
descripcion: 'La Compra Ágil está abierta y recibiendo cotizaciones de proveedores.',
|
|
11
|
-
|
|
17
|
+
funciona: true,
|
|
18
|
+
nota: 'Es el estado a usar para buscar oportunidades vigentes.',
|
|
12
19
|
},
|
|
13
20
|
{
|
|
14
21
|
codigo: 'cerrada',
|
|
15
22
|
descripcion: 'El plazo de cotización finalizó. El organismo está evaluando las ofertas.',
|
|
16
|
-
|
|
23
|
+
funciona: true,
|
|
24
|
+
nota: 'En la muestra observada, los procesos "cerrada" de primer llamado NO exponen sus cotizaciones (proveedores_cotizando viene vacío).',
|
|
17
25
|
},
|
|
18
26
|
{
|
|
19
27
|
codigo: 'desierta',
|
|
20
28
|
descripcion: 'No se recibieron ofertas válidas para este proceso.',
|
|
21
|
-
|
|
29
|
+
funciona: true,
|
|
30
|
+
nota: 'Contraintuitivo pero útil: los procesos desiertos SÍ suelen exponer las cotizaciones que recibieron (y por qué fueron declaradas inadmisibles). Es la mejor fuente de precios de mercado disponible en la API.',
|
|
22
31
|
},
|
|
23
32
|
{
|
|
24
33
|
codigo: 'cancelada',
|
|
25
34
|
descripcion: 'El proceso fue cancelado por el organismo comprador.',
|
|
26
|
-
|
|
35
|
+
funciona: true,
|
|
36
|
+
nota: 'El motivo está en motivos.motivo_cancelacion del detalle.',
|
|
27
37
|
},
|
|
28
38
|
{
|
|
29
39
|
codigo: 'proveedor_seleccionado',
|
|
30
|
-
descripcion: '
|
|
31
|
-
|
|
40
|
+
descripcion: 'Documentado como "se seleccionó al proveedor ganador".',
|
|
41
|
+
funciona: false,
|
|
42
|
+
nota: '⚠ LIMITACIÓN VERIFICADA (julio 2026, re-confirmada en septiembre 2026): la API acepta este filtro pero devuelve SIEMPRE 0 resultados. Además, en 45 procesos inspeccionados con 52 cotizaciones, el campo proveedor_seleccionado valió 0 en el 100% de los casos y ningún proceso traía id_orden_compra. CONCLUSIÓN: la API no expone procesos adjudicados. No bases análisis en este estado. Para precios de mercado usa "analizar_precios_mercado", que se apoya en cotizaciones reales. Nota sobre la guía oficial: el Ejemplo 8.6 de la Guía v3.0 propone detectar OCs emitidas recorriendo este estado — es irrealizable, porque el primer paso devuelve una lista vacía.',
|
|
32
43
|
},
|
|
33
44
|
{
|
|
34
45
|
codigo: 'oc_emitida',
|
|
35
|
-
descripcion: '
|
|
36
|
-
|
|
46
|
+
descripcion: 'Documentado como "se emitió una Orden de Compra".',
|
|
47
|
+
funciona: false,
|
|
48
|
+
nota: '⚠ LIMITACIÓN VERIFICADA: enviar este valor devuelve HTTP 400 (Parámetros de consulta inválidos). No es un filtro válido, pese a estar documentado.',
|
|
37
49
|
},
|
|
38
50
|
];
|
|
51
|
+
/** Advertencia general que acompaña al catálogo. */
|
|
52
|
+
const ADVERTENCIA = 'Estados verificados contra la API real en julio de 2026 y re-confirmados en septiembre de 2026 (sin cambios). Solo publicada, cerrada, desierta y cancelada devuelven datos. proveedor_seleccionado devuelve 0 resultados y oc_emitida da error 400, pese a estar ambos documentados oficialmente.';
|
|
39
53
|
export function registerEstadosResource(server) {
|
|
40
54
|
server.registerResource('estados', 'compra-agil://estados', {
|
|
41
|
-
description: 'Catálogo de estados
|
|
55
|
+
description: 'Catálogo de estados de una Compra Ágil con su comportamiento REAL verificado contra la API. Consúltalo antes de filtrar por estado: dos de los estados documentados oficialmente (proveedor_seleccionado y oc_emitida) NO funcionan en la práctica.',
|
|
42
56
|
mimeType: 'application/json',
|
|
43
57
|
}, async () => ({
|
|
44
58
|
contents: [{
|
|
45
59
|
uri: 'compra-agil://estados',
|
|
46
60
|
mimeType: 'application/json',
|
|
47
|
-
text: JSON.stringify(ESTADOS, null, 2),
|
|
61
|
+
text: JSON.stringify({ _advertencia: ADVERTENCIA, estados: ESTADOS }, null, 2),
|
|
48
62
|
}],
|
|
49
63
|
}));
|
|
50
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estados.js","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,GAAG;IACd;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,uEAAuE;QACpF,
|
|
1
|
+
{"version":3,"file":"estados.js","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,MAAM,OAAO,GAAG;IACd;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,uEAAuE;QACpF,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,yDAAyD;KAChE;IACD;QACE,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,2EAA2E;QACxF,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,oIAAoI;KAC3I;IACD;QACE,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,qDAAqD;QAClE,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,gNAAgN;KACvN;IACD;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,2DAA2D;KAClE;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,gpBAAgpB;KACvpB;IACD;QACE,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,mDAAmD;QAChE,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,oJAAoJ;KAC3J;CACF,CAAC;AAEF,oDAAoD;AACpD,MAAM,WAAW,GAAG,oSAAoS,CAAC;AAEzT,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,uBAAuB,EACvB;QACE,WAAW,EAAE,qPAAqP;QAClQ,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,uBAAuB;gBAC5B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC/E,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
|