1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct PaginatedResponse<T> {
6 #[serde(rename = "totalFilas")]
7 pub total_rows: u32,
8 #[serde(rename = "pagina")]
9 pub page: u32,
10 #[serde(rename = "tamanioPagina")]
11 pub page_size: u32,
12 #[serde(rename = "resultados")]
13 pub results: Vec<T>,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct AuthorizationStatus {
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub aut: Option<i64>,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub susp: Option<i64>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub rev: Option<i64>,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct MasterItem {
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub id: Option<i32>,
36 #[serde(rename = "codigo", skip_serializing_if = "Option::is_none")]
38 pub code: Option<String>,
39 #[serde(rename = "nombre")]
41 pub name: String,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct SupplyProblem {
47 pub cn: String,
49 #[serde(rename = "nombre")]
51 pub name: String,
52 pub fini: i64,
54 #[serde(skip_serializing_if = "Option::is_none")]
56 pub ffin: Option<i64>,
57 #[serde(rename = "observ", skip_serializing_if = "Option::is_none")]
59 pub observations: Option<String>,
60 #[serde(rename = "activo")]
62 pub active: bool,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct Section {
68 #[serde(rename = "seccion")]
70 pub section: String,
71 #[serde(rename = "titulo")]
73 pub title: String,
74 #[serde(rename = "orden")]
76 pub order: i32,
77 #[serde(rename = "contenido", skip_serializing_if = "Option::is_none")]
79 pub content: Option<String>,
80}
81
82#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
84#[repr(u8)]
85pub enum DocumentType {
86 #[serde(rename = "FichaTecnica")]
88 TechnicalSheet = 1,
89 #[serde(rename = "Prospecto")]
91 PackageLeaflet = 2,
92 #[serde(rename = "InformePublico")]
94 PublicReport = 3,
95 #[serde(rename = "PlanGestionRiesgos")]
97 RiskManagementPlan = 4,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct Document {
103 #[serde(rename = "tipo")]
105 pub doc_type: u8,
106 pub url: String,
108 #[serde(rename = "secc")]
110 pub has_sections: bool,
111 #[serde(rename = "urlHtml", skip_serializing_if = "Option::is_none")]
113 pub url_html: Option<String>,
114 #[serde(rename = "fecha", skip_serializing_if = "Option::is_none")]
116 pub date: Option<i64>,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct SafetyNote {
122 #[serde(rename = "tipo")]
124 pub note_type: u8,
125 pub num: String,
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub r#ref: Option<String>,
130 #[serde(rename = "asunto")]
132 pub subject: String,
133 #[serde(rename = "fecha")]
135 pub date: i64,
136 pub url: String,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct MaterialDocument {
143 #[serde(rename = "nombre")]
145 pub name: String,
146 pub url: String,
148 #[serde(rename = "fecha")]
150 pub date: i64,
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct SafetyMaterial {
156 #[serde(rename = "listaDocsProfesional", default)]
158 pub professional_docs: Vec<MaterialDocument>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
163pub struct ClinicalDescription {
164 pub vmp: String,
166 #[serde(rename = "vmpDesc")]
168 pub vmp_desc: String,
169 pub vmpp: String,
171 #[serde(rename = "vmppDesc")]
173 pub vmpp_desc: String,
174 #[serde(rename = "presComerc")]
176 pub commercialized_presentations: i32,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize)]
181pub struct AtcCode {
182 #[serde(rename = "codigo")]
184 pub code: String,
185 #[serde(rename = "nombre")]
187 pub name: String,
188 #[serde(rename = "nivel")]
190 pub level: i32,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct ActiveIngredient {
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub id: Option<i32>,
199 #[serde(rename = "codigo", skip_serializing_if = "Option::is_none")]
201 pub code: Option<String>,
202 #[serde(rename = "nombre")]
204 pub name: String,
205 #[serde(rename = "cantidad", skip_serializing_if = "Option::is_none")]
207 pub amount: Option<String>,
208 #[serde(rename = "unidad", skip_serializing_if = "Option::is_none")]
210 pub unit: Option<String>,
211 #[serde(rename = "orden", skip_serializing_if = "Option::is_none")]
213 pub order: Option<i32>,
214}
215
216#[derive(Debug, Clone, Serialize, Deserialize)]
218pub struct Excipient {
219 #[serde(skip_serializing_if = "Option::is_none")]
221 pub id: Option<i32>,
222 #[serde(rename = "nombre")]
224 pub name: String,
225 #[serde(rename = "cantidad", skip_serializing_if = "Option::is_none")]
227 pub amount: Option<String>,
228 #[serde(rename = "unidad", skip_serializing_if = "Option::is_none")]
230 pub unit: Option<String>,
231 #[serde(rename = "orden", skip_serializing_if = "Option::is_none")]
233 pub order: Option<i32>,
234}
235
236#[derive(Debug, Clone, Serialize, Deserialize)]
238pub struct Photo {
239 #[serde(rename = "tipo")]
241 pub photo_type: String,
242 pub url: String,
244 #[serde(rename = "fecha", skip_serializing_if = "Option::is_none")]
246 pub date: Option<i64>,
247}
248
249#[derive(Debug, Clone, Serialize, Deserialize)]
251pub struct PresentationSummary {
252 pub cn: String,
254 #[serde(rename = "nombre")]
256 pub name: String,
257 #[serde(rename = "estado")]
259 pub status: AuthorizationStatus,
260 #[serde(rename = "comerc")]
262 pub commercialized: bool,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub psum: Option<bool>,
266}
267
268#[derive(Debug, Clone, Serialize, Deserialize)]
270pub struct Presentation {
271 pub cn: String,
273 #[serde(rename = "nombre")]
275 pub name: String,
276 #[serde(rename = "estado")]
278 pub status: AuthorizationStatus,
279 #[serde(rename = "comerc")]
281 pub commercialized: bool,
282 #[serde(skip_serializing_if = "Option::is_none")]
284 pub psum: Option<bool>,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
289pub struct MedicationSummary {
290 pub nregistro: String,
292 #[serde(rename = "nombre")]
294 pub name: String,
295 pub labtitular: String,
297 #[serde(rename = "estado")]
299 pub status: AuthorizationStatus,
300 pub cpresc: String,
302 #[serde(rename = "comerc", skip_serializing_if = "Option::is_none")]
304 pub commercialized: Option<bool>,
305 #[serde(rename = "receta", skip_serializing_if = "Option::is_none")]
307 pub prescription_required: Option<bool>,
308 #[serde(rename = "conduc", skip_serializing_if = "Option::is_none")]
310 pub affects_driving: Option<bool>,
311 #[serde(rename = "triangulo", skip_serializing_if = "Option::is_none")]
313 pub black_triangle: Option<bool>,
314 #[serde(rename = "huerfano", skip_serializing_if = "Option::is_none")]
316 pub orphan: Option<bool>,
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub biosimilar: Option<bool>,
320 #[serde(rename = "nosustituible", skip_serializing_if = "Option::is_none")]
322 pub non_substitutable: Option<MasterItem>,
323 #[serde(skip_serializing_if = "Option::is_none")]
325 pub psum: Option<bool>,
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub ema: Option<bool>,
329 #[serde(rename = "notas", skip_serializing_if = "Option::is_none")]
331 pub has_notes: Option<bool>,
332 #[serde(rename = "materialesInf", skip_serializing_if = "Option::is_none")]
334 pub has_materials: Option<bool>,
335 #[serde(default)]
337 pub docs: Vec<Document>,
338 #[serde(rename = "fotos", default)]
340 pub photos: Vec<Photo>,
341 #[serde(rename = "viasAdministracion", default)]
343 pub administration_routes: Vec<MasterItem>,
344 #[serde(rename = "formaFarmaceutica", skip_serializing_if = "Option::is_none")]
346 pub pharmaceutical_form: Option<MasterItem>,
347 #[serde(
349 rename = "formaFarmaceuticaSimplificada",
350 skip_serializing_if = "Option::is_none"
351 )]
352 pub simplified_pharmaceutical_form: Option<MasterItem>,
353 #[serde(skip_serializing_if = "Option::is_none")]
355 pub dosis: Option<String>,
356}
357
358#[derive(Debug, Clone, Serialize, Deserialize)]
360pub struct Medication {
361 pub nregistro: String,
363 #[serde(rename = "nombre")]
365 pub name: String,
366 pub pactivos: String,
368 pub labtitular: String,
370 #[serde(rename = "estado")]
372 pub status: AuthorizationStatus,
373 pub cpresc: String,
375 #[serde(rename = "comerc", skip_serializing_if = "Option::is_none")]
377 pub commercialized: Option<bool>,
378 #[serde(rename = "receta", skip_serializing_if = "Option::is_none")]
380 pub prescription_required: Option<bool>,
381 #[serde(rename = "conduc", skip_serializing_if = "Option::is_none")]
383 pub affects_driving: Option<bool>,
384 #[serde(rename = "triangulo", skip_serializing_if = "Option::is_none")]
386 pub black_triangle: Option<bool>,
387 #[serde(rename = "huerfano", skip_serializing_if = "Option::is_none")]
389 pub orphan: Option<bool>,
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub biosimilar: Option<bool>,
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub ema: Option<bool>,
396 #[serde(skip_serializing_if = "Option::is_none")]
398 pub psum: Option<bool>,
399 #[serde(default)]
401 pub docs: Vec<Document>,
402 #[serde(rename = "fotos", default)]
404 pub photos: Vec<Photo>,
405 #[serde(rename = "notas", skip_serializing_if = "Option::is_none")]
407 pub has_notes: Option<bool>,
408 #[serde(rename = "materialesInf", skip_serializing_if = "Option::is_none")]
410 pub has_materials: Option<bool>,
411 #[serde(default)]
413 pub atcs: Vec<AtcCode>,
414 #[serde(rename = "principiosActivos", default)]
416 pub active_ingredients: Vec<ActiveIngredient>,
417 #[serde(rename = "excipientes", default)]
419 pub excipients: Vec<Excipient>,
420 #[serde(rename = "viasAdministracion", default)]
422 pub administration_routes: Vec<MasterItem>,
423 #[serde(rename = "nosustituible", skip_serializing_if = "Option::is_none")]
425 pub non_substitutable: Option<MasterItem>,
426 #[serde(rename = "presentaciones", default)]
428 pub presentations: Vec<PresentationSummary>,
429 #[serde(rename = "formaFarmaceutica", skip_serializing_if = "Option::is_none")]
431 pub pharmaceutical_form: Option<MasterItem>,
432 #[serde(
434 rename = "formaFarmaceuticaSimplificada",
435 skip_serializing_if = "Option::is_none"
436 )]
437 pub simplified_pharmaceutical_form: Option<MasterItem>,
438 #[serde(skip_serializing_if = "Option::is_none")]
440 pub dosis: Option<String>,
441}
442
443#[derive(Debug, Clone, Serialize, Deserialize)]
445pub struct ChangeRecord {
446 pub nregistro: String,
448 #[serde(rename = "fecha")]
450 pub date: i64,
451 #[serde(rename = "tipoCambio")]
453 pub change_type: u8,
454 #[serde(rename = "cambios", default)]
456 pub changes: Vec<String>,
457}
458
459#[derive(Debug, Clone, Copy, PartialEq, Eq)]
461#[repr(u8)]
462pub enum MasterDataType {
463 ActiveIngredients = 1,
464 PharmaceuticalForms = 3,
465 AdministrationRoutes = 4,
466 Laboratories = 6,
467 AtcCodes = 7,
468 ActiveIngredientsSNOMED = 11,
469 SimplifiedPharmaceuticalFormsSNOMED = 13,
470 AdministrationRoutesSNOMED = 14,
471 Medications = 15,
472 CommercializedMedicationsSNOMED = 16,
473}
474
475impl MasterDataType {
476 pub fn as_u8(self) -> u8 {
477 self as u8
478 }
479}