{"version":3,"sources":["scripts/app.js"],"names":["recorderShow","RecorderService","ProfileService","$log","$rootScope","_","$uibModal","ModalService","getCustomer","getProfile","then","response","data","customer","id","recorderInfo","getRecorder","vm","recorder","undefined","getRecorderByCustomerID","recorderResponse","items","showRecorder","angular","isUndefined","showUpload","openRecorderChange","modalname","getCableTypesFromApi","cables","cableTypes","getAllRecorders","recorders","modal_data","modal","open","openModalWindow","result","recorder_id","cable_id","sn","cable_type","find","name","customer_id","customerId","isDefined","setRecorder","createRecorder","this","$onInit","ProfileActivityController","ProfileActivityService","getActivity","role","activity","$inject","module","modals","backdrop","keyboard","resolve","modalData","login","templateUrl","controller","controllerAs","bindToController","size","changePassword","paymentStatistic","paymentStatisticCustomer","changeRecorderInfo","changeCustomerInfo","changeCustomerInfoAdmin","changeWorkerInfo","openEcgUpload","openPatientEdit","createCustomer","openVerification","createWorker","adminFullEcgList","adminListCustomer","confirm","listOfWorkers","statistic","factory","ModalFactory","defaultData","header","accept","acceptClass","refuse","refuseClass","modalName","resultObject","confirmData","returnData","extend","ModalController","$filter","$scope","$uibModalInstance","ecg","makeEvent","eventName","toSend","obj","event","$broadcast","close","dismiss","ok","openNew","new_modal","filterAndCountECG","filterParam","filterText","currentPage","pageSize","filteredEcg","listOfEcg","filteredEcgLength","length","total","today","Date","minDate","openConfirm","$on","getPatients","value","filtertext","regexp","RegExp","filtered","filter","o","surname","search","sortBy","getFilteredEcgInModal","filterArray","split","forEach","elem","patient","full_name","company_name","contact_person","push","ConfirmModalController","DropdownCtrl","status","isopen","toggled","toggleDropdown","$event","preventDefault","stopPropagation","DatepickerController","popup","opened","options","showWeeks","dateOptions","startingDay","adminFullList","moment","filterObjects","profile","dates","all","unix","year","startOf","month","period","ecgParam","page","setTimeout","getEcg","$watch","scope","$ctrl","newValue","oldValue","parceString","getEcgById","resp","err","searchString","getPaginatedEcgInfo","getEcgByDate","pagination","_meta","deleteEcg","console","log","component","$element","$attrs","bindings","paymentStatisticComponent","PaymentStatisticService","mapOperatorStatistic","stArray","key","sum","money","number","dval","Number","normal","urgent","outcomes","mapCustomerStatistic","countedKeys","lease_sum","rent_sum","resultRow","operatorMonth","supervisorMonth","getSums","thisObj","totals","totalO","h24o","sumEcg","h48o","h72o","totalS","h24s","h48s","h72s","totalMoneyO","sumMoney","totalMoneyS","count","countU","Object","assign","mapSupervisorStatistic","roles","keys","monthList","reformatedStatistic","i","operator","supervisor","$postLink","init","usertype","getUserStatistic","userid","getCustomerStatistic","getSelfCustomerStatistic","uservalue","paymentStatisticLineComponent","openStatisticModal","template","paymentStatisticIcon","$q","$http","APIHOST","authorization","token","method","url","headers","Authorization","getSelfMonthStatistic","monthData","resultStatistic","price","stat","hours","element","ykey","hasOwnProperty","service","recorderId","customerID","getFullRecordersList","getCableTypes","RecorderController","recorderTest","c_id","recorderList","rbtpl","workerList","WorkerService","rx","$uibModalStack","countActive","getFullWorkerList","filterObject","listToDisplay","disableButton","indexOf","searchElem","obs$","Observable","fromEvent","map","e","target","text","filterByString","$digest","debounce","timer","subsciption$","subscribe","v","openChangeWorkerInfo","prepareData","openModal","setActivity","user","updateUserStatus","openConfirmModal","worker","confirmModal","body","tpl","buttonText","GENDERS","datePrepare","patchWorker","ready_to_work","getUserInfo","error","genders","dob","getDateFromBack","document_date","patchWorkerData","userId","dataObject","changeStatus","roleList","statusList","defer","responses","roleLength","statusLength","reject","Supervisor","promise","WorkerController","getUserInfoNew","workers","type","setUserStatus","userRole","sendRoleToPatch","sendStatusToPatch","profileModalHelp","LoginService","resetPassword","email","getResetToken","getCurrentUser","deleteCustomer","getUserStatus","userInfo","user_id","getCustomerInfoNew","updateUserInfo","userProfile","getFullCusromerInfo","customerInfo","updateCustomer","updateWorker","isObject","statusParam","statusToSend","ProfileController","mainService","paymentService","ROLES","getCustomers","updateCustomerUser","toUpdate","phone","dongle_access_token","getUsers","updateWorkerUser","merge","gender","openCreateCustomer","subtype","customerType","tariff_id","ext_type","dry_fop_date","setDateToBack","openChangeCustomerInfo","deferred","callerRole","openAdminListCustomer","resp1","customers","users","functions","delete","getStatus","openCreateWorker","workerType","currentStatus","newProfile","eventCreateCustomer","sendIt","Customer","User","createCustomerRate","rate","tariffObject","h24","h48","h72","rates","run","create","tariff","eventCustomerUpdate","res","eventCreateWorker","Worker","eventUpdateWorker","getTop","openChangeCustomerEvent","customersList","$onDestroy","PolicyController","runit","config","workerRate","rateService","workerTypes","selfProfile","searchRate","chooserWorker","choosenRate","rent","readyToPatch","worker_type","$resource","URLS","rentResource","addon","get","save","update","createRate","rateObject","urgency","$promise","Boolean","toJSON","workerId","rateId","rate_id","RateController","getSelfCustomerRate","tariff_v2_id","selfRate","getSelfRate","setSend","controller_name","param","isNumber","getBank","mfo","privatSend","BANKS","getStatistic","ecgStatistic","sale","bonus","set","toString","h24_14","h24_59","h24_10","h48_14","h48_59","h48_10","h72_14","h72_59","h72_10","PaymentController","openPayment","getCustomerRates","getSelfWorkerRate","getCustomersRates","getWorkerSelfRate","makeArray","val","defineProperty","__proto__","makeDate","format","customerRate","prepareTarifToSend","arrayOfProperties","leasing_date_end","formatDate","leasing_date_start","omit","date","updateCustomerTariffEvent","saveRate","setType","form","$setDirty","patients","allPatients","getAllPatients","ngb_disabled","tz","_d","nbg","toArray","nbg_disabled","checkPatientIsExist","patientObject","deffered","vanillaPatient","toReturn","cloneDeep","equals","vanillaPatientToEqual","currentPatientData","wasChanged","first","second","third","fourth","fifth","createOrUpdatePatient","PatientsController","$timeout","patient_id","patient_filter","createOrUpdatePatientFromPatients","join","alerts","msg","pop","patientsData","toProcess","headerPrefix","headerSuffix","when","createOrUpdatePatientEvent","patchPatientEvent","toUpdateEcgPatientData","onUpdateEcgData","birthday","x","bd","Math","floor","now","getTime","$httpProvider","restrict","replace","nameData","displayData","show","link","directive","activeSupervisorsAsOperators","activeSupervisorsAsSupervisors","supervisors","activeSupervisors","activeReadyToWorkAsSupervisors","each","countReadyToWork","operators","activeOperators","activeReadyToWorkOperators","canBeOperators","concat","MainController","getUserNames","getDate","locale","keyword","utc","isInRole","getRole","isShow","property","dateobject","currentMonth","currentDay","todayText","princip","isSelected","getResponse","rolesList","LoginController","$window","$cookies","$state","$stateParams","submit","username","password","expire","setDate","put","expires","authenticated","go","errors","reset","setNewPassword","newPassword","localeCompare","newPasswordRepeat","resetToken","message","oldPassword","E","logout","_identity","_authenticated","remove","location","reload","openPasswordResque","openPasswordChange","language","pChange","evt","credentials","setOrUnsetCredentials","params","action","formateToSendData","ignoreErrors","setToken","getToken","checkTokenValid","Promise","identity","identification","LodashFactory","httpRequestInterceptor","responseError","window","getCuttedObject","object","fields","ignoreCase","caseShouldBeIgnored","JSON","stringify","pick","toLocaleLowerCase","getArrayFromString","str","idReg","test","trim","objectArray","resultArray","strArray","lenght","index","counter","strIndex","part","toLowerCase","includes","momentConfig","currentTimeZoneOffsetInHours","getTimezoneOffset","setDefault","dateFromBack","toDate","dateToBack","ZipService","zip","JSZip","createZip","files","file","_file","generateAsync","compression","compressionOptions","level","metadata","getEcgStatistic","allData","fileUpload","FileUploader","md5","setPercent","percent","determine","uploader","destroy","sortedFiles","arrayOfPromices","getHash","hash","binary","percentWatch","content","readyToProcess","fileset","hqMode","queueLimit","autoUpload","skipEmptyFiles","zipUploader","alias","formData","onAfterAddingFile","fileItem","onWhenAddingFileFailed","item","arrayIndex","substr","splice","getFileHash","blobData","fr","FileReader","onloadend","createHash","readAsDataURL","arrayOfHashedFiles","slice","onAfterAddingAll","addedFileItems","removeFromQueue","queue","File","mode","addToQueue","uploadAll","clearQueue","onProgressAll","progress","process","onCompleteItem","onErrorItem","dismissAll","onSuccessItem","updateData","$emit","ecgComments","getEcgComment","ecgId","EcgCommentsController","getEcgComments","comments","UrgentHours","ECG_PER_PAGE","getFullYear","getMonth","getDay","ecgSort","statisticData","dataCount","sortInStatuses","getEcgCount","observer","next","fromPromise","getAllEcg","getEcgInStatus","getUrgentEcg","getDangerEcg","getDangerUrgentEcg","take","resObs","totalCount","perPage","ecgVM","baseUrl","timestamp","dateFilter","searchFilter","getTodaysEcg","term","changeEcg","ecgID","changeEcgUserStatus","ecgStatusList","changeEcgStatus","ecgStatisticObject","fixDate","isUrgent","uploadDate","setHours","getHours","uploadEcg","FormData","append","Content-Type","transformRequest","EcgController","searchText","countEcgInStatus","getPaginated","vmGetPaginated","ecgPaginated","ecgPaginatedList","getInStatus","statusNumber","todays","change_modal","makeEcgUrgent","urgent_modal","r","urgent_markup","findIndex","changeEcgStatusOnly","ecgData","supervisor_id","ecgStatus","openAdminEcgList","statuses","removeFromArray","a","arr","parseInt","ecgInStatus","getEcgForAdminAndSupervisor","setInterval","updateEcgEvent","pushit","remarks","DateDay","abs","startFrom","input","start","searchMainEcg","reg","getFilteredEcg","spinner","elm","attrs","isLoading","pendingRequests","hide","navigateBlock","showSearch","patientData","on","children","li","bind","copy","removeClass","keyCode","eq","addClass","triggerHandler","textHeader","headerFlex","textHeaderSuffix","textHeaderPrefix","languageDetect","capsShow","ctrl","letter","capsRegexp","engRegexp","capsContainer","capsIndicator","after","testResult","container","html","bank","shortname","disableE","which","customScrollbar","mCustomScrollbar","axis","theme","css","max-height","innerHeight","pwCheck","require","firstPassword","add","$apply","$setValidity","$","apiService","api","self","ecgs","runBlock","routerConfig","$stateProvider","$urlRouterProvider","state","abstract","otherwise","loginRouterConfig","bodyClasses","mainRouterConfig","checkAllCredentials","$transitions","startPage","mainPage","onBefore","to","trans","error1","IndexController","onStart","constant","hostnameArray","hostname","reverse","host","startsWith","admin","accountant","viewPermitionList","employeeView","userView","translate","$translateProvider","useStaticFilesLoader","prefix","suffix","preferredLanguage","useSanitizeValueStrategy","material","$mdThemingProvider","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastDarkColors","contrastLightColors","primaryPalette","accentPalette","warnPalette","dark","mdDateConfig","$mdDateLocaleProvider","months","shortMonths","days","shortDays","firstDayOfWeek","parseDate","dateString","m","msgCalendar","msgOpenCalendar","kill401","interceptors","$templateCache"],"mappings":"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","file":"scripts/app-19fe4358f6.js","sourcesContent":["\n/**\n * Created by tree on 03.06.16.\n */\n'use strict';\n(function() {\n angular\n .module('modals',['ngAnimate','ui.bootstrap']);\n\n /** @ngInject */\n})();\n(function () {\n 'use strict';\n\n angular\n .module('modals')\n .factory('ModalService', ModalService);\n\n /** @ngInject */\n function ModalService() {\n var modals = {\n login: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/passwordRescue.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'sm'\n },\n changePassword: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/passwordChange.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'sm'\n // resolve: {\n // username: function() {\n // return username;\n // }\n // }\n },\n paymentStatistic: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/paymentStatistic.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'lg'\n },\n paymentStatisticCustomer: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/paymentStatisticCustomer.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'lg'\n },\n changeRecorderInfo: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/changeRecorderInfo.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'md'\n },\n changeCustomerInfo: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/changeCustomerInfo.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'true',\n size: 'lg'\n },\n changeCustomerInfoAdmin: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/changeCustomerInfo.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'true',\n size: 'lg'\n },\n changeWorkerInfo: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/changeWorkerInfo.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'true',\n size: 'lg'\n },\n openEcgUpload: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/openEcgUpload.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'md'\n },\n openPatientEdit: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/openPatientEdit.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'md'\n },\n createCustomer: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/createCustomer.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'lg'\n },\n openVerification: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/supervisorVerification.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'lg'\n },\n createWorker: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/createWorker.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'lg'\n },\n adminFullEcgList: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/adminFullEcgList.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'xl'\n },\n adminListCustomer: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/adminListCustomer.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'md'\n },\n confirm: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/confirm.html',\n controller: 'ConfirmModalController',\n controllerAs: 'confirmModal',\n bindToController: 'false',\n size: 'md'\n },\n listOfWorkers: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/listOfWorkers.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'md'\n },\n statistic: {\n templateUrl: 'app/helpers.ui.bootstrap/modals/tpl/paymentDetailsStatistic.html',\n controller: 'ModalController',\n controllerAs: 'modal',\n bindToController: 'false',\n size: 'xl'\n }\n };\n return {\n openModalWindow: openModalWindow\n };\n\n function openModalWindow(name, data) {\n var modal = modals[name];\n modal.backdrop = 'static';\n modal.keyboard = false;\n if (data) {\n modal.resolve = {\n modalData: function () {\n return data;\n }\n };\n }\n return modal;\n }\n }\n})();\n\n/*\n* Для вызова модального окна используйте ModalFactory.open(modalObj, data}\n* data.header - Сменит название окна\n* data.accept - Кнопки согласия\n* data.refuse - Кнопки отказа\n* */\n\n(function() {\n 'use strict';\n\n angular\n .module('modals')\n .factory('ModalFactory', ModalFactory);\n\n /** @ngInject */\n function ModalFactory($uibModal, _) {\n // Default button lables\n var defaultData = {\n header: \"Are you sure?\",\n accept: \"Yes\",\n acceptClass: 'btn-orange',\n refuse: \"No\",\n refuseClass: 'btn-danger'\n };\n return {\n open: function(modalName,data) {\n var resultObject = {}\n modalName.resolve = {\n confirmData: function () {\n var returnData = (angular.isDefined(data)) ? angular.extend(resultObject, defaultData, data) : defaultData;\n return returnData;\n }\n };\n\n return $uibModal.open(\n modalName\n );\n }\n };\n }\n})();\n\n(function() {\n \"use strict\";\n\n angular\n .module(\"modals\")\n .controller(\"ModalController\", ModalController)\n .filter(\"getPatients\", getPatients)\n .filter(\"getFilteredEcgInModal\", getFilteredEcgInModal);\n\n /** ngInject **/\n function ModalController(\n $log,\n $filter,\n $scope,\n ModalService,\n ModalFactory,\n $uibModal,\n $uibModalInstance,\n modalData,\n $rootScope,\n ecg\n ) {\n var vm = this;\n vm.close = close;\n vm.ecg = ecg;\n vm.open = open;\n vm.ok = ok;\n vm.makeEvent = makeEvent;\n vm.openNew = openNew;\n vm.data = modalData;\n vm.today = new Date();\n vm.minDate = new Date(\"1900-01-01\");\n var event = \"\";\n\n // ECG\n vm.filterAndCountECG = filterAndCountECG;\n\n // Function to broadcast events from modal\n\n function makeEvent(eventName, data) {\n var toSend = angular.isDefined(data) ? data : vm.obj;\n event = $rootScope.$broadcast(eventName, {\n modalData: toSend\n });\n }\n\n var openConfirm = $rootScope.$on(\"openConfirm\", function(event, data) {\n openNew(\"confirm\", data);\n });\n\n function open(modalname) {\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname));\n }\n\n function close() {\n $uibModalInstance.dismiss(false);\n }\n\n function ok() {\n $uibModalInstance.close(vm.data);\n }\n\n function openNew(modalName) {\n return (vm.new_modal = ModalFactory.open(\n ModalService.openModalWindow(modalName),\n {}\n ));\n }\n\n $scope.$on(\"$destroy\", event);\n $scope.$on(\"$destroy\", openConfirm);\n //Sharing Data to Controllers\n\n // ECG Full admin Modal manipulations\n function filterAndCountECG(filterParam, filterText, currentPage, pageSize) {\n vm.ecg.filteredEcg = $filter(\"getFilteredEcgInModal\")(\n vm.ecg.listOfEcg[filterParam],\n filterText\n );\n vm.ecg.filteredEcgLength = vm.ecg.filteredEcg.length;\n vm.ecg.total = ((currentPage+1)*pageSize > vm.ecg.filteredEcgLength) ? vm.ecg.filteredEcgLength : (currentPage+1) *pageSize;\n }\n }\n\n /** @ngInject */\n function getPatients(_) {\n return function(value, filtertext) {\n // Filter all object\n var regexp = new RegExp(filtertext, \"i\");\n var filtered = _.filter(value, function(o) {\n // Get Values and convert it to text. Search filtertext then\n var result =\n (o.name + \" \" + o.surname).search(regexp) &&\n (o.name + \" \" + o.surname).search(regexp);\n return result > -1;\n });\n return _.sortBy(filtered, [\"surname\", \"name\"]);\n };\n }\n\n /* Get Filtered ECG in Admin list of ecg*/\n /** @ngInject */\n function getFilteredEcgInModal(_) {\n return function(value, filtertext) {\n var filtered = [];\n if (filtertext !== undefined) {\n // Filter all object\n var filterArray = filtertext.split(/\\s+/);\n _.filter(value, function(o) {\n var result = 0;\n filterArray.forEach(function(elem) {\n var regexp = new RegExp(elem, \"i\");\n result =\n (o.patient.full_name.search(regexp) > -1 ||\n o.customer.company_name.search(regexp) > -1 ||\n o.customer.contact_person.search(regexp) > -1)\n ? result + 1\n : result - 100;\n if (result === filterArray.length) {\n filtered.push(o);\n }\n });\n });\n return filtered;\n } else {\n return value;\n }\n };\n }\n})();\n\n/**\n * Created by mdresvyankin on 08.11.16.\n */\n(function() {\n 'use strict';\n\n angular.module('modals').controller('ConfirmModalController', ConfirmModalController);\n\n /** ngInject **/\n function ConfirmModalController($uibModalInstance, confirmData) {\n var vm = this;\n vm.close = close;\n vm.ok = ok;\n // Передаем данные из резолв функции в фабрике ModalFactory\n vm.confirmData = confirmData;\n\n /* В случае, когда нам необходимо прервать выполнение цепочки - используем close\n * в противном случае используем ok с параметром, для разветвления цепочки */\n function close() {\n vm.confirmData.result = undefined;\n $uibModalInstance.dismiss(vm.confirmData);\n }\n\n function ok(result) {\n vm.confirmData.result = result;\n $uibModalInstance.close(vm.confirmData);\n }\n }\n})();\n\n(function () {\n 'use strict';\n angular.module('dropdowns', ['ngAnimate', 'ui.bootstrap']);\n angular.module('dropdowns')\n .controller('DropdownController', DropdownCtrl);\n\n /** @ngInject */\n function DropdownCtrl() {\n var vm = this;\n vm.status = {\n isopen: false\n };\n\n vm.toggled = function () {\n };\n\n vm.toggleDropdown = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n vm.status.isopen = !vm.status.isopen;\n };\n\n }\n})();\n(function () {\n 'use strict';\n angular.module('datepicker', ['ngAnimate', 'ui.bootstrap']);\n angular.module('datepicker')\n .controller('DatepickerController', DatepickerController);\n\n /** @ngInject */\n function DatepickerController() {\n var vm = this;\n vm.popup = {};\n vm.popup.opened = false;\n\n vm.options = {\n showWeeks: true\n };\n\n vm.dateOptions = {\n startingDay: 1\n };\n\n vm.open = function () {\n vm.popup.opened = true;\n };\n\n\n }\n})();\n/**\n * Created by mdresvyankin on 20.05.17.\n */\n(function () {\n \"use strict\";\n angular.module(\"modals\").component(\"adminFullList\", {\n templateUrl: [\n \"$element\",\n \"$attrs\",\n function ($element, $attrs) {\n return \"app/ecg/adminFullSearchList/adminFullList.html\";\n }\n ],\n controller: adminFullList,\n bindings: {\n ecgParam: '<'\n }\n });\n\n /** @ngInject */\n function adminFullList(ecg, ProfileService, moment, $scope, filterObjects) {\n var vm = this;\n vm.profile = ProfileService.profile;\n vm.dates = {\n 'all': moment.unix(0).unix(),\n 'year': moment().startOf('year').unix(),\n 'month': moment().startOf('month').unix()\n }\n\n // Period that will be called in get ECG function\n vm.period = (vm.ecgParam == 0) ? vm.dates.all : vm.dates[vm.ecgParam];\n\n vm.$onInit = function () {\n // Array of ecg\n vm.ecg = {};\n // Current page\n vm.page = 1;\n vm.filterText = ''\n setTimeout(vm.getEcg(vm.page), 0);\n }\n\n $scope.$watch(function (scope) {\n return scope.$ctrl.filterText\n }, function (newValue, oldValue) {\n if (angular.isDefined(newValue) && newValue.length === 0 && oldValue.length > 0) {\n vm.getEcg(vm.page);\n }\n });\n\n vm.getEcg = function (page) {\n var id = filterObjects.parceString(vm.filterText, 'id')\n if (id && vm.filterText.length > 3) {\n ecg.getEcgById(id).then(function(resp) {\n vm.ecg = [resp];\n }).catch(function(err) {\n vm.ecg = [];\n })\n } else {\n var searchString = (vm.filterText.length > 3) ? vm.filterText : \"\";\n ecg.getPaginatedEcgInfo().getEcgByDate(vm.page, vm.period, searchString).then(function (resp) {\n vm.ecg = resp.data.items;\n return resp;\n }).then(function (resp) {\n vm.pagination = resp.data._meta;\n vm.page = vm.pagination.currentPage;\n })\n }\n };\n\n vm.deleteEcg = function (id) {\n ecg.deleteEcg(id).then(function () {\n vm.getEcg(vm.page, '');\n }).catch(function (err) {\n console.log(err);\n });\n }\n }\n})();\n\n(function() {\n angular\n .module('khFrontend.statistic',[]);\n\n /** @ngInject */\n})();\n\n(function () {\n \"use strict\";\n angular.module(\"khFrontend.statistic\").component(\"paymentStatisticComponent\", {\n templateUrl: [\n \"$element\",\n \"$attrs\",\n function ($element, $attrs) {\n return \"app/statistic/\" + $attrs.uservalue + \"_statistic.html\";\n }\n ],\n controller: paymentStatisticComponent,\n bindings: {\n userid: '<',\n usertype: '<',\n uservalue: '<'\n }\n });\n\n /** @ngInject */\n function paymentStatisticComponent(_, PaymentStatisticService, ProfileService) {\n var vm = this;\n\n this.$postLink = function () {\n this.init();\n }\n\n this.init = function () {\n if (this.usertype !== 'customer' ) {\n PaymentStatisticService.getUserStatistic(vm.userid).then(\n function (resp) {\n if (vm.usertype === 'supervisor') {\n mapSupervisorStatistic(resp.data.data);\n } else {\n mapOperatorStatistic(resp.data.data);\n }\n }\n );\n } else {\n if(ProfileService.profile.role === 'admin' || ProfileService.profile.role === 'accountant' ) {\n PaymentStatisticService.getCustomerStatistic(vm.userid).then(function(response){\n mapCustomerStatistic(response.data.data);\n })\n } else {\n PaymentStatisticService.getSelfCustomerStatistic().then(function(resp){\n mapCustomerStatistic(resp.data.data)\n })\n }\n }\n };\n\n function mapOperatorStatistic(data) {\n vm.statistic = data;\n vm.stArray = [];\n _.forEach(vm.statistic, function (value, key) {\n var sum = {\n money: 0,\n number: 0\n };\n _.forEach(value, function (dval) {\n sum.money = sum.money + Number(dval.normal.sum) + Number(dval.urgent.sum);\n sum.number = sum.number + Number(dval.normal.number) + Number(dval.urgent.number);\n });\n vm.stArray.push({ month: key, statistic: value, outcomes: sum });\n });\n }\n\n function mapCustomerStatistic(data) {\n vm.statistic = data;\n vm.stArray = [];\n _.forEach(vm.statistic, function (value, key) {\n var sum = {\n money: 0,\n number: 0\n };\n var countedKeys = ['24', '48', '72'];\n _.forEach(countedKeys, function (dval) {\n sum.money = sum.money + Number(value[dval].normal.sum) + Number(value[dval].urgent.sum);\n sum.number = sum.number + Number(value[dval].normal.number) + Number(value[dval].urgent.number);\n });\n sum.money = sum.money + Number(value.lease_sum) + Number(value.rent_sum);\n vm.stArray.push({ month: key, statistic: value, outcomes: sum });\n });\n }\n\n function resultRow(operatorMonth, supervisorMonth) {\n var result = {};\n\n var data = {\n h24o: {\n count: Number(operatorMonth[24].normal.number),\n countU:Number( operatorMonth[24].urgent.number),\n sumEcg: Number(operatorMonth[24].normal.number) + Number(operatorMonth[24].urgent.number),\n sumMoney: Number(operatorMonth[24].normal.sum) + Number(operatorMonth[24].urgent.sum)\n },\n h24s: {\n count: Number(supervisorMonth[24].normal.number),\n countU: Number(supervisorMonth[24].urgent.number),\n sumEcg: Number(supervisorMonth[24].normal.number) + Number(supervisorMonth[24].urgent.number),\n sumMoney: Number(supervisorMonth[24].normal.sum) + Number(supervisorMonth[24].urgent.sum)\n },\n h48o: {\n count: Number(operatorMonth[48].normal.number),\n countU: Number(operatorMonth[48].urgent.number),\n sumEcg: Number(operatorMonth[48].normal.number) + Number(operatorMonth[48].urgent.number),\n sumMoney: Number(operatorMonth[48].normal.sum) + Number(operatorMonth[48].urgent.sum)\n },\n h48s: {\n count: Number(supervisorMonth[48].normal.number),\n countU: Number(supervisorMonth[48].urgent.number),\n sumEcg: Number(supervisorMonth[48].normal.number) + Number(supervisorMonth[48].urgent.number),\n sumMoney: Number(supervisorMonth[48].normal.sum) + Number(supervisorMonth[48].urgent.sum)\n },\n h72o: {\n count: Number(operatorMonth[72].normal.number),\n countU: Number(operatorMonth[72].urgent.number),\n sumEcg: Number(operatorMonth[72].normal.number) + Number(operatorMonth[72].urgent.number),\n sumMoney: Number(operatorMonth[72].normal.sum) + Number(operatorMonth[72].urgent.sum)\n },\n h72s: {\n count: Number(supervisorMonth[72].normal.number),\n countU: Number(supervisorMonth[72].urgent.number),\n sumEcg: Number(supervisorMonth[72].normal.number) + Number(supervisorMonth[72].urgent.number),\n sumMoney: Number(supervisorMonth[72].normal.sum) + Number(supervisorMonth[72].urgent.sum)\n }\n }\n\n function getSums(thisObj) {\n var totals = {\n totalO: thisObj.h24o.sumEcg + thisObj.h48o.sumEcg + thisObj.h72o.sumEcg,\n totalS: thisObj.h24s.sumEcg + thisObj.h48s.sumEcg + thisObj.h72s.sumEcg,\n totalMoneyO: thisObj.h24o.sumMoney + thisObj.h48o.sumMoney + thisObj.h72o.sumMoney,\n totalMoneyS: thisObj.h24s.sumMoney + thisObj.h48s.sumMoney + thisObj.h72s.sumMoney,\n }\n return totals;\n }\n\n Object.assign(result, data);\n result['totals'] = getSums(data);\n return result;\n }\n\n function mapSupervisorStatistic(data) {\n vm.statistic = data;\n var roles = Object.keys(vm.statistic);\n vm.monthList = Object.keys(vm.statistic[roles[0]]);\n vm.reformatedStatistic = {};\n for (var i = 0; i < vm.monthList.length; i++) {\n vm.reformatedStatistic[vm.monthList[i]] = resultRow(vm.statistic.operator[vm.monthList[i]], vm.statistic.supervisor[vm.monthList[i]])\n }\n }\n }\n})();\n\n(function () {\n \"use strict\";\n angular.module(\"khFrontend.statistic\").component(\"paymentStatisticLineComponent\", {\n template: '

{{\"Full statistic\" | translate}}

',\n controller: paymentStatisticLineComponent,\n bindings: {\n userid: '<',\n usertype: '<'\n }\n });\n\n /** @ngInject */\n function paymentStatisticLineComponent($uibModal, ModalService) {\n var vm = this;\n vm.openStatisticModal = function () {\n vm.modal = $uibModal.open(ModalService.openModalWindow('statistic', {'userid': vm.userid, 'usertype': vm.usertype}));\n }\n }\n})();\n\n(function() {\n \"use strict\";\n angular.module(\"khFrontend.statistic\").component(\"paymentStatisticIcon\", {\n template: '',\n controller: paymentStatisticIcon,\n bindings: {\n userid: '<',\n usertype: '<'\n }\n });\n\n /** @ngInject */\n function paymentStatisticIcon($uibModal, ModalService) {\n var vm = this;\n vm.openStatisticModal = function() {\n vm.modal = $uibModal.open(ModalService.openModalWindow('statistic', {userid: vm.userid, usertype: vm.usertype}));\n }\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.statistic')\n .service('PaymentStatisticService', PaymentStatisticService);\n\n /** @ngInject */\n\n //Get Promise for Login\n function PaymentStatisticService($q, _, $http, APIHOST, authorization, moment) {\n var vm = this;\n var token = authorization.token;\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n vm.getUserStatistic = function(id) {\n toSend.url = APIHOST + '/v1/user/'+id+'/statistics?dateFrom='+(moment().year()-1)+'-12-1&dateTo='+moment().year()+'-'+(moment().month()+1)+'-31';\n toSend.method = 'GET';\n return $http(toSend)\n };\n\n vm.getCustomerStatistic = function(id) {\n toSend.url = APIHOST+ '/v2/customers/'+id+'/payments/statistics';\n toSend.method = 'GET';\n return $http(toSend);\n }\n\n vm.getSelfCustomerStatistic = function() {\n toSend.url = APIHOST + '/v2/customers/self/payments/statistics';\n toSend.method = 'GET';\n return $http(toSend)\n }\n\n vm.getSelfMonthStatistic = function(monthData) {\n var resultStatistic = {\n total: 0,\n price: 0\n }\n var stat = monthData;\n var hours = [24, 48, 72];\n for (var key = 0; key < hours.length; key++) {\n var element = stat[hours[key]];\n for (var ykey in element) {\n if (element.hasOwnProperty(ykey)) {\n element[ykey].number = Number(element[ykey].number);\n element[ykey].sum = Number(element[ykey].sum);\n resultStatistic.total = resultStatistic.total + Number(element[ykey].number);\n resultStatistic.price = resultStatistic.price + Number(element[ykey].sum);\n }\n }\n }\n monthData.total = resultStatistic.total;\n monthData.price = resultStatistic.price;\n return monthData;\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 31.07.16.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.recorder',['ngAnimate', 'ngCookies', 'ngMessages']);\n\n /** @ngInject */\n\n})();\n(function() {\n 'use strict';\n\n angular.module('khFrontend.recorder').service('RecorderService', RecorderService);\n\n /** @ngInject */\n\n //Get Promise for Login\n function RecorderService($http, APIHOST, authorization, ProfileService) {\n var vm = this;\n var recorderId = {};\n this.recorder = {};\n var token = authorization.token;\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n Authorization: 'Bearer ' + token\n }\n };\n\n /* Get Info about recorder by ID of recorder */\n this.getRecorder = function(id) {\n recorderId = id;\n toSend.method = 'GET';\n toSend.url = APIHOST + '/v1/customer-recorders/' + id + '?expand=recorderInfo';\n return $http(toSend);\n };\n\n /* Get recorder info by Customer ID */\n this.getRecorderByCustomerID = function(customerID) {\n toSend.method = 'GET';\n toSend.url = APIHOST + '/v1/customer-recorders?expand=recorderInfo&RecorderSearch[customer_id]=' + customerID;\n return $http(toSend);\n };\n\n /* Get Full list of customers recorders */\n this.getFullRecordersList = function() {\n toSend.method = 'GET';\n toSend.url = APIHOST + '/v1/customer-recorders?expand=recorderInfo';\n return $http(toSend).then(function(response) {\n return response;\n });\n };\n\n /* Update info about customer recorder */\n this.setRecorder = function(data) {\n toSend.method = 'PATCH';\n toSend.url = APIHOST + '/v1/customer-recorders/' + data.id;\n toSend.data = data;\n return $http(toSend);\n };\n\n /* Add info about customer recorder */\n this.createRecorder = function(data) {\n if (angular.isDefined(ProfileService.profile.customer) && ProfileService.profile.customer.id > 0) {\n data.customer_id = ProfileService.profile.customer.id;\n toSend.method = 'POST';\n toSend.url = APIHOST + '/v1/customer-recorders';\n toSend.data = data;\n return $http(toSend);\n }\n return;\n };\n\n /* Get all aviable recorder types */\n this.getAllRecorders = function() {\n toSend.method = 'GET';\n toSend.url = APIHOST + '/v1/recorders';\n return $http(toSend);\n };\n\n /* Get all aviable cable types */\n vm.getCableTypesFromApi = function() {\n (toSend.method = 'GET'), (toSend.url = APIHOST + '/v1/cables');\n return $http(toSend);\n };\n\n this.getCableTypes = function() {\n return vm.getCableTypesFromApi().then(function(response) {\n return response.data.items;\n });\n };\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.recorder')\n .controller('RecorderController', RecorderController);\n\n /** @ngInject */\n function RecorderController(RecorderService, ProfileService, $rootScope, $uibModal, ModalService, _) {\n var vm = this;\n vm.recorderInfo = recorderInfo;\n //Модаль для изменения данных рекордера\n vm.openRecorderChange = openRecorderChange;\n vm.recorderList = recorderList;\n vm.cableTypes = getCableTypes();\n vm.recorderTest = recorderTest;\n\n function recorderInfo(id) {\n if (id) {\n RecorderService.getRecorder(id).then(\n function (response) {\n vm.recorder = response.data;\n RecorderService.recorder = vm.recorder;\n })\n } else {\n vm.recorder = undefined;\n }\n return vm.recorder;\n }\n\n function recorderTest(c_id) {\n RecorderService.getFullRecordersList().then(function (response) {\n vm.recorder = _.filter(response.data.items, {\n customer_id: c_id\n })[0];\n });\n }\n\n function recorderList() {\n RecorderService.getAllRecorders().then(\n function (response) {\n return response.data.items;\n })\n }\n\n function getCableTypes() {\n return RecorderService.getCableTypes();\n }\n\n function openRecorderChange(modalname, c_id) {\n var customer_id = (c_id) ? c_id : ProfileService.profile.customer.id;\n RecorderService.getAllRecorders().then(\n function (response) {\n vm.recorders = response.data.items;\n var modal_data = {\n recorder: vm.recorder,\n recorders: vm.recorders,\n cables: vm.cableTypes\n };\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, modal_data));\n vm.modal.result.then(function (response) {\n var data = {\n recorder_id: response.recorder.recorder_id,\n sn: response.recorder.sn,\n cable_type: response.recorder.cable_type\n };\n if (angular.isDefined(vm.recorder)) {\n data.id = vm.recorder.id;\n data.customer_id = vm.recorder.customer_id;\n RecorderService.setRecorder(data).then(function (response) {\n vm.recorderInfo(response.data.id);\n });\n } else {\n data.customer_id = customer_id;\n RecorderService.createRecorder(data).then(function (response) {});\n }\n\n //TODO: make reset form\n // reset();\n })\n });\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 18.06.17.\n */\nangular\n .module('khFrontend.recorder')\n .component('recorderButtonShowComponent', {\n controller: recorderShow,\n templateUrl: ['$element', '$attrs', function ($element, $attrs) {\n return 'app/recorder/recorder' + $attrs.rbtpl + '.html'\n }]\n });\n\n/** @ngInject */\n\nfunction recorderShow(RecorderService, ProfileService, $log, $rootScope, _, $uibModal, ModalService) {\n var vm = this;\n vm.recorderShow = recorderShow;\n vm.recorderInfo = recorderInfo;\n vm.openRecorderChange = openRecorderChange;\n\n vm.$onInit = function () {\n vm.recorderShow();\n }\n\n\n /* Get Customer ID to get and set recorder info */\n function getCustomer() {\n return ProfileService.getProfile().then(function (response) {\n return response.data.data.customer.id;\n })\n }\n\n /* Get recorder Info */\n function recorderInfo(id) {\n if (id) {\n RecorderService.getRecorder(id).then(\n function (response) {\n vm.recorder = response.data;\n RecorderService.recorder = vm.recorder;\n })\n } else {\n vm.recorder = undefined;\n }\n return vm.recorder;\n }\n\n function recorderShow() {\n getCustomer().then(function (response) {\n RecorderService.getRecorderByCustomerID(response).then(function (recorderResponse) {\n vm.recorder = recorderResponse.data.items[0];\n RecorderService.recorder = vm.recorder;\n vm.showRecorder = angular.isUndefined(vm.recorder);\n $rootScope.showUpload = !vm.showRecorder;\n });\n });\n }\n\n function openRecorderChange(modalname) {\n RecorderService.getCableTypesFromApi().then(function (cables) {\n vm.cableTypes = cables.data.items;\n RecorderService.getAllRecorders().then(\n function (response) {\n vm.recorders = response.data.items;\n var modal_data = {\n recorder: vm.recorder,\n recorders: vm.recorders,\n cables: vm.cableTypes\n };\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, modal_data));\n vm.modal.result.then(function (response) {\n var data = {\n recorder_id: response.recorder.recorder_id,\n cable_id: response.recorder.cable_id,\n sn: response.recorder.sn,\n cable_type: _.find(response.cables, {\n id: response.recorder.cable_id\n }).name,\n customer_id: vm.customerId\n };\n if (angular.isDefined(vm.recorder)) {\n data.id = vm.recorder.id;\n RecorderService.setRecorder(data).then(function (response) {\n vm.recorderInfo(response.data.id);\n });\n } else {\n RecorderService.createRecorder(data).then(function () {\n $rootScope.showUpload = !$rootScope.showUpload;\n vm.showRecorder = !vm.showRecorder;\n recorderShow();\n });\n }\n })\n });\n })\n }\n}\n\n/**\n * Created by mdresvyankin on 31.07.16.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile',['cb.x2js']);\n\n /** @ngInject */\n\n})();\n/**\n * Created by mdresvyankin on 15.07.17.\n */\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .component('workerList', {\n controller: workerList,\n templateUrl: ['$element', '$attrs', function ($element, $attrs) {\n var tpl = ($attrs.tpl) ? 'app/profile/workerList' + $attrs.tpl + '.html' : 'app/profile/workerList.html';\n return tpl;\n }],\n bindings: {\n filterObject: '=filterObject',\n buttonText: '=buttonText'\n }\n });\n\n /** @ngInject */\n function workerList(WorkerService, filterObjects, ProfileService, ModalService, ModalFactory, $filter, $uibModal, rx, $rootScope, $scope, $uibModalStack) {\n var vm = this;\n vm.countActive = {};\n var getFullWorkerList = function () {\n WorkerService.getFullWorkerList().then(function () {\n vm.workerList = WorkerService[vm.filterObject.role];\n vm.listToDisplay = vm.workerList;\n vm.countActive = WorkerService.countActive;\n vm.disableButton = ['admin', 'accountant'].indexOf(ProfileService.profile.role) === -1;\n })\n };\n\n this.$onInit = function () {\n getFullWorkerList();\n };\n\n this.$postLink = function () {\n vm.searchElem = angular.element('#searchString');\n vm.obs$ = rx.Observable.fromEvent(vm.searchElem, 'input')\n .map(function (e) { return e.target.value })\n .do(function (text) {\n if (text.length < 2) {\n vm.listToDisplay = vm.workerList;\n } else {\n vm.listToDisplay = filterObjects.filterByString(vm.workerList, text, ['name', 'surname', 'patronymic']);\n }\n $scope.$digest();\n })\n .debounce(function () { return rx.Observable.timer(200) });\n vm.subsciption$ = vm.obs$.subscribe(\n function (v) { },\n function (e) { console.log(e) },\n function () { console.log('complete') }\n );\n }\n\n // Public Functions\n\n vm.openChangeWorkerInfo = function (modalname, id) {\n // Готовим данные к отправке. Выдаем промис, для фиксации момента открытия модалки\n id = (angular.isDefined(id)) ? id : vm.profile.id;\n // Передаем воркера как параметр в модалку после того, как закончились все предыдущие запросы\n WorkerService.prepareData(id).then(function (response) {\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, response));\n vm.modal.result.then(function () {\n $rootScope.$broadcast('UpdateEcgData', true);\n });\n });\n };\n\n vm.openModal = function () {\n if (vm.disableButton) return;\n vm.modal = $uibModal.open(ModalService.openModalWindow('listOfWorkers', vm.filterObject));\n };\n\n vm.setActivity = function (user, status) {\n ProfileService.updateUserStatus(user, status).then(function (response) {\n $filter('filter')(vm.workerList, { id: user })[0].status = response;\n WorkerService.getFullWorkerList(function () {\n vm.countActive = WorkerService.countActive;\n });\n });\n }\n\n vm.openConfirmModal = function (worker, status) {\n vm.confirmModal = ModalFactory.open(ModalService.openModalWindow('confirm'), {\n header: 'Ви впевнені що хочете видалити ' + worker.name + ' ' + worker.surname,\n body: '',\n accept: 'OK',\n refuse: 'Cancel',\n refuseClass: 'btn-orange',\n acceptClass: ''\n });\n\n vm.confirmModal.result.then(function (data) {\n if (data.result) {\n vm.setActivity(worker.id, status)\n }\n vm.confirmModal.close();\n });\n }\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .service('WorkerService', WorkerService);\n\n /** @ngInject */\n\n //Get Promise for Login\n function WorkerService($q, _, $http, APIHOST, GENDERS, datePrepare, authorization, $log, $filter) {\n var vm = this;\n vm.countActive = {};\n var token = authorization.token;\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n this.getFullWorkerList= function() {\n toSend.url = APIHOST + '/v1/users?expand=workers';\n toSend.method = 'GET';\n return $http(toSend).then(function (response) {\n vm.supervisor = $filter('filter')(response.data.items, {role:'supervisor'});\n vm.operator = $filter('filter')(response.data.items, {role:'operator'});\n vm.countActive.supervisor = $filter('filter')(vm.supervisor, {status:{id:1}}).length;\n vm.countActive.operator = $filter('filter')(vm.operator, {status:{id:1}}).length;\n })\n };\n\n function patchWorker(id, status) {\n toSend.url = APIHOST + '/v1/workers/' + id;\n toSend.method = 'PATCH';\n toSend.data = {'ready_to_work': status};\n return $http(toSend).then(function (response) {\n return response;\n })\n }\n\n\n function getUserInfo(id) {\n toSend.url = APIHOST + '/v1/users/' + id + '?expand=customers,workers';\n toSend.method = 'GET';\n return $http(toSend).then(function (response) {\n return response.data;\n }, function (error) {\n return error;\n });\n }\n\n this.prepareData = function (id) {\n return getUserInfo(id).then(function (response) {\n // Переносим в объект воркера занчения корневого объекта\n vm.worker = response;\n vm.worker.genders = GENDERS;\n vm.worker.dob = datePrepare.getDateFromBack(vm.worker.dob);\n vm.worker.document_date = datePrepare.getDateFromBack(vm.worker.document_date);\n return vm.worker;\n });\n };\n\n this.getUserInfo = getUserInfo;\n\n /*Patch all worker Data*/\n this.patchWorkerData = function(userId, dataObject) {\n toSend.url = APIHOST + '/v1/workers/' + userId;\n toSend.method = 'PATCH';\n toSend.data = dataObject;\n return $http(toSend).then(function (response) {\n return response.data;\n }, function (error) {\n return error;\n });\n };\n\n this.changeStatus = function (roleList, statusList) {\n var defer = $q.defer();\n var responses = {};\n var keys = _.keys(roleList);\n var roleLength = _.keys(roleList).length;\n var statusLength = _.keys(statusList).length;\n /* If arrays not in the same length break */\n if (statusLength != roleLength) {\n defer.reject();\n }\n /* If supervisor status equal to 0 set operator status the same */\n if (roleLength == 2 && statusList.Supervisor == 0) {\n angular.forEach(keys, function(obj) {\n statusList.obj = 0;\n });\n }\n //Patch all and return promise\n angular.forEach(keys, function (obj) {\n patchWorker(roleList[obj], statusList[obj]).then(function (response) {\n responses[obj] = response;\n })\n });\n defer.resolve(responses);\n return defer.promise;\n }\n }\n})();\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .controller('WorkerController', WorkerController);\n\n /** @ngInject */\n function WorkerController(WorkerService, ProfileService) {\n var vm = this;\n\n // Public Functions\n vm.getUserInfo = getUserInfo;\n vm.setUserStatus = setUserStatus;\n //Public Variables\n //List of statuses\n vm.statusList = {};\n //List of Role Id\n vm.roleList={};\n vm.userId=\"\";\n\n function getUserInfo(){\n vm.statusList={};\n ProfileService.getProfile().then(function (response) {\n vm.userId = response.data.data.id;\n ProfileService.getUserInfoNew(vm.userId).then(function(response) {\n var workers = response.data.workers;\n angular.forEach(workers, function (obj) {\n vm.statusList[obj.type.name]=obj.ready_to_work;\n vm.roleList[obj.type.name]=obj.id;\n });\n })\n });\n }\n\n function setUserStatus(userRole) {\n var sendRoleToPatch = {};\n var sendStatusToPatch = {};\n if (angular.isUndefined(userRole)) {\n userRole = \"Operator\"\n }\n sendRoleToPatch[userRole] = vm.roleList[userRole];\n sendStatusToPatch[userRole] = vm.statusList[userRole];\n WorkerService.changeStatus(sendRoleToPatch,sendStatusToPatch).then(function(response) {\n })\n }\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .controller('profileModalHelp', profileModalHelp);\n\n /** @ngInject */\n function profileModalHelp(ProfileService, LoginService) {\n var vm = this;\n\n // Public Functions\n vm.getCurrentUser = getCurrentUser();\n vm.resetPassword = resetPassword;\n vm.getUserInfo = getUserInfo;\n vm.deleteCustomer = deleteCustomer;\n vm.getUserStatus = getUserStatus;\n vm.updateUserStatus = updateUserStatus;\n\n //Public Variables\n vm.profile = {};\n vm.role = {};\n vm.userInfo = {};\n\n function resetPassword(email) {\n var data = {\n email: email\n };\n LoginService.getResetToken(data)\n }\n\n function getCurrentUser() {\n ProfileService.getProfile().then(function (response) {\n // Get profile data\n vm.profile = response.data.data;\n // Get user role fore views formation\n vm.role = vm.profile.role;\n });\n }\n\n function deleteCustomer(id) {\n ProfileService.deleteCustomer(id);\n }\n\n function getUserStatus(id) {\n return ProfileService.getUserStatus(id);\n }\n\n function getUserInfo(id) {\n return ProfileService.getUserInfoNew(id).then(function(response) {\n return response.data;\n });\n }\n\n function updateUserStatus(user,status) {\n ProfileService.updateUserStatus(user,status);\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 13.02.17.\n */\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .service('ProfileActivityService', ProfileActivityService);\n\n /** @ngInject */\n\n //Get Promise for Login\n function ProfileActivityService($q, $http, APIHOST, authorization, $log) {\n var token = authorization.token;\n\n this.getActivity = function (type) {\n if (angular.isDefined(type)) {\n var toSend = {\n method: 'GET',\n url: APIHOST + \"/v1/users/activity/\" + type+\"s\",\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n return $http(toSend).then(function (response) {\n return response.data.data;\n }, function (error) {})\n }\n };\n }\n})();\n\n/**\n * Created by mdresvyankin on 13.02.17.\n */\nangular\n .module('khFrontend.profile')\n .controller('ProfileActivityController', ProfileActivityController);\n\n/** @ngInject */\n\nfunction ProfileActivityController(ProfileActivityService,$log) {\n var vm = this;\n vm.getActivity = getActivity;\n vm.activity = {};\n\n function getActivity(role) {\n ProfileActivityService.getActivity(role).then(function (response) {\n vm.activity[role] = response;\n });\n }\n}\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .service('ProfileService', ProfileService);\n\n /** @ngInject */\n\n //Get Promise for Login\n function ProfileService($q, $http, authorization, APIHOST, $log) {\n var token = authorization.token;\n var profile = this;\n\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n // Получить инфо про пользователeй\n var getUserInfo = function (user_id) {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v1/users/\" + user_id + \"?expand=customer,workers\";\n return $http(toSend);\n };\n\n var getUserInfoNew = function (user_id) {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v1/users/\" + user_id + \"?expand=customer,workers\";\n return $http(toSend).then(function (response) {\n return response\n });\n };\n\n var getCustomerInfoNew = function (user_id) {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v2/customers/\" + user_id + \"?expand=user,tariff\";\n return $http(toSend).then(function (response) {\n return response\n });\n };\n\n var getProfile = function () {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v1/profile\";\n return $http(toSend);\n };\n\n var updateUserInfo = function (data) {\n toSend.method = 'PATCH';\n toSend.url = APIHOST + \"/v1/users/\" + data.id;\n if (data.id) delete data.id;\n toSend.data = data;\n return $http(toSend);\n };\n\n this.getUserInfo = getUserInfo;\n this.getUserInfoNew = getUserInfoNew;\n this.getCustomerInfoNew = getCustomerInfoNew;\n this.getProfile = getProfile;\n this.updateUserInfo = updateUserInfo;\n\n\n this.userProfile = function () {\n return getProfile().then(function (response) {\n profile.profile = response.data.data;\n return profile.profile;\n })\n };\n\n\n // получить полную инфу про кастомера по его id\n this.getFullCusromerInfo = function (id) {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v2/customers/\" + id;\n return $http(toSend).then(function (response) {\n var customerInfo = response.data;\n return getUserInfo(customerInfo.user_id).then(function (response) {\n return angular.extend(response.data, customerInfo);\n },\n function () {\n $log.error(\"Error to get info from\" + toSend.url)\n });\n },\n function () {\n $log.error(\"Error to get info from\" + toSend.url)\n })\n };\n\n\n this.createCustomer = function (data) {\n toSend.method = 'POST';\n toSend.url = APIHOST + \"/v2/customers\";\n toSend.data = data;\n return $http(toSend);\n };\n\n this.createWorker = function (data) {\n toSend.method = 'POST';\n toSend.url = APIHOST + \"/v1/profile/worker\";\n toSend.data = data;\n return $http(toSend);\n };\n\n this.updateCustomer = function (data) {\n delete data.type;\n toSend.method = 'PATCH';\n toSend.url = APIHOST + \"/v2/customers/\" + data.id;\n toSend.data = data;\n return $http(toSend);\n };\n\n this.updateWorker = function (data) {\n toSend.method = 'PATCH';\n toSend.url = APIHOST + \"/v1/workers/\" + data.workers[0].id;\n toSend.data = data;\n return $http(toSend);\n };\n\n // Get User Status (disabled, enabled) by Id\n this.getUserStatus = function (id) {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v1/users/\" + id;\n return $http(toSend);\n };\n\n this.deleteCustomer = function (id) {\n toSend.method = 'DELETE';\n toSend.url = APIHOST + \"/v2/customers/\" + id;\n toSend.data = {id: id};\n return $http(toSend);\n };\n\n this.updateUserStatus = function(user, status) {\n // Set object property value to userId if user param is object\n var userId = angular.isObject(user) ? user.user.id : user;\n // Check if status param exist\n var statusParam = (status) ? status : undefined;\n // Возвращаем обещание в событие\n return getUserInfo(userId).then(function (response) {\n var status = (response.data.status.id == 1) ? 2 : 1;\n var statusToSend = (angular.isDefined(statusParam)) ? statusParam : status;\n var data = {\n id: userId,\n status: statusToSend\n };\n return updateUserInfo(data).then(\n function (response) {\n return response.data.status;\n },\n function (error) {\n return error\n }\n )\n });\n }\n\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .controller('ProfileController', ProfileController);\n\n /** @ngInject */\n function ProfileController($q, $scope, $rootScope, ProfileService, mainService, paymentService, $uibModal, ModalService,\n GENDERS, ROLES, datePrepare, WorkerService, $uibModalStack, _) {\n var vm = this;\n\n // Public Functions\n vm.getCurrentUser = getCurrentUser();\n // vm.getCurrentStatus = getCurrentStatus();\n vm.openChangeCustomerInfo = openChangeCustomerInfo;\n vm.openChangeWorkerInfo = openChangeWorkerInfo;\n vm.openCreateCustomer = openCreateCustomer;\n vm.openCreateWorker = openCreateWorker;\n vm.openAdminListCustomer = openAdminListCustomer;\n // vm.setStatus = setStatus;\n\n //Public Variables\n vm.currentStatus = {};\n vm.profile = {};\n vm.role = {};\n vm.customers = {}; // List Of customers\n vm.newProfile = ProfileService.userProfile();\n\n\n function getCurrentUser() {\n ProfileService.getProfile().then(function (response) {\n // Get profile data\n vm.profile = response.data.data;\n // Get user role fore views formation\n vm.role = vm.profile.role;\n });\n }\n\n function getCustomers() {\n return mainService.getCustomers().then(function (response) {\n return response.data.items;\n });\n }\n\n function updateCustomerUser(data) {\n\n var toUpdate = {};\n toUpdate.phone = data.modalData.phone;\n toUpdate.email = data.modalData.email;\n toUpdate.id = data.modalData.user_id;\n toUpdate.status = data.modalData.status.id;\n toUpdate.dongle_access_token = data.modalData.dongle_access_token;\n // Возвращаем обещание в событие\n return ProfileService.updateUserInfo(toUpdate).then(\n function (response) {\n return response\n },\n function (error) {\n return error\n }\n )\n }\n\n function getUsers() {\n return mainService.getUsers().then(function (response) {\n return response;\n });\n }\n\n function getUserStatus(id) {\n return ProfileService.getUserStatus(id);\n // return status;\n }\n\n function updateWorkerUser(data) {\n var toUpdate = {};\n toUpdate = angular.merge({}, data.modalData);\n toUpdate.id = data.modalData.id;\n toUpdate.gender = data.modalData.gender.id;\n // Возвращаем обещание в событие\n return ProfileService.updateUserInfo(toUpdate).then(\n function (response) {\n return response\n },\n function (error) {\n return error\n }\n )\n }\n\n\n // Begin customer Block\n var eventCreateCustomer = $scope.$on('createCustomer', function (event, data) {\n var sendIt = {};\n data.modalData.Customer.type = data.modalData.Customer.type.id;\n sendIt['Customer'] = data.modalData.Customer;\n sendIt['User'] = data.modalData.User;\n // Create Form\n createCustomerRate().then(function(rate) {\n sendIt['Customer'].tariff_id = rate.data.id;\n createCustomer(sendIt).then(function (result) {\n //Customer Type fix\n vm.createCustomer.Customer.type = result.data.data.customer.type;\n vm.modal.close();\n },\n function () { });\n })\n });\n\n var createCustomerRate = function () {\n var tariffObject = {\n h24: 10,\n h48: 10,\n h72: 10,\n type: 2\n }\n return paymentService.rates.run(paymentService.rates.create.tariff(tariffObject))\n };\n\n var eventCustomerUpdate = $rootScope.$on('updateCustomer', function (event, data) {\n // Параллельно выполняем две функции - потом обрабатываем результат промисов\n // и подставляем суммарные значения в модаль\n data.modalData.document_date = datePrepare.setDateToBack(data.modalData.document_date);\n $q.all([updateCustomerUser(data), updateCustomer(data)]).then(function (res) {\n if (vm.role === \"customer\") {\n $rootScope.$broadcast('mainReInit');\n } else {\n $rootScope.$broadcast('UpdateEcgData', true);\n }\n vm.modal.close();\n });\n });\n\n function openCreateCustomer(modalname) {\n vm.createCustomer = {};\n vm.createCustomer.genders = GENDERS;\n vm.createCustomer.subtype = ROLES.customerType;\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, vm.createCustomer));\n }\n\n function createCustomer(data) {\n return ProfileService.createCustomer(data).then(\n function (response) {\n return response;\n }\n )\n }\n\n function updateCustomer(data, options) {\n if (angular.isUndefined(options)) {\n delete data.modalData.tariff_id\n }\n var toUpdate = data.modalData;\n toUpdate.ext_type = _.find(toUpdate.subtype, function (value) {\n return value.name === toUpdate.type.subtype;\n });\n toUpdate.dry_fop_date = datePrepare.setDateToBack(toUpdate.dry_fop_date);\n // Удаляем рекурсивный объект.\n delete toUpdate.customer;\n // Возвращаем обещание в событие\n return ProfileService.updateCustomer(toUpdate).then(\n function (response) {\n return response\n },\n function (error) {\n return error\n }\n )\n }\n\n function openChangeCustomerInfo(modalname, customer_id) {\n // if (data==undefined) data = false;\n // customer_id = customer_id || (data.id = (data) ? data.id : {});\n\n // Готовим данные к отправке. Выдаем промис, для фиксации момента открытия модалки\n var prepareData = function () {\n var deferred = $q.defer();\n if (!customer_id) {\n ProfileService.getProfile().then(function (response) {\n //Переприсваиваем айдишник кастомера свойству id, для нормального сабмита формы\n response.data.data.id = response.data.data.customer.id;\n // Переносим в объект кастомера занчения корневого объекта\n vm.customer = angular.extend(response.data.data.customer, response.data.data);\n vm.customer.ext_type = vm.customer.type.id;\n vm.customer.genders = GENDERS;\n vm.customer.document_date = datePrepare.getDateFromBack(response.data.data.customer.document_date);\n vm.customer.dry_fop_date = datePrepare.getDateFromBack(response.data.data.dry_fop_date);\n deferred.resolve(vm.customer);\n });\n } else {\n ProfileService.getFullCusromerInfo(customer_id).then(function (response) {\n vm.customer = response;\n vm.customer.document_date = (angular.isDefined(vm.customer.document_date)) ? datePrepare.getDateFromBack(vm.customer.document_date) : null;\n vm.customer.dry_fop_date = (angular.isDefined(vm.customer.dry_fop_date)) ? datePrepare.getDateFromBack(vm.customer.dry_fop_date) : null;\n deferred.resolve(vm.customer);\n });\n }\n return deferred.promise;\n };\n\n // Передаем кастомера как параметр в модалку после того, как закончились все предыдущие запросы\n prepareData(customer_id).then(function () {\n vm.customer.callerRole = vm.profile.role;\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, vm.customer));\n vm.modal.result.then(function () {\n });\n });\n\n }\n\n function deleteCustomer(id) {\n ProfileService.deleteCustomer(id);\n }\n\n function openAdminListCustomer(modalname) {\n $q.all([getCustomers(), getUsers()]).then(function (response) {\n var resp = response[0];\n var resp1 = response[1];\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, {\n customers: resp,\n users: resp1,\n functions: {\n delete: deleteCustomer,\n getStatus: getUserStatus\n }\n }));\n });\n }\n\n // End Customer Block\n\n // Begin worker Block\n var eventCreateWorker = $scope.$on('createWorker', function (event, data) {\n var sendIt = {};\n // data.modalData.Worker.type = data.modalData.Worker.type.id;\n sendIt['Worker'] = data.modalData.Worker;\n data.modalData.User.dob = datePrepare.setDateToBack(data.modalData.User.dob);\n data.modalData.User.document_date = datePrepare.setDateToBack(data.modalData.User.document_date);\n sendIt['User'] = data.modalData.User;\n createWorker(sendIt).then(function () {\n vm.modal.close();\n },\n function () { });\n });\n var eventUpdateWorker = $rootScope.$on('updateWorker', function (event, data) {\n // Параллельно выполняем две функции - потом обрабатываем результат промисов\n // и подставляем суммарные значения в модаль\n data.modalData.dob = datePrepare.setDateToBack(data.modalData.dob);\n data.modalData.document_date = datePrepare.setDateToBack(data.modalData.document_date);\n updateWorkerUser(data).then(function () {\n $uibModalStack.getTop().key.close();\n getCurrentUser();\n $rootScope.$broadcast('mainReInit');\n });\n });\n\n function openCreateWorker(modalname) {\n vm.createWorker = {};\n vm.createWorker.genders = GENDERS;\n vm.createWorker.type = ROLES.workerType;\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, vm.createWorker));\n // vm.modal.result.then(function (response) {\n // });\n }\n\n function openChangeWorkerInfo(modalname, id) {\n // Готовим данные к отправке. Выдаем промис, для фиксации момента открытия модалки\n id = (angular.isDefined(id)) ? id : vm.profile.id;\n // Передаем воркера как параметр в модалку после того, как закончились все предыдущие запросы\n WorkerService.prepareData(id).then(function (response) {\n vm.worker = response;\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, vm.worker));\n vm.modal.result.then(function () {\n $rootScope.$broadcast('UpdateEcgData', true);\n });\n });\n }\n\n var openChangeCustomerEvent = $rootScope.$on(\"openChangeCustomerInfo\", function (event, data) {\n openChangeCustomerInfo(data.modalData.modalname, data.modalData.customer);\n });\n\n function createWorker(data) {\n return ProfileService.createWorker(data).then(\n function (response) {\n return response;\n }\n )\n }\n\n vm.updateWorker = function (data) {\n return ProfileService.updateWorker(data.modalData).then(\n function (response) {\n return response\n },\n function (error) {\n return error\n }\n )\n };\n\n // End Worker Block\n /* Destroy events */\n $scope.$on('$destroy', eventCreateCustomer);\n $scope.$on('$destroy', eventCustomerUpdate);\n $scope.$on('$destroy', eventCreateWorker);\n $scope.$on('$destroy', eventUpdateWorker);\n $scope.$on('$destroy', openChangeCustomerEvent);\n }\n})();\n\n/**\n * Created by mdresvyankin on 15.07.17.\n */\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .component('customersList', {\n controller: customersList,\n templateUrl: ['$element', '$attrs', function ($element, $attrs) {\n var tpl = ($attrs.tpl) ? 'app/profile/customersList' + $attrs.tpl + '.html' : 'app/profile/customersList.html';\n return tpl;\n }],\n bindings: {\n filterObject: '=filterObject',\n }\n });\n\n /** @ngInject */\n function customersList(ProfileService, mainService, rx, ModalService, ModalFactory, filterObjects, $scope) {\n var vm = this;\n vm.customers = {};\n vm.countActive = {};\n\n function getCustomers() {\n mainService.getCustomers().then(function (response) {\n vm.customers = response.data.items;\n vm.listToDisplay = response.data.items;\n });\n }\n\n this.$onInit = function () {\n getCustomers();\n };\n\n this.$postLink = function () {\n vm.searchElem = angular.element('#searchString');\n vm.obs$ = rx.Observable.fromEvent(vm.searchElem, 'input')\n .map(function (e) { return e.target.value })\n .do(function (text) {\n if (text.length < 2) {\n vm.listToDisplay = vm.customers\n } else {\n vm.listToDisplay = filterObjects.filterByString(vm.customers, vm.filterText, ['company_name', 'contact_person']);\n }\n $scope.$digest();\n })\n .debounce(function () { return rx.Observable.timer(200) });\n vm.subsciption$ = vm.obs$.subscribe(\n function (v) { },\n function (e) { console.log(e) },\n function () { console.log('complete') }\n );\n }\n\n this.$onDestroy = function () {}\n\n // Public Functions\n\n vm.updateUserStatus = function (user, status) {\n if (status === 3) {\n vm.openConfirmModal(user, status);\n } else {\n ProfileService.updateUserStatus(user, status).then(\n function () {\n getCustomers();\n }\n );\n }\n }\n\n vm.openConfirmModal = function (user, status) {\n vm.confirmModal = ModalFactory.open(ModalService.openModalWindow('confirm'), {\n header: 'Ви впевнені що хочете видалити ' + ((user.type.id === 1) ? user.contact_person : user.company_name),\n body: '',\n accept: 'OK',\n refuse: 'Cancel',\n refuseClass: 'btn-orange',\n acceptClass: ''\n });\n\n vm.confirmModal.result.then(function (data) {\n if (data.result) {\n ProfileService.updateUserStatus(user, status).then(\n function () {\n getCustomers();\n }\n );\n }\n vm.confirmModal.close();\n });\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 31.07.16.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.login',['ngAnimate', 'ngCookies', 'ngMessages'])\n\n /** @ngInject */\n\n})();\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.login')\n .controller('PolicyController', PolicyController);\n\n /** @ngInject */\n function PolicyController() {}\n})();\n\n/**\n * Created by mdresvyankin on 07.09.16.\n */\n'use strict';\n(function() {\n angular\n .module('khFrontend.payment',[])\n .config(runit);\n\n /** @ngInject */\n function runit() {\n }\n})();\n/**\n * Created by mdresvyankin on 09.07.17.\n */\n(function() {\n 'use strict';\n angular\n .module('khFrontend.payment')\n .component('workerRate', {\n templateUrl: 'app/payment/workerRate.html',\n controller: workerRate,\n bindings: {\n rates: \"=rates\",\n workers: \"=workers\",\n role: \"=role\"\n },\n controllerAs: '$ctrl'\n }\n );\n\n function workerRate(ProfileService, rateService, $log, $filter) {\n var vm = this;\n var workerTypes = {\n operator: 1,\n supervisor: 2\n };\n this.$onInit = function () {\n vm.selfProfile = ProfileService.profile;\n };\n vm.searchRate = function () {\n angular.forEach(vm.rates, function (value,key) {\n var chooserWorker = $filter('filter')(vm.workers, {type:{id:workerTypes[key]}})[0].id;\n rateService.searchRate(vm.rates[key].rate).then(function(response){\n var choosenRate = rateService.rent;\n var readyToPatch=(vm.rates[key].rate.id!=choosenRate.id);\n if (readyToPatch) {\n rateService.patchWorker(chooserWorker, response.id).then(function () {\n choosenRate.worker_type = choosenRate.worker_type.id;\n vm.rates[key].rate = rateService.rent;\n });\n }\n });\n });\n }\n }\n\n})();\n/**\n * Created by mdresvyankin on 09.07.17.\n */\n(function() {\n 'use strict';\n angular\n .module('khFrontend.payment')\n .service('rateService', rateService);\n\n function rateService($log, $resource, APIHOST, authorization, _, WorkerService) {\n var vm = this;\n var headers = {\n Authorization: \"Bearer \"+authorization.token\n };\n var URLS = {\n rates: '/v1/rates'\n };\n\n /* Create Resource*/\n var rentResource = function (addon) {\n return $resource(APIHOST+URLS.rates+addon, {}, {\n get: {\n method: 'GET',\n headers: headers},\n save: {\n method: 'POST',\n headers: headers},\n update: {\n method:'PATCH',\n headers: headers\n }\n });\n };\n\n /* Create new Rate*/\n var createRate = function (rateObject) {\n delete(rateObject.id);\n delete(rateObject.name);\n /* Hardcode urgency to 50%*/\n rateObject.urgency=50;\n return rentResource('').save(rateObject).$promise.then(function (response) {\n return response;\n })\n };\n\n /* Return Finded or Created rate*/\n this.searchRate = function(rateObject) {\n var searchString = \"?\";\n angular.forEach(rateObject, function (value, key) {\n if (key.search(\"h\") == 0) {\n searchString = searchString+'RateSearch['+key+']='+value+'&';\n }\n });\n return rentResource(searchString).get().$promise.then(function (response) {\n if(Boolean(response.items.length) && (response.items[0].worker_type.id==rateObject.worker_type)) {\n return vm.rent = response.items[0];\n } else {\n return createRate(rateObject).then(function (response) {\n vm.rent = response.toJSON();\n vm.rent.name = vm.rent.type.name;\n vm.rent.type = vm.rent.type.id;\n return vm.rent;\n })\n }\n });\n };\n\n this.patchWorker = function(workerId, rateId){\n return WorkerService.patchWorkerData(workerId, {rate_id: rateId}).then(function(response){\n return response;\n });\n }\n\n }\n})();\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.payment')\n .controller('RateController', RateController);\n\n /** @ngInject */\n\n function RateController($rootScope, $scope, _, paymentService, ProfileService) {\n var vm = this;\n // Открытие и обработка данных модалей\n vm.getSelfRate = getSelfCustomerRate;\n vm.selfRate = {};\n\n function getSelfCustomerRate(customer_id) {\n // Store customer Id to use it in future\n vm.customer_id = customer_id;\n // Send request to get current customer's tariff\n ProfileService.getCustomerInfoNew(vm.customer_id).then(function(response) {\n paymentService.rates.run(paymentService.rates.get.tariff(response.data.tariff_v2_id)).then(function (response) {\n // Get customer rate\n vm.selfRate = response.data;\n });\n });\n }\n\n /* Event destroy*/\n\n }\n})();\n\n/*\n* Контроллер для обслуживания статистики, тарифов и скидок\n* */\n\n(function () {\n 'use strict';\n angular\n .module('khFrontend.payment')\n .service('paymentService', paymentService);\n\n /** @ngInject */\n function paymentService($http, $log, APIHOST, authorization, ecg, _) {\n var token = authorization.token;\n var statistic = {};\n var toSend = {\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n // Возвращаем урл для запроса в зависимости от наличия id\n var setSend = function (controller_name, param, method) {\n var addon = (controller_name === 'tariffs') ? 'v2' : 'v1';\n toSend.url = (angular.isDefined(param) && angular.isNumber(param)) ? APIHOST + \"/\" + addon + \"/\" + controller_name + \"/\" + param : APIHOST + \"/\" + addon + \"/\" + controller_name;\n if (angular.isDefined(param) && angular.isObject(param)) {\n toSend.url = (angular.isDefined(param.id)) ? APIHOST + \"/\" + addon + \"/\" + controller_name + \"/\" + param.id : APIHOST + \"/\" + addon + \"/\" + controller_name;\n toSend.data = param;\n }\n toSend.method = method;\n return toSend;\n };\n\n // Get Bank info from json\n this.getBank = function (mfo) {\n var privatSend = {\n method: 'GET',\n url: '/app/payment/mfo.json'\n };\n return $http(privatSend).then(function (response) {\n return _.filter(response.data.BANKS, { 'mfo': mfo })\n })\n };\n\n this.getStatistic = function () {\n return ecg.ecgStatistic.month().then(function (response) {\n statistic.month = response.data;\n return ecg.ecgStatistic.all().then(function (response) {\n statistic.all = response.data;\n return statistic;\n });\n });\n };\n\n this.rates = {\n get: {\n tariff: function (id) {\n //Если запрос пришел с айдишником - то выводим только по айди, если без него, то весь список.\n return setSend('tariffs', id, \"GET\");\n },\n sale: function (id) {\n return setSend('sales', id, \"GET\");\n },\n rate: function (id) {\n return setSend('rates', id, \"GET\");\n },\n bonus: function (id) {\n return setSend('bonuses', id, \"GET\");\n }\n },\n set: {\n tariff: function (data) {\n data.type = data.type.id;\n return setSend('tariffs', data, \"PATCH\");\n },\n sale: function (data) {\n return setSend('sales', data, \"PATCH\");\n },\n rate: function (data) {\n return setSend('rates', data, \"PATCH\");\n },\n bonus: function (data) {\n return setSend('bonuses', data, \"PATCH\");\n\n }\n },\n create: {\n tariff: function (data) {\n data.name = new Date().toString();\n return setSend('tariffs', data, \"POST\");\n },\n sale: function (data) {\n return setSend('sales', data, \"POST\");\n },\n rate: function (data) {\n return setSend('rates', data, \"POST\");\n },\n bonus: function (data) {\n return setSend('bonuses', data, \"POST\");\n\n }\n },\n search: {\n tariff: function (data) {\n toSend.url = APIHOST + \"/v2/tariffs\" +\n \"?TariffSearch[h24_14]=\" + data.h24_14\n + \"&TariffSearch[h24_59]=\" + data.h24_59\n + \"&TariffSearch[h24_10]=\" + data.h24_10\n + \"&TariffSearch[h48_14]=\" + data.h48_14\n + \"&TariffSearch[h48_59]=\" + data.h48_59\n + \"&TariffSearch[h48_10]=\" + data.h48_10\n + \"&TariffSearch[h72_14]=\" + data.h72_14\n + \"&TariffSearch[h72_59]=\" + data.h72_59\n + \"&TariffSearch[h72_10]=\" + data.h72_10;\n toSend.method = \"GET\";\n return toSend;\n },\n rate: function () {\n\n }\n },\n run: function (obj) {\n return $http(obj)\n }\n };\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.payment')\n .controller('PaymentController', PaymentController)\n .filter('makeArray', makeArray)\n .filter('makeDate', makeDate);\n\n /** @ngInject */\n\n function PaymentController($uibModal, ModalService, paymentService) {\n var vm = this;\n // Открытие и обработка данных модалей\n vm.openPayment = openPayment;\n vm.getCustomersRates = getCustomerRates;\n vm.getSelfRate = getSelfCustomerRate;\n vm.getWorkerSelfRate = getSelfWorkerRate;\n vm.selfRate = {};\n\n function openPayment(modalname) {\n paymentService.getStatistic().then(function (response) {\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, response));\n vm.modal.result.then(function (response) {\n });\n })\n }\n\n function getCustomerRates() {\n paymentService.rates.run(paymentService.rates.get.tariff()).then(function (response) {\n })\n }\n\n function getWorkerRates() {\n paymentService.rates.run(paymentService.rates.get.rates()).then(function (response) {\n })\n }\n\n function getSelfCustomerRate(id) {\n paymentService.rates.run(paymentService.rates.get.tariff(id)).then(function (response) {\n vm.selfRate = response.data;\n });\n }\n\n function getSelfWorkerRate(id) {\n paymentService.rates.run(paymentService.rates.get.rates(id)).then(function (response) {\n vm.selfRate = response.data;\n });\n }\n }\n\n\n function makeArray(_) {\n return function (obj) {\n if (!(obj instanceof Object)) return obj;\n return _.map(obj, function (val, key) {\n return Object.defineProperty(val, '$key', {__proto__: null, value: key});\n });\n }\n }\n\n function makeDate(moment) {\n return function (obj) {\n return moment(new Date(obj)).format(\"MMMM-YYYY\")\n }\n }\n\n})();\n\n(function () {\n \"use strict\";\n angular\n .module('khFrontend.payment')\n .component('customerRate', {\n templateUrl: 'app/payment/customer-rates.html',\n controller: customerRate,\n bindings: {\n rates: \"=rates\",\n customer: \"=customer\",\n role: \"=role\",\n form: '=form'\n },\n controllerAs: '$ctrl'\n });\n\n /*\n const TYPE_RENT = 1;\n const TYPE_BUYOUT = 2;\n const TYPE_LEASE = 3;\n\n public static $typesNames = [\n self::TYPE_RENT => 'rent',\n self::TYPE_BUYOUT => 'custom',\n self::TYPE_LEASE => 'lease',\n ];\n */\n\n /** @ngInject */\n function customerRate(_, paymentService, $rootScope, $scope, moment) {\n var vm = this;\n vm.selfRate = {};\n vm.$onInit = function () {\n paymentService.rates.run(paymentService.rates.get.tariff(vm.customer.tariff_id)).then(function (response) {\n vm.selfRate = response.data;\n });\n }\n\n /*Events Handlers*/\n var updateCustomerTariffEvent = $rootScope.$on('updateCustomerTariff', function () {\n if (vm.selfRate.id) {\n vm.saveRate();\n } else {\n vm.createRate();\n }\n })\n\n vm.setType = function (type) {\n vm.selfRate.type.id = type;\n vm.form.$setDirty();\n }\n\n vm.createRate = function () {\n paymentService.rates.run(paymentService.rates.create.tariff(prepareTarifToSend())).then(function () {})\n }\n vm.saveRate = function () {\n paymentService.rates.run(paymentService.rates.set.tariff(prepareTarifToSend())).then(function () {})\n }\n\n /* Clear self tarif based on tariff type */\n function prepareTarifToSend() {\n var arrayOfProperties = [];\n if (!vm.selfRate.name) {\n vm.selfRate.name = moment().format().toString();\n }\n switch (vm.selfRate.type.id) {\n case 1:\n arrayOfProperties = ['created_at', 'leasing_date_end', 'leasing_date_start', 'leasing_fee'];\n break;\n case 3:\n vm.selfRate.leasing_date_end = formatDate(vm.selfRate.leasing_date_end);\n if (!vm.selfRate.leasing_date_start) {\n vm.selfRate.leasing_date_start = formatDate(new Date());\n }\n arrayOfProperties = ['created_at', 'rent'];\n break;\n default:\n arrayOfProperties = [];\n break;\n }\n return _.omit(vm.selfRate, arrayOfProperties)\n }\n\n\n function formatDate(date) {\n return moment(date).format('YYYY-MM-DD');\n }\n\n $scope.$on('$destroy', updateCustomerTariffEvent);\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('khFrontend.patients',['angularMoment']);\n})();\n\n/**\n * Functions to get ECG DATA\n */\n(function () {\n 'use strict';\n angular\n .module('khFrontend.patients')\n .service('patients', patients);\n\n /** @ngInject */\n function patients($http, $q, APIHOST, authorization, _, moment) {\n var token = authorization.token;\n var allPatients;\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n // Get patients for current customers or all for supervisor or admin\n // ngb_disabled - bool. Flag to add this param to array of objects\n this.getAllPatients = function (ngb_disabled) {\n ngb_disabled = (ngb_disabled) ? ngb_disabled : false;\n toSend.url = APIHOST + \"/v1/patients\";\n toSend.method = 'GET';\n return $http(toSend).then(function (response) {\n allPatients = _.map(response.data.items, function (value) {\n var dob = moment.tz(value.dob, \"UTC\");\n value.dob = dob._d;\n value.nbg = (value.nbg) ? _.toArray(value.nbg) : null;\n if (ngb_disabled) {\n value.nbg_disabled = (value.nbg) ? true : false;\n }\n return value;\n });\n return allPatients;\n });\n };\n\n // Проверка на изменение объекта пациента\n // Проверяем есть ли среди введенных данных уже существующий пациент\n this.checkPatientIsExist = function (patientObject) {\n var deffered = $q.defer();\n var vanillaPatient = angular.merge({}, patientObject);\n var toReturn = {};\n return this.getAllPatients(false).then(function (response) {\n var patientObject = {};\n angular.forEach(response, function (value, key) {\n if (key > 0) {\n patientObject = _.cloneDeep(vanillaPatient);\n }\n /* Если при проходе уже был создан клон оригинального пациента, то скопировать его значение\n * в объект пациента, если проход первый, то создать эталонную копию\n * */\n patientObject = angular.extend({}, value, vanillaPatient);\n if (angular.equals(value, patientObject)) {\n toReturn = patientObject;\n }\n });\n if (Object.keys(toReturn).length > 0) {\n deffered.resolve(toReturn);\n } else {\n // Проверяем, если пациент был выбран из списка, то изменились ли его данные\n if (angular.isDefined(vanillaPatient.id)) {\n var vanillaPatientToEqual = _.cloneDeep(vanillaPatient);\n var currentPatientData = _.find(allPatients, function (obj) {\n return obj.id == vanillaPatientToEqual.id;\n });\n delete(vanillaPatientToEqual.nbg_disabled);\n delete(vanillaPatientToEqual.dob);\n delete(currentPatientData.dob);\n vanillaPatient.wasChanged = (!angular.equals(currentPatientData, vanillaPatientToEqual));\n }\n deffered.resolve(vanillaPatient);\n }\n return deffered.promise;\n });\n };\n\n this.nbg = {\n first: [\"O\", \"A\", \"V\", \"D\", \"-\"],\n second: [\"O\", \"A\", \"V\", \"D\", \"-\"],\n third: [\"O\", \"T\", \"I\", \"D\", \"-\"],\n fourth: [\"O\", \"R\", \"-\"],\n fifth: [\"O\", \"A\", \"V\", \"D\", \"-\"]\n };\n\n this.createOrUpdatePatient = function (data) {\n /*\n В случае, если приходит объект с пациентом и есть его patient_id\n производим апдейт, иначе создаем.\n */\n toSend.method = (data.id) ? 'PATCH' : 'POST';\n toSend.url = ( data.id ) ? APIHOST + \"/v1/patients/\" + data.id : APIHOST + \"/v1/patients\";\n toSend.data = data;\n return $http(toSend);\n }\n }\n})();\n/**\n * Created by mdresvyankin on 16.09.16.\n */\n/**\n * Functions to get ECG DATA\n */\n(function () {\n 'use strict';\n angular\n .module('khFrontend.patients')\n .controller('PatientsController', PatientsController)\n .filter('birthday', birthday);\n\n /** @ngInject */\n function PatientsController($q, $log, ecg, $rootScope, patients, _, $uibModal, ModalService, ModalFactory, GENDERS, ProfileService, RecorderService, $scope, $timeout, datePrepare) {\n var vm = this;\n vm.patientsData = []; // Все пациенты кастомера\n vm.patient = {}; //Данные текущего пациента\n vm.toProcess = {}; //Данные для передачи в контроллер ЭКГ для дальнейшей обработкиы\n vm.nbg = patients.nbg; // Шифр ШВР для пациента\n vm.openEcgUpload = openEcgUpload; //Открыть модалку загрузки\n vm.openPatientEdit = openPatientEdit; // Правим пользователя.\n vm.modal_data = {}; // Данные модального окна\n\n function getAllPatients() {\n return patients.getAllPatients(true).then(function (response) {\n return response;\n });\n }\n\n $scope.$watch(RecorderService.recorder, function (newValue) {\n RecorderService.recorder = newValue;\n });\n\n function openEcgUpload(modalname) {\n\n getAllPatients(true).then(\n function (response) {\n vm.patients = response;\n var modal_data = {\n nbg: vm.nbg,\n customerID: vm.customerID,\n genders: GENDERS,\n patients: vm.patients,\n recorder: RecorderService.recorder\n };\n vm.modal_data = modal_data;\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, modal_data));\n });\n }\n\n function openPatientEdit(modalname, patient_id) {\n patients.getAllPatients(true).then(\n function (response) {\n var patient_filter = _.filter(response, function (value) {\n return value.id == patient_id\n });\n vm.patient = patient_filter[0];\n if (angular.isDefined(vm.patient.dob)) {\n vm.patient.dob = datePrepare.getDateFromBack(vm.patient.dob);\n }\n vm.patient.nbg = (vm.patient.nbg) ? _.toArray(vm.patient.nbg) : null;\n vm.patient.nbg_disabled = !!vm.patient.nbg;\n\n var modal_data = {\n nbg: vm.nbg,\n customerID: vm.customerID,\n genders: GENDERS,\n patient: vm.patient\n };\n vm.modal_data = modal_data;\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, modal_data));\n });\n }\n\n\n function createOrUpdatePatientFromPatients(patient) {\n patient.nbg = (patient.nbg) ? _.toArray(patient.nbg).join(\"\") : null;\n patient.gender = patient.gender.id;\n return patients.createOrUpdatePatient(patient).then(function (response) {\n response.data.dob = datePrepare.getDateFromBack(response.data.dob);\n response.data.nbg = (response.data.nbg) ? _.toArray(response.data.nbg) : null;\n vm.modal_data.patient = response.data;\n vm.modal_data.alerts = [];\n vm.modal_data.alerts.push({\n type: 'info',\n msg: 'Patient Created or Updated'\n });\n $timeout(function () {\n vm.modal_data.alerts.pop();\n }, 5000);\n // Перезапрашиваем данные всех ЭКГ, для обновления страницы.\n return vm.modal_data.patient;\n });\n }\n\n vm.createOrUpdatePatient = function () {\n var deffered = $q.defer();\n var patient = vm.modal_data.patient;\n vm.modal_data.patient.dob = datePrepare.setDateToBack(vm.modal_data.patient.dob);\n // Ищем совпадения пациентов в списке пациентов, или получаем исходное значение\n patients.checkPatientIsExist(vm.modal_data.patient).then(function (response) {\n vm.modal_data.patient = response;\n vm.modal_data.patient.gender = vm.modal_data.patient.gender.id;\n // Проверяем был ли выбран пациент из списка и был ли отредактирован\n if (angular.isDefined(vm.modal_data.patient.id) && vm.modal_data.patient.wasChanged) {\n /* Открываем подмодалку\n В случае если в результате закрытия пришло true - создаем\n * в противном - обновляем данные пациента*/\n vm.new_modal = ModalFactory.open(ModalService.openModalWindow('confirm'), {\n header: vm.modal_data.patient.name + \" \" + vm.modal_data.patient.surname,\n headerPrefix: \"Personal data of\",\n headerSuffix: \"was changed\",\n body: \"Would you like to create new patient or update current one\",\n accept: \"Create\",\n refuse: \"Update\",\n refuseClass: 'btn-orange',\n acceptClass: ''\n });\n vm.new_modal.result.then(function (confirmData) {\n // Если выбрано создание - удаляем айдишник\n if (confirmData.result) {\n delete(patient.id);\n }\n $q.when(createOrUpdatePatientFromPatients(patient)).then(function (response) {\n patient = response;\n deffered.resolve(response);\n });\n });\n } else {\n $q.when(createOrUpdatePatientFromPatients(patient)).then(function (response) {\n patient = response;\n deffered.resolve(response);\n });\n }\n });\n\n return deffered.promise;\n };\n // Create patient using events\n var createOrUpdatePatientEvent = $rootScope.$on('createOrUpdatePatient', function () {\n vm.createOrUpdatePatient();\n });\n\n\n // Create update\n var patchPatientEvent = $rootScope.$on('patchPatient', function () {\n // Выполняем создание или обновление пациента\n $scope.$watch(ecg.toUpdateEcgPatientData, function (newValue) {\n ecg.toUpdateEcgPatientData = newValue;\n });\n vm.createOrUpdatePatient().then(\n function (res) {\n ecg.toUpdateEcgPatientData = {\n modalData: vm.modal_data\n };\n $rootScope.$broadcast('patientCreated', res);\n });\n });\n\n\n var onUpdateEcgData = $scope.$on('UpdateEcgData', function () {\n if (vm.modal) {\n vm.modal.close();\n }\n })\n\n $scope.$on('destroy', onUpdateEcgData);\n $scope.$on('destroy', patchPatientEvent);\n $scope.$on('destroy', createOrUpdatePatientEvent);\n }\n\n function birthday(_) {\n return function (x) {\n var bd = new Date(x);\n return Math.floor((_.now() - bd.getTime()) / 31536000000);\n };\n }\n\n})();\n\n'use strict';\n(function() {\n angular\n .module('khFrontend.main',['ngAnimate', 'ngCookies', 'ngMessages', 'ngAria', 'ngResource','uiSwitch', 'khFrontend.statistic'])\n .config(runit);\n\n /** @ngInject */\n function runit($httpProvider) {\n }\n})();\n/**\n * Created by mdresvyankin on 02.08.16.\n */\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.main')\n .directive('userInfo', userInfo);\n\n /** @ngInject */\n function userInfo() {\n return {\n restrict: 'A',\n replace: true,\n scope: {\n nameData: '@',\n displayData: '@',\n show: \"&\"\n },\n template:\n \"
\" +\n \"

\" +\n \"

\" +\n \"
\",\n link: function () {\n }\n };\n }\n})();\n(function () {\n 'use strict';\n angular\n .module('khFrontend.main')\n .service('mainService', mainService)\n .run(function ($log) {\n });\n\n /** @ngInject */\n function mainService($http, APIHOST, authorization, _) {\n var token = authorization.token;\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n this.getUsers = function () {\n var roles = {};\n roles.activeSupervisorsAsOperators=[];\n roles.activeSupervisorsAsSupervisors=[];\n toSend.url = APIHOST + \"/v1/users?expand=workers,customer\";\n return $http(toSend).then(function (response) {\n roles.users = response.data.items;\n roles.supervisors = _.filter(roles.users, function (o) {\n return (o.role == 'supervisor');\n });\n roles.activeSupervisors = _.filter(roles.supervisors, function (o) {\n return o.status.id == 1;\n });\n roles.activeReadyToWorkAsSupervisors = _.each(roles.activeSupervisors, function (o) {\n var countReadyToWork = 0;\n _.each(o.workers,function (obj) {\n countReadyToWork=countReadyToWork+obj.ready_to_work;\n });\n switch (countReadyToWork){\n case 1: {\n roles.activeSupervisorsAsSupervisors.push(o);\n break;\n }\n case 2: {\n roles.activeSupervisorsAsOperators.push(o);\n break;\n }\n default:\n break;\n }\n });\n roles.operators = _.filter(roles.users, function (o) {\n return (o.role == 'operator');\n });\n roles.activeOperators = _.filter(roles.operators, function (o) {\n return (o.status.id == 1);\n });\n roles.activeReadyToWorkOperators = _.filter(roles.activeOperators, function (o) {\n if (angular.isDefined(o.workers) && angular.isDefined(o.workers))\n return ((o.workers[0].ready_to_work + o.workers[1].ready_to_work) == 2);\n });\n roles.canBeOperators = roles.activeReadyToWorkOperators.concat(roles.activeSupervisorsAsOperators);\n roles.customers = _.filter(roles.users, function (o) {\n return o.workers.length == 0;\n });\n return roles;\n });\n };\n\n this.getCustomers = function () {\n toSend.url = APIHOST + \"/v2/customers?expand=user,customer\";\n return $http(toSend);\n };\n\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.main')\n .controller('MainController', MainController);\n\n /** @ngInject */\n\n function MainController(mainService, LoginService, ProfileService, authorization, $scope, _, moment, ROLES) {\n var vm = this;\n var dateobject = new Date();\n // Locale for date\n //TODO: привести даты впорядок\n vm.locale = 'uk';\n vm.currentMonth = moment(new Date(moment.utc().year() + \"-\" + (moment.utc().month() + 1))).format(\"YYYY-MM\");\n vm.currentDay = vm.currentMonth + \"-\" + moment.utc().date();\n vm.today = new Date(vm.currentDay).getTime() / 1000;\n vm.todayText = getDate(vm.locale, 'todayText');\n // Public Functions\n vm.getCurrentUser = getCurrentUser;\n vm.isShow = isShow; //Проверка наличия элемента для его дальнейшего отображения\n vm.init = init;\n // User Role in system\n vm.roles = ROLES;\n vm.role = \"\";\n // Проверка на правльность роли\n vm.isInRole = isInRole;\n\n vm.princip = authorization;\n\n // Public Vars\n vm.date = dateobject;\n vm.user = \"\"; //Используеться для передачи пользователя в фунцию changeEcg\n vm.profile = \"\";\n vm.id = \"\";\n vm.customers = \"\";\n vm.isSelected = 1;\n\n function init() {\n getUserNames();\n getCustomers();\n getCurrentUser();\n }\n\n $scope.$on('mainReInit', function () {\n init();\n });\n\n\n //Даты\n function getDate(locale, keyword) {\n moment.locale(locale);\n switch (keyword) {\n case 'todayText':\n return moment().utc().format('D MMMM YYYY');\n default:\n return moment().format('DD-MM-YYYY')\n }\n }\n\n // TODO: доделать фильтрацию по типам пользователей\n function getUserNames() {\n mainService.getUsers().then(function (response) {\n vm.users = response.users;\n vm.supervisors = response.supervisors;\n vm.activeSupervisors = response.activeSupervisors;\n vm.operators = response.operators.concat(vm.supervisors);\n vm.activeOperators = response.activeOperators;\n vm.activeReadyToWorkOperators = response.activeReadyToWorkOperators;\n vm.canBeOperators = response.canBeOperators;\n });\n }\n\n function getCurrentUser() {\n ProfileService.getProfile().then(function (response) {\n // Get profile data\n vm.profile = response.data.data;\n // Get user role fore views formation\n vm.role = vm.profile.role;\n });\n }\n\n function getCustomers() {\n mainService.getCustomers().then(function (response) {\n vm.customers = response.data.items;\n });\n }\n\n function isInRole(value) {\n return LoginService.getRole(value) && value === vm.role;\n }\n\n // Решаем отображать ли строку в зависимости от наличия данных в ней.\n // TODO: Продумать более хороший алгоритимически подход\n function isShow(property) {\n if (typeof(property) == \"object\") {\n return false;\n } else {\n return true;\n }\n }\n\n }\n})();\n\n/**\n * Created by tree on 08.06.16.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.login')\n .service('LoginService', LoginService);\n\n /** @ngInject */\n\n //Get Promise for Login\n function LoginService($http, APIHOST, authorization, _, ROLES) {\n this.getResponse = function (data) {\n return $http({\n method: 'POST',\n url: APIHOST + \"/v1/login\",\n data: data\n });\n };\n\n this.getResetToken = function (data) {\n return $http({\n method: 'POST',\n url: APIHOST + \"/v1/password-reset-request\",\n data: data\n });\n };\n\n this.resetPassword = function (data) {\n return $http({\n method: 'POST',\n url: APIHOST + \"/v1/change-reset-password?token=\"+data.token,\n data: data\n });\n };\n\n // Запрос на смену пароля\n this.changePassword = function (data) {\n var token = authorization.token;\n return $http({\n method: 'POST',\n url: APIHOST + '/v1/change-password',\n data: data,\n headers: {\n \"Authorization\": \"Bearer \"+token\n }})\n };\n\n this.getRole = function (value) {\n return ROLES.rolesList[value];\n }\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.login')\n .controller('LoginController', LoginController);\n\n /** @ngInject */\n function LoginController(LoginService, $window, $scope, $cookies, $state, $stateParams, $uibModal, ModalService, $rootScope, _, authorization) {\n var vm = this;\n vm.language = \"ENG\";\n vm.password = \"\";\n vm.email = \"\";\n vm.username = \"\";\n //Установка нового пароля, при наличии токена\n vm.setNewPassword = setNewPassword;\n //Смена пароля\n vm.changePassword = changePassword;\n //Вход в систему. Выход\n vm.submit = submit;\n vm.logout = logout;\n // Открытие и обработка данных модалей\n vm.openPasswordResque = openPasswordResque;\n vm.openPasswordChange = openPasswordChange;\n vm.init = init();\n\n var pChange = $rootScope.$on('passwordChange', function (evt, data) {\n vm.changePassword(data.modalData).then(function () {\n });\n $scope.$on('$destroy', pChange);\n });\n\n // Установка роли по умолчанию.\n function init() {\n\n };\n\n function submit() {\n var data = {\n email: vm.username,\n password: vm.password\n };\n /* Делаем сперва проверку роли, после нее логин\n * если роли нет (отсутствует мыло в базе), то выдаем еррор без логина\n * в противном случае логинимся*/\n LoginService.getResponse(data).then(function (response) {\n vm.obj = response.data.data[\"access_token\"];\n var expire = new Date(); // When cookies expires\n expire.setDate(expire.getDate() + 1);\n authorization.token = vm.obj;\n $cookies.put('token', vm.obj, {\n expires: expire\n });\n authorization.authenticated = true;\n $state.go(\"app.home\");\n },\n function (response) {\n vm.error = response.data.errors.password[0];\n }\n );\n }\n\n function reset() {\n var data = {\n email: vm.email\n };\n LoginService.getResetToken(data).then(function (response) {\n });\n }\n\n function setNewPassword() {\n var data = {};\n if (!vm.newPassword.localeCompare(vm.newPasswordRepeat)) {\n data.password = vm.newPassword\n }\n\n data.token = $stateParams.resetToken;\n LoginService.resetPassword(data).then(function (response) {\n vm.error = response.data.data.message;\n }, function (error) {\n vm.error = error.data.message;\n });\n }\n\n // Change password with current password\n // TODO: подождать пока Егор починит контроллер\n function changePassword(modalData) {\n var data = {};\n data.oldPassword = modalData.oldPassword;\n data.password = modalData.password;\n try {\n return LoginService.changePassword(data).then(function (response) {\n vm.modal.close();\n return true;\n }, function (error) {\n modalData.error = error;\n });\n } catch (E) {\n\n }\n }\n\n function logout() {\n authorization.role = authorization.token = authorization._identity = undefined;\n authorization._authenticated = false;\n $cookies.remove('token');\n $cookies.remove('kh_role');\n $window.location.reload();\n }\n\n function openPasswordResque(modalname) {\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, {}));\n vm.modal.result.then(function (response) {\n vm.email = response.username;\n reset();\n })\n }\n\n function openPasswordChange(modalname) {\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, {}));\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 13.08.16.\n */\n\n// authorization service's purpose is to wrap up authorize functionality\n// it basically just checks to see if the authorization is authenticated and checks the root state\n// to see if there is a state that needs to be authorized. if so, it does a role check.\n// vm is used by the state resolver to make sure when you refresh, hard navigate, or drop onto a\n// route, the app resolves your identity before it does an authorize check. after that,\n// authorize is called from $stateChangeStart to make sure the authorization is allowed to change to\n// the desired state\n\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.login')\n .service('authorization', authorization);\n\n /** @ngInject **/\n function authorization($cookies, $http, $q, APIHOST) {\n var credentials = ['kh_role', \"token\"];\n var vm = this;\n vm.authenticated = false;\n vm.token = $cookies.get('token');\n vm.setOrUnsetCredentials = function (params) {\n /**\n * @description set credentials of delete old one\n */\n var action = params.action;\n for (var param = 0; param < param.length; param++) {\n switch (action) {\n case \"set\":\n vm[param] = (vm[param]) ? vm[param] : $cookies.get(param);\n break;\n case 'delete':\n $cookies.remove(param);\n delete obj[param];\n break;\n default:\n break;\n }\n }\n };\n\n vm.formateToSendData = function (token) {\n return {\n method: 'GET',\n url: APIHOST + \"/v1/profile\",\n headers: {\n \"Authorization\": \"Bearer \" + token\n },\n ignoreErrors: true,\n }\n };\n vm.setToken = function (value) {\n vm.token = authorization.token = value;\n };\n vm.getToken = function () {\n return vm.token\n };\n vm.checkTokenValid = function () {\n return new Promise(function(resolve, reject) {\n vm.setToken($cookies.get('token'));\n if (!vm.token) {\n vm.authenticated = false;\n reject(vm.authenticated);\n }\n\n $http(vm.formateToSendData(vm.token)).then(\n function (resp) {\n vm.authenticated = true;\n vm.setOrUnsetCredentials({ credentials: credentials, action: 'set' });\n resolve(vm.authenticated);\n },\n function (err) {\n vm.authenticated = false;\n vm.setOrUnsetCredentials({ credentials: credentials, action: 'delete' });\n reject(vm.authenticated);\n });\n })\n };\n\n vm.identity = function () {\n var defer = $q.defer();\n var identification = Boolean($cookies.get('token'));\n if (!identification) {\n setOrUnsetCredentials({credentials: credentials, action: 'delete'});\n defer.reject('error');\n }\n defer.resolve(identification);\n return defer.promise;\n };\n\n };\n})();\n\n(function() {\n 'use strict';\n\n angular.module('kindHeart', [\n 'ngAnimate',\n 'ngCookies',\n 'ngSanitize',\n 'ngMessages',\n 'ui.router',\n 'pascalprecht.translate',\n 'modals',\n 'dropdowns',\n 'datepicker',\n 'khFrontend.main',\n 'khFrontend.login',\n 'khFrontend.payment',\n 'khFrontend.recorder',\n 'khFrontend.ecg',\n 'khFrontend.profile',\n 'khFrontend.statistic',\n 'khFrontend.patients',\n 'ngMaterial',\n 'rx',\n 'angular-md5'\n ]);\n})();\n\n/**\n * Created by mdresvyankin on 12.08.16.\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .factory('_', LodashFactory);\n\n /** @ngInject */\n\n function LodashFactory($window) {\n if(!$window._){\n // If lodash is not available you can now provide a\n // mock service, try to load it from somewhere else,\n // redirect the user to a dedicated error page, ...\n }\n return $window._;\n }\n})();\n/**\n * Created by mdresvyankin on 15.04.17.\n */\n'use strict';\n(function () {\n angular\n .module('khFrontend.main')\n .factory('httpRequestInterceptor401', httpRequestInterceptor);\n\n\n /** @ngInject */\n function httpRequestInterceptor($q, $cookies) {\n return {\n responseError: function (response) {\n if (response.status == 401) {\n $cookies.remove('token');\n $cookies.remove('kh_role');\n window.location = \"/\";\n }\n return $q.reject(response);\n }\n };\n }\n\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .service('filterObjects', filterObjects);\n\n /** @ngInject */\n function filterObjects(_) {\n var vm = this;\n\n function getCuttedObject(object, fields, ignoreCase) {\n var caseShouldBeIgnored = ignoreCase || true;\n if (!fields || fields.length === 0) {\n return (caseShouldBeIgnored) ? JSON.stringify(object).toLocaleLowerCase() : JSON.stringify(object);\n } else {\n return (caseShouldBeIgnored) ? JSON.stringify(_.pick(object, fields)).toLocaleLowerCase() : JSON.stringify(_.pick(object, fields));\n }\n }\n\n function getArrayFromString(str) {\n return str.split(\" \");\n }\n\n vm.parceString = function(str, type) {\n if (!str) {\n return\n }\n type = (type) ? 'id' : type;\n switch (type) {\n case 'id':\n var idReg = new RegExp('^id:( )?\\d*');\n return (idReg.test(str)) ? str.split(':')[1].trim() : 0;\n default:\n break;\n }\n }\n\n /**\n * @description Search string concated by words in input array\n * @return \\{{{Array}}\\} {{Filtered result array}}{{}}\n * @param \\{{{Array}}\\} {{objectArray}} {{Array to be processed}}{{}}\n * @param \\{{{String}}\\} {{searchString}} {{String that will be searched}}{{}}\n * @param \\{{{Array}}\\} {{fields}} {{Array of fields which will be used during search }}{{}}\n * @param \\{{{Boolean}}\\} {{ignoreCase}} {{ Flag to set case independent search}}{{}}\n * */\n vm.filterByString = function(objectArray, searchString, fields, ignoreCase) {\n var caseShouldBeIgnored = ignoreCase || true;\n var resultArray = [];\n var strArray = getArrayFromString(searchString);\n if (typeof objectArray !== \"object\" || objectArray.lenght === 0 || !searchString || searchString.lenght < 3) {\n return objectArray;\n };\n\n for (var index = 0; index < objectArray.length; index++) {\n var element = getCuttedObject(objectArray[index], fields, ignoreCase);\n var counter = 0;\n for (var strIndex = 0; strIndex < strArray.length; strIndex++) {\n var part = (caseShouldBeIgnored) ? strArray[strIndex].toLowerCase() : strArray[strIndex];\n if(element.includes(part)) {\n counter++;\n }\n };\n if (counter === strArray.length) {\n resultArray.push(objectArray[index]);\n };\n };\n\n return resultArray;\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 20.04.17.\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .config(momentConfig)\n .service('datePrepare',datePrepare);\n\n /** @ngInject */\n function momentConfig(moment) {\n var x = new Date();\n var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;\n moment.tz.setDefault(\"Etc/GMT+\"+currentTimeZoneOffsetInHours);\n }\n\n function datePrepare(moment) {\n // Берем дату, и делаем ее датой в текущей таймзоне\n this.getDateFromBack = function(dateFromBack){\n return moment(new Date(dateFromBack)).toDate();\n };\n\n this.setDateToBack = function(dateToBack){\n return moment(new Date(dateToBack)).format(\"YYYY-MM-DD\");\n };\n }\n})();\n\n\n(function() {\n 'use strict';\n\n angular\n .module('khFrontend.ecg',['khFrontend.ecg.fileUpload'])\n})();\n/**\n * Created by mdresvyankin on 04.03.17.\n */\n(function() {\n 'use strict';\n\n angular\n .module('khFrontend.ecg')\n .service('ZipService', ZipService);\n\n /** @ngInject */\n function ZipService() {\n var zip = new JSZip();\n\n this.createZip = function(files) {\n angular.forEach(files, function (file, key) {\n zip.file(file._file.name, file._file);\n });\n return zip.generateAsync({\n type: \"blob\",\n compression: \"DEFLATE\",\n compressionOptions: {\n level: 3\n }\n }, function updateCallback(metadata) {\n ZipService.metadata = metadata;\n return metadata;\n })\n }\n }\n})();\n/**\n * Created by mdresvyankin on 20.05.17.\n */\n(function () {\n \"use strict\";\n angular.module(\"khFrontend.ecg\").component(\"ecgStatistic\", {\n templateUrl: [\n \"$element\",\n \"$attrs\",\n function ($element) {\n return \"app/ecg/tpl/count_ecg.html\";\n }\n ],\n controller: getEcgStatistic,\n bindings: {\n role: \"@\",\n month: \"@\"\n }\n });\n\n /** @ngInject */\n function getEcgStatistic(ecg, $log, moment, PaymentStatisticService) {\n var vm = this;\n var currentMonth = moment(\n new Date(moment.utc().year() + \"-\" + (moment.utc().month() + 1))\n ).format(\"YYYY-MM\");\n vm.ecgStatistic = {};\n vm.currentMonth = currentMonth;\n\n vm.$onInit = function () {\n vm.getEcgStatistic();\n }\n\n vm.getEcgStatistic = function () {\n if (vm.role === \"customer\") {\n PaymentStatisticService.getSelfCustomerStatistic().then(function(resp) {\n\n vm.monthData = PaymentStatisticService.getSelfMonthStatistic(resp.data.data[vm.currentMonth]);\n });\n } else {\n ecg.ecgStatistic.month().then(function (response) {\n vm.monthData = response.data.data;\n });\n ecg.ecgStatistic.all().then(function (response) {\n vm.allData = response.data.data;\n });\n }\n };\n }\n})();\n\n/**\n * Created by mdresvyankin on 09.10.16.\n */\n(function() {\n 'use strict';\n\n angular\n .module('khFrontend.ecg.fileUpload',['angularFileUpload']);\n})();\n\n/**\n * Created by mdresvyankin on 09.10.16.\n */\n\n'use strict';\n(function() {\n angular.module('khFrontend.ecg.fileUpload').controller('fileUpload', fileUpload);\n\n /** @ngInject */\n function fileUpload(\n ecg,\n FileUploader,\n APIHOST,\n authorization,\n $q,\n $scope,\n $rootScope,\n $uibModalStack,\n ModalFactory,\n ModalService,\n RecorderService,\n md5\n ) {\n var vm = this;\n var zip = new JSZip();\n var readyToProcess = 0;\n var percentWatch = '';\n\n vm.percent = vm.determine = 0;\n vm.recorder = RecorderService.recorder.recorderInfo;\n vm.fileset = vm.recorder.fileset;\n vm.hqMode = 1;\n\n $scope.$watch(ecg.toUpdateEcgPatientData, function(newValue, oldValue) {\n ecg.toUpdateEcgPatientData = newValue;\n });\n\n $scope.$watch(\n RecorderService.recorder,\n function(newValue, oldValue) {\n if (angular.equals(newValue, oldValue)) {\n return; // simply skip that\n } else {\n vm.fileset = newValue.recorderInfo.fileset;\n }\n },\n true\n );\n\n vm.uploader = new FileUploader({\n queueLimit: 5,\n autoUpload: false,\n skipEmptyFiles: false\n });\n\n vm.zipUploader = new FileUploader({\n url: APIHOST + '/v1/ecg/upload',\n headers: {\n Authorization: 'Bearer ' + authorization.token\n },\n queueLimit: 1,\n autoUpload: false,\n method: 'POST',\n alias: 'UploadForm[files]',\n formData: []\n });\n\n function setPercent(metadata) {\n if (angular.isDefined(metadata)) {\n if (metadata.percent < 100) {\n vm.determine = metadata.percent - vm.percent;\n vm.percent = metadata;\n return metadata;\n }\n }\n }\n\n function createZip(files) {\n vm.uploader.destroy();\n var sortedFiles = _.sortBy(files, [\n function(o) {\n return o.file.name;\n }\n ]);\n var arrayOfPromices = [];\n angular.forEach(sortedFiles, function(file, key) {\n arrayOfPromices.push(vm.getHash(file._file));\n });\n return $q\n .all(arrayOfPromices)\n .then(function(result) {\n vm.hash = '';\n vm.hash = result.join(\"\");\n angular.forEach(sortedFiles, function(file, key) {\n zip.file(file._file.name, file._file, {\n binary: true\n });\n });\n })\n .then(function() {\n return zip\n .generateAsync(\n {\n type: 'blob',\n compression: 'DEFLATE',\n compressionOptions: {\n level: 5\n }\n },\n function updateCallback(metadata) {\n percentWatch = $scope.$watch(metadata, setPercent);\n setPercent(metadata);\n }\n )\n .then(function(content) {\n percentWatch();\n readyToProcess = 1;\n arrayOfPromices = [];\n return content;\n });\n });\n }\n\n vm.uploader.onAfterAddingFile = function(fileItem) {};\n\n vm.uploader.onWhenAddingFileFailed = function(item, filter, options) {\n if (item.size === 0) {\n var arrayIndex = vm.fileset.indexOf(item.name) > -1 ? vm.fileset.indexOf(item.name) : vm.fileset.indexOf(item.name.substr(2));\n if (arrayIndex >= 0) {\n vm.fileset.splice(arrayIndex, 1);\n }\n }\n };\n\n\n vm.getFileHash = function(blobData) {\n var hash;\n var fr = new FileReader();\n return new Promise(function(resolve, reject) {\n fr.onloadend = function(evt) {\n hash = md5.createHash(evt.target.result);\n resolve(hash);\n };\n try {\n fr.readAsDataURL(blobData);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n vm.getHash = function(blobData) {\n var arrayOfHashedFiles = [vm.getFileHash(blobData.slice(0,100000))];\n if (blobData.size > 100000) {\n arrayOfHashedFiles.push(vm.getFileHash(blobData.slice(blobData.size - 100000, blobData.size)));\n }\n return $q.all(arrayOfHashedFiles).then(function(res) {\n return res.join(\"\");\n }).catch(function(e) {\n console.error(e)\n })\n };\n\n vm.zipUploader.onAfterAddingFile = function(fileItem) {};\n\n vm.uploader.onAfterAddingAll = function(addedFileItems) {\n // Проверяем совпадают ли имена файлов с нужными\n angular.forEach(addedFileItems, function(value, key) {\n if (vm.fileset.indexOf(value._file.name) >= 0 || vm.fileset.indexOf(value._file.name.slice(2)) >= 0) {\n if (value._file.name.slice(0, 2) === 'HQ') vm.hqMode = 2;\n } else {\n vm.uploader.removeFromQueue(value);\n }\n });\n /*Если суммарное колличество файлов, прошедших проверку совпадает\n * с тем, что возвращется */\n if (vm.uploader.queue.length === vm.fileset.length) {\n /*Посылаем события изменения данных пациента*/\n $rootScope.$broadcast('patchPatient');\n $rootScope.$on('patientCreated', function(res, data) {\n vm.patient = data;\n $q.when(createZip(vm.uploader.queue)).then(function(content) {\n if (readyToProcess == 1) {\n var file = new File([content], 'ecg1.zip');\n vm.zipUploader.formData.push({\n mode: vm.hqMode,\n patient_id: vm.patient.id,\n md5: vm.hash\n });\n vm.zipUploader.addToQueue(file);\n vm.zipUploader.uploadAll();\n return true;\n }\n });\n });\n } else {\n // Если файлы не все, чистим очередь, выдаем информацию\n vm.uploader.clearQueue();\n vm.new_modal = ModalFactory.open(ModalService.openModalWindow('confirm'), {\n header: 'Оберіть усі файли!!!',\n body:\n 'Будь ласка, одночасно виберіть всі файли запису з реєстратора ' +\n vm.recorder.name +\n '. Декілька файлів одночасно можна вибрати затиснувши Ctrl.',\n accept: '',\n refuse: 'OK',\n refuseClass: 'btn-orange',\n acceptClass: ''\n });\n }\n };\n\n vm.zipUploader.onProgressAll = function(progress) {\n ModalService.process = progress;\n };\n vm.zipUploader.onCompleteItem = function(fileItem, response, status, headers) {};\n vm.zipUploader.onErrorItem = function(item, response, status, headers) {\n vm.new_modal = ModalFactory.open(ModalService.openModalWindow('confirm'), {\n header: 'ПОМИЛКА!!!',\n body: response.errors,\n accept: '',\n refuse: 'OK',\n refuseClass: 'btn-orange',\n acceptClass: ''\n });\n vm.new_modal.result.then(function() {\n $uibModalStack.dismissAll();\n });\n };\n vm.zipUploader.onSuccessItem = function(item, response, status, headers) {\n /* Вызываем собитие по патчу данных созданного ЭКГ\n * из контроллера пациентов */\n angular.extend(\n {\n updateData: response.data\n },\n ecg.toUpdateEcgPatientData\n );\n ecg.toUpdateEcgPatientData.updateData = response.data;\n $rootScope.$emit('updateEcg', ecg.toUpdateEcgPatientData);\n };\n }\n})();\n\n/**\n * Functions to get ECG DATA\n */\n(function () {\n 'use strict';\n angular\n .module('khFrontend.ecg')\n .service('ecgComments', ecgComments);\n\n function ecgComments($http, $log, APIHOST, authorization) {\n var token = authorization.token;\n var toSend = {\n method: 'GET',\n url: APIHOST,\n headers: {\n \"Authorization\": \"Bearer \" + token\n }\n };\n\n // Get All ECG DATA\n this.getEcgComment = function (ecgId) {\n toSend.method = 'GET';\n toSend.url = APIHOST + \"/v1/ecg-comments?EcgCommentSearch[ecg_id]=\"+ecgId+\"&expand=user\";\n return $http(toSend).then(function(response) {\n return response.data.items;\n });\n };\n\n }\n})();\n/**\n * Created by mdresvyankin on 16.09.16.\n */\n/**\n * Functions to get ECG DATA\n */\n(function () {\n 'use strict';\n angular\n .module('khFrontend.ecg')\n .controller('EcgCommentsController', EcgCommentsController);\n\n /** @ngInject */\n function EcgCommentsController($q, $scope, $rootScope, $log, ecgComments, _) {\n var vm = this;\n vm.getEcgComments = getEcgComments;\n\n function getEcgComments(id) {\n return ecgComments.getEcgComment(id).then(function(response) {\n vm.comments = response;\n });\n }\n }\n})();\n/**\n * Functions to get ECG DATA\n */\n(function () {\n \"use strict\";\n angular.module(\"khFrontend.ecg\").service(\"ecg\", ecg);\n\n function ecg($http, APIHOST, authorization, UrgentHours, ECG_PER_PAGE, _, rx, moment) {\n var vm = this;\n var now = new Date();\n var today = new Date(now.getFullYear(), now.getMonth(), now.getDay());\n var month = moment(new Date(now.getFullYear(), now.getMonth(), 1)).unix();\n var year = moment(new Date(now.getFullYear(), 0, 1)).unix();\n var token = authorization.token;\n this.toUpdateEcgPatientData = {};\n var toSend = {\n method: \"GET\",\n url: APIHOST,\n headers: {\n Authorization: \"Bearer \" + token\n }\n };\n\n var getEcgById = function (id) {\n toSend.method = \"GET\";\n toSend.url =\n APIHOST +\n \"/v1/ecgs/\" +\n id +\n \"?expand=customer,ecgData,patient,supervisor,user,report&checkAccess=off\";\n return $http(toSend).then(function (response) {\n return response.data;\n });\n };\n\n this.getEcgById = getEcgById;\n\n /* Function that returns observerble with statistic data for supervisor and admin */\n vm.ecgSort = rx.Observable.create(function (statisticData) {\n var result = {};\n var dataCount = {};\n result.sortInStatuses = [];\n var getEcgCount = rx.Observable.create(function (observer) {\n observer.next([rx.Observable.fromPromise(vm.getPaginatedEcgInfo(1).getAllEcg(1)), 's0'])\n _.each([1, 2, 3, 4, 5, 6], function (value, key) {\n observer.next([rx.Observable.fromPromise(vm.getPaginatedEcgInfo(1).getEcgInStatus(value, 1)), 's' + value])\n });\n observer.next([rx.Observable.fromPromise(vm.getPaginatedEcgInfo(1).getUrgentEcg(1)), 'urgent']);\n observer.next([rx.Observable.fromPromise(vm.getPaginatedEcgInfo(1).getDangerEcg(1, 7200)), 'danger']);\n observer.next([rx.Observable.fromPromise(vm.getPaginatedEcgInfo(1).getDangerEcg(1, 0)), 'faled']);\n observer.next([rx.Observable.fromPromise(vm.getPaginatedEcgInfo(1).getDangerUrgentEcg(1, 0)), 'dangerUrgent']);\n });\n\n getEcgCount.take(11).subscribe(function (resObs) {\n resObs[0].map(function (res) {\n return res.data._meta.totalCount\n }).subscribe(function (result) {\n dataCount[resObs[1]] = result;\n });\n })\n\n statisticData.next(dataCount);\n });\n\n /* New block for get paginated ecg */\n this.getPaginatedEcgInfo = function (perPage) {\n if (angular.isUndefined(perPage)) {\n perPage = ECG_PER_PAGE;\n }\n var ecgVM = this;\n ecgVM.toSend = {\n method: \"GET\",\n headers: {\n Authorization: \"Bearer \" + token\n }\n };\n\n ecgVM.baseUrl = APIHOST + \"/v1/ecgs/all?expand=customer,ecgData,patient,supervisor,user,report&sort=-id&limit=\" + perPage;\n\n /* Get all ECG */\n ecgVM.getAllEcg = function (page) {\n var url = ecgVM.baseUrl + '&page=' + page;\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n };\n\n /* Get ECG By Date */\n ecgVM.getEcgByDate = function (page, timestamp, searchString) {\n timestamp = (timestamp === 'month') ? month : (timestamp === 'year') ? year : '';\n var dateFilter = (timestamp !== undefined || timestamp !== \"\") ? '&EcgSearch[created_at]=>=' + [timestamp] : '';\n var searchFilter = (searchString !== undefined || searchString !== \"\") ? '&EcgSearch[search]=' + searchString : ''\n var url = ecgVM.baseUrl + '&page=' + page + dateFilter + searchFilter;\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n }\n\n /* Get page of ecg in status or statuses\n status can be int or list of int 1,2,3\n */\n ecgVM.getEcgInStatus = function (status, page) {\n var url = ecgVM.baseUrl + '&page=' + page + '&EcgSearch[status]=' + status;\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n };\n\n ecgVM.getTodaysEcg = function (page) {\n var url = ecgVM.baseUrl + '&page=' + page + '&EcgSearch[todays]=1';\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n };\n\n ecgVM.getUrgentEcg = function (page) {\n var url = ecgVM.baseUrl + '&page=' + page + '&EcgSearch[urgent_markup]=1';\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n }\n\n ecgVM.getDangerEcg = function (page, term) {\n now = moment().unix();\n var url = ecgVM.baseUrl + '&page=' + page + '&EcgSearch[deadline]=>=' + (now + term);\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n }\n\n ecgVM.getDangerUrgentEcg = function (page, term) {\n now = moment().unix();\n var url = ecgVM.baseUrl + '&page=' + page + '&EcgSearch[deadline]=>=' + (now + term) + '&EcgSearch[urgent_markup]=1';\n return $http({\n method: ecgVM.toSend.method,\n headers: ecgVM.toSend.headers,\n url: url\n })\n }\n\n return ecgVM;\n };\n\n\n var ecgInStatus = function (filter_obj, array) {\n if (angular.isNumber(filter_obj) && filter_obj > 0) {\n return _.filter(array, {\n status: filter_obj\n });\n } else if (angular.isDate(filter_obj)) {\n return _.filter(array, function (value) {\n return value.created_at > filter_obj / 1000;\n });\n } else return array;\n };\n\n // Смена оператора\n this.changeEcg = function (ecgID, userId) {\n toSend.url = APIHOST + \"/v1/ecgs/\" + ecgID;\n toSend.method = \"PATCH\";\n toSend.data = {\n user_id: userId\n };\n return $http(toSend);\n };\n\n this.changeEcgUserStatus = function (ecgID, userId, status) {\n toSend.url = APIHOST + \"/v1/ecgs/\" + ecgID;\n toSend.method = \"PATCH\";\n toSend.data = {\n user_id: userId,\n status: status\n };\n return $http(toSend).then(function (response) {\n return response.data;\n });\n };\n\n // List OF ECG STATUSES;\n var ecgStatusList = function () {\n toSend.url = APIHOST + \"/v1/ecgs/status\";\n toSend.method = \"GET\";\n return $http(toSend).then(function (response) {\n return response.data.items;\n });\n };\n\n this.ecgStatusList = ecgStatusList;\n\n // Change ECG data\n this.changeEcgStatus = function (data) {\n toSend.url =\n APIHOST +\n \"/v1/ecgs/\" +\n data.ecgId +\n \"?expand=customer,ecgData,patient,supervisor,user\";\n toSend.method = \"PATCH\";\n toSend.data = data;\n return $http(toSend);\n };\n\n // Statistic\n\n var ecgStatisticObject = {\n toSend: {\n method: \"GET\",\n headers: {\n Authorization: \"Bearer \" + token\n }\n },\n month: function () {\n ecgStatisticObject.toSend.url = APIHOST + \"/v1/ecgs/statistics/month\";\n return $http(ecgStatisticObject.toSend).then(function (response) {\n return response;\n });\n },\n all: function () {\n ecgStatisticObject.toSend.url = APIHOST + \"/v1/ecgs/statistics/all\";\n return $http(ecgStatisticObject.toSend).then(function (response) {\n return response;\n });\n }\n };\n\n this.ecgStatistic = ecgStatisticObject;\n\n this.fixDate = function (date, isUrgent) {\n var uploadDate = new Date(date);\n if (isUrgent == 1) {\n return uploadDate.setHours(uploadDate.getHours() + UrgentHours);\n }\n return uploadDate.setDate(uploadDate.getDate() + 1);\n };\n\n this.deleteEcg = function (id) {\n var toSend = {\n method: \"DELETE\",\n url: APIHOST + \"/v1/ecgs/\" + id,\n headers: {\n Authorization: \"Bearer \" + token\n }\n };\n return $http(toSend);\n };\n\n this.uploadEcg = function (file) {\n file.name = \"ecg.zip\";\n var formData = new FormData();\n formData.append(\"UploadForm[files]\", file, \"ecg.zip\");\n var toSend = {\n method: \"POST\",\n url: APIHOST + \"/v1/ecg/upload\",\n headers: {\n Authorization: \"Bearer \" + token,\n \"Content-Type\": undefined\n },\n transformRequest: function () {\n return formData;\n }\n };\n return $http(toSend);\n };\n }\n})();\n\n/**\n * Created by mdresvyankin on 16.09.16.\n */\n/**\n * Functions to get ECG DATA\n */\n(function () {\n \"use strict\";\n angular\n .module(\"khFrontend.ecg\")\n .controller(\"EcgController\", EcgController)\n .filter(\"DateDay\", DateDay)\n .filter(\"startFrom\", startFrom)\n .filter(\"searchMainEcg\", searchMainEcg)\n .filter(\"getFilteredEcg\", getFilteredEcg);\n\n /** @ngInject */\n function EcgController(\n $q,\n $log,\n $scope,\n $rootScope,\n moment,\n ecg,\n _,\n $uibModal,\n $uibModalStack,\n ModalService,\n ModalFactory,\n ProfileService,\n PaymentStatisticService,\n ECG_PER_PAGE,\n rx\n ) {\n var currentMonth = moment(\n new Date(moment.utc().year() + \"-\" + (moment.utc().month() + 1))\n ).format(\"YYYY-MM\");\n\n var vm = this;\n vm.perPage = ECG_PER_PAGE;\n vm.ecgStatus = ecgStatus; //Список статусов ЕКГ\n vm.ecgInStatus = countEcgInStatus;\n vm.getEcgStatistic = getEcgStatistic;\n vm.makeEcgUrgent = makeEcgUrgent; // Сделать ЄКГ срочной\n vm.changeEcgStatus = changeEcgStatus; //Смена статуса и айдишника пользователя\n vm.changeEcgStatusOnly = changeEcgStatusOnly;\n vm.changeEcg = changeEcg; // Смена оператора\n vm.fixDate = fixDate; // Расчет времени конца анализа кардиограммы\n vm.ecgData = []; // Все данные для формирования основной таблицы\n vm.ecgStatistic = {};\n vm.openAdminEcgList = openAdminEcgList;\n vm.openVerification = openVerification;\n vm.deleteEcg = deleteEcg;\n /* new Block */\n vm.getPaginated = getPaginated;\n //\n vm.ecgPaginatedList = {};\n /* Profile */\n vm.profile = {}\n\n init();\n\n $scope.$watch(function (scope) {\n return scope.ecg.searchText\n }, function (newValue, oldValue) {\n if (angular.isDefined(newValue) && newValue.length === 0 && oldValue.length > 0) {\n if (vm.profile.role === 'customer') {\n vm.getPaginated().getAllEcg(1);\n }\n }\n });\n\n function init() {\n vm.searchText = '';\n // Запрашиваем список статусов и список ЄКГ\n ProfileService.userProfile().then(function (profile) {\n vm.profile = profile;\n if (profile.role !== \"customer\") {\n ecgStatusList().then(function () {\n countEcgInStatus();\n });\n }\n vm.getEcgStatistic();\n })\n }\n\n $scope.$on(\"changeEcgStatus\", function (event, data) {\n ecg.changeEcgStatus(data.modalData).then(function () {\n vm.modal.close();\n vm.getPaginated().getInStatus([1, 2, 3, 4, 5], vm.ecgPaginatedList.todays._meta.currentPage);\n vm.ecgInStatus();\n vm.init();\n });\n });\n\n /* New block of ECG manipulation */\n\n function setTotal(obj) {\n vm.totalItems = obj._meta.totalCount;\n }\n\n function getPaginated() {\n var vmGetPaginated = this;\n var ecgPaginated = ecg.getPaginatedEcgInfo();\n ecgStatusList();\n\n /* Получить все ЭКГ */\n vmGetPaginated.getAllEcg = function (page) {\n ecg.getPaginatedEcgInfo().getEcgByDate(page, 0, vm.searchText).then(function (resp) {\n vm.ecgPaginatedList[0] = resp.data;\n vm.pagination = vm.ecgPaginatedList[0]._meta;\n })\n return vm.ecgPaginatedList[0];\n }\n\n /* Взять пагинированіе ЭКГ по статусу*/\n vmGetPaginated.getInStatus = function (statusNumber, page) {\n return ecgPaginated.getEcgInStatus(statusNumber, page).then(function (resp) {\n vm.ecgPaginatedList.todays = resp.data;\n vm.pagination = vm.ecgPaginatedList.todays._meta;;\n });\n };\n\n /* Список неготовых плюс готовых сегодня */\n vmGetPaginated.getTodaysEcg = function (page) {\n ecgPaginated.getTodaysEcg(page).then(function (resp) {\n vm.ecgPaginatedList.todays = resp.data;\n vm.pagination = vm.ecgPaginatedList.todays._meta;\n });\n return vm.ecgPaginatedList.todays;\n };\n\n return vmGetPaginated;\n }\n\n vm.getEcgForAdminAndSupervisor = function(page) {\n vm.getPaginated().getInStatus([1, 2, 3, 4, 5], page);\n setInterval(function() {\n vm.getPaginated().getInStatus([1, 2, 3, 4, 5], vm.ecgPaginatedList.todays._meta.currentPage);\n }, 40000);\n }\n\n /* End new block of ECG manipulations */\n\n function ecgStatusList() {\n return ecg.ecgStatusList().then(function (response) {\n vm.ecgStatusList = response;\n });\n }\n\n function changeEcg(ecgId, operator) {\n vm.change_modal = ModalFactory.open(\n ModalService.openModalWindow(\"confirm\"), {\n headerPrefix: '',\n headerSuffix: '',\n header: \"You want to change operator\",\n body: \"Are you sure that you want to do this?\",\n accept: \"Yes\",\n refuse: \"Cancel\",\n refuseClass: \"btn-orange\",\n acceptClass: \"\",\n ecgID: ecgId\n }\n );\n vm.change_modal.result.then(function (confirmData) {\n rx.Observable.fromPromise(ecg.getEcgById(ecgId)).subscribe(function (res) {\n if (confirmData.result) {\n ecg.changeEcgUserStatus(ecgId, operator, 2)\n .then(function () {\n vm.getPaginated().getInStatus([1, 2, 3, 4, 5], vm.ecgPaginatedList.todays._meta.currentPage);\n })\n } else {\n vm.getPaginated().getInStatus([1, 2, 3, 4, 5], vm.ecgPaginatedList.todays._meta.currentPage);\n }\n })\n })\n }\n\n function makeEcgUrgent(ecgId) {\n vm.urgent_modal = ModalFactory.open(\n ModalService.openModalWindow(\"confirm\"), {\n headerPrefix: '',\n headerSuffix: '',\n header: \"You want to make ECG urgent\",\n body: \"Are you sure that you want to do this?\",\n accept: \"Yes\",\n refuse: \"Cancel\",\n refuseClass: \"btn-orange\",\n acceptClass: \"\"\n }\n );\n vm.urgent_modal.result.then(function (r) {\n if (r.result) {\n var data = {\n ecgId: ecgId,\n urgent_markup: 1\n };\n ecg.changeEcgStatus(data).then(function () {\n vm.getPaginated().getAllEcg(vm.ecgPaginatedList[0]._meta.currentPage)\n });\n } else {\n var index = _.findIndex(vm.ecgPaginatedList[0].items, {\n id: ecgId\n });\n vm.ecgPaginatedList[0].items[index].urgent_markup = 0;\n }\n });\n }\n\n function changeEcgStatusOnly(ecgId, status) {\n var key = _.findIndex(vm.ecgData, function (object) {\n return object.id == ecgId;\n });\n var data = {};\n data.status = status;\n data.ecgId = ecgId;\n ecg.changeEcgStatus(data).then(function (response) {\n vm.sortInStatuses[0][key] = response.data;\n });\n }\n\n function changeEcgStatus(ecgId, status, profile) {\n var key = _.findIndex(vm.ecgData, function (object) {\n return object.id == ecgId;\n });\n var data = {};\n data.status = status;\n data.ecgId = ecgId;\n data.supervisor_id = profile.id;\n ecg.changeEcgStatus(data).then(function (response) {\n vm.sortInStatuses[0][key] = response.data;\n vm.sortInStatuses[0][key].supervisor_id = profile.id;\n vm.sortInStatuses[0].supervisor = profile;\n });\n }\n\n function ecgStatus(id) {\n return vm.ecgStatusList.filter(function (status) {\n return status.id == id;\n });\n }\n\n // Сортировка ЭКГ в зависимости от статуса\n // TODO: дописать с параметром время.\n function countEcgInStatus() {\n ecg.ecgSort.subscribe(function (response) {\n vm.sortInStatuses = response;\n });\n }\n\n // Расчет времени окончания проверки ЭКГ\n function fixDate(date, isUrgent) {\n return ecg.fixDate(date, isUrgent);\n }\n\n // Create patient using events\n var updateEcgEvent = $rootScope.$on(\"updateEcg\", function (event, data) {\n if (data) {\n var pushit = {\n patient_id: data.modalData.patient.id,\n customer_id: data.updateData.ecg.customer_id\n };\n if (_.keys(data.updateData).length > 0) {\n pushit.ecgId = data.updateData.ecg.id;\n }\n if (angular.isDefined(data.modalData.ecg)) {\n pushit.urgent_markup = angular.isDefined(\n data.modalData.ecg.urgent_markup\n ) ?\n data.modalData.ecg.urgent_markup :\n 0;\n pushit.remarks = angular.isDefined(data.modalData.ecg.remarks) ?\n data.modalData.ecg.remarks :\n \"\";\n }\n ecg.changeEcgStatus(pushit).then(function () {\n data.modalData.alerts = [];\n data.modalData.alerts.push({\n type: \"success\",\n msg: \"ECG Uploaded\"\n });\n $rootScope.$broadcast(\"UpdateEcgData\", true);\n });\n }\n });\n\n function getEcgStatistic() {\n if (vm.profile.role === 'customer') {\n PaymentStatisticService.getSelfCustomerStatistic().then(function (response) {\n console.log('here');\n vm.ecgStatistic.month = PaymentStatisticService.getSelfMonthStatistic(response.data.data[currentMonth]);\n });\n }\n ecg.ecgStatistic.all().then(function (response) {\n vm.ecgStatistic.all = response.data;\n });\n }\n\n // Open Admin Ecg List\n function openAdminEcgList(modalname, ecgParam) {\n var data = {};\n data.ecgParam = ecgParam ? ecgParam : 0;\n data.ecg = {};\n data.ecg = vm.sortInStatuses;\n data.statuses = vm.ecgStatusList;\n data.params = {\n currentPage: 0,\n pageSize: 25,\n delete: deleteEcg\n };\n vm.modal = $uibModal.open(ModalService.openModalWindow(modalname, data));\n }\n\n // Open Verification modal\n function openVerification(modalname, ecgParam) {\n ecgParam.changeEcgStatusOnly = vm.changeEcgStatusOnly;\n vm.modal = $uibModal.open(\n ModalService.openModalWindow(modalname, ecgParam)\n );\n }\n\n // Function to remove specific ECG from array of objects\n function removeFromArray(id) {\n var a = Object.keys(vm.sortInStatuses);\n angular.forEach(a, function (arr) {\n arr = arr.length < 2 ? parseInt(arr) : arr;\n var index = _.findIndex(vm.sortInStatuses[arr], function (o) {\n return o.id == id;\n });\n if (index != -1) {\n vm.sortInStatuses[arr].splice(index, 1);\n }\n });\n }\n\n // DeleteEcg\n function deleteEcg(id) {\n ecg.deleteEcg(id).then(function () {\n removeFromArray(id);\n });\n }\n\n var onUpdateEcgData = $scope.$on('UpdateEcgData', function () {\n vm.getPaginated().getAllEcg(1);\n })\n\n $scope.$on(\"destroy\", updateEcgEvent);\n }\n\n /** @ngInject */\n function DateDay() {\n return function (x) {\n return Math.floor(Math.abs(x) / 86400);\n };\n }\n\n /** @ngInject */\n function startFrom() {\n return function (input, start) {\n if (angular.isDefined(input)) {\n start = +start;\n return start != undefined ? input.slice(start) : undefined;\n }\n };\n }\n\n /*TODO: Remove it after getFilteredEcg will be approved*/\n\n function searchMainEcg(_) {\n return function (value, searchText) {\n var reg = new RegExp(searchText, \"i\");\n return _.filter(value, function (o) {\n if (o.patient != null && angular.isDefined(o.patient.name)) {\n var result = (o.patient.name +\n \" \" +\n o.patient.surname +\n \" \" +\n o.patient.phone\n ).search(reg);\n return result > -1;\n }\n });\n };\n }\n\n /* Get Filtered ECG in Customer list of ecg*/\n function getFilteredEcg(_, $log) {\n return function (value, filtertext) {\n var filtered = [];\n if (angular.isDefined(filtertext)) {\n // Filter all object\n var filterArray = filtertext.split(/\\s+/);\n _.filter(value, function (o) {\n var result = 0;\n if (angular.isDefined(o.patient)) {\n filterArray.forEach(function (elem) {\n var regexp = new RegExp(elem, \"i\");\n result =\n JSON.stringify(o.patient).search(regexp) > -1 ?\n result + 1 :\n result - 100;\n if (result === filterArray.length) {\n filtered.push(o);\n }\n });\n }\n });\n return filtered;\n } else {\n return value;\n }\n };\n }\n})();\n\n/**\n * Created by mdresvyankin on 01.08.16.\n *\n * Check if there is any http pending request '$http.pendingRequests.length > 0'\n * If any pending request set isLoading = true;\n * Use $watch to check the value of isLoading\n * If true show otherwise hide\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('spinner', spinner);\n\n /** @ngInject */\n function spinner($http) {\n return {\n restrict: 'A',\n link: function (scope, elm, attrs) {\n scope.isLoading = function () {\n return $http.pendingRequests.length > 0;\n };\n scope.$watch(scope.isLoading, function (v) {\n if (v) {\n elm.show();\n } else {\n elm.hide();\n }\n });\n }\n }\n }\n})();\n/**\n * Created by mdresvyankin on 26.07.16.\n * Check if the passwords the same\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('navigateBlock', navigateBlock);\n\n /** @ngInject */\n function navigateBlock($timeout) {\n return {\n scope: {\n showSearch: '=',\n patientData: '='\n },\n link: function (scope, elem) {\n var counter = -1;\n elem.on('keydown', function (evt) {\n if(scope.patientData.id) delete(scope.patientData.id);\n scope.showSearch = true;\n // List of li\n var searchFilter = angular.element('.search-filter').children();\n angular.element('.modal').on('click',function () {\n scope.showSearch = false;\n angular.element('.search-filter').remove();\n });\n\n angular.element('.search-filter').on('hover',function () {\n scope.showSearch = true;\n });\n // Bind click events on all li elements\n angular.forEach(searchFilter, function (li) {\n angular.element(li).bind('click', function() {\n angular.element('.modal').scope().modal.data.patient = angular.copy(angular.element(this).scope().patient);\n counter = -1;\n scope.showSearch = false;\n })\n });\n //Remove focus mark from element\n angular.forEach(searchFilter, function (li) {\n angular.element(li).removeClass('focused');\n });\n\n evt = evt || elem.event;\n switch (evt.keyCode) {\n case 38:\n if (counter > 0) counter = counter - 1;\n searchFilter.eq(counter).addClass('focused');\n break;\n case 40:\n if (counter < searchFilter.length - 1) counter = counter + 1;\n searchFilter.eq(counter).addClass('focused');\n break;\n case 13:\n $timeout(function () {\n angular.element(searchFilter.eq(counter)).triggerHandler('click');\n }, 0);\n break;\n case 9:\n scope.showSearch = false;\n break;\n default:\n counter = -1;\n break;\n }\n });\n }\n }\n }\n})();\n/**\n * Created by mdresvyankin on 27.01.17.\n */\n/**\n * Created by mdresvyankin on 09.08.16.\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('modalHeader', textHeader);\n\n /** @ngInject */\n function textHeader() {\n return {\n restrict: 'A',\n // templateUrl: '/app/directives/modalHeader.html',\n template: '
' +\n '

' +\n ' ' +\n ' ' +\n ' ' +\n '

' +\n '
',\n replace: true,\n scope: {\n textHeader: '@',\n headerFlex: '@',\n textHeaderSuffix: '@',\n textHeaderPrefix: '@'\n }\n };\n }\n})();\n/**\n * Created by mdresvyankin on 09.08.16.\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('languageDetect', languageDetect);\n\n /** @ngInject */\n function languageDetect($log) {\n return {\n restrict: 'A',\n scope: {\n capsShow: \"=\",\n },\n link: function (scope, elem, attrs, ctrl) {\n // Get current input element\n var input = elem.find('input');\n // What we append to indicate language\n var capsContainer = '
';\n // What we append to indicate caps\n var capsIndicator = ' ';\n\n function languageDetect(param) {\n var toReturn = {};\n var letter = param[param.length - 1];\n // Is letter in caps?\n var capsRegexp = new RegExp('[A-Z,А-Я]$');\n var engRegexp = new RegExp('[A-Z,a-z]$');\n toReturn.capsShow = (capsRegexp.test(letter));\n toReturn.language = (engRegexp.test(letter)) ? 'ENG' : 'УКР';\n\n return toReturn;\n }\n\n input.on('focusin', function () {\n input.after(capsContainer)\n\n }).on('focusout', function () {\n elem.find('div.languageDetect').remove();\n });\n\n elem.find('input').on('keyup', function () {\n var testResult = languageDetect(this.value);\n var container = elem.find('div.languageDetect');\n container.html(testResult.language);\n if (testResult.capsShow == true) {\n container.html(container.html() + capsIndicator)\n }\n });\n }\n };\n }\n})();\n/**\n * Created by mdresvyankin on 25.09.16.\n */\n\n/*\n *\n * Directive for getting Bank Name by MFO\n * curl https://bank.gov.ua/files/RcuKru.arj -o temp.arj && arj e temp.arj\n * sqlite3-dbf RCUKRU.DBF | iconv -fCP866 | sed -r 's/Ў/І/g' | sed -r 's/ў/і/g' | sed -r 's/∙/ї/g' | sed -r 's/°/Ї/g' > mfo.sql\n * */\n(function () {\n 'use strict';\n\n angular\n .module('khFrontend.profile')\n .directive('getBank', getBank);\n\n /** @ngInject */\n function getBank(paymentService) {\n return {\n restrict: 'A',\n scope: {\n bank: \"=\"\n },\n link: function (scope, elem) {\n elem.on('keyup', function () {\n if (this.value > 100000) {\n paymentService.getBank(this.value).then(\n function (response) {\n try {\n scope.bank = response[0].shortname;\n } catch(err) {\n scope.bank = \"Такого банку не існує\"\n }\n }\n )\n }\n });\n }\n };\n }\n})();\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('disableE', disableE);\n\n /** @ngInject */\n function disableE() {\n return {\n link: function (scope, elem, attrs, ctrl) {\n elem.find(\".clearE\").on(\"keypress\", function (evt) {\n if (evt.which != 8 && evt.which != 0 && evt.which != 45 && (evt.which < 48 || evt.which > 57)) {\n evt.preventDefault();\n }\n })\n }\n }\n }\n})();\n\n/**\n * Created by mdresvyankin on 08.09.16.\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('khCustomScrollbar',customScrollbar);\n\n /** @ngInject */\n function customScrollbar($timeout) {\n return {\n restrict: 'A',\n link: function(scope, element) {\n $timeout(function() {\n element.mCustomScrollbar({\n axis: 'y',\n theme:\"inset-3\"\n });\n element.css({'max-height':window.innerHeight*0.65+'px'});\n });\n }\n };\n }\n})();\n/**\n * Created by mdresvyankin on 26.07.16.\n * Check if the passwords the same\n */\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .directive('pwCheck', pwCheck);\n\n /** @ngInject */\n function pwCheck() {\n return {\n require: 'ngModel',\n link: function (scope, elem, attrs, ctrl) {\n var firstPassword = '#' + attrs.pwCheck;\n elem.add(firstPassword).on('keyup', function () {\n scope.$apply(function () {\n if (elem.val().length > 3)\n ctrl.$setValidity('pwmatch', elem.val() === $(firstPassword).val());\n else {\n ctrl.$setValidity('pwmatch',false);\n }\n });\n });\n }\n }\n }\n})();\n/**\n * Created by mdresvyankin on 07.07.16.\n */\n(function() {\n 'use strict';\n angular\n .module('khFrontend.api',[]);\n})();\n/**\n * Created by mdresvyankin on 07.07.16.\n */\n(function() {\n 'use strict';\n angular\n .module('khFrontend.api')\n .factory('apiService', apiService);\n\n /** @ngInject */\n //TODO: модель с роутами апи\n function apiService() {\n var api = {\n self : '/v1',\n login: {\n self:'/login'\n },\n ecgs: {\n self: '/ecgs'\n }\n };\n return api;\n }\n})();\n(function() {\n 'use strict';\n\n angular\n .module('kindHeart')\n .run(runBlock);\n\n /** @ngInject */\n function runBlock() {\n }\n\n})();\n\n(function () {\n 'use strict';\n\n // Ignore credential checks for login module\n angular\n .module('khFrontend.login')\n .config(loginRouterConfig)\n\n angular\n .module('kindHeart')\n .config(routerConfig)\n .run(checkAllCredentials);\n\n angular\n .module('khFrontend.main')\n .config(mainRouterConfig)\n\n\n /** @ngInject */\n\n /* Hash restrictions\n 'admin' => '500019387696d8c3c3893d406fe32181',\n 'customer' => 'fb3f27d93d5032c4831430b0f45d090e',\n 'operator' => '215b9ee6e83f58b84d0807f9cc916f8e',\n 'supervisor' => 'd797c993d87da6256b902c438a7c61cd'\n * */\n function routerConfig($stateProvider, $urlRouterProvider) {\n $stateProvider\n .state('app', {\n url: \"/app\",\n template: '',\n abstract: true,\n });\n\n $urlRouterProvider.otherwise('/app/login');\n }\n\n function loginRouterConfig($stateProvider, $urlRouterProvider) {\n $stateProvider\n .state('app.login', {\n url: '/login',\n templateUrl: 'app/login/login.html',\n controller: 'LoginController',\n controllerAs: 'login',\n data: {\n bodyClasses: 'login'\n }\n })\n .state('app.policy', {\n url: '/policy',\n templateUrl: 'app/policy/policy.html',\n controller: 'PolicyController',\n controllerAs: 'policy',\n data: {\n bodyClasses: 'privacy'\n }\n })\n .state('app.reset', {\n url: '/reset/:resetToken',\n templateUrl: 'app/login/password_reset.html',\n controller: 'LoginController',\n controllerAs: 'login',\n data: {\n bodyClasses: 'login'\n }\n });\n\n $urlRouterProvider.otherwise('app.login');\n }\n\n function mainRouterConfig($stateProvider, $urlRouterProvider) {\n $stateProvider\n .state('app.home', {\n url: '/home',\n templateUrl: 'app/main/main.html',\n controller: 'MainController',\n controllerAs: 'main',\n data: {\n bodyClasses: 'main',\n roles: [\n '500019387696d8c3c3893d406fe32181',\n 'fb3f27d93d5032c4831430b0f45d090e',\n '215b9ee6e83f58b84d0807f9cc916f8e',\n 'd797c993d87da6256b902c438a7c61cd']\n },\n resolve: {\n // profile: function ($cookies, $http, APIHOST, $state) {\n // var token = $cookies.get('token');\n // if ($state.is('app.home')) {\n // return $http({\n // method: 'GET',\n // url: APIHOST + \"/v1/profile\",\n // headers: {\n // \"Authorization\": \"Bearer \" + token\n // }\n // }).then(function (response) {\n // return response.data.data;\n // });\n // }\n // }\n }\n })\n $urlRouterProvider.otherwise('app.home');\n }\n\n\n function checkAllCredentials($transitions, authorization, $state) {\n var startPage = 'app.login';\n var mainPage = 'app.home';\n $transitions.onBefore({ to: mainPage }, function (trans) {\n if (authorization.authenticated !== true) {\n $state.go(startPage);\n return;\n }\n authorization.checkTokenValid().then(function (result) {\n authorization.identity().then(\n function (response) {\n },\n function (error) {\n $state.go(startPage);\n });\n }, function (error1) {\n $state.go(startPage);\n });\n });\n }\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .controller('IndexController', IndexController);\n\n /** @ngInject */\n function IndexController($transitions) {\n var vm = this;\n // this'll be called on every state change in the app\n $transitions.onStart({}, function(trans) {\n trans.promise.then(function(data) {\n vm.bodyClasses = (data.data && data.data.bodyClasses) ? data.data.bodyClasses : 'default'\n })\n });\n }\n\n})();\n\n(function() {\n \"use strict\";\n\n angular\n .module(\"kindHeart\")\n .constant(\n \"APIHOST\",\n (function() {\n var hostnameArray = window.location.hostname.split(\".\");\n hostnameArray.reverse().push(\"back\");\n hostnameArray.reverse();\n return window.location.host.startsWith(\"localhost\")\n ? \"https://back.asdf.biz.ua\"\n : \"https://\" + hostnameArray.join(\".\");\n })()\n )\n .constant(\"UrgentHours\", 2)\n .constant(\"GENDERS\", [\n { id: 1, name: \"Male\" },\n { id: 2, name: \"Female\" }\n ])\n .constant(\"ECG_PER_PAGE\", 25)\n .constant('ROLES', {\n rolesList: {\n customer: 'customer',\n operator: 'operator',\n supervisor: 'supervisor',\n admin: 'admin',\n accountant: 'accountant'\n },\n viewPermitionList: {\n employeeView: function(role) {\n return ['admin', 'accountant', 'supervisor'].indexOf(role) > -1;\n },\n userView: function(role) {\n ['customer', 'operator'].indexOf(role) > -1;\n }\n },\n workerType: [\n {\n id: 1,\n name: \"Operator\"\n },\n {\n id: 2,\n name: \"Supervisor\"\n }\n ],\n customerType: [\n {\n id: 1,\n name: \"Private person\"\n },\n {\n id: 2,\n name: \"Entrepreneur\"\n },\n {\n id: 3,\n name: \"Company\"\n }\n ]\n });\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('kindHeart')\n .config(translate)\n .config(material)\n .config(mdDateConfig)\n .config(kill401);\n\n /** @ngInject */\n\n function translate($translateProvider) {\n $translateProvider.useStaticFilesLoader({\n prefix: '/app/locale/locale-',\n suffix: '.json'\n });\n $translateProvider.preferredLanguage('ua');\n $translateProvider.useSanitizeValueStrategy('');\n }\n\n function material($mdThemingProvider) {\n $mdThemingProvider.definePalette('imesc', {\n '50': '3270c4',\n '100': '3270c4',\n '200': '3270c4',\n '300': '3270c4',\n '400': '3270c4',\n '500': '3270c4',\n '600': '3270c4',\n '700': '3270c4',\n '800': '3270c4',\n '900': '3270c4',\n 'A100': '3270c4',\n 'A200': '3270c4',\n 'A400': '3270c4',\n 'A700': '3270c4',\n 'contrastDefaultColor': 'light', // whether, by default, text (contrast)\n // on this palette should be dark or light\n\n 'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default\n '200', '300', '400', 'A100'],\n 'contrastLightColors': undefined // could also specify this if default was 'dark'\n });\n\n $mdThemingProvider.definePalette('imesc-accent', {\n '50': 'e78700',\n '100': 'e78700',\n '200': 'e78700',\n '300': 'e78700',\n '400': 'e78700',\n '500': 'e78700',\n '600': 'e78700',\n '700': 'e78700',\n '800': 'e78700',\n '900': 'e78700',\n 'A100': 'e78700',\n 'A200': 'e78700',\n 'A400': 'e78700',\n 'A700': 'e78700',\n 'contrastDefaultColor': 'light', // whether, by default, text (contrast)\n // on this palette should be dark or light\n\n 'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default\n '200', '300', '400', 'A100'],\n 'contrastLightColors': undefined // could also specify this if default was 'dark'\n });\n\n $mdThemingProvider.theme('default')\n .primaryPalette('imesc')\n .accentPalette('imesc-accent')\n .warnPalette('red');\n\n $mdThemingProvider.theme('docs-dark')\n .primaryPalette('brown')\n .dark();\n }\n\n function mdDateConfig($mdDateLocaleProvider,moment) {\n // Example of a French localization.\n $mdDateLocaleProvider.months = ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'];\n $mdDateLocaleProvider.shortMonths = ['січ', 'лют', 'бер', 'кві', 'тра', 'чер', 'лип', 'сер', 'вер', 'жов', 'лис', 'гру'];\n $mdDateLocaleProvider.days = ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'пятниця', 'субота'];\n $mdDateLocaleProvider.shortDays = ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'];\n\n // Can change week display to start on Monday.\n $mdDateLocaleProvider.firstDayOfWeek = 1;\n\n // Optional.\n // $mdDateLocaleProvider.dates = [1, 2, 3, 4, 5, 6, ...];\n\n // Example uses moment.js to parse and format dates.\n $mdDateLocaleProvider.parseDate = function (dateString) {\n if (angular.isDefined(dateString)) {\n var m = moment(dateString, [\"DD.MM.YYYY\", \"DD-MM-YYYY\"]);\n return m.toDate();\n }\n };\n $mdDateLocaleProvider.formatDate = function(date) {\n if (angular.isDefined(date)) {\n return moment(new Date(date)).format('DD.MM.YYYY');\n } else {\n return null;\n }\n };\n\n // $mdDateLocaleProvider.monthHeaderFormatter = function(date) {\n // return myShortMonths[date.getMonth()] + ' ' + date.getFullYear();\n // };\n\n // In addition to date display, date components also need localized messages\n // for aria-labels for screen-reader users.\n\n // $mdDateLocaleProvider.weekNumberFormatter = function(weekNumber) {\n // return 'Semaine ' + weekNumber;\n // };\n\n $mdDateLocaleProvider.msgCalendar = 'Календар';\n $mdDateLocaleProvider.msgOpenCalendar = 'Відкрити календар';\n\n // You can also set when your calendar begins and ends.\n // $mdDateLocaleProvider.firstRenderableDate = new Date(1776, 6, 4);\n // $mdDateLocaleProvider.lastRenderableDate = new Date(2012, 11, 21);\n }\n\n function kill401($httpProvider) {\n $httpProvider.interceptors.push('httpRequestInterceptor401');\n }\n\n})();\n\nangular.module(\"kindHeart\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/login/login.html\",\"
{{ \\'ENTER_SYSTEM\\' | translate | uppercase }}
()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))@((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}])|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$/\\' name=login type=text placeholder=\\'{{ \\\"EMAIL\\\" | translate }}\\' required>
\");\n$templateCache.put(\"app/login/password_reset.html\",\"
{{ \\'RESET_PASSWORD\\' | translate | uppercase }}
\\\"Auth
\\\"Auth
{{ \\\"Passwords don\\'t match\\\" | translate }}.
© ТОВ \\\"ІМЕСК\\\"
\");\n$templateCache.put(\"app/main/main.html\",\"
Loading...
Loading...
Loading...
Loading...
Loading...
\");\n$templateCache.put(\"app/payment/customer-rates.html\",\"
Викуп
Лізінг
Оренда
Зберігання

{{\\\"Tariffs\\\" | translate }}, грн

1-4 ЕКГ/МІСЯЦЬ, грн.
5-9 ЕКГ/МІСЯЦЬ, грн.
10+ ЕКГ/МІСЯЦЬ, грн.
\");\n$templateCache.put(\"app/payment/workerRate.html\",\"

{{ \\'Verification\\' | translate }}

{{\\'Analise\\' | translate }}

\");\n$templateCache.put(\"app/policy/policy.html\",\"

Політика конфіденційності

Останнє оновлення: 25.02.2020

ТОВ «ІМЕСК» керує веб-сайтом https://load.holter.com.ua (\\\"Сайт\\\"). Ця сторінка інформує вас про нашу політику щодо збору, використання та розголошення особистої інформації, яку ми отримуємо від користувачів Сайту.

Ми використовуємо вашу особисту інформацію лише для надання та вдосконалення Сайту. Використовуючи Сайт, ви погоджуєтесь на збір та використання інформації відповідно до цієї політики.

Збір та використання інформації

Під час використання нашого веб-сайту ми можемо попросити надати нам певну особисту інформацію, яка може бути використана для зв’язку або ідентифікації вас. Персональна інформація може містити, але не обмежуючись вашим іменем (\\\"Особиста інформація\\\").

Дані журналу

Як і багато операторів сайту, ми збираємо інформацію, яку ваш браузер надсилає кожного разу, коли ви відвідуєте наш Сайт (\\\"Дані журналу\\\").

Ці дані журналу можуть включати інформацію, таку як Інтернет-протокол вашого комп\\'ютера (\\\"IP\\\"), тип браузера, версія браузера, сторінки нашого веб-сайту, який ви відвідуєте, час і дата вашого візиту, час перебування на цих сторінках та ін. статистика.

Зв\\'язок

Ми можемо використовувати Вашу особисту інформацію для зв’язку з вами.

Файли cookie

Файли cookie - це файли з невеликою кількістю даних, які можуть включати анонімний унікальний ідентифікатор. Файли cookie надсилаються у ваш браузер із веб-сайту та зберігаються на жорсткому диску вашого комп’ютера.

Як і багато сайтів, ми використовуємо «кукіз» для збору інформації. Ви можете доручити веб-переглядачу відмовитись від усіх файлів cookie або вказати, коли файл cookie надсилається. Однак якщо ви не приймаєте файли cookie, ви, можливо, не зможете використовувати деякі частини нашого Сайту.

Безпека

Безпека вашої особистої інформації важлива для нас, але пам’ятайте, що жоден спосіб передачі через Інтернет або метод електронного зберігання не є надійним на 100%. Хоча ми прагнемо використовувати комерційно прийнятні засоби для захисту вашої особистої інформації, ми не можемо гарантувати її абсолютну безпеку.

Зміни до цієї Політики конфіденційності

Ця Політика конфіденційності діє з 25.02.2020 р. Та залишатиметься в силі, за винятком будь-яких змін її положень у майбутньому, які діятимуть негайно після розміщення на цій сторінці.

Ми залишаємо за собою право оновлювати чи змінювати нашу Політику конфіденційності в будь-який час, і Ви повинні періодично перевіряти цю Політику конфіденційності. Ваше подальше використання Сервісу після того, як ми розмістимо будь-які зміни Політики конфіденційності на цій сторінці, буде вашим підтвердженням змін та вашою згодою дотримуватися та бути зв\\'язаною зміненою Політикою конфіденційності.

Якщо ми зробимо будь-які суттєві зміни до цієї Політики конфіденційності, ми повідомимо вас або через електронну адресу, яку ви нам надали, або розмістивши помітне повідомлення на нашому веб-сайті.

Зв\\'язок з нами

Якщо у вас є якісь питання щодо цієї Політики конфіденційності, будь ласка, зв\\'яжіться з нами:

електронною поштою: office@imesc.com
за телефоном: +380 44 5858251
поштою за адресою: 03110, м. Київ, вул. Волгоградська 9А, офіс 149

Ознайомлений

\");\n$templateCache.put(\"app/recorder/recorderButtons.html\",\"{{ \\\"Add recorder\\\" | translate | uppercase }} \");\n$templateCache.put(\"app/recorder/recorderDropdownInfo.html\",\"

{{\\\"Add recorder\\\" | translate}}

\");\n$templateCache.put(\"app/statistic/customer_statistic.html\",\"
{{\\'Місяць\\' | translate}}
24 год
кількість/вартість
24 год/терм
кількість/вартість
48 год
кількість/вартість
48 год/терм
кількість/вартість
72 год
кількість/вартість
72 год/терм
кількість/вартість
інше
лізінг/оренда

Загальна кількість

Сумма, грн.

{{month.month}}
{{month.statistic[\\'24\\'].normal.number}}/{{month.statistic[\\'24\\'].normal.sum}}
{{month.statistic[\\'24\\'].urgent.number}}/{{month.statistic[\\'24\\'].urgent.sum}}
{{month.statistic[\\'48\\'].normal.number}}/{{month.statistic[\\'48\\'].normal.sum}}
{{month.statistic[\\'48\\'].urgent.number}}/{{month.statistic[\\'48\\'].urgent.sum}}
{{month.statistic[\\'72\\'].normal.number}}/{{month.statistic[\\'72\\'].normal.sum}}
{{month.statistic[\\'72\\'].urgent.number}}/{{month.statistic[\\'72\\'].urgent.sum}}
{{month.statistic.lease_sum}}/{{month.statistic.rent_sum}}
{{month.outcomes.number}}
{{month.outcomes.money}}
\");\n$templateCache.put(\"app/statistic/operator_statistic.html\",\"
{{\\'Місяць\\' | translate}}
24 год
кількість/вартість
24 год/терм
кількість/вартість
48 год
кількість/вартість
48 год/терм
кількість/вартість
72 год
кількість/вартість
72 год/терм
кількість/вартість

Загальна кількість

Сумма, грн.

{{month.month}}
{{month.statistic[\\'24\\'].normal.number}}/{{month.statistic[\\'24\\'].normal.sum}}
{{month.statistic[\\'24\\'].urgent.number}}/{{month.statistic[\\'24\\'].urgent.sum}}
{{month.statistic[\\'48\\'].normal.number}}/{{month.statistic[\\'48\\'].normal.sum}}
{{month.statistic[\\'48\\'].urgent.number}}/{{month.statistic[\\'48\\'].urgent.sum}}
{{month.statistic[\\'72\\'].normal.number}}/{{month.statistic[\\'72\\'].normal.sum}}
{{month.statistic[\\'72\\'].urgent.number}}/{{month.statistic[\\'72\\'].urgent.sum}}
{{month.outcomes.number}}
{{month.outcomes.money}}
\");\n$templateCache.put(\"app/statistic/supervisor_statistic.html\",\"
{{\\'Місяць\\' | translate}}
24 год. аналіз
кількість(терм)/вартість
24 год. верифікація
кількість(терм)/вартість
48 год. аналіз
кількість(терм)/вартість
48 год. верифікація
кількість(терм)/вартість
72 год. аналіз
кількість(терм)/вартість
72 год. верифікація
кількість(терм)/вартість

Загальна кількість

аналіз/верифікація

Сумма, грн.

{{month}}
{{$ctrl.reformatedStatistic[month].h24o.count + $ctrl.reformatedStatistic[month].h24o.countU}} ({{$ctrl.reformatedStatistic[month].h24o.countU}})/{{$ctrl.reformatedStatistic[month].h24o.sumMoney}}
{{$ctrl.reformatedStatistic[month].h24s.count + $ctrl.reformatedStatistic[month].h24s.countU}} ({{$ctrl.reformatedStatistic[month].h24s.countU}})/{{$ctrl.reformatedStatistic[month].h24s.sumMoney}}
{{$ctrl.reformatedStatistic[month].h48o.count + $ctrl.reformatedStatistic[month].h48o.countU}} ({{$ctrl.reformatedStatistic[month].h48o.countU}})/{{$ctrl.reformatedStatistic[month].h48o.sumMoney}}
{{$ctrl.reformatedStatistic[month].h48s.count + $ctrl.reformatedStatistic[month].h48s.countU}} ({{$ctrl.reformatedStatistic[month].h48s.countU}})/{{$ctrl.reformatedStatistic[month].h48s.sumMoney}}
{{$ctrl.reformatedStatistic[month].h72o.count + $ctrl.reformatedStatistic[month].h72o.countU}} ({{$ctrl.reformatedStatistic[month].h72o.countU}})/{{$ctrl.reformatedStatistic[month].h72o.sumMoney}}
{{$ctrl.reformatedStatistic[month].h72s.count+$ctrl.reformatedStatistic[month].h72s.countU}} ({{$ctrl.reformatedStatistic[month].h72s.countU}})/{{$ctrl.reformatedStatistic[month].h72s.sumMoney}}
{{$ctrl.reformatedStatistic[month].totals.totalO}}/{{$ctrl.reformatedStatistic[month].totals.totalS}}
{{$ctrl.reformatedStatistic[month].totals.totalMoneyO+$ctrl.reformatedStatistic[month].totals.totalMoneyS}}
\");\n$templateCache.put(\"app/profile/customersList.html\",\"
\");\n$templateCache.put(\"app/profile/workerList.html\",\"
\");\n$templateCache.put(\"app/profile/workerListButton.html\",\"Всього: {{$ctrl.countActive[$ctrl.filterObject.role]}}\");\n$templateCache.put(\"app/main/tpl/dropdown_customer_tariffs.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_customers_stat_admin.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_pref.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_statistic.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_statistic_admin.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_statistic_user.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_tarifgrid.html\",\"\");\n$templateCache.put(\"app/main/tpl/dropdown_userinfo.html\",\"\");\n$templateCache.put(\"app/main/tpl/main_ecg_statistic_dashboard.html\",\"

{{\\\"Оператори\\\"|uppercase}}

{{\\\"Супервизори\\\"|uppercase}}

Онлайн: {{activity.activity.operator.online}}
Працюють: {{activity.activity.operator.worked}}
Очікують: {{activity.activity.operator.wait}}
Онлайн: {{activity.activity.supervisor.online}}
Працюють: {{activity.activity.supervisor.worked}}
Очікують: {{activity.activity.supervisor.wait}}
\");\n$templateCache.put(\"app/main/tpl/main_footer.html\",\"\");\n$templateCache.put(\"app/main/tpl/main_header.html\",\"
\\\"Kind
Loading...
Loading...
Loading...
Loading..
Loading...
Loading...
Loading...
Loading..
Loading...
Loading...
Loading...
Loading..
Loading...
Loading...
Loading...
Loading..
\");\n$templateCache.put(\"app/main/tpl/main_header_customer_rates.html\",\"
Тариф, грн.:

{{payment.selfRate[\\'h24\\']}}

24

/

{{payment.selfRate[\\'h48\\']}}

48

/

{{payment.selfRate[\\'h72\\']}}

72

{{payment.selfRate[\\'h24_1_4\\']}} = 5 && total < 10\\\">{{ payment.selfRate[\\'h24_5_9\\'] }} = 10\\\">{{ payment.selfRate[\\'h24_10\\'] }}

24

/

{{payment.selfRate[\\'h48_1_4\\']}} = 5 && total < 10\\\">{{ payment.selfRate[\\'h48_5_9\\'] }} = 10\\\">{{ payment.selfRate[\\'h48_10\\'] }}

48

/

{{payment.selfRate[\\'h72_1_4\\']}} = 5 && total < 10\\\">{{ payment.selfRate[\\'h72_5_9\\'] }} = 10\\\">{{ payment.selfRate[\\'h72_10\\'] }}

72

\");\n$templateCache.put(\"app/main/tpl/main_header_pref.html\",\"
\");\n$templateCache.put(\"app/main/tpl/main_header_rates.html\",\"
Тариф, грн.:
{{ main.profile.rates.supervisor.rate.h24 }}/{{ main.profile.rates.operator.rate.h24 }}
24
{{main.profile.rates.supervisor.rate.h48 }}/{{ main.profile.rates.operator.rate.h48 }}
48
{{main.profile.rates.supervisor.rate.h72 }}/{{ main.profile.rates.operator.rate.h72}}
72

{{ main.profile.rates.operator.rate.h24}}

24

{{ main.profile.rates.operator.rate.h48}}

48

{{ main.profile.rates.operator.rate.h72}}

72

\");\n$templateCache.put(\"app/main/tpl/main_header_statistics.html\",\"

{{\\\"Statistic\\\" | translate }}

\");\n$templateCache.put(\"app/main/tpl/main_header_user_statistic.html\",\"
{{\\\"Active in this month\\\" | translate}}
{{activity.activity.customer.total}}
{{activity.activity.customer.active}}
\");\n$templateCache.put(\"app/main/tpl/main_header_userinfo.html\",\"
{{main.profile.name | limitTo: 20 }} {{main.profile.surname | limitTo: 20 }}
{{main.profile.customer.company_name | limitTo: 80 }}
\");\n$templateCache.put(\"app/main/tpl/main_table.html\",\"
0\\\">{{((ecg.pagination.currentPage-1) * ecg.perPage) + 1}} - {{ (ecg.pagination.currentPage === ecg.pagination.pageCount) ? ecg.pagination.totalCount : ecg.pagination.currentPage * ecg.perPage}} з {{ecg.pagination.totalCount}}
Клієнт
ЕКГ
Тривалість ЕКГ
Статус
Оператор
Термін закінчення
\\\"User

{{ value.patient.surname }} {{ value.patient.name }}

{{ value.patient.gender.name | translate }} / {{ value.patient.dob | birthday }} років /{{ value.patient.nbg }}

{{ value.duration }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }} {{value.supervisor.name}} {{ value.supervisor.surname }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{value.supervisor.name}} {{ value.supervisor.surname}}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }}
{{ ecg.ecgStatus(value.status)[0].name }}
...
3) ? true : false\\\">
{{value.user.name | limitTo:10 }} {{ value.user.surname | limitTo:10}}
{{ value.terms.deadline * 1000 | date:\\'HH:mm yyyy-MM-dd\\'}}
7200 }\\\"> - 86400 || value.terms.leftToDeadline < -86400 \\\">{{ value.terms.leftToDeadline | DateDay }} {{ value.terms.leftToDeadline * 1000 | date:\\'HH:mm\\' }}
\");\n$templateCache.put(\"app/main/tpl/main_table_customer_dashboard.html\",\"

{{ \\\"Results\\\" | translate | uppercase }}

{{ \\\"Load ECG\\\" | translate | uppercase }}
2) ? ecg.getPaginated().getAllEcg(1) : return\\\" class=filter-ecg placeholder=\\\"шукати паціента\\\">
0\\\">{{((ecg.pagination.currentPage-1) * ecg.perPage) + 1}} - {{ (ecg.pagination.currentPage === ecg.pagination.pageCount) ? ecg.pagination.totalCount : ecg.pagination.currentPage * ecg.perPage}} з {{ecg.pagination.totalCount}}
     
    Очікується в {{ ::value.terms.deadline * 1000 | date:\\'HH:mm\\' }}
    {{ ::value.terms.deadline * 1000 | date:\\'dd.MM.yyyy\\'}}
    {{::value.duration}}
    {{::value.duration}}

    {{::value.patient.surname }} {{::value.patient.name }}

    {{::value.patient.gender.name | translate }} / {{ ::value.patient.dob | birthday }} років / {{ ::value.patient.nbg }}

    {{ ::value.created_at * 1000 | date:\\'HH:mm yyyy-MM-dd\\'}}
    {{ \\\"Make it urgent\\\" | translate }}
    \");\n$templateCache.put(\"app/main/tpl/main_table_operator_payments.html\",\"

    Оплата

    {{ \\\"Month\\\" | translate }}
    {{ \\\"Sum\\\" | translate }}
    {{ \\\"Was payed\\\" | translate }}
    {{ key | makeDate }}
    {{ value.cost }}
    \");\n$templateCache.put(\"app/main/tpl/main_table_stat.html\",\"

    {{\\\"ЕКГ\\\"|uppercase}}

    Всього
    {{ ecg.sortInStatuses.s0}} ( {{ecg.sortInStatuses.urgent}})
    В роботі
    {{ ecg.sortInStatuses.s3}}
    Очікує на аналіз
    {{ ecg.sortInStatuses.s2}}
    Очікує на веріфікацію
    {{ ecg.sortInStatuses.s4}}
    В зоні ризику
    {{ecg.sortInStatuses.danger}} ( {{ecg.sortInStatuses.dangerUrgent}})
    Проаналізовано
    {{ ecg.sortInStatuses.s6}}
    \");\n$templateCache.put(\"app/ecg/adminFullSearchList/adminFullList.html\",\"
    2) ? $ctrl.getEcg(1) : return \\\" class=filter-ecg placeholder=\\\"шукати паціента, тощо...\\\">
    0\\\">{{(($ctrl.pagination.currentPage-1) * $ctrl.pagination.perPage) + 1}} - {{ ($ctrl.pagination.currentPage === $ctrl.pagination.pageCount) ? $ctrl.pagination.totalCount : $ctrl.pagination.currentPage * $ctrl.pagination.perPage}} з {{$ctrl.pagination.totalCount}}
      ID
      Клієнт
       
      ЕКГ
      Тривалість ЕКГ
      Оператор
      Дата
      {{value.id}}

      {{value.patient.surname}} {{value.patient.name}}

      {{value.patient.gender.name | translate}} / {{ value.patient.dob | birthday }} років / {{ value.patient.nbg}}

      {{value.duration}}
      {{ value.created_at * 1000 | date:\\'yyyy-MM-dd\\': \\'Europe/Kiev\\' }}
      \");\n$templateCache.put(\"app/ecg/tpl/count_ecg.html\",\"
      В цьому місяці:

      {{ $ctrl.monthData.total }} ЕКГ

      Вартість:

      {{ $ctrl.monthData.price }} грн.

      В цьому місяці:

      {{ $ctrl.monthData.total.count ? $ctrl.monthData.total.count : 0 }} ЕКГ

      Всього:

      {{ $ctrl.allData.total.count ? $ctrl.allData.total.count : 0 }} ЕКГ

      В цьому місяці:

      {{ $ctrl.allData.month.count ? $ctrl.allData.month.count : 0 }} ЕКГ

      Всього:

      {{ $ctrl.allData.total ? $ctrl.allData.total : 0 }} ЕКГ

      В цьому місяці:

      {{$ctrl.monthData.supervisor[$ctrl.currentMonth].count ? $ctrl.monthData.supervisor[$ctrl.currentMonth].count : 0 }}/{{ $ctrl.monthData.operator[$ctrl.currentMonth].count ? $ctrl.monthData.operator[$ctrl.currentMonth].count : 0 }} ЕКГ

      Оплата:

      {{ ($ctrl.monthData.supervisor[$ctrl.currentMonth].cost ? $ctrl.monthData.supervisor[$ctrl.currentMonth].cost : 0) + ($ctrl.monthData.operator[$ctrl.currentMonth].cost ? $ctrl.monthData.operator[$ctrl.currentMonth].cost :0 )}} грн.

      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/adminFullEcgList.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/adminListCustomer.html\",\"
      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/changeCustomerInfo.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/changeRecorderInfo.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/changeWorkerInfo.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/confirm.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/createCustomer.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/createWorker.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/listOfWorkers.html\",\"
      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/openEcgUpload.html\",\"

      {{ gender.name | translate }}

      ()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))@((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}])|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$/\\' name=email type=email placeholder=\\'{{ \\\"Email\\\" | translate }}\\' ng-required=false>

      {{ \\\"Processing\\\" | translate }} - {{ fileUpload.percent.currentFile }} - {{ fileUpload.percent.percent }}%
      Проаналізувати терміново
      0\\\">
      Почати завантаження ЕКГ
      0\\\">
      {{ item.progress }}% - {{ item.file.size/1024/1024 | number:2 }} MB
      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/openPatientEdit.html\",\"

      {{ gender.name | translate }}
      ()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))@((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}])|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$/\\' name=email type=email placeholder=\\'{{ \\\"Email\\\" | translate }}\\' ng-required=false>

      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/passwordChange.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/passwordRescue.html\",\"\");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/paymentDetailsStatistic.html\",\"
      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/paymentStatistic.html\",\"
      24 год
      48 год
      72 год
      {{ key | makeDate }}
      {{value[24]}}/{{operator[key][24]}}
      {{value[48]}}/{{operator[key][48]}}
      {{value[72]}}/{{operator[key][72]}}
      {{value.count}}/{{operator[key].count}}
      {{value.cost+operator[key].cost}}
      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/paymentStatisticCustomer.html\",\"
      24 год
      48 год
      72 год
      {{modal.data.all}}
      {{ key | makeDate }}
      {{value[24]}}
      {{value[48]}}
      {{value[72]}}
      {{value.count}}
      {{value.cost}}
      \");\n$templateCache.put(\"app/helpers.ui.bootstrap/modals/tpl/supervisorVerification.html\",\"
      {{ \\\"Verification\\\" | translate }}
      \");}]);"],"sourceRoot":"/source/"}