UNPKG

emr-api-client

Version:

Api client for accessing openmrs service

937 lines (923 loc) 29.2 kB
declare enum ClientError { INVALID_API_VERSION = "Invalid API version", NOT_FOUND = "Request not found", ENTITY_ERROR = "Entity error", BAD_REQUEST = "Bad request", REQUEST_FAILED = "Request Failed", NO_CONNECTION = "No connection", SERVER_ERROR = "Server Error", INTERNAL_ERROR = "Internal error", GENERAL_ERROR = "General Error", GENERAL_REQUEST_ERROR = "General request error", AUTHENTICATION_ERROR = "Authentication Error", GATE_WAY_ERROR = "Gate way error", RECORD_CONFLICT = "Record conflict" } type IdentificationTypeName = 'OpenMRS Identification Number' | 'Old Identification Number' | 'National id' | 'ARV Number' | 'z_deprecated Pre ART Number (Old format)' | 'VHW ID' | 'District TB Number' | 'Dummy ID' | 'z_deprecated EID Number' | 'Unknown ID' | 'MDR-TB Program Identifier' | 'KS Number' | 'z_deprecated PART Number' | 'Diabetes Number' | 'LAB IDENTIFIER' | 'DS Number' | 'Filing number' | 'Archived filing number' | 'HCC Number' | 'Radiology Study Number' | 'IVR Access Code' | 'Pre-ART Number' | 'Serial Number' | 'HTC Identifier' | 'ANC Connect ID' | 'FUCHIA ID' | 'DDE person document ID' | 'Malawi National ID' | 'District IPT Number' | 'Legacy ARV Number'; type UserRoleName = 'Anonymous' | 'Provider' | 'System Developer' | 'Accompagnateur' | 'Accompagnateur Leader' | 'Adults' | 'Clinician' | 'Counselor' | 'Data Assistant' | 'Data Element Contributor' | 'Data Manager' | 'Doctor' | 'General Registration Clerk' | 'HMIS lab order' | 'HSA' | 'Informatics Manager' | 'Lab' | 'Medical Assistant' | 'Nurse' | 'Paediatrics' | 'Pharmacist' | 'Program Manager' | 'Registration Clerk' | 'Social Worker' | 'SPINE clinician' | 'Superuser' | '"Superuser,Superuser,"' | 'Supervisor' | 'Therapeutic Feeding Clerk' | 'Vitals Clerk' | 'Authenticated'; interface UpdatedUserI { given_name?: string; family_name?: string; password?: string; roles?: UserRoleName[]; programs?: number[]; must_append_roles?: boolean; } interface NewUserI { given_name: string; family_name: string; roles: UserRoleName[]; username: string; password: string; programs?: number[]; } interface RequestDataI { url: string; config: Record<string, any>; } interface UserI { deactivated_on: string | null; user_id: number; creator: number; person_id: number; changed_by: number; date_changed: string; system_id: string; username: string; date_created: string; retired: number; retired_by: number | null; date_retired: string | null; retire_reason: string; uuid: string; roles: RoleI[]; programs: any[]; person: PersonI; } interface RoleI { role: string; description: string; uuid: string; } interface PersonAddressI { person_address_id: number; person_id: number; preferred: number; address1: null | string; address2: string; city_village: string; state_province: string; postal_code: null | string; country: null | string; latitude: null | string; longitude: null | string; creator: number; date_created: string; voided: number; voided_by: null | number; date_voided: null | string; void_reason: null | string; county_district: string; neighborhood_cell: string; region: null | string; subregion: null | string; township_division: string; uuid: string; } interface PersonI { person_id: number; gender: string; birthdate: string | null; birthdate_estimated: number; dead: number; death_date: string | null; cause_of_death: string | null; creator: number; date_created: string; changed_by: number; date_changed: string; voided: number; voided_by: number | null; date_voided: string | null; void_reason: string | null; uuid: string; names: PersonNameI[]; person_attributes: PersonAttributeI[]; addresses: PersonAddressI[]; } interface PersonNameI { person_name_id: number; preferred: number; person_id: number; prefix: string | null; given_name: string; middle_name: string; family_name_prefix: string | null; family_name: string; family_name2: string | null; family_name_suffix: string | null; degree: string | null; creator: number; date_created: string; voided: number; voided_by: number | null; date_voided: string | null; void_reason: string | null; changed_by: number | null; date_changed: string | null; uuid: string; } interface RequestBodyI { method: 'GET' | 'POST' | 'PUT' | 'DELETE'; body?: string; } interface AuthorizationDataI { token: string; expiry_time: string; user: UserI; } interface DDESearchDemographicsI { given_name: string; family_name: string; gender: string; } interface DDESearchByDemographicsResponse { locals: PatientI[]; remotes: PatientI[]; } interface DDEclientMergeDataI { patient_id: number; doc_id: string; } /** * Data that is saved in session storage for persitence */ interface ApiDataI { host: string; token: string; tokenExpiryDate: string; userID: string; personID: string; username: string; userRoles: string; } /** * When making API calls, this object will be returns */ interface JsonRequestResponse<T = any> { /** * For successful API connections, ok will be true */ ok: boolean; /**s * Retrieve client error type. Useful for handling specific errors */ clientErrorType?: ClientError; /** * Generated error message */ errorMessage?: string; /** * Response as returned by fetch request */ httpStatusResponse?: number; /** * Any data returned by the API */ data?: T; } interface ObsValueI { concept_id: number; value_text?: string; value_coded?: number; value_datetime?: string; value_modifier?: string | null; value_boolean?: string; value_numeric?: number; obs_group_id?: number; obs_datetime?: string; } interface NewObsI { encounter_id: number; observations: Array<ObsValueI>; } interface NewPatientI { given_name?: string; family_name?: string; gender?: string; birth_date?: string; home_district?: number; birthdate_estimated?: boolean; home_traditional_authority?: number; home_village?: number; current_district?: number; current_village?: number; current_traditional_authority?: number; cell_phone_number?: string; landmark?: string; } interface NewPersonAttributeI { person_id: number; person_attribute_type_id: number; value: number | string; } interface PersonAttributeTypeI { person_attribute_type_id: number; name: string; description: string; format: string; foreign_key: null; searchable: number; creator: number; date_created: Date; changed_by: number; date_changed: Date; retired: number; retired_by: null; date_retired: null; retire_reason: null; edit_privilege: null; uuid: string; sort_weight: number; } interface PersonAttributeI { person_attribute_id?: number; person_id: number; value: string; person_attribute_type_id: number; creator?: number; date_created?: Date; changed_by?: null; date_changed?: null; voided?: number; voided_by?: null; date_voided?: null; void_reason?: null; uuid?: string; type?: PersonAttributeTypeI; } interface NewPersonI { given_name: string; family_name: string; middle_name?: string; gender: string; birthdate: string; birthdate_estimated: boolean; home_district: string; home_traditional_authority: string; home_village: string; current_district: string; current_traditional_authority: string; current_village: string; landmark: string; cell_phone_number: string; occupation: string; } interface ModifyPersonI { program_id?: number; given_name?: string; family_name?: string; gender?: string; birthdate?: string; birthdate_estimated?: boolean; home_district?: string; home_traditional_authority?: string; home_village?: string; current_district?: string; current_traditional_authority?: string; current_village?: string; landmark?: string; cell_phone_number?: string; occupation?: string; } interface NewStateI { state: number; date: string; } interface NewTestsI { concept_id: number; } interface NewOrderI { accession_number: string; encounter_id: number; tests: NewTestsI[]; reason_for_test_id: string; target_lab: string; date: string; requesting_clinician: string; specimen?: { concept_id: number; }; } interface NewLabOrderI { encounter_id: number; order: NewOrderI[]; } interface DrugI { drug_inventory_id: number; dose: number; drug?: any; dosage_struct?: any; order?: any; equivalent_daily_dose: number; frequency: string; start_date: string; auto_expire_date: string; instructions: string; units: string; quantity?: number; } interface PatientI { patient_id: number; tribe: string | null; creator: string; date_created: string; changed_by: number; date_changed: string; voided: number; voided_by: string | null; date_voided: string | null; void_reason: string | null; merge_history: any[]; tpt_status: { tpt: string | null; completed: boolean; tb_treatment: boolean; tpt_init_date: string | null; tpt_complete_date: string | null; tpt_end_date: string | null; }; art_start_date: string; person: PersonI; patient_identifiers: PatientIdentifierI[]; } interface PatientIdentifierI { patient_identifier_id: number; patient_id: number; identifier: string; identifier_type: number; preferred: number; location_id: number; creator: number; date_created: string; voided: number; voided_by: number | null; date_voided: string | null; void_reason: string | null; uuid: string; } interface DemographicSearchParamsI { given_name?: string; family_name?: string; gender?: string; middle_name?: string; birthdate?: string; } interface RelationshipTypeI { relationship_type_id: number; a_is_to_b: string; b_is_to_a: string; preferred: number; weight: number; description: string; creator: number; date_created: string; uuid: string; retired: boolean; retired_by: null | number; date_retired: null | string; retire_reason: null | string; } interface RelationI { relationship_id: number; person_a: number; relationship: number; person_b: number; creator: number; date_created: string; voided: number; voided_by: null | number; date_voided: null | string; void_reason: null | string; uuid: string; type: RelationshipTypeI; relation: PersonI; } interface RegionI { region_id: number; name: string; creator: number; date_created: string; retired: boolean; retired_by: null | number; date_retired: null | string; retire_reason: null | string; } interface DistrictI { district_id: number; name: string; region_id: number; creator: number; date_created: string; retired: boolean; retired_by: null | number; date_retired: null | string; retire_reason: null | string; } interface TAI { traditional_authority_id: number; name: string; district_id: number; creator: number; date_created: string; retired: boolean; retired_by: null | number; date_retired: null | string; retire_reason: null | string; } interface VillageI { village_id: number; name: string; traditional_authority_id: number; creator: number; date_created: string; retired: boolean; retired_by: null | number; date_retired: null | string; retire_reason: null | string; } interface LocationI { location_id: number; name: string; description: string; address1: string; address2: string; city_village: string; state_province: string; postal_code: string; country: string; latitude: string; longitude: string; creator: number; date_created: string; county_district: null | string; neighborhood_cell: null | string; region: null | string; subregion: null | string; township_division: null | string; retired: boolean; retired_by: null | number; date_retired: null | string; retire_reason: null | string; location_type_id: null | number; parent_location: null | number; uuid: string; district: string; } interface NewDrugOrderI { encounter_id: number; drug_orders: DrugI[]; } interface LoginAuthenticationResponse { authorization: AuthorizationDataI; } interface UserActivationI { message: string[]; user: UserI; } interface UserPropertyI { user_id: number; property: string; property_value: string; } interface NewGlobalPropertyI { property: string; property_value: string; description: null | string; uuid: string; } interface ObsFiltersI { person_id?: number; concept_id?: number; encounter_id?: number; order_id?: number; value_coded?: number; value_datetime?: string; value_numeric?: number; accession_number?: number; value_text?: string; program_id?: number; date?: string; start_date?: string; end_date?: string; } interface ConceptNameI { concept_id: number; name: string; locale: string; creator: number; date_created: string; concept_name_id: number; voided: number; voided_by: any; date_voided: any; void_reason: any; uuid: string; concept_name_type: string; locale_preferred: number; } interface ConceptI { concept_id: number; retired: number; short_name: any; description: any; form_text: any; datatype_id: number; class_id: number; is_set: number; creator: number; date_created: string; default_charge: any; version: string; changed_by: any; date_changed: any; retired_by: any; date_retired: any; retire_reason: any; uuid: string; concept_names: ConceptNameI[]; } interface ObservationI { obs_id: number; person_id: number; concept_id: number; encounter_id: number; order_id: any; obs_datetime: string; location_id: any; obs_group_id: any; accession_number: any; value_group_id: any; value_boolean: any; value_coded: any; value_coded_name_id: any; value_drug: any; value_datetime: any; value_numeric: number; value_modifier: any; value_text: any; date_started: any; date_stopped: any; comments: any; creator: number; date_created: string; voided: number; voided_by: any; date_voided: any; void_reason: any; value_complex: any; uuid: string; concept: ConceptI; children: ObservationI[]; } interface EncounterFiltersI { program_id?: number; patient_id?: number; location_id?: number; encounter_type_id?: number; date?: string; page?: number; page_size?: number; } interface EncounterTypeI { encounter_type_id: number; name: string; description: string; creator: number; date_created: string; retired: number; retired_by: null | any; date_retired: null | any; retire_reason: null | any; uuid: string; } interface ProgramI { program_id: number; concept_id: number; creator: number; date_created: string; changed_by: number; date_changed: string; retired: number; name: string; description: string; uuid: string; } interface NewEncounterI { encounter_type_id: number; patient_id: number; program_id: number; provider_id?: number; encounter_datetime?: string; } interface EncounterI { encounter_id: number; encounter_type: number; patient_id: number; provider_id: number; location_id: number; form_id: null | any; encounter_datetime: string; creator: number; date_created: string; voided: number; voided_by: null | any; date_voided: null | any; void_reason: null | any; uuid: string; changed_by: number; date_changed: string; program_id: number; type: EncounterTypeI; patient: { patient_id: number; tribe: null | any; creator: number; date_created: string; changed_by: null | any; date_changed: null | any; voided: number; voided_by: null | any; date_voided: null | any; void_reason: null | any; }; location: LocationI; provider: PersonI; program: ProgramI; observations: ObservationI[]; } interface EncounterCountParamsI { encounter_types: number[]; program_id?: number; date?: string; } interface UpdateEncounterI { type_id?: number; patient_id?: number; provider_id?: number; encounter_datetime?: string; } interface UserFiltersI { page_size?: number; page?: number; role?: UserRoleName; } interface ConceptFiltersI { name?: string; set?: string; page_size?: number; page?: number; } declare class export_default{ programID: number; readonly NATIONAL_ID_TYPE = 3; constructor(programID: number); isDDeEnabled(): Promise<boolean>; enableDDe(): Promise<JsonRequestResponse<NewGlobalPropertyI>>; disableDDe(): Promise<JsonRequestResponse<NewGlobalPropertyI>>; findByNpid(npid: string): Promise<JsonRequestResponse<unknown>>; findByDemographics(demographics: DDESearchDemographicsI): Promise<JsonRequestResponse<DDESearchByDemographicsResponse>>; findVoidedNpid(npid: string): Promise<JsonRequestResponse<unknown>>; getRemainingNpids(): Promise<JsonRequestResponse<unknown>>; reassignNpid(docID: string, patientID: number): Promise<JsonRequestResponse<unknown>>; createNpID(npid: string, patientID: number): Promise<JsonRequestResponse<unknown>>; getLocalAndRemoteDiffs(patientID: number): Promise<JsonRequestResponse<unknown>>; updateLocalDiffs(diffs: any, patientID: number): Promise<JsonRequestResponse<unknown>>; refreshDemographics(patientID: number): Promise<JsonRequestResponse<unknown>>; importPatient(docID: string): Promise<JsonRequestResponse<PatientI>>; mergePatients(primary: DDEclientMergeDataI, secondary: DDEclientMergeDataI): Promise<JsonRequestResponse<unknown>>; checkPotentialDuplicates(demographics: Record<string, any>): Promise<JsonRequestResponse<unknown>>; } declare const _default$a: { get(property: string): Promise<JsonRequestResponse<Record<string, string>>>; set(property: string, propertyValue: string): Promise<JsonRequestResponse<NewGlobalPropertyI>>; isProp(property: string): Promise<boolean>; }; declare const _default$9: { readonly AUTH: "_auth_"; readonly HOST: "_host_"; readonly KEEP_USER_LOGGED_IN_FLAG: "_keep_user_logged_in_"; userRoles: RoleI[]; host: string; token: string; username: string; userID: number; personID: number; tokenExpiryDate: string; sessionAvailable: boolean; canPersistLogin: boolean; interceptRequest: (req: RequestDataI) => RequestDataI; interceptResponse: (req: RequestDataI, res: JsonRequestResponse) => JsonRequestResponse; /** * This will return the current logged in user's name * @returns */ getUsername(): string; /** * Get the logged in user's person id * @returns */ getProviderID(): number; /** * Returns userID of currently logged in user * @returns */ getUserID(): number; /** * Returns URL of API host * @returns */ getHost(): string; /** * Configure API host URL i.e. http://localhost:3000 or https://emr.malawi.com * @param host */ setHost(host: string): void; /** * Generic function for running API endpoints. * @param relativeUrl * @param data * @param baseUrl * @returns */ restRequest<T = any>(relativeUrl: string, data: RequestBodyI, baseUrl?: string): Promise<JsonRequestResponse<T>>; /** * Authentication methord that creates a temporary session on the client side after a successful login * @param username * @param password * @returns */ login(username: string, password: string, canPersistLogin?: boolean): Promise<JsonRequestResponse<LoginAuthenticationResponse>>; /** * Starts a new session by saving authentication data and updating the session state. * @param data - The authorization data containing token, expiry time, user details, and roles. */ startSession(data: AuthorizationDataI): void; /** * Verifies a password reset token by making a POST request to the API. * If the token is valid, starts a new session with the returned authorization data. * @param token - The reset token to verify. * @returns A boolean indicating whether the token verification was successful. */ verifyResetToken(token: string): Promise<boolean>; /** * Clears login session information on the client side */ logout(): void; /**Simple check to verify login session */ isLoggedIn(): boolean; /** * Validates provided roles against roles assigned to the current login user * @param roles * @returns */ userHasRoles(roles: UserRoleName[]): boolean; /** * Perfoms GET http requests with optional parameters * @param url * @param params * @returns */ getJson<T>(url: string, params?: Record<string, any>): Promise<JsonRequestResponse<T>>; /** * Perfoms POST http requests with provided data * @param url * @param data * @returns */ postJson<T>(url: string, data: any): Promise<JsonRequestResponse<T>>; /** * Perfoms PUT http requests with provided data * @param url * @param data * @returns */ putJson<T>(url: string, data: any): Promise<JsonRequestResponse<T>>; /** * Perfoms DELETE http requests with provided data * @param url * @param data * @returns */ void<T>(url: string, params?: {}): Promise<JsonRequestResponse<T>>; /** * Method for validating expiration status of a token * @returns */ tokenHasExpired(): boolean; /** * Perfoms a healthcheck operation to verify if the API is up * @returns */ apiOk(): Promise<boolean>; /** * Gets current date from the API * @returns */ getDate(): Promise<unknown>; /** * Gets current API version * @returns */ getVersion(): Promise<string | undefined>; /** * Caches authentication data */ saveState(): void; /** * Reads saved authentication state */ loadState(): void; clearState(): void; }; declare const _default$8: { all(params?: UserFiltersI): Promise<JsonRequestResponse<UserI[]>>; get(id: number): Promise<JsonRequestResponse<UserI>>; create(user: NewUserI): Promise<JsonRequestResponse<UserI>>; update(id: number, user: UpdatedUserI): Promise<JsonRequestResponse<UserI>>; activate(id: number): Promise<JsonRequestResponse<UserActivationI>>; deactivate(id: number): Promise<JsonRequestResponse<UserActivationI>>; }; declare const _default$7: { get(property: string): Promise<JsonRequestResponse<UserPropertyI>>; set(property: string, propertyValue: string): Promise<JsonRequestResponse<UserPropertyI>>; }; declare const _default$6: { all(params?: ObsFiltersI): Promise<JsonRequestResponse<ObservationI>>; create(encounterID: number, observations: ObsValueI[]): Promise<JsonRequestResponse<ObservationI>>; update(id: number, params: ObsValueI): Promise<JsonRequestResponse<ObservationI>>; void(id: number, reason: string): Promise<JsonRequestResponse<unknown>>; }; declare const _default$5: { getCurrentFacility(): Promise<JsonRequestResponse<LocationI>>; getFacilities(params?: Record<string, string | number>): Promise<JsonRequestResponse<LocationI[]>>; getFacility(locationID: number): Promise<JsonRequestResponse<LocationI>>; getRegions(): Promise<JsonRequestResponse<RegionI[]>>; getDistricts(regionID: number): Promise<JsonRequestResponse<DistrictI[]>>; getTraditionalAuthorities(districtID: number, name?: string): Promise<JsonRequestResponse<TAI[]>>; getVillages(traditionalAuthorityID: number, name?: string): Promise<JsonRequestResponse<VillageI[]>>; createAddress(locationName: string, type: "Village" | "TA", parentLocationID: number): Promise<JsonRequestResponse<Record<"name", string>>>; getDistrictByID(id: number): Promise<DistrictI>; getTraditionalAuthorityById(id: number | string): Promise<TAI>; }; declare const _default$4: { create(personId: number, programID: number): Promise<JsonRequestResponse<PatientI>>; searchBy(searchParams: DemographicSearchParamsI): Promise<JsonRequestResponse<PatientI[]>>; searchByNpid(npid: string): Promise<JsonRequestResponse<PatientI[]>>; searchByOtherID(idType: number, identifier: string): Promise<JsonRequestResponse<PatientI[]>>; getVisitDates(patientId: number, programID: number, params?: Record<string, any>): Promise<JsonRequestResponse<string[]>>; get(patientId: number): Promise<JsonRequestResponse<PatientI>>; getAll(patientIds: Array<number>): Promise<JsonRequestResponse<PatientI[]>>; void(patientId: number, reason: string): Promise<JsonRequestResponse<unknown>>; }; declare const _default$3: { all(): Promise<JsonRequestResponse<NewPersonI>>; get(personId: number): Promise<JsonRequestResponse<PersonI>>; create(person: NewPersonI): Promise<JsonRequestResponse<PersonI>>; update(personId: number, programID: number, person: ModifyPersonI): Promise<JsonRequestResponse<PersonI>>; getSimilarFamilyNames(name: string): Promise<JsonRequestResponse<string[]>>; getSimilarMiddleNames(name: string): Promise<JsonRequestResponse<string[]>>; getSimilarGivenNames(name: string): Promise<JsonRequestResponse<string[]>>; getNames(personId: number): Promise<JsonRequestResponse<PersonNameI>>; void(personId: number, reason: string): Promise<JsonRequestResponse<unknown>>; }; declare const _default$2: { createOrder(order: NewLabOrderI): Promise<JsonRequestResponse<unknown>>; getTestTypes(): Promise<JsonRequestResponse<unknown>>; getTestTypesBySpecimen(specimenType?: string): Promise<JsonRequestResponse<unknown>>; getSpecimens(testName: string): Promise<JsonRequestResponse<unknown>>; verifyAccessionNumber(accessionNumber: string): Promise<JsonRequestResponse<unknown>>; }; declare const _default$1: { createOrder(orders: NewDrugOrderI[]): Promise<JsonRequestResponse<unknown>>; getDrugs(params?: Record<string, string | number>): Promise<JsonRequestResponse<unknown>>; getOPDDrugs(params?: Record<string, string | number>): Promise<JsonRequestResponse<unknown>>; }; declare const _default: { all(params?: EncounterFiltersI): Promise<JsonRequestResponse<EncounterI[]>>; get(id: number): Promise<JsonRequestResponse<EncounterI>>; /** Generate a report on counts of various encounters POST /reports/encounters Optional parameters: all - Retrieves all encounters not just those created by current user */ count(params: EncounterCountParamsI): Promise<JsonRequestResponse<Record<string, { M?: number; F?: number; }>>>; create(encounter: NewEncounterI): Promise<JsonRequestResponse<EncounterI>>; update(id: number, encounter: UpdateEncounterI): Promise<JsonRequestResponse<EncounterI>>; void(id: number, reason: string): Promise<JsonRequestResponse<unknown>>; }; export { _default$9 as ApiCore, ApiDataI, AuthorizationDataI, ClientError, ConceptFiltersI, ConceptI, ConceptNameI, DDESearchByDemographicsResponse, DDESearchDemographicsI, DDEclientMergeDataI, export_default as DemographicExchange, DemographicSearchParamsI, DistrictI, _default$1 as Drug, DrugI, _default as Encounter, EncounterCountParamsI, EncounterFiltersI, EncounterI, EncounterTypeI, _default$a as GlobalProperty, IdentificationTypeName, JsonRequestResponse, _default$2 as Lab, _default$5 as Location, LocationI, LoginAuthenticationResponse, ModifyPersonI, NewDrugOrderI, NewEncounterI, NewGlobalPropertyI, NewLabOrderI, NewObsI, NewOrderI, NewPatientI, NewPersonAttributeI, NewPersonI, NewStateI, NewTestsI, NewUserI, _default$6 as Obs, ObsFiltersI, ObsValueI, ObservationI, _default$4 as Patient, PatientI, PatientIdentifierI, _default$3 as Person, PersonAttributeI, PersonAttributeTypeI, PersonI, PersonNameI, ProgramI, RegionI, RelationI, RelationshipTypeI, RequestBodyI, RequestDataI, RoleI, TAI, UpdateEncounterI, UpdatedUserI, _default$8 as User, UserActivationI, UserFiltersI, UserI, _default$7 as UserProperty, UserPropertyI, UserRoleName, VillageI };