diff --git a/.github/scripts/validate_appointment_queue_integrity.py b/.github/scripts/validate_appointment_queue_integrity.py index ee1165c..6ad22f2 100644 --- a/.github/scripts/validate_appointment_queue_integrity.py +++ b/.github/scripts/validate_appointment_queue_integrity.py @@ -17,11 +17,15 @@ CONFIG_DIR / "appointmentservicedefinitions" / "servicedefinitions.csv" ) SERVICE_TYPES_PATH = CONFIG_DIR / "appointmentservicetypes" / "servicetypes.csv" +SPECIALITIES_PATH = CONFIG_DIR / "appointmentspecialities" / "specialities.csv" +LOCATIONS_PATH = CONFIG_DIR / "locations" / "sihsalus-locations.csv" QUEUES_PATH = CONFIG_DIR / "queues" / "sihsalus-queues.csv" VISIT_TYPES_PATH = CONFIG_DIR / "visittypes" / "sihsalus-visittypes.csv" -MAPPING_AUDIT_PATH = ( - Path("docs/audits/2026-07-13-appointment-service-queue-mapping.csv") +QUEUE_SERVICE_CONCEPTS_PATH = CONFIG_DIR / "concepts" / "queue_service_concepts.csv" +QUEUE_SERVICE_CONCEPT_SET_PATH = ( + CONFIG_DIR / "conceptsets" / "queue_service_concepts.csv" ) +CARE_ROUTING_CONTRACT_PATH = Path("docs/contracts/hsc-care-routing.csv") FRONTEND_CONFIG_PATH = Path("configuration/frontend_configuration/config.json") OBSOLETE_LIFECYCLE_PRIVILEGE_UUID = "ef67b22e-25c8-4d0f-ab6e-427be7f72cc4" @@ -31,6 +35,69 @@ GENERATE_FUA_PRIVILEGE = "Generate Fua from Visit" QUEUE_NUMBER_ATTRIBUTE_UUID = "06a0b8c6-cbdf-4b42-9cbd-871129db8758" APPOINTMENT_UUID_ATTRIBUTE_UUID = "193508ab-20c6-5291-9f23-0257335eaabd" +VISIT_PERSISTENCE_TOKEN_ATTRIBUTE_UUID = "eb8b793b-f259-451d-9c09-53aa0ffd0d3f" +PROVIDER_SCHEDULING_CATEGORY_ATTRIBUTE_UUID = ( + "3961cbdd-3240-4b70-99ca-5f63af488b15" +) +OBSOLETE_PARENT_VISIT_TYPE_ATTRIBUTE_UUID = "d6c9e7a5-8134-49e3-a2c5-b8f4c3d2e1a9" +QUEUE_SERVICE_CONCEPT_SET_UUID = "4bf3f465-ac91-44fa-9b1f-173daf0c89a0" +CARE_ROUTING_CONTRACT_VERSION = "2026-07-18" +GENERIC_AMBULATORY_VISIT_TYPE_UUID = "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" +HOSPITALIZATION_VISIT_TYPE_UUID = "e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5" +APPROVED_ACTIVE_VISIT_TYPE_UUIDS = { + GENERIC_AMBULATORY_VISIT_TYPE_UUID, + "23939157-9af0-457b-8f6c-211eb5459311", + HOSPITALIZATION_VISIT_TYPE_UUID, + "c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98", + "c80410d7-e0cb-488f-9b23-be78bd244548", +} +EXPECTED_VISIT_TYPE_ELIGIBILITY = { + "35d2234e-129a-4c40-abb2-1ae0b2400001": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID, + "23939157-9af0-457b-8f6c-211eb5459311", + }, + "35d2234e-129a-4c40-abb2-1ae0b2400002": { + HOSPITALIZATION_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400003": { + "c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98" + }, + "35d2234e-129a-4c40-abb2-1ae0b2400004": { + HOSPITALIZATION_VISIT_TYPE_UUID, + "c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98", + }, + "35d2234e-129a-4c40-abb2-1ae0b2400005": { + HOSPITALIZATION_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400006": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400013": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400008": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400007": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400010": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID + }, + "35d2234e-129a-4c40-abb2-1ae0b2400011": { + GENERIC_AMBULATORY_VISIT_TYPE_UUID + }, +} +DENTAL_SERVICE_UUID = "b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02" +GENERAL_DENTISTRY_CATEGORY_UUID = "a0d4e64e-eb63-4271-bdf1-ffa10392c282" +CBMF_SPECIALITY_UUID = "4e6f8d2c-3a5b-495e-9d78-2f4c6a8b1e09" +OBSTETRIC_SERVICE_UUID = "a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02" +NUTRITION_SERVICE_UUID = "3663f478-80fb-4585-b92f-7f82873198ee" +HOSPITALIZATION_SURGERY_SERVICE_UUID = "115b9e98-0bb4-4791-afa6-d21d071cfd87" +TOPICAL_SERVICE_UUID = "d4e5f6a7-b8c9-41e2-93f3-1a9b8c7d6e04" +NEWBORN_SERVICE_UUID = "f7a8b9c0-d1e2-43f4-93e5-3b1a9c8d7e06" +OUTPATIENT_LOCATION_UUID = "35d2234e-129a-4c40-abb2-1ae0b2400001" +HOSPITALIZATION_LOCATION_UUID = "35d2234e-129a-4c40-abb2-1ae0b2400002" PHARMACY_LOCATION_UUID = "35d2234e-129a-4c40-abb2-1ae0b2400007" CRED_APPOINTMENT_LOCATION_UUID = "35d2234e-129a-4c40-abb2-1ae0b2400001" @@ -212,10 +279,14 @@ def read_csv(path): return list(csv.DictReader(handle)) -def is_retired(value): +def is_true(value): return value.strip().lower() in {"1", "true", "yes"} +def is_retired(value): + return is_true(value) + + def split_privileges(value): return {part.strip() for part in value.split(";") if part.strip()} @@ -565,6 +636,41 @@ def validate_visit_attribute_metadata(errors): f"must be {value!r}, found {row[column]!r}" ) + provider_category_matches = [ + row + for row in rows + if row["Uuid"] == PROVIDER_SCHEDULING_CATEGORY_ATTRIBUTE_UUID + ] + if len(provider_category_matches) != 1: + errors.append( + f"{ATTRIBUTE_TYPES_PATH}: expected one provider scheduling-category row" + ) + else: + row = provider_category_matches[0] + expected = { + "Void/Retire": "", + "Entity name": "Provider", + "Name": "Categorías de agenda habilitadas", + "Min occurs": "0", + "Max occurs": "", + "Datatype classname": "org.openmrs.customdatatype.datatype.FreeTextDatatype", + } + for column, value in expected.items(): + if row[column] != value: + errors.append( + f"{ATTRIBUTE_TYPES_PATH}: provider scheduling-category attribute " + f"{column!r} must be {value!r}, found {row[column]!r}" + ) + + obsolete_parent_matches = [ + row for row in rows if row["Uuid"] == OBSOLETE_PARENT_VISIT_TYPE_ATTRIBUTE_UUID + ] + if obsolete_parent_matches: + errors.append( + f"{ATTRIBUTE_TYPES_PATH}: obsolete Parent Visit Type attribute must not " + "be packaged; OpenMRS Core has no VisitType hierarchy" + ) + root = ET.parse(GLOBAL_PROPERTIES_PATH).getroot() properties = defaultdict(list) for item in root.findall(".//globalProperty"): @@ -595,194 +701,356 @@ def validate_service_durations(errors): for row in read_csv(SERVICE_DEFINITIONS_PATH) if not is_retired(row["Void/Retire"]) } - types_by_definition = defaultdict(list) - for row in read_csv(SERVICE_TYPES_PATH): - if is_retired(row["Void/Retire"]): - continue - definition_uuid = row["Service Definition"] - if definition_uuid not in definitions: + service_types = read_csv(SERVICE_TYPES_PATH) + + for definition in definitions.values(): + try: + if int(definition["Duration"]) <= 0: + raise ValueError + except (TypeError, ValueError): errors.append( - f"{SERVICE_TYPES_PATH}: active service type {row['Name']!r} references " - f"unknown or retired definition {definition_uuid}" + f"{SERVICE_DEFINITIONS_PATH}: {definition['Name']!r} must define a " + "positive whole-minute operational duration" ) - continue - types_by_definition[definition_uuid].append(row) - - aligned = 0 - for definition_uuid, definition in definitions.items(): - service_types = types_by_definition.get(definition_uuid, []) - if len(service_types) == 1: - service_type = service_types[0] - if definition["Duration"] != service_type["Duration"]: - errors.append( - f"{SERVICE_DEFINITIONS_PATH}: {definition['Name']!r} duration must " - f"match its only active type ({service_type['Duration']} minutes)" - ) - try: - if int(service_type["Duration"]) <= 0: - raise ValueError - except ValueError: - errors.append( - f"{SERVICE_TYPES_PATH}: {service_type['Name']!r} must have a " - "positive whole-minute duration" - ) - aligned += 1 - elif len(service_types) > 1 and definition["Duration"]: + + if service_types: + errors.append( + f"{SERVICE_TYPES_PATH}: one-to-one service types duplicate appointment " + "services and must not be packaged. Add a service type only for a real " + "variant such as initial/follow-up with distinct duration or capacity" + ) + return len(definitions), len(service_types) + + +def _index_unique(rows, key, path, errors): + indexed = {} + duplicates = set() + for row in rows: + value = row.get(key, "") + if value in indexed: + duplicates.add(value) + indexed[value] = row + if duplicates: + errors.append( + f"{path}: duplicate {key} values: " + ", ".join(sorted(duplicates)) + ) + return indexed + + +def validate_canonical_care_routing(errors): + definition_rows = read_csv(SERVICE_DEFINITIONS_PATH) + definitions = _index_unique( + definition_rows, "Uuid", SERVICE_DEFINITIONS_PATH, errors + ) + specialities = _index_unique( + read_csv(SPECIALITIES_PATH), "Uuid", SPECIALITIES_PATH, errors + ) + locations = _index_unique(read_csv(LOCATIONS_PATH), "Uuid", LOCATIONS_PATH, errors) + queue_rows = read_csv(QUEUES_PATH) + queues = _index_unique(queue_rows, "Uuid", QUEUES_PATH, errors) + visit_type_rows = read_csv(VISIT_TYPES_PATH) + visit_types = _index_unique(visit_type_rows, "Uuid", VISIT_TYPES_PATH, errors) + contract_rows = read_csv(CARE_ROUTING_CONTRACT_PATH) + contract = _index_unique( + contract_rows, + "Appointment Service Uuid", + CARE_ROUTING_CONTRACT_PATH, + errors, + ) + + with VISIT_TYPES_PATH.open(newline="", encoding="utf-8-sig") as handle: + visit_type_headers = csv.DictReader(handle).fieldnames or [] + if "Parent Visit Type" in visit_type_headers: + errors.append( + f"{VISIT_TYPES_PATH}: remove Parent Visit Type; OpenMRS Core has no " + "VisitType hierarchy and Initializer ignores this column" + ) + + packaged_visit_type_uuids = {row["Uuid"] for row in visit_type_rows} + if packaged_visit_type_uuids != APPROVED_ACTIVE_VISIT_TYPE_UUIDS: + errors.append( + f"{VISIT_TYPES_PATH}: package only the approved care-setting VisitTypes; " + "found: " + ", ".join(sorted(packaged_visit_type_uuids)) + ) + retired_packaged_visit_types = [ + row["Uuid"] for row in visit_type_rows if is_retired(row["Void/Retire"]) + ] + if retired_packaged_visit_types: + errors.append( + f"{VISIT_TYPES_PATH}: canonical content must not recreate retired legacy " + "VisitTypes: " + ", ".join(sorted(retired_packaged_visit_types)) + ) + + if set(contract) != set(definitions): + missing = set(definitions) - set(contract) + extra = set(contract) - set(definitions) + if missing: errors.append( - f"{SERVICE_DEFINITIONS_PATH}: {definition['Name']!r} has multiple active " - "types, so its base duration must remain empty until a local rule is defined" + f"{CARE_ROUTING_CONTRACT_PATH}: undocumented appointment services: " + + ", ".join(sorted(missing)) + ) + if extra: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: unknown appointment services: " + + ", ".join(sorted(extra)) ) - return aligned - -def validate_documented_queue_mapping(errors): - definitions = { - row["Uuid"]: row - for row in read_csv(SERVICE_DEFINITIONS_PATH) - if not is_retired(row["Void/Retire"]) + queue_service_concepts = _index_unique( + read_csv(QUEUE_SERVICE_CONCEPTS_PATH), + "Uuid", + QUEUE_SERVICE_CONCEPTS_PATH, + errors, + ) + queue_service_members = { + row["Member"] + for row in read_csv(QUEUE_SERVICE_CONCEPT_SET_PATH) + if row["Concept"] == QUEUE_SERVICE_CONCEPT_SET_UUID + and row["Member Type"].strip().lower() == "concept-set" } - queues = { - row["Uuid"]: row - for row in read_csv(QUEUES_PATH) + appointment_service_uuids = set(definitions) + queue_service_collisions = { + row["Service"] + for row in queue_rows if not is_retired(row["Void/Retire"]) + and row["Service"] in appointment_service_uuids } - audit_rows = read_csv(MAPPING_AUDIT_PATH) - rows_by_service = defaultdict(list) - for row in audit_rows: - rows_by_service[row["Appointment Service Uuid"]].append(row) - - undocumented = set(definitions) - set(rows_by_service) - extra = set(rows_by_service) - set(definitions) - if undocumented: - errors.append( - f"{MAPPING_AUDIT_PATH}: active appointment services are undocumented: " - + ", ".join(sorted(undocumented)) - ) - if extra: + if queue_service_collisions: errors.append( - f"{MAPPING_AUDIT_PATH}: retired or unknown appointment services are listed: " - + ", ".join(sorted(extra)) + f"{QUEUES_PATH}: Queue.service must use dedicated Concept UUIDs, never " + "AppointmentServiceDefinition UUIDs: " + + ", ".join(sorted(queue_service_collisions)) ) - automatic_pairs = set() - exact_automatic_pairs = set() - manual_count = 0 - for service_uuid, rows in rows_by_service.items(): - if len(rows) != 1 or service_uuid not in definitions: - if len(rows) != 1: - errors.append( - f"{MAPPING_AUDIT_PATH}: service {service_uuid} must have exactly one row" - ) + allowed_category_bases = { + "local-scheduling", + "rne-medical", + "rne-dental", + "profession", + "none", + } + queue_policies = {"queue-optional", "queue-required"} + direct_count = 0 + queue_count = 0 + retired_count = 0 + for service_uuid, row in contract.items(): + definition = definitions.get(service_uuid) + if not definition: continue - row = rows[0] - definition = definitions[service_uuid] + + status = row["Status"] + expected_status = ( + "retired" if is_retired(definition["Void/Retire"]) else "enabled" + ) + if status != expected_status: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: {service_uuid} status must be " + f"{expected_status!r}, found {status!r}" + ) if row["Appointment Service"] != definition["Name"]: errors.append( - f"{MAPPING_AUDIT_PATH}: service name for {service_uuid} is stale" + f"{CARE_ROUTING_CONTRACT_PATH}: service name for {service_uuid} is stale" ) - if row["Appointment Location Uuid"] != definition["Location"]: + if not row["NTS 249 Item"] or not row["NTS 249 Prestacion"]: errors.append( - f"{MAPPING_AUDIT_PATH}: location for {definition['Name']!r} is stale" + f"{CARE_ROUTING_CONTRACT_PATH}: {definition['Name']!r} must document " + "its NTS 249 basis or explicitly state N/A" ) if not row["Reason"].strip(): errors.append( - f"{MAPPING_AUDIT_PATH}: {definition['Name']!r} must document a reason" + f"{CARE_ROUTING_CONTRACT_PATH}: {definition['Name']!r} must document " + "the local routing decision" + ) + + location_uuid = row["Appointment Location Uuid"] + location = locations.get(location_uuid) + if definition["Location"] != location_uuid: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: location for {definition['Name']!r} " + "does not match its AppointmentServiceDefinition" + ) + if not location or location["Name"] != row["Appointment Location"]: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: appointment location name/UUID is " + f"invalid for {definition['Name']!r}" + ) + if status == "enabled" and location and not is_true( + location["Tag|Appointment Location"] + ): + errors.append( + f"{LOCATIONS_PATH}: active service {definition['Name']!r} must use " + "a location tagged as Appointment Location" ) - resolution = row["Resolution"] - queue_uuid = row["Queue Uuid"] - queue = queues.get(queue_uuid) if queue_uuid else None - if resolution in {"automatic", "automatic-shared"}: - if queue is None: + category_uuid = row["Scheduling Category Uuid"] + category_name = row["Scheduling Category"] + category_basis = row["Category Basis"] + if category_basis not in allowed_category_bases: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: unsupported Category Basis " + f"{category_basis!r} for {definition['Name']!r}" + ) + if definition["Speciality"] != category_uuid: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: scheduling category for " + f"{definition['Name']!r} does not match the speciality FK" + ) + if category_uuid: + category = specialities.get(category_uuid) + if not category or is_retired(category["Void/Retire"]): + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: category {category_uuid} for " + f"{definition['Name']!r} must be active" + ) + elif category["Name"] != category_name: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: scheduling category name for " + f"{category_uuid} is stale" + ) + if category_basis in {"profession", "none"}: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: {category_basis} service " + f"{definition['Name']!r} cannot claim an AppointmentSpeciality" + ) + elif category_name or category_basis not in {"profession", "none"}: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: category UUID/name/basis are " + f"inconsistent for {definition['Name']!r}" + ) + + arrival_policy = row["Arrival Policy"] + queue_fields = ( + "Queue Uuid", + "Queue", + "Queue Service Concept Uuid", + "Queue Location Uuid", + ) + if status == "retired": + retired_count += 1 + if arrival_policy != "not-applicable": + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: retired service " + f"{definition['Name']!r} must use not-applicable arrival" + ) + if any(row[field] for field in (*queue_fields, "Required Visit Type Uuid", "Required Visit Type")): + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: retired service " + f"{definition['Name']!r} must not publish runtime routing fields" + ) + continue + + visit_type_uuid = row["Required Visit Type Uuid"] + visit_type = visit_types.get(visit_type_uuid) + if not visit_type or is_retired(visit_type["Void/Retire"]): + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: {definition['Name']!r} must reference " + "an active care-setting VisitType" + ) + elif visit_type["Name"] != row["Required Visit Type"]: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: VisitType name for " + f"{visit_type_uuid} is stale" + ) + + if arrival_policy == "direct": + direct_count += 1 + if any(row[field] for field in queue_fields): errors.append( - f"{MAPPING_AUDIT_PATH}: automatic mapping for {definition['Name']!r} " - "must reference an active queue" + f"{CARE_ROUTING_CONTRACT_PATH}: direct service " + f"{definition['Name']!r} must not define a queue" + ) + elif arrival_policy in queue_policies: + queue_count += 1 + missing = [field for field in queue_fields if not row[field]] + if missing: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: queue route for " + f"{definition['Name']!r} is missing " + ", ".join(missing) ) continue - if queue["Location"] != definition["Location"]: + queue = queues.get(row["Queue Uuid"]) + if not queue or is_retired(queue["Void/Retire"]): errors.append( - f"{MAPPING_AUDIT_PATH}: automatic mapping for {definition['Name']!r} " - "must use a queue in the appointment location" + f"{CARE_ROUTING_CONTRACT_PATH}: queue for " + f"{definition['Name']!r} must be active" ) - if resolution == "automatic": - exact_matches = [ - candidate - for candidate in queues.values() - if candidate["Service"] == service_uuid - and candidate["Location"] == definition["Location"] - ] - if len(exact_matches) != 1 or exact_matches[0]["Uuid"] != queue_uuid: - errors.append( - f"{MAPPING_AUDIT_PATH}: automatic mapping for " - f"{definition['Name']!r} must be the unique queue with the same " - "service UUID and location" - ) - exact_automatic_pairs.add( - ( - service_uuid, - definition["Location"], - queue_uuid, - queue["Location"], - ) + continue + if queue["Name"] != row["Queue"]: + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: queue name for " + f"{row['Queue Uuid']} is stale" ) - if row["Queue"] != queue["Name"]: + if queue["Location"] != row["Queue Location Uuid"]: errors.append( - f"{MAPPING_AUDIT_PATH}: queue name for {queue_uuid} is stale" + f"{CARE_ROUTING_CONTRACT_PATH}: queue location for " + f"{definition['Name']!r} is stale" ) - if row["Queue Location Uuid"] != queue["Location"]: + if row["Queue Location Uuid"] != location_uuid: errors.append( - f"{MAPPING_AUDIT_PATH}: queue location for {queue_uuid} is stale" + f"{CARE_ROUTING_CONTRACT_PATH}: appointment and queue locations " + f"must match for {definition['Name']!r}" ) - automatic_pairs.add( - ( - service_uuid, - definition["Location"], - queue_uuid, - queue["Location"], + queue_location = locations.get(row["Queue Location Uuid"]) + if not queue_location or not is_true(queue_location["Tag|Queue Location"]): + errors.append( + f"{LOCATIONS_PATH}: queue for {definition['Name']!r} must use a " + "location tagged as Queue Location" ) - ) - elif resolution == "manual-required": - manual_count += 1 - populated_queue_fields = { - column: row[column] - for column in ("Queue Uuid", "Queue Location Uuid", "Queue") - if row[column] - } - if populated_queue_fields: + queue_service_uuid = row["Queue Service Concept Uuid"] + if queue["Service"] != queue_service_uuid: errors.append( - f"{MAPPING_AUDIT_PATH}: manual mapping for {definition['Name']!r} " - "must not suggest a queue by name; populated fields: " - + ", ".join(sorted(populated_queue_fields)) + f"{CARE_ROUTING_CONTRACT_PATH}: Queue.service concept for " + f"{definition['Name']!r} is stale" + ) + if queue_service_uuid not in queue_service_concepts: + errors.append( + f"{QUEUE_SERVICE_CONCEPTS_PATH}: missing dedicated queue service " + f"concept {queue_service_uuid}" + ) + if queue_service_uuid not in queue_service_members: + errors.append( + f"{QUEUE_SERVICE_CONCEPT_SET_PATH}: queue service concept " + f"{queue_service_uuid} is not a member of the configured set" ) else: errors.append( - f"{MAPPING_AUDIT_PATH}: unsupported resolution {resolution!r} for " - f"{definition['Name']!r}" + f"{CARE_ROUTING_CONTRACT_PATH}: unsupported Arrival Policy " + f"{arrival_policy!r} for {definition['Name']!r}" ) - configured_exact_pairs = { - ( - definition_uuid, - definition["Location"], - queue["Uuid"], - queue["Location"], - ) - for definition_uuid, definition in definitions.items() - for queue in queues.values() - if queue["Service"] == definition_uuid - and queue["Location"] == definition["Location"] + semantic_expectations = { + DENTAL_SERVICE_UUID: (GENERAL_DENTISTRY_CATEGORY_UUID, OUTPATIENT_LOCATION_UUID, "enabled"), + OBSTETRIC_SERVICE_UUID: ("", OUTPATIENT_LOCATION_UUID, "enabled"), + NUTRITION_SERVICE_UUID: ("32f2c8e3-79cf-4016-939f-469bed37abdb", OUTPATIENT_LOCATION_UUID, "enabled"), + HOSPITALIZATION_SURGERY_SERVICE_UUID: ( + "d8e2f4a0-b5c3-41d7-942a-6c4a1e9f3b22", + HOSPITALIZATION_LOCATION_UUID, + "enabled", + ), + TOPICAL_SERVICE_UUID: ("", OUTPATIENT_LOCATION_UUID, "retired"), + NEWBORN_SERVICE_UUID: ( + "14106bb7-dad6-4446-809d-737f4c128ae3", + "35d2234e-129a-4c40-abb2-1ae0b2400004", + "retired", + ), } - if exact_automatic_pairs != configured_exact_pairs: - errors.append( - f"{MAPPING_AUDIT_PATH}: documented exact automatic mappings do not match the " - "configured service-and-location pairs" - ) - if not automatic_pairs or not manual_count: + for service_uuid, (category_uuid, location_uuid, status) in semantic_expectations.items(): + row = contract.get(service_uuid) + if row and ( + row["Scheduling Category Uuid"] != category_uuid + or row["Appointment Location Uuid"] != location_uuid + or row["Status"] != status + ): + errors.append( + f"{CARE_ROUTING_CONTRACT_PATH}: canonical semantic decision changed " + f"for service {service_uuid}" + ) + if contract.get(DENTAL_SERVICE_UUID, {}).get("Scheduling Category Uuid") == CBMF_SPECIALITY_UUID: errors.append( - f"{MAPPING_AUDIT_PATH}: mapping must remain explicit about both automatic " - "and manual-required services" + f"{CARE_ROUTING_CONTRACT_PATH}: general dentistry must never be mapped to " + "Cirugía Bucal y Maxilofacial" ) - return len(automatic_pairs), manual_count + + return queue_count, direct_count, retired_count def validate_frontend_appointment_config(errors): @@ -830,98 +1098,149 @@ def validate_frontend_appointment_config(errors): f"{FRONTEND_CONFIG_PATH}: appointmentVisitAttributeTypeUuid must be " f"{APPOINTMENT_UUID_ATTRIBUTE_UUID}" ) + if module_config.get("careRoutingContractVersion") != CARE_ROUTING_CONTRACT_VERSION: + errors.append( + f"{FRONTEND_CONFIG_PATH}: careRoutingContractVersion must be " + f"{CARE_ROUTING_CONTRACT_VERSION!r}" + ) - required_mapping_fields = ( - "appointmentServiceUuid", - "appointmentLocationUuid", - "queueUuid", - "queueLocationUuid", - "requiredVisitTypeUuid", - ) - active_visit_types = { - row["Uuid"]: row - for row in read_csv(VISIT_TYPES_PATH) - if not is_retired(row["Void/Retire"]) + provider_validation = module_config.get("providerSchedulingCategoryValidation") + expected_provider_validation = { + "mode": "warn", + "providerAttributeTypeUuid": PROVIDER_SCHEDULING_CATEGORY_ATTRIBUTE_UUID, } - automatic_audit_rows = [ - row - for row in read_csv(MAPPING_AUDIT_PATH) - if row["Resolution"] in {"automatic", "automatic-shared"} - ] - for row in automatic_audit_rows: - visit_type_uuid = row["Required Visit Type Uuid"] - visit_type = active_visit_types.get(visit_type_uuid) - if not visit_type: + if provider_validation != expected_provider_validation: + errors.append( + f"{FRONTEND_CONFIG_PATH}: providerSchedulingCategoryValidation must use " + "warn mode and the canonical provider attribute UUID" + ) + + patient_chart_config = config.get("@sihsalus/esm-patient-chart-app") + if not isinstance(patient_chart_config, dict): + errors.append( + f"{FRONTEND_CONFIG_PATH}: missing @sihsalus/esm-patient-chart-app object" + ) + else: + if ( + patient_chart_config.get("visitPersistenceTokenAttributeTypeUuid") + != VISIT_PERSISTENCE_TOKEN_ATTRIBUTE_UUID + ): errors.append( - f"{MAPPING_AUDIT_PATH}: automatic mapping for " - f"{row['Appointment Service Uuid']} must reference an active visit type" + f"{FRONTEND_CONFIG_PATH}: visitPersistenceTokenAttributeTypeUuid " + f"must be {VISIT_PERSISTENCE_TOKEN_ATTRIBUTE_UUID}" ) - elif visit_type["Name"] != row["Required Visit Type"]: + + eligibility_rules = patient_chart_config.get("visitTypeEligibilityRules") + configured_eligibility = {} + if not isinstance(eligibility_rules, list): errors.append( - f"{MAPPING_AUDIT_PATH}: visit type name for {visit_type_uuid} must match " - f"{VISIT_TYPES_PATH}" + f"{FRONTEND_CONFIG_PATH}: visitTypeEligibilityRules must be an array" ) - expected_mappings = { - ( - row["Appointment Service Uuid"], - row["Appointment Location Uuid"], - row["Queue Uuid"], - row["Queue Location Uuid"], - row["Required Visit Type Uuid"], + else: + for index, rule in enumerate(eligibility_rules): + if not isinstance(rule, dict): + errors.append( + f"{FRONTEND_CONFIG_PATH}: visitTypeEligibilityRules[{index}] " + "must be an object" + ) + continue + location_uuid = rule.get("locationUuid") + visit_type_uuids = rule.get("visitTypeUuids") + if not isinstance(location_uuid, str) or not isinstance( + visit_type_uuids, list + ): + errors.append( + f"{FRONTEND_CONFIG_PATH}: visitTypeEligibilityRules[{index}] " + "must define a location UUID and visit-type UUID array" + ) + continue + if location_uuid in configured_eligibility: + errors.append( + f"{FRONTEND_CONFIG_PATH}: duplicate visit-type eligibility " + f"rule for location {location_uuid}" + ) + configured_eligibility[location_uuid] = set(visit_type_uuids) + + if configured_eligibility != EXPECTED_VISIT_TYPE_ELIGIBILITY: + errors.append( + f"{FRONTEND_CONFIG_PATH}: visitTypeEligibilityRules must contain " + "exactly the approved location-to-care-setting mappings" + ) + + if "appointmentQueueMappings" in module_config: + errors.append( + f"{FRONTEND_CONFIG_PATH}: remove legacy appointmentQueueMappings; use " + "the complete appointmentArrivalRules contract" ) - for row in automatic_audit_rows - } - configured_rows = module_config.get("appointmentQueueMappings") - if not isinstance(configured_rows, list): + expected_rules = [] + for row in read_csv(CARE_ROUTING_CONTRACT_PATH): + if row["Status"] != "enabled": + continue + rule = { + "appointmentServiceUuid": row["Appointment Service Uuid"], + "appointmentLocationUuid": row["Appointment Location Uuid"], + "arrivalPolicy": row["Arrival Policy"], + "requiredVisitTypeUuid": row["Required Visit Type Uuid"], + } + if row["Arrival Policy"] in {"queue-optional", "queue-required"}: + rule["queueUuid"] = row["Queue Uuid"] + rule["queueLocationUuid"] = row["Queue Location Uuid"] + expected_rules.append(rule) + + configured_rules = module_config.get("appointmentArrivalRules") + if not isinstance(configured_rules, list): errors.append( - f"{FRONTEND_CONFIG_PATH}: appointmentQueueMappings must be an array" + f"{FRONTEND_CONFIG_PATH}: appointmentArrivalRules must be an array" ) return 0 - configured_mappings = [] - for index, row in enumerate(configured_rows): + allowed_fields = { + "appointmentServiceUuid", + "appointmentLocationUuid", + "arrivalPolicy", + "requiredVisitTypeUuid", + "queueUuid", + "queueLocationUuid", + } + normalized_rules = [] + for index, row in enumerate(configured_rules): if not isinstance(row, dict): errors.append( - f"{FRONTEND_CONFIG_PATH}: appointmentQueueMappings[{index}] must be an object" - ) - continue - missing = [field for field in required_mapping_fields if not row.get(field)] - extra = set(row) - set(required_mapping_fields) - if missing: - errors.append( - f"{FRONTEND_CONFIG_PATH}: appointmentQueueMappings[{index}] is missing: " - + ", ".join(missing) + f"{FRONTEND_CONFIG_PATH}: appointmentArrivalRules[{index}] must be an object" ) continue + extra = set(row) - allowed_fields if extra: errors.append( - f"{FRONTEND_CONFIG_PATH}: appointmentQueueMappings[{index}] has " + f"{FRONTEND_CONFIG_PATH}: appointmentArrivalRules[{index}] has " "unsupported fields: " + ", ".join(sorted(extra)) ) - continue - configured_mappings.append(tuple(row[field] for field in required_mapping_fields)) + normalized_rules.append(json.dumps(row, sort_keys=True)) - configured_mapping_set = set(configured_mappings) - if len(configured_mappings) != len(configured_mapping_set): + expected_rule_set = {json.dumps(row, sort_keys=True) for row in expected_rules} + configured_rule_set = set(normalized_rules) + if len(normalized_rules) != len(configured_rule_set): errors.append( - f"{FRONTEND_CONFIG_PATH}: appointmentQueueMappings contains duplicates" + f"{FRONTEND_CONFIG_PATH}: appointmentArrivalRules contains duplicates" ) - if configured_mapping_set != expected_mappings: + if configured_rule_set != expected_rule_set: errors.append( - f"{FRONTEND_CONFIG_PATH}: appointmentQueueMappings must contain exactly " - "the UUID-verified automatic mappings from the audit CSV" + f"{FRONTEND_CONFIG_PATH}: appointmentArrivalRules must contain exactly " + "the enabled routes from the canonical care-routing contract" ) - return len(configured_mapping_set) + return len(configured_rule_set) def main(): errors = [] validate_privilege_and_roles(errors) validate_visit_attribute_metadata(errors) - aligned_durations = validate_service_durations(errors) - automatic_mappings, manual_mappings = validate_documented_queue_mapping(errors) - frontend_mappings = validate_frontend_appointment_config(errors) + active_services, packaged_service_types = validate_service_durations(errors) + queue_routes, direct_routes, retired_services = validate_canonical_care_routing( + errors + ) + frontend_routes = validate_frontend_appointment_config(errors) if errors: print("Appointment/visit/queue integrity validation failed:", file=sys.stderr) @@ -936,9 +1255,10 @@ def main(): f"{len(ALLOWED_DIRECT_FUA_GENERATION_ASSIGNMENTS)} narrow FUA generation assignments, " f"{len(FRONTEND_UI_PRIVILEGES)} frontend workflow privileges, " "queue-number and appointment-link metadata, " - f"{aligned_durations} unambiguous durations, {automatic_mappings} automatic " - f"queue mappings, {frontend_mappings} frontend mappings, and " - f"{manual_mappings} manual mappings." + f"{active_services} active services, {packaged_service_types} one-to-one service-type " + f"duplicates, {queue_routes} explicit queue routes, {direct_routes} direct " + f"routes, {retired_services} non-programmable retired services, and " + f"{frontend_routes} synchronized frontend routes." ) return 0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 023160a..b86ab79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,40 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/lang/es/). ## [Unreleased] +### Agregado +- Contrato canónico versionado `docs/contracts/hsc-care-routing.csv` para los 16 servicios + registrados. Define por UUID la categoría de agenda, ubicación, política de llegada, cola y + ámbito de atención; 13 servicios quedan programables, 11 permiten cola y dos son de atención + directa. +- Categoría local de agenda `Odontología general`, separada de la especialidad reconocida + `Cirugía Bucal y Maxilofacial`, y atributo multivaluado de proveedor para habilitar categorías + de agenda con validación frontend configurable (`off`, `warn` o `strict`). +- Conceptos dedicados para servicios de cola. `Queue.service` deja de reutilizar UUIDs de + `AppointmentServiceDefinition`, que pertenecen a otro tipo de recurso. + +### Cambiado +- `VisitType` representa únicamente el ámbito: Atención Ambulatoria, Sesión Grupal Ambulatoria, + Hospitalización, Emergencia o Atención Extramural. La especialidad y la prestación permanecen + en el servicio de cita y el encuentro clínico. +- Obstetricia y nutrición ambulatorias se ubican en UPSS Consulta Externa; hospitalización de + cirugía general se ubica en UPSS Hospitalización; Hemodiálisis usa UPSS Diálisis. +- Rehabilitación, hemodiálisis y nutrición tienen equivalencias explícitas con sus colas. El + registro de llegada ya no depende de coincidencias por nombre ni de selección manual. +- Los tipos de servicio uno-a-uno se eliminan del paquete; la duración operativa vive en la definición + del servicio hasta que el hospital configure variantes reales, como primera consulta o control. + +### Retirado +- Servicios de cita para emergencia, atención inmediata del recién nacido y aplicación de + inyectables. Son flujos no programables o requieren confirmar cartera y UPSS antes de activarse. +- Tipos de atención que codificaban especialidades, dispensación o diagnóstico dentro de + `VisitType`, y el atributo ficticio `Parent Visit Type` que OpenMRS Core nunca interpretó, se + eliminan del paquete canónico y no se recrean en instalaciones nuevas. + +### Validación +- CI comprueba que content y configuración frontend reproduzcan exactamente el contrato, que las + colas usen Concepts dedicados, que no reaparezcan tipos especializados y que odontología general + nunca quede asociada a Cirugía Bucal y Maxilofacial. + ### Agregado - Person attribute **Método de Verificación de Seguro** (`bc1e5c92-e46a-4bc9-8cba-d9093a0eb659`, FreeText): traza cómo se verificó la afiliación (manual-web / setisis / siteds), requerido por la @@ -47,9 +81,8 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/lang/es/). 5 679 mapeos) y la suscripción de `openconceptlab.subscriptionUrl` a esa versión. ### Corregido -- Mapea las citas de cirujano dentista en UPSS Consulta Externa a la cola compartida de Consulta Externa y exige el - tipo de visita `Consulta Ambulatoria - Odontología`, permitiendo que Admisión encole sin mezclar el contexto - clínico de la consulta. +- Mapea las citas de cirujano dentista general en UPSS Consulta Externa a la cola compartida y usa el ámbito + `Atención Ambulatoria`; la categoría `Odontología general` conserva el contexto sin duplicarlo en `VisitType`. - Mantiene el nombre estable `Admision` para que Initializer pueda actualizar el rol existente por UUID, reemplazar su herencia y aplicar la allowlist de registro, citas y check-in. Esto restaura la lectura necesaria para encolar desde Citas y retira historia clínica, dashboard/configuración/purgas de colas, administración de catálogos y @@ -90,8 +123,8 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/lang/es/). - Define `Personal de Emergencia` como rol operativo directo para búsqueda y alta rápida, visitas, triaje, atención y movimientos de cola. Puede cerrar de forma coordinada registros legados vinculados a citas, sin heredar los permisos amplios de consulta externa ni recibir configuración, purga o borrado clínico. -- Copia a cada definición de servicio la duración de su único tipo activo, sin inventar horarios ni cupos, y deja - auditados seis mapeos automáticos y nueve selecciones manuales entre servicios de cita y colas. +- Conserva una duración base positiva en cada definición de servicio sin inventar horarios ni cupos, retira los + tipos de servicio redundantes y publica reglas explícitas para todos los servicios programables. - Protege `Get Providers` como privilegio requerido del rol `Admision` para que pueda listar doctores y proveedores mediante la API REST. - Agrega `Get Concept Sources` al rol `Admision` para que FHIR pueda cargar los datos existentes al editar un @@ -106,10 +139,9 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/lang/es/). tipos de encuentro y roles de proveedor distintos, sin formularios JSON ni migración automática de históricos. Agrega un contrato de ubicación/RBAC para el frontend y una validación CI de regresión. - Agrega los atributos de visita `Número de turno de cola` y `UUID de cita vinculada`, la propiedad global del - número de turno y una validación CI de RBAC con privilegios oficiales, metadata, duración y mapeos exactos por - UUID y tipo de visita; declara `America/Lima` como zona operativa para los consumidores SIHSALUS, conserva UTC - en servidor/JVM según la convención de OpenMRS y documenta el corte UTC del correlativo diario de Queue 3.0 como - limitación upstream. Exige selección manual sin inferencias por nombre cuando no existe coincidencia inequívoca. + número de turno y una validación CI de RBAC con privilegios oficiales, metadata, duración y rutas exactas por + UUID; declara `America/Lima` como zona operativa para los consumidores SIHSALUS y conserva UTC en servidor/JVM + según la convención de OpenMRS. - Agrega privilegios frontend específicos para la tabla de consultas activas, resumen de consulta, formularios clínicos, canasta de órdenes y lista de tareas. Los asigna a consulta externa y, de forma acotada, a los roles clínicos que ya tenían el acceso funcional equivalente; `Enfermera` los hereda de `Doctor Consulta Externa`. diff --git a/README.md b/README.md index b4136dd..2344d2a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SIHSALUS Content Package -SIHSALUS Content Package para OpenMRS, con la versión actual **1.22.0**. +SIHSALUS Content Package para OpenMRS, con la versión actual **1.23.0**. The contents of a typical Content Package are: * **Configuration** @@ -39,7 +39,7 @@ If this command reports any violations, you can then run `mvn spotless:apply` to Remember, in most cases, you don't need to run these commands separately as Spotless will run automatically during the build process with `mvn clean package`. -Versión del paquete: **1.22.0**. +Versión del paquete: **1.23.0**. ## Cobertura MINSA (Categoría II) diff --git a/configuration/backend_configuration/appointmentservicedefinitions/servicedefinitions.csv b/configuration/backend_configuration/appointmentservicedefinitions/servicedefinitions.csv index 9f22285..d7bb0f9 100644 --- a/configuration/backend_configuration/appointmentservicedefinitions/servicedefinitions.csv +++ b/configuration/backend_configuration/appointmentservicedefinitions/servicedefinitions.csv @@ -1,17 +1,17 @@ Uuid,Void/Retire,Name,Description,Duration,Start Time,End Time,Max Load,Speciality,Location,Label Colour -7ba3aa21-cc56-47ca-bb4d-a60549f666c0,,Consulta ambulatoria por médico general,"Atención ambulatoria realizada por un médico general para diagnóstico y tratamiento básico.",20,,,,9f2a8cd0-32c6-4844-8df7-1ac9c4d79943,35d2234e-129a-4c40-abb2-1ae0b2400001,#feecae -1ef43565-9c96-4f58-bfd2-c864c7cedac1,,Teleconsulta por médico,"Consulta médica realizada a distancia mediante tecnología de comunicación.",20,,,,9f2a8cd0-32c6-4844-8df7-1ac9c4d79943,35d2234e-129a-4c40-abb2-1ae0b2400001,#defbe6 -4ec5c4fe-cfe0-48ff-9e4d-2f201078feae,,Atención ambulatoria por enfermera(o),"Atención ambulatoria brindada por personal de enfermería para cuidados generales.",20,,,,,35d2234e-129a-4c40-abb2-1ae0b2400001,#9ef0f0 -c8d4f6e2-5b7a-41d9-93e4-7f6a8b3c2d01,,Atención ambulatoria por psicólogo(a),"Consulta ambulatoria enfocada en la salud mental realizada por psicólogo(a).",45,,,,9c8b7a6d-5e4f-43c1-9a2b-8d3e6f5c2a10,35d2234e-129a-4c40-abb2-1ae0b2400001,#ffccf2 -a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02,,Atención ambulatoria por obstetra,"Consulta ambulatoria especializada en obstetricia, atendida por un obstetra.",30,,,,5f7c1d89-ae34-4b8c-a231-0d8e5b6c3f10,35d2234e-129a-4c40-abb2-1ae0b2400004,#ffb3b3 -b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02,,Atención ambulatoria por cirujano dentista,"Atención ambulatoria en odontología realizada por cirujano dentista.",30,,,,4e6f8d2c-3a5b-495e-9d78-2f4c6a8b1e09,35d2234e-129a-4c40-abb2-1ae0b2400001,#b3e0ff -d4e5f6a7-b8c9-41e2-93f3-1a9b8c7d6e04,,Atención en tópico de inyectables y nebulizaciones,"Procedimientos ambulatorios de inyectables y nebulizaciones en tópicos específicos.",15,,,,,35d2234e-129a-4c40-abb2-1ae0b2400001,#ffd699 -e5f6a7b8-c9d0-42f3-93e4-2b0a9c8d7e05,TRUE,Atención de urgencias y emergencias,"Servicio retirado del dominio de citas: emergencia se gestiona como atención inmediata y cola operativa, no como cita programada.",,,,,3c9a7b2d-4e5f-489a-bd78-1f6e3c8d5a01,35d2234e-129a-4c40-abb2-1ae0b2400003,#ffdd99 -f7a8b9c0-d1e2-43f4-93e5-3b1a9c8d7e06,,Atención inmediata del recién nacido,"Atención inmediata para recién nacidos realizada por un médico subespecialista en neonatología.",30,,,,14106bb7-dad6-4446-809d-737f4c128ae3,35d2234e-129a-4c40-abb2-1ae0b2400004,#e6b3cc -115b9e98-0bb4-4791-afa6-d21d071cfd87,,Hospitalización de Cirugía General,"Cuidado hospitalario para pacientes sometidos a procedimientos de cirugía general.",60,,,,d8e2f4a0-b5c3-41d7-942a-6c4a1e9f3b22,35d2234e-129a-4c40-abb2-1ae0b2400005,#cce6ff -e6a43c30-71ac-4ec6-9757-c78a50ee8e8b,,Procedimientos de Laboratorio Clínico Tipo II-1,"Realización de procedimientos de laboratorio clínico de complejidad tipo II-1 para diagnóstico.",15,,,,7e5d3c2b-8a9f-41d6-93c4-6b2a1f8e5d07,35d2234e-129a-4c40-abb2-1ae0b2400006,#d9e6cc -70b7402d-fdfe-4707-94d8-5eb5780ffde5,,Ecografía general y Doppler,"Estudio de ecografía general y Doppler para evaluación diagnóstica.",30,,,,2b4d6f8a-1c3e-49d5-93a7-8e5f6b3c2d01,35d2234e-129a-4c40-abb2-1ae0b2400013,#e6ccb3 -74156b5c-b1b0-4432-b073-a8af65ebcb11,,Atención en farmacia clínica,"Atención farmacéutica especializada en el ámbito clínico, incluyendo asesoramiento y dispensación de medicamentos.",15,,,,,35d2234e-129a-4c40-abb2-1ae0b2400007,#e6e6fa -dcaa59d1-64f2-45f5-a930-2ccc0ef37e61,,Terapia de rehabilitación,"Sesión programada de medicina de rehabilitación o terapia física.",45,,,,a85cfebd-f0ad-465e-859c-ee20ded8fa90,35d2234e-129a-4c40-abb2-1ae0b2400010,#c8f7c5 -89bde58b-2161-4095-8e52-0d8b5003012b,,Sesión de hemodiálisis,"Sesión programada de hemodiálisis para pacientes que requieren terapia dialítica.",240,,,,e8a5a5bb-60f4-42e6-a96f-fd9da40d5c1a,35d2234e-129a-4c40-abb2-1ae0b2400011,#b8d8ff -3663f478-80fb-4585-b92f-7f82873198ee,,Atención nutricional,"Consulta programada de nutrición y dietética para evaluación y seguimiento nutricional.",30,,,,32f2c8e3-79cf-4016-939f-469bed37abdb,35d2234e-129a-4c40-abb2-1ae0b2400012,#d7f0b2 +7ba3aa21-cc56-47ca-bb4d-a60549f666c0,,Consulta ambulatoria por médico general,"Prestación 54 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. La duración es una decisión operativa local.",20,,,,9f2a8cd0-32c6-4844-8df7-1ac9c4d79943,35d2234e-129a-4c40-abb2-1ae0b2400001,#feecae +1ef43565-9c96-4f58-bfd2-c864c7cedac1,,Teleconsulta por médico general,"Prestación 219 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. La duración es una decisión operativa local.",20,,,,9f2a8cd0-32c6-4844-8df7-1ac9c4d79943,35d2234e-129a-4c40-abb2-1ae0b2400001,#defbe6 +4ec5c4fe-cfe0-48ff-9e4d-2f201078feae,,Atención ambulatoria por enfermera(o),"Prestación 137 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. La duración es una decisión operativa local.",20,,,,,35d2234e-129a-4c40-abb2-1ae0b2400001,#9ef0f0 +c8d4f6e2-5b7a-41d9-93e4-7f6a8b3c2d01,,Atención ambulatoria por psicólogo(a),"Prestación 135 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. La duración es una decisión operativa local.",45,,,,9c8b7a6d-5e4f-43c1-9a2b-8d3e6f5c2a10,35d2234e-129a-4c40-abb2-1ae0b2400001,#ffccf2 +a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02,,Atención ambulatoria por obstetra,"Prestación 140 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. Obstetra es una profesión, no la especialidad médica Ginecología y Obstetricia.",30,,,,,35d2234e-129a-4c40-abb2-1ae0b2400001,#ffb3b3 +b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02,,Consulta ambulatoria por cirujano dentista general,"Prestación 142 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. Odontología general es una categoría local de agenda y no la especialidad Cirugía Bucal y Maxilofacial.",30,,,,a0d4e64e-eb63-4271-bdf1-ffa10392c282,35d2234e-129a-4c40-abb2-1ae0b2400001,#b3e0ff +d4e5f6a7-b8c9-41e2-93f3-1a9b8c7d6e04,TRUE,Aplicación de inyectables,"Prestación 520 de la NTS N.° 249-MINSA/DGAIN-2026. Se retira de la agenda hasta que el hospital confirme la UPSS Tópico de Atención en Salud y su cartera habilitada.",15,,,,,35d2234e-129a-4c40-abb2-1ae0b2400001,#ffd699 +e5f6a7b8-c9d0-42f3-93e4-2b0a9c8d7e05,TRUE,Atención de urgencias y emergencias,"Servicio retirado del dominio de citas: emergencia se gestiona como atención inmediata y cola operativa, no como cita programada.",,,,,,35d2234e-129a-4c40-abb2-1ae0b2400003,#ffdd99 +f7a8b9c0-d1e2-43f4-93e5-3b1a9c8d7e06,TRUE,Atención inmediata del recién nacido,"Prestaciones 9 y 10 de la NTS N.° 249-MINSA/DGAIN-2026 en Centro Obstétrico. Se retira de citas porque es una atención inmediata vinculada al parto, no una prestación programable.",30,,,,14106bb7-dad6-4446-809d-737f4c128ae3,35d2234e-129a-4c40-abb2-1ae0b2400004,#e6b3cc +115b9e98-0bb4-4791-afa6-d21d071cfd87,,Hospitalización de cirugía general,"Prestación 296 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Hospitalización. La cita representa el ingreso programado, no la programación de un procedimiento quirúrgico.",60,,,,d8e2f4a0-b5c3-41d7-942a-6c4a1e9f3b22,35d2234e-129a-4c40-abb2-1ae0b2400002,#cce6ff +e6a43c30-71ac-4ec6-9757-c78a50ee8e8b,,Procedimientos de patología clínica,"Agrupador local de agenda para las prestaciones 488 a 493 de la NTS N.° 249-MINSA/DGAIN-2026 que estén habilitadas en la cartera efectiva del hospital.",15,,,,7e5d3c2b-8a9f-41d6-93c4-6b2a1f8e5d07,35d2234e-129a-4c40-abb2-1ae0b2400006,#d9e6cc +70b7402d-fdfe-4707-94d8-5eb5780ffde5,,Ecografía general y Doppler,"Prestación 418 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Diagnóstico por Imágenes. La duración es una decisión operativa local.",30,,,,2b4d6f8a-1c3e-49d5-93a7-8e5f6b3c2d01,35d2234e-129a-4c40-abb2-1ae0b2400013,#e6ccb3 +74156b5c-b1b0-4432-b073-a8af65ebcb11,,Atención en farmacia clínica,"Prestación 440 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Farmacia. La duración es una decisión operativa local.",15,,,,,35d2234e-129a-4c40-abb2-1ae0b2400007,#e6e6fa +dcaa59d1-64f2-45f5-a930-2ccc0ef37e61,,Rehabilitación mediante terapia física,"Agrupador local de agenda alineado con las prestaciones 505 y 506 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Terapias de Medicina Física y de Rehabilitación.",45,,,,a85cfebd-f0ad-465e-859c-ee20ded8fa90,35d2234e-129a-4c40-abb2-1ae0b2400010,#c8f7c5 +89bde58b-2161-4095-8e52-0d8b5003012b,,Hemodiálisis,"Prestación 433 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Diálisis. La duración es una decisión operativa local.",240,,,,e8a5a5bb-60f4-42e6-a96f-fd9da40d5c1a,35d2234e-129a-4c40-abb2-1ae0b2400011,#b8d8ff +3663f478-80fb-4585-b92f-7f82873198ee,,Atención ambulatoria por nutricionista,"Prestación 152 de la NTS N.° 249-MINSA/DGAIN-2026 en la UPSS Consulta Externa. No corresponde a la UPSS Nutrición y Dietética, que atiende soporte nutricional de pacientes hospitalizados.",30,,,,32f2c8e3-79cf-4016-939f-469bed37abdb,35d2234e-129a-4c40-abb2-1ae0b2400001,#d7f0b2 diff --git a/configuration/backend_configuration/appointmentservicetypes/servicetypes.csv b/configuration/backend_configuration/appointmentservicetypes/servicetypes.csv index d84688c..0e0be24 100644 --- a/configuration/backend_configuration/appointmentservicetypes/servicetypes.csv +++ b/configuration/backend_configuration/appointmentservicetypes/servicetypes.csv @@ -1,16 +1 @@ Uuid,Void/Retire,Name,Duration,Service Definition -7016bc77-c80c-4a46-9730-0e63dadfe7af,,Consulta médica general,20,7ba3aa21-cc56-47ca-bb4d-a60549f666c0 -e25f9042-b8c9-4fd6-9023-c322dc930ea4,,Teleconsulta médica,20,1ef43565-9c96-4f58-bfd2-c864c7cedac1 -72d1e17a-db74-493a-8c45-05efb07723a7,,Atención de enfermería,20,4ec5c4fe-cfe0-48ff-9e4d-2f201078feae -2e0925d5-36f0-455b-9b24-f72eeae84bcd,,Consulta psicológica,45,c8d4f6e2-5b7a-41d9-93e4-7f6a8b3c2d01 -f2c75953-5682-43d7-a6a3-6457ccda5ce7,,Consulta obstétrica,30,a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02 -fa4a2d1c-d0bc-4e26-9a59-a5dd9a8fea91,,Consulta odontológica,30,b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02 -dbf4e832-0527-46f2-aa5a-76d7a9d1151a,,Procedimiento de tópico,15,d4e5f6a7-b8c9-41e2-93f3-1a9b8c7d6e04 -7dc58699-5960-4f4c-b260-2ded1d410c8d,,Atención inmediata neonatal,30,f7a8b9c0-d1e2-43f4-93e5-3b1a9c8d7e06 -b263e87b-60a3-4d5a-afcd-988d93216fd4,,Programación quirúrgica,60,115b9e98-0bb4-4791-afa6-d21d071cfd87 -93d94dd0-4ef9-4749-b936-670438879bb1,,Procedimiento de laboratorio,15,e6a43c30-71ac-4ec6-9757-c78a50ee8e8b -bac05992-8ab4-4dd8-87ea-464ec4898561,,Estudio de imágenes,30,70b7402d-fdfe-4707-94d8-5eb5780ffde5 -898a6dfb-aaea-40fb-97b7-95935c2b5eec,,Atención farmacéutica,15,74156b5c-b1b0-4432-b073-a8af65ebcb11 -f94a040f-b6e5-4315-927c-84058f3eeba4,,Terapia de rehabilitación,45,dcaa59d1-64f2-45f5-a930-2ccc0ef37e61 -6c84de9c-117e-4778-9415-d01e5653da51,,Sesión de hemodiálisis,240,89bde58b-2161-4095-8e52-0d8b5003012b -04f3ac2f-6bfa-4807-8ef3-72164d69d6eb,,Consulta nutricional,30,3663f478-80fb-4585-b92f-7f82873198ee diff --git a/configuration/backend_configuration/appointmentspecialities/specialities.csv b/configuration/backend_configuration/appointmentspecialities/specialities.csv index 4a65820..eaf224f 100644 --- a/configuration/backend_configuration/appointmentspecialities/specialities.csv +++ b/configuration/backend_configuration/appointmentspecialities/specialities.csv @@ -7,6 +7,7 @@ d8e2f4a0-b5c3-41d7-942a-6c4a1e9f3b22,,Cirugía General a3b5c7e1-2f4d-46e8-9c12-8d7e4f6a2b09,,Traumatología y Ortopedia 8d2e4f6a-1b3c-49d7-95a2-7f3e8b6c5d10,,Anestesiología 4e6f8d2c-3a5b-495e-9d78-2f4c6a8b1e09,,Cirugía Bucal y Maxilofacial +a0d4e64e-eb63-4271-bdf1-ffa10392c282,,Odontología general f5d7e8c3-2a4b-49d6-8e1f-7b3a9c6d2e01,,Enfermedades Infecciosas y Tropicales 9c8b7a6d-5e4f-43c1-9a2b-8d3e6f5c2a10,,Salud Mental 2b4d6f8a-1c3e-49d5-93a7-8e5f6b3c2d01,,Radiología e Imagenología diff --git a/configuration/backend_configuration/attributetypes/attribute_types.csv b/configuration/backend_configuration/attributetypes/attribute_types.csv index 2ddfdba..6d09312 100644 --- a/configuration/backend_configuration/attributetypes/attribute_types.csv +++ b/configuration/backend_configuration/attributetypes/attribute_types.csv @@ -10,7 +10,6 @@ ae865c38-69b3-4efe-bbd5-d991d2f8c8e6,,Visit,Resultado de Consulta SIS,"Código y d5c1a044-c1fb-47f8-a372-2950cd7fa961,,Visit,EESS SIS Asignado,"Código REANES y nombre del establecimiento SIS asignado usado como contexto administrativo de esta visita.",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, b3edab1d-9d01-4375-9ef4-f495bfe95ccf,,Visit,Referencia de Establecimiento,"Código o nombre del establecimiento de salud que refirió al paciente a esta visita.",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 9b640334-69e7-49a8-bc8d-1a379742f2f1,,Visit,Procedencia,"Localidad o dirección administrativa desde donde procede el paciente para esta visita. Se prellena desde la residencia del paciente y puede ajustarse para la atención.",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, -d6c9e7a5-8134-49e3-a2c5-b8f4c3d2e1a9,,Visit,Parent Visit Type,"UUID del tipo de visita padre para establecer jerarquía entre tipos de consulta",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 0da4d3db-4385-40de-a4b0-fd8d89c4ec10,,Provider,Número de Colegiatura,"Número de Colegiatura del médico",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 08b7f0cb-907f-437f-a8da-85236f7b924e,,Provider,Labor Desempeñado,"Labor que desempeña la persona",0,3,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 0d52f06d-6cfa-45ae-b197-015d85e9a438,,Provider,Profesión,"Profesión de la persona",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, @@ -27,6 +26,7 @@ a5c42cf5-89d6-4d32-bfe7-042f2fb425d0,,Provider,Fecha de Nacimiento,"Fecha de nac eb9f8b26-bb80-4197-8104-5190cf0a3a7a,,Provider,Sexo,"Sexo del profesional de salud según registro de identificación",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, b3c974f3-bc1f-4e8a-840c-59d68b0428b1,,Provider,Denominación de Especialidad,"Denominación de la especialidad del profesional de salud",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 3f46dee0-0abf-4475-a750-b7545612767f,,Provider,Número de Registro Nacional de Especialidad,"Número de Registro Nacional de Especialidad (RNE) del profesional de salud",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, +3961cbdd-3240-4b70-99ca-5f63af488b15,,Provider,Categorías de agenda habilitadas,"UUID de una categoría AppointmentSpeciality habilitada para el profesional. Es un mapping operativo local y no sustituye la especialidad ni el RNE oficiales.",0,,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 452bef6c-1e24-4229-bf6e-0f0d4f2a4d26,,Provider,Estado de Habilitación,"Estado de habilitación o no habilitación del profesional de salud",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 1fdeab72-48dc-4dd0-b082-245242500baf,,Provider,Fecha de Inicio Laboral,"Fecha de inicio de la relación laboral o contractual del profesional en la IPRESS",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, f94ad034-2a3d-45d0-8406-015efcc32064,,Provider,Fecha de Finalización Laboral,"Fecha de finalización de la relación laboral o contractual del profesional en la IPRESS",0,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, diff --git a/configuration/backend_configuration/billableservices/billableservices.csv b/configuration/backend_configuration/billableservices/billableservices.csv index 96b06b6..e3eb921 100644 --- a/configuration/backend_configuration/billableservices/billableservices.csv +++ b/configuration/backend_configuration/billableservices/billableservices.csv @@ -1,8 +1,8 @@ Uuid,Void/Retire,service name,Description,Service Type,Service Status,Concept,Stockable,Price,_order:1000 -5689a516-f9e4-4a88-b068-2ac0d132953e,,Consulta Ambulatoria - Medicina General,Consulta ambulatoria por médico general (UPSS Consulta Externa),SERVICE,ENABLED,,false,, -e89cec1e-b5d0-448c-b04e-33473719ac51,,Consulta Ambulatoria - Obstetricia,Consulta ambulatoria por obstetra,SERVICE,ENABLED,,false,, -4b63bdcd-3c22-4c22-8c3e-877c95a0608b,,Consulta Ambulatoria - Psicología,Consulta ambulatoria por psicólogo(a),SERVICE,ENABLED,,false,, -94333ebf-b684-46df-8619-947143cc8330,,Consulta Ambulatoria - Odontología,Consulta ambulatoria por cirujano dentista,SERVICE,ENABLED,,false,, +5689a516-f9e4-4a88-b068-2ac0d132953e,,Consulta por médico general,Consulta ambulatoria por médico general (UPSS Consulta Externa),SERVICE,ENABLED,,false,, +e89cec1e-b5d0-448c-b04e-33473719ac51,,Consulta por obstetra,Atención ambulatoria por obstetra (UPSS Consulta Externa),SERVICE,ENABLED,,false,, +4b63bdcd-3c22-4c22-8c3e-877c95a0608b,,Consulta por psicólogo(a),Atención ambulatoria por psicólogo(a) (UPSS Consulta Externa),SERVICE,ENABLED,,false,, +94333ebf-b684-46df-8619-947143cc8330,,Consulta por cirujano dentista general,Consulta ambulatoria por cirujano dentista general (UPSS Consulta Externa),SERVICE,ENABLED,,false,, f9a415bf-3209-45c8-b61f-5a7eb2a02875,,Atención de Emergencia,Atención en urgencias y emergencias,SERVICE,ENABLED,,false,, 572914fc-cdc0-4a2d-8e6d-406961a87e61,,Hospitalización - Día/Cama,Servicio de hospitalización por día-cama,SERVICE,ENABLED,,false,, ab2565cd-a401-432c-abcf-dd36be2e03f8,,Procedimiento de Laboratorio,Procedimientos de laboratorio clínico tipo II-1,SERVICE,ENABLED,,false,, diff --git a/configuration/backend_configuration/concepts/queue_service_concepts.csv b/configuration/backend_configuration/concepts/queue_service_concepts.csv new file mode 100644 index 0000000..f6dc41f --- /dev/null +++ b/configuration/backend_configuration/concepts/queue_service_concepts.csv @@ -0,0 +1,13 @@ +Uuid,Void/Retire,Fully specified name:es,Fully specified name:en,Short name:es,Short name:en,Description:es,Data class,Data type,_version:1,_order:1000 +b866f130-b413-417f-ad5b-5b65daadbcf5,,Servicio de cola de admisión SIH.SALUS,SIH.SALUS admission queue service,Admisión,Admission,Flujo operativo de espera para admisión de pacientes.,Misc,N/A,, +51ce03e2-8987-4431-9e42-f8adca946c2c,,Servicio de cola de consulta externa SIH.SALUS,SIH.SALUS outpatient care queue service,Consulta externa,Outpatient care,Flujo operativo compartido de espera dentro de la UPSS Consulta Externa.,Misc,N/A,, +69d1f46b-c4cb-4760-afd2-d186c127f6ba,,Servicio de cola de farmacia SIH.SALUS,SIH.SALUS pharmacy queue service,Farmacia,Pharmacy,Flujo operativo de espera para la UPSS Farmacia.,Misc,N/A,, +5b3fc3a4-99a0-40ec-a1e2-058a032619c9,,Servicio de cola de patología clínica SIH.SALUS,SIH.SALUS clinical pathology queue service,Patología clínica,Clinical pathology,Flujo operativo de espera para la UPSS Patología Clínica.,Misc,N/A,, +0e4aef19-d959-42e3-bf0b-853d3296ed59,,Servicio de cola de hospitalización SIH.SALUS,SIH.SALUS hospitalization queue service,Hospitalización,Hospitalization,Flujo operativo de espera para ingresos a hospitalización.,Misc,N/A,, +e19800e7-c5a4-44b4-813d-04ad686e8151,,Servicio de cola de emergencia SIH.SALUS,SIH.SALUS emergency queue service,Emergencia,Emergency,Flujo operativo de triaje y atención dentro de la UPSS Emergencia.,Misc,N/A,, +44a5c416-af63-40f6-8167-f283f40fcab0,,Servicio de cola de centro obstétrico SIH.SALUS,SIH.SALUS obstetric center queue service,Centro obstétrico,Obstetric center,Flujo operativo del Centro Obstétrico; no representa la consulta ambulatoria por obstetra.,Misc,N/A,, +242d6a36-c921-4ad8-971e-89cf39df525d,,Servicio de cola de centro quirúrgico SIH.SALUS,SIH.SALUS surgical center queue service,Centro quirúrgico,Surgical center,Flujo operativo de procedimientos en Centro Quirúrgico; no representa la hospitalización.,Misc,N/A,, +d0dc9239-a16f-4efb-a313-4b9135dca233,,Servicio de cola de diagnóstico por imágenes SIH.SALUS,SIH.SALUS diagnostic imaging queue service,Diagnóstico por imágenes,Diagnostic imaging,Flujo operativo de espera para la UPSS Diagnóstico por Imágenes.,Misc,N/A,, +0e56ea09-42ea-4f66-ad53-76cbc770dcfa,,Servicio de cola de atención nutricional ambulatoria SIH.SALUS,SIH.SALUS outpatient nutrition queue service,Atención nutricional,Outpatient nutrition,Flujo operativo de atención ambulatoria por nutricionista dentro de Consulta Externa.,Misc,N/A,, +e771ce10-6edd-4d17-a54c-e5de0762b7c7,,Servicio de cola de rehabilitación SIH.SALUS,SIH.SALUS rehabilitation queue service,Rehabilitación,Rehabilitation,Flujo operativo de espera para Terapias de Medicina Física y de Rehabilitación.,Misc,N/A,, +c10289d4-0f22-4f0e-8242-1835259404d5,,Servicio de cola de hemodiálisis SIH.SALUS,SIH.SALUS hemodialysis queue service,Hemodiálisis,Hemodialysis,Flujo operativo de espera para hemodiálisis dentro de la UPSS Diálisis.,Misc,N/A,, diff --git a/configuration/backend_configuration/conceptsets/queue_service_concepts.csv b/configuration/backend_configuration/conceptsets/queue_service_concepts.csv new file mode 100644 index 0000000..dad8dde --- /dev/null +++ b/configuration/backend_configuration/conceptsets/queue_service_concepts.csv @@ -0,0 +1,13 @@ +Concept,Member,Member Type,Sort Weight,_version:1,_order:1000 +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,b866f130-b413-417f-ad5b-5b65daadbcf5,concept-set,100,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,51ce03e2-8987-4431-9e42-f8adca946c2c,concept-set,110,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,69d1f46b-c4cb-4760-afd2-d186c127f6ba,concept-set,120,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,5b3fc3a4-99a0-40ec-a1e2-058a032619c9,concept-set,130,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,0e4aef19-d959-42e3-bf0b-853d3296ed59,concept-set,140,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,e19800e7-c5a4-44b4-813d-04ad686e8151,concept-set,150,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,44a5c416-af63-40f6-8167-f283f40fcab0,concept-set,160,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,242d6a36-c921-4ad8-971e-89cf39df525d,concept-set,170,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,d0dc9239-a16f-4efb-a313-4b9135dca233,concept-set,180,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,0e56ea09-42ea-4f66-ad53-76cbc770dcfa,concept-set,190,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,e771ce10-6edd-4d17-a54c-e5de0762b7c7,concept-set,200,, +4bf3f465-ac91-44fa-9b1f-173daf0c89a0,c10289d4-0f22-4f0e-8242-1835259404d5,concept-set,210,, diff --git a/configuration/backend_configuration/encountertypes/encountertypes.csv b/configuration/backend_configuration/encountertypes/encountertypes.csv index b8a741b..ba03c89 100644 --- a/configuration/backend_configuration/encountertypes/encountertypes.csv +++ b/configuration/backend_configuration/encountertypes/encountertypes.csv @@ -1,6 +1,6 @@ Uuid,Void/Retire,Name,Description,View privilege,Edit privilege,_order:1000 186c1e78-a99f-4cd0-86de-b8c4ee27a2b5,,Consulta Externa,"Atención ambulatoria en consultorio médico para diagnóstico y tratamiento. Basado en la NTS N° 029-MINSA.",,, -e137c4de-8dbe-4d32-9a76-35f7d1b17f45,,Consulta Especializada,"Consulta en especialidades médicas como cardiología, neumología, pediatría, etc. Basado en la NTS N° 040-MINSA.",,, +e137c4de-8dbe-4d32-9a76-35f7d1b17f45,,Consulta Especializada,"Evento clínico de consulta especializada. No identifica cuál especialidad fue atendida; esa categoría se conserva en el servicio de cita y el profesional.",,, 67a71486-1a54-468f-ac3e-7091a9a79584,,Triaje,"Evaluación inicial de signos vitales y clasificación del paciente según urgencia. Basado en la NTS N° 021-MINSA.",,, 20d4a603-8472-484c-b2bf-b45bdecf6b4f,,Registro de signos vitales y antropometría,"Registro longitudinal de funciones vitales y mediciones antropométricas desde la historia clínica, separado de la clasificación de emergencia. Alineado con la NTS N° 139-MINSA/2018/DGAIN.",app:hoja.clinica.signosVitales,app:hoja.clinica.signosVitales.editar, 978deb64-358e-4c78-bbb0-04cea73df805,,Triaje de Emergencia,"Clasificación clínica inicial por prioridad dentro del servicio de emergencia. Basado en la NT N° 042-MINSA/DGSP-V.01.",app:home.emergencia,app:home.emergencia.editar, diff --git a/configuration/backend_configuration/locations/sihsalus-locations.csv b/configuration/backend_configuration/locations/sihsalus-locations.csv index 6cdeda4..6b194a6 100644 --- a/configuration/backend_configuration/locations/sihsalus-locations.csv +++ b/configuration/backend_configuration/locations/sihsalus-locations.csv @@ -2,18 +2,18 @@ Uuid,Void/Retire,Name,Description,Parent,Tag|Login Location,Tag|Visit Location,T 35d2234e-129a-4c40-abb2-1ae0b72c1602,FALSE,Hospital Santa Clotilde,Establecimiento de salud principal que brinda servicios integrales de atención en la región Napo de Loreto.,,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,LORETO,,,,,,SANTA CLOTILDE,NAPO,LORETO,,PERU, 35d2234e-129a-4c40-abb2-1ae0b72c1603,FALSE,Casita Azul,"Clínica ambulatoria afiliada al Hospital Santa Clotilde, que ofrece atención primaria y servicios médicos básicos.",,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,LORETO,,,,,,SANTA CLOTILDE,NAPO,LORETO,,PERU, 35d2234e-129a-4c40-abb2-1ae0b2400001,FALSE,UPSS - CONSULTA EXTERNA,Unidad productora de servicios de salud de consulta externa del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, -35d2234e-129a-4c40-abb2-1ae0b2400002,FALSE,UPSS - HOSPITALIZACIÓN,Unidad productora de servicios de salud de hospitalización del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,,,,,,,,,,,, +35d2234e-129a-4c40-abb2-1ae0b2400002,FALSE,UPSS - HOSPITALIZACIÓN,Unidad productora de servicios de salud de hospitalización del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400003,FALSE,UPSS - EMERGENCIA,Unidad productora de servicios de salud de emergencia del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,,,,,,,,,,,, -35d2234e-129a-4c40-abb2-1ae0b2400004,FALSE,UPSS - CENTRO OBSTÉTRICO,Unidad productora de servicios de salud de centro obstétrico del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, -35d2234e-129a-4c40-abb2-1ae0b2400005,FALSE,UPSS - CENTRO QUIRÚRGICO,Unidad productora de servicios de salud de centro quirúrgico del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, +35d2234e-129a-4c40-abb2-1ae0b2400004,FALSE,UPSS - CENTRO OBSTÉTRICO,Unidad productora de servicios de salud de centro obstétrico del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,,,,,,,,,,,, +35d2234e-129a-4c40-abb2-1ae0b2400005,FALSE,UPSS - CENTRO QUIRÚRGICO,Unidad productora de servicios de salud de centro quirúrgico del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400006,FALSE,UPSS - PATOLOGÍA CLÍNICA,Unidad productora de servicios de salud de patología clínica del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400013,FALSE,UPSS - DIAGNÓSTICO POR IMÁGENES,Unidad productora de servicios de salud de diagnóstico por imágenes del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400008,FALSE,UPSS - ANATOMÍA PATOLÓGICA,Unidad productora de servicios de salud de anatomía patológica del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400007,FALSE,UPSS - FARMACIA,Unidad productora de servicios de salud de farmacia del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400009,FALSE,UPSS - CENTRAL DE ESTERILIZACIÓN,Unidad productora de servicios de salud de soporte para desinfección y esterilización de material médico del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400010,FALSE,UPSS - MEDICINA DE REHABILITACIÓN,Unidad productora de servicios de salud de medicina de rehabilitación del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, -35d2234e-129a-4c40-abb2-1ae0b2400011,FALSE,UPSS - HEMODIÁLISIS,Unidad productora de servicios de salud de hemodiálisis del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, -35d2234e-129a-4c40-abb2-1ae0b2400012,FALSE,UPSS - NUTRICIÓN Y DIETÉTICA,Unidad productora de servicios de salud de nutrición y dietética del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, +35d2234e-129a-4c40-abb2-1ae0b2400011,FALSE,UPSS - DIÁLISIS,Unidad productora de servicios de salud de diálisis del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,,,,,,,,,,,, +35d2234e-129a-4c40-abb2-1ae0b2400012,FALSE,UPSS - NUTRICIÓN Y DIETÉTICA,Unidad productora de soporte nutricional y dietético para pacientes hospitalizados del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2400113,FALSE,UPSS - SERVICIOS ADMINISTRATIVOS,Unidad de servicios administrativos del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,,,,,,,,,,,, 35d2234e-129a-4c40-abb2-1ae0b2270304,FALSE,UPS - Telemedicina,Unidad productora de servicios de telemedicina del Hospital Santa Clotilde.,Hospital Santa Clotilde,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,,,,,,,,,,,, c46622d7-f43a-4d70-b515-ae871cef08e1,FALSE,Sala Varones Adultos,"Sala de hospitalización para varones adultos - 10 camas (Gobierno Regional de Loreto, 2023)",UPSS - HOSPITALIZACIÓN,FALSE,TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,,,,,,,,,,,, diff --git a/configuration/backend_configuration/queues/sihsalus-queues.csv b/configuration/backend_configuration/queues/sihsalus-queues.csv index 57a64f0..6c47d13 100644 --- a/configuration/backend_configuration/queues/sihsalus-queues.csv +++ b/configuration/backend_configuration/queues/sihsalus-queues.csv @@ -1,19 +1,19 @@ Uuid,Void/Retire,Name,Description,Service,Status Concept Set,Priority Concept Set,Location -a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6,,Cola de Admisión Hospital,Cola para atención de admisión de pacientes en el hospital,7ba3aa21-cc56-47ca-bb4d-a60549f666c0,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b72c1602 -b2c3d4e5-f6a7-48b9-c0d1-e2f3a4b5c6d7,,Cola de Admisión Casita Azul,Cola para atención de admisión de pacientes en Casita Azul,7ba3aa21-cc56-47ca-bb4d-a60549f666c0,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b72c1603 +a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6,,Cola de Admisión Hospital,Cola para atención de admisión de pacientes en el hospital,b866f130-b413-417f-ad5b-5b65daadbcf5,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b72c1602 +b2c3d4e5-f6a7-48b9-c0d1-e2f3a4b5c6d7,,Cola de Admisión Casita Azul,Cola para atención de admisión de pacientes en Casita Azul,b866f130-b413-417f-ad5b-5b65daadbcf5,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b72c1603 c3d4e5f6-a7b8-49c0-d1e2-f3a4b5c6d7e8,,Cola de Triaje,Cola de triaje genérica para clasificación de pacientes,ea771a12-c8e4-49fd-a09c-6d6d8796aaa4,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b72c1602 -d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,,Cola de Consulta Externa,Cola de consulta externa especializada,7ba3aa21-cc56-47ca-bb4d-a60549f666c0,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400001 -e5f6a7b8-c9d0-41e2-f3a4-b5c6d7e8f9a0,,Cola de Farmacia,Cola para atención farmacéutica y dispensación de medicamentos,74156b5c-b1b0-4432-b073-a8af65ebcb11,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400007 -f6a7b8c9-d0e1-42f3-a4b5-c6d7e8f9a0b1,,Cola de Laboratorio,Cola para procedimientos de laboratorio clínico tipo II-1,e6a43c30-71ac-4ec6-9757-c78a50ee8e8b,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400006 -a7b8c9d0-e1f2-43a4-b5c6-d7e8f9a0b1c2,,Cola de Hospitalización,Cola para gestión de ingresos y atención hospitalaria,115b9e98-0bb4-4791-afa6-d21d071cfd87,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400002 -b8c9d0e1-f2a3-44b5-c6d7-e8f9a0b1c2d3,,Cola de Emergencia,Cola para atención inmediata en urgencias y emergencias,e5f6a7b8-c9d0-42f3-93e4-2b0a9c8d7e05,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400003 -c9d0e1f2-a3b4-45c6-d7e8-f9a0b1c2d3e4,,Cola de Centro Obstétrico,Cola para atención de obstetricia y cuidado maternal,a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400004 -d0e1f2a3-b4c5-46d7-e8f9-a0b1c2d3e4f5,,Cola de Centro Quirúrgico,Cola para procedimientos quirúrgicos programados,115b9e98-0bb4-4791-afa6-d21d071cfd87,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400005 -e1f2a3b4-c5d6-47e8-f9a0-b1c2d3e4f5a6,,Cola de Diagnóstico por Imágenes,Cola para estudios de ecografía general y Doppler,70b7402d-fdfe-4707-94d8-5eb5780ffde5,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400013 +d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,,Cola de Consulta Externa,Cola compartida para prestaciones ambulatorias dentro de la UPSS Consulta Externa,51ce03e2-8987-4431-9e42-f8adca946c2c,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400001 +e5f6a7b8-c9d0-41e2-f3a4-b5c6d7e8f9a0,,Cola de Farmacia,Cola para atención farmacéutica y dispensación de medicamentos,69d1f46b-c4cb-4760-afd2-d186c127f6ba,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400007 +f6a7b8c9-d0e1-42f3-a4b5-c6d7e8f9a0b1,,Cola de Patología Clínica,Cola para procedimientos de la cartera habilitada de patología clínica,5b3fc3a4-99a0-40ec-a1e2-058a032619c9,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400006 +a7b8c9d0-e1f2-43a4-b5c6-d7e8f9a0b1c2,,Cola de Hospitalización,Cola para gestión de ingresos y atención hospitalaria,0e4aef19-d959-42e3-bf0b-853d3296ed59,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400002 +b8c9d0e1-f2a3-44b5-c6d7-e8f9a0b1c2d3,,Cola de Emergencia,Cola para atención inmediata en urgencias y emergencias,e19800e7-c5a4-44b4-813d-04ad686e8151,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400003 +c9d0e1f2-a3b4-45c6-d7e8-f9a0b1c2d3e4,,Cola de Centro Obstétrico,Cola del flujo intrahospitalario de centro obstétrico,44a5c416-af63-40f6-8167-f283f40fcab0,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400004 +d0e1f2a3-b4c5-46d7-e8f9-a0b1c2d3e4f5,,Cola de Centro Quirúrgico,Cola para procedimientos dentro del centro quirúrgico,242d6a36-c921-4ad8-971e-89cf39df525d,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400005 +e1f2a3b4-c5d6-47e8-f9a0-b1c2d3e4f5a6,,Cola de Diagnóstico por Imágenes,Cola para estudios de ecografía general y Doppler,d0dc9239-a16f-4efb-a313-4b9135dca233,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400013 f2a3b4c5-d6e7-48f9-a0b1-c2d3e4f5a6b7,,Cola de Anatomía Patológica,Cola para análisis de tejidos y diagnósticos patológicos,abe0d9a9-5b90-4029-b2bc-c3077c57c884,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400008 a3b4c5d6-e7f8-49a0-b1c2-d3e4f5a6b7c8,TRUE,Cola de Central de Esterilización,Cola retirada: Central de Esterilización es UPSS de soporte interno y no cola de atención de pacientes.,0f819fa7-864f-4f60-a50a-03d0b82daa73,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400009 -b4c5d6e7-f8a9-40b1-c2d3-e4f5a6b7c8d9,,Cola de Medicina de Rehabilitación,Cola para terapias y recuperación de pacientes,51a0ef18-9fba-48c3-9e0e-9b0b6dcd3410,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400010 -c5d6e7f8-a9b0-41c2-d3e4-f5a6b7c8d9e0,,Cola de Hemodiálisis,Cola para tratamiento de diálisis renal,f888bfc1-1f38-47e3-8470-758a011ff6a3,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400011 -d6e7f8a9-b0c1-42d3-e4f5-a6b7c8d9e0f1,,Cola de Nutrición y Dietética,Cola para gestión de necesidades dietéticas de pacientes,5ef1c8d7-ce23-458a-9a11-4b8562c25e10,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400012 -b1c5bb01-d78f-4f7e-b66d-b8bfe6887cf0,,Cola de Triaje de Emergencia,Cola de pre-triaje de emergencia: clasificación inicial Emergencia/Urgencia previa a la toma de signos vitales según NT N° 042-MINSA,e5f6a7b8-c9d0-42f3-93e4-2b0a9c8d7e05,a10612bc-373d-44cf-8a1a-277e65f7fcf9,3f4db8e2-241c-45ef-8e52-cea8dc4118f0,35d2234e-129a-4c40-abb2-1ae0b2400003 -ebd44a3d-9ecd-47a0-aa49-1279386b3ffe,,Cola de Atención de Emergencia,Cola de atención de emergencia post-triaje con prioridades I-IV según NT N° 042-MINSA,e5f6a7b8-c9d0-42f3-93e4-2b0a9c8d7e05,a10612bc-373d-44cf-8a1a-277e65f7fcf9,933e6d55-d64a-498d-b1b2-b3d5242e4199,35d2234e-129a-4c40-abb2-1ae0b2400003 +b4c5d6e7-f8a9-40b1-c2d3-e4f5a6b7c8d9,,Cola de Rehabilitación,Cola para terapias y recuperación de pacientes,e771ce10-6edd-4d17-a54c-e5de0762b7c7,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400010 +c5d6e7f8-a9b0-41c2-d3e4-f5a6b7c8d9e0,,Cola de Hemodiálisis,Cola para tratamiento de diálisis renal,c10289d4-0f22-4f0e-8242-1835259404d5,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400011 +d6e7f8a9-b0c1-42d3-e4f5-a6b7c8d9e0f1,,Cola de Atención Nutricional,Cola dedicada a la atención ambulatoria por nutricionista dentro de la UPSS Consulta Externa,0e56ea09-42ea-4f66-ad53-76cbc770dcfa,a10612bc-373d-44cf-8a1a-277e65f7fcf9,d736c954-601f-4d8b-b778-6df7f3ed3767,35d2234e-129a-4c40-abb2-1ae0b2400001 +b1c5bb01-d78f-4f7e-b66d-b8bfe6887cf0,,Cola de Triaje de Emergencia,Cola de pre-triaje de emergencia: clasificación inicial Emergencia/Urgencia previa a la toma de signos vitales según NT N° 042-MINSA,e19800e7-c5a4-44b4-813d-04ad686e8151,a10612bc-373d-44cf-8a1a-277e65f7fcf9,3f4db8e2-241c-45ef-8e52-cea8dc4118f0,35d2234e-129a-4c40-abb2-1ae0b2400003 +ebd44a3d-9ecd-47a0-aa49-1279386b3ffe,,Cola de Atención de Emergencia,Cola de atención de emergencia post-triaje con prioridades I-IV según NT N° 042-MINSA,e19800e7-c5a4-44b4-813d-04ad686e8151,a10612bc-373d-44cf-8a1a-277e65f7fcf9,933e6d55-d64a-498d-b1b2-b3d5242e4199,35d2234e-129a-4c40-abb2-1ae0b2400003 diff --git a/configuration/backend_configuration/visittypes/sihsalus-visittypes.csv b/configuration/backend_configuration/visittypes/sihsalus-visittypes.csv index 9675e8e..72784c7 100644 --- a/configuration/backend_configuration/visittypes/sihsalus-visittypes.csv +++ b/configuration/backend_configuration/visittypes/sihsalus-visittypes.csv @@ -1,32 +1,6 @@ -Uuid,Void/Retire,Name,Description,_version:1,Parent Visit Type -b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,,Consulta Ambulatoria,"Atención ambulatoria en consultorio médico para cuidados generales o especializados, sin requerir hospitalización. Referenciado en la NTS N° 035-MINSA.",1, -23939157-9af0-457b-8f6c-211eb5459311,,Sesión Grupal Ambulatoria,"Atención ambulatoria grupal para sesiones educativas, preventivas o de seguimiento clínico, sin requerir hospitalización. Usado por Fast Data Entry para flujos grupales.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -f70a865a-6cae-4d04-8d05-acb5bf88fa16,,Consulta Ambulatoria - Medicina General,"Consulta ambulatoria de medicina general para atención integral del paciente.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -00d5ce5a-5211-4dfb-b9dd-d551bc7d1afd,,Consulta Ambulatoria - Ginecología,"Consulta ambulatoria especializada en ginecología para atención de la salud reproductiva femenina.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -19fa588e-3185-41c2-a5d1-21c3a4af944b,,Consulta Ambulatoria - Obstetricia,"Consulta ambulatoria especializada en obstetricia para control prenatal y atención del embarazo.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -ae40aab4-c57d-4bb1-a27e-2cacc24dd07f,,Consulta Ambulatoria - Odontología,"Consulta ambulatoria especializada en odontología para atención de salud bucal y dental.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -61e8b805-136e-44fa-ac81-7a5ccd65f881,,Consulta Ambulatoria - Pediatría,"Consulta ambulatoria especializada en pediatría para atención de niños y adolescentes.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -54cd95e3-5fdf-4339-b717-3c649b0cad0c,,Consulta Ambulatoria - Cardiología,"Consulta ambulatoria especializada en cardiología para atención de enfermedades cardiovasculares.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -dfd5a7e3-f61e-4275-af45-70eff9070c4b,,Consulta Ambulatoria - Neurología,"Consulta ambulatoria especializada en neurología para atención de enfermedades del sistema nervioso.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -e3045dfa-22c5-4bec-8856-46e3faab996a,,Consulta Ambulatoria - Oncología,"Consulta ambulatoria especializada en oncología para atención de enfermedades neoplásicas.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -560864ec-38ef-4c51-9b22-ec10de234f57,,Consulta Ambulatoria - Psicología,"Consulta ambulatoria especializada en psicología para atención de salud mental.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -794d8ac5-924e-455a-bbdc-365c1ef009f7,,Consulta Ambulatoria - Psiquiatría,"Consulta ambulatoria especializada en psiquiatría para atención de trastornos mentales.",1,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09 -e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5,,Hospitalización,"Servicio de hospitalización que requiere el internamiento del paciente para recibir tratamientos médicos o quirúrgicos. Conforme a la NTS N° 032-MINSA.",1, -f8238c67-4514-46d2-87d0-330b64c7638e,,Hospitalización - Medicina Interna,"Hospitalización en servicio de medicina interna para tratamiento de patologías médicas complejas.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76311,,Hospitalización - Cirugía General,"Hospitalización en servicio de cirugía general para procedimientos quirúrgicos.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76312,,Hospitalización - Ginecología,"Hospitalización en servicio de ginecología para tratamientos especializados en salud femenina.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76313,,Hospitalización - Obstetricia,"Hospitalización en servicio de obstetricia para atención del parto y complicaciones obstétricas.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76314,,Hospitalización - Pediatría,"Hospitalización en servicio de pediatría para tratamiento de enfermedades infantiles.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76315,,Hospitalización - Neonatología,"Hospitalización en servicio de neonatología para atención de recién nacidos.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76316,,Hospitalización - UCI Adultos,"Hospitalización en unidad de cuidados intensivos para pacientes adultos críticos.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -f8238c67-4514-46d2-87d0-330b64c76317,,Hospitalización - UCI Pediátrica,"Hospitalización en unidad de cuidados intensivos pediátrica para niños en estado crítico.",1,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5 -c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98,,Emergencia,"Servicio de emergencia para atención inmediata en casos agudos o críticos, sin internamiento hospitalario. Conforme a la NT N° 042-MINSA/DGSP-V.01.",1, -c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c00,,Emergencia - Trauma Shock,"Atención de emergencia en unidad de trauma shock para casos críticos y politraumatizados.",1,c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98 -c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c01,,Emergencia - Medicina,"Atención de emergencia médica para patologías agudas no quirúrgicas.",1,c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98 -c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c02,,Emergencia - Cirugía,"Atención de emergencia quirúrgica para casos que requieren intervención inmediata.",1,c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98 -c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c03,,Emergencia - Pediatría,"Atención de emergencia pediátrica para casos agudos en niños y adolescentes.",1,c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98 -c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c04,,Emergencia - Obstetricia,"Atención de emergencia obstétrica para complicaciones del embarazo y parto.",1,c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98 -110001d9-7f3a-4e7b-91a2-580b216a7c42,,Dispensación de Medicamentos,"Servicio de farmacia encargado de la dispensación y control de medicamentos conforme a las prescripciones médicas. Según la NTS N° 139-MINSA.",1, -b52d05db-61de-403a-b4f0-ace71295798e,,Procedimientos Especializados,"Servicio central de esterilización para el procesamiento, desinfección y esterilización de materiales médicos y quirúrgicos. Conforme a la NTS N° 080-MINSA.",1, -04ffb8cf-1761-42bb-9881-1150fdfbbc2d,,Consulta Diagnóstica,"Servicio de patología clínica que realiza análisis de muestras biológicas para apoyar el diagnóstico de enfermedades. Según la NTS N° 025-MINSA.",1, -c80410d7-e0cb-488f-9b23-be78bd244548,,Atención Extramural,"Atención de salud realizada fuera del establecimiento, en comunidades, domicilios o brigadas itinerantes. Conforme a la NTS N° 030-MINSA.",1, +Uuid,Void/Retire,Name,Description,_version:1 +b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,,Atención Ambulatoria,"Ámbito de atención sin hospitalización. El servicio, la prestación y la categoría de agenda se conservan fuera de VisitType.",1 +23939157-9af0-457b-8f6c-211eb5459311,,Sesión Grupal Ambulatoria,"Ámbito ambulatorio para una sesión clínica grupal. No representa una especialidad.",1 +e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5,,Hospitalización,"Ámbito de atención que requiere ingreso y permanencia en una UPSS Hospitalización.",1 +c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98,,Emergencia,"Ámbito de atención inmediata en una UPSS Emergencia. Conforme a la NT N° 042-MINSA/DGSP-V.01.",1 +c80410d7-e0cb-488f-9b23-be78bd244548,,Atención Extramural,"Ámbito de atención realizado fuera del establecimiento de salud.",1 diff --git a/configuration/frontend_configuration/config.json b/configuration/frontend_configuration/config.json index de13218..6508e38 100644 --- a/configuration/frontend_configuration/config.json +++ b/configuration/frontend_configuration/config.json @@ -1,60 +1,168 @@ { "@sihsalus/esm-appointments-app": { + "appointmentServiceGenderRules": [ + { + "appointmentServiceUuid": "a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02", + "allowedGenders": ["F"] + } + ], + "careRoutingContractVersion": "2026-07-18", "appointmentVisitAttributeTypeUuid": "193508ab-20c6-5291-9f23-0257335eaabd", - "appointmentQueueMappings": [ + "providerSchedulingCategoryValidation": { + "mode": "warn", + "providerAttributeTypeUuid": "3961cbdd-3240-4b70-99ca-5f63af488b15" + }, + "appointmentArrivalRules": [ { "appointmentServiceUuid": "7ba3aa21-cc56-47ca-bb4d-a60549f666c0", "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "queue-optional", "queueUuid": "d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9", "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", - "requiredVisitTypeUuid": "f70a865a-6cae-4d04-8d05-acb5bf88fa16" + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" }, { - "appointmentServiceUuid": "b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02", + "appointmentServiceUuid": "1ef43565-9c96-4f58-bfd2-c864c7cedac1", + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "direct", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" + }, + { + "appointmentServiceUuid": "4ec5c4fe-cfe0-48ff-9e4d-2f201078feae", "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "queue-optional", "queueUuid": "d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9", "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", - "requiredVisitTypeUuid": "ae40aab4-c57d-4bb1-a27e-2cacc24dd07f" + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" + }, + { + "appointmentServiceUuid": "c8d4f6e2-5b7a-41d9-93e4-7f6a8b3c2d01", + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "queue-optional", + "queueUuid": "d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9", + "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" }, { "appointmentServiceUuid": "a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02", - "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400004", - "queueUuid": "c9d0e1f2-a3b4-45c6-d7e8-f9a0b1c2d3e4", - "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400004", - "requiredVisitTypeUuid": "19fa588e-3185-41c2-a5d1-21c3a4af944b" + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "queue-optional", + "queueUuid": "d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9", + "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" + }, + { + "appointmentServiceUuid": "b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02", + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "queue-optional", + "queueUuid": "d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9", + "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" }, { "appointmentServiceUuid": "115b9e98-0bb4-4791-afa6-d21d071cfd87", - "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400005", - "queueUuid": "d0e1f2a3-b4c5-46d7-e8f9-a0b1c2d3e4f5", - "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400005", - "requiredVisitTypeUuid": "f8238c67-4514-46d2-87d0-330b64c76311" + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400002", + "arrivalPolicy": "direct", + "requiredVisitTypeUuid": "e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5" }, { "appointmentServiceUuid": "e6a43c30-71ac-4ec6-9757-c78a50ee8e8b", "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400006", + "arrivalPolicy": "queue-optional", "queueUuid": "f6a7b8c9-d0e1-42f3-a4b5-c6d7e8f9a0b1", "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400006", - "requiredVisitTypeUuid": "04ffb8cf-1761-42bb-9881-1150fdfbbc2d" + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" }, { "appointmentServiceUuid": "70b7402d-fdfe-4707-94d8-5eb5780ffde5", "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400013", + "arrivalPolicy": "queue-optional", "queueUuid": "e1f2a3b4-c5d6-47e8-f9a0-b1c2d3e4f5a6", "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400013", - "requiredVisitTypeUuid": "04ffb8cf-1761-42bb-9881-1150fdfbbc2d" + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" }, { "appointmentServiceUuid": "74156b5c-b1b0-4432-b073-a8af65ebcb11", "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400007", + "arrivalPolicy": "queue-optional", "queueUuid": "e5f6a7b8-c9d0-41e2-f3a4-b5c6d7e8f9a0", "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400007", - "requiredVisitTypeUuid": "110001d9-7f3a-4e7b-91a2-580b216a7c42" + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" + }, + { + "appointmentServiceUuid": "dcaa59d1-64f2-45f5-a930-2ccc0ef37e61", + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400010", + "arrivalPolicy": "queue-optional", + "queueUuid": "b4c5d6e7-f8a9-40b1-c2d3-e4f5a6b7c8d9", + "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400010", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" + }, + { + "appointmentServiceUuid": "89bde58b-2161-4095-8e52-0d8b5003012b", + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400011", + "arrivalPolicy": "queue-optional", + "queueUuid": "c5d6e7f8-a9b0-41c2-d3e4-f5a6b7c8d9e0", + "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400011", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" + }, + { + "appointmentServiceUuid": "3663f478-80fb-4585-b92f-7f82873198ee", + "appointmentLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "arrivalPolicy": "queue-optional", + "queueUuid": "d6e7f8a9-b0c1-42d3-e4f5-a6b7c8d9e0f1", + "queueLocationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "requiredVisitTypeUuid": "b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09" } ] }, "@sihsalus/esm-patient-chart-app": { - "visitPersistenceTokenAttributeTypeUuid": "eb8b793b-f259-451d-9c09-53aa0ffd0d3f" + "visitPersistenceTokenAttributeTypeUuid": "eb8b793b-f259-451d-9c09-53aa0ffd0d3f", + "visitTypeEligibilityRules": [ + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400001", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09", "23939157-9af0-457b-8f6c-211eb5459311"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400002", + "visitTypeUuids": ["e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400003", + "visitTypeUuids": ["c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400004", + "visitTypeUuids": ["e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5", "c2a1d3e2-4b8f-4326-94d9-7f6c9a1b7c98"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400005", + "visitTypeUuids": ["e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400006", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400013", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400008", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400007", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400010", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09"] + }, + { + "locationUuid": "35d2234e-129a-4c40-abb2-1ae0b2400011", + "visitTypeUuids": ["b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09"] + } + ] }, "@sihsalus/esm-patient-registration-app": { "hiddenPatientIdentifierTypeUuids": [ diff --git a/docs/audits/2026-07-13-appointment-service-queue-mapping.csv b/docs/audits/2026-07-13-appointment-service-queue-mapping.csv deleted file mode 100644 index 5b7d4ae..0000000 --- a/docs/audits/2026-07-13-appointment-service-queue-mapping.csv +++ /dev/null @@ -1,16 +0,0 @@ -Appointment Service Uuid,Appointment Service,Appointment Location Uuid,Resolution,Queue Uuid,Queue Location Uuid,Queue,Required Visit Type Uuid,Required Visit Type,Reason -7ba3aa21-cc56-47ca-bb4d-a60549f666c0,Consulta ambulatoria por médico general,35d2234e-129a-4c40-abb2-1ae0b2400001,automatic,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,35d2234e-129a-4c40-abb2-1ae0b2400001,Cola de Consulta Externa,f70a865a-6cae-4d04-8d05-acb5bf88fa16,Consulta Ambulatoria - Medicina General,Servicio y ubicación coinciden de forma única. -1ef43565-9c96-4f58-bfd2-c864c7cedac1,Teleconsulta por médico,35d2234e-129a-4c40-abb2-1ae0b2400001,manual-required,,,,,,No existe una cola configurada con el mismo servicio y ubicación. -4ec5c4fe-cfe0-48ff-9e4d-2f201078feae,Atención ambulatoria por enfermera(o),35d2234e-129a-4c40-abb2-1ae0b2400001,manual-required,,,,,,No existe una cola configurada con el mismo servicio y ubicación. -c8d4f6e2-5b7a-41d9-93e4-7f6a8b3c2d01,Atención ambulatoria por psicólogo(a),35d2234e-129a-4c40-abb2-1ae0b2400001,manual-required,,,,,,No existe una cola configurada con el mismo servicio y ubicación. -a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02,Atención ambulatoria por obstetra,35d2234e-129a-4c40-abb2-1ae0b2400004,automatic,c9d0e1f2-a3b4-45c6-d7e8-f9a0b1c2d3e4,35d2234e-129a-4c40-abb2-1ae0b2400004,Cola de Centro Obstétrico,19fa588e-3185-41c2-a5d1-21c3a4af944b,Consulta Ambulatoria - Obstetricia,Servicio y ubicación coinciden de forma única. -b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02,Atención ambulatoria por cirujano dentista,35d2234e-129a-4c40-abb2-1ae0b2400001,automatic-shared,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,35d2234e-129a-4c40-abb2-1ae0b2400001,Cola de Consulta Externa,ae40aab4-c57d-4bb1-a27e-2cacc24dd07f,Consulta Ambulatoria - Odontología,La atención odontológica comparte explícitamente la cola operativa de Consulta Externa en la misma UPSS y conserva su tipo de visita especializado. -d4e5f6a7-b8c9-41e2-93f3-1a9b8c7d6e04,Atención en tópico de inyectables y nebulizaciones,35d2234e-129a-4c40-abb2-1ae0b2400001,manual-required,,,,,,No existe una cola configurada con el mismo servicio y ubicación. -f7a8b9c0-d1e2-43f4-93e5-3b1a9c8d7e06,Atención inmediata del recién nacido,35d2234e-129a-4c40-abb2-1ae0b2400004,manual-required,,,,,,No existe una cola configurada con el mismo servicio y ubicación. -115b9e98-0bb4-4791-afa6-d21d071cfd87,Hospitalización de Cirugía General,35d2234e-129a-4c40-abb2-1ae0b2400005,automatic,d0e1f2a3-b4c5-46d7-e8f9-a0b1c2d3e4f5,35d2234e-129a-4c40-abb2-1ae0b2400005,Cola de Centro Quirúrgico,f8238c67-4514-46d2-87d0-330b64c76311,Hospitalización - Cirugía General,Servicio y ubicación coinciden de forma única. -e6a43c30-71ac-4ec6-9757-c78a50ee8e8b,Procedimientos de Laboratorio Clínico Tipo II-1,35d2234e-129a-4c40-abb2-1ae0b2400006,automatic,f6a7b8c9-d0e1-42f3-a4b5-c6d7e8f9a0b1,35d2234e-129a-4c40-abb2-1ae0b2400006,Cola de Laboratorio,04ffb8cf-1761-42bb-9881-1150fdfbbc2d,Consulta Diagnóstica,Servicio y ubicación coinciden de forma única. -70b7402d-fdfe-4707-94d8-5eb5780ffde5,Ecografía general y Doppler,35d2234e-129a-4c40-abb2-1ae0b2400013,automatic,e1f2a3b4-c5d6-47e8-f9a0-b1c2d3e4f5a6,35d2234e-129a-4c40-abb2-1ae0b2400013,Cola de Diagnóstico por Imágenes,04ffb8cf-1761-42bb-9881-1150fdfbbc2d,Consulta Diagnóstica,Servicio y ubicación coinciden de forma única. -74156b5c-b1b0-4432-b073-a8af65ebcb11,Atención en farmacia clínica,35d2234e-129a-4c40-abb2-1ae0b2400007,automatic,e5f6a7b8-c9d0-41e2-f3a4-b5c6d7e8f9a0,35d2234e-129a-4c40-abb2-1ae0b2400007,Cola de Farmacia,110001d9-7f3a-4e7b-91a2-580b216a7c42,Dispensación de Medicamentos,Servicio y ubicación coinciden de forma única. -dcaa59d1-64f2-45f5-a930-2ccc0ef37e61,Terapia de rehabilitación,35d2234e-129a-4c40-abb2-1ae0b2400010,manual-required,,,,,,El concepto de servicio no coincide; requiere selección explícita sin inferir por nombre. -89bde58b-2161-4095-8e52-0d8b5003012b,Sesión de hemodiálisis,35d2234e-129a-4c40-abb2-1ae0b2400011,manual-required,,,,,,El concepto de servicio no coincide; requiere selección explícita sin inferir por nombre. -3663f478-80fb-4585-b92f-7f82873198ee,Atención nutricional,35d2234e-129a-4c40-abb2-1ae0b2400012,manual-required,,,,,,El concepto de servicio no coincide; requiere selección explícita sin inferir por nombre. diff --git a/docs/audits/2026-07-13-appointments-visit-queue-compliance.md b/docs/audits/2026-07-13-appointments-visit-queue-compliance.md deleted file mode 100644 index 7358cb2..0000000 --- a/docs/audits/2026-07-13-appointments-visit-queue-compliance.md +++ /dev/null @@ -1,198 +0,0 @@ -# Citas, visitas y colas: alineamiento operativo y normativo - -Fecha de revisión: 2026-07-14 - -## Alcance - -Esta revisión documenta la metadata necesaria para que el check-in de una cita pueda conservar una relación -auditable con la visita y la entrada de cola. Cubre permisos, número de turno, zona horaria, duración de servicios y -la selección de cola. No reemplaza la definición local de oferta, horarios, cupos ni disponibilidad profesional. - -## Base normativa y límite de interpretación - -La [Resolución Ministerial N.° 811-2018/MINSA](https://www.gob.pe/institucion/minsa/normas-legales/195801-811-2018-minsa) -aprueba la Directiva Administrativa N.° 251-MINSA/2018/DGOS para elaborar e implementar el Plan "Cero Colas" en -las IPRESS públicas adscritas al MINSA y a gobiernos regionales. La -[comunicación oficial del MINSA](https://www.gob.pe/institucion/minsa/noticias/18706-minsa-aprueba-plan-cero-colas-en-los-esta-blecimientos-de-salud-a-nivel-nacional) -ubica su aplicación en admisión, consulta externa y apoyo al diagnóstico y tratamiento, y exige supervisar y -monitorear la reducción del tiempo de espera. También promueve herramientas informáticas para el otorgamiento de -citas sin eliminar el canal telefónico. - -La directiva respalda el objetivo operativo y su monitoreo, pero no prescribe: - -- un modelo de datos OpenMRS para relacionar cita, visita y cola; -- un número de turno como campo nacional obligatorio; -- una duración estándar por prestación; -- horarios de atención, cupos máximos o agendas de profesionales. - -Por ello, el vínculo cita-visita-cola y el número de turno se implementan como controles locales de trazabilidad. No -se presentan como campos textualmente exigidos por la RM 811-2018/MINSA. Tampoco se inventan valores de horario o -capacidad bajo una supuesta exigencia normativa. - -## Contrato de metadata - -- OpenMRS Core: `Add Visits` y `Edit Visits` para crear y cerrar visitas. -- Queue OMOD: `Get Queues`, `Get Queue Entries` y `Manage Queue Entries` para crear, actualizar, transicionar o - cerrar entradas de cola. -- Appointments OMOD: `View Appointments`, `Manage Appointments` y `Manage Own Appointments` para consultar y - cambiar el estado de las citas que corresponden al operador. -- Privilegio clinico de FUA: `Generate Fua from Visit` - (`2293389f-8595-491f-b842-5da867f59608`). -- Atributo de visita: `Número de turno de cola` - (`06a0b8c6-cbdf-4b42-9cbd-871129db8758`), `FreeText`, cardinalidad `0..1`. -- Atributo de visita: `UUID de cita vinculada` - (`193508ab-20c6-5291-9f23-0257335eaabd`), `FreeText`, cardinalidad `0..*`. -- Propiedad global: `sihsalus.queue.visitQueueNumberAttributeUuid` apunta a `Número de turno de cola`. -- Propiedad global: `sihsalus.timezone=America/Lima` declara la zona operativa para los consumidores SIHSALUS. - Queue OMOD 3.0.0 no lee esta propiedad: calcula el día del número de turno con la zona por defecto de la JVM. - El servidor, la JVM y la base de datos se mantienen en UTC conforme a las - [convenciones de zona horaria de OpenMRS](https://openmrs.atlassian.net/wiki/spaces/docs/pages/25475025/Time+Zones+Conventions), - mientras el cliente presenta fechas en la zona local del usuario. Por tanto, el correlativo diario de Queue se - corta a medianoche UTC; es una limitación upstream y no se corrige cambiando la zona del servidor. -- Configuración O3: `@sihsalus/esm-appointments-app.appointmentVisitAttributeTypeUuid` publica el UUID del vínculo - cita-visita y `appointmentQueueMappings` contiene únicamente los pares automáticos verificados, cada uno con el - tipo de visita requerido. - -El número de turno es opcional a nivel del modelo de visita porque no toda visita ingresa por una cola. El flujo de -check-in de citas debe exigir la entrada de cola; otras visitas pueden seguir existiendo sin número de turno. - -Una visita activa puede atender más de una cita, por eso `UUID de cita vinculada` no tiene máximo. En Initializer -2.12.0 el campo `Max occurs` vacío se carga como `null`, que OpenMRS Core 2.8.7 interpreta como ilimitado. Cada valor -conserva un UUID de cita y el cliente debe evitar duplicar el mismo UUID. Es un enlace de trazabilidad entre recursos, -no una llave foránea: por sí solo no valida que la cita exista ni vuelve atómicas las escrituras. - -No existe en OpenMRS Core 2.8.7, Queue OMOD 3.0.0 ni Appointments OMOD 2.1.0 un privilegio o endpoint transaccional -denominado `Manage Appointment Queue Lifecycle`. Ese privilegio local fue retirado porque no autorizaba ninguna de -las operaciones oficiales. Sin un OMOD de integración, el frontend debe orquestar los recursos oficiales y permitir -reintentos; la metadata no convierte las tres escrituras en una única transacción de base de datos. - -## Mínimo privilegio - -El nombre técnico `Admision` se mantiene estable porque OpenMRS no permite renombrar un rol existente. Initializer -lo actualiza por el UUID `71dcb611-756a-4ad3-a9bb-73b6cfe28066`, reemplaza su herencia y aplica la lista exacta de -privilegios; cambiar el nombre impediría corregir instalaciones existentes. - -`Manage Queue Entries` se asigna directamente solo a `Admision`, `Application: Register Appointments`, -`Application: Gestionar Colas Servicio`, `Personal de Emergencia`, `SIHSALUS Consulta Externa` y al rol técnico -`super admin back privileges`. El rol `Enfermera` lo hereda de `SIHSALUS Consulta Externa`. - -Los roles operativos reciben los permisos mínimos que requieren para crear visitas o trabajar con colas: - -- lectura de colas y entradas; -- lectura de los conceptos de estado, prioridad y servicio usados por la cola; -- lectura, creación y edición de visitas, tipos de visita y tipos de atributo; -- lectura de ubicaciones. - -`Admision` y `Application: Register Appointments` conservan `app:home.citas.editar`, pero no reciben -`app:home.colasAtencion` ni `app:home.colasAtencion.editar`. Reciben `Manage Queue Entries` porque el POST y las -transiciones de Queue OMOD 3.0.0 lo exigen cuando el check-in crea la entrada de cola. El privilegio upstream es más -amplio que la navegación de Citas; por ello su asignación queda limitada a estos roles operativos y el frontend no -les expone el dashboard general de colas. Tampoco reciben -`Reset Appointment Status`, `Manage Queues`, gestión de salas ni permisos de purga. -La ubicación operativa proviene de la cita y de su mapeo exacto a cola; la ubicación de sesión identifica la -instalación de login y no reemplaza ese destino. El flujo de check-in muestra la ubicación derivada como solo lectura -y no ofrece a Admisión un selector de ubicación de cola. - -`Application: Gestionar Colas Servicio` conserva su dashboard y la administración de catálogos de colas y salas. -Recibe `app:home.colasAtencion.editar`, `Manage Queue Entries` y `View Appointments`, pero no `Manage Appointments`: -cerrar una entrada no cambia por sí solo la cita asociada. No recibe reinicio de estado ni purga. -`Colas Servicio Medico` permanece en modo de lectura y no recibe `Manage Queue Entries`, edición de visitas ni -privilegios de configuración o purga. - -`Personal de Emergencia` es un rol directo y no hereda `SIHSALUS Consulta Externa`. Puede buscar y registrar -pacientes, crear y editar la visita, registrar triaje y atención, y crear, actualizar o transicionar entradas de -cola mediante `Manage Queue Entries`. Las nuevas emergencias continúan como atención inmediata y cola operativa, -no como citas programadas. No recibe `Manage Appointments`, `Manage Queues`, gestión de salas, reinicio de estados, -purga ni borrado de pacientes, visitas, encuentros u observaciones. - -`SIHSALUS Consulta Externa` y su rol heredero `Enfermera` pueden iniciar y finalizar una atención vinculada desde la -hoja clínica. Reciben `Manage Queue Entries` porque Queue OMOD 3.0.0 exige ese privilegio tanto para transicionar la -entrada como para el manejador que la cierra al finalizar una visita activa. También pueden generar o reintentar la -FUA de la visita con -`Generate Fua from Visit`, sin recibir `Manage Fua` ni `Update Fua`. La generación conserva un registro pendiente -por visita antes de invocar al generador externo, de modo que una caída no pierda la trazabilidad ni cree duplicados -al reintentar. No reciben `Manage Queues`, gestión de salas ni permisos de purga. - -`Digitadores FUA` recibe navegación a la superficie FUA, lectura de visitas y el mismo privilegio estrecho de -generación porque su bandeja permite generación individual y masiva desde visitas. Conserva los permisos de gestión -FUA propios de su función, pero no recibe borrado de FUA o visitas ni lectura o administración de propiedades -globales. - -Ninguno de estos roles de flujo recibe `Get Global Properties` ni `View Global Properties`; los módulos leen -únicamente las propiedades técnicas que necesitan mediante servicios internos controlados. - -## Duraciones - -Cada servicio de cita activo tiene exactamente un tipo de servicio activo. La duración base se copia de ese único -tipo para evitar que la agenda use un valor predeterminado distinto. El validador de CI exige que ambos valores se -mantengan alineados mientras la relación siga siendo inequívoca. - -No se completan `Start Time`, `End Time` ni `Max Load`. Esos valores dependen de la oferta real del establecimiento y -requieren aprobación local. La duración existente tampoco se declara como duración normativa nacional. - -## Mapeo de servicio de cita a cola - -La preselección automática se infiere solo cuando existe una única cola cuyo concepto de servicio y ubicación son -idénticos a los del servicio de cita. También puede existir una asignación compartida explícita cuando el -establecimiento aprueba que varios servicios usen la misma cola dentro de una UPSS y cada uno conserva su tipo de -visita. Con la configuración actual hay seis mapeos exactos y uno compartido: - -- Consulta ambulatoria por médico general -> Cola de Consulta Externa. -- Atención ambulatoria por cirujano dentista -> Cola de Consulta Externa (asignación compartida explícita). -- Atención ambulatoria por obstetra -> Cola de Centro Obstétrico. -- Hospitalización de Cirugía General -> Cola de Centro Quirúrgico. -- Procedimientos de Laboratorio Clínico Tipo II-1 -> Cola de Laboratorio. -- Ecografía general y Doppler -> Cola de Diagnóstico por Imágenes. -- Atención en farmacia clínica -> Cola de Farmacia. - -Los otros ocho servicios requieren selección explícita. Rehabilitación, hemodiálisis y nutrición usan conceptos de -servicio distintos a los de las colas disponibles; los otros cinco no tienen una cola exacta configurada. El -inventario deja vacíos sus campos de cola: no infiere equivalencias por nombre y tampoco usa la ubicación como -fallback, porque una ubicación puede contener varias colas. - -El inventario completo y verificable está en -[`2026-07-13-appointment-service-queue-mapping.csv`](2026-07-13-appointment-service-queue-mapping.csv). -Los siete pares automáticos se publican también en -[`configuration/frontend_configuration/config.json`](../../configuration/frontend_configuration/config.json) con -UUIDs de servicio, ubicación de cita, cola, ubicación de cola y tipo de visita requerido. Los ocho casos manuales -no aparecen en el arreglo. El frontend fija la ubicación de cola a la ubicación de la cita antes de permitir una -selección manual. Si ya existe una visita activa, no permite reutilizarla sin un tipo de visita aprobado para el -servicio: el operador debe regularizarla o iniciar la atención cuando ya no exista otra visita activa. -El distro productivo actual construye `/openmrs/spa/frontend.json` desde el repositorio frontend y todavía no copia -`spa_config` del paquete de contenido al contenedor web. Hasta que ese ensamblaje cambie, estos mismos valores deben -permanecer sincronizados en `sihsalus-frontend/config/frontend.json`; el archivo de content funciona como contrato -empaquetado y no activa por sí solo la configuración en producción. - -## Validación - -`.github/scripts/validate_appointment_queue_integrity.py` falla en CI si: - -- reaparece el privilegio local obsoleto en el catálogo o en un rol; -- las asignaciones directas de `Manage Queue Entries` difieren de los roles operativos, de emergencia, clínico y - administrativo aprobados; -- el privilegio estrecho de generación FUA falta en el rol clínico, digitador FUA o rol técnico, aparece en otro - rol, o el personal clínico recibe administración general de FUA; -- el personal clínico pierde el permiso oficial para cerrar una cola/visita, o recibe configuración o purga; -- `Enfermera` deja de heredar el contrato clínico, o `Colas Servicio Medico` deja de ser de solo lectura; -- falta un permiso operativo mínimo o aparece un permiso administrativo prohibido; -- cambia el UUID, datatype o cardinalidad del número de turno o del vínculo cita-visita; -- faltan las propiedades globales o cambia la zona operativa declarada; la JVM permanece en UTC y Queue 3.0.0 usa - `ZoneId.systemDefault()`, por lo que su correlativo diario sigue el día UTC; -- una duración base difiere de su único tipo activo; -- el inventario de mapeos omite un servicio, sugiere una cola para un caso manual, infiere un mapeo ambiguo o una - asignación compartida apunta fuera de la ubicación de la cita; -- un mapeo automático no referencia un tipo de visita activo o su nombre no coincide con el catálogo; -- la configuración O3 usa otro atributo, omite el tipo de visita, duplica pares o difiere de los siete mapeos - automáticos auditados. - -## Decisiones locales pendientes - -Antes de activar capacidad o disponibilidad automática, el establecimiento debe aprobar y mantener por sede: - -1. horarios efectivos por servicio; -2. cupos simultáneos y capacidad diaria; -3. profesionales habilitados y sus agendas; -4. equivalencias de servicio para los nueve mapeos manuales; -5. indicadores y metas de tiempo de espera del Plan Cero Colas. - -Estas decisiones no deben derivarse de la RM 811-2018/MINSA ni de valores predeterminados del software. diff --git a/docs/audits/2026-07-18-canonical-care-routing.md b/docs/audits/2026-07-18-canonical-care-routing.md new file mode 100644 index 0000000..6ccffcf --- /dev/null +++ b/docs/audits/2026-07-18-canonical-care-routing.md @@ -0,0 +1,113 @@ +# Contrato canónico de cita, atención y cola + +Fecha: 2026-07-18 +Estado: aprobado para implementación previa a PROD + +## Alcance + +Esta decisión separa los conceptos que antes se repetían en especialidad, tipo de servicio, +`VisitType`, `EncounterType` y cola. La fuente ejecutable es +[`../contracts/hsc-care-routing.csv`](../contracts/hsc-care-routing.csv); este documento explica +sus reglas y la migración. + +## Decisiones aprobadas + +1. `AppointmentServiceDefinition` representa el servicio programable de la cartera local. +2. `AppointmentSpeciality` se usa como categoría de agenda. Puede corresponder a una especialidad + reconocida o a una categoría local explícitamente identificada como tal. +3. `VisitType` representa solamente el ámbito de atención: ambulatorio, hospitalización, + emergencia, extramural o sesión grupal. +4. `EncounterType` representa el evento clínico y no la especialidad de la agenda. +5. `Queue` representa una línea de espera operativa por ubicación. Varios servicios pueden + compartirla sin perder su contexto, porque la cita conserva el servicio. +6. `Queue.service` siempre es un `Concept` dedicado. Nunca se reutiliza el UUID de un servicio de + cita como si fuera un Concept. +7. La llegada se resuelve mediante una regla exacta por UUID de servicio y ubicación. No se + infieren equivalencias por nombre. +8. La validación de la categoría del profesional es configurable. El modo inicial es `warn`: hace + visible una discordancia pero no bloquea la agenda mientras el hospital completa el catálogo. + +## Odontología + +`Cirujano dentista` es una profesión; `Cirugía Bucal y Maxilofacial` es una especialidad. El +servicio general queda asociado a la categoría local `Odontología general`. La categoría no se +presenta como especialidad RNE y CBMF queda disponible únicamente para una futura agenda de +especialistas habilitados. + +## Cartera HSC II-1 + +El contrato incluye los 16 registros existentes: 13 programables y tres retirados. La referencia +a un ítem de la NTS 249 identifica la prestación usada para modelar cada servicio, pero no declara +por sí sola que el hospital tenga habilitada toda la cartera nacional. Horarios, cupos, +profesionales y servicios adicionales siguen siendo configuración local. + +Los flujos no programables quedan fuera de citas: + +- urgencias y emergencias se inician como atención inmediata; +- atención inmediata del recién nacido se vincula al parto; +- aplicación de inyectables permanece retirada hasta confirmar la UPSS Tópico de Atención de + Salud y la cartera aprobada del establecimiento. + +## Referencias verificadas + +- La [Resolución Ministerial N.° 625-2026-MINSA](https://www.gob.pe/institucion/minsa/normas-legales/8389687-625-2026-minsa), + publicada el 16 de julio de 2026, aprueba la NTS N.° 249-MINSA/DGAIN-2026 y publica su anexo + oficial. Los números y nombres de prestaciones del contrato se verificaron contra el Anexo + N.° 01 de esa norma. +- La separación técnica se verificó contra las versiones instaladas en el distro: OpenMRS Core + `2.8.8`, Appointments `2.1.0`, Queue `3.0.0` e Initializer `2.12.0`. La NTS define la cartera y + las prestaciones; la correspondencia con objetos OpenMRS sigue siendo una decisión de diseño + local documentada, no una equivalencia exigida por MINSA. + +## Llegada + +Las políticas son: + +- `queue-optional`: Admisión puede registrar atención directa o incorporar al paciente a la cola; +- `queue-required`: la llegada debe crear una entrada de cola; +- `direct`: inicia la atención sin cola física; +- `not-applicable`: el servicio no puede programarse. + +En el contrato actual hay 11 reglas `queue-optional`, dos `direct` y tres retiradas. La ubicación +de la cola debe coincidir con la ubicación de la cita. Toda regla habilitada exige un `VisitType` +de ámbito, incluso cuando no usa cola. + +## Migración de DEV y QLTY + +Los entornos no productivos se migran en este orden: + +1. respaldar la base y capturar conteos por UUID; +2. desplegar content `1.23.0` para crear categorías, Concepts y reglas nuevas; +3. reasignar las consultas de tipos especializados al ámbito genérico correspondiente; +4. verificar que no existan citas futuras de los tres servicios retirados; +5. eliminar de DEV/QLTY los tipos antiguos y el atributo padre ficticio, después de comprobar que + no tengan referencias; el paquete canónico no los recrea; +6. desplegar el frontend compatible; +7. probar cita, llegada directa, llegada con cola, inicio de atención, encuentro y cierre; +8. confirmar mediante UUID que solo permanezcan los cinco ámbitos canónicos. + +No se reescriben encuentros, observaciones ni identificadores clínicos. La re-clasificación afecta +únicamente `VisitType`; la categoría de agenda se conserva en el servicio de cita. + +## Criterios de aceptación + +- content y frontend tienen la misma versión del contrato; +- los 13 servicios activos poseen una única regla de llegada exacta; +- ninguna cola activa reutiliza un UUID de `AppointmentServiceDefinition` como Concept; +- odontología general no referencia CBMF; +- obstetricia y nutrición ambulatorias usan UPSS Consulta Externa; +- rehabilitación, hemodiálisis y nutrición pueden encolarse sin selección manual; +- Admisión puede optar entre atención directa y cola en las 11 rutas opcionales; +- una regla faltante o ambigua bloquea la operación con un error en español y no crea datos + parciales; +- la validación de profesional funciona en `off`, `warn` y `strict` sin comparar nombres; +- no quedan consultas usando tipos antiguos y el catálogo contiene únicamente los cinco ámbitos + canónicos antes del despliegue a PROD. + +## Control automático + +`.github/scripts/validate_appointment_queue_integrity.py` comprueba el contrato completo, los +catálogos referenciados, la configuración empaquetada, las categorías de agenda, los ámbitos de +atención y los Concepts de cola. Cualquier cambio de cartera debe modificar primero el contrato y +pasar este validador; editar solo el frontend o una base de datos no es una configuración +reproducible. diff --git a/docs/contracts/hsc-care-routing.csv b/docs/contracts/hsc-care-routing.csv new file mode 100644 index 0000000..627ee0c --- /dev/null +++ b/docs/contracts/hsc-care-routing.csv @@ -0,0 +1,17 @@ +Appointment Service Uuid,Appointment Service,Status,NTS 249 Item,NTS 249 Prestacion,Scheduling Category Uuid,Scheduling Category,Category Basis,Appointment Location Uuid,Appointment Location,Arrival Policy,Queue Uuid,Queue,Queue Service Concept Uuid,Queue Location Uuid,Required Visit Type Uuid,Required Visit Type,Reason +7ba3aa21-cc56-47ca-bb4d-a60549f666c0,Consulta ambulatoria por médico general,enabled,54,Consulta ambulatoria por médico general,9f2a8cd0-32c6-4844-8df7-1ac9c4d79943,Medicina General,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,queue-optional,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,Cola de Consulta Externa,51ce03e2-8987-4431-9e42-f8adca946c2c,35d2234e-129a-4c40-abb2-1ae0b2400001,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,Prestación ambulatoria que usa la cola compartida de Consulta Externa. +1ef43565-9c96-4f58-bfd2-c864c7cedac1,Teleconsulta por médico general,enabled,219,Teleconsulta por médico general,9f2a8cd0-32c6-4844-8df7-1ac9c4d79943,Medicina General,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,direct,,,,,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La consulta remota no requiere una línea de espera física. +4ec5c4fe-cfe0-48ff-9e4d-2f201078feae,Atención ambulatoria por enfermera(o),enabled,137,Atención ambulatoria por enfermera(o),,,profession,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,queue-optional,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,Cola de Consulta Externa,51ce03e2-8987-4431-9e42-f8adca946c2c,35d2234e-129a-4c40-abb2-1ae0b2400001,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,Enfermería es una profesión y comparte la cola de Consulta Externa. +c8d4f6e2-5b7a-41d9-93e4-7f6a8b3c2d01,Atención ambulatoria por psicólogo(a),enabled,135,Atención ambulatoria por psicólogo(a),9c8b7a6d-5e4f-43c1-9a2b-8d3e6f5c2a10,Salud Mental,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,queue-optional,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,Cola de Consulta Externa,51ce03e2-8987-4431-9e42-f8adca946c2c,35d2234e-129a-4c40-abb2-1ae0b2400001,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,Salud Mental es una categoría local de agenda y no un VisitType. +a6d7f9b3-2c5e-48d1-93e4-7f8a6b5c2d02,Atención ambulatoria por obstetra,enabled,140,Atención ambulatoria por obstetra,,,profession,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,queue-optional,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,Cola de Consulta Externa,51ce03e2-8987-4431-9e42-f8adca946c2c,35d2234e-129a-4c40-abb2-1ae0b2400001,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La atención por obstetra pertenece a Consulta Externa y no a Centro Obstétrico. +b3c2d4e5-f6a7-48d9-93e1-8f7a6b5c4d02,Consulta ambulatoria por cirujano dentista general,enabled,142,Consulta ambulatoria por cirujano dentista general,a0d4e64e-eb63-4271-bdf1-ffa10392c282,Odontología general,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,queue-optional,d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9,Cola de Consulta Externa,51ce03e2-8987-4431-9e42-f8adca946c2c,35d2234e-129a-4c40-abb2-1ae0b2400001,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,Odontología general es una categoría local; CBMF queda reservada al servicio especialista. +d4e5f6a7-b8c9-41e2-93f3-1a9b8c7d6e04,Aplicación de inyectables,retired,520,Aplicación de inyectables,,,none,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,not-applicable,,,,,,,Se retira hasta confirmar la UPSS Tópico de Atención en Salud y su cartera local. +e5f6a7b8-c9d0-42f3-93e4-2b0a9c8d7e05,Atención de urgencias y emergencias,retired,N/A,Flujo no programable,,,none,35d2234e-129a-4c40-abb2-1ae0b2400003,UPSS - EMERGENCIA,not-applicable,,,,,,,Emergencia se inicia como atención inmediata y no como cita programada. +f7a8b9c0-d1e2-43f4-93e5-3b1a9c8d7e06,Atención inmediata del recién nacido,retired,9-10,Atención inmediata del recién nacido,14106bb7-dad6-4446-809d-737f4c128ae3,Pediatría,rne-medical,35d2234e-129a-4c40-abb2-1ae0b2400004,UPSS - CENTRO OBSTÉTRICO,not-applicable,,,,,,,Es una atención inmediata vinculada al parto y no una cita programable. +115b9e98-0bb4-4791-afa6-d21d071cfd87,Hospitalización de cirugía general,enabled,296,Hospitalización de cirugía general,d8e2f4a0-b5c3-41d7-942a-6c4a1e9f3b22,Cirugía General,rne-medical,35d2234e-129a-4c40-abb2-1ae0b2400002,UPSS - HOSPITALIZACIÓN,direct,,,,,e4c8b6d9-7f3a-4e7b-91a2-58b9f6c2d4b5,Hospitalización,El ingreso programado abre hospitalización sin pasar por la cola de Centro Quirúrgico. +e6a43c30-71ac-4ec6-9757-c78a50ee8e8b,Procedimientos de patología clínica,enabled,488-493,Prestaciones de patología clínica habilitadas,7e5d3c2b-8a9f-41d6-93c4-6b2a1f8e5d07,Laboratorio Clínico,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400006,UPSS - PATOLOGÍA CLÍNICA,queue-optional,f6a7b8c9-d0e1-42f3-a4b5-c6d7e8f9a0b1,Cola de Patología Clínica,5b3fc3a4-99a0-40ec-a1e2-058a032619c9,35d2234e-129a-4c40-abb2-1ae0b2400006,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,El servicio de agenda es un agrupador local; las prestaciones efectivas dependen de la cartera habilitada. +70b7402d-fdfe-4707-94d8-5eb5780ffde5,Ecografía general y Doppler,enabled,418,Ecografía general y Doppler,2b4d6f8a-1c3e-49d5-93a7-8e5f6b3c2d01,Radiología e Imagenología,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400013,UPSS - DIAGNÓSTICO POR IMÁGENES,queue-optional,e1f2a3b4-c5d6-47e8-f9a0-b1c2d3e4f5a6,Cola de Diagnóstico por Imágenes,d0dc9239-a16f-4efb-a313-4b9135dca233,35d2234e-129a-4c40-abb2-1ae0b2400013,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La prestación conserva su cola y el VisitType solo expresa el ámbito ambulatorio. +74156b5c-b1b0-4432-b073-a8af65ebcb11,Atención en farmacia clínica,enabled,440,Atención en farmacia clínica,,,none,35d2234e-129a-4c40-abb2-1ae0b2400007,UPSS - FARMACIA,queue-optional,e5f6a7b8-c9d0-41e2-f3a4-b5c6d7e8f9a0,Cola de Farmacia,69d1f46b-c4cb-4760-afd2-d186c127f6ba,35d2234e-129a-4c40-abb2-1ae0b2400007,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La prestación conserva su cola y no usa un VisitType de dispensación. +dcaa59d1-64f2-45f5-a930-2ccc0ef37e61,Rehabilitación mediante terapia física,enabled,505-506,Rehabilitación mediante terapia física,a85cfebd-f0ad-465e-859c-ee20ded8fa90,Medicina de Rehabilitación,rne-medical,35d2234e-129a-4c40-abb2-1ae0b2400010,UPSS - MEDICINA DE REHABILITACIÓN,queue-optional,b4c5d6e7-f8a9-40b1-c2d3-e4f5a6b7c8d9,Cola de Rehabilitación,e771ce10-6edd-4d17-a54c-e5de0762b7c7,35d2234e-129a-4c40-abb2-1ae0b2400010,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La equivalencia entre servicio y cola queda explícita y no se infiere por UUID o nombre. +89bde58b-2161-4095-8e52-0d8b5003012b,Hemodiálisis,enabled,433,Hemodiálisis,e8a5a5bb-60f4-42e6-a96f-fd9da40d5c1a,Nefrología,rne-medical,35d2234e-129a-4c40-abb2-1ae0b2400011,UPSS - DIÁLISIS,queue-optional,c5d6e7f8-a9b0-41c2-d3e4-f5a6b7c8d9e0,Cola de Hemodiálisis,c10289d4-0f22-4f0e-8242-1835259404d5,35d2234e-129a-4c40-abb2-1ae0b2400011,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La equivalencia entre servicio y cola queda explícita y la ubicación se alinea a UPSS Diálisis. +3663f478-80fb-4585-b92f-7f82873198ee,Atención ambulatoria por nutricionista,enabled,152,Atención ambulatoria por nutricionista,32f2c8e3-79cf-4016-939f-469bed37abdb,Nutrición,local-scheduling,35d2234e-129a-4c40-abb2-1ae0b2400001,UPSS - CONSULTA EXTERNA,queue-optional,d6e7f8a9-b0c1-42d3-e4f5-a6b7c8d9e0f1,Cola de Atención Nutricional,0e56ea09-42ea-4f66-ad53-76cbc770dcfa,35d2234e-129a-4c40-abb2-1ae0b2400001,b1f0e8a1-9c5d-4f0e-8892-81f3140fbc09,Atención Ambulatoria,La consulta nutricional está en Consulta Externa; la cola dedicada sigue siendo una decisión operativa local. diff --git a/pom.xml b/pom.xml index 91a36c1..d4b4790 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 io.github.proyecto-santaclotilde sihsalus-content - 1.22.0 + 1.23.0 pom SIHSALUS Content Package