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