hvp-shared 3.3.2 → 3.4.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/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/inventory/index.d.ts +1 -0
- package/dist/inventory/index.js +17 -0
- package/dist/inventory/qvet-catalog.d.ts +169 -0
- package/dist/inventory/qvet-catalog.js +266 -0
- package/dist/types/error-codes.types.d.ts +2 -0
- package/dist/types/error-codes.types.js +2 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -23,5 +23,6 @@ __exportStar(require("./types"), exports);
|
|
|
23
23
|
__exportStar(require("./constants"), exports);
|
|
24
24
|
__exportStar(require("./contracts"), exports);
|
|
25
25
|
__exportStar(require("./validation"), exports);
|
|
26
|
+
__exportStar(require("./inventory"), exports);
|
|
26
27
|
var debug_logger_1 = require("./utils/debug-logger");
|
|
27
28
|
Object.defineProperty(exports, "debugLog", { enumerable: true, get: function () { return debug_logger_1.debugLog; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './qvet-catalog';
|
|
@@ -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("./qvet-catalog"), exports);
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QVET Catalog
|
|
3
|
+
* Complete hierarchy of sections, families, and subfamilies from QVET system
|
|
4
|
+
* Source: QVET system export (Updated 2026-01-10)
|
|
5
|
+
*
|
|
6
|
+
* Structure: SECTION → FAMILY → SUBFAMILY[]
|
|
7
|
+
* Each combination is unique and can change independently in QVET.
|
|
8
|
+
*/
|
|
9
|
+
export declare const QVET_SECTIONS: {
|
|
10
|
+
readonly EQUIPAMIENTO: "EQUIPAMIENTO";
|
|
11
|
+
readonly FARMACIA: "FARMACIA";
|
|
12
|
+
readonly FARMACIA_INTERNA: "FARMACIA INTERNA";
|
|
13
|
+
readonly INSUMOS_MEDICOS: "INSUMOS MEDICOS";
|
|
14
|
+
readonly OTROS_ARTICULOS: "OTROS ARTICULOS";
|
|
15
|
+
readonly OTROS_SERVICIOS: "OTROS SERVICIOS";
|
|
16
|
+
readonly SERVICIOS_EXTERNOS: "SERVICIOS EXTERNOS";
|
|
17
|
+
readonly SERVICIOS_MEDICOS: "SERVICIOS MEDICOS";
|
|
18
|
+
readonly SUMINISTROS_GENERALES: "SUMINISTROS GENERALES";
|
|
19
|
+
};
|
|
20
|
+
export type QvetSection = typeof QVET_SECTIONS[keyof typeof QVET_SECTIONS];
|
|
21
|
+
export declare const QVET_CATALOG: {
|
|
22
|
+
readonly EQUIPAMIENTO: {
|
|
23
|
+
readonly UNICA: readonly ["UNICA"];
|
|
24
|
+
};
|
|
25
|
+
readonly FARMACIA: {
|
|
26
|
+
readonly 'ANESTESICOS O TRANQUILIZANTES': readonly ["UNICA"];
|
|
27
|
+
readonly ANTIBIOTICOS: readonly ["UNICA"];
|
|
28
|
+
readonly 'ANTIINFLAMATORIOS O ANALGESICOS': readonly ["UNICA"];
|
|
29
|
+
readonly ANTIMICOTICOS: readonly ["UNICA"];
|
|
30
|
+
readonly ANTIPARASITARIOS: readonly ["UNICA"];
|
|
31
|
+
readonly CARDIOLOGICOS: readonly ["UNICA"];
|
|
32
|
+
readonly DERMATOLOGICOS: readonly ["UNICA"];
|
|
33
|
+
readonly GASTROENTEROLOGICOS: readonly ["UNICA"];
|
|
34
|
+
readonly OFTALMOLOGICOS: readonly ["UNICA"];
|
|
35
|
+
readonly OTOLOGICOS: readonly ["UNICA"];
|
|
36
|
+
readonly OTROS: readonly ["UNICA"];
|
|
37
|
+
readonly SUPLEMENTOS: readonly ["UNICA"];
|
|
38
|
+
readonly TIROIDEOS: readonly ["UNICA"];
|
|
39
|
+
};
|
|
40
|
+
readonly "FARMACIA INTERNA": {
|
|
41
|
+
readonly 'ANESTESICOS O TRANQUILIZANTES': readonly ["UNICA"];
|
|
42
|
+
readonly ANTIBIOTICOS: readonly ["UNICA"];
|
|
43
|
+
readonly 'ANTIINFLAMATORIOS O ANALGESICOS': readonly ["UNICA"];
|
|
44
|
+
readonly ANTIPARASITARIOS: readonly ["UNICA"];
|
|
45
|
+
readonly CARDIOLOGICOS: readonly ["UNICA"];
|
|
46
|
+
readonly GASTROENTEROLOGICOS: readonly ["UNICA"];
|
|
47
|
+
readonly OFTALMOLOGICOS: readonly ["UNICA"];
|
|
48
|
+
readonly OTROS: readonly ["UNICA"];
|
|
49
|
+
};
|
|
50
|
+
readonly "INSUMOS MEDICOS": {
|
|
51
|
+
readonly AGUJAS: readonly ["UNICA"];
|
|
52
|
+
readonly CATETERES: readonly ["UNICA"];
|
|
53
|
+
readonly CURACION: readonly ["UNICA"];
|
|
54
|
+
readonly 'INDUMENTARIA SANITARIA': readonly ["UNICA"];
|
|
55
|
+
readonly 'INSUMOS PARA PRUEBAS': readonly ["UNICA"];
|
|
56
|
+
readonly JERINGAS: readonly ["UNICA"];
|
|
57
|
+
readonly OFTALMOLOGIA: readonly ["UNICA"];
|
|
58
|
+
readonly OTROS: readonly ["UNICA"];
|
|
59
|
+
readonly SONDAS: readonly ["UNICA"];
|
|
60
|
+
readonly 'SUEROS Y SOLUCIONES': readonly ["UNICA"];
|
|
61
|
+
readonly SUTURAS: readonly ["UNICA"];
|
|
62
|
+
readonly TESTS: readonly ["UNICA"];
|
|
63
|
+
readonly VACUNAS: readonly ["UNICA"];
|
|
64
|
+
readonly VENDAS: readonly ["UNICA"];
|
|
65
|
+
};
|
|
66
|
+
readonly "OTROS ARTICULOS": {
|
|
67
|
+
readonly MICROCHIP: readonly ["UNICA"];
|
|
68
|
+
readonly OTROS: readonly ["UNICA"];
|
|
69
|
+
};
|
|
70
|
+
readonly "OTROS SERVICIOS": {
|
|
71
|
+
readonly FCM: readonly ["UNICA"];
|
|
72
|
+
readonly GUARDERIA: readonly ["UNICA"];
|
|
73
|
+
readonly 'OTROS SERVICIOS': readonly ["UNICA"];
|
|
74
|
+
readonly PAQUETES: readonly ["UNICA"];
|
|
75
|
+
readonly PENSION: readonly ["UNICA"];
|
|
76
|
+
readonly 'RENTA QUIROFANO': readonly ["UNICA"];
|
|
77
|
+
};
|
|
78
|
+
readonly "SERVICIOS EXTERNOS": {
|
|
79
|
+
readonly 'CONSULTAS EXTERNAS': readonly ["UNICA"];
|
|
80
|
+
readonly INCINERACION: readonly ["INCINERACION", "SERVICIOS ADICIONALES", "URNAS Y RELICARIOS"];
|
|
81
|
+
readonly LABORATORIO: readonly ["COPROPARASITOSCOPICO", "CULTIVOS", "CUSHING", "HEMOGRAMA", "HEMOPARASITOS", "OTROS", "PATOLOGIA CLINICA", "PERFIL HORMONAL", "PERFIL TIROIDEO", "QUIMICA SANGUINEA", "TOMOGRAFIA"];
|
|
82
|
+
readonly OTROS: readonly ["UNICA"];
|
|
83
|
+
readonly 'PRUEBAS DE GABINETE': readonly ["ELECTROCARDIOGRAMA", "OTROS", "RADIOLOGIA", "ULTRASONIDO"];
|
|
84
|
+
};
|
|
85
|
+
readonly "SERVICIOS MEDICOS": {
|
|
86
|
+
readonly 'ASISTENCIA QUIRURGICA': readonly ["UNICA"];
|
|
87
|
+
readonly 'CERTIFICADOS DE SALUD': readonly ["UNICA"];
|
|
88
|
+
readonly 'CIRUGIA DE TEJIDOS BLANDOS': readonly ["ABDOMEN", "CABEZA", "NEOPLASIA", "OTROS", "PERINEO", "TORAX"];
|
|
89
|
+
readonly CONSULTA: readonly ["DOMICILIARIA", "ESPECIALIDAD", "GENERAL", "REVISION"];
|
|
90
|
+
readonly DESPARASITACION: readonly ["UNICA"];
|
|
91
|
+
readonly DIAGNOSTICO: readonly ["UNICA"];
|
|
92
|
+
readonly EMERGENCIA: readonly ["UNICA"];
|
|
93
|
+
readonly EUTANASIA: readonly ["UNICA"];
|
|
94
|
+
readonly HOSPITALIZACION: readonly ["UNICA"];
|
|
95
|
+
readonly OFTALMOLOGIA: readonly ["UNICA"];
|
|
96
|
+
readonly ORTOPEDIA: readonly ["UNICA"];
|
|
97
|
+
readonly OTROS: readonly ["UNICA"];
|
|
98
|
+
readonly TRATAMIENTO: readonly ["UNICA"];
|
|
99
|
+
readonly VACUNAS: readonly ["UNICA"];
|
|
100
|
+
};
|
|
101
|
+
readonly "SUMINISTROS GENERALES": {
|
|
102
|
+
readonly ALIMENTOS: readonly ["UNICA"];
|
|
103
|
+
readonly ETIQUETAS: readonly ["UNICA"];
|
|
104
|
+
readonly IMPRESOS: readonly ["UNICA"];
|
|
105
|
+
readonly LIMPIEZA: readonly ["UNICA"];
|
|
106
|
+
readonly OTROS: readonly ["UNICA"];
|
|
107
|
+
readonly PAPELERIA: readonly ["UNICA"];
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
export type QvetCatalog = typeof QVET_CATALOG;
|
|
111
|
+
/**
|
|
112
|
+
* All section values as array
|
|
113
|
+
*/
|
|
114
|
+
export declare const QVET_SECTIONS_LIST: ("EQUIPAMIENTO" | "FARMACIA" | "FARMACIA INTERNA" | "INSUMOS MEDICOS" | "OTROS ARTICULOS" | "OTROS SERVICIOS" | "SERVICIOS EXTERNOS" | "SERVICIOS MEDICOS" | "SUMINISTROS GENERALES")[];
|
|
115
|
+
/**
|
|
116
|
+
* Sections that are countable for inventory (physical items, not services)
|
|
117
|
+
* Excludes: OTROS SERVICIOS, SERVICIOS EXTERNOS, SERVICIOS MEDICOS
|
|
118
|
+
*/
|
|
119
|
+
export declare const INVENTORY_COUNTABLE_SECTIONS: readonly ["EQUIPAMIENTO", "FARMACIA", "FARMACIA INTERNA", "INSUMOS MEDICOS", "OTROS ARTICULOS", "SUMINISTROS GENERALES"];
|
|
120
|
+
/**
|
|
121
|
+
* Set for quick lookup of countable sections
|
|
122
|
+
*/
|
|
123
|
+
export declare const INVENTORY_COUNTABLE_SECTIONS_SET: ReadonlySet<string>;
|
|
124
|
+
/**
|
|
125
|
+
* Priority sections for sorting (appear first in count sheets)
|
|
126
|
+
*/
|
|
127
|
+
export declare const SECTION_SORT_PRIORITY: readonly ["FARMACIA", "FARMACIA INTERNA", "INSUMOS MEDICOS"];
|
|
128
|
+
/**
|
|
129
|
+
* Get all families for a section
|
|
130
|
+
*/
|
|
131
|
+
export declare function getFamiliesForSection(section: string): string[];
|
|
132
|
+
/**
|
|
133
|
+
* Get all subfamilies for a section + family combination
|
|
134
|
+
*/
|
|
135
|
+
export declare function getSubfamiliesForFamily(section: string, family: string): readonly string[];
|
|
136
|
+
/**
|
|
137
|
+
* Check if a section exists in the catalog
|
|
138
|
+
*/
|
|
139
|
+
export declare function isValidSection(section: string): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Check if a section is countable (physical inventory)
|
|
142
|
+
*/
|
|
143
|
+
export declare function isCountableSection(section: string): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Check if a family exists within a section
|
|
146
|
+
*/
|
|
147
|
+
export declare function isValidFamily(section: string, family: string): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Check if a subfamily exists within a section + family
|
|
150
|
+
*/
|
|
151
|
+
export declare function isValidSubfamily(section: string, family: string, subfamily: string): boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Get sort order for a section (lower = higher priority)
|
|
154
|
+
*/
|
|
155
|
+
export declare function getSectionSortOrder(section: string): number;
|
|
156
|
+
/**
|
|
157
|
+
* Sections that ALWAYS require expiration date tracking
|
|
158
|
+
*/
|
|
159
|
+
export declare const SECTIONS_REQUIRE_EXPIRATION: readonly ["FARMACIA", "FARMACIA INTERNA"];
|
|
160
|
+
/**
|
|
161
|
+
* Specific families within sections that require expiration date tracking
|
|
162
|
+
*/
|
|
163
|
+
export declare const FAMILIES_REQUIRE_EXPIRATION: Partial<Record<QvetSection, readonly string[]>>;
|
|
164
|
+
/**
|
|
165
|
+
* Check if an item requires expiration date tracking based on section and family
|
|
166
|
+
*/
|
|
167
|
+
export declare function requiresExpirationDate(section: string, family: string): boolean;
|
|
168
|
+
export declare const WAREHOUSES: readonly ["HARBOR", "MONTEJO", "URBAN CENTER"];
|
|
169
|
+
export type Warehouse = typeof WAREHOUSES[number];
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* QVET Catalog
|
|
4
|
+
* Complete hierarchy of sections, families, and subfamilies from QVET system
|
|
5
|
+
* Source: QVET system export (Updated 2026-01-10)
|
|
6
|
+
*
|
|
7
|
+
* Structure: SECTION → FAMILY → SUBFAMILY[]
|
|
8
|
+
* Each combination is unique and can change independently in QVET.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.WAREHOUSES = exports.FAMILIES_REQUIRE_EXPIRATION = exports.SECTIONS_REQUIRE_EXPIRATION = exports.SECTION_SORT_PRIORITY = exports.INVENTORY_COUNTABLE_SECTIONS_SET = exports.INVENTORY_COUNTABLE_SECTIONS = exports.QVET_SECTIONS_LIST = exports.QVET_CATALOG = exports.QVET_SECTIONS = void 0;
|
|
12
|
+
exports.getFamiliesForSection = getFamiliesForSection;
|
|
13
|
+
exports.getSubfamiliesForFamily = getSubfamiliesForFamily;
|
|
14
|
+
exports.isValidSection = isValidSection;
|
|
15
|
+
exports.isCountableSection = isCountableSection;
|
|
16
|
+
exports.isValidFamily = isValidFamily;
|
|
17
|
+
exports.isValidSubfamily = isValidSubfamily;
|
|
18
|
+
exports.getSectionSortOrder = getSectionSortOrder;
|
|
19
|
+
exports.requiresExpirationDate = requiresExpirationDate;
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// SECTIONS (Single source of truth for section strings)
|
|
22
|
+
// =============================================================================
|
|
23
|
+
exports.QVET_SECTIONS = {
|
|
24
|
+
EQUIPAMIENTO: 'EQUIPAMIENTO',
|
|
25
|
+
FARMACIA: 'FARMACIA',
|
|
26
|
+
FARMACIA_INTERNA: 'FARMACIA INTERNA',
|
|
27
|
+
INSUMOS_MEDICOS: 'INSUMOS MEDICOS',
|
|
28
|
+
OTROS_ARTICULOS: 'OTROS ARTICULOS',
|
|
29
|
+
OTROS_SERVICIOS: 'OTROS SERVICIOS',
|
|
30
|
+
SERVICIOS_EXTERNOS: 'SERVICIOS EXTERNOS',
|
|
31
|
+
SERVICIOS_MEDICOS: 'SERVICIOS MEDICOS',
|
|
32
|
+
SUMINISTROS_GENERALES: 'SUMINISTROS GENERALES',
|
|
33
|
+
};
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// COMPLETE CATALOG (Section → Family → Subfamilies)
|
|
36
|
+
// =============================================================================
|
|
37
|
+
exports.QVET_CATALOG = {
|
|
38
|
+
[exports.QVET_SECTIONS.EQUIPAMIENTO]: {
|
|
39
|
+
'UNICA': ['UNICA'],
|
|
40
|
+
},
|
|
41
|
+
[exports.QVET_SECTIONS.FARMACIA]: {
|
|
42
|
+
'ANESTESICOS O TRANQUILIZANTES': ['UNICA'],
|
|
43
|
+
'ANTIBIOTICOS': ['UNICA'],
|
|
44
|
+
'ANTIINFLAMATORIOS O ANALGESICOS': ['UNICA'],
|
|
45
|
+
'ANTIMICOTICOS': ['UNICA'],
|
|
46
|
+
'ANTIPARASITARIOS': ['UNICA'],
|
|
47
|
+
'CARDIOLOGICOS': ['UNICA'],
|
|
48
|
+
'DERMATOLOGICOS': ['UNICA'],
|
|
49
|
+
'GASTROENTEROLOGICOS': ['UNICA'],
|
|
50
|
+
'OFTALMOLOGICOS': ['UNICA'],
|
|
51
|
+
'OTOLOGICOS': ['UNICA'],
|
|
52
|
+
'OTROS': ['UNICA'],
|
|
53
|
+
'SUPLEMENTOS': ['UNICA'],
|
|
54
|
+
'TIROIDEOS': ['UNICA'],
|
|
55
|
+
},
|
|
56
|
+
[exports.QVET_SECTIONS.FARMACIA_INTERNA]: {
|
|
57
|
+
'ANESTESICOS O TRANQUILIZANTES': ['UNICA'],
|
|
58
|
+
'ANTIBIOTICOS': ['UNICA'],
|
|
59
|
+
'ANTIINFLAMATORIOS O ANALGESICOS': ['UNICA'],
|
|
60
|
+
'ANTIPARASITARIOS': ['UNICA'],
|
|
61
|
+
'CARDIOLOGICOS': ['UNICA'],
|
|
62
|
+
'GASTROENTEROLOGICOS': ['UNICA'],
|
|
63
|
+
'OFTALMOLOGICOS': ['UNICA'],
|
|
64
|
+
'OTROS': ['UNICA'],
|
|
65
|
+
},
|
|
66
|
+
[exports.QVET_SECTIONS.INSUMOS_MEDICOS]: {
|
|
67
|
+
'AGUJAS': ['UNICA'],
|
|
68
|
+
'CATETERES': ['UNICA'],
|
|
69
|
+
'CURACION': ['UNICA'],
|
|
70
|
+
'INDUMENTARIA SANITARIA': ['UNICA'],
|
|
71
|
+
'INSUMOS PARA PRUEBAS': ['UNICA'],
|
|
72
|
+
'JERINGAS': ['UNICA'],
|
|
73
|
+
'OFTALMOLOGIA': ['UNICA'],
|
|
74
|
+
'OTROS': ['UNICA'],
|
|
75
|
+
'SONDAS': ['UNICA'],
|
|
76
|
+
'SUEROS Y SOLUCIONES': ['UNICA'],
|
|
77
|
+
'SUTURAS': ['UNICA'],
|
|
78
|
+
'TESTS': ['UNICA'],
|
|
79
|
+
'VACUNAS': ['UNICA'],
|
|
80
|
+
'VENDAS': ['UNICA'],
|
|
81
|
+
},
|
|
82
|
+
[exports.QVET_SECTIONS.OTROS_ARTICULOS]: {
|
|
83
|
+
'MICROCHIP': ['UNICA'],
|
|
84
|
+
'OTROS': ['UNICA'],
|
|
85
|
+
},
|
|
86
|
+
[exports.QVET_SECTIONS.OTROS_SERVICIOS]: {
|
|
87
|
+
'FCM': ['UNICA'],
|
|
88
|
+
'GUARDERIA': ['UNICA'],
|
|
89
|
+
'OTROS SERVICIOS': ['UNICA'],
|
|
90
|
+
'PAQUETES': ['UNICA'],
|
|
91
|
+
'PENSION': ['UNICA'],
|
|
92
|
+
'RENTA QUIROFANO': ['UNICA'],
|
|
93
|
+
},
|
|
94
|
+
[exports.QVET_SECTIONS.SERVICIOS_EXTERNOS]: {
|
|
95
|
+
'CONSULTAS EXTERNAS': ['UNICA'],
|
|
96
|
+
'INCINERACION': ['INCINERACION', 'SERVICIOS ADICIONALES', 'URNAS Y RELICARIOS'],
|
|
97
|
+
'LABORATORIO': [
|
|
98
|
+
'COPROPARASITOSCOPICO',
|
|
99
|
+
'CULTIVOS',
|
|
100
|
+
'CUSHING',
|
|
101
|
+
'HEMOGRAMA',
|
|
102
|
+
'HEMOPARASITOS',
|
|
103
|
+
'OTROS',
|
|
104
|
+
'PATOLOGIA CLINICA',
|
|
105
|
+
'PERFIL HORMONAL',
|
|
106
|
+
'PERFIL TIROIDEO',
|
|
107
|
+
'QUIMICA SANGUINEA',
|
|
108
|
+
'TOMOGRAFIA',
|
|
109
|
+
],
|
|
110
|
+
'OTROS': ['UNICA'],
|
|
111
|
+
'PRUEBAS DE GABINETE': ['ELECTROCARDIOGRAMA', 'OTROS', 'RADIOLOGIA', 'ULTRASONIDO'],
|
|
112
|
+
},
|
|
113
|
+
[exports.QVET_SECTIONS.SERVICIOS_MEDICOS]: {
|
|
114
|
+
'ASISTENCIA QUIRURGICA': ['UNICA'],
|
|
115
|
+
'CERTIFICADOS DE SALUD': ['UNICA'],
|
|
116
|
+
'CIRUGIA DE TEJIDOS BLANDOS': ['ABDOMEN', 'CABEZA', 'NEOPLASIA', 'OTROS', 'PERINEO', 'TORAX'],
|
|
117
|
+
'CONSULTA': ['DOMICILIARIA', 'ESPECIALIDAD', 'GENERAL', 'REVISION'],
|
|
118
|
+
'DESPARASITACION': ['UNICA'],
|
|
119
|
+
'DIAGNOSTICO': ['UNICA'],
|
|
120
|
+
'EMERGENCIA': ['UNICA'],
|
|
121
|
+
'EUTANASIA': ['UNICA'],
|
|
122
|
+
'HOSPITALIZACION': ['UNICA'],
|
|
123
|
+
'OFTALMOLOGIA': ['UNICA'],
|
|
124
|
+
'ORTOPEDIA': ['UNICA'],
|
|
125
|
+
'OTROS': ['UNICA'],
|
|
126
|
+
'TRATAMIENTO': ['UNICA'],
|
|
127
|
+
'VACUNAS': ['UNICA'],
|
|
128
|
+
},
|
|
129
|
+
[exports.QVET_SECTIONS.SUMINISTROS_GENERALES]: {
|
|
130
|
+
'ALIMENTOS': ['UNICA'],
|
|
131
|
+
'ETIQUETAS': ['UNICA'],
|
|
132
|
+
'IMPRESOS': ['UNICA'],
|
|
133
|
+
'LIMPIEZA': ['UNICA'],
|
|
134
|
+
'OTROS': ['UNICA'],
|
|
135
|
+
'PAPELERIA': ['UNICA'],
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
// =============================================================================
|
|
139
|
+
// DERIVED CONSTANTS (No string repetition - use QVET_SECTIONS)
|
|
140
|
+
// =============================================================================
|
|
141
|
+
/**
|
|
142
|
+
* All section values as array
|
|
143
|
+
*/
|
|
144
|
+
exports.QVET_SECTIONS_LIST = Object.values(exports.QVET_SECTIONS);
|
|
145
|
+
/**
|
|
146
|
+
* Sections that are countable for inventory (physical items, not services)
|
|
147
|
+
* Excludes: OTROS SERVICIOS, SERVICIOS EXTERNOS, SERVICIOS MEDICOS
|
|
148
|
+
*/
|
|
149
|
+
exports.INVENTORY_COUNTABLE_SECTIONS = [
|
|
150
|
+
exports.QVET_SECTIONS.EQUIPAMIENTO,
|
|
151
|
+
exports.QVET_SECTIONS.FARMACIA,
|
|
152
|
+
exports.QVET_SECTIONS.FARMACIA_INTERNA,
|
|
153
|
+
exports.QVET_SECTIONS.INSUMOS_MEDICOS,
|
|
154
|
+
exports.QVET_SECTIONS.OTROS_ARTICULOS,
|
|
155
|
+
exports.QVET_SECTIONS.SUMINISTROS_GENERALES,
|
|
156
|
+
];
|
|
157
|
+
/**
|
|
158
|
+
* Set for quick lookup of countable sections
|
|
159
|
+
*/
|
|
160
|
+
exports.INVENTORY_COUNTABLE_SECTIONS_SET = new Set(exports.INVENTORY_COUNTABLE_SECTIONS);
|
|
161
|
+
/**
|
|
162
|
+
* Priority sections for sorting (appear first in count sheets)
|
|
163
|
+
*/
|
|
164
|
+
exports.SECTION_SORT_PRIORITY = [
|
|
165
|
+
exports.QVET_SECTIONS.FARMACIA,
|
|
166
|
+
exports.QVET_SECTIONS.FARMACIA_INTERNA,
|
|
167
|
+
exports.QVET_SECTIONS.INSUMOS_MEDICOS,
|
|
168
|
+
];
|
|
169
|
+
// =============================================================================
|
|
170
|
+
// UTILITY FUNCTIONS
|
|
171
|
+
// =============================================================================
|
|
172
|
+
/**
|
|
173
|
+
* Get all families for a section
|
|
174
|
+
*/
|
|
175
|
+
function getFamiliesForSection(section) {
|
|
176
|
+
const sectionData = exports.QVET_CATALOG[section];
|
|
177
|
+
if (!sectionData)
|
|
178
|
+
return [];
|
|
179
|
+
return Object.keys(sectionData);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get all subfamilies for a section + family combination
|
|
183
|
+
*/
|
|
184
|
+
function getSubfamiliesForFamily(section, family) {
|
|
185
|
+
const sectionData = exports.QVET_CATALOG[section];
|
|
186
|
+
if (!sectionData)
|
|
187
|
+
return [];
|
|
188
|
+
const familyData = sectionData[family];
|
|
189
|
+
if (!familyData)
|
|
190
|
+
return [];
|
|
191
|
+
return familyData;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if a section exists in the catalog
|
|
195
|
+
*/
|
|
196
|
+
function isValidSection(section) {
|
|
197
|
+
return section in exports.QVET_CATALOG;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if a section is countable (physical inventory)
|
|
201
|
+
*/
|
|
202
|
+
function isCountableSection(section) {
|
|
203
|
+
return exports.INVENTORY_COUNTABLE_SECTIONS_SET.has(section);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if a family exists within a section
|
|
207
|
+
*/
|
|
208
|
+
function isValidFamily(section, family) {
|
|
209
|
+
const sectionData = exports.QVET_CATALOG[section];
|
|
210
|
+
if (!sectionData)
|
|
211
|
+
return false;
|
|
212
|
+
return family in sectionData;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Check if a subfamily exists within a section + family
|
|
216
|
+
*/
|
|
217
|
+
function isValidSubfamily(section, family, subfamily) {
|
|
218
|
+
const subfamilies = getSubfamiliesForFamily(section, family);
|
|
219
|
+
return subfamilies.includes(subfamily);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get sort order for a section (lower = higher priority)
|
|
223
|
+
*/
|
|
224
|
+
function getSectionSortOrder(section) {
|
|
225
|
+
const index = exports.SECTION_SORT_PRIORITY.indexOf(section);
|
|
226
|
+
if (index >= 0) {
|
|
227
|
+
return index;
|
|
228
|
+
}
|
|
229
|
+
// Non-priority sections come after, sorted alphabetically
|
|
230
|
+
return exports.SECTION_SORT_PRIORITY.length + section.charCodeAt(0);
|
|
231
|
+
}
|
|
232
|
+
// =============================================================================
|
|
233
|
+
// EXPIRATION DATE REQUIREMENTS
|
|
234
|
+
// =============================================================================
|
|
235
|
+
/**
|
|
236
|
+
* Sections that ALWAYS require expiration date tracking
|
|
237
|
+
*/
|
|
238
|
+
exports.SECTIONS_REQUIRE_EXPIRATION = [
|
|
239
|
+
exports.QVET_SECTIONS.FARMACIA,
|
|
240
|
+
exports.QVET_SECTIONS.FARMACIA_INTERNA,
|
|
241
|
+
];
|
|
242
|
+
/**
|
|
243
|
+
* Specific families within sections that require expiration date tracking
|
|
244
|
+
*/
|
|
245
|
+
exports.FAMILIES_REQUIRE_EXPIRATION = {
|
|
246
|
+
[exports.QVET_SECTIONS.INSUMOS_MEDICOS]: ['SUEROS Y SOLUCIONES', 'VACUNAS'],
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* Check if an item requires expiration date tracking based on section and family
|
|
250
|
+
*/
|
|
251
|
+
function requiresExpirationDate(section, family) {
|
|
252
|
+
// Full section requires expiration
|
|
253
|
+
if (exports.SECTIONS_REQUIRE_EXPIRATION.includes(section)) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
// Check specific families within sections
|
|
257
|
+
const familiesForSection = exports.FAMILIES_REQUIRE_EXPIRATION[section];
|
|
258
|
+
if (familiesForSection) {
|
|
259
|
+
return familiesForSection.includes(family);
|
|
260
|
+
}
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
// =============================================================================
|
|
264
|
+
// WAREHOUSES
|
|
265
|
+
// =============================================================================
|
|
266
|
+
exports.WAREHOUSES = ['HARBOR', 'MONTEJO', 'URBAN CENTER'];
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* - Backend throws domain errors with these codes
|
|
10
10
|
* - Reduces boilerplate by 90% compared to one-class-per-error
|
|
11
11
|
*
|
|
12
|
+
* Note: Properly exported via barrel exports (src/types.ts and src/index.ts)
|
|
13
|
+
*
|
|
12
14
|
* See: resources/learning/20260107-error-handling-architecture-complete-analysis.md
|
|
13
15
|
*/
|
|
14
16
|
/**
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* - Backend throws domain errors with these codes
|
|
11
11
|
* - Reduces boilerplate by 90% compared to one-class-per-error
|
|
12
12
|
*
|
|
13
|
+
* Note: Properly exported via barrel exports (src/types.ts and src/index.ts)
|
|
14
|
+
*
|
|
13
15
|
* See: resources/learning/20260107-error-handling-architecture-complete-analysis.md
|
|
14
16
|
*/
|
|
15
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|