{"version":3,"sources":["../../src/provider-api/module.js","../../src/provider-api/services/AppointmentRepository.js","../../src/provider-api/services/AttachmentApprovalRepository.js","../../src/provider-api/services/AttachmentRepository.js","../../src/provider-api/services/BlockedSlotBehavior.js","../../src/provider-api/services/CalendarRepository.js","../../src/provider-api/services/CustomDiagnosisRepository.js","../../src/provider-api/services/DiagnosisRepository.js","../../src/provider-api/services/drugs/DosingService.js","../../src/provider-api/services/drugs/DrugRepository.js","../../src/provider-api/services/ExternalPatientsRepository.js","../../src/provider-api/services/FinancialCenterService.js","../../src/provider-api/services/fnc/EpaRepository.js","../../src/provider-api/services/fnc/FncDxRepository.js","../../src/provider-api/services/fnc/FncPlanRepository.js","../../src/provider-api/services/fnc/FncRepository.js","../../src/provider-api/services/fnc/FncRxRepository.js","../../src/provider-api/services/fnc/FncVisitInfoRepository.js","../../src/provider-api/services/fnc/VisitCommentRepository.js","../../src/provider-api/services/GeneralNotesRepository.js","../../src/provider-api/services/history/HxMedicationRepository.js","../../src/provider-api/services/history/MedicalDevicesRepository.js","../../src/provider-api/services/imo/ImoDiagnosisRepository.js","../../src/provider-api/services/imo/ImoDiagnosisService.js","../../src/provider-api/services/ListService.js","../../src/provider-api/services/locks/Locker.js","../../src/provider-api/services/locks/LockManager.js","../../src/provider-api/services/locks/LockRepository.js","../../src/provider-api/services/locks/MessageLocker.js","../../src/provider-api/services/locks/VisitLocker.js","../../src/provider-api/services/MessageRepository.js","../../src/provider-api/services/MetadataRepository.js","../../src/provider-api/services/MetadataService.js","../../src/provider-api/services/NoteRepository.js","../../src/provider-api/services/patients/ChargeCaptureRepository.js","../../src/provider-api/services/patients/DiagnosisSummaryRepository.js","../../src/provider-api/services/patients/PatientAttachmentRepository.js","../../src/provider-api/services/patients/PatientRecallsRepository.js","../../src/provider-api/services/patients/PatientRepository.js","../../src/provider-api/services/patients/VisitRepository.js","../../src/provider-api/services/PersonRepository.js","../../src/provider-api/services/PharmacyRepository.js","../../src/provider-api/services/PrmUserRepository.js","../../src/provider-api/services/ProcedureRepository.js","../../src/provider-api/services/providers/ProviderRepository.js","../../src/provider-api/services/SigRepository.js","../../src/provider-api/services/sigwriter/SigWriterRepository.js","../../src/provider-api/services/users/settings/LicenseService.js","../../src/provider-api/services/users/settings/SettingRepository.js","../../src/provider-api/services/users/settings/SettingService.js","../../src/provider-api/services/validation/ValidationResult.js","../../src/provider-api/services/validation/ValidationWarnings.js","../../src/provider-api/services/VersionService.js"],"names":["angular","module","factory","AprimaRestangular","MetadataRepository","$q","moment","AprimaAnalytics","SingleAccessSet","apptListeners","modifiedCalendarIdsForCalendarList","modifiedCalendarIdsForDashboard","getAppointment","uid","appComponent","subRoute","timing","startTiming","restangular","get","all","one","then","appt","getClone","copy","finally","stop","updateAppointment","put","Calendar","add","Id","createAppointment","post","getAppointmentsInternal","calendarId","params","restangularOptions","getList","when","getAppointmentDetails","getAppointmentMetadata","$scope","getMetadata","getDashboardAppointments","calendar","isString","ignoreCache","options","date","format","offsetMinutes","utcOffset","contains","getAppointments","getGroupAppointmentMetadata","getBlockingEventAppointmentMetadata","getEventAppointmentMetadata","getGroupAppointment","getEventAppointment","addListener","callback","indexOf","push","removeListener","pop","getBlockingEventAppointment","updatePatientAppointment","createPatientAppointment","updateGroupAppointment","createGroupAppointment","updateEventAppointment","createEventAppointment","updateBlockingEventAppointment","createBlockingEventAppointment","approve","messageUid","attachmentUid","aprimaRestangular","getAttachment","attachmentId","requestSettings","applicationComponent","disableInLinePdf","inlinePDF","queryString","page","height","width","getAttachmentStaticUrl","getAttachmentRetainOriginalFormat","Object","blockedSlotBehavior","window","defineProperties","None","value","writable","enumerable","configurable","Override","BookInAddition","constant","getDayTemplate","getAppointmentOpenSlots","search","startDate","appointmentTypeId","Error","routePrefix","getdiagnoses","_","partial","abortable","promisesToAbort","paramsObj","result","route","getFn","restElement","data","isNil","reject","api","JSON","stringify","customGet","element","customGET","getDiagnoses","searchString","records","codeType","getModifiers","AprimaCache","DoseRangeInfo","DoseRangeUtil","Guid","NumUtil","ServerInfoRepository","SystemGuid","convertToCommonUnit","getDoseRangeInfo","getMinMaxWarning","sigInstructions","rxParameters","patientDetails","dosageUnits","unit","drugDoseFormId","drug","UnitId","dosageUnitsBase","unitId","baseline","medicationUnitTablets","medicationUnitCapsules","medicationUnitPuffs","medicationUnitDrops","medicationUnitTeaspoons","medicationUnitTablespoons","medicationUnitOz","medicationUnitMilliliters","medicationUnitSpray","medicationUnitGrams","medicationUnitMilligrams","medicationUnitMicrograms","getBaseUnitFromSelection","drugDoseFormIdBase","getBaseUnitForDrug","areCompatibleUnits","mapDoseParams","dosageAmount","ageInDays","medId","gcnSeqNo","weight","gestationalAge","doseTypeIndicator","icdCode","singleDosingInfo","GetMaxMinWarningMsg","frequencyPerDay","durationOfTherapyInDays","getDosingDetailsFull","visitId","patientId","defaultValue","isFeatureSupported","VisitId","PatientId","getComprehensiveDosingDetails","empty","getVisitDosingDetails","getPatientDosingDetails","getVariableDoseRanges","withHttpConfig","cache","Default","httpMode","weightKg","heightCm","AgeInDays","MedId","GcnSeqNo","WeightKg","HeightCm","GestationalAgeInWeeks","DoseTypeIndicator","IcdCode","promise","doseRanges","compact","isEmpty","map","item","mapFromDto","frequency","DosesPerDay","visit","weightDate","heightDate","WeightInKg","WeightPerformedDate","HeightInCm","HeightPerformedDate","endDate","diff","dosage","Name","multiply","divide","CurrentUser","SettingRepository","searchText","previousSearch","includeNonDispensable","kdbConfigurationId","providerId","userId","includeInactive","includeObsolete","words","inactiveTerms","obsoleteTerms","filter","s","toUpperCase","length","difference","join","endpoint","SearchText","ProviderId","IncludeInactive","IncludeObsolete","KdbConfigurationId","list","standardizedList","handleObsoleteProperty","getPatientActiveDrugs","getMfuDrugs","drugDosageAlternativesSearch","customPOST","Drug","drugScreening","getDrugDocumentation","ndc","mode","NDC","BriefMode","getDrugDocumentationV2","routeNdc","getDrugDocumentationV1","getDrugDosingSuggestions","patientIdOrGuidEmpty","getDrugFormularyInfo","getDrugRepresentativeFormularies","eRxEligibilityId","relVisitMedicationId","pharmacyId","days","dispenseAsWritten","totalQuantity","unitOfMeasureId","previousPMBCParameters","previousRFSParameters","url","encodeURIComponent","getDrugFormularyDetail","getDrugDetail","relPatientMedicationId","sigId","getDrugDetailHistory","rxMedicationHistoryDetailUid","getDrugSearchIncludeInactive","getKdbConfigurationId","renderingProviderId","billingProviderId","nddDrugScreening","otherDrugs","previousMedicationSigId","OtherDrugs","PreviousMedicationSigUid","nddDrugScreeningMobile","drugSearchList","isArray","forEach","drugResult","has","IsInactiveOrObsolete","storage","storageKey","requestExternalPatients","set","getExternalPatients","externalPatientListId","defaults","startOf","toJSON","remove","getExternalPatient","hospitalRoundId","addExternalPatient","command","editExternalPatient","HospitalRoundId","customPUT","getAddExternalPatientModelMetadata","getEditExternalPatientModelMetadata","dischargePatient","defaultCache","getDefault","defaultToMain","serviceSiteId","requiredFeature","canSendEpaRequest","sendEpaRequest","postImoDiagnoses","postDiagnoses","deleteDiagnosis","diagnosisId","deleteDiagnoses","diagnosisIds","DeviceSettings","Bridge","getPlans","inactivatePlan","plan","isPrm","fireEvent","VisitDate","VisitUid","VisitDiagnosisId","VisitDiagnosisUid","catch","error","console","log","saveDefaults","planConfigurationId","configuration","updatePlan","getClinicalNotes","getContext","createVisitFromAppt","appointmentId","clinicalNoteTypeId","AppointmentId","ClinicalNoteTypeId","getAuthCode","patientCaseId","visitDate","addPrescription","prescription","changeMedication","Prescription","RelPatientMedicationId","changeMedicationFromHistoryOnly","deleteRx","editPrescription","editPrescriptionDiagnosis","problems","getAuthorizedPrescriberList","sigType","getDrugScreeningResults","getKdbConfigurationIdByVisit","getNddDrugScreeningResultsFromPatient","getNddDrugScreeningResults","getPrescriberRights","getRx","getSigwriterNddDrugScreeningResults","medicationSigId","MedicationSigId","getVisitMedStatus","getVisitMedStatuses","relVisitMedicationIdList","relVisitMedicationIds","Results","getVisitPrescriptions","refillMedication","refillMedicationFromPreviousVisit","SelectedRelVisitMedicationId","startChange","startChangeFromHistoryOnly","startCppMedication","cppMedicationId","startRefill","startRefillFromPreviousVisit","startRefills","relPatientMedicationIds","startRefillWithoutVisit","updateRxPharmacies","RelVisitMedicationIds","PharmacyId","getQueuedMedications","deleteQueuedMedication","updateRxRefill","refillQty","medicaitonDays","create","visitInfo","save","scope","getVisitComment","visitCommentType","visitComment","updateVisitComment","visitCommentTypeDto","service","generalNoteTypeId","generalNoteTypeUid","getGeneralNoteType","noteTypeOrId","cachedItem","generalNoteTypeCache","plain","saveGeneralNoteTypeSetting","noteTypeKey","generalNoteType","NoteTypeKey","GeneralNoteType","skippedSigwriter","dto","SkippedSigwriter","deleteMedication","medication","RelPatientMedicationUid","getMedicationListFilters","subtype","getPatientTakesNoMeds","getPrescriptionHistory","filterId","FilterId","getPrescriptionHistoryForDiscontinueCancel","RelPatientMedicationIds","getTransitionOfCare","setMedicationFilter","setMedicationFilterDto","setPatientTakesNoMeds","patientTakesNoMeds","setTransitionOfCare","transitionOfCare","getPatientMedStatus","getPatientMedStatuses","relPatientMedicationIdList","discontinueCancelMedications","isRxOnPatientAllergyList","getCompareInfoForDiscontinueCancel","getMedicalDeviceParseUdi","uniqueDeviceId","searchCriteria","UniqueDeviceIdentifier","getMedicalDeviceLookup","deviceId","DeviceIdentifier","getMedicalDevices","createMedicalDevice","createDeviceAttributes","updateMedicalDevice","updateDeviceAttributes","PatientMedicalDeviceHistoryId","displayMedicalDeviceHistory","groupingId","ImoPatient","term","terms","detail","details","count","regularGet","patient","createPatientParams","CountOnly","hasAge","PatientAge","standardizedAge","hasGender","PatientGender","standardizedGender","ImoDiagnosisRepository","code","localCache","getSingle","ImoTerms","codes","ImoDetails","aprimaCache","getData","LexicalCode","codesToBeLoaded","LexicalCodes","ListRepository","MessageTypes","RequestTypes","medicationsListTypeRegex","getLists","lists","listPromises","mapValues","listType","scopeProperty","allPromises","removeHttpError","listData","response","message","status","addHttpError","responseListType","queryListType","name","listParams","test","replace","split","internalGetList","plainList","listName","types","subTypes","supportedTypes","SupportedMessageTypesForCreate","Types","supportedSubTypes","SubTypes","t","findIndex","id","messageTypeId","messageSubTypeId","find","MessageTypeId","union","sortBy","getListJs","Lists","getDefaultCache","durations","getMinutesDurationObject","getHoursDurationObject","minutes","prefix","suffix","opts","Description","hours","LockManager","$log","Locker","objArr","lockType","objId","objName","self","this","objs","obj","$on","event","args","currentLock","LockInfo","InstanceId","oldLock","newLock","unlock","prototype","lock","LockInstanceId","info","lockInfo","LockType","ObjectId","LockRepository","$rootScope","$interval","refreshInterval","locks","refreshLocks","isAuthenticated","each","refreshLock","lockResponse","$broadcast","isLocked","objectId","l","findLock","toLowerCase","instanceId","getLocks","cloneDeep","startRefreshingLocks","stopRefreshingLocks","cancel","unsupportedLockTypePromise","getRestangularizedLock","lockObjId","getQueryStringObj","qs","isNewLockingSupported","isLockTypeSupported","startsWith","m","customDELETE","MessageLocker","messageId","call","constructor","VisitLocker","Restangular","messageListeners","getAll","messageFilterId","emitUpdateMessage","i","getDashboardMessages","getMessage","updateBadges","savePhoneMessage","saveTaskMessage","savePortalMessage","replyToPortalMessage","getPhoneMessageDetails","getTaskMessageDetails","getPortalMessageDetails","createTaskMessage","getTaskMessageMetadata","createPhoneMessage","getPhoneMessageMetadata","createPortalMessage","getPortalMessageMetadata","getAttachmentApprovalMessage","saveAttachmentApprovalMessage","getServiceOrderApprovalMessage","saveServiceOrderApprovalMessage","getRxRefillMessage","saveRxRefillMessage","getRxRefillMessageV2","saveRxRefillMessageV2","getPharmacyRefillMessage","request","msg","RefillRequest","hasOwnProperty","PrescribedMedication","Comment","MedicationComment","Date","MedicationDate","Duration","MedicationName","ProductCode","MedicationNdc","ProductCodeDescription","PotencyUnitCode","MedicationPotencyUnitCode","Quantity","MedicationQuantity","QuantityQualifierTerm","MedicationQuantityQualifier","Sig","MedicationSig","Strength","MedicationStrength","StrengthUnits","MedicationStrengthUnits","savePharmacyRefillMessage","getPharmacyRefillMessageMetadata","getPatientPortalMessageRoutingType","$filter","LocalStorageRepository","typeName","metadata","getKey","deferred","defer","resolve","getMetadataFromStorage","getMetadataFromServer","Fields","metadataParser","fields","field","propertyName","dots","FieldName","shift","ElementMetadata","Minimum","toDate","Maximum","setKey","getObjectFromMetadata","attrs","stack","ngModel","reduce","prop","convertNgModelExprToMetadataExpr","ngModelExpr","getNotes","getProviderChargeCaptures","providerUid","getChargeCapture","patientUid","chargeCaptureUid","chargeCaptureId","getChargeCaptureMetadata","createChargeCapture","editChargeCapture","removeChargeCapture","getDiagnosisSummaries","getDiagnosisSummary","summaryId","modifiedPatientIds","defaultIgnoreCache","getPatientAttachments","getPatientAttachmentGroup","relAttachmentGroupId","addPatientAttachment","patientAttachment","getAddPatientAttachmentMetadata","getRecalls","visitCacheSet","medicationsCacheSet","getPatient","getDemographics","geteRxEligibilities","getAllergies","getPrimaryInsurance","getProblems","internalGetProblems","getDxProblemsWithDisplayOrder","ActiveOnly","getActiveProblems","getMedications","getRemarks","getRecentVisits","getOrders","getObservationResults","dataFilter","getVitals","vitalsDefaultSettingId","obsDefaultSettingId","getPatientVitalsDefaultSettingId","observationDefaultSettingId","getObservations","getHealthMaintenanceReminders","getObservationValues","observationOrderId","createPatient","getCreatePatientMetadata","getMostRecentObservationValues","updatePatientPhoto","patientPhoto","getPharmacies","getEmVisits","getMedicationsByGroup","medications","group","medicationsExist","drugClasses","groupValue","DrugClassName","undefined","label","active","IsActive","getPatientDetails","getAccounts","getPatientCases","getPatientInformation","appointmentUid","visitUid","accountUid","deletePatientPharmacy","patientPharmacyUid","setPharmacyOrder","activeOnly","getVisit","getVisitDetail","getVisitDocument","createVisit","$emit","Patient","getVisitByAppointment","getVisitDocumentForVisitText","updatePersonPhoto","getPharmacy","getPharmacyByMasterPharmacyId","searchPharmacies","query","searchPharmaciesIncludeAllMailOrders","includeAllMailOrders","getUser","searchUsers","inputSearch","quicksearch","getProcedures","getProviderSupervisorListByProviderId","getProviderById","getSupervisorList","getDefaultSupervisor","linkSupervisorDto","getSig","getSigwriterResults","checkIsSpecialtyId","rxnorm","getDirectionsSettings","checkIsSpecialtyMedication","SigType","CheckIsSpecialtyMedication","getDrugCptList","medid","getDrugSelected","drugSelected","getDrugSettings","getVisitInfo","startNewRx","SelectedDrug","initializeDefaultSig","currentRx","providerDefaultSigId","saveDefaultSig","createModifyDefaultSigDto","ProviderDefaultSigId","getDefaultSigMetadata","hasFdbDosingLicense","licenses","getCurrentUserLicenses","HasFdbDosing","hasImoDiagnosisLicense","HasImoDiagnosis","DashboardStructure","configToPhoneConfigMapper","partialRight","mapToDeviceConfig","configToTabletConfigMapper","configToDesktopConfigMapper","providerDashboard","userid","userSettings","patientDashboardTiles","patientDashboardConfigurations","dashboardStructure","repositoryRoute","configs","mapFn","phoneConfigs","tabletConfigs","desktopConfigs","allConfigs","createPatientDashboardConfiguration","updatePatientDashboardConfiguration","dashboardId","deletePatientDashboardConfiguration","getProviderSettings","saveProviderSettings","settings","getProviderEpcsSettings","siteId","getKdbConfiguration","getKdbConfigurationByVisit","getSigWriterSettings","siteSettings","config","index","collection","deviceSelector","ExternalId","DisplayOrder","Tiles","debounce","ProviderSettingsDtoMapper","SettingsService","SiteSettingsService","saveSettingsPromise","serverAllowsSavingSettings","updateNativeSettings","badgeSetting","Value","getAppointmentsBadgeSettings","hideDischarged","calendarSettings","getAppointmentsListSettings","calendarUidSetting","calendarIds","messageListSettings","getMessagesListSettings","messageFilter","filters","startFilter","messageFilterUidSetting","updateSettings","setDashboardSettings","dashboardSettings","providerSettings","tiles","tile","Calendars","ExternalPatientsFilter","ServiceSite","getDefaultServiceSiteId","setDefaultServiceSiteId","setDefaultDashboardTileSettings","setDashboardTileSettings","scheduleSettings","setting","ScheduleCalendarIds","displayEndTime","DisplayEndTime","findSlotForNewAppt","FindSlotForNewAppt","calendarTiles","Type","firstCalendarTile","setDefaultAppointmentsListSettings","setCalendarSettings","ScheduleSettings","messageSettings","messageFilters","MessageFilterIds","MessageFilter","setDefaultMessagesListSettings","setMessageSettings","MessageSettings","setGeneralNoteTypeSettings","generalNoteTypes","setPhoneMessageGeneralNoteTypeId","PhoneMessageGeneralNoteTypeId","setTaskMessageGeneralNoteTypeId","TaskMessageGeneralNoteTypeId","setPortalMessageGeneralNoteTypeId","PortalMessageGeneralNoteTypeId","setPatientVitalsDefaultSettingId","DefaultVitalsSettingId","setRxRefillMessageGeneralNoteTypeId","RxRefillMessageGeneralNoteTypeId","setPharmacyRefillMessageGeneralNoteTypeId","getRxRefillMessageGeneralNoteTypeId","setPharmacyGeneralNoteTypeId","PharmacyGeneralNoteTypeId","debouncedSaveSettings","getProviderSettingsDto","setSetting","setFn","bind","imperialUnitsAllowed","getAllowImperialUnits","loadSettings","setDefaultAppointmentsBadgeSettings","removePatientDashboardWidgets","setPatientDashboardWidgets","setPatientDashboardConfigurations","deviceSettings","isPhone","PhoneSettings","isTablet","TabletSettings","DesktopSettings","DashboardSettings","GeneralNoteTypes","setCurrentUserLicenses","Licenses","setIsERxEnabled","IsERxEnabled","setAllowImperialUnits","AllowImperialUnitsInPrescription","superbillMethod","DefaultSuperbillStatusId","setDefaultSuperbillSubmissionMethod","setProviderDeviceSettings","setIsCacheClient","IsCacheClient","dashboardRequest","userSettingsRequest","loadProviderSettings","setSiteSettings","loadSiteSettings","dashboardConfiguration","isNewDashboard","getPatientDashboardWidgets","setAppointmentsListSettings","setMessagesListSettings","setAppointmentsBadgeSettings","getDashboardTileSettings","FrequencyDisplayAbbreviationFirst","IsDxInPharmacyInstructionsAnError","sigWriterSettings","ObjUtil","ValidationResult","mapFromApi","resultObj","HasWarning","Message","hasWarning","defineReadonlyProps","insuranceExclusion","accountId","inOfficeHours","checkApiCompatibility","apiVersions","some","SERVER_API_VERSION","checkMinClientVersion","minVersion","checkVersionValid","CLIENT_VERSION","currentVersion","validVersion","currentVersionLonger","len","parseInt","checkVersions","validationPromise","apiCompatible","clientVersionCompatible","getClientVersion","getServerVersions"],"mappings":"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","file":"aprima-provider-api.min.js","sourcesContent":["angular.module('aprima-provider-api', [\r\n 'restangular',\r\n 'angularLocalStorage',\r\n 'lodash',\r\n\r\n //aprima\r\n 'aprima-core',\r\n 'aprima-bridge',\r\n 'aprima-config',\r\n 'aprima-legacy-common'\r\n]);\r\n","angular.module('aprima-provider-api').factory('AppointmentRepository',\r\n ['AprimaRestangular', 'MetadataRepository', '$q', 'moment', 'AprimaAnalytics', 'SingleAccessSet',\r\n function (AprimaRestangular, MetadataRepository, $q, moment, AprimaAnalytics, SingleAccessSet) {\r\n 'use strict';\r\n\r\n var apptListeners = [];\r\n var modifiedCalendarIdsForCalendarList = new SingleAccessSet();\r\n var modifiedCalendarIdsForDashboard = new SingleAccessSet();\r\n\r\n function getAppointment (uid, appComponent, subRoute) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'AppointmentRepository', 'api', 'getAppointment');\r\n\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('appointments' + (subRoute || '')).one(uid).get().then(function(appt){\r\n\r\n //for dealing with date funkiness, and avoiding adding dependencies elsewhere\r\n appt.getClone = function getClone() {\r\n return restangular.copy(appt);\r\n };\r\n\r\n return appt;\r\n }).finally(timing.stop);\r\n }\r\n\r\n function getPatientAppointment (uid, appComponent) {\r\n return getAppointment(uid, appComponent);\r\n }\r\n\r\n function getGroupAppointment (uid, appComponent) {\r\n return getAppointment(uid, appComponent, '/group-visit');\r\n }\r\n\r\n function getEventAppointment (uid, appComponent) {\r\n return getAppointment(uid, appComponent, '/event');\r\n }\r\n\r\n function getBlockingEventAppointment (uid, appComponent) {\r\n return getAppointment(uid, appComponent, '/blocking-event');\r\n }\r\n\r\n function getAppointmentMetadata ($scope) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'getAppointmentMetadata');\r\n return MetadataRepository.getMetadata('appointmentdetail', $scope).finally(timing.stop);\r\n }\r\n\r\n function getGroupAppointmentMetadata ($scope) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'getAppointmentMetadata');\r\n return MetadataRepository.getMetadata('groupvisitappointment', $scope).finally(timing.stop);\r\n }\r\n\r\n function getBlockingEventAppointmentMetadata ($scope) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'getAppointmentMetadata');\r\n return MetadataRepository.getMetadata('blockingeventappointment', $scope).finally(timing.stop);\r\n }\r\n\r\n function getEventAppointmentMetadata ($scope) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'getAppointmentMetadata');\r\n return MetadataRepository.getMetadata('eventappointment', $scope).finally(timing.stop);\r\n }\r\n\r\n var updateAppointment = function (appt) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'updateAppointment');\r\n return appt.put()\r\n .finally(timing.stop)\r\n .finally(function() {\r\n if(appt.Calendar) {\r\n modifiedCalendarIdsForCalendarList.add(appt.Calendar.Id);\r\n modifiedCalendarIdsForDashboard.add(appt.Calendar.Id);\r\n }\r\n });\r\n };\r\n\r\n var createAppointment = function (appt, subRoute) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'createAppointment');\r\n return AprimaRestangular.get().all('appointments' + (subRoute || ''))\r\n .post(appt)\r\n .finally(timing.stop)\r\n .finally(function() {\r\n if(appt.Calendar) {\r\n modifiedCalendarIdsForCalendarList.add(appt.Calendar.Id);\r\n modifiedCalendarIdsForDashboard.add(appt.Calendar.Id);\r\n }\r\n });\r\n };\r\n //TODO: fill in these methods below with correct logic\r\n\r\n function updatePatientAppointment (appt) {\r\n return updateAppointment(appt);\r\n }\r\n\r\n function updateGroupAppointment (appt) {\r\n return updateAppointment(appt);\r\n }\r\n\r\n function updateEventAppointment (appt) {\r\n return updateAppointment(appt);\r\n }\r\n\r\n function updateBlockingEventAppointment (appt) {\r\n return updateAppointment(appt);\r\n }\r\n\r\n function createPatientAppointment (appt) {\r\n return createAppointment(appt);\r\n }\r\n\r\n function createGroupAppointment (appt) {\r\n return createAppointment(appt, '/group-visit');\r\n }\r\n\r\n function createEventAppointment (appt) {\r\n return createAppointment(appt, '/event');\r\n }\r\n\r\n function createBlockingEventAppointment (appt) {\r\n return createAppointment(appt, '/blocking-event');\r\n }\r\n\r\n function getDashboardAppointments(calendar, restangularOptions, appComponent) {\r\n if(angular.isString(restangularOptions)) {\r\n appComponent = restangularOptions;\r\n restangularOptions = null;\r\n }\r\n\r\n restangularOptions = restangularOptions || { ignoreCache: false };\r\n\r\n var calendarId = calendar.Id || null;\r\n var options = {\r\n date: moment().format('MM-DD-YYYY'),\r\n offsetMinutes: moment().utcOffset()\r\n };\r\n\r\n restangularOptions.ignoreCache = modifiedCalendarIdsForDashboard.contains(calendarId) || restangularOptions.ignoreCache;\r\n\r\n return getAppointmentsInternal(calendarId, options, restangularOptions, appComponent);\r\n\r\n }\r\n\r\n function addListener(callback) {\r\n if (apptListeners && callback && apptListeners.indexOf(callback) < 0) {\r\n apptListeners.push(callback);\r\n }\r\n }\r\n\r\n function removeListener(callback) {\r\n if (apptListeners && callback && apptListeners.indexOf(callback) >= 0) {\r\n apptListeners.pop(callback);\r\n }\r\n }\r\n\r\n function getAppointments(calendarId, params, restangularOptions, appComponent) {\r\n if(angular.isString(restangularOptions)) {\r\n appComponent = restangularOptions;\r\n restangularOptions = null;\r\n }\r\n\r\n restangularOptions = restangularOptions || { ignoreCache: false };\r\n\r\n restangularOptions.ignoreCache = modifiedCalendarIdsForCalendarList.contains(calendarId) || restangularOptions.ignoreCache;\r\n\r\n return getAppointmentsInternal(calendarId, params, restangularOptions, appComponent);\r\n }\r\n\r\n function getAppointmentsInternal (calendarId, params, restangularOptions, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'AppointmentRepository', 'api', 'getAppointments');\r\n if (calendarId) {\r\n return AprimaRestangular.get(restangularOptions)\r\n .all('calendars/' + calendarId + '/appointments')\r\n .getList(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n return $q.when([]);\r\n }\r\n\r\n return {\r\n getAppointmentDetails: getPatientAppointment,\r\n getAppointmentMetadata: getAppointmentMetadata,\r\n getDashboardAppointments: getDashboardAppointments,\r\n getAppointments: getAppointments,\r\n getGroupAppointmentMetadata: getGroupAppointmentMetadata,\r\n getBlockingEventAppointmentMetadata: getBlockingEventAppointmentMetadata,\r\n getEventAppointmentMetadata: getEventAppointmentMetadata,\r\n getGroupAppointment: getGroupAppointment,\r\n getEventAppointment: getEventAppointment,\r\n addListener: addListener,\r\n removeListener: removeListener,\r\n getBlockingEventAppointment: getBlockingEventAppointment,\r\n updatePatientAppointment: updatePatientAppointment,\r\n createPatientAppointment: createPatientAppointment,\r\n updateGroupAppointment: updateGroupAppointment,\r\n createGroupAppointment: createGroupAppointment,\r\n updateEventAppointment: updateEventAppointment,\r\n createEventAppointment: createEventAppointment,\r\n updateBlockingEventAppointment: updateBlockingEventAppointment,\r\n createBlockingEventAppointment: createBlockingEventAppointment\r\n };\r\n }]);\r\n","angular.module('aprima-provider-api').factory('AttachmentApprovalRepository', ['AprimaRestangular',\r\n function (AprimaRestangular) {\r\n 'use strict';\r\n\r\n var approve = function (messageUid, attachmentUid) {\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('aamessage', messageUid).one('approve', attachmentUid).post();\r\n };\r\n\r\n\r\n return {\r\n approve: approve\r\n };\r\n\r\n }]);","angular.module('aprima-provider-api')\r\n .factory('AttachmentRepository', ['AprimaRestangular', 'AprimaAnalytics', function (aprimaRestangular, AprimaAnalytics) {\r\n 'use strict';\r\n\r\n var getAttachment = function (attachmentId, requestSettings, applicationComponent, disableInLinePdf) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'AttachmentRepository', 'api', 'getAttachment');\r\n var inlinePDF = (disableInLinePdf) ? false : true;\r\n \tvar queryString = '?page=' + requestSettings.page + '&height=' + requestSettings.height + '&width=' + requestSettings.width + '&inLinePDF=' + inlinePDF;\r\n\r\n return aprimaRestangular.get().one('attachments/' + attachmentId + queryString).get().finally(timing.stop);\r\n };\r\n\r\n var getAttachmentStaticUrl = function (attachmentId, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'AttachmentRepository', 'api', 'getAttachmentStaticUrl');\r\n\r\n return aprimaRestangular.get().one('attachments-url/' + attachmentId).get().finally(timing.stop);\r\n };\r\n\r\n var getAttachmentRetainOriginalFormat = function (attachmentId, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'AttachmentRepository', 'api', 'getAttachmentRetainOriginalFormat');\r\n var queryString = '?retainoriginalformat=true';\r\n return aprimaRestangular.get().one('attachments/' + attachmentId + queryString).get().finally(timing.stop);\r\n };\r\n\r\n return {\r\n getAttachment: getAttachment,\r\n getAttachmentStaticUrl: getAttachmentStaticUrl,\r\n getAttachmentRetainOriginalFormat: getAttachmentRetainOriginalFormat\r\n };\r\n\r\n }]);\r\n","(function(angular, Object) {\r\n 'use strict';\r\n\r\n var blockedSlotBehavior = {};\r\n Object.defineProperties(blockedSlotBehavior, {\r\n None: {\r\n value: 'None',\r\n writable: false,\r\n enumerable: true,\r\n configurable: false,\r\n },\r\n Override: {\r\n value: 'Override',\r\n writable: false,\r\n enumerable: true,\r\n configurable: false,\r\n },\r\n BookInAddition: {\r\n value: 'BookInAddition',\r\n writable: false,\r\n enumerable: true,\r\n configurable: false,\r\n },\r\n });\r\n\r\n\r\n angular.module('aprima-provider-api').constant('BlockedSlotBehavior', blockedSlotBehavior);\r\n})(window.angular, window.Object);\r\n","angular.module('aprima-provider-api').factory('CalendarRepository',\r\n ['AprimaRestangular', '$q',\r\n function (AprimaRestangular, $q) {\r\n 'use strict';\r\n\r\n return {\r\n getDayTemplate: getDayTemplate,\r\n getAppointmentOpenSlots: getAppointmentOpenSlots\r\n };\r\n\r\n function getDayTemplate(calendarId, params) {\r\n\r\n if (calendarId) {\r\n return AprimaRestangular.get()\r\n .all('calendars/' + calendarId + '/daytemplate')\r\n .getList(params);\r\n }\r\n\r\n return $q.when([]);\r\n\r\n }\r\n\r\n function getAppointmentOpenSlots(search) {\r\n if(!search) {\r\n return $q.when(new Error('search object must be defined'));\r\n }\r\n\r\n if(!search.calendarId) {\r\n return $q.when(new Error('calendarId must be defined'));\r\n }\r\n\r\n if(!search.date) {\r\n return $q.when(new Error('date must be defined'));\r\n }\r\n\r\n search = {\r\n calendarId: search.calendarId,\r\n startDate: search.date,\r\n appointmentTypeId: search.appointmentTypeId\r\n };\r\n\r\n return AprimaRestangular.get()\r\n .all('calendars').one(search.calendarId).all('opentemplateslots')\r\n .getList(search);\r\n }\r\n }]);\r\n","(function(angular){\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('CustomDiagnosisRepository', [\r\n '$q',\r\n 'AprimaAnalytics', \r\n 'AprimaRestangular', \r\n CustomDiagnosisRepository\r\n ]);\r\n\r\n function CustomDiagnosisRepository(\r\n $q, \r\n AprimaAnalytics, \r\n AprimaRestangular\r\n ) {\r\n var routePrefix = 'custom-diagnosis';\r\n\r\n var service = {\r\n getdiagnoses: _.partial(getdiagnoses, null),\r\n abortable: abortable,\r\n };\r\n \r\n return service;\r\n\r\n function abortable(promisesToAbort) {\r\n return {\r\n getdiagnoses: _.partial(getdiagnoses, promisesToAbort)\r\n };\r\n }\r\n \r\n\r\n function getdiagnoses(promisesToAbort,paramsObj){\r\n var result=get(promisesToAbort,'getdiagnoses',paramsObj,customGet);\r\n return result;\r\n }\r\n\r\n\r\n function get(promisesToAbort, route, params, getFn) {\r\n var restElement = AprimaRestangular.get().all(routePrefix).all(route);\r\n if(promisesToAbort) {\r\n restElement = restElement.abortable(promisesToAbort);\r\n }\r\n\r\n return getFn(restElement, params).then(function(data) {\r\n if(_.isNil(data)) {\r\n return $q.reject('IMO ' + api + ' request failed for params: ' + JSON.stringify(params));\r\n }\r\n\r\n return data;\r\n });\r\n }\r\n\r\n function customGet(element, params) {\r\n return element.customGET('', params);\r\n }\r\n\r\n }\r\n})(window.angular);","angular.module('aprima-provider-api')\r\n .factory('DiagnosisRepository', ['AprimaRestangular', function (aprimaRestangular) {\r\n 'use strict';\r\n\r\n var getDiagnoses = function (searchString, records, codeType) {\r\n records = records || 20;\r\n \r\n \tvar queryString = '?maxRecords=' + records;\r\n \r\n if(!codeType){\r\n queryString += '&diagnosisText=';\r\n } else if(codeType === 'ICD10'){\r\n queryString += '&icd10Code=';\r\n } else{\r\n queryString += '&icd9Code=';\r\n }\r\n \r\n queryString += searchString;\r\n\r\n return aprimaRestangular.get().all('diagnoses/' + queryString).getList();\r\n };\r\n \r\n var getModifiers = function(){\r\n return aprimaRestangular.get().all('diagnosis/modifiers').getList();\r\n };\r\n\r\n return {\r\n getDiagnoses: getDiagnoses,\r\n getModifiers: getModifiers\r\n };\r\n\r\n }]);","(function(angular) {\r\n 'use strict';\r\n\r\n var teaspoonsToMlMultiplier = 4.92892;\r\n var tablespoonsToMlMultiplier = 14.7868;\r\n var ozToMlMultiplier = 29.57353;\r\n\r\n angular.module('aprima-provider-api').factory('DosingService', [\r\n '$q',\r\n '_',\r\n 'AprimaAnalytics',\r\n 'AprimaCache',\r\n 'AprimaRestangular',\r\n 'DoseRangeInfo',\r\n 'DoseRangeUtil',\r\n 'Guid',\r\n 'NumUtil',\r\n 'ServerInfoRepository',\r\n 'SystemGuid',\r\n DosingService,\r\n ]);\r\n\r\n function DosingService(\r\n $q,\r\n _,\r\n AprimaAnalytics,\r\n AprimaCache,\r\n AprimaRestangular,\r\n DoseRangeInfo,\r\n DoseRangeUtil,\r\n Guid,\r\n NumUtil,\r\n ServerInfoRepository,\r\n SystemGuid\r\n ) {\r\n \r\n var service = {\r\n convertToCommonUnit: convertToCommonUnit,\r\n getDoseRangeInfo: getDoseRangeInfo,\r\n getMinMaxWarning: getMinMaxWarning,\r\n getDosingDetailsFull: getDosingDetailsFull,\r\n getVariableDoseRanges: getVariableDoseRanges,\r\n mapDoseParams: mapDoseParams\r\n };\r\n\r\n return service;\r\n\r\n function getDoseRangeInfo(\r\n ageInDays,\r\n medId,\r\n gcnSeqNo,\r\n weightKg,\r\n heightCm,\r\n gestationalAge,\r\n doseTypeIndicator,\r\n icdCode\r\n ) {\r\n //only fill in gcnSeqNo if no medId\r\n gcnSeqNo = medId ? null : gcnSeqNo;\r\n \r\n var params = {\r\n AgeInDays: ageInDays || 0,\r\n MedId: medId,\r\n GcnSeqNo: gcnSeqNo,\r\n WeightKg: weightKg,\r\n HeightCm: heightCm,\r\n GestationalAgeInWeeks: gestationalAge,\r\n DoseTypeIndicator: doseTypeIndicator,\r\n IcdCode: icdCode,\r\n };\r\n\r\n var promise = AprimaRestangular.get()\r\n .all('dose-range-info')\r\n .withHttpConfig({cache: AprimaCache.Default.httpMode})\r\n .getList(params)\r\n .then(function(data) {\r\n var doseRanges = _.compact(data);\r\n\r\n if(_.isEmpty(doseRanges)) {\r\n return $q.reject('First Databank does not contain max/min dosing information for the selected medication.');\r\n }\r\n\r\n var result = doseRanges\r\n .map(function(item) {\r\n return DoseRangeInfo.mapFromDto(item);\r\n });\r\n // TODO: handle case where there can be multiple results in this list that comes back\r\n // Right now, the backend doesn't support returning more than 1 result, but it could in the future\r\n var singleDosingInfo = result[0];\r\n return singleDosingInfo;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n function getMinMaxWarning(sigInstructions, rxParameters, patientDetails) {\r\n var dosageUnits = sigInstructions && sigInstructions.unit && sigInstructions.unit.Id;\r\n var drugDoseFormId = rxParameters && rxParameters.drug && rxParameters.drug.UnitId;\r\n if (!drugDoseFormId) {\r\n return $q.when('Selected drug does not have dosing units. Unable to calculate recommended daily dosing.');\r\n }\r\n \r\n if(!areCompatibleUnits(dosageUnits, drugDoseFormId)) {\r\n return $q.when('Dosing units are not compatible with drug. Unable to calculate recommended daily dosing.');\r\n }\r\n\r\n var params = mapDoseParams(sigInstructions, rxParameters, patientDetails);\r\n\r\n //convert to mg, ml, or leave as tablet/capsule\r\n params.dosageAmount = convertToCommonUnit(dosageUnits, params.dosageAmount);\r\n\r\n return getDoseRangeInfo(\r\n params.ageInDays, \r\n params.medId, \r\n params.gcnSeqNo,\r\n params.weight, \r\n params.height, \r\n params.gestationalAge,\r\n params.doseTypeIndicator, \r\n params.icdCode\r\n )\r\n .then(function(singleDosingInfo) {\r\n var minMaxWarningText = DoseRangeUtil.GetMaxMinWarningMsg(singleDosingInfo, params.dosageAmount, params.frequencyPerDay, params.durationOfTherapyInDays);\r\n \r\n return minMaxWarningText;\r\n });\r\n }\r\n\r\n function mapDoseParams(sigInstructions, rxParameters, patientDetails){\r\n var params = {};\r\n \r\n params.frequencyPerDay = sigInstructions && sigInstructions.frequency && sigInstructions.frequency.DosesPerDay;\r\n params.visitId = null;\r\n\r\n if(rxParameters) {\r\n var drug = rxParameters.drug;\r\n if(drug) {\r\n params.medId = drug.MedId;\r\n params.gcnSeqNo = drug.GcnSeqNo;\r\n }\r\n\r\n params.patientId = rxParameters.patientId;\r\n params.visitId = rxParameters.visit && rxParameters.visit.VisitId;\r\n }\r\n\r\n // this is a newer concept, and we have no current way to derive it, so just leave it as null\r\n params.gestationalAge = null;\r\n\r\n // this is a newer concept, and we have no current way to derive it, so just leave it as null\r\n params.doseTypeIndicator = null;\r\n\r\n // TODO: fill in iceCode with something from sigwriter\r\n // but it has to be a single value\r\n params.icdCode = null;\r\n\r\n params.weight = null;\r\n params.weightDate = null;\r\n params.height = null;\r\n params.heightDate = null;\r\n params.ageInDays = null;\r\n if(patientDetails) {\r\n params.weight = patientDetails.WeightInKg;\r\n params.weightDate = patientDetails.WeightPerformedDate;\r\n params.height = patientDetails.HeightInCm;\r\n params.heightDate = patientDetails.HeightPerformedDate;\r\n params.ageInDays = patientDetails.AgeInDays;\r\n }\r\n \r\n params.durationOfTherapyInDays = null;\r\n if (sigInstructions && sigInstructions.startDate && sigInstructions.endDate){\r\n params.durationOfTherapyInDays = moment(sigInstructions.endDate).diff(moment(sigInstructions.startDate), 'days');\r\n }\r\n\r\n params.dosageAmount = sigInstructions.dosage && sigInstructions.dosage.Name;\r\n\r\n return params;\r\n }\r\n\r\n function convertToCommonUnit(dosageUnits, dosageAmount) {\r\n switch (dosageUnits) {\r\n case SystemGuid.medicationUnitTablets:\r\n case SystemGuid.medicationUnitCapsules:\r\n break;\r\n // converts these to ml\r\n case SystemGuid.medicationUnitTeaspoons: \r\n dosageAmount = NumUtil.multiply(dosageAmount, teaspoonsToMlMultiplier);\r\n break;\r\n case SystemGuid.medicationUnitTablespoons:\r\n dosageAmount = NumUtil.multiply(dosageAmount, tablespoonsToMlMultiplier);\r\n break;\r\n case SystemGuid.medicationUnitOz:\r\n dosageAmount = NumUtil.multiply(dosageAmount, ozToMlMultiplier);\r\n break;\r\n case SystemGuid.medicationUnitPuffs: \r\n case SystemGuid.medicationUnitDrops:\r\n case SystemGuid.medicationUnitMilliliters:\r\n break;\r\n // converts these to mg\r\n case SystemGuid.medicationUnitGrams:\r\n dosageAmount = NumUtil.multiply(dosageAmount, 1000);\r\n break;\r\n case SystemGuid.medicationUnitMicrograms:\r\n dosageAmount = NumUtil.divide(dosageAmount, 1000);\r\n break;\r\n case SystemGuid.medicationUnitMilligrams:\r\n break;\r\n default: \r\n break;\r\n }\r\n return dosageAmount;\r\n }\r\n\r\n function getDosingDetailsFull(visitId, patientId, defaultValue) {\r\n if(!visitId && !patientId) {\r\n return $q.when(defaultValue);\r\n }\r\n\r\n var hasComprehensiveFeature = ServerInfoRepository.isFeatureSupported('PatientDosingDetails_Comprehensive');\r\n if(hasComprehensiveFeature) {\r\n return getComprehensiveDosingDetails(visitId, patientId);\r\n }\r\n\r\n if(visitId && visitId !== Guid.empty()) {\r\n return getVisitDosingDetails(visitId);\r\n }\r\n\r\n if(patientId && patientId !== Guid.empty()) {\r\n return getPatientDosingDetails(patientId);\r\n }\r\n\r\n return $q.when(defaultValue);\r\n }\r\n\r\n function getComprehensiveDosingDetails(visitId, patientId) {\r\n var params = {\r\n VisitId: visitId || null,\r\n PatientId: patientId || null,\r\n };\r\n\r\n var promise = AprimaRestangular.get()\r\n .one('dosing-details')\r\n .get(params);\r\n\r\n return promise;\r\n }\r\n\r\n function getPatientDosingDetails(patientId) {\r\n var promise = AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('dosing-details')\r\n .get();\r\n\r\n return promise;\r\n }\r\n\r\n function getVisitDosingDetails(visitId) {\r\n var promise = AprimaRestangular.get()\r\n .one('visits', visitId)\r\n .one('dosing-details')\r\n .get();\r\n\r\n return promise;\r\n }\r\n\r\n function getVariableDoseRanges(gcnSeqNo) {\r\n var timing = AprimaAnalytics.startTiming('DosingService', 'api', 'getVariableDoseRanges');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('variable-dose-ranges')\r\n .withHttpConfig({cache: AprimaCache.Default.httpMode})\r\n .get({\r\n gcnSeqNo: gcnSeqNo,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function areCompatibleUnits(dosageUnits, drugDoseFormId) {\r\n var dosageUnitsBase = getBaseUnitFromSelection(dosageUnits);\r\n var drugDoseFormIdBase = getBaseUnitForDrug(drugDoseFormId);\r\n return drugDoseFormIdBase !== null && dosageUnitsBase === drugDoseFormIdBase;\r\n }\r\n\r\n function getBaseUnitFromSelection(unitId) {\r\n var baseline; \r\n switch (unitId) {\r\n case SystemGuid.medicationUnitTablets:\r\n case SystemGuid.medicationUnitCapsules:\r\n baseline = SystemGuid.medicationUnitTablets;\r\n break;\r\n case SystemGuid.medicationUnitPuffs: \r\n case SystemGuid.medicationUnitDrops:\r\n case SystemGuid.medicationUnitTeaspoons: \r\n case SystemGuid.medicationUnitTablespoons:\r\n case SystemGuid.medicationUnitOz:\r\n case SystemGuid.medicationUnitMilliliters:\r\n case SystemGuid.medicationUnitSpray:\r\n baseline = SystemGuid.medicationUnitMilliliters;\r\n break;\r\n \r\n case SystemGuid.medicationUnitGrams:\r\n case SystemGuid.medicationUnitMilligrams:\r\n case SystemGuid.medicationUnitMicrograms:\r\n baseline = SystemGuid.medicationUnitMilligrams;\r\n break;\r\n default: \r\n baseline = unitId;\r\n\r\n }\r\n return baseline;\r\n }\r\n function getBaseUnitForDrug(unitId) {\r\n // units that do not need conversion \r\n var baseline; \r\n switch (unitId) {\r\n case SystemGuid.medicationUnitTablets:\r\n case SystemGuid.medicationUnitCapsules:\r\n baseline = SystemGuid.medicationUnitTablets;\r\n break;\r\n case SystemGuid.medicationUnitPuffs: \r\n case SystemGuid.medicationUnitDrops:\r\n case SystemGuid.medicationUnitMilliliters:\r\n case SystemGuid.medicationUnitSpray:\r\n baseline = SystemGuid.medicationUnitMilliliters;\r\n break;\r\n case SystemGuid.medicationUnitMilligrams:\r\n baseline = SystemGuid.medicationUnitMilligrams;\r\n break;\r\n default: \r\n baseline = unitId;\r\n\r\n }\r\n return baseline;\r\n }\r\n }\r\n})(window.angular);\r\n","angular.module('aprima-provider-api').factory('DrugRepository',\r\n ['$q', '_', 'AprimaRestangular', 'AprimaAnalytics', 'CurrentUser', 'Guid', 'ServerInfoRepository', 'SettingRepository',\r\n function ($q, _, AprimaRestangular, AprimaAnalytics, CurrentUser, Guid, ServerInfoRepository, SettingRepository) {\r\n 'use strict';\r\n\r\n return {\r\n search: drugSearch,\r\n getPatientActiveDrugs: getPatientActiveDrugs,\r\n getMfuDrugs: getMfuDrugs,\r\n drugDosageAlternativesSearch: drugDosageAlternativesSearch,\r\n drugScreening: drugScreening,\r\n getDrugDocumentation: getDrugDocumentation,\r\n getDrugDosingSuggestions: getDrugDosingSuggestions,\r\n getDrugFormularyInfo: getDrugFormularyInfo,\r\n getDrugRepresentativeFormularies: getDrugRepresentativeFormularies,\r\n getDrugFormularyDetail: getDrugFormularyDetail,\r\n getDrugDetail: getDrugDetail,\r\n getDrugDetailHistory: getDrugDetailHistory,\r\n getDrugSearchIncludeInactive: getDrugSearchIncludeInactive,\r\n getKdbConfigurationId: getKdbConfigurationId,\r\n nddDrugScreening: nddDrugScreening,\r\n nddDrugScreeningMobile: nddDrugScreeningMobile,\r\n };\r\n\r\n function drugDosageAlternativesSearch(drug, providerId, kdbConfigurationId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'search drug dosage alternatives');\r\n\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n\r\n var promise = restangular.one('drugs/dosagealternatives')\r\n .customPOST({\r\n Drug: drug,\r\n ProviderId: providerId || null,\r\n KdbConfigurationId: kdbConfigurationId || null,\r\n })\r\n .then(function(list) {\r\n var standardizedList = handleObsoleteProperty(list);\r\n return standardizedList;\r\n });\r\n \r\n promise.finally(timing.stop);\r\n return promise; \r\n }\r\n\r\n function drugSearch(searchText, patientId, previousSearch, includeNonDispensable, kdbConfigurationId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'search drugs');\r\n\r\n var providerId = CurrentUser.get().userId;\r\n\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var includeInactive = false, includeObsolete = false;\r\n var words = _.words(searchText, /[^ ]+/g);\r\n var inactiveTerms = [], obsoleteTerms = [];\r\n inactiveTerms = _.filter(words, function(s) { return s && s.toUpperCase() === 'INACTIVE'; });\r\n obsoleteTerms = _.filter(words, function(s) { return s && s.toUpperCase() === 'OBSOLETE'; });\r\n if(inactiveTerms.length > 0) {\r\n includeInactive = true;\r\n words = _.difference(words, inactiveTerms);\r\n }\r\n if(obsoleteTerms.length > 0) {\r\n includeObsolete = true;\r\n words = _.difference(words, obsoleteTerms);\r\n }\r\n searchText = words.join(' ');\r\n\r\n var endpoint = includeNonDispensable ? 'drug-history-drugs' : 'drugs';\r\n\r\n var promise = restangular.all(endpoint).abortable(previousSearch)\r\n .getList({\r\n SearchText: searchText,\r\n PatientId: patientId,\r\n ProviderId: providerId,\r\n IncludeInactive: includeInactive,\r\n IncludeObsolete: includeObsolete,\r\n KdbConfigurationId: kdbConfigurationId,\r\n })\r\n .then(function(list) {\r\n var standardizedList = handleObsoleteProperty(list);\r\n return standardizedList;\r\n });\r\n\r\n promise.finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n // IsInactiveOrObsolete was moved from DrugResultDto to a property inside of DrugDto\r\n // this standardizes the data structure so it looks the same whether the server has this change or not\r\n function handleObsoleteProperty(drugSearchList) {\r\n if(!drugSearchList || !_.isArray(drugSearchList)) {\r\n return drugSearchList;\r\n }\r\n\r\n _.forEach(drugSearchList, function(drugResult) {\r\n var drug = drugResult && drugResult.Drug;\r\n if(drug && !_.has(drug, 'IsInactiveOrObsolete')) {\r\n drug.IsInactiveOrObsolete = !!drugResult.IsInactiveOrObsolete;\r\n }\r\n });\r\n return drugSearchList;\r\n }\r\n\r\n function getPatientActiveDrugs(patientId, kdbConfigurationId, restangularOptions) {\r\n var providerId = CurrentUser.get().userId;\r\n\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'search drugs');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var promise = restangular\r\n .all('drugs/patientactivedrugs/' + patientId)\r\n .abortable()\r\n .getList({\r\n providerId: providerId,\r\n kdbConfigurationId: kdbConfigurationId,\r\n });\r\n promise.finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n function getMfuDrugs(restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'search drugs');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var promise = restangular.all('drugs/mostfrequentlyused/' + CurrentUser.get().userId).abortable().getList();\r\n promise.finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n function drugScreening(patientId, medId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'search drugs');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('drugs/' + medId + '/screening/' + patientId).get().finally(timing.stop);\r\n }\r\n \r\n function nddDrugScreeningMobile(patientId, medId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'ndd search drugs');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('drugs/' + medId + '/nddscreening/' + patientId).get().finally(timing.stop);\r\n }\r\n\r\n function getDrugDosingSuggestions(patientId, medId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'dosing suggestions');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n\r\n // to be backwards compatible, have to pass a guid for the patientId\r\n // because in older versions it was not nullable\r\n var patientIdOrGuidEmpty = patientId || Guid.empty();\r\n\r\n var promise = restangular\r\n .one('drugs', medId)\r\n .one('dosing', patientIdOrGuidEmpty)\r\n .get()\r\n .finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n function getDrugDocumentation(medId, ndc, patientId, mode, restangularOptions) {\r\n if(!ServerInfoRepository.isFeatureSupported('DrugDocumentationV2')) {\r\n // call older endpoint\r\n var oldResult = getDrugDocumentationV1(medId, ndc, patientId, mode, restangularOptions);\r\n\r\n return oldResult;\r\n }\r\n\r\n\r\n // call newer endpoint\r\n var newResult = getDrugDocumentationV2(medId, ndc, patientId, mode, restangularOptions);\r\n\r\n return newResult;\r\n }\r\n\r\n function getDrugDocumentationV1(medId, ndc, patientId, mode, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n\r\n var routeNdc = ndc || 0;\r\n\r\n // passing these values as query string parameters will override the ones in the route in webapi, but they still have to be passed \r\n // in the route to match the endpoint template\r\n var params = {\r\n // if there is no ndc, then to match the route,\r\n // it needs to be medId/0\r\n // but the query param needs to be empty string, so that the url has ?ndc=\r\n // and the backend will interpret that as null\r\n NDC: routeNdc || '',\r\n \r\n // MedId is int on backend, so don't let it be null, undefined, etc.\r\n MedId: medId || 0,\r\n \r\n // PatientId is non-nullable guid on backend, so make sure it's not passed as null\r\n PatientId: patientId || Guid.empty(),\r\n };\r\n\r\n if(mode) {\r\n params.BriefMode = mode;\r\n }\r\n\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'get drug documentation');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular\r\n .one('drugs/' + params.MedId + '/' + routeNdc + '/documentation/' + params.PatientId)\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getDrugDocumentationV2(medId, ndc, patientId, mode, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n\r\n var params = {\r\n // for new endpoint ndc can be passed as null here\r\n NDC: ndc || null,\r\n \r\n // for new endpoint, MedId is nullable\r\n MedId: medId || null,\r\n \r\n // for new endpoint, PatientId is nullable\r\n PatientId: patientId || null,\r\n };\r\n\r\n if(mode) {\r\n params.BriefMode = mode;\r\n }\r\n\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'get drug documentation');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular\r\n .one('drug-documentation')\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n \r\n // This endpoint should not be called starting in PRM2018.\r\n function getDrugFormularyInfo(medId, patientId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n \r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'get drug formulary info');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.all('drugs/' + medId + '/formularyalternatives/' + patientId)\r\n .getList()\r\n .finally(timing.stop);\r\n }\r\n \r\n function getDrugRepresentativeFormularies(medId, eRxEligibilityId, patientId, relVisitMedicationId, pharmacyId, days, dispenseAsWritten, totalQuantity, unitOfMeasureId, previousPMBCParameters, previousRFSParameters, providerId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n \r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'get drug representative formularies');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var url = 'drugs/' + medId +\r\n '/representativeformularies/' + (eRxEligibilityId || Guid.empty()) +\r\n '?days=' + (days || '') +\r\n '&dispenseAsWritten=' + (dispenseAsWritten || '') +\r\n '&proposedRelVisitMedicationId=' + (relVisitMedicationId || '') +\r\n '&patientId=' + (patientId || '') +\r\n '&pharmacyId=' + (pharmacyId || Guid.empty()) +\r\n '&totalQuantity=' + (totalQuantity || '') +\r\n '&unitOfMeasureId=' + (unitOfMeasureId || '') +\r\n '&previousPMBCParameters=' + (previousPMBCParameters ? encodeURIComponent(previousPMBCParameters) : '') +\r\n '&previousRFSParameters=' + (previousRFSParameters ? encodeURIComponent(previousRFSParameters) : '') +\r\n '&providerId=' + (providerId || Guid.empty());\r\n return restangular.one(url)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n \r\n function getDrugFormularyDetail(medId, patientId, restangularOptions){\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n \r\n var timing = AprimaAnalytics.startTiming();\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.all('drugs/' + medId + '/formularydetail/' + patientId).getList().finally(timing.stop);\r\n }\r\n\r\n function getDrugDetail(medId, patientId, relPatientMedicationId, sigId, restangularOptions){\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n \r\n var timing = AprimaAnalytics.startTiming();\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('drugs/' + medId + '/drugdetail/' + patientId).get({relPatientMedicationId: relPatientMedicationId, sigId: sigId}).finally(timing.stop);\r\n }\r\n\r\n function getDrugDetailHistory(rxMedicationHistoryDetailUid, restangularOptions){\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n \r\n var timing = AprimaAnalytics.startTiming();\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('drugs/drugdetailhistory/historydetail/' + rxMedicationHistoryDetailUid).get().finally(timing.stop);\r\n }\r\n\r\n function nddDrugScreening(patientId, drug, otherDrugs, previousMedicationSigId) {\r\n var timing = AprimaAnalytics.startTiming('DrugRepository', 'api', 'nddDrugScreening');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/nddscreening')\r\n .customPOST({\r\n Drug: drug,\r\n OtherDrugs: otherDrugs,\r\n PreviousMedicationSigUid: previousMedicationSigId\r\n })\r\n .finally(timing.stop);\r\n\r\n }\r\n\r\n // !userId means just use the CurrentUser\r\n function getKdbConfigurationId(userId, renderingProviderId, billingProviderId) {\r\n var promise = SettingRepository.getKdbConfigurationId(userId, renderingProviderId, billingProviderId);\r\n return promise;\r\n }\r\n\r\n function getDrugSearchIncludeInactive(providerId) {\r\n var promise = SettingRepository.getDrugSearchIncludeInactive(providerId);\r\n return promise;\r\n }\r\n }]);","angular.module('aprima-provider-api').factory('ExternalPatientsRepository', ['AprimaRestangular', 'MetadataRepository', 'AprimaAnalytics', 'storage', '_',\r\n function (AprimaRestangular, MetadataRepository, AprimaAnalytics, storage, _) {\r\n 'use strict';\r\n\r\n var storageKey = 'external-patients.reload-list';\r\n\r\n function isExternalPatientsModifiedSinceLastAccess () {\r\n return storage.get(storageKey) || false;\r\n }\r\n\r\n function requestExternalPatients(result) {\r\n storage.set(storageKey, true);\r\n return result;\r\n }\r\n\r\n function getExternalPatients(externalPatientListId, restangularOptions, appComponent) {\r\n restangularOptions = _.defaults(restangularOptions || {}, {ignoreCache: isExternalPatientsModifiedSinceLastAccess()});\r\n\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'PatientRepository', 'api', 'getExternalPatients');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.all('externalpatients/' + externalPatientListId).getList({\r\n date: moment().startOf('day').toJSON()\r\n }).finally(function() {\r\n timing.stop();\r\n\r\n if(restangularOptions.ignoreCache) {\r\n storage.remove(storageKey);\r\n }\r\n });\r\n }\r\n\r\n function getExternalPatient(hospitalRoundId) {\r\n return AprimaRestangular.get().all('externalpatients').one('patients').one(hospitalRoundId).get();\r\n }\r\n\r\n function addExternalPatient(command) {\r\n return AprimaRestangular.get().all('externalpatients').post(command).then(requestExternalPatients);\r\n }\r\n\r\n function editExternalPatient(command) {\r\n return AprimaRestangular.get().all('externalpatients').one('patients').one(command.HospitalRoundId).customPUT(command).then(requestExternalPatients);\r\n }\r\n\r\n function getAddExternalPatientModelMetadata($scope) {\r\n return MetadataRepository.getMetadata('addexternalpatient', $scope);\r\n }\r\n\r\n function getEditExternalPatientModelMetadata($scope) {\r\n return MetadataRepository.getMetadata('editexternalpatient', $scope);\r\n }\r\n\r\n function dischargePatient(hospitalRoundId) {\r\n return AprimaRestangular.get()\r\n .all('externalpatients')\r\n .one(hospitalRoundId)\r\n .post('', {\r\n HospitalRoundId: hospitalRoundId\r\n })\r\n .then(requestExternalPatients);\r\n }\r\n\r\n return {\r\n getExternalPatients: getExternalPatients,\r\n getExternalPatient: getExternalPatient,\r\n addExternalPatient: addExternalPatient,\r\n editExternalPatient: editExternalPatient,\r\n getAddExternalPatientModelMetadata: getAddExternalPatientModelMetadata,\r\n getEditExternalPatientModelMetadata: getEditExternalPatientModelMetadata,\r\n dischargePatient: dischargePatient\r\n };\r\n }]);","(function(angular) {\r\n 'use strict';\r\n\r\n var serviceName = 'FinancialCenterService';\r\n var mainRoute = 'financialcenters';\r\n\r\n angular.module('aprima-provider-api').factory(serviceName, [\r\n '_',\r\n '$q',\r\n 'AprimaAnalytics',\r\n 'AprimaCache',\r\n 'AprimaRestangular',\r\n 'ServerInfoRepository',\r\n FinancialCenterService,\r\n ]);\r\n\r\n function FinancialCenterService(\r\n _,\r\n $q,\r\n AprimaAnalytics,\r\n AprimaCache,\r\n AprimaRestangular,\r\n ServerInfoRepository\r\n ) {\r\n var defaultCache = AprimaCache.Default.httpMode;\r\n\r\n var service = {\r\n getDefault: getDefault,\r\n };\r\n\r\n return service;\r\n\r\n function getDefault(defaultToMain, providerId, serviceSiteId, calendarId) {\r\n var params = {\r\n defaultToMain: !!defaultToMain,\r\n providerId: providerId,\r\n serviceSiteId: serviceSiteId,\r\n calendarId: calendarId,\r\n };\r\n var result = get('default', params, 'DefaultFinancialCenter', defaultCache);\r\n return result;\r\n }\r\n\r\n function get(route, params, requiredFeature, cache) {\r\n if(requiredFeature && !ServerInfoRepository.isFeatureSupported(requiredFeature)) {\r\n return $q.when(null);\r\n }\r\n\r\n var timing = AprimaAnalytics.startTiming(serviceName, 'api', route);\r\n var result = AprimaRestangular.get()\r\n .one(mainRoute, route)\r\n .withHttpConfig({cache: cache})\r\n .get(params)\r\n .finally(timing.stop);\r\n\r\n return result;\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('EpaRepository', [\r\n 'AprimaRestangular',\r\n EpaRepository,\r\n ]);\r\n\r\n function EpaRepository(\r\n AprimaRestangular\r\n ) {\r\n var service = {\r\n canSendEpaRequest: canSendEpaRequest,\r\n sendEpaRequest: sendEpaRequest,\r\n };\r\n\r\n return service;\r\n\r\n function canSendEpaRequest() {\r\n var promise = AprimaRestangular.get()\r\n .one('complex-permissions', 'send-epa-request')\r\n .get();\r\n return promise;\r\n }\r\n\r\n function sendEpaRequest(relVisitMedicationId) {\r\n var promise = AprimaRestangular.get()\r\n .one('rx', relVisitMedicationId)\r\n .all('epa-request')\r\n .post();\r\n return promise;\r\n }\r\n }\r\n})(window.angular);\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('FncDxRepository', [\r\n 'AprimaRestangular',\r\n FncDxRepository\r\n ]);\r\n \r\n function FncDxRepository(\r\n AprimaRestangular\r\n ) {\r\n return {\r\n getDiagnoses: getDiagnoses,\r\n postImoDiagnoses: postImoDiagnoses,\r\n postDiagnoses: postDiagnoses,\r\n deleteDiagnosis: deleteDiagnosis,\r\n deleteDiagnoses: deleteDiagnoses,\r\n };\r\n\r\n function getDiagnoses(patientId, visitId) {\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .all('dx')\r\n .getList();\r\n }\r\n\r\n function postImoDiagnoses(patientId, visitId, result) {\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .all('dx-term')\r\n .post(result);\r\n }\r\n\r\n function postDiagnoses(patientId, visitId, result) {\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .all('dx')\r\n .post(result);\r\n }\r\n\r\n function deleteDiagnosis(patientId, visitId, diagnosisId) {\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .one('dx', diagnosisId)\r\n .remove();\r\n }\r\n\r\n function deleteDiagnoses(patientId, visitId, diagnosisIds) {\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .all('dx')\r\n .remove({\r\n diagnosisIds: diagnosisIds,\r\n });\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n angular.module('aprima-provider-api').factory('FncPlanRepository', ['AprimaRestangular', 'DeviceSettings', '$q', 'Bridge',\r\n function (AprimaRestangular, DeviceSettings, $q, Bridge) {\r\n return {\r\n getPlans: getPlans,\r\n inactivatePlan: inactivatePlan,\r\n saveDefaults: saveDefaults,\r\n updatePlan: updatePlan\r\n };\r\n\r\n function getPlans(patientId, visitId) {\r\n var url = 'patients/' + patientId + '/fnc/' + visitId + '/plan';\r\n return AprimaRestangular.get({ ignoreCache: true }).all(url).getList();\r\n }\r\n\r\n function inactivatePlan(plan, patientId) {\r\n if(DeviceSettings.isPrm) {\r\n Bridge.fireEvent('inactivate-diagnosis', {\r\n PatientId: patientId,\r\n VisitDate: plan.VisitDate,\r\n VisitId: plan.VisitUid,\r\n VisitDiagnosisId: plan.VisitDiagnosisUid\r\n });\r\n }\r\n else {\r\n var url = 'patients/' + patientId + '/fnc/' + plan.VisitUid + '/inactivatediagnosis/' + plan.VisitDiagnosisUid;\r\n AprimaRestangular.get({ ignoreCache: true }).all(url).post()\r\n .then(function() {\r\n Bridge.fireEvent('inactivated-diagnosis', plan.VisitDiagnosisUid);\r\n })\r\n .catch(function (error) {\r\n console.log('Error inactivating diagnosis: ' + error);\r\n });\r\n }\r\n }\r\n\r\n function saveDefaults(patientId, visitId, planConfigurationId, configuration)\r\n {\r\n var url = 'patients/' + patientId + '/fnc/' + visitId + '/plan/defaults/' + planConfigurationId;\r\n return AprimaRestangular.get({ ignoreCache: true }).all(url).post(configuration);\r\n }\r\n\r\n function updatePlan(plan) {\r\n return plan.put();\r\n }\r\n }\r\n ]);\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('FncRepository', [\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n FncRepository\r\n ]);\r\n\r\n function FncRepository(\r\n AprimaAnalytics,\r\n AprimaRestangular\r\n ) {\r\n return {\r\n getClinicalNotes: getClinicalNotes,\r\n getContext: getContext,\r\n createVisitFromAppt: createVisitFromAppt,\r\n getAuthCode: getAuthCode,\r\n };\r\n\r\n function getClinicalNotes(providerId) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'getClinicalNotes');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('fnc/clinicalnotetypes/' + providerId)\r\n .getList()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getContext(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'getContext');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients/' + patientId + '/fnc/' + visitId + '/context')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function createVisitFromAppt(appointmentId, clinicalNoteTypeId) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'createVisitFromAppt');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('fnc')\r\n .post({\r\n AppointmentId: appointmentId,\r\n ClinicalNoteTypeId: clinicalNoteTypeId,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getAuthCode(patientCaseId, visitDate) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'getAuthCode');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('fnc/patientcases', patientCaseId)\r\n .customGET('authorizationcode', {\r\n visitDate: visitDate,\r\n })\r\n .finally(timing.stop);\r\n }\r\n }\r\n})();","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('FncRxRepository', [\r\n 'AprimaRestangular',\r\n 'AprimaAnalytics',\r\n 'SettingRepository',\r\n FncRxRepository\r\n ]);\r\n\r\n function FncRxRepository(\r\n AprimaRestangular,\r\n AprimaAnalytics,\r\n SettingRepository\r\n ) {\r\n return {\r\n addPrescription: addPrescription,\r\n changeMedication: changeMedication,\r\n changeMedicationFromHistoryOnly: changeMedicationFromHistoryOnly,\r\n deleteRx: deleteRx,\r\n editPrescription: editPrescription,\r\n editPrescriptionDiagnosis: editPrescriptionDiagnosis,\r\n getAuthorizedPrescriberList: getAuthorizedPrescriberList,\r\n getDrugScreeningResults: getDrugScreeningResults,\r\n getKdbConfigurationIdByVisit: getKdbConfigurationIdByVisit,\r\n getNddDrugScreeningResultsFromPatient: getNddDrugScreeningResultsFromPatient,\r\n getNddDrugScreeningResults: getNddDrugScreeningResults,\r\n getPrescriberRights: getPrescriberRights,\r\n getRx: getRx,\r\n getSigwriterNddDrugScreeningResults: getSigwriterNddDrugScreeningResults,\r\n getVisitMedStatus: getVisitMedicationStatus,\r\n getVisitMedStatuses: getVisitMedicationStatuses,\r\n getVisitPrescriptions: getVisitPrescriptions,\r\n refillMedication: refillMedication,\r\n refillMedicationFromPreviousVisit: refillMedicationFromPreviousVisit,\r\n startChange: startChange,\r\n startChangeFromHistoryOnly: startChangeFromHistoryOnly,\r\n startCppMedication: startCppMedication,\r\n startRefill: startRefill,\r\n startRefillFromPreviousVisit: startRefillFromPreviousVisit,\r\n startRefills: startRefills,\r\n startRefillWithoutVisit: startRefillWithoutVisit,\r\n updateRxPharmacies: updateRxPharmacies,\r\n getQueuedMedications: getQueuedMedications,\r\n deleteQueuedMedication: deleteQueuedMedication,\r\n updateRxRefill:updateRxRefill\r\n };\r\n\r\n function addPrescription(patientId, visitId, prescription) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'addPrescription');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('patients/' + patientId + '/fnc/' + visitId + '/rx/addprescription')\r\n .post(prescription)\r\n .finally(timing.stop);\r\n }\r\n\r\n function deleteRx(relVisitMedicationId) {\r\n return AprimaRestangular.get()\r\n .one('fnc/rx', relVisitMedicationId)\r\n .remove();\r\n }\r\n\r\n function getAuthorizedPrescriberList(sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getAuthorizedPrescriberList');\r\n return AprimaRestangular.get()\r\n .all('fnc/rx/authorizedprescriberlist')\r\n .getList({\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop); \r\n }\r\n\r\n function editPrescription(patientId, visitId, prescription) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'editPrescription');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('patients/' + patientId + '/fnc/' + visitId + '/rx/editprescription')\r\n .post(prescription)\r\n .finally(timing.stop);\r\n }\r\n\r\n function editPrescriptionDiagnosis(patientId, visitId, relVisitMedicationId, problems) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'editPrescriptionDiagnosis');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('patients/' + patientId + '/fnc/' + visitId + '/rx/' + relVisitMedicationId + '/editprescriptiondiagnosis')\r\n .post(problems)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getDrugScreeningResults(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'drugScreening');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/screening')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getNddDrugScreeningResultsFromPatient(patientId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getNddDrugScreeningResultsFromPatient');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/rx/nddscreening')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getNddDrugScreeningResults(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'nddDrugScreening');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/nddscreening')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPrescriberRights() {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getPrescriberRights');\r\n return AprimaRestangular.get()\r\n .one('fnc/rx/prescriberrights')\r\n .get()\r\n .finally(timing.stop); \r\n }\r\n\r\n function getRx(sigType, relVisitMedicationId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getRx');\r\n return AprimaRestangular.get()\r\n .one('fnc/rx/' + relVisitMedicationId)\r\n .get({sigType: sigType})\r\n .finally(timing.stop);\r\n }\r\n\r\n function getSigwriterNddDrugScreeningResults(patientId, visitId, drug, medicationSigId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'sigwriterDrugScreening');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('patients/' + patientId + '/fnc/' + visitId + '/rx/sigwriter/nddscreening')\r\n .post({\r\n Drug: drug,\r\n MedicationSigId: medicationSigId,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getVisitMedicationStatus(relVisitMedicationId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getVisitMedicationStatus');\r\n var restangular = AprimaRestangular.get();\r\n\r\n var promise = restangular\r\n .all('fnc')\r\n .all('rx')\r\n .one('visit-medication-status', relVisitMedicationId)\r\n .get()\r\n .finally(timing.stop);\r\n\r\n return promise;\r\n }\r\n\r\n function getVisitMedicationStatuses(relVisitMedicationIdList) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getVisitMedicationStatuses');\r\n var restangular = AprimaRestangular.get();\r\n var params = {\r\n relVisitMedicationIds: relVisitMedicationIdList,\r\n };\r\n\r\n var promise = restangular\r\n .all('fnc')\r\n .all('rx')\r\n .all('visit-medication-status')\r\n .customGET('', params)\r\n .then(function(data) {\r\n if(!data || !data.Results) {\r\n return $q.reject('Could not retrieve medication statuses');\r\n }\r\n\r\n // Results is a dictionary with the key being the RelVisitMedicationUid,\r\n // and the value being the med status\r\n return data.Results;\r\n })\r\n .finally(timing.stop);\r\n\r\n return promise;\r\n }\r\n\r\n function getVisitPrescriptions(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getVisitPrescriptions');\r\n return AprimaRestangular.get()\r\n .all('patients/' + patientId + '/fnc/' + visitId + '/rx')\r\n .getList()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getQueuedMedications(patientId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getVisitPrescriptions');\r\n return AprimaRestangular.get()\r\n .all('patients/' + patientId + '/fnc/queued-rx')\r\n .getList()\r\n .finally(timing.stop);\r\n }\r\n\r\n function deleteQueuedMedication(relVisitMedicationId) {\r\n return AprimaRestangular.get()\r\n .one('/fnc/queued-rx', relVisitMedicationId)\r\n .remove();\r\n }\r\n\r\n function changeMedication(patientId, visitId, relPatientMedicationId, prescription) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'changeMedication');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('patients/' + patientId + '/fnc/' + visitId + '/rx/change-prescription')\r\n .post({\r\n Prescription: prescription,\r\n RelPatientMedicationId: relPatientMedicationId,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function changeMedicationFromHistoryOnly(patientId, visitId, relPatientMedicationId, prescription) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'changeMedicationFromHistoryOnly');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('patients/' + patientId + '/fnc/' + visitId + '/rx/change-prescription-from-history-only')\r\n .post({\r\n Prescription: prescription,\r\n RelPatientMedicationId: relPatientMedicationId,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function refillMedication(patientId, visitId, relPatientMedicationId, prescription) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'refillMedication');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('patients/' + patientId + '/fnc/' + visitId + '/rx/refillprescription')\r\n .post({\r\n Prescription: prescription,\r\n RelPatientMedicationId: relPatientMedicationId,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function refillMedicationFromPreviousVisit(patientId, visitId, relVisitMedicationId, prescription) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'refillMedicationFromPreviousVisit');\r\n var restangular = AprimaRestangular.get();\r\n\r\n var promise = restangular\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .all('rx/refill-previous-visit-prescription')\r\n .post({\r\n Prescription: prescription,\r\n SelectedRelVisitMedicationId: relVisitMedicationId,\r\n })\r\n .finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n function startChange(patientId, visitId, relPatientMedicationId, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startChange');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/start-change')\r\n .get({\r\n relPatientMedicationId: relPatientMedicationId,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function startChangeFromHistoryOnly(patientId, visitId, relPatientMedicationId, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startChangeFromHistoryOnly');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/start-change-from-history-only')\r\n .get({\r\n relPatientMedicationId: relPatientMedicationId,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function startCppMedication(patientId, visitId, cppMedicationId, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startCppMedication');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/start-cpp-medication')\r\n .get({\r\n cppMedicationId: cppMedicationId,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function startRefill(patientId, visitId, relPatientMedicationId, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startRefill');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/startrefill')\r\n .get({\r\n relPatientMedicationId: relPatientMedicationId,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function startRefillFromPreviousVisit(patientId, visitId, relVisitMedicationId, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startRefillFromPreviousVisit');\r\n var restangular = AprimaRestangular.get();\r\n\r\n var promise = restangular\r\n .one('patients', patientId)\r\n .one('fnc', visitId)\r\n .customGET('rx/start-previous-visit-refill', {\r\n relVisitMedicationId: relVisitMedicationId,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n function startRefills(patientId, visitId, relPatientMedicationIds, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startRefills');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/' + patientId + '/fnc/' + visitId + '/rx/startrefills')\r\n .get({\r\n relPatientMedicationIds: relPatientMedicationIds,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function startRefillWithoutVisit(patientId, relPatientMedicationId, sigType) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'startRefillWithoutVisit');\r\n var restangular = AprimaRestangular.get();\r\n var promise = restangular\r\n .one('patients', patientId)\r\n .customGET('/rx/start-refill-without-visit', {\r\n relPatientMedicationId: relPatientMedicationId,\r\n sigType: sigType,\r\n })\r\n .finally(timing.stop);\r\n return promise;\r\n }\r\n\r\n function updateRxPharmacies(relVisitMedicationIds, patientId, pharmacyId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'updateRxPharmacies');\r\n return AprimaRestangular.get()\r\n .all('fnc/rx/pharmacy')\r\n .post({RelVisitMedicationIds: relVisitMedicationIds, PatientId: patientId, PharmacyId: pharmacyId})\r\n .finally(timing.stop);\r\n }\r\n\r\n function updateRxRefill(patientId, visitId, relVisitMedicationId, refillQty, medicaitonDays) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'editPrescription');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('patients/' + patientId + '/fnc/' + visitId + '/rx/'+relVisitMedicationId+'/refill/'+refillQty+'/days/'+medicaitonDays)\r\n .post()\r\n .finally(timing.stop);\r\n }\r\n\r\n // !userId means just use the CurrentUser\r\n function getKdbConfigurationIdByVisit(userId, visitId) {\r\n var promise = SettingRepository.getKdbConfigurationIdByVisit(userId, visitId);\r\n return promise;\r\n }\r\n }\r\n})(angular);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('FncVisitInfoRepository', [\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n 'MetadataRepository',\r\n FncVisitInfoRepository\r\n ]);\r\n\r\n function FncVisitInfoRepository(\r\n AprimaAnalytics,\r\n AprimaRestangular,\r\n MetadataRepository\r\n ) {\r\n var service = {\r\n create: createVisitInfo,\r\n save: saveVisitInfo,\r\n get: getVisitInfo,\r\n getMetadata: getVisitInfoMetadata,\r\n };\r\n\r\n return service;\r\n\r\n function createVisitInfo(visitInfo) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'createVisitInfo');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('fnc/visit-info')\r\n .post(visitInfo)\r\n .finally(timing.stop);\r\n }\r\n\r\n function saveVisitInfo(visitInfo) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'saveVisitInfo');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('fnc/visit-info')\r\n .customPUT(visitInfo)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getVisitInfo(visitId) {\r\n var timing = AprimaAnalytics.startTiming('FncRepository', 'api', 'getVisitInfo');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('fnc', visitId)\r\n .customGET('visit-info')\r\n .finally(timing.stop);\r\n }\r\n\r\n function getVisitInfoMetadata (scope) {\r\n var timing = AprimaAnalytics.startTiming('AppointmentRepository', 'api', 'getVisitInfoMetadata');\r\n return MetadataRepository.getMetadata('visit-info', scope).finally(timing.stop);\r\n }\r\n }\r\n})(window.angular);\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('VisitCommentRepository', [\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n VisitCommentRepository\r\n ]);\r\n\r\n function VisitCommentRepository(\r\n AprimaAnalytics,\r\n AprimaRestangular\r\n ) {\r\n return {\r\n getVisitComment : getVisitComment,\r\n updateVisitComment : updateVisitComment,\r\n };\r\n\r\n function getVisitComment(visitId, visitCommentType) {\r\n var timing = AprimaAnalytics.startTiming('VisitCommentRepository', 'api', 'getContext');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('visitcomment/' + visitId )\r\n .get({ 'visitComment' : visitCommentType})\r\n .finally(timing.stop);\r\n }\r\n\r\n function updateVisitComment(visitCommentTypeDto) {\r\n var timing = AprimaAnalytics.startTiming('VisitCommentRepository', 'api', 'getContext');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('visitcomment/update/')\r\n .customPOST(visitCommentTypeDto)\r\n .finally(timing.stop);\r\n }\r\n }\r\n})();","(function(angular){\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('GeneralNotesRepository', [\r\n '$q',\r\n 'AprimaCache',\r\n 'AprimaRestangular',\r\n GeneralNotesRepository\r\n ]);\r\n\r\n function GeneralNotesRepository(\r\n $q,\r\n AprimaCache,\r\n AprimaRestangular\r\n ) {\r\n var service = {\r\n search: search,\r\n getGeneralNoteType: getGeneralNoteType,\r\n saveGeneralNoteTypeSetting: saveGeneralNoteTypeSetting,\r\n };\r\n\r\n var generalNoteTypeCache = AprimaCache.Default;\r\n\r\n return service;\r\n\r\n function search(searchText, generalNoteTypeId, includeInactive) {\r\n var promise = AprimaRestangular.get()\r\n .all('general-notes')\r\n .getList({\r\n searchText: searchText,\r\n generalNoteTypeUid: generalNoteTypeId,\r\n includeInactive: includeInactive,\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n function getGeneralNoteType(noteTypeOrId) {\r\n var cachedItem = generalNoteTypeCache.getClone(noteTypeOrId);\r\n if(cachedItem) {\r\n return $q.when(cachedItem);\r\n }\r\n\r\n var promise = AprimaRestangular.get()\r\n .all('general-note-types')\r\n .get(noteTypeOrId)\r\n .then(function(data) {\r\n if(!data) {\r\n return $q.reject('Could not retrieve GeneralNoteType');\r\n }\r\n\r\n if(data.plain) {\r\n data = data.plain();\r\n }\r\n generalNoteTypeCache.put(noteTypeOrId, data);\r\n return data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n function saveGeneralNoteTypeSetting(noteTypeKey, generalNoteType) {\r\n var promise = AprimaRestangular.get()\r\n .one('settings', 'general-note-types')\r\n .customPUT({\r\n NoteTypeKey: noteTypeKey,\r\n GeneralNoteType: generalNoteType,\r\n })\r\n .then(function(data) {\r\n if(data && data.NoteTypeKey && data.GeneralNoteType) {\r\n generalNoteTypeCache.put(data.NoteTypeKey, data.GeneralNoteType);\r\n }\r\n else {\r\n generalNoteTypeCache.remove(noteTypeKey);\r\n }\r\n\r\n return data;\r\n });\r\n\r\n return promise;\r\n }\r\n }\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('HxMedicationRepository', [\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n HxMedicationRepository,\r\n ]);\r\n\r\n function HxMedicationRepository(\r\n AprimaAnalytics,\r\n AprimaRestangular\r\n ) {\r\n\r\n return {\r\n addPrescription: addPrescription,\r\n deleteMedication: deleteMedication,\r\n getMedicationListFilters: getMedicationListFilters,\r\n getPatientTakesNoMeds: getPatientTakesNoMeds,\r\n getPrescriptionHistory: getPrescriptionHistory,\r\n getPrescriptionHistoryForDiscontinueCancel: getPrescriptionHistoryForDiscontinueCancel,\r\n getTransitionOfCare: getTransitionOfCare,\r\n setMedicationFilter: setMedicationFilter,\r\n setPatientTakesNoMeds: setPatientTakesNoMeds,\r\n setTransitionOfCare: setTransitionOfCare,\r\n getPatientMedStatus: getPatientMedicationStatus,\r\n getPatientMedStatuses: getPatientMedicationStatuses,\r\n discontinueCancelMedications: discontinueCancelMedications,\r\n isRxOnPatientAllergyList: isRxOnPatientAllergyList,\r\n getCompareInfoForDiscontinueCancel: getCompareInfoForDiscontinueCancel\r\n };\r\n\r\n function addPrescription(patientId, visitId, skippedSigwriter, prescription) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'addPrescription');\r\n var restangular = AprimaRestangular.get();\r\n var dto = {\r\n Prescription: prescription,\r\n SkippedSigwriter: skippedSigwriter,\r\n VisitId: visitId,\r\n };\r\n return restangular\r\n .all('patients/' + patientId + '/addprescription')\r\n .post(dto)\r\n .finally(timing.stop);\r\n }\r\n\r\n function deleteMedication(medication, visitId) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'deleteMedication');\r\n return AprimaRestangular.get()\r\n .one('history/visit', visitId)\r\n .one('medication', medication.RelPatientMedicationUid)\r\n .remove()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getMedicationListFilters(subtype) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getMedicationListFilters');\r\n var queryString = '?subtype=' + subtype;\r\n return AprimaRestangular.get()\r\n .one('history/rx-filters' + queryString)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n \r\n function setMedicationFilter(setMedicationFilterDto) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'setMedicationFilter');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('history/rx-filter')\r\n .post(setMedicationFilterDto)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPatientTakesNoMeds(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getPatientTakesNoMeds');\r\n var restangular = AprimaRestangular.get();\r\n var params = {\r\n VisitId: visitId,\r\n };\r\n return restangular\r\n .one('patients/' + patientId + '/patienttakesnomeds')\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPrescriptionHistory(patientId, visitId, filterId) {\r\n var timing = AprimaAnalytics.startTiming('FncRxRepository', 'api', 'getPrescriptionHistory');\r\n var restangular = AprimaRestangular.get();\r\n var params = {\r\n FilterId: filterId,\r\n VisitId: visitId,\r\n };\r\n return restangular.one('patients/' + patientId + '/rx-history')\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPrescriptionHistoryForDiscontinueCancel(patientId, visitId, relPatientMedicationIds) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getPrescriptionHistoryForDiscontinueCancel');\r\n var params = {\r\n RelPatientMedicationIds: relPatientMedicationIds,\r\n VisitId: visitId\r\n };\r\n var restangular = AprimaRestangular.get();\r\n\r\n return restangular\r\n .one('patients/' + patientId + '/rxhistory/discontinue-cancel')\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function isRxOnPatientAllergyList(patientId, visitId, relPatientMedicationId) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'isRxOnPatientAllergyList');\r\n var params = {\r\n RelPatientMedicationId: relPatientMedicationId,\r\n VisitId: visitId\r\n };\r\n var restangular = AprimaRestangular.get();\r\n\r\n return restangular\r\n .one('patients/' + patientId + '/rxhistory/on-patient-drug-allergy-list')\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getTransitionOfCare(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getTransitionOfCare');\r\n var restangular = AprimaRestangular.get();\r\n var params = {\r\n VisitId: visitId,\r\n };\r\n return restangular\r\n .one('patients/' + patientId + '/transitionofcare')\r\n .get(params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function setPatientTakesNoMeds(patientId, visitId, patientTakesNoMeds) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'setPatientTakesNoMeds');\r\n var restangular = AprimaRestangular.get();\r\n var params = {\r\n VisitId: visitId,\r\n };\r\n return restangular\r\n .all('patients/' + patientId + '/patienttakesnomeds')\r\n .post(patientTakesNoMeds, params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPatientMedicationStatus(relPatientMedicationId) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getPatientMedicationStatus');\r\n var restangular = AprimaRestangular.get();\r\n\r\n var promise = restangular\r\n .all('history')\r\n .one('patient-medication-status', relPatientMedicationId)\r\n .get()\r\n .finally(timing.stop);\r\n\r\n return promise;\r\n }\r\n\r\n function getPatientMedicationStatuses(relPatientMedicationIdList) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getPatientMedicationStatuses');\r\n var restangular = AprimaRestangular.get();\r\n \r\n\r\n var promise = restangular\r\n .all('history')\r\n .all('patient-medication-status')\r\n .customPOST(relPatientMedicationIdList)\r\n .then(function(data) {\r\n if(!data || !data.Results) {\r\n return $q.reject('Could not retrieve medication statuses');\r\n }\r\n\r\n // Results is a dictionary with the key being the RelPatientMedicationUid,\r\n // and the value being the med status\r\n return data.Results;\r\n })\r\n .finally(timing.stop);\r\n\r\n return promise;\r\n }\r\n \r\n function setTransitionOfCare(patientId, visitId, transitionOfCare) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'setTransitionOfCare');\r\n var restangular = AprimaRestangular.get();\r\n var params = {\r\n VisitId: visitId,\r\n };\r\n return restangular\r\n .all('patients/' + patientId + '/transitionofcare')\r\n .post(transitionOfCare, params)\r\n .finally(timing.stop);\r\n }\r\n\r\n function discontinueCancelMedications(patientId, dto) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'discontinueCancelMedications');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('patients/' + patientId + '/rxhistory/process-discontinue-cancel')\r\n .post(dto)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getCompareInfoForDiscontinueCancel(patientId, relPatientMedicationId) {\r\n var timing = AprimaAnalytics.startTiming('HxMedicationRepository', 'api', 'getCompareInfoForDiscontinueCancel');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients/' + patientId + '/rxhistory/discontinue-cancel/compare/' + relPatientMedicationId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n }\r\n})(angular);","angular.module('aprima-provider-api').factory('MedicalDevicesRepository',\r\n ['AprimaRestangular',\r\n function(AprimaRestangular) {\r\n 'use strict';\r\n\r\n function getMedicalDeviceParseUdi(uniqueDeviceId) {\r\n var searchCriteria = {\r\n UniqueDeviceIdentifier : uniqueDeviceId\r\n };\r\n\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('history/medical-device/').customGET('parse-udi', searchCriteria);\r\n }\r\n\r\n function getMedicalDeviceLookup(deviceId, uniqueDeviceId) {\r\n var searchCriteria = {\r\n DeviceIdentifier : deviceId,\r\n UniqueDeviceIdentifier : uniqueDeviceId\r\n };\r\n\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('history/medical-device/').customGET('lookup', searchCriteria);\r\n }\r\n\r\n function getMedicalDevices(patientId, visitId) {\r\n var searchCriteria = {\r\n PatientId : patientId,\r\n VisitId : visitId\r\n };\r\n\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('history/medical-device/patient/').customGET(patientId + '/', searchCriteria);\r\n }\r\n\r\n function createMedicalDevice(createDeviceAttributes) {\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('history/medical-device/patient/' + createDeviceAttributes.PatientId + '/').post(createDeviceAttributes);\r\n }\r\n\r\n function updateMedicalDevice(updateDeviceAttributes) {\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('history/medical-device/patient/' + updateDeviceAttributes.PatientId + '/device/' + updateDeviceAttributes.PatientMedicalDeviceHistoryId).customPUT(updateDeviceAttributes);\r\n }\r\n\r\n function displayMedicalDeviceHistory(patientId, groupingId) {\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('history/medical-device/patient/' + patientId + '/device/' + groupingId + '/history').get();\r\n }\r\n\r\n return {\r\n getMedicalDeviceParseUdi: getMedicalDeviceParseUdi,\r\n getMedicalDeviceLookup: getMedicalDeviceLookup,\r\n getMedicalDevices: getMedicalDevices,\r\n createMedicalDevice: createMedicalDevice,\r\n updateMedicalDevice: updateMedicalDevice,\r\n displayMedicalDeviceHistory: displayMedicalDeviceHistory\r\n };\r\n\r\n }]);","(function(angular){\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('ImoDiagnosisRepository', [\r\n '$q',\r\n 'AprimaAnalytics', \r\n 'AprimaRestangular', \r\n 'ImoPatient',\r\n ImoDiagnosisRepository\r\n ]);\r\n\r\n function ImoDiagnosisRepository(\r\n $q, \r\n AprimaAnalytics, \r\n AprimaRestangular, \r\n ImoPatient\r\n ) {\r\n var routePrefix = 'imo-problem';\r\n\r\n var service = {\r\n term: _.partial(term, null),\r\n terms: _.partial(terms, null),\r\n detail: _.partial(detail, null),\r\n details: _.partial(details, null),\r\n count: _.partial(count, null),\r\n abortable: abortable,\r\n };\r\n \r\n return service;\r\n\r\n function abortable(promisesToAbort) {\r\n return {\r\n term: _.partial(term, promisesToAbort),\r\n terms: _.partial(terms, promisesToAbort),\r\n detail: _.partial(detail, promisesToAbort),\r\n details: _.partial(details, promisesToAbort),\r\n count: _.partial(count, promisesToAbort),\r\n };\r\n }\r\n \r\n function term(promisesToAbort, paramsObj) {\r\n var result = get(promisesToAbort, 'terms', paramsObj, regularGet);\r\n return result;\r\n }\r\n\r\n function terms(promisesToAbort, paramsObj, patient) {\r\n var params = createPatientParams(paramsObj, patient);\r\n \r\n var result = get(promisesToAbort, 'terms', params, customGet);\r\n return result;\r\n }\r\n\r\n function detail(promisesToAbort, paramsObj) {\r\n var result = get(promisesToAbort, 'detail-terms', paramsObj, regularGet);\r\n return result;\r\n }\r\n \r\n function details(promisesToAbort, paramsObj) {\r\n var result = get(promisesToAbort, 'detail-terms', paramsObj, customGet);\r\n return result;\r\n }\r\n \r\n function count(promisesToAbort, paramsObj, patient) {\r\n var params = createPatientParams(paramsObj, patient);\r\n params.CountOnly = true;\r\n \r\n var result = get(promisesToAbort, 'terms', params, customGet);\r\n return result;\r\n }\r\n\r\n function createPatientParams(paramsObj, patient) {\r\n paramsObj = paramsObj || {};\r\n if(patient instanceof ImoPatient) {\r\n if(patient.hasAge) {\r\n paramsObj.PatientAge = patient.standardizedAge;\r\n }\r\n if(patient.hasGender) {\r\n paramsObj.PatientGender = patient.standardizedGender;\r\n }\r\n }\r\n return paramsObj;\r\n }\r\n\r\n function get(promisesToAbort, route, params, getFn) {\r\n var restElement = AprimaRestangular.get().all(routePrefix).all(route);\r\n if(promisesToAbort) {\r\n restElement = restElement.abortable(promisesToAbort);\r\n }\r\n\r\n return getFn(restElement, params).then(function(data) {\r\n if(_.isNil(data)) {\r\n return $q.reject('IMO ' + api + ' request failed for params: ' + JSON.stringify(params));\r\n }\r\n\r\n return data;\r\n });\r\n }\r\n\r\n function regularGet(element, params) {\r\n return element.get(params);\r\n }\r\n\r\n function customGet(element, params) {\r\n return element.customGET('', params);\r\n }\r\n }\r\n})(window.angular);\r\n","(function(angular){\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('ImoDiagnosisService', [\r\n '_',\r\n '$q', \r\n 'AprimaCache',\r\n 'ImoDiagnosisRepository',\r\n ImoDiagnosisService\r\n ]);\r\n\r\n function ImoDiagnosisService(\r\n _,\r\n $q,\r\n AprimaCache,\r\n ImoDiagnosisRepository\r\n ) {\r\n var service = {\r\n term: term,\r\n terms: terms,\r\n detail: detail,\r\n details: details\r\n };\r\n\r\n return service;\r\n\r\n function term(code, localCache) {\r\n var result = getSingle(code, AprimaCache.ImoTerms, localCache, ImoDiagnosisRepository.term);\r\n return result;\r\n }\r\n\r\n function terms(codes, localCache) {\r\n var result = getList(codes, AprimaCache.ImoTerms, localCache, ImoDiagnosisRepository.terms);\r\n return result;\r\n }\r\n\r\n function detail(code, localCache) {\r\n var result = getSingle(code, AprimaCache.ImoDetails, localCache, ImoDiagnosisRepository.detail);\r\n return result;\r\n }\r\n\r\n function details(codes, localCache) {\r\n var result = getList(codes, AprimaCache.ImoDetails, localCache, ImoDiagnosisRepository.details);\r\n return result;\r\n }\r\n\r\n\r\n function getSingle(code, aprimaCache, localCache, getData) {\r\n localCache = localCache || {};\r\n\r\n var result = localCache[code] || aprimaCache.get(code);\r\n if(result && result.LexicalCode === code) {\r\n return $q.when(result);\r\n }\r\n\r\n return getData(code).then(function(data) {\r\n if(!data || !data.LexicalCode) {\r\n return $q.reject('Could not retrieve IMO term');\r\n }\r\n\r\n if(data.plain) {\r\n data = data.plain();\r\n }\r\n localCache[code] = data;\r\n aprimaCache.put(code, data);\r\n return data;\r\n });\r\n }\r\n\r\n function getList(codes, aprimaCache, localCache, getData) {\r\n if(_.isArray(codes)) {\r\n if(_.isEmpty(codes)) {\r\n return $q.when([]);\r\n }\r\n }\r\n else {\r\n codes = [codes];\r\n }\r\n\r\n localCache = localCache || {};\r\n var result = [];\r\n var codesToBeLoaded = [];\r\n _.forEach(codes, function(code) {\r\n var item = localCache[code] || aprimaCache.get(code);\r\n if(item && item.LexicalCode === code) {\r\n result.push(item);\r\n }\r\n else {\r\n codesToBeLoaded.push(code);\r\n }\r\n });\r\n\r\n if(_.isEmpty(codesToBeLoaded)) {\r\n return $q.when(result);\r\n }\r\n\r\n return getData({\r\n LexicalCodes: codesToBeLoaded,\r\n }).then(function(data) {\r\n if(!data || !data.Results) {\r\n return $q.reject('Could not retrieve all IMO terms');\r\n }\r\n\r\n _.forEach(data.Results, function(term) {\r\n localCache[term.LexicalCode] = term;\r\n aprimaCache.put(term.LexicalCode, term);\r\n result.push(term);\r\n });\r\n return result;\r\n });\r\n }\r\n }\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('ListService', [\r\n '_',\r\n '$q',\r\n 'AprimaAnalytics',\r\n 'AprimaCache',\r\n 'ListRepository',\r\n 'MessageTypes',\r\n 'RequestTypes',\r\n ListService\r\n ]);\r\n\r\n // Don't port this to Angular since its interface is too generic and magic.\r\n // As callers are ported to Angular, they should be calling individual typed methods on the Angular ListService.\r\n function ListService(\r\n _,\r\n $q,\r\n AprimaAnalytics,\r\n AprimaCache,\r\n ListRepository,\r\n MessageTypes,\r\n RequestTypes\r\n ) {\r\n\r\n var medicationsListTypeRegex = /^medications-/i;\r\n var defaultCache;\r\n\r\n var service = {\r\n getList: getList,\r\n getLists: getLists,\r\n };\r\n\r\n return service;\r\n\r\n function getDefaultCache() {\r\n if (!defaultCache) {\r\n defaultCache = AprimaCache.Lists;\r\n }\r\n\r\n return defaultCache;\r\n }\r\n\r\n // listType can be\r\n // string: 'listName'\r\n // or\r\n // object: { name: 'listName', params: { query: 'something'}}\r\n function getList(listType, $scope, scopeProperty, applicationComponent) {\r\n var queryListType = listType && listType.name || listType;\r\n var listParams = listType && listType.params;\r\n var promise;\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'ListService', 'api', 'getList-' + queryListType);\r\n var responseListType;\r\n\r\n if(medicationsListTypeRegex.test(queryListType)) {\r\n responseListType = queryListType.replace(medicationsListTypeRegex, '');\r\n queryListType = 'medications/' + responseListType;\r\n } else {\r\n responseListType = queryListType.split('/')[0];\r\n }\r\n\r\n promise = internalGetList(queryListType, listParams)\r\n .then(function (list) {\r\n var plainList = list && list.plain ? list.plain() : list;\r\n\r\n return plainList;\r\n }, function(response) {\r\n response.listType = responseListType;\r\n return $q.reject(response);\r\n });\r\n\r\n if($scope && scopeProperty) {\r\n promise = promise.then(function(list){\r\n $scope[scopeProperty] = list;\r\n return list;\r\n });\r\n }\r\n\r\n return promise.finally(timing.stop);\r\n }\r\n\r\n //==============================================================================\r\n //Structure of lists as an Object:\r\n // {scopeProperty1: 'listType1', scopeProperty2: 'listType2', scopeProperty3: 'listType3'}\r\n //Returns promise that resolves to\r\n // {scopeProperty1: [list1], scopeProperty2: [list2], scopeProperty3: [list3]}\r\n //==============================================================================\r\n //Structure of lists as an Array:\r\n // ['listType1', 'listType2', 'listType3']\r\n //Returns promise that resolves to\r\n // [[list1], [list2], [list3]]\r\n function getLists(lists, $scope, applicationComponent) {\r\n var mappingFn = _.isArray(lists) ? _.map : _.mapValues;\r\n\r\n var listPromises = mappingFn(lists, function(listType, scopeProperty) {\r\n return getList(listType, $scope, scopeProperty, applicationComponent);\r\n });\r\n\r\n var allPromises = $q.all(listPromises);\r\n\r\n if($scope) {\r\n allPromises = allPromises\r\n .then(function(data) {\r\n $scope.removeHttpError(RequestTypes.listData);\r\n return data;\r\n }, function(response) {\r\n var message = {};\r\n message['is' + response.status] = response.listType;\r\n $scope.addHttpError(response, message, RequestTypes.listData);\r\n return $q.reject(response);\r\n });\r\n }\r\n\r\n return allPromises;\r\n }\r\n\r\n function internalGetList(listName, listParams) {\r\n if (listName === 'appointmentduration') {\r\n //these are not defined in the database\r\n var durations = getAppointmentDurations();\r\n return $q.when(durations);\r\n }\r\n else if(listName === 'messagetypessupportedforcreate') {\r\n return getMessageTypesSupportedForCreate();\r\n }\r\n\r\n return ListRepository.getListJs(listName, listParams, getDefaultCache());\r\n }\r\n\r\n function getAppointmentDurations() {\r\n var defaultDurationList = [\r\n getMinutesDurationObject(10),\r\n getMinutesDurationObject(15),\r\n getMinutesDurationObject(20),\r\n getMinutesDurationObject(30),\r\n getMinutesDurationObject(45),\r\n getMinutesDurationObject(60),\r\n\r\n getHoursDurationObject(2),\r\n getHoursDurationObject(3),\r\n getHoursDurationObject(4),\r\n getHoursDurationObject(8)\r\n ];\r\n\r\n return defaultDurationList;\r\n }\r\n\r\n function getMinutesDurationObject(minutes, prefix, suffix) {\r\n var opts = _.defaults({\r\n minutes: minutes,\r\n prefix: prefix,\r\n suffix: suffix\r\n }, {\r\n prefix: minutes,\r\n suffix: 'minutes'\r\n });\r\n\r\n\r\n return {\r\n Id: minutes,\r\n Description: opts.prefix + ' ' + opts.suffix\r\n };\r\n }\r\n\r\n function getHoursDurationObject(hours) {\r\n return getMinutesDurationObject(hours * 60, hours, 'hours');\r\n }\r\n\r\n function getMessageTypesSupportedForCreate() {\r\n return $q.all([internalGetList('messagetypes', null), internalGetList('messagesubtypes', null)])\r\n .then(function(lists){\r\n var types,subTypes, allTypes;\r\n\r\n var supportedTypes = MessageTypes.SupportedMessageTypesForCreate.Types,\r\n supportedSubTypes = MessageTypes.SupportedMessageTypesForCreate.SubTypes;\r\n\r\n types = _(lists[0]).filter(function (t) {\r\n return (_.findIndex(supportedTypes, {id: t.Id}) >= 0);\r\n }).map(function(t) {\r\n return {\r\n messageTypeId: t.Id,\r\n messageSubTypeId: null,\r\n name: t.Name,\r\n requiredFeature: _.find(supportedTypes, {id: t.Id}).requiredFeature\r\n };\r\n }).value();\r\n\r\n subTypes = _(lists[1]).filter(function (t) {\r\n return (_.findIndex(supportedSubTypes, {id: t.Id}) >= 0);\r\n }).map(function(t) {\r\n return {\r\n messageTypeId: t.MessageTypeId,\r\n messageSubTypeId: t.Id,\r\n name: t.Name,\r\n requiredFeature: _.find(supportedSubTypes, {id: t.Id}).requiredFeature\r\n };\r\n }).value();\r\n\r\n allTypes = _(_.union(types, subTypes)).sortBy('name').value();\r\n\r\n return allTypes;\r\n });\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-provider-api').factory('Locker',\r\n ['LockManager', '$log', '_',\r\n function (LockManager, $log, _) {\r\n 'use strict';\r\n\r\n //objArr can be an object or an array of objects.\r\n //if it is an array of objects, the first object in the array will be used to get the lock\r\n //and the lock info will be put on all objects in the array.\r\n function Locker(objArr, $scope, lockType, objId, objName) {\r\n if(!objArr || (_.isArray(objArr) && !objArr.length)) {\r\n throw new Error('Lockable object must be defined');\r\n }\r\n\r\n if(!lockType) {\r\n throw new Error('LockType must be defined');\r\n }\r\n\r\n var self = this;\r\n self.objs = _.isArray(objArr) ? objArr : [objArr];\r\n self.$scope = $scope;\r\n self.lockType = lockType;\r\n var obj = self.objs[0];\r\n self.objId = objId || obj.Id;\r\n self.objName = objName;\r\n\r\n if(!self.objId) {\r\n throw new Error('Lockable object ID must be defined or must exist on lockable object');\r\n }\r\n\r\n if($scope) {\r\n $scope.$on('locks.updated', function (event, args) {\r\n _.forEach(self.objs, function(obj) {\r\n var currentLock = obj.LockInfo;\r\n\r\n if (currentLock && currentLock.InstanceId === args.oldLock.InstanceId) {\r\n obj.LockInfo = args.newLock;\r\n }\r\n });\r\n });\r\n\r\n $scope.$on('$destroy', function () {\r\n self.unlock();\r\n });\r\n }\r\n }\r\n\r\n Locker.prototype = {\r\n lock: function lock() {\r\n var self = this;\r\n var objs = self.objs;\r\n\r\n\r\n return LockManager.lock(this.lockType, this.objId)\r\n .then(function (lock) {\r\n _.forEach(objs, function(obj) {\r\n obj.LockInfo = lock;\r\n obj.LockInstanceId = lock.InstanceId;\r\n });\r\n\r\n return lock;\r\n }, function (response) {\r\n $log.info('Unsuccessful in locking ' + self.objName + ': ' + response);\r\n _.forEach(objs, function(obj) {\r\n obj.LockInfo = response.data;\r\n });\r\n });\r\n },\r\n unlock: function unlock(lockInfo) {\r\n var self = this;\r\n var objs = self.objs;\r\n lockInfo = lockInfo || objs[0].LockInfo;\r\n\r\n if (!lockInfo) {\r\n throw new Error('Cannot unlock ' + self.objName + ' with null or undefined LockInfo.');\r\n }\r\n\r\n return LockManager.unlock(lockInfo.LockType, lockInfo.ObjectId)\r\n .then(function (lock) {\r\n _.forEach(objs, function(obj) {\r\n obj.LockInfo = lock;\r\n });\r\n }, function (response) {\r\n $log.info('Unsuccessful in unlocking ' + self.objName + ': ' + response);\r\n _.forEach(objs, function(obj) {\r\n obj.LockInfo = response.data;\r\n });\r\n });\r\n }\r\n };\r\n\r\n return Locker;\r\n }]);","angular.module('aprima-provider-api').factory('LockManager', ['LockRepository', '$log', '_', '$rootScope', '$interval', '$q', 'CurrentUser',\r\n function (LockRepository, $log, _, $rootScope, $interval, $q, CurrentUser) {\r\n 'use strict';\r\n\r\n var locks = [],\r\n refreshInterval;\r\n\r\n function findLock(lockType, objectId) {\r\n return _.find(locks, {LockType: lockType, ObjectId: objectId});\r\n }\r\n\r\n function lock(lockType, objectId) {\r\n return LockRepository.lock(lockType, objectId)\r\n .then(function (l) {\r\n locks.push(l.plain());\r\n\r\n return l;\r\n });\r\n }\r\n\r\n function unlock(lockType, objectId) {\r\n var currentLock = findLock(lockType, objectId);\r\n\r\n if (!currentLock) {\r\n return $q.reject(new Error('Lock was not found in local cache'));\r\n }\r\n\r\n return LockRepository.unlock(currentLock.LockType, currentLock.ObjectId, currentLock.InstanceId)\r\n .then(function () {\r\n _.remove(locks, function (l) {\r\n return l.LockType.toLowerCase() === currentLock.LockType.toLowerCase() &&\r\n l.ObjectId.toLowerCase() === currentLock.ObjectId.toLowerCase() &&\r\n l.InstanceId.toLowerCase() === currentLock.InstanceId.toLowerCase();\r\n });\r\n }, function (response) {\r\n $log.error('Error unlocking lock id= ' + objectId);\r\n $log.error(response);\r\n });\r\n }\r\n\r\n function isLocked(lockType, objectId, instanceId) {\r\n return LockRepository.isLocked(lockType, objectId, instanceId);\r\n }\r\n\r\n function refreshLocks() {\r\n if (!locks || !locks.length || !CurrentUser.isAuthenticated) {\r\n return;\r\n }\r\n\r\n _.each(locks, refreshLock);\r\n }\r\n\r\n function refreshLock(lock) {\r\n LockRepository.lock(lock.LockType, lock.ObjectId, lock.InstanceId)\r\n .then(function (lockResponse) {\r\n lockResponse = lockResponse.plain();\r\n\r\n _.remove(locks, lock);\r\n locks.push(lockResponse);\r\n\r\n $rootScope.$broadcast('locks.updated', {oldLock: lock, newLock: lockResponse, isLocked: true});\r\n }, function (response) {\r\n $log.error('Error refreshing lock: ');\r\n $log.error(response);\r\n\r\n _.remove(locks, lock);\r\n $rootScope.$broadcast('locks.updated', {oldLock: lock, newLock: response.data, isLocked: false});\r\n });\r\n }\r\n\r\n function startRefreshingLocks() {\r\n refreshInterval = $interval(refreshLocks, 30000);\r\n }\r\n\r\n function stopRefreshingLocks() {\r\n $interval.cancel(refreshInterval);\r\n }\r\n \r\n return {\r\n lock: lock,\r\n unlock: unlock,\r\n isLocked: isLocked,\r\n getLocks: function() {\r\n return _.cloneDeep(locks);\r\n },\r\n refreshLocks: refreshLocks,\r\n startRefreshingLocks: startRefreshingLocks,\r\n stopRefreshingLocks: stopRefreshingLocks\r\n };\r\n }]);","angular.module('aprima-provider-api').factory('LockRepository', ['AprimaRestangular', 'ServerInfoRepository', 'CurrentUser', '$q', '_',\r\n function (AprimaRestangular, ServerInfoRepository, CurrentUser, $q, _) {\r\n 'use strict';\r\n\r\n var unsupportedLockTypePromise = $q.reject(new Error('Lock Type is not supported by older server'));\r\n\r\n function getRestangularizedLock(lockObjId) {\r\n return AprimaRestangular.get().one('locks', lockObjId);\r\n }\r\n\r\n function getQueryStringObj(instanceId) {\r\n var qs = {};\r\n\r\n if (instanceId) {\r\n qs.instanceId = instanceId;\r\n }\r\n\r\n return qs;\r\n }\r\n\r\n function isNewLockingSupported() {\r\n return ServerInfoRepository.isFeatureSupported('LockManagement');\r\n }\r\n\r\n function isLockTypeSupported(lockType) {\r\n return isNewLockingSupported() || _.startsWith(lockType.toLowerCase(), 'message');\r\n }\r\n\r\n function lock(lockType, lockObjId, instanceId) {\r\n if (isNewLockingSupported()) {\r\n return getRestangularizedLock(lockObjId)\r\n .customPUT({}, lockType, getQueryStringObj(instanceId));\r\n }\r\n else {\r\n if (!isLockTypeSupported(lockType)) {\r\n return unsupportedLockTypePromise;\r\n }\r\n\r\n return AprimaRestangular.get().all('message/' + lockObjId).customPUT({\r\n ObjectId: lockObjId,\r\n LockType: lockType,\r\n InstanceId: instanceId || CurrentUser.deviceId\r\n }, 'lock')\r\n .then(function (m) {\r\n m.LockType = m.LockType || 'Message';\r\n return m;\r\n });\r\n }\r\n }\r\n\r\n function unlock(lockType, lockObjId, instanceId) {\r\n if (isNewLockingSupported()) {\r\n return getRestangularizedLock(lockObjId)\r\n .customDELETE(lockType, getQueryStringObj(instanceId));\r\n }\r\n else {\r\n if (!isLockTypeSupported(lockType)) {\r\n return unsupportedLockTypePromise;\r\n }\r\n\r\n return AprimaRestangular.get().all('message/' + lockObjId).customDELETE('lock');\r\n }\r\n }\r\n\r\n function isLocked(lockType, lockObjId, instanceId) {\r\n if (isNewLockingSupported()) {\r\n return getRestangularizedLock(lockObjId)\r\n .one(lockType)\r\n .get(getQueryStringObj(instanceId));\r\n }\r\n else {\r\n if (!isLockTypeSupported(lockType)) {\r\n return unsupportedLockTypePromise;\r\n }\r\n\r\n //this isLocked fn was defined in an older version of the client, but the endpoint that it calls\r\n //was not implemented by the server. isLocked() was added, but it was never called so it\r\n //did not cause problems. Now if it gets called when using an older server, just short circuit to\r\n //the error case instead of attempting to make a call to the server.\r\n return $q.reject(new Error('Cannot determine whether a resource is locked using an older server.'));\r\n }\r\n }\r\n\r\n return {\r\n lock: lock,\r\n unlock: unlock,\r\n isLocked: isLocked\r\n };\r\n }]);\r\n","angular.module('aprima-provider-api').factory('MessageLocker',\r\n ['Locker',\r\n function (Locker) {\r\n 'use strict';\r\n\r\n function MessageLocker(message, $scope, lockType, messageId) {\r\n Locker.call(this, message, $scope, lockType || 'Message', messageId, 'Message');\r\n }\r\n\r\n MessageLocker.prototype = Object.create(Locker.prototype, {});\r\n MessageLocker.prototype.constructor = MessageLocker;\r\n\r\n return MessageLocker;\r\n }]);","angular.module('aprima-provider-api').factory('VisitLocker',\r\n ['Locker',\r\n function (Locker) {\r\n 'use strict';\r\n\r\n function VisitLocker(visit, $scope, lockType, visitId) {\r\n Locker.call(this, visit, $scope, lockType || 'VisitNote', visitId, 'Visit');\r\n }\r\n\r\n VisitLocker.prototype = Object.create(Locker.prototype, {});\r\n VisitLocker.prototype.constructor = VisitLocker;\r\n\r\n return VisitLocker;\r\n }]);","angular.module('aprima-provider-api').factory(\r\n 'MessageRepository', ['AprimaRestangular', 'CurrentUser', '$q', 'Bridge', 'MetadataRepository', 'AprimaAnalytics',\r\n function (Restangular, CurrentUser, $q, Bridge, MetadataRepository, AprimaAnalytics) {\r\n\r\n 'use strict';\r\n\r\n var messageListeners = [];\r\n\r\n function getAll(messageFilterId, restangularOptions, appComponent) {\r\n restangularOptions = restangularOptions || { ignoreCache: false };\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getMessages');\r\n return Restangular.get(restangularOptions).all('users/' + CurrentUser.get().userId + '/messages')\r\n .getList({\r\n filterId: messageFilterId\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getDashboardMessages(messageFilterId) {\r\n if (messageFilterId) {\r\n return getAll(messageFilterId);\r\n }\r\n else {\r\n return $q.when([]);\r\n }\r\n }\r\n\r\n function addListener(callback) {\r\n if (messageListeners && callback && messageListeners.indexOf(callback) < 0) {\r\n messageListeners.push(callback);\r\n }\r\n }\r\n\r\n function removeListener(callback) {\r\n if (messageListeners && callback && messageListeners.indexOf(callback) >= 0) {\r\n messageListeners.pop(callback);\r\n }\r\n }\r\n\r\n function getMessage(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getMessage');\r\n return Restangular.get().one('messages/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function emitUpdateMessage() {\r\n if (messageListeners) {\r\n for (var i = messageListeners.length - 1; i >= 0; i--) {\r\n messageListeners[i]();\r\n }\r\n }\r\n }\r\n\r\n function savePhoneMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'savePhoneMessage');\r\n return Restangular.get().one('messages').customPUT(message, 'phone/' + message.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function saveTaskMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'saveTaskMessage');\r\n return Restangular.get().one('messages').customPUT(message, 'task/' + message.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function savePortalMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'saveTaskMessage');\r\n return Restangular.get().one('messages').customPUT(message, 'portal/' + message.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function saveAttachmentApprovalMessage(command, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'saveAAMessage');\r\n var restangular = Restangular.get();\r\n\r\n var messagePromise = restangular.one('messages').customPUT(command, 'aamessage/' + command.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n function replyToPortalMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'replyToPortalMessage');\r\n return Restangular.get().one('messages').customPUT(message, 'portal/' + message.Id + '/reply', {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPhoneMessageDetails(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getPhoneMessage');\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/phone/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n function getTaskMessageDetails(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getTaskMessage');\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/task/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n function getPortalMessageDetails(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getPortalMessage');\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/portal/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n emitUpdateMessage();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n function getRxRefillMessage(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getRxRefillMessage');\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/rx-refill/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n emitUpdateMessage();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n function saveRxRefillMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'saveRxRefillMessage');\r\n return Restangular.get().one('messages').customPUT(message, 'rx-refill/' + message.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getRxRefillMessageV2(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getRxRefillMessageV2');\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/rx-refill-v2/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n emitUpdateMessage();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n function saveRxRefillMessageV2(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'saveRxRefillMessageV2');\r\n return Restangular.get().one('messages').customPUT(message, 'rx-refill-v2', {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPharmacyRefillMessage(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getPharmacyRefillMessage');\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/pharmacy-refill/' + messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n emitUpdateMessage();\r\n m = mapToFullERxRequest(m);\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n // creates the new data structure with legacy data\r\n function mapToFullERxRequest(msg) {\r\n var request = msg && msg.RefillRequest;\r\n if(!request) {\r\n return msg;\r\n }\r\n\r\n if(!request.hasOwnProperty('PrescribedMedication')) {\r\n request.PrescribedMedication = {\r\n Comment: request.MedicationComment,\r\n Date: request.MedicationDate,\r\n // the duration was previously mapped to the date for some reason\r\n Duration: request.MedicationDate,\r\n Name: request.MedicationName,\r\n ProductCode: request.MedicationNdc,\r\n ProductCodeDescription: request.MedicationNdc ? request.MedicationNdc + ' (NDC)' : null,\r\n PotencyUnitCode: request.MedicationPotencyUnitCode,\r\n Quantity: request.MedicationQuantity,\r\n QuantityQualifierTerm: request.MedicationQuantityQualifier,\r\n Sig: request.MedicationSig,\r\n Strength: request.MedicationStrength,\r\n StrengthUnits: request.MedicationStrengthUnits,\r\n };\r\n }\r\n\r\n return msg;\r\n }\r\n\r\n function savePharmacyRefillMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'savePharmacyRefillMessage');\r\n return Restangular.get().one('messages').customPUT(message, 'pharmacy-refill/' + message.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPharmacyRefillMessageMetadata($scope) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'getPharmacyRefillMessageMetadata');\r\n return MetadataRepository.getMetadata('pharmacyrefillmessage', $scope).finally(timing.stop);\r\n }\r\n\r\n function createTaskMessage(message) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'createTaskMessage');\r\n var restangular = Restangular.get();\r\n return restangular.all('messages/task/').post(message).finally(timing.stop);\r\n }\r\n\r\n function getTaskMessageMetadata($scope) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'getCreateTaskMessageMetadata');\r\n return MetadataRepository.getMetadata('createtaskmessage', $scope).finally(timing.stop);\r\n }\r\n\r\n function createPortalMessage(message) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'createPortalMessage');\r\n var restangular = Restangular.get();\r\n return restangular.all('messages/portal/').post(message).finally(timing.stop);\r\n }\r\n\r\n function getPatientPortalMessageRoutingType() {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'getPatientPortalMessageRoutingType');\r\n var restangular = Restangular.get();\r\n return restangular.one('messages/patientportal/routingtype').get().finally(timing.stop);\r\n }\r\n\r\n function getPortalMessageMetadata($scope) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'getCreatePortalMessageMetadata');\r\n return MetadataRepository.getMetadata('createportalmessage', $scope).finally(timing.stop);\r\n }\r\n\r\n function createPhoneMessage(message) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'createPhoneMessage');\r\n var restangular = Restangular.get();\r\n return restangular.all('messages/phone/').post(message).finally(timing.stop);\r\n }\r\n\r\n function getPhoneMessageMetadata($scope) {\r\n var timing = AprimaAnalytics.startTiming('MessageRepository', 'api', 'getPortalMessageMetadata');\r\n return MetadataRepository.getMetadata('createphonemessage', $scope).finally(timing.stop);\r\n }\r\n\r\n function getAttachmentApprovalMessage(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getAAMessage');\r\n\r\n var restangular = Restangular.get(),\r\n messagePromise = restangular.one('messages/aamessage', messageId).get()\r\n .then(function (m) {\r\n Bridge.updateBadges();\r\n return m;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n\r\n }\r\n\r\n function getServiceOrderApprovalMessage(messageId, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'getServiceOrderApprovalMessage');\r\n\r\n var restangular = Restangular.get();\r\n\r\n var messagePromise = restangular.one('messages/serviceorderapprovalmessage', messageId).get()\r\n .then(function (data) {\r\n Bridge.updateBadges();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n\r\n function saveServiceOrderApprovalMessage(message, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'MessageRepository', 'api', 'saveServiceOrderApprovalMessage');\r\n var restangular = Restangular.get();\r\n var messagePromise = restangular.one('messages').customPUT(message, 'serviceorderapprovalmessage/' + message.Id, {}, {})\r\n .then(function (data) {\r\n emitUpdateMessage();\r\n return data;\r\n })\r\n .finally(timing.stop);\r\n\r\n return messagePromise;\r\n }\r\n\r\n\r\n return {\r\n getAll: getAll,\r\n getDashboardMessages: getDashboardMessages,\r\n getMessage: getMessage,\r\n savePhoneMessage: savePhoneMessage,\r\n saveTaskMessage: saveTaskMessage,\r\n savePortalMessage: savePortalMessage,\r\n replyToPortalMessage: replyToPortalMessage,\r\n getPhoneMessageDetails: getPhoneMessageDetails,\r\n getTaskMessageDetails: getTaskMessageDetails,\r\n getPortalMessageDetails: getPortalMessageDetails,\r\n createTaskMessage: createTaskMessage,\r\n getTaskMessageMetadata: getTaskMessageMetadata,\r\n createPhoneMessage: createPhoneMessage,\r\n getPhoneMessageMetadata: getPhoneMessageMetadata,\r\n addListener: addListener,\r\n removeListener: removeListener,\r\n createPortalMessage: createPortalMessage,\r\n getPortalMessageMetadata: getPortalMessageMetadata,\r\n getAttachmentApprovalMessage: getAttachmentApprovalMessage,\r\n saveAttachmentApprovalMessage: saveAttachmentApprovalMessage,\r\n getServiceOrderApprovalMessage: getServiceOrderApprovalMessage,\r\n saveServiceOrderApprovalMessage: saveServiceOrderApprovalMessage,\r\n getRxRefillMessage: getRxRefillMessage,\r\n saveRxRefillMessage: saveRxRefillMessage,\r\n getRxRefillMessageV2: getRxRefillMessageV2,\r\n saveRxRefillMessageV2: saveRxRefillMessageV2,\r\n getPharmacyRefillMessage: getPharmacyRefillMessage,\r\n savePharmacyRefillMessage: savePharmacyRefillMessage,\r\n getPharmacyRefillMessageMetadata: getPharmacyRefillMessageMetadata,\r\n getPatientPortalMessageRoutingType: getPatientPortalMessageRoutingType\r\n };\r\n }]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('MetadataRepository', [\r\n '$filter',\r\n '$q',\r\n 'AprimaRestangular',\r\n 'LocalStorageRepository',\r\n 'moment',\r\n MetadataRepository\r\n ]);\r\n\r\n function MetadataRepository(\r\n $filter,\r\n $q,\r\n aprimaRestangular,\r\n LocalStorageRepository,\r\n moment\r\n ) {\r\n\r\n var service = {\r\n getMetadata: getMetadataFromStorageOrServer\r\n };\r\n\r\n return service;\r\n\r\n function getKey(typeName) {\r\n return 'metadata.' + typeName;\r\n }\r\n\r\n function getMetadataFromServer(typeName) {\r\n return aprimaRestangular.get().one('metadata/' + typeName).get();\r\n }\r\n\r\n function getMetadataFromStorage(typeName) {\r\n var metadata = LocalStorageRepository.getKey(getKey(typeName), 'metadata'),\r\n deferred = $q.defer();\r\n\r\n if (metadata) {\r\n deferred.resolve(metadata);\r\n }\r\n else {\r\n deferred.reject('Metadata was not in storage');\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getMetadataFromStorageOrServer(typeName, $scope) {\r\n return getMetadataFromStorage(typeName)\r\n .catch(function () {\r\n return getMetadataFromServer(typeName).then(function (metadata){\r\n metadata.Fields = metadataParser(metadata);\r\n return metadata;\r\n });\r\n })\r\n .then(function (metadata) {\r\n LocalStorageRepository.setKey(getKey(typeName), metadata, 'metadata');\r\n return metadata;\r\n })\r\n .then(function(metadata){\r\n if($scope){\r\n $scope.metadata = metadata;\r\n }\r\n\r\n return metadata;\r\n });\r\n }\r\n\r\n function metadataParser(metadata) {\r\n var fields = {};\r\n\r\n _.forEach(metadata.Fields, function (field) {\r\n var dots = field.FieldName.split('.'),\r\n obj = fields,\r\n propertyName;\r\n\r\n while (dots.length > 1) {\r\n propertyName = dots.shift();\r\n if (!fields[propertyName]) {\r\n fields[propertyName] = {};\r\n }\r\n\r\n obj = fields[propertyName];\r\n }\r\n\r\n propertyName = dots.shift();\r\n obj[propertyName] = field;\r\n\r\n if(field.ElementMetadata) {\r\n field.Fields = metadataParser(field.ElementMetadata);\r\n delete field.ElementMetadata;\r\n }\r\n\r\n if(field.FieldName.indexOf('Date') >= 0 || field.FieldName.indexOf('date') >= 0){\r\n if(field.Minimum){\r\n // field.Minimum for dates should be iso8601 date string, which moment can handle\r\n field.Minimum = moment(field.Minimum).toDate();\r\n }\r\n\r\n if(field.Maximum){\r\n // field.Maximum for dates should be iso8601 date string, which moment can handle\r\n field.Maximum = moment(field.Maximum).toDate();\r\n }\r\n }\r\n });\r\n\r\n return fields;\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-provider-api')\r\n .factory('MetadataService',\r\n [function () {\r\n 'use strict';\r\n\r\n function getObjectFromMetadata(metadata, attrs) {\r\n if (!metadata) return;\r\n\r\n var model = attrs.ngModel,\r\n stack = model.split('.'),\r\n obj = metadata.Fields;\r\n\r\n stack.shift();\r\n\r\n obj = stack.reduce(function (obj, prop) {\r\n if (obj && obj.hasOwnProperty(prop)) {\r\n return obj[prop];\r\n }\r\n return obj;\r\n }, obj);\r\n\r\n return obj ? obj : false;\r\n }\r\n\r\n //will convert the string from ngModel to a string which is used to get metadata\r\n //For example: ng-model=\"someObj.SomeField\" -> \"metadata.Fields.SomeField\"\r\n function convertNgModelExprToMetadataExpr(ngModelExpr) {\r\n if(!ngModelExpr) return;\r\n\r\n var stack = ngModelExpr.split('.');\r\n\r\n if(stack.length === 2) {\r\n return 'metadata.Fields.' + stack[1];\r\n }\r\n\r\n //cannot convert it to ngModel expression\r\n return null;\r\n }\r\n\r\n return {\r\n getObjectFromMetadata: getObjectFromMetadata,\r\n convertNgModelExprToMetadataExpr: convertNgModelExprToMetadataExpr\r\n };\r\n }]);","angular.module('aprima-provider-api')\r\n .factory('NoteRepository', ['AprimaRestangular', function (aprimaRestangular) {\r\n 'use strict';\r\n\r\n var getNotes = function (filterId) {\r\n \treturn aprimaRestangular.get().all('notes/' + filterId).getList();\r\n };\r\n\r\n return {\r\n getNotes: getNotes\r\n };\r\n }]);","(function(angular) {\r\n 'use strict';\r\n\r\n var chargeCaptureDesktopFeature = 'ChargeCaptureDesktopTile';\r\n\r\n angular.module('aprima-provider-api').factory('ChargeCaptureRepository', [\r\n '$q',\r\n 'AprimaRestangular',\r\n 'MetadataRepository',\r\n 'ServerInfoRepository',\r\n ChargeCaptureRepository,\r\n ]);\r\n\r\n\r\n function ChargeCaptureRepository(\r\n $q,\r\n AprimaRestangular,\r\n MetadataRepository,\r\n ServerInfoRepository\r\n ) {\r\n var service = {\r\n getProviderChargeCaptures: getProviderChargeCaptures,\r\n getChargeCapture: getChargeCapture,\r\n getChargeCaptureMetadata: getChargeCaptureMetadata,\r\n createChargeCapture: createChargeCapture,\r\n editChargeCapture: editChargeCapture,\r\n removeChargeCapture: removeChargeCapture,\r\n };\r\n\r\n return service;\r\n\r\n\r\n function getProviderChargeCaptures(providerUid) {\r\n if(!ServerInfoRepository.isFeatureSupported(chargeCaptureDesktopFeature)) {\r\n return $q.when([]);\r\n }\r\n\r\n\r\n var result = AprimaRestangular.get()\r\n .one('chargecaptures/provider', providerUid)\r\n .get();\r\n\r\n return result;\r\n }\r\n\r\n function getChargeCapture(patientUid, chargeCaptureUid) {\r\n if(!ServerInfoRepository.isFeatureSupported(chargeCaptureDesktopFeature)) {\r\n // call older endpoint that only accepts patientUid\r\n var oldResult = AprimaRestangular.get()\r\n .one('chargecapture', patientUid)\r\n .get();\r\n\r\n return oldResult;\r\n }\r\n\r\n\r\n // call newer endpoint that accepts patientUid and chargeCaptureUid\r\n var newResult = AprimaRestangular.get()\r\n .one('chargecapture/patient', patientUid)\r\n .customGET('chargecaptureid', {\r\n chargeCaptureId: chargeCaptureUid,\r\n });\r\n\r\n return newResult;\r\n }\r\n\r\n function getChargeCaptureMetadata($scope) {\r\n var result = MetadataRepository.getMetadata('createchargecapture', $scope);\r\n\r\n return result;\r\n }\r\n\r\n function createChargeCapture(command) {\r\n var result = AprimaRestangular.get()\r\n .all('chargecapture')\r\n .post(command);\r\n\r\n return result;\r\n }\r\n\r\n function editChargeCapture(patientUid, command) {\r\n var result = AprimaRestangular.get()\r\n .one('chargecapture')\r\n .customPUT(command);\r\n\r\n return result;\r\n }\r\n\r\n function removeChargeCapture(chargeCaptureUid) {\r\n if(!ServerInfoRepository.isFeatureSupported(chargeCaptureDesktopFeature)) {\r\n return $q.reject('Removing a eMDs Round is not supported with this server version.');\r\n }\r\n\r\n var result = AprimaRestangular.get()\r\n .one('chargecapture/remove', chargeCaptureUid)\r\n .get();\r\n\r\n return result;\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-provider-api').factory('DiagnosisSummaryRepository',\r\n ['AprimaRestangular', 'AprimaAnalytics', 'ServerInfoRepository', function (AprimaRestangular, AprimaAnalytics, ServerInfoRepository) {\r\n 'use strict';\r\n\r\n return {\r\n getDiagnosisSummaries: getDiagnosisSummaries,\r\n getDiagnosisSummary: getDiagnosisSummary\r\n };\r\n\r\n function getDiagnosisSummaries(patientId, restangularOptions) {\r\n if (ServerInfoRepository.isFeatureSupported('DiagnosisSummary')) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DiagnosisSummaryRepository', 'api', 'get diagnosis summaries');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular\r\n .one('patients/' + patientId + '/diagnosis-summaries/')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n else {\r\n throw new Error('Unsupported feature of getting Diagnosis Summaries');\r\n }\r\n }\r\n\r\n function getDiagnosisSummary(patientId, summaryId, restangularOptions) {\r\n if (ServerInfoRepository.isFeatureSupported('DiagnosisSummary')) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('DiagnosisSummaryRepository', 'api', 'get diagnosis summary');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular\r\n .one('patients/' + patientId + '/diagnosis-summaries/' + summaryId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n else {\r\n throw new Error('Unsupported feature of getting Diagnosis Summary');\r\n }\r\n }\r\n }]);\r\n\r\n","angular.module('aprima-provider-api').factory('PatientAttachmentRepository',\r\n ['AprimaRestangular', 'AprimaAnalytics', 'DeviceSettings', 'MetadataRepository', 'SingleAccessSet',\r\n function (AprimaRestangular, AprimaAnalytics, DeviceSettings, MetadataRepository, SingleAccessSet) {\r\n 'use strict';\r\n\r\n var modifiedPatientIds = new SingleAccessSet();\r\n var defaultIgnoreCache = DeviceSettings.isPrm;\r\n\r\n function getPatientAttachments(patientId, restangularOptions, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'PatientAttachmentRepository', 'api', 'getPatientAttachments');\r\n\r\n restangularOptions = restangularOptions || {ignoreCache: defaultIgnoreCache};\r\n restangularOptions.ignoreCache = modifiedPatientIds.contains(patientId) || restangularOptions.ignoreCache;\r\n return AprimaRestangular.get(restangularOptions)\r\n .one('patients', patientId)\r\n .one('attachments')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPatientAttachmentGroup(patientId, relAttachmentGroupId, restangularOptions, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'PatientAttachmentRepository', 'api', 'getPatientAttachmentGroup');\r\n\r\n restangularOptions = restangularOptions || {ignoreCache: defaultIgnoreCache};\r\n return AprimaRestangular.get(restangularOptions)\r\n .one('patients', patientId)\r\n .one('attachments', relAttachmentGroupId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function addPatientAttachment(patientId, patientAttachment, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'PatientAttachmentRepository', 'api', 'addPatientAttachment');\r\n\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('attachments')\r\n .customPOST(patientAttachment)\r\n .finally(timing.stop)\r\n .finally(function() {\r\n modifiedPatientIds.add(patientId);\r\n });\r\n }\r\n\r\n function getAddPatientAttachmentMetadata($scope) {\r\n return MetadataRepository.getMetadata('addpatientattachment', $scope);\r\n }\r\n\r\n return {\r\n getPatientAttachments: getPatientAttachments,\r\n getPatientAttachmentGroup: getPatientAttachmentGroup,\r\n addPatientAttachment: addPatientAttachment,\r\n getAddPatientAttachmentMetadata: getAddPatientAttachmentMetadata\r\n };\r\n }]);\r\n\r\n","angular.module('aprima-provider-api').factory('PatientRecallsRepository',\r\n ['AprimaRestangular', 'AprimaAnalytics',\r\n function (AprimaRestangular, AprimaAnalytics) {\r\n 'use strict';\r\n\r\n return {\r\n getRecalls: getRecalls\r\n };\r\n\r\n function getRecalls(id) {\r\n var timing = AprimaAnalytics.startTiming('PatientRecallsRepository', 'api', 'get recalls');\r\n return AprimaRestangular.get().one('patients', id).getList('recalls').finally(timing.stop);\r\n }\r\n }\r\n ]\r\n);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('PatientRepository', [\r\n '$rootScope',\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n 'DeviceSettings',\r\n 'LocalStorageRepository',\r\n 'MetadataRepository',\r\n 'moment',\r\n 'SingleAccessSet',\r\n PatientRepository\r\n ]);\r\n\r\n function PatientRepository(\r\n $rootScope,\r\n AprimaAnalytics,\r\n AprimaRestangular,\r\n DeviceSettings,\r\n LocalStorageRepository,\r\n MetadataRepository,\r\n moment,\r\n SingleAccessSet\r\n ) {\r\n\r\n var visitCacheSet = new SingleAccessSet();\r\n var medicationsCacheSet = new SingleAccessSet();\r\n var defaultIgnoreCache = DeviceSettings.isPrm;\r\n\r\n $rootScope.$on('visit-updated', function(event, opts){\r\n visitCacheSet.add(opts.patientId);\r\n medicationsCacheSet.add(opts.patientId);\r\n });\r\n\r\n var service = {\r\n getPatient: getPatient,\r\n getDemographics: getDemographics,\r\n geteRxEligibilities: geteRxEligibilities,\r\n getAllergies: getAllergies,\r\n getAppointments: getAppointments,\r\n getPrimaryInsurance: getPrimaryInsurance,\r\n getProblems: getProblems,\r\n getDxProblemsWithDisplayOrder: getDxProblemsWithDisplayOrder,\r\n getActiveProblems: getActiveProblems,\r\n getMedications: getMedications,\r\n getRemarks: getRemarks,\r\n getRecentVisits: getRecentVisits,\r\n getOrders: getOrders,\r\n getObservationResults: getObservationResults,\r\n getVitals: getVitals,\r\n getObservations: getObservations,\r\n getHealthMaintenanceReminders: getHealthMaintenanceReminders,\r\n getObservationValues: getObservationValues,\r\n createPatient: createPatient,\r\n getCreatePatientMetadata: getCreatePatientMetadata,\r\n getMostRecentObservationValues: getMostRecentObservationValues,\r\n updatePatientPhoto: updatePatientPhoto,\r\n getPharmacies: getPharmacies,\r\n getEmVisits: getEmVisits,\r\n getMedicationsByGroup: getMedicationsByGroup,\r\n getPatientDetails: getPatientDetails,\r\n getAccounts: getAccounts,\r\n getPatientCases: getPatientCases,\r\n getPatientInformation: getPatientInformation,\r\n deletePatientPharmacy: deletePatientPharmacy,\r\n setPharmacyOrder : setPharmacyOrder\r\n };\r\n\r\n return service;\r\n\r\n function getPatient(uid, restangularOptions, applicationComponent) {\r\n if(_.isString(restangularOptions) && !applicationComponent) {\r\n applicationComponent = restangularOptions;\r\n restangularOptions = null;\r\n }\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'PatientRepository', 'api', 'getPatient');\r\n\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients', uid).get().finally(timing.stop);\r\n }\r\n\r\n function getPatientDetails(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'getPatientDetails');\r\n\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/details').get().finally(timing.stop);\r\n }\r\n\r\n function getDemographics(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient demographics');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/demographics').get().finally(timing.stop);\r\n }\r\n\r\n function geteRxEligibilities(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient eRxEligibilities');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/erxeligibilities').get().finally(timing.stop);\r\n }\r\n\r\n function getAllergies(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient allergies');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/allergies').get().finally(timing.stop);\r\n }\r\n\r\n function getAppointments(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient appointments');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/appointments').get().finally(timing.stop);\r\n }\r\n\r\n function getPrimaryInsurance(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient primary insurance');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/primary-insurance').get().finally(timing.stop);\r\n }\r\n\r\n function getProblems(uid, restangularOptions) {\r\n return internalGetProblems(uid, true, restangularOptions);\r\n }\r\n \r\n function getActiveProblems(uid, restangularOptions) {\r\n return internalGetProblems(uid, false, restangularOptions);\r\n }\r\n \r\n function internalGetProblems(uid, includeInactive, restangularOptions){\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient problems');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients', uid).getList('problems', {activeOnly: !includeInactive}).finally(timing.stop);\r\n }\r\n\r\n function getDxProblemsWithDisplayOrder(patientId, medicationSigId, restangularOptions) {\r\n var dto = {\r\n PatientId: patientId,\r\n MedicationSigId: medicationSigId,\r\n ActiveOnly: true\r\n };\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient problems by medication sig id');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular\r\n .one('patients/' + patientId + '/problems/MedicationSig')\r\n .get(dto)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getMedications(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache || medicationsCacheSet.contains(uid) };\r\n\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient medications');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/medications').get().finally(timing.stop);\r\n }\r\n \r\n function getMedicationsByGroup(uid, restangularOptions) {\r\n return getMedications(uid, restangularOptions).then(function(medications){\r\n var result = {\r\n medications : medications,\r\n medicationsExist : false\r\n };\r\n\r\n //medications should already be sorted by drug class\r\n var drugClasses = [],\r\n groupValue = 'seed_value',\r\n group;\r\n\r\n for (var i = 0; i < medications.length; i++) {\r\n var medication = medications[i];\r\n\r\n if (groupValue !== medication.DrugClassName) {\r\n\r\n if (group !== undefined) {\r\n drugClasses.push(group);\r\n }\r\n\r\n group = {\r\n label: medication.DrugClassName,\r\n active: false,\r\n medications: []\r\n };\r\n\r\n groupValue = group.label;\r\n\r\n }\r\n\r\n group.medications.push(medication);\r\n\r\n if (medication.IsActive) {\r\n group.active = true;\r\n result.medicationsExist = true;\r\n }\r\n }\r\n //one last time\r\n if(group){\r\n drugClasses.push(group);\r\n }\r\n\r\n result.drugClasses = drugClasses;\r\n\r\n return result;\r\n });\r\n }\r\n\r\n function getRemarks(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient remarks');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/remarks').get().finally(timing.stop);\r\n }\r\n\r\n function getRecentVisits(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache || visitCacheSet.contains(uid) };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient visits');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/recentvisits').get().finally(timing.stop);\r\n }\r\n\r\n function getOrders(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient orders');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/orders').getList().finally(timing.stop);\r\n }\r\n\r\n function getObservationResults(uid, filter, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient observation results');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var params = {\r\n dataFilter: filter\r\n };\r\n return restangular.one('patients', uid).customGET('observationresults', params).finally(timing.stop);\r\n }\r\n\r\n function getMostRecentObservationValues(uid, filter, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get most recent patient observation values');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var params = {\r\n dataFilter: filter\r\n };\r\n return restangular.one('patients', uid).customGET('most-recent-observation-values', params).finally(timing.stop);\r\n }\r\n\r\n function getObservationValues(patientId, observationOrderId, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient observation values');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients', patientId).one('observationresults', observationOrderId).get().finally(timing.stop);\r\n }\r\n\r\n function getVitals(uid, vitalsDefaultSettingId, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient vitals');\r\n var obsDefaultSettingId = vitalsDefaultSettingId || LocalStorageRepository.getPatientVitalsDefaultSettingId() || '';\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular\r\n .one('patients', uid)\r\n .customGET('vitals', {\r\n observationDefaultSettingId: obsDefaultSettingId,\r\n })\r\n .finally(timing.stop);\r\n }\r\n\r\n function getObservations(uid, filter, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient observations');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients', uid).customGET('observations', {dataFilter: filter}).finally(timing.stop);\r\n }\r\n\r\n function getHealthMaintenanceReminders(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient health maintenance reminders');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/healthmaintenancereminders').get().finally(timing.stop);\r\n }\r\n\r\n function getPharmacies(uid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'get patient pharmacies');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patients/' + uid + '/pharmacies').get().finally(timing.stop);\r\n }\r\n\r\n function createPatient(patient) {\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'createPatient');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('patients/').post(patient).finally(timing.stop);\r\n }\r\n\r\n function getCreatePatientMetadata($scope) {\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'getCreatePatientMetadata');\r\n return MetadataRepository.getMetadata('patientcreation', $scope).finally(timing.stop);\r\n }\r\n\r\n function updatePatientPhoto(patientId, patientPhoto, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'PatientRepository', 'api', 'updatePatientPhoto');\r\n\r\n return AprimaRestangular.get()\r\n .one('patients', patientId)\r\n .one('photo')\r\n .customPUT(patientPhoto)\r\n .finally(timing.stop);\r\n }\r\n \r\n function getEmVisits(uid, restangularOptions){\r\n restangularOptions = restangularOptions || { ignoreCache : defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'getEmVisits');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/', uid).all('em-visits').getList().finally(timing.stop);\r\n }\r\n\r\n function getAccounts(patientId) {\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'getAccounts');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients', patientId)\r\n .getList('accounts')\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPatientCases(patientId) {\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'getPatientCases');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients', patientId)\r\n .getList('patientcases')\r\n .finally(timing.stop);\r\n }\r\n\r\n function getPatientInformation(patientUid, appointmentUid, visitUid, accountUid, restangularOptions) {\r\n restangularOptions = restangularOptions || { ignoreCache: defaultIgnoreCache };\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'getPatientInformation');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.one('patientInformation/' + patientUid + '/' + appointmentUid + '/' + visitUid + '/' + accountUid).get().finally(timing.stop);\r\n }\r\n\r\n function deletePatientPharmacy(patientPharmacyUid){\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'DeletePatientPharamciesById');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.one('patients/pharmacy/'+patientPharmacyUid).remove().finally(timing.stop);\r\n }\r\n\r\n function setPharmacyOrder(list,patientId){\r\n var timing = AprimaAnalytics.startTiming('PatientRepository', 'api', 'SetPatientPharmacySortOrder');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('patients/'+patientId+'/pharmacy/order').post(list).finally(timing.stop);\r\n \r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-provider-api').factory('VisitRepository',\r\n ['AprimaRestangular', 'AprimaAnalytics', '$rootScope', function (AprimaRestangular, AprimaAnalytics, $rootScope) {\r\n 'use strict';\r\n\r\n return {\r\n getVisit: getVisit,\r\n getVisitDetail: getVisitDetail,\r\n getVisitDocument: getVisitDocument,\r\n createVisit: createVisit,\r\n getVisitByAppointment: getVisitByAppointment,\r\n getVisitDocumentForVisitText: getVisitDocumentForVisitText,\r\n };\r\n\r\n function getVisit(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('VisitRepository', 'api', 'get visit info');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients/' + patientId + '/visits/' + visitId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getVisitDetail(visitId) {\r\n var timing = AprimaAnalytics.startTiming('VisitRepository', 'api', 'get visit detail');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('visits/' + visitId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getVisitDocument(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('VisitRepository', 'api', 'get visit document');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients/' + patientId + '/visits/' + visitId + '/document')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function createVisit(visit) {\r\n var timing = AprimaAnalytics.startTiming('VisitRepository', 'api', 'create visit');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .all('visits')\r\n .post(visit)\r\n .finally(timing.stop)\r\n .finally(function() {\r\n $rootScope.$emit('visit-updated', {patientId: visit.Patient.Id});\r\n });\r\n }\r\n\r\n function getVisitByAppointment(appointmentId) {\r\n var timing = AprimaAnalytics.startTiming('VisitRepository', 'api', 'get appointment visit');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('visit-appointment/' + appointmentId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getVisitDocumentForVisitText(patientId, visitId) {\r\n var timing = AprimaAnalytics.startTiming('VisitRepository', 'api', 'get visit document for visit text');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('patients/' + patientId + '/visits/' + visitId + '/documentvisittext')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n }]);\r\n\r\n","angular.module('aprima-provider-api').factory('PersonRepository', [\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n function (\r\n AprimaAnalytics,\r\n AprimaRestangular\r\n ) {\r\n 'use strict';\r\n\r\n return {\r\n updatePersonPhoto: updatePersonPhoto,\r\n };\r\n\r\n function updatePersonPhoto(patientId, patientPhoto, applicationComponent) {\r\n var timing = AprimaAnalytics.startTiming(applicationComponent || 'PersonRepository', 'api', 'updatePersonPhoto');\r\n\r\n return AprimaRestangular.get()\r\n .one('persons', patientId)\r\n .one('photo')\r\n .customPUT(patientPhoto)\r\n .finally(timing.stop);\r\n }\r\n }\r\n]);\r\n","angular.module('aprima-provider-api').factory('PharmacyRepository',\r\n ['AprimaRestangular', 'MetadataRepository', '$q', 'moment', 'AprimaAnalytics', 'AprimaCache',\r\n function (AprimaRestangular, MetadataRepository, $q, moment, AprimaAnalytics, AprimaCache) {\r\n 'use strict';\r\n\r\n var defaultCache;\r\n\r\n return {\r\n getPharmacy: getPharmacy,\r\n getPharmacyByMasterPharmacyId: getPharmacyByMasterPharmacyId,\r\n searchPharmacies: searchPharmacies,\r\n searchPharmaciesIncludeAllMailOrders: searchPharmaciesIncludeAllMailOrders\r\n };\r\n\r\n function getDefaultCache() {\r\n if (!defaultCache) {\r\n defaultCache = AprimaCache.Default.httpMode;\r\n }\r\n\r\n return defaultCache;\r\n }\r\n\r\n function getPharmacy(id, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'PharmacyRepository', 'api', 'getPharmacy');\r\n\r\n return AprimaRestangular.get().all('lists/pharmacies').one(id).get().finally(timing.stop);\r\n }\r\n\r\n function getPharmacyByMasterPharmacyId(id, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'PharmacyRepository', 'api', 'getPharmacyByMasterPharmacyId');\r\n\r\n return AprimaRestangular.get().all('lists/masterpharmacies').one(id).get().finally(timing.stop);\r\n }\r\n\r\n function searchPharmacies(searchText, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'PharmacyRepository', 'api', 'getPharmacy');\r\n\r\n return AprimaRestangular.get().all('lists/pharmacies').withHttpConfig({cache: getDefaultCache()}).getList({query: searchText}).finally(timing.stop);\r\n }\r\n\r\n function searchPharmaciesIncludeAllMailOrders(searchText, appComponent) {\r\n var timing = AprimaAnalytics.startTiming(appComponent || 'PharmacyRepository', 'api', 'getPharmacy');\r\n\r\n return AprimaRestangular.get().all('lists/pharmacies').withHttpConfig({cache: getDefaultCache()}).getList({query: searchText, includeAllMailOrders: true}).finally(timing.stop);\r\n }\r\n }]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('PrmUserRepository', [\r\n 'AprimaAnalytics',\r\n 'AprimaRestangular',\r\n PrmUserRepository\r\n ]);\r\n\r\n function PrmUserRepository(\r\n AprimaAnalytics,\r\n AprimaRestangular\r\n ) {\r\n var service = {\r\n getUser: getUser,\r\n searchUsers: searchUsers,\r\n };\r\n\r\n return service;\r\n\r\n function getUser(uid) {\r\n var timing = AprimaAnalytics.startTiming('PrmUserRepository', 'api', 'getUser');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('view-find-user')\r\n .one(uid)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function searchUsers(inputSearch) {\r\n //gets rid of all new line characters\r\n inputSearch = inputSearch.replace(/\\n|\\r/g, '');\r\n\r\n var timing = AprimaAnalytics.startTiming('PrmUserRepository', 'api', 'searchUsers');\r\n var restangular = AprimaRestangular.get();\r\n\r\n return restangular\r\n .one('view-find-user/quick-search')\r\n .get({quicksearch: inputSearch})\r\n .finally(timing.stop);\r\n }\r\n }\r\n\r\n})(window.angular);","angular.module('aprima-provider-api')\r\n .factory('ProcedureRepository', ['AprimaRestangular', function (aprimaRestangular) {\r\n 'use strict';\r\n\r\n var getProcedures = function (searchString) {\r\n \tvar queryString = '?maxRecords=20&procedureText=' + searchString;\r\n\r\n return aprimaRestangular.get().all('procedures/' + queryString).getList();\r\n };\r\n\r\n return {\r\n getProcedures: getProcedures\r\n };\r\n\r\n }]);","(function() {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('ProviderRepository', [\r\n 'AprimaRestangular',\r\n 'AprimaAnalytics',\r\n ProviderRepository\r\n ]);\r\n\r\n function ProviderRepository(\r\n AprimaRestangular,\r\n AprimaAnalytics\r\n ) {\r\n return {\r\n getProviderSupervisorListByProviderId: getProviderSupervisorListByProviderId,\r\n getProviderById: getProviderById,\r\n getSupervisorList: getSupervisorList,\r\n getDefaultSupervisor: getDefaultSupervisor\r\n };\r\n\r\n function getProviderSupervisorListByProviderId(providerId) {\r\n // var startTiming = function (page, category, label)\r\n var timing = AprimaAnalytics.startTiming('ProviderRepository', 'api', 'getProviderSupervisorListByProviderId');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('provider/' + providerId + '/supervisors')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getProviderById(providerId){\r\n var timing = AprimaAnalytics.startTiming('ProviderRepository', 'api', 'getProvider');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('provider/' + providerId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getSupervisorList() {\r\n var timing = AprimaAnalytics.startTiming('ProviderRepository', 'api', 'getProvider');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('lists/provider')\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getDefaultSupervisor(linkSupervisorDto) {\r\n var timing = AprimaAnalytics.startTiming('ProviderRepository', 'api', 'getDefaultSupervisor');\r\n var restangular = AprimaRestangular.get();\r\n return restangular\r\n .one('provider/default-supervisor')\r\n .get(linkSupervisorDto)\r\n .finally(timing.stop);\r\n }\r\n }\r\n})();","angular.module('aprima-provider-api').factory('SigRepository',\r\n ['AprimaRestangular', 'AprimaAnalytics',\r\n function (AprimaRestangular, AprimaAnalytics) {\r\n 'use strict';\r\n\r\n return {\r\n getSig: getSig,\r\n getSigwriterResults: getSigwriterResults\r\n };\r\n\r\n function getSig(medicationSigId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigRepository', 'api', 'get sig');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.all('sigs').one(medicationSigId).get().finally(timing.stop);\r\n }\r\n\r\n function getSigwriterResults(sigType, medicationSigId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigRepository', 'api', 'getSigwriterResults');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var opts = {\r\n sigType: sigType,\r\n };\r\n return restangular.all('sigs/sigwriter-results')\r\n .one(medicationSigId)\r\n .get(opts)\r\n .finally(timing.stop);\r\n }\r\n }]);","angular.module('aprima-provider-api').factory('SigWriterRepository',\r\n ['AprimaRestangular', 'AprimaAnalytics', 'MetadataRepository',\r\n function (AprimaRestangular, AprimaAnalytics, MetadataRepository) {\r\n 'use strict';\r\n\r\n return {\r\n checkIsSpecialtyId: checkIsSpecialtyId,\r\n getDirectionsSettings: getDirectionsSettings,\r\n getDrugCptList: getDrugCptList,\r\n getDrugSelected: getDrugSelected,\r\n getDrugSettings: getDrugSettings,\r\n getVisitInfo: getVisitInfo,\r\n startNewRx: startNewRx,\r\n initializeDefaultSig: initializeDefaultSig,\r\n saveDefaultSig: saveDefaultSig,\r\n getDefaultSigMetadata: getDefaultSigMetadata,\r\n };\r\n\r\n function checkIsSpecialtyId(ndc, rxnorm, providerId) {\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'checkIsSpecialtyId');\r\n return AprimaRestangular.get()\r\n .one('drugs/specialty/' + ndc + '/' + rxnorm + '/id/' + providerId)\r\n .get()\r\n .finally(timing.stop);\r\n }\r\n\r\n function getDirectionsSettings(drug, providerId, sigType, visitId, checkIsSpecialtyMedication) {\r\n var restangular = AprimaRestangular.get();\r\n var request = {\r\n Drug: drug,\r\n ProviderId: providerId,\r\n SigType: sigType,\r\n VisitId: visitId,\r\n CheckIsSpecialtyMedication: checkIsSpecialtyMedication\r\n };\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'getDirectionsSettings');\r\n return restangular\r\n .all('sigwriter/' + providerId + '/directions-settings')\r\n .post(request)\r\n .finally(timing.stop);\r\n }\r\n\r\n function getDrugCptList(medid) {\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'getDrugCptList');\r\n var restangular = AprimaRestangular.get();\r\n return restangular.all('sigwriter/drugcptlist/' + medid)\r\n .getList()\r\n .finally(timing.stop());\r\n }\r\n\r\n function getDrugSelected(drugSelected, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'get drug selected');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.all('sigwriter/selectdrug').post(drugSelected).finally(timing.stop);\r\n }\r\n\r\n function getDrugSettings(sigType, drug, providerId, patientId, visitId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var request = {\r\n Drug: drug,\r\n PatientId: patientId,\r\n SigType: sigType,\r\n VisitId: visitId,\r\n };\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'getDrugSettings');\r\n return restangular\r\n .all('sigwriter/' + providerId + '/drug-settings')\r\n .post(request)\r\n .finally(timing.stop);\r\n\r\n /*\r\n var promise = restangular\r\n .all('sigwriter/' + providerId + '/drug-settings')\r\n .post(request)\r\n .finally(timing.stop);\r\n return promise;\r\n */\r\n }\r\n\r\n function getVisitInfo(visitId, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'getVisitInfo');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n return restangular.all('sigwriter/visitinfo')\r\n .one(visitId)\r\n .get()\r\n .finally(timing.stop);\r\n\r\n }\r\n\r\n function startNewRx(patientId, visitId, sigType, drugSelected, restangularOptions) {\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'startNewRx');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var request = {\r\n PatientId: patientId,\r\n SelectedDrug: drugSelected,\r\n SigType: sigType,\r\n VisitId: visitId,\r\n };\r\n return restangular.all('sigwriter/startnewrx')\r\n .post(request)\r\n .finally(timing.stop);\r\n }\r\n\r\n function initializeDefaultSig(currentRx, providerDefaultSigId, restangularOptions){\r\n\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'initialize default sig');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var params = (providerDefaultSigId) ? '/' + providerDefaultSigId : '';\r\n return restangular.all('fnc/rx/initialize-default-sig' + params).post(currentRx).finally(timing.stop);\r\n }\r\n\r\n function saveDefaultSig(createModifyDefaultSigDto, restangularOptions){\r\n\r\n restangularOptions = restangularOptions || {ignoreCache: false};\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'save default sig');\r\n var restangular = AprimaRestangular.get(restangularOptions);\r\n var params = (createModifyDefaultSigDto.ProviderDefaultSigId) ? '/' + createModifyDefaultSigDto.ProviderDefaultSigId : '';\r\n return restangular.all('fnc/rx/default-sig' + params).post(createModifyDefaultSigDto).finally(timing.stop);\r\n }\r\n\r\n function getDefaultSigMetadata ($scope) {\r\n var timing = AprimaAnalytics.startTiming('SigWriterRepository', 'api', 'getDefaultSigMetadata');\r\n return MetadataRepository.getMetadata('fnc/rx/new-default-sig', $scope).finally(timing.stop);\r\n }\r\n }]);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('LicenseService', [\r\n 'LocalStorageRepository',\r\n LicenseService,\r\n ]);\r\n\r\n function LicenseService(\r\n LocalStorageRepository\r\n ) {\r\n return {\r\n hasFdbDosingLicense: hasFdbDosingLicense,\r\n hasImoDiagnosisLicense: hasImoDiagnosisLicense,\r\n };\r\n\r\n function hasFdbDosingLicense() {\r\n var licenses = LocalStorageRepository.getCurrentUserLicenses();\r\n return !licenses || //assume has the license since old servers don't send the information\r\n licenses.HasFdbDosing;\r\n }\r\n\r\n function hasImoDiagnosisLicense() {\r\n var licenses = LocalStorageRepository.getCurrentUserLicenses();\r\n return !licenses || //assume has the license since old servers don't send the information\r\n licenses.HasImoDiagnosis;\r\n }\r\n }\r\n})(angular);","angular.module('aprima-provider-api').factory('SettingRepository',\r\n ['AprimaRestangular', 'DashboardStructure', '_',\r\n function (AprimaRestangular, DashboardStructure, _) {\r\n 'use strict';\r\n\r\n var configToPhoneConfigMapper = _.partialRight(mapToDeviceConfig, 'PhoneTiles');\r\n var configToTabletConfigMapper = _.partialRight(mapToDeviceConfig, 'TabletTiles');\r\n var configToDesktopConfigMapper = _.partialRight(mapToDeviceConfig, 'DesktopTiles');\r\n\r\n return {\r\n providerDashboard: providerDashboard,\r\n userSettings: userSettings,\r\n patientDashboardTiles: patientDashboardTiles,\r\n patientDashboardConfigurations: patientDashboardConfigurations,\r\n createPatientDashboardConfiguration: createPatientDashboardConfiguration,\r\n updatePatientDashboardConfiguration: updatePatientDashboardConfiguration,\r\n deletePatientDashboardConfiguration: deletePatientDashboardConfiguration,\r\n getDrugSearchIncludeInactive: getDrugSearchIncludeInactive,\r\n getProviderSettings: getProviderSettings,\r\n saveProviderSettings: saveProviderSettings,\r\n getProviderEpcsSettings: getProviderEpcsSettings,\r\n getKdbConfigurationId: getKdbConfigurationId,\r\n getKdbConfigurationIdByVisit: getKdbConfigurationIdByVisit,\r\n getSigWriterSettings: getSigWriterSettings,\r\n siteSettings: siteSettings,\r\n };\r\n\r\n function patientDashboardTiles(){\r\n return AprimaRestangular.get().one('settings/patient-dashboard-tiles/').get();\r\n }\r\n\r\n function patientDashboardConfigurations() {\r\n var dashboardStructure = DashboardStructure.get();\r\n\r\n return AprimaRestangular.get()\r\n .one(dashboardStructure.repositoryRoute)\r\n .get()\r\n .then(function(configs) {\r\n configs = dashboardStructure.mapFn(configs);\r\n\r\n var result = {\r\n phoneConfigs: _.map(configs, configToPhoneConfigMapper),\r\n tabletConfigs: _.map(configs, configToTabletConfigMapper),\r\n desktopConfigs: _.map(configs, configToDesktopConfigMapper),\r\n allConfigs: configs\r\n };\r\n\r\n return result;\r\n });\r\n }\r\n\r\n function createPatientDashboardConfiguration(configuration){\r\n return AprimaRestangular.get().one('settings/patient-dashboards/').customPOST(configuration);\r\n }\r\n\r\n function updatePatientDashboardConfiguration(dashboardId, configuration){\r\n return AprimaRestangular.get().one('settings/patient-dashboards/' + dashboardId).customPUT(configuration);\r\n }\r\n\r\n function deletePatientDashboardConfiguration(dashboardId){\r\n return AprimaRestangular.get().one('settings/patient-dashboards/' + dashboardId).remove();\r\n }\r\n\r\n function providerDashboard(userid) {\r\n return AprimaRestangular.get().one('settings/providerdashboard/' + userid).get();\r\n }\r\n\r\n function userSettings(userid) {\r\n return AprimaRestangular.get().one('settings/usersettings/' + userid).get();\r\n }\r\n\r\n function siteSettings() {\r\n return AprimaRestangular.get().one('settings/site-settings').get();\r\n }\r\n\r\n function getProviderSettings(userId) {\r\n return AprimaRestangular.get().one('settings/providersettings/' + userId).get();\r\n }\r\n\r\n function getProviderEpcsSettings(userId, siteId) {\r\n return AprimaRestangular.get().one('settings/providersettings/' + userId + '/epcs/' + (siteId || '00000000-0000-0000-0000-000000000000')).get();\r\n }\r\n\r\n function saveProviderSettings(userId, settings) {\r\n return AprimaRestangular.get().one('settings/providersettings/' + userId).customPUT(settings);\r\n }\r\n\r\n function mapToDeviceConfig(config, index, collection, deviceSelector) {\r\n return {\r\n Id: config.Id,\r\n ExternalId: config.ExternalId,\r\n Name: config.Name,\r\n DisplayOrder: config.DisplayOrder,\r\n Tiles: _.cloneDeep(config[deviceSelector])\r\n };\r\n }\r\n\r\n // !userId means just use the CurrentUser\r\n function getKdbConfigurationId(userId, renderingProviderId, billingProviderId) {\r\n var promise = getKdbConfiguration(userId, renderingProviderId, billingProviderId)\r\n .then(function(data) {\r\n if(!data) {\r\n return null;\r\n }\r\n\r\n return data.KdbConfigurationId;\r\n });\r\n return promise;\r\n }\r\n\r\n // !userId means just use the CurrentUser\r\n function getKdbConfiguration(userId, renderingProviderId, billingProviderId) {\r\n var params = {\r\n userId: userId || null,\r\n renderingProviderId: renderingProviderId || null,\r\n billingProviderId: billingProviderId || null,\r\n };\r\n\r\n var promise = AprimaRestangular.get()\r\n .one('settings/kdbconfiguration')\r\n .get(params);\r\n return promise;\r\n }\r\n\r\n // !userId means just use the CurrentUser\r\n function getKdbConfigurationIdByVisit(userId, visitId) {\r\n var promise = getKdbConfigurationByVisit(userId, visitId)\r\n .then(function(data) {\r\n if(!data) {\r\n return null;\r\n }\r\n\r\n return data.KdbConfigurationId;\r\n });\r\n return promise;\r\n }\r\n\r\n // !userId means just use the CurrentUser\r\n function getKdbConfigurationByVisit(userId, visitId) {\r\n var params = {\r\n userId: userId || null,\r\n visitId: visitId || null,\r\n };\r\n\r\n var promise = AprimaRestangular.get()\r\n .one('settings/kdbconfiguration-visit')\r\n .get(params);\r\n return promise;\r\n }\r\n\r\n function getDrugSearchIncludeInactive(providerId) {\r\n var params = {\r\n providerId: providerId || null\r\n };\r\n\r\n var promise = AprimaRestangular.get()\r\n .one('settings/drug-search-include-inactive')\r\n .get(params);\r\n return promise;\r\n }\r\n \r\n function getSigWriterSettings() {\r\n return AprimaRestangular.get().one('settings/sigwriter-settings').get();\r\n }\r\n\r\n }]);\r\n","angular.module('aprima-provider-api').factory('SettingService',\r\n ['SettingRepository', 'CurrentUser', 'LocalStorageRepository', 'Bridge', '$q', '_', '$log', 'ServerInfoRepository', 'DeviceSettings', 'debounce', 'ProviderSettingsDtoMapper', 'SettingsService', 'SiteSettingsService',\r\n function (SettingRepository, CurrentUser, LocalStorageRepository, Bridge, $q, _, $log, ServerInfoRepository, DeviceSettings, debounce, ProviderSettingsDtoMapper, SettingsService, SiteSettingsService) {\r\n 'use strict';\r\n\r\n var saveSettingsPromise = $q.when();\r\n\r\n function serverAllowsSavingSettings() {\r\n return ServerInfoRepository.isFeatureSupported('SaveSettings');\r\n }\r\n\r\n function loadSettings() {\r\n LocalStorageRepository.setDefaultAppointmentsBadgeSettings({\r\n hideDischarged: true\r\n });\r\n\r\n return $q.all([\r\n loadPatientDashboardTiles(),\r\n loadPatientDashboardConfigurations(),\r\n loadProviderSettings(),\r\n loadSiteSettings(),\r\n ]);\r\n }\r\n\r\n function loadPatientDashboardTiles() {\r\n return SettingRepository.patientDashboardTiles()\r\n .then(function (list) {\r\n LocalStorageRepository.removePatientDashboardWidgets();\r\n LocalStorageRepository.setPatientDashboardWidgets(list);\r\n });\r\n }\r\n\r\n function loadPatientDashboardConfigurations() {\r\n return SettingRepository.patientDashboardConfigurations()\r\n .then(function (config) {\r\n LocalStorageRepository.setPatientDashboardConfigurations(config.phoneConfigs, 1);\r\n LocalStorageRepository.setPatientDashboardConfigurations(config.tabletConfigs, 2);\r\n LocalStorageRepository.setPatientDashboardConfigurations(config.desktopConfigs, 3);\r\n LocalStorageRepository.setPatientDashboardConfigurations(config.allConfigs, 'all');\r\n })\r\n .catch(function () {\r\n $log.error('error getting patient dashboard configurations');\r\n });\r\n }\r\n\r\n function loadProviderSettings() {\r\n var userId = CurrentUser.get().userId;\r\n\r\n if(serverAllowsSavingSettings()) {\r\n return SettingRepository.getProviderSettings(userId)\r\n .then(function (providerSettings) {\r\n var deviceSettings;\r\n\r\n if (DeviceSettings.isPhone) {\r\n deviceSettings = providerSettings.PhoneSettings;\r\n }\r\n else if (DeviceSettings.isTablet) {\r\n deviceSettings = providerSettings.TabletSettings;\r\n }\r\n else {\r\n deviceSettings = providerSettings.DesktopSettings;\r\n }\r\n\r\n if(!deviceSettings){\r\n deviceSettings = providerSettings.PhoneSettings ||\r\n providerSettings.TabletSettings ||\r\n providerSettings.DesktopSettings;\r\n }\r\n\r\n if (deviceSettings) {\r\n setDashboardSettings(deviceSettings.DashboardSettings, deviceSettings);\r\n setGeneralNoteTypeSettings(deviceSettings.GeneralNoteTypes);\r\n LocalStorageRepository.setCurrentUserLicenses(deviceSettings.Licenses);\r\n LocalStorageRepository.setIsERxEnabled(deviceSettings.IsERxEnabled);\r\n LocalStorageRepository.setAllowImperialUnits(deviceSettings.AllowImperialUnitsInPrescription);\r\n var superbillMethod = deviceSettings.DefaultSuperbillStatusId || 0;\r\n LocalStorageRepository.setDefaultSuperbillSubmissionMethod(superbillMethod);\r\n SettingsService.setProviderDeviceSettings(providerSettings);\r\n LocalStorageRepository.setIsCacheClient(deviceSettings.IsCacheClient);\r\n }\r\n });\r\n }\r\n else {\r\n var dashboardRequest = SettingRepository.providerDashboard(userId)\r\n .then(function (dashboardSettings) {\r\n setDashboardSettings(dashboardSettings);\r\n });\r\n\r\n var userSettingsRequest = SettingRepository.userSettings(userId)\r\n .then(function (userSettings) {\r\n setGeneralNoteTypeSettings(userSettings);\r\n LocalStorageRepository.setCurrentUserLicenses(null);\r\n LocalStorageRepository.setIsERxEnabled(userSettings.IsERxEnabled || false);\r\n LocalStorageRepository.setAllowImperialUnits(userSettings.AllowImperialUnitsInPrescription || false);\r\n LocalStorageRepository.setIsCacheClient(userSettings.IsCacheClient || false);\r\n });\r\n\r\n return $q.all([dashboardRequest, userSettingsRequest]);\r\n }\r\n }\r\n\r\n function loadSiteSettings() {\r\n if (serverAllowsSavingSettings()) {\r\n return SettingRepository.siteSettings()\r\n .then(function (siteSettings) {\r\n SiteSettingsService.setSiteSettings(siteSettings);\r\n });\r\n }\r\n }\r\n\r\n function updateNativeSettings() {\r\n var settings = [];\r\n\r\n var badgeSetting = {\r\n Name: 'BadgeAppointmentsHideDischarged',\r\n Value: LocalStorageRepository.getAppointmentsBadgeSettings().hideDischarged\r\n };\r\n\r\n var calendarSettings = LocalStorageRepository.getAppointmentsListSettings();\r\n var currentCalendar = calendarSettings &&\r\n calendarSettings.calendarIds &&\r\n calendarSettings.calendarIds[calendarSettings.index];\r\n var calendarUidSetting = {\r\n Name: 'BadgeAppointmentsCalendarUid',\r\n Value: currentCalendar\r\n };\r\n\r\n var messageListSettings = LocalStorageRepository.getMessagesListSettings();\r\n var messageFilter = messageListSettings &&\r\n messageListSettings.filters &&\r\n messageListSettings.filters[messageListSettings.startFilter];\r\n var messageFilterUidSetting = {\r\n Name: 'BadgeMessageFilterUid',\r\n Value: messageFilter && messageFilter.Id\r\n };\r\n\r\n settings.push(badgeSetting);\r\n settings.push(calendarUidSetting);\r\n settings.push(messageFilterUidSetting);\r\n $log.log('badge settings ' + settings);\r\n Bridge.updateSettings(settings);\r\n }\r\n\r\n function setDashboardSettings(dashboardSettings, providerSettings) {\r\n setDashboardTileSettings(dashboardSettings);\r\n setCalendarSettings(dashboardSettings, providerSettings && providerSettings.ScheduleSettings);\r\n setMessageSettings(dashboardSettings, providerSettings && providerSettings.MessageSettings);\r\n\r\n updateNativeSettings();\r\n }\r\n\r\n function setGeneralNoteTypeSettings(generalNoteTypes) {\r\n LocalStorageRepository.setPhoneMessageGeneralNoteTypeId(generalNoteTypes.PhoneMessageGeneralNoteTypeId || '10101010-0000-0000-0000-000000000003');\r\n LocalStorageRepository.setTaskMessageGeneralNoteTypeId(generalNoteTypes.TaskMessageGeneralNoteTypeId || '10101010-0000-0000-0000-000000000005');\r\n LocalStorageRepository.setPortalMessageGeneralNoteTypeId(generalNoteTypes.PortalMessageGeneralNoteTypeId || '5E9280E5-3388-49E8-A5AE-4DFFBB0A9B89');\r\n LocalStorageRepository.setPatientVitalsDefaultSettingId(generalNoteTypes.DefaultVitalsSettingId || null);\r\n LocalStorageRepository.setRxRefillMessageGeneralNoteTypeId(generalNoteTypes.RxRefillMessageGeneralNoteTypeId || 'A2B88BC2-E7C8-4990-92F6-AE28B5C0DC77');\r\n LocalStorageRepository.setPharmacyRefillMessageGeneralNoteTypeId(LocalStorageRepository.getRxRefillMessageGeneralNoteTypeId()); // Reuse for now but store separately\r\n LocalStorageRepository.setPharmacyGeneralNoteTypeId(generalNoteTypes.PharmacyGeneralNoteTypeId || '10101010-0000-0000-0000-000000000010');\r\n }\r\n\r\n function setDashboardTileSettings(dashboardSettings) {\r\n var tiles = dashboardSettings.Tiles;\r\n\r\n _.forEach(tiles, function (tile) {\r\n if (tile.Calendars) {\r\n tile.Calendar = tile.Calendars.length ? tile.Calendars[0] : null;\r\n }\r\n else if(tile.Calendar) {\r\n tile.Calendars = [tile.Calendar];\r\n }\r\n\r\n if(tile.ExternalPatientsFilter && tile.ExternalPatientsFilter.ServiceSite && !LocalStorageRepository.getDefaultServiceSiteId()) {\r\n LocalStorageRepository.setDefaultServiceSiteId(tile.ExternalPatientsFilter.ServiceSite.Id);\r\n }\r\n });\r\n\r\n LocalStorageRepository.setDefaultDashboardTileSettings({\r\n Tiles: tiles\r\n });\r\n }\r\n\r\n function setCalendarSettings(dashboardSettings, scheduleSettings) {\r\n var setting;\r\n\r\n if(scheduleSettings){\r\n setting = {\r\n calendarIds: scheduleSettings.ScheduleCalendarIds && scheduleSettings.ScheduleCalendarIds.length ? scheduleSettings.ScheduleCalendarIds : [],\r\n displayEndTime: !!scheduleSettings.DisplayEndTime,\r\n findSlotForNewAppt: !!scheduleSettings.FindSlotForNewAppt,\r\n index: 0\r\n };\r\n }\r\n else {\r\n var calendarTiles = _.filter(dashboardSettings.Tiles, {Type: 'Calendar'});\r\n var firstCalendarTile = calendarTiles && calendarTiles.length ? calendarTiles[0] : null;\r\n\r\n setting = {\r\n calendarIds: firstCalendarTile && firstCalendarTile.Calendars.length ? _.map(firstCalendarTile.Calendars, 'Id') : [],\r\n displayEndTime: false,\r\n findSlotForNewAppt: false,\r\n index: 0\r\n };\r\n }\r\n\r\n LocalStorageRepository.setDefaultAppointmentsListSettings(setting);\r\n }\r\n\r\n function setMessageSettings(dashboardSettings, messageSettings) {\r\n var messageFilters;\r\n\r\n if(messageSettings) {\r\n messageFilters = _.map(messageSettings.MessageFilterIds, function(id) {\r\n return {\r\n Id: id\r\n };\r\n });\r\n }\r\n\r\n if(!messageFilters || !messageFilters.length) {\r\n messageFilters = _(dashboardSettings.Tiles)\r\n .filter(function(value){\r\n return value.Type === 'Messages' && value.MessageFilter;\r\n })\r\n .map(function(value){\r\n return value.MessageFilter;\r\n });\r\n }\r\n\r\n LocalStorageRepository.setDefaultMessagesListSettings({\r\n filters: messageFilters,\r\n startFilter: 0\r\n });\r\n }\r\n\r\n function updatePatientDashboardConfiguration(dashboardConfiguration){\r\n if(!dashboardConfiguration.isNewDashboard || dashboardConfiguration.isNewDashboard === false){\r\n return SettingRepository.updatePatientDashboardConfiguration(dashboardConfiguration.Id, dashboardConfiguration);\r\n }\r\n else{\r\n return SettingRepository.createPatientDashboardConfiguration(dashboardConfiguration);\r\n }\r\n }\r\n\r\n function deletePatientDashboardConfiguration(dashboardConfiguration){\r\n if(!dashboardConfiguration.isNewDashboard || dashboardConfiguration.isNewDashboard === false){\r\n return SettingRepository.deletePatientDashboardConfiguration(dashboardConfiguration.Id);\r\n }\r\n else{\r\n var deferred = $q.defer();\r\n deferred.resolve({});\r\n return deferred.promise;\r\n }\r\n }\r\n\r\n function saveSettings() {\r\n var userId = CurrentUser.get().userId;\r\n\r\n var settings = ProviderSettingsDtoMapper.getProviderSettingsDto();\r\n return SettingRepository.saveProviderSettings(userId, settings);\r\n }\r\n\r\n var debouncedSaveSettings = debounce(10000, function debouncedSaveSettings() {\r\n //prevent from sending multiple requests simultaneously.\r\n saveSettingsPromise = saveSettingsPromise.finally(function() {\r\n return saveSettings();\r\n });\r\n });\r\n\r\n function setSetting(setFn, settings){\r\n var result = _.bind(setFn, LocalStorageRepository)(settings);\r\n\r\n if(serverAllowsSavingSettings()) {\r\n debouncedSaveSettings();\r\n }\r\n\r\n return result;\r\n }\r\n \r\n function getSigWriterSettings() {\r\n if (!ServerInfoRepository.isFeatureSupported('Sigwriter_ListSettings')) {\r\n // if the endpoint isn't available, then return a default value.\r\n // This data structure should match the structure of the object returned from the endpoint below.\r\n return $q.when({\r\n FrequencyDisplayAbbreviationFirst: false,\r\n IsDxInPharmacyInstructionsAnError: true,\r\n });\r\n }\r\n\r\n /*\r\n getSigWriterSettings() is intended to be called from SigwriterRxService.loadOptions().\r\n And, by design, meant to call the respective end point (SettingRepository.getSigWriterSettings)\r\n to retrieve the Sig Writer List Settings each time the Sig Writer is opened (called by loadOptions).\r\n By doing this, mobile users will not be required to reopen the mobile application to in order for \r\n any behavior to be updates.\r\n\r\n If, when, the PRM applications become completely web based (not hybrid), this caching \r\n implementation will need to be revisited.\r\n */\r\n var deferred = $q.defer();\r\n SettingRepository.getSigWriterSettings()\r\n .then(function(settings) {\r\n var sigWriterSettings = {\r\n FrequencyDisplayAbbreviationFirst: settings.FrequencyDisplayAbbreviationFirst,\r\n IsDxInPharmacyInstructionsAnError: settings.IsDxInPharmacyInstructionsAnError,\r\n };\r\n deferred.resolve(sigWriterSettings);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n return {\r\n imperialUnitsAllowed: LocalStorageRepository.getAllowImperialUnits.bind(LocalStorageRepository),\r\n loadSettings: loadSettings,\r\n updateNativeSettings : updateNativeSettings,\r\n updatePatientDashboardConfiguration: updatePatientDashboardConfiguration,\r\n deletePatientDashboardConfiguration: deletePatientDashboardConfiguration,\r\n\r\n getPatientDashboardWidgets: function() {\r\n return LocalStorageRepository.getPatientDashboardWidgets();\r\n },\r\n\r\n getAppointmentsListSettings: function () {\r\n return LocalStorageRepository.getAppointmentsListSettings();\r\n },\r\n setAppointmentsListSettings: _.partial(setSetting, LocalStorageRepository.setAppointmentsListSettings),\r\n\r\n getMessagesListSettings: function () {\r\n return LocalStorageRepository.getMessagesListSettings();\r\n },\r\n setMessagesListSettings: _.partial(setSetting, LocalStorageRepository.setMessagesListSettings),\r\n\r\n getAppointmentsBadgeSettings: function () {\r\n return LocalStorageRepository.getAppointmentsBadgeSettings();\r\n },\r\n setAppointmentsBadgeSettings: _.partial(setSetting, LocalStorageRepository.setAppointmentsBadgeSettings),\r\n\r\n getDashboardTileSettings: function () {\r\n return LocalStorageRepository.getDashboardTileSettings();\r\n },\r\n\r\n setDashboardTileSettings: _.partial(setSetting, LocalStorageRepository.setDashboardTileSettings),\r\n\r\n getSigWriterSettings: getSigWriterSettings\r\n };\r\n }\r\n ])\r\n;\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-provider-api').factory('ValidationResult', [\r\n 'ObjUtil',\r\n ValidationResultFactory,\r\n ]);\r\n\r\n function ValidationResultFactory(\r\n ObjUtil\r\n ) {\r\n\r\n ValidationResult.mapFromApi = mapFromApi;\r\n return ValidationResult;\r\n\r\n function ValidationResult(hasWarning, message) {\r\n ObjUtil.defineReadonlyProps(this, {\r\n hasWarning: !!hasWarning,\r\n message: message || '',\r\n });\r\n }\r\n\r\n function mapFromApi(resultObj) {\r\n if(!resultObj) {\r\n return new ValidationResult();\r\n }\r\n\r\n return new ValidationResult(resultObj.HasWarning, resultObj.Message);\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n \r\n var serviceName = 'ValidationWarnings';\r\n var mainRoute = 'warnings';\r\n\r\n angular.module('aprima-provider-api').factory(serviceName, [\r\n '_',\r\n '$q',\r\n 'AprimaAnalytics',\r\n 'AprimaCache',\r\n 'AprimaRestangular',\r\n 'ServerInfoRepository',\r\n 'ValidationResult',\r\n ValidationWarnings,\r\n ]);\r\n\r\n function ValidationWarnings(\r\n _,\r\n $q,\r\n AprimaAnalytics,\r\n AprimaCache,\r\n AprimaRestangular,\r\n ServerInfoRepository,\r\n ValidationResult\r\n ) {\r\n\r\n var defaultCache = AprimaCache.Default.httpMode;\r\n\r\n var service = {\r\n insuranceExclusion: insuranceExclusion,\r\n inOfficeHours: inOfficeHours,\r\n };\r\n\r\n return service;\r\n\r\n function insuranceExclusion(providerId, patientId, accountId) {\r\n var params = {\r\n providerId: providerId,\r\n patientId: patientId,\r\n accountId: accountId,\r\n };\r\n var result = get('insurance-exclusion', params, 'ProviderInsuranceExclusionWarning', defaultCache);\r\n return result;\r\n }\r\n\r\n function inOfficeHours(calendarId, startDate, endDate) {\r\n var params = {\r\n calendarId: calendarId,\r\n startDate: startDate,\r\n endDate: endDate,\r\n };\r\n var result = get('office-hours', params, 'CalendarOfficeHoursWarning', defaultCache);\r\n return result;\r\n }\r\n\r\n function get(route, params, requiredFeature, cache) {\r\n if(requiredFeature && !ServerInfoRepository.isFeatureSupported(requiredFeature)) {\r\n return $q.when(new ValidationResult());\r\n }\r\n\r\n var timing = AprimaAnalytics.startTiming(serviceName, 'api', route);\r\n return AprimaRestangular.get()\r\n .one(mainRoute, route)\r\n .withHttpConfig({cache: cache})\r\n .get(params)\r\n .then(function(data) {\r\n return ValidationResult.mapFromApi(data);\r\n })\r\n .finally(timing.stop);\r\n }\r\n }\r\n\r\n})(window.angular);","angular.module('aprima-provider-api').factory(\r\n 'VersionService', ['AprimaRestangular', 'configuration', '_', '$q', function (AprimaRestangular, configuration, _, $q) {\r\n 'use strict';\r\n\r\n function checkVersions(apiVersions, minVersion){\r\n var restangular = AprimaRestangular.get();\r\n var apiCompatible = false,\r\n clientVersionCompatible = false;\r\n\r\n var validationPromise;\r\n\r\n //for legacy purposes, we can call the server \r\n if(!apiVersions || !minVersion){\r\n validationPromise = $q.all([\r\n restangular.one('minclientversion').get(),\r\n restangular.all('apiversions').getList()\r\n ]).then(function(data){\r\n clientVersionCompatible = checkMinClientVersion(data[0]);\r\n apiCompatible = checkApiCompatibility(data[1]);\r\n return clientVersionCompatible && apiCompatible;\r\n });\r\n } \r\n else{\r\n var deferred = $q.defer();\r\n\r\n deferred.resolve(checkApiCompatibility(apiVersions) && checkMinClientVersion(minVersion));\r\n\r\n validationPromise = deferred.promise;\r\n }\r\n\r\n return validationPromise;\r\n }\r\n\r\n function getServerVersions(){\r\n var restangular = AprimaRestangular.get();\r\n\r\n return restangular.one('serverversions').get();\r\n }\r\n\r\n function checkApiCompatibility(apiVersions){\r\n return _.some(apiVersions, function(api) {\r\n return api === configuration.SERVER_API_VERSION;\r\n });\r\n }\r\n\r\n function checkMinClientVersion(minVersion){\r\n return checkVersionValid(configuration.CLIENT_VERSION, minVersion);\r\n }\r\n\r\n function getClientVersion(){\r\n return configuration.CLIENT_VERSION;\r\n }\r\n\r\n function checkVersionValid(currentVersion, validVersion){\r\n if(_.isString(currentVersion)) {\r\n currentVersion = currentVersion.split('.');\r\n }\r\n\r\n if(_.isString(validVersion)) {\r\n validVersion = validVersion.split('.');\r\n }\r\n\r\n if(!currentVersion)\r\n {\r\n currentVersion = validVersion;\r\n }\r\n \r\n var currentVersionLonger = currentVersion.length >= validVersion.length;\r\n var len = currentVersionLonger ? validVersion.length : currentVersion.length;\r\n for(var i =0; i < len; i++){\r\n if(parseInt(currentVersion[i]) > parseInt(validVersion[i]) ){\r\n return true;\r\n }\r\n else if(parseInt(currentVersion[i]) < parseInt(validVersion[i])){\r\n return false;\r\n }\r\n }\r\n return currentVersionLonger;\r\n }\r\n\r\n\r\n return {\r\n checkVersions: checkVersions,\r\n checkVersionValid: checkVersionValid,\r\n getClientVersion: getClientVersion,\r\n getServerVersions: getServerVersions\r\n };\r\n }]);\r\n"]}