{"version":3,"sources":["FacebookSDK.js","Ordering/services/orderSvc.js","Ordering/services/shoppingCartSvc.js","common/controllers/firebaseCtrl.js","common/controllers/passwordResetCtrl.js","common/controllers/signInCtrl.js","common/directives/wbAddressLookup.js","common/directives/wbAgeRangeCombo.js","common/directives/wbAttendanceStatusLookup.js","common/directives/wbAutoFillFix.js","common/directives/wbClassroomCombo.js","common/directives/wbCountryCodeCombo.js","common/directives/wbCourseTypeLookup.js","common/directives/wbCurrencyCombo.js","common/directives/wbCurrencyEdit.js","common/directives/wbDecimalEdit.js","common/directives/wbGenderCombo.js","common/directives/wbGrid2.js","common/directives/wbInvoiceLookup.js","common/directives/wbMaskEdit.js","common/directives/wbNumberEdit.js","common/directives/wbNumberExEdit.js","common/directives/wbPaymentType.js","common/directives/wbPercentEdit.js","common/directives/wbReferenceSourceCombo.js","common/directives/wbShareOnFacebook.js","common/directives/wbStudentLookup.js","common/directives/wbTerminalCombo.js","common/directives/wbTrueFalseCombo.js","common/directives/wbValidationTooltip.js","common/filters/activityCompensationType.js","common/filters/activityStatus.js","common/filters/ageRangeName.js","common/filters/attendanceFeeType.js","common/filters/attendanceStatus.js","common/filters/attendanceType.js","common/filters/boolean.js","common/filters/checkmark.js","common/filters/classroom.js","common/filters/gender.js","common/filters/invoiceForType.js","common/filters/nonEmptyCollection.js","common/filters/onlinePaymentState.js","common/filters/paymentType.js","common/filters/phone.js","common/filters/sumFlt.js","common/filters/terminal.js","common/filters/urlButton.js","common/filters/wbColor.js","common/filters/wbCurrencyFlt.js","common/filters/wbHumanNameSort.js","common/filters/wbPercent.js","common/services/accountingBookSvc.js","common/services/activeFeaturesSvc.js","common/services/activityReconciliationSvc.js","common/services/activitySvc.js","common/services/ageRangeSvc.js","common/services/attendanceSvc.js","common/services/classroomAvailabilitySchedulesSvc.js","common/services/classroomSvc.js","common/services/compensationGroupSvc.js","common/services/consentSvc.js","common/services/coursePriceSvc.js","common/services/courseRegistrationSvc.js","common/services/courseScheduleSvc.js","common/services/courseSvc.js","common/services/courseTypeSvc.js","common/services/domainsSvc.js","common/services/employeeSvc.js","common/services/errorTypeTranslateSvc.js","common/services/facebookSvc.js","common/services/formResponseSvc.js","common/services/formSvc.js","common/services/geoCoderSvc.js","common/services/gridSortSvc.js","common/services/languageService.js","common/services/membershipStudentSvc.js","common/services/membershipSvc.js","common/services/messageBoxSvc.js","common/services/notificationSvc.js","common/services/onlinePaymentConfigurationSvc.js","common/services/pricingSvc.js","common/services/promotionSvc.js","common/services/referenceSourceSvc.js","common/services/repositorySvc.js","common/services/reservationsSvc.js","common/services/securitySvc.js","common/services/semesterSvc.js","common/services/studentSvc.js","common/services/subjectsSvc.js","common/services/surveySvc.js","common/services/tenantInfoSvc.js","common/services/tenantSettingSvc.js","common/services/terminalSvc.js","common/services/uiUtilsSvc.js","common/services/urlUtils.js","common/services/userSettingSvc.js","common/services/userSvc.js","common/utils/colorUtils.js","common/utils/dateUtils.js","common/utils/stringUtils.js","common/validation/wbDifferentValueValidator.js","common/validation/wbIsAfterValidator.js","common/validation/wbIsBeforeValidator.js","common/validation/wbOnlyOneValueSetValidator.js","common/validation/wbPersonalIdNumberValidator.js","common/validation/wbTwoOrNoneSetValidator.js","crm/directives/wbFormResponseCombo.js","crm/directives/wbFormResponseEdit.js","crm/directives/wbFullStudentEdit.js","crm/directives/wbFullUserEdit.js","crm/directives/wbLevelCombo.js","crm/directives/wbNotRegisteredUserEdit.js","crm/services/levelSvc.js","finance/services/duePaymentsSvc.js","finance/services/invoiceSvc.js","finance/services/onlinePaymentsSvc.js","finance/services/paymentsSvc.js","rents/directives/wbItemTypeCombo.js","rents/filters/wbItemType.js","rents/filters/wbRentCategory.js","rents/filters/wbRentCategoryGroup.js","rents/filters/wbRentItemExternalId.js","rents/filters/wbRentItemName.js","rents/services/itemTypeSvc.js","rents/services/rentCategoryGroupSvc.js","rents/services/rentCategorySvc.js","rents/services/rentItemAvailabilitySvc.js","rents/services/rentItemSvc.js","rents/services/rentSvc.js","common/services/models/courseRegistration.js","common/services/models/courseRegistrationAttendance.js","common/services/models/courseRegistrationInvoice.js","common/services/models/courseRegistrationInvoiceLine.js","common/services/models/courseRegistrationPayment.js","common/services/models/courseRegistrationUserSchedule.js","finance/payments/directives/wbInvoiceForCombo.js","finance/payments/directives/wbPaymentActivityCombo.js","finance/payments/directives/wbPaymentActivityReccurenceSchedulesCombo.js","finance/payments/directives/wbPaymentActivityReconciliationCombo.js","finance/payments/directives/wbPaymentCourseCombo.js","finance/payments/directives/wbPaymentEdit.js","finance/payments/directives/wbPaymentReservationCombo.js","finance/payments/directives/wbPaymentSemesterCombo.js"],"names":["window","fbAsyncInit","FB","init","appId","autoLogAppEvents","xfbml","version","d","s","id","fjs","getElementsByTagName","getElementById","js","createElement","src","parentNode","insertBefore","document","wbApp","factory","$resource","$q","repositorySvc","Order","getById","method","url","insert","createNew","userId","studentIds","isNotRegisteredUser","publicNotes","orderStatus","auditEvents","notRegisteredUserInfo","rents","orderId","customGet","model","customPost","localStorageService","orderSvc","rentSvc","securitySvc","getCartId","forAnonymous","loggedInUser","userID","saveShoppingCart","shoppingCart","isSupported","set","recalculateShoppingCart","cart","errors","_","forEach","r","hasErrors","rentedItems","ri","itemsCount","reduce","sum","length","addRentItemToShoppingCart","rentItem","placeId","tartgetRentCandidate","find","moment","startDate","isSame","endDate","push","i","numberOfItemsToAdd","externalId","rentCategoryId","itemTypeId","rentCategory","loadShoppingCart","cartLoaded","anonymousCartId","anonymousCart","isAuthenticated","userCartId","userCart","get","remove","rentShoppingCart","orderModel","studentId","map","rent","modelToDTO","fromUtc","toUtc","status","removeRentItemFromShoppingCart","index","splice","rentIndex","indexOf","emptyShoppingCart","controller","$scope","$window","String","prototype","isNullOrWhitespace","fullName","location","pathname","startsWith","href","$translate","$interval","email","password","otp","authCodeWasSend","authCodeSending","passwordValidationRegEx","onAuthCodeResend","form","loginForm_emailInput_textField","$valid","detailError","sendPasswordResetAuthorizationCode","then","success","error","title","includes","instant","onPasswordSet","isSaving","confirmPasswordReset","signIn","reload","gcpErrorCodeToText","console","$modal","$timeout","urlUtils","signInReturnPath","getQueryParams","signInFlow","$hide","code","emailVerificationMode","sendEmailVerificationAuthorizationCode","evSuccess","evError","onPasswordReset","passwordResetDialogPromise","$promise","show","templateUrl","onSignIn","confirmEmailVerification","scope","$new","directive","geoCoderSvc","restrict","require","formattedAddress","wbPlaceholder","template","replace","link","iElem","attr","getAddress","val","geocode","$watch","lastLocationUpdate","angular","equals","copy","longitude","latitude","geo","geoDecode","addresses","addressJson","geometry","lat","lng","onChange","onLocationChange","newLocation","formatted_address","ageRangeSvc","formatResult","ageRange","name","formatSelection","filterData","data","ageRanges","filterByAgeRanges","ar","fres","filter","ageRangeID","apply","priority","allowClear","elm","attrs","ctrl","getAllAsync","$","select2","placeholder","dropdownAutoWidth","minimumResultsForSearch","$render","value","$parsers","unshift","viewValue","parseInt","$formatters","$viewValue","on","e","$apply","$setViewValue","bind","$observe","elem","ngModel","origVal","newVal","$pristine","classroomSvc","isDeleted","description","active","filterForReservations","filterForCourses","models","getAllActiveAsync","$modelValue","item","text","event","current","old","ngEnable","courseTypeSvc","format","courseType","courseTypes","filterByCourseTypes","lookupData","getAllForLookup","tenantInfo","element","destroyed","initialized","read","amt","autoNumeric","aSign","currency","getCurrencySymbol","aDec","aSep","pSign","mDec","vMin","undefined","min","vMax","max","parseFloat","$evalAsync","required","module","$filter","$rootScope","$http","$tooltip","messageBoxSvc","uiUtilsSvc","gridSortSvc","gridOptions","filterOptions","rowSelected","selectionChanged","filterApplied","rowEdit","rowDelete","rowAdd","rowAddDisabled","rows","filteredRows","selectedPage","pages","filters","sorts","pageSizes","hideFooter","noCommandColumn","rowNumberColumn","disableRowSelection","multiSelect","grouping","enabled","pageSize","allSelected","selected","disabledField","selectedField","highlightedField","dangerField","dangerFn","disabledAreSelectable","scrollbarWidth","getScrollbarWidth","disableDeleteConfirmation","rndId","Date","getTime","Math","floor","random","setIsAllSelected","m","busyTooltip","trigger","placement","html","getSelectedRow","selection","genericDataExport","keys","columns","f","columnDefs","colDef","field","noExport","cellFilter","caption","displayName","bitmaskValues","exportBitMaskValues","width","idx","entity","params","key","flt","parseFilter","filterName","prepareData","JSON","stringify","headers","config","append","fileName","filterStr","substring","ret","param","unQuoteParams","toggleGroupRowExpand","row","__expanded__","newValue","hideToolTip","hide","$resolved","onSelectAllClick","sc","commandDropdown","onDropdownNewClick","onDropdownCustomCommandClick","command","customCmds","onDropdownEditClick","selectedRow","hideEdit","onDropdownDeleteClick","showMessageDlg","message","buttons","callback","showCommandMenu","commandMenu","click","first","c","divider","hideDelete","prepareCommandMenu","onRowDblClick","onAddMenuClick","onPageSizeChange","recalculatePages","selectPage","p","onHeaderClick","col","sortInfo","column","sortDirection","applyFilters","cellFilters","getCellFilters","result","globalFilter","filterText","globalFilterFunction","filterFunction","toLowerCase","sortBy","options","direction","fields","directions","getSortByProperty","cellSorts","sort","getCellSorts","sortedRows","date","$watchCollection","oldValue","pageNo","nPageNo","slice","onRowClicked","isGroupRowPropertyName","oldVal","rowSelectionClicked","exportDropdown","onCSVExportClick","onXLSExportClick","getFilteredValue","selectedRangeHi","animation","removeClass","doneFn","jQuery","css","addClass","el","height","setTimeout","invoice","number","total","ajax","term","page","query","invoiceForType","$eval","wbInvoiceForType","results","more","initSelection","invoiceID","inputmask","uiMask","clearIncomplete","autoUnmask","isValid","$setValidity","validate","validatorName","validity","maxValidator","$isEmpty","transformedInput","minValidator","paymentType","disabled","referenceSourceSvc","facebookSvc","course","action","alias","courseHref","domain","courseID","onFBButtonClick","shareCourseDetail","subjectName","subjectDescription","teacher","pictures","imageUrl","notificationSvc","getFullName","middleName","surName","student","birthday","parentFullName","user","middlename","surname","userIdFilter","parentId","contactPhone","contactEmail","health","expanded","filteredData","toLocaleUpperCase","skip","take","paged","drop","errorResult","nameSubstring","phone","notifyError","translateError","choice","terminalSvc","terminal","terminals","terminalID","errorTypeTranslateSvc","errorTooltip","wbValidationTooltip","delay","hasFocus","$error","translate","is","input","asyncResult","$stateful","Number","propertyName","$sce","colorUtils","webooker_utils","ColorUtils","trustAsHtml","intToRgb","items","reverse","orderBy","o","sortHumanFullName2","decimals","accountingBooks","AccountingBooks","getAll","isArray","update","delete","peekNextSequenceNoRaw","setNextSequenceNoRaw","uploadAccountingStamp","deleteAccountingStamp","listInstitutions","createBankConnection","getConnection","deleteConnection","selectBankAccount","refresh","getDefaultAsync","a","deferred","defer","isDefault","resolve","reason","reject","promise","successCallback","errorCallback","sequenceType","accountingBookID","year","sequenceNumber","notifyInfo","defaultErrorHandler","customPutWithParams","customDelete","getInstitutions","institutionId","redirectToUrl","accountingBookId","connectionId","accountId","customPostWithParams","formSvc","isClientFormSupportEnabled","remoteFetchDoneFn","lastCheck","ISO_8601","isBefore","subtract","getAllActive","shouldBeActive","tenantSettingSvc","ActivityReconciliations","getStudentsByActivity","getStudentsAttendanceByActivity","getByStudentAndActivity","getReconciliationDetail","insertReconciliationDetail","updateReconciliationDetail","deleteReconciliationDetail","sendReconciliationNotification","getAvailableExuses","semesterID","activityID","reconciliationDataRange","fromDate","toDate","endOf","studentID","vm","webooker_acivity_models","ReconciliationAttendance","getMinDateRange","attendance","att","reconciled","startOf","getMaxDateRange","selectDateRange","mStartDate","mEndDate","add","at","mAtDate","isAfter","isSelected","getToDateRange","maxDate","from","to","endOfMonth","lastAtt","activityReconciliationID","Reconciliation","settings","calcSnacksOnlyForPresent","initData","call","reconciliation","notifyClients","reconciliationDetail","getReconciliationDetailDTO","successResult","defaultSuccessSaveHandler","notifyclients","defaultSuccessRemoveHandler","getReconciliationName","refreshByStudentAndActivity","students","newStudent","oldStudent","bySemesterID","lastSemesterID","lastActivityByActivityID","lastActivityID","Activity","getAllBySemesterID","getByActivityID","getSummary","getAllOpenForRegistration","registerActivityInterest","getPhotoAlbum","getInfoByRange","getAllBySemesterIDAsync","semestedID","getBySemesterIDAndActivityID","activities","activity","AgeRange","fromAge","toAge","buildIn","lastCourseID","lastUserID","lastAttendanceByUser","Attendance","getLessonAttendance","getStudentCourseAttendance","getAllForCourseAndUser","getAllForCourse","getAttendanceSummary","getStudentAttendanceDetail","lastRefreshedAt","collection","courseScheduleID","getStudentCourseAttendanceByUser","refreshDebounce","isSameOrAfter","filtered","groupAttendanceDetail","attendanceDetail","groupBy","rr","impliedCourse","impliedCourseID","isGroupRow","prepareFullCourseAttendanceTable","studentAttendanceDTOs","courseScheduleDTOs","attendanceByStudent","mnow","forIn","firstAttendance","head","attendanceMapBySchedule","keyBy","isRegistered","attendanceType","schedule","attendanceStatus","modified","attendanceCount","AvailabilitySchedule","getSingle","getRange","updateRange","lastLoadedDay","lastLoadedDayFilter","classroomId","loadedAt","loadWeek","startOfWeek","endOfWeek","dayData","day","periods","saveWeek","saveWeekAsPaternForPeriod","periodStart","periodEnd","weekModelTemplate","templateCopy","timeDifference","startOfWeekPeriod","endOfWeekPeriod","currentPeriod","toSave","duration","diff","start","end","loadDay","loadPeriod","startOfPeriod","endOfPeriod","numberOfDay","ceil","domainsSvc","classrooms","nonDeleted","Classroom","domainsGetAll","domainsInsert","domainsUpdate","domainsDelete","availabilityByDomainsAndRange","classroomIDtoInclude","filterForRents","allClassrooms","filteredClassroom","showInReservations","showInCourses","showInRents","getAllNonDeletedAsync","getAsync","cl","entityInserted","entityUpdated","entityRemoved","capacity","addressID","reservationStartTimeType","reservationsSchedulerScale","reservationsSchedulerSelectByBlocks","reservationsSchedulerMaximumSelectedBlocks","address","mapZoom","loadDomainsData","all","getAllExpanded","domains","placesDomains","each","d0","placesDomain","domainPrices","reservationTeacherHourSingleRateOverride","reservationTeacherHourSingleRate","reservationTeacherHourSingleRateOverrideOrigin","reservationTeacherHourGroupOneRateOverride","reservationTeacherHourGroupOneRate","reservationTeacherHourGroupOneRateOverrideOrigin","reservationTeacherHourGroupTwoRateOverride","reservationTeacherHourGroupTwoRate","reservationTeacherHourGroupTwoRateOverrideOrigin","specializations","d1","placesSpecialization","specializationsPrices","flatMapDeep","domainId","specializationIds","saveDomainsData","flattenedDomains","origSelection","newSelection","origSelectionDict","newSelectionDict","toInsert","toUpdate","toDelete","promisses","domainsDict","flattenedDomainsCopy","cloneDeep","values","origPlaceDomain","newPlaceDomain","has","isNil","isEqual","flatMap","getAllBrief","compensationGroupsBrief","compensationGroups","CompensationGroup","getLookup","sem","compensationGroupID","getLookupActiveAsync","IDstoInclude","def","Consent","getConsentsInfoBrief","getConsentsInfoForUser","assignConsensts","approveConsent","rejectConsent","consent","consentID","calcRemainingPaidAttendance","scheduleWithAttendance","remainingLessons","cnt","l","studentAtt","findStudentAttendance","courseAttendanceFeeType","getCourseBasePrice","useAmortizationSchedule","basePrice","fixedPrice","subjectCategoryID","price","amortizationScheduleSurchargePct","round","getPriceDetails","isAction","discountAmt","finalPriceWithoutDiscounts","discountPct","promotions","promotion","owns","isMandatory","buy","finalPrice","finalPriceStr","getCourseFeeLineName","noOfLessons","factor","gtDiscountLineStr","promotionName","calculateAmortizationSchedules","invoiceDate","amortizationScheduleTemplate","amortizationSchedules","remainingAmount","rollUpAmount","byIssueDateOrder","actualIssueDate","x","issueAt","issueDaysAfterRegistration","amortizationSchedule","isLast","amortizationTemplateItem","amortizationPartAmount","amount","percentageAmount","existingAmortizationScheduleIndex","findIndex","n","existingAmortizationScheduleAmount","dueDate","last","courseScheduleSvc","invoiceSvc","promotionSvc","attendanceSvc","coursePriceSvc","courseSvc","CourseRegistrations","getAllCoursesByStudent","getAllActionsByStudent","getAllCoursesByUser","getAllActionsByUser","getInfoFromCourseRegistrationBarcode","sendRegistrationNotification","createFullCourseInterest","insertAll","calcExpectedDueDate","getCourseInterestById","doNotPreselect","webooker_courses_models","CourseRegistration","preInitNew","appendScheduleModel","courseRegistrations","userSchedules","allAttendanceArray","cr","registeredAttendance","allAttendanceMap","schedules","userSchedule","CourseRegistrationUserSchedule","addCourseRegistrationAttendance","extendRegistrations","registration","futureAttendance","noFurtherRegisteredAttendance","every","courseAttendanceType","attendanceStatusText","courseAttendanceStatus","attendanceStatusNotPresent","includeInterestsAsVirtual","newRegPromises","reg","st","parentID","studentFullName","studentAge","age","studentBirthday","resPromisses","newRegPromisesResolved","newReg","newRegModel","initialize","regModel","allowClientLessonSelection","getRegisteredAttendanceForCourse","registrations","courseRegistrationCode","courseRegistrationID","initializeModel","isAdmin","notificationSetting","subjectCategory","sendEmailNotification","sendSmsNotification","updateInvoice","updateReservedPlaces","reservedPlaces","ra","refreshSchedules","courseRegistration","updateCapacityByRefreshedSchedules","classroom","request","courseId","semesterId","subjectId","subjectID","classroomID","teacherId","employeeID","courseName","courseAbbreviation","abbreviation","courseFullName","getCourseFullName","courseStartDate","firstLesson","courseEndDate","lastLesson","classroomName","teacherFullName","notes","registrationDate","issueDate","$cacheFactory","semesterSvc","CourseSchedule","getPattern","getAllForSemester","getAllForSemesterAll","getAllForCurrentUserAndCourse","expandRecurrencePattern","cache","cachedCourseID","cachedIncludeDeleted","includeDeleted","includeDeletes","put","weekDaysFromDate","dayNumber","courseModel","isNewRecurrence","hour","minute","lessonLengthInMinutes","newEvent","recurrenceType","recurrenceInfo","type","periodicity","weekDays","occurrenceCount","range","recurrenceId","toString","createNewEvent","createNewCourse","getAllForSemesterAsync","getAllForSemesterAllAsync","updateEventByStartDate","getAllSortedAsync","res","rejectReason","accountingBookSvc","compensationGroupSvc","surveySvc","Course","getByCourseID","getFranchiseCourses","courseCopySave","courses","actions","semesterIdActions","sId","openForRegistrationOnly","getAllActionsAsync","refreshCourseRecord","newRecord","currentRecord","extend","getAction","breakFranchiseCoursesByAddress","property","addressGroups","classroomLocation","locations","enhanceFranchiseCoursesAndsort","tenant","franchises","tenantID","franchiseLevel","franchiseLevels","franchiseLevelID","tenantFriendlyName","placeName","level","city","courses2","groups","franchiseSubjectID","group","teacherSurname","firstLessonStartDate","courseUrl","tenantAlias","locale","dfAccountingBookPromise","dfCompensationGroupPromise","dfSurveyPromise","showInSchedule","allowRegistration","showInEmployeeTimeSheet","emailCategory","courseCategoryID","courseAgeRangeID","picture","surveyID","refreshActionRecord","getActionAsync","getCourseAsync","courseTypesBriefs","CourseTypes","getByIdAsync","courseTypeID","Domains","expand","getAllExpandedWithClientModel","extendDomainModel","visible","disabledForClients","acc","findFirstSelectable","visibleDomain","Employee","getByEmployeeID","getBriefByEmployeeID","getAllExpandedByIds","schedulesUpdateDay","schedulesDeleteDay","employee","rfidCardIDsStr","join","rfidCardIDs","lastLoadedAllExpanded","lastLoadedAllExpandedFilter","smallImageUrl","employeeIDtoInclude","allEmployees","filteredEmployees","initNewFranchisesLicense","employeeFranchiseID","franchiseCentralTenantID","licenses","getAllNonDeleted","employeeId","employeeDomains","origEmployeeDomain","newEmployeeDomain","selectedEmployees","ids","dayScheduleDTO","val2","ngMaxlength","ngMinlength","wbIsBeforeValidator","val1","wbIsAfterValidator","wbSameValueValidatorMessage","wbDifferentValueValidatorMessage","wbOnlyOneValueSetValidatorMessage","wbDependentPropertyRequiredValidator","wbDependentPropertyRequiredValidatorMessage","minTime","maxTime","courseDescription","pictureUrl","registrationOpenPicture","urlEncoded","encodeURI","titleEncoded","descriptionEncoded","pictureUrlEncoded","socialMediaShareUrl","ui","response","FormResponse","getAllByFormId","formResponseId","formId","formDefinitionId","Form","getByIdAndRevision","addNewQuestion","questions","maxId","maxBy","newQuestion","descriptionHtml","questionType","addNewOption","question","primaryQuestionIndex","primaryQuestionIndexPlusOne","accessPermissions","isActive","isNew","formType","revision","isFormValid","q","questionIsValid","generateFormResponseFromFilledForm","formDefinitionRevision","auditEvent","checked","answers","textAnswer","optionsSelection","updateFilledFormByFormResponse","formResponse","os","formIdToInclude","filterForKindergarten","allForms","filteredForms","uiGmapGoogleMapApi","maps","geocoder","Geocoder","addr","GeocoderStatus","OK","ZERO_RESULTS","longtitude","latlng","LatLng","latLng","languageService","csTranslateTable","á","č","ď","é","ě","í","ň","ó","ř","š","ť","ú","ů","ý","ž","ch","localeFn","cs","en","de","sk","language","currentLanguage","lowercase","humanName","spl","split","sortHumanFullName","nameProperty","surnameProperty","middleNameProperty","sortNamesBySurname","fullNameProperty","arr","words","rest","concat","localeSort","filterExpressionWithoutAccents","filterValue","selectedFilterOperation","target","normalize","preferredLanguage","use","languages","nameResID","img","setActiveLanguage","langKey","expires","setDate","getDate","setTime","newCookie","toUTCString","cookie","currentLangKey","supportedLanguages","lasValidByUser","lastUserId","lastNow","byMembershipId","lastMembershipId","MembershipStudent","getByUser","getValidByUser","getByMembership","GetByUserValidAsync","now","normalizedNow","GetAllByMembershipAsync","membershipId","membershipStudentID","memberships","lastValidMembership","Membership","getValid","save","getAllValidAsync","userSettingSvc","showPctProgress","pctProgressDlg","progressPct","progressMessages","disableCloseButton","noOfErrors","progress","pctProgress","dlgConfig","hasPrimaryBtn","button","primary","$onClick","messageDlg","isBusy","this","container","inputModel","translatedMessage","inputOnChange","$on","onShowBefore","onShow","focus","onHideBefore","onHide","showConfirmClientNotification","defaultConfig","emailsEnabled","sendEmailsToClients","disableAllEmails","disableAllEmailsExceptUserRegistration","smsEnabled","enableSMSSupport","userSettingRemembered","saveSetting","setting","rememberSendNotification","userSetting","saveAsync","showSendEmailNotification","showSendSmsNotification","showRememberSendNotification","onNoClick","onYesClick","queue","notify","notification","advertiseCallback","content","notifyWarning","fatalNotify","alert","getQueue","validationErrors","ValidationErrors","Description","advertiseLogin","urlParams","registerAdvertiseCallback","onlinePaymentConfigurations","OnlinePaymentConfiguration","providerType","isTestConfig","country","secret","clientCertificateBase64","merchantID","merchantPassword","Pricing","calculateReservationPrice","lastModel","lastReturn","skipErrorHandler","membershipSvc","membershipStudentSvc","getPromotionsByStudentsAsync","source","promotionNow","studentPromotionNow","isCourse","memStudents","memResult","memStudentsResult","mem","smem","membershipID","applyToActions","applyToCourses","isClientAssignable","validFrom","validTo","ReferenceSource","getReferenceSourceTimeDevelopment","referenceSource","referenceSourceDict","deffered","cols","label","referenceSources","rs","days","v","counts","idFieldName","idf","extractErrorData","saveAll","addToCollection","updateCache","disableNotification","parameters","error_message_id","doNotShowSuccessNotification","postData","Reservation","getAllByRangeAndPlace","getAllByRangeAndUser","getAllByRangeAndStudent","getByInvoice","lastLoadedRangeAndPlace","lastLoadedRangeAndPlaceFilter","reservationId","employees","reservationStartDate","reservationEndDate","teacherName","filledCapacity","subject","invoiceId","sf","securityFeatures","sfDict","isInRole","role","er","idTokenRefreshed","firebaseUser","firebase","auth","setPersistence","Auth","Persistence","NONE","signInWithEmailAndPassword","userCredential","emailVerified","getIdToken","token","Authorization","catch","createUserWithEmailAndPassword","Email","x-sec-api-key","Otp","oobCode","log","applyActionCode","verify","adminLogout","signOut","logout","roles","Semester","courseSummary","semesters","sortSemestersIsMainFirst","newModel","semester","showInKindergarten","isMain","getActiveAsync","getCourseSummaryAsync","defaultSemesterID","setDefault","getAllOpenForRegistrationAsync","openForRegistration","preferredBookingEffectiveIsActive","getAllShowInAttendanceAsync","showInAttendance","byUserID","lasUserID","Student","getCurrent","getAllByUserID","getByID","getStudentsWithCompGrpLookupQuery","getStudentsWithCompGrpLookupID","nationality","defaultNationality","gender","getCurrentAsync","getAllByUserIDAsync","getByIDAsync","onSuccess","onError","studentCompGrpID","tenantInfoSvc","subjects","subjectsForCourses","subjectsForActions","Subject","getAllFranchiseCentralCourseSubjects","getAllActiveFranchiseSubjects","getAllBySubjectCategory","allSubjects","filteredSubjects","getAllForCoursesAsync","getFranchiseCentralSubject","franchiseCentralSubjectID","getAllForActionsAsync","getAllWithActiveFranchiesesAsync","subjectIDtoInclude","sIDs","info","franchiseCentrals","surveys","Survey","surveyQuestionTypeID","allowCustomNote","weight","survey","maxContactsPerClient","surveyQuestions","filteredModels","IDtoInclude","TenantSetting","triggerPortalUpdate","tenantSetting","syncData","isCourseRegistrationNotificationEnabled","enableStudentCourseRegistrationNotification","isFullCourseInterestNotificationEnabled","enableFullCourseInterestNotification","Terminal","terminalSetting","getTerminalSetting","isDisabled","isRequired","isVisible","storedTerminalID","setTerminalSetting","getSelectedTerminalID","scrollbarWidthSet","scrollDiv","className","body","appendChild","offsetWidth","clientWidth","removeChild","$location","qs","search","tokens","re","exec","decodeURIComponent","getUrlParts","setUrlParam","paramName","paramValue","encodeURIComponent","path","history","replaceState","absUrl","getParamsStringWithoutReturnUrl","getLastUrlPart","urlParts","removeUrlParam","getReturnUrl","UserSetting","_userSetting","User","register","methof","getByIDFull","getConsentsInfo","anonymize","users","filteredUsers","excludeUnfinished","data2","u","securityRoleID","allowEmailContact","registerAsync","loginDetails","payload","userName","anonymizeTaxDocuments","allUsers","ns","intColor","rgbToInt","rgbColor","match","isValidDate","Object","isNaN","arguments","RegExp","endsWith","suffix","str","otherVal","wbDifferentValueValidator","isDate","wbOnlyOneValueSetValidator","value1","value2","val1Def","val2Def","parsed","formResponseSvc","studentSvc","userSvc","adminEdit","$element","updateModel","dummy","editform","validateModel","showFullEditableStudentDetail","onRegisteredBtnClick","onAnonymousBtnClick","images","formIsLoading","loginRequired","isNewForFilling","onAdminUserChange","onCheckboxClick","promises","fetchFormDefinition","assignData","showFullEditableUserDetail","pictureUrls","thumb","option","numOfSelected","onTextEdit","typeAheadAddress","region","bounds","hasSecondContact","mandatoryEmail2","mandatoryPhone2","mandatoryUserNationality2","mandatoryUserName2","mandatoryUserSurname2","mandatoryUserMiddleName2","mandatoryUserAddress2","mandatoryUserIdentityCardNumber2","mandatoryUserPersonalIDNumber2","mandatoryUserBirthday2","levelSvc","matcher","toUpperCase","isStudentRequired","hideHeaderIfStudentNotRequired","requiredStudent","adminSimpleRequired","allMatch","onIsStudentRequiredToggle","levels","Level","levelId","convertDatesToDateString","duePayments","DuePayments","getAllForCurrentUser","getAllForDateRange","sendRequestForPayment","summaryAll","calculateSummary","summary","types","duePayment","typeID","arrear","filterOutOverPayments","sorted","grouped","calculateSummaryAll","typeReferenceID","typeReference2ID","isReccuring","getAllByDateRangeAsync","Invoice","getFinanceSummary","getPaymentDetailsByStudent","getPaymentDetailsByInvoice","getInvoiceEvidenceBySemester","getInvoiceEvidenceByDateRange","getInvoiceEvidenceByUser","getInvoiceEvidenceByActivityAndStudent","getInvoiceEvidenceByInvoiceID","methos","getLatestByCourseRegistration","getStormwareInvoiceExport","getMoneyS3InvoiceExport","getCsvInvoiceExport","invoices","notLatest","latest","getInvoiceEvidenceByUserAsync","invoiceIDs","exportAsInvoices","OnlinePayment","startOnlinePayment","getTransactionState","getAllByDateRange","manualReverse","byDateRanges","lastFromDate","lastToDate","returnToUrl","redirectUrl","onlinePaymentID","getOnlinePaymentResultMessage","onlinePayment","priceStr","state","resultMessage","err","Payment","issueTaxDocumentIfNeeded","getAllForUser","insertAndBindTransaction","insertAndBindOnlineTransaction","getAllRelatedPaymentsByInvoiceID","getAmortizationScheduleDuePayments","insertImpl","payment","updateImpl","clearPaymentEditModel","isAddBankPayment","isAddDuePayment","isOnlinePayment","selectedDate","reconciliations","reccurenceSchedules","reservations","serverError","insertAndBindTransactionAsync","payments","paymentTypes","paymentTypeID","initializePaymentEditModel","paymentDetail","paymentID","cashReceiptNo","isPaymentEditModelValid","commonIsValid","savePaymentEditModel","sendNotification","transactionID","dto","paymentDate","getAllForUserAsync","operatorID","paymentId","itemTypeSvc","rentItemSvc","usedTypeIdsPromise","oldRentCategoryId","allItemTypes","getUsedItemTypes","itemType","$viewChangeListeners","listener","sortResults","b","localeCompare","rentCategorySvc","rentCategoryGroupSvc","itemTypes","ItemType","getByPlaceAndRentCategory","rentCategories","RentCategory","getAllByPlace","includeNotActive","itemSelectionType","rentingPeriodType","minimumRentingPeriods","maximumRentingPeriods","minimumNumberOfRentedItem","maximumNumberOfRentedItems","rentingPeriodStepSize","rentHourStartType","RentItemAvailability","getAllByPlaceAndRentCategoryAndTypeAndDateRange","fromDateUtc","toDateUtc","utc","rentItems","RentItem","getAllByPlaceAndRentCategory","resolvedEmptyArrayPromise","itemCondition","rentItemId","Rent","getAllByPlaceAndDateRange","getAllByPlaceAndItemAndDateRange","getAllByPlaceAndRentCategoryAndTypeAndUserDateRange","remainder","createdAtUtc","rentId","itemId","studentName","studentSurname","studentMiddleName","transform","courseRegistrationPayment","notificationSent","preAmendsCount","timeBoundAmendCount","timeBoundAmendExpiration","attendantHealth","semesterName","firstDate","allowMultiAttendance","selfAssessedProficiencyLevelID","paymentsSum","smsCode","attend","$initialized","self","$allowClientLessonSelection","lineItems","registeredLessons","attMap","attModels","CourseRegistrationAttendance","zipObject","oldCourseAttendanceType","oldCourseAttendanceStatus","CourseRegistrationInvoice","$courseRegistration","$attend","attendanceNotes","toJSON","markErrorAttendance","scheduleIDs","scheduleIDsNormalized","$hasError","scheduleMap","newSchedule","updateCapacityByRefreshedSchedule","defineProperty","enumerable","configurable","isUserEditable","isAnySelected","isInThePast","totalByamortizationSchedule","courseRegistrationAttendanceDTO","$courseRegistrationUserSchedule","dis","freePlaces","setUserScheduleBinding","courseRegistrationUserSchedule","origCapacity","origFilled","filled","invoiceDTO","amortizationScheduleMode","_useAmortizationScheduleOrig","lines","invoiceCourseFee","invoiceLineType","CourseRegistrationInvoiceLine","invoiceMemberships","invoiceMembership","lineType","isInInvoice","invoiceDiscounts","discount","manualsInInvoice","manualInInvoice","invoiceLinesOrig","courseFee","isModified","totalByAmortizationSchedule","isSameOrBefore","addManualAdjustmentLine","manualAdjustmentLineType","line","runtimeManualAdjustmentType","removeManualAdjustmentLine","courseRegistrationInvoice","invoiceLine","getCourseRegistrationInvoice","isNameEditable","isValueEditable","runtimeManualAdjustmentPercentDiscount","studentMembershipID","percent","toFixed","isReadonly","parent","noOfRegisteredAttendances","membershipNow","courseScheduleDTO","$courseRegistrationAttendance","origFreeCapacity","placesRequiredByRegistration","hasChanged","courseRegistrationAttendance","cra","wbActivities","issuedAt","wbReccurenceSchedules","wbReconciliations","wbCourses","paymentsSvc","reservationsSvc","studentChangedFromInvoice","fillCombosForReservations","isInStudentSelection","newStudentId","fillCombos","selectedSemesterID","selectIDFromCollection","changeSemester","selectedCourseID","selectedActivityID","selectedActivityReconciliationID","selectedInvoiceID","reservationID","findByID","findSemester","changeActivity","changeCourse","findActivity","issued","changeActivityReconciliation","issuedInvoiceID","paymentSum","registrationNote","newInvoiceID","idPropertyName","onInvoiceForTypeChange","onInvoiceChange","onSemesterChange","onCourseChange","onActivityChange","onActivityReconciliationChange","onActivityReccurenceScheduleChange","changeActivityReccurenceSchedule","onReservationChange","reservation","onStudentChange","wbReservations","wbSemesters"],"mappings":"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","file":"../both-common-app.min.js","sourcesContent":["window.fbAsyncInit = function () {\n FB.init({\n appId: '521980442808105',\n autoLogAppEvents: true,\n xfbml: true,\n version: 'v5.0'\n });\n};\n\n(function (d, s, id) {\n var js, fjs = d.getElementsByTagName(s)[0];\n if (d.getElementById(id)) { return; }\n js = d.createElement(s); js.id = id;\n js.src = \"//connect.facebook.net/cs_CZ/sdk.js\";\n fjs.parentNode.insertBefore(js, fjs);\n}(document, 'script', 'facebook-jssdk'));","wbApp.factory('orderSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var Order = $resource('/restapi/orders/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/orders/:id' },\n 'insert': { method: 'POST', url: '/restapi/orders' }\n });\n\n var itemTypes;\n\n function createNew()\n {\n return {\n id: null,\n userId: null,\n studentIds: null,\n isNotRegisteredUser: false,\n publicNotes: null,\n orderStatus: 0,\n auditEvents: null,\n notRegisteredUserInfo: null,\n rents: null\n };\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n Order,\n model);\n }\n\n function getById(orderId) {\n return repositorySvc.customGet('getById', Order, { id: orderId });\n }\n\n\n\n return {\n createNew: createNew,\n getById: getById,\n insert: insert,\n }\n }\n]);","wbApp.factory('shoppingCartSvc', ['$q', 'localStorageService', 'orderSvc', 'rentSvc', 'securitySvc',\n function ($q, localStorageService, orderSvc, rentSvc, securitySvc) {\n\n function createNew() {\n return {};\n }\n\n function getCartId(forAnonymous) {\n if (!!forAnonymous) {\n return 'wbShoppingCart-anonymous';\n } else {\n return 'wbShoppingCart-' + (securitySvc.loggedInUser().userID || \"anonymous\");\n }\n }\n\n function saveShoppingCart(shoppingCart) {\n if (localStorageService.isSupported) {\n localStorageService.set(getCartId(), shoppingCart);\n }\n }\n\n //rentItem: {\n // \"rentCategoryId\": \"2qhSydPeXbigOQPFlr1e\",\n // \"itemTypeId\": \"um12WeXPsTn4lb0VpaAx\",\n // \"rentCategory\": {\n // \"id\": \"2qhSydPeXbigOQPFlr1e\",\n // \"name\": \"Tenisové kurty\",\n // \"shortDescription\": \"Nově zrekonstruované kurty vedle tělocvičny\",\n // \"htmlDescription\": \"...\",\n // \"itemSelectionType\": 0,\n // \"rentingPeriodType\": 0,\n // \"minimumRentingPeriods\": 60,\n // \"maximumRentingPeriods\": 120,\n // \"minimumNumberOfRentedItem\": 1,\n // \"maximumNumberOfRentedItems\": 1,\n // \"pictureUrls\": [\n // \"https://u26nfbi1h0-images.storage.googleapis.com/Generic/6/42ee755f-ecaa-40a7-a253-4a58cbcb690a.jpeg\"\n // ],\n // \"accessPermissions\": 3,\n // \"isActive\": true,\n // \"rentCategoryGroupId\": \"jrLdCocUxAyjyx5yoUBJ\"\n // },\n // \"startDate\": \"2021-04-02T12:00:00\",\n // \"endDate\": \"2021-04-02T14:00:00\",\n // \"numberOfItemsToAdd\": 1,\n // \"rentItem\": {\n // \"id\": \"c6XFRpCjUsKiBCFzFVcO\",\n // \"rentCategoryId\": \"2qhSydPeXbigOQPFlr1e\",\n // \"placeId\": \"10722\",\n // \"itemTypeId\": \"um12WeXPsTn4lb0VpaAx\",\n // \"name\": \"Kurt číslo 3\",\n // \"shortDescription\": \"Kurt vpravo vedle kantýny\",\n // \"htmlDescription\": \"...\",\n // \"externalId\": \"TK03\",\n // \"pictureUrls\": [\n // \"https://u26nfbi1h0-images.storage.googleapis.com/Generic/6/662f97ce-d6fd-40e5-9702-874fb4743592.jpeg\"\n // ],\n // \"itemCondition\": 0\n // }\n //}\n function addRentItemToShoppingCart(cart, rentItem, placeId) {\n\n // Find corresponding rent in the Cart\n // Corresponding means it has same PlaceId and same start and end times\n // If not found, create a new rent\n\n if (!cart.rents) {\n cart.rents = [];\n }\n\n var tartgetRentCandidate = _.find(cart.rents, function (r) {\n return placeId == r.placeId &&\n moment(rentItem.startDate).isSame(r.startDate) &&\n moment(rentItem.endDate).isSame(r.endDate);\n });\n if (!tartgetRentCandidate) {\n tartgetRentCandidate = {\n placeId: placeId,\n startDate: rentItem.startDate,\n endDate: rentItem.endDate,\n rentedItems: []\n };\n cart.rents.push(tartgetRentCandidate);\n }\n\n for (var i = 0; i < rentItem.numberOfItemsToAdd; i++) {\n tartgetRentCandidate.rentedItems.push({\n id: !!rentItem.rentItem ? rentItem.rentItem.id : null,\n externalId: !!rentItem.rentItem ? rentItem.rentItem.externalId : null,\n rentCategoryId: rentItem.rentCategoryId || null,\n itemTypeId: rentItem.itemTypeId || null,\n\n // Extra info\n rentCategory: rentItem.rentCategory,\n rentItem: rentItem.rentItem\n });\n }\n\n recalculateShoppingCart(cart);\n\n saveShoppingCart(cart);\n }\n\n // Updates summary counts\n function recalculateShoppingCart(cart) {\n if (!cart) {\n return cart;\n }\n\n if (!cart.rents) {\n cart.rents = [];\n }\n\n // Clear errors\n delete cart.errors;\n _.forEach(cart.rents, function (r) {\n delete r.hasErrors;\n _.forEach(r.rentedItems, function (ri) {\n delete ri.hasErrors;\n });\n });\n\n cart.itemsCount = _.reduce(cart.rents, function (sum, r) {\n return sum = sum + (!!r.rentedItems ? r.rentedItems.length : 0);\n }, 0);\n }\n\n function removeRentItemFromShoppingCart(cart, rent, index) {\n rent.rentedItems.splice(index, 1);\n if (!rent.rentedItems.length) {\n\n var rentIndex = cart.rents.indexOf(rent);\n if (rentIndex !== -1) {\n cart.rents.splice(rentIndex, 1);\n }\n }\n\n recalculateShoppingCart(cart);\n\n saveShoppingCart(cart);\n }\n\n function emptyShoppingCart(cart) {\n cart.rents.length = 0;\n\n recalculateShoppingCart(cart);\n\n saveShoppingCart(cart);\n }\n\n function loadShoppingCart() {\n\n var shoppingCart = {};\n\n if (localStorageService.isSupported) {\n\n var cartLoaded = false;\n\n var anonymousCartId = getCartId(true);\n\n if (securitySvc.isAuthenticated()) {\n // First try to load user's cart\n var userCartId = getCartId();\n var userCart = localStorageService.get(userCartId);\n if (!!userCart && !!userCart.rents && userCart.rents.length > 0) {\n shoppingCart = userCart;\n localStorageService.remove(anonymousCartId);\n cartLoaded = true;\n }\n else {\n // Try to load anonymous cart\n var anonymousCart = localStorageService.get(anonymousCartId);\n if (!!anonymousCart) {\n shoppingCart = anonymousCart;\n // Delete the anonymous cart\n localStorageService.remove(anonymousCartId);\n cartLoaded = true;\n }\n }\n }\n\n if (!cartLoaded) {\n shoppingCart = localStorageService.get(getCartId()) || shoppingCart;\n }\n }\n\n recalculateShoppingCart(shoppingCart);\n\n return shoppingCart;\n }\n\n // Cart \n //{\n // id: null,\n // userId: null,\n // studentIds[]: null,\n // isNotRegisteredUser: false,\n // publicNotes: null,\n // orderStatus: 0,\n // auditEvents: null,\n // notRegisteredUserInfo: null,\n // rents: null\n //};\n\n\n function rentShoppingCart(cart) {\n\n var orderModel = orderSvc.createNew();\n orderModel.userId = cart.userId;\n orderModel.studentIds = !!cart.studentId ? [cart.studentId] : [];\n orderModel.isNotRegisteredUser = cart.isNotRegisteredUser;\n orderModel.notRegisteredUserInfo = cart.notRegisteredUserInfo;\n\n orderModel.rents = _.map(cart.rents || [], function (rent) {\n return rentSvc.modelToDTO({\n placeId: rent.placeId,\n rentedItems: _.map(rent.rentedItems || [], function(rentItem) {\n return {\n id: rentItem.id,\n externalId: rentItem.externalId,\n rentCategoryId: rentItem.rentCategoryId,\n itemTypeId: rentItem.itemTypeId\n }\n }),\n fromUtc: rent.startDate,\n toUtc: rent.endDate,\n status: {\n status: 0\n },\n userId: cart.userId,\n studentId: cart.studentId,\n isNotRegisteredUser: cart.isNotRegisteredUser, \n })\n });\n\n return orderSvc.insert(orderModel);\n }\n\n\n return {\n createNew: createNew,\n\n addRentItemToShoppingCart: addRentItemToShoppingCart,\n loadShoppingCart: loadShoppingCart,\n saveShoppingCart: saveShoppingCart,\n rentShoppingCart: rentShoppingCart,\n removeRentItemFromShoppingCart: removeRentItemFromShoppingCart,\n emptyShoppingCart: emptyShoppingCart,\n }\n }\n]);","wbApp.controller('FirebaseCtrl', ['$scope', 'securitySvc', '$window', function ($scope, securitySvc, $window) {\n if (securitySvc.isAuthenticated() && String.prototype.isNullOrWhitespace(securitySvc.loggedInUser().fullName)) {\n if (!$window.location.pathname.startsWith(\"/MyAccount\")) {\n $window.location.href = \"/MyAccount?tabName=user-account\";\n }\n }\n}]);","wbApp.controller('PasswordResetCtrl', ['$scope', 'securitySvc', '$window', '$translate', '$interval',\n function ($scope, securitySvc, $window, $translate, $interval) {\n $scope.model = $scope.model || {\n email: null,\n password: null,\n otp: null\n };\n \n $scope.authCodeWasSend = false;\n $scope.authCodeSending = false;\n $scope.passwordValidationRegEx = securitySvc.passwordValidationRegEx();\n \n $scope.onAuthCodeResend = function() {\n if ($scope.authCodeSending) {\n return;\n }\n if ($scope.form.loginForm_emailInput_textField.$valid) {\n $scope.authCodeSending = true;\n $scope.detailError = null;\n \n securitySvc.sendPasswordResetAuthorizationCode($scope.model.email).then(\n function(success) {\n $scope.authCodeSending = false;\n $scope.authCodeWasSend = true;\n },\n function(error) {\n $scope.authCodeSending = false;\n if (!!error && !!error.title) {\n if (error.title.includes(\"EMAIL_NOT_FOUND\")) {\n $scope.detailError = $translate.instant('TXT_LOGIN_ERROR_USER_NOT_FOUND');\n } else if (error.title.includes('INVALID_EMAIL')) {\n $scope.detailError = $translate.instant('TXT_LOGIN_ERROR_INVALID_EMAIL');\n } else {\n $scope.detailError = error.title;\n }\n } else {\n $scope.detailError = $translate.instant('TXT_OTP_GENERATE_BUSY');\n }\n });\n }\n }\n \n $scope.onPasswordSet = function(model) {\n if ($scope.isSaving) {\n return;\n } \n $scope.isSaving = true;\n securitySvc.confirmPasswordReset(model.email, model.password, model.otp).then(\n function() {\n securitySvc.signIn(model.email, model.password).then(\n function (success) {\n $scope.isSaving = false;\n $window.location.reload();\n },\n function (error) {\n $scope.isSaving = false;\n if (!error) {\n $scope.detailError = $translate.instant('TXT_SIGN_IN_FAILED');\n } else {\n $scope.detailError = securitySvc.gcpErrorCodeToText(error);\n }\n }); \n },\n function(error) {\n console.error(error);\n $scope.isSaving = false;\n if (!error) {\n $scope.detailError = $translate.instant('TXT_OTP_VERIFY_BUSY');\n } else {\n if (!!error.title && error.title.includes(\"One time password does not exist or is expired.\")) {\n $scope.detailError = $translate.instant('TXT_OTP_DOES_NOT_EXIST');\n } else {\n $scope.detailError =error.title;\n }\n }\n \n }\n );\n }\n}]);","wbApp.controller('SignInCtrl', ['$scope', 'securitySvc', '$window', '$translate', '$modal', '$timeout', 'urlUtils',\n function ($scope, securitySvc, $window, $translate, $modal, $timeout, urlUtils) {\n $scope.model = {\n email: null,\n password: null\n };\n\n let signInReturnPath = urlUtils.getQueryParams()['signIn'];\n \n $scope.emailVerificationMode = false;\n \n $scope.onPasswordReset = function() {\n $scope.$hide();\n passwordResetDialogPromise.$promise.then(function () {\n passwordResetDialogPromise.$scope.model = {\n email: $scope.model.email,\n password: null,\n otp: null\n };\n passwordResetDialogPromise.show();\n }); \n }\n \n function signInFlow(model) {\n $scope.isSaving = true;\n securitySvc.signIn(model.email, model.password).then(\n function (success) {\n $scope.isSaving = false;\n $scope.$hide();\n if (!!signInReturnPath) {\n $timeout(function () {\n $window.location = signInReturnPath;\n }, 500); \n } else {\n $timeout(function () {\n $window.location.reload();\n }, 500);\n }\n },\n function (error) {\n if (!error) {\n $scope.detailError = $translate.instant('TXT_SIGN_IN_FAILED');\n $scope.isSaving = false;\n return;\n }\n switch(error.code) {\n case 'wb/user-email-not-verified':\n $scope.emailVerificationMode = true;\n securitySvc.sendEmailVerificationAuthorizationCode(model.email).then(\n function(evSuccess) {\n $scope.isSaving = false;\n },\n function(evError) {\n if (!!evError && !!evError.title) {\n if (evError.title.includes(\"EMAIL_NOT_FOUND\")) {\n $scope.detailError = $translate.instant('TXT_LOGIN_ERROR_USER_NOT_FOUND');\n } else if (evError.title.includes('INVALID_EMAIL')) {\n $scope.detailError = $translate.instant('TXT_LOGIN_ERROR_INVALID_EMAIL');\n } else {\n $scope.detailError = evError.title;\n }\n } else {\n $scope.detailError = $translate.instant('TXT_OTP_GENERATE_BUSY');\n }\n $scope.isSaving = false;\n }\n )\n break;\n default:\n $scope.detailError = securitySvc.gcpErrorCodeToText(error);\n }\n $scope.isSaving = false;\n });\n }\n \n function emailVerificationFlow(model) {\n $scope.isSaving = true;\n securitySvc.confirmEmailVerification(model.email, model.otp).then(\n function() {\n signInFlow(model);\n },\n function(error) {\n $scope.isSaving = false;\n if (!error) {\n $scope.detailError = $translate.instant('TXT_OTP_VERIFY_BUSY');\n } else {\n if (!!error.title && error.title.includes(\"One time password does not exist or is expired.\")) {\n $scope.detailError = $translate.instant('TXT_OTP_DOES_NOT_EXIST');\n } else if (!!error.title) {\n $scope.detailError = error.title;\n } else if (!!error.code) {\n $scope.detailError = securitySvc.gcpErrorCodeToText(error); \n }\n }\n }\n );\n }\n \n $scope.onSignIn = function(model) {\n if ($scope.isSaving) {\n return;\n }\n \n if ($scope.emailVerificationMode) {\n return emailVerificationFlow(model); \n } else {\n return signInFlow(model); \n }\n }\n\n var passwordResetDialogPromise = $modal({\n templateUrl: 'sign-in/password-reset-dialog.html',\n show: false,\n scope: $scope.$new(true)\n });\n}]);","wbApp.directive('wbAddressLookup', ['geoCoderSvc',\n function (geoCoderSvc) {\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n formattedAddress: '=',\n location: '=ngModel',\n wbPlaceholder: '@',\n },\n template: '
' +\n '' +\n '
',\n replace: true,\n link: function (scope, iElem, attr, controller) {\n\n scope.getAddress = function (val) {\n return geoCoderSvc.geocode(val);\n }\n\n function onLocationChange(val) {\n if (val && val.longitude && val.latitude) {\n let geo = geoCoderSvc.geoDecode(val.latitude, val.longitude);\n geo.then(function (addresses) {\n if (addresses.length && !angular.equals(scope.addressJson, addresses[0])) {\n\n let newLocation = {\n latitude: addresses[0].geometry.location.lat(),\n longitude: addresses[0].geometry.location.lng()\n };\n \n // if ((newLocation.longitude === val.latitude && newLocation.longitude === val.longitude) ||\n // !scope.formattedAddress) {\n scope.addressJson = addresses[0];\n scope.onChange(addresses[0]);\n // } else {\n // scope.addressJson = scope.formattedAddress;\n // }\n }\n });\n }\n }\n\n scope.$watch('location', function (val) {\n if (!scope.lastLocationUpdate) {\n scope.lastLocationUpdate = angular.copy(val);\n scope.addressJson = scope.formattedAddress;\n }\n else {\n if (!angular.equals(scope.lastLocationUpdate, val)) {\n scope.lastLocationUpdate = angular.copy(val);\n onLocationChange(val);\n }\n }\n }, true);\n\n scope.onChange = function (val) {\n if (val) {\n if (typeof val === 'string' || val instanceof String) {\n } else {\n if (val.geometry && val.geometry.location) {\n let newLocation = {\n latitude: val.geometry.location.lat(),\n longitude: val.geometry.location.lng()\n };\n\n scope.lastLocationUpdate = angular.copy(newLocation);\n \n if (!angular.equals(newLocation, scope.location)) {\n scope.location = newLocation;\n }\n scope.addressJson = val;\n }\n if (scope.formattedAddress !== val.formatted_address) {\n scope.formattedAddress = val.formatted_address;\n }\n }\n } else {\n scope.formattedAddress = null;\n scope.location = {\n latitude: null, longitude: null\n };\n }\n }\n }\n }\n }]);","wbApp.directive('wbAgeRangeCombo', ['$timeout', '$translate', 'ageRangeSvc',\n function ($timeout, $translate, ageRangeSvc) {\n function formatResult(ageRange) {\n if (!ageRange) { return; }\n\n return ageRange.name;\n }\n\n function formatSelection(ageRange) {\n return ageRange.name;\n }\n\n function filterData(data, ageRanges, filterByAgeRanges) { \n ageRanges.$promise.then(function (ar) { \n var fres = _.filter(ar, function (r) {\n return !filterByAgeRanges || !!filterByAgeRanges[r.ageRangeID];\n });\n\n data.length = 0;\n data.push.apply(data, fres);\n });\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n priority: 1,\n scope: {\n allowClear: '=',\n filterByAgeRanges: '='\n },\n link: function (scope, elm, attrs, ctrl) {\n\n var ageRanges = ageRangeSvc.getAllAsync();\n var data = [];\n\n if (scope.filterByAgeRanges) {\n filterData(data, ageRanges, scope.filterByAgeRanges);\n } else {\n data = ageRanges;\n }\n\n $timeout(function () {\n\n $(elm).select2({\n placeholder: $translate.instant('TXT_PLACEHOLDER_SELECT_AGE'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: scope.allowClear || false,\n minimumResultsForSearch: -1,\n id: function (ageRange) { return ageRange.ageRangeID; },\n data: data\n });\n\n ctrl.$render();\n });\n\n scope.$watch('filterByAgeRanges', function (value) {\n filterData(data, ageRanges, value);\n });\n\n ctrl.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ctrl.$formatters.unshift(function (value) {\n if (!value) {\n return \"\";\n } else {\n return value + \"\";\n }\n });\n\n ctrl.$render = function () {\n ageRanges.$promise.then(function () {\n $(elm).select2('val', ctrl.$viewValue);\n });\n }\n\n elm.on('change', function (e) {\n scope.$apply(function () {\n ctrl.$setViewValue(e.val); \n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n }\n\n\n }\n }]);","'use strict';\n\nwbApp.directive('wbAttendanceStatusLookup', ['$timeout',\n function ($timeout) {\n return {\n restrict: 'A',\n require: 'ngModel',\n replace: true,\n priority: 1,\n scope: { \n },\n template: \"\",\n link: function (scope, elm, attrs, controller) {\n $timeout(function () {\n $(elm).select2({\n minimumResultsForSearch: -1\n });\n\n controller.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n controller.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n elm.on('change', function (e) {\n scope.$apply(function () {\n controller.$setViewValue(e.val);\n });\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }, 1);\n }\n }\n }]);\n","wbApp.directive('wbAutoFillFix', ['$timeout', function ($timeout) {\n return {\n require: 'ngModel',\n link: function (scope, elem, attrs, ngModel) {\n var origVal = elem.val();\n $timeout(function () {\n var newVal = elem.val();\n if (ngModel.$pristine && newVal && origVal !== newVal) {\n ngModel.$setViewValue(newVal);\n }\n }, 150);\n $timeout(function () {\n var newVal = elem.val();\n if (ngModel.$pristine && newVal && origVal !== newVal) {\n ngModel.$setViewValue(newVal);\n }\n }, 1000);\n $timeout(function () {\n var newVal = elem.val();\n if (ngModel.$pristine && newVal && origVal !== newVal) {\n ngModel.$setViewValue(newVal);\n }\n }, 2000);\n }\n }\n}]);","'use strict';\n\nwbApp.directive('wbClassroomCombo', ['$timeout', '$translate', 'classroomSvc',\n function ($timeout, $translate, classroomSvc) {\n function formatResult(model) {\n if (!model) { return; }\n\n if (model.isDeleted) {\n if (model.description) {\n return \"
\" +\n \"
\" + model.name + ' (' + $translate.instant('TXT_VAL_DELETED') + ')' + \"
\" +\n \"
\" + (model.description || '') + \"
\" +\n \"
\";\n } else {\n return \"
\" +\n \"
\" + model.name + ' (' + $translate.instant('TXT_VAL_DELETED') + ')' + \"
\" +\n \"
\";\n }\n } else {\n if (!model.active) {\n if (model.description) {\n return \"
\" +\n \"
\" + model.name + ' (' + $translate.instant('TXT_VAL_NOT_ACTIVE') + ')' + \"
\" +\n \"
\" + (model.description || '') + \"
\" +\n \"
\";\n } else {\n return \"
\" +\n \"
\" + model.name + ' (' + $translate.instant('TXT_VAL_NOT_ACTIVE') + ')' + \"
\" +\n \"
\";\n }\n } else {\n if (model.description) {\n return \"
\" +\n \"
\" + model.name + \"
\" +\n \"
\" + (model.description || '') + \"
\" +\n \"
\";\n } else {\n return \"
\" +\n \"
\" + model.name + \"
\" +\n \"
\";\n }\n }\n }\n }\n\n function formatSelection(model) {\n if (model.isDeleted) {\n return model.name + ' (' + $translate.instant('TXT_VAL_DELETED') + ')'\n } else {\n if (!model.active) {\n return model.name + ' (' + $translate.instant('TXT_VAL_NOT_ACTIVE') + ')'\n } else {\n return model.name;\n }\n }\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n priority: 1,\n replace: true,\n scope: {\n filterForReservations: '=',\n filterForCourses: '=',\n allowClear: '='\n },\n link: function (scope, elm, attrs, ctrl) {\n var models = classroomSvc.getAllActiveAsync( /* classroomIDtoInclude */ ctrl.$modelValue, /* filterForReservations */ !!scope.filterForReservations, /* filterForCourses */ !!scope.filterForCourses);\n $timeout(function () {\n\n $(elm).select2({\n placeholder: (typeof scope.placeholder !== 'undefined') \n ? attrs.placeholder\n : $translate.instant('TXT_PLACEHOLDER_SELECT_CLASSROOM'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: (typeof scope.allowClear !== 'undefined') ? scope.allowClear : true,\n minimumResultsForSearch: -1,\n data: models\n });\n\n ctrl.$render();\n });\n\n ctrl.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ctrl.$formatters.unshift(function (value) {\n if (!value) {\n return \"\";\n } else {\n return value + \"\";\n }\n });\n\n ctrl.$render = function () {\n models.$promise.then(function () {\n $(elm).select2('val', ctrl.$viewValue);\n });\n }\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n }\n }\n }]); ","'use strict';\n\nwbApp.directive('wbCountryCodeCombo', ['$timeout', '$translate',\n function ($timeout, $translate) {\n\n function formatResult(item) {\n if (!item) { return; }\n\n return $translate.instant(item.text);\n }\n\n function formatSelection(item) {\n return $translate.instant(item.text);\n }\n\n\n return {\n restrict: 'A',\n require: 'ngModel',\n replace: true,\n priority: 1,\n link: function (scope, elm, attrs, controller) {\n $timeout(function () {\n $(elm).select2({\n minimumResultsForSearch: -1,\n formatResult: formatResult,\n formatSelection: formatSelection,\n data: [{ id: 'CZ', text: 'TXT_COUNTRY_CODE_CZ' }, { id: 'SK', text: 'TXT_COUNTRY_CODE_SK' }]\n });\n\n elm.on('change', function (event) {\n scope.$apply(function () {\n controller.$setViewValue(event.val);\n });\n });\n\n scope.$watch(attrs.ngModel, function (current, old) {\n $(elm).select2('val', current || 'M');\n }, true);\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n if (attrs.ngEnable) {\n scope.$watch(attrs.ngEnable, function (newVal) {\n elm.select2('enable', !!newVal);\n });\n }\n }, 1);\n }\n }\n }]);\n","'use strict';\n\nwbApp.directive('wbCourseTypeLookup', ['$timeout', '$translate', 'courseTypeSvc',\n function ($timeout, $translate, courseTypeSvc) {\n\n function format(courseType) {\n if (courseType.id) return courseType.name; \n }\n\n function filterData(data, courseTypes, filterByCourseTypes) {\r\n courseTypes.$promise.then(function (ar) {\r\n var fres = _.filter(ar, function (r) {\r\n return !filterByCourseTypes || !!filterByCourseTypes[r.id];\r\n });\r\n\r\n data.length = 0;\r\n data.push.apply(data, fres);\r\n });\r\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n priority: 1,\n scope: {\n allowClear: '=',\r\n filterByCourseTypes: '='\r\n },\n link: function (scope, elm, attrs, ctrl) {\n\n var lookupData = courseTypeSvc.getAllForLookup();\n var data = [];\n\n filterData(data, lookupData, scope.filterByCourseTypes);\n\n $timeout(function () {\n $(elm).select2({\n placeholder: $translate.instant('TXT_PLACEHOLDER_SELECT_COURSE_TYPE'),\n dropdownAutoWidth: true,\n allowClear: scope.allowClear || false,\n minimumResultsForSearch: -1,\n formatResult: format,\n formatSelection: format,\n data: data\n });\n\n ctrl.$render();\n });\n\n scope.$watch('filterByCourseTypes', function (value) {\r\n filterData(data, lookupData, value);\r\n });\n\n ctrl.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ctrl.$formatters.unshift(function (value) {\n if (!value) {\n return \"\";\n } else {\n return value + \"\";\n }\n });\n\n ctrl.$render = function () {\n lookupData.$promise.then(function () {\n elm.select2('val', ctrl.$viewValue);\n });\n };\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }\n }\n }]);\n","wbApp.directive('wbCurrencyCombo', ['$timeout', '$translate',\n function ($timeout, $translate) {\n\n function formatResult(item) {\n if (!item) { return; }\n\n return $translate.instant(item.text);\n }\n\n function formatSelection(item) {\n return $translate.instant(item.text);\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elm, attrs, ctrl) {\n\n $timeout(function () {\n $(elm).select2({\n minimumResultsForSearch: -1,\n formatResult: formatResult,\n formatSelection: formatSelection,\n data: [\n { id: 'CZK', text: 'TXT_VAL_CURRENCY_CZK' },\n { id: 'EUR', text: 'TXT_VAL_CURRENCY_EUR' }\n ]\n });\n\n ctrl.$render();\n });\n\n ctrl.$render = function () {\n elm.select2('val', ctrl.$viewValue || 'CZK');\n };\n\n elm.on('change', function (event) {\n scope.$apply(function () {\n ctrl.$setViewValue(event.val);\n });\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }\n }\n }]);","wbApp.directive('wbCurrencyEdit', ['$timeout', 'tenantInfo',\nfunction ($timeout, tenantInfo) {\n\n function getCurrencySymbol(tenantInfo) {\n switch (tenantInfo.currency) {\n case 'CZK':\n return ' Kč';\n case 'EUR':\n return ' €';\n default:\n return ' Kč';\n }\n }\n\n return {\n restrict: 'A',\n require: '?ngModel',\n priority: 10000,\n link: function (scope, element, attr, ngModel) {\n var destroyed = false;\n var initialized = false;\n\n $timeout(function () {\n element.autoNumeric('init',\n {\n aSign: getCurrencySymbol(tenantInfo),\n aDec: ',', \n //altDec: '.',\n aSep: ' ',\n pSign: 's',\n mDec: '2',\n vMin: attr.min !== undefined ? attr.min : -9999999999999.99,\n vMax: attr.max !== undefined ? attr.max : 9999999999999.99\n });\n\n initialized = true;\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (viewValue !== null && viewValue !== undefined) {\n if (typeof viewValue === 'string' || viewValue instanceof String) {\n if (viewValue == '') {\n return null;\n } else {\n return parseFloat(viewValue.replace(/,/g, '.'));\n }\n }\n\n return viewValue;\n }\n\n return null;\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (value !== null && value !== undefined) {\n return value + \"\";\n }\n return null;\n });\n\n\n ngModel.$render = function () {\n if (!destroyed) {\n\n if (initialized) {\n element.autoNumeric('set', ngModel.$viewValue);\n } else {\n $timeout(function () {\n element.autoNumeric('set', ngModel.$viewValue);\n });\n }\n }\n };\n\n element.on('blur keyup change', function () {\n scope.$evalAsync(read);\n });\n\n function read() {\n var amt = element.autoNumeric('get');\n ngModel.$setViewValue(amt);\n }\n\n $(element).on(\"remove\", function () {\n destroyed = true;\n element.autoNumeric(\"destroy\");\n })\n }\n };\n}]);","wbApp.directive('wbDecimalEdit', ['$timeout',\nfunction ($timeout) {\n return {\n restrict: 'A',\n require: '?ngModel',\n priority: 10000,\n link: function (scope, element, attr, ngModel) {\n var destroyed = false;\n var initialized = false;\n\n $timeout(function () {\n element.autoNumeric('init',\n {\n aSign: '',\n aDec: ',',\n aSep: ' ',\n pSign: 's',\n mDec: '2',\n vMin: attr.min !== undefined ? attr.min : -9999999999999.99,\n vMax: attr.max !== undefined ? attr.max : 9999999999999.99\n });\n\n initialized = true;\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n if (attr.required) {\n return 0;\n } else {\n return null;\n }\n } else {\n if (typeof viewValue === 'string' || viewValue instanceof String) {\n return parseFloat(viewValue.replace(/,/g, '.'));\n }\n\n return viewValue;\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n if (attr.required) {\n return \"0\";\n } else {\n return null;\n }\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n if (!destroyed) {\n\n if (initialized) {\n if (attr.required) {\n element.autoNumeric('set', ngModel.$viewValue || '0');\n } else {\n element.autoNumeric('set', ngModel.$viewValue);\n } \n } else {\n $timeout(function () {\n if (attr.required) {\n element.autoNumeric('set', ngModel.$viewValue || '0');\n } else {\n element.autoNumeric('set', ngModel.$viewValue);\n }\n });\n }\n }\n };\n\n element.on('blur keyup change', function () {\n scope.$evalAsync(read);\n });\n\n function read() {\n var amt = element.autoNumeric('get');\n ngModel.$setViewValue(amt);\n }\n\n $(element).on(\"remove\", function () {\n destroyed = true;\n element.autoNumeric(\"destroy\");\n })\n }\n };\n}]);","'use strict';\n\nwbApp.directive('wbGenderCombo', ['$timeout', '$translate',\n function ($timeout, $translate) {\n\n function formatResult(item) {\n if (!item) { return; }\n\n return $translate.instant(item.text);\n }\n\n function formatSelection(item) {\n return $translate.instant(item.text);\n }\n\n\n return {\n restrict: 'A',\n require: 'ngModel',\n replace: true,\n priority: 1,\n link: function (scope, elm, attrs, controller) {\n $timeout(function () {\n $(elm).select2({\n minimumResultsForSearch: -1,\n formatResult: formatResult,\n formatSelection: formatSelection,\n data: [{ id: 'M', text: 'TXT_VAL_MALE' }, { id: 'F', text: 'TXT_VAL_FEMALE' }]\n });\n\n elm.on('change', function (event) {\n scope.$apply(function () {\n controller.$setViewValue(event.val);\n });\n });\n\n scope.$watch(attrs.ngModel, function (current, old) {\n $(elm).select2('val', current || 'M');\n }, true);\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n if (attrs.ngEnable) {\n scope.$watch(attrs.ngEnable, function (newVal) {\n elm.select2('enable', !!newVal);\n });\n }\n }, 1);\n }\n }\n }]);\n","angular.module('WBGrid', []).\n directive('wbGrid2', ['$filter','$translate', '$rootScope', '$http', '$tooltip', '$timeout', 'messageBoxSvc', 'uiUtilsSvc', 'gridSortSvc',\n function ($filter, $translate, $rootScope, $http, $tooltip, $timeout, messageBoxSvc, uiUtilsSvc, gridSortSvc) {\n return {\n restrict: 'AE',\n replace: 'true',\n scope: {\n gridOptions: '=',\n filterOptions: '=',\n ngModel: '=',\n rowSelected: '&',\n selectionChanged: '&',\n filterApplied: '&',\n rowEdit: '&',\n rowDelete: '&',\n rowAdd: '&',\n rowAddDisabled: '=',\n },\n templateUrl: 'directives/wb-grid2-tmpl.html',\n link: function(scope, elem, attrs) {\n scope.rows = [];\n scope.filteredRows = [];\n scope.selectedPage = 1;\n scope.pages = [];\n scope.filters = {};\n scope.sorts = {};\n scope.pageSizes = [\n { value: 5, text: \"5\" },\n { value: 10, text: \"10\" },\n { value: 20, text: \"20\" },\n { value: 30, text: \"30\" },\n { value: 40, text: \"40\" },\n { value: 50, text: \"50\" }];\n scope.hideFooter = scope.gridOptions.hideFooter;\n scope.noCommandColumn = scope.gridOptions.noCommandColumn;\n scope.rowNumberColumn = scope.gridOptions.rowNumberColumn;\n scope.disableRowSelection = scope.gridOptions.disableRowSelection;\n scope.multiSelect = scope.gridOptions.multiSelect;\n scope.grouping = scope.gridOptions.grouping || { enabled: false }\n scope.pageSize = scope.hideFooter ? 999999 : (scope.gridOptions.pageSize ? scope.gridOptions.pageSize : 30);\n scope.allSelected = { selected: false };\n scope.disabledField = scope.gridOptions.disabledField;\n scope.selectedField = scope.gridOptions.selectedField || 'isSelected';\n scope.highlightedField = scope.gridOptions.highlightedField;\n scope.dangerField = scope.gridOptions.dangerField;\n scope.dangerFn = scope.gridOptions.dangerFn;\n scope.disabledAreSelectable = scope.gridOptions.disabledAreSelectable;\n scope.scrollbarWidth = uiUtilsSvc.getScrollbarWidth();\n scope.disableDeleteConfirmation = scope.gridOptions.disableDeleteConfirmation || false;\n\n var rndId = 'wb-table-content-parent-' + (new Date()).getTime() + '-' + Math.floor((Math.random() * 100000000) + 1);\n $(elem).find('.wb-table-content-parent').attr('id', rndId);\n\n var dropdown = null;\n\n function setIsAllSelected() {\n // $timeout(function () {\n for (var r = 0; r < scope.filteredRows.length; r++) {\n var m = scope.filteredRows[r];\n if (scope.disabledField && m[scope.disabledField] && !scope.disabledAreSelectable) {\n continue;\n }\n if (!m[scope.selectedField]) {\n scope.allSelected.selected = false;\n return;\n }\n }\n\n if (scope.filteredRows.length > 0) {\n scope.allSelected.selected = true;\n }\n //});\n }\n\n var busyTooltip = $tooltip(elem, { title: '

  ' + $translate.instant('TXT_LOADING_DATA') + ' ...

', trigger: 'manual', placement: 'top center', html: true });\n\n scope.toggleGroupRowExpand = function (row) {\n row.__expanded__ = !row.__expanded__;\n }\n\n scope.$watch('ngModel', function (newValue) {\n if (newValue && newValue.$promise && !newValue.$promise.$resolved) {\n\n busyTooltip.$promise.then(busyTooltip.show);\n\n function hideToolTip() {\n busyTooltip.$promise.then(busyTooltip.hide);\n }\n\n newValue.$promise.then(hideToolTip, hideToolTip);\n }\n });\n\n scope.onSelectAllClick = function () {\n var m = null;\n var s = false;\n var sc = false;\n if (scope.allSelected.selected) {\n for (var r = 0; r < scope.filteredRows.length; r++) {\n m = scope.filteredRows[r];\n if (scope.disabledField && m[scope.disabledField] && !scope.disabledAreSelectable) {\n continue;\n }\n if (!m[scope.selectedField]) {\n m[scope.selectedField] = true;\n s = true;\n sc = true;\n }\n }\n } else {\n for (var r = 0; r < scope.filteredRows.length; r++) {\n m = scope.filteredRows[r];\n if (scope.disabledField && m[scope.disabledField] && !scope.disabledAreSelectable) {\n continue;\n }\n if (m[scope.selectedField]) {\n m[scope.selectedField] = false;\n sc = true;\n }\n }\n }\n\n if (s && scope.rowSelected()) {\n scope.rowSelected()(getSelectedRow());\n }\n if (sc && scope.selectionChanged()) {\n scope.selectionChanged()();\n }\n }\n\n function getSelectedRow() {\n var selection = [];\n\n for (var r = 0; r < scope.ngModel.length; r++) {\n var m = scope.ngModel[r];\n if (m[scope.selectedField]) {\n selection.push(m);\n if (!scope.multiSelect) {\n break;\n }\n }\n }\n\n return scope.multiSelect\n ? selection\n : selection.length > 0 ? selection[0] : null;\n }\n \n function prepareCommandMenu() {\n var commandMenu = [];\n\n var selectedRow = getSelectedRow();\n\n if (scope.rowAdd && scope.rowAdd() && !scope.rowAddDisabled) {\n commandMenu.push({\n \"text\": $translate.instant('TXT_MENU_NEW'),\n \"click\": \"onDropdownNewClick()\"\n });\n }\n\n if (scope.rowEdit && scope.rowEdit()) {\n if (selectedRow &&\n (scope.gridOptions.hideEdit && !scope.gridOptions.hideEdit(selectedRow)) ||\n !(scope.gridOptions.hideEdit)) {\n commandMenu.push({\n \"text\": $translate.instant('TXT_MENU_EDIT'),\n \"click\": \"onDropdownEditClick()\"\n });\n }\n }\n\n if (scope.gridOptions.customCmds && scope.gridOptions.customCmds.length > 0) {\n var first = true;\n for (var c = 0; c < scope.gridOptions.customCmds.length; c++) {\n var command = scope.gridOptions.customCmds[c];\n if ((command.hide && selectedRow && !command.hide(selectedRow)) || !command.hide) {\n if (first) {\n first = false;\n if (commandMenu.length > 0) {\n commandMenu.push({ \"divider\": true });\n }\n }\n commandMenu.push({\n \"text\": $translate.instant(command.text),\n \"click\": \"onDropdownCustomCommandClick(\" + c + \")\"\n });\n }\n }\n }\n\n if (scope.rowDelete && scope.rowDelete()) {\n if (selectedRow &&\n (scope.gridOptions.hideDelete && !scope.gridOptions.hideDelete(selectedRow)) ||\n !(scope.gridOptions.hideDelete)) {\n if (commandMenu.length > 0 && !commandMenu[commandMenu.length - 1].divider) {\n commandMenu.push({ \"divider\": true });\n }\n\n commandMenu.push(\n {\n \"text\": $translate.instant('TXT_MENU_DELETE'),\n \"click\": \"onDropdownDeleteClick()\"\n });\n }\n }\n return commandMenu;\n }\n\n scope.commandDropdown = [];\n scope.onDropdownNewClick = function () {\n var selectedRow = getSelectedRow();\n if (scope.rowAdd && scope.rowAdd() && !scope.rowAddDisabled) {\n scope.rowAdd()(getSelectedRow());\n }\n }\n scope.onDropdownCustomCommandClick = function (idx) {\n var command = scope.gridOptions.customCmds[idx];\n if (command && command.command) {\n command.command(getSelectedRow(), scope.filteredRows);\n }\n }\n\n scope.onDropdownEditClick = function () {\n var selectedRow = getSelectedRow();\n if (scope.rowEdit && scope.rowEdit() && selectedRow &&\n ((scope.gridOptions.hideEdit && !scope.gridOptions.hideEdit(selectedRow)) || !(scope.gridOptions.hideEdit))) {\n scope.rowEdit()(selectedRow);\n }\n }\n\n scope.onDropdownDeleteClick = function () {\n var selectedRow = getSelectedRow();\n if (scope.rowDelete && scope.rowDelete() && selectedRow) {\n\n if (scope.disableDeleteConfirmation) {\n scope.rowDelete()(selectedRow);\n } else {\n messageBoxSvc.showMessageDlg({\n title: 'TXT_TITLE_CONFIRM_DELETE',\n message: 'TXT_TEXT_CONFIRM_DELETE',\n buttons: [{\n text: 'TXT_BTN_NO'\n }, {\n text: 'TXT_BTN_YES',\n callback: function () { scope.rowDelete()(selectedRow); }\n }]\n });\n }\n }\n }\n\n scope.showCommandMenu = function (e) {\n scope.commandDropdown = prepareCommandMenu();\n return false;\n }\n\n scope.onRowDblClick = function (row) {\n var selectedRow = getSelectedRow();\n if (scope.rowEdit && scope.rowEdit() && selectedRow &&\n ((scope.gridOptions.hideEdit && !scope.gridOptions.hideEdit(selectedRow)) || !(scope.gridOptions.hideEdit))) {\n scope.rowEdit()(selectedRow);\n }\n }\n\n scope.onAddMenuClick = function () {\n var selectedRow = getSelectedRow();\n if (scope.rowAdd && scope.rowAdd() && !scope.rowAddDisabled) {\n scope.rowAdd()(getSelectedRow());\n }\n }\n\n scope.onPageSizeChange = function(pageSize) {\n if (pageSize && pageSize > 0) {\n scope.recalculatePages();\n scope.selectPage(scope.selectedPage);\n }\n }\n\n scope.recalculatePages = function() {\n scope.pages.length = 0;\n var pages = scope.filteredRows.length / scope.pageSize;\n for (var p = 0; p < pages; p++) {\n scope.pages.push(p);\n }\n }\n\n scope.onHeaderClick = function (col) {\n\n if (!scope.gridOptions.sortInfo) {\n return;\n }\n\n for (var c = 0; c < scope.gridOptions.columnDefs.length; c++) {\n var column = scope.gridOptions.columnDefs[c];\n if (column !== col) {\n column.sortDirection = null;\n }\n }\n\n if (col.sortDirection === 'dsc') {\n col.sortDirection = 'asc';\n } else {\n col.sortDirection = 'dsc';\n }\n\n scope.applyFilters();\n scope.selectPage(scope.selectedPage);\n }\n\n function getSortByProperty(options) {\n for (var c = 0; c < options.columnDefs.length; c++) {\n var column = options.columnDefs[c];\n if (column.sortDirection && (column.sortDirection === 'asc' || column.sortDirection === 'dsc')) {\n return {\n field: column.field,\n direction: column.sortDirection\n };\n }\n }\n\n if (options.sortInfo) {\n var field = options.sortInfo.fields[0];\n var direction = options.sortInfo.directions[0];\n\n for (var c = 0; c < options.columnDefs.length; c++) {\n var column = options.columnDefs[c];\n if (column.field === field) {\n column.sortDirection = direction;\n return {\n field: field,\n direction: direction\n }\n }\n }\n }\n\n return null;\n }\n\n function getCellFilters(columnDefs) {\n var cellFilters = {};\n for (var i = 0; i < columnDefs.length; i++) {\n var row = columnDefs[i];\n if (row.cellFilter) {\n cellFilters[row.field] = parseFilter(row.cellFilter);\n }\n }\n\n return cellFilters;\n }\n\n function getCellSorts(columnDefs) {\n var cellSorts = {};\n for (var i = 0; i < columnDefs.length; i++) {\n var row = columnDefs[i];\n if (row.sort) {\n cellSorts[row.field] = gridSortSvc[row.sort];\n }\n }\n\n return cellSorts;\n }\n\n scope.applyFilters = function() {\n scope.filteredRows.length = 0;\n\n\n var cellFilters = getCellFilters(scope.gridOptions.columnDefs);\n\n function comparator(value, text) {\n text = (''+text).toLowerCase();\n return (''+value).toLowerCase().indexOf(text) > -1;\n }\n\n function filterImp(row) {\n var result = true;\n var value;\n\n var globalFilter = scope.filterOptions && scope.filterOptions.filterText ? scope.filterOptions.filterText : null;\n var globalFilterFunction = scope.filterOptions && scope.filterOptions.filterFunction ? scope.filterOptions.filterFunction : null;\n if (globalFilter || globalFilterFunction) {\n var r = [{}];\n for (var c = 0; c < scope.gridOptions.columnDefs.length; c++) {\n var field = scope.gridOptions.columnDefs[c].field;\n \n if (cellFilters[field] && cellFilters[field].filterName === \"wbCurrencyFlt\") {\n // For these do not apply filter prior searching\n r[0][field] = row[field];\n } else if (cellFilters[field] && cellFilters[field].filterName === \"checkmark\") {\n // do not search for bit values globaly\n // r[0][field] = !!row[field] ? 1 : 0;\n } else {\n value = cellFilters[field] ? $filter(cellFilters[field].filterName)(row[field], cellFilters[field].params) : row[field];\n r[0][field] = value;\n }\n }\n if (globalFilter && $filter('filter')(r, globalFilter).length === 0) {\n return false;\n }\n if (globalFilterFunction && $filter('filter')(r, globalFilterFunction).length === 0) {\n return false;\n }\n }\n\n for(var field in scope.filters) {\n\n var text = scope.filters[field];\n if (text) {\n if (cellFilters[field] && cellFilters[field].filterName === \"wbCurrencyFlt\") {\n // For these do not apply filter prior searching\n value = row[field];\n } else if (cellFilters[field] && cellFilters[field].filterName === \"checkmark\") {\n value = !!row[field] ? 1 : 0\n } else {\n value = cellFilters[field] ? $filter(cellFilters[field].filterName)(row[field], cellFilters[field].params) : row[field];\n }\n var comp = comparator(value, text);\n result &= comp;\n }\n }\n return result;\n }\n\n var filteredRows = $filter('filter')(scope.ngModel, filterImp);\n var sortBy = getSortByProperty(scope.gridOptions);\n\n var cellSorts = getCellSorts(scope.gridOptions.columnDefs);\n\n var sortedRows = !!sortBy ? $filter('orderBy')(filteredRows, function (row) {\n\n var sort = cellSorts[sortBy.field];\n if (sort) {\n return sort(row[sortBy.field])\n }\n\n var filter = cellFilters[sortBy.field];\n\n if (filter && filter.filterName && filter.filterName.substring(0, \"date:\".length) === \"date\") {\n return gridSortSvc.date(row[sortBy.field]);\n } else {\n // TODO: Shouldn't we sort based on filtered values\n return row[sortBy.field];\n }\n }, sortBy.direction === 'dsc') : filteredRows;\n\n scope.filteredRows.push.apply(scope.filteredRows, sortedRows);\n\n if (scope.filterApplied && scope.filterApplied()) {\n scope.filterApplied()(scope.filteredRows);\n }\n }\n\n scope.$watch('filterOptions', function () {\n\n scope.selectedPage = 1; // reset paging\n scope.applyFilters();\n scope.recalculatePages();\n scope.selectPage(scope.selectedPage);\n }, true);\n\n scope.$watch('filters', function () {\n scope.selectedPage = 1; // reset paging\n scope.applyFilters();\n scope.recalculatePages();\n scope.selectPage(scope.selectedPage);\n }, true);\n\n scope.$watchCollection('ngModel', function (newValue, oldValue) {\n scope.applyFilters();\n scope.recalculatePages();\n scope.selectPage(scope.selectedPage);\n setIsAllSelected();\n });\n\n scope.selectPage = function(pageNo) {\n var nPageNo = Math.max(0, Math.min(scope.pages.length - 1, pageNo - 1));\n scope.rows = scope.filteredRows.slice(nPageNo * scope.pageSize, (nPageNo + 1) * scope.pageSize);\n scope.selectedPage = nPageNo + 1;\n }\n\n\n scope.onPageSizeChange = function(pageSize) {\n scope.recalculatePages();\n scope.selectPage(scope.selectedPage);\n }\n\n scope.onRowClicked = function (row) {\n\n if (scope.disableRowSelection) {\n\n if (scope.grouping.enabled && row[scope.grouping.isGroupRowPropertyName]) {\n scope.toggleGroupRowExpand(row);\n }\n\n return;\n }\n\n var oldVal = row[scope.selectedField];\n\n // Do nothing if row is disabled\n if (scope.disabledField && row[scope.disabledField] && !scope.disabledAreSelectable) {\n return;\n }\n\n if (scope.multiSelect) {\n row[scope.selectedField] = !row[scope.selectedField]\n } else {\n for (var r = 0; r < scope.ngModel.length; r++) {\n var m = scope.ngModel[r];\n if (m !== row && m[scope.selectedField]) {\n m[scope.selectedField] = false;\n }\n }\n row[scope.selectedField] = true;\n }\n\n setIsAllSelected();\n\n if (scope.rowSelected() && row[scope.selectedField]) {\n scope.rowSelected()(row);\n }\n\n if (oldVal != row[scope.selectedField]) {\n if (scope.selectionChanged()) {\n scope.selectionChanged()();\n }\n }\n }\n\n scope.rowSelectionClicked = function (row) {\n // Do nothing if row is disabled\n if (scope.disabledField && row[scope.disabledField] && !scope.disabledAreSelectable) {\n return;\n }\n\n setIsAllSelected();\n\n if (scope.rowSelected() && row[scope.selectedField]) {\n scope.rowSelected()(row);\n }\n\n if (scope.selectionChanged()) {\n scope.selectionChanged()();\n }\n }\n\n scope.exportDropdown = [{\n \"text\": $translate.instant('TXT_EXPORT_CSV'),\n \"click\": \"onCSVExportClick()\"\n }, {\n \"text\": $translate.instant('TXT_EXPORT_XLS'),\n \"click\": \"onXLSExportClick()\"\n }];\n\n scope.onCSVExportClick = function () {\n genericDataExport('Csv');\n }\n\n scope.onXLSExportClick = function () {\n genericDataExport('Xls');\n }\n\n function prepareData() {\n\n function shouldApplyFilter(cellFilter) {\n if (!cellFilter) {\n return false;\n }\n\n if (cellFilter === \"wbCurrencyFlt\" ||\n cellFilter === \"checkmark\") {\n return false;\n }\n\n return true;\n }\n\n var keys = [];\n var columns = [];\n for (var f in scope.gridOptions.columnDefs) {\n var colDef = scope.gridOptions.columnDefs[f];\n if (colDef.field && !colDef.noExport) {\n keys.push({\n field: colDef.field,\n filter: colDef.cellFilter,\n });\n columns.push({\n field: colDef.field,\n filter: colDef.cellFilter,\n caption: $translate.instant(colDef.displayName),\n bitmaskValues: colDef.exportBitMaskValues,\n width: colDef.width\n });\n }\n }\n\n var filteredRows = scope.filteredRows;\n var data = [];\n for (var idx = 0; idx < filteredRows.length; idx++) {\n var entity = filteredRows[idx];\n var e = [];\n for (var f in keys) {\n var key = keys[f];\n if (shouldApplyFilter(key.filter)) {\n var flt = parseFilter(key.filter);\n var params = [entity[key.field]];\n if (flt.params) {\n params.push.apply(params, flt.params);\n }\n var filter = $filter(flt.filterName);\n e.push(filter.apply(filter, params));\n } else {\n e.push(entity[key.field]);\n }\n }\n data.push(e);\n }\n\n return { columns: columns, rows: data };\n }\n\n function genericDataExport(format) {\n $(\"#dataDownloadIFrame\").remove();\n\n var data = prepareData();\n\n $http({\n method: 'POST',\n url: '/Api/Export/' + format,\n data: JSON.stringify(data)\n })\n .success(function (data, status, headers, config) {\n $(\"#dataDownloadIFrame\").remove();\n $(\"body\").append(\"\");\n });\n }\n\n function parseFilter(filterStr) {\n var idx = filterStr.indexOf(':');\n var res = {\n filterName: idx !== -1 ? filterStr.substring(0, idx) : filterStr,\n params: idx !== -1 ? unQuoteParams([filterStr.substring(idx + 1)]) : ''\n };\n return res;\n }\n\n function unQuoteParams(params) {\n var ret = [];\n for (var idx = 0; idx < params.length; idx++) {\n var param = params[idx];\n ret.push(param.replace(/^'(.+(?='$))'$/, '$1'));\n }\n\n return ret;\n }\n\n scope.getFilteredValue = function(value, filter) {\n if (filter) {\n var flt = parseFilter(filter);\n return $filter(flt.filterName)(value, flt.params);\n } else {\n return value;\n }\n }\n\n scope.selectedRangeHi = function() {\n return Math.min(scope.selectedPage * scope.pageSize, scope.filteredRows.length);\n }\n }\n };\n }])\n\n\n.animation('.wb-group-row', [function () {\n return {\n removeClass: function (element, doneFn) {\n jQuery(element).find('div.wb-table-group-content').css(\"margin-top\", \"0px\");\n },\n addClass: function (element, doneFn) {\n\n var el = jQuery(element).find('div.wb-table-group-content');\n\n el.css(\"margin-top\", \"-\" + el.height() + \"px\");\n setTimeout(function() {\n jQuery(element).removeClass('ng-hide-animate');\n }, 200)\n }\n }\n}]);","'use strict';\n\nwbApp.directive('wbInvoiceLookup', ['$http', '$translate', '$timeout', '$filter',\n function ($http, $translate, $timeout, $filter) {\n function formatResult(invoice) {\n if (!invoice) { return; }\n\n return \"
\" +\n \"
\" + invoice.number + \"
\" +\n \"
\" + $filter('wbCurrencyFlt')(invoice.total) + \"
\" +\n \"
\";\n }\n\n function formatSelection(invoice) {\n return invoice.number + ' (' + $filter('wbCurrencyFlt')(invoice.total) + ')';\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elm, attrs, controller) {\n\n $timeout(function () {\n elm.select2({\n placeholder: $translate.instant('TXT_PLACEHOLDER_SELECT_INVOICE'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n ajax: {\n url: \"Api/Invoices/GetLookupQuery\",\n data: function (term, page) {\n return {\n query: term,\n pageSize: 10,\n pageNo: page,\n invoiceForType: scope.$eval(attrs.wbInvoiceForType)\n };\n },\n results: function (data, page) {\n var more = data.length > 0;\n return { results: data, more: more };\n }\n },\n initSelection: function (element, callback) {\n var id = $(element).val();\n if (!!id) {\n $http({\n method: 'GET',\n url: \"Api/Invoices/GetLookupId\",\n params: {\n invoiceID: id,\n invoiceForType: scope.$eval(attrs.wbInvoiceForType)\n }\n })\n .success(function (data, status, headers, config) {\n controller.$setViewValue(data.id);\n callback(data);\n });\n } else {\n controller.$setViewValue(null);\n callback(null);\n }\n }\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n controller.$setViewValue(elm.select2('val'));\n });\n });\n\n //controller.$parsers.unshift(function (viewValue) {\n // if (!viewValue) {\n // return null;\n // } else {\n // return viewValue;\n // }\n //});\n\n //controller.$formatters.unshift(function (value) {\n // if (!value) {\n // return \"0\";\n // } else {\n // return value + \"\";\n // }\n //});\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n }, 1);\n }\n }\n }]);\n","wbApp.directive('wbMaskedEdit', ['$timeout',\nfunction ($timeout) {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, element, attr, ctrl) {\n $timeout(function () {\n element.inputmask(attr.uiMask, {\n \"clearIncomplete\": false,\n \"autoUnmask\": true\n });\n if (!ctrl) return;\n\n ctrl.$render = function () {\n element.val(ctrl.$viewValue || '');\n };\n\n element.on('keyup', function () {\n scope.$apply(function () {\n\n var isValid = element.inputmask(\"isComplete\") || !element.val();\n ctrl.$setValidity('mask', isValid);\n if (isValid) {\n ctrl.$setViewValue(element.val());\n// element.inputmask('unmaskedvalue')\n //);\n }\n });\n });\n\n element.on(\"$destroy\", function () {\n //element.unmask();\n });\n }, 1);\n }\n };\n}]);","wbApp.directive('wbNumberEdit', [\n function () {\n return {\n restrict: 'EA',\n require: '?ngModel',\n link: function (scope, element, attr, ctrl) {\n ctrl.$parsers.push(function (value) {\n if (ctrl.$isEmpty(value)) {\n return value;\n } \n\n if (typeof value == 'string' || value instanceof String) {\n\n var transformedInput = null;\n\n if (attr.min) {\n var min = parseFloat(attr.min);\n if (min < 0) {\n transformedInput = value.replace(/[^0-9]|\\-/g, '');\n }\n }\n if (transformedInput === null) {\n transformedInput = value.replace(/[^0-9]/g, '');\n }\n if (transformedInput !== value) {\n ctrl.$viewValue = transformedInput;\n ctrl.$render();\n }\n\n return parseInt(transformedInput || 0);\n }\n\n return value;\n });\n\n ctrl.$formatters.unshift(function (value) {\n if (ctrl.$isEmpty(value)) {\n return value;\n } else {\n return value + \"\";\n }\n });\n\n function validate(ctrl, validatorName, validity, value) {\n ctrl.$setValidity(validatorName, validity);\n return validity ? value : undefined;\n }\n\n if (attr.min) {\n var minValidator = function (value) {\n var min = parseFloat(attr.min);\n return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value);\n };\n\n ctrl.$parsers.push(minValidator);\n ctrl.$formatters.push(minValidator);\n }\n\n if (attr.max) {\n var maxValidator = function (value) {\n var max = parseFloat(attr.max);\n return validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value);\n };\n\n ctrl.$parsers.push(maxValidator);\n ctrl.$formatters.push(maxValidator);\n }\n }\n };\n}]);","wbApp.directive('wbNumberExEdit', ['$timeout',\nfunction ($timeout) {\n\n return {\n restrict: 'A',\n require: '?ngModel',\n priority: 10000,\n link: function (scope, element, attr, ngModel) {\n var destroyed = false;\n var initialized = false;\n\n $timeout(function () {\n element.autoNumeric('init',\n {\n aDec: ',', \n //altDec: '.',\n aSep: ' ',\n pSign: 's',\n mDec: '0',\n vMin: attr.min !== undefined ? attr.min : -9999999999999.99,\n vMax: attr.max !== undefined ? attr.max : 9999999999999.99\n });\n\n initialized = true;\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (viewValue !== null && viewValue !== undefined) {\n if (typeof viewValue === 'string' || viewValue instanceof String) {\n if (viewValue == '') {\n return null;\n } else {\n return parseFloat(viewValue.replace(/,/g, '.'));\n }\n }\n\n return viewValue;\n }\n\n return null;\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (value !== null && value !== undefined) {\n return value + \"\";\n }\n return null;\n });\n\n\n ngModel.$render = function () {\n if (!destroyed) {\n\n if (initialized) {\n element.autoNumeric('set', ngModel.$viewValue);\n } else {\n $timeout(function () {\n element.autoNumeric('set', ngModel.$viewValue);\n });\n }\n }\n };\n\n element.on('blur keyup change', function () {\n scope.$evalAsync(read);\n });\n\n function read() {\n var amt = element.autoNumeric('get');\n ngModel.$setViewValue(amt);\n }\n\n $(element).on(\"remove\", function () {\n destroyed = true;\n element.autoNumeric(\"destroy\");\n })\n }\n };\n}]);","wbApp.directive('wbPaymentTypeCombo', ['$timeout', '$translate',\n function ($timeout, $translate) {\n function formatResult(paymentType) {\n if (!paymentType) { return; }\n return $translate.instant(paymentType.text);\n }\n\n function formatSelection(paymentType) {\n return $translate.instant(paymentType.text);\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elm, attrs, controller) {\n\n $timeout(function () {\n $(elm).select2({\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: [\n { id: 0, text: 'TXT_VAL_PAYMENT_TYPE_BANK_TRANSFER' },\n { id: 1, text: 'TXT_VAL_PAYMENT_TYPE_CASH' },\n { id: 2, text: 'TXT_VAL_PAYMENT_TYPE_CREDIT_CARD' },\n { id: 3, text: 'TXT_VAL_PAYMENT_TYPE_BENEFIT_PLUS' },\n { id: 4, text: 'TXT_VAL_PAYMENT_TYPE_ONLINE', disabled: true },\n ]\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n controller.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n controller.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n elm.on('change', function () {\n scope.$apply(function () {\n controller.$setViewValue(elm.select2('val'));\n });\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n }, 1);\n }\n }\n }]);","wbApp.directive('wbPercentEdit', ['$timeout',\nfunction ($timeout) {\n return {\n restrict: 'A',\n require: '?ngModel',\n priority: 10000,\n link: function (scope, element, attr, ngModel) {\n var destroyed = false;\n var initialized = false;\n\n $timeout(function () {\n element.autoNumeric('init',\n {\n aSign: ' %',\n aDec: ',',\n aSep: ' ',\n pSign: 's',\n mDec: '2',\n vMin: '0.00',\n vMax: '100.00'\n });\n\n initialized = true;\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n if (attr.required) {\n return 0;\n } else {\n return null;\n }\n } else {\n if (typeof viewValue === 'string' || viewValue instanceof String) {\n return parseFloat(viewValue.replace(/,/g, '.'));\n }\n\n return viewValue;\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n if (attr.required) {\n return \"0\";\n } else {\n return null;\n }\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n if (!destroyed) {\n\n if (initialized) {\n if (attr.required) {\n element.autoNumeric('set', ngModel.$viewValue || '0');\n } else {\n element.autoNumeric('set', ngModel.$viewValue);\n } \n } else {\n $timeout(function () {\n if (attr.required) {\n element.autoNumeric('set', ngModel.$viewValue || '0');\n } else {\n element.autoNumeric('set', ngModel.$viewValue);\n }\n });\n }\n }\n };\n\n element.on('blur keyup change', function () {\n scope.$evalAsync(read);\n });\n\n function read() {\n var amt = element.autoNumeric('get');\n ngModel.$setViewValue(amt);\n }\n\n $(element).on(\"remove\", function () {\n destroyed = true;\n element.autoNumeric(\"destroy\");\n })\n }\n };\n}]);","'use strict';\n\nwbApp.directive('wbReferenceSourceCombo', ['$timeout', '$translate', 'referenceSourceSvc',\n function ($timeout, $translate, referenceSourceSvc) {\n\n var lookupData = { results: [] };\n\n function format(item) {\n if (item.id) return item.name;\n }\n\n referenceSourceSvc.getAllAsync().$promise\n .then(function (data) {\n for (var i = 0; i < data.length; i++) {\n lookupData.results.push(data[i]);\n }\n });\n\n return {\n restrict: 'A',\n require: 'ngModel',\n priority: 1,\n replace: true,\n link: function (scope, elm, attrs, controller) {\n\n $timeout(function () {\n $(elm).select2({\n placeholder: $translate.instant('TXT_PLACEHOLDER_REFERENCE_SOURCE'),\n dropdownAutoWidth: true,\n allowClear: true,\n minimumResultsForSearch: -1,\n formatResult: format,\n formatSelection: format,\n data: lookupData\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n controller.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n }, 1);\n }\n }\n }]);\n\n\n","wbApp.directive('wbShareOnFacebook', ['facebookSvc', 'tenantInfo',\n function (facebookSvc, tenantInfo) {\n return {\n restrict: 'EA',\n priority: 1,\n scope: {\n course: '=',\n action: '='\n },\n replace: true,\n template:\n \"
\" +\n \"
\" +\n \"
\"+\n \"
\",\n controller: ['$scope', function ($scope) {\n var alias = tenantInfo.alias;\n var courses = \"\";\n\n if ($scope.action) {\n courses = 'Actions';\n $scope.courseHref = \"https://\" + alias + tenantInfo.domain + \"/\" + courses + \"/Register/\" + $scope.action.courseID;\n } else {\n courses = 'Courses';\n $scope.courseHref = \"https://\" + alias + tenantInfo.domain + \"/\" + courses + \"/Register/\" + $scope.course.courseID;\n }\n\n $scope.onFBButtonClick = function () {\n\n if ($scope.action) {\n facebookSvc.shareCourseDetail(\n $scope.action.courseID,\n $scope.action.subjectName,\n $scope.action.name,\n $scope.action.subjectDescription,\n $scope.action.description,\n $scope.action.teacher,\n (!!$scope.action.pictures && !!$scope.action.pictures.length)\n ? $scope.action.pictures[0].imageUrl\n : null,\n true\n );\n } else {\n facebookSvc.shareCourseDetail(\n $scope.course.courseID,\n $scope.course.subjectName,\n $scope.course.name,\n $scope.course.subjectDescription,\n $scope.course.description,\n $scope.course.teacher,\n (!!$scope.course.pictures && !!$scope.course.pictures.length)\n ? $scope.course.pictures[0].imageUrl\n : null,\n false\n );\n }\n }\n }]\n }\n}]);","'use strict';\n\nwbApp.directive('wbStudentLookup', ['$http', '$translate', '$timeout', '$filter', 'notificationSvc',\n function ($http, $translate, $timeout, $filter, notificationSvc) {\n\n function getFullName(name, middleName, surName) {\n var fullName = name;\n if (!!middleName) {\n if (!!fullName) {\n fullName = fullName + \" \" + middleName;\n }\n else {\n fullName = middleName;\n }\n }\n\n if (!!surName) {\n if (!!fullName)\n fullName = fullName + \" \" + surName;\n else\n fullName = surName;\n }\n\n return fullName;\n }\n\n function formatResult(student) {\n if (!student) { return; }\n\n var birthday = !student.birthday\n ? \"\"\n : $filter('date')(student.birthday, 'shortDate');\n\n var parentFullName = !!student.user ? getFullName(student.user.name, student.user.middlename, student.user.surname) : '';\n var email = !!student.user ? student.user.email : '';\n\n return \"
\" +\n \"
\" + getFullName(student.name, student.middlename, student.surname) + \"
\" +\n \"
\" + parentFullName + \"
\" +\n \"
\" + birthday + \"
\" +\n \"
\" + email + \"
\" +\n \"
\";\n }\n\n function formatSelection(student) {\n return getFullName(student.name, student.middlename, student.surname);\n }\n\n function dateParse(strDate) {\n if (Window['moment'])\n return moment(strDate).toDate();\n return Date.parse(strDate);\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n ngModel: '=',\n userIdFilter: '=',\n parentId: '=',\n contactPhone: '=',\n contactEmail: '=',\n parentFullName: '=',\n health: '='\n },\n link: function (scope, elm, attrs, controller) {\n $timeout(function () {\n $(elm).select2({\n placeholder: $translate.instant('TXT_PLACEHOLDER_SELECT_STUDENT'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: !attrs.required,\n query: function (query) {\n if (!!attrs.userIdFilter && !!scope.userIdFilter) {\n \n $http({\n method: 'GET',\n url: \"restapi/students/find-by-user-id\",\n params: {\n userId: scope.userIdFilter,\n expanded: 'User',\n }\n }).success(function (data, status, headers, config) {\n\n var filteredData = !!query.term\n ? _.filter(data, function (item) {\n var fullName = getFullName(item.name, item.middlename, item.surname);\n return fullName.toLocaleUpperCase().includes(query.term.toLocaleUpperCase());\n })\n : data;\n\n var skip = Math.max(10 * (query.page - 1), 0);\n var take = 10 * query.page;\n\n var paged = _.take(_.drop(filteredData, skip), take);\n query.callback({ results: paged, more: paged.length >= 10 });\n }).error(function (errorResult, status, headers, config) {\n query.callback({ results: [], more: false });\n });\n } else {\n $http({\n method: 'GET',\n url: \"restapi/students/paged/find-by-name\",\n params: {\n nameSubstring: query.term,\n take: 10,\n skip: Math.max(10 * (query.page - 1), 0),\n expanded: 'User'\n }\n }).success(function (data, status, headers, config) {\n query.callback({ results: data, more: data.length >= 10 });\n }).error(function (errorResult, status, headers, config) {\n query.callback({ results: [], more: false });\n }); \n } \n },\n initSelection: function (element, callback) {\n var id = $(element).val();\n if (id != 0) {\n $http({\n method: 'GET',\n url: \"restapi/students/\" + id,\n params: {\n expanded: 'User'\n }\n })\n .success(function (data, status, headers, config) {\n controller.$setViewValue(data.id);\n if (!!attrs.userIdFilter) {\n scope.userIdFilter = data.userID;\n }\n if (typeof scope.parentId !== 'undefined') {\n scope.parentId = data.userID;\n }\n if (typeof scope.contactPhone !== 'undefined') {\n if (!!data.user) {\n scope.contactPhone = data.user.phone;\n } else {\n scope.contactPhone = null;\n }\n }\n if (typeof scope.contactEmail !== 'undefined') {\n if (!!data.user) {\n scope.contactEmail = data.user.email;\n } else {\n scope.contactEmail = null;\n }\n }\n if (typeof scope.parentFullName !== 'undefined') {\n if (!!data.user) {\n scope.parentFullName = getFullName(data.user.name, data.user.middlename, data.user.surname);\n } else {\n scope.parentFullName = null;\n }\n }\n if (typeof scope.health !== 'undefined') {\n scope.health = data.health || null;\n } \n callback(data);\n })\n .error(function (errorResult, status, headers, config) {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_ERROR_READING_DATA'),\n notificationSvc.translateError(errorResult));\n callback(null);\n });\n } else {\n controller.$setViewValue(null);\n callback(null);\n }\n }\n });\n\n\n $(elm).on('select2-selecting', function (e) {\n if (e.choice) {\n scope.$apply(function () {\n if (!!attrs.userIdFilter) {\n scope.userIdFilter = e.choice.userID;\n }\n if (typeof scope.parentId !== 'undefined') {\n scope.parentId = e.choice.userID;\n }\n if (typeof scope.contactPhone !== 'undefined') {\n if (!!e.choice.user) {\n scope.contactPhone = e.choice.user.phone;\n } else {\n scope.contactPhone = null;\n }\n }\n if (typeof scope.contactEmail !== 'undefined') {\n if (!!e.choice.user) {\n scope.contactEmail = e.choice.user.email;\n } else {\n scope.contactEmail = null;\n }\n }\n if (typeof scope.parentFullName !== 'undefined') {\n if (!!e.choice.user) {\n scope.parentFullName = getFullName(e.choice.user.name, e.choice.user.middlename, e.choice.user.surname);\n } else {\n scope.parentFullName = null;\n }\n }\n if (typeof scope.health !== 'undefined') {\n scope.health = e.choice.health || null;\n }\n });\n }\n });\n\n controller.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return null;\n } else {\n return parseInt(viewValue);\n }\n });\n\n controller.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n if (!!attrs.userIdFilter) {\n scope.$watch('userIdFilter', function (newValue, oldValue) {\n if (newValue != oldValue && !!oldValue) {\n elm.select2('val', null);\n }\n });\n }\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n }, 1);\n\n }\n }\n}]);\n","wbApp.directive('wbTerminalCombo', ['$timeout', '$translate', '$filter', 'terminalSvc',\n function ($timeout, $translate, $filter, terminalSvc) {\n function formatResult(terminal) {\n if (!terminal) { return; }\n\n return terminal.name;\n }\n\n function formatSelection(terminal) {\n return terminal.name;\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n priority: 1,\n replace: true,\n link: function (scope, elm, attrs, ctrl) {\r\n\n var terminals = terminalSvc.getAllAsync();\n\n $timeout(function () {\r\n $(elm).select2({\n placeholder: $translate.instant('TXT_LBL_TERMINAL'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: true,\n minimumResultsForSearch: -1,\n id: function (terminal) { return terminal.terminalID; },\n data: terminals\r\n });\n\n ctrl.$render();\r\n });\n\n ctrl.$parsers.unshift(function (viewValue) {\r\n if (!viewValue) {\r\n return null;\r\n } else {\r\n return parseInt(viewValue);\r\n }\r\n });\n\n ctrl.$formatters.unshift(function (value) {\r\n if (!value) {\r\n return null;\r\n } else {\r\n return value + \"\";\r\n }\r\n });\n\n ctrl.$render = function () {\r\n terminals.$promise.then(function () {\r\n $(elm).select2('val', ctrl.$viewValue);\r\n });\r\n }\n\n elm.on('change', function (e) {\r\n scope.$apply(function () {\r\n ctrl.$setViewValue(e.val); \r\n });\r\n });\n\n elm.bind(\"$destroy\", function () {\r\n elm.select2(\"destroy\");\r\n });\n\n attrs.$observe('readonly', function (value) {\r\n elm.select2('readonly', !!value);\r\n });\r\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbTrueFalseCombo', ['$timeout', '$translate',\n function ($timeout, $translate) {\n\n function formatResult(item) {\n if (!item) { return; }\n\n return $translate.instant(item.text);\n }\n\n function formatSelection(item) {\n return $translate.instant(item.text);\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n replace: true,\n priority: 1,\n link: function (scope, elm, attrs, ctrl) {\n \n ctrl.$parsers.unshift(function (viewValue) {\n return viewValue === '1' ? true : false;\n });\n\n ctrl.$formatters.unshift(function (value) {\n return value === \"true\" ? '1' : '0';\n });\n\n $timeout(function () {\n $(elm).select2({\n minimumResultsForSearch: -1,\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n data: [{ id: 1, text: 'TXT_VAL_TRUE' }, { id: 0, text: 'TXT_VAL_FALSE' }]\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n ctrl.$render = function () {\n $(elm).select2('val', ctrl.$viewValue);\n }\n }, 1);\n }\n }\n }]);\n","wbApp.directive('wbValidationTooltip', ['$tooltip', '$timeout', 'errorTypeTranslateSvc',\n function ($tooltip, $timeout, errorTypeTranslateSvc) {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elem, attr, ctrl) {\n\n var errorTooltip = $tooltip(elem,\n {\n title: \"\",\n trigger: \"hover focus\",\n placement: attr.wbValidationTooltip || \"auto bottom\",\n html: true,\n animation: \"am-fade-and-scale\",\n delay: 100\n });\n\n scope.$watch(function () { return elem.attr('class'); },\n function (validity) {\n var errors = '';\n\n if (/*ctrl.$dirty && */!ctrl.$valid) {\n for (var error in ctrl.$error) {\n if (!ctrl.$error[error]) {\n continue;\n }\n\n if (errors.length) {\n errors += '
';\n }\n\n errors += errorTypeTranslateSvc.translate(error, attr, scope);\n }\n\n if (errorTooltip.$scope.title !== errors) {\n var hasFocus = $(elem).is(\":focus\");\n\n errorTooltip.$scope.title = errors;\n\n if (hasFocus) {\n errorTooltip.show();\n }\n }\n }\n else {\n errorTooltip.$scope.title = \"\";\n }\n });\n }\n };\n}]);","wbApp.filter('activityCompensationType', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_VAL_ACTIVITY_COMPENSATION_TYPE_ONE_FOR_ONE');\n case 1:\n return $translate.instant('TXT_VAL_ACTIVITY_COMPENSATION_TYPE_TWO_FOR_ONE');\n case 2:\n return $translate.instant('TXT_VAL_ACTIVITY_COMPENSATION_TYPE_DISABLED');\n }\n \n };\n}]);","wbApp.filter('activityStatus', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_STATUS_PRESENT');\n case 1:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_NOT_EXCUSED');\n case 2:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_EXCUSED');\n case 3:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_EXCUSED_NO_COMPENSATION');\n case 4:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_EXCUSED_NO_FOOD');\n }\n \n };\n}]);","wbApp.filter('ageRangeName', ['ageRangeSvc', '$translate', function (ageRangeSvc, $translate) {\n var models = ageRangeSvc.getAllAsync();\n\n function asyncResult(input) {\n if (models.$resolved) {\n var model = _.find(models, { ageRangeID: input });\n if (model) {\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","wbApp.filter('attendanceFeeType', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_VAL_REGULAR');\n case 1:\n return $translate.instant('TXT_VAL_ONEOFF');\n case 2:\n return $translate.instant('TXT_VAL_NONE');\n case 3:\n return $translate.instant('TAX_VAL_CUSTOM');\n } \n };\n}]);","wbApp.filter('attendanceStatus', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_STATUS_PRESENT');\n case 1:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_NOT_EXCUSED');\n case 2:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_EXCUSED');\n case 3:\n return $translate.instant('TXT_STATUS_NOT_PRESENT_EXCUSED_NO_COMPENSATION');\n }\n \n };\n}]);","wbApp.filter('attendanceType', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_VAL_REGISTERED');\n case 1:\n return $translate.instant('TXT_VAL_ONEOFF');\n case 2:\n return $translate.instant('TXT_VAL_AMEND');\n case 3:\n return $translate.instant('TAX_VAL_PREVIEW');\n } \n };\n}]);","'use strict';\n\nwbApp.filter('boolean', ['$translate', function ($translate) {\n return function (input) {\n return input ? $translate.instant('TXT_BTN_YES') : $translate.instant('TXT_BTN_NO');\n };\n}]);","wbApp.filter('checkmark', function () {\n return function (input) {\n // return input ? '' : '\\u2713';\n return input ? '\\u2713' : '\\u2718';\n };\n});","wbApp.filter('classroom', ['classroomSvc', '$translate', function (classroomSvc, $translate) {\n var models = classroomSvc.getAllAsync();\n\n function asyncResult(input) {\n if (models.$resolved) {\n var model = _.find(models, { id: Number(input) });\n if (model) {\n if (model.isDeleted) {\n return model.name + ' (' + $translate.instant('TXT_VAL_DELETED') + ')';\n }\n if (!model.active) {\n return model.name + ' (' + $translate.instant('TXT_VAL_NOT_ACTIVE') + ')';\n }\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","'use strict';\n\nwbApp.filter('gender', ['$translate', function ($translate) {\n return function (input) {\n return input === 'M'\n ? $translate.instant('TXT_VAL_MALE')\n : $translate.instant('TXT_VAL_FEMALE');\n };\n}]);","wbApp.filter('invoiceForType', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 1:\n return $translate.instant('TXT_LAB_COURSE');\n case 2:\n return $translate.instant('TXT_LAB_ACTION_SINGULAR');\n case 3:\n return $translate.instant('TXT_LAB_KINDERGARTEN');\n case 4:\n return $translate.instant('TXT_LAB_RESERVATION');\n case 5:\n return $translate.instant('TXT_LAB_WALLET_DEPOSIT');\n case 6:\n return $translate.instant('TXT_LAB_CUSTOM');\n }\n return \"\";\n };\n}]);","'use strict';\n\nwbApp.filter('nonEmptyCollection', [function () {\n return function (input) {\n return input && input.length ? '\\u2713' : '\\u2718';\n //return input && input.lenght ? '\\uf0c8' : '\\uf096';\n }\n}]);","wbApp.filter('onlinePaymentState', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_NONE');\n case 1:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_CREATED');\n case 2:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_PENDING');\n case 3:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_PAID');\n case 4:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_REVERSED');\n case 5:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_AUTOREVERSED');\n case 6:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_CANCELLED');\n case 7:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_DECLAINED');\n case 8:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_ERROR');\n case 9:\n return $translate.instant('TXT_VAL_ONLINE_PAYMENT_STATUS_MANUALLY_REVERSED'); \n }\n \n };\n}]);","wbApp.filter('paymentType', ['$translate', function ($translate) {\n return function (input) {\n switch (input) {\n case 0:\n return $translate.instant('TXT_VAL_PAYMENT_TYPE_BANK_TRANSFER');\n case 1:\n return $translate.instant('TXT_VAL_PAYMENT_TYPE_CASH');\n case 2:\n return $translate.instant('TXT_VAL_PAYMENT_TYPE_CREDIT_CARD');\n case 3:\n return $translate.instant('TXT_VAL_PAYMENT_TYPE_BENEFIT_PLUS');\n case 4:\n return $translate.instant('TXT_VAL_PAYMENT_TYPE_ONLINE');\n\n }\n \n };\n}]);","wbApp.filter('phone', function () {\n return function (input) {\n return typeof input === 'string'\n ? input.replace(/\\+?(\\d{3})(\\d{3})(\\d{3})(\\d{3})/, \"+$1 $2 $3 $4\")\n : '';\n };\n});","'use strict';\n\nwbApp.filter('sumFlt', [\n function () {\n return function (data, propertyName) {\n var sum = 0;\n if (!data || !propertyName) {\n return sum;\n }\n\n for (var i = 0; i < data.length; i++) {\n var row = data[i];\n var val = row[propertyName];\n if (val) {\n sum += val;\n }\n }\n\n return sum;\n }\n }]);","wbApp.filter('terminal', ['$translate', 'terminalSvc', function ($translate, terminalSvc) {\n var models = terminalSvc.getAllAsync();\n\n function asyncResult(input) {\n if (models.$resolved) {\n var model = _.find(models, { terminalID: input });\n if (model) {\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n }\n]);","wbApp.filter('urlButton', function () {\n return function (input) {\n if (input === \"==group==\") {\n return '
Více
';\n } else if (!!input && input.startsWith('https://')) {\n return ' Více ';\n } else if (!!input && !input.startsWith('https://')) {\n return ' Více ';\n } else {\n return '';\n }\n };\n});","wbApp.filter('wbColor', ['$sce',\n function ($sce) {\n return function (input) {\n var colorUtils = new webooker_utils.ColorUtils();\n\n return $sce.trustAsHtml('
');\n }\n}]);","'use strict';\n\nwbApp.filter('wbCurrencyFlt', ['$filter', 'tenantInfo', \n function ($filter, tenantInfo) {\n\n function getCurrencySymbol(tenantInfo) {\n switch (tenantInfo.currency) {\n case 'CZK':\n return ' Kč';\n case 'EUR':\n return ' €';\n default:\n return ' Kč';\n }\n }\n\n return function (data) {\n if (data === null || data === undefined) {\n return '';\n }\n\n return $filter('number')(data, 2) + getCurrencySymbol(tenantInfo);\n }\n}]);","'use strict';\n\nwbApp.filter('wbHumanNameSort', ['gridSortSvc',\n function (gridSortSvc) {\n return function (items, field, reverse) {\n return _.orderBy(\n items, \n [function(o) { return gridSortSvc.sortHumanFullName2(o, field); }], \n [reverse ? 'desc' : 'asc']);\n }\n }]);","wbApp.filter('wbPercent', ['$filter', function ($filter) {\n return function (input, decimals) {\n return $filter('number')(input, decimals) + ' %';\n };\n}]);\n","'use strict';\n\nwbApp.factory('accountingBookSvc', ['$resource', '$q', 'repositorySvc', 'notificationSvc', '$translate',\n function ($resource, $q, repositorySvc, notificationSvc, $translate) {\n var AccountingBooks = $resource('/Api/AccountingBooks/:id', {}, {\n 'getAll': { method: 'GET', isArray: true, url: '/Api/AccountingBooks/GetAll' },\n 'update': { method: 'POST', url: '/Api/AccountingBooks/Update' },\n 'insert': { method: 'POST', url: '/Api/AccountingBooks/Insert' },\n 'delete': { method: 'POST', url: '/Api/AccountingBooks/Delete' },\n 'peekNextSequenceNoRaw': { method: 'GET', isArray: false, url: '/Api/AccountingBooks/PeekNextSequenceNoRaw' },\n 'setNextSequenceNoRaw': { method: 'POST', url: '/Api/AccountingBooks/SetNextSequenceNoRaw' },\n 'uploadAccountingStamp': { method: 'PUT', url: '/restapi/accounting-books/:id/accounting-stamp' },\n 'deleteAccountingStamp': { method: 'DELETE', url: '/restapi/accounting-books/:id/accounting-stamp' },\n 'listInstitutions': { method: 'GET', isArray: true, url: '/restapi/banks/institutions' },\n 'createBankConnection': { method: 'POST', url: '/restapi/banks/connections' },\n 'getConnection': { method: 'GET', url: '/restapi/banks/connections/:id?refresh=true' },\n 'deleteConnection': { method: 'DELETE', url: '/restapi/banks/connections/:id' },\n 'selectBankAccount': { method: 'POST', url: '/restapi/banks/connections/:id/select-account/:accountId' }\n });\n\n function uploadAccountingStamp(id, data) {\n return repositorySvc.customPutWithParams(\n 'uploadAccountingStamp',\n AccountingBooks,\n { id: id },\n data);\n }\n\n function deleteAccountingStamp(id) {\n return repositorySvc.customDelete(\n 'deleteAccountingStamp',\n AccountingBooks,\n { id: id });\n }\n\n function peekNextSequenceNoRaw(sequenceType, accountingBookID, year, success) {\n return repositorySvc.customGet('peekNextSequenceNoRaw', AccountingBooks, {\n sequenceType: sequenceType,\n accountingBookID: accountingBookID,\n year: year\n }, success);\n }\n\n function setNextSequenceNoRaw(sequenceType, accountingBookID, year, sequenceNumber, success, error) {\n function successImpl(data) {\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_CHANGES_SAVED'));\n if (success) {\n success(data);\n }\n }\n\n function errorImpl(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult);\n if (error) {\n error(errorResult);\n }\n }\n\n return AccountingBooks.setNextSequenceNoRaw({\n sequenceType: sequenceType,\n accountingBookID: accountingBookID,\n year: year,\n sequenceNumber: sequenceNumber\n }, successImpl, errorImpl);\n }\n\n var accountingBooks;\n\n function createNew() {\n return {\n };\n }\n\n function getAllAsync(refresh) {\n if (!accountingBooks || refresh) {\n accountingBooks = repositorySvc.customGet('getAll', AccountingBooks);\n }\n\n return accountingBooks;\n }\n\n function getDefaultAsync() {\n var a = getAllAsync();\n\n var deferred = $q.defer();\n\n a.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if (value.isDefault) {\n deferred.resolve(value);\n return;\n }\n })\n\n deferred.resolve(null);\n\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return deferred.promise;\n }\n\n function get(id) {\n if (accountingBooks) {\n for (var i = 0; i < accountingBooks.length; i++) {\n var sc = accountingBooks[i];\n if (sc.id === id) {\n return sc;\n }\n }\n }\n return null;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n AccountingBooks, // $resource\n accountingBooks, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n AccountingBooks, // $resource\n accountingBooks, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function remove(data, successCallback, errorCallback) {\n repositorySvc.remove(\n AccountingBooks, // $resource\n accountingBooks, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n \n function getInstitutions() {\n return repositorySvc.customGet('listInstitutions', AccountingBooks);\n }\n \n function createBankConnection(institutionId, redirectToUrl, accountingBookId) {\n return repositorySvc.customPost(\n 'createBankConnection', \n AccountingBooks, {\n institutionId: institutionId,\n redirectToUrl: redirectToUrl,\n accountingBookId: accountingBookId\n },\n null,\n null,\n true);\n }\n \n function selectBankAccount(connectionId, accountId) {\n return repositorySvc.customPostWithParams(\n 'selectBankAccount',\n AccountingBooks, {\n id: connectionId,\n accountId: accountId\n },\n null,\n null,\n null);\n }\n \n function getConnection(connectionId) {\n return repositorySvc.customGet('getConnection', AccountingBooks, { id: connectionId });\n }\n \n function deleteConnection(connectionId) {\n return repositorySvc.customDelete('deleteConnection', AccountingBooks, {id: connectionId});\n }\n\n return {\n createNew: createNew,\n getAllAsync: getAllAsync,\n getDefaultAsync: getDefaultAsync,\n get: get,\n insert: insert,\n update: update,\n remove: remove,\n peekNextSequenceNoRaw: peekNextSequenceNoRaw,\n setNextSequenceNoRaw: setNextSequenceNoRaw,\n uploadAccountingStamp: uploadAccountingStamp,\n deleteAccountingStamp: deleteAccountingStamp,\n getInstitutions: getInstitutions,\n createBankConnection: createBankConnection,\n getConnection: getConnection,\n deleteConnection: deleteConnection,\n selectBankAccount: selectBankAccount\n }\n }]);","wbApp.factory('activeFeaturesSvc', ['localStorageService', 'formSvc',\n function (localStorageService, formSvc) {\n\n\n\n\n function isClientFormSupportEnabled(remoteFetchDoneFn) {\n\n if (localStorageService.isSupported) {\n\n var lastCheck = localStorageService.get('isClientFormSupportEnabled-lastCheck');\n if (!!lastCheck) {\n lastCheck = moment(lastCheck, moment.ISO_8601);\n if (!lastCheck.isValid() || lastCheck.isBefore(moment().subtract(5, 'm'))) {\n lastCheck = null;\n }\n }\n\n var result = localStorageService.get('isClientFormSupportEnabled') == 'true';\n\n\n if (!lastCheck) {\n formSvc.getAllActive().then(function (data) {\n var shouldBeActive = !!data && data.length > 0;\n localStorageService.set('isClientFormSupportEnabled', shouldBeActive);\n localStorageService.set('isClientFormSupportEnabled-lastCheck', moment().format());\n\n if (!!remoteFetchDoneFn) {\n remoteFetchDoneFn(shouldBeActive);\n }\n });\n } else {\n if (!!remoteFetchDoneFn) {\n remoteFetchDoneFn(result);\n }\n }\n\n return result;\n }\n\n return true;\n }\n\n return {\n isClientFormSupportEnabled: isClientFormSupportEnabled\n }\n }\n]);\n","'use strict';\n\nwbApp.factory('activityReconciliationSvc', ['$resource', '$q', '$translate', 'repositorySvc', 'notificationSvc', 'tenantSettingSvc',\nfunction ($resource, $q, $translate, repositorySvc, notificationSvc, tenantSettingSvc) {\n\n var ActivityReconciliations = $resource('/Api/ActivityReconciliations/:id', {}, {\n 'getStudentsByActivity': { method: 'GET', isArray: true, url: '/Api/ActivityReconciliations/GetStudentsByActivity' },\n 'getStudentsAttendanceByActivity': { method: 'GET', isArray: true, url: '/Api/ActivityReconciliations/GetStudentsAttendanceByActivity' },\n 'getByStudentAndActivity': { method: 'GET', isArray: true, url: '/Api/ActivityReconciliations/GetByStudentAndActivity' },\n 'getReconciliationDetail': { method: 'GET', isArray: false, url: '/Api/ActivityReconciliations/GetReconciliationDetail' },\n 'insertReconciliationDetail': { method: 'POST', url: '/Api/ActivityReconciliations/InsertReconciliationDetail' },\n 'updateReconciliationDetail': { method: 'POST', url: '/Api/ActivityReconciliations/UpdateReconciliationDetail' },\n 'deleteReconciliationDetail': { method: 'POST', url: '/Api/ActivityReconciliations/DeleteReconciliationDetail' },\n 'sendReconciliationNotification': { method: 'POST', url: '/Api/ActivityReconciliations/SendReconciliationNotification' },\n 'getAvailableExuses': { method: 'GET', url: '/Api/ActivityReconciliations/GetAvailableExuses' }\n });\n\n function refreshByStudentAndActivity(students, studentID, semesterID, activityID, reconciliationDataRange, fromDate, toDate) {\n var res = repositorySvc.customGet('getStudentsByActivity', ActivityReconciliations, {\n semesterID: semesterID,\n activityID: activityID,\n fromDate: reconciliationDataRange === 2 ? fromDate : null,\n toDate: reconciliationDataRange === 2 ? toDate : null\n });\n\n res.$promise.then(function (data) {\n var newStudent = null;\n var oldStudent = null;\n\n for (var i = 0; i < data.length; i++) {\n var s = data[i];\n if (s[\"studentID\"] === studentID) {\n newStudent = s;\n break;\n }\n }\n\n for (var i = 0; i < students.length; i++) {\n var s = students[i];\n if (s[\"studentID\"] === studentID) {\n oldStudent = s;\n break;\n }\n }\n\n // Update properties\n if (oldStudent && newStudent) {\n for (var p in newStudent) {\n oldStudent[p] = newStudent[p];\n }\n }\n });\n }\n\n function getStudentsByActivity(semesterID, activityID, reconciliationDataRange, fromDate, toDate) {\n return repositorySvc.customGet('getStudentsByActivity', ActivityReconciliations, {\n semesterID: semesterID,\n activityID: activityID,\n fromDate: reconciliationDataRange === 2 ? fromDate : null,\n toDate: reconciliationDataRange === 2 ? moment(toDate).endOf('day').toDate() : null\n });\n }\n\n function getReconciliationDetail(activityID, studentID, activityReconciliationID) {\n var deferred = $q.defer();\n var result = new webooker_acivity_models.Reconciliation($translate, tenantSettingSvc.settings.calcSnacksOnlyForPresent);\n result.$promise = deferred.promise;\n\n repositorySvc.customGet('getReconciliationDetail', ActivityReconciliations, {\n activityID: activityID,\n studentID: studentID,\n activityReconciliationID: activityReconciliationID\n }).$promise.then(succes, error);\n\n function succes(data) {\n result.initData.call(result, data);\n //if (!activityReconciliationID) {\n // setUpDefaultUnitPrices(result);\n //}\n deferred.resolve(result);\n }\n\n function error(errorResult) {\n deferred.reject(errorResult);\n }\n\n return result;\n }\n\n //function setUpDefaultUnitPrices(data) {\n // if (data.activity && data.activity.defaultLunchPrice) {\n // data.invoiceLineKindergartenLunchUnitPrice = data.activity.defaultLunchPrice;\n // } else if (localStorageService.isSupported) {\n // data.invoiceLineKindergartenLunchUnitPrice = localStorageService.get('lastKindergartenLunchUnitPrice');\n // }\n\n // if (data.activity && data.activity.defaultSnackPrice) {\n // data.invoiceLineKindergartenSnackUnitPrice = data.activity.defaultSnackPrice;\n // } else if (localStorageService.isSupported) {\n // data.invoiceLineKindergartenSnackUnitPrice = localStorageService.get('lastKindergartenSnackUnitPrice');\n // }\n\n // if (data.activity && data.activity.defaultLatePickupPrice) {\n // data.invoiceLineKindergartenLatePickupUnitPrice = data.activity.defaultLatePickupPrice;\n // } else if (localStorageService.isSupported) {\n // data.invoiceLineKindergartenLatePickupUnitPrice = localStorageService.get('lastKindergartenLatePickupUnitPrice');\n // }\n //}\n\n //function saveDefaultUnitPrices(data) {\n // if (localStorageService.isSupported) {\n // localStorageService.set('lastKindergartenLunchUnitPrice', data.invoiceLineKindergartenLunchUnitPrice);\n // localStorageService.set('lastKindergartenSnackUnitPrice', data.invoiceLineKindergartenSnackUnitPrice);\n // localStorageService.set('lastKindergartenLatePickupUnitPrice', data.invoiceLineKindergartenLatePickupUnitPrice);\n // }\n //}\n\n function getStudentsAttendanceByActivity(semesterID, activityID, studentID) {\n\n var deferred = $q.defer();\n var result = [];\n result.$promise = deferred.promise;\n\n repositorySvc.customGet('getStudentsAttendanceByActivity', ActivityReconciliations, {\n semesterID: semesterID,\n activityID: activityID,\n studentID: studentID\n }).$promise.then(function (data) {\n var m = [];\n for (var i = 0; i < data.length; i++) {\n var model = data[i];\n var vm = new webooker_acivity_models.ReconciliationAttendance(model);\n m.push(vm);\n }\n\n result.push.apply(result, m);\n\n deferred.resolve(result);\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n return result;\n }\n\n function getByStudentAndActivity(semesterID, activityID, studentID) {\n return repositorySvc.customGet('getByStudentAndActivity', ActivityReconciliations, {\n semesterID: semesterID,\n activityID: activityID,\n studentID: studentID\n });\n }\n\n function getAvailableExuses(activityID, studentID) {\n return repositorySvc.customGet('getAvailableExuses', ActivityReconciliations, {\n activityID: activityID,\n studentID: studentID\n });\n }\n\n function getMinDateRange(attendance) {\n if (attendance && attendance.length > 0) {\n for (var a = 0; a < attendance.length; a++) {\n var att = attendance[a];\n\n if (!att.reconciled) {\n return moment(att.date).subtract(1, 'days').startOf('day').toDate();\n }\n } \n }\n return null;\n }\n\n function getMaxDateRange(attendance) {\n if (attendance && attendance.length > 0) {\n for (var a = attendance.length - 1; a >= 0; a--) {\n var att = attendance[a];\n if (!att.reconciled) {\n return moment(att.date).endOf('day').toDate();\n }\n }\n }\n\n return null;\n }\n\n function getToDateRange(attendance, fromDate, maxDate) {\n\n var from = moment(fromDate);\n var current = from;\n var endOfMonth = from.endOf('month');\n var to = endOfMonth.isBefore(maxDate)\n ? endOfMonth\n : moment(maxDate);\n\n if (attendance && attendance.length > 0) {\n for (var a = 0; a < attendance.length; a++) {\n var att = attendance[a];\n if (to.isBefore(att.date)) {\n return current.endOf('day').toDate();\n }\n if (!att.reconciled) {\n current = moment(att.date);\n }\n }\n\n\n var lastAtt = attendance[attendance.length - 1];\n if (!lastAtt.reconciled) {\n return moment(lastAtt.date).endOf('day').toDate();\n }\n }\n\n return null;\n }\n\n function selectDateRange(attendance, startDate, endDate) {\n\n var mStartDate = moment(startDate).subtract(1, 'day').startOf('day');\n var mEndDate = moment(endDate).add(1, 'day').startOf('day');\n\n for (var a = 0; a < attendance.length; a++) {\n var at = attendance[a];\n var mAtDate = moment(at.date).startOf('day');\n\n if (mAtDate.isAfter(mStartDate) && mAtDate.isBefore(mEndDate)) {\n if (at.reconciled) {\n continue;\n }\n\n at.isSelected = true;\n } else {\n at.isSelected = false;\n }\n\n }\n }\n\n function insertReconciliationDetail(reconciliation, notifyClients, successCallback, errorCallback) {\n ActivityReconciliations.insertReconciliationDetail({\n reconciliationDetail: reconciliation.getReconciliationDetailDTO.call(reconciliation, $translate),\n notifyClients: notifyClients\n }, success, error);\n\n function success(successResult) {\n // saveDefaultUnitPrices(reconciliation);\n repositorySvc.defaultSuccessSaveHandler(successResult, successCallback);\n }\n\n function error(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult, errorCallback);\n }\n }\n\n function updateReconciliationDetail(reconciliation, notifyClients, successCallback, errorCallback) {\n ActivityReconciliations.updateReconciliationDetail({\n reconciliationDetail: reconciliation.getReconciliationDetailDTO.call(reconciliation, $translate),\n notifyClients: notifyClients\n }, success, error);\n\n function success(successResult) {\n //saveDefaultUnitPrices(reconciliation);\n repositorySvc.defaultSuccessSaveHandler(successResult, successCallback);\n }\n\n function error(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult, errorCallback);\n }\n }\n\n function deleteReconciliationDetail(activityID, studentID, activityReconciliationID, successCallback, errorCallback) {\n ActivityReconciliations.deleteReconciliationDetail({\n activityID: activityID,\n studentID: studentID,\n activityReconciliationID: activityReconciliationID,\n notifyclients: false\n }, success, error);\n\n function success(successResult) {\n repositorySvc.defaultSuccessRemoveHandler(successResult, successCallback);\n }\n\n function error(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult, errorCallback);\n }\n }\n\n function sendReconciliationNotification(activityID, studentID, activityReconciliationID, invoiceID, successCallback, errorCallback) {\n ActivityReconciliations.sendReconciliationNotification({\n activityID: activityID,\n studentID: studentID,\n activityReconciliationID: activityReconciliationID,\n invoiceID: invoiceID\n }, success, error);\n\n function success(successResult) {\n\n notificationSvc.notifyInfo(\n $translate.instant('TXT_ALERT_NOTIFICATION_SENT_SUCCESS'));\n\n if (successCallback) {\n successCallback(successResult);\n }\n }\n\n function error(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult, errorCallback);\n }\n }\n\n function getReconciliationName(from, to) {\n return moment(from).format(\"MMMM YYYY\");\n }\n\n return {\n getStudentsByActivity: getStudentsByActivity,\n getStudentsAttendanceByActivity: getStudentsAttendanceByActivity,\n getByStudentAndActivity: getByStudentAndActivity,\n getMinDateRange: getMinDateRange,\n getMaxDateRange: getMaxDateRange,\n selectDateRange: selectDateRange,\n getToDateRange: getToDateRange,\n getReconciliationDetail: getReconciliationDetail,\n insertReconciliationDetail: insertReconciliationDetail,\n updateReconciliationDetail: updateReconciliationDetail,\n deleteReconciliationDetail: deleteReconciliationDetail,\n getReconciliationName: getReconciliationName,\n sendReconciliationNotification: sendReconciliationNotification,\n refreshByStudentAndActivity: refreshByStudentAndActivity,\n getAvailableExuses: getAvailableExuses\n }\n\n}]);\n","'use strict';\n\nwbApp.factory('activitySvc', ['$q', '$resource', 'repositorySvc',\n function ($q, $resource, repositorySvc) {\n var Activity = $resource('/Api/Activities/:id', {}, {\n 'getAllBySemesterID': { method: 'GET', isArray: true, url: '/Api/Activities/GetAllBySemesterID' },\n 'getByActivityID': { method: 'GET', url: '/Api/Activities/Get' },\n 'getSummary': { method: 'GET', isArray: true, url: '/Api/Activities/GetSummary' },\n 'getAllOpenForRegistration': { method: 'GET', isArray: true, url: '/Api/Activities/GetAllOpenForRegistration' },\n 'insert': { method: 'POST', url: '/Api/Activities/Insert' },\n 'update': { method: 'POST', url: '/Api/Activities/Update' },\n 'delete': { method: 'POST', url: '/Api/Activities/Delete' },\n 'registerActivityInterest': { method: 'POST', url: '/Api/Activities/registerActivityInterest' },\n 'getPhotoAlbum': { method: 'GET', isArray: true, url: '/Api/Activities/getPhotoAlbum' },\n 'getInfoByRange': { method: 'GET', isArray: true, url: '/restapi/activities/info/range' },\n });\n\n var bySemesterID;\n var lastSemesterID;\n\n var lastActivityByActivityID;\n var lastActivityID;\n\n function getByActivityID(activityID, refresh) {\n if (!lastActivityByActivityID || lastActivityID !== activityID || !!refresh) {\n lastActivityID = activityID;\n lastActivityByActivityID = repositorySvc.customGet('getByActivityID', Activity, {\n activityID: activityID\n });\n }\n\n return lastActivityByActivityID;\n }\n \n function getInfoByRange(fromDate, toDate) {\n return repositorySvc.customGet('getInfoByRange', Activity, \n {\n fromDate: fromDate,\n toDate: toDate,\n expanded: 'Semester'\n });\n }\n\n function getAllBySemesterIDAsync(semesterID, reload) {\n if (!bySemesterID || lastSemesterID !== semesterID || reload) {\n bySemesterID = repositorySvc.customGet('getAllBySemesterID', Activity, { semesterID: semesterID });\n lastSemesterID = semesterID;\n }\n\n return bySemesterID;\n }\n\n function getSummary() {\n return repositorySvc.customGet('getSummary', Activity);\n }\n\n function getBySemesterIDAndActivityID(semesterID, activityID) {\n return $q(function (resolve, reject) {\n var activities = getAllBySemesterIDAsync(semesterID, false);\n activities.$promise.then(function () {\n var activity = _.find(activities, { activityID: activityID });\n if (!activity) {\n reject(\"No activity with ID: \" + activityID);\n } else {\n resolve(activity);\n }\n }, function (errorResult) {\n reject(errorResult);\n });\n });\n }\n\n function getPhotoAlbum(activityID, studentID) {\n return repositorySvc.customGet('getPhotoAlbum', Activity, { activityID: activityID, studentID: studentID });\n }\n\n function getAllOpenForRegistration() {\n return repositorySvc.customGet('getAllOpenForRegistration', Activity, { });\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n Activity, // $resource\n bySemesterID, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'activityID');\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n Activity, // $resource\n bySemesterID, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'activityID');\n }\n\n function remove(data, errorCallback) {\n return repositorySvc.remove(\n Activity, // $resource\n bySemesterID, // collection\n data, // entity\n null, // successCallback\n errorCallback,\n null,\n 'activityID');\n }\n\n function registerActivityInterest(semestedID, successCallback, errorCallback) {\n Activity.registerActivityInterest({ semesterID: semestedID },\n successCallback,\n error);\n\n function error(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult, errorCallback);\n }\n }\n\n return {\n getAllBySemesterIDAsync: getAllBySemesterIDAsync,\n getSummary: getSummary,\n insert: insert,\n update: update,\n remove: remove,\n getAllOpenForRegistration: getAllOpenForRegistration,\n registerActivityInterest: registerActivityInterest,\n getBySemesterIDAndActivityID: getBySemesterIDAndActivityID,\n getByActivityID: getByActivityID,\n getPhotoAlbum: getPhotoAlbum,\n getInfoByRange: getInfoByRange\n }\n }]);","wbApp.factory('ageRangeSvc', ['$resource', 'repositorySvc',\n function ($resource, repositorySvc) {\n\n var AgeRange = $resource('/Api/AgeRanges/:id', {}, {\r\n 'getAll': { method: 'GET', isArray: true, url: '/Api/AgeRanges/GetAll' },\n 'update': { method: 'POST', url: '/Api/AgeRanges/Update' },\n 'insert': { method: 'POST', url: '/Api/AgeRanges/Insert' },\n 'delete': { method: 'POST', url: '/Api/AgeRanges/Delete' }\r\n });\n\n var ageRanges;\n\n function getAllAsync(refresh) {\r\n\r\n if (!ageRanges || refresh) {\r\n ageRanges = repositorySvc.customGet('getAll', AgeRange);\r\n }\r\n\r\n return ageRanges;\r\n }\n\n\n function insert(data, successCallback, errorCallback) {\r\n repositorySvc.insert(\n AgeRange, // $resource\n ageRanges, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'ageRangeID');\r\n }\n\n\n function update(data, successCallback, errorCallback) {\r\n repositorySvc.update(\n AgeRange, // $resource\n ageRanges, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'ageRangeID');\r\n }\n\n function remove(data, successCallback, errorCallback) {\r\n repositorySvc.remove(\n AgeRange, // $resource\n ageRanges, // collection\n { ageRangeID: data.ageRangeID }, // entity\n successCallback,\n errorCallback,\n {\r\n ageRangeID: data.ageRangeID\r\n },\n 'ageRangeID');\r\n }\n\n function createNew() {\r\n return {\r\n ageRangeID: 0,\r\n fromAge: 0,\r\n toAge: 199,\r\n buildIn: false\r\n };\r\n }\n\n return {\n getAllAsync: getAllAsync,\n insert: insert,\n update: update,\n remove: remove,\r\n createNew: createNew\r\n }\n\n }]);","wbApp.factory('attendanceSvc', ['$resource', '$q' , 'repositorySvc', \n function ($resource, $q, repositorySvc) {\n\n var Attendance = $resource('/Api/Attendnce/Get', {}, {\n 'getLessonAttendance': { method: 'GET', isArray: true, url: '/Api/Attendance/GetLessonAttendance' },\n 'getStudentCourseAttendance': { method: 'GET', isArray: true, url: '/Api/Attendance/GetStudentCourseAttendance' },\n 'getAllForCourseAndUser': { method: 'GET', isArray: true, url: '/Api/Attendance/GetAllForCourseAndUser' },\n 'getAllForCourse': { method: 'GET', isArray: true, url: '/Api/Attendance/GetAllForCourse' },\n 'getAttendanceSummary': { method: 'GET', isArray: true, url: '/Api/Attendance/GetAttendanceSummary' },\n 'getStudentAttendanceDetail': { method: 'GET', isArray: true, url: '/Api/Attendance/GetStudentAttendanceDetail' },\n 'update': { method: 'POST', url: '/Api/Attendance/Update' },\n 'insert': { method: 'POST', url: '/Api/Attendance/Insert' },\n 'delete': { method: 'POST', url: '/Api/Attendance/Delete' },\n });\n\n function insert(data, collection, successCallback, errorCallback) {\n repositorySvc.insert(\n Attendance, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, collection, successCallback, errorCallback) {\n repositorySvc.update(\n Attendance, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function getLessonAttendance(courseScheduleID) {\n return repositorySvc.customGet('getLessonAttendance', Attendance, {\n courseScheduleID: courseScheduleID\n });\n }\n\n function getStudentCourseAttendance(courseID, studentID) {\n return repositorySvc.customGet('getStudentCourseAttendance', Attendance, {\n courseID: courseID,\n studentID: studentID\n });\n }\n\n function remove(data, collection, successCallback, errorCallback) {\n repositorySvc.customPost(\n 'delete',\n Attendance, // $resource\n data, // entity\n successCallback, // successCallback\n errorCallback);\n }\n\n\n var lastCourseID;\n var lastUserID;\n var lastAttendanceByUser;\n \n var lastRefreshedAt = null; \n\n function getStudentCourseAttendanceByUser(courseID, studentID, userID, refresh) {\n var deferred = $q.defer();\n var result = [];\n result.$promise = deferred.promise;\n \n let refreshDebounce = refresh && (moment().isSameOrAfter(moment(lastRefreshedAt).add(500, 'ms')));\n if (lastCourseID != courseID || lastUserID != userID || !lastAttendanceByUser || refreshDebounce) {\n\n lastRefreshedAt = moment();\n \n lastCourseID = courseID;\n lastUserID = userID;\n lastAttendanceByUser = repositorySvc.customGet('getAllForCourseAndUser', Attendance, {\n courseID: courseID,\n userID: userID\n });\n }\n \n lastAttendanceByUser.$promise.then(function (data) {\n var filtered = _.filter(data, { studentID: studentID });\n result.push.apply(result, filtered);\n deferred.resolve(result);\n });\n\n return result;\n }\n\n function getAllForCourse(courseID) {\n return repositorySvc.customGet('getAllForCourse', Attendance, {\n courseID: courseID\n });\n }\n\n function getAttendanceSummary(studentID) {\n return repositorySvc.customGet('getAttendanceSummary', Attendance, {\n studentID: studentID\n });\n }\n\n function getStudentAttendanceDetail(studentID) {\n return repositorySvc.customGet('getStudentAttendanceDetail', Attendance, {\n studentID: studentID\n });\n }\n\n // courseScheduleDTO: {\n // \"courseScheduleID\": 493286,\n // \"startDate\": \"2017-02-14T16:00:00\",\n // \"teacher\": \"Petra Brabcová\",\n // \"classroomName\": \"hudební učebna\",\n // }\n // studentAttendanceDTO: {\n // \"studentID\": 1234,\n // \"courseScheduleID\": \"\",\n // \"fullName\": \"Nikola Brabcova\",\n // \"attendanceStatus\": 0,\n // \"attendanceType\": 0,\n // \"modified\": false,\n // \"attendanceCount\": 1\n // }\n // result: [ \n // {\n // \"studentID\": 1234,\n // \"fullName\": \"Nikola Brabcova\",\n // \"493286\": { // courseScheduleID\n // \"startDate\": \"2017-02-14T16:00:00\",\n // \"attendanceStatus\": 0,\n // \"attendanceType\": 0,\n // \"modified\": false,\n // \"attendanceCount\": 1\n // },\n // \"493287\": { // courseScheduleID\n // }\n // }, {\n // ...\n // }\n // ]\n function prepareFullCourseAttendanceTable(studentAttendanceDTOs, courseScheduleDTOs) {\n var attendanceByStudent = _.groupBy(studentAttendanceDTOs, 'studentID');\n var result = [];\n var mnow = moment();\n\n _.forIn(attendanceByStudent, function (value, key) {\n var firstAttendance = _.head(value);\n var attendanceMapBySchedule = _.keyBy(value, 'courseScheduleID');\n var student = {\n studentID: Number(key),\n fullName: firstAttendance.fullName,\n isRegistered: !!_.find(value, { attendanceType: 0 })\n };\n result.push(student);\n\n _.forEach(courseScheduleDTOs, function (schedule) {\n var attendance = attendanceMapBySchedule[schedule.courseScheduleID];\n if (attendance && moment(schedule.startDate).isAfter(mnow) && !attendance.attendanceStatus) {\n attendance = null;\n }\n\n if (!!attendance) {\n student[schedule.courseScheduleID] = {\n startDate: schedule.startDate,\n attendanceStatus: attendance.attendanceStatus,\n attendanceType: attendance.attendanceType,\n modified: attendance.modified,\n attendanceCount: attendance.attendanceCount,\n };\n } else {\n student[schedule.courseScheduleID] = {\n startDate: schedule.startDate,\n attendanceStatus: null,\n attendanceType: null,\n modified: null,\n attendanceCount: null,\n };\n };\n });\n });\n\n return result;\n }\n\n function groupAttendanceDetail(attendanceDetail) {\n\n var deferred = $q.defer();\n var result = [];\n result.$promise = deferred.promise;\n\n attendanceDetail.$promise.then(function (data) {\n var grouping = _.groupBy(data, 'impliedCourseID');\n var rr = [];\n _.forEach(grouping, function (items) {\n rr.push({\n course: 'Kurz: ' + items[0].impliedCourse,\n courseID: items[0].impliedCourseID,\n isGroupRow: true,\n items: _.sortBy(items, function (o) {\n return o.startDate;\n })\n });\n });\n result.push.apply(result, _.sortBy(rr, function (o) {\n return o.courseID;\n }));\n deferred.resolve(result);\n });\n\n return result;\n }\n\n return {\n insert: insert,\n update: update,\n remove: remove,\n getLessonAttendance: getLessonAttendance,\n getStudentCourseAttendance: getStudentCourseAttendance,\n getStudentCourseAttendanceByUser: getStudentCourseAttendanceByUser,\n getAttendanceSummary: getAttendanceSummary,\n getStudentAttendanceDetail: getStudentAttendanceDetail,\n groupAttendanceDetail: groupAttendanceDetail,\n getAllForCourse: getAllForCourse,\n prepareFullCourseAttendanceTable: prepareFullCourseAttendanceTable\n }\n }\n]);\n","wbApp.factory('classroomAvailabilitySchedulesSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n var AvailabilitySchedule = $resource('/restapi/places/:placeId/availability-schedules/:id', {}, {\n 'getSingle': { method: 'GET', url: '/restapi/places/:placeId/availability-schedules/:id' },\n 'getRange': { method: 'GET', isArray: true, url: '/restapi/places/:placeId/availability-schedules/range' },\n 'updateRange': { method: 'PUT', url: '/restapi/places/:placeId/availability-schedules/range' }\n });\n\n var lastLoadedDay = null;\n var lastLoadedDayFilter = {\n classroomId: null,\n date: null,\n loadedAt: moment()\n };\n\n function loadDay(classroomId, date) {\n\n var mnow = moment();\n\n if (!lastLoadedDay ||\n lastLoadedDayFilter.classroomId != classroomId ||\n !moment(lastLoadedDayFilter.date).isSame(date) ||\n lastLoadedDayFilter.loadedAt.isBefore(mnow)) {\n \n lastLoadedDayFilter = {\n classroomId: classroomId,\n date: date,\n loadedAt: moment().add(10, 'seconds')\n };\n\n lastLoadedDay = $q(function (resolve, reject) {\n repositorySvc.customGet('getSingle', AvailabilitySchedule, {\n placeId: classroomId,\n id: moment(date).startOf('day').format('YYYY-MM-DD')\n },\n function (data) {\n if (!data) {\n resolve({ day: moment(date).startOf('day').toDate(), periods: [] });\n } else {\n resolve(data);\n }\n },\n function (error) {\n reject(error);\n })\n });\n } \n\n return lastLoadedDay;\n }\n\n function loadWeek(classroomId, date) {\n return $q(function (resolve, reject) {\n\n var startOfWeek = moment(date).startOf('isoWeek');\n var endOfWeek = moment(date).endOf('isoWeek').startOf('day');\n\n repositorySvc.customGet('getRange', AvailabilitySchedule, {\n placeId: classroomId,\n from: startOfWeek.toDate(),\n to: endOfWeek.toDate(),\n }, function (data) {\n var result = [];\n for (var i = 0; i < 7; i++) {\n var dayData = _.find(data, function (d) {\n return moment(d.day).isSame(startOfWeek);\n });\n if (dayData) {\n result.push(dayData);\n } else {\n result.push({ day: startOfWeek.toDate(), periods: [] });\n }\n startOfWeek.add(1, 'day');\n }\n resolve(result);\n },\n function (error) {\n reject(error);\n }\n );\n });\n }\n\n function loadPeriod(classroomId, startDate, endDate) {\n\n return $q(function (resolve, reject) {\n\n var startOfPeriod = moment(startDate).startOf('day');\n var endOfPeriod = moment(endDate).endOf('day');\n\n repositorySvc.customGet('getRange', AvailabilitySchedule, {\n placeId: classroomId,\n from: startOfPeriod.toDate(),\n to: endOfPeriod.toDate(),\n }, function (data) {\n\n var numberOfDay = Math.ceil(endOfPeriod.diff(startOfPeriod, 'days', true));\n\n var result = [];\n for (var i = 0; i < numberOfDay ; i++) {\n var dayData = _.find(data, function (d) {\n return moment(d.day).isSame(startOfPeriod);\n });\n if (dayData) {\n result.push(dayData);\n } else {\n result.push({ day: startOfPeriod.toDate(), periods: [] });\n }\n startOfPeriod.add(1, 'day');\n }\n resolve(result);\n },\n function (error) {\n reject(error);\n }\n );\n });\n }\n\n function saveWeek(classroomId, date, model) {\n return $q(function (resolve, reject) {\n\n var startOfWeek = moment(date).startOf('isoWeek');\n var endOfWeek = moment(date).endOf('isoWeek').startOf('day');\n\n var filtered = _.filter(model, function (d) { return !!d.periods && d.periods.length > 0; });\n\n repositorySvc.customPutWithParams(\n 'updateRange', \n AvailabilitySchedule,\n {\n placeId: classroomId,\n from: startOfWeek.toDate(),\n to: endOfWeek.toDate()\n },\n filtered,\n function (data) {\n resolve(data);\n },\n function (error) {\n repositorySvc.defaultErrorHandler(error);\n reject(error);\n }\n );\n });\n }\n\n function saveWeekAsPaternForPeriod(classroomId, periodStart, periodEnd, weekModelTemplate)\n {\n return $q(function (resolve, reject) {\n var startOfWeekPeriod = moment(periodStart).startOf('isoWeek');\n var endOfWeekPeriod = moment(periodEnd).endOf('isoWeek').startOf('day');\n\n var filtered = _.filter(weekModelTemplate, function (d) { return !!d.periods && d.periods.length > 0; });\n\n var currentPeriod = moment(startOfWeekPeriod);\n var toSave = [];\n while (currentPeriod.isBefore(endOfWeekPeriod)) {\n\n if (filtered.length > 0) {\n var templateCopy = angular.copy(filtered);\n var timeDifference = moment.duration(currentPeriod.diff(moment(templateCopy[0].day).startOf('week')));\n\n _.forEach(templateCopy, function (d) {\n d.day = moment(d.day).add(timeDifference).toDate();\n _.forEach(d.periods, function (p) {\n p.start = moment(p.start).add(timeDifference).toDate();\n p.end = moment(p.end).add(timeDifference).toDate();\n });\n\n toSave.push(d);\n });\n }\n\n currentPeriod.add(1, 'week'); \n }\n\n repositorySvc.customPutWithParams(\n 'updateRange',\n AvailabilitySchedule,\n {\n placeId: classroomId,\n from: startOfWeekPeriod.toDate(),\n to: endOfWeekPeriod.toDate()\n },\n toSave,\n function (data) {\n resolve(data);\n },\n function (error) {\n repositorySvc.defaultErrorHandler(error);\n reject(error);\n }\n );\n });\n }\n\n return {\n loadWeek: loadWeek,\n saveWeek: saveWeek,\n saveWeekAsPaternForPeriod: saveWeekAsPaternForPeriod,\n loadDay: loadDay,\n loadPeriod: loadPeriod\n }\n }]);","'use strict';\n\nwbApp.factory('classroomSvc', ['$resource', '$q', 'repositorySvc', 'domainsSvc', \n function ($resource, $q, repositorySvc, domainsSvc) {\n var Classroom = $resource('/Api/Classrooms/:id', {}, {\n 'getAll': { method: 'GET', isArray: true, url: '/Api/Classrooms/GetAll' },\n 'update': { method: 'POST', url: '/Api/Classrooms/Update' },\n 'insert': { method: 'POST', url: '/Api/Classrooms/Insert' },\n 'delete': { method: 'POST', url: '/Api/Classrooms/Delete' },\n 'domainsGetAll': { method: 'GET', isArray: true, url: '/restapi/places/:placeId/domains' },\n 'domainsInsert': { method: 'POST', url: '/restapi/places/:placeId/domains' },\n 'domainsUpdate': { method: 'PUT', url: '/restapi/places/:placeId/domains/:id' },\n 'domainsDelete': { method: 'DELETE', url: '/restapi/places/:placeId/domains/:id' },\n 'availabilityByDomainsAndRange': { method: 'POST', isArray: true, url: '/restapi/places/:placeId/availability/find-by-domains-and-range' }\n });\n\n var classrooms;\n var nonDeleted;\n\n function createNew() {\n return {\n id: 0,\n name: \"\",\n description: \"\",\n capacity: 0,\n active: true,\n isDeleted: false,\n addressID: null,\n showInCourses: true,\n showInReservations: true,\n reservationStartTimeType: 1,\n reservationsSchedulerScale: 30,\n reservationsSchedulerSelectByBlocks: 2,\n reservationsSchedulerMaximumSelectedBlocks: 4,\n address: {\n addressID: 0,\n addressJson: null,\n formattedAddress: null,\n location: { latitude: null, longitude: null },\n mapZoom: null\n }\n };\n }\n\n function getAllAsync(reload) {\n if (!classrooms || reload) {\n classrooms = repositorySvc.customGet('getAll', Classroom);\n nonDeleted = null;\n }\n\n return classrooms;\n }\n\n function getAllNonDeletedAsync(reload) {\n if (nonDeleted && !reload) {\n return nonDeleted;\n }\n\n var allClassrooms = getAllAsync(reload);\n nonDeleted = [];\n var deferred = $q.defer();\n nonDeleted.$promise = deferred.promise;\n\n allClassrooms.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if (!value.isDeleted) {\n nonDeleted.push(value);\n }\n });\n deferred.resolve(nonDeleted);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return nonDeleted;\n }\n\n function getAllActiveAsync(classroomIDtoInclude, filterForReservations, filterForCourses, filterForRents) {\n var allClassrooms = getAllAsync();\n var filteredClassroom = [];\n\n var deferred = $q.defer();\n filteredClassroom.$promise = deferred.promise;\n\n allClassrooms.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if ((!value.isDeleted && value.active) || value.id === classroomIDtoInclude) {\n\n if (!!filterForReservations && !!value.showInReservations) {\n filteredClassroom.push(value);\n }\n else {\n if (!!filterForCourses && !!value.showInCourses) {\n filteredClassroom.push(value);\n }\n else {\n if (!!filterForRents && !!value.showInRents) {\n filteredClassroom.push(value);\n }\n }\n }\n \n if (!filterForReservations && !filterForCourses && !filterForRents) {\n filteredClassroom.push(value);\n } \n }\n });\n deferred.resolve(filteredClassroom);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filteredClassroom;\n }\n\n function get(id) {\n if (classrooms) {\n for (var i = 0; i < classrooms.length; i++) {\n var sc = classrooms[i];\n if (sc.id === id) {\n return sc;\n }\n }\n }\n return null;\n }\n\n function getAsync(id) {\n var cl = getAllAsync();\n\n var deferred = $q.defer();\n\n cl.$promise.then(function (data) {\n deferred.resolve(_.find(data, { id: id }));\n }, function(reason) {\n deferred.reject(reason);\n })\n\n return deferred.promise;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n Classroom, // $resource\n classrooms, // collection\n data, // entity\n success,\n errorCallback);\n\n function success(entity) {\n repositorySvc.entityInserted(nonDeleted, entity);\n\n if (successCallback) {\n successCallback(entity);\n }\n }\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n Classroom, // $resource\n classrooms, // collection\n data, // entity\n success,\n errorCallback);\n\n function success(entity) {\n repositorySvc.entityUpdated(nonDeleted, entity);\n\n if (successCallback) {\n successCallback(entity);\n }\n }\n }\n\n function remove(data, successCallback, errorCallback) {\n repositorySvc.remove(\n Classroom, // $resource\n classrooms, // collection\n data, // entity\n success,\n errorCallback);\n\n function success() {\n repositorySvc.entityRemoved(nonDeleted, data.id);\n\n if (successCallback) {\n successCallback();\n }\n }\n }\n\n function getPlacesDomains(placeId) {\n if (!placeId) {\n return $q(function (resolve, reject) {\n resolve([]);\n });\n } else {\n return repositorySvc.customGet(\n 'domainsGetAll',\n Classroom,\n {\n placeId: placeId\n });\n }\n }\n\n function loadDomainsData(placeId) {\n return $q(function (resolve, reject) {\n $q.all([\n domainsSvc.getAllExpanded().$promise,\n getPlacesDomains(placeId).$promise])\n .then(function (data) {\n let domains = [];\n let placesDomains = data[1];\n \n _.each(data[0], function(d0) {\n d0.parentId = null;\n let placesDomain = _.find(placesDomains, function(d) { return d.id === d0.id});\n if (!!placesDomain && !!placesDomain.domainPrices) {\n d0.reservationTeacherHourSingleRateOverride = placesDomain.domainPrices.reservationTeacherHourSingleRate;\n d0.reservationTeacherHourSingleRateOverrideOrigin = placesDomain.domainPrices.reservationTeacherHourSingleRate;\n\n d0.reservationTeacherHourGroupOneRateOverride = placesDomain.domainPrices.reservationTeacherHourGroupOneRate;\n d0.reservationTeacherHourGroupOneRateOverrideOrigin = placesDomain.domainPrices.reservationTeacherHourGroupOneRate;\n\n d0.reservationTeacherHourGroupTwoRateOverride = placesDomain.domainPrices.reservationTeacherHourGroupTwoRate;\n d0.reservationTeacherHourGroupTwoRateOverrideOrigin = placesDomain.domainPrices.reservationTeacherHourGroupTwoRate;\n }\n domains.push(d0);\n \n _.each(d0.specializations, function(d1) {\n d1.parentId = d0.id;\n let placesSpecialization = !!placesDomain \n ? _.find(placesDomain.specializationsPrices || [], function(s) { return s.id === d1.id})\n : null;\n if (!!placesSpecialization) {\n d1.reservationTeacherHourSingleRateOverride = placesSpecialization.reservationTeacherHourSingleRate;\n d1.reservationTeacherHourSingleRateOverrideOrigin = placesSpecialization.reservationTeacherHourSingleRate;\n\n d1.reservationTeacherHourGroupOneRateOverride = placesSpecialization.reservationTeacherHourGroupOneRate;\n d1.reservationTeacherHourGroupOneRateOverrideOrigin = placesSpecialization.reservationTeacherHourGroupOneRate;\n\n d1.reservationTeacherHourGroupTwoRateOverride = placesSpecialization.reservationTeacherHourGroupTwoRate;\n d1.reservationTeacherHourGroupTwoRateOverrideOrigin = placesSpecialization.reservationTeacherHourGroupTwoRate; \n }\n domains.push(d1);\n });\n delete d0.specializations;\n });\n \n //console.error(domains);\n\n let selection = _.flatMapDeep(placesDomains, function (d) {\n return [d.domainId, d.specializationIds];\n });\n\n resolve({ domains: domains, selection: selection });\n }, function (error) {\n reject(error);\n });\n });\n }\n\n // domains are flattened\n function saveDomainsData(placeId, flattenedDomains, origSelection, newSelection, success, error) {\n\n let origSelectionDict = _.keyBy(origSelection, function (o) { return o; })\n let newSelectionDict = _.keyBy(newSelection, function (o) { return o; })\n\n let toInsert = [];\n let toUpdate = [];\n let toDelete = [];\n\n let promisses = [];\n\n // un-flatten\n let domainsDict = {};\n let flattenedDomainsCopy = _.cloneDeep(flattenedDomains);\n \n _.forEach(flattenedDomainsCopy, function(d) {\n if (!d.parentId) {\n domainsDict[d.id] = d;\n d.specializations = [];\n delete d.parentId;\n }\n });\n\n _.forEach(flattenedDomainsCopy, function(d) {\n if (!!d.parentId) {\n domainsDict[d.parentId].specializations.push(d);\n delete d.parentId;\n }\n });\n \n let domains = _.values(domainsDict);\n \n //console.error(domains);\n \n _.forEach(domains, function (d) {\n\n let origPlaceDomain = {\n id: null,\n domainId: null,\n domainPrices: null,\n specializationIds: [],\n specializationsPrices: []\n };\n\n let newPlaceDomain = {\n id: null,\n domainId: null,\n domainPrices: null,\n specializationIds: [],\n specializationsPrices: []\n }\n\n _.forEach(d.specializations, function (s) {\n if (_.has(origSelectionDict, s.id)) {\n origPlaceDomain.specializationIds.push(s.id);\n if (!_.isNil(s.reservationTeacherHourSingleRateOverrideOrigin) ||\n !_.isNil(s.reservationTeacherHourGroupOneRateOverrideOrigin) ||\n !_.isNil(s.reservationTeacherHourGroupTwoRateOverrideOrigin)) {\n origPlaceDomain.specializationsPrices.push({\n id: s.id,\n reservationTeacherHourSingleRate: s.reservationTeacherHourSingleRateOverrideOrigin,\n reservationTeacherHourGroupOneRate: s.reservationTeacherHourGroupOneRateOverrideOrigin,\n reservationTeacherHourGroupTwoRate: s.reservationTeacherHourGroupTwoRateOverrideOrigin,\n })\n } \n }\n\n if (_.has(newSelectionDict, s.id)) {\n newPlaceDomain.specializationIds.push(s.id);\n if (!_.isNil(s.reservationTeacherHourSingleRateOverride) ||\n !_.isNil(s.reservationTeacherHourGroupOneRateOverride) ||\n !_.isNil(s.reservationTeacherHourGroupTwoRateOverride)) {\n newPlaceDomain.specializationsPrices.push({\n id: s.id,\n reservationTeacherHourSingleRate: s.reservationTeacherHourSingleRateOverride,\n reservationTeacherHourGroupOneRate: s.reservationTeacherHourGroupOneRateOverride,\n reservationTeacherHourGroupTwoRate: s.reservationTeacherHourGroupTwoRateOverride, \n })\n }\n }\n });\n\n if (origPlaceDomain.specializationIds.length || _.has(origSelectionDict, d.id)) {\n origPlaceDomain.id = d.id;\n origPlaceDomain.domainId = d.id;\n if (!_.isNil(d.reservationTeacherHourSingleRateOverrideOrigin) ||\n !_.isNil(d.reservationTeacherHourGroupOneRateOverrideOrigin) ||\n !_.isNil(d.reservationTeacherHourGroupTwoRateOverrideOrigin)) {\n origPlaceDomain.domainPrices = {\n id: d.id,\n reservationTeacherHourSingleRate: d.reservationTeacherHourSingleRateOverrideOrigin,\n reservationTeacherHourGroupOneRate: d.reservationTeacherHourGroupOneRateOverrideOrigin,\n reservationTeacherHourGroupTwoRate: d.reservationTeacherHourGroupTwoRateOverrideOrigin,\n } \n }\n }\n\n if (newPlaceDomain.specializationIds.length || _.has(newSelectionDict, d.id)) {\n newPlaceDomain.id = d.id;\n newPlaceDomain.domainId = d.id;\n if (!_.isNil(d.reservationTeacherHourSingleRateOverride) ||\n !_.isNil(d.reservationTeacherHourGroupOneRateOverride) ||\n !_.isNil(d.reservationTeacherHourGroupTwoRateOverride)) {\n newPlaceDomain.domainPrices = {\n id: d.id,\n reservationTeacherHourSingleRate: d.reservationTeacherHourSingleRateOverride,\n reservationTeacherHourGroupOneRate: d.reservationTeacherHourGroupOneRateOverride,\n reservationTeacherHourGroupTwoRate: d.reservationTeacherHourGroupTwoRateOverride,\n }\n } \n }\n\n if (!!origPlaceDomain.id && !newPlaceDomain.id) {\n toDelete.push(origPlaceDomain);\n }\n\n if (!origPlaceDomain.id && !!newPlaceDomain.id) {\n toInsert.push(newPlaceDomain);\n }\n\n if (!!origPlaceDomain.id && !!newPlaceDomain.id) {\n if (!_.isEqual(origPlaceDomain, newPlaceDomain)) {\n toUpdate.push(newPlaceDomain);\n }\n }\n });\n\n _.forEach(toInsert, function (o) {\n promisses.push(repositorySvc.customPutWithParams('domainsInsert', Classroom, { placeId: placeId }, o));\n });\n _.forEach(toUpdate, function (o) {\n promisses.push(repositorySvc.customPutWithParams('domainsUpdate', Classroom, { placeId: placeId, id: o.id }, o));\n });\n _.forEach(toDelete, function (o) {\n promisses.push(repositorySvc.customDelete('domainsDelete', Classroom, { placeId: placeId, id: o.id }));\n });\n\n if (promisses.length === 0) {\n success();\n } else {\n $q.all(promisses).then(function (data) {\n success(data);\n }, function (e) {\n error(e);\n });\n }\n }\n\n function availabilityByDomainsAndRange(placeId, domains, date)\n {\n var startOfWeek = moment(date).startOf('isoWeek');\n var endOfWeek = moment(date).endOf('isoWeek').startOf('day');\n\n return $q(function (resolve, reject) {\n\n var result = Classroom['availabilityByDomainsAndRange'](\n {\n placeId: placeId\n }, {\n start: startOfWeek.toDate(),\n end: endOfWeek.toDate(),\n domains: domains\n });\n\n result.$promise.then(\n function (data) {\n var result = _.flatMap(data, function (d) { return d.periods; });\n resolve(result);\n },\n function (error) {\n reject(error);\n }\n );\n });\n }\n\n function getAllBrief() {\n return $q(function (resolve, reject) {\n getAllActiveAsync().$promise.then(\n function (data) {\n resolve(_.map(data, function (c) {\n return {\n id: c.id + \"\",\n name: c.name\n }\n }));\n },\n function (error) {\n reject(error);\n })\n });\n }\n \n return {\n getAllAsync: getAllAsync,\n getAllActiveAsync: getAllActiveAsync,\n getAllNonDeletedAsync: getAllNonDeletedAsync,\n get: get,\n getAsync: getAsync,\n insert: insert,\n update: update,\n remove: remove,\n createNew: createNew,\n loadDomainsData: loadDomainsData,\n saveDomainsData: saveDomainsData,\n availabilityByDomainsAndRange: availabilityByDomainsAndRange,\n getAllBrief: getAllBrief,\n }\n }]);","wbApp.factory('compensationGroupSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n var CompensationGroup = $resource('/Api/CompensationGroups/:id', {}, {\n 'getLookup': { method: 'GET', isArray: true, url: '/Api/CompensationGroups/GetLookup' },\n 'getAll': { method: 'GET', isArray: true, url: '/Api/CompensationGroups/GetAll' },\n 'update': { method: 'POST', url: '/Api/CompensationGroups/Update' },\n 'insert': { method: 'POST', url: '/Api/CompensationGroups/Insert' },\n 'delete': { method: 'POST', url: '/Api/CompensationGroups/Delete' }\n });\n\n var compensationGroupsBrief;\n var compensationGroups;\n\n function getLookup() {\n if (!compensationGroupsBrief) {\n compensationGroupsBrief = repositorySvc.customGet('getLookup', CompensationGroup);\n }\n\n return compensationGroupsBrief;\n }\n\n function getDefaultAsync() {\n var all = getLookup();\n\n return $q(function (resolve, reject) {\n all.$promise.then(function (data) {\n var def = _.find(data, { isDefault: true, active: true, isDeleted: false });\n if (!def && data.length > 0) {\n def = data[0];\n }\n resolve(def);\n }, function (reason) {\n reject(reason);\n });\n });\n }\n\n function getLookupActiveAsync(IDstoInclude) {\n var all = getLookup();\n var filtered = [];\n\n var deferred = $q.defer();\n filtered.$promise = deferred.promise;\n\n all.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if ((!value.isDeleted && value.active) || (!!IDstoInclude && _.indexOf(IDstoInclude, value.id) !== -1)) {\n filtered.push(value);\n }\n });\n deferred.resolve(filtered);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filtered;\n }\n\n function get(id) {\n if (compensationGroupsBrief) {\n for (var i = 0; i < compensationGroupsBrief.length; i++) {\n var sc = compensationGroupsBrief[i];\n if (sc.id === id) {\n return sc;\n }\n }\n }\n return null;\n }\n\n\r\n function getAsync(id) {\r\n var deferred = $q.defer();\r\n\r\n getLookup().$promise.then(function (sem) {\r\n angular.forEach(sem, function (value, key) {\r\n if (value.id == id) {\r\n deferred.resolve(value);\r\n return;\r\n }\r\n })\r\n deferred.resolve(null);\r\n }, function (errorResult) {\r\n deferred.reject(errorResult);\r\n });\r\n\r\n return deferred.promise;\r\n }\n\n function createNew() {\n return {};\n }\n\n function getAllAsync(reload) {\n compensationGroups = repositorySvc.customGet('getAll', CompensationGroup);\n\n return compensationGroups;\n }\n\n function insert(data, successCallback, errorCallback) {\n\n function success(entity) {\r\n compensationGroupsBrief = null;\r\n if (successCallback) {\r\n successCallback(entity);\r\n }\r\n }\n \n return repositorySvc.insert(\n CompensationGroup, // $resource\n compensationGroups, // collection\n data, // entity\n success,\n errorCallback,\n 'compensationGroupID');\n }\n\n function update(data, successCallback, errorCallback) {\n\n function success(entity) {\r\n compensationGroupsBrief = null;\r\n if (successCallback) {\r\n successCallback(entity);\r\n }\r\n }\n\n return repositorySvc.update(\n CompensationGroup, // $resource\n compensationGroups, // collection\n data, // entity\n success,\n errorCallback,\n 'compensationGroupID');\n }\n\n function remove(data, successCallback, errorCallback) {\n\r\n function success(entity) {\r\n compensationGroupsBrief = null;\r\n if (successCallback) {\r\n successCallback(entity);\r\n }\r\n }\n\n return repositorySvc.remove(\n CompensationGroup, // $resource\n compensationGroups, // collection\n data, // entity\n success,\n errorCallback,\n { compensationGroupID: data.compensationGroupID },\n 'compensationGroupID');\n }\n\n return {\n getLookup: getLookup,\n get: get,\n getAsync: getAsync,\n getAllAsync: getAllAsync,\n insert: insert,\n update: update,\n remove: remove,\n createNew: createNew,\n getLookupActiveAsync: getLookupActiveAsync,\n getDefaultAsync: getDefaultAsync\n }\n }]);","wbApp.factory('consentSvc', ['$resource', '$q', '$sce', '$translate', 'repositorySvc',\n function ($resource, $q, $sce, $translate, repositorySvc) {\n var Consent = $resource('/Api/Groups/:id', {}, { \n 'getConsentsInfoBrief': { method: 'GET', isArray: true, url: '/Api/Consents/GetConsentsInfoBrief' },\n 'getConsentsInfoForUser': { method: 'GET', isArray: false, url: '/Api/Consents/GetConsentsInfoForUser' },\n 'assignConsensts': { method: 'POST', url: '/Api/Consents/AssignConsensts' },\n 'approveConsent': { method: 'POST', url: '/Api/Consents/ApproveConsent' },\n 'rejectConsent': { method: 'POST', url: '/Api/Consents/RejectConsent' },\n });\n\n function getConsentsInfoBrief() {\n return repositorySvc.customGet('getConsentsInfoBrief', Consent);\n }\n\n function getConsentsInfoForUser(userID) {\n return repositorySvc.customGet('getConsentsInfoForUser', Consent, {\n userID: userID\n });\n }\n\n\n // data: \n // { \n // informUsers: true|false,\n // consnetIDs: [1,2,3,4],\n // userIDs: [1,2,3,4]\n // }\n function assignConsensts(data, success, error) {\n return repositorySvc.customPost(\n 'assignConsensts',\n Consent,\n data,\n success,\n error\n );\n }\n\n function approveConsent(consent, success, error) {\n return repositorySvc.customPost(\n 'approveConsent',\n Consent,\n { consentID: consent.consentID },\n success,\n error\n );\n }\n\n function rejectConsent(consent, success, error) {\n return repositorySvc.customPost(\n 'rejectConsent',\n Consent,\n { consentID: consent.consentID },\n success,\n error\n );\n }\n\n return {\n getConsentsInfoBrief: getConsentsInfoBrief,\n getConsentsInfoForUser: getConsentsInfoForUser,\n assignConsensts: assignConsensts,\n approveConsent: approveConsent,\n rejectConsent: rejectConsent\n }\n }]);","'use strict';\n\nwbApp.factory('coursePriceSvc', ['tenantSettingSvc', '$filter', '$translate',\n function (tenantSettingSvc, $filter, $translate) {\n\n function getPriceStr(finalPrice, remainingLessons, discountAmt, showNoOfLessons) {\n if (showNoOfLessons) {\n if (discountAmt) {\n return '{0} ({1} {2}, {3} {4})'.f(\n $filter('wbCurrencyFlt')(finalPrice),\n remainingLessons,\n $translate.instant('TXT_COL_LESSONS'),\n $filter('wbCurrencyFlt')(discountAmt),\n $translate.instant('TXT_COL_DISCOUNT'));\n } else {\n return '{0} ({1} {2})'.f(\n $filter('wbCurrencyFlt')(finalPrice),\n remainingLessons,\n $translate.instant('TXT_COL_LESSONS'));\n }\n } else {\n if (discountAmt) {\n return '{0} ({1} {2})'.f(\n $filter('wbCurrencyFlt')(finalPrice),\n $filter('wbCurrencyFlt')(discountAmt),\n $translate.instant('TXT_COL_DISCOUNT'));\n } else {\n return $filter('wbCurrencyFlt')(finalPrice);\n }\n }\n }\n\n function getCourseFeeLineName(course, noOfLessons, useAmortizationSchedule) {\n if (course.fixedPrice !== null && course.fixedPrice !== undefined) {\n return '{0} ({1})'.f(\n $translate.instant('TXT_LBL_COURSE_FEE'),\n $translate.instant('TXT_LBL_FIXED_PRICE'));\n } else {\n var factor = !!useAmortizationSchedule\n ? (course.amortizationScheduleSurchargePct / 100) + 1\n : 1;\n\n return '{0} ({1} x {2})'.f(\n $translate.instant('TXT_LBL_COURSE_FEE'),\n noOfLessons,\n $filter('wbCurrencyFlt')(_.round(course.price * factor, 2))\n );\n }\n }\n\n\n function findStudentAttendance(attendance, studentID) {\n if (!attendance || attendance.length === 0) {\n return null;\n }\n\n for (var s = 0; s < attendance.length; s++) {\n var studentAtt = attendance[s];\n if (studentAtt.studentID === studentID) {\n return studentAtt;\n }\n }\n\n return null;\n }\n\n function calcRemainingPaidAttendance(scheduleWithAttendance, studentID, remainingLessons) {\n if (!scheduleWithAttendance || scheduleWithAttendance.length === 0) {\n return remainingLessons;\n }\n\n var cnt = 0;\n\n for (var l = 0; l < scheduleWithAttendance.length; l++) {\n var lesson = scheduleWithAttendance[l];\n var studentAtt = findStudentAttendance(lesson.attendance, studentID);\n\n if ((studentAtt && \n studentAtt.courseAttendanceFeeType !== null &&\n studentAtt.courseAttendanceFeeType !== 1 && // OneOff\n studentAtt.courseAttendanceFeeType !== 2 // None\n ) ||\n (studentAtt === null) ||\n (studentAtt !== null && studentAtt.courseAttendanceFeeType === null)\n ) {\n cnt++;\n }\n }\n\n return cnt;\n }\n\n // Expects:\n // course { \n // price: 0, \n // fixedPrice: 0, ,\n // remainingLessons: 0, \n // scheduleWithAttendance: [ \n // { \n // courseScheduleID: 0,\n // attendance: [ { studentID: 0, courseAttendanceFeeType: 0 } ]\n // } \n // ] }\n // student { studentID: 0, promotions: [] }\n function getPriceDetails(course, student, isAction) {\n \n var basePrice = getCourseBasePrice(\n course,\n calcRemainingPaidAttendance(course.scheduleWithAttendance, student.studentID, course.remainingLessons),\n student.attendanceCount);\n\n var finalPriceWithoutDiscounts = basePrice;\n var discountPct = 0;\n\n angular.forEach(student.promotions, function (promotion) {\n // promotions which we do not own but are going to buy\n // so we need to add their price\n if (!promotion.owns &&\n (promotion.isMandatory || promotion.buy)) {\n finalPriceWithoutDiscounts += promotion.price;\n }\n\n if (promotion.owns || promotion.isMandatory || promotion.buy) {\n discountPct += promotion.discountPct;\n }\n });\n\n // Calculate discount amount\n var discountAmt = (basePrice * discountPct) / 100;\n var finalPrice = finalPriceWithoutDiscounts - discountAmt;\n\n return {\n basePrice: basePrice,\n discountAmt: discountAmt,\n finalPrice: finalPrice,\n finalPriceStr: getPriceStr(\n finalPrice,\n course.remainingLessons,\n discountAmt,\n !course.fixedPrice && !isAction)\n };\n }\n\n\n // course { \n // price: 0, \n // fixedPrice: 0,\n // amortizationScheduleSurchargePct: 0\n // }\n // remainingLessons: 0\n // attendanceCount: 1 - for actions,\n // useAmortizationSchedule: [true|false]\n function getCourseBasePrice(course, remainingLessons, attendanceCount, useAmortizationSchedule) {\n\n var basePrice = 0;\n\n if (course.fixedPrice !== null && course.fixedPrice !== undefined) { // 0 is valid price\n basePrice = course.fixedPrice;\n } else {\n if (course.subjectCategoryID === 2) {\n // Action\n basePrice = course.price;\n } else {\n basePrice = remainingLessons * course.price;\n }\n }\n\n basePrice = basePrice * (attendanceCount || 1);\n\n if (!!useAmortizationSchedule) {\n var factor = (course.amortizationScheduleSurchargePct / 100) + 1;\n basePrice = basePrice * factor;\n }\n\n return _.round(basePrice, 2);\n }\n\n function gtDiscountLineStr(promotionName, discountPct) {\n return $translate.instant('TXT_LBL_DISCOUNT_PCT') + ' - {0} ({1} %)'.f(promotionName, $filter('number')(discountPct, 2));\n }\n\n function calculateAmortizationSchedules(\n price,\n invoiceDate,\n amortizationScheduleTemplate) \n {\n let amortizationSchedules = [];\n let remainingAmount = price;\n let rollUpAmount = 0;\n \n let byIssueDateOrder = _.map(_.sortBy(_.map(amortizationScheduleTemplate, (x) => { return {\n actualIssueDate: x.issueAt != null\n ? moment(x.issueAt).startOf('day').toDate()\n : moment(invoiceDate).add(x.issueDaysAfterRegistration, 'days').startOf('day').toDate(),\n item: x\n }}), ['actualIssueDate']), (x) => x.item);\n \n for (let idx = 0; idx < byIssueDateOrder.length; idx++) {\n let isLast = (idx + 1) === byIssueDateOrder.length;\n let amortizationTemplateItem = byIssueDateOrder[idx];\n\n let amortizationPartAmount = amortizationTemplateItem.amount != null\n ? Math.min(amortizationTemplateItem.amount, remainingAmount)\n : Math.min(price * (amortizationTemplateItem.percentageAmount / 100), remainingAmount);\n\n if (isLast) {\n amortizationPartAmount = remainingAmount;\n }\n\n if (amortizationPartAmount <= 0) {\n break;\n }\n\n let issueAt = amortizationTemplateItem.issueAt != null\n ? moment(amortizationTemplateItem.issueAt).startOf('day').toDate()\n : moment(invoiceDate).add(amortizationTemplateItem.issueDaysAfterRegistration, 'days').startOf('day').toDate();\n\n if (moment(issueAt).isBefore(moment(invoiceDate).startOf('day'))) {\n rollUpAmount += amortizationPartAmount;\n continue;\n }\n\n let existingAmortizationScheduleIndex =_.findIndex(amortizationSchedules, (n) => moment(n.issueAt).isSame(issueAt));\n if (existingAmortizationScheduleIndex !== -1) {\n let existingAmortizationScheduleAmount =\n amortizationSchedules[existingAmortizationScheduleIndex].amount;\n let amortizationSchedule = {\n issueAt: issueAt,\n dueDate: moment(issueAt).add(15, 'days').toDate(),\n amount: Math.min(amortizationPartAmount + rollUpAmount, remainingAmount) + existingAmortizationScheduleAmount\n }\n amortizationSchedules.splice(existingAmortizationScheduleIndex, 1);\n amortizationSchedules.push(amortizationSchedule);\n rollUpAmount = 0;\n remainingAmount -= amortizationSchedule.amount - existingAmortizationScheduleAmount;\n }\n else\n {\n let amortizationSchedule = {\n issueAt: issueAt,\n dueDate: moment(issueAt).add(15, 'days').toDate(),\n amount: Math.min(amortizationPartAmount + rollUpAmount, remainingAmount)\n }\n amortizationSchedules.push(amortizationSchedule);\n rollUpAmount = 0;\n remainingAmount -= amortizationSchedule.amount;\n }\n } \n \n if (amortizationSchedules.length > 0) {\n // Check the sum\n // This can happen if there are some schedules with conflicting issue dates\n let sum = _.reduce(amortizationSchedules, function (sum, n) { return sum += n.amount }, 0);\n let diff = price - sum;\n if (diff > 0) {\n _.last(amortizationSchedules).amount += diff;\n }\n }\n\n return amortizationSchedules;\n }\n\n return {\n getPriceDetails: getPriceDetails,\n getCourseBasePrice: getCourseBasePrice,\n getCourseFeeLineName: getCourseFeeLineName,\n gtDiscountLineStr: gtDiscountLineStr,\n calculateAmortizationSchedules: calculateAmortizationSchedules\n }\n }]);","wbApp.factory('courseRegistrationSvc', ['$resource', '$q', '$translate', '$filter', 'notificationSvc', 'repositorySvc', 'courseScheduleSvc', 'invoiceSvc', 'promotionSvc', 'attendanceSvc', 'coursePriceSvc', 'courseSvc',\n function ($resource, $q, $translate, $filter, notificationSvc, repositorySvc, courseScheduleSvc, invoiceSvc, promotionSvc, attendanceSvc, coursePriceSvc, courseSvc) {\n\n var CourseRegistrations = $resource('/Api/CourseRegistrations/Get', {}, {\n 'getAllForCourse': { method: 'GET', isArray: true, url: '/Api/CourseRegistrations/Get' },\n 'getAllForCourseAndUser': { method: 'GET', isArray: true, url: '/Api/CourseRegistrations/GetAllByCourseAndUser' },\n 'getAllCoursesByStudent': { method: 'GET', isArray: true, url: '/Api/CourseRegistrations/GetAllCoursesByStudent' },\n 'getAllActionsByStudent': { method: 'GET', isArray: true, url: '/Api/CourseRegistrations/GetAllActionsByStudent' },\n 'getAllCoursesByUser': { method: 'GET', isArray: true, url: '/Api/CourseRegistrations/GetAllCoursesByUser' },\n 'getAllActionsByUser': { method: 'GET', isArray: true, url: '/Api/CourseRegistrations/getAllActionsByUser' },\n 'getInfoFromCourseRegistrationBarcode': { method: 'GET', isArray: false, url: '/Api/CourseRegistrations/GetInfoFromCourseRegistrationBarcode'},\n 'sendRegistrationNotification': { method: 'POST', url: '/Api/CourseRegistrations/SendRegistrationNotification' },\n 'createFullCourseInterest': { method: 'POST', url: '/restapi/course-registrations/full-course-interest' },\n 'update': { method: 'POST', url: '/Api/CourseRegistrations/Update' },\n 'insert': { method: 'POST', url: '/Api/CourseRegistrations/Insert' },\n 'insertAll': { method: 'POST', url: '/Api/CourseRegistrations/InsertAll' },\n 'delete': { method: 'POST', url: '/Api/CourseRegistrations/Delete' },\n 'calcExpectedDueDate': { method: 'POST', url: '/Api/CourseRegistrations/CalcExpectedDueDate' },\n 'getCourseInterestById': { method: 'GET', isArray: false, url: '/restapi/course-interests/:id'},\n });\n\n function getCourseInterestById(id) {\n return repositorySvc.customGet('getCourseInterestById', CourseRegistrations, { id: id });\n }\n\n function createNew(course, isAction, doNotPreselect) {\n var newReg = new webooker_courses_models.CourseRegistration({});\n return newReg.preInitNew($q, courseScheduleSvc, course, isAction, doNotPreselect);\n }\n\n function initializeModel(model, course, isAction, isAdmin, doNotPreselect) {\n return model.initialize($q, invoiceSvc, promotionSvc, attendanceSvc, coursePriceSvc,\n course, isAction, isAdmin, doNotPreselect);\n }\n\n // Appends user schedule model to list of course registrations, used for free places calculations\n // for the whole user\n // Returns promise \n function appendScheduleModel(\n courseRegistrations, /* array of course registrations enriched by extendModelWithDetails */\n courseID,\n refresh /* reload schedules */) {\n return $q(function (resolve, reject) {\n var userSchedules = [];\n\n // all attendance objects from each courseRegistration in courseRegistrations array\n var allAttendanceArray = [];\n _.forEach(courseRegistrations, function (cr) {\n allAttendanceArray.push.apply(allAttendanceArray, cr.registeredAttendance);\n });\n var allAttendanceMap = _.groupBy(allAttendanceArray, 'courseScheduleID');\n\n courseScheduleSvc.getAllAsync(courseID, refresh).$promise.then(\n function (schedules) {\n _.forEach(schedules, function (schedule) {\n var userSchedule = new webooker_courses_models.CourseRegistrationUserSchedule(schedule);\n\n var attendance = allAttendanceMap[schedule.courseScheduleID];\n userSchedule.addCourseRegistrationAttendance.call(userSchedule, attendance || []);\n\n userSchedules.push(userSchedule);\n });\n resolve(userSchedules);\n }, reject);\n });\n }\n\n function refreshSchedules(\n courseRegistrations, /* array of course registrations enriched by extendModelWithDetails */\n courseID) {\n\n return $q(function (resolve, reject) {\n\n courseScheduleSvc.getAllAsync(courseID, true).$promise.then(\n function (schedules) {\n\n _.forEach(courseRegistrations, function (courseRegistration) {\n courseRegistration.updateCapacityByRefreshedSchedules.call(courseRegistration, schedules);\n });\n\n resolve(courseRegistrations);\n }, reject);\n });\n }\n\n function updateReservedPlaces(model, reservedPlaces) {\n angular.forEach(model.registeredAttendance, function (ra) {\n ra.attendanceCount = reservedPlaces;\n });\n }\n\n function extendRegistrations(data, result) {\n angular.forEach(data, function (registration) {\n\n var futureAttendance = _.filter(registration.registeredAttendance, function (o) {\n return moment().isBefore(o.startDate);\n });\n\n registration.noFurtherRegisteredAttendance =\n _.every(futureAttendance, { courseAttendanceType: null }) && futureAttendance.length > 0;\n\n if (registration.registeredAttendance && registration.registeredAttendance.length === 1) {\n registration.attendanceStatusText = $filter('attendanceStatus')(registration.registeredAttendance[0].courseAttendanceStatus);\n\n registration.attendanceStatusNotPresent = !!registration.registeredAttendance[0].courseAttendanceStatus;\n } else {\n registration.attendanceStatusText = \"\";\n registration.attendanceStatusNotPresent = true;\n }\n\n result.push(registration);\n });\n }\n\n // Client\n function getAllForCourseAndUser(userID, course, students, isAction, includeInterestsAsVirtual, doNotPreselect) {\n var deferred = $q.defer();\n var result = [];\n\n repositorySvc.customGet('getAllForCourseAndUser', CourseRegistrations, {\n courseID: course.courseID,\n userID: userID,\n includeInterestsAsVirtual: includeInterestsAsVirtual\n }).$promise.then(function (data) {\n var newRegPromises = [];\n\n angular.forEach(students, function (student) { \n if (!_.find(data, { studentID: student.id })) {\n var reg = createNew(course, isAction, doNotPreselect);\n reg.then(function (st) {\n st.studentID = student.id;\n st.parentID = student.userID;\n st.studentFullName = student.fullName;\n st.studentAge = student.age;\n st.studentBirthday = student.birthday;\n });\n newRegPromises.push(reg);\n } \n });\n\n var resPromisses = [];\n\n if (newRegPromises.length) {\n $q.all(newRegPromises).then(function (newRegPromisesResolved) {\n \n _.forEach(newRegPromisesResolved, function (newReg) {\n var newRegModel = new webooker_courses_models.CourseRegistration(newReg);\n\n resPromisses.push(newRegModel.initialize.call(newRegModel, $q, invoiceSvc, promotionSvc, attendanceSvc, coursePriceSvc, \n course, isAction, false, doNotPreselect));\n });\n \n _.forEach(data, function (registration) {\n var regModel = new webooker_courses_models.CourseRegistration(registration);\n\n resPromisses.push(regModel.initialize.call(regModel, $q, invoiceSvc, promotionSvc, attendanceSvc, coursePriceSvc,\n course, isAction, false, doNotPreselect));\n });\n \n $q.all(resPromisses).then(function (r) { \n if (course.allowClientLessonSelection) {\n appendScheduleModel(r, course.courseID, false).then(function () {\n extendRegistrations(_.sortBy(r, 'studentFullName'), result);\n deferred.resolve(result);\n }, function (errorResult) { deferred.reject(errorResult); });\n } else {\n extendRegistrations(_.sortBy(r, 'studentFullName'), result);\n deferred.resolve(result);\n }\n });\n });\n } else {\n _.forEach(data, function (registration) {\n var regModel = new webooker_courses_models.CourseRegistration(registration);\n\n resPromisses.push(regModel.initialize.call(regModel, $q, invoiceSvc, promotionSvc, attendanceSvc, coursePriceSvc,\n course, isAction, false, doNotPreselect));\n });\n\n $q.all(resPromisses).then(function (r) {\n\n if (course.allowClientLessonSelection) {\n appendScheduleModel(r, course.courseID, false).then(function () {\n extendRegistrations(_.sortBy(r, 'studentFullName'), result);\n deferred.resolve(result);\n }, function (errorResult) { deferred.reject(errorResult); });\n } else {\n extendRegistrations(_.sortBy(r, 'studentFullName'), result);\n deferred.resolve(result);\n }\n });\n }\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n result.$promise = deferred.promise;\n return result;\n }\n\n function getAllForCourse(courseID) {\n var deferred = $q.defer();\n var result = [];\n\n repositorySvc.customGet('getAllForCourse', CourseRegistrations, {\n courseID: courseID\n }).$promise.then(function (data) {\n extendRegistrations(data, result);\n deferred.resolve(result);\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n result.$promise = deferred.promise;\n return result;\n }\n\n function getAllCoursesByStudent(studentID) {\n return repositorySvc.customGet('getAllCoursesByStudent', CourseRegistrations, {\n studentID: studentID\n });\n }\n\n function getAllActionsByStudent(studentID) {\n return repositorySvc.customGet('getAllActionsByStudent', CourseRegistrations, {\n studentID: studentID\n });\n }\n\n function getAllCoursesByUser(userID) {\n return repositorySvc.customGet('getAllCoursesByUser', CourseRegistrations, {\n userID: userID\n });\n }\n\n function getAllActionsByUser(userID) {\n return repositorySvc.customGet('getAllActionsByUser', CourseRegistrations, {\n userID: userID\n });\n }\n \n function getInfoFromCourseRegistrationBarcode(code) {\n return repositorySvc.customGet('getInfoFromCourseRegistrationBarcode', CourseRegistrations, {\n courseRegistrationCode: code\n });\n } \n\n\n function getRegisteredAttendanceForCourse(courseID) {\n var registrations = getAllForCourse(courseID);\n var deferred = $q.defer();\n var result = [];\n\n registrations.$promise.then(function (data) {\n angular.forEach(data, function (registration) {\n result.push({\n studentID: registration.studentID,\n fullName: registration.studentFullName,\n attendanceStatus: 0,\n attendanceType: 0,\n attendanceCount: 1\n });\n });\n deferred.resolve(result);\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n result.$promise = deferred.promise;\n return result;\n }\n\n function sendRegistrationNotification(courseRegistrationID) {\n return $q(function (resolve, reject) {\n CourseRegistrations.sendRegistrationNotification(\n { courseRegistrationID: courseRegistrationID },\n function (successResult) {\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_NOTIFICATION_SENT'));\n resolve(successResult);\n }, function (errorResult) {\n repositorySvc.defaultErrorHandler(errorResult);\n reject(errorResult);\n });\n });\n }\n\n function insertAll(data, courseID, notificationSetting, subjectCategory, successCallback, errorCallback) {\n repositorySvc.customPost(\n \"insertAll\",\n CourseRegistrations,\n {\n models: {\n model: data,\n courseID: courseID\n },\n subjectCategory: subjectCategory,\n sendEmailNotification: notificationSetting.sendEmailNotification,\n sendSmsNotification: notificationSetting.sendSmsNotification\n }, // entity\n successCallback,\n function (errorResult) {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_CHANGES_SAVE_ERROR'),\n notificationSvc.translateError(errorResult));\n\n if (errorCallback) {\n errorCallback(errorResult);\n }\n });\n }\n\n function createFullCourseInterest(students, course, classroom) {\n return $q(function (resolve, reject) {\n var promisses = [];\n\n _.forEach(students, function (student) {\n var request = {\n userId: student.parentID,\n studentId: student.studentID,\n courseId: course.courseID,\n semesterId: course.semesterID,\n subjectId: course.subjectID,\n classroomId: course.classroomID,\n teacherId: course.employeeID,\n courseName: course.name,\n courseAbbreviation: course.abbreviation,\n courseFullName: courseSvc.getCourseFullName(course),\n courseStartDate: course.firstLesson,\n courseEndDate: course.lastLesson,\n subjectName: course.subjectName,\n classroomName: classroom.name,\n teacherFullName: course.teacher,\n notes: student.notes,\n }\n\n promisses.push(repositorySvc.customPost(\n 'createFullCourseInterest',\n CourseRegistrations,\n request,\n null,\n null,\n true).$promise);\n });\n\n $q.all(promisses).then(resolve, reject);\n });\n }\n\n function insert(data, notificationSetting, subjectCategory, successCallback, errorCallback) {\n repositorySvc.insert(\n CourseRegistrations, // $resource\n null, // collection\n {\n model: data,\n subjectCategory: subjectCategory,\n sendEmailNotification: notificationSetting.sendEmailNotification,\n sendSmsNotification: notificationSetting.sendSmsNotification\n }, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, notificationSetting, subjectCategory, updateInvoice, successCallback, errorCallback) {\n repositorySvc.update(\n CourseRegistrations, // $resource\n null, // collection\n {\n model: data,\n subjectCategory: subjectCategory,\n updateInvoice: updateInvoice || false,\n sendEmailNotification: notificationSetting.sendEmailNotification,\n sendSmsNotification: notificationSetting.sendSmsNotification\n }, // entity\n successCallback,\n errorCallback);\n }\n\n function remove(data, subjectCategory, successCallback, errorCallback) {\n repositorySvc.remove(\n CourseRegistrations, // $resource\n null, // collection\n {\n courseRegistrationID: data.courseRegistrationID,\n subjectCategory: subjectCategory\n }, // entity\n successCallback,\n errorCallback,\n {\n courseRegistrationID: data.courseRegistrationID,\n subjectCategory: subjectCategory\n });\n }\n \n function calcExpectedDueDate(courseId, registrationDate) {\n return repositorySvc.customPost(\n 'calcExpectedDueDate',\n CourseRegistrations,\n { courseId: courseId, issueDate: registrationDate },\n null,\n null,\n true);\n }\n\n return {\n getAllForCourse: getAllForCourse,\n getAllForCourseAndUser: getAllForCourseAndUser,\n getRegisteredAttendanceForCourse: getRegisteredAttendanceForCourse,\n getAllCoursesByStudent: getAllCoursesByStudent,\n getAllActionsByStudent: getAllActionsByStudent,\n getAllCoursesByUser: getAllCoursesByUser,\n getAllActionsByUser: getAllActionsByUser,\n getInfoFromCourseRegistrationBarcode: getInfoFromCourseRegistrationBarcode,\n sendRegistrationNotification: sendRegistrationNotification,\n createNew: createNew,\n initializeModel: initializeModel,\n insert: insert,\n insertAll: insertAll,\n update: update,\n remove: remove,\n updateReservedPlaces: updateReservedPlaces,\n refreshSchedules: refreshSchedules,\n createFullCourseInterest: createFullCourseInterest,\n calcExpectedDueDate: calcExpectedDueDate,\n getCourseInterestById: getCourseInterestById\n }\n }\n]);\n","'use strict';\n\nwbApp.factory('courseScheduleSvc', ['$resource', '$cacheFactory', 'repositorySvc', 'semesterSvc', '$q',\n function ($resource, $cacheFactory, repositorySvc, semesterSvc, $q) {\n\n var CourseSchedule = $resource('/Api/CourseSchedule/Get/:id', {}, {\n 'query': { method: 'GET', isArray: true },\n 'update': { method: 'POST', url: '/Api/CourseSchedule/Update' },\n 'insert': { method: 'POST', url: '/Api/CourseSchedule/Insert' },\n 'delete': { method: 'POST', url: '/Api/CourseSchedule/Delete' },\n 'getSingle' : { method: 'GET', url: '/Api/CourseSchedule/GetSingle' },\n 'getPattern': { method: 'GET', url: '/Api/CourseSchedule/GetPatternByOccurence' },\n 'getAllForSemester': { method: 'GET', isArray: true, url: '/Api/UserSchedule/GetAllForSemester' },\n 'getAllForSemesterAll': { method: 'GET', isArray: true, url: '/Api/UserSchedule/GetAllForSemesterAll' },\n 'getAllForCurrentUserAndCourse': { method: 'GET', isArray: true, url: '/Api/UserSchedule/GetAllForCurrentUserAndCourse' },\n 'expandRecurrencePattern': { method: 'POST', isArray: true, url: '/Api/CourseSchedule/ExpandRecurrencePattern' },\n\n });\n\n var cache = $cacheFactory('courseScheduleSvcCache');\n var cachedCourseID = 0;\n var cachedIncludeDeleted = false;\n\n function expandRecurrencePattern(model) {\n return repositorySvc.customPost(\n 'expandRecurrencePattern',\n CourseSchedule,\n model,\n null,\n null,\n true);\n }\n\n function getAllSortedAsync(courseID, refresh, includeDeleted) {\n let res = [];\n res.$promise = $q(function (resolve, reject) {\n getAllAsync(courseID, refresh, includeDeleted).$promise.then(function (schedules) {\n res.push.apply(res, _.sortBy(schedules, 'startDate'));\n resolve(res);\n }, function (rejectReason) {\n reject(rejectReason);\n });\n });\n \n return res;\n }\n \n function getAllAsync(courseID, refresh, includeDeleted) {\n if (!courseID) {\n return null;\n }\n\n var models = cache.get('schedules');\n\n if (cachedCourseID !== courseID || !models || refresh || (cachedIncludeDeleted !== !!includeDeleted)) {\n models = repositorySvc.get(CourseSchedule, { courseID: courseID, includeDeletes: !!includeDeleted });\n cache.put('schedules', models);\n cachedCourseID = courseID;\n cachedIncludeDeleted = !!includeDeleted;\n }\n\n return models;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n CourseSchedule, // $resource\n cache.get('schedules'), // collection\n {\n model: data\n }, // entity\n successCallback,\n errorCallback,\n 'courseScheduleID');\n }\n\n function update(data, notificationSetting, successCallback, errorCallback) {\n repositorySvc.update(\n CourseSchedule, // $resource\n cache.get('schedules'), // collection\n {\n model: data,\n sendEmailNotification: notificationSetting.sendEmailNotification,\n sendSmsNotification: notificationSetting.sendSmsNotification\n }, // entity\n successCallback,\n errorCallback,\n 'courseScheduleID');\n }\n\n function remove(data, notificationSetting, successCallback, errorCallback) {\n repositorySvc.remove(\n CourseSchedule, // $resource\n cache.get('schedules'), // collection\n { courseScheduleID: data.courseScheduleID }, // entity\n successCallback,\n errorCallback,\n {\n courseScheduleID: data.courseScheduleID,\n sendEmailNotification: notificationSetting.sendEmailNotification,\n sendSmsNotification: notificationSetting.sendSmsNotification\n },\n 'courseScheduleID');\n }\n\n function getPattern(courseID, courseScheduleID) {\n return repositorySvc.customGet('getPattern', CourseSchedule, {\n courseID: courseID,\n courseScheduleID: courseScheduleID\n });\n }\n\n function getSingle(courseScheduleID) {\n return repositorySvc.customGet('getSingle', CourseSchedule, { \n courseScheduleID: courseScheduleID\n });\n }\n\n function getAllForSemesterAsync(semesterID, compensationGroupID, userID, startDate, endDate) {\n return repositorySvc.customGet('getAllForSemester', CourseSchedule, {\n semesterID: semesterID,\n compensationGroupID: compensationGroupID,\n userID: userID,\n startDate: startDate,\n endDate: endDate\n });\n }\n\n function getAllForSemesterAllAsync(semesterID, compensationGroupID, userID, startDate, endDate) {\n return repositorySvc.customGet('getAllForSemesterAll', CourseSchedule, {\n semesterID: semesterID,\n compensationGroupID: compensationGroupID,\n userID: userID,\n startDate: startDate,\n endDate: endDate\n });\n }\n\n function getAllForCurrentUserAndCourse(courseID) {\n return repositorySvc.customGet('getAllForCurrentUserAndCourse', CourseSchedule, {\n courseID: courseID\n });\n }\n\n function updateEventByStartDate(event, startDate) {\n if (event.recurrenceInfo) {\n event.recurrenceInfo.start = startDate;\n event.recurrenceInfo.weekDays = weekDaysFromDate(startDate);\n };\n }\n\n function weekDaysFromDate(date) {\n var dayNumber = moment(date).day();\n\n if (!dayNumber) {\n return 1;\n }\n\n return (1 << dayNumber);\n }\n\n function createNew(courseModel, isNewRecurrence, callback) {\n\n var mStartDate = courseModel.firstLesson\n ? moment().startOf('day')\n .add(moment(courseModel.firstLesson).hour(), 'h')\n .add(moment(courseModel.firstLesson).minute(), 'm')\n : moment().startOf('hour');\n\n var mEndDate = courseModel.lessonLengthInMinutes\n ? moment(mStartDate).add(courseModel.lessonLengthInMinutes, 'm')\n : moment(mStartDate).add(60, 'm');\n\n var newEvent = {\n semesterID: courseModel.semesterID,\n courseID: courseModel.courseID,\n employeeID: courseModel.employeeID,\n classroomID: courseModel.classroomID || undefined,\n capacity: courseModel.capacity,\n startDate: mStartDate.toDate(),\n endDate: mEndDate.toDate(),\n subjectCategoryID: courseModel.subjectCategoryID,\n recurrenceType: !!isNewRecurrence ? 1 : 0\n }\n\n if (!!isNewRecurrence) {\n newEvent.recurrenceInfo = {\n type: 1,\n periodicity: 1,\n weekDays: weekDaysFromDate(mStartDate.toDate()),\n occurrenceCount: 10,\n start: mStartDate.toDate(), \n range: 1\n };\n newEvent.recurrenceId = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n\n semesterSvc.getDefaultAsync().then(function (sem) {\n newEvent.recurrenceInfo.end = sem.endDate;\n if (!!callback) {\n callback(newEvent);\n }\n });\n }\n\n return newEvent;\n }\n\n function createNewEvent(\n startDate,\n endDate,\n classroomID,\n semesterID) {\n\n var newEvent = {\n subjectCategoryID: 2,\n startDate: startDate,\n endDate: endDate,\n classroomID: classroomID,\n semesterID: semesterID,\n employeeID: 0,\n courseID: 0,\n };\n\n return newEvent;\n }\n\n function createNewCourse(\n startDate,\n endDate,\n classroomID,\n semesterID,\n isNewRecurrence) {\n\n var newEvent = {\n subjectCategoryID: 1,\n startDate: startDate,\n endDate: endDate,\n classroomID: classroomID,\n semesterID: semesterID,\n employeeID: 0,\n courseID: 0,\n recurrenceType: !!isNewRecurrence ? 1 : 0\n };\n\n if (!!isNewRecurrence) {\n newEvent.recurrenceInfo = {\n type: 1,\n periodicity: 1,\n weekDays: weekDaysFromDate(startDate),\n occurrenceCount: 10,\n start: startDate,\n range: 1\n };\n newEvent.recurrenceId = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n return newEvent;\n }\n\n return {\n getAllAsync: getAllAsync,\n insert: insert,\n update: update,\n remove: remove,\n createNew: createNew,\n createNewEvent: createNewEvent,\n createNewCourse: createNewCourse,\n getPattern: getPattern,\n getSingle: getSingle,\n getAllForSemesterAsync: getAllForSemesterAsync,\n getAllForSemesterAllAsync: getAllForSemesterAllAsync,\n updateEventByStartDate: updateEventByStartDate,\n getAllForCurrentUserAndCourse: getAllForCurrentUserAndCourse,\n expandRecurrencePattern: expandRecurrencePattern,\n getAllSortedAsync: getAllSortedAsync\n }\n }\n]);","wbApp.factory('courseSvc', ['$resource', '$q', 'repositorySvc', 'gridSortSvc',\n 'accountingBookSvc', 'compensationGroupSvc', 'surveySvc',\n function ($resource, $q, repositorySvc, gridSortSvc, accountingBookSvc, compensationGroupSvc, surveySvc) {\n\n var Course = $resource('/Api/Courses/Get', {}, {\n 'query': { method: 'GET', isArray: true },\n 'getByCourseID': { method: 'GET', isArray: false, url: '/Api/Courses/GetByCourseID' },\n 'update': { method: 'POST', url: '/Api/Courses/Update' },\n 'insert': { method: 'POST', url: '/Api/Courses/Insert' },\n 'delete': { method: 'POST', url: '/Api/Courses/Delete' },\n 'getFranchiseCourses': { method: 'GET', isArray: true, url: '/Api/Courses/GetFranchiseCourses' },\n 'courseCopySave': { method: 'POST', url: '/Api/Courses/CourseCopy' },\n });\n\n var courses = null;\n var semesterId = null;\n var actions = null;\n var semesterIdActions = null;\n\n function courseCopySave(model, success, error) {\n return repositorySvc.customPost(\n 'courseCopySave',\n Course,\n model,\n success,\n error);\n }\n\n function getFranchiseCourses() {\n var deferred = $q.defer();\n\n var courses = [];\n courses.$promise = deferred.promise;\n\n repositorySvc.customGet('getFranchiseCourses', Course, {}).$promise.then(\n function (data) {\n courses.push.apply(courses, data);\n deferred.resolve(courses);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return courses;\n }\n\n function insert(data, collection, successCallback, errorCallback) {\n\n function addToCollection(data) {\n return data.subjectCategoryID == 2\n ? data.semesterID == semesterIdActions\n : data.semesterID == semesterId;\n }\n\n repositorySvc.insert(\n Course, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback,\n addToCollection);\n }\n\n function update(data, collection, successCallback, errorCallback) {\n repositorySvc.update(\n Course, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'courseID');\n }\n\n function remove(data, collection, successCallback, errorCallback) {\n repositorySvc.remove(\n Course, // $resource\n collection, // collection\n data, // entity\n successCallback, // successCallback\n errorCallback,\n null,\n 'courseID');\n }\n\n\n function getByCourseID(courseID) {\n return repositorySvc.customGet('getByCourseID', Course, {\n courseID: courseID\n });\n }\n\n function getAllAsync(sId, reload) {\n if (semesterId !== sId || !courses || reload) {\n courses = repositorySvc.get(Course, { semesterID: sId, isAction: false, openForRegistrationOnly: false });\n semesterId = sId;\n }\n\n return courses;\n }\n\n function getAllActionsAsync(sId, reload) {\n if (semesterIdActions !== sId || !actions || reload) {\n actions = repositorySvc.get(Course, { semesterID: sId, isAction: true, openForRegistrationOnly: false });\n semesterIdActions = sId;\n }\n\n return actions;\n }\n\n function getActionAsync(sId, courseID, refresh) {\n var deferred = $q.defer(); \n\n getAllActionsAsync(sId, refresh).$promise.then(function (data) {\n deferred.resolve(_.find(data, { courseID: courseID }));\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return deferred.promise;\n }\n\n function getCourseAsync(sId, courseID, refresh) {\n var deferred = $q.defer();\n\n getAllAsync(sId, refresh).$promise.then(function (data) {\n deferred.resolve(_.find(data, { courseID: courseID }));\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return deferred.promise;\n }\n\n function refreshCourseRecord(sId, courseID, collection, success, isAction) {\n var newCourses = repositorySvc.get(Course, { semesterID: sId, isAction: isAction || false, openForRegistrationOnly: false });\n newCourses.$promise.then(function (data) {\n var newRecord = _.find(data, { courseID: courseID });\n var currentRecord = _.find(collection, { courseID: courseID });\n\n if (newRecord && currentRecord) {\n angular.extend(currentRecord, newRecord);\n }\n\n if (success) {\n success();\n }\n });\n }\n\n function refreshActionRecord(sId, courseID, collection, success) {\n return refreshCourseRecord(sId, courseID, collection, success, true);\n }\n\n function getCourseFullName(course) {\n if (!course) {\n return \"\";\n }\n\n var ret = course.subjectName;\n if (!!course.abbreviation) {\n ret += \" (\" + course.abbreviation + \")\";\n }\n\n if (!!course.name) {\n ret += \" - \" + course.name;\n }\n\n return ret;\n }\n\n function get(sId, id) {\n if (courses && semesterId == sId) {\n for (var i = 0; i < courses.length; i++) {\n var sc = courses[i];\n if (sc.courseID === id) {\n return sc;\n }\n }\n }\n return null;\n }\n\n function getAction(sId, id) {\n if (actions && semesterIdActions == sId) {\n for (var i = 0; i < actions.length; i++) {\n var sc = actions[i];\n if (sc.courseID === id) {\n return sc;\n }\n }\n }\n return null;\n }\n\n\n function breakFranchiseCoursesByAddress(courses) {\n var addressGroups = _.groupBy(courses, function (course) {\n return '_' + course.classroomLocation.longitude + '_' + course.classroomLocation.latitude;\n });\n\n\n var grouping = [];\n for (var property in addressGroups) {\n var locations = addressGroups[property];\n var first = _.head(locations);\n grouping.push({\n id: first.classroomID,\n location: {\n latitude: first.classroomLocation.latitude,\n longitude: first.classroomLocation.longitude\n },\n courses: locations\n });\n }\n\n return grouping;\n }\n\n function enhanceFranchiseCoursesAndsort(courses, tenantInfo) {\n\n courses = _.map(courses, function (course) {\n var tenant = _.find(tenantInfo.franchises, { tenantID: course.tenantID });\n var franchiseLevel = _.find(tenantInfo.franchiseLevels, { franchiseLevelID: tenant.franchiseLevelID });\n\n if (tenant.name) {\n course.tenantFriendlyName = tenant.name;\n }\n\n course.placeName = franchiseLevel.level === 0\n ? course.tenantFriendlyName\n : course.address.city;\n\n course.franchiseLevel = franchiseLevel;\n\n return course;\n });\n\n var courses2 = [];\n\n var groups = _.groupBy(courses, function (course) {\n return course.placeName + '-' + course.franchiseSubjectID;\n });\n\n for (var key in groups) {\n var group = groups[key];\n\n if (group.length > 1) {\n courses2.push({\n tenantFriendlyName: group[0].tenantFriendlyName,\n franchiseSubjectID: group[0].franchiseSubjectID,\n classroomLocation: group[0].classroomLocation,\n tenantID: group[0].tenantID,\n address: group[0].address,\n classroomID: group[0].classroomID,\n\n placeName: group[0].placeName,\n subjectName: group[0].subjectName,\n courseName: null,//'(' + group.length + ')',\n teacherSurname: null,\n firstLessonStartDate: null,\n courseUrl: null,\n tenantAlias: group[0].tenantAlias,\n courseID: group[0].courseID,\n courses: group,\n isGroupRow: true,\n franchiseLevel: group[0].franchiseLevel\n });\n } else {\n courses2.push({\n tenantFriendlyName: group[0].tenantFriendlyName,\n franchiseSubjectID: group[0].franchiseSubjectID,\n classroomLocation: group[0].classroomLocation,\n tenantID: group[0].tenantID,\n address: group[0].address,\n classroomID: group[0].classroomID,\n\n placeName: group[0].placeName,\n subjectName: group[0].subjectName,\n courseName: group[0].courseName,\n teacherSurname: group[0].teacherSurname,\n firstLessonStartDate: group[0].firstLessonStartDate,\n courseUrl: group[0].courseUrl,\n tenantAlias: group[0].tenantAlias,\n courseID: group[0].courseID,\n courses: group,\n isGroupRow: false,\n franchiseLevel: group[0].franchiseLevel\n });\n }\n }\n\n courses = _.map(courses2, function (course) {\n if (course.courses.length > 1) {\n course.courseUrl = '==group==';\n } else {\n course.courseUrl = \"https://\" + course.tenantAlias + tenantInfo.domain + \"/Courses/Register/\" + course.courseID;\n }\n angular.forEach(course.courses, function (c) {\n c.courseUrl = \"https://\" + c.tenantAlias + tenantInfo.domain + \"/Courses/Register/\" + c.courseID;\n c.placeName = c.franchiseLevel.level === 0\n ? c.tenantFriendlyName\n : c.address.city;\n });\n return course;\n });\n\n var ret = _.sortBy(courses,[\n function (n) {\n return n.franchiseLevel.level;\n },\n function (n) {\n if (n.franchiseLevel.level === 0) {\n return gridSortSvc.locale(n.tenantFriendlyName);\n } else {\n return gridSortSvc.locale(n.address.city);\n }\n }, function (n) {\n var startDate = moment(n.firstLessonStartDate);\n return moment('2000-1-1')\n .add(startDate.day(), 'day')\n .add(startDate.hour(), 'hour')\n .add(startDate.minute(), 'minute');\n }]);\n\n return ret;\n }\n\n function createNew(semesterID, isAction) {\n\n var dfAccountingBookPromise = accountingBookSvc.getDefaultAsync();\n var dfCompensationGroupPromise = compensationGroupSvc.getDefaultAsync();\n var dfSurveyPromise = surveySvc.getDefaultAsync();\n\n var deferred = $q.defer();\n\n var model = {\n semesterID: semesterID,\n showInSchedule: true,\n allowRegistration: true,\n showInEmployeeTimeSheet: true,\n emailCategory: 1,\n lessonLengthInMinutes: 45,\n courseCategoryID: 1,\n courseAgeRangeID: 1,\n subjectCategoryID: isAction ? 2 : 1,\n amortizationSchedules: []\n };\n\n if (!!isAction) {\n model.picture = \"Generic/0/children01.png\";\n }\n\n $q.all([dfAccountingBookPromise, dfCompensationGroupPromise, dfSurveyPromise]).then(function (data) {\n if (!!data[0]) {\n model.accountingBookID = data[0].id;\n }\n if (!!data[1]) {\n model.compensationGroupID = data[1].id;\n }\n if (!!data[2]) {\n model.surveyID = data[2].surveyID;\n }\n });\n\n model.$promise = deferred.promise;\n\n return model;\n }\n\n return {\n getAllAsync: getAllAsync,\n getAllActionsAsync: getAllActionsAsync,\n getCourseFullName: getCourseFullName,\n get: get,\n getByCourseID: getByCourseID,\n getAction: getAction,\n getFranchiseCourses: getFranchiseCourses,\n breakFranchiseCoursesByAddress: breakFranchiseCoursesByAddress,\n enhanceFranchiseCoursesAndsort: enhanceFranchiseCoursesAndsort,\n insert: insert,\n update: update,\n remove: remove,\n createNew: createNew,\n refreshActionRecord: refreshActionRecord,\n refreshCourseRecord: refreshCourseRecord,\n getActionAsync: getActionAsync,\n getCourseAsync: getCourseAsync,\n courseCopySave: courseCopySave\n }\n }\n]);","'use strict';\n\nwbApp.factory('courseTypeSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var CourseTypes = $resource('/Api/CourseTypes/:id', {}, {\n 'getLookup': { method: 'GET', isArray: true, url: '/Api/CourseTypes/GetLookup' },\n 'getAll': { method: 'GET', isArray: true, url: '/Api/CourseTypes/GetAll' },\n 'update': { method: 'POST', url: '/Api/CourseTypes/Update' },\n 'insert': { method: 'POST', url: '/Api/CourseTypes/Insert' },\n 'delete': { method: 'POST', url: '/Api/CourseTypes/Delete' }\n });\n\n var courseTypes, courseTypesBriefs;\n\n function createNew() {\n return {};\n }\n\n function getAllAsync(reload) {\n if (!courseTypes || reload) {\n courseTypes = repositorySvc.customGet('getAll', CourseTypes);\n }\n\n return courseTypes;\n }\n\n function getAllForLookup(reload) {\n if (!courseTypesBriefs || reload) {\n courseTypesBriefs = repositorySvc.customGet('getLookup', CourseTypes);\n }\n\n return courseTypesBriefs;\n }\n\n function getByIdAsync(id) {\n return $q(function (resolve, reject) {\n getAllAsync().$promise.then(function (res) {\n resolve(_.find(res, { courseTypeID: id }));\n }, reject)\n });\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n CourseTypes, // $resource\n courseTypes, // collection\n data, // entity\n function (data) {\n if (successCallback) {\n successCallback(data);\n }\n\n courseTypesBriefs = null;\n },\n errorCallback,\n 'courseTypeID');\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n CourseTypes, // $resource\n courseTypes, // collection\n data, // entity\n function (data) {\n if (successCallback) {\n successCallback(data);\n }\n\n courseTypesBriefs = null;\n },\n errorCallback,\n 'courseTypeID');\n }\n\n function remove(data, successCallback, errorCallback) {\n repositorySvc.remove(\n CourseTypes, // $resource\n courseTypes, // collection\n data, // entity\n function (data) {\n if (successCallback) {\n successCallback(data);\n }\n\n courseTypesBriefs = null;\n },\n errorCallback,\n { courseTypeID: data.courseTypeID },\n 'courseTypeID');\n }\n\n return {\n createNew: createNew,\n getAllAsync: getAllAsync,\n getAllForLookup: getAllForLookup,\n getByIdAsync: getByIdAsync,\n insert: insert,\n update: update,\n remove: remove\n }\n }]);","wbApp.factory('domainsSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n var Domains = $resource('/restapi/domains/:id', {}, {\n 'get': { method: 'GET', isArray: true, url: '/restapi/domains' }, \n 'insert': { method: 'POST', url: '/restapi/domains' },\n 'update': { method: 'PUT', url: '/restapi/domains/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/domains/:id' },\n });\n\n var domains;\n\n function getAllExpanded() {\n return repositorySvc.customGet('get', Domains, {\n expand: 'specializations'\n });\n }\n\n function extendDomainModel(d, name) {\n d.fullName = !!name ? name + ' - ' + d.name : d.name;\n d.expanded = !!d.specializations;\n d.visible = !(d.disabledForClients && _.reduce(d.specializations || [], function(acc, n) {\n return acc && n.disabledForClients;\n }, true));\n _.forEach(d.specializations || [], function(s) {\n extendDomainModel(s, d.name);\n });\n } \n \n function getAllExpandedWithClientModel() {\n let deferred = $q.defer();\n let domains = [];\n domains.$promise = deferred.promise;\n\n getAllExpanded().$promise.then(function (data) {\n _.forEach(data, function(d) {\n extendDomainModel(d, null);\n });\n domains.push.apply(domains, data);\n deferred.resolve(domains);\n },\n function(error) {\n deferred.reject(error);\n });\n \n return domains;\n }\n \n function findFirstSelectable(domains) {\n let visibleDomain = _.find(domains, 'visible');\n if (!!visibleDomain && visibleDomain.disabledForClients) {\n return _.find(visibleDomain.specializations || [], 'visible');\n }\n return visibleDomain;\n }\n\n function getAll(refresh) {\n if (!domains || refresh) {\n domains = repositorySvc.customGet('get', Domains);\n }\n\n return domains;\n }\n\n function createNew() {\n return {\n name: '',\n description: null\n };\n }\n\n function insert(domain, success, error) {\n return repositorySvc.customPost(\n 'insert',\n Domains,\n domain,\n function (data) {\n if (domains) {\n domains.push(data); \n }\n\n if (success) \n {\n success();\n }\n },\n error);\n }\n\n function update(domain, success, error) {\n return repositorySvc.customPutWithParams(\n 'update',\n Domains,\n {\n id: domain.id\n },\n domain,\n function (data) {\n if (domains) {\n var current = _.find(domains, { id: domain.id });\n if (current) {\n angular.copy(domain, current);\n }\n }\n\n if (success) {\n success();\n }\n },\n error);\n }\n\n function remove(domain, success, error) {\n return repositorySvc.customDelete(\n 'delete',\n Domains,\n {\n id: domain.id\n },\n function (data) {\n if (domains) {\n var i = _.findIndex(domains, { id: domain.id });\n if (i !== -1) {\n domains.splice(i, 1);\n }\n }\n\n if (success) {\n success();\n }\n },\n error);\n }\n\n return {\n getAll: getAll,\n createNew: createNew,\n insert: insert,\n update: update,\n remove: remove,\n getAllExpanded: getAllExpanded,\n getAllExpandedWithClientModel: getAllExpandedWithClientModel,\n findFirstSelectable: findFirstSelectable\n }\n }]);","'use strict';\n\nwbApp.factory('employeeSvc', ['$resource', '$cacheFactory', '$q', 'repositorySvc', 'domainsSvc',\n function ($resource, $cacheFactory, $q, repositorySvc, domainsSvc) {\n var Employee = $resource('/Api/Employees/:id', {}, {\n 'getAll': { method: 'GET', isArray: true, url: '/Api/Employees/GetAll' },\n 'getByEmployeeID': { method: 'GET', isArray: false, url: '/Api/Employees/GetByEmployeeID' },\n 'getBriefByEmployeeID': { method: 'GET', isArray: false, url: '/Api/Employees/GetBriefByEmployeeID' },\n 'update': { method: 'POST', url: '/Api/Employees/Update' },\n 'insert': { method: 'POST', url: '/Api/Employees/Insert' },\n 'delete': { method: 'POST', url: '/Api/Employees/Delete' },\n 'domainsGetAll': { method: 'GET', isArray: true, url: '/restapi/employees/:employeeId/domains' },\n 'domainsInsert': { method: 'POST', url: '/restapi/employees/:employeeId/domains' },\n 'domainsUpdate': { method: 'PUT', url: '/restapi/employees/:employeeId/domains/:id' },\n 'domainsDelete': { method: 'DELETE', url: '/restapi/employees/:employeeId/domains/:id' },\r\n 'getAllExpanded': { method: 'GET', isArray: true, url: '/restapi/employees' },\r\n 'getAllExpandedByIds': { method: 'POST', isArray: true, url: '/restapi/employees/find-by-ids' },\r\n 'schedulesUpdateDay': { method: 'PUT', url: '/restapi/employees/:employeeId/schedules/:id' },\r\n 'schedulesDeleteDay': { method: 'DELETE', url: '/restapi/employees/:employeeId/schedules/:id' },\r\n });\n\n function createNew() {\n return {\n active: true,\n smallImageUrl: 'https://gaxb7o2ddx-images.storage.googleapis.com/Profile/0/cf2830ffb3df4d72a4cbbc8f88fa3c8a.png',\n franchises: []\n };\n }\n\n function getAllAsync() {\n var ret = repositorySvc.customGet('getAll', Employee);\n\n ret.$promise.then(function (data) {\r\n _.forEach(data, function (employee) {\r\n employee.rfidCardIDsStr = _.join(employee.rfidCardIDs, ', ')\r\n });\r\n });\n\n return ret;\n }\n\n function getAllNonDeleted(refresh) {\n var allEmployees = getAllAsync(refresh);\n var filteredEmployees = [];\n\n var deferred = $q.defer();\n filteredEmployees.$promise = deferred.promise;\n\n allEmployees.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if (!value.isDeleted) {\n filteredEmployees.push(value);\n }\n });\n deferred.resolve(filteredEmployees);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filteredEmployees;\n }\n\n function getByEmployeeID(employeeID) {\r\n return repositorySvc.customGet('getByEmployeeID', Employee, {\r\n employeeID: employeeID\r\n });\r\n }\n\n function getBriefByEmployeeID(employeeID) {\r\n return repositorySvc.customGet('getBriefByEmployeeID', Employee, {\r\n employeeID: employeeID\r\n });\r\n }\n\n function getAllActiveAsync(employeeIDtoInclude) {\n var allEmployees = getAllAsync();\n var filteredEmployees = [];\n\n var deferred = $q.defer();\n filteredEmployees.$promise = deferred.promise;\n\n allEmployees.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if ((!value.isDeleted && value.active) || value.employeeID === employeeIDtoInclude) {\n filteredEmployees.push(value);\n }\n });\n deferred.resolve(filteredEmployees);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filteredEmployees;\n }\n\n function insert(data, successCallback, errorCallback, collection) {\n repositorySvc.insert(\n Employee, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'employeeID');\n }\n\n function update(data, successCallback, errorCallback, collection) {\n repositorySvc.update(\n Employee, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'employeeID');\n }\n\n function remove(data, successCallback, errorCallback, collection) {\n repositorySvc.remove(\n Employee, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback,\n { employeeID: data.employeeID },\n 'employeeID');\n }\n\n function initNewFranchisesLicense(employee) {\n employee.franchises.push({\n employeeFranchiseID: 0,\n franchiseCentralTenantID: null,\n active: false,\n licenses: []\n });\n }\n\n function getEmployeeDomains(employeeId) {\r\n if (!employeeId) {\r\n return $q(function (resolve, reject) {\r\n resolve([]);\r\n });\r\n } else {\r\n return repositorySvc.customGet(\r\n 'domainsGetAll',\r\n Employee,\r\n {\r\n employeeId: employeeId\r\n });\r\n }\r\n }\n\n function loadDomainsData(employeeId) {\r\n return $q(function (resolve, reject) {\r\n $q.all([\r\n domainsSvc.getAllExpanded().$promise,\r\n getEmployeeDomains(employeeId).$promise])\r\n .then(function (data) {\r\n var domains = data[0];\r\n var employeeDomains = data[1];\r\n\r\n var selection = _.flatMapDeep(employeeDomains, function (d) {\r\n return [d.domainId, d.specializationIds];\r\n });\r\n\r\n resolve({ domains: domains, selection: selection });\r\n }, function (error) {\r\n reject(error);\r\n });\r\n });\r\n }\n\n function saveDomainsData(employeeId, domains, origSelection, newSelection, success, error) {\r\n\r\n var origSelectionDict = _.keyBy(origSelection, function (o) { return o; })\r\n var newSelectionDict = _.keyBy(newSelection, function (o) { return o; })\r\n\r\n var toInsert = [];\r\n var toUpdate = [];\r\n var toDelete = [];\r\n\r\n var promisses = [];\r\n\r\n _.forEach(domains, function (d) {\r\n\r\n var origEmployeeDomain = {\r\n id: null,\r\n domainId: null,\r\n specializationIds: []\r\n };\r\n\r\n var newEmployeeDomain = {\r\n id: null,\r\n domainId: null,\r\n specializationIds: []\r\n }\r\n\r\n _.forEach(d.specializations, function (s) {\r\n if (_.has(origSelectionDict, s.id)) {\r\n origEmployeeDomain.specializationIds.push(s.id);\r\n }\r\n\r\n if (_.has(newSelectionDict, s.id)) {\r\n newEmployeeDomain.specializationIds.push(s.id);\r\n }\r\n });\r\n\r\n if (origEmployeeDomain.specializationIds.length || _.has(origSelectionDict, d.id)) {\r\n origEmployeeDomain.id = d.id;\r\n origEmployeeDomain.domainId = d.id;\r\n }\r\n\r\n if (newEmployeeDomain.specializationIds.length || _.has(newSelectionDict, d.id)) {\r\n newEmployeeDomain.id = d.id;\r\n newEmployeeDomain.domainId = d.id;\r\n }\r\n\r\n if (!!origEmployeeDomain.id && !newEmployeeDomain.id) {\r\n toDelete.push(origEmployeeDomain);\r\n }\r\n\r\n if (!origEmployeeDomain.id && !!newEmployeeDomain.id) {\r\n toInsert.push(newEmployeeDomain);\r\n }\r\n\r\n if (!!origEmployeeDomain.id && !!newEmployeeDomain.id) {\r\n if (!_.isEqual(origEmployeeDomain, newEmployeeDomain)) {\r\n toUpdate.push(newEmployeeDomain);\r\n }\r\n }\r\n });\r\n\r\n _.forEach(toInsert, function (o) {\r\n promisses.push(\r\n repositorySvc.customPutWithParams('domainsInsert', Employee, { employeeId: employeeId }, o).$promise);\r\n });\r\n _.forEach(toUpdate, function (o) {\r\n promisses.push(\r\n repositorySvc.customPutWithParams('domainsUpdate', Employee, { employeeId: employeeId, id: o.id }, o).$promise);\r\n });\r\n _.forEach(toDelete, function (o) {\r\n promisses.push(\r\n repositorySvc.customDelete('domainsDelete', Employee, { employeeId: employeeId, id: o.id }).$promise);\r\n });\r\n\r\n if (promisses.length == 0) {\r\n success();\r\n } else {\r\n $q.all(promisses).then(function (data) {\r\n success(data);\r\n }, function (e) {\r\n error(e);\r\n });\r\n }\r\n }\n\n function schedulesUpdateDay(employeeId, day, dayScheduleDTO) {\r\n lastLoadedAllExpanded = null;\r\n\r\n return repositorySvc.customPutWithParams(\r\n 'schedulesUpdateDay',\r\n Employee,\r\n {\r\n employeeId: employeeId,\r\n id: moment(day).format('YYYY-MM-DD')\r\n },\r\n dayScheduleDTO);\r\n }\n\n function schedulesDeleteDay(employeeId, day) {\r\n lastLoadedAllExpanded = null;\r\n\r\n return repositorySvc.customDelete(\r\n 'schedulesDeleteDay',\r\n Employee,\r\n {\r\n employeeId: employeeId,\r\n id: moment(day).format('YYYY-MM-DD')\r\n });\r\n }\n\n function getAllExpandedByIds(from, to, selectedEmployees) {\r\n return $q(function (resolve, reject) {\r\n var result = Employee['getAllExpandedByIds'](\r\n {\r\n ids: selectedEmployees,\r\n expanded: 'AvailabilitySchedules,Schedules,Domains',\r\n from: from,\r\n to: to\r\n },\r\n function (success) {\r\n _.forEach(result, function (e) {\r\n e.fullName = String.prototype.fullName(e.name, e.middlename, e.surname);\r\n });\r\n\r\n resolve(result);\r\n },\r\n function (error) {\r\n repositorySvc.defaultErrorHandler(error);\r\n reject(error);\r\n })\r\n });\r\n }\n\n var lastLoadedAllExpanded = null;\n var lastLoadedAllExpandedFilter = {\r\n from: null,\r\n to: null,\r\n loadedAt: moment()\r\n };\n\n function getAllExpanded(from, to) {\r\n\r\n var mnow = moment();\r\n if (!lastLoadedAllExpanded ||\r\n !moment(lastLoadedAllExpandedFilter.from).isSame(from) ||\r\n !moment(lastLoadedAllExpandedFilter.to).isSame(to) ||\r\n lastLoadedAllExpandedFilter.loadedAt.isBefore(mnow)) {\r\n\r\n lastLoadedAllExpandedFilter = {\r\n from: from,\r\n to: to,\r\n loadedAt: moment().add(10, 'seconds')\r\n };\r\n\r\n lastLoadedAllExpanded = $q(function (resolve, reject) {\r\n var result = Employee['getAllExpanded'](\r\n {\r\n expanded: 'AvailabilitySchedules,Schedules,Domains',\r\n from: from,\r\n to: to\r\n },\r\n function (success) {\r\n _.forEach(result, function (e) {\r\n e.fullName = String.prototype.fullName(e.name, e.middlename, e.surname);\r\n });\r\n resolve(result);\r\n },\r\n function (error) {\r\n reject(error);\r\n })\r\n });\r\n }\r\n\r\n return lastLoadedAllExpanded;\r\n }\n\n function getAll() \n {\r\n return $q(function (resolve, reject) {\r\n var result = repositorySvc.customGet(\r\n 'getAllExpanded',\r\n Employee,\r\n function (success) {\r\n _.forEach(result, function (e) {\r\n e.fullName = String.prototype.fullName(e.name, e.middlename, e.surname);\r\n });\r\n resolve(result);\r\n },\r\n function (error) {\r\n reject(error);\r\n })\r\n });\r\n }\n\n return {\n createNew: createNew,\n getByEmployeeID: getByEmployeeID,\n getBriefByEmployeeID: getBriefByEmployeeID,\n getAllAsync: getAllAsync,\n getAllActiveAsync: getAllActiveAsync,\n insert: insert,\n update: update,\n remove: remove,\n initNewFranchisesLicense: initNewFranchisesLicense,\n getAllNonDeleted: getAllNonDeleted,\n loadDomainsData: loadDomainsData,\n saveDomainsData: saveDomainsData,\n\n getAllExpandedByIds: getAllExpandedByIds,\n getAll: getAll,\n getAllExpanded: getAllExpanded,\n\n schedulesUpdateDay: schedulesUpdateDay,\n schedulesDeleteDay: schedulesDeleteDay\n }\n }]);","'use strict';\n\nwbApp.factory('errorTypeTranslateSvc', ['$translate', \n function ($translate) {\n\n function translate(error, attr, scope) {\n var errors = '';\n\n attr = attr || {};\n\n switch (error) {\n case \"email\":\n errors += $translate.instant(\"TXT_ERROR_INVALID_EMAIL\");\n break;\n case \"required\":\n errors += $translate.instant(\"TXT_ERROR_REQUIRED\");\n break;\n case \"maxlength\":\n errors += $translate.instant(\"TXT_ERROR_MAX_LENGTH\");\n if (attr.ngMaxlength) {\n errors += ' (' + attr.ngMaxlength + ')';\n }\n break;\n case \"minlength\":\n errors += $translate.instant(\"TXT_ERROR_MIN_LENGTH\");\n if (attr.ngMinlength) {\n errors += '(' + attr.ngMinlength + ')';\n }\n break;\n case \"isBefore\":\n errors += $translate.instant(\"TXT_ERROR_IS_BEFORE\");\n if (attr.wbIsBeforeValidator) {\n var val1 = scope.$eval(attr.wbIsBeforeValidator);\n errors += moment(val1).format('L');\n }\n break;\n case \"isAfter\":\n errors += $translate.instant(\"TXT_ERROR_IS_AFTER\");\n if (attr.wbIsAfterValidator) {\n var val2 = scope.$eval(attr.wbIsAfterValidator);\n errors += moment(val2).format('L');\n }\n break;\n case \"pattern\":\n errors += $translate.instant(\"TXT_ERROR_PATTERN\");\n break;\n case \"uniqueEmail\":\n errors += $translate.instant(\"TXT_ERROR_UNIQUE_EMAIL\");\n break;\n case \"uniqueUserName\":\n errors += $translate.instant(\"TXT_ERROR_UNIQUE_USER_NAME\");\n break;\n case \"uniqueTenant\":\n errors += $translate.instant(\"TXT_ERROR_UNIQUE_TENANT_NAME\");\n break;\n case \"sameValue\":\n if (attr.wbSameValueValidatorMessage) {\n errors += attr.wbSameValueValidatorMessage;\n } else {\n errors += $translate.instant(\"TXT_ERROR_UNIQUE_USER_NAME\");\n }\n break;\n case \"differentValue\":\n if (attr.wbDifferentValueValidatorMessage) {\n errors += attr.wbDifferentValueValidatorMessage;\n } else {\n errors += $translate.instant(\"TXT_ERROR_UNIQUE_USER_NAME\");\n }\n break;\n case \"onlyOneValueSet\":\n if (attr.wbOnlyOneValueSetValidatorMessage) {\n errors += attr.wbOnlyOneValueSetValidatorMessage;\n } else {\n errors += $translate.instant(\"TXT_ERROR_ONLY_ONE_VALUE_CAN_BE_SET\");\n }\n break;\n case \"dependentPropertyRequired\":\n if (attr.wbDependentPropertyRequiredValidator) {\n errors += attr.wbDependentPropertyRequiredValidatorMessage;\n } else {\n errors += $translate.instant(\"TXT_ERROR_ONLY_ONE_VALUE_CAN_BE_SET\");\n }\n break;\n case \"mask\":\n errors += $translate.instant(\"TXT_ERROR_PATTERN\");\n break;\n case \"number\":\n errors += $translate.instant(\"TXT_ERROR_NUMBER\");\n break;\n case \"min\":\n errors += $translate.instant(\"TXT_ERROR_MIN\");\n if (attr.min) {\n errors += ' (' + attr.min + ')';\n } else {\n if (attr.minTime) {\n errors += ' (' + attr.minTime + ')';\n }\n }\n break;\n case \"max\":\n errors += $translate.instant(\"TXT_ERROR_MAX\");\n if (attr.max) {\n errors += ' (' + attr.max + ')';\n } else {\n if (attr.maxTime) {\n errors += ' (' + attr.maxTime + ')';\n }\n }\n break;\n }\n\n return errors;\n }\n\n return {\n translate: translate\n }\n }]);","wbApp.factory('facebookSvc', ['$translate', 'tenantInfo', 'notificationSvc', 'tenantSettingSvc',\n function ($translate, tenantInfo, notificationSvc, tenantSettingSvc) {\n\n function getFeedDescriptionForCourse(subjectDescription, courseDescription) {\n var res = '';\n\n if (subjectDescription) {\n res = subjectDescription;\n }\n\n if (courseDescription) {\n if (res.length > 0) {\n res = res + '. ' + courseDescription;\n } else {\n res = courseDescription;\n }\n }\n\n return res;\n }\n\n function shareCourseDetail(\n courseID,\n subjectName,\n courseFullName,\n subjectDescription,\n courseDescription,\n teacherFullName,\n picture,\n isAction) {\n\n var alias = tenantInfo.alias;\n var description = getFeedDescriptionForCourse(subjectDescription, courseDescription);\n var pictureUrl = !!picture\n ? picture\n : tenantSettingSvc.settings.registrationOpenPicture;\n var linkPart = isAction ? 'Actions' : 'Courses'\n\n var urlEncoded = encodeURI('https://' + alias + tenantInfo.domain + '/' + linkPart + '/Register/' + courseID);\n var titleEncoded = encodeURI(subjectName + ' ' + courseFullName + ' (' + teacherFullName + ')');\n var descriptionEncoded = encodeURI(description);\n var pictureUrlEncoded = encodeURI(pictureUrl);\n\n var socialMediaShareUrl = `https://${alias}${tenantInfo.domain}/spa-helper-social-media-share?url=${urlEncoded}&title=${titleEncoded}&image=${pictureUrlEncoded}&description=${descriptionEncoded}`;\n \n FB.ui({\n method: 'share',\n href: socialMediaShareUrl,\n }, function (response) { });\n }\n\n return {\n shareCourseDetail: shareCourseDetail\n }\n }\n]);","wbApp.factory('formResponseSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var FormResponse = $resource('/restapi/forms-responses/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/forms-responses/:id' },\n 'getAllByFormId': { method: 'GET', isArray: true, url: '/restapi/forms-responses/info/find-by-form-definition' },\n 'insert': { method: 'POST', url: '/restapi/forms-responses' },\n 'delete': { method: 'DELETE', url: '/restapi/forms-responses/:id' },\n });\n\n function getById(formResponseId) {\n return repositorySvc.customGet('getById', FormResponse, { id: formResponseId });\n }\n\n function getAllByFormId(formId) {\n return $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getAllByFormId',\n FormResponse,\n {\n formDefinitionId: formId,\n expanded: 'PersonalInformation'\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(data);\n },\n function (error) {\n reject(error);\n });\n });\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n FormResponse,\n model);\n }\n\n function remove(formResponseId) {\n return repositorySvc.customDelete(\n 'delete',\n FormResponse,\n { id: formResponseId });\n }\n\n return {\n getById: getById,\n getAllByFormId: getAllByFormId,\n insert: insert,\n remove: remove,\n }\n }\n]);","wbApp.factory('formSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n var Form = $resource('/restapi/forms-definitions/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/forms-definitions/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/forms-definitions' },\n 'getAllActive': { method: 'GET', isArray: true, url: '/restapi/forms-definitions/find-by-active' },\n 'getByIdAndRevision': { method: 'GET', url: '/restapi/forms-definitions/:id/audit/:revision' },\n 'insert': { method: 'POST', url: '/restapi/forms-definitions' },\n 'update': { method: 'PUT', url: '/restapi/forms-definitions/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/forms-definitions/:id' },\n\n });\n\n function createNew()\n {\n var form = { \n name: '',\n primaryQuestionIndex: 0,\n primaryQuestionIndexPlusOne: 1,\n accessPermissions: 0,\n isActive: true,\n questions: [],\n isNew: true,\n formType: 0\n };\n\n addNewQuestion(form);\n\n return form;\n }\n\n function addNewQuestion(form)\n {\n if (!form.questions) {\n form.questions = [];\n }\n\n var maxId = 1;\n var max = _.maxBy(form.questions, 'id');\n if (!!max) {\n maxId = max.id + 1;\n }\n\n var newQuestion = {\n id: maxId + 1,\n name: \"\",\n descriptionHtml: \"\",\n questionType: 0,\n options: []\n };\n\n addNewOption(newQuestion);\n\n form.questions.push(newQuestion);\n }\n\n function addNewOption(question)\n {\n if (!question.options) {\n question.options = [];\n }\n\n var maxId = 1;\n var max = _.maxBy(question.options, 'id');\n if (!!max) {\n maxId = max.id + 1;\n }\n\n var newOption = {\n id: maxId + 1,\n name: \"\"\n };\n\n question.options.push(newOption);\n }\n\n function isFormValid(form)\n {\n if (form.questions == null || form.questions.length == 0)\n {\n return false;\n }\n\n if (form.primaryQuestionIndex > (form.questions.length - 1) ||\n form.primaryQuestionIndex < 0)\n {\n return false;\n }\n\n return _.reduce(form.questions, function (result, q) {\n var questionIsValid = true;\n if (q.questionType != 4)\n {\n questionIsValid = q.options != null && q.options.length > 0;\n }\n else\n {\n questionIsValid = q.options == null;\n }\n return result && questionIsValid;\n }, true);\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n Form,\n model);\n }\n\n function remove(formId) {\n return repositorySvc.customDelete(\n 'delete',\n Form,\n { id: formId });\n }\n\n function update(model) {\n return repositorySvc.customPutWithParams(\n 'update',\n Form,\n { id: model.id },\n model);\n }\n\n function getById(formId) {\n return repositorySvc.customGet('getById', Form, { id: formId });\n }\n\n function getByIdAndRevision(formId, revision) {\n return repositorySvc.customGet('getByIdAndRevision', Form, { id: formId, revision: revision });\n }\n\n function getAll() {\n return $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getAll',\n Form,\n {\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(data);\n },\n function (error) {\n reject(error);\n });\n });\n }\n\n function getAllActive() {\n return $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getAllActive',\n Form,\n {\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(data);\n },\n function (error) {\n reject(error);\n });\n });\n }\n \n function getAllForLookup(formIdToInclude, filterForKindergarten)\n {\n let allForms = getAll();\n var filteredForms = [];\n\n var deferred = $q.defer();\n filteredForms.$promise = deferred.promise;\n\n allForms.then(function (data) {\n angular.forEach(data, function (value, key) {\n if (value.isActive || value.id === formIdToInclude) {\n if (!!filterForKindergarten) {\n if (value.formType === 1 /* KindergartenEnrollment */ || value.id === formIdToInclude) {\n filteredForms.push(value); \n }\n } else {\n filteredForms.push(value);\n }\n }\n });\n deferred.resolve(filteredForms);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filteredForms;\n }\n\n function updateFilledFormByFormResponse(form, formResponse) {\n\n form.notRegisteredUserInfo = formResponse.notRegisteredUserInfo;\n form.isNotRegisteredUser = !!form.notRegisteredUserInfo;\n\n var student = _.find(form.students, function (s) { return s.id == formResponse.studentId; });\n if (!!student) {\n student.checked = true;\n }\n\n _.forEach(formResponse.answers, function (a) {\n var q = _.find(form.questions, { id: a.id });\n if (!!q) {\n q.textAnswer = a.textAnswer;\n if (!!a.optionsSelection && a.optionsSelection.length > 0) {\n _.forEach(a.optionsSelection, function (os) {\n var o = _.find(q.options, { id: os });\n if (!!o) {\n o.checked = true;\n }\n });\n }\n }\n });\n\n }\n\n function generateFormResponseFromFilledForm(form)\n {\n return {\n id: null,\n formDefinitionId: form.id,\n formDefinitionRevision: form.auditEvent != null ? form.auditEvent.revision : 0,\n userId: !form.notRegisteredUserInfo ? form.userId + '' : null,\n studentId: !form.notRegisteredUserInfo \n ? _.head(_.map(_.filter(form.students, { 'checked': true }), function (s) {\n return s.id + '';\n }))\n : null,\n answers: _.map(form.questions, function (q) {\n return {\n id: q.id,\n textAnswer: q.textAnswer,\n optionsSelection: (q.questionType == 4) \n ? undefined\n : _.map(_.filter(q.options, { 'checked': true }), 'id')\n }\n }),\n isNotRegisteredUser: !!form.notRegisteredUserInfo,\n notRegisteredUserInfo: form.notRegisteredUserInfo\n };\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getByIdAndRevision: getByIdAndRevision,\n getAll: getAll,\n getAllActive: getAllActive,\n insert: insert,\n remove: remove,\n update: update,\n addNewQuestion: addNewQuestion,\n addNewOption: addNewOption,\n isFormValid: isFormValid,\n generateFormResponseFromFilledForm: generateFormResponseFromFilledForm,\n updateFilledFormByFormResponse: updateFilledFormByFormResponse,\n getAllForLookup: getAllForLookup\n }\n }\n]);","wbApp.factory('geoCoderSvc', ['$q', 'uiGmapGoogleMapApi',\n function ($q, uiGmapGoogleMapApi) {\n\n function geocode(address) {\n var d = $q.defer();\n\n uiGmapGoogleMapApi.then(function (maps) {\n var geocoder = new maps.Geocoder();\n\n var addr;\n if (typeof address === 'string' || address instanceof String) {\n addr = address;\n } else {\n addr = address.formatted_address;\n }\n\n geocoder.geocode({ 'address': addr }, function (results, status) {\n if (status === maps.GeocoderStatus.OK ||\n status === maps.GeocoderStatus.ZERO_RESULTS) {\n d.resolve(results);\n } else {\n d.reject(status);\n }\n });\n });\n\n return d.promise;\n }\n\n function geoDecode(latitude, longtitude) {\n var d = $q.defer();\n\n uiGmapGoogleMapApi.then(function (maps) {\n\n var latlng = new maps.LatLng(latitude, longtitude);\n var geocoder = new maps.Geocoder();\n geocoder.geocode({ 'latLng': latlng }, function (results, status) {\n if (status === maps.GeocoderStatus.OK ||\n status === maps.GeocoderStatus.ZERO_RESULTS) {\n d.resolve(results);\n } else {\n d.reject(status);\n }\n });\n });\n\n return d.promise;\n }\n\n return {\n geocode: geocode,\n geoDecode: geoDecode\n }\n }]);","'use strict';\n\nwbApp.factory('gridSortSvc', ['languageService', 'tenantSettingSvc',\n function (languageService, tenantSettingSvc) {\n\n function date(value) {\n if (!value) {\n return new Date(0);\n }\n\n return new Date(value);\n }\n\n var csTranslateTable = {\n 'á': 'a{',\n 'č': 'c{',\n 'ď': 'd{',\n 'é': 'e{',\n 'ě': 'e|',\n 'í': 'i{',\n 'ň': 'n{',\n 'ó': 'o{',\n 'ř': 'r{',\n 'š': 's{',\n 'ť': 't{',\n 'ú': 'u{',\n 'ů': 'u|',\n 'ý': 'y{',\n 'ž': 'z{',\n 'ch': 'h{'\n };\n\n function localeCS(value) {\n var res = '';\n var i = 0\n while (i < value.length) {\n var ch = value[i];\n if (ch === 'c' && ((i + 1) < value.length) && value[i + 1] === 'h') {\n i++;\n res = res + csTranslateTable['ch'];\n } else {\n var tr = csTranslateTable[ch];\n if (tr) {\n res = res + tr;\n } else {\n res = res + ch;\n }\n }\n i++;\n }\n return res;\n }\n\n var localeFn = {\n cs: localeCS,\n en: function (value) { return value; },\n de: function (value) { return value; },\n sk: function (value) { return value; }\n }\n\n function locale(value, language) {\n if (!language) {\n language = languageService.currentLanguage().key;\n }\n\n if (!value) {\n return value;\n }\n\n return localeFn[language](angular.lowercase(value));\n }\n\n function humanName(value) {\n if (!value) {\n return value;\n }\n\n var res = '';\n var spl = value.split(' ');\n for (var i = spl.length - 1; i >= 0; i--) {\n res += spl[i];\n }\n\n return locale(res);\n }\n\n function sortHumanFullName(data, nameProperty, surnameProperty, middleNameProperty) {\n if (tenantSettingSvc.settings.sortNamesBySurname) {\n return locale(data[surnameProperty]) + ' ' + locale(data[middleNameProperty]) + ' ' + locale(data[nameProperty]);\n } else {\n return locale(data[nameProperty]) + ' ' + locale(data[middleNameProperty]) + ' ' + locale(data[surnameProperty]);\n }\n }\n\n function sortHumanFullName2(data, fullNameProperty) {\n if (tenantSettingSvc.settings.sortNamesBySurname) {\n var arr = _.words(data[fullNameProperty]);\n\n if (arr.length <= 3) {\n return locale(_.join(_.reverse(arr), ' '));\n }\n\n var rest = _.drop(arr, 3);\n var start = _.slice(arr, 0, 3);\n\n return locale(_.join(_.concat(_.reverse(start), rest), ' '));\n } else {\n return locale(data[fullNameProperty]);\n }\n }\n \n function filterExpressionWithoutAccents(filterValue, selectedFilterOperation, target, propertyName) {\n let getter = function (data) {\n return (data[propertyName] === undefined || data[propertyName] === null)\n ? data[propertyName]\n : data[propertyName].normalize('NFD').replace(/[\\u0300-\\u036f]/g, \"\");\n };\n\n filterValue = (filterValue === undefined || filterValue === null)\n ? filterValue\n : filterValue.normalize('NFD').replace(/[\\u0300-\\u036f]/g, \"\");\n return [getter, selectedFilterOperation || \"contains\", filterValue];\n }\n\n function localeSort(data, propertyName) {\n return locale(data[propertyName]);\n }\n\n return {\n humanName: humanName,\n date: date,\n locale: locale,\n sortHumanFullName: sortHumanFullName,\n sortHumanFullName2: sortHumanFullName2,\n localeSort: localeSort,\n filterExpressionWithoutAccents: filterExpressionWithoutAccents\n }\n\n }]);","'use strict';\n\nwbApp.factory('languageService', ['$translate', '$timeout', 'preferredLanguage', 'tenantInfo',\n function (translate, $timeout, preferredLanguage, tenantInfo) {\n translate.use(preferredLanguage);\n\n var languages = [\n { key: 'en', nameResID: 'TXT_LANG_EN', img: '/Bundles/css/images/flags/us.svg' },\n { key: 'cs', nameResID: 'TXT_LANG_CS', img: '/Bundles/css/images/flags/cz.svg' },\n { key: 'sk', nameResID: 'TXT_LANG_SK', img: '/Bundles/css/images/flags/sk.svg' },\n { key: 'de', nameResID: 'TXT_LANG_DE', img: '/Bundles/css/images/flags/de.svg' }];\n\n function setActiveLanguage(langKey) {\n for (var i = 0; i < languages.length; i++) {\n if (languages[i].key === langKey) {\n languages[i].active = true;\n moment.locale(langKey);\n } else {\n languages[i].active = false;\n }\n }\n\n var expires = new Date();\n expires.setDate(expires.getDate() + 10000);\n expires.setTime(expires.getTime() + (1 * 24 * 60 * 60 * 1000));\n\n var cookieValue = 'c=' + langKey + '|uic=' + langKey;\n\n var newCookie = 'culture=' + cookieValue + '; expires=' + expires.toUTCString() + '; domain=' + tenantInfo.domain + '; path=/';\n document.cookie = newCookie;\n }\n\n function currentLangKey(langKey) {\n if (langKey) {\n if (langKey !== translate.use()) {\n setActiveLanguage(langKey);\n // Do no set language immediately, done in app.js on reload\n return translate.use();\n }\n }\n return translate.use();\n }\n\n setActiveLanguage(translate.use());\n\n return {\n currentLangKey: currentLangKey,\n\n currentLanguage: function () {\n for (var i = 0; i < languages.length; i++) {\n if (languages[i].key === currentLangKey()) {\n return languages[i];\n }\n }\n return {};\n },\n\n supportedLanguages: languages\n }\n}]);","'use strict';\n\nwbApp.factory('membershipStudentSvc', ['$q', '$resource', 'repositorySvc',\n function ($q, $resource, repositorySvc) {\n\n var MembershipStudent = $resource('/Api/MembershipStudent/Get/:userId', {}, {\n 'query': { method: 'GET', isArray: true },\n 'getByUser': { method: 'GET', url: '/Api/MembershipStudent/GetByUser', isArray: true },\n 'getValidByUser': { method: 'GET', url: '/Api/MembershipStudent/GetValidByUser', isArray: true },\n 'getByMembership': { method: 'GET', url: '/Api/MembershipStudent/GetByMembership', isArray: true },\n 'insert': { method: 'POST', url: '/Api/MembershipStudent/Insert' },\n 'update': { method: 'POST', url: '/Api/MembershipStudent/Update' },\n 'delete': { method: 'POST', url: '/Api/MembershipStudent/Delete' }\n });\n\n function getAllAsync() {\n return repositorySvc.get(MembershipStudent, {});\n }\n\n var lasValidByUser;\n var lastUserId;\n var lastNow;\n function GetByUserValidAsync(userId, now, refresh) {\n\n var normalizedNow = moment(now).startOf('day');\n\n if (!normalizedNow.isSame(lastNow) || lastUserId != userId || !lasValidByUser || refresh) {\r\n lastNow = normalizedNow;\n lastUserId = userId;\n lasValidByUser = repositorySvc.customGet('getValidByUser', MembershipStudent, { userId: userId, now: normalizedNow.toDate() });\r\n }\n\n return lasValidByUser;\n }\n\n var byMembershipId;\n var lastMembershipId;\n function GetAllByMembershipAsync(membershipId) {\n\n if (!byMembershipId || lastMembershipId !== membershipId) {\n byMembershipId = repositorySvc.customGet('getByMembership', MembershipStudent, { membershipId: membershipId });\n lastMembershipId = membershipId;\n }\n\n return byMembershipId;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n MembershipStudent, // $resource\n byMembershipId, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'membershipStudentID');\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n MembershipStudent, // $resource\n byMembershipId, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'membershipStudentID');\n }\n\n function remove(data, errorCallback) {\n repositorySvc.remove(\n MembershipStudent, // $resource\n byMembershipId, // collection\n data, // entity\n null, // successCallback\n errorCallback,\n { membershipStudentID: data.membershipStudentID },\n 'membershipStudentID');\n }\n\n return {\n getAllAsync: getAllAsync,\n // GetByUserAsync: GetByUserAsync,\n // GetByStudentAsync: GetByStudentAsync,\n GetByUserValidAsync: GetByUserValidAsync,\n GetAllByMembershipAsync: GetAllByMembershipAsync,\n insert: insert,\n update: update,\n remove: remove,\n }\n }]);","'use strict';\n\nwbApp.factory('membershipSvc', ['$resource', 'repositorySvc',\n function ($resource, repositorySvc) {\n\n var Membership = $resource('/Api/Membership/Get/:id', {}, {\n 'query': { method: 'GET', isArray: true },\n 'getValid': { method: 'GET', url: '/Api/Membership/GetValid', isArray: true },\n 'save': { method: 'POST', url: '/Api/Membership/Save' },\n 'delete': { method: 'POST', url: '/Api/Membership/Delete' }\n });\n\n var memberships;\n\n var lastNow;\n var lastValidMembership;\n\n function getAllAsync(refresh) {\n if (!memberships || refresh) {\n memberships = repositorySvc.get(Membership, {});\n }\n return memberships;\n }\n\n function getAllValidAsync(now, refresh) {\n\n var normalizedNow = moment(now).startOf('day');\n\n if (!normalizedNow.isSame(lastNow) || !lastValidMembership || refresh) {\n lastNow = normalizedNow;\r\n lastValidMembership = repositorySvc.customGet('getValid', Membership, { now: normalizedNow.toDate() });\r\n }\n\n return lastValidMembership;\n }\n\n function save(data, successCallback, errorCallback) {\n repositorySvc.save(\n Membership, // $resource\n memberships, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function remove(data, successCallback, errorCallback) {\n repositorySvc.remove(\n Membership, // $resource\n memberships, // collection\n data, // entity\n successCallback, \n errorCallback);\n }\n\n return {\n getAllAsync: getAllAsync,\n getAllValidAsync: getAllValidAsync,\n save: save,\n remove: remove\n }\n\n }]);","'use strict';\n\nwbApp.factory('messageBoxSvc', ['$translate', '$modal', '$rootScope', '$sce', 'tenantSettingSvc', 'userSettingSvc', '$timeout',\n function ($translate, $modal, $rootScope, $sce, tenantSettingSvc, userSettingSvc, $timeout) {\n\n\n //#region Message Dialog\n\n //var m = {\n // title: '',\n // message: '',\n // input: [true|false],\n // buttons: [{\n // text: 'TXT_BTN_CANCEL',\n // callback: cancel\n // }, {\n // text: 'TXT_BTN_OK',\n // callback: ok\n // }]\n //};\n\n function showMessageDlg(dlgConfig) {\n // fill in missing callbacks and primary settings\n var hasPrimaryBtn = false;\n\n for (var i = 0; i < dlgConfig.buttons.length; i++) {\n var button = dlgConfig.buttons[i];\n if (!button.callback) {\n button.callback = function () { }\n }\n if (button.primary) {\n hasPrimaryBtn = true;\n }\n if (!hasPrimaryBtn && (i + 1) === dlgConfig.buttons.length) {\n button.primary = true; \n } \n\n button.$onClick = _.bind(function () {\n messageDlg.$scope.isBusy = true;\n var promise = this.callback();\n if (!!promise && !!promise.then) {\n promise.then(function () {\n messageDlg.$scope.isBusy = false;\n messageDlg.$scope.$hide();\n }, function () {\n messageDlg.$scope.isBusy = false;\n messageDlg.$scope.$hide();\n });\n } else { \n messageDlg.$scope.isBusy = false;\n messageDlg.$scope.$hide();\n }\n \n }, button);\n }\n\n var messageDlg = $modal({\n templateUrl: 'message-box/message-dialog.html',\n show: false,\n scope: $rootScope.$new(),\n container: '#message-box-container'\n });\n \n messageDlg.$promise.then(function () { \n messageDlg.$scope.dlgConfig = angular.copy(dlgConfig);\n messageDlg.$scope.dlgConfig.inputModel = \"\";\n messageDlg.$scope.isBusy = false;\n messageDlg.$scope.dlgConfig.translatedMessage = $translate.instant(dlgConfig.message);\n messageDlg.$scope.inputModel = messageDlg.$scope.dlgConfig.inputModel;\n messageDlg.$scope.inputOnChange = function(data) {\n messageDlg.$scope.inputModel = data;\n messageDlg.hide();\n };\n messageDlg.$scope.$on('modal.show.before', function() {\n if (dlgConfig.onShowBefore) {\n dlgConfig.onShowBefore();\n }\n });\n messageDlg.$scope.$on('modal.show', function() {\n if (dlgConfig.onShow) {\n dlgConfig.onShow();\n }\n $timeout(function() {\n $('#msg-dlg-input input').focus(); \n }, 100);\n });\n messageDlg.$scope.$on('modal.hide.before', function() {\n if (dlgConfig.onHideBefore) {\n dlgConfig.onHideBefore();\n }\n });\n messageDlg.$scope.$on('modal.hide', function() {\n if (dlgConfig.onHide) {\n dlgConfig.onHide( messageDlg.$scope.dlgConfig.inputModel);\n }\n });\n messageDlg.show();\n });\n }\n\n //#endregion\n\n //#region Confirm Client notification\n\n // var m = {\n // Email, SMS\n // userSetting: [string, string],\n // callback: function() { } \n // }\n //\n // userSettingName:\n // ConfimNotificationCourseStudent\n // ConfimNotificationCourseRegistrationPayment\n // ConfirmNotificationCourseInterest\n // ConfirmNotificationSchedule\n // ConfirmNotificationSmsSchedule\n\n function showConfirmClientNotification(dlgConfig) {\n\n var emailsEnabled = \n tenantSettingSvc.settings.sendEmailsToClients &&\n !tenantSettingSvc.settings.disableAllEmails &&\n !tenantSettingSvc.settings.disableAllEmailsExceptUserRegistration;\n\n var smsEnabled = tenantSettingSvc.settings.enableSMSSupport;\n\n var userSettingRemembered = true;\n\n angular.forEach(dlgConfig.userSetting, function(item) {\n userSettingRemembered = userSettingRemembered && \n (userSettingSvc.settings[item] === true || userSettingSvc.settings[item] === false);\n });\n\n if (!emailsEnabled && (!smsEnabled || dlgConfig.userSetting.length === 1) || userSettingRemembered) {\n dlgConfig.callback({\n sendEmailNotification: emailsEnabled && !!userSettingSvc.settings[dlgConfig.userSetting[0]],\n sendSmsNotification: smsEnabled && !!userSettingSvc.settings[dlgConfig.userSetting[1]]\n });\n return;\n }\n\n var defaultConfig = {\n showSendEmailNotification: emailsEnabled,\n showSendSmsNotification: smsEnabled && dlgConfig.showSendSmsNotification,\n showRememberSendNotification: true,\n sendEmailNotification:emailsEnabled,\n sendSmsNotification: false,\n rememberSendNotification: false\n };\n\n var messageDlg = $modal({\n templateUrl: 'message-box/confirm-client-notification.html',\n show: false,\n scope: $rootScope.$new()\n });\n\n function saveSetting(setting) {\n if (messageDlg.$scope.dlgConfig.rememberSendNotification) {\n\n userSettingSvc.settings[dlgConfig.userSetting[0]] = setting.sendEmailNotification;\n if (dlgConfig.userSetting.length === 2) {\n userSettingSvc.settings[dlgConfig.userSetting[1]] = setting.sendSmsNotification;\n }\n\n userSettingSvc.saveAsync();\n }\n }\n\n messageDlg.$promise.then(function () {\n messageDlg.$scope.dlgConfig = defaultConfig;\n messageDlg.$scope.onNoClick = function () {\n\n let setting = {\n sendEmailNotification: false,\n sendSmsNotification: false\n };\n \n saveSetting(setting);\n dlgConfig.callback(setting);\n };\n messageDlg.$scope.onYesClick = function () {\n\n let setting = {\n sendEmailNotification: messageDlg.$scope.dlgConfig.sendEmailNotification,\n sendSmsNotification: messageDlg.$scope.dlgConfig.sendSmsNotification\n };\n saveSetting(setting);\n dlgConfig.callback(setting);\n };\n\n messageDlg.show();\n });\n }\n\n //#endregion\n\n //#region Progress Percent Dialog\n\n function showPctProgress(title, message) {\n var pctProgressDlg = $modal({\n templateUrl: 'message-box/pct-progress-dialog.html',\n show: false,\n scope: angular.extend($rootScope.$new(), {\n title: null,\n message: null,\n progressPct: 0,\n progressMessages: [],\n disableCloseButton: true\n })\n });\n\n pctProgressDlg.$promise.then(function () {\n pctProgressDlg.$scope.title = $translate.instant(title);\n pctProgressDlg.$scope.message = $translate.instant(message);\n pctProgressDlg.$scope.progressPct = 0;\n pctProgressDlg.$scope.noOfErrors = 0;\n\n pctProgressDlg.show();\n });\n\n // progress: {\n // pctProgress: 88,\n // progressMsg: 'OK - xyz',\n // status: 0|1|2 - 0 OK, 1 Error, 2 Done\n // }\n return function (progress) {\n pctProgressDlg.$scope.progressPct = Math.ceil(progress.pctProgress);\n \n pctProgressDlg.$scope.progressMessages.push(progress);\n \n if (progress.status === 1) {\n pctProgressDlg.$scope.noOfErrors += 1;\n }\n\n if (progress.pctProgress >= 100) {\n pctProgressDlg.$scope.disableCloseButton = false;\n }\n }\n }\n\n //#endregion\n\n return {\n showPctProgress: showPctProgress,\n showMessageDlg: showMessageDlg,\n showConfirmClientNotification: showConfirmClientNotification\n }\n }]);\n\n","'use strict';\n\nwbApp.factory('notificationSvc', ['$timeout',\n function ($timeout) {\n\n var duration = 5000;\n var queue = [];\n\n function notifyInfo(title, message) {\n notify({ type: 'success', title: title, content: message });\n }\n\n function notifyWarning(title, message) {\n notify({ type: 'warning', title: title, content: message });\n }\n\n function notifyError(title, message) {\n notify({ type: 'danger', title: title, content: message });\n }\n\n function notify(notification) {\n queue.push(notification);\n $timeout(function() {\n notification.show = false;\n }, duration);\n }\n\n function fatalNotify(message) {\n alert(message);\n }\n\n function getQueue() {\n return queue;\n }\n\n function translateError(data) {\n var message = \"\";\n if (!!data && !!data.errors) {\n for (var i = 0; i < data.errors.length; i++) {\n message += \"
\" + data.errors[i].message + \"
\";\n }\n }\n if (!!data && !!data.validationErrors) {\n for (var i = 0; i < data.validationErrors.length; i++) {\n message += \"
\"+ data.validationErrors[i].description + \"
\";\n }\n }\n if (!!data && !!data.ValidationErrors) {\n for (var i = 0; i < data.ValidationErrors.length; i++) {\n message += \"
\" + data.ValidationErrors[i].Description + \"
\";\n }\n }\n if (!!data && !!data.title) {\n message += \"
\" + data.title + \"
\";\n }\n return message;\n }\n\n var advertiseCallback = null;\n function registerAdvertiseCallback(callback) {\n advertiseCallback = callback;\n }\n\n function advertiseLogin(urlParams) {\n if (advertiseCallback) {\n $timeout(function () {\n advertiseCallback(urlParams);\n });\n }\n }\n\n return {\n notifyInfo: notifyInfo,\n notifyWarning: notifyWarning,\n notifyError: notifyError,\n fatalNotify: fatalNotify,\n getQueue: getQueue,\n translateError: translateError,\n advertiseLogin: advertiseLogin,\n registerAdvertiseCallback: registerAdvertiseCallback\n }\n }]);","wbApp.factory('onlinePaymentConfigurationSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var OnlinePaymentConfiguration = $resource('/restapi/online-payment-configurations/:id', {}, {\r\n 'get': { method: 'GET', url: '/restapi/online-payment-configurations/:id' },\r\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/online-payment-configurations' },\n 'update': { method: 'PUT', url: '/restapi/online-payment-configurations/:id' },\n 'insert': { method: 'POST', url: '/restapi/online-payment-configurations' },\n 'delete': { method: 'DELETE', url: '/restapi/online-payment-configurations/:id' }\r\n });\n\n var onlinePaymentConfigurations;\n\n\n function insert(model) {\r\n return repositorySvc.customPost(\r\n 'insert',\r\n OnlinePaymentConfiguration,\r\n model);\r\n }\r\n\r\n function remove(id) {\r\n onlinePaymentConfigurations = null;\r\n return repositorySvc.customDelete(\r\n 'delete',\r\n OnlinePaymentConfiguration,\r\n { id: id });\r\n }\r\n\r\n function update(model) {\r\n onlinePaymentConfigurations = null;\r\n return repositorySvc.customPutWithParams(\r\n 'update',\r\n OnlinePaymentConfiguration,\r\n { id: model.id },\r\n model);\r\n }\r\n\r\n function getById(id) {\r\n return repositorySvc.customGet('get', OnlinePaymentConfiguration, { id: id });\r\n }\r\n\r\n function getAll(refresh) {\r\n if (!onlinePaymentConfigurations || refresh) {\r\n onlinePaymentConfigurations = repositorySvc.customGet('getAll', OnlinePaymentConfiguration, {});\r\n }\r\n return onlinePaymentConfigurations;\r\n }\r\n\n\n function createNew() {\r\n return {\r\n id: null,\r\n providerType: 0,\r\n isTestConfig: true,\r\n country: 'CZ',\r\n secret: {\r\n clientCertificateBase64: null,\r\n merchantID: null,\r\n merchantPassword: null\r\n }\r\n };\r\n }\n\n return {\n getAllAsync: getAll,\n getAsync: getById,\n insert: insert,\n update: update,\n remove: remove,\r\n createNew: createNew\r\n }\n\n }]);","wbApp.factory('pricingSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var Pricing = $resource('/restapi/pricing/:id', {}, {\n 'calculateReservationPrice': { method: 'POST', url: '/restapi/pricing/calculate-reservation-price' }\n });\n\n var lastModel = null;\n var lastReturn = null;\n\n // {\n // userId:,\n // studentsIds: [],\n // employeeId:,\n // placeId:,\n // reservationStartDate:,\n // reservationEndDate\n // }\n function calculateReservationPrice(model, skipErrorHandler)\n {\n if (angular.equals(lastModel, model)) {\n return lastReturn;\n }\n\n lastReturn = Pricing['calculateReservationPrice'](\n model,\n function (success) {\n },\n function (error) {\n if (!skipErrorHandler) {\n repositorySvc.defaultErrorHandler(error);\n }\n });\n\n lastModel = model;\n\n return lastReturn;\n }\n\n return {\n calculateReservationPrice: calculateReservationPrice\n }\n }]);\n","'use strict';\n\nwbApp.factory('promotionSvc', ['$q', 'membershipSvc', 'membershipStudentSvc',\n function ($q, membershipSvc, membershipStudentSvc) {\n\n // subjectCategory: 'course' | 'action'\n function getPromotionsByStudentsAsync(userID, students, source, promotionNow, studentPromotionNow, isAdmin) {\n var deferred = $q.defer();\n\n var st = {};\n\n var isCourse = source === 'course';\n var isAction = source === 'action';\n\n var memberships = membershipSvc.getAllValidAsync(promotionNow, /* refresh */ isAdmin);\n var memStudents = membershipStudentSvc.GetByUserValidAsync(userID, studentPromotionNow, /* refresh */ isAdmin);\n memberships.$promise.then(function (memResult) {\n memStudents.$promise.then(function (memStudentsResult) {\n\n _.forEach(students, function (student) {\n\n st[student.studentID] = [];\n _.forEach(memResult, function (mem) {\n var smem = _.find(memStudentsResult, { 'studentID': student.studentID, 'membershipID': mem.id }); \n\n if ((smem && smem.applyToActions && isAction && smem.isValid) ||\n (smem && smem.applyToCourses && isCourse && smem.isValid) ||\n (!smem && mem.applyToActions && isAction) ||\n (!smem && mem.applyToCourses && isCourse)) {\n\n if (mem.isClientAssignable || isAdmin || smem) {\n st[student.studentID].push({\n buy: mem.isMandatory && !smem,\n owns: !!smem,\n isMandatory: mem.isMandatory,\n membershipID: mem.id,\n name: mem.name,\n description: mem.description,\n price: smem != null ? smem.price : mem.price,\n discountPct: smem != null ? smem.discountPct : mem.discountPct,\n validFrom: smem != null ? smem.validFrom : mem.validFrom,\n validTo: smem != null ? smem.validTo : mem.validTo\n });\n }\n }\n });\n \n _.forEach(_.filter(memStudentsResult, { studentID: student.studentID}), function (smem) {\n\n var mem = _.find(memResult, { 'id': smem.membershipID });\n if (!mem && smem.isValid) {\n // student membership with no coresponding membership\n if ((smem.applyToActions && isAction) || (smem.applyToCourses && isCourse)) {\n st[student.studentID].push({\n buy: false,\n owns: true,\n isMandatory: false,\n membershipID: smem.membershipID,\n name: smem.name,\n description: smem.description,\n price: smem.price,\n discountPct: smem.discountPct,\n validFrom: smem.validFrom,\n validTo: smem.validTo\n });\n }\n }\n });\n });\n\n deferred.resolve(st);\n });\n });\n \n st.$promise = deferred.promise;\n return st;\n }\n\n return {\n getPromotionsByStudentsAsync: getPromotionsByStudentsAsync\n }\n }]);\n","'use strict';\n\nwbApp.factory('referenceSourceSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var ReferenceSource = $resource('/Api/ReferenceSource/Get/:id', {}, {\n 'query': { method: 'GET', isArray: true },\n 'insert': { method: 'POST', url: '/Api/ReferenceSource/Insert' },\n 'update': { method: 'POST', url: '/Api/ReferenceSource/Update' },\n 'delete': { method: 'POST', url: '/Api/ReferenceSource/Delete' },\n 'getReferenceSourceTimeDevelopment': { method: 'GET', url: '/Api/ReferenceSource/GetReferenceSourceTimeDevelopment', isArray: false },\n\n });\n\n var referenceSource = null;\n var referenceSourceDict = null;\n\n function getAllAsync(refresh) {\n if (!referenceSource || refresh) {\n referenceSource = repositorySvc.get(ReferenceSource, {});\n referenceSourceDict = null;\n }\n\n return referenceSource;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n ReferenceSource, // $resource\n referenceSource, // collection\n data, // entity\n success,\n errorCallback);\n\n function success(successResult) {\n if (!!referenceSourceDict) {\n referenceSourceDict[successResult.id] = successResult;\n }\n\n if (!!successCallback) {\n successCallback(successResult)\n }\n }\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n ReferenceSource, // $resource\n referenceSource, // collection\n data, // entity\n success,\n errorCallback);\n\n function success(successResult) {\n if (!!referenceSourceDict) {\n referenceSourceDict[successResult.id] = successResult;\n }\n\n if (!!successCallback) {\n successCallback(successResult)\n }\n }\n }\n\n function remove(data, errorCallback) {\n repositorySvc.remove(\n ReferenceSource, // $resource\n referenceSource, // collection\n data, // entity\n success, // successCallback\n errorCallback);\n\n function success() {\n if (!!referenceSourceDict) {\n delete referenceSourceDict[data.id];\n }\n }\n }\n\n function get(id) {\n if (referenceSource) {\n if (!referenceSourceDict) {\n referenceSourceDict = {};\n angular.forEach(referenceSource, function (value, key) {\n this[value.id] = value;\n }, referenceSourceDict);\n }\n\n return referenceSourceDict[id];\n\n } else {\n return null;\n }\n }\n\n function getReferenceSourceTimeDevelopment(fromDate, toDate) {\n var deffered = $q.defer();\n\n var td = repositorySvc.customGet(\n 'getReferenceSourceTimeDevelopment',\n ReferenceSource,\n {\n fromDate: fromDate,\n toDate: toDate\n });\n\n td.$promise.then(function (data) {\n \n var cols = [];\n cols.push({\n id: 'date',\n label: 'Date',\n type: 'date',\n p: {}\n });\n\n for(var i = 0; i < data.referenceSources.length; i++) {\n var rs = data.referenceSources[i];\n cols.push({\n id: 'c_' + i,\n label: rs.name,\n type: 'number',\n p: {}\n });\n }\n\n var rows = [];\n for (var d = 0; d < data.days.length; d++) {\n var day = data.days[d];\n var o = {\n c: [\n { v: day.day }\n ]\n };\n\n for (var c = 0; c < day.counts.length; c++) {\n o.c.push({ v: day.counts[c] });\n }\n\n rows.push(o);\n }\n\n deffered.resolve({\n cols: cols,\n rows: rows\n });\n }, function (reason) {\n deffered.reject(reason);\n });\n\n return deffered.promise;\n }\n\n return {\n getAllAsync: getAllAsync,\n insert: insert,\n update: update,\n remove: remove,\n get: get,\n getReferenceSourceTimeDevelopment: getReferenceSourceTimeDevelopment\n }\n }]);\n","'use strict';\n\nwbApp.factory('repositorySvc', ['$translate', 'notificationSvc',\n function ($translate, notificationSvc) {\n\n function entityInserted(collection, entity) {\n if (collection) {\n collection.push(entity);\n }\n }\n\n function entityRemoved(collection, id, idFieldName) {\n if (!collection) {\n return;\n }\n\n var idf = idFieldName || 'id';\n\n for (var i = 0; i < collection.length; i++) {\n if (collection[i][idf] === id) {\n collection.splice(i, 1);\n break;\n }\n }\n }\n\n function entityUpdated(collection, entity, idFieldName) {\n if (!collection) {\n return;\n }\n\n var idf = idFieldName || 'id';\n\n for (var i = 0; i < collection.length; i++) {\n if (collection[i][idf] === entity[idf]) {\n var target = collection[i];\n\n angular.copy(entity, target);\n\n //for (var k in target) {\n // target[k] = entity[k];\n //}\n\n //for (var y in entity) {\n // target[y] = entity[y];\n //}\n\n break;\n }\n }\n }\n\n function get(res, query, successCallback) {\n return customGet('query', res, query, successCallback);\n }\n\n function customGet(action, res, query, successCallback, errorCallback) {\n return res[action](query, function (successResult) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n }, function (errorResult) {\n if (!!errorCallback) {\n errorCallback(errorResult);\n }\n\n if (errorResult.status === 401) {\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\r\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_GET_ERROR'),\n notificationSvc.translateError(errorResult.data));\r\n }\n });\n\n }\n\n function saveAll(res, data, successCallback, errorCallback) {\n return res.saveAll(data, success, error);\n\n function success(successResult) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_DATA_SAVED'));\n }\n\n function error(errorResult) {\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult.data);\n } else {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_DATA_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n }\n }\n\n function save(res, collection, data, successCallback, errorCallback, idFieldName) {\n return res.save(data, function (successResult) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n\n var idf = idFieldName || 'id';\n\n if (data[idf] <= 0) { // Created\n entityInserted(collection, successResult);\n } else { // Updated\n entityUpdated(collection, successResult, idFieldName);\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_SAVED'));\n }, function (errorResult) {\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult.data);\n } else {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n });\n }\n\n function insert(res, collection, data, successCallback, errorCallback, addToCollection) {\n return res.insert(data, function (successResult) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n\n var updateCache = true;\n if (addToCollection && (typeof addToCollection === \"function\")) {\r\n updateCache = addToCollection(successResult);\r\n }\n\n if (updateCache) {\r\n entityInserted(collection, successResult);\r\n }\n\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_SAVED'));\n }, function (errorResult) {\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult.data);\n } else {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n });\n }\n\n function updateNoNotification(res, collection, data, successCallback, errorCallback, idFieldName) {\r\n return res.update(data, function (successResult) {\r\n if (!!successCallback) {\r\n successCallback(successResult);\r\n }\n entityUpdated(collection, successResult, idFieldName); \r\n }, function (errorResult) {\r\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\r\n if (!!errorCallback) {\r\n errorCallback(errorResult.data);\r\n } else {\r\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\r\n }\r\n }\r\n });\r\n }\n\n function update(res, collection, data, successCallback, errorCallback, idFieldName, disableNotification) {\n return res.update(data, function (successResult) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n entityUpdated(collection, successResult, idFieldName);\n if (!disableNotification) {\r\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_SAVED'));\r\n }\n }, function (errorResult) {\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult.data);\n } else {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n });\n }\n\n function remove(res, collection, data, successCallback, errorCallback, parameters, idFieldName) {\n\n var id = !!idFieldName ? data[idFieldName] : data.id;\n\n return res.delete(parameters ? parameters : { id: id },\n function (successResult) {\n entityRemoved(collection, id, idFieldName);\n if (!!successCallback) {\n successCallback(successResult);\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_REMOVED')); \n }, function (errorResult) {\n // On error\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult);\n } else {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_REMOVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n });\n }\n\n function defaultErrorHandler(errorResult, errorCallback, error_message_id) {\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult.data);\n } else {\n notificationSvc.notifyError(\n $translate.instant(error_message_id || 'TXT_ALERT_TITLE_DATA_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n }\n\n function defaultSuccessSaveHandler(successResult, successCallback) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_SAVED'));\n }\n\n function defaultSuccessRemoveHandler(successResult, successCallback) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_REMOVED'));\n }\n\n function customPost(action, res, data, successCallback, errorCallback, doNotShowSuccessNotification) {\n return res[action](data, function (successResult) {\n if (!!successCallback) {\n successCallback(successResult);\n }\n if (!doNotShowSuccessNotification) {\r\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_CHANGES_SAVED'));\r\n }\n }, function (errorResult) {\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\n if (!!errorCallback) {\n errorCallback(errorResult.data);\n } else {\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_CHANGES_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\n }\n }\n });\n }\n\n function customPostWithParams(action, res, parameters, data, successCallback, errorCallback, doNotShowSuccessNotification) {\r\n return res[action](parameters, data, function (successResult) {\r\n if (!!successCallback) {\r\n successCallback(successResult);\r\n }\n if (!doNotShowSuccessNotification) {\r\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_CHANGES_SAVED'));\r\n }\r\n }, function (errorResult) {\r\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\r\n if (!!errorCallback) {\r\n errorCallback(errorResult.data);\r\n } else {\r\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_CHANGES_SAVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\r\n }\r\n }\r\n });\r\n }\n\n function customPutWithParams(action, res, parameters, postData, successCallback, errorCallback) {\r\n return res[action](parameters, postData, function (successResult) {\r\n if (!!successCallback) {\r\n successCallback(successResult);\r\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_CHANGES_SAVED'));\r\n }, function (errorResult) {\r\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\r\n if (!!errorCallback) {\r\n errorCallback(extractErrorData(errorResult));\r\n } else {\r\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_CHANGES_SAVE_ERROR'),\n notificationSvc.translateError(extractErrorData(errorResult)));\r\n }\r\n }\r\n });\r\n }\n\n function customDelete(action, res, parameters, successCallback, errorCallback) {\r\n return res[action](parameters, function (successResult) {\r\n if (!!successCallback) {\r\n successCallback(successResult);\r\n }\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_ENTITY_REMOVED'));\r\n }, function (errorResult) {\r\n if (errorResult.status === 401) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_UNAUTHORIZED'));\r\n } else if (errorResult.status === 403) {\r\n notificationSvc.fatalNotify(\n $translate.instant('TXT_ALERT_TITLE_FORBIDEN'));\r\n } else {\r\n if (!!errorCallback) {\r\n errorCallback(errorResult.data);\r\n } else {\r\n notificationSvc.notifyError(\n $translate.instant('TXT_ALERT_TITLE_ENTITY_REMOVE_ERROR'),\n notificationSvc.translateError(errorResult.data));\r\n }\r\n }\r\n });\r\n }\n\n\n function extractErrorData(error) {\r\n if (!!error && !!error.title) {\r\n return {\r\n message: error.title\r\n };\r\n }\r\n\r\n return error.data;\r\n }\n\n return {\n save: save,\n saveAll: saveAll,\n insert: insert,\n update: update,\n remove: remove,\n get: get,\n customGet: customGet,\n entityInserted: entityInserted,\n entityRemoved: entityRemoved,\n entityUpdated: entityUpdated,\n defaultErrorHandler: defaultErrorHandler,\n defaultSuccessSaveHandler: defaultSuccessSaveHandler,\n defaultSuccessRemoveHandler: defaultSuccessRemoveHandler,\n customPost: customPost,\n customPostWithParams: customPostWithParams,\n customPutWithParams: customPutWithParams,\n customDelete: customDelete,\n extractErrorData: extractErrorData\n }\n\n }\n]);","wbApp.factory('reservationsSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var Reservation = $resource('/restapi/reservations/:id', {}, {\n 'insert': { method: 'POST', url: '/restapi/reservations' },\n 'update': { method: 'PUT', url: '/restapi/reservations/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/reservations/:id' },\n 'getAllByRangeAndPlace': { method: 'GET', isArray: true, url: '/restapi/reservations/range/find-by-place' },\n 'getAllByRangeAndUser': { method: 'GET', isArray: true, url: '/restapi/reservations/range/find-by-user' },\n 'getAllByRangeAndStudent': { method: 'GET', isArray: true, url: '/restapi/reservations/range/find-by-student' },\n 'getByInvoice': { method: 'GET', isArray: false, url: '/restapi/reservations/find-by-invoice' }\n });\n\n function insert(model) {\n lastLoadedRangeAndPlace = null;\n\n return repositorySvc.customPost(\n 'insert',\n Reservation,\n model);\n }\n\n function remove(reservationId) {\n lastLoadedRangeAndPlace = null;\n\n return repositorySvc.customDelete(\n 'delete',\n Reservation,\n { id: reservationId });\n }\n\n function update(model) {\n lastLoadedRangeAndPlace = null;\n\n return repositorySvc.customPutWithParams(\n 'update',\n Reservation,\n { id: model.id },\n model);\n }\n\n function getAllByRangeAndUser(userId, fromDate, toDate, employees) {\n return $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getAllByRangeAndUser',\n Reservation,\n {\n userId: userId,\n from: fromDate,\n to: toDate\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(_.map(data, function (r) {\n\n var employee = _.find(employees, { id: r.employeeId });\n\n return {\n startDate: r.reservationStartDate,\n endDate: r.reservationEndDate,\n placeId: r.placeId,\n teacherName: !!employee\n ? employee.fullName\n : '',\n filledCapacity: r.studentIds.length + '',\n subject: r.domain.name\n }\n }));\n },\n function (error) {\n reject(error);\n });\n });\n }\n\n var lastLoadedRangeAndPlace = null;\n var lastLoadedRangeAndPlaceFilter = {\n placeId: null,\n fromDate: null,\n toDate: null\n };\n\n function getAllByRangeAndPlace(placeId, fromDate, toDate) \n {\n var mnow = moment();\n\n if (!lastLoadedRangeAndPlace ||\n lastLoadedRangeAndPlaceFilter.placeId != placeId ||\n !moment(lastLoadedRangeAndPlaceFilter.fromDate).isSame(fromDate) ||\n !moment(lastLoadedRangeAndPlaceFilter.toDate).isSame(toDate) ||\n lastLoadedRangeAndPlaceFilter.loadedAt.isBefore(mnow)) {\n\n lastLoadedRangeAndPlaceFilter = {\n placeId: placeId,\n fromDate: fromDate,\n toDate: toDate,\n loadedAt: moment().add(10, 'seconds')\n };\n\n lastLoadedRangeAndPlace = $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getAllByRangeAndPlace',\n Reservation,\n {\n expanded: 'Students,Invoices',\n placeId: placeId,\n from: fromDate,\n to: toDate\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(data);\n },\n function (error) {\n reject(error);\n });\n });\n }\n\n return lastLoadedRangeAndPlace;\n }\n\n function getAllByRangeAndStudent(studentId, fromDate, toDate) {\n return $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getAllByRangeAndStudent',\n Reservation,\n {\n expanded: 'Invoices',\n studentId: studentId,\n from: fromDate,\n to: toDate\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(data);\n },\n function (error) {\n reject(error);\n });\n });\n }\n\n function getByInvoice(invoiceId)\n {\n return $q(function (resolve, reject) {\n var getResult = repositorySvc.customGet(\n 'getByInvoice',\n Reservation,\n {\n expanded: 'Invoices',\n invoiceId: invoiceId\n });\n\n getResult.$promise.then(\n function (data) {\n resolve(data);\n },\n function (error) {\n reject(error);\n });\n });\n\n }\n\n return {\n insert: insert,\n remove: remove,\n update: update,\n getAllByRangeAndUser: getAllByRangeAndUser,\n getAllByRangeAndPlace: getAllByRangeAndPlace,\n getAllByRangeAndStudent: getAllByRangeAndStudent,\n getByInvoice: getByInvoice\n }\n }]);\n","'use strict';\n\nwbApp.factory('securitySvc', ['$http', '$q', '$translate',\n function ($http, $q, $translate) {\n var sf = securityFeatures;\n var user = loggedInUser;\n var signInInProgress = false;\n \n var sfDict = {};\n\n for (var i = 0; i < sf.length; i++) {\n sfDict[sf[i]] = true;\n }\n\n return {\n isInRole: function (role) {\n if (angular.isArray(role)) {\n for (var r = 0; r < role.length; r++) {\n var er = role[r];\n if (sfDict[er]) {\n return true;\n }\n }\n return false;\n } else {\n if (sfDict[role]) {\n return true;\n } else {\n return false;\n }\n }\n },\n\n isAuthenticated: function () {\n return user.isAuthenticated;\n },\n\n loggedInUser: function () {\n if (!user.isAuthenticated) {\n return {};\n } else {\n return user;\n }\n },\n \n idTokenRefreshed: function(firebaseUser) {\n // if (!signInInProgress) {\n // if (firebaseUser) {\n // firebaseUser.getIdToken().then(function (token) {\n // $http({\n // method: 'POST',\n // url: '/login/signin',\n // headers: {\n // 'Authorization': `Bearer ${token}`\n // },\n // });\n // });\n // } else {\n // $http.post('/login/logout');\n // }\n // }\n },\n \n passwordValidationRegEx: function() {\n return /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9_!@#$%^&*+=\\-'\\[\\]\";~,\\.><]{8,40}$/;\n },\n \n signIn: function(email, password) {\n return $q(function (resolve, reject) {\n signInInProgress = true;\n \n firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE).then(function () {\n firebase.auth().signInWithEmailAndPassword(email, password).then(function (userCredential) {\n if (!userCredential.user.emailVerified) {\n reject({\n code: 'wb/user-email-not-verified',\n message: 'User email is not verified.'\n });\n } else {\n userCredential.user.getIdToken().then(function (token) {\n $http({\n method: 'POST',\n url: '/login/signin',\n headers: {\n 'Authorization': `Bearer ${token}`\n },\n }).success(resolve).error(reject);\n });\n }\n })\n .catch(function (error) {\n reject(error);\n });\n })\n .catch(function (error) {\n reject(error);\n });\n });\n },\n\n createUserWithEmailAndPassword: function(email, password) {\n return $q(function (resolve, reject) {\n firebase.auth().createUserWithEmailAndPassword(email, password).then(function (userCredential) {\n resolve(userCredential);\n })\n .catch(function (error) {\n reject(error);\n });\n });\n },\n\n sendEmailVerificationAuthorizationCode: function(email) {\n return $q(function (resolve, reject) {\n $http({\n method: 'POST',\n url: '/restapi/account/email-verification/send-otp',\n data: { Email: email },\n headers: {\n 'x-sec-api-key': 'sdPTPs3XHzB5Fa7KqcK928RN9Rm9zdE97nt3t4r5'\n },\n }).success(resolve).error(reject);\n });\n },\n \n sendPasswordResetAuthorizationCode: function(email) {\n return $q(function (resolve, reject) {\n $http({\n method: 'POST',\n url: '/restapi/account/password-reset/send-otp',\n data: { Email: email },\n headers: {\n 'x-sec-api-key': 'sdPTPs3XHzB5Fa7KqcK928RN9Rm9zdE97nt3t4r5'\n }, \n }).success(resolve).error(reject);\n });\n },\n \n confirmPasswordReset: function(email, password, otp) {\n return $q(function (resolve, reject) {\n $http({\n method: 'POST',\n url: '/restapi/account/password-reset/validate-otp',\n data: { Email: email, Otp: otp },\n headers: {\n 'x-sec-api-key': 'sdPTPs3XHzB5Fa7KqcK928RN9Rm9zdE97nt3t4r5'\n },\n }).success(function(success) {\n firebase.auth().confirmPasswordReset(success.oobCode, password).then(function () {\n resolve();\n })\n .catch(function (error) {\n reject(error);\n });\n }).error(reject);\n });\n },\n\n confirmEmailVerification: function(email, otp) {\n return $q(function (resolve, reject) {\n $http({\n method: 'POST',\n url: '/restapi/account/email-verification/validate-otp',\n data: { Email: email, Otp: otp },\n headers: {\n 'x-sec-api-key': 'sdPTPs3XHzB5Fa7KqcK928RN9Rm9zdE97nt3t4r5'\n },\n }).success(function(success) {\n console.log(success);\n firebase.auth().applyActionCode(success.oobCode).then(function () {\n resolve();\n })\n .catch(function (error) {\n reject(error);\n });\n }).error(reject);\n });\n },\n\n gcpErrorCodeToText: function(error, verify) {\n if (!error) {\n if (verify) {\n return $translate.instant('TXT_OTP_VERIFY_BUSY');\n } else {\n return $translate.instant('TXT_OTP_GENERATE_BUSY');\n }\n } else if (!!error.title && error.title.includes(\"One time password does not exist or is expired.\")) {\n return $translate.instant('TXT_OTP_DOES_NOT_EXIST');\n } else if (!!error.title) {\n return error.title;\n } else if (!!error.code) {\n switch (error.code) {\n case 'auth/wrong-password':\n return $translate.instant('TXT_LOGIN_ERROR_WRONG_PASSWORD');\n case 'auth/user-not-found':\n return $translate.instant('TXT_LOGIN_ERROR_USER_NOT_FOUND');\n case 'auth/too-many-requests':\n case 'auth/user-disabled':\n return $translate.instant('TXT_LOGIN_ERROR_USER_DISABLED');\n case 'auth/invalid-email':\n return $translate.instant('TXT_LOGIN_ERROR_INVALID_EMAIL');\n case 'auth/email-already-in-use':\n return $translate.instant('TXT_EMAIL_IN_USE');\n case 'auth/weak-password':\n return $translate.instant('TXT_WEAK_PASSWORD');\n case 'auth/expired-action-code':\n return error.message;\n case 'auth/invalid-action-code':\n return error.message;\n default:\n return error.message;\n }\n } else {\n return \"Unexpected error\";\n }\n }, \n\n adminLogout: function () {\n firebase.auth().signOut().then(function() {\n $http({\n method: 'POST',\n url: '/Login/Logout'\n }).success(function (data) {\n window.location = '/NgAdmin';\n });\n });\n }, \n\n logout: function () {\n firebase.auth().signOut().then(function() {\n $http({\n method: 'POST',\n url: '/Login/Logout'\n }).success(function (data) {\n window.location = '/';\n });\n });\n },\n\n roles: sfDict\n }\n }]);","'use strict';\n\nwbApp.factory('semesterSvc', ['$resource', '$q', 'localStorageService', 'repositorySvc',\n function ($resource, $q, localStorageService, repositorySvc) {\n\n var Semester = $resource('/Api/Semesters/Get/:id', { openForRegistrationOnly: false }, {\n 'courseSummary': { method: 'GET', isArray: false, url: '/Api/Semesters/GetCourseSummary', params: {} },\n 'insert': { method: 'POST', url: '/Api/Semesters/Insert' },\n 'update': { method: 'POST', url: '/Api/Semesters/Update' },\n 'delete': { method: 'POST', url: '/Api/Semesters/Delete' }\n });\n\n var semesters = null;\n\n function newModel() {\n let semester = new Semester();\n semester.active = true;\n semester.showInCourses = true;\n semester.showInKindergarten = true;\n semester.isMain = false;\n return semester;\n }\n\n function sortSemestersIsMainFirst(semesters) {\n return _.orderBy(semesters, function (n) {\n if (n.active) {\n return new Date(1970, 0, 1);\n }\n return n.startDate;\n }, false);\n }\n \n function getAllAsync(refresh) {\n if (!semesters || refresh) {\n semesters = repositorySvc.get(Semester, {});\n }\n return semesters;\n }\n\n function getAllActiveAsync() {\n let result = [];\n\n result.$promise = $q(function (resolve, reject) {\n let all = getAllAsync();\n\n all.$promise.then(function () {\n result.push.apply(result,\n _.filter(all, 'active'));\n resolve(result);\n }, reject);\n });\n\n return result;\n }\n\n function getAllOpenForRegistrationAsync() {\n var result = [];\n\n result.$promise = $q(function (resolve, reject) {\n var all = getAllAsync();\n\n all.$promise.then(function () {\n result.push.apply(result,\n sortSemestersIsMainFirst(_.filter(all, function(s) {\n return (s.openForRegistration || s.preferredBookingEffectiveIsActive) && s.showInCourses;\n })));\n resolve(result);\n }, reject);\n });\n\n return result;\n }\n\n function getAllShowInAttendanceAsync() {\n var result = [];\n\n result.$promise = $q(function (resolve, reject) {\n var all = getAllAsync();\n\n all.$promise.then(function () {\n result.push.apply(result,\n sortSemestersIsMainFirst(_.filter(all, { showInAttendance: true, showInCourses: true })));\n resolve(result);\n }, reject);\n });\n\n return result;\n }\n\n function setDefault(semesterID) {\n if (localStorageService.isSupported && !!semesterID) {\n localStorageService.set('defaultSemesterID', semesterID);\n }\n }\n\n function getDefaultAsync() {\n var sem = getAllAsync();\n var deferred = $q.defer();\n\n var defaultSemesterID = null;\n \n if(localStorageService.isSupported) {\n defaultSemesterID = localStorageService.get('defaultSemesterID');\n }\n\n sem.$promise.then(function () {\n for (var i = 0; i < sem.length; i++) {\n var s = sem[i];\n if (!!defaultSemesterID) {\n if (s.id == defaultSemesterID) {\n deferred.resolve(sem[i]);\n return;\n }\n } else if (s.active) {\n deferred.resolve(sem[i]);\n return;\n }\n }\n\n if (sem.length > 0) {\n deferred.resolve(sem[0]);\n return;\n }\n\n deferred.resolve(null);\n });\n\n return deferred.promise;\n }\n\n function getActiveAsync() {\n var sem = getAllAsync();\n\n var deferred = $q.defer();\n\n sem.$promise.then(function () {\n for (var i = 0; i < sem.length; i++) {\n var s = sem[i];\n if (s.active) {\n deferred.resolve(sem[i]);\n return;\n }\n }\n\n if (sem.length > 0) {\n deferred.resolve(sem[0]);\n return;\n }\n\n deferred.resolve(null);\n });\n\n return deferred.promise;\n }\n\n\n function get(id) {\n if (semesters) {\n for (var i = 0; i < semesters.length; i++) {\n var sc = semesters[i];\n if (sc.id == id) {\n return sc;\n }\n }\n }\n return null;\n }\n\n function getAsync(id) {\n var deferred = $q.defer();\n\n getAllAsync().$promise.then(function (sem) {\n angular.forEach(sem, function (value, key) {\n if (value.id == id) {\n deferred.resolve(value);\n return;\n }\n })\n deferred.resolve(null);\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n return deferred.promise;\n }\n\n function getCourseSummaryAsync(id) {\n return Semester.courseSummary({ semesterID: id });\n }\n\n function insert(data, successCallback, errorCallback) {\n return repositorySvc.insert(\n Semester, // $resource\n semesters, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, successCallback, errorCallback) {\n return repositorySvc.update(\n Semester, // $resource\n semesters, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'id');\n }\n\n function remove(data, errorCallback) {\n return repositorySvc.remove(\n Semester, // $resource\n semesters, // collection\n data, // entity\n null, // successCallback\n errorCallback,\n null,\n 'id');\n }\n\n\n return {\n newModel: newModel,\n getAllAsync: getAllAsync,\n getActiveAsync: getActiveAsync,\n get: get,\n getAsync: getAsync,\n getCourseSummaryAsync: getCourseSummaryAsync,\n getDefaultAsync: getDefaultAsync,\n setDefault: setDefault,\n getAllOpenForRegistrationAsync: getAllOpenForRegistrationAsync,\n getAllShowInAttendanceAsync: getAllShowInAttendanceAsync,\n insert: insert,\n update: update,\n remove: remove,\n getAllActiveAsync: getAllActiveAsync\n }\n\n }]);","'use strict';\n\nwbApp.factory('studentSvc', ['$resource', 'repositorySvc', 'tenantSettingSvc',\n function ($resource, repositorySvc, tenantSettingSvc) {\n var Student = $resource('/Api/Students/:id', {}, {\n 'getAll': { method: 'GET', isArray: true, url: '/Api/Students/GetAll' },\n 'getCurrent': { method: 'GET', isArray: true, url: '/Api/Students/GetCurrent' },\n 'getAllByUserID': { method: 'GET', isArray: true, url: '/Api/Students/GetAllByUserID' },\n 'saveAll': { method: 'POST', isArray: true, url: '/Api/Students/SaveCurrent' },\n 'insert': { method: 'POST', url: '/Api/Students/Insert' },\n 'update': { method: 'POST', url: '/Api/Students/Update' },\n 'delete': { method: 'POST', url: '/Api/Students/Delete' },\n 'getByID': { method: 'GET', url: '/Api/Students/GetLookupID' },\n 'getStudentsWithCompGrpLookupQuery': { method: 'GET', isArray: true, url: '/Api/Students/GetStudentsWithCompGrpLookupQuery' },\n 'getStudentsWithCompGrpLookupID': { method: 'GET', url: '/Api/Students/GetStudentsWithCompGrpLookupID' }\n });\n\n function createNew(user) {\n\n var nationality;\n\n if (!!user && user.nationality) {\n nationality = user.nationality;\n } else {\n nationality = tenantSettingSvc.settings.defaultNationality;\n }\n\n return {\n gender: 'M',\n userID: !!user ? user.id : null,\n isNew: true,\n nationality: nationality\n };\n }\n\n function getAll() {\n var ret = repositorySvc.customGet('getAll', Student);\n\n ret.$promise.then(function (data) {\n _.forEach(data, function (student) {\n student.rfidCardIDsStr = _.join(student.rfidCardIDs, ', ')\n });\n });\n\n return ret;\n }\n\n function getStudentsWithCompGrpLookupQuery(query, pageSize, pageNo, semesterID, onSuccess, onError) {\n return repositorySvc.customGet('getStudentsWithCompGrpLookupQuery', Student, {\n query: query,\n pageSize: pageSize,\n pageNo: pageNo,\n semesterID: semesterID\n }, onSuccess, onError);\n }\n\n function getStudentsWithCompGrpLookupID(studentCompGrpID, semesterID, onSuccess, onError) {\n return repositorySvc.customGet('getStudentsWithCompGrpLookupID', Student, {\n studentCompGrpID: studentCompGrpID,\n semesterID: semesterID\n }, onSuccess, onError);\n }\n\n function getCurrentAsync() {\n return repositorySvc.customGet('getCurrent', Student);\n }\n\n function saveAll(data, successCallback, errorCallback) {\n return repositorySvc.saveAll(\n Student, // $resource\n data, // entities\n successCallback,\n errorCallback);\n }\n\n function getByIDAsync(studentId) {\n return repositorySvc.customGet('getByID', Student, { studentID: studentId });\n }\n\n var byUserID;\n var lasUserID;\n\n function getAllByUserIDAsync(userID, refresh) {\n if (!byUserID || lasUserID !== userID || refresh) {\n byUserID = repositorySvc.customGet('getAllByUserID', Student, { userID: userID });\n lasUserID = userID;\n }\n\n return byUserID;\n }\n\n function insert(data, successCallback, errorCallback, collection) {\n return repositorySvc.insert(\n Student, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, successCallback, errorCallback, collection, disableNotification) {\n return repositorySvc.update(\n Student, // $resource\n collection, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'id',\n disableNotification);\n }\n\n function remove(data, errorCallback, collection) {\n return repositorySvc.remove(\n Student, // $resource\n collection, // collection\n data, // entity\n null, // successCallback\n errorCallback,\n { studentID: data.id, membershipID: data.membershipID });\n }\n\n return {\n createNew: createNew,\n getAll: getAll,\n getCurrentAsync: getCurrentAsync,\n getAllByUserIDAsync: getAllByUserIDAsync,\n saveAll: saveAll,\n insert: insert,\n update: update,\n remove: remove,\n getByIDAsync: getByIDAsync,\n getStudentsWithCompGrpLookupQuery: getStudentsWithCompGrpLookupQuery,\n getStudentsWithCompGrpLookupID: getStudentsWithCompGrpLookupID\n }\n }]);","wbApp.factory('subjectsSvc', ['$resource', '$q', 'repositorySvc', 'tenantInfoSvc',\n function ($resource, $q, repositorySvc, tenantInfoSvc) {\n var Subject = $resource('/Api/Subjects/GetAll', {}, {\n 'query': { method: 'GET', isArray: true },\n 'update': { method: 'POST', url: '/Api/Subjects/Update' },\n 'insert': { method: 'POST', url: '/Api/Subjects/Insert' },\n 'delete': { method: 'POST', url: '/Api/Subjects/Delete' },\n 'getAllFranchiseCentralCourseSubjects': { method: 'GET', url: '/Api/Subjects/getAllFranchiseCentralCourseSubjects', isArray: true },\n 'getAllActiveFranchiseSubjects': { method: 'GET', url: '/Api/Subjects/getAllActiveFranchiseSubjects', isArray: true },\n });\n\n var subjects;\n var subjectsForCourses;\n var subjectsForActions;\n\n function createNew(subjectCategoryID) {\n return {\n id: 0,\n name: \"\",\n description: \"\",\n subjectCategoryID: subjectCategoryID || 1,\n isNew: true\n };\n }\n\n function getAllWithActiveFranchiesesAsync(reload, subjectIDtoInclude) {\n\n var sIDs = !!subjectIDtoInclude ? subjectIDtoInclude : 0;\n\n var allSubjects = getAllForCoursesAsync(reload);\n var filteredSubjects = []; \n\n var deffered = $q.defer();\n filteredSubjects.$promise = deffered.promise;\n\n allSubjects.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n // franchiseCentralTenantID\n\n var include = false;\n\n if (!!value.franchiseCentralTenantID) {\n include =\n (!!_.filter(tenantInfoSvc.info.franchiseCentrals, { tenantID: value.franchiseCentralTenantID, isActive: true }).length) ||\n (value.id === sIDs);\n } else {\n include = true;\n }\n\n if (include) {\n filteredSubjects.push(value);\n }\n });\n deffered.resolve(filteredSubjects);\n }, function (reason) {\n deffered.reject(reason);\n });\n\n return filteredSubjects;\n }\n\n function getAllAsync(reload) {\n if (!subjects || reload) {\n subjects = repositorySvc.get(Subject, {});\n }\n return subjects;\n }\n\n function getAllBySubjectCategory(subjectCategoryID, reload) {\n var allSubjects = getAllAsync(reload);\n var filteredSubjects = [];\n\n var deffered = $q.defer();\n filteredSubjects.$promise = deffered.promise;\n\n allSubjects.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if (value.subjectCategoryID === subjectCategoryID) {\n filteredSubjects.push(value);\n }\n });\n deffered.resolve(filteredSubjects);\n }, function (reason) {\n deffered.reject(reason);\n });\n\n return filteredSubjects;\n }\n\n function getAllForCoursesAsync(reload) {\n if (!subjectsForCourses || reload) {\n subjectsForCourses = getAllBySubjectCategory(1, reload);\n }\n return subjectsForCourses;\n }\n\n function getAllForActionsAsync(reload) {\n if (!subjectsForActions || reload) {\n subjectsForActions = getAllBySubjectCategory(2, reload);\n }\n\n return subjectsForActions;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n Subject, // $resource\n subjects, // collection\n data, // entity\n success,\n errorCallback);\n\n function success(entity) {\n if (entity.subjectCategoryID === 1) {\n repositorySvc.entityInserted(subjectsForCourses, entity);\n }\n\n if (entity.subjectCategoryID === 2) {\n repositorySvc.entityInserted(subjectsForActions, entity);\n }\n\n if (successCallback) {\n successCallback(entity);\n }\n }\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n Subject, // $resource\n subjects, // collection\n data, // entity\n success,\n errorCallback);\n\n function success(entity) {\n\n if (entity.subjectCategoryID === 1) {\n repositorySvc.entityUpdated(subjectsForCourses, entity);\n }\n\n if (entity.subjectCategoryID === 2) {\n repositorySvc.entityUpdated(subjectsForActions, entity);\n }\n\n if (successCallback) {\n successCallback(entity);\n }\n }\n }\n\n function remove(data, errorCallback) {\n repositorySvc.remove(\n Subject, // $resource\n subjects, // collection\n data, // entity\n success, // successCallback\n errorCallback);\n\n function success() {\n if (data.subjectCategoryID === 1) {\n repositorySvc.entityRemoved(subjectsForCourses, data.id);\n }\n\n if (data.subjectCategoryID === 2) {\n repositorySvc.entityRemoved(subjectsForActions, data.id);\n }\n }\n }\n\n function getAllFranchiseCentralCourseSubjects(franchiseCentralTenantID, refresh) {\n\n return repositorySvc.customGet(\n 'getAllFranchiseCentralCourseSubjects',\n Subject,\n {\n franchiseCentralTenantID: franchiseCentralTenantID\n });\n }\n\n function getFranchiseCentralSubject(franchiseCentralTenantID, franchiseCentralSubjectID) {\n var deffered = $q.defer();\n var frs = getAllFranchiseCentralCourseSubjects(franchiseCentralTenantID);\n frs.$promise.then(function (data) {\n var subject = _.find(data, { 'id': franchiseCentralSubjectID });\n deffered.resolve(subject);\n }, function (error) {\n deffered.reject(error);\n });\n\n return deffered.promise;\n }\n\n function getAllActiveFranchiseSubjects()\n {\n return repositorySvc.customGet(\n 'getAllActiveFranchiseSubjects',\n Subject,\n {});\n }\n\n return {\n getAllFranchiseCentralCourseSubjects: getAllFranchiseCentralCourseSubjects,\n getFranchiseCentralSubject: getFranchiseCentralSubject,\n getAllAsync: getAllAsync,\n getAllForCoursesAsync: getAllForCoursesAsync,\n getAllForActionsAsync: getAllForActionsAsync,\n getAllWithActiveFranchiesesAsync: getAllWithActiveFranchiesesAsync,\n insert: insert,\n update: update,\n remove: remove,\n createNew: createNew,\n getAllActiveFranchiseSubjects: getAllActiveFranchiseSubjects\n }\n }\n]);\n","'use strict';\n\nwbApp.factory('surveySvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var Survey = $resource('/Api/Surveys/GetAll', {}, {\n 'query': { method: 'GET', isArray: true },\n 'insert': { method: 'POST', url: '/Api/Surveys/Insert' },\n 'update': { method: 'POST', url: '/Api/Surveys/Update' },\n 'delete': { method: 'POST', url: '/Api/Surveys/Delete' },\n\n });\n\n var surveys;\n\n function newModel() {\n var survey = new Survey();\n survey.active = true;\n survey.isDefault = false;\n survey.maxContactsPerClient = 3;\n survey.surveyQuestions = [newQuestion()];\n return survey;\n }\n\n function newQuestion() {\n return {\n surveyQuestionTypeID: 1,\n allowCustomNote: true,\n weight: 100\n };\n }\n\n function getAllAsync() {\n if (!surveys) {\n surveys = repositorySvc.get(Survey, {});\n }\n return surveys;\n }\n\n function getDefaultAsync() {\n var all = getAllAsync();\n\n return $q(function (resolve, reject) {\n all.$promise.then(function (data) {\n resolve(_.find(data, { isDefault: true, active: true, isDeleted: false }));\n }, function (reason) {\n reject(reason);\n });\n });\n }\n\n function getAllNonDeleted(refresh) {\n var models = getAllAsync(refresh);\n var filteredModels = [];\n\n var deferred = $q.defer();\n filteredModels.$promise = deferred.promise;\n\n models.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if (!value.isDeleted) {\n filteredModels.push(value);\n }\n });\n deferred.resolve(filteredModels);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filteredModels;\n }\n\n function getAllActiveAsync(IDtoInclude) {\n var models = getAllAsync();\n var filteredModels = [];\n\n var deferred = $q.defer();\n filteredModels.$promise = deferred.promise;\n\n models.$promise.then(function (data) {\n angular.forEach(data, function (value, key) {\n if ((!value.isDeleted && value.active) || value.surveyID === IDtoInclude) {\n filteredModels.push(value);\n }\n });\n deferred.resolve(filteredModels);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return filteredModels;\n }\n\n function insert(data, successCallback, errorCallback) {\n repositorySvc.insert(\n Survey, // $resource\n surveys, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, successCallback, errorCallback) {\n repositorySvc.update(\n Survey, // $resource\n surveys, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'surveyID');\n }\n\n function remove(data, errorCallback) {\n return repositorySvc.remove(\n Survey, // $resource\n surveys, // collection\n data, // entity\n null, // successCallback\n errorCallback,\n null,\n 'surveyID');\n }\n\n return {\n newModel: newModel,\n getAllAsync: getAllAsync,\n getAllNonDeleted: getAllNonDeleted,\n getAllActiveAsync: getAllActiveAsync,\n insert: insert,\n update: update,\n remove: remove,\n newQuestion: newQuestion,\n getDefaultAsync: getDefaultAsync\n }\n }\n]);","'use strict';\n\nwbApp.factory('tenantInfoSvc', [\n function () {\n var data = tenantInfo;\n\n return {\n info: data\n }\n }]);","wbApp.factory('tenantSettingSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var TenantSetting = $resource('/Api/TenantSettings/:id', {}, {\n 'get': { method: 'GET', isArray: false, url: '/Api/TenantSettings/Get' },\n 'update': { method: 'POST', url: '/Api/TenantSettings/Update' },\n 'triggerPortalUpdate': { method: 'POST', url: '/Api/TenantSettings/TriggerPortalUpdate' },\n });\n\n var data = tenantSetting;\n var syncData = true;\n\n function getAsync() {\n var deferred = null;\n\n\n if (syncData) {\n if (!data.$promise) {\n deferred = $q.defer();\n data.$promise = deferred.promise;\n deferred.resolve(data); \n }\n\n return data;\n }\n\n deferred = $q.defer();\n data = {};\n data.$promise = deferred.promise;\n\n repositorySvc.customGet('get', TenantSetting, {}, function (d) {\n angular.extend(data, d);\n syncData = true;\n deferred.resolve(data);\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n return data;\n }\n\n function update(d, successCallback, errorCallback) {\n syncData = false;\n\n function success(d) {\n angular.extend(data, d);\n syncData = true;\n\n if (!!successCallback) {\n successCallback(d);\n }\n }\n\n repositorySvc.update(\n TenantSetting, // $resource\n null, // collection\n d, // entity\n success,\n errorCallback);\n }\n\n function triggerPortalUpdate() {\r\n return $q(function (resolve, reject) {\r\n repositorySvc.customPost(\n 'triggerPortalUpdate',\n TenantSetting,\r\n {},\n resolve,\n reject\n )\r\n });\r\n }\n\n\n return {\n settings: data,\n isCourseRegistrationNotificationEnabled: function() {\n return data.sendEmailsToClients &&\n !data.disableAllEmails &&\n !data.disableAllEmailsExceptUserRegistration &&\n data.enableStudentCourseRegistrationNotification;\n },\n isFullCourseInterestNotificationEnabled: function () {\r\n return data.sendEmailsToClients &&\n !data.disableAllEmails &&\n !data.disableAllEmailsExceptUserRegistration &&\n data.enableFullCourseInterestNotification;\r\n },\n getAsync: getAsync,\n update: update,\n triggerPortalUpdate: triggerPortalUpdate\n }\n }]);","wbApp.factory('terminalSvc', ['$resource', '$q', 'repositorySvc', 'localStorageService', 'securitySvc',\n function ($resource, $q, repositorySvc, localStorageService, securitySvc) {\n\n var Terminal = $resource('/Api/Terminals/:id', {}, {\r\n 'getAll': { method: 'GET', isArray: true, url: '/Api/Terminals/GetAll' },\n 'update': { method: 'POST', url: '/Api/Terminals/Update' },\n 'insert': { method: 'POST', url: '/Api/Terminals/Insert' },\n 'delete': { method: 'POST', url: '/Api/Terminals/Delete' }\r\n });\n\n var terminals;\n var terminalSetting = null;\n\n function getAllAsync(refresh) {\r\n\r\n if (!terminals || refresh) {\r\n terminals = repositorySvc.customGet('getAll', Terminal);\r\n }\r\n\r\n return terminals;\r\n }\n\n\n function insert(data, successCallback, errorCallback) {\r\n repositorySvc.insert(\n Terminal, // $resource\n terminals, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'terminalID');\r\n }\n\n\n function update(data, successCallback, errorCallback) {\r\n repositorySvc.update(\n Terminal, // $resource\n terminals, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'terminalID');\r\n }\n\n function remove(data, successCallback, errorCallback) {\r\n repositorySvc.remove(\n Terminal, // $resource\n terminals, // collection\n { terminalID: data.terminalID }, // entity\n successCallback,\n errorCallback,\n {\r\n terminalID: data.terminalID\r\n },\n 'terminalID');\r\n }\n\n function createNew() {\r\n return {\r\n terminalID: 0,\r\n fromAge: 0,\r\n toAge: 199,\r\n buildIn: false\r\n };\r\n }\n\n function getTerminalSetting() {\r\n var deferred = $q.defer();\r\n\r\n if (!terminalSetting) {\r\n terminalSetting = {\r\n terminalID: null,\r\n isDisabled: true,\r\n isRequired: false,\r\n isVisible: false,\r\n $promise: deferred.promise\r\n };\r\n }\r\n\r\n var terminals = getAllAsync();\r\n terminals.$promise.then(function (data) {\r\n terminalSetting.isVisible = data.length > 0;\r\n terminalSetting.isRequired = data.length > 0;\r\n terminalSetting.isDisabled = data.length <= 1 || !securitySvc.isInRole('Terminal.Select');\r\n if (data.length === 1) {\r\n terminalSetting.terminalID = data[0].terminalID;\r\n } else {\r\n var storedTerminalID = localStorageService.get('wb_terminalID');\r\n if (!!storedTerminalID) {\r\n if (!!_.find(data, { terminalID: storedTerminalID })) {\r\n terminalSetting.terminalID = storedTerminalID;\r\n }\r\n else {\r\n localStorageService.remove('wb_terminalID');\r\n }\r\n }\r\n }\r\n deferred.resolve(terminalSetting);\r\n }, function (error) {\r\n terminalSetting.isVisible = false;\r\n terminalSetting.isRequired = false;\r\n terminalSetting.isDisabled = true;\r\n\r\n deferred.reject(error);\r\n });\r\n return terminalSetting;\r\n }\n\n function setTerminalSetting(setting) {\r\n if (!!setting.terminalID) {\r\n localStorageService.set('wb_terminalID', setting.terminalID);\r\n } else {\r\n localStorageService.remove('wb_terminalID');\r\n }\r\n }\n\n function getSelectedTerminalID() {\r\n if (!terminalSetting) {\r\n terminalSetting = getTerminalSetting();\r\n }\r\n\r\n return $q(function (resolve, reject) {\r\n terminalSetting.$promise.then(function (data) {\r\n resolve(data.terminalID);\r\n }, function (error) {\r\n reject(error);\r\n });\r\n });\r\n }\n\n return {\n getAllAsync: getAllAsync,\n insert: insert,\n update: update,\n remove: remove,\r\n createNew: createNew,\r\n getTerminalSetting: getTerminalSetting,\r\n setTerminalSetting: setTerminalSetting,\r\n getSelectedTerminalID: getSelectedTerminalID\r\n }\n\n }]);","'use strict';\n\nwbApp.factory('uiUtilsSvc', [\n function () {\n\n var scrollbarWidth = 0;\n var scrollbarWidthSet = false;\n\n function getScrollbarWidth() {\n if (!scrollbarWidthSet) {\n // Create the measurement node\n var scrollDiv = document.createElement(\"div\");\n scrollDiv.className = \"scrollbar-measure\";\n document.body.appendChild(scrollDiv);\n\n // Get the scrollbar width\n scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n scrollbarWidthSet = true;\n\n // Delete the DIV \n document.body.removeChild(scrollDiv);\n }\n\n return scrollbarWidth;\n }\n\n\n return {\n getScrollbarWidth: getScrollbarWidth\n }\n }\n]);","'use strict';\n\nwbApp.factory('urlUtils', ['$location', '$window',\n function ($location, $window) {\n\n function getQueryParams(qs) {\n if (!qs) {\n qs = location.search;\n }\n\n qs = qs.split(\"+\").join(\" \");\n\n var params = {}, tokens,\n re = /[?&]?([^=]+)=([^&]*)/g;\n\n while (tokens = re.exec(qs)) {\n params[decodeURIComponent(tokens[1])]\n = decodeURIComponent(tokens[2]);\n }\n\n return params;\n }\n\n function getReturnUrl(params) {\r\n var ret = '';\n angular.forEach(params, function (value, key) {\r\n if (key.toLowerCase() === 'returnurl') {\r\n ret = value;\r\n }\r\n });\n\n return ret;\r\n }\n\n function getParamsStringWithoutReturnUrl(params) {\n var ret = '';\n angular.forEach(params, function (value, key) {\n if (key.toLowerCase() !== 'returnurl') {\n if (!!ret) {\n ret = ret + '&' + key + '=' + value;\n } else {\n ret = key + '=' + value;\n }\n }\n });\n\n return ret;\n }\n\n function getUrlParts() {\r\n return window.location.pathname.split('/');\r\n }\n\n function getLastUrlPart() {\r\n var urlParts = getUrlParts();\r\n\r\n if (urlParts && urlParts.length) {\r\n return urlParts[urlParts.length - 1];\r\n }\r\n\r\n return \"\";\r\n }\n\n function setUrlParam(paramName, paramValue) {\r\n var ret = '';\r\n\r\n var params = getQueryParams();\r\n params[paramName] = paramValue;\r\n _.forEach(params, function (value, key) {\r\n if (!!value) {\r\n if (!!ret) {\r\n ret = ret + '&' + encodeURIComponent(key) + '=' + encodeURIComponent(value);\r\n } else {\r\n ret = encodeURIComponent(key) + '=' + encodeURIComponent(value);\r\n }\r\n }\r\n });\r\n\r\n //if (!ret && !!paramValue) {\r\n // ret = encodeURIComponent(paramName) + '=' + encodeURIComponent(paramValue);\r\n //} else {\r\n // if (!!ret && !!paramValue) {\r\n // ret = ret + '&' + encodeURIComponent(paramName) + '=' + encodeURIComponent(paramValue);\r\n // }\r\n //}\r\n\r\n if (!!ret) {\r\n $location.url($location.path() + \"?\" + ret);\r\n } else {\r\n $location.url($location.path());\r\n }\r\n $location.replace();\r\n $window.history.replaceState(null, 'any', $location.absUrl());\r\n }\n\n function removeUrlParam(paramName) {\r\n setUrlParam(paramName, null);\r\n }\n\n return {\n getQueryParams: getQueryParams,\n getParamsStringWithoutReturnUrl: getParamsStringWithoutReturnUrl,\n getUrlParts: getUrlParts,\n getLastUrlPart: getLastUrlPart,\n setUrlParam: setUrlParam,\n removeUrlParam: removeUrlParam,\n getReturnUrl: getReturnUrl\n }\n\n }]);","wbApp.factory('userSettingSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var UserSetting = $resource('/Api/UserSetting/Get', {}, {\n 'get': { method: 'GET', isArray: false, url: '/Api/UserSetting/Get' },\n 'save': { method: 'POST', isArray: false, url: '/Api/UserSetting/Save' },\n });\n\n var _userSetting = {};\n\n function getAsync() {\n\n var deferred = $q.defer();\n _userSetting.$promise = deferred.promise;\n\n repositorySvc.customGet('get', UserSetting, {}, function (data) {\n angular.extend(_userSetting, data);\n deferred.resolve(_userSetting);\n }, function (errorResult) {\n deferred.reject(errorResult);\n });\n\n return _userSetting;\n }\n\n function saveAsync(setting, success, error) {\n repositorySvc.customPost(\n 'save',\n UserSetting,\n setting || _userSetting,\n function (data) {\n angular.extend(_userSetting, data);\n if (success) {\n success(data);\n }\n },\n error);\n }\n\n getAsync();\n\n return {\n getAsync: getAsync,\n settings: _userSetting,\n saveAsync: saveAsync\n }\n }]);","'use strict';\n\nwbApp.factory('userSvc', ['$resource', '$translate', '$q', '$timeout', 'repositorySvc', 'notificationSvc', 'tenantSettingSvc',\n function ($resource, $translate, $q, $timeout, repositorySvc, notificationSvc, tenantSettingSvc) {\n var User = $resource('/Api/Users/Get/:id', {}, {\n 'query': { method: 'GET', isArray: true },\n 'getCurrent': { method: 'GET', url: '/Api/Users/GetCurrent' },\n 'update': { method: 'POST', url: '/Api/Users/Update' },\n 'insert': { method: 'POST', url: '/Api/Users/Insert' },\n 'delete': { method: 'POST', url: '/Api/Users/Delete' },\n 'register': { method: 'POST', url: '/Api/Users/RegisterNewUser' },\n 'getByID': { methof: 'GET', url: '/Api/Users/GetLookupID' },\n 'getByIDFull': { methof: 'GET', url: '/Api/Users/Get' },\n 'getConsentsInfo': { method: 'GET', isArray: true, url: '/Api/Users/GetConsentsInfo' },\n 'anonymize': { method: 'POST', url: '/Api/Users/Anonymize' },\n });\n\n let users;\n let filteredUsers;\n \n function getConsentsInfo() {\n return repositorySvc.customGet('getConsentsInfo', User, { });\n }\n\n function createNew() {\n return {\n securityRoleID: 3,\n allowEmailContact: true,\n isNew: true,\n nationality: tenantSettingSvc.settings.defaultNationality\n };\n }\n\n function getAllAsync(refresh, excludeUnfinished) {\n let deferred = $q.defer();\n filteredUsers = filteredUsers ?? [];\n\n if (!users || !!refresh) {\n users = repositorySvc.get(User, {});\n }\n users.$promise.then(\n function (data) {\n let data2 = excludeUnfinished\n ? _.filter(data, function (u) {\n return !String.prototype.isNullOrWhitespace(u.fullName);\n })\n : data;\n filteredUsers.length = 0;\n filteredUsers.push.apply(filteredUsers, data2);\n return deferred.resolve(data2);\n },\n function (error) {\n deferred.reject(error);\n });\n\n filteredUsers.$promise = deferred.promise;\n return filteredUsers;\n }\n\n function getAllBrief(refresh) {\n return $q(function (resolve, reject) {\n let allUsers = getAllAsync(refresh, true);\n allUsers.$promise.then(\n function (data) {\n resolve(_.map(data, function (u) {\n return {\n id: u.id + \"\",\n fullName: u.fullName\n };\n }));\n },\n function (error) {\n reject(error);\n });\n });\n }\n\n function getByIDAsync(userId) {\n return repositorySvc.customGet('getByID', User, { userID: userId });\n }\n\n function getByIDFull(userId) {\n return repositorySvc.customGet('getByIDFull', User, { userID: userId });\n }\n\n function getCurrentAsync() {\n return repositorySvc.customGet('getCurrent', User);\n }\n\n function insert(data, successCallback, errorCallback) {\n return repositorySvc.insert(\n User, // $resource\n filteredUsers, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n function update(data, successCallback, errorCallback, disableNotification) {\n return repositorySvc.update(\n User, // $resource\n filteredUsers, // collection\n data, // entity\n successCallback,\n errorCallback,\n 'id',\n disableNotification);\n }\n\n function remove(data, errorCallback) {\n return repositorySvc.remove(\n User, // $resource\n filteredUsers, // collection\n data, // entity\n null, // successCallback\n errorCallback);\n }\n\n //#endregion\n\n function registerAsync(user, students, loginDetails) {\n var deferred = $q.defer();\n var payload = {\n user: angular.copy(user),\n students: students,\n password: loginDetails.password\n };\n payload.user.userName = loginDetails.userName;\n\n User.register(payload, success, error);\n\n function success() {\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_TITLE_USER_REGISTERED'));\n deferred.resolve($translate.instant('TXT_ALERT_TITLE_USER_REGISTERED'));\n }\n\n function error(errorResult) {\n repositorySvc.defaultErrorHandler(errorResult, null);\n deferred.reject(errorResult);\n }\n\n return deferred.promise;\n }\n\n function anonymize(userID, anonymizeTaxDocuments, successCallback, errorCallback) {\n return repositorySvc.customPost(\n 'anonymize',\n User,\n {\n id: userID,\n anonymizeTaxDocuments: anonymizeTaxDocuments\n },\n successCallback,\n errorCallback\n );\n }\n\n return {\n createNew: createNew,\n getAllAsync: getAllAsync,\n getCurrentAsync: getCurrentAsync,\n insert: insert,\n update: update,\n remove: remove,\n registerAsync: registerAsync,\n getByIDAsync: getByIDAsync,\n getByIDFull: getByIDFull,\n getConsentsInfo: getConsentsInfo,\n anonymize: anonymize,\n getAllBrief: getAllBrief\n }\n }]);","var webooker_utils = webooker_utils || {};\n\n(function (ns) {\n\n ns.ColorUtils = function ColorUtils() {\n\n }\n\n ns.ColorUtils.prototype.intToRgb = function(intColor) {\n intColor >>>= 0;\n var b = intColor & 0xFF,\n g = (intColor & 0xFF00) >>> 8,\n r = (intColor & 0xFF0000) >>> 16;\n return \"rgb(\" + [r, g, b].join(\",\") + \")\";\n }\n\n ns.ColorUtils.prototype.rgbToInt = function(rgbColor) {\n var regexRgb = /^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/g;\n var match = regexRgb.exec(rgbColor);\n\n return (parseInt(match[1]) << 16) +\n (parseInt(match[2]) << 8) +\n (parseInt(match[3]));\n }\n\n})(webooker_utils);","\n(function () {\n Date.prototype.isValidDate = function (d) {\n if (Object.prototype.toString.call(d) === \"[object Date]\") {\n // it is a date\n if (isNaN(d.getTime())) { // d.valueOf() could also work\n return false;\n }\n else {\n return true;\n }\n }\n else {\n return false;\n }\n };\n})();","(function () {\n String.prototype.format = String.prototype.f = function () {\n var s = this,\n i = arguments.length;\n\n while (i--) {\n s = s.replace(new RegExp('\\\\{' + i + '\\\\}', 'gm'), arguments[i]);\n }\n return s;\n };\n\n String.prototype.endsWith = function (suffix) {\n return this.indexOf(suffix, this.length - suffix.length) !== -1;\n };\n\n String.prototype.startsWith = function (str) {\n return this.slice(0, str.length) == str;\n };\n\n String.prototype.isNullOrWhitespace = function (input) {\n if (input === null || typeof input === 'undefined' || typeof input !== 'string') return true;\n return input.replace(/\\s/g, '').length < 1;\n };\n\n String.prototype.fullName = function (name, middleName, surname) {\n var result = '';\n if (!String.prototype.isNullOrWhitespace(name)) {\n result = name;\n }\n\n if (!String.prototype.isNullOrWhitespace(middleName)) {\n if (!!result) {\n result = result + \" \" + middleName;\n }\n else \n {\n result = middleName;\n } \n }\n\n if (!String.prototype.isNullOrWhitespace(surname)) {\n if (!!result) {\n result = result + \" \" + surname;\n }\n else {\n result = surname;\n }\n }\n\n return result;\n\n };\n})();","wbApp.directive('wbDifferentValueValidator', [function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elem, attr, ctrl) {\n\n attr.$observe('wbDifferentValueValidator', function (val) {\n ctrl.$setValidity('differentValue', ctrl.$viewValue != val);\n });\n\n scope.$watch(attr.ngModel, function (model) {\n var otherVal = attr.wbDifferentValueValidator;\n ctrl.$setValidity('differentValue', model != otherVal);\n });\n }\n };\n}]);\n","wbApp.directive('wbIsAfterValidator', [function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elem, attr, ctrl) {\n\n scope.$watch(attr.wbIsAfterValidator, function (value) {\n var val = value;\n\n if (moment.isDate(val) && moment.isDate(ctrl.$modelValue))\n {\n ctrl.$setValidity('isAfter', moment(ctrl.$modelValue).isAfter(val));\n } else {\n ctrl.$setValidity('isAfter', true);\n }\n });\n\n scope.$watch(attr.ngModel, function (model) {\n var val = scope.$eval(attr.wbIsAfterValidator);\n\n if (moment.isDate(val) && moment.isDate(ctrl.$modelValue)) {\n ctrl.$setValidity('isAfter', moment(ctrl.$modelValue).isAfter(val));\n } else {\n ctrl.$setValidity('isAfter', true);\n }\n });\n }\n };\n}]);","wbApp.directive('wbIsBeforeValidator', [function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elem, attr, ctrl) {\n\n scope.$watch(attr.wbIsBeforeValidator, function (value) {\n var val = value;\n\n if (moment.isDate(val) && moment.isDate(ctrl.$modelValue))\n {\n ctrl.$setValidity('isBefore', moment(ctrl.$modelValue).isBefore(val));\n } else {\n ctrl.$setValidity('isBefore', true);\n }\n });\n\n scope.$watch(attr.ngModel, function (model) {\n var val = scope.$eval(attr.wbIsBeforeValidator);\n\n if (moment.isDate(val) && moment.isDate(ctrl.$modelValue)) {\n ctrl.$setValidity('isBefore', moment(ctrl.$modelValue).isBefore(val));\n } else {\n ctrl.$setValidity('isBefore', true);\n }\n });\n }\n };\n}]);","wbApp.directive('wbOnlyOneValueSetValidator', [function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbOnlyOneValueSetValidator: '='\n },\n link: function (scope, elem, attr, ctrl) {\n\n function validate(value1, value2) {\n var val1Def = (!isNaN(value1) && value1 !== null && value1 !== '') || !String.prototype.isNullOrWhitespace(value1);\n var val2Def = (!isNaN(value2) && value2 !== null && value2 !== '') || !String.prototype.isNullOrWhitespace(value2);\n\n ctrl.$setValidity('onlyOneValueSet', (val1Def && !val2Def) || (!val1Def && val2Def));\n }\n\n scope.$watch('wbOnlyOneValueSetValidator', function (model) {\n validate(model, ctrl.$viewValue);\n });\n\n ctrl.$parsers.unshift(function (model) {\n validate(model, scope.wbOnlyOneValueSetValidator);\n\n return model;\n });\n }\n };\n}]);","wbApp.directive('wbPersonalIdNumberValidator', [function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elem, attr, ctrl) {\n scope.$watch(attr.ngModel, function (model) {\n \n // https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm#6\n let isValid = true;\n if (!!model) {\n const parsed = parseInt(model, 10);\n if (isNaN(parsed)) {\n isValid = false;\n } else {\n if (model.length === 10) {\n isValid = (parsed % 11) === 0;\n } else if (model.length === 9) {\n isValid = parsed < 540000000;\n } else {\n isValid = false;\n }\n }\n }\n\n ctrl.$setValidity('pattern', isValid);\n });\n }\n };\n}]);\n","wbApp.directive('wbDependentPropertyRequiredValidator', [function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbDependentPropertyRequiredValidator: '='\n },\n link: function (scope, elem, attr, ctrl) {\n\n function validate(value1, value2) {\n var val2Def = !!value2 && value2 != '0';\n var val1Def = !!value1;\n\n ctrl.$setValidity('dependentPropertyRequired', (!!val1Def && !!val2Def) || !val2Def);\n }\n\n scope.$watch('wbDependentPropertyRequiredValidator', function (model) {\n validate(ctrl.$viewValue, model);\n });\n\n ctrl.$parsers.unshift(function (model) {\n validate(model, scope.wbDependentPropertyRequiredValidator);\n\n return model;\n });\n }\n };\n}]);","'use strict';\n\nwbApp.directive('wbFormResponseCombo', ['$timeout', '$translate', 'formSvc',\n function ($timeout, $translate, formSvc) {\n function formatResult(model) {\n if (!model) {\n return;\n }\n\n if (!model.isActive) {\n return model.name + ' (' + $translate.instant('TXT_VAL_NOT_ACTIVE') + ')';\n } else {\n return model.name;\n }\n }\n\n function formatSelection(model) {\n if (!model.isActive) {\n return model.name + ' (' + $translate.instant('TXT_VAL_NOT_ACTIVE') + ')'\n } else {\n return model.name;\n }\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n priority: 1,\n replace: true,\n scope: {\n filterForKindergarten: '='\n },\n link: function (scope, elm, attrs, ctrl) {\n var models = formSvc.getAllForLookup( /* formIDtoInclude */ ctrl.$modelValue, scope.filterForKindergarten);\n $timeout(function () {\n\n $(elm).select2({\n placeholder: (typeof scope.placeholder !== 'undefined') \n ? attrs.placeholder\n : $translate.instant('TXT_PLACEHOLDER_SELECT_FORM_DEFINITION'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: !attrs.required,\n minimumResultsForSearch: -1,\n data: models\n });\n\n ctrl.$render();\n });\n\n // ctrl.$parsers.unshift(function (viewValue) {\n // if (!viewValue) {\n // return 0;\n // } else {\n // return parseInt(viewValue);\n // }\n // });\n //\n // ctrl.$formatters.unshift(function (value) {\n // if (!value) {\n // return \"\";\n // } else {\n // return value + \"\";\n // }\n // });\n\n ctrl.$render = function () {\n models.$promise.then(function () {\n $(elm).select2('val', ctrl.$viewValue);\n });\n }\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n }\n }\n }]); ","wbApp.directive('wbFormResponseEdit', ['$timeout', '$translate', '$q', '$window', 'formSvc', 'formResponseSvc', 'studentSvc', 'securitySvc', 'userSvc',\n function ($timeout, $translate, $q, $window, formSvc, formResponseSvc, studentSvc, securitySvc, userSvc) {\n\n return {\n restrict: 'A',\n scope: {\n model: '=ngModel',\n formDefinitionId: '=',\n formDefinitionRevision: '=?',\n adminEdit: '=?'\n },\n templateUrl: 'directives/forms/form-response-edit.html',\n controller: ['$scope', '$element', function ($scope, $element) {\n\n $scope.adminEdit = !!$scope.adminEdit && securitySvc.isInRole('FormsResponse.Insert');\n $scope.urlParams = 'returnUrl=' + encodeURIComponent(location.pathname + location.search);\n\n function validateModel(model)\n {\n if ($scope.form.accessPermissions == 0 || $scope.form.accessPermissions == 3) {\n // Login required\n if (!$scope.isAuthenticated || !model.userId) {\n return false;\n }\n\n if ($scope.form.accessPermissions == 0) {\n // Student required \n if (!model.studentId) {\n return false;\n }\n } else {\n if (!!model.studentId) {\n return false;\n }\n }\n } else if ($scope.form.accessPermissions == 1 || $scope.form.accessPermissions == 2) {\n // Login is not required\n if ($scope.form.accessPermissions == 2) {\n // Student required\n if ($scope.isAuthenticated && !!model.userId) {\n if (!model.studentId) {\n return false;\n }\n } else {\n if (!!model.studentId ||\n !$scope.form.notRegisteredUserInfo ||\n !$scope.form.notRegisteredUserInfo.students ||\n $scope.form.notRegisteredUserInfo.students.length != 1) {\n return false;\n }\n }\n } else {\n if (!!model.studentId) {\n return false;\n }\n\n if (!!$scope.form.notRegisteredUserInfo) {\n if (!!$scope.form.notRegisteredUserInfo.students &&\n !!$scope.form.notRegisteredUserInfo.students.length) {\n return false;\n }\n }\n }\n\n }\n return $scope.dummy.editform.$valid;\n }\n\n function updateModel() {\n if (!$scope.form) {\n $scope.model.isValid = false;\n }\n else {\n angular.extend($scope.model, formSvc.generateFormResponseFromFilledForm($scope.form));\n $scope.model.isValid = validateModel($scope.model);\n }\n\n if (!!$scope.form &&\n $scope.form.showFullEditableStudentDetail &&\n !$scope.model.isNotRegisteredUser &&\n $scope.isAuthenticated) {\n if (!$scope.model.student || $scope.model.student.id != $scope.model.studentId)\n {\n $scope.model.student = _.find($scope.form.students, { 'checked': true });\n }\n }\n }\n\n $scope.onRegisteredBtnClick = function()\n {\n if (!!$scope.form) {\n $scope.form.notRegisteredUserInfo = null;\n }\n }\n\n $scope.onAnonymousBtnClick = function()\n {\n if (!!$scope.form) {\n if (!$scope.form.notRegisteredUserInfo) {\n if ($scope.form.accessPermissions == 2) {\n $scope.form.notRegisteredUserInfo = {\n surname: null,\n email: null,\n phone: null,\n students: [{\n surname: null,\n birthday: null\n }]\n };\n } else {\n $scope.form.notRegisteredUserInfo = {\n surname: null,\n email: null,\n phone: null,\n students: null\n };\n }\n } else {\n $scope.form.notRegisteredUserInfo = null;\n }\n }\n }\n\n $scope.students = [];\n $scope.images = [];\n $scope.formIsLoading = true;\n $scope.loginRequired = false;\n $scope.isNewForFilling = true;\n\n $scope.isAuthenticated = securitySvc.isAuthenticated();\n\n $scope.onAdminUserChange = function(userId)\n {\n if (!!userId && ($scope.form.accessPermissions == 0 || $scope.form.accessPermissions == 2))\n {\n if (!$scope.model || $scope.model.userId != userId) {\n if (securitySvc.isInRole('FormsResponse.Insert')) {\n userSvc.getByIDFull(userId).$promise.then(function (user) {\n $scope.model.user = user;\n });\n } else {\n userSvc.getCurrentAsync(userId).$promise.then(function (user) {\n $scope.model.user = user;\n });\n }\n }\n\n studentSvc.getAllByUserIDAsync(userId).$promise.then(function (students) {\n $scope.students = angular.copy(students);\n $scope.form.students = $scope.students;\n\n if (!!$scope.form.students && $scope.form.students.length == 1) {\n $scope.form.students[0].checked = true;\n $scope.onCheckboxClick(0, $scope.form.students, $scope.form.students[0]);\n }\n });\n }\n\n if (!userId) {\n $scope.students = [];\n $scope.form.students = [];\n $scope.model.user = null;\n }\n }\n\n let promises = [];\n\n if ((typeof $scope.formDefinitionRevision === 'undefined' || $scope.formDefinitionRevision === null) && !!$scope.formDefinitionId) {\n promises.push(formSvc.getById($scope.formDefinitionId).$promise);\n } else if (!!$scope.formDefinitionId) {\n promises.push(formSvc.getByIdAndRevision($scope.formDefinitionId, $scope.formDefinitionRevision).$promise);\n } else {\n promises.push($q(function (resolve, reject) { resolve({}); }));\n }\n\n if ($scope.isAuthenticated && !$scope.model.id) {\n // New form filling\n promises.push(studentSvc.getCurrentAsync().$promise);\n } else {\n // Existing form response view\n promises.push($q(function (resolve, reject) { resolve([]); }));\n }\n\n if (!!$scope.model.id) {\n promises.push(formResponseSvc.getById($scope.model.id).$promise);\n $scope.isNewForFilling = false;\n } else {\n promises.push($q(function (resolve, reject) { resolve($scope.model); }))\n $scope.isNewForFilling = true;\n }\n\n $q.all(promises).then(function (data) {\n\n function fetchFormDefinition(model, form, students)\n {\n if (!$scope.formDefinitionId) {\n // formId was not provided, fetch it from form response\n formSvc.getByIdAndRevision(model.formDefinitionId, model.formDefinitionRevision).$promise.then(function (d) {\n let f = angular.copy(d);\n assignData(model, f, students);\n });\n } else {\n assignData(model, form, students);\n }\n }\n\n function assignData(model, form, students) {\n $scope.form = form;\n\n if (!!$scope.form.showFullEditableStudentDetail) {\n model.showFullEditableStudentDetail = true;\n }\n\n if ($scope.form.showFullEditableUserDetail &&\n !model.isNotRegisteredUser &&\n $scope.isAuthenticated) {\n\n let userId = $scope.model.userId;\n if (!userId && !$scope.model.id) {\n userId = securitySvc.loggedInUser().userID + '';\n }\n\n if (!!userId) {\n $scope.model.showFullEditableUserDetail = $scope.form.showFullEditableUserDetail;\n\n if (securitySvc.isInRole('FormsResponse.Insert')) {\n userSvc.getByIDFull(userId).$promise.then(function (user) {\n $scope.model.user = user;\n });\n } else {\n userSvc.getCurrentAsync(userId).$promise.then(function (user) {\n $scope.model.user = user;\n });\n }\n }\n }\n\n $scope.loginRequired = !$scope.isAuthenticated && ($scope.form.accessPermissions == 0 || $scope.form.accessPermissions == 3);\n\n if (!$scope.model.id) {\n $scope.form.userId = securitySvc.loggedInUser().userID + '';\n }\n\n $scope.form.students = students;\n if (!!$scope.model.id) {\n formSvc.updateFilledFormByFormResponse($scope.form, $scope.model);\n } else {\n updateModel();\n } \n \n if (!!$scope.form.students && $scope.form.students.length == 1 && $scope.form.accessPermissions != 1 && $scope.form.accessPermissions != 3) {\n $scope.form.students[0].checked = true;\n $scope.onCheckboxClick(0, $scope.form.students, $scope.form.students[0]);\n }\n\n if (!!$scope.form.pictureUrls && $scope.form.pictureUrls.length > 1) {\n $scope.images = _.map($scope.form.pictureUrls, function (p) {\n return {\n thumb: p,\n img: p\n };\n });\n }\n\n $scope.formIsLoading = false;\n }\n\n let form = angular.copy(data[0]);\n let students = angular.copy(data[1]);\n let model = angular.extend($scope.model, data[2]);\n \n if (!!$scope.model.id && !model.isNotRegisteredUser) {\n // Fetch correct students, user might not be current user\n studentSvc.getAllByUserIDAsync($scope.model.userId).$promise.then(function (st) {\n students = angular.copy(st);\n fetchFormDefinition(model, form, students);\n });\n } else {\n fetchFormDefinition(model, form, students);\n }\n\n }, function (error) {\n $scope.formIsLoading = false;\n });\n\n $scope.onCheckboxClick = function (questionType, options, option) {\n // Single select\n if (questionType == 0 || questionType == 2)\n {\n _.forEach(options, function (o) {\n if (o.id == option.id) {\n o.checked = true;\n } else {\n o.checked = false;\n }\n });\n } else {\n var numOfSelected = _.reduce(options, function (numOfSelected, o) {\n return numOfSelected + (!!o.checked ? 1 : 0);\n }, 0);\n\n if (!numOfSelected) {\n option.checked = true;\n }\n }\n updateModel();\n }\n\n $scope.onTextEdit = function()\n {\n updateModel();\n }\n\n $scope.$watch('form', function () {\n $timeout(function () {\n updateModel();\n }, 100);\n }, true);\n }],\n\n link: function ($scope, $element, attrs, ctrl) {\n }\n }\n }]);","wbApp.directive('wbFullStudentEdit', ['$timeout', '$translate', '$q', '$http', 'tenantSettingSvc',\n function ($timeout, $translate, $q, $http, tenantSettingSvc) {\n\n return {\n restrict: 'A',\n scope: {\n model: '=ngModel',\n adminEdit: '=',\n disabled: '=ngDisabled',\n },\n templateUrl: 'directives/forms/full-student-edit.html',\n controller: ['$scope', '$element', function ($scope, $element) {\n\n $scope.typeAheadAddress = [];\n $scope.tenantSetting = tenantSettingSvc.settings;\n\n $scope.getAddress = function (viewValue) {\n if (viewValue) {\n let params = {\n address: viewValue,\n language: 'cs',\n region: 'cz',\n bounds: '48.270777,12.172380|51.246709,19.922157', // Czech republic bounds\n key: 'AIzaSyDdpRFWJaEcASaUgQxTdi8i42aaCaKfS0A'\n };\n return $http.get('https://maps.googleapis.com/maps/api/geocode/json', { params: params })\n .then(function (res) {\n $scope.typeAheadAddress.length = 0;\n $scope.typeAheadAddress.push.apply($scope.typeAheadAddress, res.data.results);\n });\n }\n };\n }],\n\n link: function ($scope, $element, attrs, ctrl) {\n }\n }\n }]);","wbApp.directive('wbFullUserEdit', ['$timeout', '$translate', '$q', '$http', 'tenantSettingSvc',\n function ($timeout, $translate, $q, $http, tenantSettingSvc) {\n\n return {\n restrict: 'A',\n scope: {\n model: '=ngModel',\n adminEdit: '=',\n disabled: '=ngDisabled',\n },\n templateUrl: 'directives/forms/full-user-edit.html',\n controller: ['$scope', '$element', function ($scope, $element) {\n\n $scope.typeAheadAddress = [];\n $scope.tenantSetting = tenantSettingSvc.settings;\n $scope.hasSecondContact =\n ($scope.tenantSetting.mandatoryEmail2 < 2) ||\n ($scope.tenantSetting.mandatoryPhone2 < 2) ||\n ($scope.tenantSetting.mandatoryUserNationality2 < 2) ||\n ($scope.tenantSetting.mandatoryUserName2 < 2) ||\n ($scope.tenantSetting.mandatoryUserSurname2 < 2) ||\n ($scope.tenantSetting.mandatoryUserMiddleName2 < 2) ||\n ($scope.tenantSetting.mandatoryUserAddress2 < 2) ||\n ($scope.tenantSetting.mandatoryUserIdentityCardNumber2 < 2) ||\n ($scope.tenantSetting.mandatoryUserPersonalIDNumber2 < 2) ||\n ($scope.tenantSetting.mandatoryUserBirthday2 < 2);\n\n $scope.getAddress = function (viewValue) {\n if (viewValue) {\n let params = {\n address: viewValue,\n language: 'cs',\n region: 'cz',\n bounds: '48.270777,12.172380|51.246709,19.922157', // Czech republic bounds\n key: 'AIzaSyDdpRFWJaEcASaUgQxTdi8i42aaCaKfS0A'\n };\n return $http.get('https://maps.googleapis.com/maps/api/geocode/json', { params: params })\n .then(function (res) {\n $scope.typeAheadAddress.length = 0;\n $scope.typeAheadAddress.push.apply($scope.typeAheadAddress, res.data.results);\n });\n }\n };\n }],\n\n link: function ($scope, $element, attrs, ctrl) {\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbLevelCombo', ['$timeout', '$translate', 'levelSvc', 'gridSortSvc',\n function ($timeout, $translate, levelSvc, gridSortSvc) {\n function formatResult(model) {\n if (!model) {\n return \"\";\n }\n\n return model.name;\n }\n\n function formatSelection(model) {\n return model.name;\n }\n\n return {\n restrict: 'A',\n require: '?ngModel',\n priority: 1,\n link: function (scope, elm, attrs, controller) {\n\n var models = levelSvc.getAll();\n\n models.$promise.then(function () {\n $timeout(function () {\n\n $(elm).select2({\n placeholder: $translate.instant('TXT_LEVEL'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: true,\n minimumResultsForSearch: 5,\n id: function (model) { return model.id; },\n data: _.sortBy(models, function (a) { return gridSortSvc.localeSort(a, 'name'); }),\n matcher: function (term, text, data) {\n return data.name.toUpperCase().indexOf(term.toUpperCase()) >= 0;\n }\n });\n\n controller.$render();\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n controller.$setViewValue(elm.select2('val'));\n });\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n controller.$render();\n }, 1);\n }\n }\n }]);","wbApp.directive('wbNotRegisteredUserEdit', ['$timeout', '$translate', '$q', '$window', '$http', 'formSvc', 'formResponseSvc', 'studentSvc', 'securitySvc', 'tenantSettingSvc',\n function ($timeout, $translate, $q, $window, $http, formSvc, formResponseSvc, studentSvc, securitySvc, tenantSettingSvc) {\n\n return {\n restrict: 'A',\n scope: {\n model: '=ngModel',\n isStudentRequired: '=',\n adminEdit: '=',\n hideHeaderIfStudentNotRequired: '='\n },\n templateUrl: 'directives/forms/not-registered-user-edit.html',\n controller: ['$scope', '$element', function ($scope, $element) {\n\n $scope.requiredStudent = $scope.isStudentRequired;\n $scope.typeAheadAddress = [];\n $scope.tenantSetting = tenantSettingSvc.settings;\n $scope.adminSimpleRequired = !!$scope.adminEdit;\n\n $scope.allMatch = function () {\n return true;\n };\n\n $scope.onIsStudentRequiredToggle = function () {\n \n $scope.requiredStudent = !$scope.requiredStudent;\n if (!$scope.requiredStudent) {\n $scope.model.students = [{}];\n } else {\n $scope.model.students = [{}];\n }\n }\n\n $scope.getAddress = function (viewValue) {\n if (viewValue) {\n var params = {\n address: viewValue,\n language: 'cs',\n region: 'cz',\n bounds: '48.270777,12.172380|51.246709,19.922157', // Czech republic bounds\n key: 'AIzaSyDdpRFWJaEcASaUgQxTdi8i42aaCaKfS0A'\n };\n return $http.get('https://maps.googleapis.com/maps/api/geocode/json', { params: params })\n .then(function (res) {\n $scope.typeAheadAddress.length = 0;\n $scope.typeAheadAddress.push.apply($scope.typeAheadAddress, res.data.results);\n });\n }\n };\n }],\n\n link: function ($scope, $element, attrs, ctrl) {\n }\n }\n }]);","wbApp.factory('levelSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var Level = $resource('/restapi/level/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/levels/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/levels' },\n 'insert': { method: 'POST', url: '/restapi/levels' },\n 'update': { method: 'PUT', url: '/restapi/levels/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/levels/:id' },\n });\n\n var levels;\n\n function createNew()\n {\n var level = {\n isNew: true\n };\n\n return level;\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n Level,\n model);\n }\n\n function remove(levelId) {\n levels = null;\n return repositorySvc.customDelete(\n 'delete',\n Level,\n { id: levelId });\n }\n\n function update(model) {\n levels = null;\n return repositorySvc.customPutWithParams(\n 'update',\n Level,\n { id: model.id },\n convertDatesToDateString(model));\n }\n\n function getById(levelId) {\n return repositorySvc.customGet('getById', Level, { id: levelId });\n }\n\n function getAll(refresh) {\n if (!levels || refresh) {\n levels = repositorySvc.customGet('getAll', Level, {});\n }\n return levels;\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getAll: getAll,\n insert: insert,\n remove: remove,\n update: update,\n }\n }\n]);","wbApp.factory('duePaymentsSvc', ['$resource', '$q', '$filter', '$translate', 'repositorySvc', 'notificationSvc',\n function ($resource, $q, $filter, $translate, repositorySvc, notificationSvc) {\r\n\n var DuePayments = $resource('/Api/DuePayments/GetAll', {}, {\r\n 'query': { method: 'GET', isArray: true },\n 'getAllForCurrentUser': { method: 'GET', isArray: true, url: '/Api/DuePayments/GetAllForCurrentUser' },\n 'getAllForSemester': { method: 'GET', isArray: true, url: '/Api/DuePayments/GetAllForSemester' },\n 'getAllForDateRange': { method: 'GET', isArray: true, url: '/Api/DuePayments/getAllForDateRange' },\n 'sendRequestForPayment': { method: 'POST', url: '/Api/DuePayments/SendRequestForPayment' },\r\n });\n\n var duePayments;\n var filteredDuePayments = [];\n var summaryAll = null;\n var filteredSemesterID;\n\n function getAllAsync(refresh) {\r\n if (!duePayments || refresh) {\r\n duePayments = repositorySvc.get(DuePayments, {});\r\n }\n\n return duePayments;\r\n }\n\n function getAllForCurrentUser(filterOutOverPayments) {\r\n var deffered = $q.defer();\r\n var result = [];\r\n result.$promise = deffered.promise;\r\n\r\n repositorySvc.customGet('getAllForCurrentUser', DuePayments).$promise.then(\r\n function (data) {\r\n var filtered = !filterOutOverPayments\r\n ? data\r\n : _.filter(data, function (o) {\r\n return o.arrear >= 0;\r\n });\r\n\r\n var sorted = _.orderBy(filtered, ['studentFullName', 'dueDate'], ['asc', 'asc']);\r\n var grouped = _.groupBy(sorted, function (value) {\r\n return value.studentFullName;\r\n });\r\n _.forEach(grouped, function (value, key) {\r\n result.push({\r\n studentFullName: key,\r\n duePayments: value\r\n });\r\n });\r\n deffered.resolve(result);\r\n });\r\n return result;\r\n }\n\n function sendRequestForPayment(invoiceID, typeID, typeReferenceID, typeReference2ID, parentID, isReccuring) {\r\n DuePayments.sendRequestForPayment({\r\n invoiceID: invoiceID,\n typeID: typeID,\n typeReferenceID: typeReferenceID,\n typeReference2ID: typeReference2ID,\n userID: parentID,\n isReccuring: isReccuring\r\n }, success, error);\n\n function success(data) {\r\n notificationSvc.notifyInfo($translate.instant('TXT_ALERT_MESSAGE_SENT'));\r\n }\n\n function error(errorResult) {\r\n repositorySvc.defaultErrorHandler(errorResult);\r\n }\r\n }\n\n function getAllBySemesterIDAsync(semesterID, refresh) {\r\n return repositorySvc.customGet('getAllForSemester', DuePayments, {\r\n semesterID: semesterID\r\n });\r\n }\n\n function getAllByDateRangeAsync(fromDate, toDate) {\r\n var from = moment(fromDate).startOf('day').toDate();\r\n var to = moment(toDate).endOf('day').toDate();\r\n\r\n return repositorySvc.customGet('getAllForDateRange', DuePayments, {\r\n fromDate: from,\r\n toDate: to\r\n });\r\n }\n\n function calculateSummaryAll() {\r\n\n if (summaryAll) {\r\n return summaryAll;\r\n }\n\n var deffered = $q.defer();\n summaryAll = {};\n summaryAll.$promise = deffered.promise;\n\n var dp = getAllAsync();\n dp.$promise.then(function (data) {\r\n var result = calculateSummary(data);\n deffered.resolve(angular.extend(summaryAll, result));\r\n }, function (reason) {\r\n deffered.reject(reason);\r\n });\n\n return summaryAll;\r\n }\n\n function calculateSummary(duePayments) {\r\n var summary = {\r\n all: 0,\n types: [\n { name: $filter('invoiceForType')(1), value: 0 },\n { name: $filter('invoiceForType')(2), value: 0 },\n { name: $filter('invoiceForType')(3), value: 0 },\n { name: $filter('invoiceForType')(4), value: 0 }\n ]\r\n };\n\n if (!duePayments) {\r\n return summary;\r\n }\n\n for (var p = 0; p < duePayments.length; p++) {\r\n var duePayment = duePayments[p];\n\n // Fix for very early gcp invoices without TypeID (it should not happen in production)\n var typeID = duePayment.typeID == 0\n ? 3\n : duePayment.typeID - 1;\n\n summary.all += duePayment.arrear;\n summary.types[typeID].value += duePayment.arrear;\r\n }\n\n return summary;\r\n }\n\n return {\r\n getAllAsync: getAllAsync,\n getAllForCurrentUser: getAllForCurrentUser,\n getAllBySemesterIDAsync: getAllBySemesterIDAsync,\n calculateSummary: calculateSummary,\n calculateSummaryAll: calculateSummaryAll,\n sendRequestForPayment: sendRequestForPayment,\r\n getAllByDateRangeAsync: getAllByDateRangeAsync\r\n }\r\n }]);","'use strict';\n\nwbApp.factory('invoiceSvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var Invoice = $resource('/Api/Invoices/:id', {}, {\n 'getByID': { method: 'GET', isArray: false, url: 'Api/Invoices/GetByID' },\n 'getFinanceSummary': { method: 'GET', isArray: true, url: '/Api/Invoices/GetFinanceSummary', params: {} },\n 'getPaymentDetailsByStudent': { method: 'GET', isArray: false, url: '/Api/Invoices/GetPaymentDetailsByStudent', params: {} },\n 'getPaymentDetailsByInvoice': { method: 'GET', isArray: false, url: '/Api/Invoices/GetPaymentDetailsByInvoice', params: {} },\n 'getInvoiceEvidenceBySemester': { method: 'GET', isArray: true, url: '/Api/Invoices/GetInvoiceEvidenceBySemester', params: {} },\n 'getInvoiceEvidenceByDateRange': { method: 'GET', isArray: true, url: '/Api/Invoices/GetInvoiceEvidenceByDateRange', params: {} },\n 'getInvoiceEvidenceByUser': { method: 'GET', isArray: true, url: '/Api/Invoices/GetInvoiceEvidenceByUser', params: {} },\n 'getInvoiceEvidenceByActivityAndStudent': { method: 'GET', isArray: true, url: '/Api/Invoices/GetInvoiceEvidenceByActivityAndStudent', params: {} },\n 'getInvoiceEvidenceByInvoiceID': { methos: 'GET', isArray: false, url: '/Api/Invoices/GetInvoiceEvidenceByInvoiceID', params: {} },\n 'getLatestByCourseRegistration': { methos: 'GET', isArray: false, url: '/Api/Invoices/GetLatestByCourseRegistration', params: {} },\n 'delete': { method: 'POST', url: '/Api/Invoices/Delete' },\n 'getStormwareInvoiceExport': { method: 'POST', url: '/Api/Invoices/GetStormwareInvoiceExport' },\n 'getMoneyS3InvoiceExport': { method: 'POST', url: '/Api/Invoices/GetMoneyS3InvoiceExport' },\n 'getCsvInvoiceExport': { method: 'POST', url: '/Api/Invoices/GetCsvInvoiceExport' },\n });\n\n function getByID(invoiceID) {\n return repositorySvc.customGet('getByID', Invoice, {\n invoiceID: invoiceID\n });\n }\n\n function getFinanceSummary() {\n return Invoice.getFinanceSummary({ });\n }\n\n function getPaymentDetailsByStudent(invoiceForType, studentID) {\n return repositorySvc.customGet('getPaymentDetailsByStudent', Invoice, {\n invoiceForType: invoiceForType,\n studentID: studentID\n });\n }\n\n function getInvoiceEvidenceByInvoiceID(invoiceID) {\n return repositorySvc.customGet('getInvoiceEvidenceByInvoiceID', Invoice, {\n invoiceID: invoiceID\n });\n }\n\n function getLatestByCourseRegistration(courseRegistrationID) {\n return repositorySvc.customGet('getLatestByCourseRegistration', Invoice, {\n courseRegistrationID: courseRegistrationID\n });\n }\n\n function getPaymentDetailsByInvoice(invoiceForType, invoiceID) {\n return repositorySvc.customGet('getPaymentDetailsByInvoice', Invoice, {\n invoiceForType: invoiceForType,\n invoiceID: invoiceID\n });\n }\n\n function getInvoiceEvidenceBySemester(semesterID) {\n var deferred = $q.defer();\n\n var invoices = [];\n invoices.$promise = deferred.promise;\n\n repositorySvc.customGet('getInvoiceEvidenceBySemester', Invoice, {\n semesterID: semesterID\n }).$promise.then(\n function (data) {\n angular.forEach(data, function (i) {\n i.notLatest = !i.latest;\n });\n invoices.push.apply(invoices, data);\n deferred.resolve(invoices);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return invoices;\n }\n\n function getInvoiceEvidenceByDateRange(fromDate, toDate) {\n var deferred = $q.defer();\n\n var from = moment(fromDate).startOf('day').toDate();\n var to = moment(toDate).endOf('day').toDate();\n\n var invoices = [];\n invoices.$promise = deferred.promise;\n\n repositorySvc.customGet('getInvoiceEvidenceByDateRange', Invoice, {\n fromDate: from,\n toDate: to\n }).$promise.then(\n function (data) {\n angular.forEach(data, function (i) {\n i.notLatest = !i.latest;\n });\n invoices.push.apply(invoices, data);\n deferred.resolve(invoices);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return invoices;\n }\n\n function getInvoiceEvidenceByUserAsync(userID) {\n var deferred = $q.defer();\n\n var invoices = [];\n invoices.$promise = deferred.promise;\n\n repositorySvc.customGet('getInvoiceEvidenceByUser', Invoice, {\n userID: userID\n }).$promise.then(\n function (data) {\n angular.forEach(data, function (i) {\n i.notLatest = !i.latest;\n });\n invoices.push.apply(invoices, data);\n deferred.resolve(invoices);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return invoices;\n }\n\n function getInvoiceEvidenceByActivityAndStudent(activityID, studentID) {\n var deferred = $q.defer();\n\n var invoices = [];\n invoices.$promise = deferred.promise;\n\n repositorySvc.customGet('getInvoiceEvidenceByActivityAndStudent', Invoice, {\n activityID: activityID,\n studentID: studentID\n }).$promise.then(\n function (data) {\n angular.forEach(data, function (i) {\n i.notLatest = !i.latest;\n });\n invoices.push.apply(invoices, data);\n deferred.resolve(invoices);\n }, function (reason) {\n deferred.reject(reason);\n });\n\n return invoices;\n }\n\n function remove(data, successCallback, errorCallback) {\n repositorySvc.remove(\n Invoice, // $resource\n null, // collection\n data, // entity\n successCallback,\n errorCallback,\n null,\n 'invoiceID');\n }\n\n\n function getStormwareInvoiceExport(accountingBookID, invoiceIDs, success, error) {\n return repositorySvc.customPost('getStormwareInvoiceExport', Invoice, {\n accountingBookID: accountingBookID,\n invoiceIDs: invoiceIDs\n },\n success,\n error);\n }\n\n\n function getMoneyS3InvoiceExport(accountingBookID, invoiceIDs, exportAsInvoices, success, error) {\n return repositorySvc.customPost('getMoneyS3InvoiceExport', Invoice, {\n accountingBookID: accountingBookID,\n invoiceIDs: invoiceIDs, \n exportAsInvoices: !!exportAsInvoices\n },\n success,\n error);\n }\n\n function getCsvInvoiceExport(accountingBookID, invoiceIDs, success, error) {\n return repositorySvc.customPost('getCsvInvoiceExport', Invoice, {\n accountingBookID: accountingBookID,\n invoiceIDs: invoiceIDs\n },\n success,\n error);\n }\n\n return {\n getByID: getByID,\n getFinanceSummary: getFinanceSummary,\n getPaymentDetailsByStudent: getPaymentDetailsByStudent,\n getPaymentDetailsByInvoice: getPaymentDetailsByInvoice,\n getInvoiceEvidenceBySemester: getInvoiceEvidenceBySemester,\n getInvoiceEvidenceByDateRange: getInvoiceEvidenceByDateRange,\n getInvoiceEvidenceByUserAsync: getInvoiceEvidenceByUserAsync,\n getInvoiceEvidenceByActivityAndStudent: getInvoiceEvidenceByActivityAndStudent,\n getInvoiceEvidenceByInvoiceID: getInvoiceEvidenceByInvoiceID,\n getLatestByCourseRegistration: getLatestByCourseRegistration,\n remove: remove,\n getStormwareInvoiceExport: getStormwareInvoiceExport,\n getMoneyS3InvoiceExport: getMoneyS3InvoiceExport,\n getCsvInvoiceExport: getCsvInvoiceExport\n }\n\n }]);","'use strict';\r\n\r\nwbApp.factory('onlinePaymentsSvc', ['$resource', '$q', '$filter', 'repositorySvc', '$window', '$translate', 'notificationSvc',\r\n function ($resource, $q, $filter, repositorySvc, $window, $translate, notificationSvc) {\r\n var OnlinePayment = $resource('/Api/OnlinePayments/GetAll', {}, { \r\n 'startOnlinePayment': { method: 'POST', url: '/Api/OnlinePayments/StartOnlinePayment' },\r\n 'getTransactionState': { method: 'POST', url: '/Api/OnlinePayments/GetTransactionState' },\r\n 'getAllByDateRange': { method: 'GET', isArray: true, url: '/Api/OnlinePayments/getAllByDateRange' },\r\n 'delete': { method: 'POST', url: '/Api/OnlinePayments/Delete' },\r\n 'reverse': { method: 'POST', url: '/Api/OnlinePayments/Reverse' },\r\n 'manualReverse': { method: 'POST', url: '/Api/OnlinePayments/ManualReverse' }\r\n });\r\n\r\n var byDateRanges = null;\r\n var lastFromDate = null;\r\n var lastToDate = null;\r\n\r\n function getAllByDateRange(fromDate, toDate, refresh) {\r\n\r\n if (!byDateRanges || lastFromDate != fromDate || lastToDate != toDate || refresh) {\r\n\r\n lastFromDate = fromDate;\r\n lastToDate = toDate;\r\n\r\n byDateRanges = repositorySvc.customGet('getAllByDateRange', OnlinePayment, {\r\n fromDate: fromDate,\r\n toDate: toDate\r\n });\r\n }\r\n\r\n return byDateRanges;\r\n }\r\n\r\n function startOnlinePayment(invoiceIDs, price) {\r\n var result = OnlinePayment['startOnlinePayment']({\r\n invoiceIDs: invoiceIDs,\r\n price: price,\r\n returnToUrl: $window.location.href\r\n });\r\n\r\n result.$promise.then(function (data) { \r\n $window.location.href = data.redirectUrl;\r\n }, function (error) {\r\n repositorySvc.defaultErrorHandler(error, null, 'TXT_PAYMENT_CANNOT_BE_STARTED');\r\n });\r\n\r\n return result;\r\n }\r\n\r\n function getTransactionState(onlinePaymentID) {\r\n return OnlinePayment['getTransactionState']({\r\n onlinePaymentID: onlinePaymentID\r\n });\r\n }\r\n\r\n function getOnlinePaymentResultMessage(onlinePayment) {\r\n\r\n var priceStr = $filter('wbCurrencyFlt')(onlinePayment.price);\r\n\r\n switch (onlinePayment.state) {\r\n case 2: // Pending\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_PENDING').f(priceStr);\r\n case 3: // Paid\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_PAID').f(priceStr);\r\n case 4: // Reversed\r\n case 5: // AutoReversed\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_REVERSED').f(priceStr);\r\n case 6: // Cancelled\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_CANCELLED').f(priceStr);\r\n case 7: // Declained\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_DECLAINED').f(priceStr);\r\n case 8: // Error\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_ERROR').f(priceStr, onlinePayment.resultMessage);\r\n default: // Unexpected\r\n return '' +\r\n $translate.instant('TXT_PAYMENT_RESULT_UNEXPECTED').f(priceStr);\r\n }\r\n }\r\n\r\n\r\n function remove(data, successCallback, errorCallback) {\r\n repositorySvc.remove(\r\n OnlinePayment, // $resource\r\n byDateRanges, // collection\r\n { onlinePaymentID: data.onlinePaymentID }, // entity\r\n successCallback,\r\n errorCallback,\r\n {\r\n onlinePaymentID: data.onlinePaymentID\r\n },\r\n 'onlinePaymentID');\r\n }\r\n\r\n function reverse(onlinePaymentID) {\r\n return $q(function (resolve, reject) {\r\n repositorySvc.customPost(\r\n 'reverse',\r\n OnlinePayment,\r\n { onlinePaymentID: onlinePaymentID },\r\n function (data) {\r\n repositorySvc.entityUpdated(byDateRanges, data, 'onlinePaymentID');\r\n resolve(data);\r\n },\r\n function (err) {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n function manualReverse(onlinePaymentID) {\r\n return $q(function (resolve, reject) {\r\n repositorySvc.customPost(\r\n 'manualReverse',\r\n OnlinePayment,\r\n {\r\n onlinePaymentID: onlinePaymentID\r\n },\r\n function (data) {\r\n repositorySvc.entityUpdated(byDateRanges, data, 'onlinePaymentID');\r\n resolve(data);\r\n },\r\n function (err) {\r\n notificationSvc.notifyError(\r\n $translate.instant('TXT_ALERT_TITLE_CHANGES_SAVE_ERROR'),\r\n notificationSvc.translateError(err)); \r\n reject(err);\r\n });\r\n });\r\n } \r\n\r\n return {\r\n startOnlinePayment: startOnlinePayment,\r\n getTransactionState: getTransactionState,\r\n getOnlinePaymentResultMessage: getOnlinePaymentResultMessage,\r\n getAllByDateRange: getAllByDateRange,\r\n remove: remove,\r\n reverse: reverse,\r\n manualReverse: manualReverse\r\n }\r\n }\r\n]);\r\n","'use strict';\n\nwbApp.factory('paymentsSvc', ['$resource', '$q', '$filter', 'repositorySvc', 'terminalSvc',\n function ($resource, $q, $filter, repositorySvc, terminalSvc) {\n var Payment = $resource('/Api/Payments/GetAll', {}, { \n 'update': { method: 'POST', url: '/Api/Payments/Update' },\n 'insert': { method: 'POST', url: '/Api/Payments/Insert' },\n 'delete': { method: 'POST', url: '/Api/Payments/Delete' },\n 'issueTaxDocumentIfNeeded': { method: 'POST', url: '/Api/Payments/IssueTaxDocumentIfNeeded' },\n 'getAllForUser': { method: 'GET', isArray: true, url: '/Api/Payments/GetAllForUser' },\n 'insertAndBindTransaction': { method: 'POST', url: '/Api/Payments/InsertAndBindTransaction' },\n 'insertAndBindOnlineTransaction': { method: 'POST', url: '/Api/Payments/InsertAndBindOnlineTransaction' },\n 'getAllRelatedPaymentsByInvoiceID': { method: 'GET', isArray: true, url: '/Api/Payments/GetAllRelatedPaymentsByInvoiceID' },\n 'getAmortizationScheduleDuePayments': { method: 'GET', isArray: true, url: '/Api/Payments/GetAmortizationScheduleDuePayments' },\n 'getAllForSemester': { method: 'GET', isArray: true, url: '/Api/Payments/GetAllForSemester', params: {} },\n 'getAllForDateRange': { method: 'GET', isArray: true, url: '/Api/Payments/GetAllForDateRange', params: {} },\n \n });\n\n function getAllRelatedPaymentsByInvoiceID(invoiceID) {\n return repositorySvc.customGet('getAllRelatedPaymentsByInvoiceID', Payment, {\n invoiceID: invoiceID\n });\n }\n\n function getAmortizationScheduleDuePayments(invoiceID) {\n return repositorySvc.customGet('getAmortizationScheduleDuePayments', Payment, {\n invoiceID: invoiceID\n });\n }\n\n function getAllForUserAsync(parentID) {\n return repositorySvc.customGet('getAllForUser', Payment, {\n operatorID: parentID\n });\n }\n\n function getAllForSemester(semesterID) {\n return repositorySvc.customGet('getAllForSemester', Payment, {\n semesterID: semesterID\n });\n }\n\n function getAllForDateRange(fromDate, toDate) {\n var from = moment(fromDate).startOf('day').toDate();\n var to = moment(toDate).endOf('day').toDate();\n\n return repositorySvc.customGet('getAllForDateRange', Payment, {\n fromDate: from,\n toDate: to\n });\n }\n\n function calculateSummary(payments) {\n var summary = {\n all: 0,\n paymentTypes: [\n { name: $filter('paymentType')(0), value: 0 },\n { name: $filter('paymentType')(1), value: 0 },\n { name: $filter('paymentType')(2), value: 0 },\n { name: $filter('paymentType')(3), value: 0 },\n { name: $filter('paymentType')(4), value: 0 }\n ]\n };\n\n if (!payments) {\n return summary;\n }\n\n for (var p = 0; p < payments.length; p++) {\n var payment = payments[p];\n\n summary.all += payment.value;\n summary.paymentTypes[payment.paymentTypeID].value += payment.value;\n }\n\n return summary;\n }\n\n function insert(data, successCallback, errorCallback) {\n\n function insertImpl(terminalID) {\n\n data.payment.terminalID = terminalID;\n\n repositorySvc.insert(\n Payment, // $resource\n null, // collection\n data, // entity\n successCallback,\n errorCallback);\n }\n\n terminalSvc.getSelectedTerminalID().then(function (terminalID) {\n insertImpl(terminalID);\n }, function (err) {\n insertImpl(null);\n });\n\n }\n\n function update(data, successCallback, errorCallback) {\n function updateImpl(terminalID) {\n\n data.payment.terminalID = terminalID;\n\n repositorySvc.update(\n Payment, // $resource\n null, // collection\n data, // entity\n successCallback,\n errorCallback,\n \"paymentID\");\n }\n\n terminalSvc.getSelectedTerminalID().then(function (terminalID) {\n updateImpl(terminalID);\n }, function (err) {\n updateImpl(null);\n });\n }\n\n function remove(data, successCallback, errorCallback) {\n repositorySvc.remove(\n Payment, // $resource\n null, // collection\n data, // entity\n successCallback, // successCallback\n errorCallback,\n null,\n \"paymentID\");\n }\n\n function clearPaymentEditModel(model, isAddBankPayment, isAddDuePayment, isOnlinePayment) {\n model.invoiceID = null;\n model.semesters.length = 0;\n model.semesterID = null;\n model.courses.length = 0;\n model.courseID = null;\n model.studentID = null;\n if (!isAddBankPayment && !isOnlinePayment) {\n model.amount = 0;\n var now = new Date();\n model.selectedDate = now;\n }\n model.activityID = null;\n model.activityReconciliationID = null;\n model.activities.length = 0;\n model.reconciliations.length = 0;\n model.reccurenceSchedules.length = 0;\n model.reservations.length = 0;\n model.reservationId = null;\n\n model.notes = \"\";\n model.serverError = null;\n }\n\n function isPaymentEditModelValid(model) {\n var commonIsValid = \n !!model.invoiceID &&\n !!model.studentID &&\n model.amount != 0 &&\n !!model.selectedDate;\n\n if (model.invoiceForType == 3) {\n return commonIsValid; \n }\n\n if (model.invoiceForType == 1 || model.invoiceForType == 2) {\n return commonIsValid && !!model.courseID;\n }\n\n if (model.invoiceForType == 4) {\n return commonIsValid;\n }\n }\n\n function initializePaymentEditModel(paymentDetail, isAddBankPayment, isAddDuePayment, isOnlinePayment) {\n\n var model = {\n courses: [],\n semesters: [],\n activities: [],\n reconciliations: [],\n reccurenceSchedules: [],\n reservations: []\n };\n\n if (!paymentDetail || !paymentDetail.paymentID) {\n model.paymentID = 0;\n model.paymentTypeID = 1;\n model.invoiceForType = 1; // 1 - regular courses, 2 - one off actions, 3 - activities, 4 - reservations\n clearPaymentEditModel(model, isAddBankPayment, isAddDuePayment, isOnlinePayment);\n if (isAddBankPayment) {\n model.amount = paymentDetail.amount;\n model.selectedDate = paymentDetail.selectedDate;\n model.paymentTypeID = 0;\n }\n if (isOnlinePayment) {\n model.amount = paymentDetail.amount;\n model.selectedDate = paymentDetail.selectedDate; \n model.paymentTypeID = 4;\n }\n if (isAddDuePayment) {\n model.invoiceForType = paymentDetail.invoiceForType;\n model.invoiceID = paymentDetail.invoiceID;\n }\n } else {\n model.paymentID = paymentDetail.paymentID;\n model.paymentTypeID = paymentDetail.paymentTypeID;\n model.invoiceForType = paymentDetail.invoiceForType;\n model.selectedDate = paymentDetail.selectedDate;\n model.amount = paymentDetail.amount;\n model.invoiceID = paymentDetail.invoiceID;\n model.cashReceiptNo = paymentDetail.cashReceiptNo;\n }\n\n return model;\n }\n\n function savePaymentEditModel(model, sendNotification, successCallback, errorCallback, transactionID, accountingBookID, isOnlinePayment) {\n\n var dto = {\n payment: {\n paymentID: model.paymentID,\n paymentTypeID: model.paymentTypeID,\n value: model.amount,\n paymentDate: model.selectedDate,\n invoiceID: model.invoiceID,\n notes: model.notes,\n typeID: model.invoiceForType,\n // This is wrong!! typeReferenceID for Courses And Actions should contain CourseRegistrationID\n // The same wrong code is in PaymentService.UpdateAsync\n typeReferenceID: model.invoiceForType === 3\n ? model.activityReconciliationID\n : model.courseID,\n studentID: model.studentID, \n cashReceiptNo: model.paymentTypeID === 1 ? model.cashReceiptNo : null,\n isReccuring: model.invoiceForType === 3 && !model.activityReconciliationID && !!model.invoiceID\n },\n sendNotification: sendNotification\n };\n\n if (!model.paymentID) {\n if (transactionID) {\n dto.transactionID = transactionID;\n dto.accountingBookId = accountingBookID;\n if (isOnlinePayment) {\n return insertAndBindOnlineTransactionAsync(dto, successCallback, errorCallback);\n } else {\n return insertAndBindTransactionAsync(dto, successCallback, errorCallback);\n }\n } else {\n return insert(dto, successCallback, errorCallback);\n }\n } else {\n return update(dto, successCallback, errorCallback);\n }\n }\n\n function insertAndBindOnlineTransactionAsync(data, successCallback, errorCallback) {\n return repositorySvc.customPost(\n 'insertAndBindOnlineTransaction',\n Payment,\n data,\n successCallback,\n errorCallback\n )\n }\n\n function insertAndBindTransactionAsync(data, successCallback, errorCallback) {\n return repositorySvc.customPost(\n 'insertAndBindTransaction',\n Payment,\n data,\n successCallback,\n errorCallback\n )\n }\n\n function issueTaxDocumentIfNeeded(paymentId, successCallback, errorCallback) {\n return repositorySvc.customPostWithParams(\n 'issueTaxDocumentIfNeeded',\n Payment,\n {\n paymentId: paymentId\n },\n {},\n successCallback,\n errorCallback,\n false\n )\n } \n\n return {\n calculateSummary: calculateSummary,\n insert: insert,\n update: update,\n remove: remove,\n initializePaymentEditModel: initializePaymentEditModel,\n clearPaymentEditModel: clearPaymentEditModel,\n isPaymentEditModelValid: isPaymentEditModelValid,\n savePaymentEditModel: savePaymentEditModel,\n getAllForUserAsync: getAllForUserAsync,\n insertAndBindTransactionAsync: insertAndBindTransactionAsync,\n getAllRelatedPaymentsByInvoiceID: getAllRelatedPaymentsByInvoiceID,\n getAmortizationScheduleDuePayments: getAmortizationScheduleDuePayments,\n getAllForSemester: getAllForSemester,\n getAllForDateRange: getAllForDateRange,\n issueTaxDocumentIfNeeded: issueTaxDocumentIfNeeded\n }\n }\n]);\n","'use strict';\n\nwbApp.directive('wbItemTypeCombo', ['$timeout', '$q', '$translate', 'itemTypeSvc', 'rentItemSvc',\n function ($timeout, $q, $translate, itemTypeSvc, rentItemSvc) {\n function formatResult(model) {\n if (!model) {\n return \"\";\n }\n\n return model.name;\n }\n\n function formatSelection(model) {\n return model.name;\n }\n\n return {\n restrict: 'A',\n require: '?ngModel',\n priority: 1,\n scope: {\n placeId: '=',\n rentCategoryId: '=',\n allowClear: '='\n },\n link: function (scope, elm, attrs, controller) {\n\n var oldRentCategoryId = scope.rentCategoryId;\n var allItemTypes = itemTypeSvc.getAll();\n var models = [];\n\n if (!!scope.placeId && !!scope.rentCategoryId) {\n var deferred = $q.defer();\n models.$promise = deferred.promise;\n var usedTypeIdsPromise = rentItemSvc.getUsedItemTypes(scope.placeId, scope.rentCategoryId);\n \n $q.all([allItemTypes.$promise, usedTypeIdsPromise.$promise]).then(function (data) {\n models.push.apply(models, _.filter(data[0], function (itemType) {\n return _.indexOf(data[1], itemType.id) != -1;\n }));\n deferred.resolve(models);\n if (models.length >= 1 && !scope.allowClear) {\n if (!_.find(models, { id: controller.$viewValue})) {\n $(elm).select2('val', models[0].id);\n controller.$setViewValue(models[0].id);\n } else {\n _.forEach(controller.$viewChangeListeners, function (listener) {\n listener();\n });\n }\n } \n });\n } else {\n models = allItemTypes;\n models.$promise.then(function () {\n if (models.length == 1) {\n $(elm).select2('val', models[0].id);\n controller.$setViewValue(models[0].id);\n }\n });\n }\n\n models.$promise.then(function () {\n $timeout(function () {\n\n $(elm).select2({\n placeholder: $translate.instant('TXT_MENU_ITEM_TYPE'),\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: (typeof scope.allowClear !== 'undefined') ? scope.allowClear : true,\n minimumResultsForSearch: -1,\n id: function (model) { return model.id; },\n data: models,\n sortResults: data => data.sort((a, b) => a.name.localeCompare(b.name))\n });\n\n controller.$render = function () {\n if (elm.select2('val') != controller.$viewValue) {\n elm.select2('val', controller.$viewValue);\n }\n };\n\n controller.$render();\n });\n\n scope.$watch('rentCategoryId', function (newValue) {\n if (oldRentCategoryId != newValue) {\n oldRentCategoryId = newValue;\n var usedTypeIdsPromise = rentItemSvc.getUsedItemTypes(scope.placeId, scope.rentCategoryId);\n usedTypeIdsPromise.$promise.then(function (data) {\n models.length = 0;\n models.push.apply(models, _.filter(allItemTypes, function (itemType) {\n return _.indexOf(data, itemType.id) != -1;\n }));\n\n if (models.length == 1) {\n $(elm).select2('val', models[0].id);\n controller.$setViewValue(models[0].id);\n } else {\n $(elm).select2('val', null);\n controller.$setViewValue(null);\n }\n });\n }\n });\n\n elm.on('change', function () {\n scope.$apply(function () {\n controller.$setViewValue(elm.select2('val'));\n });\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n controller.$render();\n }, 1);\n }\n }\n }]);","wbApp.filter('wbItemType', ['$translate', 'itemTypeSvc', function ($translate, itemTypeSvc) {\n\n function asyncResult(input) {\n var models = itemTypeSvc.getAll();\n if (models.$resolved) {\n var model = _.find(models, { id: input });\n if (model) {\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","wbApp.filter('wbRentCategory', ['$translate', 'rentCategorySvc', function ($translate, rentCategorySvc) {\n function asyncResult(input) {\n var models = rentCategorySvc.getAll();\n if (models.$resolved) {\n var model = _.find(models, { id: input });\n if (model) {\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","wbApp.filter('wbRentCategoryGroup', ['$translate', 'rentCategoryGroupSvc', function ($translate, rentCategoryGroupSvc) {\n function asyncResult(input) {\n var models = rentCategoryGroupSvc.getAll();\n if (models.$resolved) {\n var model = _.find(models, { id: input });\n if (model) {\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","wbApp.filter('wbRentItemExternalId', ['$translate', 'rentItemSvc', function ($translate, rentItemSvc) {\n function asyncResult(input) {\n var models = rentItemSvc.getAll();\n if (models.$resolved) {\n var model = _.find(models, { id: input });\n if (model) {\n return model.externalId;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","wbApp.filter('wbRentItemName', ['$translate', 'rentItemSvc', function ($translate, rentItemSvc) {\n function asyncResult(input) {\n var models = rentItemSvc.getAll();\n if (models.$resolved) {\n var model = _.find(models, { id: input });\n if (model) {\n return model.name;\n } else {\n return '';\n }\n } else {\n return $translate.instant('TXT_LOADING_DATA');\n }\n }\n\n asyncResult.$stateful = true;\n\n return asyncResult;\n}]);","wbApp.factory('itemTypeSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var ItemType = $resource('/restapi/item-types/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/item-types/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/item-types' },\n 'getByPlaceAndRentCategory': { method: 'GET', isArray: true, url: '/restapi/item-types/find-by-place-and-rent-category' },\n 'insert': { method: 'POST', url: '/restapi/item-types' },\n 'update': { method: 'PUT', url: '/restapi/item-types/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/item-types/:id' },\n });\n\n var itemTypes;\n\n function createNew()\n {\n var itemType = {\n isNew: true\n };\n\n return itemType;\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n ItemType,\n model);\n }\n\n function remove(itemTypeId) {\n itemTypes = null;\n return repositorySvc.customDelete(\n 'delete',\n ItemType,\n { id: itemTypeId });\n }\n\n function update(model) {\n itemTypes = null;\n return repositorySvc.customPutWithParams(\n 'update',\n ItemType,\n { id: model.id },\n convertDatesToDateString(model));\n }\n\n function getById(itemTypeId) {\n return repositorySvc.customGet('getById', ItemType, { id: itemTypeId });\n }\n\n function getAll(refresh) {\n if (!itemTypes || refresh) {\n itemTypes = repositorySvc.customGet('getAll', ItemType, {});\n }\n return itemTypes;\n }\n\n function getByPlaceAndRentCategory(placeId, rentCategoryId) {\n return repositorySvc.customGet('getByPlaceAndRentCategory', ItemType, { placeId: placeId, rentCategoryId: rentCategoryId });\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getAll: getAll,\n getByPlaceAndRentCategory: getByPlaceAndRentCategory,\n insert: insert,\n remove: remove,\n update: update,\n }\n }\n]);","wbApp.factory('rentCategoryGroupSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var RentCategory = $resource('/restapi/rent-category-groups/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/rent-category-groups/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/rent-category-groups' },\n 'getAllByPlace': { method: 'GET', isArray: true, url: '/restapi/rent-category-groups/find-by-place' },\n 'insert': { method: 'POST', url: '/restapi/rent-category-groups' },\n 'update': { method: 'PUT', url: '/restapi/rent-category-groups/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/rent-category-groups/:id' },\n });\n\n var rentCategories;\n\n function createNew()\n {\n var rentCategory = {\n isNew: true,\n isActive: true\n };\n\n return rentCategory;\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n RentCategory,\n model);\n }\n\n function remove(rentCategoryId) {\n rentCategories = null;\n return repositorySvc.customDelete(\n 'delete',\n RentCategory,\n { id: rentCategoryId });\n }\n\n function update(model) {\n rentCategories = null;\n return repositorySvc.customPutWithParams(\n 'update',\n RentCategory,\n { id: model.id },\n convertDatesToDateString(model));\n }\n\n function getById(rentCategoryId) {\n return repositorySvc.customGet('getById', RentCategory, { id: rentCategoryId });\n }\n\n function getAllByPlace(placeId) {\n return repositorySvc.customGet('getAllByPlace', RentCategory, { placeId: placeId });\n }\n\n function getAll(refresh) {\n if (!rentCategories || refresh) {\n rentCategories = repositorySvc.customGet('getAll', RentCategory, { includeNotActive: true });\n }\n return rentCategories;\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getAll: getAll,\n getAllByPlace: getAllByPlace,\n insert: insert,\n remove: remove,\n update: update,\n }\n }\n]);","wbApp.factory('rentCategorySvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var RentCategory = $resource('/restapi/rent-categories/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/rent-categories/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/rent-categories' },\n 'getAllByPlace': { method: 'GET', isArray: true, url: '/restapi/rent-categories/find-by-place' },\n 'insert': { method: 'POST', url: '/restapi/rent-categories' },\n 'update': { method: 'PUT', url: '/restapi/rent-categories/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/rent-categories/:id' },\n });\n\n var rentCategories;\n\n function createNew()\n {\n var rentCategory = {\n isNew: true,\n itemSelectionType: 1,\n rentingPeriodType: 0,\n minimumRentingPeriods: 60,\n maximumRentingPeriods: 120,\n minimumNumberOfRentedItem: 1,\n maximumNumberOfRentedItems: 1,\n rentingPeriodStepSize: 60,\n rentHourStartType: 1,\n accessPermissions: 0,\n isActive: true\n };\n\n return rentCategory;\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n RentCategory,\n model);\n }\n\n function remove(rentCategoryId) {\n rentCategories = null;\n return repositorySvc.customDelete(\n 'delete',\n RentCategory,\n { id: rentCategoryId });\n }\n\n function update(model) {\n rentCategories = null;\n return repositorySvc.customPutWithParams(\n 'update',\n RentCategory,\n { id: model.id },\n convertDatesToDateString(model));\n }\n\n function getById(rentCategoryId) {\n return repositorySvc.customGet('getById', RentCategory, { id: rentCategoryId });\n }\n\n function getAllByPlace(placeId) {\n return repositorySvc.customGet('getAllByPlace', RentCategory, { placeId: placeId });\n }\n\n function getAll(refresh) {\n if (!rentCategories || refresh) {\n rentCategories = repositorySvc.customGet('getAll', RentCategory, { includeNotActive: true });\n }\n return rentCategories;\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getAll: getAll,\n getAllByPlace: getAllByPlace,\n insert: insert,\n remove: remove,\n update: update,\n }\n }\n]);","wbApp.factory('rentItemAvailabilitySvc', ['$resource', '$q', 'repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var RentItemAvailability = $resource('/restapi/item-types/:id', {}, {\n 'getAllByPlaceAndRentCategoryAndTypeAndDateRange': { method: 'GET', url: '/restapi/rent-item-availability/range/find-by-place-and-rent-category-and-item-type' },\n });\n\n\n // groupBy: [GroupByRentCategory|GroupByRentItem]\n function getAllByPlaceAndRentCategoryAndTypeAndDateRange(\n placeId,\n rentCategoryId,\n itemTypeId,\n fromDateUtc,\n toDateUtc,\n groupBy)\n {\n return repositorySvc.customGet(\n 'getAllByPlaceAndRentCategoryAndTypeAndDateRange',\n RentItemAvailability,\n {\n placeId: placeId,\n rentCategoryId: rentCategoryId,\n itemTypeId: itemTypeId,\n fromDateUtc: moment(fromDateUtc).startOf('day').utc().format(),\n toDateUtc: moment(toDateUtc).endOf('day').utc().format(),\n groupBy: groupBy\n });\n }\n\n return {\n getAllByPlaceAndRentCategoryAndTypeAndDateRange: getAllByPlaceAndRentCategoryAndTypeAndDateRange\n }\n }\n]);","wbApp.factory('rentItemSvc', ['$resource', '$q','repositorySvc',\n function ($resource, $q, repositorySvc) {\n\n var RentItem = $resource('/restapi/rent-items/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/rent-items/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/rent-items' },\n 'getAllByPlaceAndRentCategory': { method: 'GET', isArray: true, url: '/restapi/rent-items/find-by-place-and-rent-category' },\n 'insert': { method: 'POST', url: '/restapi/rent-items' },\n 'update': { method: 'PUT', url: '/restapi/rent-items/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/rent-items/:id' },\n });\n\n var rentItems;\n\n function createNew()\n {\n var rentItem = {\n isNew: true,\n itemCondition: 0\n };\n\n return rentItem;\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n RentItem,\n model);\n }\n\n function remove(rentItemId) {\n rentItems = null;\n return repositorySvc.customDelete(\n 'delete',\n RentItem,\n { id: rentItemId });\n }\n\n function update(model) {\n rentItems = null;\n return repositorySvc.customPutWithParams(\n 'update',\n RentItem,\n { id: model.id },\n convertDatesToDateString(model));\n }\n\n function getById(rentItemId) {\n return repositorySvc.customGet('getById', RentItem, { id: rentItemId });\n }\n\n function getAll(refresh) {\n if (!rentItems || refresh) {\n rentItems = repositorySvc.customGet('getAll', RentItem, {});\n }\n return rentItems;\n }\n\n function resolvedEmptyArrayPromise() {\n var deferred = $q.defer();\n deferred.resolve([]);\n var result = [];\n result.$promise = deferred.promise;\n return result;\n }\n\n function getAllByPlaceAndRentCategory(placeId, rentCategoryId) {\n\n if (!placeId || !rentCategoryId) {\n return resolvedEmptyArrayPromise();\n }\n\n return repositorySvc.customGet('getAllByPlaceAndRentCategory', RentItem, {\n placeId: placeId,\n rentCategoryId: rentCategoryId\n });\n }\n\n function getUsedItemTypes(placeId, rentCategoryId) {\n\n if (!placeId || !rentCategoryId) {\n return resolvedEmptyArrayPromise();\n }\n\n var deferred = $q.defer();\n var result = [];\n \n\n repositorySvc.customGet('getAllByPlaceAndRentCategory', RentItem, {\n placeId: placeId,\n rentCategoryId: rentCategoryId\n }).$promise.then(function (data) {\n result.push.apply(result, _.keys(_.groupBy(data, function (item) { return item.itemTypeId; })));\n deferred.resolve(result);\n });\n\n result.$promise = deferred.promise;\n return result;\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getAll: getAll,\n getAllByPlaceAndRentCategory: getAllByPlaceAndRentCategory,\n getUsedItemTypes: getUsedItemTypes,\n insert: insert,\n remove: remove,\n update: update,\n }\n }\n]);","wbApp.factory('rentSvc', ['$resource', '$q', 'repositorySvc', \n function ($resource, $q, repositorySvc) {\n\n var Rent = $resource('/restapi/rents/:id', {}, {\n 'getById': { method: 'GET', url: '/restapi/rents/:id' },\n 'getAll': { method: 'GET', isArray: true, url: '/restapi/rents' },\n 'getAllByPlaceAndDateRange': { method: 'GET', isArray: true, url: '/restapi/rents/info/range/find-by-place' },\n 'getAllByPlaceAndItemAndDateRange': { method: 'GET', isArray: true, url: '/restapi/rents/info/range/find-by-place-and-item' },\n 'getAllByPlaceAndRentCategoryAndTypeAndUserDateRange': { method: 'GET', isArray: true, url: '/restapi/rents/info/range/find-by-place-and-rent-category-and-item-type-and-user' },\n 'getAllByPlaceAndRentCategoryAndTypeAndDateRange': { method: 'GET', isArray: true, url: '/restapi/rents/info/range/find-by-place-and-rent-category-and-item-type' },\n 'insert': { method: 'POST', url: '/restapi/rents' },\n 'update': { method: 'PUT', url: '/restapi/rents/:id' },\n 'delete': { method: 'DELETE', url: '/restapi/rents/:id' },\n });\n\n function createNew(placeId)\n {\n // TODO: set up time based on rent category\n // TODO: rounding to closes X minutes\n const now = moment();\n const remainder = 30 - (now.minute() % 30);\n const start = now.add(remainder, \"minutes\");\n\n // TODO: default rent length\n const end = moment(start).add(1, \"hour\");\n\n var rent = {\n isNew: true,\n placeId: placeId,\n fromUtc: start.toDate(),\n toUtc: end.toDate(),\n rentedItems: [],\n status: {\n id: null,\n createdAtUtc: null,\n status: 0,\n notes: null\n }\n };\n\n return rent;\n }\n\n function modelToDTO(model) {\n var dto = angular.copy(model);\n dto.fromUtc = moment(dto.fromUtc).utc().format();\n dto.toUtc = moment(dto.toUtc).utc().format();\n\n return dto;\n }\n\n function insert(model) {\n return repositorySvc.customPost(\n 'insert',\n Rent,\n modelToDTO(model));\n }\n\n function remove(rentId) {\n return repositorySvc.customDelete(\n 'delete',\n Rent,\n { id: rentId });\n }\n\n function update(model) {\n return repositorySvc.customPutWithParams(\n 'update',\n Rent,\n { id: model.id },\n convertDatesToDateString(model));\n }\n\n function getById(rentId) {\n return repositorySvc.customGet('getById', Rent, { id: rentId });\n }\n\n function getAll(refresh) {\n return repositorySvc.customGet('getAll', Rent, {});\n }\n\n function getAllByPlaceAndDateRange(placeId, fromDateUtc, toDateUtc) {\n return repositorySvc.customGet('getAllByPlaceAndDateRange', Rent, {\n fromDateUtc: moment(fromDateUtc).startOf('day').utc().format(),\n toDateUtc: moment(toDateUtc).endOf('day').utc().format(),\n placeId: placeId,\n expanded: 'PersonalInformation,RentItemDetails,RentCategoryDetails,ItemTypeDetails'\n });\n }\n\n function getAllByPlaceAndItemAndDateRange(placeId, itemId, fromDateUtc, toDateUtc) {\n return repositorySvc.customGet('getAllByPlaceAndItemAndDateRange', Rent, {\n fromDateUtc: moment(fromDateUtc).startOf('day').utc().format(),\n toDateUtc: moment(toDateUtc).endOf('day').utc().format(),\n placeId: placeId,\n itemId: itemId,\n expanded: 'PersonalInformation,RentItemDetails,RentCategoryDetails,ItemTypeDetails'\n });\n }\n\n\n function getAllByPlaceAndRentCategoryAndTypeAndUserDateRange(placeId, rentCategoryId, itemTypeId, userId, fromDateUtc, toDateUtc) {\n return repositorySvc.customGet('getAllByPlaceAndRentCategoryAndTypeAndUserDateRange', Rent, {\n fromDateUtc: moment(fromDateUtc).startOf('day').utc().format(),\n toDateUtc: moment(toDateUtc).endOf('day').utc().format(),\n placeId: placeId,\n rentCategoryId: rentCategoryId,\n itemTypeId: itemTypeId,\n userId: userId,\n expanded: 'PersonalInformation,RentItemDetails,RentCategoryDetails,ItemTypeDetails'\n });\n }\n\n function getAllByPlaceAndRentCategoryAndTypeAndDateRange(placeId, rentCategoryId, itemTypeId, fromDateUtc, toDateUtc) {\n return repositorySvc.customGet('getAllByPlaceAndRentCategoryAndTypeAndDateRange', Rent, {\n fromDateUtc: moment(fromDateUtc).startOf('day').utc().format(),\n toDateUtc: moment(toDateUtc).endOf('day').utc().format(),\n placeId: placeId,\n rentCategoryId: rentCategoryId,\n itemTypeId: itemTypeId,\n expanded: 'PersonalInformation,RentItemDetails,RentCategoryDetails,ItemTypeDetails'\n });\n }\n\n return {\n createNew: createNew,\n getById: getById,\n getAll: getAll,\n getAllByPlaceAndDateRange: getAllByPlaceAndDateRange,\n getAllByPlaceAndItemAndDateRange: getAllByPlaceAndItemAndDateRange,\n getAllByPlaceAndRentCategoryAndTypeAndUserDateRange: getAllByPlaceAndRentCategoryAndTypeAndUserDateRange,\n getAllByPlaceAndRentCategoryAndTypeAndDateRange: getAllByPlaceAndRentCategoryAndTypeAndDateRange,\n insert: insert,\n remove: remove,\n update: update,\n modelToDTO: modelToDTO\n }\n }\n]);","var webooker_courses_models = webooker_courses_models || {};\r\n\r\n(function (ns) {\r\n\r\n // #region CourseRegistration - ctor\r\n\r\n ns.CourseRegistration = function CourseRegistration(dto /* Webooking.Common.Model.CourseRegistrationDTO */) {\r\n\r\n this.courseRegistrationID = dto.courseRegistrationID;\r\n this.courseID = dto.courseID;\r\n this.studentID = dto.studentID;\r\n this.studentName = dto.studentName;\r\n this.studentSurname = dto.studentSurname;\r\n this.studentMiddleName = dto.studentMiddleName;\r\n this.studentBirthday = dto.studentBirthday;\r\n this.price = dto.price;\r\n this.payments = _.transform((dto.payments || []), function (result, p) {\r\n result.push(new ns.courseRegistrationPayment(p));\r\n }, []);\r\n\r\n // Copy orig array without transforming it to js model\r\n // The transformation happens in the initialize method\r\n this.registeredAttendance = (dto.registeredAttendance || []).slice();\r\n\r\n this.contactPhone = dto.contactPhone || null;\r\n this.contactEmail = dto.contactEmail || null;\r\n this.registrationDate = dto.registrationDate;\r\n this.notes = dto.notes;\r\n this.notificationSent = dto.notificationSent;\r\n this.preAmendsCount = dto.preAmendsCount;\r\n this.timeBoundAmendCount = dto.timeBoundAmendCount;\r\n this.timeBoundAmendExpiration = dto.timeBoundAmendExpiration;\r\n this.attendantHealth = dto.attendantHealth;\r\n this.parentFullName = dto.parentFullName || null;\r\n this.parentID = dto.parentID || 0;\r\n this.tenantID = dto.tenantID;\r\n\r\n // Assign without transforming it to js model\r\n // The transformation happens in the initialize method\r\n this.invoice = dto.invoice;\r\n this.invoiceID = dto.invoiceID;\r\n\r\n this.semesterID = dto.semesterID;\r\n this.semesterName = dto.semesterName;\r\n this.courseFullName = dto.courseFullName;\r\n this.firstDate = dto.firstDate;\r\n this.allowMultiAttendance = dto.allowMultiAttendance;\r\n this.reservedPlaces = dto.reservedPlaces;\r\n this.health = dto.health || null;\r\n this.selfAssessedProficiencyLevelID = dto.selfAssessedProficiencyLevelID;\r\n this.paymentsSum = dto.paymentsSum;\r\n this.arrear = dto.arrear;\r\n this.studentFullName = dto.studentFullName;\r\n this.studentAge = dto.studentAge;\r\n this.smsCode = dto.smsCode;\r\n\r\n\r\n // ---------------------------- Non DTO properties ----------------------------\r\n this.isNew = !!dto.isNew;\r\n this.attend = !!dto.attend;\r\n\r\n\r\n this.$initialized = false;\r\n\r\n };\r\n\r\n // #endregion\r\n\r\n // TODO: CreateNew Async!\r\n\r\n // #region CourseRegistration - methods\r\n\r\n // course { \r\n // price: 0, \r\n // fixedPrice: 0, ,\r\n // remainingLessons: 0, \r\n // scheduleWithAttendance: [ \r\n // { \r\n // courseScheduleID: 0,\r\n // attendance: [ { studentID: 0, courseAttendanceFeeType: 0 } ]\r\n // } \r\n // ] }\r\n // Returns: promise\r\n ns.CourseRegistration.prototype.initialize = function (\r\n $q,\r\n invoiceSvc,\r\n promotionSvc,\r\n attendanceSvc,\r\n coursePriceSvc,\r\n course,\r\n isAction,\r\n isAdmin,\r\n doNotPreselect) {\r\n \r\n var self = this;\r\n\r\n self.$initialized = true;\r\n self.$allowClientLessonSelection = course.allowClientLessonSelection;\r\n\r\n return $q(function (resolve, reject) {\r\n\r\n self.attend = !self.isNew;\r\n\r\n var promises = [];\r\n\r\n var invoice = null;\r\n if (self.courseRegistrationID) {\r\n invoice = invoiceSvc.getLatestByCourseRegistration(self.courseRegistrationID);\r\n promises.push(invoice.$promise);\r\n } else {\r\n invoice = {\r\n lineItems: []\r\n };\r\n }\r\n\r\n var promotionNow = self.registrationDate || new Date();\r\n var studentPromotionNow = promotionNow;\r\n \r\n if (self.registeredAttendance.length) {\r\n var registeredLessons = _.sortBy(_.filter(self.registeredAttendance, { courseAttendanceType: 0 }), 'startDate');\r\n\r\n if (registeredLessons.length) {\r\n promotionNow = registeredLessons[0].startDate;\r\n studentPromotionNow = promotionNow;\r\n }\r\n\r\n // var filteredRegisteredLessons = _.filter(registeredLessons, { courseAttendanceType: 0 });\r\n // if (filteredRegisteredLessons && filteredRegisteredLessons.length) {\r\n // studentPromotionNow = filteredRegisteredLessons[0].startDate;\r\n // } else {\r\n // studentPromotionNow = promotionNow;\r\n // }\r\n }\r\n\r\n var promotions = null;\r\n var attendance = null;\r\n if (self.parentID && self.studentID) {\r\n promotions = promotionSvc.getPromotionsByStudentsAsync(\r\n self.parentID, [{ studentID: self.studentID }], !!isAction ? 'action' : 'course', promotionNow, studentPromotionNow, isAdmin);\r\n promises.push(promotions.$promise);\r\n\r\n attendance = attendanceSvc.getStudentCourseAttendanceByUser(self.courseID, self.studentID, self.parentID, true);\r\n promises.push(attendance.$promise);\r\n }\r\n\r\n $q.all(promises).then(function () {\r\n\r\n var attModels = [];\r\n\r\n angular.forEach(self.registeredAttendance, function (ra) {\r\n attModels.push(new webooker_courses_models.CourseRegistrationAttendance(ra))\r\n });\r\n\r\n self.registeredAttendance.length = 0;\r\n self.registeredAttendance.push.apply(self.registeredAttendance, attModels);\r\n\r\n if (attendance) {\r\n var mnow = moment();\r\n var attMap = _.zipObject(_.map(attendance, 'courseScheduleID'), attendance);\r\n _.forEach(self.registeredAttendance, function (ra) {\r\n var courseScheduleID = ra.courseScheduleID;\r\n var att = attMap[courseScheduleID];\r\n if (att) {\r\n ra.courseAttendanceType = att.attendanceType;\r\n ra.courseAttendanceStatus = att.attendanceStatus;\r\n ra.oldCourseAttendanceType = att.attendanceType;\r\n ra.oldCourseAttendanceStatus = att.attendanceStatus;\r\n ra.attendanceCount = att.attendanceCount;\r\n }\r\n\r\n if (!ra.isDisabled && !self.courseRegistrationID && moment(ra.startDate).isAfter(mnow) && !doNotPreselect) {\r\n ra.isRegistered = true;\r\n }\r\n });\r\n }\r\n\r\n self.invoice = new webooker_courses_models.CourseRegistrationInvoice(\r\n coursePriceSvc,\r\n course,\r\n self.registeredAttendance,\r\n !!promotions ? promotions[self.studentID] || [] : [],\r\n invoice);\r\n\r\n self.invoice.$courseRegistration = self;\r\n\r\n if (isAction && !!self.registeredAttendance && !!self.registeredAttendance.length) {\r\n self.reservedPlaces = self.registeredAttendance[0].attendanceCount;\r\n \r\n self.$attend = !self.isNew && self.registeredAttendance[0].courseAttendanceStatus === 0;\r\n }\r\n\r\n resolve(self);\r\n\r\n }, reject);\r\n });\r\n }\r\n\r\n ns.CourseRegistration.prototype.preInitNew = function (\r\n $q,\r\n courseScheduleSvc,\r\n course,\r\n isAction, \r\n doNotPreselect)\r\n {\r\n var self = this;\r\n\r\n return $q(function (resolve, reject) {\r\n\r\n self.isNew = true;\r\n self.courseID = course.courseID,\r\n self.registrationDate = new Date();\r\n self.preAmendsCount = course.preAmendsCount;\r\n self.timeBoundAmendCount = course.timeBoundAmendCount;\r\n self.timeBoundAmendExpiration = course.timeBoundAmendExpiration;\r\n self.allowMultiAttendance = course.allowMultiAttendance;\r\n self.reservedPlaces = 1;\r\n\r\n var mnow = moment();\r\n\r\n courseScheduleSvc.getAllAsync(course.courseID).$promise.then(\r\n function (schedules) {\r\n\r\n _.forEach(schedules, function (schedule) {\r\n var isRegistered = !!isAction\r\n ? true\r\n : moment(schedule.startDate).isAfter(mnow);\r\n\r\n if (doNotPreselect) {\r\n isRegistered = false;\r\n }\r\n\r\n self.registeredAttendance.push({\r\n courseScheduleID: schedule.courseScheduleID,\r\n startDate: schedule.startDate,\r\n endDate: schedule.endDate,\r\n isRegistered: isRegistered,\r\n courseAttendanceType: isRegistered ? 0 : null, // 0 - Registered, 1 - OneOff, 2 - Amend, 3 - Preview\r\n courseAttendanceStatus: isRegistered ? 0 : null, // 0 - Present, 1 - NotPresentNotExcused, 2 - NotPresentExcused, 3 - NotPresentExcusedNoCompensation\r\n attendanceNotes: null,\r\n attendanceCount: 1\r\n });\r\n });\r\n\r\n resolve(self);\r\n\r\n }, reject);\r\n });\r\n }\r\n \r\n ns.CourseRegistration.prototype.toJSON = function () {\r\n return {\r\n courseRegistrationID: this.courseRegistrationID,\r\n courseID: this.courseID,\r\n studentID: this.studentID,\r\n studentName: this.studentName,\r\n studentSurname: this.studentSurname,\r\n studentMiddleName: this.studentMiddleName,\r\n studentBirthday: this.studentBirthday,\r\n price: this.price,\r\n payments: this.payments,\r\n registeredAttendance: this.registeredAttendance,\r\n contactPhone: this.contactPhone,\r\n contactEmail: this.contactEmail,\r\n registrationDate: this.registrationDate,\r\n notes: this.notes,\r\n notificationSent: this.notificationSent,\r\n preAmendsCount: this.preAmendsCount,\r\n timeBoundAmendCount: this.timeBoundAmendCount,\r\n timeBoundAmendExpiration: this.timeBoundAmendExpiration,\r\n attendantHealth: this.attendantHealth,\r\n parentFullName: this.parentFullName,\r\n parentID: this.parentID,\r\n tenantID: this.tenantID,\r\n invoice: this.invoice,\r\n semesterID: this.semesterID,\r\n semesterName: this.semesterName,\r\n courseFullName: this.courseFullName,\r\n firstDate: this.firstDate,\r\n allowMultiAttendance: this.allowMultiAttendance,\r\n reservedPlaces: this.reservedPlaces,\r\n health: this.health,\r\n selfAssessedProficiencyLevelID: this.selfAssessedProficiencyLevelID,\r\n paymentsSum: this.paymentsSum,\r\n arrear: this.arrear,\r\n studentFullName: this.studentFullName,\r\n studentAge: this.studentAge,\r\n smsCode: this.smsCode\r\n }\r\n }\r\n\r\n\r\n ns.CourseRegistration.prototype.markErrorAttendance = function (scheduleIDs) {\r\n\r\n var scheduleIDsNormalized = scheduleIDs || [];\r\n\r\n _.forEach(this.registeredAttendance, function (a) {\r\n if (scheduleIDsNormalized.indexOf(a.courseScheduleID) === -1) {\r\n a.$hasError = false;\r\n } else {\r\n a.$hasError = true;\r\n }\r\n });\r\n }\r\n\r\n ns.CourseRegistration.prototype.updateCapacityByRefreshedSchedules = function (schedules) {\r\n\r\n var scheduleMap = _.zipObject(_.map(schedules, 'courseScheduleID'), schedules);\r\n\r\n _.forEach(this.registeredAttendance, function (a) {\r\n var newSchedule = scheduleMap[a.courseScheduleID];\r\n\r\n a.updateCapacityByRefreshedSchedule.call(a, newSchedule);\r\n });\r\n }\r\n\r\n // #endregion\r\n\r\n\r\n // #region CourseRegistration - properties\r\n\r\n // Does not overbook capacity\r\n Object.defineProperty(ns.CourseRegistration.prototype, 'isAllNewSelected', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n var res = _.reduce(this.registeredAttendance, function (res, a) {\r\n return res && (a.isUserEditable ? a.isRegistered : true);\r\n }, true);\r\n\r\n return res && !!_.find(this.registeredAttendance, { isUserEditable: true, isRegistered: true }) && this.isNew;\r\n }, \r\n set: function (value) {\r\n _.forEach(this.registeredAttendance, function (a) {\r\n if (a.isUserEditable) {\r\n a.isRegistered = value;\r\n }\r\n });\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistration.prototype, 'isAnySelected', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return _.reduce(this.registeredAttendance, function (res, a) {\r\n return res || (a.isUserEditable && a.isRegistered);\r\n }, false) && this.isNew;\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistration.prototype, 'isAnySelectable', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return _.find(this.registeredAttendance, { isUserEditable: true });\r\n }\r\n });\r\n \r\n Object.defineProperty(ns.CourseRegistration.prototype, 'attend', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return this.$attend || (this.isAnySelected && !!this.$allowClientLessonSelection);\r\n },\r\n set: function (value) {\r\n this.$attend = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistration.prototype, 'actionAttendanceStatus', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n if (!!this.registeredAttendance && !!this.registeredAttendance.length) {\r\n return this.registeredAttendance[0].courseAttendanceStatus;\r\n }\r\n \r\n return 0;\r\n }\r\n \r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistration.prototype, 'isInThePast', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return _.reduce(this.registeredAttendance, function (res, a) {\r\n return res && a.isInThePast;\r\n }, true);\r\n }\r\n });\r\n\r\n // Overpayment is not included here, so it is not a real arrear but rather\r\n // what should be your next payment\r\n Object.defineProperty(ns.CourseRegistration.prototype, 'arrearByAmortizationSchedule', {\r\n enumerable: true, configurable: true,\r\n get: function () { \r\n if (!!this.invoice) {\r\n return Math.max(this.invoice.totalByamortizationSchedule - this.paymentsSum, 0);\r\n }\r\n return 0;\r\n }\r\n });\r\n\r\n // #endregion\r\n\r\n\r\n})(webooker_courses_models);","var webooker_courses_models = webooker_courses_models || {};\r\n\r\n(function (ns) {\r\n\r\n // #region CourseRegistrationAttendance - ctor\r\n ns.CourseRegistrationAttendance = function CourseRegistrationAttendance(courseRegistrationAttendanceDTO) {\r\n this.courseScheduleID = courseRegistrationAttendanceDTO.courseScheduleID;\r\n this.startDate = courseRegistrationAttendanceDTO.startDate;\r\n this.endDate = courseRegistrationAttendanceDTO.endDate;\r\n this.courseAttendanceType = courseRegistrationAttendanceDTO.courseAttendanceType;\r\n this.courseAttendanceStatus = courseRegistrationAttendanceDTO.courseAttendanceStatus;\r\n\r\n // Save old values\r\n this.oldCourseAttendanceType = courseRegistrationAttendanceDTO.courseAttendanceType;\r\n this.oldCourseAttendanceStatus = courseRegistrationAttendanceDTO.courseAttendanceStatus;\r\n\r\n this.attendanceNotes = courseRegistrationAttendanceDTO.attendanceNotes;\r\n this.attendanceCount = courseRegistrationAttendanceDTO.attendanceCount || 1;\r\n\r\n // Link to User schedule for calculation of free places for whole user (client section registration)\r\n this.$courseRegistrationUserSchedule = null;\r\n\r\n this.$hasError = false;\r\n };\r\n // #endregion\r\n\r\n\r\n\r\n // #region CourseRegistrationAttendance - Properties\r\n Object.defineProperty(ns.CourseRegistrationAttendance.prototype, 'isRegistered', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return this.courseAttendanceType === 0;\r\n },\r\n set: function (value) {\r\n if (value) {\r\n if (this.oldCourseAttendanceType === 0) {\r\n this.courseAttendanceType = this.oldCourseAttendanceType;\r\n this.courseAttendanceStatus = this.oldCourseAttendanceStatus;\r\n\r\n } else {\r\n this.courseAttendanceType = 0;\r\n this.courseAttendanceStatus = 0;\r\n }\r\n } else {\r\n if (this.oldCourseAttendanceType !== 0) {\r\n this.courseAttendanceType = this.oldCourseAttendanceType;\r\n this.courseAttendanceStatus = this.oldCourseAttendanceStatus;\r\n } else {\r\n this.courseAttendanceType = null;\r\n this.courseAttendanceStatus = null;\r\n }\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationAttendance.prototype, 'isDisabled', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n var dis = this.courseAttendanceType === 1 ||\r\n this.courseAttendanceType === 2 ||\r\n this.courseAttendanceType === 3;\r\n\r\n if (this.$courseRegistrationUserSchedule) {\r\n dis = dis || (this.$courseRegistrationUserSchedule.freePlaces === 0 && !this.isRegistered);\r\n }\r\n\r\n return dis;\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationAttendance.prototype, 'isInThePast', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return moment(this.startDate).isBefore(moment());\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationAttendance.prototype, 'isUserEditable', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return !this.isInThePast && !this.isDisabled;\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationAttendance.prototype, 'hasChanged', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n \r\n return (this.oldCourseAttendanceType !== this.courseAttendanceType) ||\r\n (this.oldCourseAttendanceStatus !== this.courseAttendanceStatus);\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationAttendance.prototype, 'freePlaces', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n if (this.$courseRegistrationUserSchedule) {\r\n return this.$courseRegistrationUserSchedule.freePlaces;\r\n }\r\n\r\n return 0;\r\n }\r\n });\r\n\r\n // #endregion\r\n\r\n ns.CourseRegistrationAttendance.prototype.toJSON = function () {\r\n return {\r\n courseScheduleID: this.courseScheduleID,\r\n startDate: this.startDate,\r\n endDate: this.endDate,\r\n courseAttendanceType: this.courseAttendanceType,\r\n courseAttendanceStatus: this.courseAttendanceStatus,\r\n attendanceNotes: this.attendanceNotes\r\n }\r\n }\r\n\r\n ns.CourseRegistrationAttendance.prototype.setUserScheduleBinding = function(courseRegistrationUserSchedule) {\r\n this.$courseRegistrationUserSchedule = courseRegistrationUserSchedule;\r\n }\r\n\r\n ns.CourseRegistrationAttendance.prototype.updateCapacityByRefreshedSchedule = function (schedule) {\r\n if (!this.$courseRegistrationUserSchedule || !schedule) {\r\n return;\r\n }\r\n\r\n this.$courseRegistrationUserSchedule.origCapacity = schedule.capacity;\r\n this.$courseRegistrationUserSchedule.origFilled = schedule.filled;\r\n\r\n if (this.$hasError && this.isRegistered && this.isUserEditable) {\r\n this.isRegistered = false;\r\n }\r\n }\r\n\r\n})(webooker_courses_models);","var webooker_courses_models = webooker_courses_models || {};\n\n(function (ns) {\n\n // #region CourseRegistrationInvoice - ctor\n ns.CourseRegistrationInvoice = function CourseRegistrationInvoice(coursePriceSvc, course, registeredAttendance, promotions, invoiceDTO) {\n\n var self = this;\n\n this.coursePriceSvc = coursePriceSvc;\n this.course = course;\n this.registeredAttendance = registeredAttendance;\n this.invoiceDTO = invoiceDTO;\n \n this.useAmortizationSchedule =\n (this.course.amortizationScheduleMode == 2 /* ForcedToAllClients */ && !this.invoiceDTO.invoiceID) ||\n (!!this.invoiceDTO.amortizationSchedules && !!this.invoiceDTO.amortizationSchedules.length);\n this._useAmortizationScheduleOrig = this.useAmortizationSchedule;\n this.amortizationScheduleSurchargePct = this.course.amortizationScheduleSurchargePct;\n\n //CourseFee = 1,\n //Discount = 2,\n //Membership = 3,\n //ManualAdjustment = 4,\n\n\n // Invoice\n //VAT: null\n //accountingBookID: 1\n //currency: \"CZK\"\n //customerOperatorID: 405\n //customerStudentID: 512\n //invoiceID: 313030\n //lineItems: Array[7]\n //total: 834.4\n\n // InvoiceLine\n //invoiceLineType: \"CourseFee\"\n //name: \"Student: Nikola Brabcová Kurz: Baletní přípravka - 3 - 6 let - začátečníci - PO 16:00\"\n //price: 960\n //quantity: null\n //typeReferenceID: 278090\n //unitPrice: null\n\n // Promotion\n //buy: false\n //description: null\n //discountPct: 5\n //isMandatory: false\n //membershipID: 110\n //name: \"Volitelná sleva platná\"\n //owns: true\n //price: 0\n\n this.dueDate = null;\n\n this.lines = [];\n // Course Fee Line\n\n var invoiceCourseFee = _.find(invoiceDTO.lineItems, { invoiceLineType: 'CourseFee' });\n this.lines.push(\n new webooker_courses_models.CourseRegistrationInvoiceLine(this, 'CourseFee', {\n owns: !!invoiceCourseFee,\n buy: !!invoiceCourseFee,\n name: invoiceCourseFee ? invoiceCourseFee.name : '',\n price: invoiceCourseFee ? invoiceCourseFee.price : '',\n discountPct: 0,\n isMandatory: 0,\n membershipID: null,\n description: null,\n isValid: true\n }, invoiceCourseFee)\n );\n\n // Find Memberships\n var invoiceMemberships = _.filter(invoiceDTO.lineItems, { invoiceLineType: 'Membership' });\n angular.forEach(promotions, function (item) {\n var invoiceMembership = _.find(invoiceMemberships, { typeReferenceID: item.membershipID });\n this.lines.push(\n new webooker_courses_models.CourseRegistrationInvoiceLine(this, 'Membership', {\n owns: item.owns,\n buy: item.buy,\n name: item.name,\n price: item.price,\n discountPct: item.discountPct,\n isMandatory: item.isMandatory,\n membershipID: item.membershipID,\n description: item.description,\n isValid: true,\n validFrom: item.validFrom,\n validTo: item.validTo\n }, invoiceMembership)\n );\n }, this);\n\n angular.forEach(invoiceMemberships, function (item) {\n var promotion = _.find(promotions, { membershipID: item.typeReferenceID });\n if (!promotion) {\n this.lines.push(\n new webooker_courses_models.CourseRegistrationInvoiceLine(this, 'Membership', {\n owns: true,\n buy: true,\n name: item.name,\n price: item.price,\n discountPct: 0,\n isMandatory: false,\n membershipID: item.typeReferenceID,\n description: null,\n isValid: false\n }, item));\n }\n }, this);\n\n var memberships = _.filter(this.lines, { lineType: 'Membership' });\n\n for (var i = 0; i < memberships.length; i++) {\n var m = memberships[i];\n var isInInvoice = _.find(invoiceDTO.lineItems, { invoiceLineType: 'Discount', typeReferenceID: m.membershipID });\n this.lines.push(\n new webooker_courses_models.CourseRegistrationInvoiceLine(this, 'Discount', m, isInInvoice)\n );\n }\n\n var invoiceDiscounts = _.filter(invoiceDTO.lineItems, { invoiceLineType: 'Discount' });\n _.forEach(invoiceDiscounts, function (discount) {\n var membership = _.find(memberships, { 'membershipID': discount.typeReferenceID });\n if (!membership) {\n // We do not have membership, this means the discount is in the invoice but \n // it is not valid anymore\n self.lines.push(\n new webooker_courses_models.CourseRegistrationInvoiceLine(self, 'Discount', {\n owns: true,\n buy: false,\n name: discount.name,\n price: discount.price,\n discountPct: 0,\n isMandatory: false,\n membershipID: discount.typeReferenceID,\n description: null,\n isValid: false\n }, discount));\n }\n });\n\n var manualsInInvoice = _.filter(invoiceDTO.lineItems, { invoiceLineType: 'ManualAdjustment' });\n _.forEach(manualsInInvoice, function (manualInInvoice) {\n self.lines.push(\n new webooker_courses_models.CourseRegistrationInvoiceLine(self, 'ManualAdjustment', {\n owns: !!manualInInvoice,\n buy: !!manualInInvoice,\n name: manualInInvoice ? manualInInvoice.name : '',\n price: manualInInvoice ? manualInInvoice.price : '',\n discountPct: 0,\n isMandatory: 0,\n membershipID: null,\n description: null,\n isValid: true\n }, manualInInvoice)\n );\n });\n\n this.invoiceLinesOrig = angular.copy(self.lines);\n\n //if (manualsInInvoice.length == 0)\n //{\n // self.lines.push(\n // new webooker_courses_models.CourseRegistrationInvoiceLine(self, 'ManualAdjustment', {\n // owns: false,\n // buy: false,\n // name: '',\n // price: '',\n // discountPct: 0,\n // isMandatory: 0,\n // membershipID: null,\n // description: null,\n // isValid: true\n // }, null)\n // );\n //}\n };\n // #endregion\n\n\n Object.defineProperty(ns.CourseRegistrationInvoice.prototype, 'noOfRegisteredAttendances', {\n enumerable: true, configurable: true,\n get: function () {\n return _.reduce(this.registeredAttendance, function (total, n) {\n if (n.isRegistered) {\n return total + (n.attendanceCount || 1);\n } else {\n return total;\n }\n }, 0);\n }\n });\n\n Object.defineProperty(ns.CourseRegistrationInvoice.prototype, 'membershipNow', {\n enumerable: true, configurable: true,\n get: function () {\n\n var promotionNow = this.course.registrationDate || new Date();\n\n var registeredLessons = _.sortBy(_.filter(this.registeredAttendance, { 'isRegistered': true }), 'startDate');\n\n if (registeredLessons && registeredLessons.length) {\n promotionNow = registeredLessons[0].startDate;\n }\n\n return moment(promotionNow).startOf('day').toDate();\n }\n });\n\n Object.defineProperty(ns.CourseRegistrationInvoice.prototype, 'total', {\n enumerable: true, configurable: true,\n get: function () {\n return _.reduce(this.lines, function (total, n) {\n if (n.isValid) {\n return total + n.price;\n } else {\n return total;\n }\n }, 0);\n }\n });\n\n Object.defineProperty(ns.CourseRegistrationInvoice.prototype, 'basePrice', {\n enumerable: true, configurable: true,\n get: function () {\n var courseFee = _.find(this.lines, { lineType: 'CourseFee' });\n return !!courseFee\n ? courseFee.price\n : 0;\n }\n });\n\n Object.defineProperty(ns.CourseRegistrationInvoice.prototype, 'isModified', {\n enumerable: true, configurable: true,\n get: function () {\n // Is any of the current lines modified?\n return _.reduce(this.lines, function (total, n) { \n return total || n.isModified;\n }, false) || !!this.dueDate || (this._useAmortizationScheduleOrig != this.useAmortizationSchedule) || \n !angular.equals(this.lines, this.invoiceLinesOrig);\n }\n });\n\n Object.defineProperty(ns.CourseRegistrationInvoice.prototype, 'totalByamortizationSchedule', {\n enumerable: true, configurable: true,\n get: function () {\n if (!!this.invoiceDTO.amortizationSchedules && !!this.invoiceDTO.amortizationSchedules.length) {\n // Calc by amortization schedule\n var mnow = moment().startOf('day');\n\n var totalByAmortizationSchedule = _.reduce(this.invoiceDTO.amortizationSchedules, function (total, n) {\n if (moment(n.issueAt).isSameOrBefore(mnow)) {\n return total + n.amount;\n }\n\n return total;\n }, 0);\n\n if (totalByAmortizationSchedule == 0 && this.invoiceDTO.amortizationSchedules.length > 0) {\n totalByAmortizationSchedule = this.invoiceDTO.amortizationSchedules[0].amount;\n }\n\n return totalByAmortizationSchedule;\n }\n else {\n return _.reduce(this.invoiceDTO.lineItems, function (total, n) {\n return total + n.price;\n }, 0);\n }\n }\n });\n\n\n ns.CourseRegistrationInvoice.prototype.toJSON = function () {\n return {\n dueDate: this.dueDate,\n lines: this.lines,\n useAmortizationSchedule: this.useAmortizationSchedule\n }\n }\n\n ns.CourseRegistrationInvoice.prototype.addManualAdjustmentLine = function (manualAdjustmentLineType) {\n var line = new webooker_courses_models.CourseRegistrationInvoiceLine(this, 'ManualAdjustment', {\n owns: false,\n buy: true,\n name: '',\n price: '',\n discountPct: 0,\n isMandatory: 0,\n membershipID: null,\n description: null,\n isValid: true\n }, null);\n line.runtimeManualAdjustmentType = manualAdjustmentLineType;\n\n this.lines.push(line);\n\n return line;\n }\n\n ns.CourseRegistrationInvoice.prototype.removeManualAdjustmentLine = function (line) {\n\n var index = this.lines.indexOf(line);\n if (index != -1) {\n this.lines.splice(index, 1);\n }\n }\n\n})(webooker_courses_models);","var webooker_courses_models = webooker_courses_models || {};\r\n\r\n(function (ns) {\r\n\r\n // #region CourseRegistrationInvoice - ctor\r\n ns.CourseRegistrationInvoiceLine = function CourseRegistrationInvoiceLine(courseRegistrationInvoice, lineType, promotion, invoiceLine) {\r\n\r\n this.getCourseRegistrationInvoice = function () { return courseRegistrationInvoice };\r\n this.lineType = lineType;\r\n if (promotion) {\r\n this.membershipID = promotion.membershipID;\r\n this.promotion = promotion;\r\n this.owns = promotion.owns;\r\n if (this.lineType === 'Membership') {\r\n this.promotion.buy = this.promotion.owns && !!invoiceLine;\r\n }\r\n } \r\n this.isInInvoice = !!invoiceLine;\r\n this.invoiceLine = invoiceLine;\r\n\r\n this.isNameEditable = this.lineType === 'ManualAdjustment';\r\n this.isValueEditable = this.lineType === 'ManualAdjustment';\r\n \r\n this.runtimeManualAdjustmentType = 0;\r\n this.runtimeManualAdjustmentPercentDiscount = 0;\r\n\r\n //CourseFee = 1,\r\n //Discount = 2,\r\n //Membership = 3,\r\n //ManualAdjustment = 4,\r\n\r\n\r\n\r\n // Membership\r\n //buy: false\r\n //description: null\r\n //discountPct: 5\r\n //isMandatory: false\r\n //membershipID: 110\r\n //name: \"Volitelná sleva platná\"\r\n //owns: true\r\n //price: 0\r\n\r\n };\r\n // #endregion\r\n\r\n ns.CourseRegistrationInvoiceLine.prototype.toJSON = function () {\r\n return {\r\n lineType: this.lineType,\r\n membershipID: this.membershipID,\r\n studentMembershipID: !!this.invoiceLine ? this.invoiceLine.studentMembershipID : null,\r\n buy: this.buy,\r\n price: this.price,\r\n name: this.runtimeManualAdjustmentType == 1 \r\n ? this.name + ' (' + parseFloat(this.percent).toFixed(2) + '%)'\r\n : this.name\r\n }\r\n }\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'isReadonly', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n // var parent = this.getCourseRegistrationInvoice();\r\n\r\n switch (this.lineType) {\r\n case 'CourseFee':\r\n return true;\r\n case 'Membership':\r\n return (this.promotion.owns && !this.isInInvoice) ||\r\n this.promotion.isMandatory ||\r\n !this.isValid;\r\n case 'ManualAdjustment':\r\n return false;\r\n default:\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'buy', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n switch (this.lineType) {\r\n case 'CourseFee':\r\n return true;\r\n case 'Membership':\r\n return (!!this.promotion.buy && !!this.isValid) ||\r\n (!!this.promotion.isMandatory && !!this.isValid && !(!!this.promotion.owns && !this.isInInvoice)); \r\n case 'ManualAdjustment':\r\n return this.promotion.buy;\r\n case 'Discount':\r\n return !!this.promotion.buy ||\r\n (!this.promotion.buy && !!this.promotion.owns && ((!this.isInInvoice && !this.promotion.isInInvoice) ||\r\n (!!this.isInInvoice && !this.promotion.isInInvoice)));\r\n default:\r\n return false;\r\n }\r\n },\r\n set: function (value) {\r\n switch (this.lineType) {\r\n case 'Membership':\r\n if (!this.isReadonly) {\r\n this.promotion.buy = value;\r\n }\r\n break;\r\n case 'ManualAdjustment':\r\n this.promotion.buy = value;\r\n if (!value)\r\n {\r\n var parent = this.getCourseRegistrationInvoice();\r\n parent.removeManualAdjustmentLine(this);\r\n }\r\n break;\r\n default:\r\n // Cannot be changed by default\r\n break;\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'price', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n var parent = this.getCourseRegistrationInvoice();\r\n\r\n switch (this.lineType) {\r\n case 'CourseFee':\r\n return parent.coursePriceSvc.getCourseBasePrice(\r\n parent.course,\r\n parent.noOfRegisteredAttendances,\r\n parent.$courseRegistration.reservedPlaces || 1,\r\n !!parent.useAmortizationSchedule);\r\n case 'Membership':\r\n return this.buy\r\n ? this.promotion.price\r\n : 0;\r\n case 'Discount':\r\n return this.buy\r\n ? (this.promotion.promotion ? -(parent.basePrice * this.promotion.promotion.discountPct) / 100 : this.promotion.price)\r\n : 0;\r\n case 'ManualAdjustment':\r\n return this.buy\r\n ? this.promotion.price\r\n : 0;\r\n default:\r\n return 0;\r\n }\r\n },\r\n set: function (value) {\r\n switch (this.lineType) {\r\n case 'ManualAdjustment':\r\n if (this.buy) {\r\n this.promotion.price = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'name', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n var parent = this.getCourseRegistrationInvoice();\r\n\r\n switch (this.lineType) {\r\n case 'CourseFee':\r\n return parent.coursePriceSvc.getCourseFeeLineName(\r\n parent.course,\r\n parent.noOfRegisteredAttendances,\r\n parent.useAmortizationSchedule);\r\n case 'Membership':\r\n return this.promotion.name;\r\n case 'Discount':\r\n if (this.promotion.promotion) {\r\n return parent.coursePriceSvc.gtDiscountLineStr(this.promotion.name, this.promotion.promotion.discountPct);\r\n }\r\n return this.promotion.name;\r\n case 'ManualAdjustment':\r\n return this.buy\r\n ? this.promotion.name\r\n : null;\r\n default:\r\n return this.promotion.name;\r\n }\r\n },\r\n set: function (value) {\r\n switch (this.lineType) {\r\n case 'ManualAdjustment':\r\n if (this.buy) {\r\n this.promotion.name = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'description', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n switch (this.lineType) {\r\n case 'Membership':\r\n return this.promotion.description;\r\n default:\r\n return '';\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'isValid', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n switch (this.lineType) {\r\n case 'Membership':\r\n if (this.promotion.validFrom) {\r\n var parent = this.getCourseRegistrationInvoice();\r\n var membershipNow = moment(parent.membershipNow);\r\n\r\n return moment(this.promotion.validFrom).isSameOrBefore(membershipNow) &&\r\n moment(this.promotion.validTo).isSameOrAfter(membershipNow);\r\n }\r\n else {\r\n return this.promotion.isValid;\r\n }\r\n case 'Discount':\r\n return (this.promotion.isValid && !!this.price);\r\n default:\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'isVisible', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n switch (this.lineType) {\r\n case 'Membership':\r\n return (!this.promotion.owns && this.isValid) || this.isInInvoice;\r\n case 'Discount':\r\n return (!!this.price || (!this.price && !!this.isInInvoice));\r\n default:\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'isModified', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n switch (this.lineType) {\r\n case 'CourseFee':\r\n return (!this.isInInvoice && this.buy && !!this.price) ||\r\n (this.isInInvoice && !this.isValid) ||\r\n (!!this.isInInvoice && !!this.buy && this.price !== this.invoiceLine.price);\r\n case 'Membership':\r\n return (!this.isInInvoice && this.buy) ||\r\n (!!this.isInInvoice && !this.buy) ||\r\n (!!this.isInInvoice && !!this.buy && this.price !== this.invoiceLine.price) ||\r\n (!!this.isInInvoice && !!this.buy && this.name !== this.invoiceLine.name);\r\n case 'ManualAdjustment':\r\n return (!!this.isInInvoice && !!this.buy && this.price !== this.invoiceLine.price) ||\r\n (!!this.isInInvoice && !!this.buy && this.name !== this.invoiceLine.name) ||\r\n (!this.isInInvoice && !!this.buy && !!this.price) ||\r\n (!!this.isInInvoice && (!this.buy || !this.price));\r\n default:\r\n return (!this.isInInvoice && this.buy && !!this.price) ||\r\n (this.isInInvoice && !this.isValid) ||\r\n (!!this.isInInvoice && !!this.buy && this.price !== this.invoiceLine.price) || \r\n (!!this.isInInvoice && !!this.buy && this.name !== this.invoiceLine.name);\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(ns.CourseRegistrationInvoiceLine.prototype, 'percent', {\r\n enumerable: true, configurable: true,\r\n get: function () {\r\n return this.runtimeManualAdjustmentPercentDiscount;\r\n },\r\n set: function (value) {\r\n switch (this.lineType) {\r\n case 'ManualAdjustment':\r\n if (this.buy) {\r\n this.runtimeManualAdjustmentPercentDiscount = value;\r\n var parent = this.getCourseRegistrationInvoice();\r\n this.promotion.price = -(parent.basePrice * value) / 100;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n})(webooker_courses_models);","var webooker_courses_models = webooker_courses_models || {};\n\n(function (ns) {\n\n // #region courseRegistrationPayment - ctor\n\n ns.courseRegistrationPayment = function courseRegistrationPayment(dto /* Webooking.Common.Model.PaymentDTO */) {\n\n this.paymentID = dto.paymentID;\n this.value = dto.value;\n this.paymentType = dto.paymentType;\n this.paymentDate = dto.paymentDate;\n this.cashReceiptNo = dto.cashReceiptNo;\n };\n\n // #endregion\n\n // #region courseRegistrationPayment methods\n\n ns.courseRegistrationPayment.prototype.toJSON = function () {\r\n return {\r\n paymentID: this.paymentID,\r\n value: this.value,\r\n paymentType: this.paymentType,\r\n paymentDate: this.paymentDate,\r\n cashReceiptNo: this.cashReceiptNo\r\n }\r\n }\n\n // #endregion\n\n\n\n})(webooker_courses_models);","var webooker_courses_models = webooker_courses_models || {};\n\n(function (ns) {\n\n // #region CourseRegistrationAttendance - ctor\n\n ns.CourseRegistrationUserSchedule = function CourseRegistrationUserSchedule(courseScheduleDTO) {\n\n this.origCapacity = courseScheduleDTO.capacity;\n this.origFilled = courseScheduleDTO.filled;\n\n this.startDate = courseScheduleDTO.startDate;\n this.endDate = courseScheduleDTO.endDate;\n this.courseScheduleID = courseScheduleDTO.courseScheduleID;\n\n this.$courseRegistrationAttendance = [];\n\n };\n\n // #endregion\n\n Object.defineProperty(ns.CourseRegistrationUserSchedule.prototype, 'freePlaces', {\r\n enumerable: true, configurable: true,\n get: function () {\r\n var origFreeCapacity = Math.max(0, this.origCapacity - this.origFilled);\r\n\r\n var placesRequiredByRegistration = _.reduce(this.$courseRegistrationAttendance, function (sum, a) {\r\n if (a.hasChanged) {\r\n return sum + (a.isRegistered ? 1 : 0);\r\n }\r\n\r\n return sum;\r\n }, 0);\r\n\r\n return Math.max(0, origFreeCapacity - placesRequiredByRegistration);\r\n }\r\n });\n\n ns.CourseRegistrationUserSchedule.prototype.addCourseRegistrationAttendance =\n function (courseRegistrationAttendance /* Array */) {\n this.$courseRegistrationAttendance = courseRegistrationAttendance;\r\n\r\n angular.forEach(this.$courseRegistrationAttendance, function (cra) {\r\n cra.setUserScheduleBinding.call(cra, this);\r\n }, this);\r\n }\n\n})(webooker_courses_models);","'use strict';\n\nwbApp.directive('wbInvoiceForCombo', ['$timeout', '$translate',\n function ($timeout, $translate) {\n function formatResult(paymentType) {\n if (!paymentType) { return; }\n return $translate.instant(paymentType.text);\n }\n\n function formatSelection(paymentType) {\n return $translate.instant(paymentType.text);\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elm, attrs, controller) {\n\n $timeout(function () {\n $(elm).select2({\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: [\n { id: 1, text: 'TXT_LAB_COURSE' },\n { id: 2, text: 'TXT_LAB_ACTION_SINGULAR' },\n { id: 3, text: 'TXT_LAB_KINDERGARTEN' },\n { id: 4, text: 'TXT_LAB_RESERVATION' },\n ]\n });\n\n controller.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n controller.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n controller.$render = function () {\n elm.select2('val', controller.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n controller.$setViewValue(elm.select2('val'));\n });\n });\n\n attrs.$observe('disabled', function (value) {\n elm.select2('enable', !value);\n });\n\n attrs.$observe('readonly', function (value) {\n elm.select2('readonly', !!value);\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n }, 1);\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbPaymentActivityCombo', ['$timeout',\n function ($timeout) {\n function formatResult(activity) {\n if (!activity) { return; }\n\n return activity.name;\n }\n\n function formatSelection(activity) {\n return activity.name;\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbActivities: '='\n },\n link: function (scope, elm, attrs, ngModel) {\n\n $timeout(function () {\n $(elm).select2({\n id: function (data) { return data.activityID; },\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: scope.wbActivities\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n elm.select2('val', ngModel.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n ngModel.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }, 1);\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbPaymentActivityReccurenceSchedulesCombo', ['$timeout', '$filter',\n function ($timeout, $filter) {\n function formatResult(model) {\n if (!model) { return; }\n\n return \"
\" +\n \"
\" + model.name + \"
\" +\n \"
\" + $filter('date')(model.issuedAt, 'shortDate') + \"
\" +\n \"
\" + $filter('wbCurrencyFlt')(model.price) + \"
\" +\n \"
\";\n\n return model.name;\n }\n\n function formatSelection(model) {\n return '{0} ({1} - {2})'.f(model.name, $filter('date')(model.issuedAt, 'shortDate'), $filter('wbCurrencyFlt')(model.price));\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbReccurenceSchedules: '='\n },\n link: function (scope, elm, attrs, ngModel) {\n\n $timeout(function () {\n $(elm).select2({\n id: function (data) {\n return data.invoiceID;\n },\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: scope.wbReccurenceSchedules\n });\n\n ngModel.$render();\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n elm.select2('val', ngModel.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n ngModel.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbPaymentActivityReconciliationCombo', ['$timeout', '$filter',\n function ($timeout, $filter) {\n function formatResult(model) {\n if (!model) { return; }\n\n return \"
\" +\n \"
\" + model.name + \"
\" +\n \"
\" + $filter('wbCurrencyFlt')(model.price) + \"
\" +\n \"
\";\n }\n\n function formatSelection(model) {\n return '{0} ({1})'.f(model.name, $filter('wbCurrencyFlt')(model.price));\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbReconciliations: '='\n },\n link: function (scope, elm, attrs, ngModel) {\n\n $timeout(function () {\n $(elm).select2({\n id: function (data) {\n return data.activityReconciliationID;\n },\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: scope.wbReconciliations\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n elm.select2('val', ngModel.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n ngModel.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }, 1);\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbPaymentCourseCombo', ['$timeout',\n function ($timeout) {\n function formatResult(course) {\n if (!course) { return; }\n\n return course.fullName;\n }\n\n function formatSelection(course) {\n return course.fullName;\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbCourses: '='\n },\n link: function (scope, elm, attrs, ngModel) {\n\n $timeout(function () {\n $(elm).select2({\n id: function (data) { return data.courseID; },\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: scope.wbCourses //scope.$eval(attrs.wbCourses)\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n elm.select2('val', ngModel.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n ngModel.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }, 1);\n }\n }\n }]);","wbApp.directive('wbPaymentEdit', ['$timeout', '$translate', 'invoiceSvc', 'paymentsSvc', 'reservationsSvc',\n function ($timeout, $translate, invoiceSvc, paymentsSvc, reservationsSvc) {\n\n return {\n restrict: 'A',\n // require: '^ngModel',\n scope: {\n model: '=ngModel',\n isAddBankPayment: '=',\n isAddDuePayment: '=',\n isOnlinePayment: '='\n },\n templateUrl: 'directives/payment-edit/payment-edit.html',\n controller: ['$scope', '$element', function ($scope, $element) {\n\n var studentChangedFromInvoice = false;\n\n $scope.onInvoiceForTypeChange = function () {\n paymentsSvc.clearPaymentEditModel($scope.model, $scope.isAddBankPayment, $scope.isAddDuePayment, $scope.isOnlinePayment);\n }\n\n $scope.onInvoiceChange = function (invoiceForType, invoiceID) {\n if (!invoiceID) {\n return;\n }\n\n if (invoiceForType == 4) // Reservations\n {\n var res = reservationsSvc.getByInvoice(invoiceID);\n res.then(function (data) {\n fillCombosForReservations([data], false);\n });\n }\n else {\n var res = invoiceSvc.getPaymentDetailsByInvoice(invoiceForType, invoiceID);\n res.$promise.then(function (data) {\n $scope.model.studentID = data.studentID;\n fillCombos(data);\n });\n }\n }\n\n $scope.onSemesterChange = function (semesterID) {\n changeSemester(0, semesterID, 0, 0);\n }\n\n $scope.onCourseChange = function (courseID) {\n changeCourse(courseID);\n }\n\n $scope.onActivityChange = function (activityID) {\n changeActivity(activityID, 0);\n }\n\n $scope.onActivityReconciliationChange = function (activityReconciliationID) {\n changeActivityReconciliation(activityReconciliationID);\n }\n\n $scope.onActivityReccurenceScheduleChange = function (issuedInvoiceID) {\n changeActivityReccurenceSchedule(issuedInvoiceID);\n }\n\n $scope.onReservationChange = function (reservationId) {\n var reservation = _.find($scope.model.reservations, { id: reservationId });\n if (!!reservation) {\n $scope.model.invoiceID = reservation.invoice.id;\n $scope.model.amount = reservation.invoice.arrear;\n $scope.model.notes = reservation.notes;\n }\n }\n\n $scope.onStudentChange = function (invoiceForType, studentID) {\n if (!studentID) {\n return;\n }\n\n if (studentChangedFromInvoice) {\n studentChangedFromInvoice = false;\n return;\n } else\n {\n $scope.model.invoiceID = null;\n }\n\n if (invoiceForType == 4) // Reservations\n {\n var res = reservationsSvc.getAllByRangeAndStudent(\n studentID,\n new Date(2000, 0, 1),\n new Date(3000, 0, 1));\n res.then(function (data) {\n fillCombosForReservations(data, true);\n });\n }\n else {\n var res = invoiceSvc.getPaymentDetailsByStudent(invoiceForType, studentID);\n res.$promise.then(function (data) {\n fillCombos(data);\n });\n }\n }\n\n function fillCombosForReservations(reservations, isInStudentSelection)\n {\n $scope.model.reservations.length = 0;\n $scope.model.reservations.push.apply($scope.model.reservations, reservations);\n\n var first = _.first(reservations);\n if (!first) {\n $scope.model.reservationId = null;\n return;\n }\n\n $scope.model.reservationId = first.id;\n\n var newStudentId = _.first(first.studentIds);\n if (!isInStudentSelection && $scope.model.studentID != newStudentId) {\n studentChangedFromInvoice = true;\n $scope.model.studentID = newStudentId; \n }\n\n if (isInStudentSelection) {\n $scope.model.invoiceID = first.invoice.id;\n }\n\n $scope.model.amount = first.invoice.arrear;\n $scope.model.notes = first.notes;\n }\n\n function fillCombos(data) {\n $scope.model.semesters.length = 0;\n $scope.model.semesters.push.apply($scope.model.semesters, data.semesters);\n $scope.model.semesterID = selectSemesterID($scope.model.semesters, data.selectedSemesterID);\n\n if ($scope.model.invoiceForType != 4) {\n changeSemester(data.selectedCourseID, $scope.model.semesterID, data.selectedActivityID, data.selectedActivityReconciliationID, data.selectedInvoiceID);\n } else {\n changeReservation(data.reservationID, data.selectedInvoiceID);\n }\n }\n\n function changeReservation(reservationID, selectedInvoiceID) {\n\n }\n\n function changeSemester(courseID, semesterID, activityID, activityReconciliationID, selectedInvoiceID) {\n var semester = findSemester($scope.model.semesters, semesterID);\n if (semester) {\n $scope.model.courses.length = 0;\n $scope.model.activities.length = 0;\n if ($scope.model.invoiceForType === 3) {\n $scope.model.activities.push.apply($scope.model.activities, semester.activities);\n $scope.model.activityID = selectActivityID($scope.model.activities, activityID);\n changeActivity($scope.model.activityID, activityReconciliationID, selectedInvoiceID);\n } else {\n $scope.model.courses.push.apply($scope.model.courses, semester.courses);\n $scope.model.courseID = selectCourseID($scope.model.courses, courseID);\n changeCourse($scope.model.courseID);\n }\n } else {\n alert('Semester not found');\n }\n }\n\n function changeActivity(activityID, activityReconciliationID, selectedInvoiceID) {\n var activity = findActivity($scope.model.activities, activityID);\n if (activity) {\n $scope.model.reconciliations.length = 0;\n $scope.model.reconciliations.push.apply($scope.model.reconciliations, activity.reconciliations);\n $scope.model.reccurenceSchedules.length = 0;\n $scope.model.reccurenceSchedules.push.apply($scope.model.reccurenceSchedules, activity.reccurenceSchedules);\n\n var issued = _.find($scope.model.reccurenceSchedules, { invoiceID: selectedInvoiceID });\n\n if (!issued && $scope.model.reconciliations.length > 0) {\n $scope.model.activityReconciliationID = selectActivityReconciliationID($scope.model.reconciliations, activityReconciliationID);\n if (!!$scope.model.activityReconciliationID) {\n changeActivityReconciliation($scope.model.activityReconciliationID);\n }\n } else {\n $scope.model.activityReconciliationID = 0;\n if ($scope.model.reccurenceSchedules.length > 0) {\n var issued = issued || $scope.model.reccurenceSchedules[0];\n $scope.model.issuedInvoiceID = issued.invoiceID;\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = Math.max(0, issued.price - issued.paymentSum);\n $scope.model.notes = \"\";\n }\n if ($scope.model.invoiceID !== $scope.model.issuedInvoiceID) {\n $scope.model.invoiceID = $scope.model.issuedInvoiceID;\n }\n } else {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = 0;\n }\n $scope.model.notes = \"\";\n if ($scope.model.invoiceID !== 0) {\n $scope.model.invoiceID = 0;\n }\n }\n }\n }\n }\n\n function changeCourse(courseID) {\n var course = findCourse($scope.model.courses, courseID);\n if (course) {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = Math.max(0, course.price - course.paymentSum);\n }\n $scope.model.notes = course.registrationNote;\n var newInvoiceID = !course.invoiceID ? 0 : course.invoiceID;\n if ($scope.model.invoiceID !== newInvoiceID) {\n $scope.model.invoiceID = newInvoiceID;\n }\n } else {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = 0;\n }\n $scope.model.notes = \"\";\n if ($scope.model.invoiceID !== 0) {\n $scope.model.invoiceID = 0;\n }\n }\n }\n\n function changeActivityReccurenceSchedule(issuedInvoiceID) {\n var schedule = _.find($scope.model.reccurenceSchedules, { invoiceID: issuedInvoiceID + \"\" });\n if (schedule) {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = Math.max(0, schedule.price - schedule.paymentSum);\n }\n $scope.model.notes = \"\";\n if ($scope.model.invoiceID !== schedule.invoiceID) {\n $scope.model.invoiceID = schedule.invoiceID;\n }\n $scope.model.activityReconciliationID = 0;\n } else {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = 0;\n }\n $scope.model.notes = \"\";\n if ($scope.model.invoiceID !== 0) {\n $scope.model.invoiceID = 0;\n }\n }\n }\n\n function changeActivityReconciliation(activityReconciliationID) {\n var reconciliation = findReconciliation($scope.model.reconciliations, activityReconciliationID);\n if (reconciliation) {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = Math.max(0, reconciliation.price - reconciliation.paymentSum);\n }\n $scope.model.notes = reconciliation.notes;\n var newInvoiceID = !reconciliation.invoiceID ? 0 : reconciliation.invoiceID;\n if ($scope.model.invoiceID !== newInvoiceID) {\n $scope.model.invoiceID = newInvoiceID;\n $scope.model.issuedInvoiceID = 0;\n }\n } else {\n if (!$scope.isAddBankPayment && !$scope.isOnlinePayment) {\n $scope.model.amount = 0;\n }\n $scope.model.notes = \"\";\n if ($scope.model.invoiceID !== 0) {\n $scope.model.invoiceID = 0;\n }\n }\n }\n\n function findReconciliation(reconciliations, activityReconciliationID) {\n return findByID(reconciliations, activityReconciliationID, \"activityReconciliationID\");\n }\n\n function findCourse(courses, courseID) {\n return findByID(courses, courseID, \"courseID\");\n }\n\n function findSemester(semesters, semesterID) {\n var res = findByID(semesters, semesterID, \"semesterID\");\n if (res) {\n return res;\n }\n return { courses: [] };\n }\n\n function findActivity(activities, activityID) {\n var res = findByID(activities, activityID, \"activityID\");\n if (res) {\n return res;\n }\n return { reconciliations: [] };\n }\n\n function selectSemesterID(semesters, semesterID) {\n return selectIDFromCollection(semesters, semesterID, \"semesterID\");\n }\n\n function selectCourseID(courses, courseID) {\n return selectIDFromCollection(courses, courseID, \"courseID\");\n }\n\n function selectActivityID(activities, activityID) {\n return selectIDFromCollection(activities, activityID, \"activityID\");\n }\n\n function selectActivityReconciliationID(reconciliations, activityReconciliationID) {\n return selectIDFromCollection(reconciliations, activityReconciliationID, \"activityReconciliationID\");\n }\n\n function findByID(collection, id, idPropertyName) {\n for (var i = 0; i < collection.length; i++) {\n if (collection[i][idPropertyName] === id) {\n return collection[i];\n }\n }\n }\n\n function selectIDFromCollection(collection, id, idPropertyName) {\n if (id) {\n return id;\n }\n\n if (!collection || !collection.length) {\n return 0;\n }\n\n return collection[0][idPropertyName];\n }\n\n if ($scope.model.paymentID) {\n var res = invoiceSvc.getPaymentDetailsByInvoice($scope.model.invoiceForType, $scope.model.invoiceID);\n res.$promise.then(function (data) {\n $scope.model.studentID = data.studentID;\n var amount = $scope.model.amount;\n var invoiceID = $scope.model.invoiceID;\n fillCombos(data);\n $scope.model.amount = amount;\n $scope.model.invoiceID = invoiceID;\n });\n } else if ($scope.isAddDuePayment && $scope.model.invoiceID) {\n $scope.onInvoiceChange($scope.model.invoiceForType, $scope.model.invoiceID)\n }\n\n\n }],\n\n link: function ($scope, $element, attrs, ctrl) {\n }\n }\n }]);","wbApp.directive('wbPaymentReservationCombo', ['$timeout',\n function ($timeout) {\n function formatSelection(reservation) {\n if (!reservation) { return \"\"; }\n return reservation.invoice.subject;\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbReservations: '='\n },\n link: function (scope, elm, attrs, ngModel) {\n\n $timeout(function () {\n $(elm).select2({\n id: function (data) { return data.id; },\n formatResult: formatSelection,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: scope.wbReservations \n });\n\n ngModel.$render = function () {\n elm.select2('val', ngModel.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n ngModel.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n }, 1);\n }\n }\n }]);","'use strict';\n\nwbApp.directive('wbPaymentSemesterCombo', ['$timeout', '$filter',\n function ($timeout, $filter) {\n function formatResult(semester) {\n if (!semester) { return; }\n\n return \"
\" +\n \"
\" + semester.name + \"
\" +\n \"
\" + $filter('date')(semester.startDate, 'shortDate') + ' - ' + $filter('date')(semester.endDate, 'shortDate') + \"
\" +\n \"
\";\n }\n\n function formatSelection(semester) {\n return '{0} ({1} - {2})'.f(semester.name, $filter('date')(semester.startDate, 'shortDate'), $filter('date')(semester.endDate, 'shortDate'));\n }\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n wbSemesters: '='\n },\n link: function (scope, elm, attrs, ngModel) {\n\n $timeout(function () {\n $(elm).select2({\n id: function (data) { return data.semesterID; },\n formatResult: formatResult,\n formatSelection: formatSelection,\n dropdownAutoWidth: true,\n allowClear: false,\n minimumResultsForSearch: -1,\n data: scope.wbSemesters\n });\n\n ngModel.$parsers.unshift(function (viewValue) {\n if (!viewValue) {\n return 0;\n } else {\n return parseInt(viewValue);\n }\n });\n\n ngModel.$formatters.unshift(function (value) {\n if (!value) {\n return \"0\";\n } else {\n return value + \"\";\n }\n });\n\n ngModel.$render = function () {\n elm.select2('val', ngModel.$viewValue);\n };\n\n elm.on('change', function () {\n scope.$apply(function () {\n ngModel.$setViewValue(elm.select2('val'));\n });\n });\n\n elm.bind(\"$destroy\", function () {\n elm.select2(\"destroy\");\n });\n\n }, 1);\n }\n }\n }]);"]}