{"version":3,"sources":["app/app.module.js","app/access/access.module.js","app/account/account.module.js","app/basicPages/accessibility/accessibility.module.js","app/basicPages/agreeTerms/agreeterms.module.js","app/basicPages/cookiePolicy/cookiepolicy.module.js","app/basicPages/cookies/cookies.module.js","app/basicPages/privacy/privacy.module.js","app/basicPages/termsAndConditions/terms.module.js","app/clients/clients.module.js","app/components/address/address.module.js","app/components/api/api.module.js","app/components/audit/audit.module.js","app/components/auth/auth.module.js","app/components/config/config.module.js","app/components/conversationDialog/conversationDialog.module.js","app/components/data-presentation/dataPresentation.module.js","app/components/dialog/dialog.module.js","app/components/documents/documents.module.js","app/components/download/download.module.js","app/components/filters/filters.module.js","app/components/form/form.module.js","app/components/loader/fitLoader.module.js","app/components/local-storage/storage.module.js","app/components/router/router.module.js","app/components/siteText/siteText.module.js","app/components/startup/startup.module.js","app/components/table/table.module.js","app/components/templates/templates.module.js","app/components/warning/warning.module.js","app/components/wizard/wizard.module.js","app/core/core.module.js","app/editableText/preview/preview.module.js","app/editableText/text.module.js","app/errorPage/error.module.js","app/generators/generators-search.module.js","app/home/homepage.module.js","app/idle/idle.module.js","app/installations/installations.module.js","app/landingPage/landing.module.js","app/layout/layout.module.js","app/levelisation/levelisation.module.js","app/nominatedRecipients/nominated-recipient.module.js","app/recipients/recipient.module.js","app/registration/registration.module.js","app/reports/reports.module.js","app/smartExportGuarantee/smartExportGuarantee.module.js","app/suppliers/suppliers.module.js","app/tariff/tariff.module.js","app/users/users.module.js","app/utils/utils.module.js","app/access/access.route.js","app/access/login.service.js","app/account/account.route.js","app/account/account.service.js","app/account/forgot-password.controller.js","app/account/password.controller.js","app/account/reset-password.controller.js","app/basicPages/accessibility/accessibility.route.js","app/basicPages/agreeTerms/agreeterms.controller.js","app/basicPages/agreeTerms/agreeterms.route.js","app/basicPages/cookiePolicy/cookiepolicy.route.js","app/basicPages/cookies/cookies.route.js","app/basicPages/privacy/privacy.route.js","app/basicPages/termsAndConditions/terms.controller.js","app/basicPages/termsAndConditions/terms.route.js","app/clients/client-edit.controller.js","app/clients/client-search.controller.js","app/clients/clients.route.js","app/components/address/address.service.js","app/components/api/data.service.js","app/components/api/paginated-data.service.js","app/components/audit/audit.controller.js","app/components/audit/auditTable.controller.js","app/components/audit/auditTable.directive.js","app/components/auth/auth.config.js","app/components/auth/auth.interceptor.js","app/components/auth/principal.js","app/components/auth/token.service.js","app/components/config/asyncConstants.js","app/components/config/constants.js","app/components/conversationDialog/conversation-dialog.controller.js","app/components/conversationDialog/message-cache.service.js","app/components/data-presentation/dataLayout.service.js","app/components/data-presentation/displayData.component.js","app/components/data-presentation/displayData.controller.js","app/components/data-presentation/displayDataIsVisible.filter.js","app/components/dialog/commentDialog.controller.js","app/components/dialog/dialog.controller.js","app/components/dialog/dialog.service.js","app/components/documents/documents.service.js","app/components/download/download.service.js","app/components/filters/duration.filter.js","app/components/filters/toLocalDate.filter.js","app/components/form/accordionSection.controller.js","app/components/form/addressSearch.controller.js","app/components/form/asyncSelect.controller.js","app/components/form/dragAndDrop/dragAndDrop.controller.js","app/components/form/dragAndDrop/dragAndDrop.directive.js","app/components/form/fitFilePicker.controller.js","app/components/form/fitForm/form.controller.js","app/components/form/fitForm/form.directive.js","app/components/form/fitForm/formError.service.js","app/components/form/fitTypeahead.controller.js","app/components/form/formly.config.fields.js","app/components/form/formly.config.js","app/components/form/formly.config.transforms.js","app/components/form/formly.config.validators.js","app/components/form/formTemplate.component.js","app/components/form/progressiveDisclosure.component.js","app/components/form/repeatSection.controller.js","app/components/form/reset-server-error.directive.js","app/components/form/select.controller.js","app/components/form/staticOptions.controller.js","app/components/loader/fitLoader.controller.js","app/components/loader/fitLoader.directive.js","app/components/local-storage/storage.config.js","app/components/router/route-manager.provider.js","app/components/siteText/siteText.service.js","app/components/startup/asyncAppSetup.config.js","app/components/startup/preloadedData.service.js","app/components/table/checkboxFilter.directive.js","app/components/table/dateFilter.directive.js","app/components/table/resetFilter.directive.js","app/components/table/table.controller.js","app/components/table/table.directive.js","app/components/table/table.service.js","app/components/table/tableHeader.directive.js","app/components/table/tableRefresh.directive.js","app/components/table/tableRowSelect.directive.js","app/components/table/tableValue.directive.js","app/components/task-view/assignTaskDialog.controller.js","app/components/task-view/taskView.component.js","app/components/task-view/taskView.controller.js","app/components/warning/serverWarning.component.js","app/components/warning/warningMessage.component.js","app/components/wizard/installations-wizard.service.js","app/components/wizard/wizardFormStep.component.js","app/components/wizard/wizardFormStep.controller.js","app/components/wizard/wizardStepDefinition.component.js","app/components/wizard/wizardStepDefinition.controller.js","app/core/config.js","app/core/core.routes.js","app/editableText/preview/preview.controller.js","app/editableText/text.controller.js","app/editableText/text.route.js","app/editableText/text.service.js","app/errorPage/error.route.js","app/generators/generators-search.route.js","app/home/homepage.controller.js","app/idle/idle.config.js","app/idle/idle.controller.js","app/idle/idle.service.js","app/installations/address/installations-address.controller.js","app/installations/approvalDocuments/approval-documents.component.js","app/installations/approvalDocuments/approval-documents.controller.js","app/installations/approvals/approve-edit.controller.js","app/installations/approvals/approve-extension.controller.js","app/installations/approvals/approve-installation.controller.js","app/installations/approvals/approve-recipient-reassignment.controller.js","app/installations/approvals/approve-status-change.controller.js","app/installations/approvals/installation-change-approval.component.js","app/installations/approvals/installation-change-approval.controller.js","app/installations/basicDetails/installations-basics.controller.js","app/installations/common/accreditationWarning.component.js","app/installations/common/capacity-details.component.js","app/installations/common/capacity-details.controller.js","app/installations/common/certificateWarning.component.js","app/installations/common/declaredCapacityWarning.component.js","app/installations/common/installations-accreditation.service.js","app/installations/common/installations-capacity.service.js","app/installations/common/installations-csvimport.controller.js","app/installations/common/installations-details.service.js","app/installations/common/installations-meters.service.js","app/installations/conversations/installation-conversation.service.js","app/installations/dateUpdates/installations-dates-edit.controller.js","app/installations/dateUpdates/installations-dates-find.controller.js","app/installations/edit/installation-edit-status.controller.js","app/installations/edit/installation-edit.controller.js","app/installations/efficiency/installations-efficiency.controller.js","app/installations/extensions/existing-installation-panel.component.js","app/installations/extensions/existing-installation-panel.controller.js","app/installations/extensions/extension-accreditation.controller.js","app/installations/extensions/extension-details.controller.js","app/installations/extensions/extension-efficiency.controller.js","app/installations/extensions/extension-export-status.controller.js","app/installations/extensions/extension-meters.controller.js","app/installations/extensions/extension-submission.controller.js","app/installations/extensions/extension.controller.js","app/installations/forms/installation-search-form.controller.js","app/installations/forms/installation-search-form.directive.js","app/installations/generators/installations-create-generator.controller.js","app/installations/generators/installations-generators.controller.js","app/installations/helpers/installationRoutingHelper.js","app/installations/helpers/installationsValidationHelper.js","app/installations/installation-storage.service.js","app/installations/installation.service.js","app/installations/installation/installation-actions.controller.js","app/installations/installation/installation-details.controller.js","app/installations/installation/installation-document-upload.controller.js","app/installations/installation/installation-internal-documents.controller.js","app/installations/installation/installation-reassign.controller.js","app/installations/installations-rules.service.js","app/installations/installations-search.controller.js","app/installations/installations.route.js","app/installations/landing/installations-landing.controller.js","app/installations/licences/installations-licences.controller.js","app/installations/meterInfo/display-meters.component.js","app/installations/meterInfo/display-meters.controller.js","app/installations/meterInfo/installations-meters.controller.js","app/installations/meterInfo/installations-metersValidation.service.js","app/installations/meterInfo/meters-form.component.js","app/installations/meterInfo/meters-form.controller.js","app/installations/multi.installation.service.js","app/installations/multiSite/installations-multiSite.controller.js","app/installations/recipient/installations-create-recipient.controller.js","app/installations/recipient/installations-recipient.controller.js","app/installations/recipient/reassignment/multiSite/recipient-multi-site.controller.js","app/installations/recipient/reassignment/recipient-reassignment-storage.service.js","app/installations/recipient/reassignment/recipient-reassignment-wizard.controller.js","app/installations/recipient/reassignment/selector/recipient-reassignment-creator.controller.js","app/installations/recipient/reassignment/selector/recipient-reassignment-selector.controller.js","app/installations/recipient/reassignment/submission/recipient-reassignment-submission.controller.js","app/installations/recipient/recipient-table.controller.js","app/installations/recipient/recipient-table.directive.js","app/installations/submission/installations-submission.controller.js","app/installations/switching/completeSwitch/installations-switch-complete.controller.js","app/installations/switching/installationDetails/installations-switch-details.controller.js","app/installations/switching/installations-switch-pending.controller.js","app/installations/switching/installations-switch-request.controller.js","app/installations/switching/installations-switch-search.controller.js","app/installations/switching/installations-switch-service.js","app/installations/switching/installationSwitchDetails.component.js","app/installations/switching/rejectSwitch/installations-switch-reject.controller.js","app/installations/tables/installation-document-table.controller.js","app/installations/tables/installation-document-table.directive.js","app/installations/tariff/installations-tariff.service.js","app/installations/technology/installations-technology.controller.js","app/landingPage/landing.controller.js","app/landingPage/landing.route.js","app/landingPage/landingTaskBar.component.js","app/landingPage/landingTaskBar.controller.js","app/layout/environmentflag.component.js","app/layout/environmentflag.controller.js","app/layout/navbar.controller.js","app/levelisation/data/editLevelisationData.controller.js","app/levelisation/data/installationDetails.component.js","app/levelisation/data/installations/levelisation-installation-table.component.js","app/levelisation/data/installations/levelisation-installation-table.controller.js","app/levelisation/data/levelisation-conversation.service.js","app/levelisation/data/levelisationApproval.service.js","app/levelisation/data/levelisationData.service.js","app/levelisation/data/levelisationDataDetails.component.js","app/levelisation/data/listLevelisationData.controller.js","app/levelisation/data/selectLevelisationData.controller.js","app/levelisation/data/variation/levelisationDataVariation.component.js","app/levelisation/data/variation/levelisationDataVariationDialogController.js","app/levelisation/data/viewLevelisationData.controller.js","app/levelisation/levelisation.route.js","app/levelisation/levelisation.service.js","app/levelisation/levelisationEdit.controller.js","app/levelisation/levelisationList.controller.js","app/levelisation/levelisationTasks.controller.js","app/levelisation/levelisationView.controller.js","app/levelisation/mutualisation/editLevelisationMutualisation.controller.js","app/levelisation/mutualisation/levelisationMutualisation.service.js","app/levelisation/mutualisation/levelisationMutualisationApproval.service.js","app/levelisation/mutualisation/listLevelisationMutualisation.controller.js","app/levelisation/mutualisation/viewLevelisationMutualisation.controller.js","app/levelisation/payment/editLevelisationPayment.controller.js","app/levelisation/payment/levelisationPayment.service.js","app/levelisation/payment/levelisationPaymentApproval.service.js","app/levelisation/payment/listLevelisationPayment.controller.js","app/levelisation/payment/viewLevelisationOverpayment.controller.js","app/levelisation/payment/viewLevelisationPayment.controller.js","app/levelisation/results/viewLevelisationResults.controller.js","app/levelisation/shortfall/levelisationShortfall.service.js","app/levelisation/shortfall/levelisationShortfallApproval.service.js","app/levelisation/shortfall/listLevelisationShortfall.controller.js","app/levelisation/shortfall/viewLevelisationShortfall.controller.js","app/levelisation/shortfall/viewShortfallSummaryTable.controller.js","app/nominatedRecipients/nominated-recipient-search.route.js","app/recipients/creator/recipient-creator.component.js","app/recipients/creator/recipient-creator.controller.js","app/recipients/dialog/recipient-dialog.service.js","app/recipients/forms/recipient-search-form.controller.js","app/recipients/forms/recipient-search-form.directive.js","app/recipients/recipient.service.js","app/recipients/recipient.type.service.js","app/recipients/recipient/recipient-details-component.js","app/recipients/recipient/recipient-edit.controller.js","app/recipients/recipient/recipient-installations.controller.js","app/recipients/recipient/recipient.controller.js","app/recipients/recipient/recipientDetails.controller.js","app/recipients/recipientRoutingHelper.js","app/recipients/recipients-search.controller.js","app/recipients/selector/recipient-selector.component.js","app/recipients/selector/recipient-selector.controller.js","app/registration/confirmation/registration-confirm.controller.js","app/registration/licenses/registration-licenses.controller.js","app/registration/registration-data.service.js","app/registration/registration.route.js","app/registration/registration.service.js","app/registration/supplier/registration-supplier.controller.js","app/registration/user/registration-modal.controller.js","app/registration/user/registration-user.controller.js","app/reports/dynamic-report.controller.js","app/reports/fixed/audit-history.controller.js","app/reports/fixed/fit-summary.controller.js","app/reports/fixed/public-installations.controller.js","app/reports/report-filter.service.js","app/reports/report.service.js","app/reports/reports.route.js","app/smartExportGuarantee/smartExportGuarantee.controller.js","app/smartExportGuarantee/smartExportGuarantee.route.js","app/smartExportGuarantee/smartExportGuarantee.service.js","app/suppliers/suppliers.controller.js","app/suppliers/suppliers.route.js","app/suppliers/suppliers.service.js","app/suppliers/view/licence/licence-modal.controller.js","app/suppliers/view/licence/licence.service.js","app/suppliers/view/licence/licences.controller.js","app/suppliers/view/supplier.controller.js","app/tariff/create/tariff-create.controller.js","app/tariff/create/tariff-edit-item.controller.js","app/tariff/tariff-rpi.controller.js","app/tariff/tariff.controller.js","app/tariff/tariff.route.js","app/tariff/tariff.service.js","app/tariff/tariffRules.service.js","app/tariff/update/review/tariff-update-review.controller.js","app/tariff/update/tariff-update-cancel.controller.js","app/tariff/update/tariff-update.controller.js","app/users/external-user-resets.controller.js","app/users/user-form.controller.js","app/users/user-table.controller.js","app/users/users.route.js","app/users/users.service.js","app/utils/array.utils.js","app/utils/constant.utils.js","app/utils/eligibilityDate.service.js","app/utils/form.utils.js","app/utils/matchField.directive.js","app/utils/object.utils.js","app/utils/scope.utils.js","app/utils/string.utils.js","app/utils/validateChanged.directive.js","app/utils/validation.utils.js","app/bootstrap.js","../tmp/templates.js"],"names":["angular","module","constant","moment","configureRoutes","routeManager","addStates","state","config","templateUrl","url","run","loginService","$state","$log","$q","$uibModalStack","tokenService","login","emailAddress","password","extraHeaders","authenticate","then","go","reload","catch","reason","needToAcceptTerms","code","warn","reject","Error","getFailureMessage","saveTermsData","message","logout","unauthenticate","dismissAll","getTermsData","acceptTermsData","invalidTerms","invalidFirstTerms","invalidGrant","invalidLocked","terms","isFirstTime","factory","principal","title","data","permissions","only","views","","details@account","controller","controllerAs","params","supplierId","isMyAccountPage","parent","accountService","$uibModal","dataService","changePassword","currentPassword","newPassword","resolve","postToEndpoint","response","statusText","modelStateReasons","modelState","resetPassword","model","sendForgotPasswordEmail","ForgotPasswordController","loadModel","email","cancelForm","saveModel","vm","emailSent","this","formOptions","buttons","save","cancel","formFields","type","key","templateOptions","required","label","PasswordController","toastr","processing","redirectToHomePageWithConfirmation","displayError","error","success","repeatedPassword","minLength","passwordRegex","ResetPasswordController","$stateParams","objectUtils","$onInit","copy","passwordChanged","optionsTypes","placeholder","matchFieldKey","matchFieldValidationMessage","AgreeTermsController","termsText","acceptTermsHeader","x-accept-terms","text","siteTextService","getTextValue","TermsPageController","termsData","ClientEditController","constants","constantUtils","returnToTable","fetchData","id","fetchDataFromEndpointById","when","putToEndpoint","browserType","findConstantValue","applicationTypes","nativeType","className","fieldGroup","strictLength","options","hideExpression","inline","ClientSearchController","paginatedDataService","tableData","fetchDataFromTableData","columns","displayProperty","unit","editState","editType","display@clients","addressService","$http","appConfig","localStorageService","getCountries","countries","get","countriesKey","requestUrl","apiRoot","mapAndCacheCountries","set","lookupAddress","postcode","encodeURIComponent","filterToAddressDetails","map","populateFullAddress","address","fullAddress","getFullAddress","nonZeroEntries","join","undefined","addressLine1","addressLine2","town","county","country","filter","isNotNullOrEmpty","value","isDefined","createAddressObjectFromModel","$window","$httpParamSerializerJQLike","endpoint","parseResponse","fetchDataFromEndpointWithParams","clean","queryString","obj","propName","isUndefined","sendDataToEndpoint","method","fetchDataFromEndpoint","result","service","forEach","deleteToEndpoint","delete","validationUtils","tableState","extraParams","getParamsFromTableData","addExtraParams","fetchDataFromParams","pagination","itemNumber","start","pageSize","number","pageNumber","Math","ceil","search","ret","extend","predicateObject","sort","predicate","sortDirection","reverse","sortBy","getEmptyData","pageCount","checkFieldPrefixesAndFetchData","idPrefixChecks","tableParams","checkFieldsHaveValidPrefixesThenNumeric","AuditHistoryController","entityName","name","entityType","entityId","returnState","href","AuditTableController","displayResults","numberOfPages","auditEntries","showAuthorColumn","_","some","loading","fitAuditTable","restrict","scope","bindToController","directive","configureAuth","$httpProvider","$windowProvider","jwtOptionsProvider","asyncAppSetupProvider","refreshPromise","tokenGetter","substr","length","getTokenOrRefresh","tokens","token","finally","unauthenticatedRedirector","whiteListedDomains","win","$get","doc","document","parser","createElement","hostname","registerAsyncSetupTask","interceptors","push","runAuth","$rootScope","authManager","scopeUtils","forbiddenListener","redirectWhenUnauthenticated","safeOn","fitAuthInterceptor","onResponseError","status","$broadcast","responseError","jwtHelper","PermPermissionStore","isAuthenticated","authenticated","authenticateFromToken","clearStore","tokenPayload","decodeToken","roles","role","isArray","identity","defineManyPermissions","permissionName","hasRole","getIdentity","getSupplierId","getName","indexOf","isInternal","isExternal","isSuperuser","tokenRequest","username","grant_type","clearTokens","fromLocalStorage","refreshToken","isTokenExpired","info","refresh_token","tokenKey","refreshTokenKey","defaults","client_id","clientId","encodedData","contentHeader","Content-Type","headers","skipAuthorization","access_token","saveTokens","error_description","remove","fetchConstantsAsynchronously","ensureConstantsLoaded","preloadedDataService","constantsPromise","fetchConstants","fetchStartupData","addToFitConstants","fitConstantValue","fitConstantKey","isIsoFormat","fitConstants","addToConstants","constantValue","constantKey","string","test","appTitle","ConversationDialogController","$uibModalInstance","buttonOptions","$scope","messageCacheService","setConversationAndReturnModel","conversation","comments","cacheId","sendMessage","apiPath","handleSuccessfulPost","handleError","dismiss","close","goToDetailsPage","onSubmit","cancelSubmit","$on","event","closing","clear","update","textBoxLabel","maxlength","rows","getCachedMessage","messageCache","updateCachedMessage","has","internal","external","clearMessageCache","dataLayoutService","getLayout","layout","layouts","validateLayout","numberOfColumns","isNotUndefinedOrEmpty","object","atLeastOneRowValueDefined","items","item","deMinimisNotAskedValue","deMinimisDeclarationSignedOptions","installationChanges","show","installationLayout","defaultValue","answerAndText","multiSiteLimit","installationCapacityLayout","showDependencies","description","idAsArray","tariffLayout","recipientLayout","addressLayout","supplyMeterLayout","mpanComment","mpanReason","rowValues","exportMeterLayout","generationMeterLayout","supplierLayout","documentsUploadedLayout","installation","installationCapacity","tariff","recipient","supplyMeter","exportMeter","generationMeter","supplier","documentsUploaded","component","bindings","historyref","returnstate","transclude","datafooter","displayDataController","$filter","getFormattedData","layoutItem","dataItem","getFormattedValue","dataArray","$watch","newData","displayDataIsVisibleFilter","layoutRowOrItemArray","shouldShow","layoutRowOrItem","getValues","getDependencies","layoutItems","dependency","CommentDialogController","submit","submittedModel","errorHandler","defaultErrorHandler","DialogController","showFooter","confirm","customBodyUrl","customBodyModel","dialogService","showDialog","open","size","defaultButtons","heading","showCommentDialog","isFunction","documentsService","Upload","downloadService","uploadAuthorisationLetter","file","upload","authDocumentUrl","documentType","filterDocumentIdFromApiResult","updateAuthorisationLetter","uploadPublicInstallationDocument","formModel","uploadInstallationDocument","uploadInternalInstallationDocument","docPermissionType","uploadInstallationDocumentUrl","documentId","filterDocumentConfigFromApiResult","openDocument","isPublic","download","uploadDocumentWithoutInstallation","uploadCsvImportDocument","uploadMpanDocument","uploadMpanDocumentUrl","getToken","tokenName","Object","keys","prefix","includes","fullPath","location","durationFilter","input","duration","humanize","toLocalDateFilter","local","format","AccordionSectionController","isInvalid","recursivelyCheckFieldIsInvalid","field","accordionModel","form","$invalid","fields","AddressSearchController","getPostcode","scopeModel","getScopeModel","to","addressModel","searchingAddress","addressesFound","addressesSearched","selectedAddress","foundAddresses","searchAddresses","addresses","selectAddress","removeAddressFromModel","populateFromModel","FitAsyncSelectController","setOptions","stopLoading","DragAndDropController","arrayUtils","init","getValue","property","valueProp","nameProp","optionsEndpoint","setAvailable","ngModel","$isEmpty","isEmpty","$render","render","selectAll","moveItems","availableItems","selectedItems","updateModel","unselectAll","removeItemFromListAndUpdate","sourceList","splice","newAllItems","allItems","$viewValue","slice","modelItem","$setTouched","val","$setViewValue","moved","dragAndDrop","linkFunction","element","attrs","ctrls","$dnd","availableTitle","selectedTitle","require","link","FitFilePickerController","filePicked","setFile","getId","counter","FitFormController","formErrorService","initialiseModel","persistantFieldsKey","handleSave","getDefaultButtons","getModel","loadFieldData","includeAddressFields","setCountries","setModel","saving","catchHandler","handleBack","back","handleCancel","displayLoadError","formLoaded","err","globalErrors","handled","extractGlobalErrors","fieldErrors","extractFieldErrors","fieldError","fieldName","displayFieldErrors","errors","errorFieldKey","fieldKeyMatchesError","targetField","toUpperCase","fieldConfig","flatMap","head","validation","formControl","$setValidity","$error","server","getAddressFields","mergeTemplateOptions","addressTemplateOptions","extendedFieldType","addressFieldsReadOnly","stSearch","expressionProperties","templateOptions.options","formState","concat","newVal","oldVal","fitForm","formProperty","summary","extractAllErrors","getErrorKeys","modelStateErrors","extractModelStateDictionary","isObject","isGlobalErrorFor","flatten","setErrorsByKey","fieldKey","formHasField","existingErrors","modelName","correctFieldNameCasing","stripFieldName","fieldIsGlobalInForm","components","split","lowerCaseFirstLetter","substring","section","charAt","toLowerCase","TypeaheadController","getItems","viewValue","maxResults","maxSearchResults","fragment","formlyConfig","formlyConfigProvider","stringUtils","setCurrencyField","decimalPlaces","validationQualifier","setType","extends","wrapper","defaultOptions","pattern","patternValidationMessage","fitField","capitalise","noOptionsMessage","minSearchLength","template","datepickerOptions","ngModelOptions","timezone","timepickerOptions","show-meridian","show-seconds","ngModelAttrs","attribute","bound","validators","mustSelectAddress","$modelValue","templateOptions.disabled","modelValue","addressVm","btnType","extras","skipNgModelAttrsManipulator","onClick","modelOptions","debounce","setWrapper","formlyConfigTransforms","templateManipulators","postWrapper","helpText","templateObject","querySelector","tooltip","append","outerHTML","fieldTransform","messages","fc","merge","setDecimalPlacesValidator","places","placesText","fieldIsGreaterThanComparison","isString","parseNumber","comparison","bothFieldsAreSet","targetFieldKey","currentFieldValue","prefixCheck","RegExp","getOriginalValue","modelToMatch","validateOnModelChange","matchField","findByProp","originalValue","invalidOriginal","fieldScope","dateInFuture","Date","setHours","dateNotInFuture","dateNotTodayOrInFuture","greaterThanZero","parseFloat","greaterThan","isValid","lessThanOrEqual","maxDecimalValue","maxValue","formlyRun","formlyValidationMessages","addStringMessage","addTemplateOptionValueMessage","body","RepeatSectionController","addNew","repeatsection","newsection","copyFields","addIds","repeaterId","getNextRepeaterId","index","unique","resetServerError","on","$apply","FitSelectController","updateOptions","StaticOptionsController","opts","selectedItem","setValue","$text","FitLoaderController","load","fitLoader","loaderProperty","header","content","footer","configureStorage","localStorageServiceProvider","setPrefix","routeManagerProvider","$stateProvider","$urlRouterProvider","RouteManager","$document","$transitions","setOtherwise","otherwise","otherwiseSet","states","resolveAlways","root","setTitleAndClearErrors","onSuccess","transition","toStateTitle","handlingRouteError","scrollTop","documentElement","handleRouteErrors","toState","toParams","fromState","fromParams","destination","getToStateName","errorMsg","getErrorMessage","msg","loadedTemplateUrl","configure","cfg","provider","textId","getTextValues","textIds","getEnvironmentValue","getAsyncAppSetup","$injector","runAllSetupTasks","setupTaskPromises","self","asyncSetupTaskFactories","invoke","all","promiseFactory","configureRouterProvider","deferIntercept","runAllAsyncConfiguration","$urlRouter","asyncAppSetup","sync","listen","fitCheckboxFilter","refreshTable","elem","attr","tableCtrl","change","modelProperty","fitDateFilter","find","bind","fitDateFilterController","popup","opened","openPopup","fitResetFilter","resetFieldsHandler","pipe","FitTableController","itemsPerPage","displayedPages","fetch","ctrl","suppressInitialLoad","pipeCalled","defaultSort","defaultSortDirection","onClickFunctions","hasError","showPagination","hasResults","noResults","getFieldAsAddress","downloadFile","fitTable","tableService","tableProperty","applyPermissions","tableParent","transcludeAndAttachTable","slot","clone","transcludeScope","rowValidProperty","rowSelectProperty","suffix","column","objectPermissionsAreValid","principalHasRole","except","fitTableHeader","$compile","headerLink","newElement","sortId","html","el","replaceWith","fitTableRefresh","refreshLink","refreshFilter","args","fitRowSelect","row","addClass","fitTableValue","valueLink","cell","cellModel","_compiledTemplate","getElementHtml","valueTemplate","condition","addressKey","gridReferenceKey","hasPostcode","button","showBtn","iconHtml","icon","decimalPlacesAfterPercentage","filterString","onChange","hideWhen","linkTextHtml","displayText","newStateIdProperty","updateCell","AssignTaskDialogController","submissionParams","endpoints","setUsers","users","resolveAssigneeName","assigneeId","i","assignTo","internalMessage","patchToEndpoint","assignMany","current","assigneeName","getUsers","group","customColumns","customFilters","showConversationDialog","getAssignParamsFromTask","csvOptions","taskOrderByOptions","setFilters","customMessageTypes","TaskViewController","toggleAssignTasksBtn","isSelected","task","selectedTasksForAssignment","enableAssignManyTasksBtn","fetchTasks","matchType","orderingId","getPaginatedTasks","assignTask","assignFailed","paramsForAssignment","showReassignDialog","notifyAssignSuccessAndReload","reloadPage","allOption","internalMessageLength","externalMessageLength","matchTypes","types","typeOptions","taskMatchTypes","messageTypes","columnObject","limit","isChecked","customFiltersToShow","isInternalOnly","fetchValues","values","assignManyTasks","warningType","installationWizardService","scrollToTop","scrollTo","setIsEnabledFunction","func","isEnabledFunctions","hasIsEnabledFunction","callIsEnabledFunction","setPageEntryFunction","canEnterFunctions","hasPageEntryFunction","callPageEntryFunction","firstPage","fullWidth","storageService","next","entryHandler","disabledExpression","WizardFormStepController","WizardHandler","advance","hideError","wizard","previous","serverError","handler","isEnabled","entryHandlerKey","isDisabledKey","WizardStepDefinitionController","isDisabled","canEnter","$logProvider","$uibTooltipProvider","debugEnabled","placement","addStateToRootscope","abstract","@","navbar@root","sidebar@root","footer@root","updateData","welcomeTextData","environmentName","bumpToLanding","TextPreviewController","textData","editableTextService","updateText","EditableTextController","preview","showPreviewModal","currentText","failure","changeSelection","hasData","getAllText","allText","toJson","patch","recipientTypeService","installationsRoutingHelper","recipientRoutingHelper","recipientType","getGeneratorRecipientParameters","searchState","display@generators-search","installations@generators-search#generator","getGeneratorSubstates","getInstallationDetailsStates","HomepageController","isLoggingIn","welcome","environment","backgroundColour","configureIdle","IdleProvider","KeepaliveProvider","idle","timeout","interval","runIdle","idleService","closeModals","warnUser","timeOutUser","stop","IdleController","formatCountdown","countdown","milliseconds","asMilliseconds","utc","Idle","watch","unwatch","warning","timedOut","InstallationAddressController","installationStorageService","installationDetailsService","saveAddressModel","refreshAddressOptions","getAddressSourceOptions","hasNominatedRecipient","nominatedRecipientModel","getNominatedRecipientModel","getAddressModel","fileObject","approvalReasons","InstallationApprovalDocumentsController","selectedFile","ApproveEditController","fetchDataEndpoint","installationId","approveEndpoint","rejectEndpoint","customHtmlTemplate","capacity","dialogOptions","approve","extraSetup","otherViewModel","allMeters","updatedInstallation","installationCapacities","meters","meterAddedValue","meterChangeTypes","meterDeletedValue","meterModifiedValue","fitId","ApproveExtensionController","originalInstallation","ApproveInstallationController","installationAmendmentId","ApproveRecipientReassignmentController","ApproveStatusChangeController","capacityId","changeTitle","InstallationChangeApprovalController","installationConversationService","setParams","fetchDetails","setData","handleLoadError","preMessage","reasons","postMessage","commentLabel","approving","notifySuccessfulApprovalAndReturn","notifySuccessfulRejectionAndReturn","openInternalConversation","openConversation","openExternalConversation","showNavigationButton","getAssignTask","parseInt","taskParams","InstallationBasicsController","installationCapacityService","previousInstallations","existingInstalledCapacity","existingDeclaredNetCapacity","saveBasicDetailsModel","refreshLicenceModel","licenceModel","getLicenceModel","accreditationType","declaredNetCapacityLessThanHalfOfInstalledCapacity","installedCapacity","declaredNetCapacity","progressiveDisclosure","getBasicsFields","getCapacityBasicsFields","getExistingCapacityFields","basicDetailsModel","getBasicDetailsModel","storage","grantReceived","capacities","showHistoryButton","readOnly","CapacityDetailsController","updateCapacity","action","showConfirmationDialog","notifyDeleteAndRefresh","notifyApproverDecommissionSuccessAndRefresh","notifySuccessAndRefresh","getDialogOptions","extensionReference","submitted","decommissionCapacity","approverDecommissionCapacity","investigateCapacity","deleteCapacity","currentStateName","getCapacityTableData","tariffCode","tariffInformation","tariffValue","tableColumnsForCapacities","installationAccreditationService","validateAccreditationAvailability","mcsId","accreditationTypes","rooFitId","currentAccreditationNumber","mcsAccreditationNumber","rooFitAccreditationNumber","roAccreditatationNumber","accredNumParams","accreditationNumber","getAccreditationFields","newInstallation","roId","getAccreditationField","mcsPattern","rooFitPattern","roPattern","getAccreditationTypesForNewInstallation","eligibilityDateService","formUtils","installationRulesService","validateEpcCertificate","eerType","eerTypes","epcCertificateNumber","epcCertificateNumberComment","communityRefParams","getCapacityEfficiencyFields","clearCertificateMatchFormState","$modelVale","getCapacityEfficiencyCertificateFields","isWithinFixedYearsOfEligibilityDate","applicationDate","isSameOrAfter","capacityCapStartDate","dateValue","commissioningDate","getPropertyFromModelOrFormState","eligibilityDate","getPreTariffLookupDate","cutoffDate","subtract","yearsBetweenEligibilityDateAndEPCDate","isWithinFixedYearsOfCommissioningDate","isBefore","beforeEligibilityDate","preRegistrationDate","eligibilityDateOverride","isSameOrBefore","isValidWithCommissioningDateAfterCapacityCap","capacityCapDate","epcFixDate","epcCommissionValidationFixDate","isBetween","isValidWithCommissioningDateAfterEPCFix","hasRequiredEPCCertificateNumber","epcCertificateIsRequired","epcCountry","epcType","epcCountries","epcTypes","hasRequiredEPCCertNumber","expression","beforeEligibility","withinFixedYearsFromEligibility","withinFixedYearsFromCommissioning","foundMatch","getCapacityDateFields","commissioningDateIsAfterROStartDate","roStartDate","afterROStartDate","getCapacityEligibilityDateOverrideFields","getMcsIssueDateFields","mcsIssueDateBeforeLastFortnight","daysMcsDateMustBeInThePast","startOf","mcsIssueDateDoesNotClashWithApplicationDate","defaultCommunityTypeId","communityTypes","communityType","getCurrentApplicationDate","mcsTransitionalEndDate","mcsIssueDateIsSameOrAfterCommissioningDate","mcsIssueDateIsSameOrBeforeApplicationDate","add","dateIssued","dateClash","beforeApplicationDate","afterCommissioningDate","shouldUseMCSIssueDate","dateFromFormState","getPropertyFromFormState","shouldUseApplicationDateTime","getPropertyFromModel","lessThanOrEqualToInstalledCapacity","installedCapacityIsUnderLimit","capacityLimitKilowatts","underMCSDeclaredNetCapacityLimit","mcsDeclaredCapacityLimitKilowatts","underRooFitDeclaredNetCapacityLimit","messageModel","endPoint","InstallationsCsvImportController","installationService","uploadDocument","importCsv","comment","notifySuccess","uploadFailed","uploadModel","formFile","disabledOverride","successMessage","downloadDocument","hasFailedReport","list","hasSuccessReport","cachedRequestParams","backgroundJobType","downloadFailedReport","fitBackGroundJobId","downloadSuccessReport","maxFileSize","fileSaveLocation","tableColumns","true","false","getLicenceFields","hasExistingAddress","addressSources","maxLength","hint","hasNameIfRequired","mandatoryName","lessThanOrEqualToExistingInstalledCapacity","combinedInstalledCapacityIsUnderLimit","combinedCapacityIsUnderLimit","combinedDeclaredNetCapacityIsUnderLimit","existingCapacity","getPreInstallTypeTechnologyFields","technologyTypes","clearDuplicateMatches","foundInstallationMatch","getApplicationDateFields","isDateTime","applicationDateIsAfterRooFitStartDate","rooFitApplicationStartDate","afterCapacityCapsDateForPrelimRoofit","startsWith","fitComprehensiveReviewPhase2BLiveDate","afterRooFitStartDate","afterCapacityCapsDateForPrelim","getEligibilityDateOverrideFields","getPostInstallTypeTechnologyFields","installationTypes","getPostCommissioningDateTechnologyFields","exportStatuses","gridConnected","coLocatedStorage","isUndefine","getAlDetailsFields","suppliedId","getCommunityFields","isWithinOneYearBeforeApplicationDate","afterFitComprehensiveReviewPhase2BLiveDate","compRevPhase2BDate","validAfterPreCapCommunityChangeDate","preCapCommunityChangeDate","fitSchemeClosureValidation","fitClosureDate","yearAfterFITClosureDate","communityId","validForSchoolInstallation","schoolId","isValidCommunityReference","communityRef","isValidSchoolReference","isValidCommunityRef","isValidSchoolRef","templateOptions.label","shouldShowCommunityReference","afterCompRevPhase2B","withinAYearOfApplicationDate","shouldShowPreRegistrationDate","totalInstalledCapacity","getInstallationEfficiencyFields","scotlandId","notApplicableId","source","installationMetersService","getMeterFields","allowEmptySupplyMeters","allowEmptyExportMeters","metersModel","validateOnCollectionUpdateController","$validate","containsSymbols","containsOnlyDigits","isMpanLength","mpanLength","exportTypeSelected","exportMeterType","notDuplicateCheck","matchesValue","meter","currentMeter","updatedValue","arrayOfOtherMeters","metersCopy","exportMetersEnabled","exportStatus","installationIsGridConnected","resetMpanValidityForPage","mpanDuplicationState","getDuplicateSerialNumberMessage","templateOptions.text","btnText","atLeastOne","notDuplicate","notDuplicateOfExport","noSymbolsIfSerialNumber","symbolErrorMessage","onlyDigits","mpanDigitsOnlyErrorMessage","mpanWrongLengthErrorMessage","allowInvalid","duplicateMpanErrorMessage","notDuplicateOfSupply","onlyDigitsIfMpan","mpanLengthIfMpan","mpanNotEnteredIfSerialNumber","mpanEnteredInSerialNumberFieldErrorMessage","noSymbols","notMpan","templateOptions.messages","errorMessages","warningMessages","hasSupplyWarning","hasExportWarning","informationMessages","hasInformation","duplicateMpanReasonOptions","showReasons","amendmentId","taskType","goToAmendment","isPendingInstallation","buttonText","InstallationsDatesEditController","loadInstallation","dateElement","setInstallation","confirmationDate","isReadOnly","hasPendingAmendment","isUnassigned","statusCodeName","convertToDate","returnToParentState","successReturnToParentState","updateInstallation","installationDateModel","dateAfterConfirmationDate","afterConfirmationDate","InstallationsDatesFindController","goToEdit","showTable","shouldShowUpdateButton","InstallationEditStatusController","setupModel","returnToParent","submissionModel","hideAddBtn","hideRemoveBtn","installationCapacityStatuses","installationStatuses","installationPaymentStatuses","InstallationEditController","metersValidationService","multiInstallationService","installationsTariffService","setupModelAndFields","addressSource","mapCapacity","mapMeter","supplyMeters","isSupplyMeter","generationMeters","isGenerationMeter","exportMeters","isExportMeter","serialNumber","duplicateMpanComment","duplicateSupplyMpanComment","duplicateMpanReason","duplicateExportMpanComment","originalModel","technologyType","nominatedRecipient","updateInstalledCapacity","updateCommissioningDate","updateTotalInstalledCapacity","hydroDuplicateMpanReasons","nonHydroDuplicateMpanReasons","generator","generatorInstallationCount","setupFields","setGeneratorInstallationCount","setNominatedRecipientInstallationCount","epcCertificateDate","mcsIssueDate","roofitId","roAccreditationNumber","mpanOrSerialNumber","mpan","startMeterReadingDate","exportId","generationId","supplyId","getInstallationDetailsFieldGroup","getCommunityFieldGroup","getMultiSiteFieldGroup","getCapacityRepeater","getEfficiencyFieldGroup","getMetersFieldGroup","getApprovalMessageFieldGroup","setDisplayValidationImmediately","unvalidated","stripValidators","getTariffOverrideRepeater","applyFunctionRecursively","setDisplayValidationImmediatelyForField","stripValidatorsFromField","recursiveFunc","displayValidationImmediately","without","installationHeaderField","detailsFields","modelVale","flattenedDetailsFields","entry","communityFields","viewVale","shouldCommunityQuestions","installTypeId","getMultiSiteFields","installTypes","commissioningDates","earliestCommissioningDate","min","shouldShowMultiSiteQuestions","basicsFields","eligibilityOverrideField","updateTotalInstalledCapacityAndInstalledCapacity","dateFields","capacityHeaderField","capacityInstallTypeFields","photovoltaicInstallTypes","requiresInstallType","mcsIssueDateFields","shouldShowEfficiencyQuestions","efficiencyHeaderFields","efficiencyFields","countryMismatchFields","epcCountryMismatch","shouldShowOverallEfficiencyQuestions","validateCountry","epcCountryMismatchComment","hasRelevantCapacity","selectedCountry","getAddressModelForMpanCheck","addressObject","getEpcCountryFromPostcode","getMeterTypeFields","capacityField","metersFields","generationFields","supplyFields","exportFields","approvalInfo","messageMissing","needsApproval","meetsRequirementsId","cumulativeInstalledCapacity","cumulativeInstalledCapacityForReference","extensionReferenceNumber","calculateTotalInstalledCapacity","isLowerOrSameExtensionReference","includedCapacities","getCapacity","sumBy","promises","performFITClosureCheck","performDuplicateCheck","epcChecked","fitClosureModel","getFITClosureModel","fitClosure","isUniqueArray","isUnique","checkForApproval","buildRequest","validateMpans","getSupplyMpans","getExportMpans","progressIfValid","checkMatchParams","technologyTypeId","osGridReference","gridReference","matches","matchingInstallationIds","supplyMpans","exportMpans","supplyDatesByMpan","chain","keyBy","mapValues","getMeterCommissioningDate","exportDatesByMpan","supply","export","getDuplicateMpanStateObject","newAddress","currentAddress","getCurrentAddressForMpanCheck","getNewAddressForMpanCheck","oSGridReference","locationType","newAddressType","buildAddress","deemedExportStatus","duplicateMpanStateObject","request","checkEditForApproval","setApprovalInfoAndProgress","newApprovalInfo","isEqual","approvalMessage","saveEdit","buildAddressModel","buildInstallation","buildCapacities","buildMeters","tariffOverrides","buildTariffOverrides","installationTypeId","installationType","coLocatedStorageComment","offGridId","communityTypeId","communityReferenceNumber","ePCCountryMismatchComment","getAccreditationNumber","getPvInstallTypeForEdit","meetsReqsId","exemptId","showEfficiencyQuestions","eerExemptComment","overrideTariffCode","overrideEligibilityDate","overrideEligibilityEndDate","overrides","hasOverrideTariffId","hasOverrideEligibilityDate","hasOverrideEligibilityEndDate","eligibilityEndDate","buildSupplyMeters","buildExportMeters","buildGenerationMeters","startMeterReading","setDuplicateComment","meterTypes","noExportStatus","typeCode","mpans","pendingApproval","recalculateTariffsDetails","tariffDetails","loadingTariffs","tariffError","tariffErrorList","displayTariffDetails","catchNoTariffs","displayTariffError","stopLoadingTariffs","date","errorsAtBottom","InstallationEfficiencyController","validateCertificate","saveAndMoveToNextPage","expectingGridReference","getGenerator","getNominatedRecipient","getCurrentAddress","saveEfficiencyModel","refreshTechnologyModel","technologyModel","getTechnologyModel","clearCountryMismatchBoolean","efficiencyFieldsRequired","getTotalInstalledCapacity","getPvInstallType","efficiencyModel","getEfficiencyModel","capacityFields","installationFieldGroup","certificateFields","ExistingInstallationPanelController","ExtensionAccreditationController","extensionStorageService","existingDetails","moveToNextPageOrDisplayUniquenessError","roofitMissingName","invalidAccreditationType","saveAccreditationModel","getAccreditationModel","getExistingDetailsModel","ExtensionDetailsController","refreshModel","accreditationDetails","installType","getPvInstallTypeForExtension","saveExtensionDetailsModel","totalDeclaredCapacity","commissioningDateIsBeforeCutoff","commissioningDateAfterLastCommissioningDate","lastCommissioningDate","getExtensionDetailsModel","commissioningDateField","installedCapacityField","declaredNetCapacityField","toString","ExtensionEfficiencyController","existingDetailsModel","extensionDetailsModel","extensionDetails","installationFields","ExtensionExportStatusController","exportStatusMustChange","exportCapacityCutoff","saveExportStatusModel","getExportStatusModel","highCapacityExportStatuses","ExtensionMetersController","saveMeterInfoModel","updateTariffs","saveTariffAndEligibilityDatesForExtension","getEligibilityDate","locationInfo","getFormState","exportStatusModel","existingMeters","ExtensionSubmissionController","getFullRequest","extension","createExtension","wipeStorageAndGoToLanding","showError","loadStoredData","accreditationModel","efficiencyDetails","meterInfoModel","getMeterInfoModel","getTariff","exportStatusChangeNeeded","shouldShowInstallationChanges","createInstallationChangesModel","installationChangesViewData","newExportStatus","findConstantName","originalExportStatus","newEPCCountry","originalEPCCountry","newEPCType","originalEPCType","createCapacityModel","getMeters","installationChangesLayout","checkExtensionForApproval","oldEPCCountry","oldEPCType","accreditationTypeName","receivedGrant","tariffId","getEligibilityEndDate","setPVInstallType","setEligibilityDateOverride","setCapacityEfficiencyAnswers","tempEfficiencyParams","getEfficiencyRequestParameters","copyValues","installTypeName","addTypeAndRestrictFields","exportMetersRequired","meterModel","exportType","processedMeter","efficiencyRequestParams","eerTypeName","epcCountryName","epcTypeName","approvalFields","ExtensionController","setInstallationExtensionData","existingInstallationDetails","latestCapacity","orderBy","saveExistingDetailsModel","technologyTypeName","latestAccreditationNumber","exportStatusName","totalNetCapacity","isMultiSite","multipleSiteGeneratorAnswer","multipleSiteNominatedRecipientAnswer","loadWizard","InstallationSearchFormController","stTable","getFilterFormFields","nameFields","includeAccreditationNumber","adressSearch","recipientFields","extraFields","includeRecipientFields","includeExtendedFields","installationSearchFormDirective","attachToParentTable","installationSearch","InstallationCreateGeneratorController","saveGenerator","saveGeneratorModel","generatorChosen","recipientOptions","recipientDefaults","InstallationGeneratorsController","recipientService","generatorModel","getGeneratorModel","parentStateName","displayState","useAbsoluteUrl","detailsView","publicDocumentsView","internalDocumentsView","documentsUploadView","auditView","actionsView","reassignInstallationView","installationExtensionView","installationEditView","installationStatusChangeView","reassignRecipientView","detailsStateName","detailsPageViews","uploadPublicPageViews","uploadInternalPageViews","reassignInstallationViews","installationExtensionViews","installationEditViews","installationStatusChangeViews","reassignRecipientViews","generatorStates","nominatedRecipientStates","getNominatedRecipientSubstates","auditPageViews","extensionStateName","extensionViews","editViews","editStatusViews","documentPermissionType","installationsValidationHelper","getIdPrefixChecksForFiltering","validPrefix","storedItems","storedObjects","updatedObj","checkInstallationForApproval","installationDetails","postDataToEndpoint","createNewInstallation","editDetails","InstallationActionsController","deleteInstallation","InstallationDetailsController","showExtensionButton","statusCode","removedId","validationOverridden","hasPendingEdit","hasPendingExtension","hasPendingStatusChange","hasPendingRecipientReassignment","installationData","metersWithExtensionReferences","getMetersWithExtensionReferences","installationInfo","fetchDataForLinkedInstallations","installationIsAvailable","addExtensionsToMeters","showSearchFormForLinkedInstallations","parentState","tableOptionsForLinkedInstallations","noResultsMessage","tableColumnsForLinkedInstallations","InstallationDocumentUploadController","installationDocumentTypes","InstallationInternalDocumentsController","hasFitRole","reassignInstallationController","suppliersPromise","licencesPromise","results","suppliers","getSupplierOptions","licences","unassignedOption","idToSubmit","licenceId","newLicenceId","goBackToDetailsState","supplierOptions","installTypeOptions","pvCapacityTypeCutoff","lowCapacityPvInstallTypes","highCapacityPvInstallTypes","shouldShowMultiSiteQuestionsFromInstallationModels","basicsModel","techModel","isPhotovoltaic","totalCapacityWithinCutoff","comprehensiveReviewCapacityCutoff","cutoffDateAfterComprehensiveReviewDate1A","fitComprehensiveReviewPhase1ALiveDate","isMultinstallationInstallType","intersection","getNonStandalonePvInstallTypes","shouldShowPreRulesChangeCommunityQuestions","shouldShowPostRulesChangeCommunityQuestions","shouldShowPreRulesChangeCommunityQuestionsFromRegistrationModels","comprehensiveReviewPhase2BLiveDate","isPVAndCapacityWithinCutoffAndNotStandalone","shouldShowPostRulesChangeCommunityQuestionsFromRegistrationModels","rulesChangeDate","communitiesAndSchoolsRuleChangeDate","comprehensiveReviewPhase1ALiveDate","isNotStandalone","getPvInstallTypeFromTechnologyAndInstallTypes","retrofitId","newBuildId","standardId","shouldShowMultiSiteText","multiSiteAnswer","installationCount","isEdit","communityEnergyId","communitySiteExemptionId","getCurrentCommunityType","isNaN","fromGenerator","fromRecipient","InstallationsSearchController","licences@installations","generators@installations","recipient@installations","address@installations","basicDetails@installations","technology@installations","multiInstallations@installations","efficiency@installations","meterInfo@installations","submission@installations","companyNumber","installationResponse","display@installations-search","search@installations-search","documents@installation-details","pageTitle","search@installations-fit-terms","search@installations-meter-inspection","search@installations-status-csv","display@installations-switch-search","display@installations-switch-pending","display@installations-switch-raised","switchId","approval-documents@approve-installation","display@installations-switch-internal","display@installations-switch-upload","InstallationLandingController","documents","approvalDocument","InstallationLicencesController","saveLicenceModel","accreditationFields","licenceFields","historyReturnState","displayMetersController","updateSupplyMeters","addDuplicateMpanReasonText","updateExportMeters","updateGenerationMeters","duplicateMpanReasonText","$watchCollection","InstallationsMeterInfoController","saveTariffAndEligibilityDatesForInstallation","getLocationInfo","startMeterReadingDateConsistentOnAfterCutOff","eligibilityDateOnOrAfterGenerationMeterCutOffDate","generationStartMeterReadingDateIsBeforeEligibilityDate","startMeterReadingDateConsistentOnAfterEligibilityDate","generationMeterCutOffDate","startMeterReadingDateConsistentBeforeCutOff","generationStartMeterReadingDateIsBeforeCommissioningDate","supplyDuplicatesPromise","getApiResponse","exportDuplicatesPromise","getSingleDuplicateMpanStateObject","meterType","MeterType","Mpans","AddressPostcode","getAddressPostcode","AddressLine1","getAddressLine1","OSGridReference","getGridReference","TechnologyTypeId","supplyResponses","exportResponses","apiResponses","apiResponse","differentMeterTypeDuplicateExists","oppositeMeterType","addMpanToList","eligibilityDateBeforeComprehensiveReviewSiteDate","differentLocationSameTechnologyExists","comprehensiveReviewSiteDate","sameLocationSameTechnologyExists","differentLocationDifferentTechnologyExists","sameLocationDifferentTechnologyExists","getCommissioningDate","isDate","pageKey","MetersFormController","verifyResultsAndSave","refreshModelsAndResetDuplicateMpanState","baseFormState","hasExistingMeters","hasExistingExportMeters","isAfter","each","startMeterReadingDateScopes","startMeterReadingDateScope","$id","getInconsistentDateErrorMessageWithEligibilityDate","getInconsistentDateErrorMessageWithDate","getInconsistentDateErrorMessageWithCommissioningDate","getInstallationCount","count","nominatedRecipientInstallationCount","alwaysShowGenerator","InstallationMultiSiteController","saveMultiSiteModel","multiSiteIsEnabled","refreshModels","getMultiSiteModel","InstallationCreateRecipientController","saveGeneratorDetails","saveNominatedRecipient","saveNominatedRecipientModel","nominatedRecipientChosen","showExistingNominatedRecipient","fromButtonPress","showNewNominatedRecipient","checkForMatches","currentNominatedRecipient","getSimplifiedNominatedRecipient","foundSimilarRecipientsWithCurrentSearch","checkForExistingMatches","matchResult","similarRecipientIds","showExactMatchTable","showSimilarRecipientTable","exactMatchIds","foundExactMatchesWithCurrentSearch","showExactMatchNominatedRecipients","nonExactMatchIds","difference","showSimilarNominatedRecipients","ids","exactMatchSearchObject","mode","similarRecipientSearchObject","nominatedRecipientAddress","getChangeHandler","listener","newValue","oldValue","setDataFromState","inputParams","setDataFromInputDefaults","watcher","InstallationRecipientController","clearError","shouldDisableNext","setError","overrideMessage","showCreateButton","nominatedRecipientRequired","showNominatedRecipient","getById","nominatedRecipientId","foundNoEntities","getByCompanyNumber","searchObject","getByAddress","templateOptions.onChange","templateOptions.onClick","RecipientMultiSiteController","recipientReassignmentStorageService","calculateInstallationNumbers","getRecipientOptions","recipientAddress","getNewRecipient","updateMultisiteAnswersAndFetchTariffs","setMultiSiteAnswers","nominated recipient","nominatedRecipientText","multipleSiteNominatedRecipientText","generatorText","multipleSiteGeneratorText","fetchChangedTariffs","saveChangedTariffs","newMultiSiteAnswer","changedTariffs","setUpdatedTariffs","updatedTariffs","tariffs","getUpdatedTariffs","updatedMultiSiteAnswers","multiSiteAnswers","getMultiSiteAnswers","setNewRecipient","updatedNewRecipient","newRecipient","getInstallationReassignmentData","installationReassignmentData","setInstallationReassignmentData","updatedInstallationReassignmentData","setRecipientOptions","updatedRecipientOptions","RecipientReassignmentWizardController","installationFitId","aggregatedInstalledCapacity","capacityData","canEnterScrollOnly","canEnterMultiSite","canEnterSubmission","multiSiteDisabled","RecipientReassignmentCreatorController","RecipientReassignmentSelectorController","currentRecipientId","generatorId","RecipientReassignmentSubmissionController","recipientTypeDisplayName","updatedTariffData","installationVersion","__version","showPreviousMultiSiteAnswers","multiSiteAnswersLayout","newMultiSiteText","saveRecipient","RecipientTableController","requestParams","foundRecipients","selectRecipientHidden","selectRecipient","tableOptions","displayNamePlural","displayName","recipientTableDirective","recipientTableProperty","InstallationSubmissionController","documentIds","validateDocs","fileItem","slDiagramDocumentType","fileErrors","uploadFile","createInstallation","getInstallationDetails","multiSiteModel","createInstallationModel","approvalError","installationTypeName","setTechnologyType","setExportStatus","setInstallationAddress","setInstallationEfficiencyAnswers","setCommunityAnswers","getLicenceName","licenceName","hasMultiSiteAnswers","hasNominatedRecipientAnswers","communityTypeName","hasCommunityRef","hasPreRegDate","receivedGrantText","setMCSIssueDate","eerExemptDocId","approvalFormOptions","InstallationsSwitchCompleteController","installationSwitchService","parseToSwitchModel","selectedLicence","selectedLicenceId","availableLicences","proposedDate","returnNoError","resultPromise","returnError","submitRequestAndRedirectIfSuccess","submitSwitchForCompletion","parsedSubmitModel","showResultsMessageAndRedirect","meterReadingDate","defer","confirmationPromise","showConfirmationMessage","redirectToSearch","switchSubmitModel","loadSwitchModelForCompletion","meterIdentifier","labelProp","InstallationsSwitchDetailsController","meterInfo","installationCapacityTariffLayout","InstallationsSwitchPendingController","selectedStatus","actionType","handleApproveSwitchRequest","switchRequest","submitForApproval","approveSwitchRequest","showConfirmationDialogAndRedirectToSearch","handleRejectSwitchRequest","handleSwitchCancellationRequest","handleCancelSwitchRequest","handleCompleteSwitchRequest","switchRequestModel","confirmationMessage","getConfirmationMessages","refreshList","handleSwitchHistoryRequest","statusOptions","defaultResultsDisplayed","showHeading","installationSwitchStatuses","getDefaultSwitchStatusesForSearchView","loadBaseColumns","InstallationsSwitchRequestController","isEligibleToSwitch","showSwitchControls","switchNotAllowedReasons","submitSwitchRequest","minDate","loadSwitchModel","InstallationsSwitchSearchController","viewInstallation","templateOptions.required","rejectSwitchRequest","operation","InstallationsSwitchRejectController","switchRejectionModel","InstallationDocumentsTableController","baseEndpoint","visibility","visibleExternally","uploadState","installationDocumentTableDirective","hideUpload","saveTariffAndEligibilityDates","buildModelForInstallation","buildModelForExtension","saveTariff","saveEligibilityDate","saveEligibilityEndDate","shouldSendCommunity","efficiencyQuestionsNeeded","accreditationDetailsModel","tariffRequestModel","getTariffLookupDate","lookupDate","performTariffRequest","requestModel","tariffLookupDate","commissioningTypeId","getBaseLookupDateRequest","tariffEligibleFromDate","eligibleFrom","InstallationTechnologyController","correctModelForApplicationDate","performCommunityCheck","foundCommunityRefMatch","saveTechnologyModel","applicationDateTime","expectingGridRef","setTechTypeOptions","setExportOptions","techTypeField","mcsTechnologyTypes","roofitTechnologyTypes","exportStatusField","lowCapacityExportStatuses","invalidTechType","techTypeInvalidatesInstalledCapacity","techTypeInvalidatesDeclaredNetCapacity","techType","windId","photovoltaicId","techSpecificDeclaredCapacityMinimumKilowatts","microCHPId","microCHPInstalledCapacityLimitKilowatts","commissioningDateIsSameOrBeforeApplicationDate","applicationDateModelValue","currentApplicationDate","commissioningDateIsAfterApplicationDateForRoofit","initialFields","installTypeFields","applicationDateFields","applicationDateTimeFields","eligibilityDateOverrideFields","postInstallTypeFields","finalFields","hasPreRulesChangeOpts","hasPostRulesChangeOpts","oldCommunityTypes","newCommunityTypes","communityFieldGroup","showPreRuleChangeQuestions","showPostRuleChangeQuestions","LandingPageController","updateDataInternal","updateDataExternal","prefixIdPair","getPrefixIdPair","prefixedId","findEntity","loadEntity","prefixFindEntityMap","prefixGoToEntityMap","match","goToGenerator","goToSupplier","goToInstallation","goToNominatedRecipient","hasTaskPermissions","GEN","SUP","FIT","NR","LandingTaskBarController","filters","getTaskType","taskTypes","getCsvDataFunc","parseCsvResult","mapData","dateSubmitted","taskTypeName","parseInstallationId","createdBy","mostRecentExternalMessage","supplierName","installationCapacityId","internalTaskTypes","externalCreateTaskTypes","externalEditTaskTypes","getCsvData","getFunction","csvColumns","csvHeaders","landingColumns","InstallationEdit","NewExtension","NewInstallation","NewSupplier","CapacityStatusChange","ReassignGenerator","ReassignNominatedRecipient","landingFilters","colour","EnvironmentFlagController","NavbarController","EditLevelisationDataController","levelisationDataService","levelisationConversationService","loadData","fetchLevelisationData","fetchInstallationData","fetchLevelisation","fetchLevelisationViewModel","fetchLicence","setFormFields","getLevelisationData","levelisationData","setLicenceData","licence","licenceDetails","levelisationId","setLevelisationDetails","setLevelisationViewModel","levelisation","levelisationViewModel","isFit","setInstallationData","formatFields","totalElectricitySupplied","formatElectricity","totalExemptGreenImportElectricitySupplied","totalEiiElectricitySupplied","totalEiiExemptExcludedElectricitySupplied","totalFitGenerationPaymentDue","formatAsCurrency","totalFitExportPaymentDue","totalFitDeemedExportPaymentDue","totalDeemedElectricity","dateOfRevocation","licenceRevoked","formatLevelisation2019Fields","totalFitMeteredExportPaymentDue","totalMeteredElectricity","deferred","fitYear","validate","putToServer","promise","variations","getSubmissionVariations","showVariationDialog","returnToSelectPage","relevantSupplyText","relevantSupply","calculateTotalRelevantSupply","isRevocationNotEmpty","gieYear","lessThanOrEqualValidationMessage","totalRelevantSupply","templateOptions.value","getTotalFitExportPaymentDue","totalFitGenerationElectricity","totalFitExportElectricity","numberOfInstallationsInReceiptOfFitPayments","supplyFieldGroup","relevantSupplyFieldGroup","fitFieldGroups","addLevelisation2019Fields","revocationDate","annualFitFieldGroups","commentFieldGroups","licenceRevokedFieldGroup","addEiiFields","isAnnual","addDomesticNonDomesticSupplyVolumeFields","levelisation2019InEffect","eiiFieldGroup","nonDomesticSupplyVolume","nonDomesticVolume","validateNonDomesticWithTotalElectricity","domesticSupplyVolume","validateDomesticWithTotalElectricity","supplyVolume","domesticSupplyValue","totalFitExportPaymentDueText","total","calculateTotalFitExportPaymentDue","hideNavigationButton","checkTaskExists","hasTask","cost","countHelp","costHelp","totalHelp","LevelisationInstallationTableController","onInit","unwatchVisible","isVisible","fetchCsvData","csvData","csvFilename","levelisationDataExists","levelisationHasBeenRun","getButtonOptions","levelisationApprovalService","approveAtLevel","approvalLevel","isApprovedAtLevel","approvalStatus","canApprove","requiredRole","roleToApproveAtLevel","level","approverFieldForLevel","approvalDateFieldForLevel","previousLevelisationData","nullifyZeroHistory","getVariationsAgainstData","getAllVariationsAgainstExportRates","getEiiVariations","threshold","maximumLevelisationDataEiiVariationThresholdFromFitYear15","maximumLevelisationDataEiiVariationThreshold","excludedElectricity","electricitySupplied","buildVariationMessageArrayForEII","getVariationsAgainstDataForField","previousValue","removeCommas","minimumLevelisationDataVariationThreshold","buildVariationMessageArray","levelisationDisplayName","maximumLevelisationDataVariationThreshold","getVariationsAgainstExportRates","getLevelisation2019VariationsAgainstExportRates","valueWithCommas","replace","electricity","exportPaymentDue","exportPaymentDueWithoutCommas","electricityWithoutCommas","averagePriceOfExport","minimumDeemedExportRate","maximumDeemedExportRate","minimumMeteredExportRate","maximumMeteredExportRate","allowConfirmation","supplierLicenceRevoked","fieldVale","variation","comparisonValue","fieldValue","units","submissionStartDate","levelisation2019Date","totalExemptGreenImport","totalEiiExemptExcluded","ListLevelisationDataController","setUpColumns","approvalColumnForLevel","hasBeenSubmitted","view","dataSummary","canEdit","edit","isApproved","dataSubmitted","loadSummary","setupSummary","getExport","getSellPrice","systemSellPrice","updateSellPrice","approveAllAtLevel","updateDispalyedData","endLoading","computeLevelisationResults","computing","viewResults","endComputing","dataFilter","sellPriceFormFields","sellPriceFormOptions","fitStatusOptions","SelectLevelisationDataController","selectionModel","csv","csvModel","returnToHomepage","fetchSubmitData","setupOptions","setupSelectionModel","levelisationOptions","buildSelectOption","option","licenceOptionsByLevelisation","submitFormFields","selectedPeriod","disabled","exportFormFields","LevelisationDataVariationDialogController","hasVariations","showContinueButton","ViewLevelisationDataController","loadLevelisation","loadLevelisationData","loadLicence","displayLevelisationData","levelisationDetails","displayTotalExemptGreenImportElectricitySuppliedField","setLicenceDetails","getApprovalModel","display@levelisation","display@levelisation#tasks","display@levelisationData","display@levelisation#externaltasks","levelisationService","post","put","LevelisationEditController","startDate","endDate","submissionEndDate","smallLicenseeNewInstallationQualifyingCost","smallLicenseeOngoingInstallationQualifyingCost","largeLicenseeNewInstallationQualifyingCost","largeLicenseeOngoingInstallationQualifyingCost","mutualisationThreshold","mutualisationCap","periodId","greaterThanValidationMessage","smallLicenceNewQualifyingCost","smallLicenceOngoingQualifyingCost","largeLicenceNewQualifyingCost","largeLicenceOngoingQualifyingCost","levelisationPeriods","LevelisationListController","isLevelisationFinalised","totalLevelisationFund","isPaymentFinalised","submissionPeriodHasStartedOrCalculationHasBeenRun","calculationHasRun","isMutualisationTriggered","period","viewData","viewPayment","viewShortfall","viewMutualisation","sortDefault","LevelisationTasksController","getRowLevelisationDataLinkState","rowData","getLevelisationPeriodLinkState","levelisationMessageTypes","levelisationColumns","none","levelisationFilters","hasAllOption","LevelisationViewController","displayLevelisation","EditLevelisationMutualisationController","levelisationMutualisationService","fetchLevelisationMutualisationData","getLevelisationMutualisation","levelisationMutualisationData","fetchMutualisation","mutualisation","paymentDifference","mutualisationCostPerSupplierMarketShare","actualPaymentFigure","paymentDifferenceCheck","paymentDate","fitStatus","blankField","paymentComments","paymentFieldGroup","paymentExtrasFieldGroup","paymentCommentFieldGroups","totals","levelisationMutualisation","finalise","canFinalise","fetchMutualisationShortfall","levelisationMutualisationApprovalService","areAllMutualisationsApprovedOrFinalised","level1ApproverRole","ListLevelisationMutualisationController","levelisationShortfallService","adjustedRelevantElectricitySupplied","mutualisationMarketShare","finalised","canshowEditButton","canShowFinaliseButton","levelisationPayment","loadMutualisationShortfall","approvedAtLevel2","fetchShortfallTotal","mutualisationShortfall","showHelpPopup","windowClass","ViewLevelisationMutualisationController","fetchLevelisationMutualisation","displayLevelisationMutualisation","isPeriodic","IsExternal","EditLevelisationPaymentController","levelisationPaymentService","fetchLevelisationPaymentData","fetchTotals","isUserLevel3Or4Approver","isUserLevelThreeOrFourApprover","getLevelisationPayment","populateTotals","setPaymentDetails","totalInvoiceValue","totalInvoiceFigure","toFixed","fetchPayment","formatPaymentFields","levelisationPaymentApprovalService","ListLevelisationPaymentController","levelisationPaymentFinalised","isOverPaymentExists","setupOverPaymentPayment","isExists","overPaymentExists","finaliseLevelisationCalculation","ViewLevelisationOverpaymentController","overpaymentValue","ViewLevelisationPaymentController","fetchLevelisationPayment","displayLevelisationPayment","ViewLevelisationResultsController","getColumns","checkRevokedLicences","insertTotal","totalRow","adjustedMarketShare","totalIndividualQualifyingCost","totalQualifyingCosts","individualPaymentsMade","totalPaymentsMade","invoiceValue","totalQuarterlyInvoiceValue","totalQuarterlyInvoiceValues","totalPreliminaryInvoiceFigure","totalQuarterlyPaymentsValue","isTotal","marketShare","unshift","revokedText","isLicenceRevoked","fetchShortfall","levelisationShortfall","exceededThreshold","exceededCap","shortfallTotal","LevelisationShortfallApprovalService","ListLevelisationShortfallController","levelisationShortfallApprovalService","originalStatementValue","percentageOfFundDue","contributionTowardsShortFall","finalValue","ViewLevelisationShortfallController","fetchLevelisationShortfall","displayLevelisationShortfall","ViewShortfallSummaryTableController","defaultingLicenceValue","loadShortfallSummary","totalShortfall","getNominatedRecipientParameters","display@nominated-recipient-search","installations@nominated-recipient-search#nominated-recipient","RecipientCreatorController","recipientDialogService","showExistingRecipient","showRecipient","showRecipientCreationDialog","currentRecipient","getSimplifiedRecipient","showExactMatchRecipients","showSimilarRecipients","recipientModel","showRecipientSelectionDialog","recipientName","showRecipientDialog","showRecipientAlreadyAssignedDialog","showConfirmButton","RecipientSearchFormController","recipientDisplayName","recipientSearchForm","recipientSearch","endpointName","entityTypeName","getEntityName","noEntityMessage","createNewRecipient","requestData","requestUri","detailsState","regexPrefixCheck","hideButtons","substatePrefix","hideReassignButton","RecipientEditController","similarFieldsListener","similarFieldsDirty","$dirty","loadRecipient","saveVerifiedRecipient","verifyRecipientModel","reassignRecipient","newRecipientId","displayId","showVerification","matchWasExact","verifyRecipientMessage","getMessage","matchingSearchObject","similarRecipients","exactRecipient","recipientFormFields","amendRecipient","RecipientInstallationsController","RecipientController","setRecipient","recipientData","recipientDetailsController","confirmRemove","showMessageOnNominatedRecipientRemoval","removeNominatedRecipient","notifySuccessAndReload","urlPrefix","includeReassignState","getDetailsSubStates","getGeneratorConfig","getNominatedRecipientConfig","historyEntityType","historyEndpoint","urlDisplay","recipientConfig","reassignPageStateName","editPageViews","reassignPageViews","reassignCreatePageViews","RecipientsSearchController","idPrefix","currentRecipientIdForInstallation","showCancelAndBackButtons","RecipientSelectorController","recipientChosen","returnSelected","recipientId","selectType","goBack","RegistrationConfirmController","registrationService","registrationDataService","register","getSupplierDetails","user","getUserDetails","licenses","getLicenceDetails","clearDataAndRedirectToLandingPage","displayErrorMessage","RegistrationLicensesController","licenceNameIsInvalid","invalidLicenceNames","validateNameIsNotDuplicate","licenceForm","getOtherLicences","addLicence","removeLicence","currentLicence","checkNames","saveLicenceDetails","names","checkLicenceNames","handleLicenceNameCheck","showErrorMessage","invalidLicenses","saveSupplierDetails","updatedSupplier","supplierKey","saveUserDetails","updatedUser","userKey","fromDate","updatedLicenses","licencesKey","introduction@registration","supplier@registration","user@registration","licenses@registration","confirm@registration","$httpParamSerializer","checkSupplierName","checkEmailAddress","RegistrationSupplierController","submitSupplier","checkingName","invalidName","handleSupplierNameCheck","resetNameWarning","updateAddressDetails","loadCountries","loadingCountries","handleCountryLoadingFailure","countriesUnavailable","RegistrationModalController","RegistrationUserController","hasAuthorisationLetter","authorisationLetterId","uploadingDocument","recordUploadedDocument","handleDocumentUploadFailure","errorMessage","e","submitUser","checkingEmail","invalidEmail","handleEmailCheck","handleEmailError","resetEmailWarning","DynamicReportController","reportType","reportService","returnToList","downloadReport","formStorageKey","saved","confirmationDateFrom","confirmationDateTo","getDynamicFormFields","enabledExpression","cs","AuditHistoryReportController","reportFilterService","strorageKey","toDate","filterFields","getFilterFields","FitSummaryReportController","running","fetchReportData","filterModel","selectedInstallationTypes","columnTotals","showFilter","typeNameMap","$1","installationTypeNames","technologyTypeNames","runReport","PublicInstallationsController","getFilters","publicInstallationCapacity","governmentOfficeRegion","localAuthority","confirmationDates","sharedTechTypeAddress","sharedEpc","sharedTechTypeMpan","auditHistory","reportFormatTypes","auditDates","assign","addPrefix","pvTechnologyType","technologyTypeKey","fromKey","maxDate","dateFrom","toKey","dateTo","auditToDate","auditFromDate","diff","postcodeCountries","governmentOfficeRegions","localAuthorities","typeSelector","getPathRoot","requiredValidationMessage","getReportUrl","addDynamicReportRoute","display@reports","SmartExportGuaranteeController","smartExportGuaranteeService","uploadAndParseDocument","parseDocument","documentUploadServiceMethod","sessionStorage","getCsvMpanResultData","csvMpanResultColumns","csvMpanResultHeaders","SuppliersController","getCsvSupplierData","getCsvLicenceData","csvSupplierColumns","csvSupplierHeaders","getSupplierViews","stateName","supplierView","userView","licenceView","userId","users@mySupplier","users@supplier","suppliersService","LicenceModalController","licenceService","updateStatus","licenceStatus","closeModal","setFitYears","fitYears","loadingFitYears","updatedLicence","loadingFityears","licenceStatusOptions","1","2","getFitYears","statusId","0","String","licenceStatusUnset","fitStatusId","newStatus","newFitStatus","LicencesController","fetchLicences","viewHistory","createLicence","licenceToEdit","licenceFormFields","editing","editLicenceDetails","getLicence","effectiveFromDate","cancelEdit","saveLicence","editLicenceStatus","isCreating","registrationNumberField","statusField","fitStatusField","nameField","dateField","typeField","SupplierController","loadSupplier","setSupplier","supplierData","getSupplier","editSupplier","supplierFormFields","saveSupplier","updateSupplier","viewAuthLetter","confirmApproval","confirmRejection","returnToSuppliers","disableButtonIfPristine","TariffCreateController","tariffService","getThresholdDate","thresholdDate","tariffEligibleFromMaximumDaysInPast","dates","maxOldTariffDate","max","apply","updateEligiblityDates","parsedEligibleFromDate","eligibleDate","parsedEligibleToDate","newTariffEligibleToDate","parsedEligibleToDateOldTariff","eligibleTo","oldTariff","generateTariffCode","tariffsSelectedForCopy","availableInstallTypes","availableTechTypes","availableCompReviewTypes","getAll","minDateValidationMessage","rowErrors","rowErrorKeys","eligibleDatePickerIsOpen","eligibleDatePickerOpen","eligibleDateChanged","editTariff","backdrop","keyboard","updatedTariff","copyTariff","copiedTariff","removeTariff","rowHasError","rowError","rowTariffCodeError","newTariffs","selectedTariffIds","createTariffs","removeErrors","TariffEditItemController","tariffRulesService","parseToDefaultValues","isLowCapacityPvForCompReviewLevelTypes","comprehensiveReviewLevelTypeId","compReviewLevelTypes","compType","availableCompReviewLevelTypes","errorString","capacityRegexPattern","photoVoltaic","maxCapacity","isLowCapacityPvForInstallTypes","selectOptionsModel","parsedEligibleTo","parsedEligibleFrom","compReviewLevelTypeName","comparisonValidator","comparisonValidatorValidationMessage","minCapacity","maxDecimalValueValidationMessage","maximumTariffValue","TariffRpiController","parsedSubmittedModel","rpiRate","tariffFilter","submitRpiRequest","notifyRpiApplied","rpiRateRegexPattern","TariffController","toggleCopyTariffsBtn","selectedTariffsForCopy","enableCopyTariffsBtn","applyRpi","currentSelection","refreshTariffs","showCurrentOnly","isPendingAmendment","tariffAmendmentId","amendTariff","numericRegex","showAmendmentActionButtons","amendmentsCountText","showPendingOnly","capacityReachedDate","capacityReachedCsvFormat","eligibleToCsvFormat","eligibleFromCsvFormat","pendingAmendmentsCount","amendmentsCount","clearFilter","actionAmendments","redirectForCopyTariffs","getTariffs","urlparams","updateTariff","actionTariffAmendments","tariffAmendmentComments","submitModel","hasCompReviewLevelType","isStandAloneInstallType","timeInfo","getTimeInfoForTariffCode","capacityInfo","getCapacityInfo","getTechnologyInfo","parsedMinCapacity","parsedMaxCpacity","roundToOneDecimalPlace","round","technologyId","technologyInfo","findConstantAbbrv","installTypeInfo","applyInstallType","parsedDate","month","selectedYear","thresholdYear","tariffYear","quarter","getQuarter","availableTariffInstallTypes","isPhotovoltaicWithLowCapacity","availableTariffCompReviewLevelTypes","lowCapacityPvTariffCompReviewLevelTypes","isLowCapacityPvCompReviewLevelTypes","isLowCapacityPvInstallTypes","TariffUpdateReviewController","TariffUpdateCancelController","TariffUpdateController","parseDates","tariffModel","toISOString","formatDates","tariffAmended","dateTimeValidatorValidationMessage","ExternalUserResetsController","userService","sendResetEmails","sendResetEmailsAllExtUsers","UsersFormController","getEmailFieldDataType","fetchRoles","setupForm","loadUser","rolesEndpoint","setRoles","getDefaultUser","setRoleOnUser","defaultRoles","roleIsDefault","isDefault","notifyIfSaved","forOwn","groupKey","groupedRoles","saveCurrentUser","notifyUpdated","endEdit","saveUser","userFormFields","addRoleFields","roleFields","groupBy","rolesWithSameGroup","groupDescription","roleKeyValuePairs","roleInputSetupOptions","infoText","contactFields","amendingUserConfirmationText","addingUserConfirmationText","warningText","UsersTableController","getCsvUserDataFunc","titles","firstName","lastName","lockedOut","externalSuperUser","externalSuperuser","externalCreateInstallation","externalEditInstallation","externalLevelisation","externalReporting","externalSwitching","externalUserManagement","superUser","superuser","fitAdmin","fitApprover","seniorFitApprover","tariffApprover","tariffEditor","levelisationEditor","levelisationApprover","levelisationSecondApprover","levelisationThirdApprover","levelisationFourthApprover","userHasRole","fetchUserData","filterRoles","fetchUsers","localTableData","unlockUser","displayUserAsUnlocked","changingLockStatus","lockUser","displayUserAsLocked","transferSuperuser","transfer","changingSuperuserStatus","updateSuperuser","innerUser","deleteUser","deleteSelectedUser","deleting","reloadUsers","showDeletionError","currentUsername","getCsvUserData","display@users","$timeout","array","prop","target","constArray","abbreviation","getEligibilityDateFromAccreditation","isNumber","propertyName","getModelProperty","matchFieldDirective","$parse","matchedField","validator","matchedFieldValue","$parsers","$formatters","properties","dest","hasOwnProperty","deregistrationFn","numberString","NaN","validateChangedDirective","validateChanged","fieldDefs","fieldValues","isValidFormatForPrefix","valid","window","loadConfig","lowercase","deferredBootstrapper","bootstrap","moduleResolves","$templateCache"],"mappings":"CAAA,WACA,YAEAA,SAAAC,OAAA,OACA,eACA,qBACA,sBACA,aACA,cACA,cACA,WACA,mBACA,gBACA,iBACA,eACA,WACA,oBACA,0BACA,iBACA,aACA,mBACA,mBACA,cACA,gBACA,aACA,YACA,cACA,uBACA,4BACA,oBACA,mBACA,cACA,cACA,gCCjCA,WACA,YAEAD,SAAAC,OAAA,cACA,QACA,kBACA,gBCNA,WACA,YAEAD,SACAC,OAAA,eACA,kBACA,iBACA,WACA,YACA,aCTA,WACA,YAEAD,SACAC,OAAA,qBACA,WACA,aCNA,WACA,YAEAD,SAAAC,OAAA,6BACA,WACA,kBCLA,WACA,YAEAD,SACAC,OAAA,oBACA,WACA,aCNA,WACA,YAEAD,SACAC,OAAA,eACA,WACA,aCNA,WACA,YAEAD,SACAC,OAAA,eACA,WACA,aCNA,WACA,YAEAD,SAAAC,OAAA,wBACA,WACA,2BCLA,WACA,YAEAD,SAAAC,OAAA,eACA,WACA,oBACA,mBACA,kBACA,iBACA,cCTA,WACA,YACAD,SAAAC,OAAA,sBAAA,qBAAA,yBCFA,WACA,YACAD,SAAAC,OAAA,kBACA,aCHA,WACA,YAEAD,SAAAC,OAAA,oBACA,iBACA,WACA,cACA,oBCPA,WACA,YAEAD,SAAAC,OAAA,mBACA,QACA,qBACA,iBACA,oBACA,qBACA,YAEA,aACA,gBACA,mBCbA,WACA,YAEAD,SAAAC,OAAA,qBACA,0BCJA,WACA,YACAD,SAAAC,OAAA,uCCFA,WACA,YAEAD,SAAAC,OAAA,qCCHA,WACA,YACAD,SAAAC,OAAA,qBACA,eACA,cCJA,WACA,YACAD,SAAAC,OAAA,wBACA,eACA,oBACA,2BCLA,WACA,YACAD,SAAAC,OAAA,uBACA,uBCHA,WACA,YAEAD,SACAC,OAAA,sBACA,aCLA,WACA,YAEAD,SACAC,OAAA,mBACA,iBACA,uBACA,qBACA,iBACA,kBACA,SACA,aACA,aACA,QACA,eACA,YACA,8BACA,gBCjBA,WACA,YAEAD,SACAC,OAAA,qBACA,uBACA,kBACA,cACA,aCRA,WACA,YAEAD,SAAAC,OAAA,sBAEA,0BCLA,WACA,YAEAD,SAAAC,OAAA,qBACA,QACA,oBACA,iBCNA,WACA,YACAD,SAAAC,OAAA,6BCFA,WACA,YAEAD,SAAAC,OAAA,sBACA,YACA,sBCLA,WACA,YACAD,SAAAC,OAAA,oBACA,uBACA,kBACA,sBACA,qBACA,qBACA,cACA,aCTA,WACA,YAEAD,SAAAC,OAAA,8BCHA,WACA,YAEAD,SAAAC,OAAA,4BCHA,WACA,YAEAD,SAAAC,OAAA,qBACA,kBACA,qBACA,0BCNA,WACA,YAEAD,SACAC,OAAA,YACA,YACA,eACA,oBACA,qBACA,sBACA,kBACA,oBACA,uBACA,iBCbA,WACA,YAEAD,SAAAC,OAAA,4BACA,mBACA,gBCLA,WACA,YAEAD,SACAC,OAAA,oBACA,WACA,2BACA,QACA,mBCRA,WACA,YAEAD,SACAC,OAAA,iBACA,WACA,aCNA,WACA,YAEAD,SAAAC,OAAA,kBACA,iBACA,mBACA,kBACA,oBACA,uBACA,mBACA,WACA,oBACA,iBACA,YACA,oBCdA,WACA,YAEAD,SACAC,OAAA,gBACA,WACA,kBACA,sBACA,kBCRA,WACA,YAEAD,SAAAC,OAAA,YACA,QACA,eACA,cCNA,WACA,YAEAD,SAAAC,OAAA,qBACA,qBACA,qBACA,iBACA,sBACA,mBACA,gCACA,oBACA,8BACA,uBACA,oBACA,kBACA,oBACA,qBACA,mBACA,qBACA,oBACA,WACA,iBACA,gBACA,YACA,eACA,QACA,eC1BA,WACA,YAEAD,SAAAC,OAAA,eACA,WACA,sBACA,YACA,aACA,aCRA,WACA,YAEAD,SAAAC,OAAA,cACA,mBAEA,WACA,kBCPA,WACA,YAEAD,SAAAC,OAAA,oBACA,iBACA,gCACA,sBACA,mBACA,kBACA,WACA,oBCVA,WACA,YAEAD,SAAAC,OAAA,2BACA,iBACA,mBACA,kBACA,oBACA,uBACA,mBACA,WACA,oBACA,iBACA,YACA,oBCdA,WACA,YAEAD,SAAAC,OAAA,kBACA,iBACA,mBACA,kBACA,oBACA,uBACA,mBACA,oBACA,WACA,oBACA,YACA,eACA,aC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","file":"app-c1b857c0d1.js","sourcesContent":["(function() {\r\n 'use strict';\r\n\r\n angular.module('app', [\r\n 'ui.bootstrap',\r\n 'mgo-angular-wizard',\r\n 'angular-loading-bar',\r\n 'app.access',\r\n 'app.account',\r\n 'app.clients',\r\n 'app.core',\r\n 'app.editableText',\r\n 'app.errorPage',\r\n 'app.recipients',\r\n 'app.homepage',\r\n 'app.idle',\r\n 'app.installations',\r\n 'app.nominatedRecipients',\r\n 'app.generators',\r\n 'app.layout',\r\n 'app.levelisation',\r\n 'app.registration',\r\n 'app.reports',\r\n 'app.suppliers',\r\n 'app.tariff',\r\n 'app.users',\r\n 'app.landing',\r\n 'app.basicPages.terms',\r\n 'app.basicPages.agreeTerms',\r\n 'app.accessibility',\r\n 'app.cookiepolicy',\r\n 'app.cookies',\r\n 'app.privacy',\r\n 'app.smartExportGuarantee'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.access', [\r\n 'utils',\r\n 'components.auth',\r\n 'app.core'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.account', [\r\n 'components.form',\r\n 'components.api',\r\n 'app.core',\r\n 'app.users',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.accessibility', [\r\n 'app.core',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.basicPages.agreeTerms', [\r\n 'app.core',\r\n 'app.access'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.cookiepolicy', [\r\n 'app.core',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.cookies', [\r\n 'app.core',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.privacy', [\r\n 'app.core',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.basicPages.terms', [\r\n 'app.core',\r\n 'components.siteText'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.clients', [\r\n 'app.core',\r\n 'components.config',\r\n 'components.table',\r\n 'components.form',\r\n 'components.api',\r\n 'toastr'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.address', ['components.storage', 'components.config' ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.api', [\r\n 'utils']);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.audit', [\r\n 'components.api',\r\n 'app.core',\r\n 'smart-table',\r\n 'ui.bootstrap'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.auth', [\r\n 'utils',\r\n 'components.storage',\r\n 'components.api',\r\n 'components.config',\r\n 'components.startup',\r\n 'ui.router',\r\n // angular-permission\r\n 'permission',\r\n 'permission.ui',\r\n 'angular-jwt'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.config', [\r\n 'components.startup'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.conversationDialog', []);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.dataPresentation', []);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.dialog', [\r\n 'ui.bootstrap',\r\n 'toastr'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.documents', [\r\n 'ngFileUpload',\r\n 'components.config',\r\n 'components.download'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.download', [\r\n 'components.auth'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.filters', [\r\n 'utils'\r\n ]\r\n );\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form', [\r\n 'components.api',\r\n 'components.templates',\r\n 'components.address',\r\n 'components.api',\r\n 'formlyBootstrap',\r\n 'formly',\r\n 'ngMessages',\r\n 'ngSanitize',\r\n 'utils',\r\n 'ui.bootstrap',\r\n 'ui.select',\r\n 'ui.bootstrap.datetimepicker',\r\n 'dndLists'\r\n ] \r\n );\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.loader', [\r\n 'components.templates',\r\n 'components.auth',\r\n 'smart-table',\r\n 'utils'\r\n ]\r\n );\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.storage', [\r\n // angular-local-storage\r\n 'LocalStorageModule'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.router', [\r\n 'utils',\r\n 'components.config',\r\n 'ui.router'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.siteText', []);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.startup', [\r\n 'ui.router',\r\n 'components.api'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('components.table', [\r\n 'components.templates',\r\n 'components.auth',\r\n 'components.download',\r\n 'components.filters',\r\n 'components.address',\r\n 'smart-table',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n // Placeholder module for the templateCache to attach to\r\n angular.module('components.templates', []);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.warning', []);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.wizard', [\r\n 'components.form',\r\n 'components.warning',\r\n 'mgo-angular-wizard'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core', [\r\n 'ngAnimate',\r\n 'ui.bootstrap',\r\n 'components.router',\r\n 'components.storage',\r\n 'components.siteText',\r\n 'components.auth',\r\n 'components.config',\r\n 'components.templates',\r\n 'ui.router'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.editableText.preview', [\r\n 'app.editableText',\r\n 'app.core'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.editableText', [\r\n 'app.core',\r\n 'app.editableText.preview',\r\n 'utils',\r\n 'textAngular']);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.errorPage', [\r\n 'app.core',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.generators', [\r\n 'components.api',\r\n 'components.table',\r\n 'components.form',\r\n 'components.dialog',\r\n 'components.documents',\r\n 'components.audit',\r\n 'app.core',\r\n 'app.installations',\r\n 'app.recipients',\r\n 'app.users',\r\n 'ui.bootstrap'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.homepage', [\r\n 'app.core',\r\n 'components.auth',\r\n 'components.siteText',\r\n 'app.access'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.idle', [\r\n 'utils',\r\n 'ui.bootstrap',\r\n 'ngIdle'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.installations', [\r\n 'mgo-angular-wizard',\r\n 'components.address',\r\n 'components.api',\r\n 'components.download',\r\n 'components.audit',\r\n 'components.conversationDialog',\r\n 'components.dialog',\r\n 'components.dataPresentation',\r\n 'components.documents',\r\n 'components.config',\r\n 'components.form',\r\n 'components.loader',\r\n 'components.storage',\r\n 'components.table',\r\n 'components.warning',\r\n 'components.wizard',\r\n 'app.core',\r\n 'app.recipients',\r\n 'app.suppliers',\r\n 'app.users',\r\n 'ui.bootstrap',\r\n 'utils',\r\n 'ngPrint'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.landing', [\r\n 'app.core',\r\n 'components.siteText',\r\n 'app.users',\r\n 'ngSanitize',\r\n 'ngCsv'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.layout', [\r\n 'app.registration',\r\n\r\n 'app.core',\r\n 'app.access'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.levelisation', [\r\n 'components.api',\r\n 'components.conversationDialog',\r\n 'components.download',\r\n 'components.table',\r\n 'components.form',\r\n 'app.core',\r\n 'ui.bootstrap'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.nominatedRecipients', [\r\n 'components.api',\r\n 'components.table',\r\n 'components.form',\r\n 'components.dialog',\r\n 'components.documents',\r\n 'components.audit',\r\n 'app.core',\r\n 'app.installations',\r\n 'app.recipients',\r\n 'app.users',\r\n 'ui.bootstrap'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.recipients', [\r\n 'components.api',\r\n 'components.table',\r\n 'components.form',\r\n 'components.dialog',\r\n 'components.documents',\r\n 'components.audit',\r\n 'components.config',\r\n 'app.core',\r\n 'app.installations',\r\n 'app.users',\r\n 'ui.bootstrap',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.registration', [\r\n 'mgo-angular-wizard',\r\n 'components.address',\r\n 'components.documents',\r\n 'components.config',\r\n 'app.core',\r\n 'ngFileUpload',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.reports', [\r\n 'components.api',\r\n 'components.download',\r\n 'components.auth',\r\n 'components.table',\r\n 'components.form',\r\n 'components.storage',\r\n 'components.config',\r\n 'app.core',\r\n 'ngPrint'\r\n ]);\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.smartExportGuarantee', [\r\n 'app.core',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.suppliers', [\r\n 'components.api',\r\n 'components.download',\r\n 'components.table',\r\n 'components.form',\r\n 'components.dialog',\r\n 'components.documents',\r\n 'components.documents',\r\n 'components.audit',\r\n 'app.core',\r\n 'app.users',\r\n 'ngCsv',\r\n 'ui.bootstrap',\r\n 'components.dataPresentation'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.tariff', [\r\n 'app.core',\r\n 'components.config',\r\n 'ngSanitize',\r\n 'ngCsv',\r\n 'ui.bootstrap',\r\n 'components.form',\r\n 'components.api',\r\n 'components.dialog',\r\n 'ui.bootstrap.datetimepicker',\r\n 'utils'\r\n ]);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.users', [\r\n 'app.core',\r\n 'components.form',\r\n 'components.api',\r\n 'toastr'\r\n ]);\r\n})();","/*eslint no-undef:0*/\r\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils', [\r\n 'components.api'\r\n ])\r\n .constant('moment', moment);\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.access')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'unauthorised',\r\n config: {\r\n templateUrl: 'app/access/unauthorised.html',\r\n url: '/unauthorised'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.access')\r\n .factory('loginService', loginService);\r\n\r\n function loginService($state, $log, $q, $uibModalStack, tokenService) {\r\n var invalidGrant = 'invalid_grant';\r\n var invalidTerms = 'invalid_must_accept_terms';\r\n var invalidLocked = 'invalid_locked';\r\n var invalidFirstTerms = 'invalid_must_accept_terms_first_time';\r\n\r\n var acceptTermsData = {\r\n isFirstTime: '',\r\n emailAddress: '',\r\n password: '',\r\n terms: ''\r\n };\r\n\r\n var service = {\r\n login: login,\r\n logout: logout,\r\n getTermsData: getTermsData,\r\n needToAcceptTerms: needToAcceptTerms\r\n };\r\n return service;\r\n\r\n function login(emailAddress, password, extraHeaders) {\r\n return tokenService.authenticate(emailAddress, password, extraHeaders)\r\n .then(function () {\r\n $state.go('landing', null, { reload: true });\r\n }).catch(function (reason) {\r\n if (needToAcceptTerms(reason.code)) {\r\n saveTermsData(reason.code, emailAddress, password, reason.message);\r\n $state.go('agreeterms');\r\n } else {\r\n $log.warn('Login failed:', reason.code);\r\n return $q.reject(new Error(getFailureMessage(reason.code)));\r\n }\r\n });\r\n }\r\n\r\n function logout() {\r\n tokenService.unauthenticate();\r\n $uibModalStack.dismissAll();\r\n $state.go('home', null, { reload: true });\r\n }\r\n\r\n function getTermsData() {\r\n return acceptTermsData;\r\n }\r\n\r\n function needToAcceptTerms(code) {\r\n return (code === invalidTerms || code === invalidFirstTerms);\r\n }\r\n\r\n function getFailureMessage(code) {\r\n if (code === invalidGrant) {\r\n return 'Your e-mail address/password combination is invalid.
Too many failures will lock your account.';\r\n }\r\n if (code === invalidLocked) {\r\n return 'Your account is locked.
Contact your organisation’s superuser to unlock your account.';\r\n }\r\n if (code === invalidTerms || code === invalidFirstTerms) {\r\n return 'You must accept terms and conditions to log in.';\r\n }\r\n return 'An error has occured. Please try again later.';\r\n }\r\n\r\n function saveTermsData(message, emailAddress, password, terms) {\r\n acceptTermsData.isFirstTime = message === invalidFirstTerms;\r\n acceptTermsData.emailAddress = emailAddress;\r\n acceptTermsData.password = password;\r\n acceptTermsData.terms = terms;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.account')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager, principal) {\r\n routeManager.addStates([\r\n {\r\n state: 'account',\r\n config: {\r\n title: 'Account',\r\n url: '/account',\r\n data: {\r\n permissions: {\r\n only: ['Authenticated']\r\n }\r\n },\r\n views:\r\n {\r\n '': {\r\n templateUrl: 'app/account/account.html'\r\n },\r\n 'details@account': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n params: {\r\n supplierId: principal.supplierId,\r\n isMyAccountPage: true\r\n }\r\n }\r\n },\r\n {\r\n state: 'account#forgotPassword',\r\n config: {\r\n templateUrl: 'app/account/forgot-password.html',\r\n controller: 'ForgotPasswordController',\r\n controllerAs: 'vm',\r\n title: 'Fogotten password',\r\n url: '/account/forgotPassword'\r\n }\r\n },\r\n {\r\n state: 'account#changePassword',\r\n config: {\r\n parent: 'account',\r\n title: 'Change password',\r\n url: '/password',\r\n views:\r\n {\r\n 'details@account': {\r\n templateUrl: 'app/account/password.html',\r\n controller: 'PasswordController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'account#resetPassword',\r\n config: {\r\n templateUrl: 'app/account/reset-password.html',\r\n controller: 'ResetPasswordController',\r\n controllerAs: 'vm',\r\n title: 'Reset password',\r\n url: '/account/resetPassword?userId&token'\r\n }\r\n },\r\n {\r\n state: 'account#generatePassword',\r\n config: {\r\n templateUrl: 'app/account/generate-password.html',\r\n controller: 'ResetPasswordController',\r\n controllerAs: 'vm',\r\n title: 'Generate new password',\r\n url: '/account/generatePassword?userId&token'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.account')\r\n .factory('accountService', accountService);\r\n\r\n\r\n function accountService($q, $uibModal, dataService) {\r\n \r\n var service = {\r\n changePassword: changePassword,\r\n resetPassword: resetPassword,\r\n sendForgotPasswordEmail: sendForgotPasswordEmail\r\n };\r\n return service;\r\n\r\n function changePassword(currentPassword, newPassword) {\r\n // TODO: Much of this error handling should be done in fit-form\r\n return $q(function(resolve, reject) {\r\n var data = {\r\n 'currentPassword': currentPassword,\r\n 'newPassword': newPassword\r\n };\r\n dataService.postToEndpoint('users/current/password', data).then(function (response) {\r\n resolve(response.statusText);\r\n }, function(response) {\r\n var modelStateReasons = response &&\r\n response.data &&\r\n response.data.modelState &&\r\n response.data.modelState[''];\r\n if (modelStateReasons) {\r\n reject(new Error(modelStateReasons));\r\n } else {\r\n var reason = (response && response.data && response.data.message) || response.statusText;\r\n reject(new Error(reason));\r\n }\r\n });\r\n });\r\n }\r\n\r\n function resetPassword(model) {\r\n return dataService.postToEndpoint('users/password/reset', model);\r\n }\r\n\r\n function sendForgotPasswordEmail(model) {\r\n return dataService.postToEndpoint('users/password/sendResetLink', model);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.account')\r\n .controller('ForgotPasswordController', ForgotPasswordController);\r\n\r\n function ForgotPasswordController($state, accountService) {\r\n var vm = this;\r\n vm.emailSent = false;\r\n vm.loadModel = loadModel;\r\n vm.saveModel = saveModel;\r\n vm.cancelForm = cancelForm;\r\n vm.formOptions = { buttons: { save: 'Submit', cancel: 'Cancel' } };\r\n vm.formFields = [\r\n {\r\n type: 'fitInput',\r\n key: 'email',\r\n templateOptions: {\r\n type: 'email',\r\n required: true,\r\n label: 'Email address'\r\n }\r\n }\r\n ];\r\n\r\n function loadModel() {\r\n return {\r\n email: null\r\n };\r\n }\r\n\r\n function cancelForm() {\r\n $state.go('home');\r\n }\r\n\r\n function saveModel(model) {\r\n return accountService.sendForgotPasswordEmail(model)\r\n .then(function () {\r\n vm.emailSent = true;\r\n });\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.account')\r\n .controller('PasswordController', PasswordController);\r\n\r\n function PasswordController($state, $uibModal, accountService, toastr) {\r\n var vm = this;\r\n vm.title = 'Account';\r\n vm.currentPassword = '';\r\n vm.newPassword = '';\r\n vm.repeatedPassword = '';\r\n vm.changePassword = changePassword;\r\n vm.minLength = 9;\r\n vm.passwordRegex = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).+$/;\r\n vm.processing = false;\r\n\r\n function changePassword() {\r\n vm.processing = true;\r\n accountService.changePassword(vm.currentPassword, vm.newPassword)\r\n .then(redirectToHomePageWithConfirmation)\r\n .catch(displayError);\r\n }\r\n\r\n function displayError(reason) {\r\n vm.error = reason.message;\r\n vm.processing = false;\r\n }\r\n\r\n function redirectToHomePageWithConfirmation() {\r\n toastr.success('Your password has been changed.', 'Password changed');\r\n vm.error = null;\r\n vm.processing = false;\r\n $state.go('home');\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.account')\r\n .controller('ResetPasswordController', ResetPasswordController);\r\n\r\n function ResetPasswordController($stateParams, $state, accountService, objectUtils) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.loadModel = loadModel;\r\n vm.saveModel = saveModel;\r\n vm.cancelForm = cancelForm;\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Submit',\r\n cancel: 'Cancel'\r\n }\r\n };\r\n\r\n vm.formFields = [\r\n {\r\n type: 'fitPassword',\r\n key: 'password',\r\n templateOptions: {\r\n label: 'Password'\r\n }\r\n },\r\n {\r\n type: 'fitPassword',\r\n key: 'confirmPassword',\r\n optionsTypes: ['fitMatchFieldValidator'],\r\n templateOptions: {\r\n label: 'Confirm password',\r\n required: true,\r\n placeholder: 'Please re-enter your password',\r\n matchFieldKey: 'password',\r\n matchFieldValidationMessage: 'Passwords do not match.'\r\n }\r\n }\r\n ];\r\n\r\n function cancelForm() {\r\n $state.go('home');\r\n }\r\n\r\n function loadModel() {\r\n return objectUtils.copy($stateParams, ['token', 'userId']);\r\n }\r\n\r\n function saveModel(model) {\r\n return accountService.resetPassword(model).then(function () {\r\n vm.passwordChanged = true;\r\n });\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.accessibility')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'accessibility',\r\n config: {\r\n templateUrl: 'app/basicPages/accessibility/accessibility.html',\r\n url: '/accessibility'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.basicPages.agreeTerms')\r\n .controller('AgreeTermsController', AgreeTermsController);\r\n\r\n function AgreeTermsController(termsText, loginService) {\r\n var vm = this;\r\n vm.login = login;\r\n vm.isFirstTime = loginService.getTermsData().isFirstTime;\r\n vm.terms = termsText.text.text;\r\n\r\n function login() {\r\n var acceptTermsHeader = { 'x-accept-terms': 'accept' };\r\n var data = loginService.getTermsData();\r\n loginService.login(data.emailAddress, data.password, acceptTermsHeader);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.basicPages.agreeTerms')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'agreeterms',\r\n config: {\r\n templateUrl: 'app/basicPages/agreeTerms/agreeterms.html',\r\n controller: 'AgreeTermsController',\r\n controllerAs: 'vm',\r\n title: 'Agree Terms',\r\n url: '/agreeterms',\r\n resolve: {\r\n termsText: ['siteTextService', function (siteTextService) {\r\n return siteTextService.getTextValue('TermsAndConditions');\r\n }]\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.cookiepolicy')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'cookiepolicy',\r\n config: {\r\n templateUrl: 'app/basicPages/cookiePolicy/cookiepolicy.html',\r\n url: '/cookiepolicy'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.cookies')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'cookies',\r\n config: {\r\n templateUrl: 'app/basicPages/cookies/cookies.html',\r\n url: '/cookies'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.privacy')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'privacy',\r\n config: {\r\n templateUrl: 'app/basicPages/privacy/privacy.html',\r\n url: '/privacy'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.basicPages.terms')\r\n .controller('TermsPageController', TermsPageController);\r\n\r\n function TermsPageController(termsData) {\r\n var vm = this;\r\n vm.error = '';\r\n vm.terms = termsData.text.text;\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.basicPages.terms')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes($q, routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'terms',\r\n config: {\r\n templateUrl: 'app/basicPages/termsAndConditions/terms.html',\r\n controller: 'TermsPageController',\r\n controllerAs: 'vm',\r\n title: 'Terms',\r\n url: '/terms',\r\n resolve: {\r\n termsData: ['siteTextService', function (siteTextService) {\r\n return siteTextService.getTextValue('TermsAndConditions');\r\n }]\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.clients')\r\n .controller('ClientEditController', ClientEditController);\r\n\r\n function ClientEditController($stateParams, $q, $state, toastr, dataService, constants, constantUtils) {\r\n var vm = this;\r\n vm.formFields = formFields();\r\n vm.fetchData = fetchData;\r\n vm.cancel = returnToTable;\r\n vm.save = save;\r\n\r\n function returnToTable() {\r\n return $state.go('^');\r\n }\r\n\r\n function fetchData() {\r\n return $stateParams.id\r\n ? dataService.fetchDataFromEndpointById('clients', $stateParams.id)\r\n : $q.when({});\r\n }\r\n\r\n function save(model) {\r\n if ($stateParams.id) {\r\n return dataService.putToEndpoint('clients/' + $stateParams.id, model)\r\n .then(function () {\r\n toastr.success('New client created successfully', 'Success');\r\n return returnToTable();\r\n });\r\n } else {\r\n return dataService.postToEndpoint('clients', model)\r\n .then(function () {\r\n toastr.success('Client updated successfully', 'Success');\r\n return returnToTable();\r\n });\r\n }\r\n }\r\n\r\n function formFields() {\r\n var browserType = constantUtils.findConstantValue(constants.applicationTypes, 'Browser');\r\n var nativeType = constantUtils.findConstantValue(constants.applicationTypes, 'Native');\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'key',\r\n type: 'fitStrictLengthInput',\r\n templateOptions: {\r\n label: 'Key',\r\n required: true,\r\n strictLength: 50\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'name',\r\n type: 'fitStrictLengthInput',\r\n templateOptions: {\r\n label: 'Name',\r\n required: true,\r\n strictLength: 50\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'applicationType',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n label: 'Client type',\r\n options: constants.applicationTypes,\r\n required: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'secret',\r\n type: 'fitStrictLengthInput',\r\n templateOptions: {\r\n label: 'Secret',\r\n required: true,\r\n strictLength: 50\r\n }\r\n },\r\n {\r\n className: 'col-md-6',\r\n key: 'confirmSecret',\r\n type: 'fitInput',\r\n optionsTypes: ['fitMatchFieldValidator'],\r\n templateOptions: {\r\n label: 'Confirm secret',\r\n matchFieldKey: 'secret',\r\n matchFieldValidationMessage: 'Secrets do not match.'\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.applicationType !== ' + nativeType\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'allowedOrigin',\r\n type: 'fitStrictLengthInput',\r\n templateOptions: {\r\n label: 'Allowed origin',\r\n required: true,\r\n strictLength: 256\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.applicationType !== ' + browserType\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'refreshTokenLifeTime',\r\n optionsTypes: ['fitIntegerValidator'],\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Refresh token lifetime (minutes)',\r\n required: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'active',\r\n type: 'fitBooleanRadio',\r\n templateOptions: {\r\n label: 'Is active',\r\n inline: true,\r\n required: true\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.clients')\r\n .controller('ClientSearchController', ClientSearchController);\r\n\r\n function ClientSearchController(paginatedDataService) {\r\n var vm = this;\r\n\r\n vm.columns = getColumns();\r\n vm.fetchData = fetchData;\r\n\r\n function fetchData(tableData) {\r\n return paginatedDataService.fetchDataFromTableData('clients', tableData);\r\n }\r\n\r\n function getColumns() {\r\n return [\r\n {\r\n id: 'id',\r\n displayProperty: 'name',\r\n label: 'Name',\r\n type: 'link',\r\n state: 'clients#edit'\r\n },\r\n {\r\n id: 'applicationType',\r\n label: 'Application type'\r\n },\r\n {\r\n id: 'active',\r\n label: 'Is active',\r\n type: 'boolean'\r\n },\r\n {\r\n id: 'refreshTokenLifeTime',\r\n label: 'Refresh token lifetime',\r\n type: 'duration',\r\n unit: 'minutes'\r\n },\r\n {\r\n id: 'allowedOrigin',\r\n label: 'Allowed origin'\r\n }\r\n ];\r\n }\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.clients')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'clients',\r\n config: {\r\n title: 'Client',\r\n url: '/clients',\r\n data: {\r\n permissions: {\r\n only: ['Superuser']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/clients/clients.html'\r\n },\r\n 'display@clients': {\r\n templateUrl: 'app/clients/client-search.html',\r\n controller: 'ClientSearchController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n editState('create', '/create'),\r\n editState('edit', '/{id}/edit')\r\n ]);\r\n\r\n function editState(editType, url) {\r\n return {\r\n state: 'clients#' + editType,\r\n config: {\r\n url: url,\r\n parent: 'clients',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'display@clients': {\r\n templateUrl: 'app/clients/client-edit.html',\r\n controller: 'ClientEditController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n };\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.address')\r\n .factory('addressService', addressService);\r\n\r\n function addressService($http, appConfig, localStorageService, $q) {\r\n var countriesKey = 'address.countries';\r\n\r\n var service = {\r\n getCountries: getCountries,\r\n lookupAddress: lookupAddress,\r\n createAddressObjectFromModel: createAddressObjectFromModel,\r\n getFullAddress: getFullAddress\r\n };\r\n return service;\r\n\r\n function getCountries() {\r\n var countries = localStorageService.get(countriesKey);\r\n\r\n if (countries != null) {\r\n return $q.when(countries);\r\n }\r\n\r\n var requestUrl = appConfig.apiRoot + 'addresses/countries/all';\r\n return $http.get(requestUrl).then(mapAndCacheCountries);\r\n }\r\n\r\n function mapAndCacheCountries(response) {\r\n var countries = response.data.data;\r\n localStorageService.set(countriesKey, countries);\r\n return countries;\r\n }\r\n\r\n function lookupAddress(postcode) {\r\n var requestUrl = appConfig.apiRoot + 'addresses/' + encodeURIComponent(postcode);\r\n return $http.get(requestUrl).then(filterToAddressDetails);\r\n }\r\n\r\n function filterToAddressDetails(response) {\r\n return response.data.data.map(populateFullAddress);\r\n }\r\n\r\n function populateFullAddress(address) {\r\n address.fullAddress = getFullAddress(address);\r\n return address;\r\n }\r\n\r\n function getFullAddress(address) {\r\n return address ? nonZeroEntries(address).join(', ') : undefined;\r\n }\r\n\r\n function nonZeroEntries(address) {\r\n return [address.addressLine1, address.addressLine2, address.town, address.county, address.country, address.postcode]\r\n .filter(isNotNullOrEmpty);\r\n }\r\n\r\n function isNotNullOrEmpty(value) {\r\n return angular.isDefined(value) && value !== null && value !== '';\r\n }\r\n\r\n function createAddressObjectFromModel(model) {\r\n var address = {\r\n addressLine1: model.addressLine1,\r\n addressLine2: model.addressLine2,\r\n town: model.town,\r\n county: model.county,\r\n country: model.country\r\n };\r\n populateFullAddress(address);\r\n\r\n return address;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.api')\r\n .factory('dataService', dataService);\r\n\r\n function dataService($http, $q, $window, appConfig, $httpParamSerializerJQLike) {\r\n var service = {\r\n fetchDataFromEndpointById: fetchDataFromEndpointById,\r\n fetchDataFromEndpointWithParams: fetchDataFromEndpointWithParams,\r\n fetchDataFromEndpoint: fetchDataFromEndpoint\r\n };\r\n angular.forEach(['post', 'put', 'patch'], function (method) {\r\n service[method + 'ToEndpoint'] = function (endpoint, data, options) {\r\n return sendDataToEndpoint(method, endpoint, data, options);\r\n };\r\n });\r\n // Delete is a special case as it carries no data\r\n service.deleteToEndpoint = function (endpoint, options) {\r\n return $http.delete(appConfig.apiRoot + endpoint, options);\r\n };\r\n\r\n return service;\r\n\r\n function fetchDataFromEndpointById(endpoint, id) {\r\n return $http.get(appConfig.apiRoot + endpoint + '/' + id)\r\n .then(parseResponse);\r\n }\r\n\r\n function fetchDataFromEndpointWithParams(endpoint, params) {\r\n params = clean(params);\r\n var queryString = $httpParamSerializerJQLike(params);\r\n\r\n return $http.get(appConfig.apiRoot + endpoint + '?' + queryString)\r\n .then(parseResponse);\r\n }\r\n\r\n function clean(obj) {\r\n for (var propName in obj) {\r\n if (obj[propName] === null || angular.isUndefined(obj[propName])) {\r\n delete obj[propName];\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n function sendDataToEndpoint(method, endpoint, data, options) {\r\n // Angular serializes objects to JSON by default\r\n return $http[method](appConfig.apiRoot + endpoint, data, options);\r\n }\r\n\r\n function fetchDataFromEndpoint(endpoint) {\r\n return $http.get(appConfig.apiRoot + endpoint)\r\n .then(parseResponse);\r\n }\r\n\r\n function parseResponse(result) {\r\n if (angular.isDefined(result.data) && result.data != null)\r\n return result.data.data;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.api')\r\n .factory('paginatedDataService', paginatedDataService);\r\n\r\n function paginatedDataService($http, $httpParamSerializerJQLike, $q, appConfig, validationUtils) {\r\n var service = {\r\n getParamsFromTableData: getParamsFromTableData,\r\n fetchDataFromParams: fetchDataFromParams,\r\n fetchDataFromTableData: fetchDataFromTableData,\r\n checkFieldPrefixesAndFetchData: checkFieldPrefixesAndFetchData\r\n };\r\n return service;\r\n\r\n function fetchDataFromTableData(endpoint, tableState, extraParams) {\r\n var params = getParamsFromTableData(tableState);\r\n addExtraParams(params, extraParams);\r\n\r\n return fetchDataFromParams(endpoint, params);\r\n }\r\n\r\n function fetchDataFromParams(endpoint, params, extraParams) {\r\n addExtraParams(params, extraParams);\r\n params = clean(params);\r\n var queryString = $httpParamSerializerJQLike(params);\r\n\r\n return $http.get(appConfig.apiRoot + endpoint + '?' + queryString)\r\n .then(parseResponse);\r\n\r\n function parseResponse(result) {\r\n return result.data;\r\n }\r\n }\r\n\r\n function clean(obj) {\r\n for (var propName in obj) {\r\n if (obj[propName] === null || angular.isUndefined(obj[propName])) {\r\n delete obj[propName];\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n function getParamsFromTableData(tableState) {\r\n var pagination = tableState.pagination;\r\n var itemNumber = pagination.start;\r\n var pageSize = pagination.number;\r\n var pageNumber = Math.ceil((itemNumber + 1) / pageSize);\r\n\r\n var search = tableState.search || {};\r\n\r\n var ret = {\r\n 'pageSize': pageSize,\r\n 'pageNumber': pageNumber\r\n };\r\n angular.extend(ret, search.predicateObject);\r\n var sort = tableState.sort;\r\n if (sort.predicate) {\r\n var sortDirection = tableState.sort.reverse\r\n ? 'desc'\r\n : 'asc';\r\n ret.sortBy = sort.predicate + ' ' + sortDirection;\r\n }\r\n return ret;\r\n }\r\n\r\n function getEmptyData() {\r\n return {\r\n pageCount: 1,\r\n data: []\r\n };\r\n }\r\n\r\n function checkFieldPrefixesAndFetchData(endpoint, tableData, idPrefixChecks, extraParams) {\r\n var tableParams = getParamsFromTableData(tableData);\r\n if (!validationUtils.checkFieldsHaveValidPrefixesThenNumeric(idPrefixChecks, tableParams)) {\r\n return $q.when(getEmptyData());\r\n }\r\n return fetchDataFromParams(endpoint, tableParams, extraParams);\r\n }\r\n\r\n function addExtraParams(params, extraParams) {\r\n angular.extend(params, extraParams);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.audit')\r\n .controller('AuditHistoryController', AuditHistoryController);\r\n\r\n\r\n function AuditHistoryController($state, $stateParams) {\r\n var vm = this;\r\n\r\n vm.entityName = $stateParams.name;\r\n vm.entityType = $stateParams.entityType;\r\n vm.endpoint = $stateParams.endpoint;\r\n vm.entityId = $stateParams.id;\r\n vm.returnState = $stateParams.returnState || $state.href('home');\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.audit')\r\n .controller('AuditTableController', AuditTableController);\r\n\r\n\r\n function AuditTableController($log, paginatedDataService) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.loading = true;\r\n vm.error = '';\r\n vm.auditEntries = [];\r\n vm.fetchData = fetchData;\r\n vm.showAuthorColumn = false;\r\n\r\n function fetchData(tableData) {\r\n vm.auditEntries = [];\r\n vm.error = '';\r\n var endpoint = 'audit/' + vm.endpoint + '/' + vm.entityId;\r\n paginatedDataService.fetchDataFromTableData(endpoint, tableData)\r\n .then(displayResults, displayError);\r\n\r\n function displayResults(response) {\r\n tableData.pagination.numberOfPages = response.pageCount;\r\n vm.auditEntries = response.data;\r\n vm.showAuthorColumn = _.some(response.data, 'author');\r\n }\r\n }\r\n\r\n function displayError(response) {\r\n vm.error = 'There was an error loading the audit entries. Please try again later.';\r\n $log.warn('API request failed:', response);\r\n }\r\n };\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.audit')\r\n .directive('fitAuditTable', fitAuditTable);\r\n\r\n function fitAuditTable() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/components/audit/auditTable.html',\r\n scope: {\r\n endpoint: '<',\r\n entityId: '<'\r\n },\r\n controller: 'AuditTableController',\r\n controllerAs: 'vm',\r\n bindToController: true\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.auth')\r\n .config(configureAuth)\r\n .run(runAuth);\r\n\r\n function configureAuth($httpProvider, $windowProvider, jwtOptionsProvider, asyncAppSetupProvider, appConfig) {\r\n var refreshPromise;\r\n\r\n /*eslint angular/module-getter:0*/\r\n jwtOptionsProvider.config({\r\n tokenGetter: ['tokenService', 'options', function (tokenService, options) {\r\n // Cache the promise, so we only ever make one call at a time to the refresh token endpoint\r\n if (!refreshPromise) {\r\n // Don't bother when retrieving templates. \r\n // Only relevant in debug mode\r\n if (options && options.url && '.html' === options.url.substr(options.url.length - 5)) {\r\n return null;\r\n }\r\n \r\n // Note: in most cases angular-jwt isn't clever enough to deal with a promise.\r\n // However, we only use it in the case where it IS, namely the jwtInterceptor.\r\n // We do not use the other features of authManager, which break when a promise appears:\r\n // * checkAuthOnRefresh()\r\n // * isAuthenticated()\r\n // * getToken()\r\n // For more details, the source is at\r\n // https://github.com/auth0/angular-jwt/blob/master/src/angularJwt/services/authManager.js\r\n refreshPromise = tokenService.getTokenOrRefresh()\r\n .then(function (tokens) {\r\n return tokens.token;\r\n })\r\n .catch(function() {\r\n return null;\r\n })\r\n .finally(function () {\r\n refreshPromise = null;\r\n });\r\n }\r\n return refreshPromise;\r\n }],\r\n unauthenticatedRedirector: ['$state', function ($state) {\r\n $state.go('home', null, { reload: true });\r\n }],\r\n whiteListedDomains: [getApiHostname()]\r\n });\r\n\r\n // Fetch the token from localstore and update the principal\r\n asyncAppSetupProvider.registerAsyncSetupTask(['tokenService', function(tokenService) {\r\n return tokenService.getTokenOrRefresh();\r\n }]);\r\n\r\n $httpProvider.interceptors.push('jwtInterceptor');\r\n $httpProvider.interceptors.push('fitAuthInterceptor');\r\n\r\n function getApiHostname() {\r\n var win = $windowProvider.$get();\r\n var doc = win.document;\r\n var parser = doc.createElement('a');\r\n parser.href = appConfig.apiRoot;\r\n return parser.hostname;\r\n }\r\n }\r\n\r\n function runAuth($rootScope, $log, $state, authManager, scopeUtils) {\r\n // Automatic redirection to home in case we get a 401\r\n authManager.redirectWhenUnauthenticated();\r\n\r\n // Automatic redirection in case we get a 403\r\n scopeUtils.safeOn($rootScope, '$stateChangePermissionDenied', forbiddenListener);\r\n scopeUtils.safeOn($rootScope, 'fit-unauthorized', forbiddenListener);\r\n function forbiddenListener() {\r\n $log.warn('User unauthorized');\r\n $state.go('unauthorised', null, { reload: true });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.auth')\r\n .factory('fitAuthInterceptor', fitAuthInterceptor);\r\n\r\n function fitAuthInterceptor($q, $rootScope) {\r\n return {\r\n responseError: onResponseError\r\n };\r\n\r\n function onResponseError(response) {\r\n if (response.status === 403) {\r\n $rootScope.$broadcast('fit-unauthorized', response);\r\n }\r\n return $q.reject(response);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.auth')\r\n .factory('principal', principal);\r\n\r\n // Simple service to hold details of current user and roles\r\n function principal($log, jwtHelper, PermPermissionStore) {\r\n var identity;\r\n var authenticated = false;\r\n var supplierId = null;\r\n\r\n var service = {\r\n isAuthenticated: isAuthenticated,\r\n authenticate: authenticateFromToken,\r\n identity: getIdentity,\r\n hasRole: hasRole,\r\n isInternal: isInternal,\r\n isExternal: isExternal,\r\n isSuperuser: isSuperuser,\r\n name: getName,\r\n supplierId: getSupplierId\r\n };\r\n return service;\r\n\r\n function isAuthenticated() {\r\n return authenticated;\r\n }\r\n\r\n function authenticateFromToken(token) {\r\n PermPermissionStore.clearStore();\r\n if (token) {\r\n var tokenPayload = jwtHelper.decodeToken(token);\r\n var roles = tokenPayload.role;\r\n if (!angular.isArray(roles)) {\r\n roles = roles ? [roles] : [];\r\n }\r\n roles.push('Authenticated');\r\n\r\n identity = {\r\n name: tokenPayload['unique_name'],\r\n roles: roles\r\n };\r\n\r\n supplierId = tokenPayload['https://schemas.microsoft.com/identity/claims/tenantid'];\r\n roles.push((supplierId != null && supplierId !== '') ? 'External' : 'Internal');\r\n PermPermissionStore.defineManyPermissions(roles, function (permissionName) {\r\n return hasRole(permissionName);\r\n });\r\n } else {\r\n supplierId = null;\r\n identity = null;\r\n }\r\n authenticated = !!identity;\r\n }\r\n\r\n function getIdentity() {\r\n return identity;\r\n }\r\n\r\n function getSupplierId() {\r\n return supplierId;\r\n }\r\n\r\n function getName() {\r\n return identity && identity.name;\r\n }\r\n\r\n function hasRole(role) {\r\n var roles = (identity && identity.roles) || [];\r\n return roles.indexOf(role) !== -1;\r\n }\r\n\r\n function isInternal() {\r\n return hasRole('Internal');\r\n }\r\n\r\n function isExternal() {\r\n return hasRole('External');\r\n }\r\n\r\n function isSuperuser() {\r\n return hasRole('Superuser') || hasRole('ExternalSuperuser');\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.auth')\r\n .factory('tokenService', tokenService);\r\n\r\n function tokenService($q, $httpParamSerializerJQLike, $log, dataService, localStorageService, jwtHelper, constants, principal) {\r\n var tokenKey = 'authToken';\r\n var refreshTokenKey = 'refreshTokenKey';\r\n\r\n var service = {\r\n authenticate: authenticate,\r\n unauthenticate: unauthenticate,\r\n getTokenOrRefresh: getTokenOrRefresh\r\n };\r\n return service;\r\n\r\n function authenticate(emailAddress, password, extraHeaders) {\r\n return tokenRequest({\r\n 'username': emailAddress,\r\n 'password': password,\r\n 'grant_type': 'password'\r\n }, extraHeaders);\r\n }\r\n\r\n function unauthenticate() {\r\n clearTokens();\r\n }\r\n\r\n function getTokenOrRefresh() {\r\n return $q(function (resolve, reject) {\r\n var tokens = fromLocalStorage();\r\n var token = tokens.token;\r\n var refreshToken = tokens.refreshToken;\r\n if (!token) {\r\n reject(new Error('unauthenticated'));\r\n }\r\n if (refreshToken && jwtHelper.isTokenExpired(token)) {\r\n $log.info('Sending token request: ' + refreshToken);\r\n tokenRequest({\r\n 'grant_type': 'refresh_token',\r\n 'refresh_token': refreshToken\r\n }).then(resolve, reject);\r\n } else {\r\n resolve({\r\n token: token,\r\n refreshToken: refreshToken\r\n });\r\n }\r\n });\r\n }\r\n\r\n function fromLocalStorage() {\r\n var tokens = {\r\n token: localStorageService.get(tokenKey),\r\n refreshToken: localStorageService.get(refreshTokenKey)\r\n };\r\n\r\n return tokens;\r\n }\r\n\r\n function tokenRequest(data, extraHeaders) {\r\n var defaults = {\r\n 'client_id': constants.clientId\r\n };\r\n var encodedData = $httpParamSerializerJQLike(angular.extend(data, defaults));\r\n var contentHeader = {'Content-Type': 'application/x-www-form-urlencoded'};\r\n var headers = angular.extend(contentHeader, extraHeaders);\r\n\r\n return dataService.postToEndpoint('oauth/token', encodedData, {\r\n // setting for angular-jwt\r\n skipAuthorization: true,\r\n headers: headers\r\n }).then(function(response) {\r\n var tokens = {\r\n token: response.data.access_token,\r\n refreshToken: response.data.refresh_token\r\n };\r\n saveTokens(tokens);\r\n return tokens;\r\n }).catch(function(response) {\r\n clearTokens();\r\n var code = (response && response.data && response.data.error) || response.statusText;\r\n var message = (response && response.data && response.data.error_description) || '';\r\n return $q.reject({\r\n code: code, \r\n message: message\r\n });\r\n });\r\n }\r\n\r\n function saveTokens(tokens) {\r\n $log.info('Tokens saved');\r\n $log.info('Refresh token:' + tokens.refreshToken);\r\n localStorageService.set(tokenKey, tokens.token);\r\n localStorageService.set(refreshTokenKey, tokens.refreshToken);\r\n principal.authenticate(tokens.token);\r\n }\r\n\r\n function clearTokens() {\r\n $log.info('Tokens cleared');\r\n localStorageService.remove(tokenKey, refreshTokenKey);\r\n principal.authenticate(null);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.config')\r\n .config(fetchConstantsAsynchronously);\r\n\r\n function fetchConstantsAsynchronously(asyncAppSetupProvider) {\r\n asyncAppSetupProvider.registerAsyncSetupTask(['preloadedDataService', 'constants', 'moment', ensureConstantsLoaded]);\r\n\r\n var constantsPromise = null;\r\n function ensureConstantsLoaded(preloadedDataService, constants, moment) {\r\n if (!constantsPromise) {\r\n constantsPromise = fetchConstants(preloadedDataService, constants, moment);\r\n }\r\n return constantsPromise;\r\n }\r\n }\r\n\r\n function fetchConstants(preloadedDataService, constants, moment) {\r\n return preloadedDataService.fetchStartupData().then(function (result) {\r\n constants.fitConstants = {};\r\n _.forEach(result.fitConstants, addToFitConstants);\r\n _.forEach(result, addToConstants);\r\n\r\n function addToFitConstants(fitConstantValue, fitConstantKey) {\r\n if (isIsoFormat(fitConstantValue)) {\r\n // The dates should be returned as moment objects- convert any in ISO format.\r\n constants.fitConstants[fitConstantKey] = moment(fitConstantValue);\r\n } else {\r\n constants.fitConstants[fitConstantKey] = fitConstantValue;\r\n }\r\n }\r\n\r\n function addToConstants(constantValue, constantKey) {\r\n // We already added fitConstants- ignore that here.\r\n if (constantKey !== 'fitConstants') {\r\n // If any options are undefined, use the empty list.\r\n constants[constantKey] = constantValue || [];\r\n }\r\n }\r\n\r\n function isIsoFormat(string) {\r\n return /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/.test(string);\r\n }\r\n\r\n });\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.config')\r\n .constant('constants', appConstants());\r\n\r\n function appConstants() {\r\n return {\r\n appTitle: 'CFR',\r\n clientId: 'fitclient'\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.conversationDialog')\r\n .controller('ConversationDialogController', ConversationDialogController);\r\n\r\n function ConversationDialogController($uibModalInstance, dataService, toastr, info, buttonOptions, $state, $scope, messageCacheService) {\r\n var vm = this;\r\n \r\n vm.info = info;\r\n vm.buttonOptions = buttonOptions;\r\n vm.onSubmit = sendMessage;\r\n vm.cancelSubmit = cancel;\r\n vm.goToDetailsPage = goToDetailsPage;\r\n\r\n vm.loadModel = function () {\r\n var endpoint = vm.info.apiPath + '/' + (vm.info.isInternal ? 'internal' : 'external') + 'Conversation';\r\n return dataService.fetchDataFromEndpoint(endpoint)\r\n .then(setConversationAndReturnModel);\r\n };\r\n\r\n $scope.$on('modal.closing',\r\n function(event, reason, closing) {\r\n if (closing) {\r\n // Clear the message cache- this message has been submitted.\r\n messageCacheService.clear(vm.info.cacheId);\r\n } else {\r\n // Cache the message- this is just a cancel.\r\n messageCacheService.update(vm.info.cacheId, vm.info.isInternal, vm.model.comments);\r\n }\r\n });\r\n\r\n function setConversationAndReturnModel(data) {\r\n vm.conversation = data;\r\n vm.model = {\r\n comments: messageCacheService.get(vm.info.cacheId, vm.info.isInternal)\r\n };\r\n return vm.model;\r\n }\r\n\r\n function sendMessage(model) {\r\n var endpoint = vm.info.apiPath + (vm.info.isInternal ? '/internalMessage' : '/externalMessage');\r\n dataService.postToEndpoint(endpoint, model)\r\n .then(handleSuccessfulPost)\r\n .catch(handleError);\r\n }\r\n\r\n function cancel() {\r\n vm.model.comments = '';\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function handleSuccessfulPost() {\r\n $uibModalInstance.close();\r\n toastr.success('Message successfully posted');\r\n }\r\n\r\n function handleError() {\r\n toastr.error('Posting the message failed. Please try again later.');\r\n }\r\n\r\n function goToDetailsPage() {\r\n vm.buttonOptions.goToDetailsPage($state);\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: vm.info.textBoxLabel,\r\n required: true,\r\n maxlength: 4000,\r\n rows: 8\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.conversationDialog')\r\n .factory('messageCacheService', messageCacheService);\r\n\r\n function messageCacheService() {\r\n var service = {\r\n get: getCachedMessage,\r\n update: updateCachedMessage,\r\n clear: clearMessageCache\r\n };\r\n var messageCache = {};\r\n return service;\r\n\r\n function getCachedMessage(id, isInternal) {\r\n return messageCache[id] ? messageCache[id][isInternal ? 'internal' : 'external'] : null;\r\n }\r\n\r\n function updateCachedMessage(id, isInternal, message) {\r\n if (_.has(messageCache, id)) {\r\n // Update the existing entry.\r\n messageCache[id][isInternal ? 'internal' : 'external'] = message;\r\n } else {\r\n // Create a new entry.\r\n messageCache[id] = {\r\n internal: isInternal ? message : null,\r\n external: isInternal ? null : message\r\n };\r\n }\r\n }\r\n \r\n function clearMessageCache(id) {\r\n delete messageCache[id];\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dataPresentation')\r\n .factory('dataLayoutService', dataLayoutService);\r\n\r\n function dataLayoutService(constants, constantUtils) {\r\n var service = {\r\n getLayout: getLayout\r\n };\r\n\r\n var deMinimisNotAskedValue = constantUtils\r\n .findConstantValue(constants.deMinimisDeclarationSignedOptions, 'NotAsked');\r\n \r\n var installationChanges = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Original export status',\r\n key: 'originalExportStatus',\r\n type: 'text'\r\n },\r\n {\r\n label: 'New export status',\r\n key: 'newExportStatus',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Original EPC Country',\r\n key: 'originalEPCCountry',\r\n type: 'text'\r\n },\r\n {\r\n label: 'New EPC Country',\r\n key: 'newEPCCountry',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Original EPC Type',\r\n key: 'originalEPCType',\r\n type: 'text'\r\n },\r\n {\r\n label: 'New EPC Type',\r\n key: 'newEPCType',\r\n type: 'text'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var installationLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'FIT ID',\r\n key: 'fitId',\r\n type: 'text',\r\n defaultValue: 'Pending'\r\n },\r\n {\r\n label: 'Licence name',\r\n key: 'licenceName',\r\n type: 'text',\r\n defaultValue: 'Unassigned'\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Installation status',\r\n key: 'statusCodeName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Payment status',\r\n key: 'paymentStatusName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Technology type',\r\n key: 'technologyTypeName',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Installation type',\r\n key: 'installationTypeName',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Application date',\r\n key: 'applicationDate',\r\n type: 'dateTime'\r\n },\r\n {\r\n label: 'Installation name',\r\n key: 'name',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Existing TIC (kW)',\r\n key: 'existingInstalledCapacity',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Existing DNC (kW)',\r\n key: 'existingDeclaredNetCapacity',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Grid connected',\r\n key: 'gridConnected',\r\n type: 'boolean',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Co-Located storage',\r\n key: 'coLocatedStorage',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Export status',\r\n key: 'exportStatusName',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Co-Located storage comment',\r\n key: 'coLocatedStorageComment',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Address',\r\n key: 'address',\r\n type: 'address',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'OS grid reference',\r\n key: 'osGridReference',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Community/school type',\r\n key: 'communityTypeName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Pre-registration date',\r\n key: 'preRegistrationDate',\r\n type: 'date',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Community/school ref',\r\n key: 'communityReferenceNumber',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'EPC country',\r\n key: 'epcCountryName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Country mismatch comment',\r\n key: 'epcCountryMismatchComment',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'EPC type',\r\n key: 'epcTypeName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: function (answerAndText) {\r\n return answerAndText[0] !== null;\r\n },\r\n items: [\r\n {\r\n label: 'Gen ' + constants.fitConstants.multiSiteLimit + '+ installations',\r\n key: 'multipleSiteGeneratorAnswer',\r\n type: 'boolean',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Comments',\r\n key: 'multipleSiteGeneratorText',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Gen receiving FIT payments',\r\n key: 'generatorReceivesPayments',\r\n type: 'boolean',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: function (answerAndText) {\r\n return answerAndText[0] !== null;\r\n },\r\n items: [\r\n {\r\n label: 'NR ' + constants.fitConstants.multiSiteLimit + '+ installations',\r\n key: 'multipleSiteNominatedRecipientAnswer',\r\n type: 'boolean',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Comments',\r\n key: 'multipleSiteNominatedRecipientText',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Meter inspection date',\r\n key: 'meterInspectionDate',\r\n type: 'date'\r\n },\r\n {\r\n label: 'FIT terms agreed date',\r\n key: 'fitTermsAgreedDate',\r\n type: 'date'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var installationCapacityLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'Extension reference',\r\n key: 'extensionReference',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Accreditation number',\r\n key: 'accreditationNumber',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Capacity status',\r\n key: 'capacityStatusName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Commissioning date',\r\n key: 'commissioningDate',\r\n type: 'date'\r\n },\r\n {\r\n label: 'Confirmation date',\r\n key: 'confirmationDate',\r\n type: 'date',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Eligibility date',\r\n key: 'eligibilityDate',\r\n type: 'date'\r\n },\r\n {\r\n label: 'Eligibility end date',\r\n key: 'eligibilityEndDate',\r\n type: 'date'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'TIC (kW)',\r\n key: 'installedCapacity',\r\n type: 'text'\r\n },\r\n {\r\n label: 'DNC (kW)',\r\n key: 'declaredNetCapacity',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Received grant',\r\n key: 'receivedGrant',\r\n type: 'boolean'\r\n },\r\n {\r\n label: 'Signed de minimis declaration',\r\n key: 'deMinimisDeclarationSignedDescription',\r\n type: 'text',\r\n showDependencies: ['deMinimisDeclarationSignedId'],\r\n show: function (description, idAsArray) {\r\n return angular.isDefined(idAsArray[0])\r\n && idAsArray[0] !== null\r\n && idAsArray[0] !== deMinimisNotAskedValue;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Payment split',\r\n key: 'paymentSplit',\r\n type: 'percentage',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'MCS issue date',\r\n key: 'mcsIssueDate',\r\n type: 'dateTime',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'PV installation type',\r\n key: 'installTypeName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'EER met',\r\n key: 'eerTypeName',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'EPC number',\r\n key: 'epcCertificateNumber',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'EPC date',\r\n key: 'epcCertificateDate',\r\n type: 'date',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'EER exemption notes',\r\n key: 'eerExemptComment',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'EPC number re-use notes',\r\n key: 'epcCertificateNumberComment',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var tariffLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'Tariff code',\r\n key: 'tariffCode',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Tariff rate (p/kWh)',\r\n key: 'tariffValue',\r\n type: 'tariff'\r\n }\r\n ]\r\n },\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Tariff description',\r\n key: 'description',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var recipientLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'ID',\r\n key: 'displayId',\r\n type: 'text',\r\n defaultValue: 'Pending'\r\n },\r\n {\r\n label: 'Title',\r\n key: 'title',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'First name',\r\n key: 'firstName',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Last name',\r\n key: 'lastName',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Company number',\r\n key: 'companyNumber',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Company name',\r\n key: 'companyName',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Address',\r\n key: 'address',\r\n type: 'address'\r\n },\r\n {\r\n label: 'Email address',\r\n key: 'emailAddress',\r\n type: 'text'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var addressLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n show: atLeastOneRowValueDefined,\r\n items: [\r\n {\r\n label: 'Address line 1',\r\n key: 'addressLine1',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Address line 2',\r\n key: 'addressLine2',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Town',\r\n key: 'town',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'County',\r\n key: 'county',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Country',\r\n key: 'country',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Postcode',\r\n key: 'postcode',\r\n type: 'text'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var supplyMeterLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n { \r\n label: 'Extension',\r\n key: 'extensionReference',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'MPAN',\r\n key: 'mpan',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Duplicate MPAN comment',\r\n key: 'duplicateMpanComment',\r\n type: 'text',\r\n showDependencies: ['duplicateMpanReason'],\r\n // If only a comment is supplied, it should be on the first row.\r\n show: function (mpanComment, mpanReason) {\r\n return mpanComment && !mpanReason[0];\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n // If both are defined, have these on a separate row.\r\n show: function(rowValues) {\r\n return rowValues[0] && rowValues[1];\r\n },\r\n items: [\r\n {\r\n label: 'Duplicate MPAN reason',\r\n key: 'duplicateMpanReasonText',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Duplicate MPAN comment',\r\n key: 'duplicateMpanComment',\r\n type: 'text'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var exportMeterLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'Extension',\r\n key: 'extensionReference',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'MPAN',\r\n key: 'mpan',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Serial number',\r\n key: 'serialNumber',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Duplicate MPAN comment',\r\n key: 'duplicateMpanComment',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var generationMeterLayout = {\r\n numberOfColumns: 3,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'Extension',\r\n key: 'extensionReference',\r\n type: 'text',\r\n show: isNotUndefinedOrEmpty\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Serial number',\r\n key: 'serialNumber',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Start reading',\r\n key: 'startMeterReading',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Start read date',\r\n key: 'startMeterReadingDate',\r\n type: 'date'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var supplierLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'Supplier ID',\r\n type: 'text',\r\n key: 'displayId'\r\n },\r\n {\r\n label: 'Supplier name',\r\n type: 'text',\r\n key: 'name'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Notification email address',\r\n type: 'text',\r\n key: 'notificationEmailAddress'\r\n },\r\n {\r\n label: 'Telephone',\r\n type: 'text',\r\n key: 'telephoneNumber',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Fax number',\r\n type: 'text',\r\n key: 'faxNumber',\r\n show: isNotUndefinedOrEmpty\r\n },\r\n {\r\n label: 'Address',\r\n type: 'address',\r\n key: 'address'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var documentsUploadedLayout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'File',\r\n key: 'documentName',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Type',\r\n key: 'documentTypeString',\r\n type: 'text'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n var layouts = {\r\n installation: installationLayout,\r\n installationChanges: installationChanges,\r\n installationCapacity: installationCapacityLayout,\r\n tariff: tariffLayout,\r\n recipient: recipientLayout,\r\n address: addressLayout,\r\n supplyMeter: supplyMeterLayout,\r\n exportMeter: exportMeterLayout,\r\n generationMeter: generationMeterLayout,\r\n supplier: supplierLayout,\r\n documentsUploaded: documentsUploadedLayout\r\n };\r\n\r\n return service;\r\n\r\n function getLayout(name) {\r\n var layout = layouts[name];\r\n validateLayout(layout);\r\n return layout;\r\n }\r\n\r\n function validateLayout(layout) {\r\n if (!layout) {\r\n throw new Error('The layout ' + name + ' does not exist.');\r\n }\r\n if (!layout.numberOfColumns) {\r\n throw new Error('The layout \\'' + name + '\\' must specify the number of columns.');\r\n }\r\n if (12 % layout.numberOfColumns !== 0) {\r\n throw new Error('The number of columns in a display data component must divide 12.');\r\n }\r\n }\r\n\r\n function isNotUndefinedOrEmpty(object) {\r\n return !(angular.isUndefined(object) || object === null);\r\n }\r\n\r\n function atLeastOneRowValueDefined(items) {\r\n return _.some(items,\r\n function (item) {\r\n return angular.isDefined(item)\r\n && item !== null;\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dataPresentation')\r\n .component('displayData', displayData());\r\n\r\n function displayData() {\r\n return {\r\n templateUrl: 'app/components/data-presentation/displayData.html',\r\n bindings: {\r\n data: '<',\r\n layout: '<',\r\n historyref: '<',\r\n returnstate: '<'\r\n },\r\n controller: 'displayDataController',\r\n controllerAs: 'vm',\r\n transclude: { 'datafooter': '?datafooter' }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dataPresentation')\r\n .controller('displayDataController', displayDataController);\r\n\r\n function displayDataController($scope, $filter) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.dataArray = [];\r\n vm.getFormattedData = getFormattedData;\r\n\r\n // The data must always be an array so that the outer repeat is valid. Set up a watch to update the\r\n // array whenever the data is changed.\r\n $scope.$watch(function () {\r\n return vm.data;\r\n },\r\n function (newData) {\r\n vm.dataArray = _.isArray(newData) ? newData : [newData];\r\n });\r\n\r\n function getFormattedData(layoutItem, dataItem) {\r\n var value = getFormattedValue(layoutItem, dataItem);\r\n if (!value && layoutItem.defaultValue) {\r\n return layoutItem.defaultValue;\r\n }\r\n return value;\r\n }\r\n\r\n function getFormattedValue(layoutItem, dataItem) {\r\n var value = dataItem[layoutItem.key];\r\n switch (layoutItem.type) {\r\n case 'date':\r\n return $filter('date')(value, 'dd/MM/yyyy');\r\n case 'dateTime':\r\n return $filter('date')(value, 'dd/MM/yyyy HH:mm:ss');\r\n case 'currency':\r\n return $filter('currency')(value, '£', 2);\r\n case 'percentage':\r\n return $filter('number')(value * 100, 2) + '%';\r\n case 'tariff':\r\n return $filter('number')(value, 2);\r\n case 'text':\r\n return value;\r\n case 'boolean':\r\n return value ? 'Yes' : 'No';\r\n case 'address':\r\n // Default predicate function is the identity- remove undefined/empty values.\r\n return _.filter([\r\n value.addressLine1, value.addressLine2, value.town, value.county, value.country, value.postcode\r\n ]).join(', ');\r\n case 'constant':\r\n return layoutItem.constantValue;\r\n default:\r\n throw new Error('The type ' + layoutItem.type + ' is invalid.');\r\n }\r\n }\r\n };\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dataPresentation')\r\n .filter('displayDataIsVisibleFilter', displayDataIsVisibleFilter);\r\n\r\n function displayDataIsVisibleFilter() {\r\n return function (layoutRowOrItemArray, dataItem) {\r\n return _.filter(layoutRowOrItemArray, shouldShow);\r\n\r\n function shouldShow(layoutRowOrItem) {\r\n if (!layoutRowOrItem.show) {\r\n // Layout rows and items with no show function are always visible.\r\n return true;\r\n }\r\n if (layoutRowOrItem.items) {\r\n // This is a row- the arguments are the values of the row's fields.\r\n var rowValues = getValues(layoutRowOrItem.items);\r\n return layoutRowOrItem.show(rowValues);\r\n } else {\r\n // This is a layout item- the arguments are the value of the layout item, plus dependencies.\r\n var value = dataItem[layoutRowOrItem.key];\r\n if (layoutRowOrItem.showDependencies) {\r\n return layoutRowOrItem.show(value, getDependencies(layoutRowOrItem));\r\n }\r\n return layoutRowOrItem.show(value);\r\n }\r\n }\r\n\r\n function getValues(layoutItems) {\r\n return _.map(layoutItems,\r\n function (layoutItem) {\r\n return layoutItem.key ? dataItem[layoutItem.key] : undefined;\r\n });\r\n }\r\n\r\n function getDependencies(layoutItem) {\r\n return _.map(layoutItem.showDependencies,\r\n function (dependency) {\r\n return (dataItem[dependency]);\r\n });\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dialog')\r\n .controller('CommentDialogController', CommentDialogController);\r\n\r\n function CommentDialogController($uibModalInstance, model, toastr) {\r\n var vm = this;\r\n\r\n vm.title = model.title;\r\n vm.message = model.message;\r\n vm.onSubmit = submit;\r\n vm.cancelSubmit = cancelSubmit;\r\n vm.loadModel = function () {\r\n return {\r\n comments: null\r\n };\r\n };\r\n\r\n function submit(submittedModel) {\r\n model.submit(submittedModel)\r\n .then(function () {\r\n $uibModalInstance.close();\r\n })\r\n .catch(model.errorHandler || defaultErrorHandler);\r\n }\r\n\r\n function cancelSubmit() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function defaultErrorHandler() {\r\n toastr.error('An error occured. Please try again later.');\r\n }\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-10 col-md-offset-1',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: model.label || 'Comments',\r\n required: true,\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }\r\n\r\n ]\r\n }\r\n ];\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dialog')\r\n .controller('DialogController', DialogController);\r\n \r\n function DialogController(model) {\r\n var vm = this;\r\n vm.title = model.title;\r\n vm.message = model.message;\r\n vm.buttons = model.buttons;\r\n vm.showFooter = vm.buttons.confirm || vm.buttons.cancel;\r\n vm.customBodyUrl = model.customBodyUrl;\r\n vm.customBodyModel = model.customBodyModel;\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.dialog')\r\n .factory('dialogService', dialogService);\r\n\r\n function dialogService($uibModal) {\r\n var defaultButtons = {\r\n confirm: true,\r\n cancel: true\r\n };\r\n\r\n var service = {\r\n showDialog: showDialog,\r\n showCommentDialog: showCommentDialog\r\n };\r\n return service;\r\n\r\n function showDialog(options) {\r\n return $uibModal.open({\r\n controller: 'DialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/dialog/dialog.html',\r\n size: options.size,\r\n resolve: {\r\n model: function () {\r\n return {\r\n title: options.title,\r\n message: options.message,\r\n buttons: angular.extend({}, defaultButtons, options.buttons),\r\n customBodyUrl: options.customBodyUrl,\r\n customBodyModel: options.customBodyModel,\r\n heading: options.heading\r\n };\r\n }\r\n }\r\n }).result;\r\n }\r\n\r\n function showCommentDialog(options) {\r\n if (!_.isFunction(options.submit)) {\r\n throw new Error('options.submit must be a function (to run before closing the comment dialog on submission)');\r\n }\r\n return $uibModal.open({\r\n controller: 'CommentDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/dialog/commentDialog.html',\r\n size: options.size,\r\n resolve: {\r\n model: function () {\r\n return {\r\n title: options.title,\r\n message: options.message,\r\n label: options.label,\r\n submit: options.submit,\r\n errorHandler: options.errorHandler\r\n };\r\n }\r\n }\r\n }).result;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.documents')\r\n .factory('documentsService', documentsService);\r\n\r\n function documentsService(appConfig, Upload, downloadService) {\r\n var authDocumentUrl = appConfig.apiRoot + 'suppliers/letters';\r\n var service = {\r\n uploadAuthorisationLetter: uploadAuthorisationLetter,\r\n updateAuthorisationLetter: updateAuthorisationLetter,\r\n uploadPublicInstallationDocument: uploadPublicInstallationDocument,\r\n uploadInternalInstallationDocument: uploadInternalInstallationDocument,\r\n openDocument: openDocument,\r\n uploadDocumentWithoutInstallation: uploadDocumentWithoutInstallation,\r\n uploadCsvImportDocument: uploadCsvImportDocument,\r\n uploadMpanDocument : uploadMpanDocument\r\n };\r\n return service;\r\n\r\n function uploadAuthorisationLetter(file) {\r\n return Upload.upload({ url: authDocumentUrl, data: { 'file': file, 'documentType': 0 } }).then(filterDocumentIdFromApiResult);\r\n }\r\n\r\n function updateAuthorisationLetter(file, id) {\r\n return Upload.upload({ url: authDocumentUrl, data: { 'file': file, 'documentType': 0, 'id': id } }).then(filterDocumentIdFromApiResult);\r\n }\r\n\r\n function uploadPublicInstallationDocument(formModel, id) {\r\n return uploadInstallationDocument(formModel, id, 'public');\r\n }\r\n\r\n function uploadInternalInstallationDocument(formModel, id) {\r\n return uploadInstallationDocument(formModel, id, 'internal');\r\n }\r\n\r\n function uploadInstallationDocument(formModel, id, docPermissionType) {\r\n var uploadInstallationDocumentUrl = appConfig.apiRoot + 'installation/' + id + '/documents/' + docPermissionType;\r\n return Upload.upload({ url: uploadInstallationDocumentUrl, data: formModel });\r\n }\r\n\r\n function filterDocumentIdFromApiResult(result) {\r\n return result.data.data.documentId;\r\n }\r\n\r\n function filterDocumentConfigFromApiResult(result) {\r\n return result.data.data;\r\n }\r\n\r\n function openDocument(documentId, isPublic) {\r\n downloadService.download('suppliers/letters/' + documentId, isPublic);\r\n }\r\n\r\n\r\n function uploadDocumentWithoutInstallation(file, documentType) {\r\n var uploadInstallationDocumentUrl = appConfig.apiRoot + 'installationAmendment/upload/document';\r\n return Upload.upload({ url: uploadInstallationDocumentUrl, data: { 'file': file, 'documentType': documentType } }).then(filterDocumentConfigFromApiResult);\r\n }\r\n\r\n function uploadCsvImportDocument(file) {\r\n var uploadInstallationDocumentUrl = appConfig.apiRoot + 'installation/csvImportDocumentUpload';\r\n return Upload.upload({ url: uploadInstallationDocumentUrl, data: { 'file': file, 'documentType': 98 } }).then(filterDocumentConfigFromApiResult);\r\n }\r\n\r\n function uploadMpanDocument(file) {\r\n var uploadMpanDocumentUrl = appConfig.apiRoot + 'smartExportGuarantee/mpanDocumentUpload';\r\n return Upload.upload({url: uploadMpanDocumentUrl, data: {'file': file, 'documentType': 97}})\r\n .then(filterDocumentConfigFromApiResult);\r\n }\r\n\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.download')\r\n .factory('downloadService', downloadService);\r\n\r\n function downloadService($window, $q, $httpParamSerializerJQLike, appConfig, tokenService) {\r\n var tokenName = 'access_token';\r\n\r\n var service = {\r\n download: download\r\n };\r\n return service;\r\n\r\n function download(endpoint, isPublic, params) {\r\n var promise = !isPublic ? getToken() : $q.when(null);\r\n return promise.then(function (token) {\r\n params = params || {};\r\n if (token) {\r\n params[tokenName] = token;\r\n }\r\n if (Object.keys(params).length) {\r\n var prefix = _.includes(endpoint, '?') ? '&' : '?';\r\n return endpoint + prefix + $httpParamSerializerJQLike(params);\r\n } else {\r\n return endpoint;\r\n }\r\n }).then(function (fullPath) {\r\n $window.location = appConfig.apiRoot + fullPath;\r\n });\r\n }\r\n\r\n function getToken() {\r\n return tokenService.getTokenOrRefresh()\r\n .then(function (tokens) {\r\n return tokens.token;\r\n })\r\n .catch(function () {\r\n // Swallow any errors and simply do not attach the token\r\n return null;\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.filters')\r\n .filter('duration', durationFilter);\r\n\r\n function durationFilter(moment) {\r\n return function (input, unit) {\r\n if (angular.isDefined(input) && input != null) {\r\n return moment.duration(input, unit).humanize();\r\n } else {\r\n return '';\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.filters')\r\n .filter('toLocalDate', toLocalDateFilter);\r\n\r\n function toLocalDateFilter() {\r\n return function (input) {\r\n if (angular.isDefined(input) && input != null) {\r\n return input.local().format('DD/MM/YYYY');\r\n } else {\r\n return '';\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('AccordionSectionController', AccordionSectionController);\r\n\r\n function AccordionSectionController($scope) {\r\n var vm = this;\r\n vm.isInvalid = function() {\r\n var accordionModel = $scope.options;\r\n var fields = accordionModel.fieldGroup;\r\n if (fields) {\r\n return _.some(fields, recursivelyCheckFieldIsInvalid);\r\n }\r\n\r\n function recursivelyCheckFieldIsInvalid(field) {\r\n var formFields = accordionModel.form;\r\n\r\n if (formFields[field.name] && formFields[field.name].$invalid) {\r\n return true;\r\n }\r\n\r\n else if (formFields[field.key] && formFields[field.key].$invalid) {\r\n return true;\r\n }\r\n\r\n var result = _.some(formFields, function(value, key) {\r\n if (/^formly_\\d+$/.test(key) && value.$invalid) {\r\n if (value[field.key] && value[field.key].$invalid) {\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n if (result) {\r\n return true;\r\n }\r\n\r\n if (field.templateOptions && field.templateOptions.fields) {\r\n return _.some(field.templateOptions.fields, recursivelyCheckFieldIsInvalid);\r\n }\r\n\r\n if (field.fieldGroup) {\r\n return _.some(field.fieldGroup, recursivelyCheckFieldIsInvalid);\r\n }\r\n return false;\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('AddressSearchController', AddressSearchController);\r\n\r\n function AddressSearchController($scope, addressService) {\r\n var vm = this;\r\n\r\n vm.addressModel = false;\r\n vm.searchingAddress = false;\r\n vm.addressesFound = false;\r\n vm.addressesSearched = false;\r\n vm.selectedAddress = {};\r\n vm.foundAddresses = [];\r\n vm.getPostcode = getPostcode;\r\n\r\n vm.searchAddresses = function () {\r\n var postcode = getPostcode();\r\n vm.error = '';\r\n vm.searchingAddress = true;\r\n addressService.lookupAddress(postcode).then(function(addresses) {\r\n vm.foundAddresses = addresses;\r\n vm.addressesFound = addresses.length > 0;\r\n }).catch( function(response) {\r\n vm.error = response.status === 503\r\n ? 'The service is currently unavailable to handle the request.'\r\n : 'An error occurred while communicating with the server. Please try again later.';\r\n }).finally(function () {\r\n vm.searchingAddress = false;\r\n vm.addressesSearched = true;\r\n });\r\n };\r\n\r\n vm.selectAddress = function () {\r\n var scopeModel = getScopeModel();\r\n scopeModel.addressLine1 = vm.selectedAddress ? vm.selectedAddress.addressLine1 : undefined;\r\n scopeModel.addressLine2 = vm.selectedAddress ? vm.selectedAddress.addressLine2 : undefined;\r\n scopeModel.town = vm.selectedAddress ? vm.selectedAddress.town : undefined;\r\n scopeModel.county = vm.selectedAddress ? vm.selectedAddress.county : undefined;\r\n scopeModel.country = vm.selectedAddress ? vm.selectedAddress.country : undefined;\r\n };\r\n \r\n vm.removeAddressFromModel = function() {\r\n vm.selectedAddress = {};\r\n vm.selectAddress();\r\n };\r\n\r\n if ($scope.to.populateFromModel) {\r\n attemptPopulateFromModel();\r\n }\r\n\r\n function getPostcode() {\r\n var scopeModel = getScopeModel();\r\n return scopeModel && scopeModel.postcode;\r\n }\r\n\r\n function getScopeModel() {\r\n return $scope.to.addressModel ? $scope.model[$scope.to.addressModel] : $scope.model;\r\n }\r\n\r\n\r\n function attemptPopulateFromModel() {\r\n var scopeModel = getScopeModel();\r\n if (angular.isDefined(scopeModel.postcode) && angular.isDefined(scopeModel.addressLine1)) {\r\n var address = addressService.createAddressObjectFromModel(scopeModel);\r\n vm.selectedAddress = address;\r\n vm.foundAddresses = [address];\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('FitAsyncSelectController', FitAsyncSelectController);\r\n\r\n function FitAsyncSelectController($scope, dataService, $log) {\r\n var vm = this;\r\n vm.options = [];\r\n vm.loading = true;\r\n vm.error = false;\r\n\r\n dataService.fetchDataFromEndpoint($scope.to.endpoint)\r\n .then(setOptions)\r\n .catch(displayError)\r\n .finally(stopLoading);\r\n\r\n function setOptions(options){\r\n vm.options = options;\r\n\r\n if (vm.options.length === 1) {\r\n $scope.model[$scope.options.key] = vm.options[0].value;\r\n }\r\n }\r\n\r\n function displayError(error) {\r\n vm.error = true;\r\n $log.warn('API request failed:', error);\r\n }\r\n\r\n function stopLoading() {\r\n vm.loading = false;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('DragAndDropController', DragAndDropController);\r\n\r\n function DragAndDropController(dataService, arrayUtils) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n var allItems = [];\r\n vm.selectedItems = [];\r\n vm.availableItems = [];\r\n vm.moved = removeItemFromListAndUpdate;\r\n vm.loading = true;\r\n vm.selectAll = selectAll;\r\n vm.unselectAll = unselectAll;\r\n vm.init = init;\r\n\r\n function init() {\r\n vm.getValue = _.property(vm.valueProp || 'value');\r\n vm.getName = _.property(vm.nameProp || 'name');\r\n\r\n // The source options can either be provided directly or loaded from an endpoint\r\n if (vm.optionsEndpoint) {\r\n dataService.fetchDataFromEndpoint(vm.optionsEndpoint)\r\n .then(function (data) {\r\n setAvailable(data);\r\n })\r\n .finally(function () {\r\n vm.loading = false;\r\n });\r\n } else if (vm.options) {\r\n setAvailable(vm.options);\r\n vm.loading = false;\r\n } else {\r\n throw new Error('Must provide either \\'options\\' or \\'options-endpoint\\'');\r\n }\r\n // Override $isEmpty to allow built-in validators (e.g. required) to do their thing\r\n vm.ngModel.$isEmpty = isEmpty;\r\n vm.ngModel.$render = render;\r\n }\r\n\r\n function selectAll() {\r\n arrayUtils.moveItems(vm.availableItems, vm.selectedItems);\r\n updateModel();\r\n }\r\n\r\n function unselectAll() {\r\n arrayUtils.moveItems(vm.selectedItems, vm.availableItems);\r\n updateModel();\r\n }\r\n\r\n function removeItemFromListAndUpdate(sourceList, item) {\r\n // We need to remove the item from the original list to avoid duplicate items\r\n sourceList.splice(sourceList.indexOf(item), 1);\r\n updateModel();\r\n }\r\n\r\n function setAvailable(newAllItems) {\r\n allItems = newAllItems;\r\n render();\r\n }\r\n\r\n function isEmpty(value) {\r\n return !value || !value.length;\r\n }\r\n\r\n function render() {\r\n var model = vm.ngModel.$viewValue;\r\n // Safety check\r\n if (!angular.isArray(model)) {\r\n model = [];\r\n }\r\n // Use .slice() to clone the array\r\n vm.availableItems = allItems.slice();\r\n vm.selectedItems = [];\r\n // We want to preserve order, so loop over model and pick out items\r\n // instead of looping over allItems\r\n model.forEach(function (modelItem) {\r\n arrayUtils.moveItems(vm.availableItems, vm.selectedItems, function (item) {\r\n return vm.getValue(item) === modelItem;\r\n });\r\n });\r\n }\r\n\r\n function updateModel() {\r\n // We call update whenever we poke the controls, so this is as good\r\n // a place as any to mark the model as touched. This turns on validation.\r\n vm.ngModel.$setTouched();\r\n var val = _.map(vm.selectedItems, vm.getValue);\r\n vm.ngModel.$setViewValue(val);\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .directive('dragAndDrop', dragAndDrop);\r\n\r\n function dragAndDrop() {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'app/components/form/dragAndDrop/dragAndDrop.html',\r\n bindToController: {\r\n valueProp: '
  • '\r\n + errors.join('
  • ')\r\n + '
  • ';\r\n\r\n function fieldKeyMatchesError(targetField) {\r\n return !!targetField.key && targetField.key.toUpperCase() === errorFieldKey.toUpperCase();\r\n }\r\n }\r\n\r\n function getAddressFields() {\r\n function mergeTemplateOptions(key, templateOptions) {\r\n if (vm.options.addressTemplateOptions[key]) {\r\n return angular.extend({}, templateOptions, vm.options.addressTemplateOptions[key]);\r\n } else {\r\n return templateOptions;\r\n }\r\n }\r\n\r\n var extendedFieldType = vm.options.addressFieldsReadOnly ? 'fitStatic' : 'fitInput';\r\n var rows = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n model: 'model.address',\r\n className: 'col-md-4',\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: mergeTemplateOptions('postcode', {\r\n required: true,\r\n maxlength: 50,\r\n label: 'Postcode',\r\n stSearch: 'postcode'\r\n })\r\n },\r\n {\r\n className: 'col-md-8 simulate-label',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n addressModel: 'address'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-4',\r\n model: 'model.address',\r\n key: 'addressLine1',\r\n type: extendedFieldType,\r\n templateOptions: mergeTemplateOptions('addressLine1', {\r\n required: true,\r\n maxlength: 50,\r\n label: 'Address line 1',\r\n stSearch: 'addressLine1'\r\n })\r\n },\r\n {\r\n className: 'col-md-4',\r\n model: 'model.address',\r\n key: 'addressLine2',\r\n type: extendedFieldType,\r\n templateOptions: mergeTemplateOptions('addressLine2', {\r\n required: false,\r\n maxlength: 50,\r\n label: 'Address line 2',\r\n stSearch: 'addressLine2'\r\n })\r\n },\r\n {\r\n className: 'col-md-4',\r\n model: 'model.address',\r\n key: 'town',\r\n type: extendedFieldType,\r\n templateOptions: mergeTemplateOptions('town', {\r\n required: true,\r\n maxlength: 50,\r\n label: 'Town/City',\r\n stSearch: 'town'\r\n })\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-4',\r\n model: 'model.address',\r\n key: 'county',\r\n type: extendedFieldType,\r\n templateOptions: mergeTemplateOptions('county', {\r\n required: false,\r\n maxlength: 50,\r\n label: 'County',\r\n stSearch: 'county'\r\n })\r\n },\r\n {\r\n className: 'col-md-4',\r\n model: 'model.address',\r\n key: 'country',\r\n type: extendedFieldType,\r\n defaultValue: '',\r\n templateOptions: mergeTemplateOptions('country', {\r\n label: 'Country:',\r\n required: true,\r\n options: [],\r\n stSearch: 'country'\r\n }),\r\n expressionProperties: {\r\n 'templateOptions.options': function () {\r\n return vm.countries.map(function (country) {\r\n return { value: country, name: country };\r\n });\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n return rows;\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n \r\n var formProperty = '$form';\r\n\r\n angular\r\n .module('components.form')\r\n .directive('fitForm', fitForm);\r\n\r\n function fitForm() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/components/form/fitForm/fitForm.html',\r\n scope: {\r\n model: '=?',\r\n formState: '=?',\r\n loadModel: '',\r\n wrapper: ['fitInputWrapper', 'bootstrapHasError'],\r\n defaultOptions: {\r\n modelOptions: {\r\n // Switch off debounce as we want instant validation feedback\r\n // and it's pretty tricky to change the value multiple times\r\n debounce: 0\r\n },\r\n ngModelAttrs: {\r\n availableTitle: { bound: 'available-title' },\r\n selectedTitle: { bound: 'selected-title' },\r\n valueProp: { bound: 'value-prop' },\r\n nameProp: { bound: 'name-prop' },\r\n optionsEndpoint: { bound: 'options-endpoint' },\r\n options: { bound: 'options' }\r\n },\r\n templateOptions: {\r\n availableTitle: 'Available',\r\n selectedTitle: 'Selected'\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'repeatSection',\r\n templateUrl: 'app/components/form/repeatSection.html',\r\n controller: 'RepeatSectionController as repeatVm'\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'headingText',\r\n template: '

    {{to.text}}

    '\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitTariffRate',\r\n template: '{{to.text | number: 2}}'\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'subHeadingText',\r\n template: '

    {{to.text}}

    '\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'break',\r\n template: '
    '\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'progressiveDisclosure',\r\n templateUrl: 'app/components/form/progressiveDisclosureField.html'\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitInlineError',\r\n templateUrl: 'app/components/form/fitInlineError.html'\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitInlineWarning',\r\n templateUrl: 'app/components/form/fitInlineWarning.html'\r\n });\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .config(formlyConfig);\r\n\r\n function formlyConfig(formlyConfigProvider) {\r\n \r\n formlyConfigProvider.setWrapper({\r\n name: 'fitInputWrapper',\r\n templateUrl: 'app/components/form/input.html'\r\n });\r\n\r\n formlyConfigProvider.setWrapper({\r\n name: 'accordionSection',\r\n templateUrl: 'app/components/form/accordionSection.html'\r\n });\r\n\r\n formlyConfigProvider.setWrapper({\r\n name: 'fitEmptySelectOptionsWrapper',\r\n templateUrl: 'app/components/form/emptySelectOptions.html'\r\n });\r\n\r\n formlyConfigProvider.setWrapper({\r\n name: 'fitCurrencyWrapper',\r\n template: '
    £
    '\r\n });\r\n } \r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .config(formlyConfigTransforms);\r\n\r\n function formlyConfigTransforms(formlyConfigProvider) {\r\n\r\n formlyConfigProvider.templateManipulators.postWrapper.push(function fitHelptext(template, options) {\r\n if (angular.isDefined(options.templateOptions.helpText)) {\r\n var templateObject = angular.element(template)[0];\r\n var label = angular.element(templateObject.querySelector('.form-group > label'));\r\n var tooltip = angular.element(\r\n ' ' +\r\n ''\r\n )[0];\r\n label.append(tooltip);\r\n return templateObject.outerHTML;\r\n } else {\r\n return template;\r\n }\r\n });\r\n\r\n formlyConfigProvider.extras.fieldTransform = function (fields) {\r\n return fields.map(function (field) {\r\n if (!field.key) {\r\n return field;\r\n }\r\n field.name = field.name || field.key;\r\n field.validation = field.validation || {};\r\n field.validation.messages = field.validation.messages || {};\r\n field.validation.messages.server = function (viewValue, modelValue, scope) {\r\n return scope.fc.$error.server;\r\n };\r\n angular.merge(field, {\r\n 'ngModelAttrs': {\r\n '': {\r\n 'value': 'reset-server-error'\r\n }\r\n }\r\n });\r\n return field;\r\n });\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .config(formlyConfig)\r\n .run(formlyRun);\r\n\r\n function formlyConfig(formlyConfigProvider, arrayUtils, stringUtils) {\r\n formlyConfigProvider.setType({\r\n name: 'fitSelectOptionsValidator',\r\n defaultOptions: {\r\n templateOptions: {\r\n label: 'Select from dropdown',\r\n placeholder: '',\r\n required: true\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitIntegerValidator',\r\n defaultOptions: {\r\n templateOptions: {\r\n pattern: '^[1-9][0-9]*$',\r\n patternValidationMessage: 'This field must be an integer.'\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitNumericValidator',\r\n defaultOptions: {\r\n templateOptions: {\r\n pattern: '^(0|[1-9][0-9]*)$',\r\n patternValidationMessage: 'Must be a number with no decimal places (not starting with 0)'\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitCapacityValidator',\r\n defaultOptions: {\r\n templateOptions: {\r\n // The '\\\\.' is required, as formly turns '\\.' into '.' in the resultant html.\r\n pattern: '^[0-9]{1,4}(?:\\\\.[0-9]{1,3})?$',\r\n patternValidationMessage: 'This field must contain at most 4 digits with 3 decimal places',\r\n placeholder: 'e.g. 1234.123'\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitAllowNegativeNumberWithThreeDecimals',\r\n defaultOptions: {\r\n templateOptions: {\r\n pattern: '^-?\\[0-9]{1,99}(?:\\\\.[0-9]{1,3})?$',\r\n patternValidationMessage: 'This field must not contain special characters except minus (-) with at most 3 decimal places'\r\n }\r\n }\r\n });\r\n\r\n function setDecimalPlacesValidator(name, places, placesText) {\r\n formlyConfigProvider.setType({\r\n name: name,\r\n defaultOptions: {\r\n templateOptions: {\r\n // The '\\\\.' is required, as formly turns '\\.' into '.' in the resultant html.\r\n pattern: '^(?:[0-9][,0-9]*|[0-9][,0-9]*.[0-9]{0,' + places + '})$',\r\n patternValidationMessage: 'This field must be a number with at most '\r\n + placesText + ' decimal places.'\r\n }\r\n }\r\n });\r\n }\r\n setDecimalPlacesValidator('fitThreeDecimalPlacesValidator', 3, 'three');\r\n setDecimalPlacesValidator('fitFourDecimalPlacesValidator', 4, 'four');\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitRegexValidator',\r\n extends: 'input',\r\n wrapper: ['fitInputWrapper', 'bootstrapHasError'],\r\n defaultOptions: {\r\n templateOptions: {\r\n pattern: '^(.*)$'\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitPrefixValidator',\r\n extends: 'input',\r\n wrapper: ['fitInputWrapper', 'bootstrapHasError'],\r\n defaultOptions: function (options) {\r\n var prefix = angular.isString(options.templateOptions.prefix)\r\n ? options.templateOptions.prefix\r\n : options.templateOptions.prefix.join('|');\r\n return {\r\n validators: {\r\n prefixCheck: function (viewValue) {\r\n return new RegExp('^(' + prefix + ')?[0-9]+$','i').test(viewValue);\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitMatchFieldValidator',\r\n defaultOptions: function (options) {\r\n var fieldKey = options.templateOptions.matchFieldKey;\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n expressionProperties: {\r\n // Disable the field unless the original field his populated and is valid\r\n 'templateOptions.disabled': function (viewValue, modelValue, scope) {\r\n var matchField = arrayUtils.findByProp(scope.fields, 'key', fieldKey);\r\n if (!matchField) {\r\n throw new Error('Could not find a field for the key ' + fieldKey);\r\n }\r\n var originalValue = getOriginalValue(scope);\r\n var invalidOriginal = matchField.formControl && matchField.formControl.$invalid;\r\n return !originalValue || invalidOriginal;\r\n }\r\n },\r\n validators: {\r\n matchField: function (viewValue, modelValue, fieldScope) {\r\n var value = modelValue || viewValue;\r\n return value === getOriginalValue(fieldScope);\r\n }\r\n }\r\n };\r\n\r\n function getOriginalValue(scope) {\r\n var model = options.data.modelToMatch || scope.model;\r\n return model[fieldKey];\r\n }\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitDateInFutureValidator',\r\n defaultOptions: function () {\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n dateInFuture: function (viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n return value && value > new Date().setHours(0,0,0,0);\r\n }\r\n }\r\n };\r\n }\r\n });\r\n \r\n formlyConfigProvider.setType({\r\n name: 'fitDateTodayOrInFutureValidator',\r\n defaultOptions: function () {\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n dateInFuture: function (viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n return value && value >= new Date().setHours(0,0,0,0);\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitDateNotInFutureValidator',\r\n defaultOptions: function () {\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n dateNotInFuture: function (viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n if (value === '' || angular.isUndefined(value) || value === null) {\r\n return true;\r\n }\r\n var res = value && value < new Date();\r\n return res;\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitDateNotTodayOrInFutureValidator',\r\n defaultOptions: function () {\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n dateNotTodayOrInFuture: function (viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n if (value && value >= new Date().setHours(0, 0, 0, 0)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitGreaterThanZeroValidator',\r\n defaultOptions: function () {\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n greaterThanZero: function (viewValue, modelValue) {\r\n return parseFloat(modelValue || viewValue) > 0;\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitGreaterThanValidator',\r\n defaultOptions: function (options) {\r\n var fieldKey = options.templateOptions.greaterThan;\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n greaterThan: function (viewValue, modelValue, scope) {\r\n var isValid = fieldIsGreaterThanComparison(fieldKey, viewValue, modelValue, scope);\r\n if (!isValid && bothFieldsAreSet(fieldKey, viewValue, modelValue, scope)) {\r\n options.validation.show = true;\r\n }\r\n return isValid;\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitLessThanOrEqualValidator',\r\n defaultOptions: function (options) {\r\n var fieldKey = options.templateOptions.lessThanOrEqual;\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n lessThanOrEqual: function (viewValue, modelValue, scope) {\r\n var isValid = !fieldIsGreaterThanComparison(fieldKey, viewValue, modelValue, scope);\r\n if (!isValid && bothFieldsAreSet(fieldKey, viewValue, modelValue, scope)) {\r\n options.validation.show = true;\r\n }\r\n return isValid;\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n formlyConfigProvider.setType({\r\n name: 'fitMaxDecimalValueValidator',\r\n defaultOptions: function (options) {\r\n return {\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n validators: {\r\n maxDecimalValue: function (viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n var isValid = value <= options.templateOptions.maxValue;\r\n return isValid;\r\n }\r\n }\r\n };\r\n }\r\n });\r\n\r\n\r\n function fieldIsGreaterThanComparison(fieldKey, viewValue, modelValue, scope) {\r\n var value = modelValue || viewValue;\r\n if (angular.isString(value))\r\n {\r\n value = stringUtils.parseNumber(value);\r\n }\r\n var comparison = scope.model[fieldKey];\r\n if (angular.isString(comparison))\r\n {\r\n comparison = stringUtils.parseNumber(comparison);\r\n }\r\n return value > comparison;\r\n }\r\n\r\n function bothFieldsAreSet(targetFieldKey, viewValue, modelValue, scope) {\r\n var currentFieldValue = modelValue || viewValue;\r\n var targetValue = scope.model[targetFieldKey];\r\n return !!targetValue && !!currentFieldValue;\r\n }\r\n }\r\n\r\n function formlyRun(formlyValidationMessages) {\r\n formlyValidationMessages.addStringMessage('parse', 'Please enter a valid value');\r\n formlyValidationMessages.addStringMessage('email', 'Must be a valid e-mail address');\r\n formlyValidationMessages.addStringMessage('date', 'This field must be a valid date');\r\n formlyValidationMessages.addStringMessage('dateInFuture', 'The date should be in the future');\r\n formlyValidationMessages.addStringMessage('dateNotInFuture', 'The date must not be in the future');\r\n formlyValidationMessages.addStringMessage('dateNotTodayOrInFuture', 'The date must not be today or in the future');\r\n formlyValidationMessages.addStringMessage('greaterThanZero', 'The value must be greater than zero');\r\n formlyValidationMessages.addTemplateOptionValueMessage('required', 'requiredValidationMessage', '', '', 'This information is required');\r\n formlyValidationMessages.addTemplateOptionValueMessage('datetime', 'dateTimeValidatorValidationMessage', '', '', 'This field must be a valid date and time');\r\n formlyValidationMessages.addTemplateOptionValueMessage('maxlength', 'maxlength', '', 'characters is the maximum length', 'This field is too long');\r\n formlyValidationMessages.addTemplateOptionValueMessage('pattern', 'patternValidationMessage', '', '', 'Invalid Input');\r\n formlyValidationMessages.addTemplateOptionValueMessage('server', 'serverValidationMessage', '', '', 'Server Error');\r\n formlyValidationMessages.addTemplateOptionValueMessage('comparisonValidator', 'comparisonValidatorValidationMessage', '', '', 'Server Error');\r\n formlyValidationMessages.addTemplateOptionValueMessage('matchField', 'matchFieldValidationMessage', '', '', 'Does not match');\r\n formlyValidationMessages.addTemplateOptionValueMessage('greaterThan', 'greaterThanValidationMessage', '', '', 'Should be greater than');\r\n formlyValidationMessages.addTemplateOptionValueMessage('lessThanOrEqual', 'lessThanOrEqualValidationMessage', '', '', 'Should be less than or equal to');\r\n formlyValidationMessages.addTemplateOptionValueMessage('maxDecimalValue', 'maxDecimalValueValidationMessage', '', '', 'Should be less than or equal to');\r\n formlyValidationMessages.addTemplateOptionValueMessage('prefixCheck', 'prefix', 'Expected prefix ', '', '');\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('components.form').component('formTemplate', {\r\n templateUrl: 'app/components/form/form-template.html',\r\n bindings: {\r\n model: '=',\r\n fields: '=',\r\n options: '=',\r\n form: '=?',\r\n error: '<'\r\n }\r\n });\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .component('progressiveDisclosure', progressiveDisclosure());\r\n\r\n function progressiveDisclosure() {\r\n return {\r\n restrict: 'AE',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/form/progressiveDisclosure.html',\r\n bindings: {\r\n heading: '<',\r\n body: '<'\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('RepeatSectionController', RepeatSectionController);\r\n\r\n var unique = 0;\r\n\r\n function RepeatSectionController($scope) {\r\n var vm = this;\r\n\r\n vm.formOptions = {formState: $scope.formState};\r\n vm.addNew = addNew;\r\n vm.copyFields = copyFields;\r\n\r\n function addNew() {\r\n $scope.model[$scope.options.key] = $scope.model[$scope.options.key] || [];\r\n var repeatsection = $scope.model[$scope.options.key];\r\n var newsection = {};\r\n repeatsection.push(newsection);\r\n }\r\n\r\n function copyFields(fields) {\r\n fields = angular.copy(fields);\r\n addIds(fields);\r\n return fields;\r\n }\r\n\r\n function addIds(fields) {\r\n var repeaterId = getNextRepeaterId();\r\n angular.forEach(fields, function (field, index) {\r\n if (field.fieldGroup) {\r\n addIds(field.fieldGroup);\r\n return; // fieldGroups don't need an ID\r\n }\r\n\r\n field.id = field.id || (field.key + '_' + index + '_' + repeaterId);\r\n });\r\n }\r\n\r\n function getNextRepeaterId() {\r\n unique++;\r\n return unique;\r\n }\r\n\r\n }\r\n})();","(function() {\r\n angular.module('components.form')\r\n .directive('resetServerError', resetServerError);\r\n \r\n function resetServerError() {\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link: function (scope, element, attrs, controller) {\r\n element.on('input change', function () {\r\n scope.$apply(function () {\r\n controller.$setValidity('server', true);\r\n });\r\n });\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('FitSelectController', FitSelectController);\r\n\r\n function FitSelectController($scope) {\r\n updateOptions();\r\n $scope.$watch('to.options', updateOptions);\r\n\r\n function updateOptions(){\r\n if ($scope.to.options.length === 1) {\r\n $scope.model[$scope.options.key] = $scope.to.options[0].value;\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.form')\r\n .controller('StaticOptionsController', StaticOptionsController);\r\n\r\n function StaticOptionsController($scope, arrayUtils) {\r\n var vm = this;\r\n var to = $scope.to;\r\n var opts = $scope.options;\r\n\r\n $scope.$watch('model', update, true);\r\n $scope.$watch('to.options', update);\r\n\r\n function update() {\r\n if (Object.keys($scope.model).length && to.options && to.options.length) {\r\n var modelValue = $scope.model[opts.key];\r\n if (!modelValue) {\r\n setValue(null);\r\n } else {\r\n var selectedItem = arrayUtils.findByProp(to.options, to.valueProp || 'value', modelValue);\r\n setValue(_.get(selectedItem, to.nameProp || 'name'));\r\n }\r\n }\r\n }\r\n\r\n function setValue(val) {\r\n vm.$text = val || '';\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.loader')\r\n .controller('FitLoaderController', FitLoaderController);\r\n\r\n function FitLoaderController($stateParams, $log) {\r\n var vm = this;\r\n vm.loading = false;\r\n vm.error = '';\r\n vm.$onInit = load;\r\n \r\n function load() {\r\n vm.loading = true;\r\n vm.loadModel().catch(displayError).finally(function() {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function displayError(response) {\r\n vm.error = 'There was an error communicating with the server. Please try again later.';\r\n $log.warn('API request failed:', response);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n \r\n var loaderProperty = '$loader';\r\n\r\n angular\r\n .module('components.loader')\r\n .directive('fitLoader', fitLoader);\r\n\r\n function fitLoader() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/components/loader/fitLoader.html',\r\n scope: {\r\n loadModel: '<'\r\n },\r\n controller: 'FitLoaderController',\r\n controllerAs: loaderProperty,\r\n bindToController: true,\r\n transclude: {\r\n header: '?fitLoaderHeader',\r\n content: '?fitLoaderContent',\r\n footer: '?fitLoaderFooter'\r\n }\r\n };\r\n\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.storage')\r\n .config(configureStorage);\r\n\r\n function configureStorage(localStorageServiceProvider) {\r\n localStorageServiceProvider.setPrefix('fit-client');\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.router')\r\n .provider('routeManager', routeManagerProvider);\r\n\r\n function routeManagerProvider($stateProvider, $urlRouterProvider, scopeUtils) {\r\n var config = {\r\n appTitle: undefined,\r\n resolveAlways: {}\r\n };\r\n\r\n this.configure = function(cfg) {\r\n angular.extend(config, cfg);\r\n };\r\n\r\n this.$get = RouteManager;\r\n\r\n function RouteManager($rootScope, $state, $document, $log, $transitions) {\r\n var otherwiseSet = false;\r\n var handlingRouteError = false;\r\n\r\n var service = {\r\n setOtherwise: setOtherwise,\r\n addStates: addStates\r\n };\r\n init();\r\n return service;\r\n\r\n function init() {\r\n setTitleAndClearErrors();\r\n handleRouteErrors();\r\n }\r\n\r\n function setOtherwise(otherwise) {\r\n if (!otherwiseSet) {\r\n $urlRouterProvider.otherwise(otherwise);\r\n otherwiseSet = true;\r\n } else {\r\n throw new Error('Attempting to set \\'otherwise\\' route more than once');\r\n }\r\n }\r\n\r\n function addStates(states) {\r\n states.forEach(function (state) {\r\n state.config.resolve = angular.extend(state.config.resolve || {}, config.resolveAlways);\r\n if (!state.root) {\r\n state.config.parent = state.config.parent\r\n ? state.config.parent\r\n : 'root';\r\n }\r\n $stateProvider.state(state.state, state.config);\r\n });\r\n }\r\n\r\n function setTitleAndClearErrors() {\r\n $transitions.onSuccess({}, function (transition) {\r\n var toStateTitle = transition.to().title;\r\n handlingRouteError = false;\r\n var title = toStateTitle ? config.appTitle + ' - ' + toStateTitle : config.appTitle;\r\n $rootScope.title = title;\r\n $document[0].body.scrollTop = $document[0].documentElement.scrollTop = 0;\r\n });\r\n }\r\n\r\n function handleRouteErrors() {\r\n // If there is a routing error, log the error and redirect to the home page\r\n scopeUtils.safeOn($rootScope, '$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {\r\n if (handlingRouteError || error == 'redirect') {\r\n return;\r\n }\r\n handlingRouteError = true;\r\n\r\n var destination = getToStateName(toState);\r\n var errorMsg = getErrorMessage(error);\r\n var msg = 'Error routing to ' + destination + '. ' + errorMsg;\r\n\r\n $log.warn(msg, [toState]);\r\n $state.go('errorPage');\r\n });\r\n }\r\n\r\n function getToStateName(toState) {\r\n return toState ? toState.title || toState.name || toState.loadedTemplateUrl : 'unknown target';\r\n }\r\n\r\n function getErrorMessage(error) {\r\n return error ? (error.data || '') + '. ' + (error.statusText || '') + ': ' + (error.status || '') : 'unknown error';\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.siteText')\r\n .factory('siteTextService', siteTextService);\r\n\r\n function siteTextService($q, $http, appConfig) {\r\n var service = {\r\n getTextValue: getTextValue,\r\n getTextValues: getTextValues,\r\n getEnvironmentValue: getEnvironmentValue\r\n };\r\n return service;\r\n\r\n function getTextValue(textId) {\r\n return $http.get(appConfig.apiRoot + 'text/' + textId).then(function (response) {\r\n if (response && response.data && response.data.data) {\r\n return { text: response.data.data };\r\n }\r\n return { error: 'invalid_text_format' };\r\n });\r\n }\r\n\r\n function getTextValues(textIds) {\r\n var queryString = '?id=' + textIds.join('&id=');\r\n var requestUrl = appConfig.apiRoot + 'text' + queryString;\r\n return $http.get(requestUrl).then(function (response) {\r\n if (response && response.data && response.data.data) {\r\n return { text: response.data.data };\r\n }\r\n return { error: 'invalid_text_format' };\r\n });\r\n }\r\n\r\n function getEnvironmentValue() {\r\n return $http.get(appConfig.apiRoot + 'text/' + 'Environment').then(function (response) {\r\n if (response && response.data && response.data.data) {\r\n return { text: response.data.data };\r\n }\r\n return { error: 'error' };\r\n });\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.startup')\r\n .provider('asyncAppSetup', asyncAppSetupProvider)\r\n .config(configureRouterProvider)\r\n .run(runAllAsyncConfiguration);\r\n\r\n function asyncAppSetupProvider() {\r\n var self = this;\r\n self.asyncSetupTaskFactories = [];\r\n\r\n self.registerAsyncSetupTask = function(promiseFactory) {\r\n self.asyncSetupTaskFactories.push(promiseFactory);\r\n };\r\n\r\n self.$get = getAsyncAppSetup;\r\n\r\n function getAsyncAppSetup($q, $injector) {\r\n function runAllSetupTasks() {\r\n var setupTaskPromises = _.map(self.asyncSetupTaskFactories, function(factory) {\r\n return $injector.invoke(factory, null, {});\r\n });\r\n\r\n return $q.all(setupTaskPromises);\r\n }\r\n\r\n return {\r\n runAllSetupTasks: runAllSetupTasks\r\n };\r\n }\r\n }\r\n\r\n\r\n function configureRouterProvider($urlRouterProvider) {\r\n $urlRouterProvider.deferIntercept();\r\n }\r\n\r\n function runAllAsyncConfiguration($urlRouter, asyncAppSetup) {\r\n // TODO:FIT-390 - Ensure that any promise failure results in an error page.\r\n asyncAppSetup.runAllSetupTasks().finally(function () {\r\n $urlRouter.sync();\r\n // Also enable router to listen to url changes\r\n $urlRouter.listen();\r\n });\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.startup')\r\n .factory('preloadedDataService', preloadedDataService);\r\n\r\n function preloadedDataService(dataService) {\r\n var service = {\r\n fetchStartupData: fetchStartupData\r\n };\r\n return service;\r\n\r\n function fetchStartupData() {\r\n return dataService.fetchDataFromEndpoint('startupConstants');\r\n }\r\n }\r\n})();","(function() {\r\n\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitCheckboxFilter', fitCheckboxFilter);\r\n\r\n function fitCheckboxFilter() {\r\n return {\r\n require: '^stTable',\r\n restrict: 'E',\r\n scope: {\r\n predicate: '@',\r\n modelProperty: '='\r\n },\r\n template: '',\r\n link: refreshTable\r\n };\r\n\r\n function refreshTable(scope, elem, attr, tableCtrl) {\r\n scope.change = function change() {\r\n tableCtrl.search(scope.modelProperty, scope.predicate);\r\n };\r\n }\r\n }\r\n})();","(function () {\r\n\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitDateFilter', fitDateFilter);\r\n\r\n function fitDateFilter() {\r\n return {\r\n restrict: 'E',\r\n require: '^stTable',\r\n scope: {\r\n predicate: '@',\r\n modelProperty: '='\r\n },\r\n templateUrl: 'app/components/table/datePicker.html',\r\n link: refreshTable,\r\n controller: fitDateFilterController\r\n };\r\n\r\n function refreshTable(scope, element, attrs, tableCtrl) {\r\n element.find('input').bind('blur', function () {\r\n tableCtrl.search(scope.modelProperty, scope.predicate);\r\n });\r\n }\r\n\r\n function fitDateFilterController($scope) {\r\n $scope.popup = {\r\n opened: false\r\n };\r\n\r\n $scope.openPopup = function () {\r\n $scope.popup.opened = true;\r\n };\r\n }\r\n }\r\n})();","(function () {\r\n angular\r\n .module('components.table')\r\n .directive('fitResetFilter', fitResetFilter);\r\n\r\n function fitResetFilter() {\r\n return {\r\n restrict: 'EA',\r\n require: '^stTable',\r\n scope: {\r\n resetFieldsHandler: '='\r\n },\r\n link: refreshTable\r\n };\r\n\r\n function refreshTable(scope, element, attrs, tableCtrl) {\r\n return element.bind('click', function () {\r\n scope.resetFieldsHandler();\r\n var tableState = tableCtrl.tableState();\r\n tableState.search.predicateObject = {};\r\n tableState.pagination.start = 0;\r\n return tableCtrl.pipe();\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .controller('FitTableController', FitTableController);\r\n\r\n var counter = 1;\r\n function getId() {\r\n return 'fit-table-' + counter++;\r\n }\r\n\r\n function FitTableController($q, $scope, $log, downloadService, addressService) {\r\n var vm = this;\r\n\r\n var pipeCalled = false;\r\n vm.tableState = null;\r\n vm.options = vm.options || {};\r\n vm.data = [];\r\n vm.onClickFunctions = {};\r\n vm.error = null;\r\n vm.$onInit = $onInit;\r\n\r\n // Various states\r\n vm.loading = true;\r\n vm.hasError = function () {\r\n return !vm.loading && !!vm.error;\r\n };\r\n vm.showPagination = function () {\r\n return !vm.loading && !vm.error;\r\n };\r\n vm.hasResults = function () {\r\n return vm.showPagination() && !!vm.data.length;\r\n };\r\n vm.noResults = function () {\r\n return vm.showPagination() && !vm.data.length;\r\n };\r\n\r\n vm.getFieldAsAddress = function (address) {\r\n return addressService.getFullAddress(address);\r\n };\r\n\r\n vm.downloadFile = function (endpoint) {\r\n downloadService.download(endpoint);\r\n };\r\n\r\n function $onInit() {\r\n if (!vm.id) {\r\n vm.id = getId();\r\n }\r\n\r\n if (!vm.pagination) {\r\n vm.pagination = {\r\n itemsPerPage: 30,\r\n displayedPages: 7\r\n };\r\n }\r\n if (!angular.isFunction(vm.fetch)) {\r\n throw new Error('fetch must be a function');\r\n }\r\n\r\n vm.pipe = function (tableState, ctrl) {\r\n if (angular.isDefined(vm.options)) {\r\n if (angular.isDefined(vm.options.suppressInitialLoad) && !pipeCalled) {\r\n pipeCalled = true;\r\n vm.data = [];\r\n return;\r\n }\r\n }\r\n if (vm.tableState === null) {\r\n if (angular.isDefined(tableState) && angular.isDefined(tableState.sort) && angular.isUndefined(tableState.sort.predicate)\r\n && angular.isDefined(vm.options) && angular.isDefined(vm.options.defaultSort)) {\r\n tableState.sort.predicate = vm.options.defaultSort;\r\n tableState.sort.reverse = vm.options.defaultSortDirection === 'descending';\r\n }\r\n vm.tableState = tableState;\r\n }\r\n vm.loading = true;\r\n vm.error = null;\r\n // wrap in $q.when in case fetch isn't a promise\r\n $q.when(vm.fetch(tableState, ctrl))\r\n .then(function (response) {\r\n tableState.pagination.numberOfPages = response.pageCount;\r\n vm.data = response.data;\r\n })\r\n .catch(function (err) {\r\n vm.error = 'Could not fetch data from server. Please try again later.';\r\n $log.warn('API request failed:', err);\r\n })\r\n .finally(function () {\r\n vm.loading = false;\r\n });\r\n };\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n \r\n var tableProperty = '$table';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitTable', fitTable);\r\n\r\n function fitTable(tableService) {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/components/table/fitTable.html',\r\n scope: {\r\n columns: '<',\r\n options: '<',\r\n fetch: '=',\r\n pagination: '<',\r\n id: '@?',\r\n rowValidProperty: '@',\r\n rowSelectProperty: '@'\r\n },\r\n controller: 'FitTableController',\r\n controllerAs: tableProperty,\r\n bindToController: true,\r\n transclude: {\r\n prefix: '?fitTablePrefix',\r\n suffix: '?fitTableSuffix'\r\n },\r\n link: linkFunction\r\n };\r\n\r\n function linkFunction(scope, element, attrs, ctrl, transclude) {\r\n scope[tableProperty].columns = tableService.applyPermissions(scope[tableProperty].columns);\r\n\r\n var tableParent = element.find('table').parent();\r\n var transcludeAndAttachTable = function (slot, method) {\r\n transclude(function (clone, transcludeScope) {\r\n // Make sure the prefix and suffix scopes have access to the table controller\r\n transcludeScope[tableProperty] = scope[tableProperty];\r\n tableParent[method](clone);\r\n }, null, slot);\r\n };\r\n\r\n transcludeAndAttachTable('prefix', 'prepend');\r\n transcludeAndAttachTable('suffix', 'append');\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .factory('tableService', tableService);\r\n\r\n function tableService(principal) {\r\n var service = {\r\n applyPermissions: applyPermissions\r\n };\r\n return service;\r\n\r\n function applyPermissions(columns) {\r\n return columns.filter(function (column) {\r\n var permissions = column.permissions;\r\n if (angular.isUndefined(permissions)) {\r\n return true;\r\n }\r\n if (!angular.isObject(permissions)) {\r\n return principal.hasRole(permissions);\r\n }\r\n if (angular.isArray(permissions)) {\r\n return _.some(permissions, principal.hasRole);\r\n }\r\n\r\n return objectPermissionsAreValid(permissions);\r\n });\r\n }\r\n\r\n function objectPermissionsAreValid(permissions) {\r\n if (angular.isDefined(permissions.only) && !principalHasRole(permissions.only)) {\r\n return false;\r\n }\r\n if (angular.isDefined(permissions.except) && principalHasRole(permissions.except)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function principalHasRole(roles) {\r\n if (angular.isArray(roles)) {\r\n return _.some(roles, principal.hasRole);\r\n }\r\n return principal.hasRole(roles);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitTableHeader', fitTableHeader);\r\n\r\n function fitTableHeader($compile) {\r\n return {\r\n restrict: 'AE',\r\n require: '^fitTable',\r\n scope: false,\r\n link: headerLink\r\n };\r\n\r\n function headerLink(scope, element, attrs, tableCtrl) {\r\n var column = scope.column;\r\n var newElement = angular.element('');\r\n newElement.attr('id', tableCtrl.id + '-header-' + column.id);\r\n if (column.sort) {\r\n newElement.attr('st-sort', column.sortId || column.id);\r\n }\r\n newElement.html(column.label);\r\n $compile(newElement)(scope, function (el) {\r\n element.replaceWith(el);\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitTableRefresh', fitTableRefresh);\r\n\r\n function fitTableRefresh(scopeUtils) {\r\n return {\r\n require: '^stTable',\r\n restrict: 'A',\r\n link: refreshLink\r\n };\r\n\r\n function refreshLink(scope, elem, attr, tableCtrl) {\r\n // Attach a method to the smartTable controller to allow updating\r\n // of the filter and picking off an update\r\n tableCtrl.refreshFilter = function (filter) {\r\n var tableState = tableCtrl.tableState();\r\n // Only want to update search and leave pagination alone\r\n tableState.search.predicateObject = filter;\r\n tableCtrl.pipe();\r\n };\r\n\r\n scopeUtils.safeOn(scope,\r\n 'fit-table:searchChange',\r\n function (event, args) {\r\n tableCtrl.refreshFilter(args);\r\n });\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitRowSelect', fitRowSelect);\r\n\r\n function fitRowSelect() {\r\n return {\r\n restrict: 'AE',\r\n require: '^stTable',\r\n link: linkFunction,\r\n scope : {\r\n row: '<',\r\n rowSelectProperty: '<',\r\n rowValidProperty: '<'\r\n }\r\n };\r\n\r\n function linkFunction(scope, element) {\r\n //The st-selected class will not be removed when property value changes without page refresh\r\n if (scope.rowSelectProperty) {\r\n if (scope.row[scope.rowSelectProperty]) {\r\n element.addClass('st-selected');\r\n }\r\n }\r\n if (scope.rowValidProperty) {\r\n if (!scope.row[scope.rowValidProperty]) {\r\n element.addClass('st-warn');\r\n }\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.table')\r\n .directive('fitTableValue', fitTableValue);\r\n\r\n function fitTableValue($compile, addressService) {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n column: '');\r\n if (column.valueTemplate) {\r\n newElement.html(column.valueTemplate);\r\n return newElement;\r\n }\r\n switch (column.type) {\r\n case 'empty':\r\n return newElement;\r\n case 'boolean':\r\n if (column.id) {\r\n cell.id = column.id;\r\n newElement.html('');\r\n } else {\r\n cell.condition = column.condition;\r\n newElement.html('');\r\n }\r\n return newElement;\r\n case 'conditional':\r\n var result = column.condition(data);\r\n return getElementHtml(column.states[result], cell, data);\r\n case 'location':\r\n var addressKey = column.addressKey || 'address';\r\n var gridReferenceKey = column.gridReferenceKey || 'osGridReference';\r\n var hasPostcode = data[addressKey] && data[addressKey].postcode !== null;\r\n\r\n var columnState = {\r\n id: hasPostcode ? addressKey : gridReferenceKey,\r\n type: hasPostcode ? 'address' : 'text'\r\n };\r\n return getElementHtml(columnState, cell, data);\r\n case 'button':\r\n cell.onClick = column.button.onClick;\r\n var showBtn = angular.isDefined(column.button.showBtn)\r\n ? '\" ng-show=\"data.' + column.button.showBtn + '\"'\r\n : '\"';\r\n var iconHtml = angular.isDefined(column.button.icon)\r\n ? ' '\r\n : '';\r\n newElement.html('');\r\n return newElement;\r\n case 'date':\r\n cell.id = column.id;\r\n newElement.html('{{::data[cell.id] | date:\\'dd-MM-yyyy\\'}}');\r\n return newElement;\r\n case 'decimal':\r\n cell.id = column.id;\r\n var decimalPlaces = angular.isDefined(column.decimalPlaces)\r\n ? column.decimalPlaces\r\n : 2;\r\n newElement.html('{{::data[cell.id]| number:' + decimalPlaces + '}}');\r\n return newElement;\r\n case 'percentage':\r\n cell.id = column.id;\r\n var decimalPlacesAfterPercentage = angular.isDefined(column.decimalPlaces)\r\n ? column.decimalPlaces\r\n : 0;\r\n newElement.html('{{::data[cell.id] * 100| number:' + decimalPlacesAfterPercentage + '}}%');\r\n return newElement;\r\n case 'currency':\r\n cell.id = column.id;\r\n newElement.html('{{::data[cell.id] | currency:\\'£\\':2}}');\r\n return newElement;\r\n case 'address':\r\n cell.id = column.id;\r\n cell.getFieldAsAddress = addressService.getFullAddress;\r\n newElement.html('{{::cell.getFieldAsAddress(data[cell.id])}}');\r\n return newElement;\r\n case 'dateTime':\r\n cell.id = column.id;\r\n newElement.html('{{::data[cell.id] | date:\\'dd-MM-yyyy HH:mm:ss\\'}}');\r\n return newElement;\r\n case 'duration':\r\n cell.id = column.id;\r\n var filterString = 'duration';\r\n if (column.unit) {\r\n filterString += ':\\'' + column.unit + '\\'';\r\n }\r\n newElement.html('{{::data[cell.id] | ' + filterString + '}}');\r\n return newElement;\r\n case 'checkbox':\r\n cell.onChange = column.onChange;\r\n var hideExpression = angular.isDefined(column.hideWhen)\r\n ? ' ng-hide=\"data.' + column.hideWhen + '\"'\r\n : '';\r\n newElement.html('');\r\n return newElement;\r\n case 'tooltip':\r\n cell.id = column.id;\r\n iconHtml = angular.isDefined(column.tooltip.icon)\r\n ? ' '\r\n : ' ';\r\n newElement.html('');\r\n return newElement;\r\n case 'link':\r\n var linkTextHtml = column.displayProperty\r\n ? '{{::data[cell.displayProperty]}}'\r\n : '{{::cell.displayText}}';\r\n cell.id = column.id;\r\n cell.displayProperty = column.displayProperty;\r\n cell.displayText = column.displayText;\r\n var params = column.params\r\n ? column.params\r\n : '{ ' + (column.newStateIdProperty || 'id') + ': data[cell.id] }';\r\n newElement.html('' + linkTextHtml + '');\r\n return newElement;\r\n case 'download':\r\n cell.downloadFile = column.downloadFile;\r\n cell.id = column.id;\r\n cell.displayProperty = column.displayProperty;\r\n newElement.html('{{::data[cell.displayProperty]}}');\r\n return newElement;\r\n case 'custom':\r\n column.updateCell(cell);\r\n newElement.html(column.html);\r\n return newElement;\r\n default:\r\n cell.id = column.id;\r\n newElement.html('{{::data[cell.id]}}');\r\n return newElement;\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.landing')\r\n .controller('AssignTaskDialogController', AssignTaskDialogController);\r\n\r\n function AssignTaskDialogController($uibModalInstance, submissionParams, dataService, toastr, $state, endpoints) {\r\n var vm = this;\r\n\r\n vm.onSubmit = submit;\r\n vm.cancelSubmit = cancelSubmit;\r\n vm.loadModel = function () {\r\n return {\r\n assignTo: null,\r\n comments: null\r\n };\r\n };\r\n\r\n fetchUsers();\r\n vm.users = [];\r\n\r\n function setUsers(response) {\r\n vm.users = (response);\r\n }\r\n\r\n function fetchUsers() {\r\n return dataService.fetchDataFromEndpoint(endpoints.getUsers)\r\n .then(setUsers);\r\n }\r\n\r\n function resolveAssigneeName(assigneeId) {\r\n var filteredUsers = vm.users.filter(function (item) { return item.value === assigneeId; });\r\n return filteredUsers[0].name;\r\n }\r\n\r\n function submit(model) {\r\n for (var i = 0; i < submissionParams.length; i++) {\r\n submissionParams[i].assignTo = model.assignTo;\r\n submissionParams[i].internalMessage = model.comments;\r\n }\r\n model = {\r\n items: submissionParams\r\n };\r\n \r\n dataService.patchToEndpoint(endpoints.assignMany, model)\r\n .then(function () {\r\n $uibModalInstance.close();\r\n })\r\n .catch(handleError);\r\n\r\n $state.go($state.current.name,{assigneeName: resolveAssigneeName(submissionParams[0].assignTo)});\r\n }\r\n\r\n function cancelSubmit() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function handleError() {\r\n toastr.error('Assign failed. Please try again later.');\r\n }\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6 col-md-offset-1',\r\n key: 'assignTo',\r\n type: 'fitAsyncSelect',\r\n templateOptions: {\r\n label: 'Assign to:',\r\n required: true,\r\n noOptionsMessage: 'No users found.',\r\n group: true,\r\n endpoint: endpoints.getUsers\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-10 col-md-offset-1',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comment for assignee',\r\n required: true,\r\n maxlength: 1000,\r\n rows: 6\r\n },\r\n hideExpression: function () {\r\n return submissionParams.supplierId != null;\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.landing')\r\n .component('taskView', {\r\n templateUrl: 'app/components/task-view/taskView.html',\r\n controller: 'TaskViewController',\r\n controllerAs: 'vm',\r\n bindings: {\r\n endpoints: '<',\r\n customColumns: '<',\r\n customFilters: '<',\r\n showConversationDialog: '<',\r\n getAssignParamsFromTask: '<',\r\n csvOptions: '<',\r\n taskOrderByOptions: '<',\r\n setFilters: '<',\r\n customMessageTypes: '<'\r\n }\r\n });\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n\t\t.module('app.landing')\r\n\t\t.controller('TaskViewController', TaskViewController);\r\n\r\n function TaskViewController($state, paginatedDataService, constants, toastr, $uibModal, principal, dataService) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () { \r\n var allOption = {\r\n name: 'Show all',\r\n value: null\r\n };\r\n var endpoint = null;\r\n var internalMessageLength = 20;\r\n var externalMessageLength = 35;\r\n vm.enableAssignManyTasksBtn = false;\r\n vm.isInternal = principal.isInternal();\r\n vm.users = [];\r\n vm.matchTypes = formatItemsToDropdownOptions(constants.taskMatchTypes);\r\n fetchUsersForMatchTypes();\r\n vm.messageTypes = formatItemsToDropdownOptionsSortByValue(vm.customMessageTypes);\r\n vm.columns = columns();\r\n vm.options = {};\r\n vm.selectedTasksForAssignment = [];\r\n vm.paramsForAssignment = [];\r\n vm.fetchTasks = fetchTasks;\r\n vm.tableParams = null;\r\n vm.customFiltersToShow = filterCustomFiltersAndFetchValues();\r\n\r\n function filterCustomFiltersAndFetchValues() {\r\n return _(vm.customFilters)\r\n .filter(function (filter) {\r\n return vm.isInternal || !filter.isInternalOnly;\r\n })\r\n .map(function (filter) {\r\n if (filter.fetchValues) {\r\n filter.fetchValues().then(function (values) {\r\n filter.values = values;\r\n });\r\n }\r\n return filter;\r\n }).value();\r\n }\r\n\r\n function setOptions(response) {\r\n vm.users = (response);\r\n }\r\n\r\n function fetchUsersForMatchTypes() {\r\n if (vm.isInternal) {\r\n return dataService.fetchDataFromEndpoint(vm.endpoints.getUsers)\r\n .then(setOptions);\r\n }\r\n return [];\r\n }\r\n\r\n function columns() {\r\n var columnObject = [];\r\n if (vm.isInternal) {\r\n columnObject = _.concat(columnObject,\r\n [\r\n {\r\n label: 'Internal assignee',\r\n valueTemplate: '{{data.assigneeName ? data.assigneeName : \"None\"}}'\r\n }\r\n ]);\r\n }\r\n columnObject = _.concat(columnObject, [\r\n {\r\n type: 'custom',\r\n label: 'Latest message',\r\n updateCell: function (cell) {\r\n cell.id = 'mostRecentExternalMessage',\r\n cell.onClick = showConversationDialog;\r\n cell.limit = vm.internal ? internalMessageLength : externalMessageLength;\r\n },\r\n html: '
    '\r\n + ''\r\n + '{{::data[cell.id].author}} {{::data[cell.id].message | limitTo: cell.limit}}'\r\n + '{{::data[cell.id].message.length > cell.limit ? \\'...\\' : \\'\\'}}'\r\n + '
    {{::data[cell.id].createdOn | date:\\'dd-MM-yyyy HH:mm:ss\\'}}'\r\n + '
    '\r\n }\r\n ]);\r\n if (vm.isInternal) {\r\n columnObject = _.concat(columnObject, [\r\n {\r\n type: 'button',\r\n button: {\r\n type: 'btn-secondary',\r\n text: 'Assign task',\r\n onClick: assignTask\r\n }\r\n }\r\n ]);\r\n }\r\n if (vm.isInternal) {\r\n columnObject = _.concat(columnObject, [\r\n {\r\n type: 'checkbox',\r\n id: 'create',\r\n label: 'Select',\r\n onChange: function (task) {\r\n toggleAssignTasksBtn(task.isChecked, task);\r\n }\r\n }\r\n ]);\r\n }\r\n columnObject = _.concat(vm.customColumns, columnObject);\r\n return columnObject;\r\n }\r\n\r\n function toggleAssignTasksBtn(isSelected, task) {\r\n if (isSelected === true) {\r\n vm.selectedTasksForAssignment.push(task);\r\n } else {\r\n var index = vm.selectedTasksForAssignment.indexOf();\r\n vm.selectedTasksForAssignment.splice(index, 1);\r\n }\r\n vm.enableAssignManyTasksBtn = vm.selectedTasksForAssignment.length > 0;\r\n }\r\n\r\n function fetchTasks(tableData) {\r\n\r\n // added by Eric 12/01/2023 to ensure predicateObject exists so its matchType and orderingId properties can be accessed\r\n if (angular.isUndefined(tableData.search.predicateObject)) {\r\n tableData.search.predicateObject = {};\r\n }\r\n\r\n // added by Eric 29/12/2022 to avoid undefined value for assignee dropdown \r\n if (tableData.search.predicateObject.matchType === '? undefined:undefined ?') {\r\n tableData.search.predicateObject.matchType = null;\r\n }\r\n // added by Eric 03/01/2023 to avoid undefined sort order for search results\r\n if (angular.isUndefined(tableData.search.predicateObject.orderingId)) {\r\n tableData.search.predicateObject.orderingId = '1';\r\n }\r\n\r\n vm.tableParams = tableData.search.predicateObject;\r\n vm.setFilters(vm.tableParams);\r\n endpoint = vm.endpoints.getPaginatedTasks + '/' + (vm.isInternal ? 'internal' : 'external');\r\n return paginatedDataService.fetchDataFromTableData(endpoint, tableData);\r\n }\r\n\r\n vm.assignManyTasks = function () {\r\n vm.assignFailed = false;\r\n vm.selectedTasksForAssignment.forEach(function (item) {\r\n var params = vm.getAssignParamsFromTask(item);\r\n vm.paramsForAssignment.push(params);\r\n });\r\n showReassignDialog(vm.paramsForAssignment).then(notifyAssignSuccessAndReload);\r\n };\r\n\r\n function assignTask(task) {\r\n vm.assignFailed = false;\r\n var params = vm.getAssignParamsFromTask(task);\r\n vm.paramsForAssignment.push(params);\r\n showReassignDialog(vm.paramsForAssignment).then(notifyAssignSuccessAndReload);\r\n }\r\n\r\n function notifyAssignSuccessAndReload() {\r\n reloadPage();\r\n toastr.success('Task successfully assigned.');\r\n }\r\n\r\n function formatItemsToDropdownOptions(types) {\r\n var typeOptions = _.sortBy(types, ['name']);\r\n return _.concat([allOption], typeOptions);\r\n }\r\n\r\n function formatItemsToDropdownOptionsSortByValue(types) {\r\n var typeOptions = _.sortBy(types, ['value']);\r\n return _.concat([allOption], typeOptions);\r\n }\r\n\r\n function showReassignDialog(params) {\r\n return $uibModal.open({\r\n controller: 'AssignTaskDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/task-view/assignTaskDialog.html',\r\n resolve: {\r\n submissionParams: function () {\r\n return params;\r\n },\r\n endpoints: function () {\r\n return vm.endpoints;\r\n }\r\n }\r\n }).result;\r\n }\r\n\r\n function showConversationDialog(task) {\r\n vm.showConversationDialog(task)\r\n .then(reloadPage);\r\n }\r\n\r\n function reloadPage() {\r\n $state.reload();\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.warning')\r\n .component('serverWarning', serverWarning());\r\n\r\n function serverWarning() {\r\n return {\r\n restrict: 'E',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/warning/serverWarning.html',\r\n bindings: {\r\n show: '<'\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.warning')\r\n .component('warningMessage', warningMessage());\r\n\r\n function warningMessage() {\r\n return {\r\n restrict: 'E',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/warning/warningMessage.html',\r\n bindings: {\r\n show: '<',\r\n warningType: '@?'\r\n },\r\n transclude: true\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.wizard')\r\n .factory('installationWizardService', installationWizardService);\r\n\r\n function installationWizardService($q, $window) {\r\n var canEnterFunctions = {};\r\n var isEnabledFunctions = {};\r\n\r\n return {\r\n setPageEntryFunction: setPageEntryFunction,\r\n callPageEntryFunction: callPageEntryFunction,\r\n hasPageEntryFunction: hasPageEntryFunction,\r\n hasIsEnabledFunction: hasIsEnabledFunction,\r\n callIsEnabledFunction: callIsEnabledFunction,\r\n setIsEnabledFunction: setIsEnabledFunction,\r\n scrollToTop: scrollToTop\r\n };\r\n\r\n function scrollToTop() {\r\n // To avoid issues where changing wizard step will leave you are the bottom of the page, we manually\r\n // call this to force scroll to the top of the page.\r\n $window.scrollTo(0, 0);\r\n }\r\n\r\n function setIsEnabledFunction(key, func) {\r\n isEnabledFunctions[key] = func;\r\n }\r\n\r\n function hasIsEnabledFunction(key) {\r\n return angular.isDefined(isEnabledFunctions[key]);\r\n }\r\n\r\n function callIsEnabledFunction(key) {\r\n if (isEnabledFunctions[key]) {\r\n return isEnabledFunctions[key]();\r\n }\r\n throw new Error('\"isEnabled\" method must be set for wizard step with key: ' + key);\r\n }\r\n\r\n function setPageEntryFunction(key, func) {\r\n canEnterFunctions[key] = func;\r\n }\r\n\r\n function hasPageEntryFunction(key) {\r\n return angular.isDefined(canEnterFunctions[key]);\r\n }\r\n\r\n function callPageEntryFunction(key) {\r\n if (canEnterFunctions[key]) {\r\n scrollToTop();\r\n // 'true' required for canenter method on wizard.\r\n return $q.when(canEnterFunctions[key]()).then(function() {return true;});\r\n }\r\n throw new Error('\"canenter\" method must be set for wizard step with key: ' + key);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('components.wizard')\r\n .component('wizardFormStep', wizardFormStep());\r\n\r\n function wizardFormStep() {\r\n return {\r\n restrict: 'E',\r\n controller: 'WizardFormStepController',\r\n bindToController: true,\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/wizard/wizardFormStep.html',\r\n bindings: {\r\n firstPage: '=?',\r\n fullWidth: '=?',\r\n title: '@',\r\n storageService: '=?',\r\n model: '=?',\r\n fields: ' 0;\r\n }\r\n\r\n function lessThanOrEqualToExistingInstalledCapacity(viewValue, modelValue, scope) {\r\n var existingDeclaredNetCapacity = parseFloat(modelValue || viewValue);\r\n // If installed capacity is yet to be added, we assume it is 0 to force a validation message.\r\n var existingInstalledCapacity = scope.model.existingInstalledCapacity ? parseFloat(scope.model.existingInstalledCapacity) : 0;\r\n\r\n return existingDeclaredNetCapacity <= existingInstalledCapacity;\r\n }\r\n\r\n function combinedInstalledCapacityIsUnderLimit(viewValue, modelValue, scope) {\r\n var existingInstalledCapacity = parseFloat(modelValue || viewValue);\r\n // If installed capacity is yet to be added, we assume it is 0 to avoid issues.\r\n var installedCapacity = scope.model.installedCapacity ? parseFloat(scope.model.installedCapacity) : 0;\r\n\r\n return combinedCapacityIsUnderLimit(installedCapacity, existingInstalledCapacity);\r\n }\r\n\r\n\r\n function combinedDeclaredNetCapacityIsUnderLimit(viewValue, modelValue, scope) {\r\n var existingDeclaredNetCapacity = parseFloat(modelValue || viewValue);\r\n // If declared net capacity is yet to be added, we assume it is 0 to avoid issues.\r\n var declaredNetCapacity = scope.model.declaredNetCapacity ? parseFloat(scope.model.declaredNetCapacity) : 0;\r\n\r\n return combinedCapacityIsUnderLimit(declaredNetCapacity, existingDeclaredNetCapacity);\r\n }\r\n\r\n function combinedCapacityIsUnderLimit(capacity, existingCapacity) {\r\n return (capacity + existingCapacity) <= constants.fitConstants.capacityLimitKilowatts;\r\n }\r\n }\r\n\r\n function getPreInstallTypeTechnologyFields() {\r\n return [{\r\n key: 'technologyType',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please choose the technology type for your installation:',\r\n required: true,\r\n options: constants.technologyTypes,\r\n onChange: clearDuplicateMatches\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n }];\r\n }\r\n\r\n function clearDuplicateMatches($viewValue, $modelValue, scope) {\r\n scope.formState.foundInstallationMatch = false;\r\n }\r\n\r\n function getApplicationDateFields(key, isDateTime) {\r\n key = angular.isDefined(key) ? key : 'applicationDate';\r\n isDateTime = angular.isDefined(isDateTime) ? isDateTime : false;\r\n return [{\r\n key: key,\r\n type: isDateTime ? 'fitDateTimePicker' : 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n label: 'Please enter the application date for the installation:',\r\n required: true,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'For MCS installations this is the date the generator\\'s application for FIT payments was received by the FIT licensee.' +\r\n ' For ROO-FIT applications the application date is the date the generator applied to Ofgem for ROO-FIT accreditation.'\r\n }\r\n },\r\n validators: {\r\n afterRooFitStartDate: {\r\n expression: applicationDateIsAfterRooFitStartDate,\r\n message: '\"The application date must be on or after 1st April 2010.\"'\r\n },\r\n afterCapacityCapsDateForPrelim: {\r\n expression: afterCapacityCapsDateForPrelimRoofit,\r\n message: '\"Prelim ROO-FIT installations cannot have an application date earlier than 01-12-2012\"'\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n }];\r\n\r\n function applicationDateIsAfterRooFitStartDate(viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n return moment(value).isSameOrAfter(constants.fitConstants.rooFitApplicationStartDate);\r\n }\r\n\r\n function afterCapacityCapsDateForPrelimRoofit(viewValue, modelValue, scope) {\r\n var value = modelValue || viewValue;\r\n var rooFitId = constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit');\r\n var accreditationType = formUtils.getPropertyFromModelOrFormState(scope, 'accreditationType');\r\n\r\n if (accreditationType === rooFitId && _.startsWith(scope.formState.accreditationNumber, 'P')) {\r\n return moment(value).isSameOrAfter(constants.fitConstants.fitComprehensiveReviewPhase2BLiveDate);\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n function getEligibilityDateOverrideFields() {\r\n return [{\r\n key: 'eligibilityDateOverride',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n label: 'Please enter the ROO-FIT eligibility date override for the installation:',\r\n required: true,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This field is used in lieu of an automatically calculated eligibility date ' +\r\n 'for ROO-FIT installations.'\r\n }\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n var accreditationType = formUtils.getPropertyFromModelOrFormState(scope, 'accreditationType');\r\n return accreditationType !== constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit');\r\n }\r\n }];\r\n }\r\n\r\n function getPostInstallTypeTechnologyFields() {\r\n return [\r\n {\r\n key: 'installationType',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please choose the installation type for your installation:',\r\n required: true,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'Please note that these terms are not defined in legislation and are purely for information.'\r\n },\r\n options: constants.installationTypes\r\n }\r\n }];\r\n }\r\n\r\n function getPostCommissioningDateTechnologyFields() {\r\n return [\r\n {\r\n key: 'gridConnected',\r\n type: 'fitBooleanRadio',\r\n templateOptions: {\r\n label: 'Is the installation connected to the grid?',\r\n required: true\r\n }\r\n },\r\n {\r\n key: 'exportStatus',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please select the export status for your installation:',\r\n required: true,\r\n options: constants.exportStatuses\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !scope.model.gridConnected;\r\n }\r\n },\r\n {\r\n key: 'coLocatedStorage',\r\n type: 'storageQuestionRadioInternal',\r\n templateOptions: {\r\n label: 'Does this system have co-located storage?',\r\n required: true,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body:\r\n 'A co-located storage is defined as a battery storage which is located with or linked to a renewable generating station or installation, supplied (at least in part) by this source of generation.'\r\n }\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n var internalUserWithStorageUnconfirmed\r\n = principal.isExternal() && scope.model.coLocatedStorage !== 'Unconfirmed';\r\n return internalUserWithStorageUnconfirmed;\r\n },\r\n validators: {\r\n coLocatedStorage: {\r\n expression: function ($viewValue, $modelValue) {\r\n var value = $modelValue || $viewValue;\r\n\r\n if (value === angular.isUndefine) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n },\r\n {\r\n key: 'coLocatedStorage',\r\n type: 'storageQuestionRadioExternal',\r\n templateOptions: {\r\n label: 'Does this system have co-located storage?',\r\n required: false,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body:\r\n 'A co-located storage is defined as a battery storage which is located with or linked to a renewable generating station or installation, supplied (at least in part) by this source of generation.'\r\n }\r\n },\r\n validators: {\r\n coLocatedStorage: {\r\n expression: function ($viewValue, $modelValue, scope) {\r\n var value = $modelValue || $viewValue;\r\n \r\n if (scope.model.fitId !== angular.isUndefine) {return true;}\r\n\r\n if (value === angular.isUndefine || value === 'N/A') {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n var externalUserWithStorageUnconfirmed =\r\n principal.isExternal() && scope.model.coLocatedStorage === 'Unconfirmed'\r\n || principal.isInternal();\r\n\r\n return externalUserWithStorageUnconfirmed;\r\n }\r\n },\r\n {\r\n key: 'coLocatedStorageComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please add a comment.',\r\n required: true\r\n },\r\n hideExpression: function ($viewValue, $modelVale, scope) {\r\n return angular.isUndefined(scope.model.coLocatedStorage)\r\n || scope.model.coLocatedStorage === null\r\n || scope.model.coLocatedStorage === 'No'\r\n || scope.model.coLocatedStorage === 'Unconfirmed'\r\n || scope.model.coLocatedStorage === 'N/A';\r\n }\r\n }\r\n ];\r\n }\r\n\r\n function getAlDetailsFields(suppliedId, hasNominatedRecipient, hasExistingAddress) {\r\n return getLicenceFields(suppliedId)\r\n .concat(getAddressFields(hasNominatedRecipient, hasExistingAddress))\r\n .concat(getBasicsFields())\r\n .concat(getPreInstallTypeTechnologyFields())\r\n .concat(getApplicationDateFields('applicationDate', true))\r\n .concat(getPostInstallTypeTechnologyFields())\r\n .concat(getPostCommissioningDateTechnologyFields())\r\n .concat(getExistingCapacityFields());\r\n }\r\n\r\n function getCommunityFields() {\r\n var schoolId = constantUtils.findConstantValue(constants.communityTypes, 'School');\r\n return [\r\n {\r\n key: 'communityType',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please enter Community Energy / School Installation Category:',\r\n required: true,\r\n options: constants.communityTypes\r\n }\r\n },\r\n {\r\n key: 'communityReferenceNumber',\r\n type: 'fitStrictLengthInput',\r\n templateOptions: {\r\n label: 'Please enter Community Energy Reference Number:',\r\n required: true,\r\n strictLength: 7\r\n },\r\n validators: {\r\n isValidCommunityRef: {\r\n expression: isValidCommunityReference,\r\n message: '\"Invalid format. Your reference must start with capital C, followed by 6 digits.\"'\r\n },\r\n isValidSchoolRef: {\r\n expression: isValidSchoolReference,\r\n message: '\"Invalid format. Your reference must start with capital S, followed by 6 digits.\"'\r\n }\r\n },\r\n expressionProperties: {\r\n 'templateOptions.label': function ($viewValue, $modelValue, scope) {\r\n if (scope.model.communityType === schoolId) {\r\n return 'Please enter School Reference Number:';\r\n }\r\n return 'Please enter Community Energy Reference Number:';\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !installationRulesService.shouldShowCommunityReference(scope.model.communityType);\r\n }\r\n },\r\n {\r\n key: 'preRegistrationDate',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n label: 'Please select a pre-registration date:',\r\n required: true\r\n },\r\n validators: {\r\n afterCompRevPhase2B: {\r\n expression: afterFitComprehensiveReviewPhase2BLiveDate,\r\n message: '\"Pre-registration date must be after 1st December 2012.\"'\r\n },\r\n withinAYearOfApplicationDate: {\r\n expression: isWithinOneYearBeforeApplicationDate,\r\n message: '\"Pre-registration date must be within a year of application date.\"'\r\n },\r\n validAfterPreCapCommunityChangeDate: {\r\n expression: validAfterPreCapCommunityChangeDate,\r\n message: '\"Pre-registration date cannot be before the commissioning date for the installation.\"'\r\n },\r\n validForSchoolInstallation: {\r\n expression: validForSchoolInstallation,\r\n message: '\"Pre-registration date cannot be before the commissioning date for the installation.\"'\r\n }\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !installationRulesService.shouldShowPreRegistrationDate(scope.model.communityType, scope.options.formState.totalInstalledCapacity);\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n }\r\n ];\r\n\r\n function isWithinOneYearBeforeApplicationDate(viewValue, modelValue, scope) {\r\n var dateValue = moment(modelValue || viewValue);\r\n var applicationDate = moment(formUtils.getPropertyFromModelOrFormState(scope, 'applicationDate')); \r\n\r\n return dateValue.isSameOrBefore(applicationDate)\r\n && dateValue.isSameOrAfter(applicationDate.subtract(1, 'year'));\r\n }\r\n\r\n function afterFitComprehensiveReviewPhase2BLiveDate(viewValue, modelValue) {\r\n var dateValue = moment(modelValue || viewValue);\r\n var compRevPhase2BDate = constants.fitConstants.fitComprehensiveReviewPhase2BLiveDate;\r\n\r\n return dateValue.isSameOrAfter(compRevPhase2BDate);\r\n }\r\n\r\n function validAfterPreCapCommunityChangeDate(viewValue, modelValue, scope) {\r\n var dateValue = moment(modelValue || viewValue);\r\n var preCapCommunityChangeDate = constants.fitConstants.preCapCommunityChangeDate;\r\n var commissioningDate = moment(formUtils.getPropertyFromModelOrFormState(scope, 'commissioningDate'));\r\n \r\n if (fitSchemeClosureValidation(dateValue, commissioningDate, scope)) {\r\n return true;\r\n }\r\n\r\n if (dateValue.isSameOrAfter(preCapCommunityChangeDate)) {\r\n return dateValue.isSameOrAfter(commissioningDate);\r\n }\r\n return true;\r\n }\r\n\r\n function fitSchemeClosureValidation(dateValue, commissioningDate, scope) {\r\n var fitClosureDate = constants.fitConstants.fitClosureDate;\r\n var capacityCapStartDate = constants.fitConstants.capacityCapStartDate;\r\n var yearAfterFITClosureDate = constants.fitConstants.yearAfterFITClosureDate;\r\n var communityId = constantUtils.findConstantValue(constants.communityTypes, 'CommunityEnergy');\r\n\r\n if (scope.model.communityType === communityId &&\r\n moment(dateValue).isBefore(fitClosureDate) &&\r\n commissioningDate.isSameOrAfter(capacityCapStartDate) &&\r\n moment(commissioningDate).isBefore(yearAfterFITClosureDate)) {\r\n //in this case : Pre-registration date can be > = < Commissioning date\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function validForSchoolInstallation(viewValue, modelValue, scope) {\r\n var dateValue = moment(modelValue || viewValue);\r\n var commissioningDate = moment(formUtils.getPropertyFromModelOrFormState(scope, 'commissioningDate'));\r\n\r\n if (scope.model.communityType === schoolId) { \r\n return dateValue.isSameOrAfter(commissioningDate);\r\n }\r\n return true;\r\n }\r\n\r\n function isValidCommunityReference(viewValue, modelValue, scope) {\r\n var communityRef = modelValue || viewValue;\r\n\r\n if (scope.model.communityType !== schoolId) {\r\n return /^C[0-9]{6}$/.test(communityRef);\r\n }\r\n return true;\r\n }\r\n\r\n function isValidSchoolReference(viewValue, modelValue, scope) {\r\n var communityRef = modelValue || viewValue;\r\n\r\n if (scope.model.communityType === schoolId) {\r\n return /^S[0-9]{6}$/.test(communityRef);\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n function getInstallationEfficiencyFields() {\r\n var scotlandId = constantUtils.findConstantValue(constants.epcCountries, 'Scotland');\r\n var notApplicableId = constantUtils.findConstantValue(constants.epcTypes, 'NotApplicable');\r\n\r\n return [\r\n {\r\n key: 'epcCountry',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please enter the country/region for this installation\\'s Energy Performance Certificate (EPC):',\r\n required: true,\r\n options: constants.epcCountries\r\n }\r\n },\r\n {\r\n key: 'epcType',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please select the type of EPC Certificate you will be using:',\r\n required: true,\r\n options: _.filter(constants.epcTypes, function (type) {\r\n return type.value != notApplicableId;\r\n })\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return scope.model.epcCountry !== scotlandId;\r\n }\r\n }\r\n ];\r\n }\r\n\r\n function getAddressSourceOptions(hasNominatedRecipient, hasExistingAddress) {\r\n return _.filter(constants.addressSources, function (source) {\r\n return (source.code !== 'FromRecipient' || hasNominatedRecipient)\r\n && (source.code !== 'CurrentAddress' || hasExistingAddress);\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .factory('installationMetersService', installationMetersService);\r\n\r\n function installationMetersService(constantUtils, constants, formUtils) {\r\n var mpanLength = 13;\r\n var symbolErrorMessage = '\"Meter serial numbers must not contain symbols. Please check and try again. If this is'\r\n + ' the correct meter serial number, please contact FITRegister@ofgem.gov.uk.\"';\r\n var mpanEnteredInSerialNumberFieldErrorMessage = '\"This field must be not used to record an MPAN. Please check and try again. '\r\n + 'If this is the correct meter serial number, please contact FITRegister@ofgem.gov.uk.\"';\r\n var mpanWrongLengthErrorMessage = '\"MPANs must be ' + mpanLength + ' digits long.\"';\r\n var mpanDigitsOnlyErrorMessage = '\"MPANs must only contain digits.\"';\r\n var duplicateMpanErrorMessage = 'Duplicate MPANs are not allowed for the same meter type.';\r\n\r\n return {\r\n getMeterFields: getMeterFields\r\n };\r\n\r\n function getMeterFields(allowEmptySupplyMeters, allowEmptyExportMeters, metersModel) {\r\n return [\r\n {\r\n type: 'headingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function (viewValue, modelValue, scope) {\r\n if (installationIsGridConnected(scope)) {\r\n return 'Supply meters(s):';\r\n } else {\r\n return 'Supply meter(s): none (off grid)';\r\n }\r\n }\r\n }\r\n },\r\n {\r\n type: 'repeatSection',\r\n key: 'supplyMeters',\r\n templateOptions: {\r\n btnText: 'Add another supply meter',\r\n atLeastOne: !allowEmptySupplyMeters,\r\n fields: [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-sm-6 col-md-5',\r\n type: 'fitInput',\r\n key: 'mpan',\r\n templateOptions: {\r\n label: 'MPAN',\r\n required: true,\r\n onChange: resetMpanValidityForPage,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the Meter Point Administration Number and must be 13 digits long.'\r\n }\r\n },\r\n validators: {\r\n notDuplicate: {\r\n expression: notDuplicateCheck('supplyMeters', 'mpan'),\r\n message: '\"Duplicate Supply meters are not allowed at an installation capacity level.\"'\r\n },\r\n notDuplicateOfExport: {\r\n expression: notDuplicateCheck('exportMeters', 'mpanOrSerialNumber'),\r\n message: '\"Export MPANs cannot be duplicates of supply MPANs on this installation\"'\r\n },\r\n noSymbolsIfSerialNumber: {\r\n expression: function (viewValue, modelValue, scope) {\r\n return scope.formState.exportMeterType !== 'serialNumber'\r\n || !containsSymbols(viewValue, modelValue);\r\n },\r\n message: symbolErrorMessage\r\n },\r\n onlyDigits: {\r\n expression: containsOnlyDigits,\r\n message: mpanDigitsOnlyErrorMessage\r\n },\r\n isMpanLength: {\r\n expression: isMpanLength,\r\n message: mpanWrongLengthErrorMessage\r\n }\r\n },\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n controller: validateOnCollectionUpdateController('supplyMeters')\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !installationIsGridConnected(scope);\r\n }\r\n },\r\n {\r\n type: 'break'\r\n },\r\n {\r\n type: 'headingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function (viewValue, modelValue, scope) {\r\n if (exportMetersEnabled(scope)) {\r\n return 'Export meters(s):';\r\n } else {\r\n return !installationIsGridConnected(scope)\r\n ? 'Export meter(s): none (off grid)'\r\n : 'Export meter(s): none (no export)';\r\n }\r\n }\r\n }\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-sm-6 col-md-5',\r\n type: 'fitSelect',\r\n key: 'exportMeterType',\r\n templateOptions: {\r\n label: 'Export meter type',\r\n required: allowEmptyExportMeters,\r\n onChange: function (viewValue, modelValue, scope) {\r\n scope.formState.exportMeterType = viewValue;\r\n resetMpanValidityForPage();\r\n },\r\n options: [\r\n {\r\n name: 'Export MPAN',\r\n value: 'mpan'\r\n },\r\n {\r\n name: 'Export meter serial number',\r\n value: 'serialNumber'\r\n }\r\n ]\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !exportMetersEnabled(scope);\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n type: 'repeatSection',\r\n key: 'exportMeters',\r\n templateOptions: {\r\n btnText: 'Add another export meter',\r\n atLeastOne: !allowEmptyExportMeters,\r\n fields: [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-sm-6 col-md-5',\r\n type: 'fitInput',\r\n key: 'mpanOrSerialNumber',\r\n templateOptions: {\r\n required: true,\r\n maxlength: 50,\r\n onChange: function (viewValue, modelValue, scope) {\r\n if (scope.formState.exportMeterType !== 'serialNumber') {\r\n resetMpanValidityForPage();\r\n }\r\n }\r\n },\r\n expressionProperties: {\r\n 'templateOptions.label': function (viewValue, modelValue, scope) {\r\n if (scope.formState.exportMeterType !== 'serialNumber') {\r\n return 'Export MPAN';\r\n }\r\n else {\r\n return 'Export meter serial number';\r\n }\r\n }\r\n },\r\n validators: {\r\n notDuplicate: {\r\n expression: notDuplicateCheck('exportMeters', 'mpanOrSerialNumber'),\r\n message: function (viewValue, modelValue, scope) {\r\n if (scope.formState.exportMeterType !== 'serialNumber') {\r\n return duplicateMpanErrorMessage;\r\n }\r\n else {\r\n return getDuplicateSerialNumberMessage('export');\r\n }\r\n }\r\n },\r\n notDuplicateOfSupply: {\r\n expression: notDuplicateCheck('supplyMeters', 'mpan'),\r\n message: '\"Export MPANs cannot be duplicates of supply MPANs on this installation\"'\r\n },\r\n noSymbolsIfSerialNumber: {\r\n expression: function (viewValue, modelValue, scope) {\r\n return scope.formState.exportMeterType !== 'serialNumber'\r\n || !containsSymbols(viewValue, modelValue);\r\n },\r\n message: symbolErrorMessage\r\n },\r\n onlyDigitsIfMpan: {\r\n expression: function (viewValue, modelValue, scope) {\r\n return scope.formState.exportMeterType === 'serialNumber'\r\n || containsOnlyDigits(viewValue, modelValue);\r\n },\r\n message: mpanDigitsOnlyErrorMessage\r\n },\r\n mpanLengthIfMpan: {\r\n expression: function (viewValue, modelValue, scope) {\r\n return scope.formState.exportMeterType === 'serialNumber' || isMpanLength(viewValue, modelValue);\r\n },\r\n message: mpanWrongLengthErrorMessage\r\n },\r\n // Suppliers entering MPANs into the serial number fields is a big problem, therefore\r\n // we stop them doing this by ensuring they can't enter a 'serial number' with 13\r\n // digits only. In a very rare case that this is a valid serial number they must\r\n // resolve it explicitly with Ofgem.\r\n mpanNotEnteredIfSerialNumber: {\r\n expression: function (viewValue, modelValue, scope) {\r\n return scope.formState.exportMeterType !== 'serialNumber'\r\n || !isMpanLength(viewValue, modelValue)\r\n || !containsOnlyDigits(viewValue, modelValue);\r\n },\r\n message: mpanEnteredInSerialNumberFieldErrorMessage\r\n }\r\n },\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n controller: validateOnCollectionUpdateController('exportMeters')\r\n }\r\n ]\r\n\r\n }\r\n ]\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !exportMetersEnabled(scope) || !exportTypeSelected(scope.model);\r\n }\r\n },\r\n {\r\n type: 'break'\r\n },\r\n {\r\n type: 'headingText',\r\n templateOptions: {\r\n text: 'Generation meter(s):'\r\n }\r\n },\r\n {\r\n type: 'repeatSection',\r\n key: 'generationMeters',\r\n templateOptions: {\r\n btnText: 'Add another generation meter',\r\n atLeastOne: true,\r\n fields: [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-sm-4 col-md-4',\r\n type: 'fitInput',\r\n key: 'serialNumber',\r\n templateOptions: {\r\n label: 'Serial number',\r\n maxlength: 50,\r\n required: true\r\n },\r\n validators: {\r\n notDuplicate: {\r\n expression: notDuplicateCheck('generationMeters', 'serialNumber'),\r\n message: function () {\r\n return getDuplicateSerialNumberMessage('generation');\r\n }\r\n },\r\n noSymbols: {\r\n expression: function (viewValue, modelValue) {\r\n return !containsSymbols(viewValue, modelValue);\r\n },\r\n message: symbolErrorMessage\r\n },\r\n // Suppliers entering MPANs into the serial number fields is a big problem, therefore\r\n // we stop them doing this by ensuring they can't enter a 'serial number' with 13\r\n // digits only. In a very rare case that this is a valid serial number they must\r\n // resolve it explicitly with Ofgem.\r\n notMpan: {\r\n expression: function (viewValue, modelValue) {\r\n return !(isMpanLength(viewValue, modelValue)\r\n && containsOnlyDigits(viewValue, modelValue));\r\n },\r\n message: mpanEnteredInSerialNumberFieldErrorMessage\r\n }\r\n },\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n controller: validateOnCollectionUpdateController('generationMeters')\r\n },\r\n {\r\n className: 'col-sm-4 col-md-3',\r\n type: 'fitInput',\r\n key: 'startMeterReading',\r\n optionsTypes: ['fitNumericValidator'],\r\n templateOptions: {\r\n label: 'Start meter reading',\r\n required: true,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'Please note that installations with an eligibility date on or after 1 July 2013 must have a start meter reading date that is on or after the eligibility date.'\r\n }\r\n }\r\n },\r\n {\r\n className: 'col-sm-4 col-md-3',\r\n type: 'fitDatePicker',\r\n key: 'startMeterReadingDate',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n label: 'Start meter reading date',\r\n required: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n type: 'break'\r\n },\r\n {\r\n type: 'fitInlineError',\r\n expressionProperties: {\r\n 'templateOptions.messages': function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return scope.model.mpanDuplicationState.errorMessages;\r\n }\r\n return undefined;\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return !scope.model.mpanDuplicationState.hasError;\r\n } else {\r\n return true;\r\n }\r\n }\r\n },\r\n {\r\n type: 'fitInlineWarning',\r\n templateOptions: {\r\n required: true\r\n },\r\n expressionProperties: {\r\n 'templateOptions.messages': function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return scope.model.mpanDuplicationState.warningMessages;\r\n }\r\n return undefined;\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return (!scope.model.mpanDuplicationState.hasSupplyWarning\r\n && !scope.model.mpanDuplicationState.hasExportWarning)\r\n || scope.model.mpanDuplicationState.hasError;\r\n }\r\n return true;\r\n }\r\n },\r\n {\r\n type: 'fitInlineWarning',\r\n templateOptions: {\r\n required: true\r\n },\r\n expressionProperties: {\r\n 'templateOptions.messages': function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return scope.model.mpanDuplicationState.informationMessages;\r\n }\r\n return undefined;\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return !scope.model.mpanDuplicationState.hasInformation;\r\n }\r\n return true;\r\n }\r\n },\r\n {\r\n key: 'duplicateMpanReason',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Reason for supply MPAN duplicate:',\r\n required: true\r\n },\r\n expressionProperties: {\r\n 'templateOptions.options': function (viewValue, modelValue, scope) {\r\n return scope.formState.duplicateMpanReasonOptions;\r\n }\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return !scope.model.mpanDuplicationState.showReasons;\r\n }\r\n return true;\r\n }\r\n },\r\n {\r\n key: 'duplicateSupplyMpanComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please enter a comment to explain why this installation can be registered on the same '\r\n + 'supply MPAN as an existing installation. Please note that by continuing with this registration '\r\n + 'you confirm that you have carried out all necessary checks including determining the site for '\r\n + 'this installation.',\r\n required: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return !scope.model.mpanDuplicationState.hasSupplyWarning;\r\n }\r\n return true;\r\n }\r\n },\r\n {\r\n key: 'duplicateExportMpanComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please enter a comment to explain why this installation can be registered on the same '\r\n + 'export MPAN as an existing installation. Please note that by continuing with this registration '\r\n + 'you confirm that you have carried out all necessary checks including determining the site for '\r\n + 'this installation.',\r\n required: true\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n if (scope.model.mpanDuplicationState) {\r\n return !scope.model.mpanDuplicationState.hasExportWarning;\r\n }\r\n return true;\r\n }\r\n }\r\n ];\r\n\r\n function validateOnCollectionUpdateController(property) {\r\n return ['$scope', function (scope) {\r\n scope.$watch(function () {\r\n return angular.isDefined(metersModel)\r\n ? metersModel[property]\r\n : null;\r\n }, function () {\r\n if (scope.fc) {\r\n scope.fc.$validate();\r\n }\r\n }, true);\r\n }];\r\n }\r\n\r\n function containsSymbols(viewValue, modelValue) {\r\n var serialNumber = modelValue || viewValue;\r\n return !/^[a-zA-Z0-9]*$/.test(serialNumber);\r\n }\r\n\r\n function containsOnlyDigits(viewValue, modelValue) {\r\n var mpan = modelValue || viewValue;\r\n return /^[0-9]*$/.test(mpan);\r\n }\r\n\r\n function isMpanLength(viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n if (value) {\r\n return value.length === mpanLength;\r\n }\r\n return false;\r\n }\r\n\r\n function exportTypeSelected(model) {\r\n return model.exportMeterType === 'mpan' || model.exportMeterType === 'serialNumber';\r\n }\r\n\r\n function notDuplicateCheck(key, attribute) {\r\n return function (viewValue, modelValue, scope) {\r\n var currentMeter = scope.model;\r\n if (angular.isUndefined(metersModel)) {\r\n return true;\r\n }\r\n var updatedValue = modelValue || viewValue;\r\n var arrayOfOtherMeters = getOtherMeters(metersModel[key], scope.model);\r\n if (_.filter(arrayOfOtherMeters, matchesValue).length >= 1) {\r\n scope.options.validation.show = true;\r\n return false;\r\n }\r\n return true;\r\n\r\n function matchesValue(meter) {\r\n if (angular.isDefined(meter.capacityId)) {\r\n if (meter.capacityId === currentMeter.capacityId) {\r\n return meter[attribute] === updatedValue;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n return meter[attribute] === updatedValue;\r\n }\r\n\r\n function getOtherMeters(meters, meter) {\r\n var metersCopy = angular.copy(meters);\r\n var index = meters.indexOf(meter);\r\n if (index >= 0) {\r\n metersCopy.splice(index, 1);\r\n }\r\n return metersCopy;\r\n }\r\n };\r\n }\r\n\r\n function exportMetersEnabled(scope) {\r\n var exportStatus = formUtils.getPropertyFromModelOrFormState(scope, 'exportStatus');\r\n return installationIsGridConnected(scope) &&\r\n (exportStatus === constantUtils.findConstantValue(constants.exportStatuses, 'ExportStandard')\r\n || exportStatus === constantUtils.findConstantValue(constants.exportStatuses, 'ExportNegotiated'));\r\n }\r\n\r\n function installationIsGridConnected(scope) {\r\n return formUtils.getPropertyFromModelOrFormState(scope, 'gridConnected') === true;\r\n }\r\n\r\n function resetMpanValidityForPage() {\r\n metersModel.mpanDuplicationState = undefined;\r\n }\r\n\r\n function getDuplicateSerialNumberMessage(type) {\r\n return 'Duplicate ' + type + ' meters are not allowed at an installation capacity level.';\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .factory('installationConversationService', installationConversationService);\r\n\r\n function installationConversationService($uibModal) {\r\n var service = {\r\n showConversationDialog: showConversationDialog\r\n };\r\n return service;\r\n \r\n function showConversationDialog(isInternal, amendmentId, installationId, buttonOptions, taskType, capacityId) {\r\n\r\n // This is a new installation if the task type is explicitly set OR there is no explicit type and the amendmentId is provided.\r\n var isPendingInstallation = (taskType === 'NewInstallation' || (!taskType && amendmentId));\r\n var cacheId = isPendingInstallation ? ('NEW-' + amendmentId) : ('UPDATE-' + installationId);\r\n\r\n function goToAmendment($state) {\r\n switch (taskType) {\r\n case 'NewInstallation':\r\n $state.go('approve-installation', { installationAmendmentId: amendmentId });\r\n break;\r\n case 'NewExtension':\r\n $state.go('installations-search#installation-details#viewExtension',\r\n { installationId: installationId });\r\n break;\r\n case 'InstallationEdit':\r\n $state.go('installations-search#installation-details#viewEdit',\r\n { installationId: installationId });\r\n break;\r\n case 'CapacityStatusChange':\r\n $state.go('installations-search#installation-details#viewStatusChange',\r\n { installationId: installationId, capacityId: capacityId });\r\n break;\r\n case 'ReassignGenerator':\r\n case 'ReassignNominatedRecipient':\r\n $state.go('installations-search#installation-details#viewRecipientReassignment',\r\n { installationId: installationId });\r\n break;\r\n default:\r\n throw new Error('Unknown task type ' + taskType + ' for conversation dialog.');\r\n }\r\n }\r\n\r\n return $uibModal.open({\r\n controller: 'ConversationDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/conversationDialog/conversation-dialog.html',\r\n size: 'lg',\r\n resolve: {\r\n info: function () {\r\n return {\r\n isInternal: isInternal,\r\n apiPath: isPendingInstallation\r\n ? ('installationAmendment/pending/' + amendmentId)\r\n : ('installationAmendment/installation/' + installationId),\r\n cacheId: cacheId,\r\n textBoxLabel: 'Please use the box below to enter response or raise a query for the '\r\n + (isInternal ? 'internal reviewer.' : 'CFR Team.')\r\n };\r\n },\r\n buttonOptions: function() {\r\n return {\r\n showNavigationButton: buttonOptions.showNavigationButton,\r\n buttonText: buttonOptions.buttonText,\r\n goToDetailsPage: goToAmendment\r\n };\r\n }\r\n }\r\n }).result;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsDatesEditController', InstallationsDatesEditController);\r\n\r\n\r\n function InstallationsDatesEditController(formUtils, $stateParams, $state, $log, dataService, toastr, moment) {\r\n var vm = this;\r\n\r\n vm.formFields = formFields();\r\n vm.loadInstallation = loadInstallation;\r\n vm.updateInstallation = updateInstallation;\r\n vm.cancelForm = returnToParentState;\r\n\r\n vm.dateAfterConfirmationDate = dateAfterConfirmationDate;\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Update',\r\n cancel: 'Cancel'\r\n }\r\n };\r\n\r\n function loadInstallation() {\r\n return dataService.fetchDataFromEndpoint('installation/' + $stateParams.id + '/' + $stateParams.dateElement.endpoint).then(setInstallation);\r\n }\r\n\r\n function setInstallation(data) {\r\n if (data.confirmationDate === null) {\r\n $state.go('landing');\r\n } else {\r\n vm.confirmationDate = data.confirmationDate;\r\n vm.isReadOnly = data.isReadOnly;\r\n vm.hasPendingAmendment = data.hasPendingAmendment;\r\n vm.isUnassigned = data.statusCodeName === 'Unallocated';\r\n data[$stateParams.dateElement.key] = formUtils.convertToDate(data[$stateParams.dateElement.key]);\r\n return data;\r\n }\r\n }\r\n\r\n function returnToParentState() {\r\n $state.go('^');\r\n }\r\n function successReturnToParentState() {\r\n toastr.success('Installation dates updated successfully', 'Success');\r\n $state.go('^');\r\n }\r\n\r\n function updateInstallation(installationDateModel) {\r\n var endpoint = 'installation/' + $stateParams.id + '/' + $stateParams.dateElement.endpoint;\r\n dataService.patchToEndpoint(endpoint, installationDateModel)\r\n .then(successReturnToParentState)\r\n .catch(function (response) {\r\n $log.warn('Installation dates update failed:', response);\r\n toastr.error('Installation dates update unsuccessful', 'Failed');\r\n });\r\n }\r\n\r\n function formFields() {\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-12',\r\n key: 'fitId',\r\n type: 'fitStatic',\r\n templateOptions: {\r\n label: 'FIT ID'\r\n }\r\n },\r\n {\r\n className: 'col-md-12',\r\n key: 'accreditationNumber',\r\n type: 'fitStatic',\r\n templateOptions: {\r\n label: 'Accreditation number'\r\n }\r\n },\r\n {\r\n className: 'col-md-12',\r\n key: 'confirmationDate',\r\n type: 'fitStaticDate',\r\n templateOptions: {\r\n label: 'Confirmation date'\r\n }\r\n },\r\n {\r\n className: 'col-md-4',\r\n key: $stateParams.dateElement.key,\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n label: $stateParams.dateElement.label\r\n },\r\n validators: {\r\n afterConfirmationDate: {\r\n expression: dateAfterConfirmationDate,\r\n message: '\"The ' + $stateParams.dateElement.label\r\n + ' must not be before the installation\\'s confirmation date.\"'\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n return fields;\r\n }\r\n\r\n function dateAfterConfirmationDate(viewValue, modelValue) {\r\n var value = modelValue || viewValue;\r\n\r\n if(angular.isUndefined(value) || value === null || value === '') {\r\n return ($stateParams.dateElement.required === false);\r\n }\r\n\r\n if(!vm.confirmationDate) {\r\n return true;\r\n }\r\n\r\n return moment(value)\r\n .add(1, 'h')\r\n .isSameOrAfter(vm.confirmationDate, 'day');\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsDatesFindController', InstallationsDatesFindController);\r\n\r\n function InstallationsDatesFindController(paginatedDataService, $state, $scope) {\r\n var vm = this;\r\n \r\n vm.model = {};\r\n vm.showTable = false;\r\n vm.formFields = formFields();\r\n\r\n vm.fetchData = function(tableData) {\r\n return paginatedDataService\r\n .fetchDataFromTableData('installation', tableData, { fitId: vm.model.fitId });\r\n };\r\n\r\n function goToEdit(data) {\r\n $state.go($state.current.name + '#edit', { id: data.installationId });\r\n }\r\n\r\n function search() {\r\n vm.showTable = true;\r\n $scope.$broadcast('fit-table:searchChange', true);\r\n }\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'fitId',\r\n label: 'FIT ID',\r\n sort: true\r\n },\r\n {\r\n id: 'addressLine1',\r\n label: 'Address line 1',\r\n sort: true\r\n },\r\n {\r\n id: 'postcode',\r\n label: 'Postcode',\r\n sort: true\r\n },\r\n {\r\n id: 'technologyType',\r\n label: 'Technology type',\r\n sort: true\r\n },\r\n {\r\n id: 'accreditationNumber',\r\n label: 'Accreditation number',\r\n sort: true\r\n },\r\n {\r\n id: 'confirmationDate',\r\n label: 'Confirmation Date',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n sort: false,\r\n type: 'conditional',\r\n condition: shouldShowUpdateButton,\r\n states:\r\n {\r\n true: {\r\n id: 'updateDate',\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Update',\r\n onClick: goToEdit\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n }\r\n ];\r\n\r\n function shouldShowUpdateButton(installation) {\r\n return installation.confirmationDate !== null;\r\n }\r\n\r\n function formFields() {\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-3',\r\n key: 'fitId',\r\n type: 'fitInput',\r\n optionsTypes: ['fitPrefixValidator'],\r\n templateOptions: {\r\n label: 'FIT ID',\r\n maxlength: 30,\r\n prefix: 'FIT'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search',\r\n btnType: 'secondary',\r\n onClick: search\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function () { return !vm.model.fitId; }\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n\r\n return fields;\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationEditStatusController', InstallationEditStatusController);\r\n\r\n function InstallationEditStatusController($state, $stateParams, toastr, constants, dataService, objectUtils) {\r\n var vm = this;\r\n\r\n vm.fields = getFields();\r\n vm.cancel = returnToParent;\r\n vm.loadModel = loadModel;\r\n vm.save = save;\r\n\r\n function loadModel() {\r\n return dataService.fetchDataFromEndpoint('installation/' + $stateParams.installationId)\r\n .then(setupModel);\r\n }\r\n\r\n function notifySuccess() {\r\n toastr.success('The installation statuses have been updated.', 'Status edit successful');\r\n returnToParent();\r\n }\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n\r\n function setupModel(installation) {\r\n vm.fitId = installation.fitId;\r\n return installation;\r\n }\r\n\r\n function save(model) {\r\n var submissionModel = objectUtils.copy(model, ['__version', 'paymentStatus', 'statusCode']);\r\n submissionModel.installationCapacities = (model.installationCapacities || []).map(function (capacity) {\r\n return objectUtils.copy(capacity, ['__version', 'id', 'capacityStatus']);\r\n });\r\n var endpoint = 'installation/' + $stateParams.installationId + '/status';\r\n return dataService.patchToEndpoint(endpoint, submissionModel).then(notifySuccess);\r\n }\r\n\r\n function getFields() {\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n type: 'repeatSection',\r\n className: 'col-xs-12',\r\n key: 'installationCapacities',\r\n templateOptions: {\r\n hideAddBtn: true,\r\n hideRemoveBtn: true,\r\n fields: [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-xs-6 col-sm-4 col-md-3',\r\n type: 'fitStatic',\r\n key: 'extensionReference',\r\n templateOptions: {\r\n label: 'Extension reference'\r\n }\r\n },\r\n {\r\n className: 'col-xs-6 col-sm-4 col-md-3',\r\n type: 'fitStatic',\r\n key: 'accreditationNumber',\r\n templateOptions: {\r\n label: 'Accreditation number'\r\n }\r\n },\r\n {\r\n key: 'capacityStatus',\r\n className: 'col-xs-6 col-sm-4 col-md-3',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n label: 'Status',\r\n options: constants.installationCapacityStatuses\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n key: 'statusCode',\r\n className: 'col-sm-6',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n label: 'Installation status',\r\n required: true,\r\n options: constants.installationStatuses\r\n }\r\n },\r\n {\r\n key: 'paymentStatus',\r\n className: 'col-sm-6',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n label: 'Installation payment status',\r\n required: true,\r\n options: constants.installationPaymentStatuses\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n return fields;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationEditController', InstallationEditController);\r\n\r\n function InstallationEditController(installationAccreditationService, installationDetailsService, formUtils,\r\n installationRulesService, constantUtils, constants, installationMetersService,\r\n installationCapacityService, $stateParams, dataService, arrayUtils, $state, toastr,\r\n metersValidationService, multiInstallationService, $q, installationService, moment, installationsTariffService) {\r\n var vm = this;\r\n vm.fields = [];\r\n vm.tariffDetails = [];\r\n vm.loadingTariffs = false;\r\n vm.tariffError = false;\r\n vm.tariffErrorList = '';\r\n\r\n vm.recalculateTariffsDetails = recalculateTariffsDetails;\r\n vm.loadModel = loadModel;\r\n vm.save = save;\r\n vm.cancel = returnToParent;\r\n var deemedExportStatus = constantUtils.findConstantValue(constants.exportStatuses, 'Deemed');\r\n var noExportStatus = constantUtils.findConstantValue(constants.exportStatuses, 'NoExport');\r\n var mcsId = constantUtils.findConstantValue(constants.accreditationTypes, 'MCS');\r\n var roofitId = constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit');\r\n var exportId = constantUtils.findConstantValue(constants.meterTypes, 'Export');\r\n var supplyId = constantUtils.findConstantValue(constants.meterTypes, 'Supply');\r\n var generationId = constantUtils.findConstantValue(constants.meterTypes, 'Generation');\r\n var meetsRequirementsId = constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements');\r\n var scotlandId = constantUtils.findConstantValue(constants.epcCountries, 'Scotland');\r\n\r\n vm.model = {};\r\n vm.originalModel = {};\r\n\r\n vm.fitClosure = {\r\n date: moment(constants.fitConstants.fitClosureDate),\r\n errors: []\r\n };\r\n\r\n vm.fitId = null;\r\n\r\n vm.options = { errorsAtBottom: true };\r\n vm.formState = {};\r\n\r\n vm.tariffLayout = {\r\n numberOfColumns: 2,\r\n rows: [{\r\n items: [\r\n {\r\n label: 'Capacity',\r\n key: 'reference',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Tariff code',\r\n key: 'tariffCode',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Tariff rate (p/kWh)',\r\n key: 'tariffValue',\r\n type: 'tariff'\r\n },\r\n {\r\n label: 'Description',\r\n key: 'tariffDescription',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Eligibility date',\r\n key: 'eligibilityDate',\r\n type: 'date'\r\n },\r\n {\r\n label: 'Eligibility end date',\r\n key: 'eligibilityEndDate',\r\n type: 'date'\r\n }\r\n ]\r\n }]\r\n };\r\n\r\n function loadModel() {\r\n return dataService.fetchDataFromEndpoint('installation/' + $stateParams.installationId)\r\n .then(setupModelAndFields);\r\n }\r\n\r\n function setupModelAndFields(model) {\r\n vm.fitId = model.fitId;\r\n model.addressSource = constantUtils.findConstantValue(constants.addressSources, 'CurrentAddress');\r\n model.preRegistrationDate = formUtils.convertToDate(model.preRegistrationDate);\r\n model.applicationDate = formUtils.convertToDate(model.applicationDate);\r\n\r\n angular.forEach(model.installationCapacities, mapCapacity);\r\n\r\n var meters = _.flatMap(model.installationCapacities, function (capacity) {\r\n return capacity.meters.map(function (meter) {\r\n return mapMeter(meter, capacity.id);\r\n });\r\n });\r\n\r\n model.supplyMeters = meters.filter(isSupplyMeter);\r\n\r\n model.generationMeters = meters.filter(isGenerationMeter);\r\n model.exportMeters = meters.filter(isExportMeter);\r\n\r\n model.previousInstallations = angular.isDefined(model.existingInstalledCapacity)\r\n && parseFloat(model.existingInstalledCapacity) > 0;\r\n\r\n var exportMeterType = model.exportMeters.length > 0\r\n ? (model.exportMeters[0].serialNumber != null ? 'serialNumber' : 'mpan')\r\n : null;\r\n model.exportMeterType = exportMeterType;\r\n\r\n var supplyMeters = angular.copy(model.supplyMeters);\r\n angular.forEach(supplyMeters, function (meter) {\r\n if (meter.duplicateMpanComment && angular.isUndefined(model.duplicateSupplyMpanComment)) {\r\n model.duplicateSupplyMpanComment = meter.duplicateMpanComment;\r\n model.duplicateMpanReason = meter.duplicateMpanReason;\r\n }\r\n });\r\n\r\n var exportMeters = angular.copy(model.exportMeters);\r\n angular.forEach(exportMeters, function (meter) {\r\n if (meter.duplicateMpanComment && angular.isUndefined(model.duplicateExportMpanComment)) {\r\n model.duplicateExportMpanComment = meter.duplicateMpanComment;\r\n }\r\n });\r\n\r\n vm.model = model;\r\n vm.originalModel = angular.copy(model);\r\n\r\n vm.formState.epcCountry = model.epcCountry;\r\n vm.formState.epcType = model.epcType;\r\n vm.formState.exportMeterType = exportMeterType;\r\n vm.formState.applicationDate = model.applicationDate;\r\n vm.formState.technologyType = model.technologyType;\r\n vm.formState.communityType = model.communityType;\r\n vm.formState.recipientType = model.nominatedRecipient != null\r\n ? 'nominatedRecipient'\r\n : 'generator';\r\n vm.formState.foundMatch = false;\r\n\r\n updateInstalledCapacity();\r\n updateCommissioningDate();\r\n updateTotalInstalledCapacity();\r\n\r\n if (vm.formState.technologyType === constantUtils.findConstantValue(constants.technologyTypes, 'Hydro')) {\r\n vm.formState.duplicateMpanReasonOptions = constants.hydroDuplicateMpanReasons;\r\n } else {\r\n vm.formState.duplicateMpanReasonOptions = constants.nonHydroDuplicateMpanReasons;\r\n }\r\n\r\n if (model.generator.address.postcode === null || model.generator.address.postcode === '') {\r\n vm.formState.generatorInstallationCount = 0;\r\n setupFields(model);\r\n return model;\r\n }\r\n else {\r\n var setupRecipientStatePromise = vm.formState.recipientType === 'nominatedRecipient'\r\n ? $q.all([\r\n multiInstallationService.setGeneratorInstallationCount(model.generator.address, vm.formState),\r\n multiInstallationService.setNominatedRecipientInstallationCount(model.nominatedRecipient.address, vm.formState)\r\n ])\r\n : multiInstallationService.setGeneratorInstallationCount(model.generator.address, vm.formState);\r\n\r\n return setupRecipientStatePromise.then(function () {\r\n setupFields(model);\r\n return model;\r\n });\r\n }\r\n }\r\n\r\n function mapCapacity(capacity) {\r\n capacity.commissioningDate = formUtils.convertToDate(capacity.commissioningDate);\r\n capacity.epcCertificateDate = formUtils.convertToDate(capacity.epcCertificateDate);\r\n capacity.mcsIssueDate = formUtils.convertToDate(capacity.mcsIssueDate);\r\n capacity.eligibilityDateOverride = formUtils.convertToDate(capacity.eligibilityDateOverride);\r\n\r\n if (capacity.accreditationType === mcsId) {\r\n capacity.mcsAccreditationNumber = capacity.accreditationNumber;\r\n }\r\n else if (capacity.accreditationType === roofitId) {\r\n capacity.rooFitAccreditationNumber = capacity.accreditationNumber;\r\n if (!capacity.eligibilityDateOverride) {\r\n capacity.eligibilityDateOverride = formUtils.convertToDate(capacity.eligibilityDate);\r\n }\r\n }\r\n else {\r\n capacity.roAccreditationNumber = capacity.accreditationNumber;\r\n }\r\n }\r\n\r\n function mapMeter(meter, capacityId) {\r\n meter.mpanOrSerialNumber = meter.serialNumber || meter.mpan;\r\n meter.startMeterReadingDate = formUtils.convertToDate(meter.startMeterReadingDate);\r\n meter.capacityId = capacityId;\r\n return meter;\r\n }\r\n\r\n function isExportMeter(meter) {\r\n return meter.type === exportId;\r\n }\r\n\r\n function isGenerationMeter(meter) {\r\n return meter.type === generationId;\r\n }\r\n\r\n function isSupplyMeter(meter) {\r\n return meter.type === supplyId;\r\n }\r\n\r\n function setupFields(model) {\r\n var fields = [\r\n getInstallationDetailsFieldGroup(),\r\n getCommunityFieldGroup(),\r\n getMultiSiteFieldGroup(),\r\n getCapacityRepeater(),\r\n getEfficiencyFieldGroup(),\r\n getMetersFieldGroup(model),\r\n getApprovalMessageFieldGroup()\r\n ];\r\n\r\n setDisplayValidationImmediately(fields);\r\n if ($stateParams.unvalidated) {\r\n stripValidators(fields);\r\n fields.push(getTariffOverrideRepeater());\r\n }\r\n\r\n vm.fields = fields;\r\n }\r\n\r\n function setDisplayValidationImmediately(fields) {\r\n angular.forEach(fields, applyFunctionRecursively(setDisplayValidationImmediatelyForField));\r\n }\r\n\r\n function stripValidators(fields) {\r\n angular.forEach(fields, applyFunctionRecursively(stripValidatorsFromField));\r\n }\r\n\r\n function applyFunctionRecursively(func) {\r\n var recursiveFunc = function (field) {\r\n func(field);\r\n\r\n if (field.fieldGroup) {\r\n angular.forEach(field.fieldGroup, recursiveFunc);\r\n }\r\n\r\n if (field.templateOptions && field.templateOptions.fields) {\r\n angular.forEach(field.templateOptions.fields, recursiveFunc);\r\n }\r\n };\r\n return recursiveFunc;\r\n }\r\n\r\n function setDisplayValidationImmediatelyForField(field) {\r\n if (field.templateOptions) {\r\n field.templateOptions.displayValidationImmediately = true;\r\n }\r\n }\r\n\r\n function stripValidatorsFromField(field) {\r\n if (field.validators) {\r\n field.validators = {};\r\n }\r\n\r\n if (field.optionsTypes) {\r\n field.optionsTypes = _.without(field.optionsTypes, 'fitDateNotInFutureValidator', 'fitRegexValidator');\r\n }\r\n\r\n if (field.templateOptions && field.templateOptions.pattern) {\r\n delete field.templateOptions.pattern;\r\n }\r\n }\r\n\r\n function getInstallationDetailsFieldGroup() {\r\n var installationHeaderField = [{\r\n type: 'headingText',\r\n templateOptions: {\r\n text: 'Installation details'\r\n }\r\n }];\r\n var detailsFields = installationHeaderField\r\n .concat(installationDetailsService.getAlDetailsFields(vm.model.supplierId, !!vm.model.nominatedRecipient, true));\r\n var technologyTypeField = arrayUtils.findByProp(detailsFields, 'key', 'technologyType');\r\n technologyTypeField.templateOptions.onChange = function (viewValue, modelVale, scope) {\r\n scope.formState.technologyType = viewValue;\r\n };\r\n var applicationDateField = arrayUtils.findByProp(detailsFields, 'key', 'applicationDate');\r\n applicationDateField.templateOptions.onChange = function (viewValue, modelVale, scope) {\r\n scope.formState.applicationDate = viewValue;\r\n };\r\n\r\n var flattenedDetailsFields = _.flatMap(detailsFields,\r\n function (entry) {\r\n return entry.fieldGroup || entry;\r\n });\r\n var existingCapacityField = arrayUtils.findByProp(flattenedDetailsFields, 'key', 'existingInstalledCapacity');\r\n existingCapacityField.templateOptions.onChange = updateTotalInstalledCapacity;\r\n\r\n return {\r\n fieldGroup: [{\r\n wrapper: 'accordionSection',\r\n className: 'row',\r\n templateOptions: {\r\n heading: 'Installation details'\r\n },\r\n fieldGroup: detailsFields\r\n }]\r\n };\r\n }\r\n\r\n function getCommunityFieldGroup() {\r\n var communityFields = installationDetailsService.getCommunityFields();\r\n\r\n var communityTypeField = arrayUtils.findByProp(communityFields, 'key', 'communityType');\r\n\r\n communityTypeField.templateOptions.onChange = function (viewValue, modelVale, scope) {\r\n scope.formState.communityType = viewValue;\r\n };\r\n\r\n return {\r\n fieldGroup: [{\r\n wrapper: 'accordionSection',\r\n templateOptions: {\r\n heading: 'Community/school details'\r\n },\r\n className: 'row',\r\n fieldGroup: communityFields,\r\n hideExpression: function (viewVale, modelValue, scope) {\r\n return scope.model.installationCapacities.length !== 1\r\n || !installationRulesService.shouldCommunityQuestions(\r\n scope.model.applicationDate,\r\n scope.options.formState.commissioningDate,\r\n scope.model.installationCapacities[0].installedCapacity,\r\n scope.model.technologyType,\r\n scope.model.installationCapacities[0].installTypeId);\r\n }\r\n }]\r\n };\r\n }\r\n\r\n function getMultiSiteFieldGroup() {\r\n var multiSiteFields = multiInstallationService.getMultiSiteFields(vm.model, vm.formState, true, true);\r\n\r\n return {\r\n fieldGroup: [{\r\n wrapper: 'accordionSection',\r\n templateOptions: {\r\n heading: 'Multi-site details'\r\n },\r\n className: 'row',\r\n fieldGroup: multiSiteFields,\r\n hideExpression: function (viewVale, modelValue, scope) {\r\n var installTypes = _.map(scope.model.installationCapacities, function (capacity) {\r\n return capacity.installTypeId;\r\n });\r\n var commissioningDates = _.map(scope.model.installationCapacities, function (capacity) {\r\n return capacity.commissioningDate;\r\n });\r\n var earliestCommissioningDate = _.min(commissioningDates);\r\n\r\n return !installationRulesService.shouldShowMultiSiteQuestions(\r\n scope.options.formState.totalInstalledCapacity,\r\n scope.options.formState.technologyType,\r\n installTypes,\r\n scope.options.formState.applicationDate,\r\n earliestCommissioningDate\r\n );\r\n }\r\n }]\r\n };\r\n }\r\n\r\n function getCapacityRepeater() {\r\n var basicsFields = installationCapacityService.getCapacityBasicsFields();\r\n var eligibilityOverrideField = installationCapacityService.getCapacityEligibilityDateOverrideFields();\r\n var installedCapacityField = arrayUtils.findByProp(basicsFields, 'key', 'installedCapacity');\r\n installedCapacityField.templateOptions.onChange = updateTotalInstalledCapacityAndInstalledCapacity;\r\n\r\n var dateFields = installationCapacityService.getCapacityDateFields();\r\n var commissioningDateField = arrayUtils.findByProp(dateFields, 'key', 'commissioningDate');\r\n commissioningDateField.templateOptions.onChange = updateCommissioningDate;\r\n\r\n var capacityHeaderField = {\r\n type: 'headingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function (viewValue, modelValue, scope) {\r\n return 'Capacity: ' + scope.model.extensionReference;\r\n }\r\n }\r\n };\r\n\r\n var capacityInstallTypeFields = [{\r\n key: 'installTypeId',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please choose the specific photovoltaic installation type:',\r\n required: true,\r\n options: constants.photovoltaicInstallTypes\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !installationRulesService.requiresInstallType(scope.options.formState.technologyType);\r\n }\r\n }];\r\n\r\n var mcsIssueDateFields = installationCapacityService.getMcsIssueDateFields();\r\n\r\n var capacityBasicsFieldGroup = {\r\n className: 'row',\r\n fieldGroup: installationAccreditationService.getAccreditationFields(false)\r\n .concat(basicsFields)\r\n .concat(dateFields)\r\n .concat(eligibilityOverrideField)\r\n .concat(capacityInstallTypeFields)\r\n .concat(mcsIssueDateFields)\r\n };\r\n\r\n var capacityEfficiencyFieldGroup = {\r\n className: 'row',\r\n fieldGroup: installationCapacityService.getCapacityEfficiencyFields()\r\n .concat(installationCapacityService.getCapacityEfficiencyCertificateFields()),\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !shouldShowEfficiencyQuestions(scope.model, scope.options.formState);\r\n }\r\n };\r\n\r\n return {\r\n wrapper: 'accordionSection',\r\n templateOptions: {\r\n heading: 'Installation capacity level details'\r\n },\r\n fieldGroup: [{\r\n type: 'repeatSection',\r\n key: 'installationCapacities',\r\n templateOptions: {\r\n hideAddBtn: true,\r\n hideRemoveBtn: true,\r\n fields: [capacityHeaderField, capacityBasicsFieldGroup, capacityEfficiencyFieldGroup]\r\n }\r\n }]\r\n };\r\n }\r\n\r\n function getEfficiencyFieldGroup() {\r\n var efficiencyHeaderFields = [{\r\n type: 'headingText',\r\n templateOptions: {\r\n text: 'EPC details'\r\n }\r\n }];\r\n var efficiencyFields = installationDetailsService.getInstallationEfficiencyFields();\r\n var countryMismatchFields = [\r\n {\r\n type: 'fitInlineWarning',\r\n templateOptions: {\r\n messages: ['The installation is registered in a different country to the one selected. Please check that you have selected the correct country.']\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function () {\r\n return !vm.model.epcCountryMismatch;\r\n }\r\n },\r\n {\r\n key: 'epcCountryMismatchComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please enter a comment explaining why the EPC country does not match the installation address.',\r\n required: true\r\n },\r\n hideExpression: function () {\r\n return !vm.model.epcCountryMismatch;\r\n }\r\n }\r\n ];\r\n return {\r\n fieldGroup: [{\r\n wrapper: 'accordionSection',\r\n className: 'row',\r\n templateOptions: {\r\n heading: 'EER details'\r\n },\r\n fieldGroup: efficiencyHeaderFields.concat(efficiencyFields).concat(countryMismatchFields),\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !shouldShowOverallEfficiencyQuestions(scope.model, scope.options.formState);\r\n }\r\n }]\r\n };\r\n }\r\n\r\n function validateCountry() {\r\n if (vm.model.epcCountryMismatch || vm.model.epcCountryMismatchComment) {\r\n // If we have already warned the user of a possible mismatch, we do not need to re-check this.\r\n return $q.resolve();\r\n }\r\n\r\n var hasRelevantCapacity = false;\r\n angular.forEach(vm.model.installationCapacities, function (capacity) {\r\n if (capacity.eerType === constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements')) {\r\n hasRelevantCapacity = true;\r\n }\r\n });\r\n\r\n var selectedCountry = vm.model.epcCountry;\r\n if (hasRelevantCapacity && selectedCountry) {\r\n var addressModel = getAddressModelForMpanCheck();\r\n if (addressModel && addressModel.addressObject && addressModel.addressObject.postcode) {\r\n return getEpcCountryFromPostcode(addressModel.addressObject.postcode)\r\n .then(function (epcCountry) {\r\n if (epcCountry) {\r\n if ((epcCountry === scotlandId && selectedCountry !== scotlandId)\r\n || (epcCountry !== scotlandId && selectedCountry === scotlandId)) {\r\n vm.model.epcCountryMismatch = true;\r\n return $q.reject({ handled: true });\r\n }\r\n }\r\n return $q.resolve();\r\n });\r\n }\r\n }\r\n return $q.resolve();\r\n }\r\n\r\n function getEpcCountryFromPostcode(postcode) {\r\n return dataService.fetchDataFromEndpointWithParams('addresses/epcCountry', {\r\n postcode: postcode\r\n });\r\n }\r\n\r\n function getMetersFieldGroup(model) {\r\n var capacityField = {\r\n className: 'col-md-2 col-sm-4',\r\n key: 'capacityId',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n label: 'Capacity',\r\n required: true,\r\n options: getCapacityDropdownOptions(model)\r\n }\r\n };\r\n\r\n var metersFields = installationMetersService.getMeterFields(false, false, model);\r\n var generationFields = getMeterTypeFields(metersFields, 'generationMeters');\r\n var supplyFields = getMeterTypeFields(metersFields, 'supplyMeters');\r\n var exportFields = getMeterTypeFields(metersFields, 'exportMeters');\r\n\r\n generationFields.push(angular.copy(capacityField));\r\n supplyFields.push(angular.copy(capacityField));\r\n exportFields.push(angular.copy(capacityField));\r\n\r\n return {\r\n fieldGroup: [{\r\n wrapper: 'accordionSection',\r\n templateOptions: {\r\n heading: 'Meter details'\r\n },\r\n className: 'row',\r\n fieldGroup: metersFields\r\n }]\r\n };\r\n\r\n function getMeterTypeFields(fields, fieldGroup) {\r\n return arrayUtils.findByProp(fields, 'key', fieldGroup)\r\n .templateOptions\r\n .fields[0]\r\n .fieldGroup;\r\n }\r\n\r\n function getCapacityDropdownOptions(model) {\r\n return _.map(model.installationCapacities, function (capacity) {\r\n return {\r\n name: capacity.extensionReference,\r\n value: capacity.id\r\n };\r\n });\r\n }\r\n }\r\n\r\n function getTariffOverrideRepeater() {\r\n\r\n var overrideFields = [{\r\n type: 'headingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function (viewValue, modelValue, scope) {\r\n return 'Tariff override for capacity: ' + scope.model.extensionReference;\r\n }\r\n }\r\n }, {\r\n key: 'overrideTariffCode',\r\n type: 'fitTypeahead',\r\n templateOptions: {\r\n label: 'Tariff code (please enter at least 3 characters)',\r\n maxLength: 30,\r\n endpoint: 'tariffs/codes'\r\n }\r\n }, {\r\n key: 'overrideEligibilityDate',\r\n templateOptions: {\r\n label: 'Eligibility date'\r\n },\r\n type: 'fitDatePicker'\r\n }, {\r\n key: 'overrideEligibilityEndDate',\r\n templateOptions: {\r\n label: 'Eligibility end date'\r\n },\r\n type: 'fitDatePicker'\r\n }];\r\n\r\n return {\r\n fieldGroup: [{\r\n wrapper: 'accordionSection',\r\n type: 'repeatSection',\r\n key: 'installationCapacities',\r\n templateOptions: {\r\n heading: 'Tariff override',\r\n hideAddBtn: true,\r\n hideRemoveBtn: true,\r\n fields: overrideFields\r\n }\r\n }]\r\n };\r\n }\r\n\r\n function getApprovalMessageFieldGroup() {\r\n return {\r\n fieldGroup: [\r\n {\r\n key: 'approvalMessage',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please enter an explanation for the amendment to this installation in the box below.',\r\n maxlength: 4000,\r\n rows: 6,\r\n onChange: function (viewValue, modelValue, scope) {\r\n scope.model.approvalInfo.messageMissing = false;\r\n }\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !scope.model.approvalInfo || !scope.model.approvalInfo.needsApproval;\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n\r\n function shouldShowOverallEfficiencyQuestions(model, formState) {\r\n return _.some(model.installationCapacities, function (capacity) {\r\n return shouldShowEfficiencyQuestions(capacity, formState)\r\n && capacity.eerType === meetsRequirementsId;\r\n });\r\n }\r\n\r\n function shouldShowEfficiencyQuestions(capacity, formState) {\r\n var cumulativeInstalledCapacity = cumulativeInstalledCapacityForReference(capacity.extensionReferenceNumber);\r\n\r\n return installationRulesService.shouldShowEfficiencyQuestions(\r\n cumulativeInstalledCapacity,\r\n formState.technologyType,\r\n formState.applicationDate,\r\n capacity.commissioningDate,\r\n capacity.installTypeId);\r\n }\r\n\r\n function updateTotalInstalledCapacityAndInstalledCapacity() {\r\n updateTotalInstalledCapacity();\r\n updateInstalledCapacity();\r\n }\r\n\r\n function updateInstalledCapacity() {\r\n // This is used for the community or schools section, which is only editable when there are no extensions.\r\n if (vm.model.installationCapacities.length == 1) {\r\n vm.formState.installedCapacity = vm.model.installationCapacities[0].installedCapacity;\r\n }\r\n }\r\n\r\n function updateCommissioningDate() {\r\n // This is used for the community or schools section, which is only editable when there are no extensions.\r\n if (vm.model.installationCapacities.length == 1) {\r\n vm.formState.commissioningDate = vm.model.installationCapacities[0].commissioningDate;\r\n }\r\n }\r\n\r\n function updateTotalInstalledCapacity() {\r\n vm.formState.totalInstalledCapacity =\r\n calculateTotalInstalledCapacity(vm.model, vm.model.installationCapacities);\r\n vm.model.totalInstalledCapacity = vm.formState.totalInstalledCapacity;\r\n }\r\n\r\n function cumulativeInstalledCapacityForReference(extensionReference) {\r\n var includedCapacities = vm.model.installationCapacities.filter(isLowerOrSameExtensionReference);\r\n return calculateTotalInstalledCapacity(vm.model, includedCapacities);\r\n\r\n function isLowerOrSameExtensionReference(capacity) {\r\n return capacity.extensionReferenceNumber <= extensionReference;\r\n }\r\n }\r\n\r\n function calculateTotalInstalledCapacity(installation, capacities) {\r\n var existingCapacity = installation.existingInstalledCapacity != null\r\n ? parseFloat(vm.model.existingInstalledCapacity)\r\n : 0;\r\n return existingCapacity + _.sumBy(capacities, getCapacity);\r\n\r\n function getCapacity(capacity) {\r\n return parseFloat(capacity.installedCapacity);\r\n }\r\n }\r\n\r\n function save() {\r\n var installationCapacities = angular.copy(vm.model.installationCapacities);\r\n var promises = [];\r\n angular.forEach(installationCapacities, function (capacity) {\r\n promises.push(performFITClosureCheck(capacity));\r\n\r\n if (capacity.eerType === constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements')) {\r\n promises.push(installationCapacityService.validateEpcCertificate(capacity, $stateParams.installationId));\r\n }\r\n });\r\n promises.push(validateCountry());\r\n promises.push(performDuplicateCheck());\r\n return $q.all(promises).then(epcChecked);\r\n }\r\n\r\n function performFITClosureCheck(capacity) {\r\n //If coming from Edit Installation with Override bypass FIT Closure check \r\n if ($stateParams.unvalidated) {\r\n return $q.resolve();\r\n }\r\n\r\n return $q(function(resolve, reject) {\r\n var fitClosureModel = getFITClosureModel(capacity);\r\n\r\n dataService\r\n .postToEndpoint('installation/fitClosure/inEffect', fitClosureModel)\r\n .then(function(response) {\r\n var errors = response.data.data;\r\n\r\n vm.fitClosure.errors = errors;\r\n\r\n if(_.isEmpty(errors)) {\r\n resolve();\r\n } else {\r\n reject({ handled: true });\r\n }\r\n });\r\n });\r\n }\r\n\r\n function epcChecked(isUniqueArray) {\r\n var existsDuplicateEpc = _.some(isUniqueArray,\r\n function (isUnique) {\r\n return angular.isDefined(isUnique) && !isUnique;\r\n });\r\n if (existsDuplicateEpc) {\r\n vm.formState.foundMatch = true;\r\n return false;\r\n }\r\n\r\n if (vm.model.mpanDuplicationState) {\r\n return checkForApproval(buildRequest(vm.model));\r\n }\r\n\r\n return validateMpans(getSupplyMpans(), getExportMpans())\r\n .then(progressIfValid);\r\n }\r\n\r\n function performDuplicateCheck() {\r\n if (vm.formState.foundInstallationMatch) {\r\n // If we have already warned the user of a possible match, we do not need to re-check this.\r\n return $q.resolve();\r\n }\r\n if (vm.model.addressSource === constantUtils.findConstantValue(constants.addressSources, 'CurrentAddress')) {\r\n // No point in checking if this hasn't changed\r\n return $q.resolve();\r\n }\r\n\r\n var addressModel = getAddressModelForMpanCheck();\r\n if (!addressModel) {\r\n return $q.resolve();\r\n }\r\n var checkMatchParams = {\r\n technologyTypeId: vm.model.technologyType,\r\n address: addressModel.addressObject,\r\n osGridReference: addressModel.gridReference,\r\n installationId: $stateParams.installationId\r\n };\r\n\r\n return $q(function (resolve, reject) {\r\n dataService.fetchDataFromEndpointWithParams('installation/match', checkMatchParams).then(function (matches) {\r\n if (matches.length === 0) {\r\n resolve();\r\n }\r\n else {\r\n vm.matchingInstallationIds = matches;\r\n vm.formState.foundInstallationMatch = true;\r\n reject({ handled: true });\r\n }\r\n });\r\n });\r\n }\r\n\r\n function validateMpans(supplyMpans, exportMpans) {\r\n // No need for NR/Gen, thank goodness!\r\n var supplyDatesByMpan = _.chain(vm.model.supplyMeters)\r\n .keyBy('mpan')\r\n .mapValues(getMeterCommissioningDate)\r\n .value();\r\n var exportDatesByMpan = _.chain(vm.model.exportMeters)\r\n .keyBy('mpan')\r\n .mapValues(getMeterCommissioningDate)\r\n .value();\r\n\r\n var commissioningDates = {\r\n 'supply': supplyDatesByMpan,\r\n 'export': exportDatesByMpan\r\n };\r\n return metersValidationService\r\n .getDuplicateMpanStateObject(supplyMpans, exportMpans, commissioningDates, vm.model.applicationDate,\r\n getAddressModelForMpanCheck(), vm.model.technologyType, $stateParams.installationId);\r\n }\r\n\r\n function getAddressModelForMpanCheck() {\r\n var newAddress = constantUtils.findConstantValue(constants.addressSources, 'NewAddress');\r\n var currentAddress = constantUtils.findConstantValue(constants.addressSources, 'CurrentAddress');\r\n switch (vm.model.addressSource) {\r\n case currentAddress:\r\n return getCurrentAddressForMpanCheck();\r\n case newAddress:\r\n return getNewAddressForMpanCheck();\r\n }\r\n }\r\n\r\n function getCurrentAddressForMpanCheck() {\r\n if (vm.originalModel.oSGridReference) {\r\n return {\r\n locationType: 'gridReference',\r\n gridReference: vm.originalModel.oSGridReference\r\n };\r\n }\r\n return {\r\n locationType: 'address',\r\n addressObject: vm.originalModel.address\r\n };\r\n }\r\n\r\n function getNewAddressForMpanCheck() {\r\n if (vm.model.address === 'byGridReference' || vm.model.newAddressType === 'byGridReference') {\r\n return {\r\n locationType: 'gridReference',\r\n gridReference: vm.model.gridReference\r\n };\r\n }\r\n return {\r\n locationType: 'address',\r\n addressObject: buildAddress(vm.model)\r\n };\r\n }\r\n\r\n function getMeterCommissioningDate(meter) {\r\n var capacity = arrayUtils.findByProp(vm.model.installationCapacities, 'id', meter.capacityId);\r\n return capacity.commissioningDate;\r\n }\r\n\r\n function getSupplyMpans() {\r\n if (!vm.model.gridConnected) {\r\n return [];\r\n }\r\n return _.map(vm.model.supplyMeters, 'mpan');\r\n }\r\n\r\n function getExportMpans() {\r\n if (!vm.model.gridConnected\r\n || vm.model.exportMeterType !== 'mpan'\r\n || vm.model.exportStatus == deemedExportStatus) {\r\n return [];\r\n }\r\n return _.map(vm.model.exportMeters, 'mpanOrSerialNumber');\r\n }\r\n\r\n function progressIfValid(duplicateMpanStateObject) {\r\n vm.model.mpanDuplicationState = duplicateMpanStateObject;\r\n if (duplicateMpanStateObject.isValid) {\r\n var request = buildRequest(vm.model);\r\n return checkForApproval(request);\r\n }\r\n return $q.when();\r\n }\r\n\r\n function checkForApproval(request) {\r\n return installationService.checkEditForApproval($stateParams.installationId, request)\r\n .then(function (approvalReasons) {\r\n return setApprovalInfoAndProgress(approvalReasons, request);\r\n });\r\n }\r\n\r\n function setApprovalInfoAndProgress(approvalReasons, request) {\r\n var newApprovalInfo = {\r\n needsApproval: _.size(approvalReasons) > 0,\r\n reasons: approvalReasons\r\n };\r\n if (!newApprovalInfo.needsApproval) {\r\n return saveEdit(request);\r\n }\r\n if (vm.model.approvalInfo && _.isEqual(newApprovalInfo.reasons, vm.model.approvalInfo.reasons)) {\r\n // Make sure a comment has been entered.\r\n if (!vm.model.approvalMessage) {\r\n vm.model.approvalInfo.messageMissing = true;\r\n return $q.reject();\r\n }\r\n return saveEdit(request);\r\n }\r\n vm.model.approvalInfo = newApprovalInfo;\r\n return $q.when();\r\n }\r\n\r\n function saveEdit(request) {\r\n var endpoint = 'installation/' + $stateParams.installationId;\r\n if ($stateParams.unvalidated) {\r\n endpoint = endpoint + '/ignoreValidation';\r\n }\r\n return dataService.putToEndpoint(endpoint, request)\r\n .then(notifySuccess);\r\n }\r\n\r\n function buildRequest(model) {\r\n var request = {\r\n address: buildAddressModel(model),\r\n installation: buildInstallation(model),\r\n installationCapacities: buildCapacities(model),\r\n meters: buildMeters(model),\r\n message: vm.model.approvalMessage\r\n };\r\n if ($stateParams.unvalidated) {\r\n request.tariffOverrides = buildTariffOverrides(model);\r\n }\r\n return request;\r\n }\r\n\r\n function buildAddressModel(model) {\r\n var newAddress = constantUtils.findConstantValue(constants.addressSources, 'NewAddress');\r\n\r\n var response = {\r\n source: model.addressSource\r\n };\r\n\r\n if (model.addressSource === newAddress) {\r\n if (model.newAddressType === 'byGridReference') {\r\n response.oSGridReference = model.gridReference;\r\n } else if (model.newAddressType === 'byPostcode') {\r\n response.address = buildAddress(model);\r\n }\r\n }\r\n return response;\r\n }\r\n\r\n function buildAddress(model) {\r\n return {\r\n postcode: model.postcode,\r\n addressLine1: model.addressLine1,\r\n addressLine2: model.addressLine2,\r\n town: model.town,\r\n county: model.county,\r\n country: model.country\r\n };\r\n }\r\n\r\n function buildInstallation(model) {\r\n var installation = angular.copy(model);\r\n installation.technologyTypeId = installation.technologyType;\r\n delete installation.technologyType;\r\n installation.installationTypeId = installation.installationType;\r\n delete installation.installationType;\r\n\r\n if (installation.coLocatedStorage === 'No'\r\n || installation.coLocatedStorage === 'Unconfirmed'\r\n || installation.coLocatedStorage === null) {\r\n delete installation.coLocatedStorageComment;\r\n }\r\n var offGridId = constantUtils.findConstantValue(constants.exportStatuses, 'NoExportOffGrid');\r\n\r\n if (!installation.previousInstallations) {\r\n delete installation.existingInstalledCapacity;\r\n delete installation.existingDeclaredNetCapacity;\r\n }\r\n\r\n installation.communityTypeId = constantUtils.findConstantValue(constants.communityTypes, 'NotCommunityOrSchool');\r\n if (model.installationCapacities.length === 1) {\r\n if (installationRulesService.shouldCommunityQuestions(model.applicationDate,\r\n model.installationCapacities[0].commissioningDate,\r\n model.installationCapacities[0].installedCapacity,\r\n model.technologyType, model.installationCapacities[0].installTypeId)) {\r\n installation.communityTypeId = installation.communityType;\r\n\r\n if (!installationRulesService.shouldShowCommunityReference(installation.communityTypeId)) {\r\n delete installation.communityReferenceNumber;\r\n }\r\n\r\n if (!installationRulesService.shouldShowPreRegistrationDate(installation.communityTypeId, vm.formState.totalInstalledCapacity)) {\r\n delete installation.preRegistrationDate;\r\n }\r\n } else {\r\n delete installation.communityReferenceNumber;\r\n delete installation.preRegistrationDate;\r\n }\r\n }\r\n delete installation.communityType;\r\n\r\n installation.exportStatus = installation.gridConnected\r\n ? installation.exportStatus\r\n : offGridId;\r\n\r\n if (!shouldShowOverallEfficiencyQuestions(vm.model, vm.formState)) {\r\n delete installation.epcType;\r\n delete installation.epcCountry;\r\n } else {\r\n var scotlandId = constantUtils.findConstantValue(constants.epcCountries, 'Scotland');\r\n\r\n if (installation.epcCountry !== scotlandId) {\r\n installation.epcType = constantUtils.findConstantValue(constants.epcTypes, 'NotApplicable');\r\n }\r\n }\r\n\r\n if (installation.epcCountryMismatchComment) {\r\n installation.ePCCountryMismatchComment = installation.epcCountryMismatchComment;\r\n }\r\n delete installation.installationCapacities;\r\n return installation;\r\n }\r\n\r\n function buildCapacities(model) {\r\n var installationCapacities = angular.copy(model.installationCapacities);\r\n angular.forEach(installationCapacities, function (capacity) {\r\n delete capacity.meters;\r\n capacity.accreditationNumber = installationRulesService.getAccreditationNumber(capacity);\r\n delete capacity.mcsAccreditationNumber;\r\n delete capacity.rooFitAccreditationNumber;\r\n delete capacity.roAccreditationNumber;\r\n capacity.installTypeId = installationRulesService\r\n .getPvInstallTypeForEdit(model.technologyType, capacity.installTypeId);\r\n\r\n if (!installationRulesService.shouldUseMCSIssueDate(capacity.accreditationType, model.applicationDate)) {\r\n delete capacity.mcsIssueDate;\r\n }\r\n\r\n var meetsReqsId = constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements');\r\n var exemptId = constantUtils.findConstantValue(constants.eerTypes, 'Exempt');\r\n var showEfficiencyQuestions = installationRulesService.shouldShowEfficiencyQuestions(\r\n capacity.installedCapacity,\r\n model.technologyType,\r\n model.applicationDate,\r\n capacity.commissioningDate,\r\n capacity.installTypeId);\r\n if (!showEfficiencyQuestions\r\n || capacity.eerType !== meetsReqsId) {\r\n if (!showEfficiencyQuestions) {\r\n delete capacity.eerType;\r\n }\r\n if (capacity.eerType !== exemptId) {\r\n delete capacity.eerExemptComment;\r\n }\r\n delete capacity.epcCertificateNumber;\r\n delete capacity.epcCertificateNumberComment;\r\n delete capacity.epcCertificateDate;\r\n delete capacity.overrideTariffCode;\r\n delete capacity.overrideEligibilityDate;\r\n delete capacity.overrideEligibilityEndDate;\r\n } else if (capacity.epcCertificateNumber === '') {\r\n delete capacity.epcCertificateNumber;\r\n }\r\n });\r\n return installationCapacities;\r\n }\r\n\r\n function buildTariffOverrides(model) {\r\n var overrides = {};\r\n angular.forEach(model.installationCapacities, function (capacity) {\r\n var hasOverrideTariffId = angular.isDefined(capacity.overrideTariffCode) && capacity.overrideTariffCode != null;\r\n var hasOverrideEligibilityDate\r\n = angular.isDefined(capacity.overrideEligibilityDate) && capacity.overrideEligibilityDate != null;\r\n var hasOverrideEligibilityEndDate\r\n = angular.isDefined(capacity.overrideEligibilityEndDate) && capacity.overrideEligibilityEndDate != null;\r\n if (hasOverrideTariffId || hasOverrideEligibilityDate || hasOverrideEligibilityEndDate) {\r\n overrides[capacity.id] = {\r\n tariffCode: capacity.overrideTariffCode,\r\n eligibilityDate: capacity.overrideEligibilityDate,\r\n eligibilityEndDate: capacity.overrideEligibilityEndDate\r\n };\r\n }\r\n });\r\n return overrides;\r\n }\r\n\r\n function buildMeters(model) {\r\n var meters = buildSupplyMeters(model)\r\n .concat(buildExportMeters(model))\r\n .concat(buildGenerationMeters(model));\r\n return meters;\r\n }\r\n\r\n function buildSupplyMeters(model) {\r\n if (!vm.model.gridConnected) {\r\n return [];\r\n }\r\n var supplyMeters = angular.copy(model.supplyMeters);\r\n angular.forEach(supplyMeters, function (meter) {\r\n delete meter.serialNumber;\r\n delete meter.startMeterReading;\r\n delete meter.startMeterReadingDate;\r\n setDuplicateComment(meter, 'Supply');\r\n meter.type = constantUtils.findConstantValue(constants.meterTypes, 'Supply');\r\n });\r\n return supplyMeters;\r\n }\r\n\r\n function buildExportMeters(model) {\r\n if (!vm.model.gridConnected\r\n || vm.model.exportStatus == noExportStatus\r\n || vm.model.exportStatus == deemedExportStatus) {\r\n return [];\r\n }\r\n var exportMeters = angular.copy(model.exportMeters);\r\n angular.forEach(exportMeters, function (meter) {\r\n if (model.exportMeterType === 'mpan') {\r\n meter.mpan = meter.mpanOrSerialNumber;\r\n delete meter.serialNumber;\r\n } else if (model.exportMeterType === 'serialNumber') {\r\n meter.serialNumber = meter.mpanOrSerialNumber;\r\n delete meter.mpan;\r\n } else {\r\n throw new Error('Unknown export meter type for submission.');\r\n }\r\n delete meter.mpanOrSerialNumber;\r\n delete meter.startMeterReading;\r\n delete meter.startMeterReadingDate;\r\n setDuplicateComment(meter, 'Export');\r\n meter.type = constantUtils.findConstantValue(constants.meterTypes, 'Export');\r\n });\r\n return exportMeters;\r\n }\r\n\r\n function setDuplicateComment(meter, typeCode) {\r\n if (!vm.model.mpanDuplicationState) {\r\n return;\r\n }\r\n if (_.includes(vm.model.mpanDuplicationState.mpans, meter.mpan)) {\r\n if (typeCode === 'Supply') {\r\n meter.duplicateMpanReason = vm.model.duplicateMpanReason;\r\n meter.duplicateMpanComment = vm.model.duplicateSupplyMpanComment;\r\n } else if (typeCode === 'Export') {\r\n meter.duplicateMpanComment = vm.model.duplicateExportMpanComment;\r\n }\r\n } else {\r\n delete meter.duplicateMpanComment;\r\n delete meter.duplicateMpanReason;\r\n }\r\n }\r\n\r\n function buildGenerationMeters(model) {\r\n var generationMeters = angular.copy(model.generationMeters);\r\n angular.forEach(generationMeters, function (meter) {\r\n delete meter.mpan;\r\n meter.type = constantUtils.findConstantValue(constants.meterTypes, 'Generation');\r\n });\r\n return generationMeters;\r\n }\r\n\r\n function notifySuccess(response) {\r\n response = response.data.data;\r\n if (response.pendingApproval) {\r\n toastr.success('The installation has been submitted and is pending approval.', 'Pending approval');\r\n } else {\r\n toastr.success('The installation has been edited.', 'Edit successful');\r\n }\r\n returnToParent();\r\n }\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n\r\n function recalculateTariffsDetails() {\r\n vm.tariffDetails = [];\r\n vm.loadingTariffs = true;\r\n vm.tariffError = false;\r\n vm.tariffErrorList = '';\r\n\r\n var endpoint = 'installation/' + $stateParams.installationId + '/tariffs';\r\n var request = buildRequest(vm.model);\r\n dataService.putToEndpoint(endpoint, request)\r\n .then(displayTariffDetails)\r\n .catch(installationsTariffService.catchNoTariffs)\r\n .catch(displayTariffError)\r\n .finally(stopLoadingTariffs);\r\n }\r\n\r\n function displayTariffDetails(response) {\r\n vm.tariffDetails = response.data.data;\r\n }\r\n\r\n function displayTariffError(reason) {\r\n vm.tariffError = true;\r\n\r\n //ValidationFailureException\r\n if (angular.isDefined(reason.data.modelState)) {\r\n vm.tariffErrorList = reason.data.modelState;\r\n } else {\r\n vm.tariffErrorList = [\r\n reason.data.message\r\n ];\r\n }\r\n }\r\n\r\n function stopLoadingTariffs() {\r\n vm.loadingTariffs = false;\r\n }\r\n\r\n function getFITClosureModel(capacity) {\r\n return {\r\n mcsIssueDate: capacity.mcsIssueDate,\r\n applicationDate: vm.model.applicationDate,\r\n preRegistrationDate: vm.model.preRegistrationDate,\r\n communityType: vm.formState.communityType,\r\n accreditationType: capacity.accreditationType,\r\n accreditationNumber: capacity.accreditationNumber,\r\n commissioningDate: capacity.commissioningDate\r\n };\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationEfficiencyController', InstallationEfficiencyController);\r\n\r\n function InstallationEfficiencyController($q, installationCapacityService, WizardHandler, installationStorageService, dataService,\r\n installationRulesService, installationDetailsService, constants, constantUtils) {\r\n var vm = this;\r\n var meetsRequirementsId = constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements');\r\n var scotlandId = constantUtils.findConstantValue(constants.epcCountries, 'Scotland');\r\n\r\n vm.storage = installationStorageService;\r\n vm.model = getModelFromStorage();\r\n vm.fields = getFields();\r\n vm.formState = {\r\n foundMatch: false\r\n };\r\n vm.entryHandler = {\r\n handler: refreshTechnologyModel,\r\n isEnabled: efficiencyFieldsRequired,\r\n key: 'efficiency'\r\n };\r\n\r\n vm.next = next;\r\n\r\n function next() {\r\n return $q.all([validateCertificate(), validateCountry()])\r\n .then(saveAndMoveToNextPage);\r\n }\r\n\r\n function validateCertificate() {\r\n return installationCapacityService.validateEpcCertificate(vm.model)\r\n .then(function (isUnique) {\r\n if (isUnique) {\r\n return $q.resolve();\r\n } else {\r\n vm.formState.foundMatch = true;\r\n return $q.reject({ handled: true });\r\n }\r\n });\r\n }\r\n\r\n function validateCountry() {\r\n if (vm.model.epcCountryMismatch) {\r\n // If we have already warned the user of a possible mismatch, we do not need to re-check this.\r\n return $q.resolve();\r\n }\r\n\r\n var selectedCountry = vm.model.epcCountry;\r\n if (selectedCountry) {\r\n var addressModel = installationStorageService.getAddressModel();\r\n var expectingGridRef = installationRulesService.expectingGridReference(addressModel);\r\n if (!expectingGridRef) {\r\n var generator = installationStorageService.getGenerator();\r\n var nominatedRecipient = installationStorageService.getNominatedRecipient();\r\n var address = installationRulesService.getCurrentAddress(addressModel, generator, nominatedRecipient);\r\n if (address && address.postcode) {\r\n return getEpcCountryFromPostcode(address.postcode)\r\n .then(function (epcCountry) {\r\n if (epcCountry) {\r\n if ((epcCountry === scotlandId && selectedCountry !== scotlandId)\r\n || (epcCountry !== scotlandId && selectedCountry === scotlandId)) {\r\n vm.model.epcCountryMismatch = true;\r\n return $q.reject({ handled: true });\r\n }\r\n }\r\n return $q.resolve();\r\n });\r\n }\r\n }\r\n }\r\n return $q.resolve();\r\n }\r\n\r\n function getEpcCountryFromPostcode(postcode) {\r\n return dataService.fetchDataFromEndpointWithParams('addresses/epcCountry', {\r\n postcode: postcode\r\n });\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n installationStorageService.saveEfficiencyModel(vm.model);\r\n WizardHandler.wizard().next();\r\n }\r\n\r\n function refreshTechnologyModel() {\r\n\r\n var licenceModel = installationStorageService.getLicenceModel();\r\n vm.formState.accreditationType = licenceModel.accreditationType;\r\n\r\n // We must refresh the technology model to give us access to dates used for validation.\r\n var technologyModel = installationStorageService.getTechnologyModel();\r\n\r\n vm.formState.applicationDate = technologyModel.applicationDate;\r\n vm.formState.commissioningDate = technologyModel.commissioningDate;\r\n vm.formState.preRegistrationDate = technologyModel.preRegistrationDate;\r\n vm.formState.eligibilityDateOverride = technologyModel.eligibilityDateOverride;\r\n\r\n // Clear the country mismatch info here to avoid problems with stale data.\r\n clearCountryMismatchBoolean();\r\n }\r\n\r\n function efficiencyFieldsRequired() {\r\n var basicDetailsModel = installationStorageService.getBasicDetailsModel();\r\n var technologyModel = installationStorageService.getTechnologyModel();\r\n\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n basicDetailsModel.installedCapacity,\r\n basicDetailsModel.existingInstalledCapacity);\r\n\r\n return installationRulesService.shouldShowEfficiencyQuestions(\r\n totalInstalledCapacity,\r\n technologyModel.technologyType,\r\n technologyModel.applicationDate,\r\n technologyModel.commissioningDate,\r\n installationRulesService.getPvInstallType(technologyModel)\r\n );\r\n }\r\n\r\n function getFields() {\r\n var capacityFields = installationCapacityService.getCapacityEfficiencyFields();\r\n var fields = installationDetailsService.getInstallationEfficiencyFields();\r\n // Add on change event to clear the country mismatch state when the EPC country changes.\r\n var epcField = _.find(fields, ['key', 'epcCountry']);\r\n epcField.templateOptions.onChange = clearCountryMismatchBoolean;\r\n var installationFieldGroup = {\r\n className: 'row',\r\n fieldGroup: fields,\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return scope.model.eerType !== meetsRequirementsId;\r\n }\r\n };\r\n var certificateFields = installationCapacityService.getCapacityEfficiencyCertificateFields();\r\n var countryMismatchFields = [\r\n {\r\n type: 'fitInlineWarning',\r\n templateOptions: {\r\n messages: ['The installation is registered in a different country to the one selected. Please check that you have selected the correct country.']\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n },\r\n hideExpression: function () {\r\n return !vm.model.epcCountryMismatch;\r\n }\r\n },\r\n {\r\n key: 'epcCountryMismatchComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please enter a comment explaining why the EPC country does not match the installation address.',\r\n required: true\r\n },\r\n hideExpression: function () {\r\n return !vm.model.epcCountryMismatch;\r\n }\r\n }\r\n ];\r\n return capacityFields.concat([installationFieldGroup]).concat(certificateFields).concat(countryMismatchFields);\r\n }\r\n\r\n function getModelFromStorage() {\r\n var efficiencyModel = installationStorageService.getEfficiencyModel();\r\n\r\n // The datepicker returns values as string; we need to convert them into a date for display,\r\n // if they exist.\r\n efficiencyModel.epcCertificateDate = efficiencyModel.epcCertificateDate\r\n ? new Date(efficiencyModel.epcCertificateDate)\r\n : null;\r\n\r\n return efficiencyModel;\r\n }\r\n\r\n function clearCountryMismatchBoolean() {\r\n vm.model.epcCountryMismatch = undefined;\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .component('existingInstallationPanel', existingInstallationPanel());\r\n\r\n function existingInstallationPanel() {\r\n return {\r\n restrict: 'E',\r\n controller: 'ExistingInstallationPanelController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/installations/extensions/existing-installation-panel.html',\r\n bindings: {\r\n installation: '<'\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExistingInstallationPanelController', ExistingInstallationPanelController);\r\n\r\n function ExistingInstallationPanelController() {\r\n var vm = this;\r\n\r\n vm.layout = {\r\n numberOfColumns: 2,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'FIT ID',\r\n key: 'fitId',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Name',\r\n key: 'name',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Application date',\r\n key: 'applicationDate',\r\n type: 'date'\r\n },\r\n {\r\n label: 'Latest commissioning date',\r\n key: 'lastCommissioningDate',\r\n type: 'date'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Technology type',\r\n key: 'technologyTypeName',\r\n type: 'date'\r\n },\r\n {\r\n label: 'Current install type',\r\n key: 'installTypeName',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Current export status',\r\n key: 'exportStatusName',\r\n type: 'text'\r\n },\r\n {\r\n label: 'Current total installed capacity',\r\n key: 'totalInstalledCapacity',\r\n type: 'text'\r\n }\r\n ]\r\n },\r\n {\r\n items: [\r\n {\r\n label: 'Latest accreditation number',\r\n key: 'latestAccreditationNumber',\r\n type: 'text'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionAccreditationController', ExtensionAccreditationController);\r\n\r\n function ExtensionAccreditationController(WizardHandler, installationAccreditationService, extensionStorageService, constants, constantUtils) {\r\n var vm = this;\r\n vm.foundMatch = false;\r\n vm.storage = extensionStorageService;\r\n vm.model = extensionStorageService.getAccreditationModel();\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n\r\n vm.next = next;\r\n\r\n function next() {\r\n vm.foundMatch = false;\r\n var mcsId = constantUtils.findConstantValue(constants.accreditationTypes, 'MCS');\r\n if (vm.model.accreditationType === mcsId\r\n && (vm.existingDetails.technologyType === constantUtils.findConstantValue(constants.technologyTypes, 'Hydro')\r\n || vm.existingDetails.technologyType === constantUtils.findConstantValue(constants.technologyTypes, 'AnaerobicDigestion'))) {\r\n vm.invalidAccreditationType = true;\r\n return;\r\n }\r\n \r\n if (vm.model.accreditationType !== mcsId\r\n && !vm.existingDetails.name) {\r\n vm.roofitMissingName = true;\r\n return;\r\n }\r\n \r\n return installationAccreditationService.validateAccreditationAvailability(vm.model, vm.existingDetails.installationId)\r\n .then(moveToNextPageOrDisplayUniquenessError);\r\n }\r\n\r\n function moveToNextPageOrDisplayUniquenessError(isUnique) {\r\n if (isUnique) {\r\n saveAndMoveToNextPage();\r\n return;\r\n }\r\n vm.foundMatch = true;\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n extensionStorageService.saveAccreditationModel(vm.model);\r\n WizardHandler.wizard().next();\r\n }\r\n \r\n vm.fields = installationAccreditationService.getAccreditationFields(true);\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionDetailsController', ExtensionDetailsController);\r\n\r\n function ExtensionDetailsController(WizardHandler, installationCapacityService, extensionStorageService,\r\n arrayUtils, formUtils, constants, $q, installationRulesService) {\r\n\r\n var vm = this;\r\n vm.formState = {};\r\n vm.storage = extensionStorageService;\r\n vm.model = getModel();\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n vm.fields = getFields();\r\n\r\n vm.next = saveAndMoveToNextPage;\r\n vm.declaredNetCapacityLessThanHalfOfInstalledCapacity = declaredNetCapacityLessThanHalfOfInstalledCapacity;\r\n\r\n vm.entryHandler = {\r\n handler: refreshModel,\r\n key: 'extension.details'\r\n };\r\n\r\n function refreshModel() {\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n vm.formState.applicationDate = formUtils.convertToDate(vm.existingDetails.applicationDate) || new Date();\r\n\r\n var accreditationDetails = extensionStorageService.getAccreditationModel();\r\n vm.formState.accreditationType = accreditationDetails.accreditationType;\r\n vm.formState.accreditationNumber = installationRulesService.getAccreditationNumber(accreditationDetails);\r\n }\r\n\r\n function declaredNetCapacityLessThanHalfOfInstalledCapacity() {\r\n return installationCapacityService.declaredNetCapacityLessThanHalfOfInstalledCapacity(vm.model.installedCapacity, vm.model.declaredNetCapacity);\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n vm.model.installedCapacity,\r\n vm.existingDetails.totalInstalledCapacity);\r\n\r\n vm.model.installType = installationRulesService.getPvInstallTypeForExtension(totalInstalledCapacity, vm.existingDetails);\r\n extensionStorageService.saveExtensionDetailsModel(vm.model);\r\n WizardHandler.wizard().next();\r\n return $q.when();\r\n }\r\n\r\n function getFields() {\r\n var fields = installationCapacityService.getCapacityBasicsFields()\r\n .concat(installationCapacityService.getCapacityDateFields())\r\n .concat(installationCapacityService.getCapacityEligibilityDateOverrideFields());\r\n var commissioningDateField = arrayUtils.findByProp(fields, 'key', 'commissioningDate');\r\n var installedCapacityField = arrayUtils.findByProp(fields, 'key', 'installedCapacity');\r\n var declaredNetCapacityField = arrayUtils.findByProp(fields, 'key', 'declaredNetCapacity');\r\n installedCapacityField.validators['combinedInstalledCapacityIsUnderLimit'] = {\r\n expression: combinedInstalledCapacityIsUnderLimit,\r\n message: '\"The combined installed capacity must be less than ' +\r\n constants.fitConstants.capacityLimitKilowatts + 'kW.\"'\r\n };\r\n declaredNetCapacityField.validators['combinedDeclaredNetCapacityIsUnderLimit'] = {\r\n expression: combinedDeclaredNetCapacityIsUnderLimit,\r\n message: '\"The combined installed capacity must be less than ' +\r\n constants.fitConstants.capacityLimitKilowatts + 'kW.\"'\r\n };\r\n\r\n commissioningDateField.validators['commissioningDateAfterCutoff'] = {\r\n expression: commissioningDateIsBeforeCutoff,\r\n message: '\"The commissioning date must be before ' +\r\n constants.fitConstants.capacityCapStartDate.toString('dd-MM-yyyy') + '.\"'\r\n };\r\n\r\n commissioningDateField.validators['commissioningDateAfterLastCommissioningDate'] = {\r\n expression: commissioningDateAfterLastCommissioningDate,\r\n message: '\"The commissioning date of the extension you are registering must be on or after the commissioning date of the latest capacity.\"'\r\n };\r\n\r\n return fields;\r\n }\r\n\r\n function getModel() {\r\n var model = extensionStorageService.getExtensionDetailsModel();\r\n model.commissioningDate = formUtils.convertToDate(model.commissioningDate);\r\n return model;\r\n }\r\n\r\n function combinedInstalledCapacityIsUnderLimit(viewValue, modelValue) {\r\n var installedCapacity = parseFloat(modelValue || viewValue);\r\n return combinedCapacityIsUnderLimit(installedCapacity, vm.existingDetails.totalInstalledCapacity);\r\n }\r\n\r\n\r\n function combinedDeclaredNetCapacityIsUnderLimit(viewValue, modelValue) {\r\n var declaredNetCapacity = parseFloat(modelValue || viewValue);\r\n return combinedCapacityIsUnderLimit(declaredNetCapacity, vm.existingDetails.totalDeclaredCapacity);\r\n }\r\n\r\n function combinedCapacityIsUnderLimit(capacity, existingCapacity) {\r\n return (capacity + existingCapacity) <= constants.fitConstants.capacityLimitKilowatts;\r\n }\r\n\r\n function commissioningDateIsBeforeCutoff(viewValue, modelValue) {\r\n return moment(modelValue || viewValue).isBefore(moment(constants.fitConstants.capacityCapStartDate));\r\n }\r\n\r\n function commissioningDateAfterLastCommissioningDate(viewValue, modelValue) {\r\n return moment(modelValue || viewValue).isSameOrAfter(moment(vm.existingDetails.lastCommissioningDate));\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionEfficiencyController', ExtensionEfficiencyController);\r\n\r\n function ExtensionEfficiencyController(WizardHandler, installationCapacityService, extensionStorageService,\r\n formUtils, installationRulesService, installationDetailsService, constants, constantUtils) {\r\n var vm = this;\r\n var meetsRequirementsId = constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements');\r\n vm.formState = { foundMatch: false };\r\n vm.storage = extensionStorageService;\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n vm.model = getModel();\r\n vm.model.epcCountry = vm.existingDetails.epcCountry;\r\n vm.model.epcType = vm.existingDetails.epcType;\r\n vm.fields = getFields();\r\n\r\n vm.next = next;\r\n\r\n vm.entryHandler = {\r\n handler: refreshModel,\r\n isEnabled: efficiencyFieldsRequired,\r\n key: 'extension.efficiency'\r\n };\r\n\r\n\r\n function efficiencyFieldsRequired() {\r\n var existingDetailsModel = extensionStorageService.getExistingDetailsModel();\r\n var extensionDetailsModel = extensionStorageService.getExtensionDetailsModel();\r\n\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n extensionDetailsModel.installedCapacity,\r\n existingDetailsModel.totalInstalledCapacity);\r\n\r\n return installationRulesService.shouldShowEfficiencyQuestions(\r\n totalInstalledCapacity,\r\n existingDetailsModel.technologyType,\r\n existingDetailsModel.applicationDate,\r\n extensionDetailsModel.commissioningDate,\r\n installationRulesService.getPvInstallTypeForExtension(totalInstalledCapacity, existingDetailsModel)\r\n );\r\n }\r\n\r\n function refreshModel() {\r\n var extensionDetails = extensionStorageService.getExtensionDetailsModel();\r\n vm.formState.commissioningDate = formUtils.convertToDate(extensionDetails.commissioningDate);\r\n\r\n var existingDetails = extensionStorageService.getExistingDetailsModel();\r\n vm.formState.applicationDate = formUtils.convertToDate(existingDetails.applicationDate);\r\n vm.formState.epcCountry = existingDetails.epcCountry;\r\n vm.formState.epcType = existingDetails.epcType;\r\n }\r\n\r\n function next() {\r\n vm.formState.foundMatch = false;\r\n return installationCapacityService.validateEpcCertificate(vm.model, vm.existingDetails.installationId)\r\n .then(moveToNextPageOrDisplayUniquenessError);\r\n }\r\n\r\n function moveToNextPageOrDisplayUniquenessError(isUnique) {\r\n if (isUnique) {\r\n saveAndMoveToNextPage();\r\n return;\r\n }\r\n vm.formState.foundMatch = true;\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n extensionStorageService.saveEfficiencyModel(vm.model);\r\n WizardHandler.wizard().next();\r\n }\r\n\r\n function getFields() {\r\n var installationFields = installationDetailsService.getInstallationEfficiencyFields();\r\n var installationFieldGroup = {\r\n className: 'row',\r\n fieldGroup: installationFields,\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return scope.model.eerType !== meetsRequirementsId;\r\n }\r\n };\r\n return installationCapacityService.getCapacityEfficiencyFields()\r\n .concat(installationFieldGroup)\r\n .concat(installationCapacityService.getCapacityEfficiencyCertificateFields());\r\n }\r\n\r\n function getModel() {\r\n return extensionStorageService.getEfficiencyModel();\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionExportStatusController', ExtensionExportStatusController);\r\n\r\n function ExtensionExportStatusController(WizardHandler, extensionStorageService, constantUtils, constants, $q,\r\n installationRulesService ) {\r\n var deemedExportStatus = constantUtils.findConstantValue(constants.exportStatuses, 'ExportDeemed');\r\n\r\n var vm = this;\r\n vm.storage = extensionStorageService;\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n vm.model = getModel();\r\n vm.fields = getFields();\r\n\r\n vm.next = saveAndMoveToNextPage;\r\n\r\n vm.entryHandler = {\r\n isEnabled: exportStatusMustChange,\r\n key: 'extension.exportStatus'\r\n };\r\n\r\n function exportStatusMustChange() {\r\n var existingDetails = extensionStorageService.getExistingDetailsModel();\r\n var extensionDetails = extensionStorageService.getExtensionDetailsModel();\r\n\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n extensionDetails.installedCapacity,\r\n existingDetails.totalInstalledCapacity);\r\n\r\n return existingDetails.exportStatus === deemedExportStatus\r\n && totalInstalledCapacity > parseFloat(constants.fitConstants.exportCapacityCutoff);\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n extensionStorageService.saveExportStatusModel(vm.model);\r\n WizardHandler.wizard().next();\r\n return $q.when();\r\n }\r\n\r\n function getFields() {\r\n return [\r\n {\r\n key: 'exportStatus',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please select the updated export status for your installation:',\r\n required: true,\r\n options: constants.highCapacityExportStatuses\r\n }\r\n }];\r\n }\r\n\r\n function getModel() {\r\n return extensionStorageService.getExportStatusModel();\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionMetersController', ExtensionMetersController);\r\n\r\n function ExtensionMetersController(WizardHandler, extensionStorageService, installationsTariffService, formUtils, metersValidationService) {\r\n var vm = this;\r\n\r\n vm.storage = extensionStorageService;\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n\r\n vm.getFormState = getFormState;\r\n vm.updateTariffs = updateTariffs;\r\n vm.next = saveAndMoveToNextPage;\r\n vm.validateMpans = validateMpans;\r\n vm.getEligibilityDate = getEligibilityDate;\r\n\r\n function saveAndMoveToNextPage(model) {\r\n extensionStorageService.saveMeterInfoModel(model);\r\n WizardHandler.wizard().next();\r\n }\r\n\r\n function updateTariffs() {\r\n return installationsTariffService.saveTariffAndEligibilityDatesForExtension();\r\n }\r\n \r\n function getEligibilityDate() {\r\n return extensionStorageService.getEligibilityDate();\r\n }\r\n\r\n function validateMpans(supplyMpans, exportMpans) {\r\n var existingDetails = extensionStorageService.getExistingDetailsModel();\r\n var extensionDetails = extensionStorageService.getExtensionDetailsModel();\r\n\r\n var locationInfo = {\r\n locationType: 'address',\r\n addressObject: existingDetails.address\r\n };\r\n\r\n return metersValidationService\r\n .getDuplicateMpanStateObject(supplyMpans, exportMpans, extensionDetails.commissioningDate,\r\n existingDetails.applicationDate, locationInfo, existingDetails.technologyType, existingDetails.installationId);\r\n }\r\n\r\n function getFormState() {\r\n var existingDetails = extensionStorageService.getExistingDetailsModel();\r\n var extensionDetails = extensionStorageService.getExtensionDetailsModel();\r\n var exportStatusModel = extensionStorageService.getExportStatusModel();\r\n\r\n return {\r\n gridConnected: existingDetails.gridConnected,\r\n exportStatus: exportStatusModel.exportStatus || existingDetails.exportStatus,\r\n commissioningDate: formUtils.convertToDate(extensionDetails.commissioningDate),\r\n applicationDate: formUtils.convertToDate(existingDetails.applicationDate),\r\n technologyType: existingDetails.technologyType,\r\n existingMeters: existingDetails.existingMeters\r\n };\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionSubmissionController', ExtensionSubmissionController);\r\n\r\n function ExtensionSubmissionController($state, WizardHandler, installationService, installationRulesService, toastr,\r\n extensionStorageService, constants, constantUtils, objectUtils, dataLayoutService) {\r\n var deemedExportStatus = constantUtils.findConstantValue(constants.exportStatuses, 'ExportDeemed');\r\n var vm = this;\r\n vm.error = null;\r\n vm.storage = extensionStorageService;\r\n vm.existingDetails = extensionStorageService.getExistingDetailsModel();\r\n\r\n vm.entryHandler = {\r\n handler: loadStoredData,\r\n key: 'extension.submission'\r\n };\r\n\r\n vm.next = submit;\r\n vm.model = {};\r\n vm.approvalFields = [\r\n {\r\n key: 'approvalMessage',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Please give an explanation for the correctness of this extension, taking into account the reasons it will need approval.',\r\n required: true,\r\n maxlength: 4000,\r\n rows: 6\r\n },\r\n hideExpression: function () {\r\n return !vm.model.approvalInfo || !vm.model.approvalInfo.needsApproval;\r\n }\r\n }\r\n ];\r\n\r\n function getFullRequest() {\r\n return {\r\n installationChanges: vm.installationChanges,\r\n extension: vm.installationCapacity,\r\n meters: vm.meters,\r\n message: vm.model.approvalMessage\r\n };\r\n }\r\n\r\n function submit() {\r\n vm.error = null;\r\n var existingDetails = extensionStorageService.getExistingDetailsModel();\r\n\r\n return installationService.createExtension(existingDetails.installationId, getFullRequest())\r\n .then(wipeStorageAndGoToLanding).catch(showError);\r\n }\r\n\r\n function wipeStorageAndGoToLanding(response) {\r\n extensionStorageService.clear();\r\n if (response.pendingApproval) {\r\n toastr.success('The extension has been submitted and is pending approval.', 'Extension awaiting approval');\r\n } else {\r\n toastr.success('The extension has been added to this installation.', 'Extension added');\r\n }\r\n $state.go('^');\r\n }\r\n\r\n function showError(error) {\r\n vm.error = error;\r\n }\r\n\r\n function loadStoredData() {\r\n var accreditationModel = extensionStorageService.getAccreditationModel();\r\n var existingDetails = extensionStorageService.getExistingDetailsModel();\r\n var extensionDetails = extensionStorageService.getExtensionDetailsModel();\r\n var efficiencyDetails = extensionStorageService.getEfficiencyModel();\r\n var exportStatusModel = extensionStorageService.getExportStatusModel();\r\n var meterInfoModel = extensionStorageService.getMeterInfoModel();\r\n var tariff = extensionStorageService.getTariff();\r\n\r\n var exportStatus = exportStatusChangeNeeded(existingDetails, extensionDetails)\r\n ? exportStatusModel.exportStatus\r\n : existingDetails.exportStatus;\r\n var epcCountry = efficiencyDetails.epcCountry;\r\n var epcType = efficiencyDetails.epcType;\r\n\r\n vm.shouldShowInstallationChanges = shouldShowInstallationChanges;\r\n\r\n vm.gridConnected = existingDetails.gridConnected;\r\n vm.installationChanges = createInstallationChangesModel(exportStatus, epcCountry, epcType);\r\n\r\n vm.installationChangesViewData = {\r\n newExportStatus: constantUtils.findConstantName(constants.exportStatuses, vm.installationChanges.exportStatus),\r\n originalExportStatus: constantUtils.findConstantName(constants.exportStatuses, existingDetails.exportStatus),\r\n newEPCCountry: constantUtils.findConstantName(constants.epcCountries, vm.installationChanges.epcCountry),\r\n originalEPCCountry: constantUtils.findConstantName(constants.epcCountries, existingDetails.epcCountry),\r\n newEPCType: constantUtils.findConstantName(constants.epcTypes, vm.installationChanges.epcType),\r\n originalEPCType: constantUtils.findConstantName(constants.epcTypes, existingDetails.epcType)\r\n };\r\n\r\n vm.installationCapacity = createCapacityModel(accreditationModel, extensionDetails, existingDetails, efficiencyDetails, tariff);\r\n vm.meters = getMeters(meterInfoModel, existingDetails, exportStatus);\r\n vm.tariff = getTariff(tariff);\r\n\r\n // These layouts are needed for the accordions.\r\n vm.installationChangesLayout = dataLayoutService.getLayout('installationChanges');\r\n vm.installationCapacityLayout = dataLayoutService.getLayout('installationCapacity');\r\n vm.tariffLayout = dataLayoutService.getLayout('tariff');\r\n\r\n // Check whether this will need approving or not.\r\n installationService.checkExtensionForApproval(existingDetails.installationId, getFullRequest({})).then(function (reasons) {\r\n vm.model.approvalInfo = {\r\n needsApproval: _.size(reasons) > 0,\r\n reasons: reasons\r\n };\r\n });\r\n }\r\n\r\n function shouldShowInstallationChanges() {\r\n return vm.installationChangesViewData\r\n &&\r\n (\r\n vm.installationChangesViewData.newExportStatus !== vm.installationChangesViewData.originalExportStatus\r\n || vm.installationChangesViewData.newEPCCountry !== vm.installationChangesViewData.oldEPCCountry\r\n || vm.installationChangesViewData.newEPCType !== vm.installationChangesViewData.oldEPCType\r\n ); \r\n }\r\n\r\n function exportStatusChangeNeeded(existingDetails, extensionDetails) {\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n extensionDetails.installedCapacity,\r\n existingDetails.totalInstalledCapacity);\r\n\r\n return existingDetails.exportStatus === deemedExportStatus\r\n && totalInstalledCapacity > parseFloat(constants.fitConstants.exportCapacityCutoff);\r\n\r\n }\r\n\r\n function createInstallationChangesModel(exportStatus, epcCountry, epcType) {\r\n return {\r\n exportStatus: exportStatus,\r\n epcCountry: epcCountry,\r\n epcType: epcType\r\n };\r\n }\r\n\r\n function createCapacityModel(accreditationModel, extensionDetailsModel, existingDetailsModel, efficiencyModel, tariff) {\r\n var installationCapacity = {\r\n accreditationType: accreditationModel.accreditationType,\r\n accreditationTypeName: constantUtils.findConstantName(constants.accreditationTypes, accreditationModel.accreditationType),\r\n accreditationNumber: installationRulesService.getAccreditationNumber(accreditationModel),\r\n installedCapacity: extensionDetailsModel.installedCapacity,\r\n declaredNetCapacity: extensionDetailsModel.declaredNetCapacity,\r\n commissioningDate: extensionDetailsModel.commissioningDate,\r\n receivedGrant: false,\r\n tariffId: tariff.tariffId,\r\n eligibilityDate: extensionStorageService.getEligibilityDate(),\r\n eligibilityEndDate: extensionStorageService.getEligibilityEndDate()\r\n };\r\n setPVInstallType(installationCapacity, extensionDetailsModel);\r\n setEligibilityDateOverride(installationCapacity, accreditationModel, extensionDetailsModel);\r\n\r\n if (efficiencyModel) {\r\n setCapacityEfficiencyAnswers(installationCapacity, efficiencyModel, extensionDetailsModel, existingDetailsModel);\r\n }\r\n\r\n return installationCapacity;\r\n }\r\n\r\n function setCapacityEfficiencyAnswers(installationCapacity, efficiencyModel, extensionDetailsModel, existingDetailsModel) {\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n extensionDetailsModel.installedCapacity,\r\n existingDetailsModel.totalInstalledCapacity);\r\n\r\n var efficiencyQuestionsNeeded = installationRulesService.shouldShowEfficiencyQuestions(\r\n totalInstalledCapacity,\r\n existingDetailsModel.technologyType,\r\n existingDetailsModel.applicationDate,\r\n extensionDetailsModel.commissioningDate,\r\n extensionDetailsModel.installType);\r\n if (efficiencyQuestionsNeeded) {\r\n var tempEfficiencyParams = getEfficiencyRequestParameters(efficiencyModel);\r\n\r\n var copyValues = ['eerType', 'eerTypeName', 'eerExemptComment', 'epcCertificateNumber',\r\n 'epcCertificateNumberComment', 'epcCertificateDate'];\r\n objectUtils.copy(tempEfficiencyParams, copyValues, installationCapacity);\r\n }\r\n }\r\n\r\n function setPVInstallType(installationCapacity, extensionDetailsModel) {\r\n installationCapacity.installTypeId = extensionDetailsModel.installType;\r\n installationCapacity.installTypeName = constantUtils.findConstantName(constants.photovoltaicInstallTypes, installationCapacity.installTypeId);\r\n }\r\n\r\n function setEligibilityDateOverride(installationCapacity, accreditationModel, extensionDetailsModel) {\r\n if (accreditationModel.accreditationType === constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit'))\r\n {\r\n installationCapacity.eligibilityDateOverride = extensionDetailsModel.eligibilityDateOverride;\r\n }\r\n }\r\n\r\n function getMeters(meterInfoModel, existingDetails, exportStatus) {\r\n var meters = meterInfoModel.generationMeters.map(function(meter) {\r\n return addTypeAndRestrictFields(meter, 'Generation', meterInfoModel);\r\n });\r\n\r\n if (existingDetails.gridConnected === true) {\r\n var supplyMeters = meterInfoModel.supplyMeters.map(function(meter) {\r\n return addTypeAndRestrictFields(meter, 'Supply', meterInfoModel);\r\n });\r\n meters = meters.concat(supplyMeters);\r\n }\r\n\r\n if (exportMetersRequired(existingDetails, exportStatus)) {\r\n var exportMeters = meterInfoModel.exportMeters.map(function (meter) {\r\n return addTypeAndRestrictFields(meter, 'Export', meterInfoModel, meterInfoModel.exportMeterType);\r\n });\r\n meters = meters.concat(exportMeters);\r\n }\r\n return meters;\r\n }\r\n\r\n function exportMetersRequired(existingDetails, exportStatus) {\r\n return (existingDetails.gridConnected === true)\r\n && (exportStatus === constantUtils.findConstantValue(constants.exportStatuses, 'ExportStandard')\r\n || exportStatus === constantUtils.findConstantValue(constants.exportStatuses, 'ExportNegotiated'));\r\n }\r\n\r\n function getTariff(tariff) {\r\n return {\r\n tariffCode: tariff.tariffCode,\r\n tariffValue: tariff.tariffValue,\r\n description: tariff.description\r\n };\r\n }\r\n\r\n function addTypeAndRestrictFields(meter, typeCode, meterModel, exportType) {\r\n var processedMeter = {\r\n type: constantUtils.findConstantValue(constants.meterTypes, typeCode)\r\n };\r\n switch (typeCode) {\r\n case 'Supply':\r\n processedMeter.mpan = meter.mpan;\r\n break;\r\n case 'Export':\r\n if (exportType === 'mpan') {\r\n processedMeter.mpan = meter.mpanOrSerialNumber;\r\n } else if (exportType === 'serialNumber') {\r\n processedMeter.serialNumber = meter.mpanOrSerialNumber;\r\n } else {\r\n throw new Error('Unknown export meter type for submission.');\r\n }\r\n break;\r\n case 'Generation':\r\n processedMeter.serialNumber = meter.serialNumber;\r\n processedMeter.startMeterReading = meter.startMeterReading;\r\n processedMeter.startMeterReadingDate = meter.startMeterReadingDate;\r\n }\r\n if (_.includes(meterModel.mpanDuplicationState.mpans, processedMeter.mpan)) {\r\n if (typeCode === 'Supply') {\r\n processedMeter.duplicateMpanReason = meterModel.duplicateMpanReason;\r\n processedMeter.duplicateMpanComment = meterModel.duplicateSupplyMpanComment;\r\n } else if (typeCode === 'Export') {\r\n processedMeter.duplicateMpanComment = meterModel.duplicateExportMpanComment;\r\n }\r\n }\r\n return processedMeter;\r\n }\r\n\r\n function getEfficiencyRequestParameters(efficiencyModel) {\r\n var efficiencyRequestParams = {};\r\n\r\n efficiencyRequestParams.eerType = efficiencyModel.eerType;\r\n efficiencyRequestParams.eerTypeName = constantUtils.findConstantName(constants.eerTypes, efficiencyRequestParams.eerType);\r\n\r\n var exemptId = constantUtils.findConstantValue(constants.eerTypes, 'Exempt');\r\n if (efficiencyModel.eerType === exemptId) {\r\n efficiencyRequestParams.eerExemptComment = efficiencyModel.eerExemptComment;\r\n }\r\n\r\n var meetsReqsId = constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements');\r\n if (efficiencyModel.eerType === meetsReqsId) {\r\n efficiencyRequestParams.epcCountry = efficiencyModel.epcCountry;\r\n efficiencyRequestParams.epcCountryName = constantUtils.findConstantName(constants.epcCountries, efficiencyRequestParams.epcCountry);\r\n efficiencyRequestParams.epcCertificateNumber = efficiencyModel.epcCertificateNumber;\r\n efficiencyRequestParams.epcCertificateNumberComment = efficiencyModel.epcCertificateNumberComment;\r\n efficiencyRequestParams.epcCertificateDate = efficiencyModel.epcCertificateDate;\r\n\r\n var scotlandId = constantUtils.findConstantValue(constants.epcCountries, 'Scotland');\r\n if (efficiencyModel.epcCountry === scotlandId) {\r\n efficiencyRequestParams.epcType = efficiencyModel.epcType;\r\n }\r\n else {\r\n efficiencyRequestParams.epcType = constantUtils.findConstantValue(constants.epcTypes, 'NotApplicable');\r\n }\r\n efficiencyRequestParams.epcTypeName = constantUtils.findConstantName(constants.epcTypes, efficiencyRequestParams.epcType);\r\n }\r\n\r\n return efficiencyRequestParams;\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('ExtensionController', ExtensionController);\r\n\r\n function ExtensionController(extensionStorageService, dataService, $stateParams) {\r\n var vm = this;\r\n\r\n vm.loadWizard = function () {\r\n return dataService.fetchDataFromEndpoint('installation/' + $stateParams.installationId)\r\n .then(setInstallationExtensionData);\r\n };\r\n\r\n function setInstallationExtensionData(data) {\r\n var existingInstallationDetails = extensionStorageService.getExistingDetailsModel();\r\n if (data.id !== existingInstallationDetails.installationId) {\r\n extensionStorageService.clear();\r\n }\r\n\r\n\r\n var latestCapacity = _(data.installationCapacities)\r\n .orderBy(function (capacity) { return capacity.extensionReferenceNumber; })\r\n .head();\r\n\r\n var meters = _.flatMap(data.installationCapacities, function(capacity) {\r\n return capacity.meters;\r\n });\r\n\r\n extensionStorageService.saveExistingDetailsModel({\r\n address: {\r\n postcode: 'NW5 1TL',\r\n addressLine1: '1 house street',\r\n gridReference: 'OS-4567'\r\n },\r\n installationId: data.id,\r\n name: data.name,\r\n fitId: data.fitId,\r\n applicationDate: data.applicationDate,\r\n lastCommissioningDate: data.lastCommissioningDate,\r\n technologyType: data.technologyType,\r\n technologyTypeName: data.technologyTypeName,\r\n installType: latestCapacity.installTypeId,\r\n installTypeName: latestCapacity.installTypeName,\r\n latestAccreditationNumber: latestCapacity.accreditationNumber,\r\n exportStatus: data.exportStatus,\r\n exportStatusName: data.exportStatusName,\r\n totalInstalledCapacity: data.totalInstalledCapacity,\r\n totalDeclaredCapacity: data.totalNetCapacity,\r\n gridConnected: data.gridConnected,\r\n epcCountry: data.epcCountry,\r\n epcType: data.epcType,\r\n isMultiSite: data.multipleSiteGeneratorAnswer || data.multipleSiteNominatedRecipientAnswer,\r\n preRegistrationDate: data.preRegistrationDate,\r\n communityType: data.communityType,\r\n existingMeters: meters\r\n });\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationSearchFormController', InstallationSearchFormController);\r\n\r\n\r\n function InstallationSearchFormController() {\r\n var vm = this;\r\n var tableCtrl = null;\r\n\r\n vm.init = init;\r\n vm.search = search;\r\n\r\n function init(stTable) {\r\n vm.formFields = getFilterFormFields();\r\n tableCtrl = stTable;\r\n }\r\n\r\n function search(filter) {\r\n tableCtrl.refreshFilter(filter);\r\n }\r\n\r\n function getFilterFormFields() {\r\n var nameFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'fitId',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'FIT ID',\r\n maxlength: 30,\r\n required: false\r\n }\r\n }\r\n ];\r\n\r\n if (vm.includeAccreditationNumber) {\r\n nameFields.push({\r\n className: 'col-md-3',\r\n key: 'accreditationNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Accreditation number',\r\n maxlength: 50,\r\n required: false\r\n }\r\n });\r\n }\r\n nameFields.push({\r\n className: 'col-md-3',\r\n key: 'osGridReference',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'OS grid reference',\r\n maxlength: 50,\r\n required: false\r\n }\r\n });\r\n\r\n var adressSearch = [\r\n {\r\n className: 'col-md-3',\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 50,\r\n label: 'Postcode'\r\n }\r\n },\r\n // Note: This will display an address dropdown, selecting which will add\r\n // selected address info to the search model, regardless of form field existence\r\n {\r\n className: 'col-md-9 simulate-label',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n populateFromModel: true\r\n }\r\n }\r\n ];\r\n\r\n var recipientFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'generatorId',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Generator ID',\r\n maxlength: 30,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'generatorName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Generator name',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'nominatedRecipientId',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Nominated Recipient ID',\r\n maxlength: 30,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'nominatedRecipientName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Nominated Recipient name',\r\n maxlength: 50,\r\n required: false\r\n }\r\n }\r\n ];\r\n\r\n var extraFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'epcCertificateNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'EPC number',\r\n maxlength: 24,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'mpan',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'MPAN',\r\n maxlength: 20,\r\n required: false\r\n }\r\n }\r\n ];\r\n\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: nameFields\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: adressSearch\r\n }\r\n ];\r\n if (vm.includeRecipientFields) {\r\n // Add as third row\r\n fields.push({\r\n className: 'row',\r\n fieldGroup: recipientFields\r\n });\r\n }\r\n if (vm.includeExtendedFields) {\r\n fields.push({\r\n className: 'row',\r\n fieldGroup: extraFields\r\n });\r\n }\r\n return fields;\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .directive('installationSearchForm', installationSearchFormDirective);\r\n\r\n function installationSearchFormDirective() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/installations/forms/installation-search-form.html',\r\n scope: {\r\n includeRecipientFields: '<',\r\n includeAccreditationNumber: '<',\r\n includeExtendedFields: '<',\r\n persistantFieldsKey: ' 0;\r\n\r\n return isPhotovoltaic\r\n && totalCapacityWithinCutoff\r\n && cutoffDateAfterComprehensiveReviewDate1A\r\n && isMultinstallationInstallType;\r\n }\r\n\r\n function shouldCommunityQuestions(applicationDate, commissioningDate, installedCapacity,\r\n technologyType, installType) {\r\n return shouldShowPreRulesChangeCommunityQuestions(applicationDate, commissioningDate,\r\n installedCapacity, technologyType, installType)\r\n || shouldShowPostRulesChangeCommunityQuestions(applicationDate, commissioningDate);\r\n }\r\n\r\n function shouldShowPreRulesChangeCommunityQuestionsFromRegistrationModels(basicsModel, techModel) {\r\n return shouldShowPreRulesChangeCommunityQuestions(\r\n techModel.applicationDate,\r\n techModel.commissioningDate,\r\n basicsModel.installedCapacity,\r\n techModel.technologyType,\r\n getPvInstallType(techModel));\r\n }\r\n\r\n function shouldShowPreRulesChangeCommunityQuestions(applicationDate, commissioningDate, installedCapacity,\r\n technologyType, installType) {\r\n var comprehensiveReviewPhase2BLiveDate = constants.fitConstants.fitComprehensiveReviewPhase2BLiveDate;\r\n var tariffLookupDate = moment(eligibilityDateService.getPreTariffLookupDate(applicationDate, commissioningDate));\r\n var cutoffAfterCompRevPhase2BLiveDate = tariffLookupDate.isSameOrAfter(comprehensiveReviewPhase2BLiveDate);\r\n\r\n if (cutoffAfterCompRevPhase2BLiveDate && installedCapacity && technologyType && installType) {\r\n return isPVAndCapacityWithinCutoffAndNotStandalone(installedCapacity, technologyType, installType);\r\n }\r\n return false;\r\n }\r\n\r\n function shouldShowPostRulesChangeCommunityQuestionsFromRegistrationModels(techModel) {\r\n if (!techModel) {\r\n return false;\r\n }\r\n\r\n return shouldShowPostRulesChangeCommunityQuestions(\r\n techModel.applicationDate,\r\n techModel.commissioningDate);\r\n }\r\n\r\n function shouldShowPostRulesChangeCommunityQuestions(applicationDate, commissioningDate) {\r\n\r\n var rulesChangeDate = constants.fitConstants.communitiesAndSchoolsRuleChangeDate;\r\n var tariffLookupDate = moment(eligibilityDateService.getPreTariffLookupDate(applicationDate, commissioningDate));\r\n\r\n return tariffLookupDate.isSameOrAfter(rulesChangeDate);\r\n }\r\n\r\n function shouldShowEfficiencyQuestions(installedCapacity, technologyType, applicationDate, commissioningDate, installType) {\r\n var comprehensiveReviewPhase1ALiveDate = constants.fitConstants.fitComprehensiveReviewPhase1ALiveDate;\r\n var tariffLookupDate = moment(eligibilityDateService.getPreTariffLookupDate(applicationDate, commissioningDate));\r\n\r\n var cutoffAfterCompRevPhase1ALiveDate = tariffLookupDate.isSameOrAfter(comprehensiveReviewPhase1ALiveDate);\r\n\r\n if (cutoffAfterCompRevPhase1ALiveDate && angular.isDefined(installedCapacity) && angular.isDefined(technologyType)) {\r\n return isPVAndCapacityWithinCutoffAndNotStandalone(installedCapacity, technologyType, installType);\r\n }\r\n return false;\r\n }\r\n\r\n function shouldUseApplicationDateTime(accreditationType) {\r\n return accreditationType === constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit');\r\n }\r\n\r\n function isPVAndCapacityWithinCutoffAndNotStandalone(installedCapacity, technologyType, installType) {\r\n // This may seem like a very specific case, but it is used frequently for working out\r\n // whether or not we should be showing certain pages.\r\n var isPhotovoltaic = technologyType === constantUtils.findConstantValue(constants.technologyTypes, 'Photovoltaic');\r\n var totalCapacityWithinCutoff =\r\n installedCapacity <= constants.fitConstants.comprehensiveReviewCapacityCutoff;\r\n var isNotStandalone = _.includes(\r\n getNonStandalonePvInstallTypes(),\r\n installType);\r\n\r\n return isPhotovoltaic\r\n && totalCapacityWithinCutoff\r\n && isNotStandalone;\r\n }\r\n\r\n function getPvInstallType(techModel) {\r\n if (angular.isUndefined(techModel)) {\r\n return 1; // not applicable\r\n }\r\n return getPvInstallTypeFromTechnologyAndInstallTypes(techModel.technologyType, techModel.installType);\r\n }\r\n\r\n function getPvInstallTypeFromTechnologyAndInstallTypes(technologyType, installType) {\r\n if (requiresInstallType(technologyType)) {\r\n return installType;\r\n }\r\n return 1; // Default to 1 (Non-applicable)\r\n }\r\n\r\n function getPvInstallTypeForExtension(totalInstalledCapacity, existingDetails) {\r\n var retrofitId = constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'Retrofit');\r\n var newBuildId = constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'NewBuild');\r\n var standardId = constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'Standard');\r\n\r\n if ((existingDetails.installType === retrofitId || existingDetails.installType === newBuildId)\r\n && totalInstalledCapacity > constants.fitConstants.pvCapacityTypeCutoff)\r\n {\r\n return standardId;\r\n }\r\n return existingDetails.installType;\r\n }\r\n\r\n function getNonStandalonePvInstallTypes() {\r\n return [\r\n constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'Retrofit'),\r\n constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'NewBuild'),\r\n constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'Standard')\r\n ];\r\n }\r\n\r\n function shouldShowMultiSiteText(multiSiteAnswer, installationCount, isEdit) {\r\n var isOverCount = isEdit\r\n ? installationCount > constants.fitConstants.multiSiteLimit\r\n : installationCount >= constants.fitConstants.multiSiteLimit;\r\n\r\n\r\n return isOverCount\r\n && angular.isDefined(multiSiteAnswer)\r\n && !multiSiteAnswer;\r\n }\r\n\r\n function shouldShowCommunityReference(communityType) {\r\n var communityEnergyId = constantUtils.findConstantValue(constants.communityTypes, 'CommunityEnergy');\r\n var communitySiteExemptionId = constantUtils.findConstantValue(constants.communityTypes, 'CommunityEnergySiteExemptionOnly');\r\n var schoolId = constantUtils.findConstantValue(constants.communityTypes, 'School');\r\n\r\n return communityType === communityEnergyId\r\n || communityType === communitySiteExemptionId\r\n || communityType === schoolId;\r\n }\r\n\r\n function shouldShowPreRegistrationDate(communityType, totalInstalledCapacity) {\r\n var communityEnergyId = constantUtils.findConstantValue(constants.communityTypes, 'CommunityEnergy');\r\n var schoolId = constantUtils.findConstantValue(constants.communityTypes, 'School');\r\n\r\n return totalInstalledCapacity <= constants.fitConstants.mcsDeclaredCapacityLimitKilowatts\r\n && (communityType === communityEnergyId\r\n || communityType === schoolId);\r\n }\r\n\r\n function getCurrentCommunityType(basicDetailsModel, technologyModel) {\r\n var defaultCommunityTypeId = constantUtils.findConstantValue(constants.communityTypes, 'NotCommunityOrSchool');\r\n\r\n if (shouldShowPreRulesChangeCommunityQuestionsFromRegistrationModels(basicDetailsModel, technologyModel)\r\n || shouldShowPostRulesChangeCommunityQuestionsFromRegistrationModels(technologyModel)) {\r\n return technologyModel.communityType;\r\n }\r\n return defaultCommunityTypeId;\r\n }\r\n\r\n function getAccreditationNumber(accreditationModel) {\r\n if (accreditationModel.accreditationType === constantUtils.findConstantValue(constants.accreditationTypes, 'MCS')) {\r\n return accreditationModel.mcsAccreditationNumber;\r\n }\r\n else if (accreditationModel.accreditationType === constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit')) {\r\n return accreditationModel.rooFitAccreditationNumber;\r\n }\r\n return accreditationModel.roAccreditationNumber;\r\n }\r\n\r\n function getTotalInstalledCapacity(installedCapacity, existingCapacity) {\r\n installedCapacity = parseFloat(installedCapacity);\r\n if (isNaN(installedCapacity)) {\r\n installedCapacity = 0;\r\n }\r\n existingCapacity = parseFloat(existingCapacity);\r\n if (isNaN(existingCapacity)) {\r\n existingCapacity = 0;\r\n }\r\n\r\n return installedCapacity + parseFloat(existingCapacity);\r\n }\r\n\r\n function expectingGridReference(addressModel) {\r\n return addressModel.addressSource === constantUtils.findConstantValue(constants.addressSources, 'NewAddress')\r\n && addressModel.newAddressType === 'byGridReference';\r\n }\r\n\r\n function getCurrentAddress(addressModel, generator, nominatedRecipient) {\r\n var fromGenerator = constantUtils.findConstantValue(constants.addressSources, 'FromGenerator');\r\n var fromRecipient = constantUtils.findConstantValue(constants.addressSources, 'FromRecipient');\r\n var newAddress = constantUtils.findConstantValue(constants.addressSources, 'NewAddress');\r\n\r\n if (addressModel.addressSource === fromGenerator) {\r\n return generator.address;\r\n } else if (addressModel.addressSource === fromRecipient) {\r\n return nominatedRecipient.address;\r\n } else if (addressModel.addressSource === newAddress) {\r\n if (addressModel.newAddressType === 'byGridReference') {\r\n throw new Error('Expected an address but found a grid reference.');\r\n } else if (addressModel.newAddressType === 'byPostcode') {\r\n var copyValues = ['addressLine1', 'addressLine2', 'town', 'county', 'country', 'postcode'];\r\n return objectUtils.copy(addressModel, copyValues);\r\n } else {\r\n throw new Error('Unknown address type: ' + addressModel.newAddressType);\r\n }\r\n } else {\r\n throw new Error('Unknown address source: ' + addressModel.addressSource);\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSearchController', InstallationsSearchController);\r\n\r\n\r\n function InstallationsSearchController(paginatedDataService, installationsValidationHelper) {\r\n var vm = this;\r\n\r\n vm.fetchData = function (tableData) {\r\n return paginatedDataService.checkFieldPrefixesAndFetchData('installation', tableData, vm.idPrefixChecks);\r\n };\r\n\r\n vm.idPrefixChecks = installationsValidationHelper.getIdPrefixChecksForFiltering();\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'installationId',\r\n sortId: 'fitId',\r\n label: 'FIT ID',\r\n type: 'conditional',\r\n sort: true,\r\n condition: installationIsAvailable,\r\n states: {\r\n true: {\r\n id: 'installationId',\r\n displayProperty: 'fitId',\r\n type: 'link',\r\n newStateIdProperty: 'installationId',\r\n state: 'installations-search#installation-details'\r\n },\r\n false: {\r\n id: 'fitId'\r\n }\r\n }\r\n },\r\n {\r\n id: 'addressLine1',\r\n label: 'Address line 1',\r\n sort: true\r\n },\r\n {\r\n id: 'postcode',\r\n label: 'Postcode',\r\n sort: true\r\n },\r\n {\r\n id: 'generatorName',\r\n label: 'Generator name',\r\n sort: true\r\n },\r\n {\r\n id: 'technologyType',\r\n label: 'Technology type',\r\n sort: true\r\n },\r\n {\r\n id: 'accreditationNumber',\r\n label: 'Accreditation number',\r\n sort: true\r\n },\r\n {\r\n id: 'eligibilityDate',\r\n label: 'Eligibility date',\r\n type: 'date',\r\n sort: true\r\n }\r\n ];\r\n\r\n function installationIsAvailable(data) {\r\n return data.installationIsAvailable;\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager, installationsRoutingHelper) {\r\n routeManager.addStates([\r\n {\r\n state: 'installations',\r\n config: {\r\n url: '/installations',\r\n title: 'Register Installation',\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/installations.html'\r\n },\r\n 'licences@installations': {\r\n templateUrl: 'app/installations/licences/installations-licences.html',\r\n controller: 'InstallationLicencesController',\r\n controllerAs: 'vm'\r\n },\r\n 'generators@installations': {\r\n templateUrl: 'app/installations/generators/installations-generators.html',\r\n controller: 'InstallationGeneratorsController',\r\n controllerAs: 'vm'\r\n },\r\n 'recipient@installations': {\r\n templateUrl: 'app/installations/recipient/installations-recipient.html',\r\n controller: 'InstallationRecipientController',\r\n controllerAs: 'vm'\r\n },\r\n 'address@installations': {\r\n templateUrl: 'app/installations/address/installations-address.html',\r\n controller: 'InstallationAddressController',\r\n controllerAs: 'vm'\r\n },\r\n 'basicDetails@installations': {\r\n templateUrl: 'app/installations/basicDetails/installations-basics.html',\r\n controller: 'InstallationBasicsController',\r\n controllerAs: 'vm'\r\n },\r\n 'technology@installations': {\r\n templateUrl: 'app/installations/technology/installations-technology.html',\r\n controller: 'InstallationTechnologyController',\r\n controllerAs: 'vm'\r\n },\r\n 'multiInstallations@installations': {\r\n templateUrl: 'app/installations/multiSite/installations-multiSite.html',\r\n controller: 'InstallationMultiSiteController',\r\n controllerAs: 'vm'\r\n },\r\n 'efficiency@installations': {\r\n templateUrl: 'app/installations/efficiency/installations-efficiency.html',\r\n controller: 'InstallationEfficiencyController',\r\n controllerAs: 'vm'\r\n },\r\n 'meterInfo@installations': {\r\n templateUrl: 'app/installations/meterInfo/installations-meters.html',\r\n controller: 'InstallationsMeterInfoController',\r\n controllerAs: 'vm'\r\n },\r\n 'submission@installations': {\r\n templateUrl: 'app/installations/submission/installations-submission.html',\r\n controller: 'InstallationSubmissionController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalCreateInstallation']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations#create-generator',\r\n config: {\r\n url: '/installations/createGenerator',\r\n parent: 'installations',\r\n params: {\r\n recipientDefaults: null\r\n },\r\n views: {\r\n 'generators@installations': {\r\n templateUrl: 'app/installations/generators/installations-create-generator.html',\r\n controller: 'InstallationCreateGeneratorController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations#createNominatedRecipient',\r\n config: {\r\n url: '/installations/createNominatedRecipient',\r\n parent: 'installations',\r\n params: {\r\n companyNumber: null,\r\n postcode: null,\r\n addressLine1: null,\r\n addressLine2: null,\r\n town: null,\r\n county: null,\r\n country: null\r\n },\r\n views: {\r\n 'recipient@installations': {\r\n templateUrl: 'app/installations/recipient/installations-create-recipient.html',\r\n controller: 'InstallationCreateRecipientController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installationLanding',\r\n config: {\r\n templateUrl: 'app/installations/landing/installations-landing.html',\r\n controller: 'InstallationLandingController',\r\n controllerAs: 'vm',\r\n title: 'Installation complete',\r\n url: '/installations/landing',\r\n params: {\r\n installationResponse: null\r\n }\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalCreateInstallation']\r\n }\r\n }\r\n },\r\n {\r\n state: 'installationNoTariff',\r\n config: {\r\n templateUrl: 'app/installations/tariff/installations-noTariff.html',\r\n title: 'Tariff Not Found',\r\n url: '/installations/noTariff'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalCreateInstallation', 'ExternalEditInstallation', 'FitGroup']\r\n }\r\n }\r\n },\r\n {\r\n state: 'installationTariffBreached',\r\n config: {\r\n templateUrl: 'app/installations/tariff/installations-breachedTariff.html',\r\n title: 'Breached tariff',\r\n url: '/installations/breachedTariff'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalCreateInstallation', 'ExternalEditInstallation', 'FitGroup']\r\n }\r\n }\r\n },\r\n {\r\n state: 'installationRegistrationFitClosureError',\r\n config: {\r\n templateUrl: 'app/installations/tariff/installations-registration-fitClosure-error.html',\r\n title: 'FIT Closure In Effect - Registration',\r\n url: '/installations/registrationNoTariffFitClosureError'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalCreateInstallation', 'ExternalEditInstallation', 'FitGroup']\r\n }\r\n }\r\n },\r\n {\r\n state: 'installationEditFitClosureError',\r\n config: {\r\n templateUrl: 'app/installations/tariff/installations-edit-fitClosure-error.html',\r\n title: 'FIT Closure In Effect - Edit',\r\n url: '/installations/editNoTariffFitClosureError'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalCreateInstallation', 'ExternalEditInstallation', 'FitGroup']\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-search',\r\n config: {\r\n\r\n title: 'Installation Search',\r\n url: '/installations/search',\r\n data: {\r\n permissions: {\r\n only: ['Internal', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: {\r\n '': {\r\n template: '
    '\r\n },\r\n 'display@installations-search': {\r\n templateUrl: 'app/installations/installations-navigation.html'\r\n },\r\n 'search@installations-search': {\r\n templateUrl: 'app/installations/installations-search-table.html',\r\n controller: 'InstallationsSearchController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installation-details#uploadDocument',\r\n config: {\r\n title: 'Installation document upload',\r\n parent: 'installation-details',\r\n url: '/documents/upload',\r\n data: {\r\n permissions: {\r\n only: ['Internal', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: {\r\n 'documents@installation-details': {\r\n templateUrl: 'app/installations/installation/installation-document-upload.html',\r\n controller: 'InstallationDocumentUploadController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-fit-terms',\r\n config: {\r\n title: 'Installations Fit Terms',\r\n url: '/installations/fitTerms',\r\n params: {\r\n pageTitle: 'Installations - Update FIT terms agreed dates'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/installations-navigation.html'\r\n },\r\n 'search@installations-fit-terms': {\r\n templateUrl: 'app/installations/dateUpdates/installations-dates-find.html',\r\n controller: 'InstallationsDatesFindController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-fit-terms#edit',\r\n config: {\r\n title: 'Installations Fit Terms Update',\r\n parent: 'installations-fit-terms',\r\n url: '/update/{id}',\r\n params: {\r\n dateElement: {\r\n key: 'fitTermsAgreedDate',\r\n endpoint: 'fitTerms',\r\n label: 'FIT terms agreed date',\r\n required: true\r\n }\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: {\r\n 'search@installations-fit-terms': {\r\n templateUrl: 'app/installations/dateUpdates/installations-dates-edit.html',\r\n controller: 'InstallationsDatesEditController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-meter-inspection',\r\n config: {\r\n title: 'Installations Meter Inspection',\r\n url: '/installations/meterInspection',\r\n params: {\r\n pageTitle: 'Installations - Update meter inspection dates'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/installations-navigation.html'\r\n },\r\n 'search@installations-meter-inspection': {\r\n templateUrl: 'app/installations/dateUpdates/installations-dates-find.html',\r\n controller: 'InstallationsDatesFindController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-meter-inspection#edit',\r\n config: {\r\n title: 'Installations Meter Inspection Update',\r\n parent: 'installations-meter-inspection',\r\n url: '/update/{id}',\r\n params: {\r\n dateElement: {\r\n key: 'meterInspectionDate',\r\n endpoint: 'meterInspection',\r\n label: 'Meter inspection date',\r\n required: false\r\n }\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: {\r\n 'search@installations-meter-inspection': {\r\n templateUrl: 'app/installations/dateUpdates/installations-dates-edit.html',\r\n controller: 'InstallationsDatesEditController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-status-csv',\r\n config: {\r\n title: 'Import installations status csv',\r\n url: '/installations/status/csv',\r\n params: {\r\n action: 'installationstatuscsv'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/installations-navigation.html'\r\n },\r\n\r\n 'search@installations-status-csv': {\r\n templateUrl: 'app/installations/common/installations-csvimport.html',\r\n controller: 'InstallationsCsvImportController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-search',\r\n config: {\r\n title: 'Switching',\r\n url: '/installations/switching',\r\n params: {\r\n pageTitle: 'Installations - Search switching'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalSwitching']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/switching/installations-switch-navigation.html'\r\n },\r\n 'display@installations-switch-search': {\r\n templateUrl: 'app/installations/switching/installations-switch-search.html',\r\n controller: 'InstallationsSwitchSearchController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-pending',\r\n config: {\r\n title: 'Switching',\r\n url: '/installations/switching/pending',\r\n params: {\r\n pageTitle: 'Installations - Pending switch requests',\r\n action: 'pending'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalSwitching']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/switching/installations-switch-navigation.html'\r\n },\r\n 'display@installations-switch-pending': {\r\n templateUrl: 'app/installations/switching/installations-switch-pending.html',\r\n controller: 'InstallationsSwitchPendingController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-raised',\r\n config: {\r\n title: 'Switching',\r\n url: '/installations/switching/raised',\r\n params: {\r\n pageTitle: 'Installations - Raised switch requests',\r\n action: 'raisedRequests'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalSwitching']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/switching/installations-switch-navigation.html'\r\n },\r\n 'display@installations-switch-raised': {\r\n templateUrl: 'app/installations/switching/installations-switch-pending.html',\r\n controller: 'InstallationsSwitchPendingController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-request',\r\n config: {\r\n title: 'Perform switching',\r\n url: '/installation/switchingRequest/{installationId}',\r\n templateUrl: 'app/installations/switching/installations-switch-request.html',\r\n controller: 'InstallationsSwitchRequestController',\r\n controllerAs: 'vm',\r\n params: {\r\n installationId: null\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalSwitching']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-completeswitch',\r\n config: {\r\n title: 'Complete switching',\r\n url: '/installation/switchingComplete/{switchId}',\r\n templateUrl: 'app/installations/switching/completeSwitch/installations-switch-complete.html',\r\n controller: 'InstallationsSwitchCompleteController',\r\n controllerAs: 'vm',\r\n params: {\r\n switchId: null\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalSwitching']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'approve-installation',\r\n config: {\r\n title: 'Approve installation',\r\n url: '/installation/approve',\r\n params: {\r\n installationAmendmentId: null,\r\n capacityId: null,\r\n supplierId: null,\r\n assigneeName: null\r\n },\r\n data: {\r\n permissions: {\r\n only: ['Internal', 'ExternalCreateInstallation']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/approvals/approve-installation.html',\r\n controller: 'ApproveInstallationController',\r\n controllerAs: 'vm'\r\n },\r\n 'approval-documents@approve-installation': {\r\n templateUrl: 'app/installations/installation/installation-approval-documents.html'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-internal',\r\n config: {\r\n title: 'Switching',\r\n url: '/installation/switching/internal',\r\n params: {\r\n action: 'internal'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/switching/installations-switch-navigation.html'\r\n },\r\n 'display@installations-switch-internal': {\r\n templateUrl: 'app/installations/switching/installations-switch-pending.html',\r\n controller: 'InstallationsSwitchPendingController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installations-switch-upload',\r\n config: {\r\n title: 'Switching',\r\n url: '/installation/switching/internal/upload',\r\n params: {\r\n action: 'switchcsv'\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/installations/switching/installations-switch-navigation.html'\r\n },\r\n 'display@installations-switch-upload': {\r\n templateUrl: 'app/installations/common/installations-csvimport.html',\r\n controller: 'InstallationsCsvImportController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'installationSwitchHistory',\r\n config: {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm',\r\n params: {\r\n returnState: null,\r\n entityType: 'InstallationSwitch',\r\n endpoint: 'InstallationSwitch'\r\n },\r\n title: 'Installation switch history',\r\n url: '/installationSwitch/history/{id}/{name}',\r\n data: {\r\n permissions: {\r\n only: ['FitGroup']\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n routeManager.addStates(installationsRoutingHelper.getInstallationDetailsStates('installations-search', 'installations-search', true));\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationLandingController', InstallationLandingController);\r\n\r\n function InstallationLandingController($stateParams, dataLayoutService) {\r\n var vm = this;\r\n vm.installation = $stateParams.installationResponse.installation;\r\n vm.pendingApproval = $stateParams.installationResponse.pendingApproval;\r\n vm.approvalReasons = $stateParams.installationResponse.approvalReasons;\r\n vm.documents = $stateParams.installationResponse.documents;\r\n vm.layouts = {\r\n installation: dataLayoutService.getLayout('installation'),\r\n installationCapacity: dataLayoutService.getLayout('installationCapacity'),\r\n tariff: dataLayoutService.getLayout('tariff'),\r\n recipient: dataLayoutService.getLayout('recipient'),\r\n approvalDocument: dataLayoutService.getLayout('documentsUploaded')\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationLicencesController', InstallationLicencesController);\r\n\r\n function InstallationLicencesController(WizardHandler, installationStorageService, installationAccreditationService,\r\n arrayUtils, installationDetailsService, principal) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n vm.storage = installationStorageService;\r\n\r\n vm.model = installationStorageService.getLicenceModel();\r\n\r\n vm.next = next;\r\n vm.foundMatch = false;\r\n\r\n function next() {\r\n vm.foundMatch = false;\r\n return installationAccreditationService.validateAccreditationAvailability(vm.model)\r\n .then(moveToNextPageOrDisplayUniquenessError);\r\n }\r\n\r\n function moveToNextPageOrDisplayUniquenessError(isUnique) {\r\n if (isUnique) {\r\n saveAndMoveToNextPage();\r\n return;\r\n }\r\n vm.foundMatch = true;\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n installationStorageService.saveLicenceModel(vm.model);\r\n WizardHandler.wizard().next();\r\n }\r\n\r\n var accreditationFields = installationAccreditationService.getAccreditationFields(true);\r\n var supplierId = principal.supplierId();\r\n if (supplierId) {\r\n var licenceFields = installationDetailsService.getLicenceFields(supplierId);\r\n var typeField = arrayUtils.findByProp(accreditationFields, 'key', 'accreditationType');\r\n typeField.hideExpression = '!model.licenceId';\r\n vm.fields = licenceFields.concat(accreditationFields);\r\n } else {\r\n vm.fields = accreditationFields;\r\n }\r\n };\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.installations')\r\n .component('displayMeters', {\r\n templateUrl: 'app/installations/meterInfo/display-meters.html',\r\n bindings: {\r\n meters: '<',\r\n gridConnected: '<',\r\n showHistoryButton: '<',\r\n historyReturnState: ' 0) {\r\n // We will only find exact matches if we have similar \r\n // nominated recipients!\r\n vm.foundExactMatchesWithCurrentSearch = true;\r\n showExactMatchNominatedRecipients(matchResult.exactMatchIds);\r\n } else {\r\n vm.showExactMatchTable = false;\r\n }\r\n\r\n // We only show similar nominated recipients that are not being shown in the exact match table.\r\n var nonExactMatchIds = _.difference(matchResult.similarRecipientIds, matchResult.exactMatchIds);\r\n if (nonExactMatchIds.length > 0) {\r\n vm.foundSimilarRecipientsWithCurrentSearch = true;\r\n showSimilarNominatedRecipients(nonExactMatchIds);\r\n } else {\r\n vm.showSimilarRecipientTable = false;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function showExactMatchNominatedRecipients(ids) {\r\n vm.showExactMatchTable = true;\r\n vm.exactMatchSearchObject = {\r\n id: ids,\r\n mode: 'exact'\r\n };\r\n }\r\n\r\n function showSimilarNominatedRecipients(ids) {\r\n vm.showSimilarRecipientTable = true;\r\n vm.similarRecipientSearchObject = {\r\n id: ids,\r\n mode: 'exact'\r\n };\r\n }\r\n\r\n function getSimplifiedNominatedRecipient(nominatedRecipientModel) {\r\n var nominatedRecipient = objectUtils.copy(nominatedRecipientModel,\r\n ['title', 'firstName', 'lastName', 'emailAddress', 'companyNumber', 'companyName']);\r\n\r\n var nominatedRecipientAddress = objectUtils.copy(nominatedRecipientModel, [\r\n 'postcode', 'addressLine1', 'addressLine2', 'town', 'county', 'country']);\r\n\r\n nominatedRecipient.address = nominatedRecipientAddress;\r\n return nominatedRecipient;\r\n }\r\n\r\n function getChangeHandler() {\r\n return {\r\n listener: function (field, newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n vm.foundExactMatchesWithCurrentSearch = false;\r\n vm.foundSimilarRecipientsWithCurrentSearch = false;\r\n }\r\n }\r\n };\r\n }\r\n\r\n vm.fields = [\r\n {\r\n key: 'title',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Title:',\r\n maxlength: 10,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'firstName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'First name:',\r\n maxlength: 50,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'lastName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Last name:',\r\n maxlength: 50,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'emailAddress',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Email address:',\r\n maxlength: 256,\r\n type: 'email'\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'companyName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company name:',\r\n maxlength: 60\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'companyNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company number:',\r\n maxlength: 50\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Postcode:',\r\n maxlength: 50,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'address',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n label: 'Address:',\r\n populateFromModel: true,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n }\r\n ];\r\n\r\n\r\n function setDataFromState() {\r\n var model = {};\r\n var inputParams = $state.params;\r\n\r\n if (inputParams.companyNumber) {\r\n model.companyNumber = inputParams.companyNumber;\r\n }\r\n if (inputParams.postcode) {\r\n model.postcode = inputParams.postcode;\r\n model.addressLine1 = inputParams.addressLine1;\r\n model.addressLine2 = inputParams.addressLine2;\r\n model.town = inputParams.town;\r\n model.county= inputParams.county;\r\n model.country= inputParams.country;\r\n }\r\n\r\n return model;\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationRecipientController', InstallationRecipientController);\r\n\r\n function InstallationRecipientController($log, WizardHandler, recipientService, dialogService, installationStorageService, dataLayoutService) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.recipientOptions = {\r\n id: 'Nominated Recipient ID',\r\n endpoint: 'nominatedRecipient'\r\n };\r\n vm.model = {};\r\n vm.error = '';\r\n\r\n vm.showTable = false;\r\n vm.showCreateButton = false;\r\n\r\n vm.next = next;\r\n vm.shouldDisableNext = shouldDisableNext;\r\n vm.back = back;\r\n\r\n vm.getById = getById;\r\n vm.getByCompanyNumber = getByCompanyNumber;\r\n vm.getByAddress = getByAddress;\r\n vm.showNominatedRecipient = showNominatedRecipient;\r\n vm.nominatedRecipientRequired = nominatedRecipientRequired;\r\n\r\n vm.recipientLayout = dataLayoutService.getLayout('recipient');\r\n\r\n function next() {\r\n installationStorageService.saveNominatedRecipient(vm.nominatedRecipient);\r\n installationStorageService.saveNominatedRecipientModel(vm.model);\r\n clearError();\r\n WizardHandler.wizard().next();\r\n }\r\n\r\n function shouldDisableNext() {\r\n if (vm.model.recipientType === 'generator') {\r\n return false;\r\n }\r\n return !vm.model.nominatedRecipientChosen;\r\n }\r\n\r\n function back() {\r\n clearError();\r\n WizardHandler.wizard().previous();\r\n }\r\n\r\n function setError(message, overrideMessage) {\r\n if (message !== 'Cancelled' && message !== 'backdrop click') {\r\n vm.error = overrideMessage || message;\r\n $log.warn('API request failed:', message);\r\n }\r\n }\r\n\r\n function clearError() {\r\n vm.showTable = false;\r\n vm.showCreateButton = false;\r\n vm.error = '';\r\n }\r\n\r\n function nominatedRecipientRequired() {\r\n return vm.model.recipientType === 'nominatedRecipient';\r\n }\r\n\r\n function showNominatedRecipient(nominatedRecipient) {\r\n dialogService.showDialog({\r\n title: 'Confirm nominated recipient selection',\r\n message: false,\r\n size: 'lg',\r\n customBodyUrl: 'app/installations/recipient/select-nominated-recipient.html',\r\n customBodyModel: {\r\n data: nominatedRecipient,\r\n layout: vm.recipientLayout\r\n }\r\n }).then(function () {\r\n vm.nominatedRecipient = nominatedRecipient;\r\n vm.model.nominatedRecipientChosen = true;\r\n next();\r\n });\r\n }\r\n\r\n function getById() {\r\n vm.showTable = false;\r\n recipientService.getById(vm.model.nominatedRecipientId, 'nominatedRecipient').then(function (nominatedRecipient) {\r\n showNominatedRecipient(nominatedRecipient);\r\n }).catch(function (reason) {\r\n if (reason.foundNoEntities) {\r\n vm.showCreateButton = true;\r\n }\r\n setError(reason.message);\r\n });\r\n }\r\n\r\n function getByCompanyNumber() {\r\n vm.showTable = true;\r\n vm.showCreateButton = true;\r\n vm.searchObject = {\r\n companyNumber: vm.model.companyNumber,\r\n mode: 'exact'\r\n };\r\n }\r\n\r\n function getByAddress() {\r\n vm.showTable = true;\r\n vm.showCreateButton = true;\r\n vm.searchObject = {\r\n postcode: vm.model.postcode,\r\n addressLine1: vm.model.addressLine1,\r\n addressLine2: vm.model.addressLine2,\r\n town: vm.model.town,\r\n county: vm.model.county,\r\n country: vm.model.country,\r\n mode: 'exact'\r\n };\r\n }\r\n\r\n vm.fields = [\r\n {\r\n key: 'recipientType',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Will the selected FIT Generator receive FITs payments for this installation?',\r\n required: true,\r\n options: [\r\n {\r\n name: 'Yes',\r\n value: 'generator'\r\n },\r\n {\r\n name: 'No',\r\n value: 'nominatedRecipient'\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'selectType',\r\n type: 'fitRadio',\r\n defaultValue: '',\r\n templateOptions: {\r\n label: 'Please use one of the following options to assign this installation to a ' +\r\n 'previously registered nominated recipient.',\r\n hint: 'Please use \\'Select by address\\' if you wish to register a new nominated recipient ' +\r\n 'for this installation.',\r\n required: true,\r\n options: [\r\n { name: 'Select by ID', value: 'byId' },\r\n { name: 'Select by company number', value: 'byCompanyNumber' },\r\n { name: 'Select by address', value: 'byAddress' }\r\n ]\r\n },\r\n expressionProperties: {\r\n 'templateOptions.onChange': clearError\r\n }\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'nominatedRecipientId',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Please enter existing Nominated Recipient ID:',\r\n required: true,\r\n pattern: '^[N|n][R|r][0-9]{1,8}$',\r\n hint: 'e.g. NR12345678',\r\n patternValidationMessage: 'Invalid nominated recipient ID format'\r\n }\r\n },\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search',\r\n btnType: 'secondary'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.onClick': function () { return getById; },\r\n 'templateOptions.disabled': function () { return !vm.model.nominatedRecipientId; }\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byId\\''\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'companyNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Please enter existing Company Number:',\r\n maxlength: 50,\r\n required: true\r\n }\r\n },\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search',\r\n btnType: 'secondary'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.onClick': function () { return getByCompanyNumber; },\r\n 'templateOptions.disabled': function () { return !vm.model.companyNumber; }\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byCompanyNumber\\''\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Please enter postcode:',\r\n maxLength: 50,\r\n required: true\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byAddress\\''\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'address',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n populateFromModel: true\r\n }\r\n },\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search for recipient',\r\n btnType: 'secondary'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.onClick': function () { return getByAddress; }\r\n },\r\n hideExpression: function () { return !vm.model.postcode || !vm.model.addressLine1; }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byAddress\\''\r\n }\r\n ],\r\n hideExpression: '!model.recipientType || model.recipientType === \\'generator\\''\r\n }\r\n ];\r\n\r\n function getNominatedRecipientFromStorage() {\r\n var nominatedRecipient = installationStorageService.getNominatedRecipient();\r\n if (nominatedRecipient) {\r\n vm.model.nominatedRecipientChosen = true;\r\n vm.nominatedRecipient = nominatedRecipient;\r\n }\r\n }\r\n\r\n function getModelFromStorage() {\r\n var nominatedRecipientModel = installationStorageService.getNominatedRecipientModel();\r\n if (nominatedRecipientModel) {\r\n vm.model = nominatedRecipientModel;\r\n }\r\n }\r\n\r\n getNominatedRecipientFromStorage();\r\n getModelFromStorage();\r\n };\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('RecipientMultiSiteController', RecipientMultiSiteController);\r\n\r\n function RecipientMultiSiteController($q, dataService, multiInstallationService, WizardHandler, recipientReassignmentStorageService, installationWizardService, $stateParams, installationsTariffService) {\r\n var vm = this;\r\n var formState = {};\r\n vm.options = { formState: formState };\r\n vm.model = {};\r\n\r\n installationWizardService.setPageEntryFunction('multiSite', calculateInstallationNumbers);\r\n vm.fields = multiInstallationService.getMultiSiteFields(vm.model, formState, false);\r\n\r\n vm.next = function () {\r\n updateMultisiteAnswersAndFetchTariffs().then(function () {\r\n WizardHandler.wizard().next();\r\n });\r\n };\r\n\r\n function calculateInstallationNumbers() {\r\n var recipientOptions = recipientReassignmentStorageService.getRecipientOptions();\r\n formState.recipientType = recipientOptions.endpoint;\r\n var recipientAddress = recipientReassignmentStorageService.getNewRecipient().address;\r\n var recipientPromise = recipientOptions.name === 'generator'\r\n ? multiInstallationService.setGeneratorInstallationCount(recipientAddress, formState)\r\n : multiInstallationService.setNominatedRecipientInstallationCount(recipientAddress, formState);\r\n return recipientPromise.then(function () {\r\n return true;\r\n });\r\n }\r\n\r\n function updateMultisiteAnswersAndFetchTariffs() {\r\n recipientReassignmentStorageService.setMultiSiteAnswers({\r\n 'nominated recipient': vm.model.multipleSiteNominatedRecipientAnswer,\r\n generator: vm.model.multipleSiteGeneratorAnswer,\r\n nominatedRecipientText: vm.model.multipleSiteNominatedRecipientText,\r\n generatorText: vm.model.multipleSiteGeneratorText\r\n });\r\n\r\n var newMultiSiteAnswer = vm.model.multipleSiteGeneratorAnswer === true || vm.model.multipleSiteNominatedRecipientAnswer === true;\r\n return fetchChangedTariffs(newMultiSiteAnswer).then(saveChangedTariffs, installationsTariffService.catchNoTariffs);\r\n }\r\n\r\n function fetchChangedTariffs(newMultiSiteAnswer) {\r\n return dataService.fetchDataFromEndpoint('installation/'\r\n + $stateParams.installationId\r\n + '/tariff/multiSiteAnswer/'\r\n + newMultiSiteAnswer);\r\n }\r\n\r\n function saveChangedTariffs(changedTariffs) {\r\n recipientReassignmentStorageService.setUpdatedTariffs(changedTariffs);\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .factory('recipientReassignmentStorageService', recipientReassignmentStorageService);\r\n\r\n function recipientReassignmentStorageService() {\r\n var installationReassignmentData = {};\r\n var newRecipient = {};\r\n var recipientOptions = {};\r\n var tariffs = {};\r\n var multiSiteAnswers = {};\r\n\r\n var service = {\r\n setInstallationReassignmentData: setInstallationReassignmentData,\r\n getInstallationReassignmentData: getInstallationReassignmentData,\r\n setMultiSiteAnswers: setMultiSiteAnswers,\r\n getMultiSiteAnswers: getMultiSiteAnswers,\r\n setUpdatedTariffs: setUpdatedTariffs,\r\n getUpdatedTariffs: getUpdatedTariffs,\r\n setNewRecipient: setNewRecipient,\r\n getNewRecipient: getNewRecipient,\r\n setRecipientOptions: setRecipientOptions,\r\n getRecipientOptions: getRecipientOptions,\r\n clear: clear\r\n };\r\n return service;\r\n\r\n function setUpdatedTariffs(updatedTariffs) {\r\n tariffs = updatedTariffs;\r\n }\r\n\r\n function getUpdatedTariffs() {\r\n return tariffs;\r\n }\r\n\r\n function setMultiSiteAnswers(updatedMultiSiteAnswers) {\r\n multiSiteAnswers = updatedMultiSiteAnswers;\r\n }\r\n\r\n function getMultiSiteAnswers() {\r\n return multiSiteAnswers;\r\n }\r\n\r\n function setNewRecipient(updatedNewRecipient) {\r\n newRecipient = updatedNewRecipient;\r\n }\r\n\r\n function getNewRecipient() {\r\n return newRecipient;\r\n }\r\n\r\n function getInstallationReassignmentData() {\r\n return installationReassignmentData;\r\n }\r\n\r\n function setInstallationReassignmentData(updatedInstallationReassignmentData) {\r\n installationReassignmentData = updatedInstallationReassignmentData;\r\n }\r\n\r\n function setRecipientOptions(updatedRecipientOptions) {\r\n recipientOptions = updatedRecipientOptions;\r\n }\r\n\r\n function getRecipientOptions() {\r\n return recipientOptions;\r\n }\r\n\r\n function clear() {\r\n installationReassignmentData = {};\r\n newRecipient = {};\r\n recipientOptions = {};\r\n tariffs = {};\r\n multiSiteAnswers = {};\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('RecipientReassignmentWizardController', RecipientReassignmentWizardController);\r\n\r\n function RecipientReassignmentWizardController(installationWizardService, installationRulesService, dataService, recipientReassignmentStorageService, $state, $stateParams) {\r\n var vm = this;\r\n vm.installationReassignmentData = null;\r\n\r\n vm.canEnterScrollOnly = canEnterScrollOnly;\r\n vm.canEnterMultiSite = canEnterMultiSite;\r\n vm.canEnterSubmission = canEnterSubmission;\r\n vm.multiSiteDisabled = multiSiteDisabled;\r\n vm.installationFitId = null;\r\n\r\n var shouldShowMultiSiteQuestions = true;\r\n\r\n vm.cancel = function() {\r\n $state.go('^');\r\n };\r\n\r\n vm.loadWizard = function () {\r\n vm.recipientOptions = $stateParams.recipientType;\r\n recipientReassignmentStorageService.clear();\r\n recipientReassignmentStorageService.setRecipientOptions(vm.recipientOptions);\r\n return dataService.fetchDataFromEndpoint('installation/' + $stateParams.installationId + '/recipientReassignment')\r\n .then(setInstallationReassignmentData);\r\n };\r\n\r\n function setInstallationReassignmentData(data) {\r\n vm.installationFitId = data.installationFitId;\r\n var basicsModel = {\r\n installedCapacity: data.aggregatedInstalledCapacity\r\n };\r\n var techModel = {\r\n technologyType: data.technologyTypeId,\r\n applicationDate: data.applicationDate,\r\n commissioningDate: data.earliestCommissioningDate,\r\n installTypes: _.map(data.capacityData, 'installTypeId')\r\n };\r\n\r\n shouldShowMultiSiteQuestions = installationRulesService.shouldShowMultiSiteQuestionsFromInstallationModels(\r\n basicsModel, techModel);\r\n recipientReassignmentStorageService.setInstallationReassignmentData(data);\r\n return data;\r\n }\r\n\r\n //TODO: RAS - To be commonised after the wizard rewrite\r\n function canEnterScrollOnly() {\r\n installationWizardService.scrollToTop();\r\n // 'true' required for canenter method on wizard.\r\n return true;\r\n }\r\n\r\n function canEnterMultiSite() {\r\n return installationWizardService.callPageEntryFunction('multiSite').then(function(data) {\r\n return data;\r\n });\r\n }\r\n\r\n function canEnterSubmission() {\r\n return installationWizardService.callPageEntryFunction('submission').then(function (data) {\r\n return data;\r\n });\r\n }\r\n\r\n function multiSiteDisabled() {\r\n return !shouldShowMultiSiteQuestions;\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('RecipientReassignmentCreatorController', RecipientReassignmentCreatorController);\r\n\r\n function RecipientReassignmentCreatorController(WizardHandler, recipientReassignmentStorageService, $state, $stateParams) {\r\n var vm = this;\r\n\r\n vm.save = function(recipient) {\r\n recipientReassignmentStorageService.setNewRecipient(recipient);\r\n $state.go('^');\r\n WizardHandler.wizard().next();\r\n };\r\n\r\n vm.cancel = function() {\r\n $state.go('^');\r\n };\r\n\r\n vm.recipientDefaults = $stateParams.recipientDefaults;\r\n vm.recipientOptions = recipientReassignmentStorageService.getRecipientOptions();\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('RecipientReassignmentSelectorController', RecipientReassignmentSelectorController);\r\n\r\n function RecipientReassignmentSelectorController($state, WizardHandler, recipientReassignmentStorageService) {\r\n var vm = this;\r\n\r\n vm.recipientOptions = recipientReassignmentStorageService.getRecipientOptions();\r\n\r\n var installationReassignmentData = recipientReassignmentStorageService.getInstallationReassignmentData();\r\n vm.currentRecipientId = vm.recipientOptions.name === 'generator'\r\n ? installationReassignmentData.generatorId\r\n : installationReassignmentData.nominatedRecipientId;\r\n\r\n vm.next = function (recipient) {\r\n recipientReassignmentStorageService.setNewRecipient(recipient);\r\n WizardHandler.wizard().next();\r\n };\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('RecipientReassignmentSubmissionController', RecipientReassignmentSubmissionController);\r\n\r\n function RecipientReassignmentSubmissionController($state, constants, dataService, installationRulesService, installationWizardService,\r\n recipientReassignmentStorageService, $stateParams, toastr) {\r\n var vm = this;\r\n\r\n installationWizardService.setPageEntryFunction('submission', function() {\r\n vm.newRecipient = recipientReassignmentStorageService.getNewRecipient();\r\n vm.recipientOptions = recipientReassignmentStorageService.getRecipientOptions();\r\n vm.updatedTariffData = recipientReassignmentStorageService.getUpdatedTariffs();\r\n vm.multiSiteAnswers = recipientReassignmentStorageService.getMultiSiteAnswers();\r\n vm.installationVersion = recipientReassignmentStorageService.getInstallationReassignmentData().__version;\r\n vm.showPreviousMultiSiteAnswers = angular.isDefined(vm.multiSiteAnswers[vm.recipientOptions.name]);\r\n vm.multiSiteAnswersLayout = {\r\n numberOfColumns: 1,\r\n rows: [\r\n {\r\n items: [\r\n {\r\n label: 'Has ' + constants.fitConstants.multiSiteLimit + ' or more sites',\r\n key: vm.recipientOptions.name,\r\n type: 'boolean'\r\n },\r\n {\r\n label: 'Reason',\r\n key: vm.recipientOptions.name + 'Text',\r\n type: 'text',\r\n show: function (text) {\r\n return !!text;\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n vm.updateModel = {\r\n recipient: vm.newRecipient,\r\n newMultiSiteAnswer: vm.multiSiteAnswers[vm.recipientOptions.name],\r\n newMultiSiteText: vm.multiSiteAnswers[vm.recipientOptions.name + 'Text'],\r\n __version: vm.installationVersion\r\n };\r\n dataService.fetchDataFromEndpointWithParams('installation/' + $stateParams.installationId + '/' + vm.recipientOptions.endpoint + '/needsApproval', vm.updateModel)\r\n .then(function(data) {\r\n vm.needsApproval = data;\r\n });\r\n });\r\n\r\n vm.saveRecipient = function() {\r\n var endpoint = 'installation/' + $stateParams.installationId + '/' + vm.recipientOptions.endpoint;\r\n return dataService.patchToEndpoint(endpoint, vm.updateModel)\r\n .then(notifySuccess)\r\n .then(returnToParent);\r\n };\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n\r\n function notifySuccess(data) {\r\n var recipientTypeDisplayName = vm.recipientOptions.name.charAt(0).toUpperCase() + vm.recipientOptions.name.substr(1).toLowerCase();\r\n if (data.data.data.pendingApproval) {\r\n toastr.success(recipientTypeDisplayName + ' reassignment submitted and is pending approval.');\r\n } else {\r\n toastr.success(recipientTypeDisplayName + ' successfully assigned.');\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('RecipientTableController', RecipientTableController);\r\n\r\n\r\n function RecipientTableController($q, $scope, $log, paginatedDataService) {\r\n var vm = this;\r\n\r\n vm.fetchData = fetchData;\r\n vm.pagination = {\r\n itemsPerPage: 5,\r\n displayedPages: 7\r\n };\r\n\r\n function fetchData(tableState) {\r\n return $q(function (resolve, reject) {\r\n if (vm.search) {\r\n var requestParams = paginatedDataService.getParamsFromTableData(tableState);\r\n paginatedDataService.fetchDataFromParams(vm.recipientOptions.endpoint, requestParams)\r\n .then(function (response) {\r\n var foundRecipients = response.data;\r\n if (!vm.selectRecipientHidden && foundRecipients.length === 1 && tableState.pagination.start === 0) {\r\n vm.selectRecipient({\r\n recipient: foundRecipients[0],\r\n fromButtonPress: false\r\n });\r\n }\r\n resolve(response);\r\n })\r\n .catch(function (response) {\r\n reject(response);\r\n });\r\n } else {\r\n resolve({\r\n data: [],\r\n pageCount: 0,\r\n pageNumber: 1,\r\n pageSize: 5\r\n });\r\n }\r\n });\r\n }\r\n\r\n vm.$onInit = function () {\r\n var columns = [\r\n {\r\n id: 'displayId',\r\n label: vm.recipientOptions.id,\r\n sort: true,\r\n sortId: 'id'\r\n },\r\n {\r\n id: 'title',\r\n label: 'Title',\r\n sort: true\r\n },\r\n {\r\n id: 'firstName',\r\n label: 'First Name',\r\n sort: true\r\n },\r\n {\r\n id: 'lastName',\r\n label: 'Last Name',\r\n sort: true\r\n },\r\n {\r\n id: 'companyNumber',\r\n label: 'Company Number',\r\n sort: true\r\n }\r\n ];\r\n if (!vm.selectRecipientHidden) {\r\n columns.push({\r\n id: 'selectButton',\r\n type: 'button',\r\n button: {\r\n text: 'Select',\r\n type: 'btn-secondary',\r\n onClick: function (recipient) {\r\n vm.selectRecipient({\r\n recipient: recipient,\r\n fromButtonPress: true\r\n });\r\n }\r\n }\r\n });\r\n }\r\n vm.tableColumns = columns;\r\n vm.tableOptions = {};\r\n if (vm.recipientOptions && vm.recipientOptions.displayNamePlural) {\r\n vm.tableOptions.noResultsMessage = 'No ' + vm.recipientOptions.displayNamePlural + ' found.'\r\n + ' Please amend search or select \\'Create new ' + vm.recipientOptions.displayName + '\\'.';\r\n }\r\n $scope.$watch(function () {\r\n return vm.search;\r\n }, function (newVal) {\r\n if (newVal) {\r\n $scope.$broadcast('fit-table:searchChange', newVal);\r\n }\r\n });\r\n };\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n var recipientTableProperty = '$recipientTable';\r\n\r\n angular\r\n .module('app.installations')\r\n .directive('recipientTable', recipientTableDirective);\r\n\r\n function recipientTableDirective() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/installations/recipient/recipient-table.html',\r\n scope: {\r\n recipientOptions: '<',\r\n search: '<',\r\n selectRecipientHidden: '<',\r\n selectRecipient: '&'\r\n },\r\n controller: 'RecipientTableController',\r\n controllerAs: recipientTableProperty,\r\n bindToController: true\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationSubmissionController', InstallationSubmissionController);\r\n\r\n function InstallationSubmissionController($q, $state, WizardHandler, installationWizardService, installationService, installationRulesService,\r\n installationStorageService, dataService, constants, constantUtils, objectUtils, dataLayoutService, documentsService,\r\n formErrorService, $log, principal) {\r\n var vm = this;\r\n\r\n var slDiagramDocumentType = 10;\r\n vm.error = '';\r\n\r\n vm.saving = false;\r\n\r\n vm.submit = submit;\r\n vm.back = back;\r\n vm.getInstallationDetails = getInstallationDetails;\r\n vm.validateDocs = validateDocs;\r\n installationWizardService.setPageEntryFunction('submission', loadStoredData);\r\n\r\n vm.model = {};\r\n\r\n vm.fileObject = [];\r\n vm.fileErrors = [];\r\n\r\n vm.approvalFields = [\r\n {\r\n key: 'approvalMessage',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Any additional comments for the installation, regarding the reasons it is being held for approval.',\r\n maxlength: 4000,\r\n rows: 6\r\n },\r\n hideExpression: function() {\r\n return !vm.model.approvalInfo || !vm.model.approvalInfo.needsApproval;\r\n }\r\n }\r\n ];\r\n vm.approvalFormOptions = {\r\n buttons: {\r\n save: 'Submit',\r\n back: 'Back',\r\n cancel: null\r\n }\r\n };\r\n\r\n function getFullRequest(model) {\r\n return {\r\n installation: vm.installation,\r\n installationCapacity: vm.installationCapacity,\r\n generator: vm.generator,\r\n nominatedRecipient: vm.nominatedRecipient,\r\n meters: vm.meters,\r\n message: model.approvalMessage,\r\n documentIds: vm.documentIds\r\n };\r\n }\r\n\r\n\r\n function validateDocs() {\r\n\r\n if ( vm.installation === angular.isUndefined\r\n || vm.installation.coLocatedStorage === angular.isUndefined\r\n || vm.model.approvalInfo === angular.isUndefined\r\n || vm.model.approvalInfo.reasons === angular.isUndefined) {\r\n\r\n return true;\r\n }\r\n\r\n if (vm.installation.coLocatedStorage === 'Yes') {\r\n if(principal.isInternal()) {\r\n return true;\r\n }\r\n\r\n //Has the user provided at least one sl diagram\r\n var documentProvided = vm.fileObject\r\n .some(function(fileItem) {\r\n return fileItem.documentType == slDiagramDocumentType;\r\n });\r\n\r\n if (documentProvided) {\r\n return true;\r\n }\r\n\r\n vm.fileErrors.push('Please upload Co-located storage diagram');\r\n vm.saving = false;\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n vm.documentIds = [];\r\n\r\n function submit(model) {\r\n vm.saving = true;\r\n vm.fileErrors = [];\r\n var promises = [];\r\n vm.documentIds = [];\r\n\r\n if(!validateDocs()){ \r\n return false;\r\n }\r\n \r\n\r\n angular.forEach(vm.fileObject,\r\n function(fileItem) {\r\n return promises.push(uploadFile(fileItem));\r\n });\r\n\r\n var allUploads = $q.all(promises);\r\n \r\n allUploads.then(createInstallation);\r\n\r\n //TODO look into saving all documents in one api call\r\n //so any invalid documents should not result in orphan valid documents\r\n\r\n function uploadFile(fileItem) {\r\n return documentsService.uploadDocumentWithoutInstallation(fileItem.file, fileItem.documentType)\r\n .then(function (response) {\r\n vm.documentIds.push(response.documentId);\r\n return $q.resolve();\r\n })\r\n .catch(function (response) {\r\n var modelState = response.data.modelState;\r\n if (modelState) {\r\n var fileErrors = formErrorService.extractAllErrors(response);\r\n _.forEach(fileErrors, function (item) { vm.fileErrors.push(item); });\r\n } else {\r\n vm.fileErrors.push('There was an error saving the documents. Please try again later');\r\n }\r\n $log.warn('API request failed:', response);\r\n vm.saving = false;\r\n return $q.reject();\r\n });\r\n }\r\n\r\n function createInstallation() {\r\n createNewInstallation(model);\r\n }\r\n }\r\n\r\n function createNewInstallation(model) {\r\n installationService.createNewInstallation(getFullRequest(model))\r\n .then(function(installationDetails) {\r\n installationStorageService.clear();\r\n $state.go('installationLanding', {installationResponse: installationDetails});\r\n })\r\n .finally(function() {\r\n vm.saving = false;\r\n });\r\n }\r\n \r\n function back() {\r\n vm.fileObject = [];\r\n WizardHandler.wizard().previous();\r\n }\r\n\r\n function getInstallationDetails() {\r\n loadStoredData();\r\n }\r\n\r\n function loadStoredData() {\r\n var licenceModel = installationStorageService.getLicenceModel();\r\n var generator = installationStorageService.getGenerator();\r\n var nominatedRecipient = installationStorageService.getNominatedRecipient();\r\n var nominatedRecipientModel = installationStorageService.getNominatedRecipientModel();\r\n var addressModel = installationStorageService.getAddressModel();\r\n var basicDetailsModel = installationStorageService.getBasicDetailsModel();\r\n var technologyModel = installationStorageService.getTechnologyModel();\r\n var multiSiteModel = installationStorageService.getMultiSiteModel();\r\n var efficiencyModel = installationStorageService.getEfficiencyModel();\r\n var meterInfoModel = installationStorageService.getMeterInfoModel();\r\n var tariff = installationStorageService.getTariff();\r\n\r\n vm.installationCapacity = createCapacityModel(licenceModel,\r\n basicDetailsModel,\r\n technologyModel,\r\n efficiencyModel,\r\n tariff);\r\n vm.generator = angular.copy(generator);\r\n vm.nominatedRecipient = getNominatedRecipient(nominatedRecipient, nominatedRecipientModel);\r\n vm.meters = getMeters(meterInfoModel, technologyModel);\r\n vm.tariff = getTariff(tariff);\r\n createInstallationModel(licenceModel,\r\n addressModel,\r\n basicDetailsModel,\r\n technologyModel,\r\n generator,\r\n nominatedRecipient,\r\n nominatedRecipientModel,\r\n multiSiteModel,\r\n efficiencyModel)\r\n .then(function(installation) {\r\n vm.installation = installation;\r\n // Check whether this will need approving or not.\r\n installationService.checkInstallationForApproval(getFullRequest({})).then(function(reasons) {\r\n vm.model.approvalInfo = {\r\n needsApproval: _.size(reasons) > 0,\r\n reasons: reasons\r\n };\r\n })\r\n .catch(approvalError);\r\n });\r\n\r\n // These layouts are needed for the accordions.\r\n vm.installationLayout = dataLayoutService.getLayout('installation');\r\n vm.installationCapacityLayout = dataLayoutService.getLayout('installationCapacity');\r\n vm.tariffLayout = dataLayoutService.getLayout('tariff');\r\n vm.recipientLayout = dataLayoutService.getLayout('recipient');\r\n }\r\n \r\n function approvalError() {\r\n vm.model.approvalInfo = {\r\n needsApproval: false\r\n };\r\n }\r\n\r\n function createInstallationModel(\r\n licenceModel, addressModel, basicDetailsModel, technologyModel, generator,\r\n nominatedRecipient, nominatedRecipientModel, multiSiteModel, efficiencyModel) {\r\n var installation = {\r\n name: basicDetailsModel.name,\r\n applicationDate: technologyModel.applicationDate,\r\n gridConnected: technologyModel.gridConnected,\r\n coLocatedStorage: technologyModel.coLocatedStorage,\r\n coLocatedStorageComment : technologyModel.coLocatedStorageComment,\r\n licenceId: licenceModel.licenceId,\r\n installationTypeId: technologyModel.installationType,\r\n installationTypeName: constantUtils.findConstantName(constants.installationTypes, technologyModel.installationType)\r\n };\r\n\r\n if (basicDetailsModel.previousInstallations) {\r\n installation.existingInstalledCapacity = basicDetailsModel.existingInstalledCapacity;\r\n installation.existingDeclaredNetCapacity = basicDetailsModel.existingDeclaredNetCapacity;\r\n }\r\n\r\n setTechnologyType(installation, technologyModel);\r\n setExportStatus(installation, technologyModel);\r\n setInstallationAddress(installation, addressModel, generator, nominatedRecipient);\r\n\r\n if (efficiencyModel) {\r\n setInstallationEfficiencyAnswers(installation, basicDetailsModel, technologyModel, efficiencyModel);\r\n }\r\n if (multiSiteModel) {\r\n setMultiSiteAnswers(installation, basicDetailsModel, technologyModel, nominatedRecipientModel, multiSiteModel);\r\n }\r\n setCommunityAnswers(installation, basicDetailsModel, technologyModel);\r\n\r\n return getLicenceName(licenceModel)\r\n .then(function (licenceName) {\r\n installation.licenceName = licenceName;\r\n return installation;\r\n });\r\n }\r\n\r\n function setInstallationEfficiencyAnswers(installation, basicsModel, techModel, efficiencyModel) {\r\n var efficiencyQuestionsNeeded = installationRulesService.shouldShowEfficiencyQuestions(\r\n basicsModel.installedCapacity,\r\n techModel.technologyType,\r\n techModel.applicationDate,\r\n techModel.commissioningDate,\r\n installationRulesService.getPvInstallType(techModel));\r\n if (efficiencyQuestionsNeeded) {\r\n var tempEfficiencyParams = getEfficiencyRequestParameters(efficiencyModel);\r\n\r\n var copyValues = ['epcCountry', 'epcCountryName', 'epcType', 'epcTypeName', 'epcCountryMismatchComment'];\r\n objectUtils.copy(tempEfficiencyParams, copyValues, installation);\r\n }\r\n }\r\n\r\n function getLicenceName(licenceModel) {\r\n if (licenceModel.licenceId) {\r\n // return dataService.fetchDataFromEndpointById('licences', licenceModel.licenceId)\r\n // .then(function (licence) {\r\n // return licence.name;\r\n // });\r\n\r\n //=======================================\r\n //temporary line of code to be removed after testing\r\n return $q.when();\r\n //=======================================\r\n } else {\r\n return $q.when();\r\n }\r\n }\r\n\r\n function setInstallationAddress(installation, addressModel, generator, nominatedRecipient) {\r\n var expectingGridRef = installationRulesService.expectingGridReference(addressModel);\r\n\r\n if (expectingGridRef) {\r\n installation.osGridReference = addressModel.gridReference;\r\n }\r\n else {\r\n installation.address = installationRulesService.getCurrentAddress(addressModel, generator, nominatedRecipient);\r\n }\r\n }\r\n\r\n function setTechnologyType(installation, technologyModel) {\r\n installation.technologyTypeId = technologyModel.technologyType;\r\n installation.technologyTypeName = constantUtils.findConstantName(constants.technologyTypes, installation.technologyTypeId);\r\n }\r\n\r\n function setExportStatus(installation, technologyModel) {\r\n var offGridId = constantUtils.findConstantValue(constants.exportStatuses, 'NoExportOffGrid');\r\n\r\n installation.exportStatus = installation.gridConnected ? technologyModel.exportStatus : offGridId;\r\n installation.exportStatusName = constantUtils.findConstantName(constants.exportStatuses, installation.exportStatus);\r\n }\r\n\r\n function setMultiSiteAnswers(installation, basicDetailsModel, technologyModel, nominatedRecipientModel, multiSiteModel) {\r\n var hasMultiSiteAnswers\r\n = installationRulesService.shouldShowMultiSiteQuestionsFromInstallationModels(basicDetailsModel, technologyModel);\r\n var hasNominatedRecipientAnswers = (hasMultiSiteAnswers && nominatedRecipientModel.recipientType === 'nominatedRecipient');\r\n \r\n installation.multipleSiteGeneratorAnswer = hasMultiSiteAnswers\r\n ? multiSiteModel.multipleSiteGeneratorAnswer\r\n : null;\r\n installation.multipleSiteGeneratorText = hasMultiSiteAnswers\r\n ? multiSiteModel.multipleSiteGeneratorText\r\n : null;\r\n\r\n installation.multipleSiteNominatedRecipientAnswer = hasNominatedRecipientAnswers\r\n ? multiSiteModel.multipleSiteNominatedRecipientAnswer\r\n : null;\r\n installation.multipleSiteNominatedRecipientText = hasNominatedRecipientAnswers\r\n ? multiSiteModel.multipleSiteNominatedRecipientText\r\n : null;\r\n }\r\n\r\n function setCommunityAnswers(installation, basicDetailsModel, technologyModel) {\r\n installation.communityTypeId = installationRulesService.getCurrentCommunityType(basicDetailsModel, technologyModel);\r\n installation.communityTypeName = constantUtils.findConstantName(constants.communityTypes, installation.communityTypeId);\r\n\r\n var hasCommunityRef = installationRulesService.shouldShowCommunityReference(installation.communityTypeId);\r\n installation.communityReferenceNumber = hasCommunityRef ? technologyModel.communityReferenceNumber : null;\r\n\r\n var hasPreRegDate = installationRulesService.shouldShowPreRegistrationDate(installation.communityTypeId, installationRulesService.getTotalInstalledCapacity(\r\n basicDetailsModel.installedCapacity,\r\n basicDetailsModel.existingInstalledCapacity));\r\n installation.preRegistrationDate = hasPreRegDate ? technologyModel.preRegistrationDate : null;\r\n }\r\n\r\n function createCapacityModel(licenceModel, basicDetailsModel, technologyModel, efficiencyModel, tariff) {\r\n var installationCapacity = {\r\n accreditationType: licenceModel.accreditationType,\r\n accreditationTypeName: constantUtils.findConstantName(constants.accreditationTypes, licenceModel.accreditationType),\r\n accreditationNumber: installationRulesService.getAccreditationNumber(licenceModel),\r\n receivedGrant: basicDetailsModel.grantReceived,\r\n receivedGrantText: basicDetailsModel.grantReceived ? 'Yes' : 'No',\r\n installedCapacity: basicDetailsModel.installedCapacity,\r\n declaredNetCapacity: basicDetailsModel.declaredNetCapacity,\r\n commissioningDate: technologyModel.commissioningDate,\r\n tariffId: tariff.tariffId,\r\n eligibilityDate: installationStorageService.getEligibilityDate(),\r\n eligibilityEndDate: installationStorageService.getEligibilityEndDate()\r\n };\r\n setPVInstallType(installationCapacity, technologyModel);\r\n setMCSIssueDate(installationCapacity, licenceModel, technologyModel);\r\n setEligibilityDateOverride(installationCapacity, licenceModel, technologyModel);\r\n\r\n if (efficiencyModel) {\r\n setCapacityEfficiencyAnswers(installationCapacity, basicDetailsModel, technologyModel, efficiencyModel);\r\n }\r\n\r\n return installationCapacity;\r\n }\r\n\r\n function setCapacityEfficiencyAnswers(installationCapacity, basicDetailsModel, technologyModel, efficiencyModel) {\r\n var efficiencyQuestionsNeeded = installationRulesService.shouldShowEfficiencyQuestions(\r\n basicDetailsModel.installedCapacity,\r\n technologyModel.technologyType,\r\n technologyModel.applicationDate,\r\n technologyModel.commissioningDate,\r\n installationRulesService.getPvInstallType(technologyModel));\r\n if (efficiencyQuestionsNeeded) {\r\n var tempEfficiencyParams = getEfficiencyRequestParameters(efficiencyModel);\r\n\r\n var copyValues = ['eerType', 'eerTypeName', 'eerExemptComment', 'epcCertificateNumber',\r\n 'epcCertificateNumberComment', 'epcCertificateDate', 'eerExemptDocId'];\r\n objectUtils.copy(tempEfficiencyParams, copyValues, installationCapacity);\r\n }\r\n }\r\n\r\n function setMCSIssueDate(installationCapacity, licenceModel, technologyModel) {\r\n if (installationRulesService.shouldUseMCSIssueDate(licenceModel.accreditationType, technologyModel.applicationDate))\r\n {\r\n installationCapacity.mcsIssueDate = technologyModel.mcsIssueDate;\r\n }\r\n }\r\n\r\n function setEligibilityDateOverride(installationCapacity, licenceModel, technologyModel) {\r\n if (licenceModel.accreditationType === constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit'))\r\n {\r\n installationCapacity.eligibilityDateOverride = technologyModel.eligibilityDateOverride;\r\n }\r\n }\r\n\r\n function setPVInstallType(installationCapacity, technologyModel) {\r\n installationCapacity.installTypeId = installationRulesService\r\n .getPvInstallType(technologyModel);\r\n installationCapacity.installTypeName = constantUtils.findConstantName(constants.photovoltaicInstallTypes, installationCapacity.installTypeId);\r\n }\r\n\r\n function getNominatedRecipient(nominatedRecipient, nominatedRecipientModel) {\r\n if (nominatedRecipientModel.recipientType === 'generator') {\r\n return undefined;\r\n } else if (nominatedRecipientModel.recipientType === 'nominatedRecipient') {\r\n return nominatedRecipient;\r\n } else {\r\n throw new Error('Unknown recipient type: ' + nominatedRecipientModel.recipientType);\r\n }\r\n }\r\n\r\n function getMeters(meterInfoModel, technologyModel) {\r\n var meters = meterInfoModel.generationMeters.map(function(meter) {\r\n return addTypeAndRestrictFields(meter, 'Generation', meterInfoModel);\r\n });\r\n\r\n if (technologyModel.gridConnected === true) {\r\n var supplyMeters = meterInfoModel.supplyMeters.map(function(meter) {\r\n return addTypeAndRestrictFields(meter, 'Supply', meterInfoModel);\r\n });\r\n meters = meters.concat(supplyMeters);\r\n }\r\n\r\n if (exportMetersRequired(technologyModel)) {\r\n var exportMeters = meterInfoModel.exportMeters.map(function (meter) {\r\n return addTypeAndRestrictFields(meter, 'Export', meterInfoModel, meterInfoModel.exportMeterType);\r\n });\r\n meters = meters.concat(exportMeters);\r\n }\r\n return meters;\r\n }\r\n\r\n function getTariff(tariff) {\r\n return {\r\n tariffCode: tariff.tariffCode,\r\n tariffValue: tariff.tariffValue,\r\n description: tariff.description\r\n };\r\n }\r\n\r\n function exportMetersRequired(technologyModel) {\r\n return (technologyModel.gridConnected === true) && (technologyModel.exportStatus === constantUtils.findConstantValue(constants.exportStatuses, 'ExportStandard')\r\n || technologyModel.exportStatus === constantUtils.findConstantValue(constants.exportStatuses, 'ExportNegotiated'));\r\n }\r\n\r\n function addTypeAndRestrictFields(meter, typeCode, meterModel, exportType) {\r\n var processedMeter = {\r\n type: constantUtils.findConstantValue(constants.meterTypes, typeCode)\r\n };\r\n switch (typeCode) {\r\n case 'Supply':\r\n processedMeter.mpan = meter.mpan;\r\n if (_.includes(meterModel.mpanDuplicationState.mpans, processedMeter.mpan)) {\r\n if (meterModel.mpanDuplicationState.showReasons) {\r\n processedMeter.duplicateMpanReason = meterModel.duplicateMpanReason;\r\n }\r\n processedMeter.duplicateMpanComment = meterModel.duplicateSupplyMpanComment;\r\n }\r\n break;\r\n case 'Export':\r\n if (exportType === 'mpan') {\r\n processedMeter.mpan = meter.mpanOrSerialNumber;\r\n } else if (exportType === 'serialNumber') {\r\n processedMeter.serialNumber = meter.mpanOrSerialNumber;\r\n } else {\r\n throw new Error('Unknown export meter type for submission.');\r\n }\r\n if (_.includes(meterModel.mpanDuplicationState.mpans, processedMeter.mpan)) {\r\n processedMeter.duplicateMpanComment = meterModel.duplicateExportMpanComment;\r\n }\r\n break;\r\n case 'Generation':\r\n processedMeter.serialNumber = meter.serialNumber;\r\n processedMeter.startMeterReading = meter.startMeterReading;\r\n processedMeter.startMeterReadingDate = meter.startMeterReadingDate;\r\n break;\r\n }\r\n return processedMeter;\r\n }\r\n\r\n function getEfficiencyRequestParameters(efficiencyModel) {\r\n var efficiencyRequestParams = {};\r\n\r\n efficiencyRequestParams.eerType = efficiencyModel.eerType;\r\n efficiencyRequestParams.eerTypeName = constantUtils.findConstantName(constants.eerTypes, efficiencyRequestParams.eerType);\r\n\r\n var exemptId = constantUtils.findConstantValue(constants.eerTypes, 'Exempt');\r\n if (efficiencyModel.eerType === exemptId) {\r\n efficiencyRequestParams.eerExemptComment = efficiencyModel.eerExemptComment;\r\n efficiencyRequestParams.eerExemptDocId = efficiencyModel.eerExemptDocId;\r\n }\r\n\r\n var meetsReqsId = constantUtils.findConstantValue(constants.eerTypes, 'MeetsRequirements');\r\n if (efficiencyModel.eerType === meetsReqsId) {\r\n efficiencyRequestParams.epcCountry = efficiencyModel.epcCountry;\r\n efficiencyRequestParams.epcCountryName = constantUtils.findConstantName(constants.epcCountries, efficiencyRequestParams.epcCountry);\r\n efficiencyRequestParams.epcCertificateNumber = efficiencyModel.epcCertificateNumber;\r\n efficiencyRequestParams.epcCertificateNumberComment = efficiencyModel.epcCertificateNumberComment;\r\n efficiencyRequestParams.epcCertificateDate = efficiencyModel.epcCertificateDate;\r\n\r\n var scotlandId = constantUtils.findConstantValue(constants.epcCountries, 'Scotland');\r\n if (efficiencyModel.epcCountry === scotlandId) {\r\n efficiencyRequestParams.epcType = efficiencyModel.epcType;\r\n }\r\n else {\r\n efficiencyRequestParams.epcType = constantUtils.findConstantValue(constants.epcTypes, 'NotApplicable');\r\n }\r\n efficiencyRequestParams.epcTypeName = constantUtils.findConstantName(constants.epcTypes, efficiencyRequestParams.epcType);\r\n if (efficiencyModel.epcCountryMismatch) {\r\n efficiencyRequestParams.epcCountryMismatchComment = efficiencyModel.epcCountryMismatchComment;\r\n }\r\n }\r\n\r\n return efficiencyRequestParams;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSwitchCompleteController', InstallationsSwitchCompleteController);\r\n\r\n function InstallationsSwitchCompleteController($state, $stateParams, installationSwitchService, dialogService, toastr, $q) {\r\n var vm = this;\r\n\r\n vm.switchId = $stateParams.switchId;\r\n vm.installation = {};\r\n vm.switchSubmitModel = {};\r\n vm.onSubmit = submit;\r\n vm.availableLicences = [];\r\n\r\n vm.loadModel = function() {\r\n return installationSwitchService.loadSwitchModelForCompletion(vm.switchId)\r\n .then(parseToSwitchModel);\r\n };\r\n \r\n vm.cancelSubmit = function() {\r\n $state.go('installations-switch-raised');\r\n };\r\n\r\n function parseToSwitchModel(response) {\r\n var selectedLicence = null;\r\n var selectedLicenceId = null;\r\n \r\n vm.availableLicences = response.availableLicences;\r\n\r\n if (vm.availableLicences.length === 1) {\r\n selectedLicence = vm.availableLicences[0];\r\n selectedLicenceId = selectedLicence.value;\r\n }\r\n\r\n vm.installation = response.installation;\r\n\r\n var model = {\r\n proposedDate: new Date(response.proposedDate),\r\n generationMeters: response.meters,\r\n selectedLicence: selectedLicence,\r\n selectedLicenceId: selectedLicenceId,\r\n fitId: vm.installation.fitId\r\n };\r\n \r\n return model;\r\n }\r\n\r\n function submit(model) {\r\n var parsedSubmitModel = {\r\n switchId: vm.switchId,\r\n meterReadingDate: model.proposedDate,\r\n meters: model.generationMeters,\r\n licenceId: model.selectedLicenceId\r\n };\r\n\r\n var resultPromise = $q.defer();\r\n\r\n var confirmationPromise = showConfirmationMessage();\r\n confirmationPromise.catch(returnNoError);\r\n confirmationPromise.then(submitRequestAndRedirectIfSuccess);\r\n\r\n\r\n return resultPromise;\r\n\r\n function returnNoError() {\r\n resultPromise.resolve();\r\n }\r\n\r\n function returnError(error) {\r\n resultPromise.reject(error);\r\n }\r\n\r\n\r\n function submitRequestAndRedirectIfSuccess() {\r\n installationSwitchService.submitSwitchForCompletion(vm.switchId,parsedSubmitModel)\r\n .then(showResultsMessageAndRedirect)\r\n .then(returnNoError)\r\n .catch(returnError);\r\n }\r\n\r\n }\r\n\r\n function showResultsMessageAndRedirect() {\r\n toastr.success('Switch sucessfully completed.', 'Switch completion');\r\n redirectToSearch();\r\n }\r\n\r\n function showConfirmationMessage() {\r\n var options = {\r\n title: 'Switch request',\r\n message: 'Are you sure you want to complete switch?',\r\n buttons: {\r\n confirm: true,\r\n cancel: true\r\n }\r\n };\r\n return dialogService.showDialog(options);\r\n }\r\n\r\n function redirectToSearch() {\r\n $state.go('installations-switch-raised');\r\n }\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n type: 'headingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function () {\r\n return 'Complete switch request: ' + vm.installation.fitId;\r\n }\r\n }\r\n },\r\n {\r\n type: 'subHeadingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function() {\r\n return 'Please enter the Switch date and start meter readings for generation meter(s) below.';\r\n }\r\n }\r\n },\r\n {\r\n type: 'break'\r\n },\r\n {\r\n type: 'repeatSection',\r\n key: 'generationMeters',\r\n templateOptions: {\r\n hideAddBtn: true,\r\n hideRemoveBtn: true,\r\n fields: [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-4',\r\n type: 'fitInput',\r\n key: 'startMeterReading',\r\n optionsTypes: ['fitNumericValidator'],\r\n templateOptions: {\r\n required: true,\r\n maxlength: 50\r\n },\r\n expressionProperties: {\r\n 'templateOptions.label': function($viewValue, $modelValue, scope) {\r\n return 'Generation meter : ' + scope.model.meterIdentifier;\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'proposedDate',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n label: 'Switch date',\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-6',\r\n key: 'selectedLicenceId',\r\n type: 'fitSelect',\r\n defaultValue: 'selectedLicence',\r\n templateOptions: {\r\n label: 'Select a licence',\r\n valueProp: 'value',\r\n labelProp: 'name',\r\n required: true,\r\n options: vm.availableLicences\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function () {return vm.availableLicences.length === 1; },\r\n 'templateOptions.options': function () { return vm.availableLicences; }\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSwitchDetailsController', InstallationsSwitchDetailsController);\r\n\r\n function InstallationsSwitchDetailsController(dataLayoutService, installationSwitchService, $scope) {\r\n var vm = this;\r\n\r\n vm.meterInfo = {};\r\n\r\n $scope.$watch('vm.installation', function () {\r\n if (vm.installation) {\r\n vm.meterInfo = installationSwitchService.getMeterInfoModel(vm.installation);\r\n }\r\n });\r\n\r\n vm.layouts = {\r\n installation: dataLayoutService.getLayout('installation'),\r\n installationCapacityLayout: dataLayoutService.getLayout('installationCapacity'),\r\n installationCapacityTariffLayout: dataLayoutService.getLayout('tariff')\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSwitchPendingController', InstallationsSwitchPendingController);\r\n\r\n function InstallationsSwitchPendingController(paginatedDataService, $state, $uibModal, dialogService, installationSwitchService, constants, constantUtils, toastr, $stateParams) {\r\n var vm = this;\r\n\r\n var actionType = $stateParams.action;\r\n vm.fetchData = fetchData;\r\n vm.cachedRequestParams = null;\r\n vm.statusOptions = [];\r\n vm.defaultResultsDisplayed = false;\r\n vm.tableOptions = {};\r\n vm.tableOptions.noResultsMessage = actionType === 'pending' ? 'There are no received switch requests'\r\n : 'There are no raised switch requests';\r\n\r\n vm.showHeading = actionType === 'internal';\r\n vm.returnState = $state.href($state.current);\r\n \r\n populateSelectOptions();\r\n\r\n function populateSelectOptions() {\r\n vm.statusOptions = [{ value: null, name: 'Please select' }]\r\n .concat(constants.installationSwitchStatuses);\r\n vm.selectedStatus = installationSwitchService.getDefaultSwitchStatusesForSearchView(actionType);\r\n }\r\n\r\n function fetchData(tableData) {\r\n vm.cachedRequestParams = paginatedDataService.getParamsFromTableData(tableData);\r\n vm.cachedRequestParams.status = vm.selectedStatus;\r\n return paginatedDataService.fetchDataFromParams('installation/switch/' + actionType, vm.cachedRequestParams);\r\n }\r\n\r\n function handleApproveSwitchRequest(switchRequest) {\r\n showConfirmationMessage().then(submitForApproval);\r\n\r\n function submitForApproval() {\r\n return installationSwitchService.approveSwitchRequest(switchRequest.id)\r\n .then(function() {\r\n showConfirmationDialogAndRedirectToSearch(switchRequest, 'approve');\r\n });\r\n }\r\n }\r\n\r\n function handleRejectSwitchRequest(switchRequest) {\r\n return handleSwitchCancellationRequest(switchRequest, 'reject');\r\n }\r\n\r\n function handleCancelSwitchRequest(switchRequest) {\r\n return handleSwitchCancellationRequest(switchRequest, 'cancel');\r\n }\r\n\r\n function handleCompleteSwitchRequest(switchRequest) {\r\n $state.go('installations-switch-completeswitch', { switchId: switchRequest.id });\r\n }\r\n\r\n function showConfirmationMessage() {\r\n var options = {\r\n title: 'Switch approval',\r\n message: 'Please confirm that you wish to accept this switch request?',\r\n buttons: {\r\n confirm: true,\r\n cancel: true\r\n }\r\n };\r\n return dialogService.showDialog(options);\r\n }\r\n\r\n function handleSwitchCancellationRequest(switchRequestModel, action) {\r\n var label = action === 'reject'\r\n ? 'Reason for declining the switch request'\r\n : 'Reason for cancelling the switch request';\r\n $uibModal.open({\r\n templateUrl: 'app/installations/switching/rejectSwitch/installations-switch-reject.html',\r\n controller: 'InstallationsSwitchRejectController',\r\n controllerAs: 'vm',\r\n resolve: {\r\n model: function () {\r\n return {\r\n switchId: switchRequestModel.id,\r\n fitId: switchRequestModel.fitId,\r\n action: action,\r\n label: label\r\n };\r\n }\r\n }\r\n })\r\n .result.then(function () {\r\n showConfirmationDialogAndRedirectToSearch(switchRequestModel, action);\r\n });\r\n }\r\n\r\n function showConfirmationDialogAndRedirectToSearch(switchRequestModel, action) {\r\n var confirmationMessage = getConfirmationMessages()[action];\r\n toastr.success('Switch successfully ' + confirmationMessage, 'Switch ' + confirmationMessage);\r\n refreshList();\r\n }\r\n\r\n function getConfirmationMessages() {\r\n return {\r\n approve: 'approved',\r\n reject: 'declined',\r\n cancel: 'cancelled'\r\n };\r\n }\r\n\r\n function refreshList() {\r\n $state.reload();\r\n }\r\n\r\n function handleSwitchHistoryRequest(switchRequest) {\r\n $state.go('installationSwitchHistory', { id: switchRequest.id, name: switchRequest.fitId, returnState: vm.returnState });\r\n }\r\n\r\n vm.tableColumns = loadColumns();\r\n\r\n function loadColumns() {\r\n var columns = installationSwitchService.loadBaseColumns(actionType);\r\n\r\n if (actionType === 'pending') {\r\n columns = columns.concat([\r\n {\r\n id: 'acceptSwitch',\r\n label: 'Action',\r\n type: 'button',\r\n button: {\r\n text: 'Accept',\r\n type: 'btn-default',\r\n onClick: handleApproveSwitchRequest,\r\n showBtn: 'isEligibleToApprove'\r\n }\r\n },\r\n {\r\n id: 'declineSwitch',\r\n type: 'button',\r\n button: {\r\n text: 'Decline',\r\n type: 'btn-default',\r\n onClick: handleRejectSwitchRequest,\r\n showBtn: 'isEligibleToApprove'\r\n }\r\n }\r\n ]);\r\n }\r\n\r\n if (actionType === 'raisedRequests') {\r\n columns = columns.concat([\r\n {\r\n id: 'cancelSwitch',\r\n label: 'Action',\r\n type: 'button',\r\n button: {\r\n text: 'Cancel',\r\n type: 'btn-default',\r\n onClick: handleCancelSwitchRequest,\r\n showBtn: 'isEligibleForCancellation'\r\n }\r\n\r\n },\r\n {\r\n id: 'completeSwitch',\r\n type: 'button',\r\n button: {\r\n text: 'Complete switch',\r\n type: 'btn-default',\r\n onClick: handleCompleteSwitchRequest,\r\n showBtn: 'isEligibleForCompletion'\r\n }\r\n }\r\n ]);\r\n }\r\n\r\n if (actionType === 'internal') {\r\n columns = columns.concat([\r\n {\r\n id: 'history',\r\n label: 'History',\r\n type: 'button',\r\n button: {\r\n text: 'History',\r\n type: 'btn-default',\r\n onClick: handleSwitchHistoryRequest\r\n }\r\n\r\n }\r\n ]);\r\n }\r\n return columns;\r\n }\r\n\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSwitchRequestController', InstallationsSwitchRequestController);\r\n\r\n function InstallationsSwitchRequestController($state, $stateParams, installationSwitchService, dialogService, $q, toastr, moment) {\r\n var vm = this;\r\n\r\n vm.installationId = $stateParams.installationId;\r\n vm.installation = null;\r\n vm.showSwitchControls = false;\r\n vm.switchNotAllowedReasons = [];\r\n vm.switchSubmitModel = {};\r\n vm.error = false;\r\n vm.onSubmit = submit;\r\n vm.minDate = moment();\r\n vm.loadModel = function() {\r\n return installationSwitchService.loadSwitchModel(vm.installationId)\r\n .then(parseToSwitchModel);\r\n };\r\n\r\n vm.cancelSubmit = function() {\r\n $state.go('installations-switch-search');\r\n };\r\n\r\n function parseToSwitchModel(response) {\r\n if (response.isEligibleToSwitch) {\r\n vm.showSwitchControls = true;\r\n } else {\r\n vm.switchNotAllowedReasons = response.switchNotAllowedReasons;\r\n }\r\n\r\n vm.installation = response.installation;\r\n \r\n return {\r\n proposedDate : null,\r\n generationMeters: response.meters,\r\n comments : null \r\n };\r\n }\r\n\r\n function submit(model) {\r\n vm.switchNotAllowedReasons = [];\r\n var parsedSubmitModel = {\r\n installationId: vm.installationId,\r\n proposedDate: model.proposedDate,\r\n meters: model.generationMeters,\r\n comments: model.comments\r\n };\r\n\r\n var resultPromise = $q.defer();\r\n\r\n var confirmationPromise = showConfirmationMessage(vm.installation.fitId);\r\n confirmationPromise.catch(returnNoError);\r\n confirmationPromise.then(submitRequestAndRedirectIfSuccess);\r\n\r\n function submitRequestAndRedirectIfSuccess() {\r\n installationSwitchService.submitSwitchRequest(parsedSubmitModel)\r\n .then(showResultsMessageAndRedirect)\r\n .then(returnNoError)\r\n .catch(returnError);\r\n }\r\n\r\n return resultPromise;\r\n\r\n function returnNoError() {\r\n resultPromise.resolve();\r\n }\r\n\r\n function returnError(error) {\r\n resultPromise.reject(error);\r\n }\r\n }\r\n\r\n function showConfirmationMessage(fitId) {\r\n var options = {\r\n title: 'Switch request',\r\n message: 'You are about to submit the following switch request for the FIT installation : ' + fitId + '. Please select \\'Confirm\\' to continue.',\r\n buttons: {\r\n confirm: true,\r\n cancel: true\r\n }\r\n };\r\n return dialogService.showDialog(options);\r\n }\r\n\r\n function showResultsMessageAndRedirect() {\r\n toastr.success('Switch sucessfully requested.', 'Switch request');\r\n redirectToSearch();\r\n }\r\n\r\n function redirectToSearch() {\r\n $state.go('installations-switch-search');\r\n }\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n type: 'headingText',\r\n expressionProperties: {\r\n 'templateOptions.text': function() {\r\n return 'Please enter the proposed switch date for this installation and any relevant comments.';\r\n }\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'proposedDate',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateTodayOrInFutureValidator'],\r\n templateOptions: {\r\n label: 'Proposed switch date',\r\n required: true,\r\n datepickerOptions: {\r\n minDate: vm.minDate\r\n }\r\n }\r\n },\r\n {\r\n className: 'col-md-6',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comments',\r\n required: true,\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }\r\n\r\n ]\r\n }\r\n ];\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSwitchSearchController', InstallationsSwitchSearchController);\r\n\r\n function InstallationsSwitchSearchController(paginatedDataService, $state, $scope) {\r\n var vm = this;\r\n\r\n vm.model = {};\r\n vm.showTable = false;\r\n vm.formFields = formFields();\r\n\r\n vm.fetchData = function(tableData) {\r\n return paginatedDataService\r\n .fetchDataFromTableData('installation/switch/search', tableData, { fitId: vm.model.fitId, postcode: vm.model.postcode, osGridReference: vm.model.osGridReference, addressLine1: vm.model.addressLine1 });\r\n };\r\n\r\n function search() {\r\n vm.showTable = true;\r\n $scope.$broadcast('fit-table:searchChange', true);\r\n }\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'fitId',\r\n label: 'FIT ID',\r\n sort: true\r\n },\r\n {\r\n id: 'supplierName',\r\n label: 'Supplier',\r\n sort: true\r\n },\r\n {\r\n id: 'technologyType',\r\n label: 'Technology type',\r\n sort: true\r\n },\r\n {\r\n id: 'switchLink',\r\n label: 'Action',\r\n type: 'button',\r\n button: {\r\n text: 'Request Switch',\r\n type: 'btn-default',\r\n onClick: viewInstallation\r\n },\r\n permissions: ['ExternalSwitching']\r\n }\r\n ];\r\n \r\n vm.tableOptions = {};\r\n vm.tableOptions.noResultsMessage = 'A FIT installation cannot be found using these search criteria. Please check details and re-submit';\r\n\r\n function viewInstallation(installation) {\r\n $state.go('installations-switch-request', { installationId: installation.installationId });\r\n }\r\n\r\n function formFields() {\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-3',\r\n key: 'fitId',\r\n type: 'fitInput',\r\n optionsTypes: ['fitPrefixValidator'],\r\n templateOptions: {\r\n label: 'FIT ID',\r\n maxlength: 30,\r\n prefix: 'FIT'\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Postcode'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.required': function ($viewValue, $modelValue, scope) { return !scope.model.osGridReference; }\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'addressLine1',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Address Line 1'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.required': function ($viewValue, $modelValue, scope) { return !scope.model.osGridReference; }\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'osGridReference',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Installation OS Grid Reference'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.required': function($viewValue, $modelValue, scope) { return !scope.model.postcode; }\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search',\r\n btnType: 'secondary',\r\n onClick: search\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function () {\r\n return !vm.model.fitId || ((!vm.model.postcode || !vm.model.addressLine1) && !vm.model.osGridReference);\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n\r\n return fields;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .factory('installationSwitchService', installationSwitchService);\r\n\r\n function installationSwitchService(dataService, constants, constantUtils) {\r\n var service = {\r\n loadSwitchModel: loadSwitchModel,\r\n submitSwitchRequest: submitSwitchRequest,\r\n rejectSwitchRequest: rejectSwitchRequest,\r\n approveSwitchRequest: approveSwitchRequest,\r\n loadSwitchModelForCompletion: loadSwitchModelForCompletion,\r\n submitSwitchForCompletion: submitSwitchForCompletion,\r\n loadBaseColumns: loadBaseColumns,\r\n getDefaultSwitchStatusesForSearchView: getDefaultSwitchStatusesForSearchView,\r\n getMeterInfoModel : getMeterInfoModel\r\n };\r\n return service;\r\n\r\n function loadSwitchModel(id) {\r\n return dataService.fetchDataFromEndpointById('installation/switch', id);\r\n }\r\n\r\n function submitSwitchRequest(model) {\r\n return dataService.postToEndpoint('installation/switch', model);\r\n }\r\n\r\n function rejectSwitchRequest(id, model, operation) {\r\n return dataService.patchToEndpoint('installation/switch/' + id + '/' + operation, model);\r\n }\r\n\r\n function approveSwitchRequest(id) {\r\n return dataService.patchToEndpoint('installation/switch/' + id + '/approve');\r\n }\r\n\r\n function loadSwitchModelForCompletion(id) {\r\n return dataService.fetchDataFromEndpoint('installation/switch/' + id + '/complete');\r\n }\r\n\r\n function submitSwitchForCompletion(id, model) {\r\n return dataService.postToEndpoint('installation/switch/' + id + '/complete', model);\r\n }\r\n\r\n function getDefaultSwitchStatusesForSearchView(action) {\r\n if (action === 'pending') {\r\n return constantUtils.findConstantValue(constants.installationSwitchStatuses, 'Pending');\r\n }\r\n return null;\r\n }\r\n\r\n function loadBaseColumns(action) {\r\n var columns = [\r\n {\r\n id: 'fitId',\r\n label: 'FIT ID',\r\n sort: true\r\n },\r\n {\r\n id: 'proposedSwitchDate',\r\n label: 'Proposed switch date',\r\n type: 'date',\r\n sort: true\r\n }\r\n ];\r\n\r\n // columns in a specific order \r\n if (action === 'pending' || action === 'internal') {\r\n columns.push({\r\n id: 'toSupplierName',\r\n label: 'Requested by'\r\n });\r\n }\r\n\r\n if (action === 'raisedRequests' || action === 'internal') {\r\n columns.push({\r\n id: 'fromSupplierName',\r\n label: 'Current supplier'\r\n });\r\n }\r\n\r\n columns = columns.concat(\r\n [\r\n {\r\n id: 'technologyTypeName',\r\n label: 'Technology'\r\n },\r\n {\r\n id: 'switchRequestDate',\r\n label: 'Switch requested date',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n id: 'status',\r\n label: 'Status',\r\n sort: true\r\n }\r\n ]\r\n );\r\n\r\n columns.push({\r\n id: 'comment',\r\n label: 'Comments',\r\n type: 'tooltip',\r\n tooltip: {\r\n icon: 'file-text'\r\n }\r\n });\r\n\r\n return columns;\r\n }\r\n\r\n function getMeterInfoModel(installation) {\r\n return _.flatMap(installation.installationCapacities, addExtensionsToMeters);\r\n }\r\n\r\n function addExtensionsToMeters(capacity) {\r\n return _.map(capacity.meters,\r\n function (meter) {\r\n meter.extensionReference = capacity.extensionReference;\r\n return meter;\r\n });\r\n }\r\n \r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .component('installationSwitchDetails', installationSwitchDetails());\r\n\r\n function installationSwitchDetails() {\r\n return {\r\n restrict: 'AE',\r\n controller: 'InstallationsSwitchDetailsController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/installations/switching/installationDetails/installations-switch-details.html',\r\n bindings: {\r\n installation: '<'\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationsSwitchRejectController', InstallationsSwitchRejectController);\r\n\r\n function InstallationsSwitchRejectController($state, installationSwitchService, $uibModalInstance, model) {\r\n var vm = this;\r\n var action = model.action;\r\n\r\n vm.switchRejectionModel = {};\r\n vm.switchId = model.switchId;\r\n vm.onSubmit = submit;\r\n vm.title = null;\r\n vm.cancelSubmit = cancelSubmit;\r\n\r\n parseTitle();\r\n\r\n function parseTitle() {\r\n vm.title = action === 'reject'\r\n ? 'Decline switch request for ' + model.fitId\r\n : 'Cancel switch request for ' + model.fitId;\r\n }\r\n\r\n vm.loadModel = function () {\r\n return {\r\n comments: null\r\n };\r\n };\r\n\r\n function cancelSubmit() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function submit(submittedModel) {\r\n return installationSwitchService.rejectSwitchRequest(vm.switchId, submittedModel, action)\r\n .then(function () {\r\n $uibModalInstance.close();\r\n });\r\n }\r\n\r\n \r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-10',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: model.label,\r\n required: true,\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }\r\n\r\n ]\r\n }\r\n\r\n ];\r\n \r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationDocumentsTableController', InstallationDocumentsTableController);\r\n\r\n function InstallationDocumentsTableController(paginatedDataService, $stateParams, downloadService, $state) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n vm.visibility = vm.visibleExternally ? 'public' : 'internal';\r\n var baseEndpoint = null;\r\n\r\n if ($stateParams.installationId) {\r\n baseEndpoint = 'installation/' + $stateParams.installationId + '/documents/' + vm.visibility;\r\n } else {\r\n baseEndpoint = 'installationAmendment/' + $stateParams.installationAmendmentId + '/documents';\r\n }\r\n\r\n vm.uploadState = $state.current.name + '#uploadDocument-' + vm.visibility;\r\n\r\n vm.pagination = {\r\n itemsPerPage: 10,\r\n displayedPages: 7\r\n };\r\n\r\n vm.fetchData = function (tableData) {\r\n var endpoint = baseEndpoint;\r\n return paginatedDataService.fetchDataFromTableData(endpoint, tableData);\r\n };\r\n\r\n function downloadDocument(documentId) {\r\n var endpoint = baseEndpoint + '/' + documentId;\r\n downloadService.download(endpoint);\r\n }\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'id',\r\n displayProperty: 'filename',\r\n label: 'Filename',\r\n type: 'download',\r\n downloadFile: downloadDocument\r\n },\r\n {\r\n id: 'type',\r\n label: 'Type'\r\n },\r\n {\r\n id: 'uploadDate',\r\n type: 'date',\r\n label: 'Upload date'\r\n },\r\n {\r\n id: 'uploadedBy',\r\n label: 'Uploaded by'\r\n },\r\n {\r\n id: 'comment',\r\n label: 'Comment'\r\n }\r\n ];\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .directive('installationDocumentTable', installationDocumentTableDirective);\r\n\r\n function installationDocumentTableDirective() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/installations/tables/installation-document-table.html',\r\n scope: {\r\n hideUpload: '<',\r\n visibleExternally: '<'\r\n },\r\n controller: 'InstallationDocumentsTableController',\r\n controllerAs: '$table',\r\n bindToController: true\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .factory('installationsTariffService', installationsTariffService);\r\n\r\n function installationsTariffService($q, $state, dataService, eligibilityDateService, installationRulesService,\r\n installationStorageService, extensionStorageService, constants, constantUtils) {\r\n var service = {\r\n saveTariffAndEligibilityDatesForInstallation: saveTariffAndEligibilityDatesForInstallation,\r\n saveTariffAndEligibilityDatesForExtension: saveTariffAndEligibilityDatesForExtension,\r\n catchNoTariffs: catchNoTariffs\r\n };\r\n return service;\r\n\r\n function saveTariffAndEligibilityDatesForInstallation() {\r\n var model = buildModelForInstallation();\r\n return saveTariffAndEligibilityDates(model, installationStorageService);\r\n }\r\n\r\n function saveTariffAndEligibilityDatesForExtension() {\r\n var model = buildModelForExtension();\r\n return saveTariffAndEligibilityDates(model, extensionStorageService);\r\n }\r\n\r\n function saveTariffAndEligibilityDates(model, storage) {\r\n return saveTariff(model, storage).then(function() {\r\n return saveEligibilityDate(model, storage);\r\n }).then(function() {\r\n return saveEligibilityEndDate(model, storage);\r\n });\r\n }\r\n\r\n function buildModelForInstallation() {\r\n var licenceModel = installationStorageService.getLicenceModel();\r\n var basicsModel = installationStorageService.getBasicDetailsModel();\r\n var techModel = installationStorageService.getTechnologyModel();\r\n var multiSiteModel = installationStorageService.getMultiSiteModel();\r\n var efficiencyModel = installationStorageService.getEfficiencyModel();\r\n\r\n var shouldSendCommunity =\r\n installationRulesService.shouldShowPreRulesChangeCommunityQuestionsFromRegistrationModels(basicsModel, techModel)\r\n || installationRulesService.shouldShowPostRulesChangeCommunityQuestionsFromRegistrationModels(techModel);\r\n\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n basicsModel.installedCapacity,\r\n basicsModel.existingInstalledCapacity);\r\n\r\n var installType = installationRulesService.getPvInstallType(techModel);\r\n\r\n var efficiencyQuestionsNeeded = installationRulesService.shouldShowEfficiencyQuestions(\r\n basicsModel.installedCapacity,\r\n techModel.technologyType,\r\n techModel.applicationDate,\r\n techModel.commissioningDate,\r\n installType);\r\n\r\n return {\r\n mcsIssueDate: techModel.mcsIssueDate,\r\n technologyType: techModel.technologyType,\r\n totalInstalledCapacity: totalInstalledCapacity,\r\n installType: installType,\r\n eerType: efficiencyQuestionsNeeded\r\n ? efficiencyModel.eerType\r\n : null,\r\n isMultiSite:\r\n installationRulesService.shouldShowMultiSiteQuestionsFromInstallationModels(basicsModel, techModel)\r\n ? (multiSiteModel.multipleSiteGeneratorAnswer || multiSiteModel.multipleSiteNominatedRecipientAnswer)\r\n : null,\r\n applicationDate: techModel.applicationDate,\r\n eligibilityDateOverride: techModel.eligibilityDateOverride,\r\n commissioningDate: techModel.commissioningDate,\r\n preRegistrationDate: shouldSendCommunity ? techModel.preRegistrationDate : null,\r\n accreditationType: licenceModel.accreditationType,\r\n accreditationNumber: installationRulesService.getAccreditationNumber(licenceModel),\r\n communityType: shouldSendCommunity\r\n ? techModel.communityType\r\n : constantUtils.findConstantValue(constants.communityTypes, 'NotCommunityOrSchool')\r\n };\r\n }\r\n\r\n function buildModelForExtension() {\r\n var accreditationDetailsModel = extensionStorageService.getAccreditationModel();\r\n var existingDetailsModel = extensionStorageService.getExistingDetailsModel();\r\n var extensionDetailsModel = extensionStorageService.getExtensionDetailsModel();\r\n var efficiencyModel = extensionStorageService.getEfficiencyModel();\r\n var accreditationNumber = installationRulesService.getAccreditationNumber(accreditationDetailsModel);\r\n var totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n extensionDetailsModel.installedCapacity,\r\n existingDetailsModel.totalInstalledCapacity);\r\n\r\n var efficiencyQuestionsNeeded = installationRulesService.shouldShowEfficiencyQuestions(\r\n extensionDetailsModel.installedCapacity,\r\n existingDetailsModel.technologyType,\r\n existingDetailsModel.applicationDate,\r\n extensionDetailsModel.commissioningDate,\r\n extensionDetailsModel.installType);\r\n\r\n return {\r\n mcsIssueDate: null,\r\n technologyType: existingDetailsModel.technologyType,\r\n totalInstalledCapacity: totalInstalledCapacity,\r\n installType: extensionDetailsModel.installType,\r\n eerType: efficiencyQuestionsNeeded\r\n ? efficiencyModel.eerType\r\n : null,\r\n isMultiSite: existingDetailsModel.isMultiSite,\r\n applicationDate: existingDetailsModel.applicationDate,\r\n eligibilityDateOverride: extensionDetailsModel.eligibilityDateOverride,\r\n commissioningDate: extensionDetailsModel.commissioningDate,\r\n preRegistrationDate: existingDetailsModel.preRegistrationDate,\r\n accreditationType: accreditationDetailsModel.accreditationType,\r\n accreditationNumber: accreditationNumber,\r\n communityType: existingDetailsModel.communityType\r\n };\r\n }\r\n\r\n function saveTariff(tariffRequestModel, storage) {\r\n return getTariff(tariffRequestModel)\r\n .then(function(tariff) {\r\n storage.saveTariff(tariff);\r\n });\r\n }\r\n\r\n function getTariff(tariffRequestModel) {\r\n return getTariffLookupDate(tariffRequestModel)\r\n .then(function(lookupDate) {\r\n return performTariffRequest(lookupDate, tariffRequestModel);\r\n });\r\n }\r\n\r\n function performTariffRequest(lookupDate, tariffRequestModel) {\r\n var requestModel = {\r\n technologyType: tariffRequestModel.technologyType,\r\n totalInstalledCapacity: tariffRequestModel.totalInstalledCapacity,\r\n tariffLookupDate: lookupDate,\r\n installType: tariffRequestModel.installType,\r\n eerType: tariffRequestModel.eerType,\r\n isMultiSite: tariffRequestModel.isMultiSite,\r\n preRegistrationDate: tariffRequestModel.preRegistrationDate,\r\n applicationDate: tariffRequestModel.applicationDate,\r\n communityTypeId: tariffRequestModel.commissioningTypeId,\r\n mcsIssueDate: tariffRequestModel.mcsIssueDate,\r\n accreditationType: tariffRequestModel.accreditationType,\r\n accreditationNumber: tariffRequestModel.accreditationNumber,\r\n commissioningDate: tariffRequestModel.commissioningDate\r\n };\r\n\r\n return dataService\r\n .fetchDataFromEndpointWithParams('installation/tariff', requestModel)\r\n .catch(catchNoTariffs);\r\n }\r\n\r\n function catchNoTariffs(reason) {\r\n if (reason.status === 404) {\r\n if (angular.isDefined(reason.data)) {\r\n var message = reason.data.message;\r\n\r\n if (message === 'TARIFF_BREACHED') {\r\n $state.go('installationTariffBreached');\r\n } else if(message === 'TARIFF_NOT_FOUND_FIT_CLOSURE') {\r\n $state.go('installationRegistrationFitClosureError');\r\n } else {\r\n $state.go('installationNoTariff');\r\n }\r\n }\r\n } else {\r\n return $q.reject(reason);\r\n }\r\n }\r\n\r\n function getTariffLookupDate(tariffRequestModel) {\r\n var requestModel = getBaseLookupDateRequest(tariffRequestModel);\r\n requestModel.mcsIssueDate = tariffRequestModel.mcsIssueDate;\r\n\r\n return eligibilityDateService.getTariffLookupDate(requestModel);\r\n }\r\n\r\n function saveEligibilityDate(tariffRequestModel, storage) {\r\n return getEligibilityDate(tariffRequestModel, storage).then(function (eligibilityDate) {\r\n storage.saveEligibilityDate(eligibilityDate);\r\n });\r\n }\r\n\r\n function getEligibilityDate(tariffRequestModel, storage) {\r\n if (tariffRequestModel.accreditationType === constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit')) {\r\n // If we are creating a ROO-FIT installation, then we use the override provided.\r\n return $q.resolve(tariffRequestModel.eligibilityDateOverride);\r\n }\r\n\r\n var tariff = storage.getTariff();\r\n\r\n var requestModel = getBaseLookupDateRequest(tariffRequestModel);\r\n requestModel.mcsIssueDate = tariffRequestModel.mcsIssueDate;\r\n requestModel.tariffEligibleFromDate = tariff.eligibleFrom;\r\n\r\n return eligibilityDateService.getEligibilityDate(requestModel);\r\n }\r\n\r\n function saveEligibilityEndDate(tariffRequestModel, storage) {\r\n var requestModel = getBaseLookupDateRequest(tariffRequestModel);\r\n requestModel.eligibilityDate = storage.getEligibilityDate();\r\n requestModel.technologyType = tariffRequestModel.technologyType;\r\n requestModel.mcsIssueDate = tariffRequestModel.mcsIssueDate;\r\n\r\n return eligibilityDateService.getEligibilityEndDate(requestModel).then(function(eligibilityEndDate) {\r\n storage.saveEligibilityEndDate(eligibilityEndDate);\r\n });\r\n }\r\n\r\n function getBaseLookupDateRequest(tariffRequestModel) {\r\n return {\r\n applicationDate: tariffRequestModel.applicationDate,\r\n commissioningDate: tariffRequestModel.commissioningDate,\r\n preRegistrationDate: tariffRequestModel.preRegistrationDate,\r\n accreditationType: tariffRequestModel.accreditationType,\r\n accreditationNumber: tariffRequestModel.accreditationNumber,\r\n communityType: tariffRequestModel.communityType\r\n };\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .controller('InstallationTechnologyController', InstallationTechnologyController);\r\n\r\n function InstallationTechnologyController(moment, constants, WizardHandler, installationStorageService, $q, arrayUtils, dataService,\r\n installationCapacityService, installationRulesService, constantUtils, installationDetailsService) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n var mcsId = constantUtils.findConstantValue(constants.accreditationTypes, 'MCS');\r\n var rooFitId = constantUtils.findConstantValue(constants.accreditationTypes, 'RooFit');\r\n\r\n var microCHPId = constantUtils.findConstantValue(constants.technologyTypes, 'MicroCHP');\r\n var photovoltaicId = constantUtils.findConstantValue(constants.technologyTypes, 'Photovoltaic');\r\n var windId = constantUtils.findConstantValue(constants.technologyTypes, 'Wind');\r\n\r\n vm.saving = false;\r\n vm.model = getModelFromStorage();\r\n vm.formState = {};\r\n vm.fields = getFormFields();\r\n vm.storage = installationStorageService;\r\n vm.entryHandler = {\r\n handler: refreshModels,\r\n key: 'technology'\r\n };\r\n\r\n vm.next = next;\r\n\r\n vm.fitClosure = {\r\n date: moment(constants.fitConstants.fitClosureDate),\r\n errors: []\r\n };\r\n\r\n // The following two methods are special cases, and are validation directly on the next button, with error messages\r\n // shown in alerts.\r\n // This is because the technology type formly field is a radio button, which have issues with validation (see:\r\n // https://github.com/formly-js/angular-formly/issues/605#issuecomment-173033358).\r\n\r\n vm.invalidTechType = invalidTechType;\r\n vm.techTypeInvalidatesDeclaredNetCapacity = techTypeInvalidatesDeclaredNetCapacity;\r\n vm.techTypeInvalidatesInstalledCapacity = techTypeInvalidatesInstalledCapacity;\r\n\r\n vm.techSpecificDeclaredCapacityMinimumKilowatts = constants.fitConstants.techSpecificDeclaredCapacityMinimumKilowatts;\r\n vm.microCHPInstalledCapacityLimitKilowatts = constants.fitConstants.microCHPInstalledCapacityLimitKilowatts;\r\n\r\n function next() {\r\n vm.saving = true;\r\n\r\n return $q.all([\r\n correctModelForApplicationDate(),\r\n performFITClosureCheck(),\r\n performCommunityCheck(),\r\n performDuplicateCheck()\r\n ])\r\n .then(function () {\r\n return saveAndMoveToNextPage();\r\n })\r\n .catch(function (err) {\r\n if (angular.isUndefined(err)) {\r\n return $q.resolve();\r\n }\r\n return $q.reject(err);\r\n })\r\n .finally(function () {\r\n vm.saving = false;\r\n });\r\n }\r\n\r\n function performFITClosureCheck() {\r\n return $q(function (resolve, reject) {\r\n var fitClosureModel = getFITClosureModel();\r\n\r\n dataService\r\n .postToEndpoint('installation/fitClosure/inEffect', fitClosureModel)\r\n .then(function (response) {\r\n var errors = response.data.data;\r\n\r\n vm.fitClosure.errors = errors;\r\n\r\n if (_.isEmpty(errors)) {\r\n resolve();\r\n } else {\r\n reject();\r\n }\r\n });\r\n });\r\n }\r\n\r\n function performCommunityCheck() {\r\n vm.foundCommunityRefMatch = false;\r\n\r\n if (!installationRulesService.shouldShowCommunityReference(vm.model.communityType)) {\r\n // If we are not showing the community reference, then we do not need to check it's uniqueness!\r\n return $q.resolve();\r\n }\r\n\r\n var communityRefParams = { communityReferenceNumber: vm.model.communityReferenceNumber };\r\n\r\n return $q(function (resolve, reject) {\r\n dataService.fetchDataFromEndpointWithParams('installation/communityReference/availability', communityRefParams).then(function (isUnique) {\r\n if (isUnique) {\r\n resolve();\r\n } else {\r\n vm.foundCommunityRefMatch = true;\r\n reject();\r\n }\r\n });\r\n });\r\n }\r\n\r\n function performDuplicateCheck() {\r\n if (vm.formState.foundInstallationMatch) {\r\n // If we have already warned the user of a possible match, we do not need to re-check this.\r\n return $q.resolve();\r\n }\r\n\r\n var checkMatchParams = {\r\n technologyTypeId: vm.model.technologyType,\r\n address: vm.formState.address,\r\n osGridReference: vm.formState.gridReference\r\n };\r\n\r\n return $q(function (resolve, reject) {\r\n dataService.fetchDataFromEndpointWithParams('installation/match', checkMatchParams).then(function (matches) {\r\n if (matches.length === 0) {\r\n resolve();\r\n } else {\r\n vm.matchingInstallationIds = matches;\r\n vm.formState.foundInstallationMatch = true;\r\n reject();\r\n }\r\n });\r\n });\r\n }\r\n\r\n function saveAndMoveToNextPage() {\r\n installationStorageService.saveTechnologyModel(vm.model);\r\n WizardHandler.wizard().next();\r\n return $q.when();\r\n }\r\n\r\n function correctModelForApplicationDate() {\r\n // Outside of this page, where we choose whether to show a user dateTime or date, the\r\n // difference between applicationDateTime and applicationDate is irrelevant; therefore,\r\n // we merge\r\n if (installationRulesService.shouldUseApplicationDateTime(vm.formState.accreditationType)) {\r\n vm.model.applicationDate = vm.model.applicationDateTime;\r\n }\r\n }\r\n\r\n function refreshModels() {\r\n // We must refresh the installation type and capacity on entry to ensure that we have up to date models.\r\n var licenceModel = installationStorageService.getLicenceModel();\r\n var generator = installationStorageService.getGenerator();\r\n var nominatedRecipient = installationStorageService.getNominatedRecipient();\r\n var addressModel = installationStorageService.getAddressModel();\r\n var basicDetailsModel = installationStorageService.getBasicDetailsModel();\r\n\r\n vm.formState.accreditationType = licenceModel.accreditationType;\r\n vm.formState.accreditationNumber = installationRulesService.getAccreditationNumber(licenceModel);\r\n\r\n var expectingGridRef = installationRulesService.expectingGridReference(addressModel);\r\n\r\n vm.formState.address = !expectingGridRef ? installationRulesService.getCurrentAddress(addressModel, generator, nominatedRecipient) : null;\r\n vm.formState.gridReference = expectingGridRef ? addressModel.gridReference : null;\r\n\r\n // On re-entry to this page, it is possible that address details for the installation may have changed, so\r\n // we reset the duplicate match to ensure that it gets re-run.\r\n vm.formState.foundInstallationMatch = false;\r\n\r\n vm.formState.installedCapacity = basicDetailsModel.installedCapacity;\r\n vm.formState.declaredNetCapacity = basicDetailsModel.declaredNetCapacity;\r\n vm.formState.existingInstalledCapacity = basicDetailsModel.existingInstalledCapacity;\r\n vm.formState.totalInstalledCapacity = installationRulesService.getTotalInstalledCapacity(\r\n basicDetailsModel.installedCapacity,\r\n basicDetailsModel.existingInstalledCapacity);\r\n\r\n setTechTypeOptions();\r\n setExportOptions();\r\n }\r\n\r\n function setTechTypeOptions() {\r\n var techTypeField = _.find(vm.fields, function (field) { return field.key === 'technologyType'; });\r\n if (vm.formState.accreditationType === mcsId) {\r\n techTypeField.templateOptions.options = constants.mcsTechnologyTypes;\r\n } else {\r\n techTypeField.templateOptions.options = constants.roofitTechnologyTypes;\r\n }\r\n }\r\n\r\n function setExportOptions() {\r\n var exportStatusField = _.find(vm.fields, function (field) { return field.key === 'exportStatus'; });\r\n if (vm.formState.installedCapacity <= constants.fitConstants.exportCapacityCutoff) {\r\n exportStatusField.templateOptions.options = constants.lowCapacityExportStatuses;\r\n } else {\r\n exportStatusField.templateOptions.options = constants.highCapacityExportStatuses;\r\n }\r\n }\r\n\r\n function invalidTechType() {\r\n return techTypeInvalidatesInstalledCapacity() || techTypeInvalidatesDeclaredNetCapacity();\r\n }\r\n\r\n function techTypeInvalidatesDeclaredNetCapacity() {\r\n var techType = vm.model.technologyType;\r\n\r\n if (vm.formState.accreditationType === rooFitId\r\n && (techType === windId\r\n || techType === photovoltaicId)) {\r\n return vm.formState.declaredNetCapacity < constants.fitConstants.techSpecificDeclaredCapacityMinimumKilowatts;\r\n }\r\n return false;\r\n }\r\n\r\n function techTypeInvalidatesInstalledCapacity() {\r\n var techType = vm.model.technologyType;\r\n\r\n if (techType === microCHPId) {\r\n return vm.formState.installedCapacity > constants.fitConstants.microCHPInstalledCapacityLimitKilowatts;\r\n }\r\n return false;\r\n }\r\n\r\n function getFormFields() {\r\n var initialFields = installationDetailsService.getPreInstallTypeTechnologyFields();\r\n\r\n var installTypeFields = [{\r\n key: 'installType',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n label: 'Please choose the specific photovoltaic installation type:',\r\n required: true,\r\n options: constants.photovoltaicInstallTypes\r\n },\r\n hideExpression: function (viewValue, modelValue, scope) {\r\n return !installationRulesService.requiresInstallType(scope.model.technologyType);\r\n },\r\n expressionProperties: {\r\n 'templateOptions.options': function (viewValue, modelValue, scope) {\r\n return installationRulesService.installTypeOptions(scope.formState.totalInstalledCapacity);\r\n }\r\n }\r\n }];\r\n\r\n var applicationDateFields = installationDetailsService.getApplicationDateFields('applicationDate', false);\r\n var applicationDateTimeFields = installationDetailsService.getApplicationDateFields('applicationDateTime', true);\r\n var eligibilityDateOverrideFields = installationDetailsService.getEligibilityDateOverrideFields();\r\n var postInstallTypeFields = installationDetailsService.getPostInstallTypeTechnologyFields();\r\n var capacityFields = installationCapacityService.getCapacityDateFields();\r\n var finalFields = installationDetailsService.getPostCommissioningDateTechnologyFields();\r\n var communityFields = installationDetailsService.getCommunityFields();\r\n var mcsIssueDateFields = installationCapacityService.getMcsIssueDateFields();\r\n\r\n var commissioningDateField = arrayUtils.findByProp(capacityFields, 'key', 'commissioningDate');\r\n commissioningDateField.validators['beforeApplicationDate'] = {\r\n expression: commissioningDateIsSameOrBeforeApplicationDate,\r\n message: '\"The commissioning date must be the same as or before the application date.\"'\r\n };\r\n commissioningDateField.validators['afterApplicationDateForRoofit'] = {\r\n expression: commissioningDateIsAfterApplicationDateForRoofit,\r\n message: '\"The commissioning date must be after the application date.\"'\r\n };\r\n\r\n applicationDateFields[0].hideExpression = function (viewValue, modelValue, scope) {\r\n var accreditationType = scope.options.formState.accreditationType;\r\n return installationRulesService.shouldUseApplicationDateTime(accreditationType);\r\n };\r\n\r\n applicationDateTimeFields[0].hideExpression = function (viewValue, modelValue, scope) {\r\n var accreditationType = scope.options.formState.accreditationType;\r\n return !installationRulesService.shouldUseApplicationDateTime(accreditationType);\r\n };\r\n\r\n //mcsIssueDateFields[0].hideExpression = function (viewValue, modelValue, scope) {\r\n // return installationCapacityService.hide(viewValue, modelValue, scope);\r\n //};\r\n\r\n //eligibilityDateOverrideFields[0].hideExpression = function (viewValue, modelValue, scope) { \r\n // return installationDetailsService.hideEligibilityDateOverride(viewValue, modelValue, scope);\r\n //};\r\n\r\n var communityTypeField = arrayUtils.findByProp(communityFields, 'key', 'communityType');\r\n communityTypeField.expressionProperties = {\r\n 'templateOptions.options': function () {\r\n var basicDetailsModel = installationStorageService.getBasicDetailsModel();\r\n var hasPreRulesChangeOpts = installationRulesService.shouldShowPreRulesChangeCommunityQuestionsFromRegistrationModels(\r\n basicDetailsModel,\r\n vm.model);\r\n var hasPostRulesChangeOpts = installationRulesService.shouldShowPostRulesChangeCommunityQuestionsFromRegistrationModels(\r\n vm.model);\r\n\r\n if (hasPreRulesChangeOpts && hasPostRulesChangeOpts) {\r\n return constants.communityTypes;\r\n }\r\n else if (hasPreRulesChangeOpts && !hasPostRulesChangeOpts) {\r\n return constants.oldCommunityTypes;\r\n }\r\n else if (!hasPreRulesChangeOpts && hasPostRulesChangeOpts) {\r\n return constants.newCommunityTypes;\r\n } else {\r\n return [];\r\n }\r\n }\r\n };\r\n\r\n var communityFieldGroup = {\r\n fieldGroup: communityFields,\r\n hideExpression: function () {\r\n var basicDetailsModel = installationStorageService.getBasicDetailsModel();\r\n\r\n var showPreRuleChangeQuestions = installationRulesService.shouldShowPreRulesChangeCommunityQuestionsFromRegistrationModels(\r\n basicDetailsModel, vm.model);\r\n var showPostRuleChangeQuestions = installationRulesService.shouldShowPostRulesChangeCommunityQuestionsFromRegistrationModels(\r\n vm.model);\r\n\r\n return !(showPreRuleChangeQuestions || showPostRuleChangeQuestions);\r\n }\r\n };\r\n\r\n return initialFields\r\n .concat(installTypeFields)\r\n .concat(postInstallTypeFields)\r\n .concat(applicationDateFields)\r\n .concat(applicationDateTimeFields)\r\n .concat(eligibilityDateOverrideFields)\r\n .concat(capacityFields)\r\n .concat([communityFieldGroup])\r\n .concat(mcsIssueDateFields)\r\n .concat(finalFields);\r\n }\r\n\r\n function commissioningDateIsSameOrBeforeApplicationDate(viewValue, modelValue, scope) {\r\n var value = modelValue || viewValue;\r\n\r\n var applicationDateModelValue =\r\n installationRulesService.shouldUseApplicationDateTime(scope.formState.accreditationType)\r\n ? scope.model.applicationDateTime\r\n : scope.model.applicationDate;\r\n\r\n var currentApplicationDate = applicationDateModelValue || scope.formState.applicationDate;\r\n\r\n if (scope.formState.accreditationType === rooFitId) {\r\n if ((_.startsWith(scope.formState.accreditationNumber, 'F')\r\n && moment(currentApplicationDate).isBefore(constants.fitConstants.capacityCapStartDate))\r\n || _.startsWith(scope.formState.accreditationNumber, 'P')) {\r\n // If installation is ROO-FIT, and either prelim (starts with a P) or Full and before the capacity cap date then we can ignore the rule\r\n return true;\r\n }\r\n }\r\n return moment(value).isSameOrBefore(currentApplicationDate);\r\n }\r\n\r\n function commissioningDateIsAfterApplicationDateForRoofit(viewValue, modelValue, scope) {\r\n var value = modelValue || viewValue;\r\n\r\n var applicationDateModelValue =\r\n installationRulesService.shouldUseApplicationDateTime(scope.formState.accreditationType)\r\n ? scope.model.applicationDateTime\r\n : scope.model.applicationDate;\r\n\r\n var currentApplicationDate = applicationDateModelValue || scope.formState.applicationDate;\r\n\r\n if (scope.formState.accreditationType === rooFitId) {\r\n if (_.startsWith(scope.formState.accreditationNumber, 'P')) {\r\n // This rule only applies to prelim roofit installations\r\n return moment(value).isAfter(currentApplicationDate);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n function getModelFromStorage() {\r\n var technologyModel = installationStorageService.getTechnologyModel();\r\n\r\n // The datepicker returns dates as a value; we need to convert them into a string for display,\r\n // if they are a valid date.\r\n technologyModel.applicationDate = technologyModel.applicationDate\r\n ? new Date(technologyModel.applicationDate)\r\n : null;\r\n technologyModel.applicationDateTime = technologyModel.applicationDateTime\r\n ? new Date(technologyModel.applicationDateTime)\r\n : null;\r\n technologyModel.eligibilityDateOverride = technologyModel.eligibilityDateOverride\r\n ? new Date(technologyModel.eligibilityDateOverride)\r\n : null;\r\n technologyModel.commissioningDate = technologyModel.commissioningDate\r\n ? new Date(technologyModel.commissioningDate)\r\n : null;\r\n technologyModel.mcsIssueDate = technologyModel.mcsIssueDate\r\n ? new Date(technologyModel.mcsIssueDate)\r\n : null;\r\n technologyModel.preRegistrationDate = technologyModel.preRegistrationDate\r\n ? new Date(technologyModel.preRegistrationDate)\r\n : null;\r\n\r\n return technologyModel;\r\n }\r\n\r\n function getFITClosureModel() {\r\n return {\r\n mcsIssueDate: vm.model.mcsIssueDate,\r\n applicationDate: vm.model.applicationDate,\r\n preRegistrationDate: vm.model.preRegistrationDate,\r\n communityType: vm.model.communityType,\r\n accreditationType: vm.formState.accreditationType,\r\n accreditationNumber: vm.formState.accreditationNumber,\r\n commissioningDate: vm.model.commissioningDate\r\n };\r\n }\r\n };\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n\t\t.module('app.landing')\r\n\t\t.controller('LandingPageController', LandingPageController);\r\n\r\n function LandingPageController(updateDataInternal, updateDataExternal, principal, $state, dataService) {\r\n var vm = this;\r\n\r\n vm.formFields = formFields();\r\n vm.error = '';\r\n vm.submit = search;\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Search'\r\n }\r\n };\r\n\r\n // Needed because permissions-only directive acts like an ng-show, but we need ng-if to stop unwanted API requests.\r\n vm.hasTaskPermissions = principal.hasRole('FitGroup') || principal.hasRole('ExternalEditInstallation') || principal.hasRole('ExternalCreateInstallation');\r\n\r\n if (principal.isInternal())\r\n vm.update = updateDataInternal.text.text ? updateDataInternal.text.text : 'No updates at this time';\r\n else if (principal.isExternal())\r\n vm.update = updateDataExternal.text.text ? updateDataExternal.text.text : 'No updates at this time' ;\r\n else\r\n throw new Error('Authenticated user is neither external nor internal');\r\n\r\n function formFields() {\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n key: 'prefixedId',\r\n type: 'fitInput',\r\n optionsTypes: ['fitPrefixValidator'],\r\n templateOptions: {\r\n label: 'Search by Id',\r\n maxlength: 30,\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'Please enter the ID of a Generator, Nominated recipient, Supplier or Installation and' + \r\n 'press Search to display the relevant record. Please start your search with the relevant prefix (GEN, NR, SUP or FIT).'\r\n },\r\n prefix: principal.hasRole('ExternalEditInstallation') ? 'FIT' : ['FIT', 'GEN', 'SUP', 'NR']\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n\r\n return fields;\r\n }\r\n\r\n var prefixFindEntityMap = {\r\n 'GEN': 'generator',\r\n 'SUP': 'suppliers',\r\n 'FIT': 'installation',\r\n 'NR': 'nominatedRecipient'\r\n };\r\n\r\n var prefixGoToEntityMap = {\r\n 'GEN': goToGenerator,\r\n 'SUP': goToSupplier,\r\n 'FIT': goToInstallation,\r\n 'NR': goToNominatedRecipient\r\n };\r\n\r\n function search(model) {\r\n var prefixIdPair = getPrefixIdPair(model.prefixedId);\r\n\r\n vm.prefix = prefixIdPair[1].toUpperCase();\r\n vm.id = prefixIdPair[2];\r\n vm.error = '';\r\n\r\n \r\n return findEntity()\r\n .then(loadEntity)\r\n .catch(displayError);\r\n }\r\n\r\n function findEntity() {\r\n return dataService.fetchDataFromEndpointById(prefixFindEntityMap[vm.prefix], vm.id);\r\n }\r\n\r\n function loadEntity() {\r\n prefixGoToEntityMap[vm.prefix](vm.id);\r\n }\r\n\r\n function displayError(response) {\r\n vm.error = response.status === 404\r\n ? 'No records found.'\r\n : 'An unknown error occurred.';\r\n }\r\n\r\n function getPrefixIdPair(id) {\r\n var pattern = '^([a-zA-Z]+)(\\\\d+)$';\r\n return id.match(pattern);\r\n }\r\n\r\n function goToGenerator(id) {\r\n $state.go('generators-search#generator', { id: id });\r\n }\r\n\r\n function goToSupplier(id) {\r\n $state.go('supplier', {supplierId: id});\r\n }\r\n \r\n function goToInstallation(id) {\r\n $state.go('installations-search#installation-details', {installationId: id});\r\n }\r\n \r\n function goToNominatedRecipient(id) {\r\n $state.go('nominatedRecipient', { id: id });\r\n }\r\n\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.landing')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'landing',\r\n config: {\r\n templateUrl: 'app/landingPage/landing.html',\r\n url: '/landing',\r\n controller: 'LandingPageController',\r\n controllerAs: 'vm',\r\n title: 'Welcome',\r\n data: {\r\n permissions: {\r\n only: ['Authenticated']\r\n }\r\n },\r\n resolve: {\r\n updateDataInternal: ['siteTextService', function (siteTextService) {\r\n return siteTextService.getTextValue('MessagesInternal');\r\n }],\r\n updateDataExternal: ['siteTextService', function (siteTextService) {\r\n return siteTextService.getTextValue('MessagesExternal');\r\n }]\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app.landing')\r\n .component('landingTaskBar', {\r\n templateUrl: 'app/landingPage/landing-task-bar.html',\r\n controller: 'LandingTaskBarController',\r\n controllerAs: 'vm'\r\n });\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n\t\t.module('app.landing')\r\n\t\t.controller('LandingTaskBarController', LandingTaskBarController);\r\n\r\n function LandingTaskBarController(principal, $state, constants, dataService, installationConversationService) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.isInternal = principal.isInternal();\r\n vm.taskTypes = getTaskTypeOptions();\r\n vm.getCsvData = getCsvDataFunc;\r\n vm.showConversationDialog = showConversationDialog;\r\n vm.messageTypes = constants.messageTypes;\r\n\r\n vm.tableParams = null;\r\n vm.setFilters = setFilters;\r\n\r\n vm.endpoints = {\r\n getUsers: 'tasks/fitUsers',\r\n assignMany: 'tasks/assignMany',\r\n getPaginatedTasks: 'tasks'\r\n };\r\n\r\n vm.csvOptions = {\r\n getFunction: getCsvDataFunc,\r\n csvColumns: ['dateSubmitted', 'taskTypeName', 'installationId', 'createdBy', 'assigneeName', 'message'],\r\n csvHeaders: ['Date submitted', 'Type', 'ID', 'Created by', 'Internal assignee', 'Latest message']\r\n };\r\n\r\n vm.getAssignParamsFromTask = getAssignParamsFromTask;\r\n\r\n vm.taskOrderByOptions = {\r\n field: 'orderingId',\r\n options: constants.taskOrderByOptions\r\n };\r\n\r\n vm.landingColumns = [\r\n {\r\n id: 'dateSubmitted',\r\n label: 'Date submitted',\r\n type: 'dateTime'\r\n }, {\r\n label: 'Type',\r\n id: 'taskTypeName'\r\n }, {\r\n type: 'conditional',\r\n label: 'ID',\r\n condition: getTaskType,\r\n states:\r\n {\r\n 'InstallationEdit': {\r\n id: 'installationId',\r\n displayProperty: 'installationFitId',\r\n type: 'link',\r\n state: 'installations-search#installation-details#viewEdit',\r\n newStateIdProperty: 'installationId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n },\r\n 'NewExtension': {\r\n id: 'installationId',\r\n displayProperty: 'installationFitId',\r\n type: 'link',\r\n state: 'installations-search#installation-details#viewExtension',\r\n newStateIdProperty: 'installationId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n },\r\n 'NewInstallation': {\r\n id: 'installationAmendmentId',\r\n displayProperty: 'accreditationNumber',\r\n type: 'link',\r\n state: 'approve-installation',\r\n newStateIdProperty: 'installationAmendmentId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n },\r\n 'NewSupplier': {\r\n id: 'supplierId',\r\n displayProperty: 'supplierName',\r\n label: 'Supplier',\r\n type: 'link',\r\n state: 'supplier',\r\n newStateIdProperty: 'supplierId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n },\r\n 'CapacityStatusChange': {\r\n id: 'installationCapacityId',\r\n displayProperty: 'extensionReference',\r\n type: 'link',\r\n state: 'installations-search#installation-details#viewStatusChange',\r\n newStateIdProperty: 'capacityId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n },\r\n 'ReassignGenerator': {\r\n id: 'installationId',\r\n displayProperty: 'installationFitId',\r\n type: 'link',\r\n state: 'installations-search#installation-details#viewRecipientReassignment',\r\n newStateIdProperty: 'installationId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n },\r\n 'ReassignNominatedRecipient': {\r\n id: 'installationId',\r\n displayProperty: 'installationFitId',\r\n type: 'link',\r\n state: 'installations-search#installation-details#viewRecipientReassignment',\r\n newStateIdProperty: 'installationId',\r\n params: '{ capacityId: data.installationCapacityId, installationId: data.installationId, supplierId: data.supplierId, installationAmendmentId: data.installationAmendmentId, assigneeName: data.assigneeName }'\r\n }\r\n }\r\n }, {\r\n id: 'createdBy',\r\n label: 'Created by',\r\n valueTemplate: '{{data.createdBy ? data.createdBy : \"N/A\"}}'\r\n }, {\r\n label: '',\r\n type: 'custom',\r\n updateCell: function (cell) {\r\n cell.id = 'isOverdue';\r\n },\r\n html: '
    KPI exceeded: this task has not been updated in 5 weekdays
    '\r\n }];\r\n vm.landingFilters = getLandingFilters();\r\n\r\n function getLandingFilters() {\r\n return [\r\n {\r\n name: 'task type',\r\n id: 'filter-taskType',\r\n model: 'taskType',\r\n values: vm.taskTypes,\r\n isInternalOnly: false\r\n }\r\n ];\r\n }\r\n\r\n // Needed because permissions-only directive acts like an ng-show, but we need ng-if to stop unwanted API requests.\r\n vm.hasTaskPermissions = principal.hasRole('FitGroup') || principal.hasRole('ExternalEditInstallation') || principal.hasRole('ExternalCreateInstallation');\r\n\r\n function getAssignParamsFromTask(task) {\r\n return {\r\n supplierId: task.supplierId,\r\n installationAmendmentId: task.installationAmendmentId\r\n };\r\n }\r\n\r\n function setFilters(filters) {\r\n vm.tableParams = filters;\r\n }\r\n\r\n function getTaskType(task) {\r\n return _.find(vm.taskTypes, ['value', task.taskType]).code;\r\n }\r\n\r\n function getTaskTypeOptions() {\r\n if (vm.isInternal) {\r\n return constants.internalTaskTypes;\r\n }\r\n var taskTypes = [];\r\n if (principal.hasRole('ExternalCreateInstallation')) {\r\n taskTypes = _.concat(taskTypes, constants.externalCreateTaskTypes);\r\n }\r\n if (principal.hasRole('ExternalEditInstallation')) {\r\n taskTypes = _.concat(taskTypes, constants.externalEditTaskTypes);\r\n }\r\n\r\n return taskTypes;\r\n }\r\n\r\n function getCsvDataFunc() {\r\n var endpoint = 'tasks/filteredTasks';\r\n return dataService.fetchDataFromEndpointWithParams(endpoint, vm.tableParams).then(parseCsvResult);\r\n\r\n function parseCsvResult(response) {\r\n var data = response;\r\n var list = [];\r\n data.forEach(mapData);\r\n function mapData(item) {\r\n list.push(\r\n {\r\n dateSubmitted: moment(item.dateSubmitted).format('DD/MM/YYYY (HH:mm:ss)'),\r\n taskTypeName: item.taskTypeName,\r\n installationId: parseInstallationId(item),\r\n createdBy: item.createdBy,\r\n assigneeName: item.assigneeName != null ? item.assigneeName : 'None',\r\n message: item.mostRecentExternalMessage != null ? item.mostRecentExternalMessage.message : ' '\r\n });\r\n }\r\n return list;\r\n }\r\n\r\n function parseInstallationId(item) {\r\n var taskType = getTaskType(item);\r\n if (taskType === 'InstallationEdit') return item.installationFitId;\r\n if (taskType === 'NewExtension') return item.installationFitId;\r\n if (taskType === 'NewInstallation') return item.accreditationNumber;\r\n if (taskType === 'NewSupplier') return item.supplierName;\r\n if (taskType === 'CapacityStatusChange') return item.extensionReference;\r\n if (taskType === 'ReassignGenerator') return item.installationFitId;\r\n if (taskType === 'ReassignNominatedRecipient') return item.installationFitId;\r\n return '';\r\n }\r\n }\r\n\r\n function showConversationDialog(task) {\r\n var buttonOptions = {\r\n showNavigationButton: true,\r\n buttonText: 'View Details'\r\n };\r\n return installationConversationService\r\n .showConversationDialog(false,\r\n task.installationAmendmentId,\r\n task.installationId,\r\n buttonOptions,\r\n getTaskType(task),\r\n task.installationCapacityId);\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n \r\n angular\r\n .module('app.layout')\r\n .component('environmentFlag', environmentFlag());\r\n\r\n function environmentFlag() {\r\n return {\r\n templateUrl: 'app/layout/environmentFlag.html',\r\n controller: 'EnvironmentFlagController',\r\n controllerAs: 'vm',\r\n bindings: {\r\n environment: '<',\r\n colour: '<'\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.layout')\r\n .controller('EnvironmentFlagController', EnvironmentFlagController);\r\n\r\n function EnvironmentFlagController() {\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.layout')\r\n .controller('NavbarController', NavbarController);\r\n\r\n function NavbarController($window, $scope, principal, loginService, constants) {\r\n var vm = this;\r\n vm.logout = logout;\r\n vm.name = principal.name();\r\n\r\n switch (constants.environment) {\r\n case 'qaa':\r\n {\r\n vm.environment = 'QAA';\r\n vm.backgroundColour = '#C08C8C';\r\n }\r\n break;\r\n case 'uata':\r\n {\r\n vm.environment = 'UAT';\r\n vm.backgroundColour = '#AEC08C';\r\n }\r\n break;\r\n case 'preprod':\r\n {\r\n vm.environment = 'PreProd';\r\n vm.backgroundColour = '#C3B889';\r\n }\r\n break;\r\n case 'qab':\r\n {\r\n vm.environment = 'QAB';\r\n vm.backgroundColour = '#FFCC6D';\r\n }\r\n break;\r\n default:\r\n {\r\n vm.environment = null;\r\n }\r\n break;\r\n }\r\n\r\n function logout() {\r\n loginService.logout();\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('EditLevelisationDataController', EditLevelisationDataController);\r\n\r\n function EditLevelisationDataController(levelisationDataService, dataService, $state,\r\n $stateParams, formUtils, $q, levelisationConversationService, principal, $uibModal, toastr, constants) {\r\n var vm = this;\r\n vm.levelisation = {};\r\n vm.levelisationViewModel = {};\r\n var levelisationId = $stateParams.levelisationId;\r\n var licenceId = $stateParams.licenceId;\r\n vm.formFields = [];\r\n vm.installationData = {};\r\n vm.licenceDetails = {};\r\n vm.levelisationData = {};\r\n vm.isFit = false;\r\n\r\n vm.getLevelisationData = getLevelisationData;\r\n vm.loadData = loadData;\r\n vm.cancel = returnToSelectPage;\r\n vm.save = save;\r\n vm.paramsForAssignment = [];\r\n vm.getAssignTask = checkTaskExists;\r\n vm.openInternalConversation = openInternalConversation;\r\n vm.openExternalConversation = openExternalConversation;\r\n\r\n function loadData() {\r\n return $q.all([\r\n fetchLevelisationData()\r\n .then(fetchInstallationData),\r\n fetchLevelisation(),\r\n fetchLevelisationViewModel(),\r\n fetchLicence()\r\n ])\r\n .then(setFormFields);\r\n }\r\n\r\n function getLevelisationData() {\r\n return vm.levelisationData;\r\n }\r\n\r\n function fetchLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', licenceId)\r\n .then(setLicenceData);\r\n }\r\n\r\n function setLicenceData(licence) {\r\n vm.licenceDetails = licence;\r\n }\r\n\r\n function fetchLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/summary')\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function fetchLevelisationViewModel() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/levelisationViewModel')\r\n .then(setLevelisationViewModel);\r\n }\r\n\r\n function setLevelisationDetails(levelisation) {\r\n vm.levelisation = levelisation;\r\n }\r\n\r\n function setLevelisationViewModel(levelisationViewModel) {\r\n vm.levelisationViewModel = levelisationViewModel;\r\n }\r\n\r\n function fetchInstallationData() {\r\n if (vm.isFit) {\r\n return dataService.fetchDataFromEndpointWithParams('levelisations/' + $stateParams.levelisationId\r\n + '/data/' + licenceId + '/installationSummary').then(setInstallationData);\r\n }\r\n return $q.when();\r\n }\r\n\r\n function setInstallationData(data) {\r\n vm.installationData = data;\r\n }\r\n\r\n function fetchLevelisationData() {\r\n return levelisationDataService\r\n .fetch(levelisationId, licenceId)\r\n .then(formatFields);\r\n }\r\n\r\n function formatFields(levelisationData) {\r\n levelisationData.totalElectricitySupplied = formUtils.formatElectricity(levelisationData.totalElectricitySupplied);\r\n levelisationData.totalExemptGreenImportElectricitySupplied = formUtils.formatElectricity(levelisationData.totalExemptGreenImportElectricitySupplied);\r\n levelisationData.totalEiiElectricitySupplied = formUtils.formatElectricity(levelisationData.totalEiiElectricitySupplied);\r\n levelisationData.totalEiiExemptExcludedElectricitySupplied = formUtils.formatElectricity(levelisationData.totalEiiExemptExcludedElectricitySupplied);\r\n\r\n levelisationData.totalFitGenerationPaymentDue = formUtils.formatAsCurrency(levelisationData.totalFitGenerationPaymentDue);\r\n levelisationData.totalFitExportPaymentDue = formUtils.formatAsCurrency(levelisationData.totalFitExportPaymentDue);\r\n levelisationData.totalFitDeemedExportPaymentDue = formUtils.formatAsCurrency(levelisationData.totalFitDeemedExportPaymentDue);\r\n levelisationData.totalDeemedElectricity = formUtils.formatElectricity(levelisationData.totalDeemedElectricity);\r\n levelisationData.dateOfRevocation = formUtils.convertToDate(levelisationData.dateOfRevocation);\r\n levelisationData.licenceRevoked = levelisationData.licenceRevoked;\r\n\r\n formatLevelisation2019Fields(levelisationData);\r\n\r\n vm.isFit = levelisationData.isFit;\r\n vm.levelisationData = levelisationData;\r\n }\r\n\r\n function formatLevelisation2019Fields(levelisationData) {\r\n levelisationData.totalFitMeteredExportPaymentDue = formUtils.formatAsCurrency(levelisationData.totalFitMeteredExportPaymentDue);\r\n levelisationData.totalMeteredElectricity = formUtils.formatElectricity(levelisationData.totalMeteredElectricity);\r\n }\r\n\r\n function setFormFields() {\r\n vm.formFields = formFields();\r\n }\r\n\r\n function save(levelisationData) {\r\n var deferred = $q.defer();\r\n levelisationData.fitYear = vm.levelisationViewModel.fitYear;\r\n\r\n validate(levelisationData).then(function() {\r\n deferred.resolve(putToServer(levelisationData));\r\n }).catch(function() {\r\n // Do not submit or display an error message\r\n deferred.resolve();\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function validate(levelisationData) {\r\n var variations = levelisationDataService.getSubmissionVariations(levelisationData, vm.levelisationViewModel);\r\n if (variations.length === 0 && !levelisationData.licenceRevoked) {\r\n return $q.when(levelisationData);\r\n }\r\n\r\n return levelisationDataService.showVariationDialog(variations, !!levelisationData.comment, levelisationData.licenceRevoked);\r\n }\r\n\r\n function putToServer(levelisationData) {\r\n return dataService.putToEndpoint('levelisations/' + levelisationId + '/data/' + licenceId, levelisationData)\r\n .then(returnToSelectPage);\r\n }\r\n\r\n function returnToSelectPage() {\r\n $state.go('^');\r\n }\r\n\r\n function formFields() {\r\n\r\n var totalElectricitySupplied = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalElectricitySupplied',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total electricity supplied by the licence for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Total electricity supplied (MWh)',\r\n displayValidationImmediately: vm.levelisationData.totalElectricitySupplied != null,\r\n required: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var totalExemptGreenImportElectricitySupplied = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalExemptGreenImportElectricitySupplied',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator', 'fitLessThanOrEqualValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n hideExpression: function () {\r\n return vm.levelisationViewModel.fitYear > constants.fitConstants.gieYear;\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total green imported exempt supply for the relevant Levelisation Period'\r\n },\r\n label: 'Total exempt green import electricity supplied (MWh)',\r\n required: true,\r\n lessThanOrEqual: 'totalElectricitySupplied',\r\n lessThanOrEqualValidationMessage: 'Total exempt green import electricity supplied '\r\n + 'must be less than or equal to total electricity supplied'\r\n }\r\n };\r\n\r\n var totalRelevantSupply = {\r\n className: 'col-md-6',\r\n type: 'fitDynamic',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total electricity supplied by the licence for the relevant Levelisation '\r\n + 'Period minus any exempt supply'\r\n },\r\n label: 'Total relevant electricity supplied (MWh)',\r\n required: true\r\n },\r\n expressionProperties: {\r\n 'templateOptions.value': relevantSupplyText\r\n }\r\n };\r\n\r\n function relevantSupplyText(viewValue, $modelValue, scope) {\r\n var relevantSupply = levelisationDataService.calculateTotalRelevantSupply(scope.model);\r\n\r\n if (relevantSupply === null) {\r\n return 'Unknown';\r\n }\r\n\r\n return formUtils.formatElectricity(relevantSupply > 0 ? relevantSupply : 0);\r\n }\r\n\r\n var totalFitGenerationPaymentDue = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalFitGenerationPaymentDue',\r\n type: 'fitCurrency',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total FIT Generation payments claimed/made to customers for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Total FIT generation payment due',\r\n required: true\r\n }\r\n };\r\n\r\n var totalFitExportPaymentDue = getTotalFitExportPaymentDue();\r\n\r\n var totalFitDeemedExportPaymentDue = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalFitDeemedExportPaymentDue',\r\n type: 'fitCurrency',\r\n optionsTypes: ['fitLessThanOrEqualValidator'],\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total FIT Export deemed payments claimed/made to customers for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Total FIT deemed export payment due',\r\n required: true,\r\n lessThanOrEqual: 'totalFitExportPaymentDue',\r\n lessThanOrEqualValidationMessage: 'Total FIT deemed export payment due '\r\n + 'must be less than or equal to total FIT export payment due'\r\n }\r\n };\r\n var totalDeemedElectricity = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalDeemedElectricity',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total electricity deemed to have been exported for the relevant Levelisation '\r\n + 'Period'\r\n },\r\n label: 'Total deemed electricity (MWh)',\r\n required: true\r\n }\r\n };\r\n\r\n var totalFitGenerationElectricity = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalFitGenerationElectricity',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This means the total generation (MWh) for those installations in receipt of FIT '\r\n + 'Payments for any period of the relevant FIT Year. Where accredited installations have not '\r\n + 'received payment for any part of this period, these should not be included.'\r\n },\r\n label: 'Total FIT generation electricity (MWh)',\r\n required: true\r\n }\r\n };\r\n var totalFitExportElectricity = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalFitExportElectricity',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This means the total deemed and metered export for those installations in receipt of FIT '\r\n + 'Payments for any period of the relevant FIT Year. Where accredited installations have not '\r\n + 'received payment for any part of this period, these should not be included.'\r\n },\r\n label: 'Total FIT export electricity (MWh)',\r\n required: true\r\n }\r\n };\r\n var numberOfInstallationsInReceiptOfFitPayments = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'numberOfInstallationsInReceiptOfFitPayments',\r\n optionsTypes: ['fitNumericValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This means the total number of installations in receipt of FIT Payments for any period of '\r\n + 'the relevant FIT Year. Where accredited installations have not received payment for any part of '\r\n + 'this period, these should not be included.'\r\n },\r\n label: 'Number of installations in receipt of FIT payments',\r\n required: true\r\n }\r\n };\r\n\r\n var comments = {\r\n className: 'col-md-12',\r\n key: 'comment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comments',\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n };\r\n\r\n var supplyFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n totalElectricitySupplied,\r\n totalExemptGreenImportElectricitySupplied\r\n ]\r\n };\r\n\r\n var relevantSupplyFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n totalRelevantSupply\r\n ]\r\n };\r\n\r\n var fitFieldGroups = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n totalFitGenerationPaymentDue,\r\n totalFitExportPaymentDue\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n totalFitDeemedExportPaymentDue,\r\n totalDeemedElectricity\r\n ]\r\n }\r\n ];\r\n\r\n addLevelisation2019Fields(fitFieldGroups);\r\n\r\n var dateOfRevocation = {\r\n className: 'col-md-3',\r\n key: 'dateOfRevocation',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotTodayOrInFutureValidator'],\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'Date of Revocation cannot be today or a future date.'\r\n },\r\n label: 'Date of Revocation',\r\n displayValidationImmediately: true,\r\n required: true\r\n },\r\n validators: {\r\n revocationDate: {\r\n expression: isRevocationNotEmpty,\r\n message: '\"The Revocation date cannot be null or empty.\"'\r\n }\r\n },\r\n hideExpression: function () {\r\n if (!vm.levelisationData.licenceRevoked) { vm.levelisationData.dateOfRevocation = null; }\r\n return !vm.levelisationData.licenceRevoked;\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n function isRevocationNotEmpty(viewValue) {\r\n if (viewValue === '' || viewValue === null) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n var licenceRevoked = {\r\n className: 'col-md-6',\r\n type: 'fitCheckbox',\r\n key: 'licenceRevoked',\r\n templateOptions: {\r\n label: 'Supplier has had their licence revoked'\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var annualFitFieldGroups = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n totalFitGenerationElectricity,\r\n totalFitExportElectricity\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n numberOfInstallationsInReceiptOfFitPayments\r\n ]\r\n }];\r\n\r\n var commentFieldGroups = [{\r\n className: 'row',\r\n fieldGroup: [\r\n comments\r\n ]\r\n }];\r\n\r\n var licenceRevokedFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n licenceRevoked,\r\n dateOfRevocation\r\n ]\r\n };\r\n var fields = [supplyFieldGroup];\r\n\r\n addEiiFields(fields);\r\n\r\n if (vm.levelisationViewModel.fitYear > constants.fitConstants.gieYear && !vm.levelisation.isAnnual) {\r\n addDomesticNonDomesticSupplyVolumeFields(fields);\r\n }\r\n \r\n fields.push(relevantSupplyFieldGroup);\r\n\r\n if (vm.isFit) {\r\n fields = fields.concat(fitFieldGroups);\r\n\r\n if (vm.levelisation.isAnnual) {\r\n fields = fields.concat(annualFitFieldGroups);\r\n }\r\n }\r\n\r\n if (principal.isInternal() && vm.levelisation.isAnnual) {\r\n fields.push(licenceRevokedFieldGroup);\r\n }\r\n\r\n return fields.concat(commentFieldGroups);\r\n }\r\n\r\n function addEiiFields(fields) {\r\n if (!levelisationDataService.levelisation2019InEffect(vm.levelisation)) {\r\n return;\r\n }\r\n\r\n var totalEiiExemptExcludedElectricitySupplied = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalEiiExemptExcludedElectricitySupplied',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator', 'fitLessThanOrEqualValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total electricity supplied to Energy Intensive Industries that is exempt for the relevant Levelisation Period'\r\n },\r\n label: 'Total EII exempt excluded electricity supplied (MWh)',\r\n required: true,\r\n lessThanOrEqual: 'totalEiiElectricitySupplied',\r\n lessThanOrEqualValidationMessage: 'Total EII exempt excluded electricity supplied '\r\n + 'must be less than or equal to total EII electricity supplied'\r\n }\r\n };\r\n\r\n var totalEiiElectricitySupplied = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalEiiElectricitySupplied',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator', 'fitLessThanOrEqualValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total electricity supplied to Energy Intensive Industries for the relevant Levelisation Period'\r\n },\r\n label: 'Total EII electricity supplied (MWh)',\r\n required: true,\r\n lessThanOrEqual: 'totalElectricitySupplied',\r\n lessThanOrEqualValidationMessage: 'Total EII electricity supplied '\r\n + 'must be less than or equal to total electricity supplied'\r\n }\r\n };\r\n\r\n\r\n var eiiFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n totalEiiElectricitySupplied,\r\n totalEiiExemptExcludedElectricitySupplied\r\n ]\r\n };\r\n\r\n fields.push(eiiFieldGroup);\r\n }\r\n\r\n function addDomesticNonDomesticSupplyVolumeFields(fields) {\r\n\r\n var nonDomesticSupplyVolume = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'nonDomesticSupplyVolume',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator', 'fitLessThanOrEqualValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is total electricity supplied to non-domestic customers by the licence for the relevant period. This is for use in the RO quarterly process'\r\n },\r\n label: 'Non-Domestic Supply Volume (MWh)',\r\n required: true\r\n },\r\n validators: {\r\n nonDomesticVolume: {\r\n expression: validateNonDomesticWithTotalElectricity,\r\n message: '\"Non-Domestic Supply Volume (MWh) plus Domestic Supply Volume (MWh) must equal Total electricity supplied (MWh)\"'\r\n }\r\n }\r\n };\r\n\r\n var domesticSupplyVolume = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'domesticSupplyVolume',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator', 'fitLessThanOrEqualValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is total electricity supplied to domestic customers by the licence for the relevant period. This is for use in the RO quarterly process'\r\n },\r\n label: 'Domestic Supply Volume (MWh)',\r\n required: true\r\n },\r\n validators: {\r\n nonDomesticVolume: {\r\n expression: validateDomesticWithTotalElectricity,\r\n message: '\"Non-Domestic Supply Volume (MWh) plus Domestic Supply Volume (MWh) must equal Total electricity supplied (MWh)\"'\r\n }\r\n }\r\n };\r\n\r\n var supplyVolume = {\r\n className: 'row',\r\n fieldGroup: [\r\n nonDomesticSupplyVolume,\r\n domesticSupplyVolume\r\n ]\r\n };\r\n\r\n fields.push(supplyVolume);\r\n }\r\n\r\n function validateNonDomesticWithTotalElectricity(viewValue, modelValue) {\r\n\r\n var nonDomesticSupplyValue = parseFloat(modelValue || viewValue);\r\n var domesticSupplyValue = parseFloat(vm.levelisationData.domesticSupplyVolume);\r\n var totalElectricitySuppliedValue = parseFloat(vm.levelisationData.totalElectricitySupplied);\r\n\r\n if (nonDomesticSupplyValue + domesticSupplyValue != totalElectricitySuppliedValue) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function validateDomesticWithTotalElectricity(viewValue, modelValue) {\r\n\r\n var domesticSupplyValue = parseFloat(modelValue || viewValue);\r\n var nonDomesticSupplyValue = parseFloat(vm.levelisationData.nonDomesticSupplyVolume);\r\n var totalElectricitySuppliedValue = parseFloat(vm.levelisationData.totalElectricitySupplied);\r\n\r\n if (nonDomesticSupplyValue + domesticSupplyValue != totalElectricitySuppliedValue) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function addLevelisation2019Fields(fitFieldGroups) {\r\n if (!levelisationDataService.levelisation2019InEffect(vm.levelisation)) {\r\n return;\r\n }\r\n\r\n var totalFitMeteredExportPaymentDue = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalFitMeteredExportPaymentDue',\r\n type: 'fitCurrency',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total FIT export payments for metered electricity claimed/made to customers for the relevant Levelisation Period.'\r\n },\r\n label: 'Total FIT metered export payment due',\r\n required: true\r\n }\r\n };\r\n\r\n var totalMeteredElectricity = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'totalMeteredElectricity',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total amount of metered exported electricity in the relevant Levelisation Period.'\r\n },\r\n label: 'Total metered electricity (MWh)',\r\n required: true\r\n }\r\n };\r\n\r\n fitFieldGroups.push({\r\n className: 'row',\r\n fieldGroup: [\r\n totalFitMeteredExportPaymentDue,\r\n totalMeteredElectricity\r\n ]\r\n });\r\n }\r\n\r\n function getTotalFitExportPaymentDue() {\r\n var field = {\r\n className: 'col-md-6 narrow-field',\r\n type: 'fitCurrency',\r\n key: 'totalFitExportPaymentDue',\r\n optionsTypes: ['fitLessThanOrEqualValidator'],\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total FIT Export (metered & deemed) payments claimed/made to customers for '\r\n + 'the relevant Levelisation Period'\r\n },\r\n label: 'Total FIT export payment due',\r\n required: true\r\n }\r\n };\r\n\r\n if (levelisationDataService.levelisation2019InEffect(vm.levelisation)) {\r\n field.type = 'fitDynamic';\r\n field.expressionProperties = {\r\n 'templateOptions.value': totalFitExportPaymentDueText\r\n };\r\n }\r\n\r\n return field;\r\n }\r\n\r\n function totalFitExportPaymentDueText(viewValue, $modelValue, scope) {\r\n var total = levelisationDataService.calculateTotalFitExportPaymentDue(scope.model);\r\n\r\n scope.model.totalFitExportPaymentDue = total;\r\n\r\n return total;\r\n }\r\n function openInternalConversation() {\r\n openConversation(true);\r\n }\r\n\r\n function openExternalConversation() {\r\n openConversation(false);\r\n }\r\n\r\n function openConversation(isInternal) {\r\n var buttonOptions = {\r\n // We are already on a details page, so are not showing the navigation buttons \r\n hideNavigationButton: true\r\n };\r\n levelisationConversationService\r\n .showConversationDialog(\r\n isInternal,\r\n levelisationId,\r\n licenceId,\r\n buttonOptions);\r\n }\r\n\r\n vm.endpoints = {\r\n getUsers: 'levelisationTasks/levelisationUsers',\r\n assignMany: 'levelisationTasks/assignMany',\r\n getPaginatedTasks: 'levelisationTasks'\r\n };\r\n\r\n function checkTaskExists() { \r\n levelisationDataService\r\n .fetch(levelisationId, licenceId)\r\n .then(function (levelisationData) {\r\n if (levelisationData.hasTask) {\r\n assignTask();\r\n } else {\r\n toastr.error('Please raise a query to assign the task.');\r\n }\r\n });\r\n }\r\n\r\n function assignTask() {\r\n vm.assignFailed = false;\r\n var params = {\r\n licenceId: licenceId,\r\n levelisationId: levelisationId\r\n };\r\n vm.paramsForAssignment.push(params);\r\n showReassignDialog(vm.paramsForAssignment).then(notifyAssignSuccessAndReload);\r\n }\r\n\r\n function showReassignDialog(params) {\r\n return $uibModal.open({\r\n controller: 'AssignTaskDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/task-view/assignTaskDialog.html',\r\n resolve: {\r\n submissionParams: function () {\r\n return params;\r\n },\r\n endpoints: function () {\r\n return vm.endpoints;\r\n }\r\n }\r\n }).result;\r\n }\r\n\r\n function notifyAssignSuccessAndReload() {\r\n reloadPage();\r\n toastr.success('Task successfully assigned.');\r\n }\r\n\r\n function reloadPage() {\r\n $state.reload();\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .component('installationDetails', installationDetails());\r\n\r\n function installationDetails() {\r\n return {\r\n restrict: 'AE',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/levelisation/data/installationDetails.html',\r\n bindings: {\r\n count: '<',\r\n cost: '<',\r\n countHelp: '<',\r\n costHelp: '<',\r\n totalHelp: '<'\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .component('levelisationInstallationTable', {\r\n templateUrl: 'app/levelisation/data/installations/levelisation-installation-table.html',\r\n controller: 'LevelisationInstallationTableController',\r\n controllerAs: 'vm',\r\n bindings: {\r\n count: '<',\r\n cost: '<',\r\n filter: '<',\r\n installationType: '<',\r\n endpoint: '<'\r\n }\r\n });\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('LevelisationInstallationTableController', LevelisationInstallationTableController);\r\n\r\n function LevelisationInstallationTableController($scope, paginatedDataService) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.fetchData = fetchData;\r\n vm.tableColumns = getTableColumns();\r\n vm.isVisible = false;\r\n\r\n vm.fetchCsvData = fetchCsvData;\r\n vm.csvHeaders = _.map(vm.tableColumns, 'label');\r\n vm.csvColumns = _.map(vm.tableColumns, 'id');\r\n vm.csvFilename = 'Levelisation - ' + vm.installationType + ' installations.csv';\r\n\r\n vm.$onInit = onInit;\r\n function onInit() {\r\n if (!vm.filter) {\r\n throw new Error('A filter must be provided.');\r\n }\r\n // This will trigger a table load the first time isVisible is set to true\r\n // Subsequent changes will do nothing\r\n var unwatchVisible = $scope.$watch(function () {\r\n return vm.isVisible;\r\n }, function (newVal) {\r\n if (newVal) {\r\n unwatchVisible();\r\n $scope.$broadcast('fit-table:searchChange', vm.filter);\r\n }\r\n });\r\n }\r\n\r\n function fetchData(tableData) {\r\n return paginatedDataService.fetchDataFromTableData('levelisations/' + vm.endpoint, tableData);\r\n }\r\n\r\n function fetchCsvData() {\r\n var params = vm.filter;\r\n params.pageNumber = 1;\r\n params.pageSize = 1000000;\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + vm.endpoint, params).then(function (csvData) {\r\n return csvData.data;\r\n });\r\n }\r\n\r\n function getTableColumns() {\r\n return [\r\n {\r\n id: 'fitId',\r\n label: 'FIT ID',\r\n sort: true\r\n },\r\n {\r\n id: 'addressLine1',\r\n label: 'Address line 1',\r\n sort: true\r\n },\r\n {\r\n id: 'postcode',\r\n label: 'Postcode',\r\n sort: true\r\n },\r\n {\r\n id: 'generatorName',\r\n label: 'Generator name',\r\n sort: true\r\n },\r\n {\r\n id: 'technologyType',\r\n label: 'Technology type',\r\n sort: true\r\n },\r\n {\r\n id: 'accreditationNumber',\r\n label: 'Accreditation number',\r\n sort: true\r\n },\r\n {\r\n id: 'eligibilityDate',\r\n label: 'Eligibility date',\r\n type: 'date',\r\n sort: true\r\n }\r\n ];\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationConversationService', levelisationConversationService);\r\n\r\n function levelisationConversationService($uibModal) {\r\n var service = {\r\n showConversationDialog: showConversationDialog\r\n };\r\n return service;\r\n\r\n function showConversationDialog(isInternal, levelisationId, licenceId, buttonOptions, levelisationDataExists, levelisationHasBeenRun) {\r\n\r\n function getButtonOptions() {\r\n if (levelisationDataExists) {\r\n return {\r\n showNavigationButton: true,\r\n buttonText: 'View',\r\n goToDetailsPage: function($state) \r\n { \r\n $state.go('levelisation#data#view', { levelisationId: levelisationId, licenceId: licenceId }); \r\n }\r\n };\r\n }\r\n else if (!levelisationHasBeenRun) {\r\n return {\r\n showNavigationButton: true,\r\n buttonText: 'Edit',\r\n goToDetailsPage: function($state) {\r\n $state.go('levelisation#data#edit', {levelisationId: levelisationId, licenceId: licenceId});\r\n }\r\n };\r\n }\r\n\r\n return {\r\n showNavigationButton: false\r\n };\r\n }\r\n\r\n return $uibModal.open({\r\n controller: 'ConversationDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/conversationDialog/conversation-dialog.html',\r\n size: 'lg',\r\n resolve: {\r\n info: function() {\r\n return {\r\n isInternal: isInternal,\r\n apiPath: 'levelisationConversation/' + levelisationId + '/data/' + licenceId,\r\n cacheId: 'levelisation-conversation-' + levelisationId + '-' + licenceId,\r\n textBoxLabel: 'Please use the box below to enter response or raise a query on Levelisation Data'\r\n };\r\n },\r\n buttonOptions: function() {\r\n return buttonOptions.hideNavigationButton ? { showNavigationButton : false } : getButtonOptions();\r\n }\r\n }\r\n }).result;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationApprovalService', levelisationApprovalService);\r\n\r\n function levelisationApprovalService(dataService, principal) {\r\n return {\r\n approveAtLevel: approveAtLevel,\r\n isApprovedAtLevel: isApprovedAtLevel,\r\n canApprove: canApprove,\r\n approverFieldForLevel: approverFieldForLevel,\r\n approvalDateFieldForLevel: approvalDateFieldForLevel\r\n };\r\n\r\n function approveAtLevel(levelisationId, licenceId, approvalLevel, model)\r\n {\r\n return dataService.patchToEndpoint('levelisations/' + levelisationId\r\n + '/data/' + licenceId\r\n + '/approval/' + approvalLevel, model);\r\n }\r\n\r\n function isApprovedAtLevel(levelisationData, approvalLevel) {\r\n return levelisationData.approvalStatus >= approvalLevel;\r\n }\r\n\r\n function canApprove(levelisationData) {\r\n if (isApprovedAtLevel(levelisationData, 4)) {\r\n return false;\r\n }\r\n\r\n var requiredRole = roleToApproveAtLevel(levelisationData.approvalStatus);\r\n return principal.hasRole(requiredRole);\r\n }\r\n\r\n function roleToApproveAtLevel(level) {\r\n switch(level) {\r\n case 0:\r\n return 'LevelisationApprover';\r\n case 1:\r\n return 'LevelisationSecondApprover';\r\n case 2:\r\n return 'LevelisationThirdApprover';\r\n case 3:\r\n return 'LevelisationFourthApprover';\r\n case 4:\r\n throw new Error('Level 4 is the maximum approval level.');\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n\r\n function approverFieldForLevel(level) {\r\n switch(level) {\r\n case 1:\r\n return 'level1ApproverName';\r\n case 2:\r\n return 'level2ApproverName';\r\n case 3:\r\n return 'level3ApproverName';\r\n case 4:\r\n return 'level4ApproverName';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n\r\n function approvalDateFieldForLevel(level) {\r\n switch(level) {\r\n case 1:\r\n return 'level1ApprovalDate';\r\n case 2:\r\n return 'level2ApprovalDate';\r\n case 3:\r\n return 'level3ApprovalDate';\r\n case 4:\r\n return 'level4ApprovalDate';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationDataService', levelisationDataService);\r\n\r\n function levelisationDataService($http, appConfig, constants, $uibModal, formUtils, stringUtils, moment) {\r\n return {\r\n fetch: fetch,\r\n getSubmissionVariations: getSubmissionVariations,\r\n showVariationDialog: showVariationDialog,\r\n levelisation2019InEffect: levelisation2019InEffect,\r\n calculateTotalFitExportPaymentDue: calculateTotalFitExportPaymentDue,\r\n calculateTotalRelevantSupply: calculateTotalRelevantSupply,\r\n getVariationsAgainstData: getVariationsAgainstData,\r\n getEiiVariations: getEiiVariations\r\n };\r\n\r\n function fetch(levelisationId, licenceId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/data/' + licenceId)\r\n .then(function(levelisationData) {\r\n return ((levelisationData.data != null) && (levelisationData.data.data != null))\r\n ? levelisationData.data.data : {};\r\n })\r\n .then(function(levelisation) {\r\n if (levelisation.previousLevelisationData != null) {\r\n levelisation.previousLevelisationData.forEach(function(previousLevelisationData) {\r\n nullifyZeroHistory(previousLevelisationData);\r\n });\r\n }\r\n return levelisation;\r\n });\r\n }\r\n\r\n function nullifyZeroHistory(previousLevelisationData) {\r\n var fields = [ \r\n 'totalFitGenerationPaymentDue',\r\n 'totalFitExportPaymentDue',\r\n 'totalFitDeemedExportPaymentDue',\r\n 'totalFitMeteredExportPaymentDue'\r\n ];\r\n\r\n angular.forEach(fields, function(field) {\r\n if (previousLevelisationData[field] === -1) {\r\n previousLevelisationData[field] = null;\r\n }\r\n });\r\n }\r\n\r\n function getSubmissionVariations(levelisationData, levelisation) {\r\n var results = [];\r\n angular.forEach(levelisationData.previousLevelisationData, function(previousLevelisationData) {\r\n results = results.concat(getVariationsAgainstData(levelisationData, previousLevelisationData, levelisation));\r\n });\r\n\r\n results = results.concat(getAllVariationsAgainstExportRates(levelisationData, levelisation));\r\n\r\n //TODO: wire up getEiiVaraiations\r\n results = results.concat(getEiiVariations(levelisationData, levelisation));\r\n\r\n return results;\r\n }\r\n\r\n function getEiiVariations(levelisationData, levelisation) {\r\n if (!levelisation2019InEffect(levelisation)) {\r\n return [];\r\n }\r\n\r\n //TODO: Add to fitConstants\r\n var threshold = levelisation.fitYear > 14 ? constants.fitConstants.maximumLevelisationDataEiiVariationThresholdFromFitYear15\r\n : constants.fitConstants.maximumLevelisationDataEiiVariationThreshold;\r\n\r\n var excludedElectricity = stringUtils.parseNumber(levelisationData.totalEiiExemptExcludedElectricitySupplied);\r\n var electricitySupplied = stringUtils.parseNumber(levelisationData.totalEiiElectricitySupplied);\r\n\r\n var variation = electricitySupplied * threshold;\r\n\r\n if (excludedElectricity > variation) {\r\n return buildVariationMessageArrayForEII(\r\n 'Total EII exempt excluded electricity supplied',\r\n excludedElectricity,\r\n 'greater than ' + (threshold * 100) + '% of the value provided for Total EII electricity supplied',\r\n electricitySupplied,\r\n 'MWh'\r\n );\r\n }\r\n\r\n return [];\r\n }\r\n\r\n function getVariationsAgainstData(levelisationData, previousLevelisationData, levelisation) {\r\n return getVariationsAgainstDataForField('totalFitGenerationPaymentDue', 'Total generation payment due')\r\n .concat(getVariationsAgainstDataForField('totalFitExportPaymentDue', 'Total export payment due'))\r\n .concat(getVariationsAgainstDataForField('totalFitDeemedExportPaymentDue', 'Total deemed export payment due'))\r\n .concat(getLevelisation2019VariationsAgainstDataForField());\r\n\r\n function getLevelisation2019VariationsAgainstDataForField() {\r\n if (!levelisation2019InEffect(levelisation)) {\r\n return [];\r\n }\r\n\r\n return getVariationsAgainstDataForField('totalFitMeteredExportPaymentDue', 'Total metered export payment due');\r\n }\r\n\r\n function getVariationsAgainstDataForField(field, fieldName)\r\n {\r\n var previousValue = removeCommas(previousLevelisationData[field]);\r\n var newValue = removeCommas(levelisationData[field]);\r\n if (angular.isUndefined(newValue) || newValue == null\r\n || angular.isUndefined(previousValue) || previousValue == null)\r\n {\r\n return [];\r\n }\r\n\r\n if (newValue < constants.fitConstants.minimumLevelisationDataVariationThreshold * previousValue)\r\n {\r\n return buildVariationMessageArray(\r\n fieldName,\r\n newValue,\r\n 'less than ' + (100 * constants.fitConstants.minimumLevelisationDataVariationThreshold)\r\n + '% of the value provided for ' + previousLevelisationData.levelisationDisplayName,\r\n previousValue);\r\n }\r\n\r\n if (newValue > constants.fitConstants.maximumLevelisationDataVariationThreshold * previousValue)\r\n {\r\n return buildVariationMessageArray(\r\n fieldName,\r\n newValue,\r\n 'greater than ' + (100 * constants.fitConstants.maximumLevelisationDataVariationThreshold)\r\n + '% of the value provided for ' + previousLevelisationData.levelisationDisplayName,\r\n previousValue);\r\n }\r\n return [];\r\n }\r\n }\r\n\r\n function getAllVariationsAgainstExportRates(levelisationData, levelisation) {\r\n return getVariationsAgainstExportRates('deemed', levelisationData.totalDeemedElectricity, levelisationData.totalFitDeemedExportPaymentDue, levelisation)\r\n .concat(getLevelisation2019VariationsAgainstExportRates(levelisationData, levelisation));\r\n }\r\n\r\n function getLevelisation2019VariationsAgainstExportRates(levelisationData, levelisation) {\r\n if (!levelisation2019InEffect(levelisation)) {\r\n return [];\r\n }\r\n\r\n return getVariationsAgainstExportRates('metered', levelisationData.totalMeteredElectricity, levelisationData.totalFitMeteredExportPaymentDue, levelisation);\r\n }\r\n\r\n function removeCommas(valueWithCommas) {\r\n var valueWithoutCommas;\r\n if (angular.isString(valueWithCommas))\r\n valueWithoutCommas = valueWithCommas.replace(/,/g, '');\r\n else\r\n valueWithoutCommas = valueWithCommas;\r\n return valueWithoutCommas;\r\n }\r\n\r\n function getVariationsAgainstExportRates(field, electricity, exportPaymentDue, levelisation) {\r\n if (angular.isUndefined(electricity) || electricity == null || electricity == 0) {\r\n return [];\r\n }\r\n\r\n if (angular.isUndefined(exportPaymentDue) || exportPaymentDue == null) {\r\n return [];\r\n }\r\n\r\n var exportPaymentDueWithoutCommas = removeCommas(exportPaymentDue);\r\n var electricityWithoutCommas = removeCommas(electricity);\r\n var averagePriceOfExport = exportPaymentDueWithoutCommas / (electricityWithoutCommas * 10);\r\n\r\n if (field === 'deemed') {\r\n if (averagePriceOfExport < levelisation.minimumDeemedExportRate) {\r\n return buildVariationMessageArray(\r\n 'Average price of ' + field + ' export',\r\n averagePriceOfExport,\r\n 'less than the minimum deemed export rate',\r\n levelisation.minimumDeemedExportRate);\r\n }\r\n if (averagePriceOfExport > levelisation.maximumDeemedExportRate) {\r\n return buildVariationMessageArray(\r\n 'Average price of ' + field + ' export',\r\n averagePriceOfExport,\r\n 'greater than the maximum deemed export rate',\r\n levelisation.maximumDeemedExportRate);\r\n }\r\n }\r\n else if (field === 'metered') {\r\n if (averagePriceOfExport < levelisation.minimumMeteredExportRate) {\r\n return buildVariationMessageArray(\r\n 'Average price of ' + field + ' export',\r\n averagePriceOfExport,\r\n 'less than the minimum metered export rate',\r\n levelisation.minimumMeteredExportRate);\r\n }\r\n if (averagePriceOfExport > levelisation.maximumMeteredExportRate) {\r\n return buildVariationMessageArray(\r\n 'Average price of ' + field + ' export',\r\n averagePriceOfExport,\r\n 'greater than the maximum metered export rate',\r\n levelisation.maximumMeteredExportRate);\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n function showVariationDialog(variations, allowConfirmation, supplierLicenceRevoked) {\r\n return $uibModal.open({\r\n controller: 'LevelisationDataVariationDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/levelisation/data/variation/levelisationDataVariationDialog.html',\r\n resolve: {\r\n model: function () {\r\n return {\r\n variations: variations,\r\n allowConfirmation: allowConfirmation,\r\n supplierLicenceRevoked: supplierLicenceRevoked\r\n };\r\n }\r\n }\r\n }).result;\r\n }\r\n\r\n function buildVariationMessageArray(fieldName, fieldVale, variation, comparisonValue) {\r\n return [fieldName + ' is £' + formUtils.formatAsCurrency(fieldVale) + ' which is '\r\n + variation + ' (£' + formUtils.formatAsCurrency(comparisonValue) + ')'];\r\n }\r\n\r\n function buildVariationMessageArrayForEII(fieldName, fieldValue, variation, comparisonValue, units) {\r\n return [fieldName + ' is ' + formUtils.formatAsCurrency(fieldValue) + ' ' + units + ' which is '\r\n + variation + ' (' + formUtils.formatAsCurrency(comparisonValue) + ' ' + units + ')'];\r\n }\r\n\r\n function levelisation2019InEffect(levelisation) {\r\n return moment(levelisation.submissionStartDate)\r\n .isSameOrAfter(constants.fitConstants.levelisation2019Date);\r\n }\r\n \r\n function calculateTotalFitExportPaymentDue(levelisationData) {\r\n if (!angular.isObject(levelisationData)) {\r\n return null;\r\n }\r\n\r\n var totalFitDeemedExportPaymentDue = stringUtils.parseNumber(levelisationData.totalFitDeemedExportPaymentDue);\r\n var totalFitMeteredExportPaymentDue = stringUtils.parseNumber(levelisationData.totalFitMeteredExportPaymentDue);\r\n\r\n var total = totalFitDeemedExportPaymentDue + totalFitMeteredExportPaymentDue;\r\n\r\n return formUtils.formatAsCurrency(total);\r\n }\r\n\r\n function calculateTotalRelevantSupply(levelisationData) {\r\n var result = 0;\r\n\r\n if (!angular.isObject(levelisationData)) {\r\n return null;\r\n }\r\n\r\n var total = stringUtils.parseNumber(levelisationData.totalElectricitySupplied);\r\n var totalExemptGreenImport = stringUtils.parseNumber(levelisationData.totalExemptGreenImportElectricitySupplied);\r\n var totalEiiExemptExcluded = stringUtils.parseNumber(levelisationData.totalEiiExemptExcludedElectricitySupplied);\r\n if (isNaN(total)) {\r\n return null;\r\n }\r\n\r\n result = total - (totalExemptGreenImport || 0) - (totalEiiExemptExcluded || 0);\r\n\r\n if (result > 0) {\r\n return result;\r\n } else {\r\n return 0.00;\r\n }\r\n \r\n\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .component('levelisationDataDetails', levelisationDataDetails());\r\n\r\n function levelisationDataDetails() {\r\n return {\r\n restrict: 'AE',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/levelisation/data/levelisationDataDetails.html',\r\n bindings: {\r\n licence: '<',\r\n levelisation: '<',\r\n data: '<'\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ListLevelisationDataController', ListLevelisationDataController);\r\n\r\n\r\n function ListLevelisationDataController(paginatedDataService, levelisationApprovalService, dataService, downloadService, $stateParams, $state, localStorageService) {\r\n var vm = this;\r\n var levelisationId = $stateParams.levelisationId;\r\n var persistantFieldsKey = 'Levelisation-' + levelisationId;\r\n\r\n vm.error = false;\r\n vm.approving = false;\r\n vm.computing = false;\r\n vm.dataSummary = {};\r\n\r\n vm.getSellPrice = getSellPrice;\r\n vm.updateSellPrice = updateSellPrice;\r\n vm.fetchData = fetchData;\r\n vm.getExport = getExport;\r\n vm.approveAllAtLevel = approveAllAtLevel;\r\n vm.computeLevelisationResults = computeLevelisationResults;\r\n vm.loadSummary = loadSummary;\r\n vm.setUpColumns = setUpColumns;\r\n\r\n vm.options = {\r\n defaultSort: 'name',\r\n defaultSortDirection: 'ascending'\r\n };\r\n\r\n vm.sellPriceFormFields = [{\r\n className: 'col-md-3',\r\n type: 'fitCurrencyThreeDecimalPlaces',\r\n key: 'systemSellPrice',\r\n templateOptions: {\r\n required: true\r\n }\r\n }];\r\n\r\n vm.sellPriceFormOptions = {\r\n buttons: { save: 'Update' }\r\n };\r\n\r\n vm.fitStatusOptions = [\r\n { label: 'Any', value: '' },\r\n { label: 'Non FIT Licensee', value: '0' },\r\n { label: 'Voluntary FIT Licensee', value: '1' },\r\n { label: 'Mandatory FIT Licensee', value: '2' }\r\n ];\r\n vm.columns = [];\r\n\r\n initForm();\r\n\r\n function initForm() {\r\n vm.model = localStorageService.get(persistantFieldsKey) || {};\r\n }\r\n\r\n function setUpColumns() {\r\n vm.columns = [\r\n {\r\n id: 'name',\r\n label: 'Licence',\r\n sort: true\r\n },\r\n {\r\n id: 'dataSubmitted',\r\n label: 'Data submitted',\r\n type: 'boolean'\r\n },\r\n {\r\n id: 'submissionDate',\r\n label: 'Submission date',\r\n type: 'date'\r\n },\r\n {\r\n id: 'fitStatus',\r\n label: 'Licence type',\r\n sort: true\r\n },\r\n approvalColumnForLevel(1),\r\n approvalColumnForLevel(2),\r\n approvalColumnForLevel(3),\r\n approvalColumnForLevel(4),\r\n {\r\n label: 'View',\r\n sort: false,\r\n type: 'conditional',\r\n condition: hasBeenSubmitted,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'View',\r\n onClick: view\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n }\r\n ];\r\n\r\n if (!vm.dataSummary.levelisationHasBeenRun) {\r\n vm.columns.push({\r\n label: 'Edit',\r\n sort: false,\r\n type: 'conditional',\r\n condition: canEdit,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n icon: 'pencil',\r\n type: 'btn-default',\r\n text: 'Edit',\r\n onClick: edit\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function approvalColumnForLevel(level)\r\n {\r\n var label = 'Level ' + level + ' approval';\r\n \r\n var booleanTemplate = '';\r\n var dateTemplate = ' on {{data[\\''\r\n + levelisationApprovalService.approvalDateFieldForLevel(level) + '\\'] | date:\\'dd-MM-yyyy\\'}}';\r\n\r\n var checkboxTemplate = ''\r\n + booleanTemplate + dateTemplate + '';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: checkboxTemplate,\r\n isApproved: isApproved\r\n };\r\n\r\n function isApproved(levelisationData) {\r\n return levelisationApprovalService.isApprovedAtLevel(levelisationData, level);\r\n }\r\n }\r\n\r\n function canEdit(levelisationData) {\r\n return !levelisationApprovalService.isApprovedAtLevel(levelisationData, 1)\r\n || levelisationApprovalService.canApprove(levelisationData);\r\n }\r\n\r\n function hasBeenSubmitted(levelisationData) {\r\n return levelisationData.dataSubmitted;\r\n }\r\n\r\n function loadSummary() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/data/summary')\r\n .then(setupSummary);\r\n }\r\n\r\n function setupSummary(summary) {\r\n vm.dataSummary = summary;\r\n setUpColumns();\r\n }\r\n\r\n function getExport() {\r\n downloadService.download('levelisations/' + levelisationId + '/datapaymentexport');\r\n }\r\n\r\n function getSellPrice() {\r\n return { systemSellPrice: vm.dataSummary.systemSellPrice };\r\n }\r\n\r\n function updateSellPrice(model) {\r\n return dataService.patchToEndpoint('levelisations/' + levelisationId, model).then(function () {\r\n vm.dataSummary.systemSellPrice = model.systemSellPrice;\r\n });\r\n }\r\n\r\n function approveAllAtLevel(level) {\r\n vm.approving = true;\r\n dataService.patchToEndpoint('levelisations/' + levelisationId + '/data/massApproval/' + level)\r\n .then(updateDispalyedData)\r\n .catch(displayError)\r\n .finally(endLoading);\r\n }\r\n\r\n function updateDispalyedData() {\r\n $state.reload();\r\n }\r\n\r\n function computeLevelisationResults() {\r\n vm.computing = true;\r\n dataService.patchToEndpoint('levelisations/' + levelisationId + '/results/compute')\r\n .then(viewResults)\r\n .catch(displayError)\r\n .finally(endComputing);\r\n }\r\n\r\n function viewResults() {\r\n $state.go('levelisation#data#results');\r\n }\r\n\r\n function displayError() {\r\n vm.error = true;\r\n }\r\n\r\n function endLoading() {\r\n vm.approving = false;\r\n }\r\n\r\n function endComputing() {\r\n vm.computing = false;\r\n }\r\n\r\n function view(levelisationData) {\r\n $state.go('levelisation#data#view', { levelisationId: levelisationId, licenceId: levelisationData.licenceId });\r\n }\r\n\r\n function edit(levelisationData) {\r\n $state.go('levelisation#data#edit', { levelisationId: levelisationId, licenceId: levelisationData.licenceId });\r\n }\r\n\r\n function fetchData(tableData) {\r\n localStorageService.set(persistantFieldsKey, vm.model);\r\n tableData.search.predicateObject = vm.model;\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/data', params);\r\n }\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('SelectLevelisationDataController', SelectLevelisationDataController);\r\n\r\n\r\n function SelectLevelisationDataController($state, dataService, downloadService, principal, $stateParams) {\r\n var vm = this;\r\n vm.selectionModel = {};\r\n vm.levelisationOptions = [];\r\n vm.licenceOptionsByLevelisation = {};\r\n vm.submitFormFields = [];\r\n vm.exportFormFields = exportFormFields();\r\n vm.fetchSubmitData = fetchSubmitData;\r\n vm.cancel = returnToHomepage;\r\n vm.open = open;\r\n vm.csv = csv;\r\n vm.levelisationId = $stateParams.levelisationId;\r\n vm.selectionModel.levelisationId = angular.isDefined(vm.levelisationId) && vm.levelisationId != null ? vm.levelisationId : null;\r\n var selectedPeriod = null;\r\n\r\n function open(selectionModel) {\r\n return $state.go('levelisationData#upload', selectionModel);\r\n }\r\n\r\n function csv(csvModel) {\r\n if (principal.isInternal()) {\r\n downloadService.download('levelisations/paymentexport', false, csvModel);\r\n }\r\n else\r\n downloadService.download('levelisations/export', false, csvModel);\r\n }\r\n\r\n function returnToHomepage() {\r\n $state.go('home');\r\n }\r\n\r\n function fetchSubmitData() {\r\n return dataService.fetchDataFromEndpoint('levelisations/current')\r\n .then(setupOptions)\r\n .then(setupSelectionModel);\r\n }\r\n\r\n function setupOptions(options) {\r\n vm.levelisationOptions = options.map(buildSelectOption);\r\n\r\n angular.forEach(options, function(option) {\r\n vm.licenceOptionsByLevelisation[option.id] = option.licences.map(buildSelectOption);\r\n });\r\n\r\n vm.submitFormFields = submitFormFields();\r\n\r\n if (angular.isDefined(vm.levelisationId) && vm.levelisationId != null && vm.levelisationId != '') {\r\n selectedPeriod = vm.levelisationOptions.filter(function (item) { return item.value === vm.levelisationId; });\r\n var levelisationOptionField = _.find(vm.submitFormFields[0].fieldGroup, function (field) { return field.key === 'levelisationId'; });\r\n levelisationOptionField.defaultValue = vm.levelisationId;\r\n }\r\n }\r\n\r\n function setupSelectionModel() {\r\n return vm.selectionModel;\r\n }\r\n\r\n function buildSelectOption(model) {\r\n return {\r\n name: model.displayName + (model.dataSubmitted ? ' (data submitted)' : ''),\r\n value: model.id\r\n };\r\n }\r\n\r\n function exportFormFields() {\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'fitYear',\r\n type: 'fitAsyncSelect',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the yearly period to which the Levelisation Period falls into'\r\n },\r\n required: true,\r\n label: 'FIT year',\r\n noOptionsMessage: 'No valid FIT year found.',\r\n endpoint: 'levelisations/years/all'\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n \r\n function submitFormFields() {\r\n\r\n var levelisation = {\r\n className: 'col-md-6',\r\n key: 'levelisationId',\r\n type: 'fitSelectWithEmptyWarning',\r\n defaultValue: selectedPeriod,\r\n templateOptions: {\r\n label: 'Period',\r\n required: true,\r\n disabled: false,\r\n noOptionsMessage: 'No open levelisation periods found.',\r\n options: vm.levelisationOptions\r\n }\r\n };\r\n var licence = {\r\n className: 'col-md-6',\r\n key: 'licenceId',\r\n type: 'fitSelectWithEmptyWarning',\r\n templateOptions: {\r\n options: [],\r\n label: 'Licence',\r\n required: true,\r\n noOptionsMessage: 'No valid licences found for this period.',\r\n disabled: true\r\n },\r\n hideExpression: function() {},\r\n expressionProperties: {\r\n 'templateOptions.disabled': '!model.levelisationId',\r\n 'templateOptions.options': function() {\r\n return vm.licenceOptionsByLevelisation[vm.selectionModel.levelisationId] || [];\r\n }\r\n }\r\n };\r\n\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n levelisation,\r\n licence\r\n ]\r\n }\r\n ];\r\n }\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .component('levelisationDataVariation', levelisationDataVariation());\r\n\r\n function levelisationDataVariation() {\r\n return {\r\n restrict: 'AE',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/levelisation/data/variation/levelisationDataVariation.html',\r\n bindings: {\r\n variations: '<'\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('LevelisationDataVariationDialogController', LevelisationDataVariationDialogController);\r\n\r\n function LevelisationDataVariationDialogController(model) {\r\n var vm = this;\r\n vm.variations = model.variations;\r\n vm.allowConfirmation = model.allowConfirmation;\r\n vm.supplierLicenceRevoked = model.supplierLicenceRevoked;\r\n vm.hasVariations = (model.variations.length > 0);\r\n vm.showContinueButton = (vm.hasVariations && vm.allowConfirmation)\r\n ? vm.allowConfirmation\r\n : (vm.hasVariations === false && vm.supplierLicenceRevoked)\r\n ? true\r\n : (vm.hasVariations && !vm.supplierLicenceRevoked)\r\n ? vm.allowConfirmation\r\n : (vm.hasVariations && vm.supplierLicenceRevoked)\r\n ? vm.allowConfirmation\r\n : vm.supplierLicenceRevoked\r\n ? true\r\n : vm.allowConfirmation;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewLevelisationDataController', ViewLevelisationDataController);\r\n\r\n\r\n function ViewLevelisationDataController($stateParams, dataService, levelisationDataService, levelisationApprovalService, $state, $q, levelisationConversationService, $uibModal, toastr, constants) {\r\n\r\n var vm = this;\r\n\r\n vm.canApprove = false;\r\n\r\n vm.levelisationId = $stateParams.levelisationId;\r\n var licenceId = $stateParams.licenceId;\r\n vm.isFit = false;\r\n vm.levelisation2019InEffect = false;\r\n vm.displayTotalExemptGreenImportElectricitySuppliedField = true;\r\n\r\n vm.licenceDetails = {};\r\n vm.levelisationData = {};\r\n vm.levelisationDetails = {};\r\n vm.installationData = {};\r\n vm.variations = [];\r\n\r\n vm.loadLevelisation = loadLevelisation;\r\n vm.loadData = loadData;\r\n vm.getApprovalModel = getApprovalModel;\r\n vm.approve = approve;\r\n\r\n vm.paramsForAssignment = [];\r\n vm.getAssignTask = checkTaskExists;\r\n vm.openInternalConversation = openInternalConversation;\r\n vm.openExternalConversation = openExternalConversation;\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Approve',\r\n cancel: 'Reset'\r\n }\r\n };\r\n vm.approvalFields = [{\r\n className: 'col-md-12',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }];\r\n\r\n function loadData() {\r\n return $q.all([\r\n loadLevelisation(),\r\n loadLevelisationData(),\r\n loadLicence()\r\n ]);\r\n }\r\n\r\n function loadLevelisationData() {\r\n return levelisationDataService\r\n .fetch(vm.levelisationId, licenceId)\r\n .then(displayLevelisationData);\r\n }\r\n\r\n function displayLevelisationData(levelisationData) {\r\n vm.isFit = levelisationData.isFit;\r\n\r\n var relevantSupply = levelisationDataService.calculateTotalRelevantSupply(levelisationData);\r\n\r\n levelisationData.relevantSupply = relevantSupply !== null ? relevantSupply : 'Unknown';\r\n vm.levelisationData = levelisationData;\r\n vm.variations = levelisationDataService.getSubmissionVariations(levelisationData, vm.levelisationDetails);\r\n vm.canApprove = levelisationApprovalService.canApprove(levelisationData);\r\n vm.displayTotalExemptGreenImportElectricitySuppliedField = vm.levelisationDetails.fitYear <= constants.fitConstants.gieYear;\r\n\r\n if (vm.isFit) {\r\n return fetchInstallationData();\r\n }\r\n }\r\n\r\n function loadLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', licenceId)\r\n .then(setLicenceDetails);\r\n }\r\n\r\n function setLicenceDetails(licence) {\r\n vm.licenceDetails = licence;\r\n }\r\n\r\n function loadLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + vm.levelisationId)\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisationDetails) {\r\n vm.levelisationDetails = levelisationDetails;\r\n vm.levelisation2019InEffect = levelisationDataService.levelisation2019InEffect(levelisationDetails);\r\n loadLevelisationData();\r\n }\r\n\r\n function fetchInstallationData() {\r\n return dataService.fetchDataFromEndpointWithParams('levelisations/' + vm.levelisationId\r\n + '/data/' + licenceId + '/installationSummary').then(setInstallationData);\r\n }\r\n\r\n function setInstallationData(data) {\r\n vm.installationData = data;\r\n }\r\n\r\n function approve(model) {\r\n return levelisationApprovalService.approveAtLevel(vm.levelisationId, licenceId,\r\n vm.levelisationData.approvalStatus + 1, model)\r\n .then(returnToParent);\r\n }\r\n\r\n function getApprovalModel() {\r\n return { comments: null };\r\n }\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n\r\n function openInternalConversation() {\r\n openConversation(true);\r\n }\r\n\r\n function openExternalConversation() {\r\n openConversation(false);\r\n }\r\n\r\n function openConversation(isInternal) {\r\n var buttonOptions = {\r\n // We are already on a details page, so are not showing the navigation buttons \r\n hideNavigationButton: true\r\n };\r\n levelisationConversationService\r\n .showConversationDialog(\r\n isInternal,\r\n vm.levelisationId,\r\n licenceId,\r\n buttonOptions);\r\n }\r\n\r\n vm.endpoints = {\r\n getUsers: 'levelisationTasks/levelisationUsers',\r\n assignMany: 'levelisationTasks/assignMany',\r\n getPaginatedTasks: 'levelisationTasks'\r\n };\r\n\r\n function checkTaskExists() {\r\n levelisationDataService\r\n .fetch(vm.levelisationId, licenceId)\r\n .then(function (levelisationData) {\r\n if (levelisationData.hasTask) {\r\n assignTask();\r\n } else {\r\n toastr.error('Please raise a query to assign the task.');\r\n }\r\n });\r\n }\r\n\r\n function assignTask() {\r\n vm.assignFailed = false;\r\n var params = {\r\n licenceId: licenceId,\r\n levelisationId: vm.levelisationId\r\n };\r\n vm.paramsForAssignment.push(params);\r\n showReassignDialog(vm.paramsForAssignment).then(notifyAssignSuccessAndReload);\r\n }\r\n\r\n function showReassignDialog(params) {\r\n return $uibModal.open({\r\n controller: 'AssignTaskDialogController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/components/task-view/assignTaskDialog.html',\r\n resolve: {\r\n submissionParams: function () {\r\n return params;\r\n },\r\n endpoints: function () {\r\n return vm.endpoints;\r\n }\r\n }\r\n }).result;\r\n }\r\n\r\n function notifyAssignSuccessAndReload() {\r\n reloadPage();\r\n toastr.success('Task successfully assigned.');\r\n }\r\n\r\n function reloadPage() {\r\n $state.reload();\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n\r\n routeManager.addStates([\r\n {\r\n state: 'levelisation',\r\n config: {\r\n title: 'Levelisation',\r\n url: '/levelisation',\r\n data: {\r\n permissions: {\r\n only: ['LevelisationGroup']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/levelisation/levelisation-navigation.html'\r\n },\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/levelisationList.html',\r\n controller: 'LevelisationListController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'levelisation#tasks',\r\n config: {\r\n\r\n title: 'Taskbar',\r\n url: '/levelisationTasks',\r\n data: {\r\n permissions: {\r\n only: ['LevelisationGroup']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/levelisation/levelisation-navigation.html'\r\n },\r\n 'display@levelisation#tasks': {\r\n templateUrl: 'app/levelisation/levelisationTasks.html',\r\n controller: 'LevelisationTasksController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'levelisation#create',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/levelisationEdit.html',\r\n controller: 'LevelisationEditController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/new',\r\n params:\r\n {\r\n id: null\r\n }\r\n }\r\n },\r\n {\r\n state: 'levelisation#view',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/levelisationView.html',\r\n controller: 'LevelisationViewController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{id:int}'\r\n }\r\n },\r\n {\r\n state: 'levelisation#edit',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/levelisationEdit.html',\r\n controller: 'LevelisationEditController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{id:int}/edit'\r\n }\r\n },\r\n {\r\n state: 'levelisation#data',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/data/listLevelisationData.html',\r\n controller: 'ListLevelisationDataController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{levelisationId:int}/data'\r\n }\r\n },\r\n {\r\n state: 'levelisation#data#results',\r\n config: {\r\n parent: 'levelisation#data',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/results/viewLevelisationResults.html',\r\n controller: 'ViewLevelisationResultsController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/preview'\r\n }\r\n },\r\n {\r\n state: 'levelisation#data#edit',\r\n config: {\r\n parent: 'levelisation#data',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/data/editLevelisationData.html',\r\n controller: 'EditLevelisationDataController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId}'\r\n }\r\n },\r\n {\r\n state: 'levelisation#data#view',\r\n config: {\r\n parent: 'levelisation#data',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/data/viewLevelisationData.html',\r\n controller: 'ViewLevelisationDataController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId}/view'\r\n }\r\n },\r\n {\r\n state: 'levelisation#payment',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/payment/listLevelisationPayment.html',\r\n controller: 'ListLevelisationPaymentController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{levelisationId:int}/payment'\r\n }\r\n },\r\n {\r\n state: 'levelisation#payment#overpayments',\r\n config: {\r\n parent: 'levelisation#payment',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/payment/viewLevelisationOverpayment.html',\r\n controller: 'ViewLevelisationOverpaymentController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/overpayment'\r\n }\r\n },\r\n {\r\n state: 'levelisation#payment#view',\r\n config: {\r\n parent: 'levelisation#payment',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/payment/viewLevelisationPayment.html',\r\n controller: 'ViewLevelisationPaymentController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId}/view'\r\n }\r\n },\r\n {\r\n state: 'levelisation#payment#edit',\r\n config: {\r\n parent: 'levelisation#payment',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/payment/editLevelisationPayment.html',\r\n controller: 'EditLevelisationPaymentController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId}'\r\n }\r\n },\r\n {\r\n state: 'levelisationData/history',\r\n config: {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm',\r\n params: {\r\n returnState: null,\r\n entityType: 'Levelisation data',\r\n endpoint: 'LevelisationData'\r\n },\r\n title: 'Supplier History',\r\n url: '/levelisation/data/history/{id}/{name}',\r\n data: {\r\n permissions: {\r\n only: ['LevelisationGroup']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'levelisationData',\r\n config: {\r\n data: {\r\n permissions: {\r\n only: ['ExternalLevelisation']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/levelisation/levelisation-external-navigation.html'\r\n },\r\n 'display@levelisationData': {\r\n templateUrl: 'app/levelisation/data/selectLevelisationData.html',\r\n controller: 'SelectLevelisationDataController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n title: 'Levelisation',\r\n url: '/levelisation/upload'\r\n }\r\n },\r\n {\r\n state: 'levelisation#externaltasks',\r\n config: {\r\n title: 'Taskbar',\r\n url: '/levelisationExternalTasks',\r\n data: {\r\n permissions: {\r\n only: ['ExternalLevelisation']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/levelisation/levelisation-external-navigation.html'\r\n },\r\n 'display@levelisation#externaltasks': {\r\n templateUrl: 'app/levelisation/levelisationTasks.html',\r\n controller: 'LevelisationTasksController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'levelisationData#upload',\r\n config: {\r\n parent: 'levelisationData',\r\n views: {\r\n 'display@levelisationData': {\r\n templateUrl: 'app/levelisation/data/editLevelisationData.html',\r\n controller: 'EditLevelisationDataController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{levelisationId}/licence/{licenceId}'\r\n }\r\n },\r\n {\r\n state: 'levelisation#shortfall',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/shortfall/listLevelisationShortfall.html',\r\n controller: 'ListLevelisationShortfallController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{levelisationId:int}/shortfall'\r\n }\r\n },\r\n {\r\n state: 'levelisation#shortfall#summary',\r\n config: {\r\n parent: 'levelisation#shortfall',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/shortfall/viewShortfallSummaryTable.html',\r\n controller: 'ViewShortfallSummaryTableController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/summary'\r\n }\r\n },\r\n {\r\n state: 'levelisation#shortfall#view',\r\n config: {\r\n parent: 'levelisation#shortfall',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/shortfall/viewLevelisationShortfall.html',\r\n controller: 'ViewLevelisationShortfallController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId}/view'\r\n }\r\n },\r\n {\r\n state: 'levelisation#mutualisation#edit',\r\n config: {\r\n parent: 'levelisation#mutualisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/mutualisation/editLevelisationMutualisation.html',\r\n controller: 'EditLevelisationMutualisationController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId:int}/'\r\n }\r\n },\r\n {\r\n state: 'levelisation#mutualisation',\r\n config: {\r\n parent: 'levelisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/mutualisation/listLevelisationMutualisation.html',\r\n controller: 'ListLevelisationMutualisationController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{levelisationId:int}/mutualisation'\r\n }\r\n },\r\n {\r\n state: 'levelisation#mutualisation#view',\r\n config: {\r\n parent: 'levelisation#mutualisation',\r\n views: {\r\n 'display@levelisation': {\r\n templateUrl: 'app/levelisation/mutualisation/viewLevelisationMutualisation.html',\r\n controller: 'ViewLevelisationMutualisationController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/{licenceId}/view'\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationService', levelisationService);\r\n\r\n function levelisationService($http, appConfig) {\r\n return {\r\n save: save\r\n };\r\n \r\n function save(levelisation, id) {\r\n var encodedData = angular.toJson(levelisation);\r\n if (id === null) {\r\n return $http.post(appConfig.apiRoot + 'levelisations', encodedData);\r\n }\r\n return $http.put(appConfig.apiRoot + 'levelisations/' + id, encodedData);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('LevelisationEditController', LevelisationEditController);\r\n\r\n\r\n function LevelisationEditController(levelisationService, $state, $stateParams, dataService, formUtils, constants) {\r\n var vm = this;\r\n vm.id = $stateParams.id;\r\n vm.formFields = formFields();\r\n vm.fetchData = fetchData;\r\n vm.cancel = returnToTable;\r\n vm.save = save;\r\n\r\n function fetchData() {\r\n if (vm.id != null) {\r\n return dataService.fetchDataFromEndpointById('levelisations', vm.id).then(formatFields);\r\n }\r\n return {};\r\n }\r\n\r\n function formatFields(levelisation) {\r\n levelisation.startDate = formUtils.convertToDate(levelisation.startDate);\r\n levelisation.endDate = formUtils.convertToDate(levelisation.endDate);\r\n levelisation.submissionStartDate = formUtils.convertToDate(levelisation.submissionStartDate);\r\n levelisation.submissionEndDate = formUtils.convertToDate(levelisation.submissionEndDate);\r\n levelisation.systemSellPrice = formUtils.formatAsCurrency(levelisation.systemSellPrice, 3);\r\n levelisation.smallLicenseeNewInstallationQualifyingCost\r\n = formUtils.formatAsCurrency(levelisation.smallLicenseeNewInstallationQualifyingCost);\r\n levelisation.smallLicenseeOngoingInstallationQualifyingCost\r\n = formUtils.formatAsCurrency(levelisation.smallLicenseeOngoingInstallationQualifyingCost);\r\n levelisation.largeLicenseeNewInstallationQualifyingCost\r\n = formUtils.formatAsCurrency(levelisation.largeLicenseeNewInstallationQualifyingCost);\r\n levelisation.largeLicenseeOngoingInstallationQualifyingCost\r\n = formUtils.formatAsCurrency(levelisation.largeLicenseeOngoingInstallationQualifyingCost);\r\n levelisation.minimumDeemedExportRate\r\n = formUtils.formatAsCurrency(levelisation.minimumDeemedExportRate);\r\n levelisation.maximumDeemedExportRate\r\n = formUtils.formatAsCurrency(levelisation.maximumDeemedExportRate);\r\n levelisation.minimumMeteredExportRate\r\n = formUtils.formatAsCurrency(levelisation.minimumMeteredExportRate);\r\n levelisation.maximumMeteredExportRate\r\n = formUtils.formatAsCurrency(levelisation.maximumMeteredExportRate);\r\n\r\n levelisation.mutualisationThreshold = formUtils.formatAsCurrency(levelisation.mutualisationThreshold);\r\n levelisation.mutualisationCap = formUtils.formatAsCurrency(levelisation.mutualisationCap);\r\n\r\n vm.periodId = levelisation.periodId;\r\n\r\n return levelisation;\r\n }\r\n\r\n function save(levelisation) {\r\n return levelisationService.save(levelisation, $stateParams.id).then(returnToTable);\r\n }\r\n\r\n function returnToTable() {\r\n $state.go('^');\r\n }\r\n\r\n function formFields() {\r\n var startDate = {\r\n className: 'col-md-6',\r\n key: 'startDate',\r\n type: 'fitDatePicker',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the start date of the Levelisation Period'\r\n },\r\n label: 'Start date',\r\n required: true\r\n }\r\n };\r\n var endDate = {\r\n className: 'col-md-6',\r\n key: 'endDate',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitGreaterThanValidator'],\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the end date of the Levelisation Period'\r\n },\r\n greaterThan: 'startDate',\r\n greaterThanValidationMessage: 'End date must be after start date',\r\n label: 'End date',\r\n required: true\r\n }\r\n };\r\n var submissionStartDate = {\r\n className: 'col-md-6',\r\n key: 'submissionStartDate',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitGreaterThanValidator', 'fitDateInFutureValidator'],\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the date in which suppliers can begin to submit Levelisation data'\r\n },\r\n label: 'Submission start date',\r\n required: true,\r\n greaterThan: 'endDate',\r\n greaterThanValidationMessage: 'Submission start date must be after end date'\r\n }\r\n };\r\n var submissionEndDate = {\r\n className: 'col-md-6',\r\n key: 'submissionEndDate',\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitGreaterThanValidator'],\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the last day in which suppliers can submit Levelisation data'\r\n },\r\n label: 'Submission end date',\r\n required: true,\r\n greaterThan: 'submissionStartDate',\r\n greaterThanValidationMessage: 'Submission end date must be after submission start date'\r\n }\r\n };\r\n var smallLicenceNewQualifyingCost = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'smallLicenseeNewInstallationQualifyingCost',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the cost per new installation registered for a Small (Voluntary) Licensee'\r\n },\r\n label: 'New installation qualifying cost for small licensees'\r\n }\r\n };\r\n var smallLicenceOngoingQualifyingCost = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'smallLicenseeOngoingInstallationQualifyingCost',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the admin cost per installation registered in a previous FIT Year, for a Small '\r\n + '(Voluntary) Licensee. Ongoing costs are typically allocated once a year in the first '\r\n + 'Levelisation process of each FIT Year. Any completed installation switches to this '\r\n + 'licence will also display here, in the period completed'\r\n },\r\n required: true,\r\n label: 'Ongoing installation qualifying cost for small licensees'\r\n }\r\n };\r\n var largeLicenceNewQualifyingCost = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'largeLicenseeNewInstallationQualifyingCost',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the cost per new installation registered for a Large (Mandatory) Licensee'\r\n },\r\n required: true,\r\n label: 'New installation qualifying cost for large licensees'\r\n }\r\n };\r\n var largeLicenceOngoingQualifyingCost = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'largeLicenseeOngoingInstallationQualifyingCost',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the admin cost per installation registered in a previous FIT Year, for a Large '\r\n + '(Mandatory) Licensee. Ongoing costs are typically allocated once a year in the first '\r\n + 'Levelisation process of each FIT Year. Any completed installation switches to this '\r\n + 'licence will also display here'\r\n },\r\n required: true,\r\n label: 'Ongoing installation qualifying cost for large licensees'\r\n }\r\n };\r\n var minimumDeemedExportRate = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'minimumDeemedExportRate',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the minimum rate at which deemed export can be paid'\r\n },\r\n required: true,\r\n label: 'Minimum Deemed Export Rate'\r\n }\r\n };\r\n var maximumDeemedExportRate = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'maximumDeemedExportRate',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the maximum rate at which deemed export can be paid'\r\n },\r\n required: true,\r\n label: 'Maximum Deemed Export Rate'\r\n }\r\n };\r\n var minimumMeteredExportRate = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'minimumMeteredExportRate',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the minimum rate at which metered export can be paid'\r\n },\r\n required: true,\r\n label: 'Minimum Metered Export Rate'\r\n }\r\n };\r\n var maximumMeteredExportRate = {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'maximumMeteredExportRate',\r\n type: 'fitCurrency',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the maximum rate at which metered export can be paid'\r\n },\r\n required: true,\r\n label: 'Maximum Metered Export Rate'\r\n }\r\n };\r\n var mutualisationThreshold = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'mutualisationThreshold',\r\n type: 'fitCurrency',\r\n hideExpression: 'model.periodId == 4',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This value is set by the Secretary of State each year. The mutualisation process is '\r\n + 'triggered should the total shortfall surpass this value.'\r\n },\r\n required: true,\r\n label: 'Mutualisation Threshold'\r\n }\r\n };\r\n var mutualisationCap = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'mutualisationCap',\r\n type: 'fitCurrency',\r\n hideExpression: 'model.periodId == 4',\r\n optionsTypes: ['fitGreaterThanValidator'],\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This value is set by the Secretary of State each year. If the total shortfall is '\r\n + 'greater than this value, mutualisation will only take place to recover funds up to '\r\n + 'this limit. Any amount greater than this will not be recovered through mutualisation.'\r\n },\r\n required: true,\r\n label: 'Mutualisation Cap',\r\n greaterThan: 'mutualisationThreshold',\r\n greaterThanValidationMessage: 'Value must be greater than the mutualisation threshold'\r\n }\r\n };\r\n var year = {\r\n className: 'col-md-6',\r\n key: 'fitYear',\r\n type: 'fitAsyncSelect',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the yearly period to which the Levelisation Period falls into'\r\n },\r\n required: true,\r\n label: 'FIT year',\r\n noOptionsMessage: 'No valid FIT year found.',\r\n endpoint: 'levelisations/years/current'\r\n }\r\n };\r\n var period = {\r\n className: 'col-md-6',\r\n key: 'periodId',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the period in which the Levelisation data submitted should relate to'\r\n },\r\n required: true,\r\n label: 'Levelisation period',\r\n options: constants.levelisationPeriods\r\n }\r\n };\r\n var exemptSupplyCap = {\r\n className: 'col-md-6 narrow-field',\r\n key: 'exemptSupplyCap',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator', 'fitGreaterThanZeroValidator'],\r\n type: 'fitInput',\r\n hideExpression: function ($viewValue, $modelVale, scope) {\r\n return scope.model.fitYear > constants.fitConstants.gieYear;\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total cap on the volume of green imported exempt supply for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Exempt supply cap (MWh)'\r\n }\r\n };\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n year,\r\n period\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n startDate,\r\n endDate\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n submissionStartDate,\r\n submissionEndDate\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n exemptSupplyCap\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n smallLicenceNewQualifyingCost,\r\n smallLicenceOngoingQualifyingCost\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n largeLicenceNewQualifyingCost,\r\n largeLicenceOngoingQualifyingCost\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n minimumDeemedExportRate,\r\n maximumDeemedExportRate\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n minimumMeteredExportRate,\r\n maximumMeteredExportRate\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n mutualisationThreshold,\r\n mutualisationCap\r\n ]\r\n }\r\n ];\r\n }\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('LevelisationListController', LevelisationListController);\r\n\r\n\r\n function LevelisationListController(paginatedDataService, $state, formUtils, downloadService) {\r\n var vm = this;\r\n\r\n vm.options = {\r\n defaultSort: 'endDate',\r\n defaultSortDirection: 'descending'\r\n };\r\n vm.exportFormFields = exportFormFields();\r\n vm.csv = csv;\r\n\r\n vm.columns = [\r\n {\r\n id: 'displayName',\r\n label: 'Levelisation period',\r\n sort: false\r\n },\r\n {\r\n id: 'startDate',\r\n label: 'Start date',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n id: 'endDate',\r\n label: 'End date',\r\n type: 'date',\r\n sort: true,\r\n sortDefault: 'descending'\r\n },\r\n {\r\n id: 'submissionStartDate',\r\n label: 'Submission start date',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n id: 'submissionEndDate',\r\n label: 'Submission end date',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n label: 'View data',\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Data',\r\n onClick: viewData\r\n }\r\n },\r\n {\r\n label: 'Configure',\r\n sort: false,\r\n type: 'conditional',\r\n condition: submissionPeriodHasStartedOrCalculationHasBeenRun,\r\n states:\r\n {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'View',\r\n onClick: view\r\n }\r\n },\r\n false: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Configure',\r\n onClick: edit\r\n }\r\n }\r\n }\r\n },\r\n {\r\n label: 'Payments',\r\n type: 'conditional',\r\n condition: isLevelisationFinalised,\r\n states:\r\n {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Payment',\r\n onClick: viewPayment\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Shortfall',\r\n type: 'conditional',\r\n condition: isPaymentFinalised,\r\n states:\r\n {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Data',\r\n onClick: viewShortfall\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Mutualisation',\r\n type: 'conditional',\r\n condition: isMutualisationTriggered,\r\n states:\r\n {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Data',\r\n onClick: viewMutualisation\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n }\r\n ];\r\n\r\n vm.fetchData = fetchData;\r\n\r\n function csv(csvModel) {\r\n downloadService.download('levelisations/results/export', false, csvModel);\r\n }\r\n\r\n function exportFormFields() {\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'fitYear',\r\n type: 'fitAsyncSelect',\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the yearly period to which the Levelisation Period falls into'\r\n },\r\n required: true,\r\n label: 'FIT year',\r\n noOptionsMessage: 'No valid FIT year found.',\r\n endpoint: 'levelisations/years/all'\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n\r\n function isLevelisationFinalised(levelisation) {\r\n return levelisation.totalLevelisationFund != null;\r\n }\r\n\r\n function isPaymentFinalised(levelisation) {\r\n return levelisation.isPaymentFinalised;\r\n }\r\n\r\n function submissionPeriodHasStartedOrCalculationHasBeenRun(levelisation) {\r\n return formUtils.convertToDate(levelisation.submissionStartDate) < new Date()\r\n || levelisation.calculationHasRun === true;\r\n }\r\n\r\n function isMutualisationTriggered(levelisation) {\r\n return levelisation.isMutualisationTriggered && levelisation.period != 'Annual';\r\n }\r\n\r\n function fetchData(tableData) {\r\n return paginatedDataService.fetchDataFromTableData('levelisations', tableData);\r\n }\r\n\r\n function viewData(levelisation) {\r\n $state.go('levelisation#data', { levelisationId: levelisation.id });\r\n }\r\n\r\n function view(levelisation) {\r\n $state.go('levelisation#view', { id: levelisation.id });\r\n }\r\n\r\n function edit(levelisation) {\r\n $state.go('levelisation#edit', { id: levelisation.id });\r\n }\r\n\r\n function viewPayment(levelisation) {\r\n $state.go('levelisation#payment', { levelisationId: levelisation.id });\r\n }\r\n\r\n function viewShortfall(levelisation) {\r\n $state.go('levelisation#shortfall', { levelisationId: levelisation.id });\r\n }\r\n\r\n function viewMutualisation(levelisation) {\r\n $state.go('levelisation#mutualisation', { levelisationId: levelisation.id });\r\n }\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('LevelisationTasksController', LevelisationTasksController);\r\n\r\n\r\n function LevelisationTasksController(levelisationConversationService, dataService, constants, principal) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.taskOrderByOptions = {\r\n field: 'orderingId',\r\n options: constants.taskOrderByOptions\r\n };\r\n\r\n vm.messageTypes = constants.levelisationMessageTypes;\r\n vm.showConversationDialog = showConversationDialog;\r\n vm.getAssignParamsFromTask = getAssignParamsFromTask;\r\n\r\n vm.endpoints = {\r\n getUsers: 'levelisationTasks/levelisationUsers',\r\n assignMany: 'levelisationTasks/assignMany',\r\n getPaginatedTasks: 'levelisationTasks'\r\n };\r\n\r\n vm.setFilters = setFilters;\r\n vm.isInternal = principal.isInternal();\r\n\r\n vm.levelisationColumns = [\r\n {\r\n id: 'dateSubmitted',\r\n label: 'Date submitted',\r\n type: 'dateTime'\r\n }, {\r\n type: 'conditional',\r\n label: 'Licence Name',\r\n condition: getRowLevelisationDataLinkState,\r\n states: {\r\n 'view': {\r\n type: 'link',\r\n displayProperty: 'licenceName',\r\n state: 'levelisation#data#view',\r\n params: '{ levelisationId: data.levelisationId, licenceId: data.licenceId }'\r\n },\r\n 'edit': {\r\n type: 'link',\r\n displayProperty: 'licenceName',\r\n state: 'levelisation#data#edit',\r\n params: '{ levelisationId: data.levelisationId, licenceId: data.licenceId }'\r\n },\r\n 'none': {\r\n id: 'licenceName'\r\n }\r\n }\r\n }, {\r\n type: 'conditional',\r\n condition: getLevelisationPeriodLinkState,\r\n label: 'Levelisation Period',\r\n id: 'periodDescription',\r\n displayProperty: 'levelisationPeriodDescription',\r\n states: {\r\n 'internal': {\r\n type: 'link',\r\n displayProperty: 'levelisationPeriodDescription',\r\n state: 'levelisation#data',\r\n params: '{ levelisationId: data.levelisationId }'\r\n },\r\n 'external': {\r\n type: 'link',\r\n displayProperty: 'levelisationPeriodDescription',\r\n state: 'levelisationData',\r\n params: '{ levelisationId: data.levelisationId }'\r\n }\r\n }\r\n }, {\r\n label: 'Supplier Email',\r\n id: 'supplierEmail'\r\n }, {\r\n id: 'createdBy',\r\n label: 'Created by',\r\n valueTemplate: '{{data.createdBy !== undefined ? data.createdBy : \"N/A\"}}'\r\n }\r\n ];\r\n vm.levelisationFilters = getLevelisationFilters();\r\n\r\n function setFilters(filters) {\r\n vm.tableParams = filters;\r\n }\r\n\r\n function getLevelisationFilters() {\r\n return [\r\n {\r\n name: 'supplier',\r\n id: 'filter-licence',\r\n model: 'licenceId',\r\n hasAllOption: true,\r\n isInternalOnly: true,\r\n fetchValues: function () {\r\n return dataService.fetchDataFromEndpoint('licences/all')\r\n .then(function (response) { return _.orderBy(response, ['name'], ['asc']); });\r\n }\r\n },\r\n {\r\n name: 'period',\r\n id: 'filter-period',\r\n model: 'levelisationId',\r\n hasAllOption: true,\r\n isInternalOnly: false,\r\n fetchValues: function () {\r\n return dataService.fetchDataFromEndpoint('levelisationTasks/periods')\r\n .then(function (response) { return _.orderBy(response, ['name'], ['desc']); });\r\n }\r\n\r\n }\r\n ];\r\n }\r\n\r\n function showConversationDialog(task) {\r\n var buttonOptions = {\r\n // We are already on a details page, so are not showing the navigation buttons \r\n hideNavigationButton: !vm.isInternal\r\n };\r\n return levelisationConversationService\r\n .showConversationDialog(\r\n false,\r\n task.levelisationId,\r\n task.licenceId,\r\n buttonOptions,\r\n task.levelisationDataExists,\r\n task.levelisationHasBeenRun);\r\n }\r\n\r\n function getAssignParamsFromTask(task) {\r\n return {\r\n licenceId: task.licenceId,\r\n levelisationId: task.levelisationId\r\n };\r\n }\r\n\r\n function getRowLevelisationDataLinkState(rowData) {\r\n if (!vm.isInternal) {\r\n return 'none';\r\n }\r\n if (rowData.levelisationDataExists) {\r\n return 'view';\r\n }\r\n else if (!rowData.levelisationHasBeenRun) {\r\n return 'edit';\r\n }\r\n return 'none';\r\n }\r\n\r\n function getLevelisationPeriodLinkState() {\r\n if (!vm.isInternal) {\r\n return 'external';\r\n }\r\n return 'internal';\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('LevelisationViewController', LevelisationViewController);\r\n\r\n\r\n function LevelisationViewController($stateParams, dataService, $log) {\r\n var vm = this;\r\n vm.error = '';\r\n vm.loading = true;\r\n var id = $stateParams.id;\r\n vm.levelisation = {};\r\n vm.levelisationId = $stateParams.id;\r\n\r\n dataService.fetchDataFromEndpointById('levelisations', id).then(displayLevelisation, displayError);\r\n \r\n function displayLevelisation(levelisation) {\r\n vm.loading = false;\r\n vm.levelisation = levelisation;\r\n }\r\n\r\n function displayError(error) {\r\n vm.loading = false;\r\n $log.warn('API request failed:', error);\r\n vm.error = 'There was an error loading data from the server.';\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('EditLevelisationMutualisationController', EditLevelisationMutualisationController);\r\n\r\n function EditLevelisationMutualisationController(levelisationMutualisationService, dataService, $state,\r\n $stateParams, formUtils, $q) {\r\n var vm = this;\r\n vm.totals = {};\r\n vm.levelisation = {};\r\n var levelisationId = $stateParams.levelisationId;\r\n vm.levelisationData = {};\r\n var licenceId = $stateParams.licenceId;\r\n vm.formFields = [];\r\n vm.levelisationData = {};\r\n vm.levelisationMutualisationData = {};\r\n vm.getLevelisationMutualisation = getLevelisationMutualisation;\r\n vm.loadData = loadData;\r\n vm.cancel = returnToSelectPage;\r\n vm.save = save;\r\n\r\n function loadData() {\r\n return $q.all([\r\n fetchLevelisationMutualisationData(),\r\n fetchLevelisation(),\r\n fetchLicence()\r\n ])\r\n .then(setFormFields);\r\n }\r\n\r\n function getLevelisationMutualisation() {\r\n return vm.levelisationMutualisationData;\r\n }\r\n\r\n function fetchLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', licenceId)\r\n .then(setLicenceData);\r\n }\r\n\r\n function setLicenceData(licence) {\r\n vm.licenceDetails = licence;\r\n }\r\n \r\n function fetchLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/summary')\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisation) {\r\n vm.levelisation = levelisation;\r\n }\r\n \r\n function fetchLevelisationMutualisationData() {\r\n return levelisationMutualisationService\r\n .fetchMutualisation(levelisationId, licenceId)\r\n .then(formatFields);\r\n }\r\n\r\n function formatFields(mutualisation) {\r\n\r\n var paymentDifference = mutualisation.mutualisationCostPerSupplierMarketShare - mutualisation.actualPaymentFigure;\r\n mutualisation.paymentDifferenceCheck = formUtils.formatAsCurrency(paymentDifference);\r\n\r\n mutualisation.mutualisationCostPerSupplierMarketShare = formUtils.formatAsCurrency(mutualisation.mutualisationCostPerSupplierMarketShare != null\r\n ? mutualisation.mutualisationCostPerSupplierMarketShare: null);\r\n mutualisation.actualPaymentFigure = formUtils.formatAsCurrency(mutualisation.actualPaymentFigure != null ? mutualisation.actualPaymentFigure : null);\r\n mutualisation.paymentDate = formUtils.convertToDate(mutualisation.paymentDate);\r\n vm.levelisationMutualisationData = mutualisation;\r\n\r\n vm.levelisationData.fitStatus = mutualisation.fitStatus;\r\n }\r\n\r\n \r\n function setFormFields() {\r\n vm.formFields = formFields();\r\n }\r\n\r\n function save(data) {\r\n var deferred = $q.defer();\r\n deferred.resolve(putToServer(data));\r\n return deferred.promise;\r\n }\r\n\r\n function putToServer(data) {\r\n return dataService.putToEndpoint('levelisations/' + levelisationId + '/mutualisation/' + licenceId, data)\r\n .then(returnToSelectPage);\r\n }\r\n\r\n function returnToSelectPage() {\r\n $state.go('^');\r\n }\r\n\r\n function formFields() {\r\n\r\n var blankField = {\r\n className: 'col-md-2 narrow-field',\r\n key: 'blankfield',\r\n templateOptions: {\r\n label: ' '\r\n }\r\n };\r\n\r\n var mutualisationCostPerSupplierMarketShare = {\r\n className: 'col-md-5 narrow-field',\r\n key: 'mutualisationCostPerSupplierMarketShare',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the Mutualisation cost per supplier market share for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Mutualisation cost per supplier market share (£)',\r\n displayValidationImmediately: vm.levelisationMutualisationData.mutualisationCostPerSupplierMarketShare != null,\r\n // required: true,\r\n disabled: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var actualPaymentFigure = {\r\n className: 'col-md-5 narrow-field',\r\n key: 'actualPaymentFigure',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the actual payment figure for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Actual Payment figure (£)',\r\n displayValidationImmediately: vm.levelisationMutualisationData.actualPaymentFigure != null,\r\n required: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var paymentDate = {\r\n className: 'col-md-5 wide-field',\r\n key: 'paymentDate',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n type: 'fitDatePicker',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the payment date for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Payment Date',\r\n displayValidationImmediately: vm.levelisationMutualisationData.paymentDate != null,\r\n required: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var paymentDifferenceCheck = {\r\n className: 'col-md-5 narrow-field',\r\n key: 'paymentDifferenceCheck',\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the payment difference check for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Payment Difference Check (£)',\r\n displayValidationImmediately: vm.levelisationMutualisationData.paymentDifferenceCheck != null,\r\n disabled: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var paymentComments = {\r\n className: 'col-md-12',\r\n key: 'paymentComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comments',\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n };\r\n\r\n var paymentFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n mutualisationCostPerSupplierMarketShare,\r\n blankField,\r\n actualPaymentFigure\r\n ]\r\n };\r\n\r\n var paymentExtrasFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n paymentDate,\r\n blankField,\r\n paymentDifferenceCheck\r\n ]\r\n };\r\n\r\n var paymentCommentFieldGroups = [{\r\n className: 'row',\r\n fieldGroup: [\r\n paymentComments\r\n ]\r\n }];\r\n\r\n var fields = [{}];\r\n fields.push(paymentFieldGroup);\r\n fields.push(paymentExtrasFieldGroup);\r\n\r\n return fields.concat(paymentCommentFieldGroups);\r\n }\r\n\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationMutualisationService', levelisationMutualisationService);\r\n\r\n function levelisationMutualisationService($http, appConfig, principal) {\r\n return {\r\n fetchMutualisation: fetchMutualisation,\r\n finalise: finalise,\r\n canFinalise: canFinalise,\r\n fetchMutualisationShortfall: fetchMutualisationShortfall\r\n };\r\n\r\n function fetchMutualisation(levelisationId, licenceId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/mutualisation/' + licenceId)\r\n .then(function (levelisationMutualisation) {\r\n return ((levelisationMutualisation.data != null) && (levelisationMutualisation.data.data != null))\r\n ? levelisationMutualisation.data.data\r\n : {};\r\n });\r\n }\r\n\r\n function finalise(levelisationId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/mutualisation/finalise')\r\n .then(function (levelisationMutualisation) {\r\n return ((levelisationMutualisation.data != null) && (levelisationMutualisation.data.data != null))\r\n ? levelisationMutualisation.data.data\r\n : {};\r\n });\r\n }\r\n\r\n function canFinalise() {\r\n if (principal.hasRole('LevelisationFourthApprover'))\r\n return true;\r\n }\r\n\r\n function fetchMutualisationShortfall(levelisationId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/mutualisation/shortfall')\r\n .then(function (response) {\r\n var model = (response != null) && (response.data != null) && (response.data.data != null)\r\n ? response.data.data : {};\r\n return model;\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationMutualisationApprovalService', levelisationMutualisationApprovalService);\r\n\r\n function levelisationMutualisationApprovalService($http, appConfig, dataService, principal) {\r\n return {\r\n approveAtLevel: approveAtLevel,\r\n isApprovedAtLevel: isApprovedAtLevel,\r\n areAllMutualisationsApprovedOrFinalised: areAllMutualisationsApprovedOrFinalised,\r\n canApprove: canApprove,\r\n approverFieldForLevel: approverFieldForLevel,\r\n approvalDateFieldForLevel: approvalDateFieldForLevel\r\n };\r\n\r\n function approveAtLevel(levelisationId, licenceId, approvalLevel, model) {\r\n return dataService.patchToEndpoint('levelisations/' + levelisationId\r\n + '/mutualisation/' + licenceId\r\n + '/approval/' + approvalLevel, model);\r\n }\r\n\r\n function isApprovedAtLevel(levelisationMutualisation, approvalLevel) {\r\n return levelisationMutualisation.approvalStatus >= approvalLevel;\r\n }\r\n\r\n function areAllMutualisationsApprovedOrFinalised(levelisationId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/mutualisation/areAllMutualisationsApprovedOrFinalised')\r\n .then(function (levelisationMutualisation) {\r\n return ((levelisationMutualisation.data != null) && (levelisationMutualisation.data.data != null))\r\n ? levelisationMutualisation.data.data\r\n : {};\r\n });\r\n }\r\n\r\n function canApprove(levelisationMutualisation) {\r\n\r\n // If it's already approved at level 2, then no need for an approval.\r\n if (isApprovedAtLevel(levelisationMutualisation, 2)) {\r\n return false;\r\n }\r\n\r\n if (levelisationMutualisation.approvalStatus === 0) {\r\n if (principal.hasRole('LevelisationApprover')\r\n || principal.hasRole('LevelisationSecondApprover')\r\n || principal.hasRole('LevelisationThirdApprover')) {\r\n return true;\r\n }\r\n }\r\n // The approval status is currently 1.\r\n else if (levelisationMutualisation.approvalStatus === 1) {\r\n // The current user's role did not do the approval at Level 1.\r\n if (!(principal.hasRole(levelisationMutualisation.level1ApproverRole))) {\r\n // Given that LevelisationApprover did the first approval\r\n // LevelisationSecondApprover should be able to do second approval\r\n // (if LevelisationThirdApprover did the first approval LevelisationSecondApprover will not be able to approve)\r\n if ((principal.hasRole('LevelisationSecondApprover')\r\n && levelisationMutualisation.level1ApproverRole === 'LevelisationApprover'))\r\n return true;\r\n // LevelisationApprover or LevelisationSecondApprover must have done first approval\r\n // as LevelisationFourthApprover can't do it, so always return true.\r\n // LevelisationThirdApprover should be able to do second approval.\r\n else if (principal.hasRole('LevelisationThirdApprover'))\r\n return true;\r\n // LevelisationApprover or LevelisationSecondApprover or LevelisationThirdApprover must have done first approval\r\n // LevelisationFourthApprover should be able to do second approval\r\n else if (principal.hasRole('LevelisationFourthApprover'))\r\n return true;\r\n else\r\n return false;\r\n\r\n }\r\n else\r\n return false;\r\n }\r\n else throw new Error('Unrecognised levelisationMutualisation.approvalStatus of ' + levelisationMutualisation.approvalStatus + ' It should be 0 or 1.');\r\n }\r\n\r\n function approverFieldForLevel(level) {\r\n switch (level) {\r\n case 1:\r\n return 'level1ApproverName';\r\n case 2:\r\n return 'level2ApproverName';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n\r\n function approvalDateFieldForLevel(level) {\r\n switch (level) {\r\n case 1:\r\n return 'level1ApprovalDate';\r\n case 2:\r\n return 'level2ApprovalDate';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ListLevelisationMutualisationController', ListLevelisationMutualisationController);\r\n\r\n\r\n function ListLevelisationMutualisationController(paginatedDataService, levelisationMutualisationApprovalService,\r\n dataService, $stateParams, $state, localStorageService, levelisationShortfallService, downloadService,\r\n levelisationMutualisationService, $q, $uibModal) {\r\n var vm = this;\r\n var levelisationId = $stateParams.levelisationId;\r\n var persistantFieldsKey = 'Mutualisation-' + levelisationId;\r\n\r\n vm.error = false;\r\n vm.approving = false;\r\n vm.computing = false;\r\n vm.dataSummary = {};\r\n vm.totals = {};\r\n vm.mutualisationShortfall = null;\r\n vm.fetchData = fetchData;\r\n vm.getExport = getExport; \r\n vm.loadData = loadData;\r\n vm.setUpColumns = setUpColumns;\r\n vm.approvedAtLevel2 = false;\r\n vm.canShowFinaliseButton = false;\r\n vm.finalise = finalise;\r\n vm.showHelpPopup = showHelpPopup; \r\n\r\n vm.options = {\r\n defaultSort: 'name',\r\n defaultSortDirection: 'ascending'\r\n };\r\n\r\n vm.columns = [];\r\n\r\n initForm();\r\n\r\n function initForm() {\r\n vm.model = localStorageService.get(persistantFieldsKey) || {};\r\n }\r\n\r\n function setUpColumns() {\r\n vm.columns = [\r\n {\r\n id: 'companyRegistrationNumber',\r\n label: 'Licence Num',\r\n sort:true\r\n },\r\n {\r\n id: 'name',\r\n label: 'Licence Name',\r\n sort: true\r\n },\r\n adjustedRelevantElectricitySupplied(),\r\n mutualisationMarketShare(),\r\n mutualisationCostPerSupplierMarketShare(),\r\n actualPaymentFigure(),\r\n paymentDifferenceCheck(),\r\n approvalColumnForLevel(1),\r\n approvalColumnForLevel(2),\r\n {\r\n label: 'View',\r\n sort: false,\r\n type: 'conditional',\r\n condition: hasBeenSubmitted,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'View',\r\n onClick: view\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n }\r\n ];\r\n\r\n if (!vm.finalised) {\r\n vm.columns.push({\r\n label: 'Edit',\r\n sort: false,\r\n type: 'conditional',\r\n condition: canshowEditButton,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'Edit',\r\n onClick: edit\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function canshowEditButton(levelisationData) {\r\n return !levelisationMutualisationApprovalService.isApprovedAtLevel(levelisationData, 1)\r\n || levelisationMutualisationApprovalService.canApprove(levelisationData);\r\n }\r\n\r\n function canShowFinaliseButton() {\r\n vm.canShowFinaliseButton = levelisationMutualisationService.canFinalise();\r\n }\r\n\r\n function edit(levelisationPayment) {\r\n $state.go('levelisation#mutualisation#edit', { levelisationId: levelisationId, licenceId: levelisationPayment.licenceId });\r\n }\r\n\r\n function adjustedRelevantElectricitySupplied() {\r\n var label = 'Adjusted Relevant Electricity Supplied (MWh)';\r\n\r\n var valueTemplate = ' {{data.adjustedRelevantElectricitySupplied | number:3}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function mutualisationCostPerSupplierMarketShare() {\r\n var label = 'Mutualisation Cost Per Supplier Market Share (£)';\r\n\r\n var valueTemplate = ' {{data.mutualisationCostPerSupplierMarketShare | number:2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function mutualisationMarketShare() {\r\n var label = 'Mutualisation Market Share (%)';\r\n\r\n var valueTemplate = ' {{data.mutualisationMarketShare | number:3}}';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function actualPaymentFigure() {\r\n var label = 'Actual Payment Figure';\r\n\r\n var valueTemplate = ' {{data.actualPaymentFigure | number:2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function paymentDifferenceCheck() {\r\n var label = 'Payment Difference Check';\r\n\r\n var valueTemplate = ' {{data.paymentDifferenceCheck | number:2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function getExport() {\r\n downloadService.download('levelisations/' + levelisationId + '/mutualisationexport');\r\n }\r\n\r\n function loadData() {\r\n return $q.all([\r\n loadSummary()\r\n ]);\r\n }\r\n\r\n function loadSummary() {\r\n\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/data/summary')\r\n .then(setupSummary).then(areAllMutualisationsApprovedOrFinalised(levelisationId)).then(canShowFinaliseButton()).\r\n then(\r\n function () {\r\n loadMutualisationShortfall();\r\n });\r\n }\r\n\r\n function areAllMutualisationsApprovedOrFinalised(levelisationId) {\r\n levelisationMutualisationApprovalService.areAllMutualisationsApprovedOrFinalised(levelisationId).then(\r\n function (response) {\r\n if (response === 0) {\r\n vm.approvedAtLevel2 = false;\r\n vm.finalised = false;\r\n }\r\n else if (response === 1) {\r\n vm.approvedAtLevel2 = true;\r\n vm.finalised = false;\r\n }\r\n else if (response === 2) {\r\n vm.approvedAtLevel2 = false;\r\n vm.finalised = true;\r\n }\r\n }\r\n );\r\n }\r\n\r\n function finalise() {\r\n levelisationMutualisationService.finalise(levelisationId).then(function() {\r\n (areAllMutualisationsApprovedOrFinalised(levelisationId));\r\n }).then(function() {(canShowFinaliseButton(levelisationId));});\r\n }\r\n\r\n function setupSummary(summary) {\r\n vm.dataSummary = summary;\r\n setUpColumns();\r\n\r\n return levelisationShortfallService.fetchShortfallTotal(levelisationId).then(\r\n function (response) {\r\n vm.totals = response;\r\n }\r\n );\r\n }\r\n\r\n function loadMutualisationShortfall() {\r\n if (vm.approvedAtLevel2 || vm.finalised) {\r\n return levelisationMutualisationService.fetchMutualisationShortfall(levelisationId)\r\n .then(function (response) {\r\n vm.mutualisationShortfall = response;\r\n });\r\n }\r\n }\r\n\r\n function hasBeenSubmitted(levelisationMutualisation) {\r\n // This is a temporary comment out and replace with true until story 5 is done and we can know \r\n // when the data has been submitted (clicked on save in user story5)\r\n //return true;\r\n return levelisationMutualisation.dataSubmitted;\r\n }\r\n\r\n function approvalColumnForLevel(level) {\r\n var label = 'Level ' + level + ' approval';\r\n\r\n var booleanTemplate = '';\r\n var dateTemplate = ' on {{data[\\''\r\n + levelisationMutualisationApprovalService.approvalDateFieldForLevel(level) + '\\'] | date:\\'dd-MM-yyyy\\'}}';\r\n\r\n var checkboxTemplate = ''\r\n + booleanTemplate + dateTemplate + '';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: checkboxTemplate,\r\n isApproved: isApproved\r\n };\r\n\r\n function isApproved(levelisationData) {\r\n return levelisationMutualisationApprovalService.isApprovedAtLevel(levelisationData, level);\r\n }\r\n }\r\n\r\n function view(levelisationData) {\r\n $state.go('levelisation#mutualisation#view', { levelisationId: levelisationId, licenceId: levelisationData.licenceId });\r\n }\r\n\r\n function showHelpPopup() { \r\n\r\n $uibModal.open({\r\n templateUrl: 'app/levelisation/mutualisation/mutualisationCalculationHelp.html',\r\n windowClass: 'wide-modal-window'\r\n });\r\n }\r\n\r\n function fetchData(tableData) {\r\n localStorageService.set(persistantFieldsKey, vm.model);\r\n tableData.search.predicateObject = vm.model;\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/mutualisation', params);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewLevelisationMutualisationController', ViewLevelisationMutualisationController);\r\n\r\n\r\n function ViewLevelisationMutualisationController($stateParams, dataService, levelisationDataService, levelisationMutualisationService, levelisationMutualisationApprovalService, $state, $q, principal) {\r\n\r\n var vm = this;\r\n\r\n vm.canApprove = false;\r\n\r\n vm.levelisationId = $stateParams.levelisationId;\r\n var licenceId = $stateParams.licenceId;\r\n vm.isFit = false;\r\n vm.levelisation2019InEffect = false;\r\n\r\n vm.licenceDetails = {};\r\n vm.levelisationMutualisation = {};\r\n vm.levelisationData = {};\r\n vm.levelisationDetails = {};\r\n vm.installationData = {};\r\n vm.variations = [];\r\n\r\n vm.loadLevelisation = loadLevelisation;\r\n vm.loadData = loadData;\r\n vm.getApprovalModel = getApprovalModel;\r\n vm.approve = approve;\r\n vm.isPeriodic = false;\r\n vm.IsExternal = principal.isExternal();\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Approve',\r\n cancel: 'Reset'\r\n }\r\n };\r\n vm.approvalFields = [{\r\n className: 'col-md-12',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }];\r\n\r\n function loadData() {\r\n return $q.all([\r\n loadLevelisation(),\r\n fetchLevelisationMutualisation(),\r\n loadLicence()\r\n ]);\r\n }\r\n\r\n function fetchLevelisationMutualisation() {\r\n return levelisationMutualisationService\r\n .fetchMutualisation(vm.levelisationId, licenceId)\r\n .then(displayLevelisationMutualisation);\r\n }\r\n\r\n function displayLevelisationMutualisation(levelisationMutualisation) {\r\n vm.levelisationMutualisation = levelisationMutualisation;\r\n vm.levelisationData.fitStatus = levelisationMutualisation.fitStatus;\r\n vm.canApprove = levelisationMutualisationApprovalService.canApprove(levelisationMutualisation);\r\n }\r\n\r\n function loadLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', $stateParams.licenceId)\r\n .then(setLicenceDetails);\r\n }\r\n\r\n function setLicenceDetails(licence) {\r\n vm.licenceDetails = licence;\r\n }\r\n\r\n function loadLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + vm.levelisationId)\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisationDetails) {\r\n vm.levelisationDetails = levelisationDetails;\r\n vm.levelisation2019InEffect = levelisationDataService.levelisation2019InEffect(levelisationDetails);\r\n }\r\n\r\n function approve(model) {\r\n return levelisationMutualisationApprovalService.approveAtLevel(vm.levelisationId, licenceId,\r\n vm.levelisationMutualisation.approvalStatus + 1, model)\r\n .then(returnToParent);\r\n }\r\n\r\n function getApprovalModel() {\r\n return { comments: null };\r\n }\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('EditLevelisationPaymentController', EditLevelisationPaymentController);\r\n\r\n function EditLevelisationPaymentController(levelisationPaymentService, dataService, $state,\r\n $stateParams, formUtils, $q, principal) {\r\n var vm = this;\r\n vm.totals = {};\r\n vm.levelisation = {};\r\n var levelisationId = $stateParams.levelisationId;\r\n var licenceId = $stateParams.licenceId;\r\n vm.formFields = [];\r\n vm.levelisationData = {};\r\n vm.levelisationPayment = {};\r\n vm.getLevelisationPayment = getLevelisationPayment;\r\n vm.loadData = loadData;\r\n vm.cancel = returnToSelectPage;\r\n vm.save = save;\r\n vm.fetchTotals = fetchTotals;\r\n\r\n function loadData() {\r\n return $q.all([\r\n fetchLevelisationPaymentData(),\r\n fetchTotals(),\r\n fetchLevelisation(),\r\n fetchLicence(),\r\n isUserLevel3Or4Approver()\r\n ])\r\n .then(setFormFields);\r\n }\r\n\r\n function isUserLevel3Or4Approver() {\r\n if ((principal.hasRole('LevelisationThirdApprover')) || (principal.hasRole('LevelisationFourthApprover')))\r\n vm.isUserLevelThreeOrFourApprover = true;\r\n else\r\n vm.isUserLevelThreeOrFourApprover = false;\r\n }\r\n\r\n function getLevelisationPayment() {\r\n return vm.levelisationPayment;\r\n }\r\n\r\n function fetchLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', licenceId)\r\n .then(setLicenceData);\r\n }\r\n\r\n function setLicenceData(licence) {\r\n vm.licenceDetails = licence;\r\n }\r\n\r\n function fetchTotals() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/results/totals')\r\n .then(populateTotals);\r\n }\r\n\r\n function populateTotals(totals) {\r\n vm.totals = totals;\r\n setPaymentDetails();\r\n }\r\n\r\n function setPaymentDetails() {\r\n // vm.totals.totalInvoiceValue is the value from the calculations i.e. from LevelisationsCalculator.cs PopulateResults()\r\n // levelisationPayment.totalInvoiceFigure is the value from the database\r\n //\r\n // If the value from calcs is null or 0 then use the value from database (assuming it is not null/0 - if it is use 0).\r\n // If the value from calcs is not null/0 and value from database is null/0 then use the value from calcs.\r\n // Otherwise use the value 0\r\n if (vm.totals.totalInvoiceValue == null || vm.totals.totalInvoiceValue == 0)\r\n vm.levelisationPayment.totalInvoiceFigure = (vm.levelisationPayment.totalInvoiceFigure != 0 && vm.levelisationPayment.totalInvoiceFigure != null ? vm.levelisationPayment.totalInvoiceFigure : 0);\r\n else if ((vm.totals.totalInvoiceValue != null) && (vm.totals.totalInvoiceValue != 0) && (vm.levelisationPayment.totalInvoiceFigure == 0 || vm.levelisationPayment.totalInvoiceFigure == null))\r\n vm.levelisationPayment.totalInvoiceFigure = vm.totals.totalInvoiceValue;\r\n else\r\n vm.levelisationPayment.totalInvoiceFigure = vm.levelisationPayment.totalInvoiceFigure;\r\n\r\n vm.levelisationPayment.actualPaymentFigure = vm.levelisationPayment.actualPaymentFigure;\r\n\r\n if (vm.levelisationPayment.actualPaymentFigure != null && vm.levelisationPayment.totalInvoiceFigure != null && vm.levelisationPayment.totalInvoiceFigure > 0)\r\n vm.levelisationPayment.paymentDifferenceCheck = (vm.levelisationPayment.totalInvoiceFigure - vm.levelisationPayment.actualPaymentFigure).toFixed(2);\r\n else if (vm.levelisationPayment.actualPaymentFigure != null && vm.levelisationPayment.totalInvoiceFigure != null && vm.levelisationPayment.totalInvoiceFigure < 0)\r\n vm.levelisationPayment.paymentDifferenceCheck = 0;\r\n\r\n vm.levelisationPayment.paymentDate = formUtils.convertToDate(vm.levelisationPayment.paymentDate);\r\n\r\n }\r\n\r\n function fetchLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/summary')\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisation) {\r\n vm.levelisation = levelisation;\r\n }\r\n\r\n function fetchLevelisationPaymentData() {\r\n return levelisationPaymentService\r\n .fetchPayment(levelisationId, licenceId)\r\n .then(formatPaymentFields);\r\n }\r\n\r\n function formatPaymentFields(levelisationPayment) {\r\n \r\n vm.levelisationPayment = levelisationPayment;\r\n vm.levelisationData.fitStatus = levelisationPayment.fitStatus;\r\n }\r\n\r\n function setFormFields() {\r\n vm.paymentDifferenceCheck = (vm.totalInvoiceFigure - vm.actualPaymentFigure).toFixed(2);\r\n vm.formFields = formFields();\r\n }\r\n\r\n function save(levelisationPayment) {\r\n var deferred = $q.defer();\r\n\r\n\r\n //validate(levelisationPayment).then(function () {\r\n deferred.resolve(putToServer(levelisationPayment));\r\n //})\r\n //.catch(function () {\r\n // // Do not submit or display an error message\r\n // deferred.resolve();\r\n //});\r\n\r\n return deferred.promise;\r\n }\r\n\r\n // Validation may need doing in a later story so placeholder is here\r\n // Currently returns true for everything \r\n // PLEASE DO NOT REMOVE\r\n //function validate(levelisationPayment) {\r\n // return true;\r\n //}\r\n\r\n function putToServer(levelisationPayment) {\r\n return dataService.putToEndpoint('levelisations/' + levelisationId + '/payment/' + licenceId, levelisationPayment)\r\n .then(returnToSelectPage);\r\n }\r\n\r\n function returnToSelectPage() {\r\n $state.go('^');\r\n }\r\n\r\n function formFields() {\r\n\r\n var blankField = {\r\n className: 'col-md-2 narrow-field',\r\n key: 'blankfield',\r\n templateOptions: {\r\n label: ' '\r\n }\r\n };\r\n\r\n var totalInvoiceFigure = {\r\n className: 'col-md-5 narrow-field',\r\n key: 'totalInvoiceFigure',\r\n optionsTypes: ['fitAllowNegativeNumberWithThreeDecimals'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the total invoiced for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: vm.levelisation.isAnnual == true ? 'Total Invoice Figure (£)' : 'Periodic Invoice Figure (£)',\r\n displayValidationImmediately: vm.levelisationPayment.totalInvoiceFigure != null,\r\n required: true,\r\n disabled: vm.isUserLevelThreeOrFourApprover == false\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var actualPaymentFigure = {\r\n className: 'col-md-5 narrow-field',\r\n key: 'actualPaymentFigure',\r\n optionsTypes: ['fitThreeDecimalPlacesValidator'],\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the actual payment figure for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Actual Payment figure (£)',\r\n displayValidationImmediately: vm.levelisationPayment.actualPaymentFigure != null,\r\n required: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var paymentDate = {\r\n className: 'col-md-5 wide-field',\r\n key: 'paymentDate',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n type: 'fitDatePicker',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the payment date for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Payment Date',\r\n displayValidationImmediately: vm.levelisationPayment.paymentDate != null,\r\n required: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var paymentDifferenceCheck = {\r\n className: 'col-md-5 narrow-field',\r\n key: 'paymentDifferenceCheck',\r\n type: 'fitInput',\r\n modelOptions: {\r\n allowInvalid: true\r\n },\r\n templateOptions: {\r\n progressiveDisclosure: {\r\n heading: 'Help',\r\n body: 'This is the payment difference check for the relevant '\r\n + 'Levelisation Period'\r\n },\r\n label: 'Payment Difference Check (£)',\r\n displayValidationImmediately: vm.levelisationPayment.paymentDifferenceCheck != null,\r\n disabled: true\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n\r\n var paymentComments = {\r\n className: 'col-md-12',\r\n key: 'paymentComment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comments',\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n };\r\n\r\n var paymentFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n totalInvoiceFigure,\r\n blankField,\r\n actualPaymentFigure\r\n ]\r\n };\r\n\r\n var paymentExtrasFieldGroup = {\r\n className: 'row',\r\n fieldGroup: [\r\n paymentDate,\r\n blankField,\r\n paymentDifferenceCheck\r\n ]\r\n };\r\n\r\n var paymentCommentFieldGroups = [{\r\n className: 'row',\r\n fieldGroup: [\r\n paymentComments\r\n ]\r\n }];\r\n\r\n var fields = [{}];\r\n fields.push(paymentFieldGroup);\r\n fields.push(paymentExtrasFieldGroup);\r\n\r\n return fields.concat(paymentCommentFieldGroups);\r\n }\r\n\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationPaymentService', levelisationPaymentService);\r\n\r\n function levelisationPaymentService($http, appConfig) {\r\n return {\r\n fetch: fetch,\r\n fetchPayment: fetchPayment\r\n };\r\n\r\n function fetch(levelisationId, licenceId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/data/' + licenceId)\r\n .then(function(levelisationData) {\r\n return ((levelisationData.data != null) && (levelisationData.data.data != null))\r\n ? levelisationData.data.data : {};\r\n })\r\n .then(function(levelisation) {\r\n return levelisation;\r\n });\r\n }\r\n\r\n function fetchPayment(levelisationId, licenceId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/payment/' + licenceId)\r\n .then(function(levelisationPayment) {\r\n return ((levelisationPayment.data != null) && (levelisationPayment.data.data != null))\r\n ? levelisationPayment.data.data\r\n : {};\r\n });\r\n }\r\n \r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationPaymentApprovalService', levelisationPaymentApprovalService);\r\n\r\n function levelisationPaymentApprovalService(dataService, principal) {\r\n\r\n return {\r\n approveAtLevel: approveAtLevel,\r\n isApprovedAtLevel: isApprovedAtLevel,\r\n canApprove: canApprove,\r\n approvalDateFieldForLevel: approvalDateFieldForLevel\r\n };\r\n\r\n function approveAtLevel(levelisationId, licenceId, approvalLevel, model) {\r\n return dataService.patchToEndpoint('levelisations/' + levelisationId\r\n + '/payment/' + licenceId\r\n + '/approval/' + approvalLevel, model);\r\n }\r\n\r\n function isApprovedAtLevel(levelisationPayment, approvalLevel) {\r\n return levelisationPayment.approvalStatus >= approvalLevel;\r\n }\r\n\r\n function canApprove(levelisationPayment) {\r\n // If it's already approved at level 2, then no need for an approval.\r\n if (isApprovedAtLevel(levelisationPayment, 2)) {\r\n return false;\r\n }\r\n\r\n if (levelisationPayment.approvalStatus === 0) {\r\n if (principal.hasRole('LevelisationApprover')\r\n || principal.hasRole('LevelisationSecondApprover')\r\n || principal.hasRole('LevelisationThirdApprover')) {\r\n return true;\r\n }\r\n }\r\n // The approval status is currently 1.\r\n else if (levelisationPayment.approvalStatus === 1) {\r\n // The current user's role did not do the approval at Level 1.\r\n if (!(principal.hasRole(levelisationPayment.level1ApproverRole))) {\r\n // Given that LevelisationApprover did the first approval\r\n // LevelisationSecondApprover should be able to do second approval\r\n // (if LevelisationThirdApprover did the first approval LevelisationSecondApprover will not be able to approve)\r\n if ((principal.hasRole('LevelisationSecondApprover')\r\n && levelisationPayment.level1ApproverRole === 'LevelisationApprover'))\r\n return true;\r\n // LevelisationApprover or LevelisationSecondApprover must have done first approval\r\n // as LevelisationFourthApprover can't do it, so always return true.\r\n // LevelisationThirdApprover should be able to do second approval.\r\n else if (principal.hasRole('LevelisationThirdApprover'))\r\n return true;\r\n // LevelisationApprover or LevelisationSecondApprover or LevelisationThirdApprover must have done first approval\r\n // LevelisationFourthApprover should be able to do second approval\r\n else if (principal.hasRole('LevelisationFourthApprover'))\r\n return true;\r\n else\r\n return false;\r\n\r\n }\r\n }\r\n else throw new Error('Unrecognised levelisationPayment.approvalStatus.');\r\n\r\n }\r\n\r\n function approvalDateFieldForLevel(level) {\r\n switch (level) {\r\n case 1:\r\n return 'level1ApprovalDate';\r\n case 2:\r\n return 'level2ApprovalDate';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ListLevelisationPaymentController', ListLevelisationPaymentController);\r\n\r\n\r\n function ListLevelisationPaymentController(paginatedDataService, levelisationPaymentApprovalService, dataService, downloadService, $stateParams, $state, localStorageService, $q) {\r\n var vm = this;\r\n var levelisationId = $stateParams.levelisationId;\r\n var persistantFieldsKey = 'Levelisation-' + levelisationId;\r\n\r\n vm.error = false;\r\n vm.approving = false;\r\n vm.computing = false;\r\n vm.overPaymentExists = false;\r\n vm.dataSummary = {};\r\n vm.fetchData = fetchData;\r\n vm.getExport = getExport;\r\n vm.approveAllAtLevel = approveAllAtLevel;\r\n vm.finaliseLevelisationCalculation = finaliseLevelisationCalculation;\r\n vm.loadData = loadData;\r\n vm.setUpColumns = setUpColumns;\r\n\r\n vm.options = {\r\n defaultSort: 'name',\r\n defaultSortDirection: 'ascending'\r\n };\r\n\r\n vm.fitStatusOptions = [\r\n { label: 'Any', value: '' },\r\n { label: 'Non FIT Licensee', value: '0' },\r\n { label: 'Voluntary FIT Licensee', value: '1' },\r\n { label: 'Mandatory FIT Licensee', value: '2' }\r\n ];\r\n vm.columns = [];\r\n\r\n initForm();\r\n\r\n function initForm() {\r\n vm.model = localStorageService.get(persistantFieldsKey) || {};\r\n }\r\n\r\n function setUpColumns() {\r\n vm.columns = [\r\n {\r\n id: 'name',\r\n label: 'Licence',\r\n sort: true\r\n },\r\n {\r\n id: 'dataSubmitted',\r\n label: 'Data submitted',\r\n type: 'boolean'\r\n },\r\n {\r\n id: 'submissionDate',\r\n label: 'Submission date',\r\n type: 'date'\r\n },\r\n {\r\n id: 'fitStatus',\r\n label: 'Licence type',\r\n sort: true\r\n },\r\n approvalColumnForLevel(1),\r\n approvalColumnForLevel(2),\r\n {\r\n label: 'View',\r\n sort: false,\r\n type: 'conditional',\r\n condition: hasBeenSubmitted,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'View',\r\n onClick: view\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n }\r\n ];\r\n\r\n if (!vm.dataSummary.levelisationPaymentFinalised) {\r\n vm.columns.push({\r\n label: 'Edit',\r\n sort: false,\r\n type: 'conditional',\r\n condition: canEdit,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n icon: 'pencil',\r\n type: 'btn-default',\r\n text: 'Edit',\r\n onClick: edit\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function approvalColumnForLevel(level) {\r\n var label = 'Level ' + level + ' approval';\r\n\r\n var booleanTemplate = '';\r\n var dateTemplate = ' on {{data[\\''\r\n + levelisationPaymentApprovalService.approvalDateFieldForLevel(level) + '\\'] | date:\\'dd-MM-yyyy\\'}}';\r\n\r\n var checkboxTemplate = ''\r\n + booleanTemplate + dateTemplate + '';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: checkboxTemplate,\r\n isApproved: isApproved\r\n };\r\n\r\n function isApproved(levelisationData) {\r\n return levelisationPaymentApprovalService.isApprovedAtLevel(levelisationData, level);\r\n }\r\n }\r\n\r\n function loadData() {\r\n return $q.all([\r\n loadSummary(),\r\n isOverPaymentExists()\r\n ]);\r\n }\r\n\r\n function isOverPaymentExists() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/isoverPaymentExists')\r\n .then(setupOverPaymentPayment);\r\n }\r\n\r\n function setupOverPaymentPayment(isExists) {\r\n vm.overPaymentExists = isExists;\r\n }\r\n\r\n function canEdit(levelisationData) {\r\n return !levelisationPaymentApprovalService.isApprovedAtLevel(levelisationData, 1)\r\n || levelisationPaymentApprovalService.canApprove(levelisationData);\r\n }\r\n\r\n function hasBeenSubmitted(levelisationData) {\r\n return levelisationData.dataSubmitted;\r\n }\r\n\r\n function loadSummary() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/payment/summary')\r\n .then(setupSummary);\r\n }\r\n\r\n function setupSummary(summary) {\r\n vm.dataSummary = summary;\r\n setUpColumns();\r\n }\r\n\r\n function getExport() {\r\n downloadService.download('levelisations/' + levelisationId + '/paymentexport');\r\n }\r\n\r\n function approveAllAtLevel(level) {\r\n vm.approving = true;\r\n dataService.patchToEndpoint('levelisations/' + levelisationId + '/data/massApproval/' + level)\r\n .then(updateDispalyedData)\r\n .catch(displayError)\r\n .finally(endLoading);\r\n }\r\n\r\n function updateDispalyedData() {\r\n $state.reload();\r\n }\r\n\r\n function displayError() {\r\n vm.error = true;\r\n }\r\n\r\n function endLoading() {\r\n vm.approving = false;\r\n }\r\n\r\n function view(levelisationPayment) {\r\n $state.go('levelisation#payment#view', { levelisationId: levelisationId, licenceId: levelisationPayment.licenceId });\r\n }\r\n\r\n function edit(levelisationPayment) {\r\n $state.go('levelisation#payment#edit', { levelisationId: levelisationId, licenceId: levelisationPayment.licenceId });\r\n }\r\n\r\n function fetchData(tableData) {\r\n localStorageService.set(persistantFieldsKey, vm.model);\r\n tableData.search.predicateObject = vm.model;\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/payment', params);\r\n }\r\n\r\n function finaliseLevelisationCalculation() {\r\n vm.computing = true;\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/finalisepayment').finally(endComputing);\r\n \r\n }\r\n\r\n function endComputing() {\r\n vm.computing = false;\r\n $state.reload();\r\n }\r\n }\r\n})();","(function () {\r\n\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewLevelisationOverpaymentController', ViewLevelisationOverpaymentController);\r\n\r\n function ViewLevelisationOverpaymentController(paginatedDataService, dataService, $stateParams, localStorageService) {\r\n\r\n var vm = this;\r\n var levelisationId = $stateParams.levelisationId;\r\n var persistantFieldsKey = 'Levelisation-' + levelisationId;\r\n\r\n vm.error = false;\r\n vm.dataSummary = {};\r\n vm.fetchData = fetchData;\r\n vm.loadSummary = loadSummary;\r\n vm.setUpColumns = setUpColumns;\r\n\r\n vm.columns = [];\r\n\r\n initForm();\r\n\r\n function initForm() {\r\n vm.model = localStorageService.get(persistantFieldsKey) || {};\r\n }\r\n\r\n function loadSummary() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/payment/summary')\r\n .then(setupSummary);\r\n }\r\n\r\n function setupSummary(summary) {\r\n vm.dataSummary = summary;\r\n setUpColumns();\r\n }\r\n\r\n function setUpColumns() {\r\n vm.columns = [\r\n {\r\n id: 'licenceName',\r\n label: 'Licence',\r\n type: 'string'\r\n },\r\n {\r\n id: 'fitStatus',\r\n label: 'Licence Type',\r\n type: 'string'\r\n },\r\n {\r\n id: 'paymentDate',\r\n label: 'Payment Date',\r\n type: 'date'\r\n },\r\n overpaymentValue()\r\n ];\r\n }\r\n\r\n function overpaymentValue() {\r\n var label = 'Overpayment Value';\r\n\r\n var overpaymentValueTemplate = ' {{data.overpaymentValue | currency:\"£\":2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: overpaymentValueTemplate\r\n };\r\n }\r\n\r\n function fetchData(tableData) {\r\n localStorageService.set(persistantFieldsKey, vm.model);\r\n tableData.search.predicateObject = vm.model;\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/overpayment', params);\r\n }\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewLevelisationPaymentController', ViewLevelisationPaymentController);\r\n\r\n\r\n function ViewLevelisationPaymentController($stateParams, dataService, levelisationDataService, levelisationPaymentService, levelisationPaymentApprovalService, $state, $q, principal) {\r\n\r\n var vm = this;\r\n\r\n vm.canApprove = false;\r\n\r\n vm.levelisationId = $stateParams.levelisationId;\r\n var licenceId = $stateParams.licenceId;\r\n vm.isFit = false;\r\n vm.levelisation2019InEffect = false;\r\n\r\n vm.licenceDetails = {};\r\n vm.levelisationPayment = {};\r\n vm.levelisationData = {};\r\n vm.levelisationDetails = {};\r\n vm.installationData = {};\r\n vm.variations = [];\r\n\r\n vm.loadLevelisation = loadLevelisation;\r\n vm.loadData = loadData;\r\n vm.getApprovalModel = getApprovalModel;\r\n vm.approve = approve;\r\n vm.isPeriodic = false;\r\n vm.IsExternal = principal.isExternal();\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Approve',\r\n cancel: 'Reset'\r\n }\r\n };\r\n vm.approvalFields = [{\r\n className: 'col-md-12',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }];\r\n\r\n function loadData() {\r\n return $q.all([\r\n loadLevelisation(),\r\n fetchLevelisationPayment(),\r\n loadLicence()\r\n ]);\r\n }\r\n\r\n function fetchLevelisationPayment() {\r\n return levelisationPaymentService\r\n .fetchPayment(vm.levelisationId, licenceId)\r\n .then(displayLevelisationPayment);\r\n }\r\n\r\n function displayLevelisationPayment(levelisationPayment) {\r\n if (levelisationPayment.totalInvoiceFigure > 0)\r\n levelisationPayment.paymentDifferenceCheck = levelisationPayment.totalInvoiceFigure - levelisationPayment.actualPaymentFigure;\r\n else if (levelisationPayment.totalInvoiceFigure < 0)\r\n levelisationPayment.paymentDifferenceCheck = 0;\r\n vm.levelisationPayment = levelisationPayment;\r\n vm.levelisationData.fitStatus = levelisationPayment.fitStatus;\r\n vm.canApprove = levelisationPaymentApprovalService.canApprove(levelisationPayment);\r\n }\r\n\r\n function loadLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', $stateParams.licenceId)\r\n .then(setLicenceDetails);\r\n }\r\n\r\n function setLicenceDetails(licence) {\r\n vm.licenceDetails = licence;\r\n }\r\n\r\n function loadLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + vm.levelisationId)\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisationDetails) {\r\n vm.levelisationDetails = levelisationDetails;\r\n vm.levelisation2019InEffect = levelisationDataService.levelisation2019InEffect(levelisationDetails);\r\n }\r\n\r\n function approve(model) {\r\n return levelisationPaymentApprovalService.approveAtLevel(vm.levelisationId, licenceId,\r\n vm.levelisationPayment.approvalStatus + 1, model)\r\n .then(returnToParent);\r\n }\r\n\r\n function getApprovalModel() {\r\n return { comments: null };\r\n }\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewLevelisationResultsController', ViewLevelisationResultsController);\r\n\r\n function ViewLevelisationResultsController(paginatedDataService, dataService, downloadService, $stateParams\r\n , $uibModal, levelisationDataService) {\r\n\r\n var vm = this;\r\n vm.totals = {};\r\n\r\n vm.getExport = getExport;\r\n vm.fetchTotals = fetchTotals;\r\n vm.fetchLevelisation = fetchLevelisation;\r\n vm.fetchData = fetchData;\r\n vm.showHelpPopup = showHelpPopup;\r\n vm.levelisation = {};\r\n vm.levelisation2019InEffect = false;\r\n\r\n var levelisationId = $stateParams.levelisationId;\r\n var revokedText = 'Revoked';\r\n\r\n\r\n vm.options = {\r\n defaultSort: 'licenceName',\r\n defaultSortDirection: 'ascending'\r\n };\r\n\r\n vm.columns = [];\r\n\r\n function fetchLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/summary')\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisation) {\r\n vm.levelisation = levelisation;\r\n vm.levelisation2019InEffect = levelisationDataService.levelisation2019InEffect(levelisation);\r\n }\r\n\r\n function fetchTotals() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/results/totals')\r\n .then(populateTotals).then(fetchLevelisation());\r\n }\r\n\r\n function populateTotals(totals) {\r\n vm.totals = totals;\r\n vm.columns = getColumns();\r\n }\r\n\r\n function fetchData(tableData) {\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/results/licences', params).then(checkRevokedLicences).then(insertTotal);\r\n }\r\n\r\n function insertTotal(results) {\r\n var totalRow = null;\r\n if (vm.totals.isAnnual) {\r\n totalRow = {\r\n licenceName: 'Total',\r\n adjustedMarketShare: 1,\r\n totalIndividualQualifyingCost: vm.totals.totalQualifyingCosts,\r\n individualPaymentsMade: vm.totals.totalPaymentsMade,\r\n invoiceValue: vm.totals.totalInvoiceValue,\r\n totalQuarterlyInvoiceValue: vm.totals.totalQuarterlyInvoiceValues,\r\n totalPreliminaryInvoiceFigure: vm.totals.totalPreliminaryInvoiceFigure,\r\n totalQuarterlyPaymentsValue: vm.totals.totalQuarterlyPaymentsValue,\r\n isTotal: true,\r\n licenceRevoked: false\r\n };\r\n } else {\r\n totalRow = {\r\n licenceName: 'Total',\r\n marketShare: 1,\r\n totalIndividualQualifyingCost: vm.totals.totalQualifyingCosts,\r\n individualPaymentsMade: vm.totals.totalPaymentsMade,\r\n invoiceValue: vm.totals.totalInvoiceValue,\r\n totalQuarterlyInvoiceValue: vm.totals.totalQuarterlyInvoiceValues,\r\n totalPreliminaryInvoiceFigure: vm.totals.totalPreliminaryInvoiceFigure,\r\n totalQuarterlyPaymentsValue: vm.totals.totalQuarterlyPaymentsValue,\r\n isTotal: true,\r\n licenceRevoked: false\r\n };\r\n }\r\n results.data.unshift(totalRow);\r\n return results;\r\n }\r\n\r\n function checkRevokedLicences(results) {\r\n angular.forEach(results.data, function (result) {\r\n if (result.licenceRevoked) {\r\n result.marketShare = revokedText;\r\n result.adjustedMarketShare = revokedText;\r\n result.individualPaymentsMade = revokedText;\r\n result.totalIndividualQualifyingCost = revokedText;\r\n result.totalQuarterlyInvoiceValue = revokedText;\r\n result.totalPreliminaryInvoiceFigure = revokedText;\r\n result.totalQuarterlyPaymentsValue = revokedText;\r\n result.invoiceValue = revokedText;\r\n }\r\n });\r\n return results;\r\n }\r\n\r\n function getExport() {\r\n downloadService.download('levelisations/' + levelisationId + '/results/export');\r\n }\r\n\r\n function getColumns() {\r\n var columns = null;\r\n if (vm.totals.isAnnual) {\r\n columns = [\r\n {\r\n id: 'licenceName',\r\n label: 'Licence',\r\n sort: true\r\n },\r\n {\r\n id: 'supplierName',\r\n label: 'Supplier',\r\n sort: true\r\n },\r\n {\r\n id: 'licenceType',\r\n label: 'Licence type',\r\n sort: true\r\n },\r\n {\r\n label: 'Adjusted Market share',\r\n sort: true,\r\n type: 'conditional',\r\n condition: isLicenceRevoked,\r\n states: {\r\n false: {\r\n id: 'adjustedMarketShare',\r\n type: 'percentage',\r\n decimalPlaces: 3\r\n },\r\n true: {\r\n id: 'adjustedMarketShare'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Individual payments made',\r\n sort: true,\r\n type: 'conditional',\r\n condition: isLicenceRevoked,\r\n states: {\r\n false: {\r\n id: 'individualPaymentsMade',\r\n type: 'currency'\r\n },\r\n true: {\r\n id: 'individualPaymentsMade'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Total individual qualifying cost',\r\n sort: true,\r\n type: 'conditional',\r\n condition: isLicenceRevoked,\r\n states: {\r\n false: {\r\n id: 'totalIndividualQualifyingCost',\r\n type: 'currency'\r\n },\r\n true: {\r\n id: 'totalIndividualQualifyingCost'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Preliminary invoice figure',\r\n sort: true,\r\n type: 'conditional',\r\n condition: isLicenceRevoked,\r\n states: {\r\n false: {\r\n id: 'invoiceValue',\r\n type: 'currency'\r\n },\r\n true: {\r\n id: 'invoiceValue'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Total periodic levelisation payments',\r\n sort: true,\r\n type: 'conditional',\r\n condition: isLicenceRevoked,\r\n states: {\r\n false: {\r\n id: 'totalQuarterlyPaymentsValue',\r\n type: 'currency'\r\n },\r\n true: {\r\n id: 'totalQuarterlyPaymentsValue'\r\n }\r\n }\r\n },\r\n {\r\n label: 'Final annual invoice figure',\r\n sort: true,\r\n type: 'conditional',\r\n condition: isLicenceRevoked,\r\n states: {\r\n false: {\r\n id: 'totalPreliminaryInvoiceFigure',\r\n type: 'currency'\r\n },\r\n true: {\r\n id: 'totalPreliminaryInvoiceFigure'\r\n }\r\n }\r\n }\r\n ];\r\n } else {\r\n columns = [\r\n {\r\n id: 'licenceName',\r\n label: 'Licence',\r\n sort: true\r\n },\r\n {\r\n id: 'supplierName',\r\n label: 'Supplier',\r\n sort: true\r\n },\r\n {\r\n id: 'licenceType',\r\n label: 'Licence type',\r\n sort: true\r\n },\r\n {\r\n id: 'marketShare',\r\n label: 'Market share',\r\n type: 'percentage',\r\n decimalPlaces: 3,\r\n sort: true\r\n },\r\n {\r\n id: 'individualPaymentsMade',\r\n label: 'Individual payments made',\r\n type: 'currency',\r\n sort: true\r\n },\r\n {\r\n id: 'totalIndividualQualifyingCost',\r\n label: 'Total individual qualifying cost',\r\n type: 'currency',\r\n sort: true\r\n },\r\n {\r\n id: 'invoiceValue',\r\n label: 'Final periodic invoice figure',\r\n type: 'currency',\r\n sort: true\r\n }\r\n ];\r\n }\r\n return columns;\r\n }\r\n\r\n function isLicenceRevoked(levelisationData) {\r\n return levelisationData.licenceRevoked;\r\n }\r\n\r\n function showHelpPopup() {\r\n\r\n var template = '';\r\n\r\n if (!levelisationDataService.levelisation2019InEffect(vm.levelisation)) {\r\n template = 'levelisationCalculationHelp.html';\r\n } else {\r\n template = 'levelisationCalculationHelp_Levelisation2019InEfect.html';\r\n }\r\n\r\n $uibModal.open({\r\n templateUrl: 'app/levelisation/results/' + template,\r\n windowClass: 'wide-modal-window'\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationShortfallService', levelisationShortfallService); \r\n function levelisationShortfallService($http, appConfig) {\r\n return { \r\n fetchShortfall: fetchShortfall,\r\n fetchShortfallTotal: fetchShortfallTotal\r\n };\r\n\r\n function fetchShortfall(levelisationId, licenceId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/shortfall/' + licenceId)\r\n .then(function(levelisationShortfall) {\r\n return ((levelisationShortfall.data != null) && (levelisationShortfall.data.data != null))\r\n ? levelisationShortfall.data.data\r\n : {};\r\n });\r\n } \r\n\r\n function fetchShortfallTotal(levelisationId) {\r\n return $http.get(appConfig.apiRoot + 'levelisations/' + levelisationId + '/shortfall/total')\r\n .then(function (response) {\r\n // return 0;\r\n var model = (response != null) && (response.data != null) && (response.data.data != null)\r\n ? response.data.data : {};\r\n\r\n // Add two helper properties to simplify logic in the views\r\n var exceededThreshold = false;\r\n var exceededCap = false;\r\n if (model.shortfallTotal != null) {\r\n exceededThreshold = (model.mutualisationThreshold != null && (model.shortfallTotal > model.mutualisationThreshold));\r\n exceededCap = (model.mutualisationCap != null && (model.shortfallTotal > model.mutualisationCap));\r\n }\r\n // We'll assume cap >= threshold, i.e. it's not possible to exceed the cap but not the threshold\r\n model.exceededThreshold = exceededThreshold || exceededCap;\r\n model.exceededCap = exceededCap;\r\n return model;\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .factory('levelisationShortfallApprovalService', LevelisationShortfallApprovalService);\r\n\r\n function LevelisationShortfallApprovalService(dataService, principal) {\r\n return {\r\n approveAtLevel: approveAtLevel,\r\n isApprovedAtLevel: isApprovedAtLevel,\r\n canApprove: canApprove,\r\n approverFieldForLevel: approverFieldForLevel,\r\n approvalDateFieldForLevel: approvalDateFieldForLevel\r\n };\r\n\r\n function approveAtLevel(levelisationId, licenceId, approvalLevel, model) {\r\n return dataService.patchToEndpoint('levelisations/' + levelisationId\r\n + '/shortfall/' + licenceId\r\n + '/approval/' + approvalLevel, model);\r\n }\r\n\r\n function isApprovedAtLevel(levelisationShortfall, approvalLevel) {\r\n return levelisationShortfall.approvalStatus >= approvalLevel;\r\n }\r\n\r\n function canApprove(levelisationShortfall) {\r\n // If it's already approved at level 2, then no need for an approval.\r\n if (isApprovedAtLevel(levelisationShortfall, 2)) {\r\n return false;\r\n }\r\n\r\n if (levelisationShortfall.approvalStatus === 0) {\r\n if (principal.hasRole('LevelisationApprover')\r\n || principal.hasRole('LevelisationSecondApprover')\r\n || principal.hasRole('LevelisationThirdApprover')) {\r\n return true;\r\n }\r\n else\r\n {\r\n return false;\r\n }\r\n }\r\n // The approval status is currently 1.\r\n else if (levelisationShortfall.approvalStatus === 1) {\r\n // The current user's role did not do the approval at Level 1.\r\n if (!(principal.hasRole(levelisationShortfall.level1ApproverRole))) {\r\n // Given that LevelisationApprover did the first approval\r\n // LevelisationSecondApprover should be able to do second approval\r\n // (if LevelisationThirdApprover did the first approval LevelisationSecondApprover will not be able to approve)\r\n if ((principal.hasRole('LevelisationSecondApprover')\r\n && levelisationShortfall.level1ApproverRole === 'LevelisationApprover'))\r\n return true;\r\n // LevelisationApprover or LevelisationSecondApprover must have done first approval\r\n // as LevelisationFourthApprover can't do it, so always return true.\r\n // LevelisationThirdApprover should be able to do second approval.\r\n else if (principal.hasRole('LevelisationThirdApprover'))\r\n return true;\r\n // LevelisationApprover or LevelisationSecondApprover or LevelisationThirdApprover must have done first approval\r\n // LevelisationFourthApprover should be able to do second approval\r\n else if (principal.hasRole('LevelisationFourthApprover'))\r\n return true;\r\n else\r\n return false;\r\n\r\n } \r\n else\r\n return false;\r\n }\r\n else throw new Error('Unrecognised levelisationShortfall.approvalStatus.');\r\n }\r\n\r\n function approverFieldForLevel(level) {\r\n switch(level) {\r\n case 1:\r\n return 'level1ApproverName';\r\n case 2:\r\n return 'level2ApproverName';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n\r\n function approvalDateFieldForLevel(level) {\r\n switch(level) {\r\n case 1:\r\n return 'level1ApprovalDate';\r\n case 2:\r\n return 'level2ApprovalDate';\r\n default:\r\n throw new Error('Unrecognised approval level.');\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ListLevelisationShortfallController', ListLevelisationShortfallController);\r\n\r\n\r\n function ListLevelisationShortfallController(paginatedDataService, levelisationShortfallApprovalService,\r\n dataService, downloadService, $stateParams, $state, localStorageService, levelisationShortfallService) {\r\n var vm = this;\r\n var levelisationId = $stateParams.levelisationId;\r\n var persistantFieldsKey = 'Shortfall-' + levelisationId;\r\n\r\n vm.error = false;\r\n vm.approving = false;\r\n vm.computing = false;\r\n vm.dataSummary = {};\r\n vm.totals = {};\r\n vm.fetchData = fetchData;\r\n vm.getExport = getExport; \r\n vm.loadSummary = loadSummary;\r\n vm.setUpColumns = setUpColumns;\r\n\r\n vm.options = {\r\n defaultSort: 'name',\r\n defaultSortDirection: 'ascending'\r\n };\r\n \r\n vm.columns = [];\r\n\r\n initForm();\r\n\r\n function initForm() {\r\n vm.model = localStorageService.get(persistantFieldsKey) || {};\r\n }\r\n\r\n function setUpColumns() {\r\n vm.columns = [\r\n {\r\n id: 'supplierName',\r\n label: 'Supplier Name',\r\n sort: true\r\n },\r\n {\r\n id: 'name',\r\n label: 'Licence Name',\r\n sort: true\r\n },\r\n \r\n originalStatementValue(),\r\n percentageOfFundDue(),\r\n contributionTowardsShortFall(),\r\n finalValue(), \r\n approvalColumnForLevel(1),\r\n approvalColumnForLevel(2),\r\n {\r\n label: 'View',\r\n sort: false,\r\n type: 'conditional',\r\n condition: hasBeenSubmitted,\r\n states: {\r\n true: {\r\n type: 'button',\r\n button: {\r\n type: 'btn-default',\r\n text: 'View',\r\n onClick: view\r\n }\r\n },\r\n false: {\r\n type: 'empty'\r\n }\r\n }\r\n }\r\n ];\r\n }\r\n\r\n function originalStatementValue() {\r\n var label = 'Original Statement Value';\r\n\r\n var valueTemplate = ' {{data.originalStatementValue | currency:\"£\":2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function contributionTowardsShortFall() {\r\n var label = 'Contribution towards shortfall';\r\n\r\n var valueTemplate = ' {{data.contributionTowardsShortFall | currency:\"£\":2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function percentageOfFundDue() {\r\n var label = '% of Fund due';\r\n\r\n var valueTemplate = ' {{data.percentageOfFundDue | number:2}} %';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function finalValue() {\r\n var label = 'Final Value';\r\n\r\n var valueTemplate = ' {{data.finalValue | currency:\"£\":2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: valueTemplate\r\n };\r\n }\r\n\r\n function loadSummary() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/data/summary')\r\n .then(setupSummary); \r\n }\r\n\r\n function setupSummary(summary) {\r\n vm.dataSummary = summary;\r\n setUpColumns();\r\n\r\n // vm.totals = 0;\r\n\r\n return levelisationShortfallService.fetchShortfallTotal(levelisationId).then(\r\n function (response) {\r\n vm.totals = response;\r\n }\r\n );\r\n }\r\n\r\n function getExport() {\r\n downloadService.download('levelisations/' + levelisationId + '/shortfallexport');\r\n }\r\n\r\n function hasBeenSubmitted(/* levelisationData */) {\r\n return true;\r\n }\r\n\r\n function approvalColumnForLevel(level) {\r\n var label = 'Level ' + level + ' approval';\r\n\r\n var booleanTemplate = '';\r\n var dateTemplate = ' on {{data[\\''\r\n + levelisationShortfallApprovalService.approvalDateFieldForLevel(level) + '\\'] | date:\\'dd-MM-yyyy\\'}}';\r\n\r\n var checkboxTemplate = ''\r\n + booleanTemplate + dateTemplate + '';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: checkboxTemplate,\r\n isApproved: isApproved\r\n };\r\n\r\n function isApproved(levelisationData) {\r\n return levelisationShortfallApprovalService.isApprovedAtLevel(levelisationData, level);\r\n }\r\n }\r\n\r\n function view(levelisationData) {\r\n $state.go('levelisation#shortfall#view', { levelisationId: levelisationId, licenceId: levelisationData.licenceId });\r\n }\r\n\r\n function fetchData(tableData) {\r\n localStorageService.set(persistantFieldsKey, vm.model);\r\n tableData.search.predicateObject = vm.model;\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/shortfall', params);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewLevelisationShortfallController', ViewLevelisationShortfallController);\r\n\r\n\r\n function ViewLevelisationShortfallController($stateParams, dataService, levelisationShortfallService, levelisationShortfallApprovalService, $state, $q) {\r\n\r\n var vm = this;\r\n\r\n vm.canApprove = false;\r\n\r\n vm.levelisationId = $stateParams.levelisationId;\r\n var licenceId = $stateParams.licenceId;\r\n vm.isFit = false;\r\n vm.levelisation2019InEffect = false;\r\n\r\n vm.licenceDetails = {};\r\n vm.levelisationData = {};\r\n vm.levelisationDetails = {};\r\n\r\n vm.loadLevelisation = loadLevelisation;\r\n vm.loadData = loadData;\r\n vm.getApprovalModel = getApprovalModel;\r\n vm.approve = approve;\r\n vm.isPeriodic = false;\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Approve',\r\n cancel: 'Reset'\r\n }\r\n };\r\n vm.approvalFields = [{\r\n className: 'col-md-12',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }];\r\n\r\n function loadData() {\r\n return $q.all([\r\n loadLevelisation(),\r\n fetchLevelisationShortfall(),\r\n loadLicence()\r\n ]);\r\n }\r\n \r\n function fetchLevelisationShortfall() {\r\n return levelisationShortfallService\r\n .fetchShortfall(vm.levelisationId, licenceId)\r\n .then(displayLevelisationShortfall);\r\n }\r\n \r\n function displayLevelisationShortfall(levelisationShortfall) { \r\n vm.levelisationShortfall = levelisationShortfall;\r\n vm.levelisationData.fitStatus = levelisationShortfall.fitStatus;\r\n vm.canApprove = levelisationShortfallApprovalService.canApprove(levelisationShortfall);\r\n }\r\n\r\n function loadLicence() {\r\n return dataService.fetchDataFromEndpointById('licences', $stateParams.licenceId)\r\n .then(setLicenceDetails);\r\n }\r\n\r\n function setLicenceDetails(licence) {\r\n vm.licenceDetails = licence;\r\n } \r\n\r\n function loadLevelisation() {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + vm.levelisationId)\r\n .then(setLevelisationDetails);\r\n }\r\n\r\n function setLevelisationDetails(levelisationDetails) {\r\n vm.levelisationDetails = levelisationDetails;\r\n }\r\n\r\n function approve(model) {\r\n\r\n return levelisationShortfallApprovalService.approveAtLevel(vm.levelisationId, licenceId,\r\n vm.levelisationShortfall.approvalStatus + 1, model)\r\n .then(returnToParent);\r\n }\r\n\r\n function getApprovalModel() {\r\n return { comments: null };\r\n }\r\n\r\n function returnToParent() {\r\n $state.go('^');\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.levelisation')\r\n .controller('ViewShortfallSummaryTableController', ViewShortfallSummaryTableController);\r\n\r\n\r\n function ViewShortfallSummaryTableController(levelisationShortfallService,\r\n paginatedDataService,\r\n levelisationApprovalService,\r\n dataService,\r\n downloadService,\r\n $stateParams,\r\n $state,\r\n localStorageService) {\r\n var vm = this;\r\n var levelisationId = $stateParams.levelisationId;\r\n var persistantFieldsKey = 'Shortfall-' + levelisationId;\r\n\r\n vm.error = false;\r\n vm.approving = false;\r\n vm.computing = false;\r\n vm.dataSummary = {};\r\n vm.totals = {};\r\n vm.fetchData = fetchData;\r\n vm.loadShortfallSummary = loadShortfallSummary;\r\n vm.setUpColumns = setUpColumns;\r\n vm.totalShortfall = 0;\r\n \r\n vm.options = {\r\n defaultSort: 'name',\r\n defaultSortDirection: 'ascending'\r\n };\r\n\r\n vm.columns = [];\r\n\r\n initForm();\r\n\r\n function initForm() {\r\n vm.model = localStorageService.get(persistantFieldsKey) || {};\r\n }\r\n \r\n function setUpColumns() {\r\n vm.columns = [\r\n {\r\n id: 'supplierName',\r\n label: 'Supplier Name',\r\n sort: true\r\n },\r\n {\r\n id: 'licenceName',\r\n label: 'Defaulting Licence Name',\r\n type: 'string'\r\n },\r\n defaultingLicenceValue() \r\n ];\r\n }\r\n\r\n function defaultingLicenceValue() {\r\n var label = 'Defaulting Licence Value';\r\n\r\n var defaultingValueTemplate = ' {{data.defaultingLicenceValue | currency:\"£\":2}} ';\r\n\r\n return {\r\n label: label,\r\n sort: false,\r\n valueTemplate: defaultingValueTemplate\r\n };\r\n }\r\n\r\n function loadShortfallSummary() {\r\n return levelisationShortfallService.fetchShortfallTotal(levelisationId).then(\r\n function (response) {\r\n //vm.totalShortfall = response.data;\r\n //setUpColumns();\r\n \r\n vm.totals = response;\r\n setUpColumns();\r\n\r\n // If there's no shortfall we might not have the display name returned from the totals\r\n // API endpoint. Fetch it from the data summary endpoint.\r\n // (We'll also not have the mutualisation thresholds, but we don't need them if there's\r\n // no shortfall.)\r\n if (response.displayName == null) {\r\n return dataService.fetchDataFromEndpoint('levelisations/' + levelisationId + '/data/summary')\r\n .then(function (summary) {\r\n vm.dataSummary = summary;\r\n vm.totals.displayName = summary.displayName;\r\n });\r\n }\r\n }\r\n );\r\n }\r\n\r\n function fetchData(tableData) {\r\n localStorageService.set(persistantFieldsKey, vm.model);\r\n tableData.search.predicateObject = vm.model;\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n if (params.dataFilter != null) {\r\n params.dataFilter.levelisationId = levelisationId;\r\n }\r\n\r\n return paginatedDataService.fetchDataFromParams('levelisations/' + levelisationId + '/shortfallsummary', params); \r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.nominatedRecipients')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager, recipientTypeService, installationsRoutingHelper, recipientRoutingHelper) {\r\n\r\n var params = {\r\n recipientType: recipientTypeService.getNominatedRecipientParameters()\r\n };\r\n routeManager.addStates([\r\n {\r\n state: params.recipientType.searchState,\r\n config: {\r\n title: 'Nominated Recipient Search',\r\n url: '/nominatedRecipients',\r\n params: params,\r\n data: {\r\n permissions: {\r\n only: ['Internal']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/recipients/recipients.html'\r\n },\r\n 'display@nominated-recipient-search': {\r\n templateUrl: 'app/recipients/recipients-search.html',\r\n controller: 'RecipientsSearchController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: params.recipientType.searchState + '#nominated-recipient',\r\n config: {\r\n title: 'Nominated Recipient',\r\n url: '^/nominatedRecipient/{id}',\r\n params: params,\r\n parent: params.recipientType.searchState,\r\n data: {\r\n permissions: {\r\n only: ['ExternalEditInstallation', 'Internal']\r\n }\r\n },\r\n views: {\r\n 'display@nominated-recipient-search': {\r\n templateUrl: 'app/recipients/recipient/recipient.html',\r\n controller: 'RecipientController',\r\n controllerAs: 'vm'\r\n },\r\n 'installations@nominated-recipient-search#nominated-recipient': {\r\n templateUrl: 'app/recipients/recipient/recipient-installations.html',\r\n controller: 'RecipientInstallationsController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n \r\n routeManager.addStates(recipientRoutingHelper.getNominatedRecipientSubstates(params.recipientType.searchState, params.recipientType.searchState + '#nominated-recipient', ''));\r\n routeManager.addStates(installationsRoutingHelper.getInstallationDetailsStates(params.recipientType.searchState + '#nominated-recipient', params.recipientType.searchState));\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.installations')\r\n .component('recipientCreator', recipientCreatorComponent());\r\n\r\n function recipientCreatorComponent() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/recipients/creator/recipient-creator.html',\r\n bindings: {\r\n back: '=?',\r\n recipientOptions: '<',\r\n recipientDefaults: ' 0) {\r\n // We will only find exact matches if we have similar recipients!\r\n vm.foundExactMatchesWithCurrentSearch = true;\r\n showExactMatchRecipients(matchResult.exactMatchIds);\r\n } else {\r\n vm.showExactMatchTable = false;\r\n }\r\n\r\n // We only show similar recipients that are not being shown in the exact match table.\r\n var nonExactMatchIds = _.difference(matchResult.similarRecipientIds, matchResult.exactMatchIds);\r\n if (nonExactMatchIds.length > 0) {\r\n vm.foundSimilarRecipientsWithCurrentSearch = true;\r\n showSimilarRecipients(nonExactMatchIds);\r\n } else {\r\n vm.showSimilarRecipientTable = false;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function showExactMatchRecipients(ids) {\r\n vm.showExactMatchTable = true;\r\n vm.exactMatchSearchObject = {\r\n id: ids,\r\n mode: 'exact'\r\n };\r\n }\r\n\r\n function showSimilarRecipients(ids) {\r\n vm.showSimilarRecipientTable = true;\r\n vm.similarRecipientSearchObject = {\r\n id: ids,\r\n mode: 'exact'\r\n };\r\n }\r\n\r\n function getSimplifiedRecipient(recipientModel) {\r\n var recipient = objectUtils.copy(recipientModel,\r\n ['title', 'firstName', 'lastName', 'emailAddress', 'companyNumber', 'companyName']);\r\n\r\n var recipientAddress = objectUtils.copy(recipientModel,\r\n ['postcode', 'addressLine1', 'addressLine2', 'town', 'county', 'country']);\r\n\r\n recipient.address = recipientAddress;\r\n return recipient;\r\n }\r\n\r\n function getChangeHandler() {\r\n return {\r\n listener: function(field, newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n vm.foundExactMatchesWithCurrentSearch = false;\r\n vm.foundSimilarRecipientsWithCurrentSearch = false;\r\n }\r\n }\r\n };\r\n }\r\n\r\n vm.fields = [\r\n {\r\n key: 'title',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Title:',\r\n maxlength: 10,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'firstName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'First name:',\r\n maxlength: 50,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'lastName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Last name:',\r\n maxlength: 50,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'emailAddress',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Email address:',\r\n maxlength: 256,\r\n type: 'email'\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'companyName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company name:',\r\n maxlength: 60\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'companyNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company number:',\r\n maxlength: 50\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Postcode:',\r\n maxlength: 50,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n },\r\n {\r\n key: 'address',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n label: 'Address:',\r\n populateFromModel: true,\r\n required: true\r\n },\r\n watcher: getChangeHandler()\r\n }\r\n ];\r\n\r\n\r\n function setDataFromInputDefaults() {\r\n var model = {};\r\n var inputParams = vm.recipientDefaults;\r\n if (inputParams) {\r\n if (inputParams.companyNumber) {\r\n model.companyNumber = inputParams.companyNumber;\r\n }\r\n if (inputParams.postcode) {\r\n objectUtils.copy(inputParams,\r\n [\r\n 'postcode',\r\n 'addressLine1',\r\n 'addressLine2',\r\n 'town',\r\n 'county',\r\n 'country'\r\n ],\r\n model);\r\n }\r\n }\r\n\r\n return model;\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .factory('recipientDialogService', recipientDialogService);\r\n\r\n function recipientDialogService(dialogService) {\r\n\r\n var service = {\r\n showRecipientSelectionDialog: showRecipientSelectionDialog,\r\n showRecipientCreationDialog: showRecipientCreationDialog,\r\n showRecipientAlreadyAssignedDialog: showRecipientAlreadyAssignedDialog\r\n };\r\n return service;\r\n\r\n function showRecipientSelectionDialog(recipient, recipientName, layout) {\r\n var message = 'You are selecting the following ' + recipientName + ':';\r\n var title = 'Confirm FIT ' + recipientName + ' selection';\r\n return showRecipientDialog(recipient, title, layout, message, true);\r\n }\r\n\r\n function showRecipientCreationDialog(recipient, recipientName, layout) {\r\n var message = 'You will be creating the following FIT ' + recipientName + ':';\r\n var title = 'Confirm FIT ' + recipientName + ' creation';\r\n return showRecipientDialog(recipient, title, layout, message, true);\r\n }\r\n\r\n function showRecipientAlreadyAssignedDialog(recipient, recipientName, layout) {\r\n var message = 'This ' + recipientName + ' is already assigned to this installation.';\r\n var title = 'FIT ' + recipientName + ' selection';\r\n return showRecipientDialog(recipient, title, layout, message, false);\r\n }\r\n\r\n function showRecipientDialog(recipient, title, layout, message, showConfirmButton) {\r\n return dialogService.showDialog({\r\n title: title,\r\n message: message,\r\n size: 'lg',\r\n customBodyUrl: 'app/installations/recipient/select-recipient.html',\r\n buttons: {\r\n confirm: showConfirmButton\r\n },\r\n customBodyModel: {\r\n data: recipient,\r\n layout: layout\r\n }\r\n });\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .controller('RecipientSearchFormController', RecipientSearchFormController);\r\n\r\n\r\n function RecipientSearchFormController() {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n var tableCtrl = null;\r\n\r\n vm.init = init;\r\n vm.search = search;\r\n vm.persistantFieldsKey = vm.recipientDisplayName + '-search';\r\n\r\n function init(stTable) {\r\n vm.formFields = getFilterFormFields();\r\n tableCtrl = stTable;\r\n }\r\n\r\n function search(filter) {\r\n tableCtrl.refreshFilter(filter);\r\n }\r\n\r\n function getFilterFormFields() {\r\n var nameFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'id',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: vm.recipientDisplayName + ' ID',\r\n maxlength: 30,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'lastName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Last name',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'companyName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company name',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'companyNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 50,\r\n label: 'Company number'\r\n }\r\n }\r\n ];\r\n\r\n var addressSearchFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 50,\r\n label: 'Postcode'\r\n }\r\n },\r\n {\r\n className: 'col-md-9 simulate-label',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n populateFromModel: true\r\n }\r\n }\r\n ];\r\n\r\n var addressFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'addressLine1',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Address line 1',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'addressLine2',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Address line 2',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'town',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Town/City',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'county',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'County',\r\n maxlength: 50,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'country',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Country',\r\n maxlength: 50,\r\n required: false\r\n }\r\n }\r\n ];\r\n\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: nameFields\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: addressSearchFields\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: addressFields\r\n }\r\n ];\r\n\r\n return fields;\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .directive('recipientSearchForm', recipientSearchForm);\r\n\r\n function recipientSearchForm() {\r\n return {\r\n restrict: 'AE',\r\n template: '',\r\n scope: {\r\n recipientDisplayName: '<',\r\n persistantFieldsKey: ' 0) {\r\n // We will only find exact matches if we have similar recipients!\r\n showExactMatchRecipients(matchResult.exactMatchIds);\r\n } else if (similarFieldsDirty) {\r\n // We only show similar recipients that are not being shown in the exact match table.\r\n var nonExactMatchIds = _.difference(matchResult.similarRecipientIds, matchResult.exactMatchIds);\r\n if (nonExactMatchIds.length > 0) {\r\n showSimilarRecipients(nonExactMatchIds);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function showExactMatchRecipients(ids) {\r\n vm.matchWasExact = true;\r\n vm.verifyRecipientMessage = getMessage('exactRecipient');\r\n vm.matchingSearchObject = {\r\n id: ids\r\n };\r\n }\r\n\r\n function showSimilarRecipients(ids) {\r\n vm.matchWasExact = false;\r\n vm.verifyRecipientMessage = getMessage('similarRecipients');\r\n vm.matchingSearchObject = {\r\n id: ids\r\n };\r\n }\r\n\r\n function getMessage(key) {\r\n var similarMessage = vm.installation\r\n ? 'There are other ' + vm.recipientType.displayNamePlural + ' with similar details. If you wish to keep '\r\n + 'the changes to this ' + vm.recipientType.displayName + ' please click \\'Save\\' to continue. Alternatively, '\r\n + 'please click \\'Select\\' to reassign this installation to existing ' + vm.recipientType.displayName + '. '\r\n + 'If you wish to change the details of your update, please press \\'Amend\\'.'\r\n : 'There are other ' + vm.recipientType.displayNamePlural + ' with similar details. If you wish to keep '\r\n + 'the changes to this ' + vm.recipientType.displayName + ' please click \\'Save\\' to continue. '\r\n + 'If you wish to change the details of your update, please press \\'Amend\\'.';\r\n var messages = {\r\n similarRecipients: similarMessage,\r\n exactRecipient: 'The ' + vm.recipientType.displayName + ' you are trying to edit already exists. '\r\n + 'Please click \\'Amend\\' to amend your details, or click \\'Select\\' to change to this ' + vm.recipientType.displayName + '.'\r\n };\r\n return messages[key];\r\n }\r\n\r\n function recipientFormFields() {\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-xs-12',\r\n key: 'displayId',\r\n type: 'fitStatic',\r\n templateOptions: {\r\n label: $stateParams.recipientType.displayName + ' ID'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-4',\r\n key: 'title',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Title',\r\n maxlength: 10,\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-4',\r\n key: 'firstName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'First name',\r\n maxlength: 50,\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-4',\r\n key: 'lastName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Last name',\r\n maxlength: 50,\r\n required: true,\r\n onChange: similarFieldsListener\r\n }\r\n },\r\n {\r\n className: 'col-md-4',\r\n key: 'emailAddress',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n type: 'email',\r\n maxlength: 250,\r\n label: 'Email address'\r\n }\r\n },\r\n {\r\n className: 'col-md-4',\r\n key: 'companyName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company name',\r\n maxlength: 60,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-4',\r\n key: 'companyNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company number',\r\n maxlength: 50,\r\n required: false,\r\n onChange: similarFieldsListener\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row col-md-12',\r\n key: 'comment',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n maxlength: 1000,\r\n rows: 3,\r\n label: 'Comments',\r\n required: true\r\n }\r\n }\r\n ];\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .controller('RecipientInstallationsController', RecipientInstallationsController);\r\n\r\n function RecipientInstallationsController(paginatedDataService, $stateParams, installationsValidationHelper) {\r\n var vm = this;\r\n\r\n vm.persistantFieldsKey = $stateParams.recipientType.name + '-' + $stateParams.id + '.search';\r\n vm.fetchData = function (tableData) {\r\n var endpoint = $stateParams.recipientType.endpoint + '/installations';\r\n var extraParams = {};\r\n extraParams[$stateParams.recipientType.endpoint + 'Id'] = $stateParams.id;\r\n return paginatedDataService.checkFieldPrefixesAndFetchData(endpoint, tableData, vm.idPrefixChecks, extraParams);\r\n };\r\n \r\n vm.idPrefixChecks = installationsValidationHelper.getIdPrefixChecksForFiltering();\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'id',\r\n displayProperty: 'fitId',\r\n label: 'FIT ID',\r\n sort: true,\r\n type: 'link',\r\n state: $stateParams.recipientType.searchState + '#' + $stateParams.recipientType.detailsState + '#' + 'installation-details',\r\n newStateIdProperty: 'installationId'\r\n },\r\n {\r\n id: 'address',\r\n label: 'Address',\r\n type: 'address'\r\n },\r\n {\r\n id: 'technologyType',\r\n label: 'Technology Type',\r\n sort: true\r\n },\r\n {\r\n id: 'accreditationNumber',\r\n label: 'Accreditation number',\r\n sort: true\r\n }\r\n ];\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .controller('RecipientController', RecipientController);\r\n \r\n function RecipientController($stateParams, dataService, $state) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.searchState = $stateParams.recipientType.searchState;\r\n vm.detailsState = $stateParams.recipientType.detailsState;\r\n vm.recipientDisplayName = $stateParams.recipientType.displayName;\r\n vm.recipient = null;\r\n vm.loadRecipient = loadRecipient;\r\n vm.returnState = $state.href($state.current);\r\n vm.currentStateName = $state.current.name;\r\n\r\n function loadRecipient() {\r\n return dataService.fetchDataFromEndpointById($stateParams.recipientType.endpoint, $stateParams.id).then(setRecipient);\r\n }\r\n\r\n function setRecipient(recipientData) {\r\n vm.recipient = recipientData;\r\n }\r\n };\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .controller('recipientDetailsController', recipientDetailsController);\r\n\r\n function recipientDetailsController(dataLayoutService, dialogService, dataService, toastr, $state) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.recipientLayout = dataLayoutService.getLayout('recipient');\r\n vm.confirmRemove = confirmRemove;\r\n vm.currentStateName = $state.current.name;\r\n\r\n function confirmRemove() {\r\n var options = {\r\n title: 'Remove nominated recipient',\r\n message: 'Are you sure you wish to remove the nominated recipient from this installation?',\r\n size: 'lg',\r\n buttons: {\r\n confirm: true\r\n },\r\n customBodyUrl: 'app/recipients/recipient/delete-recipient.html',\r\n customBodyModel: showMessageOnNominatedRecipientRemoval()\r\n };\r\n return dialogService.showDialog(options).then(removeNominatedRecipient);\r\n }\r\n\r\n function showMessageOnNominatedRecipientRemoval() {\r\n return vm.installationInfo.multipleSiteNominatedRecipientAnswer\r\n && vm.installationInfo.multipleSiteGeneratorAnswer !== null\r\n && !vm.installationInfo.multipleSiteGeneratorAnswer;\r\n }\r\n\r\n function removeNominatedRecipient() {\r\n dataService.patchToEndpoint('installation/' + vm.installationInfo.id + '/nominatedRecipient/remove')\r\n .then(notifySuccessAndReload);\r\n }\r\n\r\n function notifySuccessAndReload() {\r\n $state.reload();\r\n toastr.success('You have successfully removed the nominated recipient.');\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .factory('recipientRoutingHelper', recipientRoutingHelper);\r\n\r\n function recipientRoutingHelper(recipientTypeService) {\r\n var helper = {\r\n getGeneratorSubstates: getGeneratorSubstates,\r\n getNominatedRecipientSubstates: getNominatedRecipientSubstates\r\n };\r\n return helper;\r\n\r\n function getGeneratorSubstates(displayState, detailsStateName, urlPrefix, includeReassignState) {\r\n return getDetailsSubStates(getGeneratorConfig(), displayState, detailsStateName, urlPrefix, includeReassignState);\r\n }\r\n\r\n function getNominatedRecipientSubstates(displayState, detailsStateName, urlPrefix, includeReassignState) {\r\n return getDetailsSubStates(getNominatedRecipientConfig(), displayState, detailsStateName, urlPrefix, includeReassignState);\r\n }\r\n\r\n function getGeneratorConfig() {\r\n return {\r\n name: 'FIT Generator',\r\n historyEntityType: 'Generator',\r\n historyEndpoint: 'Generator',\r\n urlDisplay: 'generator',\r\n params: {\r\n recipientType: recipientTypeService.getGeneratorRecipientParameters()\r\n }\r\n };\r\n }\r\n\r\n function getNominatedRecipientConfig() {\r\n return {\r\n name: 'Nominated Recipient',\r\n historyEntityType: 'Nominated Recipient',\r\n historyEndpoint: 'NominatedRecipient',\r\n urlDisplay: 'nominatedRecipient',\r\n params: {\r\n recipientType: recipientTypeService.getNominatedRecipientParameters()\r\n }\r\n };\r\n }\r\n\r\n function getDetailsSubStates(recipientConfig, displayState, detailsStateName, urlPrefix, includeReassignState) {\r\n var reassignPageStateName = detailsStateName + '#' + recipientConfig.params.recipientType.detailsState + '-reassign';\r\n\r\n var editPageViews = {};\r\n editPageViews['display@' + displayState] = {\r\n templateUrl: 'app/recipients/recipient/recipient-edit.html',\r\n controller: 'RecipientEditController',\r\n controllerAs: 'vm'\r\n };\r\n\r\n var auditPageViews = {};\r\n auditPageViews['display@' + displayState] = {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm'\r\n };\r\n\r\n var reassignPageViews = {};\r\n reassignPageViews['display@' + displayState] = {\r\n templateUrl: 'app/installations/recipient/reassignment/recipient-reassignment-wizard.html',\r\n controller: 'RecipientReassignmentWizardController',\r\n controllerAs: 'vm'\r\n };\r\n reassignPageViews['recipient@' + reassignPageStateName] = {\r\n templateUrl: 'app/installations/recipient/reassignment/selector/recipient-reassignment-selector.html',\r\n controller: 'RecipientReassignmentSelectorController',\r\n controllerAs: 'vm'\r\n };\r\n reassignPageViews['multiSite@' + reassignPageStateName] = {\r\n templateUrl: 'app/installations/recipient/reassignment/multiSite/recipient-multi-site.html',\r\n controller: 'RecipientMultiSiteController',\r\n controllerAs: 'vm'\r\n };\r\n reassignPageViews['submission@' + reassignPageStateName] = {\r\n templateUrl: 'app/installations/recipient/reassignment/submission/recipient-reassignment-submission.html',\r\n controller: 'RecipientReassignmentSubmissionController',\r\n controllerAs: 'vm'\r\n };\r\n \r\n var reassignCreatePageViews = {};\r\n reassignCreatePageViews['recipient@' + reassignPageStateName] = {\r\n templateUrl: 'app/installations/recipient/reassignment/selector/recipient-reassignment-creator.html',\r\n controller: 'RecipientReassignmentCreatorController',\r\n controllerAs: 'vm'\r\n };\r\n\r\n var states = [\r\n {\r\n state: detailsStateName + '#' + recipientConfig.params.recipientType.detailsState + '-edit',\r\n config: {\r\n title: recipientConfig.name + ' Edit',\r\n parent: detailsStateName,\r\n url: '/' + urlPrefix + 'edit',\r\n params: recipientConfig.params,\r\n data: {\r\n permissions: {\r\n only: ['ExternalEditInstallation', 'FitGroup']\r\n }\r\n },\r\n views: editPageViews\r\n }\r\n },\r\n {\r\n state: detailsStateName + '#' + recipientConfig.params.recipientType.detailsState + '-history',\r\n config: {\r\n parent: detailsStateName,\r\n params: {\r\n returnState: null,\r\n entityType: recipientConfig.historyEntityType,\r\n endpoint: recipientConfig.historyEndpoint\r\n },\r\n title: recipientConfig.name + ' History',\r\n url: '/' + urlPrefix + 'history/{name}',\r\n data: {\r\n permissions: {\r\n only: ['ExternalEditInstallation', 'FitGroup']\r\n }\r\n },\r\n views: auditPageViews\r\n }\r\n }\r\n ];\r\n if (includeReassignState) {\r\n states = states.concat([\r\n {\r\n state: reassignPageStateName,\r\n config: {\r\n title: recipientConfig.name + ' Reassign',\r\n parent: detailsStateName,\r\n url: '/' + urlPrefix + 'reassign',\r\n params: angular.extend({ newRecipientId: null }, recipientConfig.params),\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalEditInstallation']\r\n }\r\n },\r\n views: reassignPageViews\r\n }\r\n },\r\n {\r\n state: reassignPageStateName + '#create-' + recipientConfig.urlDisplay,\r\n config: {\r\n url: '/create',\r\n title: recipientConfig.name + ' Reassign Create',\r\n parent: reassignPageStateName,\r\n views: reassignCreatePageViews,\r\n params: {\r\n recipientDefaults: null\r\n },\r\n data: {\r\n permissions: {\r\n only: ['FitGroup', 'ExternalEditInstallation']\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n return states;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .controller('RecipientsSearchController', RecipientsSearchController);\r\n\r\n\r\n function RecipientsSearchController(paginatedDataService, $stateParams) {\r\n var vm = this;\r\n vm.recipientDisplayName = $stateParams.recipientType.displayName;\r\n\r\n vm.idPrefixChecks = [\r\n {\r\n modelValue: 'id',\r\n validPrefix: $stateParams.recipientType.idPrefix\r\n }\r\n ];\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'id',\r\n displayProperty: 'displayId',\r\n label: $stateParams.recipientType.displayName + ' ID',\r\n sort: true,\r\n type: 'link',\r\n state: $stateParams.recipientType.searchState + '#' + $stateParams.recipientType.detailsState\r\n },\r\n {\r\n id: 'title',\r\n label: 'Title',\r\n sort: true\r\n },\r\n {\r\n id: 'firstName',\r\n label: 'First name',\r\n sort: true\r\n },\r\n {\r\n id: 'lastName',\r\n label: 'Last name',\r\n sort: true\r\n },\r\n {\r\n id: 'companyName',\r\n label: 'Company name',\r\n sort: true\r\n },\r\n {\r\n id: 'companyNumber',\r\n label: 'Company number',\r\n sort: true\r\n },\r\n {\r\n id: 'address',\r\n type: 'address',\r\n label: 'Address'\r\n }\r\n ];\r\n\r\n vm.fetchData = function(tableData) {\r\n return paginatedDataService.checkFieldPrefixesAndFetchData($stateParams.recipientType.endpoint, tableData, vm.idPrefixChecks);\r\n };\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .component('recipientSelector', recipientSelectorComponent());\r\n\r\n function recipientSelectorComponent() {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'app/recipients/selector/recipient-selector.html',\r\n bindings: {\r\n next: '=',\r\n back: '=?',\r\n recipientOptions: '<',\r\n currentRecipientIdForInstallation: '<',\r\n showCancelAndBackButtons: '<',\r\n newRecipientId: '<'\r\n },\r\n controller: 'RecipientSelectorController',\r\n controllerAs: 'vm',\r\n bindToController: true\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recipients')\r\n .controller('RecipientSelectorController', RecipientSelectorController);\r\n\r\n function RecipientSelectorController($log, recipientService, dialogService, dataLayoutService, recipientDialogService, $state) {\r\n var vm = this;\r\n vm.model = {};\r\n vm.error = '';\r\n\r\n vm.showTable = false;\r\n vm.showCreateButton = false;\r\n\r\n vm.getById = getById;\r\n vm.getByCompanyNumber = getByCompanyNumber;\r\n vm.getByAddress = getByAddress;\r\n vm.showRecipient = showRecipient;\r\n vm.$onInit = $onInit;\r\n vm.currentStateName = $state.current.name;\r\n\r\n vm.recipientLayout = dataLayoutService.getLayout('recipient');\r\n\r\n vm.returnSelected = function() {\r\n clearError();\r\n vm.next(vm.recipient, vm.model);\r\n };\r\n\r\n vm.goBack = function() {\r\n clearError();\r\n vm.back();\r\n };\r\n\r\n function setError(message, overrideMessage) {\r\n if (message !== 'Cancelled' && message !== 'backdrop click') {\r\n vm.error = overrideMessage || message;\r\n $log.warn('API request failed:', message);\r\n }\r\n }\r\n\r\n function clearError() {\r\n vm.showTable = false;\r\n vm.showCreateButton = false;\r\n vm.error = '';\r\n }\r\n\r\n function showRecipient(recipient) {\r\n var showDialogMethod = recipient.id !== vm.currentRecipientIdForInstallation\r\n ? recipientDialogService.showRecipientSelectionDialog\r\n : recipientDialogService.showRecipientAlreadyAssignedDialog;\r\n showDialogMethod(recipient, vm.recipientOptions.name, vm.recipientLayout).then(function () {\r\n vm.recipient = recipient;\r\n vm.model.recipientChosen = true;\r\n vm.returnSelected();\r\n });\r\n }\r\n\r\n function getById() {\r\n vm.showTable = false;\r\n recipientService.getById(vm.model.recipientId, vm.recipientOptions.endpoint).then(function (recipient) {\r\n showRecipient(recipient);\r\n }).catch(function (reason) {\r\n if (reason.foundNoEntities) {\r\n vm.showCreateButton = true;\r\n }\r\n setError(reason.message);\r\n });\r\n }\r\n\r\n function getByCompanyNumber() {\r\n vm.showTable = true;\r\n vm.showCreateButton = true;\r\n vm.searchObject = {companyNumber: vm.model.companyNumber, mode: 'exact'};\r\n }\r\n\r\n function getByAddress() {\r\n vm.showTable = true;\r\n vm.showCreateButton = true;\r\n vm.searchObject = {\r\n postcode: vm.model.postcode,\r\n addressLine1: vm.model.addressLine1,\r\n addressLine2: vm.model.addressLine2,\r\n town: vm.model.town,\r\n county: vm.model.county,\r\n country: vm.model.country,\r\n mode: 'exact'\r\n };\r\n }\r\n function $onInit() {\r\n vm.fields = [{\r\n key: 'selectType',\r\n type: 'fitRadio',\r\n defaultValue: '',\r\n templateOptions: {\r\n label: 'Please use one of the following options to assign this installation to a previously ' +\r\n 'registered FIT ' + vm.recipientOptions.name + '.',\r\n hint: 'Please use \\'Select by address\\' if you wish to register a new FIT ' + vm.recipientOptions.name +\r\n ' for this installation.',\r\n required: true,\r\n options: [\r\n { name: 'Select by ID', value: 'byId' },\r\n { name: 'Select by company number', value: 'byCompanyNumber' },\r\n { name: 'Select by address', value: 'byAddress' }\r\n ]\r\n },\r\n expressionProperties: {\r\n 'templateOptions.onChange': clearError\r\n }\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'recipientId',\r\n type: 'fitInput',\r\n optionsTypes: ['fitRegexValidator'],\r\n templateOptions: {\r\n label: 'Please enter existing ' + vm.recipientOptions.name + ' ID:',\r\n pattern: vm.recipientOptions.regexPrefixCheck,\r\n hint: 'e.g. ' + vm.recipientOptions.prefix + '12345678',\r\n patternValidationMessage: 'Invalid ' + vm.recipientOptions.name + ' ID format'\r\n }\r\n },\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search for ' + vm.recipientOptions.name,\r\n btnType: 'secondary',\r\n onClick: getById\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function () { return !vm.model.recipientId; }\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byId\\''\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'companyNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company Number:',\r\n maxlength: 50\r\n }\r\n },\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search for ' + vm.recipientOptions.name,\r\n btnType: 'secondary',\r\n onClick: getByCompanyNumber\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function () { return !vm.model.companyNumber; }\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byCompanyNumber\\''\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n key: 'postcode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Postcode:',\r\n maxlength: 50\r\n }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byAddress\\''\r\n },\r\n {\r\n fieldGroup: [\r\n {\r\n className: 'formly-address-extra-field',\r\n key: 'address',\r\n type: 'fitAddressSearch',\r\n templateOptions: {\r\n populateFromModel: true\r\n }\r\n },\r\n {\r\n type: 'fitButton',\r\n templateOptions: {\r\n text: 'Search for ' + vm.recipientOptions.name,\r\n btnType: 'secondary',\r\n onClick: getByAddress\r\n },\r\n hideExpression: function () { return !vm.model.postcode || !vm.model.addressLine1; }\r\n }\r\n ],\r\n hideExpression: 'model.selectType !== \\'byAddress\\''\r\n }];\r\n\r\n if (vm.newRecipientId) {\r\n vm.model.selectType = 'byId';\r\n vm.model.recipientId = vm.newRecipientId;\r\n getById();\r\n }\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .controller('RegistrationConfirmController', RegistrationConfirmController);\r\n\r\n function RegistrationConfirmController($scope, $log, $state, registrationService, registrationDataService) {\r\n var vm = this;\r\n vm.error = '';\r\n vm.cancel = cancel;\r\n vm.register = register;\r\n vm.processing = false;\r\n vm.registrationDataService = registrationDataService;\r\n\r\n function register() {\r\n vm.processing = true;\r\n vm.error = '';\r\n var supplier = registrationDataService.getSupplierDetails();\r\n var user = registrationDataService.getUserDetails();\r\n var licenses = registrationDataService.getLicenceDetails();\r\n registrationService.register(supplier, user, licenses).then(clearDataAndRedirectToLandingPage, displayErrorMessage);\r\n }\r\n\r\n function cancel() {\r\n registrationDataService.clear();\r\n $state.go('home');\r\n }\r\n\r\n function clearDataAndRedirectToLandingPage() {\r\n registrationDataService.clear();\r\n vm.processing = false;\r\n $state.go('registered');\r\n }\r\n\r\n function displayErrorMessage(reason) {\r\n $log.warn('Registration failed:', reason);\r\n vm.error = 'There was an error submitting the registration. Please try again later.';\r\n vm.processing = false;\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .controller('RegistrationLicensesController', RegistrationLicensesController);\r\n\r\n function RegistrationLicensesController(registrationDataService, registrationService, WizardHandler, $log, $state) {\r\n var vm = this;\r\n vm.licenses = registrationDataService.getLicenceDetails();\r\n vm.addLicence = addLicence;\r\n vm.removeLicence = removeLicence;\r\n vm.checkNames = checkNames;\r\n vm.cancel = cancel;\r\n vm.invalidLicenceNames = [];\r\n vm.licenceNameIsInvalid = licenceNameIsInvalid;\r\n vm.validateNameIsNotDuplicate = validateNameIsNotDuplicate;\r\n vm.processing = false;\r\n\r\n function cancel() {\r\n registrationDataService.clear();\r\n $state.go('home');\r\n }\r\n\r\n function licenceNameIsInvalid(licence) {\r\n if (licence.name == null) {\r\n return false;\r\n }\r\n return vm.invalidLicenceNames.indexOf(licence.name.toUpperCase()) !== -1;\r\n }\r\n\r\n function validateNameIsNotDuplicate(licence, licenceForm) {\r\n if (licence.name == null) {\r\n return true;\r\n }\r\n\r\n var existingNames = getOtherLicences(licence).map(function(licence) {\r\n return licence.name != null ? licence.name.toUpperCase() : null;\r\n });\r\n\r\n if (existingNames.indexOf(licence.name.toUpperCase()) !== -1) {\r\n licenceForm.licenceName.$setValidity('duplicate', false);\r\n return;\r\n }\r\n licenceForm.licenceName.$setValidity('duplicate', true);\r\n }\r\n\r\n function addLicence() {\r\n vm.licenses.push({});\r\n }\r\n\r\n function removeLicence(licence) {\r\n vm.licenses = getOtherLicences(licence);\r\n }\r\n\r\n function getOtherLicences(licence) {\r\n return vm.licenses.filter(function(currentLicence) {return currentLicence != licence;});\r\n }\r\n\r\n function checkNames() {\r\n vm.processing = true;\r\n vm.error = '';\r\n registrationDataService.saveLicenceDetails(vm.licenses);\r\n var names = vm.licenses.map(function (licence) { return licence.name; });\r\n registrationService.checkLicenceNames(names).then(handleLicenceNameCheck, showErrorMessage);\r\n }\r\n\r\n function showErrorMessage(reason) {\r\n vm.processing = false;\r\n $log.warn('API request failed:', reason);\r\n vm.error = 'An error occurred while communicating with the server. Please try again later.';\r\n }\r\n\r\n function handleLicenceNameCheck(invalidLicenses) {\r\n vm.processing = false;\r\n if (invalidLicenses.length === 0) {\r\n WizardHandler.wizard().next();\r\n return;\r\n }\r\n vm.invalidLicenceNames = invalidLicenses.map(function(name) {\r\n return name.toUpperCase();\r\n });\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .factory('registrationDataService', registrationDataService);\r\n\r\n function registrationDataService(localStorageService) {\r\n var supplierKey = 'registration.supplier';\r\n var userKey = 'registration.user';\r\n var licencesKey = 'registration.licenses';\r\n\r\n var supplier = localStorageService.get(supplierKey) || {address: {}};\r\n var user = localStorageService.get(userKey) || {};\r\n var licenses = localStorageService.get(licencesKey) || [{}];\r\n\r\n var service = {\r\n saveSupplierDetails: saveSupplierDetails,\r\n saveUserDetails: saveUserDetails,\r\n saveLicenceDetails: saveLicenceDetails,\r\n getSupplierDetails: getSupplierDetails,\r\n getLicenceDetails: getLicenceDetails,\r\n getUserDetails: getUserDetails,\r\n clear: clear\r\n };\r\n return service;\r\n\r\n function saveSupplierDetails(updatedSupplier) {\r\n supplier = updatedSupplier;\r\n localStorageService.set(supplierKey, updatedSupplier);\r\n }\r\n\r\n function getSupplierDetails() {\r\n return supplier;\r\n }\r\n\r\n function saveUserDetails(updatedUser) {\r\n user = updatedUser;\r\n localStorageService.set(userKey, updatedUser);\r\n }\r\n\r\n function getLicenceDetails() {\r\n // This is necessary because the licence date is converted to a string format in local storage.\r\n return licenses.map(function(licence) {\r\n if (!(licence.fromDate instanceof Date)) {\r\n licence.fromDate = new Date(licence.fromDate);\r\n }\r\n return licence;\r\n });\r\n }\r\n\r\n function saveLicenceDetails(updatedLicenses) {\r\n licenses = updatedLicenses;\r\n localStorageService.set(licencesKey, updatedLicenses);\r\n }\r\n\r\n function getUserDetails() {\r\n return user;\r\n }\r\n\r\n function clear() {\r\n supplier = {};\r\n user = {};\r\n licenses = [{}];\r\n localStorageService.remove(supplierKey);\r\n localStorageService.remove(userKey);\r\n localStorageService.remove(licencesKey);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'registration',\r\n config: {\r\n url: '/registration',\r\n data: {\r\n permissions: {\r\n except: ['Authenticated']\r\n }\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/registration/registration.html'\r\n },\r\n 'introduction@registration': {\r\n templateUrl: 'app/registration/registration-introduction.html'\r\n },\r\n 'supplier@registration': {\r\n templateUrl: 'app/registration/supplier/registration-supplier.html',\r\n controller: 'RegistrationSupplierController',\r\n controllerAs: 'vm'\r\n },\r\n 'user@registration': {\r\n templateUrl: 'app/registration/user/registration-user.html',\r\n controller: 'RegistrationUserController',\r\n controllerAs: 'vm'\r\n },\r\n 'licenses@registration': {\r\n templateUrl: 'app/registration/licenses/registration-licenses.html',\r\n controller: 'RegistrationLicensesController',\r\n controllerAs: 'vm'\r\n },\r\n 'confirm@registration': {\r\n templateUrl: 'app/registration/confirmation/registration-confirm.html',\r\n controller: 'RegistrationConfirmController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'registered',\r\n config: {\r\n url: '/registered',\r\n views: {\r\n '': {\r\n templateUrl: 'app/registration/registration-landing.html'\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .factory('registrationService', registrationService);\r\n\r\n function registrationService($http, appConfig, $httpParamSerializer) {\r\n var service = {\r\n checkSupplierName: checkSupplierName,\r\n checkEmailAddress: checkEmailAddress,\r\n checkLicenceNames: checkLicenceNames,\r\n register: register\r\n };\r\n return service;\r\n \r\n function checkSupplierName(name) {\r\n return $http.get(appConfig.apiRoot + 'suppliers/availability?name=' + encodeURIComponent(name))\r\n .then(function (response) { return response.data.data; });\r\n }\r\n \r\n function checkEmailAddress(email) {\r\n return $http.get(appConfig.apiRoot + 'users/availability?email=' + encodeURIComponent(email))\r\n .then(function (response) { return response.data.data; });\r\n }\r\n \r\n function checkLicenceNames(names) {\r\n var queryString = $httpParamSerializer({ 'names': names });\r\n return $http.get(appConfig.apiRoot + 'licences/availability?' + queryString)\r\n .then(function (response) { return response.data.data; });\r\n }\r\n \r\n function register(supplier, user, licenses) {\r\n var encodedData = angular.toJson({\r\n supplier: supplier,\r\n user: user,\r\n licenses: licenses\r\n });\r\n return $http.post(appConfig.apiRoot + 'registration', encodedData);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .controller('RegistrationSupplierController', RegistrationSupplierController);\r\n\r\n function RegistrationSupplierController($log, registrationDataService, registrationService, addressService, WizardHandler, $state) {\r\n var vm = this;\r\n vm.supplier = registrationDataService.getSupplierDetails();\r\n\r\n vm.error = '';\r\n vm.foundAddresses = [];\r\n vm.addressesFound = false;\r\n vm.addressesSearched = false;\r\n\r\n vm.selectedAddress = null;\r\n vm.processing = false;\r\n vm.searchingAddress = false;\r\n\r\n vm.lookupAddress = lookupAddress;\r\n vm.selectAddress = selectAddress;\r\n vm.submitSupplier = submitSupplier;\r\n vm.cancel = cancel;\r\n vm.resetNameWarning = resetNameWarning;\r\n\r\n vm.checkingName = false;\r\n vm.invalidName = false;\r\n vm.loadingCountries = false;\r\n vm.countriesUnavailable = false;\r\n\r\n vm.loadCountries = loadCountries;\r\n vm.countries = [];\r\n loadCountries();\r\n\r\n function cancel() {\r\n registrationDataService.clear();\r\n $state.go('home');\r\n }\r\n\r\n function submitSupplier() {\r\n vm.checkingName = true;\r\n vm.processing = true;\r\n vm.invalidName = false;\r\n vm.error = '';\r\n registrationDataService.saveSupplierDetails(vm.supplier);\r\n registrationService.checkSupplierName(vm.supplier.name).then(handleSupplierNameCheck).catch(displayErrorMessage);\r\n }\r\n\r\n function handleSupplierNameCheck(isValid) {\r\n vm.processing = false;\r\n vm.checkingName = false;\r\n if (isValid) {\r\n WizardHandler.wizard().next();\r\n } else {\r\n vm.invalidName = true;\r\n }\r\n }\r\n\r\n function resetNameWarning() {\r\n vm.invalidName = false;\r\n }\r\n\r\n function selectAddress() {\r\n vm.supplier.address.addressLine1 = vm.selectedAddress.addressLine1;\r\n vm.supplier.address.addressLine2 = vm.selectedAddress.addressLine2;\r\n vm.supplier.address.county = vm.selectedAddress.county;\r\n vm.supplier.address.country = vm.selectedAddress.country;\r\n vm.supplier.address.town = vm.selectedAddress.town;\r\n }\r\n\r\n function lookupAddress() {\r\n vm.processing = true;\r\n vm.searchingAddress = true;\r\n vm.error = '';\r\n addressService.lookupAddress(vm.supplier.address.postcode).then(updateAddressDetails).catch(displayErrorMessage);\r\n }\r\n\r\n function updateAddressDetails (addresses) {\r\n vm.processing = false;\r\n vm.searchingAddress = false;\r\n vm.foundAddresses = addresses;\r\n vm.addressesFound = addresses.length > 0;\r\n vm.error = '';\r\n vm.addressesSearched = true;\r\n }\r\n\r\n function loadCountries() {\r\n vm.loadingCountries = true;\r\n vm.processing = true;\r\n vm.error = '';\r\n addressService.getCountries().then(setCountries, handleCountryLoadingFailure);\r\n }\r\n\r\n function setCountries(countries) {\r\n vm.countriesUnavailable = false;\r\n vm.processing = false;\r\n vm.loadingCountries = false;\r\n vm.countries = countries;\r\n }\r\n\r\n function handleCountryLoadingFailure(reason) {\r\n displayErrorMessage(reason);\r\n vm.countriesUnavailable = true;\r\n }\r\n\r\n function displayErrorMessage(reason) {\r\n vm.loadingCountries = false;\r\n vm.searchingAddress = false;\r\n vm.checkingName = false;\r\n vm.processing = false;\r\n $log.warn('API request failed:', reason);\r\n vm.error = reason.status === 503\r\n ? 'The service is currently unavailable to handle the request.'\r\n : 'An error occurred while communicating with the server. Please try again later.';\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .controller('RegistrationModalController', RegistrationModalController);\r\n\r\n function RegistrationModalController($uibModalInstance, $log, registrationDataService) {\r\n var vm = this;\r\n vm.user = registrationDataService.getUserDetails();\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.registration')\r\n .controller('RegistrationUserController', RegistrationUserController);\r\n\r\n function RegistrationUserController($log, registrationDataService, registrationService, documentsService, WizardHandler, $uibModal, $state) {\r\n var vm = this;\r\n vm.user = registrationDataService.getUserDetails();\r\n vm.error = '';\r\n vm.submitUser = submitUser;\r\n vm.cancel = cancel;\r\n vm.uploadFile = uploadFile;\r\n vm.hasAuthorisationLetter = hasAuthorisationLetter;\r\n vm.resetEmailWarning = resetEmailWarning;\r\n vm.invalidEmail = false;\r\n\r\n vm.processing = false;\r\n vm.checkingEmail = false;\r\n vm.uploadingDocument = false;\r\n\r\n function cancel() {\r\n registrationDataService.clear();\r\n $state.go('home');\r\n }\r\n\r\n function hasAuthorisationLetter() {\r\n return vm.user.authorisationLetterId != null;\r\n }\r\n\r\n function uploadFile(file) {\r\n if (file == null) {\r\n return;\r\n }\r\n\r\n var validFileTypes = ['image/gif', 'image/jpeg', 'image/png', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/pdf'];\r\n if (validFileTypes.indexOf(file.type) === -1) {\r\n displayErrorMessage('The uploaded file type was not recognised. Please upload the document in one of the following formats : jpeg, png, gif, pdf, doc, docx');\r\n return;\r\n }\r\n vm.processing = true;\r\n vm.uploadingDocument = true;\r\n\r\n var upload = vm.user.authorisationLetterId == null\r\n ? documentsService.uploadAuthorisationLetter(file)\r\n : documentsService.updateAuthorisationLetter(file, vm.user.authorisationLetterId);\r\n\r\n upload.then(recordUploadedDocument, handleDocumentUploadFailure);\r\n }\r\n\r\n function recordUploadedDocument(id) {\r\n vm.user.authorisationLetterId = id;\r\n registrationDataService.saveUserDetails(vm.user);\r\n vm.error = '';\r\n vm.processing = false;\r\n vm.uploadingDocument = false;\r\n }\r\n\r\n function handleDocumentUploadFailure(reason) {\r\n $log.warn('Document upload failed:', reason);\r\n\r\n var errorMessage;\r\n\r\n try {\r\n errorMessage = reason.data.modelState[''][0];\r\n\r\n if (errorMessage) {\r\n displayErrorMessage(errorMessage);\r\n }\r\n else {\r\n displayErrorMessage('There was an error uploading the document. Please try again later.');\r\n }\r\n }\r\n catch (e) {\r\n displayErrorMessage('There was an error uploading the document. Please try again later.');\r\n } \r\n }\r\n\r\n function submitUser() {\r\n vm.checkingEmail = true;\r\n vm.processing = true;\r\n vm.invalidEmail = false;\r\n vm.error = '';\r\n registrationDataService.saveUserDetails(vm.user);\r\n registrationService.checkEmailAddress(vm.user.emailAddress).then(handleEmailCheck).catch(handleEmailError);\r\n }\r\n\r\n function handleEmailError(reason) {\r\n $log.warn('Email check failed:', reason);\r\n vm.checkingEmail = false;\r\n displayErrorMessage('There was an error communicating with the server. Please try again later.');\r\n }\r\n\r\n function handleEmailCheck(isValid) {\r\n vm.processing = false;\r\n vm.checkingEmail = false;\r\n if (isValid) {\r\n WizardHandler.wizard().next();\r\n } else {\r\n vm.invalidEmail = true;\r\n }\r\n }\r\n\r\n function resetEmailWarning() {\r\n vm.invalidEmail = false;\r\n }\r\n\r\n function displayErrorMessage(errorMessage) {\r\n vm.error = errorMessage;\r\n vm.checkingEmail = false;\r\n vm.uploadingDocument = false;\r\n vm.processing = false;\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .controller('DynamicReportController', DynamicReportController);\r\n\r\n function DynamicReportController(reportType, $state, $scope, localStorageService, reportService) {\r\n var vm = this;\r\n var formStorageKey = getStorageKey();\r\n var model = getSavedModel();\r\n \r\n if (model.columns) {\r\n delete model.columns;\r\n }\r\n\r\n vm.cancel = returnToList;\r\n vm.downloadReport = downloadReport;\r\n vm.getModel = getModel;\r\n vm.formFields = reportService.getDynamicFormFields(reportType);\r\n vm.model = model;\r\n \r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Download',\r\n cancel: 'Back'\r\n }\r\n };\r\n vm.formOptions.enabledExpression = function() {\r\n return vm.model.format\r\n && vm.model.cs;\r\n };\r\n\r\n $scope.$watch(getModel, function (newVal, oldVal) {\r\n // Note: The reference comparison avoids saving on load.\r\n // It will never be true again since object equality (the third param)\r\n // is switched on, which (according to the docs) makes sure that the\r\n // old value is a copy and not a reference to the new value\r\n if (newVal !== oldVal) {\r\n localStorageService.set(formStorageKey, newVal);\r\n }\r\n }, true);\r\n\r\n function getSavedModel() {\r\n var saved = localStorageService.get(formStorageKey) || {};\r\n if (saved.filter && saved.filter.confirmationDateFrom) {\r\n saved.filter.confirmationDateFrom = new Date(saved.filter.confirmationDateFrom);\r\n }\r\n if (saved.filter && saved.filter.confirmationDateTo) {\r\n saved.filter.confirmationDateTo = new Date(saved.filter.confirmationDateTo);\r\n }\r\n return saved;\r\n }\r\n\r\n function returnToList() {\r\n $state.go('reports');\r\n }\r\n\r\n function downloadReport(model) {\r\n return reportService.downloadReport('dynamic/' + reportType, model);\r\n }\r\n\r\n function getModel() {\r\n return model;\r\n }\r\n\r\n function getStorageKey() {\r\n return reportType + 'ReportForm';\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .controller('AuditHistoryReportController', AuditHistoryReportController);\r\n\r\n function AuditHistoryReportController($state, $scope, reportService, reportFilterService, localStorageService) {\r\n var vm = this;\r\n var strorageKey = 'auditReport-ReportForm';\r\n var model = getSavedModel();\r\n vm.getModel = getModel;\r\n vm.filterFields = reportFilterService.getFilterFields('auditHistory');\r\n vm.downloadReport = download;\r\n vm.cancel = returnToList;\r\n \r\n function getModel() {\r\n return model;\r\n }\r\n vm.model = model;\r\n\r\n function getSavedModel() {\r\n var saved = localStorageService.get(strorageKey) || {};\r\n if (saved.filter && saved.filter.fromDate) {\r\n saved.filter.fromDate = new Date(saved.filter.fromDate);\r\n }\r\n if (saved.filter && saved.filter.toDate) {\r\n saved.filter.toDate = new Date(saved.filter.toDate);\r\n }\r\n return saved;\r\n }\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Download',\r\n cancel: 'Back'\r\n }\r\n };\r\n\r\n $scope.$watch(getModel, function (newVal, oldVal) {\r\n // Note: The reference comparison avoids saving on load.\r\n // It will never be true again since object equality (the third param)\r\n // is switched on, which (according to the docs) makes sure that the\r\n // old value is a copy and not a reference to the new value\r\n if (newVal !== oldVal) {\r\n localStorageService.set(strorageKey, newVal);\r\n }\r\n }, true);\r\n\r\n vm.formOptions.enabledExpression = function () {\r\n return vm.model.filter && vm.model.filter.toDate && vm.model.filter.fromDate;\r\n };\r\n\r\n function returnToList() {\r\n $state.go('reports');\r\n }\r\n\r\n function download(model) {\r\n return reportService.downloadReport('fixed/audit/download', model.filter);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .controller('FitSummaryReportController', FitSummaryReportController);\r\n\r\n function FitSummaryReportController(constants, reportService, reportFilterService) {\r\n var vm = this;\r\n\r\n vm.data = null;\r\n vm.installationTypeNames = typeNameMap(constants.installationTypes);\r\n vm.technologyTypeNames = typeNameMap(constants.technologyTypes);\r\n vm.filterFields = reportFilterService.getFilterFields('publicInstallationCapacity');\r\n vm.filterModel = {};\r\n vm.showFilter = true;\r\n vm.runReport = loadData;\r\n vm.downloadReport = download;\r\n vm.running = false;\r\n \r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Run',\r\n cancel: 'Back'\r\n }\r\n };\r\n vm.formOptions.enabledExpression = function() {\r\n return true;\r\n };\r\n \r\n function loadData() {\r\n vm.data = null;\r\n vm.running = true;\r\n reportService.fetchReportData('fixed/fitSummary', vm.filterModel)\r\n .then(function (response) {\r\n response.selectedInstallationTypes = _.keys(response.columnTotals);\r\n vm.data = response;\r\n vm.showFilter = false;\r\n })\r\n .finally(function () {\r\n vm.running = false;\r\n });\r\n }\r\n\r\n function download() {\r\n return reportService.downloadReport('fixed/fitSummary/download', vm.filterModel, true);\r\n }\r\n\r\n function typeNameMap(types) {\r\n var ret = {};\r\n types.forEach(function (type) {\r\n var code = type.code.replace(/^(.)/, function ($1) { return $1.toLowerCase(); });\r\n ret[code] = type.name;\r\n });\r\n return ret;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .controller('PublicInstallationsController', PublicInstallationsController);\r\n\r\n function PublicInstallationsController($state, reportService, reportFilterService) {\r\n var vm = this;\r\n vm.filterFields = reportFilterService.getFilterFields('publicInstallationCapacity');\r\n vm.downloadReport = download;\r\n vm.cancel = returnToList;\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Download',\r\n cancel: 'Back'\r\n }\r\n };\r\n vm.formOptions.enabledExpression = function() {\r\n return true;\r\n };\r\n\r\n function returnToList() {\r\n $state.go('reports');\r\n }\r\n\r\n function download(model) {\r\n return reportService.downloadReport('fixed/installations/download', model, true);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .factory('reportFilterService', reportFilterService);\r\n\r\n function reportFilterService(constants, principal, constantUtils) {\r\n var technologyType = {\r\n key: 'technologyType',\r\n type: 'fitMultiselect',\r\n templateOptions: {\r\n label: 'Technology type',\r\n options: constants.technologyTypes\r\n }\r\n };\r\n var accreditationType = {\r\n key: 'accreditationType',\r\n type: 'fitMultiselect',\r\n templateOptions: {\r\n label: 'Accreditation type',\r\n options: constants.accreditationTypes\r\n }\r\n };\r\n var postcode = {\r\n key: 'postcodeCountry',\r\n type: 'fitMultiselect',\r\n templateOptions: {\r\n label: 'Country',\r\n options: constants.postcodeCountries\r\n }\r\n };\r\n var governmentOfficeRegion = {\r\n key: 'governmentOfficeRegion',\r\n type: 'fitMultiselect',\r\n templateOptions: {\r\n label: 'Government office region',\r\n options: constants.governmentOfficeRegions\r\n }\r\n };\r\n var localAuthority = {\r\n key: 'localAuthority',\r\n type: 'fitMultiselect',\r\n templateOptions: {\r\n label: 'Local authority',\r\n options: constants.localAuthorities\r\n }\r\n };\r\n var tariffCode = {\r\n key: 'tariffCode',\r\n type: 'fitTypeahead',\r\n templateOptions: {\r\n label: 'Tariff code',\r\n maxLength: 30,\r\n endpoint: 'tariffs/codes'\r\n }\r\n };\r\n var supplierName = {\r\n key: 'supplierName',\r\n type: 'fitTypeahead',\r\n templateOptions: {\r\n label: 'Supplier name',\r\n maxlength: 30,\r\n endpoint: 'suppliers/names'\r\n },\r\n hideExpression: function () {\r\n return !principal.isInternal();\r\n }\r\n };\r\n var sharedTechTypeAddress = {\r\n key: 'sharedTechTypeAddress',\r\n type: 'fitCheckbox',\r\n templateOptions: {\r\n label: 'Shared tech type and address'\r\n }\r\n };\r\n var sharedEpc = {\r\n key: 'sharedEpc',\r\n type: 'fitCheckbox',\r\n templateOptions: {\r\n label: 'Shared EPC'\r\n }\r\n };\r\n var sharedTechTypeMpan = {\r\n key: 'sharedTechTypeMpan',\r\n type: 'fitCheckbox',\r\n templateOptions: {\r\n label: 'Shared tech type and mpan'\r\n }\r\n };\r\n\r\n var installationId = {\r\n key: 'installationId',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'FIT ID'\r\n },\r\n hideExpression: function () {\r\n return !principal.isInternal();\r\n }\r\n };\r\n\r\n return {\r\n getFilterFields: getFilterFields\r\n };\r\n\r\n function getFilters() {\r\n return {\r\n 'publicInstallationCapacity': [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(postcode, 'col-md-4'),\r\n field(governmentOfficeRegion, 'col-md-4'),\r\n field(localAuthority, 'col-md-4')\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(tariffCode, 'col-md-4'),\r\n field(technologyType, 'col-md-4'),\r\n field(accreditationType, 'col-md-4')\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: confirmationDates('col-md-4')\r\n }\r\n ],\r\n 'installationCapacity': [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(technologyType, 'col-md-4', 'filter'),\r\n field(accreditationType, 'col-md-4', 'filter'),\r\n installType('col-md-4', 'filter')\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [].concat(\r\n [\r\n field(supplierName, 'col-md-4', 'filter')\r\n ],\r\n confirmationDates('col-md-4', 'filter')\r\n )\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(sharedTechTypeAddress, 'col-sm-4', 'filter'),\r\n field(sharedEpc, 'col-sm-4', 'filter')\r\n ]\r\n }\r\n ],\r\n 'meter': [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(technologyType, 'col-md-4', 'filter'),\r\n field(accreditationType, 'col-md-4', 'filter'),\r\n installType('col-md-4', 'filter')\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [].concat(\r\n [\r\n field(supplierName, 'col-md-4', 'filter')\r\n ],\r\n confirmationDates('col-md-4', 'filter')\r\n )\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(sharedTechTypeMpan, 'col-sm-4', 'filter')\r\n ]\r\n }\r\n ],\r\n 'auditHistory': [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'format',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n inline: true,\r\n options: constants.reportFormatTypes,\r\n label: 'Please select the report format:',\r\n required: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [].concat(\r\n [\r\n field(supplierName, 'col-md-4', 'filter')\r\n ],\r\n auditDates('col-md-4', 'filter')\r\n )\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n field(installationId, 'col-sm-4', 'filter')\r\n ]\r\n }\r\n ] \r\n };\r\n }\r\n\r\n function field(field, className, prefix) {\r\n return _.assign({}, field, {\r\n className: className,\r\n key: addPrefix(field.key, prefix)\r\n });\r\n }\r\n\r\n function installType(className, prefix) {\r\n var pvTechnologyType = constantUtils.findConstantValue(constants.technologyTypes, 'Photovoltaic');\r\n var technologyTypeKey = addPrefix('technologyType', prefix);\r\n return {\r\n className: className,\r\n key: addPrefix('installType', prefix),\r\n type: 'fitMultiselect',\r\n templateOptions: {\r\n label: 'PV Install type',\r\n options: constants.photovoltaicInstallTypes\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': 'model.' + technologyTypeKey + '.length && model.' + technologyTypeKey + '.indexOf(' + pvTechnologyType + ') === -1'\r\n }\r\n };\r\n }\r\n\r\n function confirmationDates(className, prefix) {\r\n var fromKey = addPrefix('confirmationDateFrom', prefix);\r\n var confirmationDateFrom = {\r\n className: className,\r\n key: fromKey,\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n required: false,\r\n label: 'Confirmation date from',\r\n datepickerOptions: {\r\n maxDate: new Date() // Date cannot be in the future\r\n }\r\n }\r\n };\r\n var confirmationDateTo = {\r\n className: className,\r\n key: addPrefix('confirmationDateTo', prefix),\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n required: false,\r\n label: 'Confirmation date to',\r\n datepickerOptions: {\r\n maxDate: new Date() // Date cannot be in the future\r\n }\r\n },\r\n validators: {\r\n confirmationDateFrom: {\r\n expression: function (viewValue, modelValue, scope) {\r\n var dateFrom = _.get(scope.model, fromKey);\r\n if (dateFrom && modelValue) {\r\n return moment(modelValue).isSameOrAfter(moment(dateFrom));\r\n }\r\n return true;\r\n },\r\n message: '\"Date cannot be before \\'confirmation date from\\' date.\"'\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n return [confirmationDateFrom, confirmationDateTo];\r\n }\r\n\r\n function auditDates(className, prefix) {\r\n var fromKey = addPrefix('fromDate', prefix);\r\n var toKey = addPrefix('toDate', prefix);\r\n var fromDate = {\r\n className: className,\r\n key: fromKey,\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n required: true,\r\n label: 'Change from',\r\n datepickerOptions: {\r\n maxDate: new Date() // Date cannot be in the future\r\n }\r\n },\r\n validators: {\r\n confirmationDateFrom: {\r\n expression: function (viewValue, modelValue, scope) {\r\n var dateTo = _.get(scope.model, toKey);\r\n if (dateTo && modelValue) {\r\n var auditToDate = moment(dateTo);\r\n var auditFromDate = moment(modelValue);\r\n var diff = auditToDate.diff(auditFromDate, 'months');\r\n return moment(auditToDate).isSameOrAfter(auditFromDate) && diff <= 2;\r\n }\r\n if (!modelValue) return false;\r\n return true;\r\n },\r\n message: '\"Date must be a valid date within three months of \\'change to\\' date.\"'\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n var toDate = {\r\n className: className,\r\n key: addPrefix('toDate', prefix),\r\n type: 'fitDatePicker',\r\n optionsTypes: ['fitDateNotInFutureValidator'],\r\n templateOptions: {\r\n required: true,\r\n label: 'Change to',\r\n datepickerOptions: {\r\n maxDate: new Date() // Date cannot be in the future\r\n }\r\n },\r\n validators: {\r\n confirmationDateTo: {\r\n expression: function (viewValue, modelValue, scope) {\r\n var dateFrom = _.get(scope.model, fromKey);\r\n if (dateFrom && modelValue) {\r\n var auditToDate = moment(modelValue);\r\n var auditFromDate = moment(dateFrom);\r\n var diff = auditToDate.diff(auditFromDate, 'months');\r\n return moment(auditToDate).isSameOrAfter(auditFromDate) && diff <= 2;\r\n }\r\n if (!modelValue) return false;\r\n return true;\r\n },\r\n message: '\"Date must be a valid date within three months of \\'change from\\' date.\"'\r\n }\r\n },\r\n extras: {\r\n validateOnModelChange: true\r\n }\r\n };\r\n return [fromDate, toDate];\r\n }\r\n\r\n function addPrefix(key, prefix) {\r\n return prefix ? prefix + '.' + key : key;\r\n }\r\n\r\n function getFilterFields(type) {\r\n var filters = getFilters();\r\n if (!_.has(filters, type)) {\r\n throw new Error('Unknown report type: ' + type);\r\n }\r\n return filters[type];\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .factory('reportService', reportService);\r\n\r\n function reportService($httpParamSerializerJQLike, constants, dataService, reportFilterService, downloadService) {\r\n return {\r\n getDynamicFormFields: getDynamicFormFields,\r\n downloadReport: downloadReport,\r\n fetchReportData: fetchReportData\r\n };\r\n\r\n function getDynamicFormFields(type) {\r\n var typeSelector = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6',\r\n key: 'format',\r\n type: 'fitRadio',\r\n templateOptions: {\r\n inline: true,\r\n options: constants.reportFormatTypes,\r\n label: 'Please select the report format:',\r\n required: true\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n var columns = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n key: 'cs',\r\n type: 'dragAndDrop',\r\n className: 'col-md-12',\r\n templateOptions: {\r\n label: 'Please use the following tables to select which columns you would like in your report',\r\n helpText: 'To select which columns you would like to include in your report, please drag and drop individual columns from the \\'Available columns\\' table on the left to the \\'Selected columns\\' table on the right. Please press \\'Download\\' once you have made the selection.',\r\n availableTitle: 'Available columns',\r\n selectedTitle: 'Selected columns',\r\n optionsEndpoint: getPathRoot('dynamic/' + type) + 'columns',\r\n required: true,\r\n requiredValidationMessage: 'You must specify at least one column to be included in the report.'\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n var filterFields = reportFilterService.getFilterFields(type);\r\n return [].concat(typeSelector, filterFields, columns);\r\n }\r\n\r\n function downloadReport(type, model, isPublic) {\r\n var url = getReportUrl(type, model);\r\n return downloadService.download(url, isPublic);\r\n }\r\n\r\n function fetchReportData(type, model) {\r\n var url = getReportUrl(type, model);\r\n return dataService.fetchDataFromEndpoint(url);\r\n }\r\n\r\n function getReportUrl(type, model) {\r\n clean(model);\r\n var params = $httpParamSerializerJQLike(model);\r\n return getPathRoot(type) + '?' + params;\r\n }\r\n\r\n function clean(obj) {\r\n for (var propName in obj) {\r\n if (obj[propName] === null || angular.isUndefined(obj[propName])) {\r\n delete obj[propName];\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n function getPathRoot(type) {\r\n return 'reports/' + type + '/';\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.reports')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n\r\n routeManager.addStates([\r\n {\r\n state: 'reports',\r\n config: {\r\n title: 'Reports',\r\n url: '/reports',\r\n views: {\r\n '': {\r\n templateUrl: 'app/reports/reports.html'\r\n },\r\n 'display@reports': {\r\n templateUrl: 'app/reports/list.html'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'reports#fitSummary',\r\n config: {\r\n parent: 'reports',\r\n title: 'Reports - FIT summary',\r\n data: {\r\n permissions: {\r\n except: ['Authenticated']\r\n }\r\n },\r\n views: {\r\n 'display@reports': {\r\n templateUrl: 'app/reports/fixed/fit-summary.html',\r\n controller: 'FitSummaryReportController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/fitSummary'\r\n }\r\n },\r\n {\r\n state: 'reports#publicInstallations',\r\n config: {\r\n parent: 'reports',\r\n title: 'Reports - Feed-in Tariff Installation Report',\r\n data: {\r\n permissions: {\r\n only: ['Internal']\r\n }\r\n },\r\n views: {\r\n 'display@reports': {\r\n templateUrl: 'app/reports/fixed/public-installations.html',\r\n controller: 'PublicInstallationsController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/installation'\r\n }\r\n },\r\n {\r\n state: 'reports#auditHistory',\r\n config: {\r\n parent: 'reports',\r\n title: 'Reports - Audit history report',\r\n data: {\r\n permissions: {\r\n only: ['Internal']\r\n }\r\n },\r\n views: {\r\n 'display@reports': {\r\n templateUrl: 'app/reports/fixed/audit-history.html',\r\n controller: 'AuditHistoryReportController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n url: '/auditHistory'\r\n }\r\n }\r\n ]);\r\n addDynamicReportRoute('installationCapacity', 'Installations');\r\n addDynamicReportRoute('meter', 'Metering');\r\n\r\n function addDynamicReportRoute(reportType, title) {\r\n routeManager.addStates([\r\n {\r\n state: 'reports#dynamic-' + reportType,\r\n config: {\r\n data: {\r\n permissions: {\r\n only: ['Internal', 'ExternalReporting']\r\n }\r\n },\r\n title: 'Reports - ' + title,\r\n parent: 'reports',\r\n views: {\r\n 'display@reports': {\r\n templateUrl: 'app/reports/dynamic-report.html',\r\n controller: 'DynamicReportController',\r\n controllerAs: 'vm'\r\n }\r\n },\r\n resolve: {\r\n 'reportType': function () {\r\n return reportType;\r\n }\r\n },\r\n url: '/' + reportType\r\n }\r\n }\r\n ]);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.smartExportGuarantee')\r\n .controller('SmartExportGuaranteeController', SmartExportGuaranteeController);\r\n\r\n function SmartExportGuaranteeController($stateParams,\r\n documentsService,\r\n downloadService,\r\n paginatedDataService,\r\n smartExportGuaranteeService,\r\n $state) {\r\n var vm = this;\r\n\r\n vm.csvMpanResultColumns = ['mpan', 'fitExport'];\r\n vm.csvMpanResultHeaders = ['MPAN', 'Fit Export'];\r\n\r\n vm.loading = false;\r\n vm.action = $stateParams.action;\r\n vm.error = '';\r\n\r\n vm.formOptions = {\r\n buttons: {\r\n save: 'Upload',\r\n cancel: 'Cancel'\r\n },\r\n disabledOverride: true\r\n };\r\n\r\n vm.uploadFailed = false;\r\n var documentId = 0;\r\n\r\n\r\n vm.pagination = {\r\n itemsPerPage: 30,\r\n displayedPages: 7\r\n };\r\n\r\n vm.formFields = formFields();\r\n vm.uploadDocument = uploadAndParseDocument;\r\n vm.cancelForm = cancelForm;\r\n vm.fileSaveLocation = {};\r\n vm.fetchData = fetchData;\r\n vm.tableData = null;\r\n\r\n vm.cachedRequestParams = null;\r\n\r\n var formFile = null;\r\n vm.getCsvMpanResultData = getCsvMpanResultData;\r\n vm.downloadDocument = downloadDocument;\r\n\r\n if (!sessionStorage.documentId) {\r\n sessionStorage.documentId = 0;\r\n }\r\n\r\n\r\n function uploadAndParseDocument(model) {\r\n vm.loading = true;\r\n vm.uploadFailed = false;\r\n documentId = null;\r\n var uploadModel = angular.copy(model);\r\n uploadModel.file = formFile;\r\n\r\n var documentUploadServiceMethod = documentsService.uploadMpanDocument;\r\n return documentUploadServiceMethod(uploadModel, 1)\r\n .then(function (response) {\r\n documentId = response.documentId;\r\n sessionStorage.documentId = response.documentId;\r\n }).then(parseDocument);\r\n\r\n function parseDocument() {\r\n return smartExportGuaranteeService.parseDocument(documentId).then(notifySuccess);\r\n }\r\n }\r\n\r\n function setFile(file) {\r\n formFile = file;\r\n vm.formOptions.disabledOverride = file == null;\r\n }\r\n\r\n function cancelForm() {\r\n $state.reload();\r\n }\r\n\r\n function notifySuccess() {\r\n $state.reload();\r\n }\r\n\r\n function formFields() {\r\n var fields = [\r\n {\r\n className: 'col-md-8',\r\n key: 'file',\r\n type: 'fitFilePicker',\r\n templateOptions: {\r\n label: 'Upload File',\r\n maxFileSize: '10MB',\r\n required: true,\r\n setFile: setFile\r\n }\r\n }\r\n ];\r\n return fields;\r\n }\r\n\r\n function downloadDocument() {\r\n\r\n documentId = sessionStorage.documentId;\r\n\r\n var endPoint = 'smartExportGuarantee/xlsx/' + documentId;\r\n downloadService.download(endPoint);\r\n }\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'mpan',\r\n label: 'MPAN'\r\n },\r\n {\r\n id: 'fitExport',\r\n label: 'FIT Export'\r\n }\r\n ];\r\n\r\n function fetchData(tableData) {\r\n vm.cachedRequestParams = paginatedDataService.getParamsFromTableData(tableData);\r\n documentId = sessionStorage.documentId;\r\n\r\n return paginatedDataService.fetchDataFromParams('smartExportGuarantee/mpanDocumentParse/' + documentId,\r\n vm.cachedRequestParams);\r\n }\r\n\r\n function getCsvMpanResultData() {\r\n var params = vm.cachedRequestParams;\r\n documentId = sessionStorage.documentId;\r\n params.pageNumber = 1;\r\n params.pageSize = 1000;\r\n return paginatedDataService\r\n .fetchDataFromParams('smartExportGuarantee/mpanDocumentParse/' + documentId, vm.cachedRequestParams)\r\n .then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.smartExportGuarantee')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n\r\n routeManager.addStates([\r\n {\r\n state: 'smartExportGuarantee',\r\n config: {\r\n title: 'SmartExportGuarantee',\r\n templateUrl: 'app/smartExportGuarantee/smartExportGuarantee.html',\r\n url: '/smartExportGuarantee',\r\n controller: 'SmartExportGuaranteeController',\r\n controllerAs: 'vm',\r\n data: {\r\n permissions: {\r\n only: ['Authenticated']\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.smartExportGuarantee')\r\n .factory('smartExportGuaranteeService', smartExportGuaranteeService);\r\n\r\n function smartExportGuaranteeService($http, appConfig) {\r\n var service = {\r\n parseDocument : parseDocument\r\n };\r\n return service;\r\n\r\n function parseDocument(documentId) {\r\n return $http.get(appConfig.apiRoot + 'smartExportGuarantee/mpanDocumentParse/' + documentId);\r\n }\r\n }\r\n\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .controller('SuppliersController', SuppliersController);\r\n\r\n\r\n function SuppliersController($log, paginatedDataService, downloadService) {\r\n var vm = this;\r\n\r\n vm.csvSupplierColumns = [\r\n 'displayId', 'name', 'status', 'notificationEmailAddress', 'addressLine1', 'addressLine2', 'town', 'county', 'country', 'postcode'\r\n ];\r\n\r\n vm.csvSupplierHeaders = [\r\n 'Id', 'Supplier Name', 'Supplier Account Status', 'FIT Notification Email Address', 'Address Line 1', 'Address Line 2', 'Town', 'County', 'Country', 'Postcode'\r\n ];\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'displayId',\r\n label: 'Supplier ID',\r\n sort: true\r\n },\r\n {\r\n id: 'name',\r\n label: 'Supplier name',\r\n sort: true\r\n },\r\n {\r\n id: 'status',\r\n label: 'Supplier account status',\r\n sort: true\r\n },\r\n {\r\n id: '_actions',\r\n label: '',\r\n valueTemplate: 'View'\r\n }\r\n ];\r\n\r\n vm.fetchData = fetchData;\r\n vm.getCsvSupplierData = getCsvSupplierData;\r\n vm.getCsvLicenceData = getCsvLicenceData;\r\n\r\n vm.cachedRequestParams = null;\r\n\r\n function getCsvSupplierData() {\r\n var params = vm.cachedRequestParams;\r\n params.pageNumber = 1;\r\n params.pageSize = 1000;\r\n return paginatedDataService\r\n .fetchDataFromParams('suppliers', vm.cachedRequestParams)\r\n .then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n\r\n function getCsvLicenceData() {\r\n downloadService.download('licences/csv');\r\n }\r\n\r\n function fetchData(tableData) {\r\n vm.cachedRequestParams = paginatedDataService.getParamsFromTableData(tableData);\r\n return paginatedDataService.fetchDataFromParams('suppliers', vm.cachedRequestParams);\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager, principal) {\r\n\r\n function getSupplierViews(stateName) {\r\n var supplierView = {\r\n templateUrl: 'app/suppliers/view/supplier.html',\r\n controller: 'SupplierController',\r\n controllerAs: 'vm'\r\n };\r\n\r\n var userView = {\r\n templateUrl: 'app/users/user-table.html',\r\n controller: 'UsersTableController',\r\n controllerAs: 'vm'\r\n };\r\n\r\n var licenceView = {\r\n templateUrl: 'app/suppliers/view/licence/licences.html',\r\n controller: 'LicencesController',\r\n controllerAs: 'vm'\r\n };\r\n\r\n var view = {\r\n '': supplierView\r\n };\r\n view['users@' + stateName] = userView;\r\n view['licences@' + stateName] = licenceView;\r\n return view;\r\n }\r\n \r\n routeManager.addStates([\r\n {\r\n state: 'suppliers',\r\n config: {\r\n templateUrl: 'app/suppliers/suppliers.html',\r\n controller: 'SuppliersController',\r\n controllerAs: 'vm',\r\n title: 'Suppliers',\r\n url: '/suppliers',\r\n data: {\r\n permissions: {\r\n only: ['Internal']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'mySupplier',\r\n config: {\r\n title: 'Supplier',\r\n url: '/supplier',\r\n params: {\r\n supplierId: principal.supplierId,\r\n external: true\r\n },\r\n data: {\r\n permissions: {\r\n only: ['ExternalSuperuser', 'ExternalUserManagement']\r\n }\r\n },\r\n views: getSupplierViews('mySupplier')\r\n }\r\n },\r\n {\r\n state: 'mySupplier#editUser',\r\n config: {\r\n url: '/supplier/user/{userId}',\r\n parent: 'mySupplier',\r\n params: {\r\n supplierId: principal.supplierId,\r\n userId: {\r\n type: 'int',\r\n value: null\r\n },\r\n isMyAccountPage: false\r\n },\r\n views: {\r\n 'users@mySupplier': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'mySupplier#createUser',\r\n config: {\r\n url: '/supplier/user/create',\r\n parent: 'mySupplier',\r\n params: {\r\n supplierId: principal.supplierId,\r\n userId: null,\r\n isMyAccountPage: false\r\n },\r\n views: {\r\n 'users@mySupplier': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'supplier',\r\n config: {\r\n title: 'Supplier',\r\n url: '/supplier/{supplierId}',\r\n params:\r\n {\r\n external: true\r\n },\r\n data: {\r\n permissions: {\r\n only: ['Internal']\r\n }\r\n },\r\n views: getSupplierViews('supplier')\r\n }\r\n },\r\n {\r\n state: 'supplier#editUser',\r\n config: {\r\n url: '/supplier/{supplierId}/user/{userId}',\r\n parent: 'supplier',\r\n params: {\r\n userId: {\r\n type: 'int',\r\n value: null\r\n },\r\n isMyAccountPage: false\r\n },\r\n views: {\r\n 'users@supplier': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'supplier#createUser',\r\n config: {\r\n url: '/supplier/{supplierId}/user/create',\r\n parent: 'supplier',\r\n params: {\r\n userId: null,\r\n isMyAccountPage: false\r\n },\r\n views: {\r\n 'users@supplier': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'supplier/history',\r\n config: {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm',\r\n params: {\r\n returnState: null,\r\n entityType: 'Supplier',\r\n endpoint: 'Supplier'\r\n },\r\n title: 'Supplier History',\r\n url: '/supplier/history/{id}/{name}',\r\n data: {\r\n permissions: {\r\n only: ['ExternalSuperuser', 'Internal']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'licence/history',\r\n config: {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm',\r\n params: {\r\n returnState: null,\r\n entityType: 'Licence',\r\n endpoint: 'Licence'\r\n },\r\n title: 'Licence History',\r\n url: '/licence/history/{id}/{name}',\r\n data: {\r\n permissions: {\r\n only: ['Internal']\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .factory('suppliersService', suppliersService);\r\n\r\n function suppliersService($http, appConfig) {\r\n var service = {\r\n reject: reject,\r\n approve: approve,\r\n update: update\r\n };\r\n return service;\r\n\r\n function update(id, supplier) {\r\n return $http.put(appConfig.apiRoot + 'suppliers/' + id, supplier);\r\n }\r\n \r\n function reject(id) {\r\n return $http.delete(appConfig.apiRoot + 'suppliers/' + id);\r\n }\r\n\r\n function approve(id) {\r\n return $http.patch(appConfig.apiRoot + 'suppliers/' + id + '/approve');\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .controller('LicenceModalController', LicenceModalController);\r\n \r\n function LicenceModalController(licence, licenceService, $uibModalInstance, $log) {\r\n var vm = this;\r\n vm.error = '';\r\n vm.processing = false;\r\n vm.options = [];\r\n vm.loadingFityears = false;\r\n vm.licenceStatusOptions = {\r\n '1': 'Invalid',\r\n '2': 'Valid'\r\n };\r\n\r\n loadFitYears();\r\n\r\n if (licence.statusId === 0) {\r\n vm.licenceStatusOptions['0'] = 'Unapproved';\r\n }\r\n\r\n vm.fitStatusOptions = {\r\n '0': 'Non FIT Licensee',\r\n '1': 'Voluntary FIT Licensee',\r\n '2': 'Mandatory FIT Licensee'\r\n };\r\n\r\n vm.licenceStatus = String(licence.statusId);\r\n vm.licenceStatusUnset = licence.statusId === 0;\r\n vm.fitStatus = String(licence.fitStatusId);\r\n vm.comments = '';\r\n vm.fitYear = '';\r\n\r\n vm.update = update;\r\n\r\n function update() {\r\n vm.processing = true;\r\n vm.error = '';\r\n licenceService.updateStatus(licence.id, vm.licenceStatus, vm.fitStatus, vm.comments, vm.fitYear).then(closeModal, displayError);\r\n }\r\n\r\n function loadFitYears() {\r\n vm.loadingFitYears = true;\r\n licenceService.getFitYears().then(setFitYears).finally(stopLoading);\r\n }\r\n\r\n function setFitYears(response) {\r\n vm.fitYears = response;\r\n vm.fitYear = vm.fitYears[0].value;\r\n }\r\n\r\n function stopLoading() {\r\n vm.loadingFitYears = false;\r\n }\r\n\r\n function closeModal(updatedLicence) {\r\n vm.processing = false;\r\n $uibModalInstance.close(updatedLicence);\r\n }\r\n\r\n function displayError(response) {\r\n vm.processing = false;\r\n vm.error = 'There was an error updating the licence. Please try again later.';\r\n $log.warn('API request failed:', response);\r\n }\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .factory('licenceService', licenceService);\r\n\r\n function licenceService($http, appConfig) {\r\n var service = {\r\n save: save,\r\n updateStatus: updateStatus,\r\n getFitYears: getFitYears\r\n };\r\n return service;\r\n\r\n function save(licence) {\r\n var encodedData = angular.toJson(licence);\r\n\r\n var request = (angular.isUndefined(licence.id) || licence.id === null)\r\n ? $http.post(appConfig.apiRoot + 'licences', encodedData)\r\n : $http.put(appConfig.apiRoot + 'licences/' + licence.id, encodedData);\r\n\r\n return request;\r\n }\r\n \r\n function updateStatus(id, newStatus, newFitStatus, comments, fitYear) {\r\n var data = {\r\n comment: comments,\r\n status: newStatus,\r\n fitStatus: newFitStatus,\r\n fitYear: fitYear\r\n };\r\n return $http.patch(appConfig.apiRoot + 'licences/' + id, data);\r\n }\r\n\r\n function getFitYears() {\r\n var requestUrl = appConfig.apiRoot + 'levelisations/years/current';\r\n return $http.get(requestUrl).then(function (response) { return response.data.data; });\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .controller('LicencesController', LicencesController);\r\n \r\n function LicencesController($uibModal, $stateParams , $state, dataService, licenceService) {\r\n var vm = this;\r\n vm.supplierId = $stateParams.supplierId;\r\n vm.licenceFormFields = [];\r\n vm.returnState = $state.href('supplier', { id: vm.supplierId });\r\n\r\n vm.getLicence = getLicence;\r\n vm.cancelEdit = cancelEdit;\r\n vm.saveLicence = saveLicence;\r\n vm.viewHistory = viewHistory;\r\n vm.fetchLicences = fetchLicences;\r\n vm.createLicence = createLicence;\r\n vm.editLicenceStatus = editLicenceStatus;\r\n vm.editLicenceDetails = editLicenceDetails;\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'companyRegistrationNumber',\r\n label: 'Licence number',\r\n sort: true\r\n },\r\n {\r\n id: 'name',\r\n label: 'Licence name',\r\n sort: true\r\n },\r\n {\r\n id: 'effectiveFromDate',\r\n label: 'Effective from date',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n id: 'status',\r\n label: 'Licence status',\r\n sort: true,\r\n sortId: 'statusId'\r\n },\r\n {\r\n id: 'fitStatus',\r\n label: 'FIT status',\r\n sort: true,\r\n sortId: 'fitStatusId'\r\n },\r\n {\r\n id: 'editDetailsButton',\r\n label: '',\r\n type: 'button',\r\n button: {\r\n text: 'Edit',\r\n type: 'btn btn-secondary',\r\n onClick: editLicenceDetails\r\n },\r\n permissions: ['FitGroup', 'LevelisationGroup', 'ExternalSuperuser']\r\n },\r\n {\r\n id: 'editStatusButton',\r\n label: '',\r\n type: 'button',\r\n button: {\r\n text: 'Update status',\r\n type: 'btn btn-secondary',\r\n onClick: editLicenceStatus\r\n },\r\n permissions: 'LevelisationGroup'\r\n },\r\n {\r\n id: 'viewHistoryButton',\r\n label: '',\r\n type: 'button',\r\n button: {\r\n text: 'History',\r\n type: 'btn btn-secondary',\r\n onClick: viewHistory\r\n },\r\n permissions: 'Internal'\r\n }\r\n ];\r\n\r\n function fetchLicences() {\r\n return dataService.fetchDataFromEndpointWithParams('licences', { supplierId: vm.supplierId }).then(function (licences) {\r\n return { pageCount: 1, data: licences };\r\n });\r\n }\r\n\r\n function viewHistory(licence) {\r\n $state.go('licence/history', { id: licence.id, name: licence.name, returnState: vm.returnState });\r\n }\r\n\r\n function createLicence() {\r\n vm.licenceToEdit = { supplierId: vm.supplierId };\r\n vm.licenceFormFields = licenceFormFields();\r\n vm.editing = true;\r\n }\r\n\r\n function editLicenceDetails(licence) {\r\n vm.licenceToEdit = licence;\r\n vm.licenceFormFields = licenceFormFields();\r\n vm.editing = true;\r\n }\r\n\r\n function getLicence() {\r\n var copy = angular.copy(vm.licenceToEdit);\r\n if (angular.isDefined(vm.licenceToEdit.effectiveFromDate)) {\r\n copy.effectiveFromDate = new Date(vm.licenceToEdit.effectiveFromDate);\r\n }\r\n return copy;\r\n }\r\n\r\n function cancelEdit() {\r\n vm.editing = false;\r\n }\r\n\r\n function saveLicence(licence) {\r\n return licenceService.save(licence).then(function () {\r\n reload();\r\n });\r\n }\r\n\r\n function editLicenceStatus(licence) {\r\n\r\n $uibModal.open({\r\n controller: 'LicenceModalController',\r\n controllerAs: 'vm',\r\n templateUrl: 'app/suppliers/view/licence/licence-modal.html',\r\n resolve: {\r\n licence: function () {\r\n return licence;\r\n }\r\n }\r\n }).result.then(reload);\r\n }\r\n\r\n function reload() {\r\n $state.reload();\r\n }\r\n\r\n function licenceFormFields() {\r\n var isCreating = angular.isUndefined(vm.licenceToEdit.id);\r\n\r\n var registrationNumberField = {\r\n className: isCreating ? 'col-md-3' : 'col-md-4',\r\n key: 'companyRegistrationNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Licence number',\r\n required: true,\r\n maxLength: 256\r\n }\r\n };\r\n var statusField = {\r\n className: 'col-md-4',\r\n key: 'status',\r\n type: 'fitStatic',\r\n templateOptions: {\r\n label: 'Current Status'\r\n }\r\n };\r\n var fitStatusField = {\r\n className: 'col-md-4',\r\n key: 'fitStatus',\r\n type: 'fitStatic',\r\n templateOptions: {\r\n label: 'Current Status'\r\n }\r\n };\r\n var nameField = {\r\n className: isCreating ? 'col-md-3' : 'col-md-4',\r\n key: 'name',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Licence Name',\r\n required: true,\r\n maxLength: 256\r\n }\r\n };\r\n var dateField = {\r\n className: isCreating ? 'col-md-3' : 'col-md-4',\r\n key: 'effectiveFromDate',\r\n type: 'fitDatePicker',\r\n templateOptions: {\r\n label: 'Effective From Date',\r\n required: true\r\n }\r\n };\r\n var typeField = {\r\n className: 'col-md-3',\r\n key: 'type',\r\n type: 'fitCheckbox',\r\n templateOptions: {\r\n label: 'I confirm this is a GB Licence',\r\n required: true\r\n }\r\n };\r\n\r\n return isCreating\r\n ? [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n registrationNumberField,\r\n nameField,\r\n dateField,\r\n typeField\r\n ]\r\n }]\r\n : [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n registrationNumberField,\r\n statusField,\r\n fitStatusField\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n nameField,\r\n dateField\r\n ]\r\n }];\r\n }\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.suppliers')\r\n .controller('SupplierController', SupplierController);\r\n \r\n function SupplierController($stateParams, $log, dataService, documentsService, suppliersService, dialogService, $state, dataLayoutService) {\r\n var vm = this;\r\n vm.supplier = null;\r\n vm.supplierFormFields = [];\r\n vm.loading = false;\r\n vm.editing = false;\r\n vm.error = '';\r\n vm.getSupplier = getSupplier;\r\n vm.editSupplier = editSupplier;\r\n vm.cancelEdit = cancelEdit;\r\n vm.saveSupplier = saveSupplier;\r\n vm.viewAuthLetter = viewAuthLetter;\r\n vm.confirmRejection = confirmRejection;\r\n vm.confirmApproval = confirmApproval;\r\n vm.returnState = $state.href($state.current);\r\n vm.supplierLayout = dataLayoutService.getLayout('supplier');\r\n loadSupplier();\r\n\r\n vm.formOptions = {\r\n includeAddressFields: true,\r\n disableButtonIfPristine: true\r\n };\r\n \r\n function loadSupplier() {\r\n vm.loading = true;\r\n vm.supplier = null;\r\n dataService.fetchDataFromEndpointById('suppliers', $stateParams.supplierId).then(setSupplier, displayError);\r\n }\r\n\r\n function setSupplier(supplierData) {\r\n vm.loading = false;\r\n vm.supplier = supplierData;\r\n }\r\n\r\n function getSupplier() {\r\n return angular.copy(vm.supplier);\r\n }\r\n\r\n function editSupplier() {\r\n vm.editing = true;\r\n vm.supplierFormFields = supplierFormFields();\r\n }\r\n\r\n function cancelEdit() {\r\n vm.editing = false;\r\n }\r\n\r\n function saveSupplier(supplier) {\r\n return suppliersService.update($stateParams.supplierId, supplier).then(updateSupplier);\r\n\r\n function updateSupplier() {\r\n vm.editing = false;\r\n loadSupplier();\r\n }\r\n }\r\n\r\n function viewAuthLetter() {\r\n documentsService.openDocument(vm.supplier.authorisationLetterId);\r\n }\r\n\r\n function confirmApproval() {\r\n var options = {\r\n title: 'Approve supplier account',\r\n message: 'By selecting \\'Confirm\\' you are confirming that you have reviewed the ' +\r\n 'authorisation letter and carried out the necessary checks to allow this licensed electricity supplier access to the CFR. ' +\r\n 'Please select \\'Cancel\\', if you do not wish to proceed.'\r\n };\r\n \r\n dialogService.showDialog(options).then(approve);\r\n }\r\n\r\n function approve() {\r\n vm.loading = true;\r\n suppliersService.approve($stateParams.supplierId).then(updateStatus, displayError);\r\n }\r\n\r\n function updateStatus() {\r\n vm.loading = false;\r\n vm.supplier.status = 'Approved';\r\n vm.loading = false;\r\n }\r\n\r\n function confirmRejection() {\r\n var options = {\r\n title: 'Reject supplier account',\r\n message: 'By selecting \\'Confirm\\' you will reject this request for an account on the CFR. '\r\n + 'Please note that once you have pressed \\'Confirm\\' all details for this organisation will be permanently removed from CFR. '\r\n + 'Please select \\'Cancel\\', if you do not wish to proceed.'\r\n };\r\n dialogService.showDialog(options).then(reject);\r\n }\r\n\r\n function reject() {\r\n vm.loading = true;\r\n suppliersService.reject($stateParams.supplierId).then(returnToSuppliers, displayError);\r\n }\r\n\r\n function returnToSuppliers() {\r\n $state.go('suppliers');\r\n }\r\n\r\n function displayError(response) {\r\n vm.loading = false;\r\n vm.error = 'There was an error communicating with the server. Please try again later.';\r\n $log.warn('API request failed:', response);\r\n }\r\n \r\n function supplierFormFields() {\r\n return [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-12',\r\n key: 'displayId',\r\n type: 'fitStatic',\r\n templateOptions: {\r\n label: 'Organisation Reference'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-3',\r\n key: 'notificationEmailAddress',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: true,\r\n type: 'email',\r\n maxlength: 250,\r\n label: 'Notification Email Address'\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'name',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Company Name',\r\n maxlength: 60,\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'telephoneNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Telephone Number',\r\n maxlength: 30,\r\n required: false\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'faxNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Fax Number',\r\n required: false,\r\n maxlength: 30\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffCreateController', TariffCreateController);\r\n\r\n function TariffCreateController($state, $stateParams, $filter, constants, tariffService, $uibModal, moment, $log, formErrorService) {\r\n var vm = this;\r\n vm.tariffsSelectedForCopy = [];\r\n vm.tariffs = [];\r\n vm.availableInstallTypes = [];\r\n vm.availableTechTypes = [];\r\n vm.availableCompReviewTypes = [];\r\n populateModel();\r\n vm.eligibleDate = null;\r\n vm.comments = null;\r\n vm.rowErrors = [];\r\n vm.rowErrorKeys = null;\r\n vm.processing = false;\r\n\r\n vm.eligibleDatePickerIsOpen = false;\r\n\r\n vm.eligibleDatePickerOpen = function () { vm.eligibleDatePickerIsOpen = true; };\r\n\r\n vm.datepickerOptions = {\r\n minDate: null\r\n };\r\n\r\n vm.timepickerOptions = {\r\n 'show-meridian': false,\r\n 'show-seconds': true\r\n };\r\n\r\n vm.minDateValidationMessage = null;\r\n\r\n function populateModel() {\r\n vm.processing = true;\r\n var filter = {\r\n id: $stateParams.ids,\r\n pageNumber: 1,\r\n pageSize: $stateParams.ids.length // to get all tariffs\r\n };\r\n tariffService.getAll(filter)\r\n .then(function (tariffs) {\r\n vm.tariffs = tariffs.data;\r\n angular.forEach(vm.tariffs,\r\n function (item) {\r\n item.oldTariff = angular.copy(item);\r\n });\r\n vm.processing = false;\r\n vm.datepickerOptions.minDate = getThresholdDate(vm.tariffs);\r\n var thresholdDate = $filter('date')(vm.datepickerOptions.minDate, 'dd/MM/yyyy HH:mm:ss');\r\n vm.minDateValidationMessage = 'Please enter a date in format dd/MM/yyyy HH:MM:SS not earlier than '\r\n + thresholdDate;\r\n\r\n })\r\n .catch(function (response) {\r\n vm.processing = false;\r\n vm.error = 'There was an error connecting to the server. Please try again later.';\r\n $log.warn('API request failed:', response);\r\n });\r\n }\r\n\r\n function getThresholdDate(tariffs) {\r\n // the date selected should be not before 10 days in past and not before all of the selected tariffs' eligibility date \r\n // the threshold date is hence the latest date of the two dates.\r\n var thresholdDate = new Date(moment(new Date()).startOf('day').add(-constants.fitConstants.tariffEligibleFromMaximumDaysInPast, 'days'));\r\n var dates = [];\r\n angular.forEach(tariffs,function(item) {\r\n dates.push(new Date(item.eligibleFrom));\r\n });\r\n var maxOldTariffDate = Math.max.apply(null, dates);\r\n return thresholdDate >= maxOldTariffDate ? thresholdDate : maxOldTariffDate;\r\n }\r\n\r\n vm.eligibleDateChanged = function() {\r\n if (vm.eligibleDate) {\r\n updateEligiblityDates();\r\n }\r\n };\r\n\r\n function updateEligiblityDates() {\r\n // the date selected is the end date/eligibleTo for the old tariffs\r\n // and the eligibleFrom date for the new tariffs.\r\n // the eligibleTo date of the old tariff will be one second before the date selected\r\n var parsedEligibleFromDate = vm.eligibleDate;\r\n var parsedEligibleToDate = new Date(constants.fitConstants.newTariffEligibleToDate);\r\n var parsedEligibleToDateOldTariff = new Date(moment(vm.eligibleDate).add(-1, 'seconds'));\r\n \r\n angular.forEach(vm.tariffs,\r\n function (item) {\r\n item.eligibleFrom = parsedEligibleFromDate;\r\n item.eligibleTo = parsedEligibleToDate;\r\n item.oldTariff.eligibleTo = parsedEligibleToDateOldTariff;\r\n item.tariffCode = tariffService.generateTariffCode(item);\r\n });\r\n }\r\n\r\n vm.editTariff = function (tariff, index) {\r\n $uibModal.open({\r\n templateUrl: 'app/tariff/create/tariff-edit-item.html',\r\n controller: 'TariffEditItemController',\r\n controllerAs: 'vm',\r\n windowClass: 'wide-modal-window',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n model: function () {\r\n return {\r\n tariff: tariff\r\n };\r\n }\r\n }\r\n })\r\n .result.then(function (updatedTariff) {\r\n vm.tariffs[index] = updatedTariff;\r\n });\r\n };\r\n\r\n \r\n vm.copyTariff = function (tariff) {\r\n var copiedTariff = angular.copy(tariff);\r\n vm.tariffs.push(copiedTariff);\r\n };\r\n\r\n vm.removeTariff = function (index) {\r\n vm.tariffs.splice(index, 1);\r\n };\r\n\r\n vm.rowHasError = function (index) {\r\n if (vm.rowErrorKeys) {\r\n var errors = vm.rowErrorKeys;\r\n var rowError = 'newTariffs[' + index + '].NewTariffs';\r\n var rowTariffCodeError = 'newTariffs[' + index + '].NewTariffs.TariffCode';\r\n return errors.indexOf(rowError) !== -1 || errors.indexOf(rowTariffCodeError) !== -1;\r\n }\r\n return false;\r\n };\r\n\r\n vm.onSubmit = function () {\r\n vm.rowErrors = [];\r\n vm.error = null;\r\n vm.processing = true;\r\n\r\n var model = {\r\n eligibilityDate: vm.eligibleDate,\r\n comments: vm.comments,\r\n newTariffs: vm.tariffs,\r\n selectedTariffIds: $stateParams.ids\r\n };\r\n\r\n tariffService.createTariffs(model)\r\n .then(function () {\r\n vm.processing = false;\r\n $state.go('tariff');\r\n })\r\n .catch(function (response) {\r\n var modelState = response.data.modelState;\r\n if (modelState) {\r\n vm.rowErrors = formErrorService.extractAllErrors(response);\r\n vm.rowErrorKeys = formErrorService.getErrorKeys(response);\r\n } else {\r\n vm.error = 'There was an error connecting to the server. Please try again later';\r\n }\r\n vm.processing = false;\r\n\r\n $log.warn('API request failed:', response);\r\n });\r\n };\r\n\r\n vm.cancel = function () {\r\n $state.go('tariff');\r\n };\r\n\r\n vm.removeErrors = function () {\r\n vm.rowErrors = null;\r\n vm.rowErrorKeys = null;\r\n };\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffEditItemController', TariffEditItemController);\r\n\r\n function TariffEditItemController(model, $uibModalInstance, moment, constants, constantUtils, arrayUtils, tariffRulesService) {\r\n var vm = this;\r\n\r\n vm.error = false;\r\n vm.errorString = null;\r\n vm.availableTechTypes = [];\r\n vm.availableInstallTypes = [];\r\n vm.availableCompReviewLevelTypes = [];\r\n vm.capacityRegexPattern = '^[0-9]*(?:\\\\.[0-9]{0,3})?$';\r\n vm.options = {};\r\n\r\n loadSelectOptions();\r\n\r\n function loadSelectOptions() {\r\n vm.availableTechTypes = constants.technologyTypes;\r\n var photoVoltaic = constantUtils.findConstantValue(vm.availableTechTypes, 'Photovoltaic');\r\n\r\n /* we enable the install type options only if photovoltaic\r\n * we enable the compreviewlevel type options only if photovoltaic and capacity is low.\r\n * the available install types should be of lowCapacityInstallTypes if capacity is low and photovoltaic\r\n * the available install types should be of highCapacityInstallTypes types if capacity is high and photovoltaic\r\n * the available install types should be all install types with N/A chosen if NOT photovoltaic and disabled selection.\r\n */\r\n\r\n var isPhotovoltaic = model.tariff.technologyTypeId === photoVoltaic;\r\n var isLowCapacityPvForCompReviewLevelTypes = isPhotovoltaic && tariffRulesService.isLowCapacityPvForCompReviewLevelTypes(model.tariff.maxCapacity);\r\n var isLowCapacityPvForInstallTypes = isPhotovoltaic && tariffRulesService.isLowCapacityPvForInstallTypes(model.tariff.maxCapacity);\r\n var selectOptionsModel = tariffRulesService.selectOptionsModel(isLowCapacityPvForCompReviewLevelTypes, isLowCapacityPvForInstallTypes, isPhotovoltaic);\r\n vm.availableInstallTypes = selectOptionsModel.availableInstallTypes;\r\n vm.availableCompReviewLevelTypes = selectOptionsModel.availableCompReviewLevelTypes;\r\n\r\n vm.options = {\r\n formState: {\r\n isPhotovoltaic: isPhotovoltaic,\r\n isLowCapacityPvForCompReviewLevelTypes: isLowCapacityPvForCompReviewLevelTypes,\r\n isLowCapacityPvForInstallTypes: isLowCapacityPvForInstallTypes\r\n }\r\n };\r\n }\r\n\r\n vm.loadModel = function () {\r\n var tariff = angular.copy(model.tariff);\r\n tariff.parsedEligibleTo = moment(tariff.eligibleTo).format('DD/MM/YYYY HH:mm:ss');\r\n tariff.parsedEligibleFrom = moment(tariff.eligibleFrom).format('DD/MM/YYYY HH:mm:ss');\r\n parseToDefaultValues(tariff);\r\n return tariff;\r\n };\r\n\r\n function parseToDefaultValues(tariff) {\r\n /*\r\n * When selectionoptions is disabled then set comptype and installType to N/A \r\n */\r\n if (!vm.options.formState.isLowCapacityPvForCompReviewLevelTypes) {\r\n tariff.comprehensiveReviewLevelTypeId = constantUtils.findConstantValue(constants.compReviewLevelTypes, 'NonApplicable');\r\n }\r\n if (!vm.options.formState.isPhotovoltaic) {\r\n tariff.installTypeId = constantUtils.findConstantValue(constants.photovoltaicInstallTypes, 'NonApplicable');\r\n }\r\n var installType = arrayUtils.findByProp(vm.availableInstallTypes, 'value', tariff.installTypeId);\r\n if (angular.isUndefined(installType)) {\r\n tariff.installTypeId = null;\r\n }\r\n var compType = arrayUtils.findByProp(vm.availableCompReviewLevelTypes, 'value', tariff.comprehensiveReviewLevelTypeId);\r\n if (angular.isUndefined(compType)) {\r\n tariff.comprehensiveReviewLevelTypeId = null;\r\n }\r\n }\r\n \r\n vm.onSubmit = function (tariff) {\r\n tariff.compReviewLevelTypeName = constantUtils.findConstantName(constants.compReviewLevelTypes, tariff.comprehensiveReviewLevelTypeId);\r\n tariff.installTypeName = constantUtils.findConstantName(constants.photovoltaicInstallTypes, tariff.installTypeId);\r\n $uibModalInstance.close(tariff);\r\n };\r\n\r\n vm.cancelEdit = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'tariffCode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: true,\r\n label: 'Tariff code'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'technologyTypeId',\r\n type: 'fitSelect',\r\n defaultValue: 'technologyType',\r\n templateOptions: {\r\n label: 'Technology type',\r\n valueProp: 'value',\r\n labelProp: 'name',\r\n disabled: true,\r\n options: vm.availableTechTypes\r\n }\r\n }\r\n \r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'minCapacity',\r\n type: 'fitInput',\r\n extras: { validateOnModelChange: true },\r\n optionsTypes: ['fitRegexValidator'],\r\n validators: {\r\n comparisonValidator: function ($viewValue, $modelValue, scope) {\r\n var value = $modelValue || $viewValue;\r\n if (value && scope.model.maxCapacity) {\r\n return parseFloat(value) <= parseFloat(scope.model.maxCapacity);\r\n }\r\n return true;\r\n }\r\n },\r\n templateOptions: {\r\n required: true,\r\n label: 'Min capacity (kW)',\r\n comparisonValidatorValidationMessage: 'Please specify a value less than or equal to the max capacity',\r\n pattern: vm.capacityRegexPattern,\r\n patternValidationMessage: 'Please specify a value upto 3 decimal places'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'maxCapacity',\r\n type: 'fitInput',\r\n optionsTypes: ['fitRegexValidator'],\r\n extras: { validateOnModelChange: true },\r\n validators: {\r\n comparisonValidator: function ($viewValue, $modelValue, scope) {\r\n var value = $modelValue || $viewValue;\r\n if (value && scope.model.minCapacity) {\r\n return parseFloat(value) >= parseFloat(scope.model.minCapacity);\r\n }\r\n return true;\r\n }\r\n },\r\n templateOptions: {\r\n label: 'Max capacity (kW)',\r\n comparisonValidatorValidationMessage: 'Please specify a value greater than or equal to the min capacity',\r\n pattern: vm.capacityRegexPattern,\r\n patternValidationMessage: 'Please specify a value upto 3 decimal places'\r\n },\r\n watcher: {\r\n listener: function ($viewValue, $modelValue) {\r\n var value = $modelValue || $viewValue;\r\n //watcher to set formState values depending on the user typing low/high capacities\r\n //this will trigger change in select options\r\n if (vm.options.formState.isPhotovoltaic) {\r\n vm.options.formState.isLowCapacityPvForInstallTypes = tariffRulesService.isLowCapacityPvForInstallTypes(value);\r\n vm.options.formState.isLowCapacityPvForCompReviewLevelTypes = tariffRulesService.isLowCapacityPvForCompReviewLevelTypes(value);\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'comprehensiveReviewLevelTypeId',\r\n type: 'fitSelect',\r\n defaultValue: 'comprehensiveReviewLevelTypeId',\r\n templateOptions: {\r\n label: 'PV tariff level',\r\n valueProp: 'value',\r\n labelProp: 'name',\r\n options: vm.availableCompReviewLevelTypes,\r\n required: true\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function () { return !vm.options.formState.isLowCapacityPvForCompReviewLevelTypes; },\r\n 'templateOptions.options': function ($viewValue, $modelValue, scope) {\r\n // the options should change when formState changes due to user typing high/low tariff capacity\r\n scope.model.comprehensiveReviewLevelTypeId = vm.options.formState.isLowCapacityPvForCompReviewLevelTypes\r\n ? scope.model.comprehensiveReviewLevelTypeId\r\n : constantUtils.findConstantValue(constants.compReviewLevelTypes, 'NonApplicable');\r\n return tariffRulesService.availableCompReviewLevelTypes(vm.options.formState.isLowCapacityPvForCompReviewLevelTypes);\r\n }\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'installTypeId',\r\n type: 'fitSelect',\r\n defaultValue: 'installType',\r\n templateOptions: {\r\n label: 'PV install type',\r\n valueProp: 'value',\r\n labelProp: 'name',\r\n required: true,\r\n options: vm.availableInstallTypes\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': function() { return !vm.options.formState.isPhotovoltaic; },\r\n 'templateOptions.options': function () {\r\n // the options should change when formState changes due to user typing high/low tariff capacity\r\n return tariffRulesService.availableInstallTypes(vm.options.formState.isLowCapacityPvForInstallTypes, vm.options.formState.isPhotovoltaic);\r\n }\r\n }\r\n }\r\n \r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'parsedEligibleFrom',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n required: true,\r\n label: 'Eligible from'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'parsedEligibleTo',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'Eligible to'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'tariffValue',\r\n type: 'fitInput',\r\n optionsTypes: ['fitFourDecimalPlacesValidator', 'fitMaxDecimalValueValidator'],\r\n templateOptions: {\r\n required: true,\r\n label: 'Tariff',\r\n patternValidationMessage: 'Please specify a value upto 4 decimal places',\r\n maxDecimalValueValidationMessage: 'Please specify a tariff value not greater than ' + constants.fitConstants.maximumTariffValue,\r\n maxValue: constants.fitConstants.maximumTariffValue\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'description',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n required: true,\r\n label: 'Description',\r\n maxlength: 256,\r\n rows: 2\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffRpiController', TariffRpiController);\r\n\r\n\r\n function TariffRpiController($uibModalInstance, $state, dialogService, model, tariffService, toastr) {\r\n var vm = this;\r\n vm.onSubmit = submit;\r\n vm.rpiRateRegexPattern = '^-?[0-9]*(?:\\\\.[0-9]{0,3})?$';\r\n\r\n function submit(submittedModel) {\r\n\r\n var parsedSubmittedModel = {\r\n rpiRate: submittedModel.rpiRate,\r\n tariffFilter: model.tariffFilter\r\n };\r\n\r\n return tariffService.submitRpiRequest(parsedSubmittedModel)\r\n .then(notifyRpiApplied);\r\n }\r\n\r\n function notifyRpiApplied() {\r\n $uibModalInstance.close();\r\n toastr.success('RPI request submitted successfully');\r\n }\r\n\r\n vm.loadModel = function() {\r\n return {\r\n rpiRate: null\r\n };\r\n };\r\n\r\n vm.cancelSubmit = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n \r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-6 very-narrow-field',\r\n key: 'rpiRate',\r\n type: 'fitInput',\r\n optionsTypes: ['fitRegexValidator'],\r\n templateOptions: {\r\n label: 'RPI Rate',\r\n required: true,\r\n pattern: vm.rpiRateRegexPattern,\r\n patternValidationMessage: 'Please specify a value up to 3 decimal places'\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffController', TariffController);\r\n\r\n\r\n function TariffController(tariffService, $filter, $uibModal, $state, dialogService, moment, $log, constants, paginatedDataService) {\r\n var vm = this;\r\n vm.title = 'tariff';\r\n vm.tariffs = [];\r\n vm.numericRegex = '^(([0-9]*)|(([0-9]*)\\\\.([0-9]*)))$';\r\n vm.technologyType = null;\r\n vm.installType = null;\r\n vm.minCapacity = null;\r\n vm.maxCapacity = null;\r\n vm.eligibleFrom = null;\r\n vm.eligibleTo = null;\r\n vm.tariffCode = null;\r\n vm.processing = false;\r\n vm.showAmendmentActionButtons = false;\r\n vm.amendmentsCountText = null;\r\n vm.showCurrentOnly = false;\r\n vm.showPendingOnly = false;\r\n vm.enableCopyTariffsBtn = false;\r\n vm.selectedTariffsForCopy = [];\r\n vm.returnState = $state.href($state.current);\r\n vm.applyRpi = applyRpi;\r\n\r\n function toggleCopyTariffsBtn(isSelected, tariffId) {\r\n if (isSelected === true) {\r\n vm.selectedTariffsForCopy.push(tariffId);\r\n } else {\r\n var index = vm.selectedTariffsForCopy.indexOf(tariffId);\r\n if (index !== '-1') {\r\n vm.selectedTariffsForCopy.splice(index, 1);\r\n }\r\n }\r\n vm.enableCopyTariffsBtn = vm.selectedTariffsForCopy.length > 0;\r\n }\r\n\r\n vm.availableTechTypes = [{ id: null, name: 'Please select' }];\r\n\r\n vm.availableInstallTypes = [{ id: null, name: 'Please select' }];\r\n\r\n vm.getCsvData = function () {\r\n var params = vm.cachedRequestParams;\r\n params.pageNumber = 1;\r\n params.pageSize = 10000; // BK todo move to download service\r\n\r\n return paginatedDataService\r\n .fetchDataFromParams('tariffs', vm.cachedRequestParams)\r\n .then(function (response) {\r\n angular.forEach(response.data,\r\n function (item) {\r\n if (item.capacityReachedDate) {\r\n item.capacityReachedCsvFormat = moment(item.capacityReachedDate).format('DD/MM/YYYY (HH:mm:ss)');\r\n }\r\n item.eligibleToCsvFormat = moment(item.eligibleTo).format('DD/MM/YYYY');\r\n item.eligibleFromCsvFormat = moment(item.eligibleFrom).format('DD/MM/YYYY');\r\n });\r\n return response.data;\r\n });\r\n };\r\n\r\n vm.csvColumns = [\r\n 'tariffCode', 'technologyTypeName', 'installTypeName', 'compReviewLevelTypeName', 'minCapacity',\r\n 'maxCapacity', 'tariffValue',\r\n 'eligibleFromCsvFormat', 'eligibleToCsvFormat', 'capacityReachedCsvFormat', 'description'\r\n ];\r\n\r\n vm.csvHeaders = [\r\n 'Tariff code', 'Technology type', 'PV install type', 'PV tariff level', 'Min capacity', 'Max capacity',\r\n 'Tariff',\r\n 'Eligible from', 'Eligible to', 'Capacity reached date', 'Description'\r\n ];\r\n\r\n populateSelectOptionsWithDefaultValues();\r\n determineAmendmentActionButtonsVisibility();\r\n vm.error = false;\r\n\r\n function populateSelectOptionsWithDefaultValues() {\r\n vm.installType = vm.availableInstallTypes[0];\r\n vm.technologyType = vm.availableTechTypes[0];\r\n vm.showCurrentOnly = true;\r\n vm.showPendingOnly = false;\r\n vm.error = false;\r\n vm.availableInstallTypes = vm.availableInstallTypes.concat(constants.photovoltaicInstallTypes);\r\n vm.availableTechTypes = vm.availableTechTypes.concat(constants.technologyTypes);\r\n }\r\n\r\n function determineAmendmentActionButtonsVisibility() {\r\n tariffService.pendingAmendmentsCount()\r\n .then(function (result) {\r\n var amendmentsCount = result.data;\r\n vm.showAmendmentActionButtons = amendmentsCount > 0;\r\n if (vm.showAmendmentActionButtons) {\r\n vm.amendmentsCountText = amendmentsCount + ' pending amendment(s)';\r\n } else {\r\n vm.amendmentsCountText = null;\r\n }\r\n })\r\n .catch(function (response) {\r\n vm.processing = false;\r\n vm.error = true;\r\n $log.warn('API request failed:', response);\r\n });\r\n }\r\n\r\n vm.clearFilter = function () {\r\n vm.eligibleFrom = null;\r\n vm.eligibleTo = null;\r\n vm.showCurrentOnly = null;\r\n vm.showPendingOnly = null;\r\n };\r\n\r\n vm.pagination = {\r\n itemsPerPage: 100,\r\n displayedPages: 10\r\n };\r\n\r\n function applyRpi() {\r\n var currentSelection = vm.cachedRequestParams;\r\n $uibModal.open({\r\n templateUrl: 'app/tariff/tariff-rpi.html',\r\n controller: 'TariffRpiController',\r\n backdrop: 'static',\r\n keyboard: false,\r\n controllerAs: 'vm',\r\n resolve: {\r\n model: function () {\r\n return {\r\n tariffFilter: currentSelection\r\n };\r\n }\r\n }\r\n })\r\n .result.then(function () {\r\n refreshTariffs();\r\n });\r\n }\r\n\r\n vm.actionAmendments = function (action) {\r\n $uibModal.open({\r\n templateUrl: 'app/tariff/update/review/tariff-update-review.html',\r\n controller: 'TariffUpdateReviewController',\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n model: function () {\r\n return {\r\n method: action\r\n };\r\n }\r\n }\r\n })\r\n .result.then(function () {\r\n showConfirmationDialog(action);\r\n });\r\n };\r\n\r\n function showConfirmationDialog(action) {\r\n var confirmationMessage = action === 'approve' ? 'approved' : 'discarded';\r\n var options = {\r\n title: 'Tariff amendments',\r\n message: 'Tariff amendments sucessfully ' + confirmationMessage,\r\n buttons: {\r\n confirm: false,\r\n cancel: false\r\n }\r\n };\r\n dialogService.showDialog(options).finally(refreshTariffs);\r\n }\r\n\r\n function refreshTariffs() {\r\n $state.reload();\r\n }\r\n\r\n vm.redirectForCopyTariffs = function () {\r\n $state.go('tariffCreate', { 'ids': vm.selectedTariffsForCopy });\r\n };\r\n\r\n vm.fetchData = fetchData;\r\n vm.cachedRequestParams = null;\r\n\r\n function fetchData(tableData) {\r\n if (angular.isUndefined(tableData.sort.predicate)) {\r\n tableData.sort.predicate = 'technologyTypeName';\r\n }\r\n vm.cachedRequestParams = paginatedDataService.getParamsFromTableData(tableData);\r\n vm.cachedRequestParams.showCurrentOnly = vm.showCurrentOnly;\r\n return paginatedDataService.fetchDataFromParams('tariffs', vm.cachedRequestParams);\r\n }\r\n\r\n function viewHistory(tariff) {\r\n if (tariff.isPendingAmendment) {\r\n $state.go('tariffAmendHistory', { id: tariff.tariffAmendmentId, name: tariff.tariffCode, returnState: vm.returnState });\r\n } else {\r\n $state.go('tariffHistory', { id: tariff.tariffId, name: tariff.tariffCode, returnState: vm.returnState });\r\n }\r\n }\r\n\r\n function amendTariff(tariff) {\r\n $state.go('tariffUpdate', { id: tariff.tariffId });\r\n }\r\n\r\n vm.tableColumns = [\r\n {\r\n id: 'tariffCode',\r\n label: 'Tariff code',\r\n sort: true\r\n },\r\n {\r\n id: 'technologyTypeName',\r\n label: 'Technology type',\r\n sort: true\r\n },\r\n {\r\n id: 'installTypeName',\r\n label: 'PV install type',\r\n sort: true\r\n },\r\n {\r\n id: 'compReviewLevelTypeName',\r\n label: 'PV tariff level',\r\n sort: true\r\n },\r\n {\r\n id: 'minCapacity',\r\n label: 'Min capacity (kW)',\r\n sort: true\r\n },\r\n {\r\n id: 'maxCapacity',\r\n label: 'Max capacity (kW)',\r\n sort: true\r\n },\r\n {\r\n id: 'tariffChanges',\r\n label: 'Tariff',\r\n sort: true\r\n },\r\n {\r\n id: 'eligibleFrom',\r\n label: 'Eligible from',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n id: 'eligibleTo',\r\n label: 'Eligible to',\r\n type: 'date',\r\n sort: true\r\n },\r\n {\r\n id: 'capacityReachedDate',\r\n label: 'Capacity reached',\r\n type: 'dateTime'\r\n },\r\n {\r\n id: 'amendTariffBtn',\r\n label: 'Amend',\r\n type: 'button',\r\n button: {\r\n text: 'Amend',\r\n type: 'btn-default',\r\n onClick: amendTariff\r\n },\r\n permissions: ['TariffEditor']\r\n },\r\n {\r\n id: 'tariffHistoryBtn',\r\n label: 'History',\r\n type: 'button',\r\n button: {\r\n text: 'History',\r\n type: 'btn-default',\r\n icon: 'history',\r\n onClick: viewHistory\r\n }\r\n },\r\n {\r\n id: 'create',\r\n label: 'Select',\r\n onChange: function (data) {\r\n toggleCopyTariffsBtn(data.isChecked, data.tariffId);\r\n },\r\n hideWhen: 'isEligibleToCopy === false',\r\n type: 'checkbox',\r\n permissions: ['TariffEditor']\r\n },\r\n {\r\n id: 'description',\r\n label: 'Description',\r\n type: 'tooltip',\r\n tooltip: {\r\n icon: 'file-text'\r\n }\r\n }\r\n ];\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'tariff',\r\n config: {\r\n templateUrl: 'app/tariff/tariff.html',\r\n controller: 'TariffController',\r\n controllerAs: 'vm',\r\n title: 'Tariff',\r\n url: '/tariff',\r\n data: {\r\n permissions: {\r\n only: ['TariffGroup']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'tariffUpdate',\r\n config: {\r\n templateUrl: 'app/tariff/update/tariff-update.html',\r\n controller: 'TariffUpdateController',\r\n controllerAs: 'vm',\r\n title: 'Tariff Update',\r\n url: '/tariff/update/{id}',\r\n data: {\r\n permissions: {\r\n only: ['TariffGroup']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'tariffCreate',\r\n config: {\r\n templateUrl: 'app/tariff/create/tariff-create.html',\r\n controller: 'TariffCreateController',\r\n controllerAs: 'vm',\r\n params: {\r\n 'ids': '' \r\n },\r\n title: 'Tariff Create',\r\n url: '/tariff/create',\r\n data: {\r\n permissions: {\r\n only: ['TariffGroup']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'tariffAmendHistory',\r\n config: {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm',\r\n params: {\r\n returnState: null,\r\n entityType: 'TariffAmendment',\r\n endpoint: 'TariffAmendment'\r\n },\r\n title: 'Tariff amendment history',\r\n url: '/tariffAmendment/history/{id}/{name}',\r\n data: {\r\n permissions: {\r\n only: ['TariffGroup']\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'tariffHistory',\r\n config: {\r\n templateUrl: 'app/components/audit/audit.html',\r\n controller: 'AuditHistoryController',\r\n controllerAs: 'vm',\r\n params: {\r\n returnState: null,\r\n entityType: 'Tariff',\r\n endpoint: 'Tariff'\r\n },\r\n title: 'Tariff history',\r\n url: '/tariff/history/{id}/{name}',\r\n data: {\r\n permissions: {\r\n only: ['TariffGroup']\r\n }\r\n }\r\n }\r\n }\r\n \r\n ]);\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .factory('tariffService', tariffService);\r\n\r\n\r\n function tariffService($http, appConfig, $httpParamSerializer, dataService, moment, constants, constantUtils) {\r\n\r\n var service = {\r\n getAll: getTariffs,\r\n getById: getById,\r\n updateTariff: updateTariff,\r\n pendingAmendmentsCount: pendingAmendmentsCount,\r\n actionTariffAmendments: actionTariffAmendments,\r\n createTariffs: createTariffs,\r\n submitRpiRequest: submitRpiRequest,\r\n generateTariffCode: generateTariffCode\r\n };\r\n\r\n return service;\r\n\r\n function getTariffs(filter) {\r\n var urlparams = $httpParamSerializer(filter);\r\n var url = appConfig.apiRoot + 'tariffs?' + urlparams;\r\n return $http.get(url)\r\n .then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n\r\n function updateTariff(tariff) {\r\n var url = appConfig.apiRoot + 'tariffs/' + tariff.id;\r\n return $http.put(url, tariff).then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n\r\n function pendingAmendmentsCount() {\r\n var url = appConfig.apiRoot + 'tariffAmendments/count/';\r\n return $http.get(url).then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n\r\n function actionTariffAmendments(tariffAmendmentComments, method) {\r\n var url = appConfig.apiRoot + 'tariffAmendments/' + method + '/';\r\n return $http.put(url, tariffAmendmentComments).then(function (response) {\r\n return response;\r\n });\r\n }\r\n\r\n function createTariffs(model) {\r\n var url = appConfig.apiRoot + 'tariffs/create';\r\n return $http.post(url, model).then(function (response) {\r\n return response;\r\n });\r\n }\r\n\r\n function getById(tariffId) {\r\n var url = appConfig.apiRoot + 'tariffs/' + tariffId;\r\n return $http.get(url).then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n\r\n function submitRpiRequest(submitModel) {\r\n return dataService.postToEndpoint('tariffs/rpi/request', submitModel);\r\n }\r\n\r\n function generateTariffCode(tariff) {\r\n\r\n var installTypes = constants.photovoltaicInstallTypes;\r\n var isPhotovoltaic = tariff.technologyTypeId === constantUtils.findConstantValue(constants.technologyTypes, 'Photovoltaic');\r\n var hasCompReviewLevelType = tariff.comprehensiveReviewLevelTypeId !== constantUtils.findConstantValue(constants.compReviewLevelTypes, 'NonApplicable');\r\n var isStandAloneInstallType = tariff.installTypeId === constantUtils.findConstantValue(installTypes, 'Standalone');\r\n\r\n var config = {\r\n isPhotovoltaic: isPhotovoltaic,\r\n hasCompReviewLevelType: hasCompReviewLevelType,\r\n isStandAloneInstallType: isStandAloneInstallType,\r\n installTypes: installTypes\r\n };\r\n\r\n var timeInfo = getTimeInfoForTariffCode(tariff, config);\r\n var capacityInfo = getCapacityInfo(tariff, config);\r\n var technologyInfo = getTechnologyInfo(tariff, config);\r\n\r\n return technologyInfo + capacityInfo + timeInfo;\r\n }\r\n\r\n function getCapacityInfo(tariff, config) {\r\n\r\n if (config.isPhotovoltaic && config.isStandAloneInstallType) {\r\n return '';\r\n }\r\n\r\n var parsedMinCapacity = tariff.minCapacity;\r\n var parsedMaxCpacity = tariff.maxCapacity;\r\n\r\n\r\n if (angular.isUndefined(parsedMaxCpacity) || parsedMaxCpacity === null) {\r\n parsedMaxCpacity = '5M';\r\n }\r\n\r\n if (parsedMinCapacity >= 1000) {\r\n parsedMinCapacity = roundToOneDecimalPlace(parsedMinCapacity / 1000) + 'M';\r\n }\r\n\r\n else if (parsedMinCapacity < 1000) {\r\n parsedMinCapacity = roundToOneDecimalPlace(parsedMinCapacity);\r\n }\r\n\r\n if (parsedMaxCpacity >= 1000) {\r\n parsedMaxCpacity = roundToOneDecimalPlace(parsedMaxCpacity / 1000) + 'M';\r\n }\r\n\r\n else if (parsedMaxCpacity < 1000) {\r\n parsedMaxCpacity = roundToOneDecimalPlace(parsedMaxCpacity);\r\n }\r\n\r\n return '/' + parsedMinCapacity + '-' + parsedMaxCpacity;\r\n }\r\n\r\n function roundToOneDecimalPlace(input) {\r\n // this rounds to one decimal place \r\n // 10.260 becomes 10.3\r\n // 10.001 becomes 10\r\n // this is specific to tariff code rules\r\n // (10.001).toFixed(1) returns 10.0\r\n return Math.round(input * 10) / 10;\r\n }\r\n\r\n function getTechnologyInfo(tariff, config) {\r\n\r\n var technologyId = tariff.technologyTypeId;\r\n var technologyInfo = constantUtils.findConstantAbbrv(constants.technologyTypes, technologyId);\r\n\r\n var installTypeInfo = '';\r\n\r\n var applyInstallType = tariff.installTypeId === constantUtils.findConstantValue(config.installTypes, 'Retrofit')\r\n || tariff.installTypeId === constantUtils.findConstantValue(config.installTypes, 'NewBuild');\r\n\r\n if (config.isPhotovoltaic) {\r\n\r\n if (applyInstallType) {\r\n installTypeInfo = '-' + constantUtils.findConstantAbbrv(config.installTypes, tariff.installTypeId);\r\n }\r\n\r\n else if (config.isStandAloneInstallType) {\r\n installTypeInfo = '/' + constantUtils.findConstantAbbrv(config.installTypes, tariff.installTypeId);\r\n }\r\n }\r\n\r\n return technologyInfo + installTypeInfo;\r\n }\r\n\r\n function getTimeInfoForTariffCode(tariff, config) {\r\n\r\n var parsedDate = moment(tariff.eligibleFrom, 'YYYY/MM/DD');\r\n var month = parsedDate.format('M');\r\n var selectedYear = parsedDate.format('YYYY');\r\n var thresholdYear = month <= 3 ? 2010 : 2009; //TODO read 2009 from constants\r\n var tariffYear = selectedYear - thresholdYear;\r\n\r\n var quarter = getQuarter(month);\r\n if (tariffYear < 10) {\r\n tariffYear = '0' + tariffYear;\r\n }\r\n var compType = '';\r\n if (config.isPhotovoltaic && config.hasCompReviewLevelType && !config.isStandAloneInstallType) {\r\n compType = constantUtils.findConstantAbbrv(constants.compReviewLevelTypes, tariff.comprehensiveReviewLevelTypeId);\r\n }\r\n return '/' + tariffYear + compType + '-' + quarter;\r\n }\r\n\r\n function getQuarter(month) {\r\n\r\n if (month <= 3) {\r\n return 4;\r\n }\r\n if (month <= 6) {\r\n return 1;\r\n }\r\n if (month <= 9) {\r\n return 2;\r\n }\r\n\r\n return 3;\r\n }\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .factory('tariffRulesService', tariffRulesService);\r\n\r\n\r\n function tariffRulesService(constants) {\r\n\r\n var service = {\r\n availableInstallTypes: availableTariffInstallTypes,\r\n availableCompReviewLevelTypes: availableTariffCompReviewLevelTypes,\r\n isLowCapacityPvForCompReviewLevelTypes: isLowCapacityPvForCompReviewLevelTypes,\r\n isLowCapacityPvForInstallTypes: isLowCapacityPvForInstallTypes,\r\n selectOptionsModel: selectOptionsModel\r\n };\r\n\r\n return service;\r\n\r\n function availableTariffInstallTypes(isPhotovoltaicWithLowCapacity, isPhotovoltaic) {\r\n if (isPhotovoltaicWithLowCapacity) {\r\n return constants.lowCapacityPvInstallTypes;\r\n }\r\n else if (isPhotovoltaic) {\r\n return constants.highCapacityPvInstallTypes;\r\n }\r\n return constants.photovoltaicInstallTypes;\r\n }\r\n\r\n function availableTariffCompReviewLevelTypes(isPhotovoltaicWithLowCapacity) {\r\n if (isPhotovoltaicWithLowCapacity) {\r\n return constants.lowCapacityPvTariffCompReviewLevelTypes;\r\n }\r\n return constants.compReviewLevelTypes;\r\n }\r\n\r\n function selectOptionsModel(isLowCapacityPvCompReviewLevelTypes, isLowCapacityPvInstallTypes, isPhotovoltaic) {\r\n var availableInstallTypes = availableTariffInstallTypes(isLowCapacityPvInstallTypes, isPhotovoltaic);\r\n var availableCompReviewLevelTypes = availableTariffCompReviewLevelTypes(isLowCapacityPvCompReviewLevelTypes);\r\n\r\n return {\r\n availableInstallTypes: availableInstallTypes,\r\n availableCompReviewLevelTypes: availableCompReviewLevelTypes\r\n };\r\n }\r\n \r\n function isLowCapacityPvForCompReviewLevelTypes(value) {\r\n return value <= constants.fitConstants.comprehensiveReviewCapacityCutoff;\r\n }\r\n\r\n function isLowCapacityPvForInstallTypes(value) {\r\n return value <= constants.fitConstants.pvCapacityTypeCutoff;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffUpdateReviewController', TariffUpdateReviewController);\r\n\r\n\r\n function TariffUpdateReviewController(tariffService, $state, $uibModalInstance, model) {\r\n var vm = this;\r\n vm.method = null;\r\n vm.title = null;\r\n vm.loadModel = loadModel;\r\n populateModel();\r\n\r\n function populateModel() {\r\n vm.method = model.method;\r\n if (vm.method === 'approve') {\r\n vm.title = 'Approve tariff amendments';\r\n } else {\r\n vm.title = 'Discard tariff amendments';\r\n }\r\n }\r\n\r\n function loadModel() {\r\n return {\r\n comments: null\r\n };\r\n }\r\n\r\n vm.cancelSubmit = function() {\r\n $uibModalInstance.dismiss();\r\n };\r\n \r\n vm.onSubmit = function (submittedModel) {\r\n return tariffService.actionTariffAmendments(submittedModel, vm.method)\r\n .then(function () {\r\n $uibModalInstance.close();\r\n });\r\n };\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-10',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comment',\r\n required: true,\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }\r\n\r\n ]\r\n }\r\n\r\n ];\r\n }\r\n\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffUpdateCancelController', TariffUpdateCancelController);\r\n \r\n function TariffUpdateCancelController($uibModalInstance, $state) {\r\n var vm = this;\r\n\r\n vm.submit = function() {\r\n $uibModalInstance.close();\r\n $state.go('tariff');\r\n };\r\n\r\n vm.cancel = function() {\r\n $uibModalInstance.close();\r\n };\r\n }\r\n\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.tariff')\r\n .controller('TariffUpdateController', TariffUpdateController);\r\n\r\n\r\n function TariffUpdateController(tariffService, $state, constants, $stateParams, $uibModal, $log, moment) {\r\n var vm = this;\r\n vm.id = $stateParams.id;\r\n vm.processing = false;\r\n vm.hasError = false;\r\n vm.tariffAmended = false;\r\n vm.returnState = $state.href($state.current);\r\n vm.tariffModel = {};\r\n\r\n function parseDates(tariffModel) {\r\n if (tariffModel.capacityReachedDate) {\r\n tariffModel.capacityReachedDate = tariffModel.capacityReachedDate.toISOString();\r\n } else tariffModel.capacityReachedDate = null;\r\n }\r\n\r\n vm.onSubmit = function (tariffModel) {\r\n vm.processing = true;\r\n vm.hasError = false;\r\n vm.tariffAmended = false;\r\n parseDates(tariffModel);\r\n\r\n var requestModel = {\r\n comments: tariffModel.comments,\r\n description: tariffModel.description,\r\n capacityReachedDate: tariffModel.capacityReachedDate,\r\n tariffValue: tariffModel.tariffValue,\r\n tariffCode: tariffModel.tariffCode,\r\n id: tariffModel.tariffId\r\n };\r\n\r\n return tariffService.updateTariff(requestModel)\r\n .then(function() {\r\n vm.processing = false;\r\n vm.tariffAmended = true;\r\n $state.go('tariff');\r\n });\r\n };\r\n\r\n vm.cancel = function () {\r\n $uibModal.open({\r\n templateUrl: 'app/tariff/update/tariff-update-cancel.html',\r\n controller: 'TariffUpdateCancelController',\r\n controllerAs: 'vm'\r\n });\r\n };\r\n\r\n vm.loadModel = function() {\r\n return tariffService.getById(vm.id)\r\n .then(formatDates);\r\n };\r\n\r\n function formatDates(result) {\r\n var tariffModel = result.data;\r\n tariffModel.parsedEligibleTo = moment(tariffModel.eligibleTo).format('DD/MM/YYYY HH:mm:ss');\r\n tariffModel.parsedEligibleFrom = moment(tariffModel.eligibleFrom).format('DD/MM/YYYY HH:mm:ss');\r\n if (tariffModel.capacityReachedDate) {\r\n var date = new Date(tariffModel.capacityReachedDate);\r\n tariffModel.capacityReachedDate = date;\r\n } else {\r\n tariffModel.capacityReachedDate = null;\r\n }\r\n vm.tariffModel = tariffModel;\r\n return tariffModel;\r\n }\r\n\r\n vm.formFields = [\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'tariffCode',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Tariff code',\r\n required: true\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': 'model.isPendingCreation === false'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'compReviewLevelTypeName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'PV tariff level'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'technologyTypeName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'Technology type'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'installTypeName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'PV install type'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'parsedEligibleFrom',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'Eligible from'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'parsedEligibleTo',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'Eligible to'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'minCapacity',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'Min capacity (kW)'\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'maxCapacity',\r\n type: 'fitInput',\r\n templateOptions: {\r\n disabled: true,\r\n label: 'Max capacity (kW)'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'tariffValue',\r\n type: 'fitInput',\r\n optionsTypes: ['fitFourDecimalPlacesValidator', 'fitMaxDecimalValueValidator'],\r\n templateOptions: {\r\n required: true,\r\n label: 'Tariff',\r\n patternValidationMessage: 'Please specify a tariff value upto 4 decimal places',\r\n maxDecimalValueValidationMessage: 'Please specify a tariff value not greater than ' + constants.fitConstants.maximumTariffValue,\r\n maxValue: constants.fitConstants.maximumTariffValue\r\n }\r\n },\r\n {\r\n className: 'col-md-5',\r\n key: 'description',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Description',\r\n required: true,\r\n maxlength: 256,\r\n rows: 2\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'col-md-0',\r\n type: 'fitInput',\r\n key: 'capacityReached',\r\n templateOptions: {\r\n required: false,\r\n 'type': 'hidden'\r\n }\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'capacityReachedDate',\r\n type: 'fitDateTimePicker',\r\n templateOptions: {\r\n label: 'Capacity reached date',\r\n datepickerOptions: {\r\n maxDate: new Date(),\r\n minDate: (constants.fitConstants.capacityCapStartDate).toDate()\r\n },\r\n dateTimeValidatorValidationMessage: 'Please specify a date in format dd/MM/yyyy HH:MM:SS beween ' + constants.fitConstants.capacityCapStartDate.format('DD/MM/YYYY HH:mm:ss') + ' and current date'\r\n },\r\n expressionProperties: {\r\n 'templateOptions.disabled': 'model.isCapacityReached === true'\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: [\r\n {\r\n className: 'col-md-5',\r\n key: 'comments',\r\n type: 'fitTextarea',\r\n templateOptions: {\r\n label: 'Comments',\r\n required: true,\r\n maxlength: 1000,\r\n rows: 6\r\n }\r\n }\r\n\r\n ]\r\n }\r\n\r\n ];\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users')\r\n .controller('ExternalUserResetsController', ExternalUserResetsController);\r\n\r\n function ExternalUserResetsController($log, userService, $state, toastr, dialogService, $q) {\r\n var vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.sendResetEmails = sendResetEmails;\r\n vm.processing = false;\r\n vm.error = false;\r\n\r\n function sendResetEmails() {\r\n vm.processing = true;\r\n vm.error = false;\r\n\r\n var resultPromise = $q.defer();\r\n\r\n var confirmationPromise = showConfirmationMessage();\r\n confirmationPromise.catch(returnNoError);\r\n confirmationPromise.then(submitRequestAndRedirectIfSuccess);\r\n\r\n\r\n return resultPromise;\r\n\r\n function returnNoError() {\r\n resultPromise.resolve();\r\n vm.processing = false;\r\n }\r\n\r\n\r\n function submitRequestAndRedirectIfSuccess() {\r\n userService.sendResetEmailsAllExtUsers()\r\n .then(showResultsMessageAndRedirect)\r\n .then(returnNoError)\r\n .catch(function(response) {\r\n vm.processing = false;\r\n vm.error = true;\r\n $log.warn('API request failed:', response);\r\n });\r\n }\r\n }\r\n\r\n function showResultsMessageAndRedirect() {\r\n vm.processing = false;\r\n toastr.success('Reset emails sent to all external users', 'Emails sent');\r\n $state.go('landing');\r\n }\r\n\r\n function cancel() {\r\n $state.go('landing');\r\n }\r\n\r\n function showConfirmationMessage() {\r\n var options = {\r\n title: 'Reset link emails',\r\n message: 'Are you sure you want to send reset link emails to all external users?',\r\n buttons: {\r\n confirm: true,\r\n cancel: true\r\n }\r\n };\r\n return dialogService.showDialog(options);\r\n }\r\n }\r\n\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users')\r\n .controller('UsersFormController', UsersFormController);\r\n\r\n function UsersFormController($stateParams, $log, dataService, userService, $state, toastr, $q, principal) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n var amendingUserConfirmationText =\r\n 'If you are amending a user to have read only permissions, please select \\'None\\' for each type of permission. By pressing \\'Save\\' you are confirming that you have sought approval from the relevant Delegated Authority to amend the permissions of this user.';\r\n var addingUserConfirmationText =\r\n 'If you are adding a new user with read only permissions, please select \\'None\\' for each type of permission. By pressing \\'Save\\' you are confirming that you have sought approval from the relevant Delegated Authority to add this user to the CFR with the selected permissions.';\r\n\r\n vm.submit = submit;\r\n vm.cancel = cancel;\r\n vm.loadData = loadData;\r\n\r\n vm.roles = [];\r\n vm.userFormFields = [];\r\n vm.supplierId = $stateParams.supplierId;\r\n vm.isExternal = isExternal();\r\n vm.isMyAccountPage = isMyAccountPage();\r\n vm.userId = $stateParams.userId;\r\n\r\n vm.formOptions = {\r\n warningText: getWarningText()\r\n };\r\n\r\n function getEmailFieldDataType() {\r\n var isAddingNewUser = angular.isUndefined(vm.userId) || vm.userId === null;\r\n return isAddingNewUser || principal.isSuperuser ? 'fitInput' : 'fitStatic';\r\n }\r\n\r\n function isExternal() {\r\n return angular.isDefined(vm.supplierId) && vm.supplierId !== null && vm.supplierId !== '';\r\n }\r\n\r\n function isMyAccountPage() {\r\n return $stateParams.isMyAccountPage;\r\n }\r\n\r\n function loadData() {\r\n return fetchRoles()\r\n .then(setupForm)\r\n .then(loadUser);\r\n }\r\n\r\n function fetchRoles() {\r\n if (!vm.isMyAccountPage) {\r\n var rolesEndpoint = vm.isExternal\r\n ? 'roles/external'\r\n : 'roles/internal';\r\n return dataService.fetchDataFromEndpoint(rolesEndpoint)\r\n .then(setRoles);\r\n }\r\n vm.roles = [];\r\n return $q.resolve();\r\n }\r\n\r\n function getWarningText() {\r\n if (isMyAccountPage() || vm.isExternal) {\r\n return '';\r\n }\r\n var isAddingNewUser = angular.isUndefined(vm.userId) || vm.userId === null;\r\n return isAddingNewUser ? addingUserConfirmationText : amendingUserConfirmationText;\r\n }\r\n\r\n function setRoles(roles) {\r\n if (angular.isUndefined(vm.supplierId) || vm.supplierId === null) {\r\n vm.roles = roles.filter(function (role) { return role.key !== 'externalSuperuser'; });\r\n } else {\r\n dataService.fetchDataFromEndpointWithParams('licences', { supplierId: vm.supplierId })\r\n .then(function (licences) {\r\n if (licences[0].fitStatusId === 0) {\r\n if (principal.isSuperuser) {\r\n vm.roles = roles.filter(function (role) { return role.key !== 'externalSuperuser' && role.key !== 'externalCreateInstallation' && role.key !== 'externalEditInstallation' && role.key !== 'externalReporting' && role.key !== 'externalSwitching'; });\r\n }\r\n }\r\n else {\r\n vm.roles = roles.filter(function (role) { return role.key !== 'externalSuperuser'; });\r\n }\r\n })\r\n .then(setupForm);\r\n }\r\n }\r\n\r\n function loadUser() {\r\n if (vm.isMyAccountPage) {\r\n return dataService.fetchDataFromEndpoint('users/current');\r\n }\r\n\r\n if (angular.isDefined(vm.userId) && vm.userId !== null) {\r\n return dataService.fetchDataFromEndpointById('users', vm.userId);\r\n } else {\r\n return getDefaultUser();\r\n }\r\n }\r\n\r\n function getDefaultUser() {\r\n var user = { roles: {} };\r\n var defaultRoles = vm.roles.filter(roleIsDefault);\r\n angular.forEach(defaultRoles, setRoleOnUser);\r\n return user;\r\n\r\n function setRoleOnUser(role) {\r\n user.roles[role.key] = true;\r\n }\r\n }\r\n\r\n function roleIsDefault(role) {\r\n return role.isDefault;\r\n }\r\n\r\n function submit(user) {\r\n if (vm.isExternal && !vm.isMyAccountPage && !_.some(user.roles, function (role) { return role; })) {\r\n toastr.error('This user must have a role', 'No Roles Provided');\r\n return;\r\n }\r\n _.forOwn(vm.roles, function (role) {\r\n if (role.groupKey) {\r\n user.roles[role.key] = user.groupedRoles[role.groupKey] === role.key;\r\n }\r\n });\r\n if (vm.isMyAccountPage) {\r\n return userService\r\n .saveCurrentUser(user)\r\n .then(notifyUpdated)\r\n .then(endEdit);\r\n }\r\n\r\n user.supplierId = vm.supplierId;\r\n return userService\r\n .saveUser(user, vm.userId)\r\n .then(notifyIfSaved)\r\n .then(endEdit);\r\n\r\n function notifyIfSaved() {\r\n if (vm.isExternal && vm.userId == null) {\r\n toastr.success('This user has been emailed with their login and a link to set their password.', 'User created');\r\n }\r\n }\r\n }\r\n\r\n function notifyUpdated() {\r\n toastr.success('Your details have been updated.', 'Account updated');\r\n }\r\n\r\n function cancel() {\r\n endEdit();\r\n }\r\n\r\n function endEdit() {\r\n if (vm.isMyAccountPage) {\r\n $state.reload();\r\n } else {\r\n $state.go('^');\r\n }\r\n }\r\n\r\n function setupForm() {\r\n vm.userFormFields = userFormFields();\r\n }\r\n\r\n function addRoleFields(fields) {\r\n var roleFields = [];\r\n _.forOwn(_.groupBy(vm.roles, 'groupDescription'), function (rolesWithSameGroup, groupDescription) {\r\n if (rolesWithSameGroup.length > 1 && groupDescription !== 'null') {\r\n var roleKeyValuePairs = _.map(rolesWithSameGroup,\r\n function (role) {\r\n return { name: role.description, value: role.key };\r\n });\r\n roleKeyValuePairs.unshift({\r\n name: 'None',\r\n value: 'none'\r\n });\r\n var roleInputSetupOptions = {\r\n className: 'col-md-3',\r\n key: 'groupedRoles[\\'' + rolesWithSameGroup[0].groupKey + '\\']',\r\n type: 'fitSelect',\r\n templateOptions: {\r\n label: groupDescription,\r\n options: roleKeyValuePairs,\r\n required: true\r\n }\r\n };\r\n roleFields.push(roleInputSetupOptions);\r\n } else {\r\n _.forEach(rolesWithSameGroup, function (role) {\r\n var roleInputSetupOptions = {\r\n className: 'col-md-3',\r\n key: 'roles[\\'' + role.key + '\\']',\r\n type: 'fitCheckbox',\r\n templateOptions: {\r\n label: role.description,\r\n helpText: role.infoText\r\n }\r\n };\r\n roleFields.push(roleInputSetupOptions);\r\n });\r\n }\r\n });\r\n fields.push({\r\n className: 'row',\r\n fieldGroup: roleFields\r\n });\r\n }\r\n\r\n function userFormFields() {\r\n var nameFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'title',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Title',\r\n maxlength: 10,\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'firstName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'First Name',\r\n maxlength: 50,\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'lastName',\r\n type: 'fitInput',\r\n templateOptions: {\r\n label: 'Surname',\r\n maxlength: 50,\r\n required: true\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'middleInitials',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 50,\r\n label: 'Middle Initials'\r\n }\r\n }\r\n ];\r\n\r\n var contactFields = [\r\n {\r\n className: 'col-md-3',\r\n key: 'emailAddress',\r\n type: getEmailFieldDataType(),\r\n templateOptions: {\r\n required: true,\r\n type: 'email',\r\n maxlength: 250,\r\n label: 'Email Address'\r\n }\r\n },\r\n {\r\n className: 'col-md-3',\r\n key: 'jobTitle',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 50,\r\n label: 'Job Title'\r\n }\r\n }\r\n\r\n ];\r\n\r\n if (vm.isExternal) {\r\n contactFields.push({\r\n className: 'col-md-3',\r\n key: 'telephoneNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 30,\r\n label: 'Telephone number'\r\n }\r\n });\r\n contactFields.push({\r\n className: 'col-md-3',\r\n key: 'faxNumber',\r\n type: 'fitInput',\r\n templateOptions: {\r\n required: false,\r\n maxlength: 30,\r\n label: 'Fax number'\r\n }\r\n });\r\n }\r\n\r\n var fields = [\r\n {\r\n className: 'row',\r\n fieldGroup: nameFields\r\n },\r\n {\r\n className: 'row',\r\n fieldGroup: contactFields\r\n }\r\n ];\r\n\r\n if (!vm.isMyAccountPage) {\r\n addRoleFields(fields);\r\n }\r\n return fields;\r\n }\r\n };\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users')\r\n .controller('UsersTableController', UsersTableController);\r\n\r\n function UsersTableController($stateParams, $log, dataService, userService, paginatedDataService, dialogService, principal, $state) {\r\n var vm = this;\r\n\r\n vm.$onInit = function () {\r\n\r\n vm.users = [];\r\n vm.roles = [];\r\n vm.loading = true;\r\n vm.error = '';\r\n vm.tableData = null;\r\n\r\n vm.currentUsername = principal.name();\r\n vm.isExternal = $stateParams.external;\r\n vm.supplierId = $stateParams.supplierId;\r\n\r\n vm.fetchUserData = fetchUserData;\r\n vm.userHasRole = userHasRole;\r\n\r\n vm.lockUser = lockUser;\r\n vm.unlockUser = unlockUser;\r\n vm.transferSuperuser = transferSuperuser;\r\n vm.deleteUser = deleteUser;\r\n\r\n vm.getCsvUserData = getCsvUserDataFunc;\r\n vm.currentStateName = $state.current.name;\r\n\r\n function getCsvUserDataFunc() {\r\n var endpoint = 'users/fetchAllUsers';\r\n if (!vm.isExternal) {\r\n vm.csvHeaders = [\r\n 'Email', 'Title', 'First Name', 'Surname', 'Locked', 'Superuser', 'Fit Admin', 'Fit Approver (Level 1)',\r\n 'Fit Approver (Level 2)', 'Tariff Approver', 'Tariff Editor', 'Levelisation Editor',\r\n 'Levelisation Approver (Level 1)', 'Levelisation Approver (Level 2)', 'Levelisation Approver (Level 3)',\r\n 'Levelisation Approver (Level 4)'];\r\n return dataService.fetchDataFromEndpointWithParams(endpoint, vm.tableParams).then(parseCsvResult);\r\n }\r\n else {\r\n vm.csvHeaders = [\r\n 'Email', 'Title', 'First Name', 'Surname', 'Locked', 'External Superuser',\r\n 'Create Installation', 'Edit Installation',\r\n 'Levelisation', 'Reporting', 'Switching', 'Users'];\r\n return dataService.fetchDataFromEndpointWithParams(endpoint, { supplierId: vm.supplierId }).then(parseCsvResult);\r\n }\r\n\r\n function parseCsvResult(response) {\r\n var data = response;\r\n var list = [];\r\n data.forEach(mapData);\r\n function mapData(item) {\r\n if (!vm.isExternal) {\r\n list.push(\r\n {\r\n emailAddress: item.emailAddress,\r\n titles: item.title,\r\n firstName: item.firstName,\r\n lastName: item.lastName,\r\n lockedOut: item.lockedOut,\r\n superUser: item.roles.superuser,\r\n fitAdmin: item.roles.fitAdmin,\r\n fitApprover: item.roles.fitApprover,\r\n seniorFitApprover: item.roles.seniorFitApprover,\r\n tariffApprover: item.roles.tariffApprover,\r\n tariffEditor: item.roles.tariffEditor,\r\n levelisationEditor: item.roles.levelisationEditor,\r\n levelisationApprover: item.roles.levelisationApprover,\r\n levelisationSecondApprover: item.roles.levelisationSecondApprover,\r\n levelisationThirdApprover: item.roles.levelisationThirdApprover,\r\n levelisationFourthApprover: item.roles.levelisationFourthApprover\r\n });\r\n }\r\n else {\r\n list.push(\r\n {\r\n emailAddress: item.emailAddress,\r\n titles: item.title,\r\n firstName: item.firstName,\r\n lastName: item.lastName,\r\n lockedOut: item.lockedOut,\r\n externalSuperUser: item.roles.externalSuperuser,\r\n externalCreateInstallation: item.roles.externalCreateInstallation,\r\n externalEditInstallation: item.roles.externalEditInstallation,\r\n externalLevelisation: item.roles.externalLevelisation,\r\n externalReporting: item.roles.externalReporting,\r\n externalSwitching: item.roles.externalSwitching,\r\n externalUserManagement: item.roles.externalUserManagement\r\n });\r\n }\r\n }\r\n return list;\r\n }\r\n }\r\n\r\n function userHasRole(user, role) {\r\n return user.roles[role];\r\n }\r\n\r\n function fetchUserData(tableData) {\r\n vm.localTableData = tableData;\r\n if (vm.tableData === null) {\r\n vm.tableData = tableData;\r\n }\r\n\r\n vm.loading = true;\r\n if (vm.roles.length !== 0) {\r\n fetchUsers(tableData);\r\n return;\r\n }\r\n\r\n var rolesEndpoint = $stateParams.external ? 'roles/external' : 'roles/internal';\r\n dataService.fetchDataFromEndpoint(rolesEndpoint).then(filterRoles, displayError);\r\n function filterRoles(roles) {\r\n vm.roles = roles;\r\n\r\n if (angular.isDefined(vm.supplierId) && vm.supplierId !== null) {\r\n dataService.fetchDataFromEndpointWithParams('licences', { supplierId: vm.supplierId })\r\n .then(setRoles);\r\n } else {\r\n fetchUsers(vm.localTableData);\r\n }\r\n\r\n }\r\n\r\n function setRoles(licences) {\r\n if (licences[0].fitStatusId === 0) {\r\n if (principal.isSuperuser) {\r\n vm.roles = vm.roles.filter(function (role) { return role.key !== 'externalCreateInstallation' && role.key !== 'externalEditInstallation' && role.key !== 'externalSuperuser' && role.key !== 'externalReporting' && role.key !== 'externalSwitching'; });\r\n }\r\n }\r\n fetchUsers(vm.localTableData);\r\n }\r\n }\r\n\r\n function fetchUsers(tableData) {\r\n vm.users = [];\r\n\r\n var params = paginatedDataService.getParamsFromTableData(tableData);\r\n params.supplierId = vm.isExternal ? vm.supplierId : null;\r\n paginatedDataService.fetchDataFromParams('users', params)\r\n .then(setUsers, displayError);\r\n\r\n function setUsers(response) {\r\n vm.loading = false;\r\n tableData.pagination.numberOfPages = response.pageCount;\r\n vm.users = response.data;\r\n }\r\n }\r\n\r\n function unlockUser(user) {\r\n user.changingLockStatus = true;\r\n userService.unlockUser(user.id)\r\n .then(displayUserAsUnlocked, displayError)\r\n .finally(function () { user.changingLockStatus = false; });\r\n\r\n function displayUserAsUnlocked() {\r\n user.lockedOut = false;\r\n }\r\n }\r\n\r\n function lockUser(user) {\r\n user.changingLockStatus = true;\r\n userService.lockUser(user.id)\r\n .then(displayUserAsLocked, displayError)\r\n .finally(function () { user.changingLockStatus = false; });\r\n\r\n function displayUserAsLocked() {\r\n user.lockedOut = true;\r\n }\r\n }\r\n\r\n function transferSuperuser(user) {\r\n var options = {\r\n title: 'Transfer external superuser',\r\n message: 'Please confirm that you want this user to become the Authorised Signatory for this account. '\r\n + 'By selecting \\'confirm\\' you are confirming that you have reviewed the new authorisation letter '\r\n + 'and carried out the necessary checks to ensure that this user is able to act as '\r\n + 'Authorised Signatory (superuser) for this licensed electricity supplier. '\r\n + 'Please select \\'Cancel\\' if you do not wish to proceed.'\r\n };\r\n dialogService.showDialog(options).then(transfer);\r\n\r\n function transfer() {\r\n user.changingSuperuserStatus = true;\r\n userService.transferSuperuser(user.id)\r\n .then(updateSuperuser, displayError)\r\n .finally(function () { user.changingSuperuserStatus = false; });\r\n }\r\n\r\n function updateSuperuser() {\r\n vm.users.map(function (innerUser) {\r\n innerUser.roles['externalSuperuser'] = false;\r\n return user;\r\n });\r\n user.roles['externalSuperuser'] = true;\r\n }\r\n }\r\n\r\n function deleteUser(user) {\r\n var options = {\r\n title: 'Delete user',\r\n message: 'Please confirm you want to delete this account.'\r\n };\r\n dialogService.showDialog(options).then(deleteSelectedUser);\r\n\r\n function deleteSelectedUser() {\r\n user.deleting = true;\r\n userService.deleteUser(user.id)\r\n .then(reloadUsers, showDeletionError);\r\n }\r\n\r\n function reloadUsers() {\r\n fetchUsers(vm.tableData);\r\n }\r\n\r\n function showDeletionError(response) {\r\n user.deleting = false;\r\n displayError(response);\r\n }\r\n }\r\n\r\n function displayError(response) {\r\n vm.loading = false;\r\n vm.error = 'There was an error communicating with the server. Please try again later.';\r\n $log.warn('API request failed:', response);\r\n }\r\n };\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users')\r\n .run(configureRoutes);\r\n\r\n function configureRoutes(routeManager) {\r\n routeManager.addStates([\r\n {\r\n state: 'users',\r\n config: {\r\n title: 'Users',\r\n url: '/users',\r\n data: {\r\n permissions: {\r\n only: ['Superuser']\r\n }\r\n },\r\n params:\r\n {\r\n supplierId: null\r\n },\r\n views: {\r\n '': {\r\n templateUrl: 'app/users/users.html'\r\n },\r\n 'display@users': {\r\n templateUrl: 'app/users/user-table.html',\r\n controller: 'UsersTableController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'users#editUser',\r\n config: {\r\n url: '/user/{userId}',\r\n parent: 'users',\r\n params: {\r\n supplierId: null,\r\n userId: {\r\n type: 'int',\r\n value: null\r\n },\r\n isMyAccountPage: false\r\n\r\n },\r\n views: {\r\n 'display@users': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'users#createUser',\r\n config: {\r\n url: '/create',\r\n parent: 'users',\r\n params: {\r\n supplierId: null,\r\n userId: null,\r\n isMyAccountPage: false\r\n },\r\n views: {\r\n 'display@users': {\r\n templateUrl: 'app/users/user-form.html',\r\n controller: 'UsersFormController',\r\n controllerAs: 'vm'\r\n }\r\n }\r\n }\r\n },\r\n {\r\n state: 'externalResets',\r\n config: {\r\n url: '/externalResets/496212ab-d0c6-4e78-85d6-c92cce362dd8',\r\n templateUrl: 'app/users/external-user-resetLinks.html',\r\n controller: 'ExternalUserResetsController',\r\n controllerAs: 'vm',\r\n data: {\r\n permissions: {\r\n only: ['Superuser']\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users')\r\n .factory('userService', userService);\r\n\r\n\r\n function userService($q, $timeout, $http, appConfig) {\r\n var service = {\r\n saveUser: saveUser,\r\n saveCurrentUser: saveCurrentUser,\r\n deleteUser: deleteUser,\r\n transferSuperuser: transferSuperuser,\r\n lockUser: lockUser,\r\n unlockUser: unlockUser,\r\n sendResetEmailsAllExtUsers: sendResetEmailsAllExtUsers\r\n };\r\n\r\n return service;\r\n\r\n function saveUser(user, id) {\r\n if (id) {\r\n user.id = id;\r\n }\r\n var encodedData = angular.toJson(user);\r\n\r\n var request = id\r\n ? $http.put(appConfig.apiRoot + 'users/' + id, encodedData)\r\n : $http.post(appConfig.apiRoot + 'users', encodedData);\r\n\r\n return request;\r\n }\r\n\r\n function saveCurrentUser(user) {\r\n return $http.put(appConfig.apiRoot + 'users/current', angular.toJson(user));\r\n }\r\n\r\n function deleteUser(id) {\r\n return $http.delete(appConfig.apiRoot + 'users/' + id);\r\n }\r\n\r\n function transferSuperuser(id) {\r\n return $http.patch(appConfig.apiRoot + 'users/' + id + '/transfer');\r\n }\r\n\r\n function lockUser(id) {\r\n return $http.patch(appConfig.apiRoot + 'users/' + id + '/lock');\r\n }\r\n\r\n function unlockUser(id) {\r\n return $http.patch(appConfig.apiRoot + 'users/' + id + '/unlock');\r\n }\r\n\r\n function sendResetEmailsAllExtUsers() {\r\n return $http.post(appConfig.apiRoot + 'users/password/allExernalUsers/resetLink', null);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .constant('arrayUtils', arrayUtils());\r\n\r\n function arrayUtils() {\r\n var utils = {\r\n findByProp: findByProp,\r\n moveItems: moveItems\r\n };\r\n return utils;\r\n\r\n function findByProp(array, prop, value) {\r\n if (!angular.isArray(array)) {\r\n throw new Error('First argument must be an array');\r\n }\r\n if (!angular.isString(prop)) {\r\n throw new Error('Second argument must be a string');\r\n }\r\n if (!array.length) {\r\n return;\r\n }\r\n var ret;\r\n array.some(function (element) {\r\n var propValue = element && element[prop];\r\n if (propValue === value) {\r\n ret = element;\r\n return true;\r\n }\r\n });\r\n return ret;\r\n }\r\n\r\n function moveItems(source, target, predicate) {\r\n if (!angular.isArray(source)) {\r\n throw new Error('source must be an array');\r\n }\r\n if (!angular.isArray(target)) {\r\n throw new Error('target must be an array');\r\n }\r\n for (var i = 0; i < source.length; i++) {\r\n var item = source[i];\r\n if (!predicate || predicate(item)) {\r\n source.splice(i, 1);\r\n target.push(item);\r\n i--;\r\n }\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .factory('constantUtils', constantUtils);\r\n\r\n function constantUtils(arrayUtils) {\r\n var utils = {\r\n findConstantValue: findConstantValue,\r\n findConstantName: findConstantName,\r\n findConstantAbbrv: findConstantAbbrv\r\n };\r\n return utils;\r\n\r\n function findConstantValue(constArray, code) {\r\n // This helper method is aimed to extend findByProp to get the value of a type array from the\r\n // constants via the code - a very common action.\r\n var entry = arrayUtils.findByProp(constArray, 'code', code);\r\n return entry ? entry.value : undefined;\r\n }\r\n\r\n function findConstantName(constArray, id) {\r\n var entry = arrayUtils.findByProp(constArray, 'value', id);\r\n return entry ? entry.name : undefined;\r\n }\r\n\r\n function findConstantAbbrv(constArray, id) {\r\n var entry = arrayUtils.findByProp(constArray, 'value', id);\r\n return entry ? entry.abbreviation : undefined;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .factory('eligibilityDateService', eligibilityDateService);\r\n\r\n function eligibilityDateService(dataService) {\r\n var service = {\r\n getPreTariffLookupDate: getPreTariffLookupDate,\r\n getTariffLookupDate: getTariffLookupDate,\r\n getEligibilityDate: getEligibilityDate,\r\n getEligibilityEndDate: getEligibilityEndDate,\r\n getEligibilityDateFromAccreditation: getEligibilityDateFromAccreditation\r\n };\r\n return service;\r\n\r\n function getPreTariffLookupDate(applicationDate, commissioningDate) {\r\n var tariffCutOffDate = moment.max(moment(applicationDate), moment(commissioningDate));\r\n return tariffCutOffDate.toDate();\r\n }\r\n\r\n function getTariffLookupDate(params) {\r\n return dataService.fetchDataFromEndpointWithParams('installation/tariffLookupDate', params);\r\n }\r\n\r\n function getEligibilityDate(params) {\r\n return dataService.fetchDataFromEndpointWithParams('installation/eligibilityDate', params);\r\n }\r\n\r\n function getEligibilityDateFromAccreditation(params) {\r\n return dataService.fetchDataFromEndpointById('installation/eligibilityDateFromAccreditation', '?accreditationId='+ encodeURIComponent(params));\r\n }\r\n\r\n function getEligibilityEndDate(params) {\r\n return dataService.fetchDataFromEndpointWithParams('installation/eligibilityEndDate', params);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .factory('formUtils', formUtils);\r\n\r\n function formUtils($filter) {\r\n return {\r\n formatElectricity: formatElectricity,\r\n formatAsCurrency: formatAsCurrency,\r\n convertToDate: convertToDate,\r\n getPropertyFromModelOrFormState: getPropertyFromModelOrFormState,\r\n getPropertyFromModel: getPropertyFromModel,\r\n getPropertyFromFormState: getPropertyFromFormState\r\n };\r\n\r\n function formatElectricity(number) {\r\n if (angular.isNumber(number) || angular.isString(number)) {\r\n return $filter('number')(number, 3);\r\n }\r\n return null;\r\n }\r\n\r\n function formatAsCurrency(number, decimalPlaces) {\r\n decimalPlaces = decimalPlaces || 2;\r\n if (angular.isNumber(number) || angular.isString(number)) {\r\n return $filter('number')(number, decimalPlaces);\r\n }\r\n return null;\r\n }\r\n\r\n function convertToDate(date) {\r\n if (date === null || angular.isUndefined(date)) {\r\n return null;\r\n }\r\n if (angular.isObject(date)) {\r\n return date;\r\n }\r\n return new Date(date);\r\n }\r\n\r\n function getPropertyFromModelOrFormState(scope, propertyName) {\r\n var modelProperty = getModelProperty(scope, propertyName);\r\n if(angular.isDefined(modelProperty)) {\r\n return modelProperty;\r\n }\r\n return getPropertyFromFormState(scope, propertyName);\r\n }\r\n\r\n function getPropertyFromModel(scope, propertyName) {\r\n var modelProperty = getModelProperty(scope, propertyName);\r\n if(angular.isDefined(modelProperty)) {\r\n return modelProperty;\r\n }\r\n return null;\r\n }\r\n\r\n function getModelProperty(scope, propertyName) {\r\n return scope.model[propertyName];\r\n }\r\n\r\n function getPropertyFromFormState(scope, propertyName) {\r\n if(angular.isDefined(scope.formState)\r\n && angular.isDefined(scope.formState[propertyName])) {\r\n return scope.formState[propertyName];\r\n }\r\n if(angular.isDefined(scope.options.formState)\r\n && angular.isDefined(scope.options.formState[propertyName])) {\r\n return scope.options.formState[propertyName];\r\n }\r\n return null;\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .directive('matchField', matchFieldDirective);\r\n\r\n // TODO Max/Simon: Delete this directive once all forms are formly-fied\r\n function matchFieldDirective($parse) {\r\n return {\r\n link: link,\r\n require: 'ngModel'\r\n };\r\n\r\n function link(scope, elem, attrs, ctrl) {\r\n if (!ctrl) {\r\n return;\r\n }\r\n if (!attrs.matchField) {\r\n return;\r\n }\r\n\r\n var matchedField = $parse(attrs.matchField);\r\n\r\n var validator = function(value) {\r\n var matchedFieldValue = matchedField(scope);\r\n ctrl.$setValidity('mismatch', value === matchedFieldValue);\r\n return value;\r\n };\r\n\r\n ctrl.$parsers.unshift(validator);\r\n ctrl.$formatters.push(validator);\r\n \r\n scope.$watch(attrs.matchField, function () {\r\n validator(ctrl.$viewValue);\r\n });\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .constant('objectUtils', objectUtils());\r\n\r\n function objectUtils() {\r\n var utils = {\r\n copy: copy\r\n };\r\n return utils;\r\n\r\n function copy(source, properties, dest) {\r\n // If no properties are given, or if the source is not an object, then use default behaviour.\r\n // Note: arrays are considered objects by Angular\r\n if (!angular.isObject(source) || angular.isArray(source) ||angular.isUndefined(properties)) {\r\n return angular.copy(source, dest);\r\n }\r\n\r\n // If no target is given, we start with a new object.\r\n var ret = dest || {};\r\n for (var i = 0; i < properties.length; i++) {\r\n var propName = properties[i];\r\n if (source.hasOwnProperty(propName)) {\r\n ret[propName] = angular.copy(source[propName]);\r\n }\r\n }\r\n return ret;\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .constant('scopeUtils', scopeUtils());\r\n\r\n function scopeUtils() {\r\n var utils = {\r\n safeOn: safeOn\r\n };\r\n return utils;\r\n\r\n // If the scope is destroyed with subscriptions still attached, there can be a memory leak\r\n // This function attaches the given listener to the given scope and also subscribes to\r\n // the scope destruction event in order to clean up the original listeners\r\n function safeOn(scope, event, listener) {\r\n var deregistrationFn = scope.$on(event, listener);\r\n scope.$on('$destroy', function() {\r\n deregistrationFn();\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .constant('stringUtils', stringUtils());\r\n\r\n function stringUtils() {\r\n var utils = {\r\n capitalise: capitalise,\r\n parseNumber: parseNumber\r\n };\r\n return utils;\r\n\r\n function capitalise(input) {\r\n if (!angular.isString(input)) {\r\n return input;\r\n }\r\n return input.charAt(0).toUpperCase() + input.slice(1);\r\n }\r\n\r\n function parseNumber(numberString) {\r\n if (angular.isNumber(numberString)) {\r\n return numberString;\r\n }\r\n\r\n if (!angular.isString(numberString)) {\r\n return NaN;\r\n }\r\n\r\n numberString = numberString.replace(/,/g, '');\r\n return parseFloat(numberString);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .directive('validateChanged', validateChangedDirective);\r\n\r\n // TODO Max/Simon: Delete this directive once the password form is formly-based\r\n function validateChangedDirective($parse) {\r\n return {\r\n require: 'ngModel',\r\n link: link\r\n };\r\n\r\n function link(scope, elem, attrs, ctrl) {\r\n if (!ctrl) {\r\n return;\r\n }\r\n if (!attrs.validateChanged) {\r\n return;\r\n }\r\n\r\n var matchedField = $parse(attrs.validateChanged);\r\n \r\n var validator = function (value) {\r\n var matchedFieldValue = matchedField(scope);\r\n ctrl.$setValidity('unchanged', value !== matchedFieldValue);\r\n return value;\r\n };\r\n\r\n ctrl.$parsers.unshift(validator);\r\n ctrl.$formatters.push(validator);\r\n\r\n scope.$watch(attrs.validateChanged, function () {\r\n validator(ctrl.$viewValue);\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('utils')\r\n .factory('validationUtils', validationUtils);\r\n\r\n function validationUtils() {\r\n var utils = {\r\n checkFieldsHaveValidPrefixesThenNumeric: checkFieldsHaveValidPrefixesThenNumeric\r\n };\r\n return utils;\r\n\r\n function checkFieldsHaveValidPrefixesThenNumeric(fieldDefs, fieldValues) {\r\n var valid = true;\r\n _.forEach(fieldDefs, function (field) {\r\n var fieldValue = fieldValues[field.modelValue];\r\n if (field.validPrefix && fieldValue) {\r\n valid = valid && isValidFormatForPrefix(field.validPrefix, fieldValue);\r\n }\r\n });\r\n return valid;\r\n\r\n function isValidFormatForPrefix(validPrefix, value) {\r\n var regex = new RegExp('^(' + validPrefix + ')?[0-9]+$','i');\r\n return regex.test(value);\r\n }\r\n }\r\n }\r\n})();","/*eslint angular/window-service:0, angular/document-service:0*/\r\n(function (window, document) {\r\n window.deferredBootstrapper.bootstrap({\r\n // documentElement refers to the root element, i.e. the tag\r\n element: document.documentElement,\r\n module: 'app',\r\n moduleResolves: [\r\n {\r\n module: 'components.config',\r\n resolve: {\r\n appConfig: ['$http', loadConfig]\r\n }\r\n }\r\n ]\r\n });\r\n function loadConfig($http) {\r\n\r\n angular.lowercase = function (text) {\r\n if (angular.isString(text)) {\r\n return text.toLowerCase();\r\n }\r\n else {\r\n return text;\r\n }\r\n };\r\n\r\n return $http({\r\n method: 'HEAD',\r\n url: '/'\r\n }).then(function(response) {\r\n return {\r\n apiRoot: response.headers('X-API-Root')\r\n };\r\n });\r\n }\r\n})(window, document);\r\n","angular.module('components.templates').run(['$templateCache', function($templateCache) {$templateCache.put('app/access/unauthorised.html','

    Unauthorised

    You do not have permissions to access this resource.

    Homepage
    ');\n$templateCache.put('app/account/account.html','

    Account

    ');\n$templateCache.put('app/account/forgot-password.html','

    Forgotten your password?

    Please enter your email address below and a link to reset your password will be sent to you.

    An email with a link to reset your password has been sent to the email address you provided. If you do not receive this email please contact the CFR Super user for your organisation.

    ');\n$templateCache.put('app/account/generate-password.html','

    Generate new password

    To activate your new account on the Central FIT Register, please enter a password in the fields below. Please press \\'Submit\\' once completed.

    You have succesfully set your password. To log into your account, please click on the button below to take you to the login page.

    Home
    ');\n$templateCache.put('app/account/password.html','
    Current password is required
    New password is required Your new password must be different from your current one Passwords must be 9+ characters Passwords must contain at least one uppercase character, lowercase character, and number.
    You must repeat your new password Passwords do not match
    Cancel change password
    ');\n$templateCache.put('app/account/reset-password.html','

    Reset password

    To reset your password please enter your new password in the fields below. Please press \\'Submit\\' once completed.

    Your password has been changed successfully.

    ');\n$templateCache.put('app/clients/client-edit.html','');\n$templateCache.put('app/clients/client-search.html','Create new');\n$templateCache.put('app/clients/clients.html','

    API client management

    ');\n$templateCache.put('app/editableText/text.html','

    Edit site text

    ');\n$templateCache.put('app/errorPage/error-page.html','

    Error

    We\\'re sorry, something went wrong during your request - please return to the homepage then try again.

    Homepage
    ');\n$templateCache.put('app/home/homepage.html','

    Log in to your account

    Log in to the CFR with your e-mail address and password.

    Forgotten your password?

    Elsewhere on the Central FIT Register

    ');\n$templateCache.put('app/idle/idle-timeout.html','');\n$templateCache.put('app/idle/idle-warning.html','');\n$templateCache.put('app/installations/installations-navigation.html','
    ');\n$templateCache.put('app/installations/installations-search-table.html','
    ');\n$templateCache.put('app/installations/installations.html','
    ');\n$templateCache.put('app/landingPage/landing-task-bar.html','');\n$templateCache.put('app/landingPage/landing.html','
    ');\n$templateCache.put('app/layout/environmentFlag.html','
    {{vm.environment}}
    ');\n$templateCache.put('app/layout/footer.html','
    Ofgem © 2017 20250220.1
    ');\n$templateCache.put('app/layout/navbar.html','


    ');\n$templateCache.put('app/layout/shell.html','Skip to main content
    ');\n$templateCache.put('app/layout/sidebar.html','');\n$templateCache.put('app/levelisation/levelisation-external-navigation.html','
    ');\n$templateCache.put('app/levelisation/levelisation-navigation.html','
    ');\n$templateCache.put('app/levelisation/levelisationEdit.html','

    Configure levelisation


    Change history

    ');\n$templateCache.put('app/levelisation/levelisationList.html','

    Manage levelisations

    Export results

    ');\n$templateCache.put('app/levelisation/levelisationTasks.html','

    Outstanding tasks

    ');\n$templateCache.put('app/levelisation/levelisationView.html','

    Levelisation details

    Levelisation period:{{vm.levelisation.displayName}}
    Start date:{{vm.levelisation.startDate | date:\\'dd-MM-yyyy\\'}}
    End date:{{vm.levelisation.endDate | date:\\'dd-MM-yyyy\\'}}
    Submission start date:{{vm.levelisation.submissionStartDate | date:\\'dd-MM-yyyy\\'}}
    Submission end date:{{vm.levelisation.submissionEndDate | date:\\'dd-MM-yyyy\\'}}
    Small licensee new installation qualifying cost:{{vm.levelisation.smallLicenseeNewInstallationQualifyingCost | currency:\\'\\xA3\\':2}}
    Small licensee ongoing installation qualifying cost:{{vm.levelisation.smallLicenseeOngoingInstallationQualifyingCost | currency:\\'\\xA3\\':2}}
    Large licensee new installation qualifying cost:{{vm.levelisation.largeLicenseeNewInstallationQualifyingCost | currency:\\'\\xA3\\':2}}
    Large licensee ongoing installation qualifying cost:{{vm.levelisation.largeLicenseeOngoingInstallationQualifyingCost | currency:\\'\\xA3\\':2}}
    Minimum Deemed Export Rate:{{vm.levelisation.minimumDeemedExportRate | currency:\\'\\xA3\\':2}}
    Maximum Deemed Export Rate:{{vm.levelisation.maximumDeemedExportRate | currency:\\'\\xA3\\':2}}
    Minimum Metered Export Rate:{{vm.levelisation.minimumMeteredExportRate | currency:\\'\\xA3\\':2}}
    Maximum Metered Export Rate:{{vm.levelisation.maximumMeteredExportRate | currency:\\'\\xA3\\':2}}
    System sell price:{{vm.levelisation.systemSellPrice | currency:\\'\\xA3\\':3}}
    Exempt supply cap (MWh):{{vm.levelisation.exemptSupplyCap | number:3}}
    Mutualisation Threshold:{{vm.levelisation.mutualisationThreshold | currency:\\'\\xA3\\':2}}
    Mutualisation Cap:{{vm.levelisation.mutualisationCap | currency:\\'\\xA3\\':2}}

    Change history


    Back');\n$templateCache.put('app/recipients/recipients-search.html','
    ');\n$templateCache.put('app/recipients/recipients.html','
    ');\n$templateCache.put('app/registration/registration-introduction.html','

    Register for a supplier account

    Warning
    Registration is not for individual participants of the scheme, only for licenced electricity suppliers.

    During registration you will be required to submit a company-headed letter signed by a company director from the electricity supplier, authorising you as an Authorised Signatory. This will enable you to administer the account on behalf of the electricity supplier.

    • The Central FIT Register authorisation letter template must be used for this letter.
    • The letter template can be found here.
    • You will be required to upload your completed letter during this registration process.
    Start now Cancel registration
    ');\n$templateCache.put('app/registration/registration-landing.html','

    Registration completed

    Thank you for registering your licensed electricity supplier on the Central FIT Register.

    What happens next?

    Your request for an account has been sent for approval by the FIT Team at Ofgem E-Serve. You will shortly receive an email confirmation of this request.If you do not receive an confirmation email, please contact the CFR Team at FITRegister@ofgem.gov.uk. Once your account has been approved, you will receive an email allowing you to log in to your CFR account. Please note that these accounts will normally be approved within two working days. However, this process may be delayed if there are issues with your account.

    Please note that you will be automatically registered as a Non-FIT Licensee until your account has been reviewed by the FIT Team.

    ');\n$templateCache.put('app/registration/registration.html','
    ');\n$templateCache.put('app/reports/dynamic-report.html','');\n$templateCache.put('app/reports/list.html','');\n$templateCache.put('app/reports/reports.html','

    {{$state.current.title}}

    ');\n$templateCache.put('app/smartExportGuarantee/smartExportGuarantee.html','

    Smart Export Guarantee

    This page lets you search for MPANs that have been captured on the CFR only. It shows you whether an installation associated with a specific MPAN is registered to receive FIT export payments, however it does not guarantee that an installation does or does not have a FIT export and it does not contain all MPANs that may be in receipt of FIT export payments. To satisfy yourself, you should seek other forms of assurance from the installation and/or contact (or audit) the generator directly.

    You can download a template file below. Please fill in this template and upload it to ensure the system checks the MPANs correctly.
    Click here to download a template for file upload ?
    Homepage
    ');\n$templateCache.put('app/suppliers/suppliers.html','

    Suppliers

    ');\n$templateCache.put('app/tariff/tariff-rpi.html','');\n$templateCache.put('app/tariff/tariff.html','
    ');\n$templateCache.put('app/users/external-user-resetLinks.html','
    Server error. Please try again.
    ');\n$templateCache.put('app/users/user-form.html','');\n$templateCache.put('app/users/user-table.html','
    0\">
    EmailTitleFirst nameSurnameLocked  
    No data found.
    {{user.emailAddress}}{{user.title}}{{user.firstName}}{{user.lastName}}
    Transfer
    Create user ');\n$templateCache.put('app/users/users.html','

    Internal user management

    ');\n$templateCache.put('app/basicPages/accessibility/accessibility.html','

    Central Fit Register Accessibility Statement

    This website is run by Ofgem. We want everyone who visits the Central FIT Register to feel welcome and find the experience rewarding. For example, this means you should be able to:

    • change colours, contrast levels and fonts
    • zoom in up to 300% without the text spilling off the screen
    • navigate most of the website using just a keyboard
    • navigate most of the website using speech recognition software
    • listen to most of the website using a screen reader (including the most recent versions of JAWS and NVDA)

    AbilityNet (Opens in new window) has advice on making your device easier to use if you have a disability.

    How accessible this website is

    We\\'ve worked hard on the Central FIT Register. We\\'ve been using the Web Content Accessibility Guidelines (WCAG) 2.1. These guidelines explain how to make web content more accessible for people with disabilities, and user friendly for everyone.

    The guidelines have three levels of accessibility (A, AA and AAA). We\\u2019ve chosen Level AA as the target for the Central FIT Register, and believe we\\'ve achieved this goal. However, we continue to monitor the website regularly and will soon undergo a 3rd party review to ensure we can provide the best possible service. We will update this Statement with any additional information as appropriate.

    What to do if you can\\u2019t access parts of this website

    If you need information on this website in a different format like accessible PDF, large print, easy read, audio recording or braille:

    We\\u2019ll consider your request and get back to you within two working days.

    Reporting accessibility problems with this website

    We\\u2019re always looking to improve the accessibility of this website. If you find any problems that aren\\u2019t listed on this page or think we\\u2019re not meeting the requirements of the accessibility regulations, please contact us using the above details.

    Enforcement procedure

    The Equality and Human Rights Commission (EHRC) is responsible for enforcing accessibility regulations. If you\\u2019re not happy with how we respond to your complaint, contact the Equality Advisory and Support Service (EASS) (Opens in new window).

    Technical information about this website\\u2019s accessibility

    Ofgem is committed to making its website accessible, in accordance with the Public Sector Bodies (Websites and Mobile Applications) (No. 2) Accessibility Regulations 2018.

    We will soon undergo a 3rd party review to ensure we can provide the best possible service. We will update this Statement with the outcome of that review and any additional information as appropriate.

    Please see list below of issues found by an Internal Review.

    • Header zooms can block the entire page.
    • While normal text blocks resize, rows do not resize and require horizontal scrolling
    • Many pages cannot have line height or spacing changed
    • Home page does not have a unique title that indicates purpose and context
    • Website does not have two or more ways of finding content

    The accessibility regulations do not require us to fix PDFs or other documents published before 23 September 2018if they\\u2019re not essential to providing our services.

    How we tested this website

    We last reviewed this website in October 2019. The review included desk-based testing and was carried out by Ofgem.

    Next review: 06 October 2024.

    Homepage
    ');\n$templateCache.put('app/basicPages/agreeTerms/agreeterms.html','

    Terms and conditions

    Warning
    To proceed you must understand and accept the terms and conditions. The terms and conditions have changed since you last logged on. Please accept the revised terms and conditions.

    By clicking Accept you are agreeing to the terms and conditions. If you do not wish to proceed, click Decline.

    By clicking Accept you are agreeing to revised terms and conditions. If you do not wish to proceed, click Decline.

    Decline
    ');\n$templateCache.put('app/basicPages/cookiePolicy/cookiepolicy.html','

    Cookies on this site

    Cookies are not used on this site however please note information below

    Analytics Cookies (optional) from our parent site

    If you\\u2019ve visited the main Ofgem website (opens in a new tab) you\\u2019ll also have optional analytics tracking cookies set for this site. You can read more about analytics cookies in Ofgem\\'s Cookies policy (opens in a new tab)

    Please note that you can only manage these cookies from the Ofgem website and not through our site.

    Your Rights

    You can contact our Data Protection Officer at dpo@ofgem.gov.uk to:

    Or, you can write to us at:

    The Data Protection Officer
    Ofgem
    10 South Colonnade
    Canary Wharf
    London
    E14 4PU


    You have a right to complain to the Information Commissioner about how we\\u2019ve handled your information. You can contact them at:

    Information Commissioner\\'s Office
    Wycliffe House
    Water lane
    Wilmslow
    Cheshire
    SK9 5AF
    Telephone: 0303 123 1113

    Homepage
    ');\n$templateCache.put('app/basicPages/cookies/cookies.html','

    Cookies

    Cookies are small text files which are placed on your computer or mobile phone when you browse a website. Almost all websites use them.

    The Central FIT Register uses cookies. They help us to provide, protect and improve your online experience with us.

    HTML5 Local Storage allows your browser to store designated information that you enter for future retrieval. Similar to cookies, this saved data exists even when you leave the website.

    The Central FIT Register uses HTML5 Local Storage. It helps to ensure your data is saved if your session ends unexpectedly.

    Giving us permission to use cookies and HTML5 Local Storage

    If you adjust the settings on your browser (such as Internet Explorer or Google Chrome) to accept cookies and use of HTML5 Local Storage we take this and your continued use of our website to mean that you are fine with this. If you wish to remove or not use cookies or HTML5 Local Storage, our website may not work as you would expect.

    You will see a cookie notification dropdown on the website if you delete your stored cookies, if the cookies have expired or if we make significant changes to cookies on our website.

    Anonymous visitor statistics cookies

    We use cookies to compile visitor statistics which help us to continuously improve our website. This includes tracking things like:

    • how many people have visited our website
    • what type of technology they are using (e.g. Mac or Windows which helps to identify when our website isn\\'t working as it should for particular technologies)
    • how long they spend on the website
    • what page they look at, etc.

    Analytics programmes also tell us, on an anonymous basis, how people have reached our website (e.g. from a search engine) and whether they have visited before. The tool we use is Google Analytics.

    To find out more about the cookies Google uses visit Google\\u2019s Cookie Privacy and Terms.

    You can opt out of Google Analytics tracking by installing this add-on.

    How to contact us

    If you want to request information about our cookie policy, you can email us or write to:

    Head of Knowledge Management
    Ofgem
    9 Millbank
    London
    SW1P 3GE

    Tel: 020 7901 7011
    Email: foi@ofgem.gov.uk

    Homepage
    ');\n$templateCache.put('app/basicPages/privacy/privacy.html','

    Renewable Electricity - Privacy Notice

    This privacy notice tells you what to expect when we process your personal information under the Renewable Electricity schemes administered by Ofgem. These are the Renewables Obligation (RO) scheme (including the RO in Northern Ireland (NIRO), and RO in Scotland (ROS)), Feed-In Tariff (FIT) scheme, Renewable Energy Guarantees of Origin (REGO) scheme, the Smart Export Guarantee (SEG), Climate Change Levy exemption (CCL) scheme, and Non Fossil Fuel Obligation (NFFO) scheme, as well as the Offtaker of Last Resort (OLR) scheme.

    It applies to information we process concerning:

    • Renewable Electricity scheme applicants, scheme participants, registered users of the Renewables & Combined Heat and Power (R&CHP) Register and the Central FIT Register (CFR), and other obligated persons.
    • Individuals who contact Ofgem with a query, for example a right of access request, regarding Renewable Electricity schemes.
    • People who sign up to receive the RO newsletter, Fuelling & Sustainability newsletter, CFR newsletter, or R&CHP newsletter.


    To find out more information on how Ofgem processes personal data, refer to the Ofgem Umbrella Privacy Notice.

    Controller

    The controller for the processing of any personal information as outlined in this privacy notice is the Gas and Electricity Markets Authority, (GEMA). For ease of reference this privacy notice refers to the administrative office of GEMA, \\u201COfgem\\u201D throughout.

    Your information

    1. What personal information do we collect?

      We will collect informationdirectlyfrom you when:

      • you register as a user or participant on the R&CHP Register or CFR
      • you apply for accreditation under the RO, FIT, REGO, the SEG and CCL schemes
      • you contact us with an enquiry relating to the Renewable Electricity schemes
      • you submit periodic data or declarations as per your ongoing obligation under these schemes
      • during any subsequent audit, for example an audit of an accredited generating station.

      This information includes:

      • your name
      • the address of the installed generation equipment (which may be your home address)
      • your email address and telephone number
      • the technology of the generating equipment
      • the installed capacity of the generating equipment
      • the date on which the generating equipment was commissioned
      • the specific location of the generating equipment (grid reference)
      • Meter Point Administration Number (MPAN)/Meter Point Registration Number (MPRN) assigned to the meter(s) associated with the generating equipment
      • documentary evidence in support of your application, including (but not limited to) Engineering Recommendation G59 certificates and other relevant certificates, installation and testing records, funding agreements, planning permission statements, schematic diagrams of the generating equipment, and generation records.

      We will also collect information directly from you when you sign up to our newsletter(s), or respond to our customer satisfaction (CSAT) surveys. We will collect and store your name and email address in order to send these to you, as well as your responses to questions posed relating to our performance in administering the scheme(s). You can request your information be removed from the newsletter distribution list at any time by emailing Renewable@ofgem.gov.uk.


      We receive informationindirectlywhen:

      • You have applied for FIT accreditation via a FIT licensee. FIT licensees are obliged to submit installation details to Ofgem via the CFR. This information includes the details listed above, as well as the contact address of the generator and information contained on your MCS installation certificate, if applicable.
      • You have applied for the RO scheme via an Agent or Rent-a-Roof organisation, who collect data from you, and then share this with Ofgem for the purposes of gaining accreditation under the RO scheme.
      • You have applied to receive a SEG export tariff via a SEG licensee. SEG licensees use the CFR to check whether an import or export MPAN is associated with an installation in receipt of FIT export payments.
      • In addition, during regular audits of accredited generators, portfolio operators, agents, installers or Rent-a-Roof organisations, we may receive information indirectly via a third party who we have contracted to undertake auditing work on our behalf. This information may include further documentary evidence relating to the installed generating equipment, including photographs.
    2. Why we need to collect and process your information

      We only collect information that we need in order to carry out our functions in relation to the Renewable Electricity schemes within our remit. Our primary functions are to:

      • administer the RO, FIT, REGO, CCL, the SEG, NFFO and OLR schemes
      • ensure any payments or issuance of certificates are timely and accurate
      • verify the eligibility of generating stations and installations applying for accreditation under the schemes
      • verify the volumes of renewable electricity generated by any accredited generating station
      • assign the correct tariff rate or ROC rate applicable to the accredited generating station or FIT installation for which support is claimed
      • monitor electricity supplier performance and compliance with the schemes
      • assist us in the identification of fraud.

      Your information is not used:

      • for profiling, ie automated processing of personal data to evaluate certain things about an individual eg direct marketing.

      In some cases we use data analytics1 software to:

      • validate claims made in respect of electricity generated by an accredited generator
      • identify fraud
      • improve the services we provide
      • ensure compliance with RO, FIT, REGO, CCL, NFFO and OLR scheme requirements.

      1 Any data sets processed are sufficiently anonymised to not constitute personal data and are compliant with the UK Statistics Authority Code of Practice for Official Statistics (principle 5: confidentiality)
    3. How we collect your information

      We collect your information if you:

      • visit our website to allow you to make repeat visits. You can find out how we do this through the use of cookies by clicking on the link: here
      • engage with us when we carry out our statutory and administrative functions
      • make enquiries about, and applications to the RO, FIT, REGO, the SEG, CCL and NFFO schemes
      • submit information and data to us via an online portal, for example the R&CHP Register
      • use our services, for example subscribe to our RSS feeds, e-newsletters, social media sites, email alerts or request a publication from us
      • email, fax, or telephone us, or send information to us in paper format
      • contact us in relation to information requests, complaints and general enquiries.
    4. How and when we will disclose your information

      We only collect information that we need in order to effectively administer the government\\u2019s Renewable Electricity schemes in line with the requirements under legislation and licence conditions, as detailed above. Any data you provide will not be transferred outside the European Community.


      We will only disclose your personal information in the following circumstances:

      • where the disclosure is required by law, statutory direction, court orders, or is necessary for the purposes of the administration of the RO, FIT, REGO, the SEG, CCL, NFFO or OLR schemes
      • where you give us explicit permission to disclose it
      • for the processing and sharing of relevant information during audits.

      We will only share your information with the following organisations or official bodies:

      • third-party auditors who audit the information provided to us by you (we will require such third parties to agree to treat the information in accordance with this Privacy Policy)
      • licensed electricity suppliers (including FIT and SEG Licensees)
      • Micro-generation Certification Scheme operators (MCS)
      • the Renewable Energy Consumer Code (RECC)
      • Distribution Network Operators (DNOs)
      • Action Fraud in England or Wales or the police in Scotland when we have found instances of suspected fraud
      • The Secretary of State for Business, Energy and Industrial Strategy, who has issued a notice that legally compels Ofgem to disclose specified information collected for the purposes of administering the schemes.
    5. Legal basis for processing your information

      We collect and process your information as part of our remit as the administrator of the RO, FIT, REGO, the SEG, CCL, NFFO and OLR schemes, as set out in legislation, including the following statutory instruments:

      • The Electricity Act 1989
      • The Renewables Obligation Order 2015
      • The Renewables Obligation (Scotland) Order 2009
      • The Renewables Obligation Closure Order 2014
      • The Feed-in Tariffs Order 2012
      • The Renewables Obligation Order (Northern Ireland) 2009
      • The Renewables Obligation Closure Order (Northern Ireland) 2015
      • The Smart Export Guarantee Order 2019
      • The Electricity from Non-Fossil Fuel Sources Saving Arrangements Order 2000 (as amended)
      • The Electricity from Non-Fossil Fuel Sources (Scotland) Saving Arrangements Order 2005 (as amended)
      • The Climate Change Levy (General) Regulations 2001 (as amended)
      • The Electricity (Guarantees of Origin of Electricity Produced from Renewable Energy Sources) Regulations 2003
      • The Power Purchase Agreement Scheme Regulations 2014 (as amended).

      We would not be able to fulfil our obligations as the administrator of the RO, FIT, REGO, the SEG, CCL, NFFO and OLR schemes without collecting and using your information.


      We also process your information on the basis of legitimate interest. We use this basis in order to operate our RO, Fuelling & Sustainability, CFR and R&CHP newsletters, where, if you have opted in, we store your name and email address in order to send you updates on the schemes. You are free to unsubscribe from the newsletters at any time, either by emailing us or by clicking on the \\u201Cunsubscribe\\u201D button at the bottom of any newsletter you receive.

    6. How long do we keep your information?


      Your personal information is deleted when we no longer need it for our functions in administering the RO, FIT, REGO, the SEG, CCL, NFFO and OLR schemes. As such, it is retained by Ofgem for the duration of the relevant scheme, and for a period of 6 years thereafter.

    7. Sharing your information outside the European Union


      Any information you provide will not be transferred outside the European Union.


      Where we use cloud processing to support our data processing, the servers are located within the European Union.

    8. Your rights


      To see the full suite of new consumer rights available to you under GDPR, refer to the Ofgem Umbrella Privacy Notice.

      You can exercise these rights by contacting our Data Protection Officer, whose contact details are below.

    9. How to contact us or make a complaint to us


      If you want to exercise any of your rights, request information about our privacy policy, know more about the information we hold about you or make a complaint about how we\\u2019ve handled your information, you can email us at dpo@ofgem.gov.uk or write to:


      The Data Protection Officer
      Ofgem
      10 South Colonnade
      Canary Wharf
      London
      E14 4PU


      You can also contact us to request this notice in an oral format.

    10. Complaints to the Information Commissioner


      You have a right to complain to the Information Commissioner. If you want to raise a concern about how we have handled your information, you can report it direct to the Information Commissioner\\u2019s Office at the following address:

      Information Commissioner\\'s Office
      Wycliffe House
      Water Lane
      Wilmslow
      Cheshire
      SK9 5AF
      Telephone: 0303 123 1113
      Online: Live chat

    11. Privacy policy changes

      We regularly review our privacy notices. This notice was last updated on 15 May 2018. During this update we made changes to align the wording with the General Data Protection Regulation and Data Protection Act 2018.

    Homepage
    ');\n$templateCache.put('app/basicPages/termsAndConditions/terms.html','

    Terms & Conditions

    Homepage
    ');\n$templateCache.put('app/components/audit/audit.html','

    {{vm.entityType}} history: {{vm.entityName}}

    Return
    ');\n$templateCache.put('app/components/audit/auditTable.html','
    AuthorTimestampChangesComments
    {{entry.author}}{{entry.timestamp | date:\\'dd-MM-yyyy HH:mm:ss\\'}}
    Created
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    {{entry.comment}}

    ');\n$templateCache.put('app/components/conversationDialog/conversation-dialog.html','
    ');\n$templateCache.put('app/components/data-presentation/displayData.html','
    {{layoutItem.label}}:
    {{vm.getFormattedData(layoutItem, dataItem)}}
    History

    ');\n$templateCache.put('app/components/dialog/commentDialog.html','');\n$templateCache.put('app/components/dialog/dialog.html','
    ');\n$templateCache.put('app/components/loader/fitLoader.html','
    ');\n$templateCache.put('app/components/form/accordionSection.html','
    ');\n$templateCache.put('app/components/form/addressSearch.html','
    No results found for this postcode
    ');\n$templateCache.put('app/components/form/asyncSelect.html','
    {{selectVm.options[0].name}}
    {{to.noOptionsMessage}}
    There was an error loading data from the server.
    ');\n$templateCache.put('app/components/form/button.html','');\n$templateCache.put('app/components/form/datepicker.html','
    ');\n$templateCache.put('app/components/form/datetimepicker.html','

    ');\n$templateCache.put('app/components/form/emptySelectOptions.html','
    0 || to.disabled\">
    {{to.noOptionsMessage}}
    ');\n$templateCache.put('app/components/form/fitCheckbox.html','
    {{ options.validation.messages.keys() }}
    {{message(options.formControl.$viewValue, options.formControl.$modelValue, this)}}
    ');\n$templateCache.put('app/components/form/fitFilePicker.html','
    The document must be less than {{to.maxFileSize}}
    ');\n$templateCache.put('app/components/form/fitInlineError.html','');\n$templateCache.put('app/components/form/fitInlineWarning.html','
    ');\n$templateCache.put('app/components/form/fitMultiselect.html','{{$item[to.nameProp]}}
    ');\n$templateCache.put('app/components/form/fitRadio.html','
    {{to.label}} {{to.hint}}{{ options.validation.messages.keys() }}
    {{message(options.formControl.$viewValue, options.formControl.$modelValue, this)}}
    ');\n$templateCache.put('app/components/form/fitTypeahead.html','
    No results found
    ');\n$templateCache.put('app/components/form/form-template.html','
    {{$ctrl.error}}
    ');\n$templateCache.put('app/components/form/input.html',' {{ options.validation.messages.keys() }}
    {{message(options.formControl.$viewValue, options.formControl.$modelValue, this)}}
    ');\n$templateCache.put('app/components/form/progressiveDisclosure.html','
    {{vm.heading}}
    {{vm.body}}
    ');\n$templateCache.put('app/components/form/progressiveDisclosureField.html','
    ');\n$templateCache.put('app/components/form/repeatSection.html','

    ');\n$templateCache.put('app/components/form/storageRadioExternal.html','
    {{to.label}} {{to.hint}}{{ options.validation.messages.keys() }}
    {{message(options.formControl.$viewValue, options.formControl.$modelValue, this)}}
    ');\n$templateCache.put('app/components/form/storageRadioInternal.html','
    {{to.label}} {{to.hint}}{{ options.validation.messages.keys() }}
    {{message(options.formControl.$viewValue, options.formControl.$modelValue, this)}}
    ');\n$templateCache.put('app/components/form/strictLengthInput.html','');\n$templateCache.put('app/components/table/datePicker.html','
    ');\n$templateCache.put('app/components/table/fitTable.html','
    {{$table.error}}
    {{::$table.options.noResultsMessage || \\'No data found\\'}}
    ');\n$templateCache.put('app/components/task-view/assignTaskDialog.html','');\n$templateCache.put('app/components/task-view/taskView.html','
    ');\n$templateCache.put('app/components/warning/serverWarning.html','There was an error communicating with the server. Please try again later.');\n$templateCache.put('app/components/warning/warningMessage.html','');\n$templateCache.put('app/components/wizard/wizardFormStep.html','

    {{vm.title}}

    ');\n$templateCache.put('app/components/wizard/wizardStepDefinition.html','');\n$templateCache.put('app/editableText/preview/editable-text-preview.html','
    ');\n$templateCache.put('app/installations/address/installations-address.html','

    Register Installation - Address

    ');\n$templateCache.put('app/installations/approvalDocuments/approval-documents.html','
    Please upload any documents for the following review reasons:

  • {{reason.reason}} :


  • ');\n$templateCache.put('app/installations/approvals/approve-edit.html','

    {{vm.title || \\'Pending edit\\'}}

    ');\n$templateCache.put('app/installations/approvals/approve-extension.html','

    {{vm.title || \\'Pending extension\\'}}

    ');\n$templateCache.put('app/installations/approvals/approve-installation.html','

    New installation

    ');\n$templateCache.put('app/installations/approvals/approve-recipient-reassignment.html','

    {{vm.title || \\'Pending recipient reassignment\\'}}

    ');\n$templateCache.put('app/installations/approvals/approve-status-change.html','

    {{vm.title || \\'Pending capacity status change\\'}}

    ');\n$templateCache.put('app/installations/approvals/edit-installation-data-view.html','
      0\">
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    0\">Capacity changed: {{extensionRef | uppercase }}
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    0\">

    Added meter to {{meterChange.capacityExtensionReference}}
    Deleted meter from {{meterChange.capacityExtensionReference}}
    Edited meter on {{meterChange.capacityExtensionReference}} {{meterChange.movedFrom ? \\'\\\\(moved from \\' + meterChange.movedFrom + \\'\\\\)\\' : \\'\\'}}
    • {{change.fieldName}}: {{change.valueAfter}} {{change.fieldName}}: {{change.valueBefore}}
      {{change.fieldName}}: {{change.valueBefore}} (no change) {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    Assigned to: {{vm.assigneeName ? vm.assigneeName : \"None\"}}

    ');\n$templateCache.put('app/installations/approvals/installation-change-approval.html','{{vm.error.preMessage}}{{vm.error.postMessage}}
    Approval is needed for the following reason(s):
    • {{reason.reason ? reason.reason : reason}}
    ');\n$templateCache.put('app/installations/approvals/new-extension-data-view.html','
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    Assigned to: {{vm.assigneeName ? vm.assigneeName : \"None\"}}

    ');\n$templateCache.put('app/installations/approvals/new-installation-data-view.html','

    Assigned to: {{vm.assigneeName ? vm.assigneeName : \"None\"}}

    ');\n$templateCache.put('app/installations/approvals/reassign-recipient-data-view.html','
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}
    Capacity changed: {{extensionRef | uppercase }}
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    0\">

    Assigned to: {{vm.assigneeName ? vm.assigneeName : \"None\"}}

    ');\n$templateCache.put('app/installations/approvals/status-change-data-view.html','
    • {{change.fieldName}}: {{change.valueBefore}} \\u2192 {{change.valueAfter}}

    Assigned to: {{vm.assigneeName ? vm.assigneeName : \"None\"}}

    ');\n$templateCache.put('app/installations/basicDetails/installations-basics.html','
    ');\n$templateCache.put('app/installations/common/accreditationWarning.html','Please check the information you have added. The accreditation number is already associated with an existing FIT installation. Please contact the CFR Team (FITregister@ofgem.gov.uk) if you were not expecting this error to occur.');\n$templateCache.put('app/installations/common/capacity-details.html','
    History Decommission Decommission Set to under investigation Remove under investigation Delete extension
    ');\n$templateCache.put('app/installations/common/certificateWarning.html','The EPC Number you have entered already exists. Please check that it was entered correctly, then either enter a different certificate number, or provide a comment explaining why the pre-existing number is valid.');\n$templateCache.put('app/installations/common/declaredCapacityWarning.html','Your declared net capacity is less than half of your total installed capacity. Are you sure you wish to continue?');\n$templateCache.put('app/installations/common/installations-csvimport.html','

    Import history
    ');\n$templateCache.put('app/installations/dateUpdates/installations-dates-edit.html','
    The installation has either a pending switch request or is in status removed and cannot be edited.The installation is currently unallocated and cannot be changed.The installation has a pending amendment and cannot be altered.Cancel
    ');\n$templateCache.put('app/installations/dateUpdates/installations-dates-find.html','
    ');\n$templateCache.put('app/installations/dateUpdates/installations-dates.html','
    ');\n$templateCache.put('app/installations/edit/installation-edit-status.html','

    Edit statuses of {{vm.fitId}}

    Update the payment status and the status of all associated capacities.
    ');\n$templateCache.put('app/installations/edit/installation-edit.html','

    Edit installation: {{vm.fitId}}



    The EPC country entered does not match the installation address. Please enter a comment above detailing why this is correct, or amend the EPC country.The EPC Number you have entered already exists. Please check that it was entered correctly, then either enter a different certificate number, or provide a comment explaining why the pre-existing number is valid.At least one other accredited FIT installation ({{vm.matchingInstallationIds.join(\", \")}}) of the same technology has already been registered at this location. If you were not aware of this and would like more information please contact Ofgem (FITRegister@ofgem.gov.uk). By continuing, you acknowledge that you have carried out the necessary checks including determining the site for this installation and you are satisfied that it is not an extension.
    • {{entry}}

    Please note that this edit will be held for approval for the following reasons:
    • {{reason}}
    Please ensure you enter a justification comment above, or amend the details.
    Please enter a comment explaining why this edit is correct.{{ error }}
    ');\n$templateCache.put('app/installations/efficiency/installations-efficiency.html','
    ');\n$templateCache.put('app/installations/extensions/existing-installation-panel.html','
    ');\n$templateCache.put('app/installations/extensions/extension-accreditation.html','
    You cannot create an MCS extension of a hydro or AD installation.You cannot create a ROO-FIT extension if the original installation does not have a name.
    ');\n$templateCache.put('app/installations/extensions/extension-details.html','
    ');\n$templateCache.put('app/installations/extensions/extension-efficiency.html','
    ');\n$templateCache.put('app/installations/extensions/extension-export-status.html','
    ');\n$templateCache.put('app/installations/extensions/extension-meters.html','
    ');\n$templateCache.put('app/installations/extensions/extension-submission.html','
    Please note your registered extension will be held for approval for the following reasons:
    • {{reason}}
    {{vm.error}}Your declared net capacity is less than half of your total installed capacity. Are you sure you wish to continue?
    ');\n$templateCache.put('app/installations/extensions/extension.html','
    ');\n$templateCache.put('app/installations/forms/installation-search-form.html','');\n$templateCache.put('app/installations/generators/installations-create-generator.html','

    Register Installation - Create FIT Generator

    ');\n$templateCache.put('app/installations/generators/installations-generators.html','

    Register Installation - FIT Generator

    ');\n$templateCache.put('app/installations/installation/installation-actions.html',' ');\n$templateCache.put('app/installations/installation/installation-approval-documents.html','');\n$templateCache.put('app/installations/installation/installation-details.html','

    Installation - {{vm.installation.fitId}}

    The installation has either a pending switch request or is in status removed and cannot be edited.It is not possible to edit this installation as the validations have previously been overriden. Please contact the CFR Team if you wish to make an amendment to this installation.
    There is a pending extension for this installation.
    There is a pending edit for this installation.
    There is a pending status change for this installation.
    There is a pending recipient reassignment for this installation.
    This installation does not have a nominated recipient.

    Linked installations are installations which share the same FIT generator or nominated recipient as the selected installation. If there are any linked installations these will appear in a list below.

    Back');\n$templateCache.put('app/installations/installation/installation-document-upload.html','
    ');\n$templateCache.put('app/installations/installation/installation-internal-documents.html','');\n$templateCache.put('app/installations/installation/installation-public-documents.html','');\n$templateCache.put('app/installations/installation/installation-reassign.html','');\n$templateCache.put('app/installations/landing/installations-landing.html','

    Register Installation - Complete

    Submission information for installation: {{vm.pendingApproval ? \\'pending\\' : vm.installation.fitId}}

    ');\n$templateCache.put('app/installations/licences/installations-licences.html','
    ');\n$templateCache.put('app/installations/meterInfo/display-meters.html','

    Supply meters:

    Supply meters: none (off grid)

    0\">Export meters:

    Export meters: none (off grid)

    Export meters: none (no export)

    Generation meters:

    ');\n$templateCache.put('app/installations/meterInfo/installations-meters.html','');\n$templateCache.put('app/installations/meterInfo/meters-form.html','
    0\" heading=\"Existing meters\" is-open=false>
    ');\n$templateCache.put('app/installations/multiSite/installations-multiSite.html','

    Register Installation - Multiple Installations

    ');\n$templateCache.put('app/installations/recipient/installations-create-recipient.html','

    Register Installation - Create Nominated Recipient

    ');\n$templateCache.put('app/installations/recipient/installations-recipient.html','

    Nominated Recipient

    ');\n$templateCache.put('app/installations/recipient/recipient-table.html','
    ');\n$templateCache.put('app/installations/recipient/select-nominated-recipient.html','
    ');\n$templateCache.put('app/installations/recipient/select-recipient.html','');\n$templateCache.put('app/installations/submission/installations-submission.html','

    Register Installation - Review and Submit

    ');\n$templateCache.put('app/installations/switching/installations-switch-navigation.html','
    ');\n$templateCache.put('app/installations/switching/installations-switch-pending.html','
    ');\n$templateCache.put('app/installations/switching/installations-switch-request.html','
    • {{error}}
    ');\n$templateCache.put('app/installations/switching/installations-switch-search.html','
    ');\n$templateCache.put('app/installations/tables/installation-document-table.html','
    Upload documents
    ');\n$templateCache.put('app/installations/tariff/installations-breachedTariff.html','

    Reached capacity cap

    ');\n$templateCache.put('app/installations/tariff/installations-edit-fitClosure-error.html','

    FIT Closure In Effect - Edit

    ');\n$templateCache.put('app/installations/tariff/installations-noTariff.html','

    No tariff found for installation

    ');\n$templateCache.put('app/installations/tariff/installations-registration-fitClosure-error.html','

    FIT Closure In Effect - Registration

    ');\n$templateCache.put('app/installations/technology/installations-technology.html','
    If the technology type for a ROO-FIT installation is \\'Photovoltaic\\' or \\'Wind\\', then the declared net capacity must be greater than {{vm.techSpecificDeclaredCapacityMinimumKilowatts}}kW. Please go to the previous page and fix this, or choose a different technology.If the technology type for the installation is \\'Micro CHP\\', then the total installed capacity must be less than {{vm.microCHPInstalledCapacityLimitKilowatts}}kW. Please go to the previous page and fix this, or choose a different technology.
    The community reference you have chosen already exists. Please check that it was entered correctly, then contact the CFR Team (FITregister@ofgem.gov.uk) if this error continues to appear.At least one other accredited FIT installation ({{vm.matchingInstallationIds.join(\", \")}}) of the same technology has already been registered at this location. If you were not aware of this and would like more information please contact Ofgem (FITRegister@ofgem.gov.uk). By continuing, you acknowledge that you have carried out the necessary checks including determining the site for this installation and you are satisfied that it is not an extension.{{ error }}
    ');\n$templateCache.put('app/levelisation/data/editLevelisationData.html','

    Submit levelisation data: {{vm.levelisation.displayName}} ({{vm.levelisation.startDate | date:\\'dd-MM-yyyy\\'}} - {{vm.levelisation.endDate | date:\\'dd-MM-yyyy\\'}})

    Licence details


    New installations


    Ongoing installations


    Assign Raise and review internal query Raise and review query
    ');\n$templateCache.put('app/levelisation/data/installationDetails.html','
    Number:{{vm.count | number }}
    FIT qualifying cost: {{vm.cost | currency:\\'\\xA3\\':2}} Unavailable
    Individual qualifying cost: {{vm.count * vm.cost | currency:\\'\\xA3\\':2}} Unavailable
    ');\n$templateCache.put('app/levelisation/data/levelisationDataDetails.html','
    Licence name: {{ vm.licence.name }}
    Supplier name: {{ vm.licence.supplierName }}
    Levelisation period: {{ vm.levelisation.displayName }}
    Licence number: {{ vm.licence.companyRegistrationNumber }}
    Supplier ID: {{ vm.licence.supplierId }}
    Submission date: {{ vm.data.submissionDate | date:\\'dd-MM-yyyy\\' }}
    FIT status: {{ vm.data.fitStatus }}
    ');\n$templateCache.put('app/levelisation/data/listLevelisationData.html','

    Levelisation data: {{vm.dataSummary.displayName}}

    System sell price: There is no data currently awaiting your approval. You must approve at least one entry individually before approving all entries.
    There is no data currently awaiting your approval. You must approve at least one entry individually before approving all entries.
    No data has been submitted. Not all submitted data has been approved. System sell price is not set.
    Back');\n$templateCache.put('app/levelisation/data/selectLevelisationData.html','

    Submit levelisation data

    Export submission data

    ');\n$templateCache.put('app/levelisation/data/viewLevelisationData.html','

    View levelisation data: {{vm.levelisationDetails.displayName}}

    Licence details


    Levelisation data

    Total electricity supplied (MWh): {{vm.levelisationData.totalElectricitySupplied | number:3}}
    Total FIT generation payment due: {{vm.levelisationData.totalFitGenerationPaymentDue | currency:\\'\\xA3\\':2}}
    Total exempt green import electricity supplied (MWh): {{vm.levelisationData.totalExemptGreenImportElectricitySupplied | number:3}}
    Total FIT export payment due: {{vm.levelisationData.totalFitExportPaymentDue | currency:\\'\\xA3\\':2}}
    Total relevant electricity supplied (MWh): {{vm.levelisationData.relevantSupply | number:3}}
    Total EII electricity supplied (MWh): {{vm.levelisationData.totalEiiElectricitySupplied | number:3}}
    Total FIT deemed export payment due: {{vm.levelisationData.totalFitDeemedExportPaymentDue | currency:\\'\\xA3\\':2}}
    Total EII exempt excluded electricity supplied (MWh): {{vm.levelisationData.totalEiiExemptExcludedElectricitySupplied | number:3}}
    Total deemed electricity (MWh): {{vm.levelisationData.totalDeemedElectricity | number:3}}
    Domestic Supply Volume (MWh): {{vm.levelisationData.domesticSupplyVolume | number:3}}
    Non-Domestic Supply Volume (MWh): {{vm.levelisationData.nonDomesticSupplyVolume | number:3}}
    Total FIT metered export payment due: {{vm.levelisationData.totalFitMeteredExportPaymentDue | currency:\\'\\xA3\\':2}}
    Total metered electricity (MWh): {{vm.levelisationData.totalMeteredElectricity | number:3}}
    Total relevant electricity supplied (MWh): {{vm.levelisationData.relevantSupply | number:3}}

    Total FIT generation electricity (MWh): {{vm.levelisationData.totalFitGenerationElectricity | number:3}}
    Total FIT export electricity (MWh): {{vm.levelisationData.totalFitExportElectricity | number:3}}
    Number of installations in receipt of FIT payments: {{vm.levelisationData.numberOfInstallationsInReceiptOfFitPayments | number:0}}

    New installations


    Existing installations



    Approve


    Change history

    ');\n$templateCache.put('app/levelisation/mutualisation/editLevelisationMutualisation.html','

    Mutualisations: {{vm.levelisation.displayName}} ({{vm.levelisation.startDate | date:\\'dd-MM-yyyy\\'}} - {{vm.levelisation.endDate | date:\\'dd-MM-yyyy\\'}})

    Licence details

    ');\n$templateCache.put('app/levelisation/mutualisation/listLevelisationMutualisation.html','

    Mutualisation Page: {{vm.dataSummary.displayName}}

    The levelisation shortfall has exceeded the mutualisation cap value and therefore FIT licencees which were owed levelisation funds will be required to absorb the additional shortfall.
    Mutualisation has been approved.
    Mutualisation Finalised.

    Back

    ');\n$templateCache.put('app/levelisation/mutualisation/mutualisationCalculationHelp.html','');\n$templateCache.put('app/levelisation/mutualisation/viewLevelisationMutualisation.html','

    View levelisation mutualisation: {{vm.levelisationDetails.displayName}}

    Licence details


    Levelisation mutualisation

    Mutualisation Cost Per Supplier Market Share: {{vm.levelisationMutualisation.mutualisationCostPerSupplierMarketShare | currency:\\'\\xA3\\':2}}
    Actual Payment Figure:: {{vm.levelisationMutualisation.actualPaymentFigure | currency:\\'\\xA3\\':2}}
    Payment Date: {{vm.levelisationMutualisation.paymentDate | date}}
    Payment Difference Check: {{vm.levelisationMutualisation.mutualisationCostPerSupplierMarketShare - vm.levelisationMutualisation.actualPaymentFigure | currency:\\'\\xA3\\':2}}
    Comment: {{vm.levelisationMutualisation.paymentComment}}


    Approve


    Change history

    Back');\n$templateCache.put('app/levelisation/payment/editLevelisationPayment.html','

    Submit levelisation payment: {{vm.levelisation.displayName}} ({{vm.levelisation.startDate | date:\\'dd-MM-yyyy\\'}} - {{vm.levelisation.endDate | date:\\'dd-MM-yyyy\\'}})

    Licence details

    ');\n$templateCache.put('app/levelisation/payment/listLevelisationPayment.html','

    Levelisation payment: {{vm.dataSummary.displayName}}

    Back

    ');\n$templateCache.put('app/levelisation/payment/viewLevelisationOverpayment.html','

    Levelisation Overpayment: {{vm.dataSummary.displayName}}

    Back');\n$templateCache.put('app/levelisation/payment/viewLevelisationPayment.html','

    View levelisation payment: {{vm.levelisationDetails.displayName}}

    Licence details


    Levelisation data

    {{vm.levelisationDetails.period == \\'Annual\\' ? \\'Total Invoice Figure:\\' : \\'Periodic Invoice Figure:\\'}}
    {{vm.levelisationPayment.totalInvoiceFigure | currency:\\'\\xA3\\':2}}
    Actual Payment figure:
    {{vm.levelisationPayment.actualPaymentFigure | currency:\\'\\xA3\\':2}}
    Payment Date:
    {{vm.levelisationPayment.paymentDate | date}}
    Payment Difference Check:
    {{vm.levelisationPayment.paymentDifferenceCheck | currency:\\'\\xA3\\':2}}
    Comment:
    {{vm.levelisationPayment.paymentComment}}


    Approve


    Change history

    Back');\n$templateCache.put('app/levelisation/results/levelisationCalculationHelp.html','');\n$templateCache.put('app/levelisation/results/levelisationCalculationHelp_Levelisation2019InEfect.html','');\n$templateCache.put('app/levelisation/results/viewLevelisationResults.html','

    Levelisation results: {{vm.totals.displayName}}

    The system sell price has not yet been set, so this preview is incomplete.
    Total electricity supplied (MWh): {{vm.totals.totalElectricitySupplied | number:3}}
    Levelisation fund: {{vm.totals.totalLevelisationFund | currency:\\'\\xA3\\':2}}
    Total adjusted exempt supply (MWh): {{vm.totals.totalAdjustedExemptSupply | number:3}}
    Total Fit export payment due: {{vm.totals.totalMeteredExportPayments + vm.totals.totalDeemedExportPayments | currency:\\'\\xA3\\':2}}
    Total relevant electricity supplied (MWh): {{vm.totals.totalRelevantElectricitySupplied | number:3}}
    Total FIT qualifying costs - new: {{vm.totals.totalNewQualifyingCosts | currency:\\'\\xA3\\':2}}
    Total FIT generation payments: {{vm.totals.totalGenerationPayments | currency:\\'\\xA3\\':2}}
    Total FIT qualifying costs - ongoing: {{vm.totals.totalExistingQualifyingCosts | currency:\\'\\xA3\\':2}}
    Total deemed FIT export payments: {{vm.totals.totalDeemedExportPayments | currency:\\'\\xA3\\':2}}
    System sell price: {{vm.totals.systemSellPrice | currency:\\'\\xA3\\':3}}
    Total deemed electricity (MWh): {{vm.totals.totalDeemedExportElectricity | number:3}}
    Exempt supply cap (MWh): {{vm.totals.exemptSupplyCap | number:3}}
    Total metered FIT export payments: {{vm.totals.totalMeteredExportPayments | currency:\\'\\xA3\\':2}}
    Total revoked supply (MWh): {{vm.totals.totalRevokedSupply | number:3}}
    Total metered electricity (MWh): {{vm.totals.totalMeteredExportElectricity | number:3}}
    Total revoked payments: {{vm.totals.totalRevokedPayment | currency:\\'\\xA3\\':2}}

    Back');\n$templateCache.put('app/levelisation/shortfall/listLevelisationShortfall.html','

    Shortfall Page : {{vm.dataSummary.displayName}}

    Mutualisation has been triggered.No shortfall for this period. 0) && !(vm.totals.exceededThreshold || vm.totals.exceededCap) && (vm.totals.mutualisationThreshold == null)\">Total Shortfall: {{vm.totals.shortfallTotal | currency:\\'\\xA3\\':2}} 0) && !(vm.totals.exceededThreshold || vm.totals.exceededCap) && (vm.totals.mutualisationThreshold != null)\">Total Shortfall: {{vm.totals.shortfallTotal | currency:\\'\\xA3\\':2}}; Mutualisation Threshold: {{vm.totals.mutualisationThreshold | currency:\\'\\xA3\\':2}} 0) && vm.totals.exceededThreshold && !vm.totals.exceededCap\">Total Shortfall: {{vm.totals.shortfallTotal | currency:\\'\\xA3\\':2}}; Threshold: {{vm.totals.mutualisationThreshold | currency:\\'\\xA3\\':2}} 0) && vm.totals.exceededCap\">Total Shortfall: {{vm.totals.shortfallTotalAfterMutualisation | currency:\\'\\xA3\\':2}}; Cap: {{vm.totals.mutualisationCap | currency:\\'\\xA3\\':2}}

    Back

    ');\n$templateCache.put('app/levelisation/shortfall/viewLevelisationShortfall.html','

    View Shortfall: {{vm.levelisationDetails.displayName}}

    Licence details


    Shortfall data

    Original Statement Value {{vm.levelisationShortfall.originalStatementValue | currency:\\'\\xA3\\':2}}
    Percentage Of Fund Due {{vm.levelisationShortfall.percentageOfFundDue | number:2}}%
    Contribution Towards ShortFall: {{vm.levelisationShortfall.contributionTowardsShortFall | currency:\\'\\xA3\\':2}}
    Final Value: {{vm.levelisationShortfall.finalValue | currency:\\'\\xA3\\':2}}

    Approve


    Change history

    Back');\n$templateCache.put('app/levelisation/shortfall/viewShortfallSummaryTable.html','

    Shortfall Summary : {{vm.totals.displayName}}

    Mutualisation has been triggered.
    Back');\n$templateCache.put('app/recipients/creator/recipient-creator.html','
    ');\n$templateCache.put('app/recipients/recipient/delete-recipient.html','');\n$templateCache.put('app/recipients/recipient/recipient-details-component.html','

    History
    ');\n$templateCache.put('app/recipients/recipient/recipient-edit.html','

    {{vm.title}}

    ');\n$templateCache.put('app/recipients/recipient/recipient-installations.html','
    ');\n$templateCache.put('app/recipients/recipient/recipient.html','

    {{vm.recipientDisplayName}} details

    Back');\n$templateCache.put('app/recipients/selector/recipient-selector.html','
    ');\n$templateCache.put('app/registration/confirmation/registration-confirm.html','

    Confirm details

    By clicking the Confirm button below, you are confirming that the details that you have previously entered are correct.

    Warning
    Your notification email address, {{vm.registrationDataService.getSupplierDetails().notificationEmailAddress}}, must be correct to complete the registration process.
    Go back Cancel registration
    ');\n$templateCache.put('app/registration/licenses/registration-licenses.html','

    Licence details

    Page 3 of 3
    Licence company registration number is required
    Licence name is required This licence name is already in use. Please contact the CFR Team at FITRegister@ofgem.gov.uk if you are having issues registering a new licence. This licence name has already been entered.
    Licence type confirmation is required.
    Licence effective from date is required The licence effective from date must be a valid date in the form DD-MM-YYYY. The licence effective from date is required.
    ');\n$templateCache.put('app/registration/supplier/registration-supplier.html','

    Supplier details

    Page 1 of 3
    Supplier name is required Supplier name is limited to 60 characters A supplier registered with this name is already in use. Please contact the CFR Team at FITRegister@ofgem.gov.uk if you are having issues registering a new account.
    Include the full international dialling code
    Include the full international dialling code
    Notification email address is required Notification email address must be a valid email address
    No addresses found for this postcode.
    Address line 1 is required Address line 1 is limited to 50 characters
    Address line 2 is limited to 50 characters
    Town/City is required Town/City is limited to 50 characters
    County is limited to 50 characters

    Country is required
    Cancel registration
    ');\n$templateCache.put('app/registration/user/registration-confirmemail.html','
    ');\n$templateCache.put('app/registration/user/registration-user.html','

    Authorised signatory

    Page 2 of 3
    Title is required
    First name is required
    Last name is required
    Include the full international dialling code Telephone number is required
    Include the full international dialling code
    Email address is required E-Mail address must be a valid email address This e-mail address is already in use. Please contact the CFR Team at FITRegister@ofgem.gov.uk if you are having issues registering a new account.
    E-Mail addresses do not match

    Go back Cancel registration
    ');\n$templateCache.put('app/reports/fixed/audit-history.html','

    This report gives the audit history

    ');\n$templateCache.put('app/reports/fixed/fit-summary.html','

    FIT summary report

    This report provides a summary of the following information about the Feed in Tariff (FIT) scheme:

    Please use the options provided to filter your search.

    Loading report...

    This report details accredited FIT installations on the Central FIT Register at the time the report was requested and run.

    • {{filterProp}}: {{filterValue}}
    Technology{{vm.installationTypeNames[installationType]}}Totals
    installationsgeneratorsinstalled capacity (MW)installationsgeneratorsinstalled capacity (MW)
    {{vm.technologyTypeNames[technologyType]}}{{row.cells[installationType].installationCount}}{{row.cells[installationType].generatorCount}}{{row.cells[installationType].installedCapacity | number : 3}}{{row.totals.installationCount}}{{row.totals.generatorCount}}{{row.totals.installedCapacity}}
    Totals{{vm.data.columnTotals[installationType].installationCount}}{{vm.data.columnTotals[installationType].generatorCount}}{{vm.data.columnTotals[installationType].installedCapacity | number : 3}}{{vm.data.totals.installationCount}}{{vm.data.totals.generatorCount}}{{vm.data.totals.installedCapacity | number : 3}}

    Please note that GB and constituent country/regional/LA totals may not match due to some installation locations not being allocated to postcode areas.

    Please note that the Central FIT Register is populated with data from FIT licensees and related to a live scheme. Therefore data is subject to change without notice.

    Please be aware that the category of \\'community\\' under \\'installation type\\' has been captured for installations since the start of the FIT scheme and can relate to all technologies. It does not refer to the Comprehensive Review Phase 2B 2012 \\'community energy\\' status for PV tariff guarantee and energy efficiency. Information regarding this can be found on the Ofgem website in the detailed quaterly installation reports.

    Please note that the total number of FIT installations is a count of both original installations and subsequent extensions.

    Please not that this report does not provide details of installations that have been suspended, removed or terminated from the Central FIT Register and the FIT Scheme.

    Date: {{vm.data.dateGenerated | date : \\'dd-MMMM-yyyy HH:mm\\' }}

    ');\n$templateCache.put('app/reports/fixed/public-installations.html','

    This report gives a breakdown of accredited installations under the Feed-in Tariff (FIT) scheme. Please note that the Post Code and Supply MPAN details have been partially removed to ensure compliance with the Data Protection Act. If you have any questions relating to this report please contact FITCompliance@ofgem.gov.uk.

    ');\n$templateCache.put('app/suppliers/view/supplier.html','

    Supplier details - {{vm.supplier.name}}


    Supplier status:{{vm.supplier.status}}
    History
    Back
    ');\n$templateCache.put('app/tariff/create/tariff-create.html','

    Required {{vm.minDateValidationMessage}}
    Required
    {{tariff.tariffCode}}
    ({{tariff.oldTariff.tariffCode}})
    {{tariff.technologyTypeName}}
    ({{tariff.oldTariff.technologyTypeName}})
    {{tariff.installTypeName}}
    ({{tariff.oldTariff.installTypeName}})
    {{tariff.compReviewLevelTypeName}}
    ({{tariff.oldTariff.compReviewLevelTypeName}})
    {{tariff.minCapacity}} - {{tariff.maxCapacity}}
    ({{tariff.oldTariff.minCapacity}} - {{tariff.oldTariff.maxCapacity}})
    {{tariff.tariffValue}}
    ({{tariff.oldTariff.tariffValue}})
    {{tariff.eligibleFrom | date: \\'dd/MM/yyyy HH:mm:ss\\' }} - {{tariff.eligibleTo | date: \\'dd/MM/yyyy HH:mm:ss\\' }}
    ({{tariff.oldTariff.eligibleFrom | date: \\'dd/MM/yyyy HH:mm:ss\\' }} - {{tariff.oldTariff.eligibleTo | date: \\'dd/MM/yyyy HH:mm:ss\\' }})
    -
    {{tariff.capacityReachedDate | date: \\'dd/MM/yyyy HH:mm:ss\\' }}
    - -
    ');\n$templateCache.put('app/tariff/create/tariff-edit-item.html','');\n$templateCache.put('app/tariff/update/tariff-update-cancel.html','');\n$templateCache.put('app/tariff/update/tariff-update.html','

    Edit tariff

    History');\n$templateCache.put('app/components/form/dragAndDrop/dragAndDrop.html','

    {{$dnd.availableTitle}} Filter:

    • Loading available items...
    • {{$dnd.getName(item)}}

    {{$dnd.selectedTitle}}

    • Loading selected items...
    • {{$dnd.getName(item)}}
    ');\n$templateCache.put('app/components/form/fitForm/fitForm.html','
    {{$form.options.warningText}}
    {{$form.options.buttons.cancel}}
    ');\n$templateCache.put('app/installations/recipient/reassignment/recipient-reassignment-wizard.html','

    Installation - Assign new {{vm.recipientOptions.name}} to {{vm.installationFitId}}

    Cancel');\n$templateCache.put('app/installations/switching/completeSwitch/installations-switch-complete.html','
    ');\n$templateCache.put('app/installations/switching/installationDetails/installations-switch-details.html','
    This installation does not have a nominated recipient.
    ');\n$templateCache.put('app/installations/switching/rejectSwitch/installations-switch-reject.html','');\n$templateCache.put('app/levelisation/data/installations/levelisation-installation-table.html','
    ');\n$templateCache.put('app/levelisation/data/variation/levelisationDataVariation.html','');\n$templateCache.put('app/levelisation/data/variation/levelisationDataVariationDialog.html','
    ');\n$templateCache.put('app/suppliers/view/licence/licence-modal.html','
    ');\n$templateCache.put('app/suppliers/view/licence/licences.html','
    ');\n$templateCache.put('app/tariff/update/review/tariff-update-review.html','');\n$templateCache.put('app/installations/recipient/reassignment/multiSite/recipient-multi-site.html','
    Back
    ');\n$templateCache.put('app/installations/recipient/reassignment/selector/recipient-reassignment-creator.html','');\n$templateCache.put('app/installations/recipient/reassignment/selector/recipient-reassignment-selector.html','');\n$templateCache.put('app/installations/recipient/reassignment/submission/recipient-reassignment-submission.html','
    0\">
    You are assigning a multi-site {{$stateParams.recipientType.name}} to this installation. The tariff for the following installation capacities will be changed to those listed below.
    0\" uib-accordion close-others=false>
    New Tariff
    Old Tariff
    Tariff code:
    {{capacityTariff.newTariff.tariffCode}}
    ({{capacityTariff.oldTariff.tariffCode}})
    Tariff value:
    {{capacityTariff.newTariff.tariffValue}}
    ({{capacityTariff.oldTariff.tariffValue}})
    Tariff description:
    {{capacityTariff.newTariff.description}}
    ({{capacityTariff.oldTariff.description}})
    Back
    ');}]);"]}