/* Minification failed. Returning unminified contents.
(15319,51-59): run-time error JS1006: Expected ')': function
(15319,81): run-time error JS1004: Expected ';'
(15336,34): run-time error JS1004: Expected ';'
(15339,18-19): run-time error JS1195: Expected expression: )
(15343,44): run-time error JS1004: Expected ';'
(15343,54-55): run-time error JS1010: Expected identifier: (
(15345,33): run-time error JS1004: Expected ';'
 */
(function () {
    'use strict';

    var app = angular.module('app', [
        'ngAnimate',
        'ngSanitize',
        'ngFileUpload',
        'ui.router',
        'ui.bootstrap',
        'ui.jq',
        'ngTable',
        'abp',
        'mgcrea.ngStrap',
        'xeditable',
        'angularSimplePagination',
        'filters',
        'services',
        'angular.filter',
        'chart.js',
        'ngStorage',
        'oc.lazyLoad',
        'angularMoment',
        'ngCookies',
        'ngQuill',
        'ngIdle',
        'ui.validate',
        'checklist-model',
        'ui.select'
    ]);


    var stateProviderRef = null;

    //Configuration for Angular UI routing.
    app.config(['$stateProvider', '$urlRouterProvider',
        function ($stateProvider, $urlRouterProvider) {
            stateProviderRef = $stateProvider;

            // sets in views/layout.cshtml (depends on configuration)
            var specViewFolder = '/Special/views';

            // sets etander folder to load
            var baseViewFolder = '/App/Main/Base/views';
            var baseDirectivesFolder = '/App/Main/Base/directives';

            function stateParamsForTenderDetails(url) {
                url += ':ga';
                return {
                    url: url,
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/tenders/tenderDetailes.html');
                    }],
                    resolve: {
                        tenderDetailesData: ['requestService', '$stateParams',
                            function (requestService, $stateParams) {
                                return requestService.getTender($stateParams);
                            }]
                    },
                    data: {
                        ownTitle: true,
                        ownDescription: true
                    },
                    params: {
                        ga: { squash: true, value: null }
                    },
                    controller: 'tenderDetailesCtrl'
                }
            }


            $urlRouterProvider.otherwise('/');

            $stateProvider
                .state('home', {
                    url: '/',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/home/home.html');
                    }]
                })

                .state('tenderDetailes', stateParamsForTenderDetails('/tenderDetailes/{tId}'))
                .state('tenderDetailesNewUrl', stateParamsForTenderDetails('/tender/{categoryName}/{seoUrl}'))

                .state('edrpouSearch', {
                    url: '/edrpouSearch/{edrpou}',
                    templateUrl: specViewFolder + '/home/home.html'
                })
                .state('applicationBlank', {
                    url: '/applicationBlank',
                    templateUrl: baseViewFolder + '/profile/applicationBlank.html'
                })
                .state('accessionTreaty', {
                    url: '/accessionTreaty',
                    templateUrl: baseViewFolder + '/profile/accessionTreaty.html'
                })
                .state('news', {
                    url: '/news',
                    templateUrl: baseViewFolder + '/news/news.html'
                })
                .state('childOrganizations', {
                    url: '/childOrganizations/',
                    templateUrl: baseViewFolder + '/profile/childOrganizations.html'
                })
                .state('updateTender', {
                    url: '/updateTender/{tId}',
                    templateUrl: specViewFolder + '/tenders/updateTender.html'
                })
                .state('planDetails', {
                    url: '/planDetails/{pId}',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/App/Main/base/views/plans/planDetails.html');
                    }]
                })
                .state('updatePlan', {
                    url: '/updatePlan/{tId}',
                    templateUrl: '/App/Main/base/views/plans/updatePlan.html'
                })
                .state('addQuestion', {
                    url: '/addQuestion/{tId}',
                    templateUrl: baseViewFolder + '/tenders/addQuestion.html'
                })
                .state('organizationDetailes', {
                    url: '/organizationDetailes/{tenantId}',
                    templateUrl: baseViewFolder + '/profile/organizationDetailesForApprove.html'
                })
                .state('createTender', {
                    url: '/createTender/:subtype',
                    templateUrl: specViewFolder + '/tenders/createTender.html',
                    params: {
                        subtype: {
                            squash: true,
                            value: ''
                        }
                    }
                })
                .state('CreateTenderCriteria', {
                    url: '/CreateTenderCriteria/{tId}',
                    templateUrl: specViewFolder + '/tenders/createTenderCriteriaWrapper.html'
                })
                .state('createTenderFromTemplate', {
                    url: '/createTender/{tId}/:subtype',
                    templateUrl: specViewFolder + '/tenders/createTender.html',
                    params: {
                        subtype: {
                            squash: true,
                            value: ''
                        }
                    }
                })
                .state('createPlan', {
                    url: '/createPlan',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~' + baseViewFolder + '/plans/createPlan.html');
                    }]
                })
                .state('contacts', {
                    url: '/contacts',
                    templateUrl: baseViewFolder + '/contacts/contacts.html'
                })
                .state('contracts', {
                    url: '/contracts/{tId}',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/contracts/contracts.html');
                    }]
                    //templateUrl: specViewFolder + '/contracts/contracts.html'
                })
                .state('contractingClose', {
                    url: '/contractingClose/{id}',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/contracting/contractingClose.html');
                    }]
                    //templateUrl: specViewFolder + '/contracting/contractingClose.html'
                })
                .state('contractingBreaking', {
                    url: '/contractingBreaking/{id}',
                    templateUrl: specViewFolder + '/contracting/contractingBreaking.html'
                })
                .state('widget', {
                    url: '/widget',
                    templateUrl: specViewFolder + '/widget/widget.html'
                })
                .state('Profiles', {
                    url: '/Profiles',
                    templateUrl: baseViewFolder + '/profiles/profiles.html'
                })
                .state('EditUser', {
                    url: '/EditUser',
                    templateUrl: baseViewFolder + '/operator/editUser.html'
                })
                .state('report', {
                    url: '/report',
                    templateUrl: baseViewFolder + '/report/report.html'
                })
                .state('Amku', {
                    url: '/Amku',
                    templateUrl: baseViewFolder + '/Amku/amku.html'
                })
                .state('tarifs', {
                    url: '/tarifs',
                    templateUrl: baseViewFolder + '/tarifs/tarifs.html'
                })
                .state('tendersArchive', {
                    url: '/tendersArchive',
                    templateUrl: baseViewFolder + '/tenders/tendersArchive.html'
                })
                .state('publicPlansForWidget', {
                    url: '/publicPlansForWidget',
                    templateUrl: '/App/Main/base/views/plans/publicPlansForWidget.html'
                })
                .state('MyContracts', {
                    url: '/MyContracts',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/profile/myContracts.html');
                    }]
                    //templateUrl: specViewFolder + '/profile/myContracts.html'
                })
                .state('UnmappedBankOperations', {
                    url: '/UnmappedBankOperations',
                    templateUrl: baseViewFolder + '/profile/unmapBankOperations.html'
                })
                .state('SetCreditLimit', {
                    url: '/SetCreditLimit',
                    templateUrl: baseViewFolder + '/operator/setCreditLimit.html'
                })
                .state('AccountantData', {
                    url: '/AccountantData',
                    templateUrl: function () {
                        var mainMenu = abp.nav.menus.MainMenu.items;
                        if (mainMenu.some(function (x) {
                            return x.name == 'AccountantData';
                        })) {
                            return baseViewFolder + '/profile/accountantData.html';
                        }
                        else {
                            window.location.pathname = "/";
                        };
                    }
                })
                .state('NotExportedDocuments', {
                    url: '/NotExportedDocuments',
                    templateUrl: baseViewFolder + '/document/notExportedDocuments.html'
                })
                .state('NotSendedMessagesByApi', {
                    url: '/NotSendedMessagesByApi',
                    templateUrl: baseViewFolder + '/operator/notSendedMessagesByApi.html'
                })
                .state('SystemState', {
                    url: '/SystemState',
                    templateUrl: baseViewFolder + '/operator/systemState.html'
                })
                .state('Messages', {
                    url: '/Messages',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~' + baseViewFolder + '/profile/messages.html');
                    }]
                    //templateUrl: baseViewFolder + '/profile/messages.html'
                })
                .state('MySubscribes', {
                    url: '/MySubscriptions',
                    templateUrl: baseViewFolder + '/profile/mySubscribes.html'
                })
                .state('SentInvites', {
                    url: '/SentInvites',
                    templateUrl: baseViewFolder + '/profile/invatationList.html'
                })
                .state('Report', {
                    url: '/Report',
                    templateUrl: baseViewFolder + '/report/report.html'
                })
                .state('MyPlans', {
                    url: '/MyPlans',
                    //templateUrl: baseViewFolder + '/plans/myPlans.html',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/App/Main/Base/views/plans/myPlans.html');
                    }]
                })
                .state('Webinars', {
                    url: '/webinars',
                    templateUrl: baseViewFolder + '/profile/webinars.html'
                })
                .state('SeoPage',
                    {
                        url: '/seopage',
                        templateUrl: baseViewFolder + '/seopage/seopage.html'
                    })
                .state('supportLaw', {
                    url: '/supportLaw',
                    templateUrl: baseViewFolder + '/profile/supportLaw.html'                    
                })
                .state('plansWidget', {
                    url: '/plansWidget',
                    templateUrl: baseViewFolder + '/plans/plansWidget.html'
                })
                .state('publicPlans', {
                    url: '/publicPlans',
                    templateUrl: baseViewFolder + '/plans/publicPlans.html'
                })
                .state('myPropositions', {
                    url: '/MyPropositions',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/profile/myBids.html');
                    }]
                    //templateUrl: specViewFolder + '/profile/myBids.html'
                })
                .state('pagesAndNews', {
                    url: '/notifications',
                    templateUrl: baseViewFolder + '/operator/notifications.html'
                })
                .state('login', {
                    url: '/login',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~' + baseViewFolder + '/auth/loginNew.html');
                    }]
                    //templateUrl: baseViewFolder + '/auth/loginNew.html'
                })
                .state('pagesAndNewsAdd', {
                    url: '/notificationsAdd',
                    templateUrl: baseViewFolder + '/operator/notificationsAdd.html'
                })
                .state('analytic', {
                    url: '/analytic',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/App/Main/Base/views/report/analytic.html');
                    }]
                    //templateUrl: baseViewFolder + '/report/analytic.html'
                })
                .state('analytics', {
                    url: '/analytics',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('analytics from cache');
                    }]
                })
                .state('createReport', {
                    url: '/createReport',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('createReport from cache');
                    }]
                })
                .state('myReports', {
                    url: '/myReports',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('myReports from cache');
                    }]
                })
                .state('resetPassword', {
                    url: '/resetpassword/{userId}/{code:.*}',
                    templateUrl: baseViewFolder + '/auth/resetPassword.html'
                })
                .state('sendPassword', {
                    url: '/sendPassword',
                    templateUrl: baseViewFolder + '/auth/sendPassword.html'
                })
                .state('registerStage3', {
                    url: '/registerStage3',
                    templateUrl: baseViewFolder + '/profile/registerStage3.html'
                })
                .state('callBack', {
                    url: '/callBack',
                    templateUrl: baseViewFolder + '/help/callBack.html'
                })
                .state('messengers', {
                    url: '/Messengers',
                    templateUrl: baseViewFolder + '/profile/messengers.html'
                })
                .state('unsubscribeExternal', {
                    url: '/unsubscribe?crypto&key',
                    templateUrl: baseViewFolder + '/profile/unsubscribe.html'
                })
                .state('ProzorroMarket', {
                    url: '/ProzorroMarket',
                    templateUrl: baseViewFolder + '/eCatalog/eCatalog.html'
                })
                .state('framework', {
                    url: '/framework/{frameworkId}',
                    templateUrl: baseViewFolder + '/eCatalog/framework.html',
                    controller: 'frameworkCtrl'
                })
                .state('eCatalogProfiles', {
                    url: '/eCatalogProfiles/{gCpvCode}/{cId}',
                    templateUrl: baseViewFolder + '/eCatalog/eCatalogProfiles.html'
                })
                .state('eCatalogProducts', {
                    url: '/eCatalogProducts/{gCpvCode}/{cId}/{pId}',
                    templateUrl: baseViewFolder + '/eCatalog/eCatalogProducts.html'
                })
                .state('eCatalogOffers', {
                    url: '/eCatalogOffers/{gCpvCode}/{cId}/{pId}/{prodId}',
                    templateUrl: baseViewFolder + '/eCatalog/eCatalogOffers.html'
                })
                .state('eCatalogCart', {
                    url: '/eCatalogCart',
                    templateUrl: baseViewFolder + '/eCatalog/eCatalogCart.html'
                })
                .state('calendar', {
                    url: '/calendar',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/App/Main/Base/views/calendar/calendar.html');
                    }],
                    //templateUrl: baseViewFolder + '/calendar/calendar.html',
                })
                .state('createOffer', {
                    url: '/createOffer/{prodId}',
                    templateUrl: baseViewFolder + '/eCatalog/offerForm/createOffer.html'
                })
                .state('PageNotFound', {
                    url: '/PageNotFound',
                    templateUrl: baseViewFolder + '/Error404Page.html'
                })
                .state('updateOffer', {
                    url: '/updateOffer/{offerId}/{prodId}',
                    templateUrl: baseViewFolder + '/eCatalog/offerForm/updateOffer.html'
                })
                .state('googleCalendar', {
                    url: '/googleCalendar',
                    templateUrl: baseViewFolder + '/googleCalendar/googleCalendar.html'
                })
                .state('relocation', {
                    url: '/v2/#/relocation',
                    templateUrl: baseViewFolder + '/relocation/relocation.html'
                })
                .state('addDocuments', {
                    url: '/addDocuments/{tId}',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('editDocumentsWrapperTab from cache');
                    }],
                    controller: 'editDocumentsWrapperTabController'
                });
        }
    ]);

    app.constant('DEFAULT_ACCELERATOR_VALUE', 1440);

    app.config(['$datepickerProvider', function ($datepickerProvider) {
        angular.extend($datepickerProvider.defaults, {
            dateFormat: 'dd-MM-yyyy',
            startWeek: 1
        });
    }]);

    app.config([
        '$httpProvider', function ($httpProvider) {
            $httpProvider.interceptors.push(function () {
                return {
                    'responseError': function (ngError) {
                        var notLogCodes = [502, 503, 504];
                        if (notLogCodes.some(function (code) { return ngError.status === code; })) {
                            window._blockLogException = true;
                            setTimeout(function () {
                                window._blockLogException = false;
                            }, 7 * 60 * 1000);
                        }
                    }
                };
            });
        }
    ]);


    // front optimization settings
    app.config(['$compileProvider', function ($compileProvider) {
        $compileProvider.commentDirectivesEnabled(false);
        $compileProvider.cssClassDirectivesEnabled(false);
    }
    ]);

    app.config(['$locationProvider', '$urlRouterProvider', function ($locationProvider, $urlRouterProvider) {
        $locationProvider.hashPrefix('');
        $locationProvider.html5Mode(true);
        $urlRouterProvider.otherwise('/');
        //$urlRouterProvider.when('/', '');
    }]);

    app.run(['appExt', function (appExt) {
        // заполняем роутинг для спец проекта
        angular.forEach(appExt.stateProviderExtStates,
            function (stateItem) {
                var stateObj = {
                    url: stateItem.url,
                    //templateUrl: stateItem.templateUrl,
                    controller: stateItem.controller
                };
                if (!stateItem.templateProvider) {
                    stateObj.templateUrl = stateItem.templateUrl;
                } else {
                    stateObj.templateProvider = stateItem.templateProvider;
                }
                if (stateItem.lazyLoadResources) {
                    stateObj.resolve = {
                        loadMyCtrl: [
                            '$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load(stateItem.lazyLoadResources);// Resolve promise and load before view  
                            }
                        ]
                    }
                }
                stateProviderRef.state(stateItem.state, stateObj);
            });
    }]);

    //app.run('checklist-model', function () { });

    app.run(['editableOptions', function (editableOptions) {
        editableOptions.theme = 'bs3'; // bootstrap3 theme. Can be also 'bs2', 'default'
    }]);

    app.run(["$rootScope", "$anchorScroll", "$timeout", function ($rootScope, $anchorScroll, $timeout) {
        $rootScope.$on("$locationChangeSuccess", function () {
            $timeout(function () {
                $anchorScroll();
                jQuery('.modal').modal('hide');
                jQuery('.modal-backdrop').remove();
                document.body.classList.remove("modal-open");
                document.body.style.paddingRight = '0';
            }, 1000);
        });
    }]);

    // time end tender round to minutes 
    moment.duration(2, 'minutes');

    app.value('localhost', 'localhost')
        .value('qa', 'qa-prozorro.e-tender.ua')
        .value('qa2', 'qa2-prozorro.e-tender.ua')
        .value('stage', 'stage.e-tender.ua')
        .value('stage2', 'stage2.e-tender.ua')
        .value('uat', 'uat-prozorro.e-tender.ua')
        .value('dev', 'dev.e-tender.ua')
        .value('dev2', 'dev2.e-tender.ua')
        .value('prodserver', 'gov.e-tender.ua')
        .value('prodserver2', 'prozorro.e-tender.ua')
        .value('numberOfRecords', '10')
        .value('numberOfRecordsIframe', '10');

    app.run([
        '$rootScope',
        '$location',
        'localhost',
        'prodserver',
        'prodserver2',
        'qa',
        'qa2',
        'stage',
        'stage2',
        'uat',
        'dev',
        'dev2',
        '$ocLazyLoad',
        function (
            $rootScope,
            $location,
            localhost,
            prodserver,
            prodserver2,
            qa,
            qa2,
            stage,
            stage2,
            uat,
            dev,
            dev2,
            $ocLazyLoad) {

            // Changes in ABP framework ET-15074
            abp.ajax.handleTargetUrl = function (targetUrl) {
                if (!targetUrl) {
                    $location.reload();
                } else {
                    $location.path(targetUrl);
                }
            };

            abp.ng.http.handleUnAuthorizedRequest = function(messagePromise, targetUrl) {

                function clearStoragesAndReload() {
                    localStorage.clear();
                    sessionStorage.clear();
                    if (location.href && location.href.indexOf('login') === -1) {
                        location.href = '/login';
                    }
                }

                if (messagePromise) {
                    messagePromise.done(function () {
                        if (!targetUrl) {
                            // #corehack
                            clearStoragesAndReload();
                        } else {
                            abp.ng.http.handleTargetUrl(targetUrl);
                        }
                    });
                } else {
                    if (!targetUrl) {
                        // #corehack
                        clearStoragesAndReload();
                    } else {
                        abp.ng.http.handleTargetUrl(targetUrl);
                    }
                }
            }

            abp.ng.http.showError = abp.ajax.showError = function (error) {
                if(error.validationErrors){
                    var errors = error.validationErrors.map(function(i) {
                        return i.message;
                    }).join(';');
                    return abp.message.errorValidation(errors)
                }
                if (error.details) {
                    switch (error.details) {
                    case 'info':
                        return abp.message.info(error.message);
                    case 'warning':
                        return abp.message.warn(error.message);
                    case 'error':
                        return abp.message.error(error.message);
                    case 'infoWithCloseB':
                        return abp.message.infoClose(error.message);
                    case 'warningWithCloseB':
                        return abp.message.warnClose(error.message);
                    case 'errorWithCloseB':
                        return abp.message.errorClose(error.message);
                    default:
                        return abp.message.error(error.details, error.message);
                    }
                } else {
                    return abp.message.error(error.message);
                }
            }

            var showNotification = function (type, message, title, closeButton) {
                if (closeButton === true) {
                    toastr[type](message, title,
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
                } else
                    toastr[type](message, title);
            };

            abp.notify.success = function (message, title, closeButton) {
                showNotification('success', message, title, closeButton);
            };
            abp.notify.info = function (message, title, closeButton) {
                showNotification('info', message, title, closeButton);
            };
            abp.notify.warn = function (message, title, closeButton) {
                showNotification('warning', message, title, closeButton);
            };
            abp.notify.error = function (message, title, closeButton) {
                showNotification('error', message, title, closeButton);
            };
            // End Changes in APB Framework

            var browserSupportsAllFeatures = function () {
                return !!Array.prototype.fill && !!Array.prototype.includes;
            }

            if (!browserSupportsAllFeatures()) {
                $ocLazyLoad.load('App/Main/pollyfill.js');
            }

            $rootScope.regex = {
                login: /^(?:[A-Z\d][A-Z\d_-]{4,256}|[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,})$/i,
                word: /^[A-Za-z]\s*\w*\s*$/i,
                english: /^[\w\s\.\№#\%'’"«»())-\[\]\\\\]+$/i,
                wordAnyLanguage: /^[a-zA-Zа-яА-Яа-яА-ЯІіЇїЄєҐґЁё']+['-]?[a-zA-Zа-яА-Яа-яА-ЯІіЇїЄєҐґЁё']*$/i,
                fio: /^[a-zA-Zа-яА-Яа-яА-ЯІіЇїЄєҐґЁё\-\,\.\'\s]+$/, // wordAnyLanguage -,.' 
                password: /(?=.*[a-z])(?=.*[^a-zA-Z])/,
                organisationName: /^[^}{<!;:?*()_=+/\,!@[#^&|~>%$]*$/,
                number: /^\d+$/,
                numberForOrgTypePhysicalPerson: /(^\d{10}$)|(^\d{12}$)/,
                numberForOtherOrgTypes: /^(\d{12}$)/,
                floatNumber: /^[0-9]*\.?[0-9]+$/,
                tenderName: /^[^}{<!;:?*_=+/\!@[#^&|~>%$]*$/,
                date: "^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-[0-9]{4}$", //dd-mm-yyy,
                dateOrEmpty: "(^$|^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-[0-9]{4}$)", //dd-mm-yyy,
                phone: /^[0-9-]+$/i,
                fax: /^[0-9]+$/i,
                url: 'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,}\.[a-zA-Z0-9()]{2,}([-a-zA-Z0-9()@:%_\+.~#?&//=]*)',
                email: /(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*")@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,32}\.?$/i
            };

            $rootScope.source = abp.localization.getSource("Shared");   // get localization from Shared
            $rootScope.sourceSpec = abp.localization.getSource("Spec"); // get localization from projec() loaded (e-tender, rialto...)

            $rootScope.getSpecificOrDefault = function (key) {
                var specVal = $rootScope.sourceSpec(key);

                if (specVal === key) {
                    return $rootScope.source(key);
                }

                return specVal;
            };
        }]);


    // ************ Exceptions to SEQ *****************************
    var errorObj = {};
    errorObj.canLogError = true;

    app.config(['$provide', function ($provide) {
        $provide.decorator("$exceptionHandler", $exceptionHandler);
        $exceptionHandler.$inject = ['$delegate'];
        function $exceptionHandler($delegate) {
            return function (exception, cause) {
                $delegate(exception, cause);

                //if (errorObj.canLogError && !errorObj.exception) {
                //    return;
                //}
                // check if the same error or sending internet speed
                if (!errorObj.canLogError || itIsTheSameError(exception) || window._blockLogException) return;

                // if it is Bid Doc Upload error
                if (itIsBidDocumentUploadErorre(exception))
                    logBidDocumentUploadErorre(exception);

                // post Exception
                postLog(setMessage(exception));
            };
        }
    }]);


    // check if the same error
    function itIsTheSameError(exceptionOrigin) {
        var exception = cutErrore(exceptionOrigin, 500);

        //if (errorObj.exception &&
        //    (errorObj.exception.message && angular.equals(errorObj.exception, exception) ||
        //    !errorObj.exception.message && errorObj.exception === exception ||
        //    !errorObj.exception.message && JSON.stringify(errorObj.exception) === JSON.stringify(exception)
        //    )) {
        //    return true;
        //}

        if (errorObj.messages && errorObj.messages.length > 0) {
            var i = 0;
            var lengthEx = errorObj.messages.length;
            for (i; i < lengthEx; i++) {
                var savedErrore = errorObj.messages[i];
                if (savedErrore === exception) {
                    return true;
                }
            }
        }
        saveExeption(exception);
        return false;
    }

    function saveExeption(exception) {
        if (!errorObj.messages) errorObj.messages = [];
        errorObj.messages.push(exception);
        if (errorObj.messages.length > 3) errorObj.messages.shift();
    }

    function cutErrore(data, value) {
        var erroreMsng = angular.copy(data);
        if (typeof erroreMsng !== 'string')
            erroreMsng = JSON.stringify(erroreMsng);
        if (erroreMsng.length > value)
            return erroreMsng.substring(0, value);
        return erroreMsng;
    }

    // set message to SEQ
    function setMessage(exception) {
        var msg = {};
        msg.url = '*** URL: ' + window.location.href + ' ***';

        if (exception.message) {
            msg.exceptionMessage = cutErrore(exception.message, 3000);
            msg.exceptionStack = cutErrore(exception.stack, 3000);
        } else {
            msg.exceptionMessage = cutErrore(exception, 3000);
            msg.exceptionStack = '';
        }
        return msg;
    }

    // check if Bid Document Upload Erorr
    function itIsBidDocumentUploadErorre(exception) {
        if (!exception.message &&
            exception.indexOf('\"data\":null,\"status\":-1') !== -1 &&
            exception.indexOf('tenderId') !== -1 &&
            exception.indexOf('bidId') !== -1 &&
            exception.indexOf('documentId') !== -1 &&
            exception.indexOf('type') !== -1) return true;
        return false;
    }

    // log Bid Document Upload Erorre
    function logBidDocumentUploadErorre(exception) {
        errorObj.canLogError = false;
        errorObj.sendedLogs = 0;
        checkInternetSpeedAndPost(exception);
    }

    // set message with internet speed
    function setMessageWithSpeed(exception, postData) {
        var msg = {};
        msg.url = '*** URL: ' + window.location.href + ' ***';
        msg.exceptionMessage = exception;
        msg.exceptionStack = postData || '';
        return msg;
    }

    function checkInternetSpeedAndPost(exception) {
        postLog(setMessageWithSpeed(exception));
        var files = [
            {
                url: 'Content/imagesTestSpeed/05mb.jpg',
                size: '524288'
            },
            {
                url: 'Content/imagesTestSpeed/1mb.jpg',
                size: '1048576'
            }
            //{
            //    url: 'Content/imagesTestSpeed/2mb.jpg',
            //    size: '2097152'
            //},
            //{
            //    url: 'Content/imagesTestSpeed/5mb.jpg',
            //    size: '5242880'
            //}
        ];

        testSpeed(files, exception);
    }

    // test spees func
    function testSpeed(files, exception) {

        $.getScript("Scripts/speedtest.js")
            .done(function () {

                errorObj.sendedLogs++;
                var st = new SpeedTest();
                st.test({
                    onStart: function () {
                        //console.log("Test nom." + errorObj.sendedLogs + ". Testing connection speed");
                    },
                    onEnd: function (results) {
                        var postData = 'Test nom.' +
                            errorObj.sendedLogs +
                            ', ' +
                            "Size: " +
                            results.data.size +
                            ' Bytes, ' +
                            "Speed: " +
                            results.mbps +
                            " Mbps";
                        console.log(postData);
                        postLog(setMessageWithSpeed(exception, postData), results);

                        if (errorObj.sendedLogs === files.length) {
                            errorObj.canLogError = true;
                            return;
                        }

                        testSpeed(files, exception);
                    }
                }, files[errorObj.sendedLogs - 1]);

            })
            .fail(function () {
                setTimeout(function () {
                    testSpeed(files, exception);
                }, 10000);
            });

    }

    // post Exception
    function postLog(msg) {
        var kindOfError = 'FrontException_app.js: ';
        if (abp.postAngularLog) {
            abp.postAngularLog(msg, kindOfError);
        } else {
            $.ajax({
                type: 'POST',
                url: abp.appPath +
                    'api/services/etender/log/LogException?exceptionMessage=' +
                    escape(kindOfError + msg.exceptionMessage + msg.url) +
                    '&exceptionStack=' +
                    escape(msg.exceptionStack) +
                    '',
                contentType: 'application/json; charset=UTF-8',
                data: JSON.stringify()
            });
            console.log(kindOfError + 'posted to SEQ', msg);
        }
    }

    // ************ END exceptions to SEQ *********************

})();
;
var abp = abp || {};
(function () {
    abp.message = abp.message || {};
    /*
        abp.message.info = function (message, title) {
            abp.log.warn('abp.message.info is not implemented!');
            alert((title || '') + ' ' + message);
        };
    
        abp.message.warn = function (message, title) {
            abp.log.warn('abp.message.warn is not implemented!');
            alert((title || '') + ' ' + message);
        };
        */

    abp.message.info = function (message) {
        abp.notify.info(message, "Увага!");
    };

    abp.message.warn = function (message) {
        abp.notify.warn(message, "Попередження");
    };

    abp.message.error = function (message) {
        abp.notify.error(message, "Помилка");
    };

    abp.message.errorValidation = function (message) {
        abp.notify.error(message, "Помилка");
    };

    abp.message.infoClose = function (message) {
        abp.notify.info(message, "Увага!", true);
    };

    abp.message.warnClose = function (message) {
        abp.notify.warn(message, "Попередження", true);
    };

    abp.message.errorClose = function (message) {
        abp.notify.error(message, "Помилка", true);
    };
})();;
setTimeout(function () {
    function mouseUpHandlerOtherMenu(e) {
        var n = $(".mobile-menu")
            , s = $(".mobile-menu *");
        n.is(e.target) || s.is(e.target) || ($(document).unbind("mouseup touchend", mouseUpHandlerOtherMenu),
            $(".mobile-menu").removeClass("open"))
    }
    function mouseUpHandlerLangs(e) {
        var n = $(".langs")
            , s = $(".langs *");
        n.is(e.target) || s.is(e.target) || ($(document).unbind("mouseup touchend", mouseUpHandlerLangs),
            $(".langs").removeClass("open"))
    }
    function mouseUpHandlerPhones(e) {
        var n = $(".phones")
            , s = $(".phones *");
        n.is(e.target) || s.is(e.target) || ($(document).unbind("mouseup touchend", mouseUpHandlerPhones),
            $(".phones").removeClass("open"))
    }
    jQuery(document).ready(function () {
        "use strict";
        !function (e) {
            e.fn.clickToggle = function (n, s) {
                var o = [n, s];
                return this.data("toggleclicked", 0),
                    this.click(function () {
                        var n = e(this).data()
                            , s = n.toggleclicked;
                        e.proxy(o[s], this)(),
                            n.toggleclicked = (s + 1) % 2
                    }),
                    this
            }
        }(jQuery),
            jQuery(".nav-button-open").click(function () {
                jQuery(".menu-icon").addClass("is-clicked"),
                    jQuery(".mobile-nav").css("left", "0%"),
                    jQuery(".nav-button-open").css("display", "none"),
                    jQuery(".nav-button-close").css("display", "block")
            }),
            jQuery(".nav-button-close").click(function () {
                jQuery(".menu-icon").removeClass("is-clicked"),
                    jQuery(".mobile-nav").css("left", "-100%"),
                    jQuery(".nav-button-close").css("display", "none"),
                    jQuery(".nav-button-open").css("display", "block")
            }),
            jQuery(".nav-close").click(function () {
                jQuery(".menu-icon").removeClass("is-clicked"),
                    jQuery(".mobile-nav").css("left", "-100%"),
                    jQuery(".nav-button-close").css("display", "none"),
                    jQuery(".nav-button-open").css("display", "block")
            }),
            jQuery(document).mouseup(function (e) {
                var n = jQuery(".mobile-nav");
                n.is(e.target) || 0 !== n.has(e.target).length || (jQuery(".menu-icon").removeClass("is-clicked"),
                    jQuery(".mobile-nav").css("left", "-100%"),
                    jQuery(".nav-button-close").css("display", "none"),
                    jQuery(".nav-button-open").css("display", "block"))
            }),
            jQuery('a[data-toggle="modal"]').on("click", function () {
                var e = jQuery(this).parent().next(".video-title").text()
                    , n = jQuery(this).parent().next().next().html();
                jQuery("#video-modal-label").html(e),
                    jQuery("#modal_body").html(n)
            })
    }),
        $("[data-scroll-section]").length && $(".menu-item.active").length && $(".menu-item.active").index() > 0 && scrollOnSection("[data-scroll-section]"),
        $(".menu-item[data-hint]").mouseenter(function () {
            $(this).parent().append("<div class='hint'>" + $(this).data("hint") + "</div>")
        }).mouseleave(function () {
            $(this).parent().find(".hint").remove()
        }),
        $(".tenders-timer .numbers").each(function () {
            $(this).countdown($(this).parent().data("time"), function (e) {
                $(this).html(e.strftime("<span>%D</span><span>%H</span><span>%M</span><span>%S</span>"))
            })
        }),
        $(".other-menu").click(function () {
            $(this).hasClass("open") ? $(this).removeClass("open") : ($(this).addClass("open"),
                $(document).bind("mouseup touchend", mouseUpHandlerOtherMenu))
        }),
        $(".mobile-menu").click(function () {
            $(this).hasClass("open") ? $(this).removeClass("open") : ($(this).addClass("open"),
                $(document).bind("mouseup touchend", mouseUpHandlerOtherMenu))
        }),
        $(".langs").click(function () {
            $(this).hasClass("open") ? $(this).removeClass("open") : ($(this).addClass("open"),
                $(document).bind("mouseup touchend", mouseUpHandlerLangs))
        }),
        $(".phones").click(function () {
            $(this).hasClass("open") ? $(this).removeClass("open") : ($(this).addClass("open"),
                $(document).bind("mouseup touchend", mouseUpHandlerPhones))
        }),
        $(window).scroll(function () {
            var e = $(this).scrollTop();
            e > 0 ? $("header").addClass("resize") : $("header").removeClass("resize")
        }),
        $(".login-menu").click(function (e) {
            e.stopPropagation(),
                $(this).hasClass("open") ? $(this).removeClass("open") : $(this).addClass("open")
        }),
        $(".sprit_user").click(function (e) {
            $(".login-menu").hasClass("open") ? $(".login-menu").removeClass("open") : $(".login-menu").addClass("open")
        });
}, 3000);
;
/*
 * angucomplete-alt
 * Autocomplete directive for AngularJS
 * This is a fork of Daryl Rowland's angucomplete with some extra features.
 * By Hidenari Nozaki
 */

/*! Copyright (c) 2014 Hidenari Nozaki and contributors | Licensed under the MIT license */

'use strict';



    angular.module('app').directive('angucompleteAlt', ['$q', '$parse', '$http', '$sce', '$timeout', '$templateCache', '$interpolate', function ($q, $parse, $http, $sce, $timeout, $templateCache, $interpolate) {
    // keyboard events
    var KEY_DW  = 40;
    var KEY_RT  = 39;
    var KEY_UP  = 38;
    var KEY_LF  = 37;
    var KEY_ES  = 27;
    var KEY_EN  = 13;
    var KEY_TAB =  9;

    var MIN_LENGTH = 3;
    var MAX_LENGTH = 524288;  // the default max length per the html maxlength attribute
    var PAUSE = 500;
    var BLUR_TIMEOUT = 200;

    // string constants
    var REQUIRED_CLASS = 'autocomplete-required';
    var TEXT_SEARCHING = 'Searching...';
    var TEXT_NORESULTS = 'No results found';
    var TEMPLATE_URL = '/angucomplete-alt/index.html';

    // Set the default template for this directive
    $templateCache.put(TEMPLATE_URL,
        '<div class="angucomplete-holder" ng-class="{\'angucomplete-dropdown-visible\': showDropdown}">' +
        '  <input id="{{id}}_value" name="{{inputName}}" ng-class="{\'angucomplete-input-not-empty\': notEmpty}" ng-model="searchStr" ng-disabled="disableInput" type="{{inputType}}" placeholder="{{placeholder}}" maxlength="{{maxlength}}" ng-focus="onFocusHandler()" class="{{inputClass}}" ng-focus="resetHideResults()" ng-blur="hideResults($event)" autocapitalize="off" autocorrect="off" autocomplete="off" ng-change="inputChangeHandler(searchStr)"/>' +
        '  <div id="{{id}}_dropdown" class="angucomplete-dropdown" ng-show="showDropdown">' +
        '    <div class="angucomplete-searching" ng-show="searching" ng-bind="textSearching"></div>' +
        '    <div class="angucomplete-searching" ng-show="!searching && (!results || results.length == 0)" ng-bind="textNoResults"></div>' +
        '    <div class="angucomplete-row" ng-repeat="result in results" ng-click="selectResult(result)" ng-mouseenter="hoverRow($index)" ng-class="{\'angucomplete-selected-row\': $index == currentIndex}">' +
        '      <div ng-if="imageField" class="angucomplete-image-holder">' +
        '        <img ng-if="result.image && result.image != \'\'" ng-src="{{result.image}}" class="angucomplete-image"/>' +
        '        <div ng-if="!result.image && result.image != \'\'" class="angucomplete-image-default"></div>' +
        '      </div>' +
        '      <div class="angucomplete-title" ng-if="matchClass" ng-bind-html="result.title"></div>' +
        '      <div class="angucomplete-title" ng-if="!matchClass">{{ result.title }}</div>' +
        '      <div ng-if="matchClass && result.description && result.description != \'\'" class="angucomplete-description" ng-bind-html="result.description"></div>' +
        '      <div ng-if="!matchClass && result.description && result.description != \'\'" class="angucomplete-description">{{result.description}}</div>' +
        '    </div>' +
        '  </div>' +
        '</div>'
    );

    function link(scope, elem, attrs, ctrl) {
      var inputField = elem.find('input');
      var minlength = MIN_LENGTH;
      var searchTimer = null;
      var hideTimer;
      var requiredClassName = REQUIRED_CLASS;
      var responseFormatter;
      var validState = null;
      var httpCanceller = null;
      var dd = elem[0].querySelector('.angucomplete-dropdown');
      var isScrollOn = false;
      var mousedownOn = null;
      var unbindInitialValue;
      var displaySearching;
      var displayNoResults;

      elem.on('mousedown', function(event) {
        if (event.target.id) {
          mousedownOn = event.target.id;
          if (mousedownOn === scope.id + '_dropdown') {
            document.body.addEventListener('click', clickoutHandlerForDropdown);
          }
        }
        else {
          mousedownOn = event.target.className;
        }
      });

      scope.currentIndex = scope.focusFirst ? 0 : null;
      scope.searching = false;
      unbindInitialValue = scope.$watch('initialValue', function(newval) {
        if (newval) {
          // remove scope listener
          unbindInitialValue();
          // change input
          handleInputChange(newval, true);
        }
      });

      scope.$watch('fieldRequired', function(newval, oldval) {
        if (newval !== oldval) {
          if (!newval) {
            ctrl[scope.inputName].$setValidity(requiredClassName, true);
          }
          else if (!validState || scope.currentIndex === -1) {
            handleRequired(false);
          }
          else {
            handleRequired(true);
          }
        }
      });

      scope.$on('angucomplete-alt:clearInput', function (event, elementId) {
        if (!elementId || elementId === scope.id) {
          scope.searchStr = null;
          callOrAssign();
          handleRequired(false);
          clearResults();
        }
      });

      scope.$on('angucomplete-alt:changeInput', function (event, elementId, newval) {
        if (!!elementId && elementId === scope.id) {
          handleInputChange(newval);
        }
      });

      function handleInputChange(newval, initial) {
        if (newval) {
          if (typeof newval === 'object') {
            scope.searchStr = extractTitle(newval);
            callOrAssign({originalObject: newval});
          } else if (typeof newval === 'string' && newval.length > 0) {
            scope.searchStr = newval;
          } else {
            if (console && console.error) {
              console.error('Tried to set ' + (!!initial ? 'initial' : '') + ' value of angucomplete to', newval, 'which is an invalid value');
            }
          }

          handleRequired(true);
        }
      }

      // #194 dropdown list not consistent in collapsing (bug).
      function clickoutHandlerForDropdown(event) {
        mousedownOn = null;
        scope.hideResults(event);
        document.body.removeEventListener('click', clickoutHandlerForDropdown);
      }

      // for IE8 quirkiness about event.which
      function ie8EventNormalizer(event) {
        return event.which ? event.which : event.keyCode;
      }

      function callOrAssign(value) {
        if (typeof scope.selectedObject === 'function') {
          scope.selectedObject(value);
        }
        else {
          scope.selectedObject = value;
        }

        if (value) {
          handleRequired(true);
        }
        else {
          handleRequired(false);
        }
      }

      function callFunctionOrIdentity(fn) {
        return function(data) {
          return scope[fn] ? scope[fn](data) : data;
        };
      }

      function setInputString(str) {
        callOrAssign({originalObject: str});

        if (scope.clearSelected) {
          scope.searchStr = null;
        }
        clearResults();
      }

      function extractTitle(data) {
        // split title fields and run extractValue for each and join with ' '
        return scope.titleField.split(',')
          .map(function(field) {
            return extractValue(data, field);
          })
          .join(' ');
      }

      function extractValue(obj, key) {
        var keys, result;
        if (key) {
          keys= key.split('.');
          result = obj;
          for (var i = 0; i < keys.length; i++) {
            result = result[keys[i]];
          }
        }
        else {
          result = obj;
        }
        return result;
      }

      function findMatchString(target, str) {
        var result, matches, re;
        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
        // Escape user input to be treated as a literal string within a regular expression
        re = new RegExp(str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
        if (!target) { return; }
        if (!target.match || !target.replace) { target = target.toString(); }
        matches = target.match(re);
        if (matches) {
          result = target.replace(re,
              '<span class="'+ scope.matchClass +'">'+ matches[0] +'</span>');
        }
        else {
          result = target;
        }
        return $sce.trustAsHtml(result);
      }

      function handleRequired(valid) {
        scope.notEmpty = valid;
        validState = scope.searchStr;
        if (scope.fieldRequired && ctrl && scope.inputName) {
          ctrl[scope.inputName].$setValidity(requiredClassName, valid);
        }
      }

      function keyupHandler(event) {
        var which = ie8EventNormalizer(event);
        if (which === KEY_LF || which === KEY_RT) {
          // do nothing
          return;
        }

        if (which === KEY_UP || which === KEY_EN) {
          event.preventDefault();
        }
        else if (which === KEY_DW) {
          event.preventDefault();
          if (!scope.showDropdown && scope.searchStr && scope.searchStr.length >= minlength) {
            initResults();
            scope.searching = true;
            searchTimerComplete(scope.searchStr);
          }
        }
        else if (which === KEY_ES) {
          clearResults();
          scope.$apply(function() {
            inputField.val(scope.searchStr);
          });
        }
        else {
          if (minlength === 0 && !scope.searchStr) {
            return;
          }

          if (!scope.searchStr || scope.searchStr === '') {
            scope.showDropdown = false;
          } else if (scope.searchStr.length >= minlength) {
            initResults();

            if (searchTimer) {
              $timeout.cancel(searchTimer);
            }

            scope.searching = true;

            searchTimer = $timeout(function() {
              searchTimerComplete(scope.searchStr);
            }, scope.pause);
          }

          if (validState && validState !== scope.searchStr && !scope.clearSelected) {
            scope.$apply(function() {
              callOrAssign();
            });
          }
        }
      }

      function handleOverrideSuggestions(event) {
        if (scope.overrideSuggestions &&
            !(scope.selectedObject && scope.selectedObject.originalObject === scope.searchStr)) {
          if (event) {
            event.preventDefault();
          }

          // cancel search timer
          $timeout.cancel(searchTimer);
          // cancel http request
          cancelHttpRequest();

          setInputString(scope.searchStr);
        }
      }

      function dropdownRowOffsetHeight(row) {
        var css = getComputedStyle(row);
        return row.offsetHeight +
          parseInt(css.marginTop, 10) + parseInt(css.marginBottom, 10);
      }

      function dropdownHeight() {
        return dd.getBoundingClientRect().top +
          parseInt(getComputedStyle(dd).maxHeight, 10);
      }

      function dropdownRow() {
        return elem[0].querySelectorAll('.angucomplete-row')[scope.currentIndex];
      }

      function dropdownRowTop() {
        return dropdownRow().getBoundingClientRect().top -
          (dd.getBoundingClientRect().top +
           parseInt(getComputedStyle(dd).paddingTop, 10));
      }

      function dropdownScrollTopTo(offset) {
        dd.scrollTop = dd.scrollTop + offset;
      }

      function updateInputField(){
        var current = scope.results[scope.currentIndex];
        if (scope.matchClass) {
          inputField.val(extractTitle(current.originalObject));
        }
        else {
          inputField.val(current.title);
        }
      }

      function keydownHandler(event) {
        var which = ie8EventNormalizer(event);
        var row = null;
        var rowTop = null;

        if (which === KEY_EN && scope.results) {
          if (scope.currentIndex >= 0 && scope.currentIndex < scope.results.length) {
            event.preventDefault();
            scope.selectResult(scope.results[scope.currentIndex]);
          } else {
            handleOverrideSuggestions(event);
            clearResults();
          }
          scope.$apply();
        } else if (which === KEY_DW && scope.results) {
          event.preventDefault();
          if ((scope.currentIndex + 1) < scope.results.length && scope.showDropdown) {
            scope.$apply(function() {
              scope.currentIndex ++;
              updateInputField();
            });

            if (isScrollOn) {
              row = dropdownRow();
              if (dropdownHeight() < row.getBoundingClientRect().bottom) {
                dropdownScrollTopTo(dropdownRowOffsetHeight(row));
              }
            }
          }
        } else if (which === KEY_UP && scope.results) {
          event.preventDefault();
          if (scope.currentIndex >= 1) {
            scope.$apply(function() {
              scope.currentIndex --;
              updateInputField();
            });

            if (isScrollOn) {
              rowTop = dropdownRowTop();
              if (rowTop < 0) {
                dropdownScrollTopTo(rowTop - 1);
              }
            }
          }
          else if (scope.currentIndex === 0) {
            scope.$apply(function() {
              scope.currentIndex = -1;
              inputField.val(scope.searchStr);
            });
          }
        } else if (which === KEY_TAB) {
          if (scope.results && scope.results.length > 0 && scope.showDropdown) {
            if (scope.currentIndex === -1 && scope.overrideSuggestions) {
              // intentionally not sending event so that it does not
              // prevent default tab behavior
              handleOverrideSuggestions();
            }
            else {
              if (scope.currentIndex === -1) {
                scope.currentIndex = 0;
              }
              scope.selectResult(scope.results[scope.currentIndex]);
              scope.$digest();
            }
          }
          else {
            // no results
            // intentionally not sending event so that it does not
            // prevent default tab behavior
            if (scope.searchStr && scope.searchStr.length > 0) {
              handleOverrideSuggestions();
            }
          }
        } else if (which === KEY_ES) {
          // This is very specific to IE10/11 #272
          // without this, IE clears the input text
          event.preventDefault();
        }
      }

      function httpSuccessCallbackGen(str) {
        return function(responseData, status, headers, config) {
          // normalize return obejct from promise
          if (!status && !headers && !config && responseData.data) {
            responseData = responseData.data;
          }
          scope.searching = false;
          processResults(
            extractValue(responseFormatter(responseData), scope.remoteUrlDataField),
            str);
        };
      }

      function httpErrorCallback(errorRes, status, headers, config) {
        // cancelled/aborted
        if (status === 0 || status === -1) { return; }

        // normalize return obejct from promise
        if (!status && !headers && !config) {
          status = errorRes.status;
        }
        if (scope.remoteUrlErrorCallback) {
          scope.remoteUrlErrorCallback(errorRes, status, headers, config);
        }
        else {
          if (console && console.error) {
            console.error('http error');
          }
        }
      }

      function cancelHttpRequest() {
        if (httpCanceller) {
          httpCanceller.resolve();
        }
      }

      function getRemoteResults(str) {
        var params = {},
            url = scope.remoteUrl + encodeURIComponent(str);
        if (scope.remoteUrlRequestFormatter) {
          params = {params: scope.remoteUrlRequestFormatter(str)};
          url = scope.remoteUrl;
        }
        if (!!scope.remoteUrlRequestWithCredentials) {
          params.withCredentials = true;
        }
        cancelHttpRequest();
        httpCanceller = $q.defer();
        params.timeout = httpCanceller.promise;
        $http.get(url, params)
          .success(httpSuccessCallbackGen(str))
          .error(httpErrorCallback);
      }

      function getRemoteResultsWithCustomHandler(str) {
        cancelHttpRequest();

        httpCanceller = $q.defer();

        scope.remoteApiHandler(str, httpCanceller.promise)
          .then(httpSuccessCallbackGen(str))
          .catch(httpErrorCallback);

        /* IE8 compatible
        scope.remoteApiHandler(str, httpCanceller.promise)
          ['then'](httpSuccessCallbackGen(str))
          ['catch'](httpErrorCallback);
        */
      }

      function clearResults() {
        scope.showDropdown = false;
        scope.results = [];
        if (dd) {
          dd.scrollTop = 0;
        }
      }

      function initResults() {
        scope.showDropdown = displaySearching;
        scope.currentIndex = scope.focusFirst ? 0 : -1;
        scope.results = [];
      }

      function getLocalResults(str) {
        var i, match, s, value,
            searchFields = scope.searchFields.split(','),
            matches = [];
        if (typeof scope.parseInput() !== 'undefined') {
          str = scope.parseInput()(str);
        }
        for (i = 0; i < scope.localData.length; i++) {
          match = false;

          for (s = 0; s < searchFields.length; s++) {
            value = extractValue(scope.localData[i], searchFields[s]) || '';
            match = match || (value.toString().toLowerCase().indexOf(str.toString().toLowerCase()) >= 0);
          }

          if (match) {
            matches[matches.length] = scope.localData[i];
          }
        }

        scope.searching = false;
        processResults(matches, str);
      }

      function checkExactMatch(result, obj, str){
        if (!str) { return false; }
        for(var key in obj){
          if(obj[key].toLowerCase() === str.toLowerCase()){
            scope.selectResult(result);
            return true;
          }
        }
        return false;
      }

      function searchTimerComplete(str) {
        // Begin the search
        if (!str || str.length < minlength) {
          return;
        }
        if (scope.localData) {
          scope.$apply(function() {
            getLocalResults(str);
          });
        }
        else if (scope.remoteApiHandler) {
          getRemoteResultsWithCustomHandler(str);
        } else {
          getRemoteResults(str);
        }
      }

      function processResults(responseData, str) {
        var i, description, image, text, formattedText, formattedDesc;

        if (responseData && responseData.length > 0) {
          scope.results = [];

          for (i = 0; i < responseData.length; i++) {
            if (scope.titleField && scope.titleField !== '') {
              text = formattedText = extractTitle(responseData[i]);
            }

            description = '';
            if (scope.descriptionField) {
              description = formattedDesc = extractValue(responseData[i], scope.descriptionField);
            }

            image = '';
            if (scope.imageField) {
              image = extractValue(responseData[i], scope.imageField);
            }

            if (scope.matchClass) {
              formattedText = findMatchString(text, str);
              formattedDesc = findMatchString(description, str);
            }

            scope.results[scope.results.length] = {
              title: formattedText,
              description: formattedDesc,
              image: image,
              originalObject: responseData[i]
            };
          }

        } else {
          scope.results = [];
        }

        if (scope.autoMatch && scope.results.length === 1 &&
            checkExactMatch(scope.results[0],
              {title: text, desc: description || ''}, scope.searchStr)) {
          scope.showDropdown = false;
        } else if (scope.results.length === 0 && !displayNoResults) {
          scope.showDropdown = false;
        } else {
          scope.showDropdown = true;
        }
      }

      function showAll() {
        if (scope.localData) {
          processResults(scope.localData, '');
        }
        else if (scope.remoteApiHandler) {
          getRemoteResultsWithCustomHandler('');
        }
        else {
          getRemoteResults('');
        }
      }

      scope.onFocusHandler = function() {
        if (scope.focusIn) {
          scope.focusIn();
        }
        if (minlength === 0 && (!scope.searchStr || scope.searchStr.length === 0)) {
          scope.currentIndex = scope.focusFirst ? 0 : scope.currentIndex;
          scope.showDropdown = true;
          showAll();
        }
      };

      scope.hideResults = function() {
        if (mousedownOn &&
            (mousedownOn === scope.id + '_dropdown' ||
             mousedownOn.indexOf('angucomplete') >= 0)) {
          mousedownOn = null;
        }
        else {
          hideTimer = $timeout(function() {
            clearResults();
            scope.$apply(function() {
              if (scope.searchStr && scope.searchStr.length > 0) {
                inputField.val(scope.searchStr);
              }
            });
          }, BLUR_TIMEOUT);
          cancelHttpRequest();

          if (scope.focusOut) {
            scope.focusOut();
          }

          if (scope.overrideSuggestions) {
            if (scope.searchStr && scope.searchStr.length > 0 && scope.currentIndex === -1) {
              handleOverrideSuggestions();
            }
          }
        }
      };

      scope.resetHideResults = function() {
        if (hideTimer) {
          $timeout.cancel(hideTimer);
        }
      };

      scope.hoverRow = function(index) {
        scope.currentIndex = index;
      };

      scope.selectResult = function(result) {
        // Restore original values
        if (scope.matchClass) {
          result.title = extractTitle(result.originalObject);
          result.description = extractValue(result.originalObject, scope.descriptionField);
        }

        if (scope.clearSelected) {
          scope.searchStr = null;
        }
        else {
          scope.searchStr = result.title;
        }
        callOrAssign(result);
        clearResults();
      };

      scope.inputChangeHandler = function(str) {
        if (str.length < minlength) {
          cancelHttpRequest();
          clearResults();
        }
        else if (str.length === 0 && minlength === 0) {
          scope.searching = false;
          showAll();
        }

        if (scope.inputChanged) {
          str = scope.inputChanged(str);
        }
        return str;
      };

      // check required
      if (scope.fieldRequiredClass && scope.fieldRequiredClass !== '') {
        requiredClassName = scope.fieldRequiredClass;
      }

      // check min length
      if (scope.minlength && scope.minlength !== '') {
        minlength = parseInt(scope.minlength, 10);
      }

      // check pause time
      if (!scope.pause) {
        scope.pause = PAUSE;
      }

      // check clearSelected
      if (!scope.clearSelected) {
        scope.clearSelected = false;
      }

      // check override suggestions
      if (!scope.overrideSuggestions) {
        scope.overrideSuggestions = false;
      }

      // check required field
      if (scope.fieldRequired && ctrl) {
        // check initial value, if given, set validitity to true
        if (scope.initialValue) {
          handleRequired(true);
        }
        else {
          handleRequired(false);
        }
      }

      scope.inputType = attrs.type ? attrs.type : 'text';

      // set strings for "Searching..." and "No results"
      scope.textSearching = attrs.textSearching ? attrs.textSearching : TEXT_SEARCHING;
      scope.textNoResults = attrs.textNoResults ? attrs.textNoResults : TEXT_NORESULTS;
      displaySearching = scope.textSearching === 'false' ? false : true;
      displayNoResults = scope.textNoResults === 'false' ? false : true;

      // set max length (default to maxlength deault from html
      scope.maxlength = attrs.maxlength ? attrs.maxlength : MAX_LENGTH;

      // register events
      inputField.on('keydown', keydownHandler);
      inputField.on('keyup', keyupHandler);

      // set response formatter
      responseFormatter = callFunctionOrIdentity('remoteUrlResponseFormatter');

      // set isScrollOn
      $timeout(function() {
        var css = getComputedStyle(dd);
        isScrollOn = css.maxHeight && css.overflowY === 'auto';
      });
    }

    return {
      restrict: 'EA',
      require: '^?form',
      scope: {
        selectedObject: '=',
        disableInput: '=',
        initialValue: '=',
        localData: '=',
        remoteUrlRequestFormatter: '=',
        remoteUrlRequestWithCredentials: '@',
        remoteUrlResponseFormatter: '=',
        remoteUrlErrorCallback: '=',
        remoteApiHandler: '=',
        id: '@',
        type: '@',
        placeholder: '@',
        remoteUrl: '@',
        remoteUrlDataField: '@',
        titleField: '@',
        descriptionField: '@',
        imageField: '@',
        inputClass: '@',
        pause: '@',
        searchFields: '@',
        minlength: '@',
        matchClass: '@',
        clearSelected: '@',
        overrideSuggestions: '@',
        fieldRequired: '=',
        fieldRequiredClass: '@',
        inputChanged: '=',
        autoMatch: '@',
        focusOut: '&',
        focusIn: '&',
        inputName: '@',
        focusFirst: '@',
        parseInput: '&'
      },
      templateUrl: function(element, attrs) {
        return attrs.templateUrl || TEMPLATE_URL;
      },
      compile: function(tElement) {
        var startSym = $interpolate.startSymbol();
        var endSym = $interpolate.endSymbol();
        if (!(startSym === '{{' && endSym === '}}')) {
          var interpolatedHtml = tElement.html()
            .replace(/\{\{/g, startSym)
            .replace(/\}\}/g, endSym);
          tElement.html(interpolatedHtml);
        }
        return link;
      }
    };
  }]);





;
angular.module('app').directive('awDatepickerPattern', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, elem, attrs, ngModelCtrl) {
            var dRegex = new RegExp(attrs.awDatepickerPattern);

            ngModelCtrl.$parsers.unshift(function (value) {
               
                if ((typeof value === 'string') && (value!='')) {
                    var isValid = dRegex.test(value);
                    ngModelCtrl.$setValidity('date', isValid);
                    if (!isValid) {
                        return undefined;
                    }
                }
                return value;
            });

        }
    };
});
;
(function () {
    'use strict';

    angular
        .module('app')
        .directive('btnDisabledReasons', btnDisabledReasons);

    function btnDisabledReasons() {
        return {
            restrict: 'A',
            link: {
                pre: function ($scope, element, attrs) {
                    var reasonMessage = '';
                    var disabledConfig;

                    $scope.$watch(function () { return attrs.btnDisabledReasons }, function () {
                        disabledConfig = angular.copy(attrs.btnDisabledReasons);
                        if (typeof disabledConfig === 'string' && disabledConfig) {
                            disabledConfig = JSON.parse(disabledConfig);
                        }
                        if (disabledConfig && disabledConfig.isDisabled) {
                            reasonMessage = '';
                            angular.element(element).addClass('btn-disable-reason');
                            disabledConfig.disabledReasons.forEach(function (reason) {
                                reasonMessage += reason + '<br>';
                            });
                        } else {
                            reasonMessage = '';
                            angular.element(element).removeClass('btn-disable-reason');
                        }
                    });
                   
                    element.bind('click touchstart', function (e) {
                        if (disabledConfig && disabledConfig.isDisabled) {
                            e.stopImmediatePropagation();
                            e.preventDefault();
                            toastr.error(reasonMessage, {
                                timeOut: 10000
                            });
                        }
                    });
                }
            },
        }
    }
})();
;
angular.module('app').directive('buyersEdit', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('buyersEdit from cache'),
        scope: {
            formname: '=',
            buyers: '=',
            data: '='
        },
        controller: ['$scope', function ($scope) {
            $scope.checkedBuyers = [];
            $scope.selectedBuyers = [];
            $scope.changeBuyerSelection = function (buyer, checked) {
                $scope.data.buyerIds = $scope.data.buyerIds || [];
                if (!buyer) {
                    $scope.checkedBuyers = [];
                    $scope.checkedBuyersText = null;
                    $scope.data.buyerIds = [];
                } else {
                    if (checked) {
                        $scope.selectedBuyers.push(buyer.name);
                        $scope.data.buyerIds.push(buyer.id);
                    } else {
                        $scope.selectedBuyers.splice($scope.selectedBuyers.indexOf(buyer.name), 1);
                        if ($scope.data.buyerIds) {
                            $scope.data.buyerIds.splice($scope.data.buyerIds.indexOf(buyer.id), 1);
                        }
                    }
                    if ($scope.selectedBuyers.length) {
                        $scope.checkedBuyersText = $scope.selectedBuyers.join(';');
                    } else {
                        $scope.checkedBuyersText = null;
                    }
                }
            };
        }]
    };
}]);;
angular.module('app').directive('buyersView', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('buyersView from cache'),
        scope: {
            data: '='
        },
        controller: ['$scope', '$localStorage', '$location', function ($scope, $localStorage, $location) {
            $scope.searchByEDRPOU = function (edrpou) {
                if (!edrpou) return;
                $localStorage.searchPage = null;
                $location.path('edrpouSearch/' + edrpou);
            }
        }]
    };
}]);;
angular.module('app').directive('classificationInput', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('classificationInput from cache'),
        scope: {
            data: '=',
            placeholderText: '=',
            inputName: '=',
            isRequired: '=',
            formName: '=',
            hasError: '='
        }
    }
}]);;
angular.module('app').directive('clickAndBlock',['$q', '$timeout', function ($q, $timeout) {
    return {
        scope: {
            clickAndBlock: '&'
        },
        link: function (scope, iElement, iAttrs) {
            iElement.bind('click', function () {

                iElement.prop('disabled', true);

                $q.when(scope.clickAndBlock()).finally(function () {
                    if (scope.clickAndBlock != null)
                        $timeout(
                            function () { iElement.prop('disabled', false); },
                            5000);
                    else
                        iElement.prop('disabled', false);
                });
            });
        }
    };
}]);;
angular.module('app').directive('clickAndDisable', ['$q', '$timeout', function ($q, $timeout) {
    return {
        scope: {
            clickAndDisable: '&'
        },
        link: function (scope, iElement, iAttrs) {
            iElement.bind('click', function () {

                iElement.prop('disabled', true);

                $q.when(scope.clickAndDisable()).finally(function () {
                    if (scope.clickAndDisable != null)
                        $timeout(
                            function () { iElement.prop('disabled', false); },
                            8000);
                    else
                        iElement.prop('disabled', false);
                });
            });
        }
    };
}]);;
angular.module('app').component('contactPointForm', {
    templateUrl: '/App/Main/base/directives/contactPointForm.html',
    bindings: {
        data: '<',
        form: '=',
        isEditMode: '=',
        condition: '<'
    },
    controllerAs: 'ctrl',
    controller: ['$localStorage',
        function ($localStorage) {

            this.needNameEn = function () {
                return this.data.procurementMethodType == "aboveThresholdEU";
            }

            this.$onInit = function () {

                var self = this;
                if (self.data.organization === undefined)
                    self.data.organization = {};
                self.ng_localStorage = $localStorage;
                self.editModeContactPoint = false;
                self.backUpcontactPoint = {};

                self.setMyData = function () {
                    self.data.organization.contactPoint = {
                        name: $localStorage.userData.surname + ' ' + $localStorage.userData.name,
                        email: $localStorage.userData.emailAddress || null,
                        url: null,
                        telephone: getFirstNumber(),
                        faxNumber: null
                    };

                    if (self.needNameEn())
                        self.data.organization.contactPoint.nameEn = $localStorage.userData.nameEN;
                }

                function getFirstNumber() {
                    var phones = $localStorage.userData.phone;
                    if (phones.substr(phones.length - 1) === ',')
                        phones = $localStorage.userData.phone.slice(0, -1);
                    var arrayJson = "[" + phones + "]";
                    var arrayNumbers = JSON.parse(arrayJson);
                    return arrayNumbers[0].toString();
                }

                self.showEditMode = function() {
                    self.backUpcontactPoint = angular.copy(self.data.organization.contactPoint);
                    self.editModeContactPoint = true;
                }

                self.reset = function() {
                    self.data.organization.contactPoint = angular.copy(self.backUpcontactPoint);
                    self.editModeContactPoint = false;
                }

                if (!self.isEditMode) {
                    if (self.condition == 'create')
                        self.setMyData();
                }
                
            };
        }]
});
;
angular.module('app').component('contractingAmountForm', {
    templateUrl: '/App/Main/base/directives/contractingAmountForm.html',
    bindings: {
        formName: '=',
        contract: '=',
        palace: '='
    },
    controllerAs: 'ctrl',
    controller: [
        'tenderHelperService',
        '$timeout',
        function (
            tenderHelperService,
            $timeout) {
            this.$onInit = function () {
                var self = this;

                self.contract.needVat = tenderHelperService.needVat(self.contract);

                self.initAmountPaid = function (contract) {
                    if (!contract.amountPaid || !contract.amountPaid.amount && contract.amountPaid.amount !== 0 && !contract.amountPaid.amountNet && contract.amountPaid.amountNet !== 0)
                        contract.amountPaid = {
                            amount: contract.value.amount,
                            amountNet: contract.value.amountNet,
                            valueAddedTaxIncluded: contract.value.valueAddedTaxIncluded
                        };

                    contract.amountPaid.currencyCode = contract.value.currencyCode;
                    contract.amountPaid.currencyId = contract.value.currencyId;

                    self.changeValueAddedTaxIncluded(contract);
                    $timeout(function () {
                        self.contract.valueCanEdit = true;
                    }, 2000);
                };

                self.changeValueAddedTaxIncluded = function(contract) {
                    if (!contract.amountPaid.valueAddedTaxIncluded)
                        self.contract.amountPaid.amountNet = self.contract.amountPaid.amount;
                };

                self.changeValueAmount = function (contract) {
                    if (self.contract.valueCanEdit && !contract.amountPaid.valueAddedTaxIncluded)
                        contract.amountPaid.amountNet = contract.amountPaid.amount;
                }

                self.changeValueAmountNet = function (contract) {
                    if (self.contract.valueCanEdit && !contract.amountPaid.valueAddedTaxIncluded)
                        contract.amountPaid.amount = contract.amountPaid.amountNet;
                }

                
                self.validValueAmounts = function (contract, formName) {
                    if (!contract.needVat) return true;
                    if (contract.amountPaid.valueAddedTaxIncluded) {
                        var count = contract.amountPaid.amount / 1.2;
                        count = count.toFixed(2);
                        if (count <= contract.amountPaid.amountNet &&
                            contract.amountPaid.amountNet < contract.amountPaid.amount ||
                            contract.amountPaid.amountNet === 0 && contract.amountPaid.amount === 0 ||
                            // if old Contract
                            contract.oldContract &&
                            amountPaid.amount === amountPaid.amountNet) {
                            if (contract.amountPaid.amountNet > contract.value.amountNet) {
                                setFormValidity(formName, false);
                                return true;
                            }
                            setFormValidity(formName, true);
                            return true;
                        }
                    } else {
                        if (contract.amountPaid && contract.amountPaid.amount >= contract.amountPaid.amountNet) {
                            setFormValidity(formName, true);
                            return true;
                        }
                    }
                    setFormValidity(formName, false);
                    return false;
                }

                function setFormValidity(formName, value) {
                    if (formName.amountNet && formName.amountNet.$setValidity)
                        formName.amountNet.$setValidity("summInvalid", value);
                }

            }}]
});;
angular.module('app').directive('cpvCodes', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/cpvCodes.html',
        scope: {
            selectedCpvs: '=',
            disableBtn: '=',
            isCompact: '=',
            needToSkipModalInclude: '=',
            inputModel: '='
        },
        controller: ['$scope', '$rootScope', 'abp.services.etender.reference', function ($scope, $rootScope, referenceService) {
            $scope.selectedCpvs = [];
            $scope.cpvCodes = [];

            function getDataCpv($defer, params) {
                abp.ui.setBusy(".modal-body");
                var searchString = null;
                if ($scope.searchCpv && $scope.searchCpv.vm) searchString = $scope.searchCpv.vm.searchStringCpv;
                var pager = {
                    page: params.page(),
                    pageSize: params.count(),
                    searchIdentifier: searchString
                };

                if (searchString && searchString.length > 0) {
                    var searchClassificationData = referenceService.getSearchClassificationsRef(searchString);
                    searchClassificationData.then(function (response) {
                        params.total(response.data.length);
                        var tableScope = $('#modalClassifications table').scope();
                        tableScope.$data = setSelected(response.data);
                        abp.ui.clearBusy(".modal-body");
                    });
                } else {
                    var classificationData = referenceService
                        .getClassificationWithChildrensRef($scope.selectedCpvs);
                    classificationData.then(function (response) {
                        params.total(response.data.length);
                        var tableScope = $('#modalClassifications table').scope();
                        tableScope.$data = setSelected(response.data);
                        abp.ui.clearBusy(".modal-body");
                    });
                }

                function setSelected(items) {
                    var cpvs = $scope.selectedCpvs;
                    var cl = cpvs.length;
                    return items.map(function (item) {
                        for (var i = 0; i < cl; i += 1) {
                            if (cpvs[i].id == item.id || cpvs[i] == item.code) {
                                item.$selected = true;
                                return item;
                            }
                        }
                        return item;
                    });
                }
            }

            function updateDataCpv(data, item, isCheckbox) {
                $scope.searchCpv.vm.tableParamsCpv.data = data;
                if (!isCheckbox) {
                    item.$selected = !item.$selected;
                }
                setItem(item);
                updateChildItems(item);
            };

            function updateChildItems(item) {
                if ($scope.searchCpv.vm.tableParamsCpv.data.length == 1) return;
                var cursor = 0;
                $scope.searchCpv.vm.tableParamsCpv.data.some(function (cpvItem, i) {
                    if (cpvItem.id === item.id) {
                        cursor = i;
                        return true;
                    }
                });
                while ($scope.searchCpv.vm.tableParamsCpv.data[cursor + 1] &&
                $scope.searchCpv.vm.tableParamsCpv.data[cursor + 1].rank > item.rank) {
                    $scope.searchCpv.vm.tableParamsCpv.data[cursor + 1].$selected = item.$selected;
                    setItem($scope.searchCpv.vm.tableParamsCpv.data[cursor + 1]);
                    cursor++;
                }

                $scope.generateFilterCodes();
            }

            function setItem(item) {
                var cpvs = $scope.selectedCpvs;
                var alreadySelectedItem = $scope.selectedCpvs.filter(function (cpv) {
                    return cpv.code == item.code;
                });
                if (item.$selected && alreadySelectedItem.length == 0) {
                    cpvs.push({
                        id: item.id,
                        code: item.code,
                        desc: item.description,
                        rank: item.rank,
                        hasChildren: item.hasChildren,
                        isOpen: item.isOpen
                    });
                } else if (!item.$selected) {
                    var index = $scope.selectedCpvs.indexOf(alreadySelectedItem[0]);
                    if (index > -1) {
                        if (cpvs[index].hasChildren && !cpvs[index].isOpen)
                            $scope.cleareChildCpv(cpvs[index]);
                        cpvs.splice(index, 1);
                    }
                }
                $scope.generateFilterCodes();
            }

            $scope.tempChildCpvsArray = null;
            $scope.cleareChildCpv = function (cpvs) {
                var code = cpvs.code;
                var index = code.indexOf(0, 1);
                var smallCod = code.slice(0, index);
                var i = 0;
                
                if ($scope.selectedCpvs)
                    for (i; i < $scope.selectedCpvs.length; i++) {
                        if ($scope.selectedCpvs[i] && $scope.selectedCpvs[i].code) {
                            var childCpvsCode = $scope.selectedCpvs[i].code.slice(0, index);
                            if (childCpvsCode === smallCod) {
                                delete $scope.selectedCpvs[i];
                            }
                        }
                    }
                $scope.generateFilterCodes();
            };

            $scope.initClassification = function () {
                $scope.searchCpv = angular.element($("#modalClassifications")).scope().$parent;
                $scope.searchCpv.init(getDataCpv, updateDataCpv);
            };

            $scope.generateFilterCodes = function () {
                $scope.cpvCodes = [];
                $scope.selectedCpvs.forEach(function (cpv) {
                    $scope.cpvCodes.push(cpv.code);
                });

                $scope.inputModel = $scope.cpvCodes && $scope.cpvCodes.length
                    ? $scope.cpvCodes.join('; ')
                    : '';
            };

            $scope.$on('onMarketTabClicked', function () {
                clearAllCpvModalVariables();
            });

            $scope.$on('clearedFilterFields', function () {
                clearAllCpvModalVariables();
            });
            function clearAllCpvModalVariables() {
                $scope.selectedCpvs = [];
                $scope.cpvCodes = [];
                $scope.inputModel = '';
                $rootScope.clearCheckbox();
            }
        }]
    };
});
;
angular.module('app').directive('currency', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('currency from cache'),
        scope: {
            data: '=',
            isRequired: '=',
            typeForm: '=',
            disabled: '='
        },
        controller: ['$scope', function ($scope) {

            $scope.requiredCurrency = false;
            if ($scope.isRequired) $scope.requiredCurrency = true;

            // TODO: get from Server
            var currencies = [{
                value: 1, title: 'грн', code: 'UAH'
            }, {
                value: 3, title: 'євро', code: 'EUR'
            }, {
                value: 2, title: 'американський долар', code: 'USD'
            }, {
                value: 5, title: 'англійський фунт стерлінгів', code: 'GBP'
            }, {
                value: 4, title: 'російський рубль', code: 'RUB'
            }, {
                value: 6, title: 'молдавський лей', code: 'MDL'
            }];
            
            $scope.vm = {
                changeCurrency: changeCurrency,
                currencies: currencies
            };
            var vm = $scope.vm;

            activate();

            function activate() {
                $scope.$watch("data",
                    function (n, o) {
                        if (!n) return;
                        
                        setCurrency(n);
                    });
            }


            function changeCurrency() {
                $scope.data = vm.sCurrency.value;
            }

            function setCurrency(value) {
                vm.sCurrency = null;
                for (var i = 0; i < currencies.length; i+=1) {
                    if (currencies[i].value == value) {
                        vm.sCurrency = currencies[i];
                        break;
                    }
                }                
            }

        }]
    };
}]);;
angular.module('app').component('customerRegion', {
     // templateUrl: '/App/Main/base/directives/customerRegion.html',
    template: ['$templateCache', function ($templateCache) {
        return $templateCache.get('~/App/Main/base/directives/customerRegion.html')
    }],
    bindings: {
        vm: '='
    },
    controllerAs: 'ctrl',
    controller: [
        '$localStorage',
        'referenceService',
        '$scope',
        function (
            $localStorage,
            referenceService,
            $scope
        ) {
            this.$onInit = function () {
                var self = this;
                if (!self.vm) self.vm = {};
                $scope.placeholder = self.vm && self.vm.placeholder ? self.vm.placeholder : $scope.$root.source('AllStatuses');
                self.ng_localStorage = $localStorage;
                if (self.vm && !self.vm.regionsDictionary) self.vm.regionsDictionary = [];
                if (self.vm && !self.vm.selectedRegions) self.vm.selectedRegions = [];
                self.vm.getRegions = function () {
                    if (self.vm.regionsDictionary.length === 0) {
                        abp.ui.setBusy("#regionsFilter");
                        referenceService
                            .getRegionsByCountryId({ countryId: 1 })
                            .then(function (response) {
                                if (response.data) {
                                    var allregionsUnsorted = response.data.regions;
                                    var kievRegions = allregionsUnsorted.filter(function (r) {
                                        return r.title == 'Київ';
                                    });
                                    if (kievRegions.length > 0) {
                                        var kievIndex = allregionsUnsorted.indexOf(kievRegions[0]);
                                        allregionsUnsorted.splice(0, 0, allregionsUnsorted.splice(kievIndex, 1)[0]);
                                    }
                                    var krimeaRegions = allregionsUnsorted.filter(function (r) {
                                        return r.title == 'АР Крим';
                                    });
                                    if (krimeaRegions.length > 0) {
                                        var krimeaIndex = allregionsUnsorted.indexOf(krimeaRegions[0]);
                                        allregionsUnsorted
                                            .splice(allregionsUnsorted.length,
                                                0,
                                                allregionsUnsorted.splice(krimeaIndex, 1)[0]);
                                    }

                                    $scope.allRegions = allregionsUnsorted;
                                    getRegions();
                                }
                                abp.ui.clearBusy("#regionsFilter");
                            }, function () {
                                abp.ui.clearBusy("#regionsFilter");
                            });
                    }
                }

                self.changeSelRegions = function (region, checked) {
                    if (region) {
                        if (self.vm.isMarlet) {
                            if (checked) self.vm.selectedRegions.push(region.id);
                            else self.vm.selectedRegions.splice(self.vm.selectedRegions.indexOf(region.id), 1);
                        } else {
                            if (checked) self.vm.selectedRegions.push(region.title);
                            else self.vm.selectedRegions.splice(self.vm.selectedRegions.indexOf(region.title), 1);
                        }
                        self.vm.makeRegionsSearchText();
                    } else if (checked) {
                        self.vm.selectedRegions = $scope.allRegions.map(function (region) {
                            return region.id;
                        });
                        self.vm.makeSelectedRegionsChecked();
                    }
                }
                $scope.$on('clearedFilterFields', function (evt) {
                    self.vm.checkedRegions = [];
                });

                self.vm.makeSelectedRegionsChecked = function () {
                    if (!self.vm.selectedRegions) self.vm.selectedRegions = [];
                    if (self.vm.selectedRegions.length > 0) {
                        if (self.vm.regionsDictionary.length === 0) self.vm.getRegions();
                        angular.forEach(self.vm.regionsDictionary,
                            function (region) {
                                if (self.vm.selectedRegions.indexOf(region.title) > -1 || self.vm.selectedRegions.indexOf(region.id) > -1)
                                    self.vm.checkedRegions[self.vm.regionsDictionary.indexOf(region)] = true;
                            });
                        self.vm.makeRegionsSearchText();
                    }
                }

                self.vm.makeRegionsSearchText = function() {
                    self.vm.regionsSearchText = null;
                    angular.forEach(self.vm.selectedRegions,
                        function (pType) {
                            angular.forEach(self.vm.regionsDictionary,
                                function (dict) {
                                    if ((dict.title === pType || dict.id === pType) &&
                                        (!self.vm.regionsSearchText ||
                                            self.vm.regionsSearchText.indexOf(dict.title) === -1))
                                        self.vm.regionsSearchText =
                                            self.vm.regionsSearchText
                                            ? self.vm.regionsSearchText + dict.title + '; '
                                                : dict.title + '; ';
                                });
                        });
                }

                function getRegions() {
                    self.vm.regionsDictionary = $scope.allRegions;
                    self.vm.checkedRegions.length = self.vm.regionsDictionary.length;
                    self.vm.checkedRegions.fill(false);

                }

                self.closeRegionsDropDown = function () {
                    self.isRegionsOpen = false;
                };
            };
        }]
});
;
angular.module("app")
    .directive('ddTextCollapse', ['$compile', function ($compile) {
    return {
        restrict: 'A',
        scope: true,
        link: function (scope, element, attrs) {
            // start collapsed
            scope.collapsed = false;
            // create the function to toggle the collapse
            scope.toggle = function () {
                scope.collapsed = !scope.collapsed;
            };
            // wait for changes on the text
            attrs.$observe('ddTextCollapseText', function (text) {
                // get the length from the attributes
                var maxLength = scope.$eval(attrs.ddTextCollapseMaxLength);
                if (text.length > maxLength) {
                    // split the text in two parts, the first always showing
                    var firstPart = String(text).substring(0, maxLength);
                    var secondPart = String(text).substring(maxLength, text.length);

                    // create some new html elements to hold the separate info
                    var firstSpan = $compile('<span>' + firstPart + '</span>')(scope);
                    var secondSpan = $compile('<span ng-if="collapsed">' + secondPart + '</span>')(scope);
                    var moreIndicatorSpan = $compile('<span ng-if="!collapsed"> ... </span>')(scope);
                    var lineBreak = $compile('')(scope);
                    var toggleButton = $compile('<span class="wsn"><span class="more-text gray" ng-click="toggle()">{{collapsed ? "Меньше" : "Більше"}}</span> <span ng-if="!collapsed"> <i class="fa fa-angle-down toggle-i gray" aria-hidden="true"></i></span><span ng-if="collapsed"> <i class="fa fa-angle-up toggle-i gray" aria-hidden="true"></i></span></span>')(scope);
                    // remove the current contents of the element
                    // and add the new ones we created
                    element.empty();
                    element.append(firstSpan);
                    element.append(secondSpan);
                    element.append(moreIndicatorSpan);
                    element.append(lineBreak);
                    element.append(toggleButton);
                }
                else {
                    element.empty();
                    element.append(text);
                }
            });
        }
    };
}]);;
angular.module('app').directive('decimalMaskInput', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
       // templateUrl: '/App/Main/base/directives/decimalMaskInput.html',
        template: $templateCache.get('~/App/Main/base/directives/decimalMaskInput.html'),
        scope: {
            inputName: '=',
            data: '=',
            isRequired: '=',
            isDisabled: '=',
            changeFunc: '&',
            min: '=',
            max: '=',
            maxLength: '=',
            quantityBlock: '=',
            isNullable: '=',
            isAllowMinus: '=',
            inputId: '=',
            noDigitsOptional: '=',
            isPercent: '=',
            placeholder: '=',
            needZeroAsValue: '=',
            needZeroAsLastValue: '=',
            contractValue: '='
        },
        compile: function compile(tElement, tAttrs, transclude) {
            return {
                post: function postLink(scope, iElement, iAttrs, controller) {
                    var inputMaskSettings = {};

                    if (iAttrs.quantityBlock) {
                        inputMaskSettings = {
                            mask: "9{0,}.9{0,}",
                            rightAlign: false,
                            allowMinus: false,
                        }
                    }
                    else {
                        if (iAttrs.isNullable) {
                            inputMaskSettings = {
                                radixPoint: ".",
                                groupSeparator: " ",
                                rightAlign: false,
                                allowMinus: false,
                                autoGroup: true,
                                digits: 2,
                            }
                        } else {
                            inputMaskSettings = {
                                radixPoint: ".",
                                groupSeparator: " ",
                                rightAlign: false,
                                allowMinus: false,
                                repeat: 16,
                                digitsOptional: !!scope.noDigitsOptional,
                                autoGroup: true,
                                digits: 2,
                            }
                        }
                        if (iAttrs.isAllowMinus) {
                            inputMaskSettings = {
                                radixPoint: ".",
                                groupSeparator: "",
                                rightAlign: false,
                                allowMinus: true,
                                autoGroup: true,
                                digits: 2,
                            }
                        }
                        if (iAttrs.isPercent) {
                            inputMaskSettings = {
                                regex: "^-?[0-9][0-9]?$|^[1-9][0-9][0-9]$"
                            }
                        }
                        if (iAttrs.isExactNumber) {
                            inputMaskSettings = {
                                radixPoint: ".",
                                groupSeparator: "",
                                rightAlign: false,
                                allowMinus: false,
                                autoGroup: true,
                                digits: 2,
                                repeat: 9
                            }
                        }
                        if (iAttrs.isAllowMinusRepeat) {
                            inputMaskSettings = {
                                radixPoint: ".",
                                groupSeparator: "",
                                rightAlign: false,
                                allowMinus: true,
                                autoGroup: true,
                                digits: 2,
                                repeat: 9
                            }
                        }
                        if (iAttrs.contractValue) {
                            inputMaskSettings = {
                                radixPoint: ".",
                                groupSeparator: "",
                                rightAlign: false,
                                autoGroup: true,
                                allowMinus: false,
                                digits: 5
                            }
                        }
                    }
                    setTimeout(function () {
                        var $input = jQuery(iElement).find('.custom__form-control');
                        if (iAttrs.isPercent) {
                            $input.inputmask('Regex', inputMaskSettings).on('keydown', function () {
                                if ($input.val().charAt('0') == '0') {
                                    $input.val('')
                                }
                            });
                        } else {
                            $input.inputmask('numeric', inputMaskSettings)
                                .unbind('click focus')
                                .on('focus click', function () {
                                    if (!$input.val()) {
                                        $input[0].setSelectionRange(0, 0);
                                    }
                                });
                        }
                        
                    }, 1000);
                }
            }
        },
        controller: [
            '$scope',
            '$rootScope',
            '$ocLazyLoad',
            '$timeout',
            function (
                $scope,
                $rootScope,
                $ocLazyLoad,
                $timeout) {

                $scope.vm = {}
                var isUserInput = false;

                $scope.$watch('data', function () {
                    if (isUserInput) return;
                    if (!$scope.data && $scope.needZeroAsValue) {
                        $scope.data = 0;
                    }

                    if ($scope.data && typeof $scope.data == "string") {
                        $scope.vm.value = Number($scope.data);
                    } else {
                        $scope.vm.value = $scope.data;
                    }
                });

                $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                
                
                $scope.stringToNumber = function func() {
                    if ($scope.vm.value) {
                        isUserInput = true;
                        var stringNumber = $scope.vm.value.replace(/\s+/g, '');
                        var minSign = (($scope.min > 0) - ($scope.min < 0)) || +$scope.min;
                        if ($scope.min && minSign === -1 && stringNumber === '-') return;
                        if (stringNumber.charAt(stringNumber.length - 1)  === '.' && $scope.needZeroAsLastValue) {
                            $scope.vm.value += '0';
                        }
                        if (stringNumber.charAt(0) === '-' && minSign === -1) {
                            $scope.data = Number(stringNumber);
                            $scope.data = -Math.abs($scope.data);
                        }
                        else {
                            $scope.data = Number(stringNumber);
                        }
                        setTimeout(function () { isUserInput = false }, 0);
                    } else {
                        if ($scope.isNullable) {
                            $scope.data = null;
                        } else {
                            $scope.data = 0;
                        }
                    }
                    $timeout($scope.changeFunc, 500);
                }

            }]
    };
}]);

;
angular.module('app').directive('divisionsUser', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/divisionsUser.html',
        scope: {
            division: '=',
            index: '=',
            divisionId: '=',
            reload: '&'
        },
        controller: [
            '$scope',
            '$http',
            '$localStorage',
            'abp.services.etender.division',
            function (
                $scope,
                $http,
                $localStorage,
                divisions) {

                $scope.unit = {};
                $scope.units = [];

                // hide input
                $scope.hideInput = function () {
                    $scope.divShow = false;
                }

                $scope.getResponsUsers = function () {
                    var data = { 'divisionId': $scope.divisionId };
                    // get users to divisions
                    var getUsers = divisions.getUsersCanAddToDivision(data);
                    getUsers.then(function (answer) {
                        $scope.units = answer.data;

                    }, function (reqError) {
                        console.log(reqError);
                    });
                }

                // return user from divisions
                $scope.removeUserFromDivision = function (user) {
                    if (confirm("Вилучити " + user.name + ' ' + user.surname + '?')) {
                        abp.ui.setBusy();
                        var params = {
                            "userId": user.id,
                            "divisionId": $scope.divisionId
                        };
                        var returnUser = divisions.removeUserFromDivision(params);
                        returnUser.then(function () {
                            successResponse('Вилучен');
                        }, function (reqError) {
                            errorResponse(reqError);
                        });
                    } else {
                        return;
                    }
                }


                // set user to divisions
                $scope.addUserToDivision = function (unit) {
                    abp.ui.setBusy();
                    var data = {
                        "userId": unit.selected.id,
                        "divisionId": $scope.divisionId,
                        "isHead": unit.selected.isHead
                    }
                    var setUser = divisions.addUserToDivision(data);
                    setUser.then(function () {
                        $scope.unit = {};
                        successResponse('Співробітник призначен');
                    }, function (reqError) {
                        abp.ui.clearBusy();
                        errorResponse(reqError);
                    });
                }

                // select setup
                $scope.unit.selected = $scope.division.responsible;
                $scope.$watch('unit.selected', function () {
                    $scope.division.responsible = $scope.unit.selected;
                });

                $scope.changeUsersition = function (user, division) {
                    user.showEdit = false;
                    var data = {
                        "userId": user.id,
                        "divisionId": division.id,
                        "isHead": user.isHead
                    }
                    var updateUser = divisions.updateUserIsHead(data);
                    updateUser.then(function () {
                        abp.notify.success('Посада змінена');
                    }, function (error) {
                        errorResponse(error);
                    });
                }

                // responses from the server
                function successResponse(notify) {
                    abp.ui.clearBusy();
                    abp.notify.success(notify);
                    $scope.reload();
                }
                function errorResponse(error) {
                    abp.ui.clearBusy();
                    console.log(error);
                }
            }]
    };
});;
angular.module('app').directive('downloadDoc', ['abp.services.etender.filePath', '$http', function (filePath, $http) {
    return {
        scope: {

        },
        link: function ($scope, iElement, iAttr) {

            function dowloadFile(fileUrl) {
                window.open(fileUrl, "_self");
                //setPrimaryProp(fileUrl, tmpInnerHtml);
                return fileUrl;
            }

            //function setPrimaryProp(fileUrl, tmpInnerHtml) {
            //    iElement.prop('innerHTML', tmpInnerHtml);
            //    iElement.prop('href', fileUrl);
            //}

            function downloadDraft(fileUri) {
                $http.get(fileUri)
                    .then(function (data) {
                        if (data.status < 300 && !data.data.error) 
                            return dowloadFile(fileUri);
                        abp.notify.error(data.data.error.message);
                        //return  setPrimaryProp(fileUri, tmpInnerHtml);
                    });
            };

            function previewFile(fileUrl, tmpInnerHtml, format) {
                var doc = {
                    url: fileUrl,
                    title: tmpInnerHtml,
                    format: format
                }
                $scope.$emit('previewDoc', doc);
                //setPrimaryProp(fileUrl, tmpInnerHtml);
            }

            iElement.bind('click', function (event) {
                if (iAttr.href && iAttr.href !== '' || iAttr.preview && iAttr.preview !== '' || iAttr.documentapiid !== '') {
                    event.preventDefault();
                    var tmpInnerHtml = iElement.prop('innerHTML');
                    var tmpHref = iAttr.href || iAttr.preview;
                    //var tmpHref = iElement.prop('innerHTML');
                    //iElement.prop('innerHTML', 'Завантаження...');
                    iElement.removeAttr("href");
                    var input = {
                        fileUri: iAttr.href || iAttr.preview,
                        bidApiId: iAttr.bidapiid || undefined,
                        documentApiId: iAttr.documentapiid || undefined,
                        tenderApiId: iAttr.tenderapiid || undefined
                    };

                    if (input.fileUri && input.fileUri.indexOf("DownloadDraft") !== -1) {
                        if (iAttr.preview) return previewFile(location.origin + '/' + input.fileUri, tmpInnerHtml, iAttr.format);
                        return downloadDraft(tmpHref);
                    }
                    if (input.fileUri == null || input.fileUri === ''|| !input.fileUri.contains('http')) {
                        var getConfidentialityFileUrl = filePath.getConfidentialityFileUrl(input);
                        getConfidentialityFileUrl.then(function (response) {
                            input.fileUri = response.data;
                            var getFile = filePath.getDownloadUrlForPrivateDoc(input);
                            getFile.then(function (response) {
                                return dowloadFile(response.data, tmpInnerHtml);
                            });
                        });
                    } else {
                        var getFile = filePath.getDownloadUrlForPrivateDoc(input);
                        getFile.then(function (reponse) {
                            if (iAttr.href) return dowloadFile(reponse.data, tmpInnerHtml);
                            if (iAttr.preview) return previewFile(reponse.data, tmpInnerHtml, iAttr.format);
                        });
                    }

                } else {
                    abp.notify.error('Документ ще не завантажився! Зачекайте, будь ласка.');
                }

            });
        }
    };
}]);


;
angular.module('app').directive('fileDrop', ['$rootScope', function ($rootScope) {
    var dragTimeout;
    function dragenterHandler(e) {
        $rootScope.$broadcast("dragover");
        clearInterval(dragTimeout);
    }
    function dragleaveHandler(e) {
        clearInterval(dragTimeout);
        dragTimeout = setTimeout(function () {
            $rootScope.$broadcast("draglevae");
        }, 85);
    }
    function dropHandler(e) {
        clearInterval(dragTimeout);
        dragTimeout = setTimeout(function () {
            $rootScope.$broadcast("draglevae");
        }, 85);
    }
    return {
        restrict: 'A',
        scope: {
            fileDropDisabled: '='
        },
        link: function (scope, element) {
            var dragoverText = $rootScope.source('DropHere');
            document.body.addEventListener('dragover', dragenterHandler, false);
            document.body.addEventListener('dragleave', dragleaveHandler, false);
            document.body.addEventListener('drop', dropHandler, false);
            var oldText = element.text();
            $rootScope.$on('dragover', function () {
                if (!scope.fileDropDisabled) {
                    element.addClass('file-drop-dragover');
                    if (element.text() !== dragoverText) {
                        oldText = element.text();
                    }
                    element.text(dragoverText);
                }
            });
            $rootScope.$on('draglevae', function () {
                if (!scope.fileDropDisabled) {
                    element.text(oldText);
                    element.removeClass('file-drop-dragover');
                }
            });
        }
    };
}]);;
angular.module('app').directive('fileNameInput', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/fileNameInput.html',
        //template: $templateCache.get('~/App/Main/base/directives/fileNameInput.html'),
        scope: {
            data: '=',
            isRequired: '=',
            isDisabled: '=',
            changeFunc: '&',
            inputId: '='
        },
        controller: [
            '$scope',
            function ($scope) {
                $scope.vm = {}

                $scope.$watch('data', function () {
                    $scope.vm.fileName = getFileName($scope.data);
                    $scope.vm.extention = '.' + getExtention($scope.data);
                });

                $scope.changeFileName = function () {
                    $scope.data = $scope.vm.fileName + $scope.vm.extention;
                };

                function getExtention(filename) {
                    return filename.substring(filename.lastIndexOf('.') + 1, filename.length) || filename;
                }
                function getFileName(filename) {
                    return filename.substring(0, filename.lastIndexOf('.')) || filename;
                }
            }]
    };
}]);

;
angular.module('app').directive('findOrganizationByEdrpou', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/findOrganizationByEdrpou.html',
        scope: {
            complaint: '=currentComplaint',
            maxlength: '=',
            findedOrganization: '=',
            findedOrganizationId: '=?'
        },
        controller: [
            '$rootScope',
            '$scope',
            'abp.services.etender.organization',
            function ($rootScope, $scope, organization) {
            $scope.filter = {
                inputedEDRPOU: ''
            };
            $scope.onlyNumbers = /^\d+$/;
            $scope.findedOrganization = null;

            $scope.getIdentifiersByEdrpou = function () {
                abp.ui.setBusy("#findedOrganiz");
               return organization.getIdentifiersByEdrpou({ innOrEdrpou: $scope.filter.inputedEDRPOU })
                            .then(function (reponse) {
                                if (reponse.data) {
                                    $scope.findedOrganization = reponse.data;
                                    $scope.findedOrganization.notSaved = true;                                    
                                }                        
                                //console.log("finded organization:", data);
                                $scope.findedOrganizationId = $scope.findedOrganization.length > 0 ? $scope.findedOrganization[0].id : 0;
                                abp.ui.clearBusy("#findedOrganiz");
                            }, function () {
                                $scope.findedOrganization = null;
                                abp.ui.clearBusy("#findedOrganiz");
                            }).then(function () {
                        return angular.noop();
                    });
              };
           

            }]
    };
});;
angular.module('app').directive("formOnChange", ['$parse', '$timeout', function ($parse, $timeout) {
    return {
        require: "form",
        link: function (scope, element, attrs) {
            var active = true;
            var cb = $parse(attrs.formOnChange);
            function formChanged() {
                if (active) {
                    active = false;
                    $timeout(function () {
                        active = true;
                        cb(scope);
                    }, 1000);
                }
                return;
            }
            element.keyup(function () {
                formChanged();
            }).change(function () {
                cb(scope);
            });
        }
    }
}]);;
angular.module('app').directive('goBack', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        scope: {
            tenderId: '='
        },
        template: $templateCache.get('~/App/Main/base/directives/goBack.html'),
        controller: ['$scope', 'urlService',
            function ($scope, urlService) {
                jQuery(document).ready(function () {
                    jQuery('.go_back').click(function () {
                        if ($scope.tenderId) {
                            urlService.redirectToTenderDetailes($scope.tenderId);
                        } else {
                            $scope.$root.preserveLastPage = true;
                            parent.history.back();
                            return false;
                        }
                    });
                });
            }]
    };
}]);;
angular.module('app').component('itemsQuantity', {
    templateUrl: '/App/Main/base/directives/itemsQuantity.html',
    bindings: {
        data: '=',
        isDisabled: '<',
        idBlock: '<',
        unitPrices: '=',
        checkboxes: '=',
        contractValue:'='
    },
    controllerAs: 'vm',
    controller: ['$scope', function ($scope) {
        this.$onInit = function () {
            var vm = this;
            vm.showColapseIf = 5;
            if (vm.isDisabled) vm.items = angular.copy(vm.data.items);
            else vm.items = vm.data.items;
            vm.isSymbol = function (e) {
                e = e || window.event;
                var charCode = (typeof e.which == 'undefined') ? e.keyCode : e.which;
                var charString = String.fromCharCode(charCode);
                if (!/[0-9\.]/.test(charString)) {
                    e.preventDefault();
                    return false;
                }
            };

            vm.checkDigitsCount = function (item, event) {
                event = event || window.event;
                if (item) {
                    var countDecimals = item.toString().split('.')[1];
                    if (countDecimals && countDecimals.length >= 5) {
                        event.preventDefault();
                        return false;
                    }
                }
            }

            vm.disabledBySpecificCheckboxType = function (checkboxes) {
                return !!checkboxes && checkboxes.find(function (type) {
                    return type.selected && 
                            (type.value === "volumeCuts" || 
                            type.value === "fiscalYearExtension" || 
                            type.value === 'itemPriceVariation');
                });
            };

            vm.disabledBySelectedCheckboxTypes = function (checkboxes) {
                return !!checkboxes && checkboxes.find(function (type) {
                    return type.selected && (
                        type.value === "volumeCuts" ||
                        type.value === "itemPriceVariation" ||
                        type.value === "priceReduction" ||
                        type.value === "taxRate" ||
                        type.value === "thirdParty" ||
                        type.value === "fiscalYearExtension"
                    );
                });
            };

            vm.canUserChangeDescription = function (checkboxes) {
                return !!checkboxes && checkboxes.find(function (type) {
                    return type.selected && (
                        type.value === "volumeCuts" ||
                        type.value === "itemPriceVariation" ||
                        type.value === "fiscalYearExtension" ||
                        type.value === "qualityImprovement"
                    );
                });
            }

            vm.showUserDateField = function(checkboxes) {
                return !!checkboxes && checkboxes.find(function (type) {
                    return type.selected && (
                        type.value === "fiscalYearExtension" ||
                        type.value === "durationExtension"
                    );
                });
            }

            $scope.$watch('vm.contractValue', function (value) {
                vm.calculateSummOfEveryItem();
                vm.errorIfContractLessThanFullUnitsPrice = vm.fullUnitsPrice > value;
            }, true);

            vm.calculateSummOfEveryItem = function () {
                var resultSumm = 0;
                vm.data.errorInUnitAmount = false;
                
                angular.forEach(vm.data.items, function (item) {
                    if (item && item.unitPrice) {
                        resultSumm += item.quantity * item.unitPrice.amount;
                    }
                });

                vm.fullUnitsPrice = parseFloat(resultSumm).toFixed(2);
            }
        }
    }]
});
;
// custom validator to check minimalvalue
angular.module('app').directive('mindecimal', function () {
        return {
            require: 'ngModel',
            link: function (scope, elm, attrs, ctrl) {
                ctrl.$validators.mindecimal = function (modelValue, viewValue) {

                    var minimalValue = attrs.mindecimal;
                    var result = true;
                    if (ctrl.$isEmpty(modelValue)) {
                        // consider empty models to be valid
                        result = true;
                    }

                    var sum = parseInt(modelValue);
                    if (sum || sum === 0) {
                        if (sum >= minimalValue) {
                            result = true;
                        } else {
                            result = false;
                        }
                    }
                    //console.log(result);
                    return result;

                };
            }
        };
    });





;
angular.module('app').directive('modalCancel', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/views/tenders/modalCancelTender.html',
        scope: {
            detailes: '=',
            modalCancel: '=',
            id: '=',
            beginCancelTender: '=',
            setCancellationActiveStatus: '=',
            setCancellationPendingStatus: '=',
            setUnsuccessfulStatus: '=',
            cancelationData: '=',
            endCancelTender: '=',
            addFiles: '=',
            checkDocumentsIsExported: '=',
            cancelTenderModel: '=',
            sortedCancellations: '='
        },
        controller: ['$scope', function ($scope) {
            $scope.showSignModal = function (cancelationData) {
                $scope.entityType = 'cancellation';
                cancelationData.type = 'cancellation';
                $scope.cancellationData = cancelationData;
                $scope.$emit('onCancelTenderSign', $scope.cancellationData, $scope.entityType);
            };
        }]
    }
})
;
angular.module('app').directive('modalCancelTenderButton', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('modalCancelTenderButton from cache'),
        scope: {
            detailes: '=',
            naviBlock: '=',
            type: '=',
            lot: '=?'
        },
        controller: [
            '$scope',
            '$timeout',
            'setCurrentCancelLotForModalService',
            'findLotService',
            'setModalPositionService',
            'documentsService',
            'abp.services.etender.cancellationTender',
            function (
                $scope,
                $timeout,
                setCurrentCancelLotForModalService,
                findLotService,
                setModalPositionService,
                documentsService,
                cancellationTenderAppService
            ) {
                $scope.id = ~~(Math.random() * 1000); //Айди для нескольки модалок на странице
                $scope.upload = [];
                $scope.complaints = 0;
                $scope.vm = {};
                $scope.selectedReasonType = null;

                $scope.cancelTenderModel = {
                    reason: '',
                    cancelFor: null
                };

                $scope.checkDocumentsIsExported = function (documents) {
                    return documentsService.checkDocumentsIsExported(documents);
                };

                // если lot = null - значит Отмена на тендер, иначе - на лот
                $scope.openModalCancelTender = function (lot) {
                    $scope.lot = lot;
                    $scope.showModalCancelTender = true;
                    // тут лежат текущие cancellations для модального окна
                    $timeout(function () {
                        setCurrentCancelLotForModalService.setCurrentCancellationsForModal(lot, $scope);
                        $('#modalCancelTender-' + $scope.id).modal('toggle');
                        $scope.sortedCancellations = $scope.detailes.curCancellations.filter(function (cancel) {
                            return cancel.status !== 'unsuccessful';
                        })
                        if ($scope.sortedCancellations.length) {
                            cancellationTenderAppService.getCancellation({ id: $scope.sortedCancellations[0].id }).then(function (response) {
                                $scope.cancelationData = response.data;
                                $scope.sortedCancellations[0].documents = $scope.cancelationData.documents;
                            });
                        }
                    }, 0);
                };

                $scope.$watch('detailes', function (newVal, oldVal) {
                    setCurrentCancelLotForModalService.setCurrentCancellationsForModal($scope.lot, $scope);
                    if ($scope.detailes.curCancellations) {
                        if (oldVal !== newVal) {
                            $scope.sortedCancellations = $scope.detailes.curCancellations.filter(function (cancel) {
                                return cancel.status !== 'unsuccessful';
                            })
                        }
                    }
                })

                $scope.beginCancelTender = function () {
                    $('#modalCancelTender-' + $scope.id).modal('hide');
                    abp.ui.setBusy();
                    $scope.cancelTenderModel.tenderId = $scope.detailes.id;
                    $scope.cancelTenderModel.relatedLot = $scope.cancelTenderModel.cancelFor.type == 'lot' ? $scope.cancelTenderModel.cancelFor.lotId : null //  на lot

                    if ($scope.detailes.procurementMethodType === 'closeFrameworkAgreementSelectionUA' && !$scope.detailes.isNewCancellationFlow2020)
                        clearReasonType($scope.cancelTenderModel);

                    cancellationTenderAppService.createCancellation($scope.cancelTenderModel)
                        .then(function (response) {
                            var lotToOpenForModal = findLotService.findLotById($scope.cancelTenderModel.cancelFor.lotId, $scope);
                            $scope.cancelTenderModel.relatedLot = null;
                            if (response.data) {
                                if (lotToOpenForModal) { // для лота
                                    lotToOpenForModal.cancellations = response.data; // толко что полученные cancellations аттачим к соответств-му лоту
                                } else { // для тендера
                                    $scope.detailes.cancellations = response.data;
                                }
                            }
                            abp.ui.clearBusy();
                            $scope.openModalCancelTender(lotToOpenForModal);
                        },
                        function (response) {
                            abp.notify.error(response.data.exceptionMessage || response.data.message);
                            abp.ui.clearBusy();
                            });
                };

                $scope.setCancellationActiveStatus = function () {
                    $('#modalCancelTender-' + $scope.id).modal('hide');
                    $scope.cancelTenderModel.tenderId = $scope.detailes.id;
                    $scope.cancelTenderModel.relatedLot = $scope.cancelTenderModel.cancelFor.type == 'lot' ? $scope.cancelTenderModel.cancelFor.lotId : null, //  на lot
                        abp.ui.setBusy();
                    cancellationTenderAppService.setCancellationActiveStatusAsync({ id: $scope.sortedCancellations[0].id })
                        .then(function (response) {
                            if (response.data) {
                                if ($scope.cancelTenderModel.relatedLot) {
                                    abp.notify.success('Лот скасовано!');
                                } else {
                                    abp.notify.success('Закупівлю скасовано!');
                                }
                                //reloadService.reloadDetailes($scope);
                                $scope.$emit('reloadTender');
                            } else {

                                if ($scope.cancelTenderModel.relatedLot) {
                                    abp.notify.error('Вибачте, лот не може бути скасовано саме зараз. Триває синхронізація даних з ЦБД. Поверніться до скасування лота через деякий час.');
                                } else {
                                    abp.notify.error('Вибачте, закупівлю не може бути скасовано саме зараз. Триває синхронізація даних з ЦБД. Поверніться до скасування закупівлі через деякий час.');
                                }

                            }
                            abp.ui.clearBusy();
                        },
                            function (response) {
                                abp.notify.error(response.data.exceptionMessage || response.data.message);
                                abp.ui.clearBusy();
                            });
                };
                $scope.setCancellationPendingStatus = function () {
                    $('#modalCancelTender-' + $scope.id).modal('hide');
                    $scope.cancelTenderModel.tenderId = $scope.detailes.id;
                    $scope.cancelTenderModel.relatedLot = $scope.cancelTenderModel.cancelFor.type == 'lot' ? $scope.cancelTenderModel.cancelFor.lotId : null, //  на lot
                        abp.ui.setBusy();
                    cancellationTenderAppService.setCancellationPendingStatus({ id: $scope.sortedCancellations[0].id })
                        .then(function (response) {
                            if (response.data) {
                                if ($scope.cancelTenderModel.relatedLot) {
                                    abp.notify.success('Успішно! Почався період оскарження скасування лоту.');
                                } else {
                                    abp.notify.success('Успішно! Почався період оскарження скасування закупівлі.');
                                }
                                //reloadService.reloadDetailes($scope);
                                $scope.$emit('reloadTender');
                            } else {

                                if ($scope.cancelTenderModel.relatedLot) {
                                    abp.notify.error('Вибачте, лот не може бути скасовано саме зараз. Триває синхронізація даних з ЦБД. Поверніться до скасування лота через деякий час.');
                                } else {
                                    abp.notify.error('Вибачте, закупівлю не може бути скасовано саме зараз. Триває синхронізація даних з ЦБД. Поверніться до скасування закупівлі через деякий час.');
                                }

                            }
                            abp.ui.clearBusy();
                        },
                            function (response) {
                                abp.notify.error(response.data.exceptionMessage || response.data.message);
                                abp.ui.clearBusy();
                            });
                };
                $scope.setUnsuccessfulStatus = function () {
                    $('#modalCancelTender-' + $scope.id).modal('hide');
                    $scope.cancelTenderModel.tenderId = $scope.detailes.id;
                    $scope.cancelTenderModel.relatedLot = $scope.cancelTenderModel.cancelFor.type == 'lot' ? $scope.cancelTenderModel.cancelFor.lotId : null, //  на lot
                        abp.ui.setBusy();
                    cancellationTenderAppService.setCancellationUnsuccessfulStatus({ id: $scope.sortedCancellations[0].id })
                        .then(function (response) {
                            if (response.data) {
                                if ($scope.cancelTenderModel.relatedLot) {
                                    abp.notify.success('Рішення про відміну лоту скасовано!');
                                } else {
                                    abp.notify.success('Рішення про відміну закупівлі скасовано!');
                                }
                                //reloadService.reloadDetailes($scope);
                                $scope.$emit('reloadTender');
                            } else {

                                if ($scope.cancelTenderModel.relatedLot) {
                                    abp.notify.error('Вибачте, рішення про відміну лоту не може бути скасовано саме зараз. Триває синхронізація даних з ЦБД. Поверніться до скасування через деякий час.');
                                } else {
                                    abp.notify.error('Вибачте, рішення про відміну закупівлі не може бути скасовано саме зараз. Триває синхронізація даних з ЦБД. Поверніться до скасування через деякий час.');
                                }

                            }
                            abp.ui.clearBusy();
                        },
                            function (response) {
                                abp.notify.error(response.data.exceptionMessage || response.data.message);
                                abp.ui.clearBusy();
                            });
                };

                $scope.getTenderBefore = function () {
                    $scope.documentsToAdd = null;
                    abp.ui.setBusy();
                    $(".hide-move-efect").fadeOut();
                };

                $scope.questionsLength = function () {
                    if (!$scope.detailes.questions) return [];
                    var length = $scope.detailes.questions.length;
                    var questions = 0;
                    for (i = 0; i < length; i++) {
                        if ($scope.detailes.questions[i].isExported && $scope.detailes.questions[i].isOwn || !$scope.detailes.questions[i].isOwn)
                            questions = questions + 1;
                    };
                    return questions;
                }

                function showModalDocNotification(id) {
                    $scope.showModalDocNotification = true;
                    $timeout(function () {
                        $(id).modal('toggle');
                    }, 1000);
                }

                $scope.$on('showModalDocNotification', function (evt, id) {
                        showModalDocNotification(id);
                });

                function clearReasonType(cancelTenderModel) {
                    delete cancelTenderModel.reasonType;
                }

                $scope.showButton = function () {
                    setModalPositionService.setPositionSecond();
                    $('.bidButton-fixed').css("display", "block");
                }
            }
        ]
    }
}]);
angular.module('app')
    .directive('nameYouControlTooltip', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/nameYouControlTooltip.html',
            scope: {
                personInfo: '=',
                tooltipText: '=',
                name: '=',
                listName: '=',
                youControlSearchId: '='
            },
            controller: [
                '$scope',
                '$window',
                'abp.services.etender.youControl',
                function (
                    $scope,
                    $window,
                    youControl
                ) {

                    $scope.isTooltipOpen = false;

                    $scope.vm = {
                        personInfo: $scope.personInfo,
                        youControlSearchId: $scope.youControlSearchId
                    };

                    $scope.$watch('personInfo', function (data) {
                        $scope.vm.personInfo = data;
                    })

                    $scope.searchOnYouControl = function (edrpou) {
                        abp.ui.setBusy();
                        youControl.getYouControlLink(edrpou)
                            .then(function (response) {
                                window.open(response.data, "_blank");
                            })
                            .finally(function () { abp.ui.clearBusy(); });
                    };

                    $scope.openTooltip = function () {
                        if (!$scope.isTooltipOpen) {
                            $('#' + $scope.name).tooltip({
                                title: $scope.tooltipText,
                                placement: 'bottom'
                            });
                            $('#' + $scope.name).tooltip('show');
                            $window.addEventListener('click', listenClickOutside);
                            $scope.isTooltipOpen = true;
                        }
                    };

                    function listenClickOutside(event) {
                        if ($scope.isTooltipOpen) {
                            if (!$(event.target).hasClass('tooltip-inner') && 
                                !$(event.target.parentElement).hasClass('tooltip-inner') && 
                                event.target.id !== $scope.listName) {

                                $scope.isTooltipOpen = false;
                                $('#' + $scope.name).tooltip('hide');
                                $window.removeEventListener('click', null);
                            } 
                        }
                    };
            }]
        };
    });
;
angular.module('app').directive('navigationBlock', ['$templateCache', '$anchorScroll', function ($templateCache, $anchorScroll) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/navigationBlock.html',
         template: $templateCache.get('~/App/Main/base/directives/navigationBlock.html'),
        scope: {
            navigation: '=',
            needToSetPage: '='
        },
        controller: ['$scope', '$location', function ($scope, $location) {
            $scope.changeView = function (type) {
                $scope.navigation.forEach(function (item) {
                    if (item.type === type) {
                        item.active = true;
                        item.openFunc();
                        if ($scope.needToSetPage) {
                            $location.search('page', 1);
                        }
                    } else {
                        item.active = false;
                    }
                });
            }
        }]
    };
}]);
;
angular.module('app').directive('navigationBlockEcatalog', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/navigationBlock.html',
         template: $templateCache.get('~/App/Main/base/directives/navigationBlock.html'),
        //scope: {
        //    navigation: '='
        //},
        controller: [
            '$scope',
            '$rootScope',
            '$window',
            '$location',
            function (
                $scope,
                $rootScope,
                $window,
                $location) {

            $scope.navigation = [
                {
                    title: $rootScope.source('CompetitiveProcedures'),
                    type: 'open-selective',
                    active: false,
                    show: true,
                    openFunc: function () {
                        openTab('/?open-selective', this);
                    },
                    imgClass: 'ico_konk-g'

                }, {
                    title: $rootScope.source('NoncompetitiveProcedures'),
                    type: 'limited',
                    active: false,
                    show: true,
                    openFunc: function () {
                        openTab('/?limited', this);
                    },
                    imgClass: 'ico_nokonk-g'
                }, {
                    title: $rootScope.source('ProZorroPlans'),
                    type: 'plans',
                    active: false,
                    show: true,
                    openFunc: function () {
                        openTab('/?plans', this);
                    },
                    imgClass: 'ico_plans-g'
                }, {
                    title: $rootScope.source('ElectronicCatalogs'),
                    type: 'eCatalog',
                    active: true,
                    show: true,
                    openFunc: function () {
                        return;
                    },
                    imgClass: 'ico_ecatalog-g'
                }, {
                    title: $rootScope.source('ProZorroAnalytics'),
                    type: 'proZorroAnalytics',
                    active: false,
                    show: true,
                    openFunc: function () {
                        $window.open('https://bi.prozorro.org/sense/app/fba3f2f2-cf55-40a0-a79f-b74f5ce947c2/sheet/HbXjQep/state/analysis', '_blank');
                        this.active = false;
                    },
                    imgClass: 'ico_analitic-g'
                }
                ];

                function openTab(url, tab) {
                    url = $location.$$absUrl.replace($location.$$path, url);
                    $window.open(url, "_self");
                    tab.active = false;
                }

                $scope.changeView = function (type) {
                    $scope.navigation.forEach(function (item) {
                        if (item.type === type) {
                            item.openFunc();
                        }
                    });
                }
            }]
    };
}]);;
angular.module('app').component('organizationInfoBlock', {
    templateUrl: '/App/Main/base/directives/organizationInfoBlock.html',
    //bindings: {
    //    data: '<'
    //},
    controllerAs: 'ctrl',
    controller: ['$localStorage', 'siteSettingsService',
        function ($localStorage, siteSettingsService) {
            this.$onInit = function () {
                siteSettingsService.addClearUserSpecialCssStyle();
                var self = this;
                self.ng_localStorage = $localStorage;
            };

            this.getOrganizationName = function (name) {
                var self = this;

                if (self.ng_localStorage
                    && (self.ng_localStorage.userTenantId === 77794 || self.ng_localStorage.userTenantId === 73687
                        || self.ng_localStorage.userTenantId === 79805 || self.ng_localStorage.userTenantId === 79167 ||
                        self.ng_localStorage.userTenantId === 80385)) {
                    
                    if (name.indexOf('ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ') !== -1) {
                        name = name.replace('ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ', 'ТОВ');
                    }

                    if (name.indexOf('Фізична особа-підприємець') !== -1) {
                        name = name.replace('Фізична особа-підприємець', 'ФОП');
                    }
                }

                return name;
            };
        }]
});
;
angular.module('app').directive('responsibleUser', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/responsibleUser.html',
        scope: {
            tender: '=',
            index: '=',
            tenderId: '=',
            reload: '&',
            isArchive: '='
        },
        controller: [
            '$scope',
            '$http',
            'abp.services.etender.userTender',
            '$localStorage',
            function (
                $scope,
                $http,
                setUserToRespons,
                $localStorage) {

                $scope.unit = {};
                $scope.units = [];

                // hide input
                $scope.hideInput = function () {
                    $scope.divShow = false;
                }

                $scope.getResponsUsers = function () {
                    var data = { "tenderNewId": $scope.tenderId };
                    // get users to resopns
                    var getUsers = setUserToRespons.getUsersCanBeSetResponsible(data);
                    getUsers.then(function (answer) {
                        $scope.units = answer.data;
                        console.log($scope.units);
                    }, function (reqError) {
                        console.log(reqError);
                    });
                }

                // return user from respons
                $scope.returnResponsibleUser = function (user) {
                    if (confirm("Вилучити " + user.name + ' ' + user.surname + '?')) {
                        abp.ui.setBusy();
                        var params = {
                            "tenderNewId": $scope.tenderId,
                            "userId": user.id
                        };
                        var returnUser = setUserToRespons.returnResponsibleUserTenderToSender(params);
                        returnUser.then(function () {
                            successResponse('Вилучен');
                        }, function (reqError) {
                            errorResponse(reqError);
                        });
                    } else {
                        return;
                    }
                }

                function paramsToSetRespons() {
                    var params = {
                        tenderNewId: $scope.tenderId,
                        userId: $scope.tender.responsible && $scope.tender.responsible.id || $localStorage.userId,
                        deleteExistingManagers: false
                    };
                    return params;
                }


                // check if any users Respons
                $scope.setResponsWhithData = function (unit) {
                    setRespons(paramsToSetRespons(), unit);
                };

                function hideUserAssign() {
                    return $localStorage.submittedDivisionsCount === 0 && !$localStorage.isAdmin;
                };
                $scope.hideUserAssign = hideUserAssign();

                function getConfirmationToRemap(user) {
                    return confirm('Відповідальний на тендер вже є: ' +
                        user.name +
                        ' ' +
                        user.surname +
                        '\r\n' +
                        'Бажаєте перепризначити (або змінити)?');
                }

                // set user to respons
                function setRespons(params, unit) {
                    abp.ui.setBusy();
                    var setUser = setUserToRespons.setResponsibleUserTender(params);
                    setUser.then(function (answer) {
                        if (answer.data &&
                            answer.data.responsibles &&
                            answer.data.responsibles.length > 0 &&
                            getConfirmationToRemap(answer.data.responsibles[0])) {
                            var params = paramsToSetRespons();
                            params.deleteExistingManagers = true;
                            setRespons(params);
                            return;
                        } else if (answer.data && (!answer.data.responsibles || answer.data.responsibles.length === 0)) {
                            successResponse('Відповідального назначено');
                            unit = {};
                        } else {
                            abp.ui.clearBusy();
                            return;
                        }
                    }, function (reqError) {
                        abp.ui.clearBusy();
                        errorResponse(reqError);
                    });
                }

                // select setup
                $scope.unit.selected = $scope.tender.responsible;
                $scope.$watch('unit.selected', function () {
                    $scope.tender.responsible = $scope.unit.selected;
                });

                // responses from the server
                function successResponse(notify) {
                    abp.ui.clearBusy();
                    abp.notify.success(notify);
                    $scope.reload();
                }
                function errorResponse(error) {
                    abp.ui.clearBusy();
                    console.log(error);
                }
            }]
    };
});;
angular.module('app').directive('responsibleUserForTenders', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/responsibleUserForTenders.html',
        scope: {
            reload: '&',
            isArchive: '=',
            tendersId: '=',
            tenders: '='
        },
        controller: [
            '$scope',
            '$http',
            'abp.services.etender.userTender',
            '$localStorage',
            function (
                $scope,
                $http,
                setUserToRespons,
                $localStorage) {

                $scope.unit = {};
                $scope.units = [];

                $scope.getResponsUsers = function () {
                    var data = { "tenderNewId": $scope.tenderId };
                    // get users to resopns
                    var getUsers = setUserToRespons.getUsersCanBeSetResponsible(data);
                    getUsers.then(function (answer) {
                        $scope.units = answer.data;
                        console.log($scope.units);
                    }, function (reqError) {
                        console.log(reqError);
                    });
                }

                function paramsToSetRespons() {
                    var params = {
                        list: [],
                        deleteExistingManagers: true
                    };
                    var i = 0;
                    for (i; i < $scope.tendersId.length; i++) {
                            params.list[i] = {
                                tenderNewId: $scope.tendersId[i],
                                userId: $scope.responsible.id
                        }
                    }
                    return params;
                }


                // check if any users Respons
                $scope.setResponsWhithData = function (unit) {
                    setRespons(paramsToSetRespons(), unit);
                };

                function hideUserAssign() {
                    return $localStorage.submittedDivisionsCount === 0 && !$localStorage.isAdmin;
                };
                $scope.hideUserAssign = hideUserAssign();

                function getConfirmationToRemap(user) {
                    return confirm('Відповідальний на тендер вже є: ' +
                        user.name +
                        ' ' +
                        user.surname +
                        '\r\n' +
                        'Бажаєте перепризначити (або змінити)?');
                }

                // set user to respons
                function setRespons(params, unit) {
                    abp.ui.setBusy();
                    var setUser = setUserToRespons.setResponsibleUserTenderList(params);
                    setUser.then(function (answer) {
                        if (answer.data &&
                            answer.data.responsibles &&
                            answer.data.responsibles.length > 0 &&
                            getConfirmationToRemap(answer.data.responsibles[0])) {
                            var params = paramsToSetRespons();
                            params.deleteExistingManagers = true;
                            setRespons(params);
                            return;
                        } else if (answer.data && (!answer.data.responsibles || answer.data.responsibles.length === 0)) {
                            successResponse('Тендера призначені');
                            $scope.unit = {};
                            $scope.tendersId = [];
                            $scope.tenders.wantSetResponsUsersToAll = false;
                        } else {
                            abp.ui.clearBusy();
                            return;
                        }
                    }, function (reqError) {
                        abp.ui.clearBusy();
                        errorResponse(reqError);
                    });
                }

                $scope.clearData = function () {
                    $scope.unit = {};
                    $scope.tendersId = [];
                    $scope.tenders.wantSetResponsUsersToAll = false;
                }

                // select setup

                $scope.$watch('unit.selected', function () {
                    $scope.responsible = $scope.unit.selected;
                });

                // responses from the server
                function successResponse(notify) {
                    abp.ui.clearBusy();
                    abp.notify.success(notify);
                    $scope.reload();
                }
                function errorResponse(error) {
                    abp.ui.clearBusy();
                    console.log(error);
                }
            }]
    };
});;
angular.module('app').component('scale', {
    templateUrl: '/App/Main/base/directives/scale.html',
    bindings: {
        data: '<'
    },
    controllerAs: 'ctrl',
    controller: ['$localStorage', 'organizationDataService',
        function ($localStorage, organizationDataService) {
            this.$onInit = function() {
                var self = this;
                self.ng_localStorage = $localStorage;

                self.getOrganizationScaleData = function() {
                    organizationDataService.getData().then(function(organizaton) {
                        self.organizaton = organizaton.data;
                        if (self.organizaton.scale && self.organizaton.scale.id) {
                            self.organizaton.scaleOld = angular.copy(self.organizaton.scale.id);
                            delete self.organizaton.scale.name;
                        } else {
                            self.organizaton.scaleOld = null;
                        }
                        organizationDataService.getOrganizationScaleList();
                    });
                };

                self.data.updateOrganizationData = function() {
                    if (self.organizaton.scaleOld === self.organizaton.scale.id) return;
                    var update = organizationDataService.updateOrCreateOrganization(self.organizaton);
                    abp.ui.setBusy();
                    update.then(function () {
                        abp.notify.success("Організацію успішно оновлено!");
                        self.getOrganizationScaleData();
                    }, function () {
                        abp.notify.error("Не вдалося оновити організацію!");
                    });
                };

            };
        }]
});
;
angular.module('app').directive('tenderDetailesAboutInfoAndDocs', function () {
    return {
        templateUrl: '/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutInfoAndDocs.html',
        restrict: 'E',
        scope: {
            detailes: '=',
            getReasonType: '='
        }
    }
});
angular.module('app').directive('title', [
    '$rootScope',
    '$window',
    '$timeout',
    function (
        $rootScope,
        $window,
        $timeout) {
        return {
            link: function () {

                var listener = function (event, toState) {
                    $timeout(function () {
                        if (!$rootScope.meta) $rootScope.meta = {};
                        if (!toState.data || toState.data && !toState.data.ownTitle)
                            $rootScope.meta.title = abp.localization.getSource("Shared")("Title");
                        if (!toState.data || toState.data && !toState.data.ownDescription)
                            $window.document.getElementsByName('description')[0].content = abp.localization.getSource("Shared")("DescriptionHead");
                    }, 1000);
                };

                $rootScope.$on('$stateChangeSuccess', listener);
            }
        };
    }
]);;
angular.module('app').directive('unit', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('unit from cache'),
        scope: {
            data: '=',
            isRequired: '=',
            formName: '=',
            index: '=',
            parentIndex: '=',
            isDisabled: '='
        },
        controller: ['$scope', 'referenceService', function ($scope, reference) {
            $scope.units = [];
            var getUnits = reference.getAllUnits();
            getUnits.then(function (res) {
                $scope.units = res.data.units;
            });
            $scope.unit = {};
            $scope.unit.selected = $scope.data;
            $scope.$watch('unit.selected', function () {
                $scope.data = $scope.unit.selected;
            });
        }]
    };
}]);;
angular.module('app').directive('uploadFile', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        transclude: true,
        template: $templateCache.get('uploadFile from cache'),
        scope: {
            id: '=',
            class: '=',
            massBidUpload: '=',
            accept: '=',
            files: '=',
            fields: '=',
            disabled: '=',
            onUpload: '=',
            onUploadData: '=',
            onSuccess: '=',
            onSuccessData: '=',
            onError: '=',
            onChange: '=',
            isAddFileTitle: '=',
            isUploadDocsTitle: '=',
            btnType: '=',
            noPlusIcon: '=',
            doNotUpload: '=',
            apiUrl: '=',
            isUploadDraftToBid: '=',
            lot: '=',
            needToSkipComplaints: '='
        },
        controller: [
            '$scope',
            'uploadFileService',
        function ($scope, uploadFileService) {
            $scope.maxSize = 52428801; // 50Mb

            $scope.upload = function (files) {
                $scope.$emit('onUploadStarted');
                uploadFileService.upload(files, $scope);
            }
        }]
    };
}]);
;
angular.module('app').directive('tenderReasonTypes', function () {
    return {
        templateUrl: '/App/Main/base/directives/CancelTender/tenderReasonTypes.html',
        restrict: 'AE',
        scope: {
            detailes: '=',
            cancelTenderModel: '=',
            sortedCancellations: '='
        },
        controller: [
            '$scope',
            'tenderReasonTypeService',
            function ($scope, tenderReasonTypeService) {

                $scope.reasonTypes = tenderReasonTypeService.getReasonTypes($scope.detailes.isNewCancellationFlow2020, $scope.detailes.procurementMethodType);

                $scope.isShowReasonType = function () {
                    if ($scope.detailes.isNewCancellationFlow2020) {
                        return true;
                    }
                    return $scope.detailes && $scope.detailes.isAbove;
                };

                $scope.getReasonTypeNameById = function (id) {
                    var title = null;
                    if (id) {
                        angular.forEach($scope.reasonTypes, function (el) {
                            if (el.value == id) {
                                title = $scope.cancelTenderModel.reason = el.name;
                            }
                        });
                    }
                    return title;
                };

                if ($scope.reasonTypes && $scope.reasonTypes.length > 0 && $scope.isShowReasonType())
                    $scope.cancelTenderModel.reasonType = $scope.reasonTypes[0].value;
            }
        ]
    }
});
angular.module('app').directive('checkboxSimpleRationale', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/directives/CheckboxForSimpleRationale/CheckboxSimpleRationale.html',
        scope: {
            data: '=',
            isEditMode: '='
        },
        controller: [
            '$scope',
            '$location',
            function ($scope, $location) {
                if ($scope.data.isSimpleProcurementMethodRationale) {
                    $scope.data.procurementMethodRationale = 'simple';
                } else {
                    $scope.data.procurementMethodRationale = undefined;
                }

                if (!$scope.data.isSimpleProcurementMethodRationale && $location.url().contains('simple')) {
                    $scope.data.isSimpleProcurementMethodRationale = true;
                }
            }
        ]
    }
});;
angular.module('app')
    .directive('awardComplaint', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/complaint/complaint.html',
            scope: {
                currentComplaint: '=',
                tenderid: '=',
                reload: '&',
                allowedExtensions: '=',
                tenderStatus: '=',
                procurementMethodType: '=',
                tender: '='
            },
            controller: [
                '$scope',
                '$controller',
                'abp.services.etender.award',
                'abp.services.etender.awardComplaint',
                function (
                    $scope,
                    $controller,
                    award,
                    awardComplaintService
                ) {
                    angular.extend(this, $controller('complaintController', {
                        $scope: $scope
                    }));

                    $scope.ReturnToQualification = function () {
                        if (confirm("Для проведення повторної оцінки, будь - ласка підтвердіть дію:")) {
                            var cancelAwardInput = {
                                awardId: $scope.currentComplaint.awardId,
                                tenderId: $scope.tenderid,
                                description: "Провести повторну оцінку",
                                isReturnToQualification: true
                            };
                            var cancelAward = award.cancelAward(cancelAwardInput);
                            return cancelAward.then(function () {
                                $scope.$emit('reloadTender');
                            }).then(function () {
                                return angular.noop();
                            });
                        } 
                    };

                    $scope.setComplaintActiveStatus = function () {

                        var isAllDocumentsExported = true;
                        angular.forEach($scope.currentComplaint.documents, function (comp) {
                            if (comp.isExported === false && comp.isDeleted !== true) {
                                isAllDocumentsExported = false;
                            }
                        });
                        if (!isAllDocumentsExported) {
                            abp.notify.error("Дочекайтеся поки всі документи синхронізуються з ЦБД або удаліть їх!");
                            return angular.noop();
                        }

                        var complaintId = $scope.currentComplaint.id;

                        abp.ui.setBusy(".panel-default:first");
                        return awardComplaintService.setPendingStatus({ "Id": complaintId }).then(function () {
                            abp.notify.success("Ваша скарга переведена в активний статус!");
                            $scope.$emit('reloadTender');
                            abp.ui.clearBusy(".panel-default");
                        }, function () {
                            $scope.$emit('reloadTender');
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });;
                    };

                    $scope.setClaimActiveStatus = function () {

                        var isAllDocumentsExported = true;
                        angular.forEach($scope.currentComplaint.documents, function (comp) {
                            if (comp.isExported === false && comp.isDeleted !== true) {
                                isAllDocumentsExported = false;
                            }
                        });
                        if (!isAllDocumentsExported) {
                            abp.notify.error("Дочекайтеся поки всі документи синхронізуються з ЦБД або удаліть їх!");
                            return angular.noop();
                        }

                        var complaintId = $scope.currentComplaint.id;

                        abp.ui.setBusy(".panel-default:first");
                        return awardComplaintService.setClaimStatus({ "Id": complaintId }).then(function () {
                            abp.notify.success("Ваша вимога переведена в активний статус!");
                            $scope.$emit('reloadTender');

                            abp.ui.clearBusy(".panel-default");
                        }, function () {
                            $scope.$emit('reloadTender');
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });;
                    };

                    $scope.setMistakenStatus = function (currentComplaint) {
                        awardComplaintService.setMistakenStatus({ id: currentComplaint.id }).then(function () {
                            $scope.$emit('reloadTender');
                        }).catch(function () {
                            $scope.$emit('reloadTender');
                        });
                    };

                    $scope.satisfyClaim = function (isSatisfied) {
                        var complaintId = $scope.currentComplaint.id;
                        abp.ui.setBusy(".panel-default:first");
                        return awardComplaintService.setResolvedStatusClaim({ "Id": complaintId, "Satisfied": isSatisfied }).then(function () {
                            abp.notify.success("Ваша вимога переведена в статус " + (isSatisfied ? "задоволена!" : "не задоволена!"));
                            $scope.$emit('reloadTender');

                            abp.ui.clearBusy(".panel-default");
                        }, function () {
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });
                    };
                }
            ]
        };
    });;
angular.module('app')
    .directive('cancellationComplaint', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/complaint/complaint.html',
            scope: {
                currentComplaint: '=',
                tenderid: '=',
                reload: '&',
                allowedExtensions: '=',
                tenderStatus: '=',
                procurementMethodType: '=',
                tender: '='
            },
            controller: [
                '$scope',
                '$controller',
                'abp.services.etender.cancellationComplaint',
                function (
                    $scope,
                    $controller,
                    cancellationComplaintService
                ) {
                    angular.extend(this, $controller('complaintController', {
                        $scope: $scope
                    }));

                    $scope.setMistakenStatus = function (currentComplaint) {
                        cancellationComplaintService.setMistakenStatus({ id: currentComplaint.id }).then(function () {
                            $scope.$emit('reloadTender');
                        }).catch(function () {
                            $scope.$emit('reloadTender');
                        });
                    };

                }
            ]
        };
    });;
angular.module('app')
    .controller('complaintController',
        [
            '$scope',
            'abp.services.etender.tender',
            '$http',
            'complaintsService',
            'documentsService',
            '$localStorage',
            function (
                $scope,
                tender,
                $http,
                complaintsService,
                documentsService,
                $localStorage
            ) {

                $scope.ng_localStorage = $localStorage;
                $scope.files = null;
                $scope.filesCounter = 0;
                var toDay = moment(new Date());

                $scope.goToFormDozorro = function (formId, apiId) {
                    $scope.$emit('showDozorroForm', formId, apiId);
                }

                $scope.fileUploadObj = { tenderId: "", documentId: "" };
                $scope.uploadFilesCounter = 0;

                $scope.selectedDocType = null;

                $scope.previewDoc = function (document) {
                    $scope.$emit('previewDoc', document);
                }

                $scope.getStatusLabelClass = function (s) {
                    return complaintsService.getStatusLabelClass(s);
                };

                $scope.getTypeLabelClass = function (s) {
                    return complaintsService.getTypeLabelClass(s);

                };
                $scope.getTypeUkr = function (s) {
                    return complaintsService.getTypeUkr(s);
                };

                $scope.getComplaintStatusUkr = function (s, type, newFlow) {
                    return complaintsService.getComplaintStatusUkr(s, type, newFlow);
                };

                $scope.init = (function () {
                    $scope.documents2 = $scope.documents;
                })();

                $scope.getComplaintFor = function () {
                    return complaintsService.getComplaintFor($scope.currentComplaint);
                };

                $scope.getComplaintForType = function (complaint) {
                    return complaintsService.getComplaintForType(complaint)
                };

                $scope.showCancelComplaintModal = function (complaint) {
                    $scope.$root['complaintIdModal'] = complaint.id;
                    $scope.$root['complaintType'] = complaint.type;
                    $scope.$root['complaintFor'] = $scope.getComplaintForType(complaint);
                    var modalInstance2 = $('#cancelComplaint').modal('show');
                };

                $scope.showAnswerComplaintModal = function (complaint) {
                    $scope.$root['complaintIdModal'] = complaint.id;
                    $scope.$root['complaintFor'] = $scope.getComplaintForType(complaint);
                    var modalInstance2 = $('#answerComplaint').modal('show');
                };

                $scope.showSetStoppingComplaintModal = function () {
                    $scope.$root['complaintIdModal'] = $scope.currentComplaint.id;
                    $scope.$root['complaintFor'] = $scope.getComplaintForType($scope.currentComplaint);

                    var modalInstance2 = $('#setStoppingComplaint').modal('show');
                };

                $scope.checkSaveCurrentComplaint = function (complaint) {
                    if ($scope.tender.status === 'active.tendering') {
                        if ($scope.tender.procurementMethodType === "aboveThresholdUA" ||
                            $scope.tender.procurementMethodType === "aboveThresholdEU" ||
                            $scope.tender.procurementMethodType === "closeFrameworkAgreementUA" ||
                            $scope.tender.procurementMethodType === "competitiveDialogueEU" ||
                            $scope.tender.procurementMethodType === "competitiveDialogueEU.stage2" ||
                            $scope.tender.procurementMethodType === "competitiveDialogueUA" ||
                            $scope.tender.procurementMethodType === "competitiveDialogueUA.stage2" ||
                            $scope.tender.procurementMethodType === "esco") {
                            if (complaint.cancellationId) return false;
                            var now = moment();
                            var endDate = moment($scope.tender.tenderPeriod.endDate);
                            var diff = endDate.diff(now, 'days');
                            if (diff <= 6) {
                                return true;
                            }

                        } else if ($scope.tender.procurementMethodType === "aboveThresholdUA.defense" ||
                            $scope.tender.procurementMethodType === "simple.defense") {
                            if (complaint.cancellationId) return false;
                            var now = moment();
                            var endDate = moment($scope.tender.tenderPeriod.endDate);
                            var diff = endDate.diff(now, 'days');
                            if (diff <= 2) {
                                return true;
                            }
                        }
                    }
                    return false;
                }

                $scope.saveCurrentComplaint = function (complaint) {
                    if (complaint !== null && complaint !== 'undefined')
                        complaintsService.currentComplaint(complaint);
                }

                $scope.$on('openModal', function () {
                    $scope.modalConfermComplaint();
                });

                $scope.modalConfermComplaint = function (complaintObj) {
                    $('#modalConfermComplaint').modal('hide');
                    var complaint = complaintsService.currentComplaint();
                    $scope.$root['complaintIdModal'] = complaint.id;
                    $scope.$root['complaintFor'] = $scope.getComplaintForType(complaint);

                    var modalInstance2 = $('#tendererActionComplaint').modal('show');
                };

                $scope.howManyDaysLeftFromNow = function (firstDate) {

                    if (!firstDate) return 1;

                    firstDate = jsonStringToDate(firstDate);
                    var isValid = false;
                    var lastDate = new Date();
                    var daysDelta = 24 * 60 * 60 * 1000;
                    return (lastDate - firstDate) / daysDelta;
                };

                function jsonStringToDate(string) {
                    function toInt(str) {
                        return parseInt(str, 10);
                    }
                    var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
                    // 1        2       3         4          5          6          7          8  9     10      11
                    var match;
                    if (match = string.match(R_ISO8601_STR)) {
                        var date = new Date(0),
                            tzHour = 0,
                            tzMin = 0,
                            dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
                            timeSetter = match[8] ? date.setUTCHours : date.setHours;

                        if (match[9]) {
                            tzHour = toInt(match[9] + match[10]);
                            tzMin = toInt(match[9] + match[11]);
                        }
                        dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));
                        var h = toInt(match[4] || 0) - tzHour;
                        var m = toInt(match[5] || 0) - tzMin;
                        var s = toInt(match[6] || 0);
                        var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
                        timeSetter.call(date, h, m, s, ms);
                        return date;
                    }
                    return string;
                }

                $scope.dowloadZip = function (docs) {
                    abp.ui.setBusy('.hidden-print dowloadZipBtn');
                    var zipFilename = 'Документи Вимоги/Скарги';
                    documentsService.downloadZipFile(docs, zipFilename, $scope);
                    var listener = $scope.$on('clearBusy',
                        function () {
                            abp.ui.clearBusy('.hidden-print dowloadZipBtn');
                            listener();
                        });
                }

                $scope.addDocumentUploaded = function () {
                    $("#modalDocNotificationThreshold").modal('show');
                };
                $scope.changeDoc = function (document) {
                    $scope.fileUploadObj.documentId = document.id;
                    //$scope.fileUploadObj.awardId = $scope.currentComplaint.award && $scope.currentComplaint.award.id;
                    _($scope.documents).each(function (doc) {
                        doc.ch = false;
                    });
                    document.ch = true;
                };

                $scope.clearDoc = function () {
                    $scope.fileUploadObj.documentId = '';
                };

                var deleteDocument = function (input) {
                    if (confirm("Ви дійсно бажаєте видалити документ?")) {
                        var removeDocument = $http.post('.' + abp.appPath + 'api/files/DeleteDocument', input);
                        removeDocument.then(function (data) {
                            $scope.$emit('reloadTender');
                        });
                    }
                };
                $scope.removeComplaintDocument = function (documentId) {
                    var input = { 'ComplaintDocumentId': documentId };
                    deleteDocument(input);
                };

                $scope.isAllDocumentsExported = function (documents) {
                    if (!documents)
                        return true;
                    var isAllDocumentsExported = true;
                    isAllDocumentsExported = !documents.some(function (doc) {
                        return doc && !doc.isDeleted && !doc.dateModified;
                    });
                    return isAllDocumentsExported;
                };

                $scope.canAnswerComplaint = function (tender, dateSubmitted) {
                    if (tender.status === 'active.qualification' ||
                        tender.status === 'active.awarded' ||
                        tender.status === 'active.pre-qualification.stand-still') {
                        return true; //ET-16249 showAnswedComplaint(dateSubmitted);
                    } else {
                        return checkDatesAndStatuse(tender);
                    }
                }

                function showAnswedComplaint(dateSubmitted) {
                    var dateSubm = moment(dateSubmitted);
                    var duration = moment.duration(toDay.diff(dateSubm));
                    var days = duration.asDays();
                    var minuts = duration.asMinutes();

                    var diff;
                    // Если прод и реальный тендер то 5 дней
                    // Если QA и реальный режим то 5 дней
                    // в остальных 5 минут
                    if ($localStorage.isProductionSite && !tender.mode ||
                        !$localStorage.isProductionSite && $localStorage.isProdMode) {
                        // days diff
                        diff = days;
                    } else {
                        // minuts diff
                        diff = minuts;
                    }

                    if (diff > 5) return false;
                    return true;
                }


                function checkDatesAndStatuse(tender) {
                    if (moment(tender.clarificationsUntil).isAfter(toDay) &&
                        tender.status === 'active.tendering') {
                        return true;
                    }
                    return false;
                }
            }
        ]);
angular.module('app').directive('complaintPost', function () {
    return {
        templateUrl: '/App/Main/base/directives/complaint/complaintPost.html',
        restrict: 'E',
        scope: {
            complaintPost: '=',
            complaintPosts: '=',
            currentComplaint: '=',
            tender: '='
        },
        controller: [
            '$scope',
            '$timeout',
            function ($scope, $timeout) {
                $scope.answer = $scope.complaintPosts.find(function (post) {
                    return post.relatedPostId != null && post.relatedPostId === $scope.complaintPost.id;
                });
                var sortDate = function (a, b) {
                    return new Date(a.datePublished) - new Date(b.datePublished);
                };
                function sortDocuments() {
                    $scope.complaintPost && $scope.complaintPost.documents.sort(sortDate);
                    $scope.answer && $scope.answer.documents.sort(sortDate);
                }
                sortDocuments();

                $scope.getComplaintPostRecipientName = function (recipient) {
                    switch (recipient) {
                        case 'aboveThresholdReviewers': return 'АМКУ'; break;
                        case 'complaint_owner': return 'Скаржник'; break;
                        case 'tender_owner': return 'Замовник'; break;
                        default: return ''; break;
                    }
                };
                $scope.addComplaintPostAnswerDocumentsCount = 0;

                $scope.addComplaintPostAnswerDocuments = function () {
                    var params = {
                        complaintPostId: $scope.answer.id
                    };
                    $scope.addComplaintPostAnswerDocumentsFields = { params: params };
                };

                $scope.addComplaintPostAnswerDocumentsUploaded = function () {
                    $timeout(function () {
                        $scope.complaintPostAnswerDocuments.forEach(function (file) {
                            $scope.answer.documents.push({
                                title: file.name,
                                isExported: false
                            });
                        });
                        $scope.addComplaintPostAnswerDocumentsCount = 0;
                        sortDocuments();
                    });
                };
            }
        ]
    }
});;
angular.module('app').directive('complaintsTender', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/complaint/complaintsTender.html',
        scope: {
            tenderid: '=',
            reload: '&',
            allowedExtensions: '=',
            tenderStatus: '=',
            passedComplaints: '=',
            procurementMethodType: '=',
            tender: '='
        },
        controller: ['$scope', 'complaintsService',
            function ($scope, complaintsService) {
                
                $scope.getStatusLabelClass = function (s) {
                    return complaintsService.getStatusLabelClass(s);
                };

                $scope.getTypeLabelClass = function (s) {
                    return complaintsService.getTypeLabelClass(s);

                };
                $scope.getTypeUkr = function (s) {
                    return complaintsService.getTypeUkr(s);
                };

                $scope.getComplaintStatusUkr = function (s, type, newFlow) {
                    return complaintsService.getComplaintStatusUkr(s, type, newFlow);
                };

                $scope.modalConfermComplaint = function () {
                    $scope.$broadcast('openModal');
                }

                $scope.getComplaintTypeFor = function (complaint) {
                    return complaintsService.getComplaintForType(complaint);
                }

                var previous;
                var showComplaintId;
                $scope.showComplaint = function(complaint) {
                    for (var i = 0; i < complaint.length - 1; i += 1) {
                        if (complaint[i].status === "draft") {
                            if (!previous) {
                                previous = complaint[i];
                                showComplaintId = complaint[i].id;
                            }
                            else {
                                if (moment(previous.date) < moment(complaint[i].date)) {
                                    previous = complaint[i];
                                    showComplaintId = complaint[i].id;
                                }
                            }
                        }
                    }
                    if (complaint.length === 1 && complaint[0].status === "draft") {
                        showComplaintId = complaint[0].id;
                    }
                    return showComplaintId;
                }

            }]
    };
});;
angular.module('app').directive('createComplaintPost', function () {
    return {
        templateUrl: '/App/Main/base/directives/complaint/createComplaintPost.html',
        scope: {
            complaintPost: '='
        },
        controller: [
            '$scope',
            'abp.services.etender.complaintPost',
            function ($scope, complaintPost) {
                $scope.vm = { showCreateComplaintPostForm: false };
                $scope.createComplaintPostModel = {};
                $scope.createComplaintPost = function (complaintPostId) {
                    abp.ui.setBusy(".panel-default:first");
                    $scope.createComplaintPostModel.relatedPost = complaintPostId;
                    complaintPost.createComplaintPost($scope.createComplaintPostModel)
                        .then(function () {
                            abp.notify.success('Відповідь на запит опубліковано');
                            clear();
                        })
                        .catch(function () {
                            clear();
                        });
                    function clear() {
                        $scope.createComplaintPostModel = {};
                        $scope.vm.showCreateComplaintPostForm = false;
                        abp.ui.clearBusy(".panel-default");
                        $scope.$emit('reloadTender');
                    }
                };
                $scope.createComplaintPostDisabled = function () {
                    var cpm = $scope.createComplaintPostModel;
                    if (cpm.title && cpm.title.length && cpm.description && cpm.description.length) {
                        return false;
                    } 
                    return true;
                };
            }
        ]
    }
});;
angular.module('app')
    .directive('qualificationComplaint', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/complaint/complaint.html',
            scope: {
                currentComplaint: '=',
                tenderid: '=',
                reload: '&',
                allowedExtensions: '=',
                tenderStatus: '=',
                procurementMethodType: '=',
                tender: '='
            },
            controller: [
                '$scope',
                '$controller',
                'abp.services.etender.qualification',
                'abp.services.etender.qualificationComplaint',
                function (
                    $scope,
                    $controller,
                    qualificationService,
                    qualificationComplaintService
                ) {
                    angular.extend(this, $controller('complaintController', {
                        $scope: $scope
                    }));

                    $scope.ReturnToQualification = function () {
                        return qualificationService.cancelled($scope.currentComplaint.qualificationId)
                            .then(function () {
                                abp.notify.success("Успішно відправлено на перекваліфікацію!");
                                $scope.$emit('reloadTender');
                            }).then(function () {
                                return angular.noop();
                            });
                        return angular.noop();
                    };

                    $scope.setComplaintActiveStatus = function () {

                        var isAllDocumentsExported = true;
                        angular.forEach($scope.currentComplaint.documents, function (comp) {
                            if (comp.isExported === false && comp.isDeleted !== true) {
                                isAllDocumentsExported = false;
                            }
                        });
                        if (!isAllDocumentsExported) {
                            abp.notify.error("Дочекайтеся поки всі документи синхронізуються з ЦБД або удаліть їх!");
                            return angular.noop();
                        }

                        var complaintId = $scope.currentComplaint.id;

                        abp.ui.setBusy(".panel-default:first");
                        return qualificationComplaintService.setPendingStatus({ "Id": complaintId }).then(function () {
                            abp.notify.success("Ваша скарга переведена в активний статус!");
                            $scope.$emit('reloadTender');
                            abp.ui.clearBusy(".panel-default");
                        }, function () {
                            $scope.$emit('reloadTender');
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });;
                    };

                    $scope.setClaimActiveStatus = function () {

                        var isAllDocumentsExported = true;
                        angular.forEach($scope.currentComplaint.documents, function (comp) {
                            if (comp.isExported === false && comp.isDeleted !== true) {
                                isAllDocumentsExported = false;
                            }
                        });
                        if (!isAllDocumentsExported) {
                            abp.notify.error("Дочекайтеся поки всі документи синхронізуються з ЦБД або удаліть їх!");
                            return angular.noop();
                        }

                        var complaintId = $scope.currentComplaint.id;

                        abp.ui.setBusy(".panel-default:first");
                        return qualificationComplaintService.setClaimStatus({ "Id": complaintId }).then(function () {
                            abp.notify.success("Ваша вимога переведена в активний статус!");
                            $scope.$emit('reloadTender');

                            abp.ui.clearBusy(".panel-default");
                        }, function () {
                            $scope.$emit('reloadTender');
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });;
                    };

                    $scope.setMistakenStatus = function (currentComplaint) {
                        qualificationComplaintService.setMistakenStatus({ id: currentComplaint.id }).then(function () {
                            $scope.$emit('reloadTender');
                        }).catch(function () {
                            $scope.$emit('reloadTender');
                        });
                    };

                    $scope.satisfyClaim = function (isSatisfied) {
                        var complaintId = $scope.currentComplaint.id;
                        abp.ui.setBusy(".panel-default:first");
                        return qualificationComplaintService.setResolvedStatusClaim({ "Id": complaintId, "Satisfied": isSatisfied }).then(function () {
                            abp.notify.success("Ваша вимога переведена в статус " + (isSatisfied ? "задоволена!" : "не задоволена!"));
                            $scope.$emit('reloadTender');

                            abp.ui.clearBusy(".panel-default");
                        }, function () {
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });
                    };
                }
            ]
        };
    });;
angular.module('app')
    .directive('tenderComplaint', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/complaint/complaint.html',
        scope: {
            currentComplaint: '=',
            tenderid: '=',
            reload: '&',
            allowedExtensions: '=',
            tenderStatus: '=',
            procurementMethodType: '=',
            tender: '='
        },
        controller: [
            '$scope',
            '$controller',
            'abp.services.etender.tenderComplaint',
            function (
                $scope,
                $controller,
                tenderComplaintService
            ) {
                angular.extend(this, $controller('complaintController', {
                    $scope: $scope
                }));

                $scope.setComplaintActiveStatus = function () {

                    var isAllDocumentsExported = true;
                    angular.forEach($scope.currentComplaint.documents, function (comp) {
                        if (comp.isExported === false && comp.isDeleted !== true) {
                            isAllDocumentsExported = false;
                        }
                    });
                    if (!isAllDocumentsExported) {
                        abp.notify.error("Дочекайтеся поки всі документи синхронізуються з ЦБД або удаліть їх!");
                        return angular.noop();
                    }

                    var complaintId = $scope.currentComplaint.id;

                    abp.ui.setBusy(".panel-default:first");
                    return tenderComplaintService.setPendingStatus({ "Id": complaintId }).then(function () {
                        abp.notify.success("Ваша скарга переведена в активний статус!");
                        $scope.$emit('reloadTender');
                        abp.ui.clearBusy(".panel-default");
                    }, function () {
                        $scope.$emit('reloadTender');
                        abp.ui.clearBusy(".panel-default");
                    }).then(function () {
                        return angular.noop();
                    });;
                };

                $scope.setClaimActiveStatus = function () {

                    var isAllDocumentsExported = true;
                    angular.forEach($scope.currentComplaint.documents, function (comp) {
                        if (comp.isExported === false && comp.isDeleted !== true) {
                            isAllDocumentsExported = false;
                        }
                    });
                    if (!isAllDocumentsExported) {
                        abp.notify.error("Дочекайтеся поки всі документи синхронізуються з ЦБД або удаліть їх!");
                        return angular.noop();
                    }

                    var complaintId = $scope.currentComplaint.id;

                    abp.ui.setBusy(".panel-default:first");
                    return tenderComplaintService.setClaimStatus({ "Id": complaintId }).then(function () {
                        abp.notify.success("Ваша вимога переведена в активний статус!");
                        $scope.$emit('reloadTender');

                        abp.ui.clearBusy(".panel-default");
                    }, function () {
                        $scope.$emit('reloadTender');
                        abp.ui.clearBusy(".panel-default");
                    }).then(function () {
                        return angular.noop();
                    });;
                };

                $scope.setMistakenStatus = function (currentComplaint) {
                    tenderComplaintService.setMistakenStatus({ id: currentComplaint.id }).then(function () {
                        $scope.$emit('reloadTender');
                    }).catch(function () {
                        $scope.$emit('reloadTender');
                    });
                };

                $scope.satisfyClaim = function (isSatisfied) {
                    var complaintId = $scope.currentComplaint.id;
                    abp.ui.setBusy(".panel-default:first");
                    return tenderComplaintService.setResolvedStatusClaim({ "Id": complaintId, "Satisfied": isSatisfied }).then(function () {
                        abp.notify.success("Ваша вимога переведена в статус " + (isSatisfied ? "задоволена!" : "не задоволена!"));
                        $scope.$emit('reloadTender');

                        abp.ui.clearBusy(".panel-default");
                    }, function () {
                        abp.ui.clearBusy(".panel-default");
                    }).then(function () {
                        return angular.noop();
                    });
                };
            }
        ]
    };
});;
angular.module('app').directive('payByCardComplaint', [
    'abp.services.etender.complaintPayment',
    function (complaintPayment) {
        return {
            templateUrl: '/App/Main/base/directives/ComplaintPay/payByCardComplaint.html',
            restrict: 'AE',
            scope: {
                currentComplaint: '='
            },
            controller: [
                '$scope',
                '$window',
                function ($scope, $window) {

                    $scope.isDisabled = false;
                    $scope.id = ~~(Math.random() * 1000);

                    $scope.openPayByCardModal = function () {
                        $('#liqPay-' + $scope.id).modal('toggle');
                    }

                    $scope.payByCard = function (complaint) {
                        if (complaint !== null && complaint !== 'undefined') {
                            abp.ui.setBusy('.modal-dialog');
                            $scope.isDisabled = true;
                            complaintPayment.payByCard($scope.currentComplaint.id).then(
                                function (response) {
                                    $window.open(response.data.url_checkout, '_blank');
                                    abp.ui.clearBusy('.modal-dialog');
                                    $scope.isDisabled = false;
                                },
                                function () {
                                    console.log("Error");
                                    abp.ui.clearBusy('.modal-dialog');
                                    $scope.isDisabled = false;
                                }
                            );
                        }
                    };
                }
            ]
        }
    }
]);
angular.module('app')
    .directive('addBidCriterias', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/criterias/addBidCriterias.html',
            scope: {
                tender: '=',
                criterias: '=',
                filteredDocuments: '=',
                lotId: '=',
                requirementResponse: '=',
                canCloseCriterias: '=',
                isAward: '=',
                lotApiId: '=',
                skipDocumentsCheck: '=',
                validateOnlyViewCriterias: '=',
                lot: '=',
                bid: '=',
                isQualification: '=',
                canUploadDocs: '='
            },
            controller: [
                '$scope',
                '$rootScope',
                'tenderCriteriasService',
                function (
                    $scope,
                    $rootScope,
                    tenderCriteriasService
                ) {
                    $scope.selectedTenderCriteriaRequirementGroups = {};
                    $scope.selectedTenderCriteriaRequirements = {};
                    $scope.choosedTenderCriteriaRequirementValues = {};
                    $scope.requirementEvidenceLengths = {};
                    $scope.requirementEvidences = {};
                    $scope.requirementEvidenceDocs = {};
                    $scope.showDetailes = {};
                    $scope.isErrorInCriteria = false;
                    $scope.criteriasFromResponse = [];

                    var proceduresToShowDisqualifyCriteriasInPreQualification = (
                        $scope.tender.procurementMethodType == 'aboveThresholdEU' ||
                        $scope.tender.procurementMethodType == 'competitiveDialogueUA' ||
                        $scope.tender.procurementMethodType == 'competitiveDialogueEU' ||
                        $scope.tender.procurementMethodType == 'competitiveDialogueEU.stage2' ||
                        $scope.tender.procurementMethodType == 'esco' ||
                        $scope.tender.procurementMethodType == 'closeFrameworkAgreementUA'
                    );

                    $scope.groupedCriterias = {
                        main: [],
                        otherLanguage: []
                    };

                    $scope.criteriaTypes = {
                        main: $rootScope.source('ReasonToRefuse'),
                        otherLanguage: $rootScope.source('Others')
                    };

                    $scope.localizationDetailesDictionary = {
                        'tender': $rootScope.source('Tenders'),
                        'lot': $rootScope.source('forLot'),
                        'item': $rootScope.source('forItem'),
                        'tenderer': $rootScope.source('forTenderer'),
                        'buyer': $rootScope.source('forBuyer'),
                        'procuringEntity': $rootScope.source('forBuyer'),
                        'winner': $rootScope.source('ForWinner')
                    };

                    $scope.closeCriterias = function () {
                        $scope.$emit('onCriteriaClosed', $scope.lotId);
                    };

                    $scope.onSelectedTenderCriteriaRequirementGroupChange = function (singleCriteria, criteriaGroup, isLiveChange, singleRequirementValue) {
                        $scope.selectedTenderCriteriaRequirements[$scope.lotId][singleCriteria.id] = criteriaGroup.requirements;
                        singleCriteria.requirementGroups.forEach(function (defaultGroup) {
                            if ($scope.choosedTenderCriteriaRequirementValues[defaultGroup.requirements[0].id]) {
                                delete $scope.choosedTenderCriteriaRequirementValues[defaultGroup.requirements[0].id];
                            }
                        });
                        if (criteriaGroup.requirements[0].dataType === 'boolean') {
                            $scope.choosedTenderCriteriaRequirementValues[criteriaGroup.requirements[0].id] = true;
                        } else {
                            if (singleRequirementValue != null) {
                                $scope.choosedTenderCriteriaRequirementValues[criteriaGroup.requirements[0].id] = singleRequirementValue;
                            }
                        }
                        $scope.isFormValid(isLiveChange);
                    };

                    $scope.addEvidencesToRequirement = function () {
                        $scope.criterias.forEach(function (criteria) {
                            criteria.requirementGroups.forEach(function (group) {
                                group.requirements.forEach(function (requirement) {
                                    $scope.requirementEvidences[$scope.lotId][requirement.id] = [];
                                    requirement.eligibleEvidences.forEach(function (evidence) {
                                        $scope.requirementEvidences[$scope.lotId][requirement.id].push({
                                            id: null,
                                            title: null,
                                            description: null,
                                            relatedDocumentId: null,
                                            type: evidence.type,
                                            isRequired: true
                                        });
                                    });
                                });
                            });
                        });
                    };

                    $scope.onSingleCriteriaChange = function () {
                        $scope.isFormValid(true);
                    };

                    $scope.setlotIdToGroups = function () {
                        $scope.selectedTenderCriteriaRequirementGroups[$scope.lotId] = {};
                        $scope.selectedTenderCriteriaRequirements[$scope.lotId] = {};
                        $scope.requirementEvidences[$scope.lotId] = {};
                        $scope.requirementEvidenceDocs[$scope.lotId] = {};
                    };

                    $scope.isFormValid = function (isLiveChange) {
                        var isValid = true;
                        $scope.isErrorInCriteria = false;
                        if ($scope.validateOnlyViewCriterias) {
                            $scope.groupedCriterias.main.forEach(function (singleCriteria) {
                                if (!$scope.isSingleCriteriaValid(singleCriteria)) {
                                    isValid = false;
                                }
                            });
                            $scope.groupedCriterias.otherLanguage.forEach(function (singleCriteria) {
                                if (!$scope.isSingleCriteriaValid(singleCriteria)) {
                                    isValid = false;
                                }
                            });
                        } else {
                            $scope.criterias.forEach(function (singleCriteria) {
                                if (!$scope.isSingleCriteriaValid(singleCriteria)) {
                                    isValid = false;
                                }
                            });
                        }
                        $scope.$emit('onTenderCriteriaChanged', isValid, $scope.isErrorInCriteria, $scope.generateRequirementResponse(), isLiveChange);
                    };

                    $scope.isSingleCriteriaValid = function (singleCriteria) {
                        var isValid = true;
                        if (singleCriteria.relatesTo === 'lot' && singleCriteria.relatedItem !== $scope.lotApiId) {
                            return isValid
                        } else {
                            if ($scope.selectedTenderCriteriaRequirementGroups[$scope.lotId][singleCriteria.id]) {
                                var selectedGroup = $scope.getSelectedGroup(singleCriteria);
                                
                                if (selectedGroup.requirements && selectedGroup.requirements.length) {
                                    selectedGroup.requirements.forEach(function (requirement, index) {
                                        if (index !== 0) {
                                            if (requirement.dataType === 'boolean') {
                                                if (requirement.expectedValue) {
                                                    if (!$scope.choosedTenderCriteriaRequirementValues[requirement.id]) {
                                                        isValid = false;
                                                        $scope.isErrorInCriteria = true;
                                                    }
                                                }
                                            } else if ($scope.isNumberOrIntegerTypeRequirement(requirement)) {
                                                if (!$scope.choosedTenderCriteriaRequirementValues[requirement.id] ||
                                                    !Number($scope.choosedTenderCriteriaRequirementValues[requirement.id]) ||
                                                    (requirement.minValue && $scope.choosedTenderCriteriaRequirementValues[requirement.id] < requirement.minValue) ||
                                                    (requirement.maxValue && $scope.choosedTenderCriteriaRequirementValues[requirement.id] > requirement.maxValue) ||
                                                    $scope.choosedTenderCriteriaRequirementValues[requirement.id] === 0) {
                                                    isValid = false;
                                                    $scope.isErrorInCriteria = true;
                                                }
                                            } else {
                                                if (!$scope.choosedTenderCriteriaRequirementValues[requirement.id]) {
                                                    isValid = false;
                                                    $scope.isErrorInCriteria = true;
                                                }
                                            }
                                        } else {
                                            if (requirement.dataType !== 'boolean') {
                                                if (!$scope.choosedTenderCriteriaRequirementValues[requirement.id] && 
                                                        $scope.choosedTenderCriteriaRequirementValues[requirement.id] !== 0) {
                                                    isValid = false;
                                                    $scope.isErrorInCriteria = true;
                                                }
                                            }
                                        }
                                        if (singleCriteria.classification.apiId !==  'CRITERION.OTHER.CONTRACT.GUARANTEE') {
                                            $scope.requirementEvidences[$scope.lotId][requirement.id].forEach(function (singleEvidence) {
                                                if (singleEvidence.type === 'statement' && !singleEvidence.title) {
                                                    isValid = false;
                                                    $scope.isErrorInCriteria = true;
                                                } else if (singleEvidence.type === 'document' &&
                                                    (!singleEvidence.relatedDocumentId || !$scope.checkIfEvidenceDocExist(singleEvidence.relatedDocumentId))) {
                                                    isValid = false;
                                                    $scope.isErrorInCriteria = true;
                                                }
                                            });
                                        }
                                    });
                                }
                            } else {
                                if ($scope.checkIfCriteriaHasRequirements(singleCriteria) && !$scope.checkIfCriteriaIsCancelled(singleCriteria)) {
                                    isValid = false;
                                }
                            }
                        }

                        return isValid;
                    };

                    $scope.$on('reloadTenderAfterDocUpload', function (evt, docs) {
                        $scope.filteredDocuments = docs;
                        $scope.isFormValid(true);
                    })

                    $scope.isNumberOrIntegerTypeRequirement = function (requirement) {
                        return requirement.dataType === 'number' || requirement.dataType === 'integer';
                    };

                    $scope.getSelectedGroup = function (singleCriteria) {
                        return singleCriteria.requirementGroups.find(function (criteriaGroup) {
                            return criteriaGroup.requirements[0] &&
                                $scope.selectedTenderCriteriaRequirementGroups[$scope.lotId][singleCriteria.id] === criteriaGroup.requirements[0].title;
                        });
                    };

                    $scope.$on('onEvidenceChanged', $scope.isFormValid);

                    $scope.generateRequirementResponse = function () {
                        var responseRequirements = [];
                        $scope.criterias.forEach(function (criteriaGroup) {
                            var selectedGroup = $scope.getSelectedGroup(criteriaGroup);
                            if (selectedGroup && selectedGroup.requirements && selectedGroup.requirements.length) {
                                selectedGroup.requirements.forEach(function (requirement) {
                                    var requirementResponse = {
                                        requirementId: requirement.id,
                                        title: null,
                                        description: requirement.description,
                                        period: requirement.extendPeriod,
                                        evidences: $scope.requirementEvidences[$scope.lotId][requirement.id],
                                        value: $scope.choosedTenderCriteriaRequirementValues[requirement.id]
                                    };
                                    if ($scope.criteriasFromResponse && $scope.criteriasFromResponse.length) {
                                        var responseCriteria = $scope.criteriasFromResponse.find(function (criteriaResponse) {
                                            return criteriaResponse && criteriaResponse.requirement && requirement &&
                                                criteriaResponse.requirement.id === requirement.id;
                                        });

                                        if (responseCriteria) {
                                            requirementResponse.apiId = responseCriteria.response.apiId;
                                        }
                                    }
                                    if (requirementResponse.evidences && requirementResponse.evidences.length) {
                                        requirementResponse.evidences.forEach(function (evidence) {
                                            if (evidence.type === 'statement') {
                                                evidence.relatedDocumentId = null;
                                            }
                                        });
                                    }
                                    if (criteriaGroup.classification.apiId === 'CRITERION.OTHER.CONTRACT.GUARANTEE') {
                                        requirementResponse.evidences = [];
                                    }
                                    
                                    responseRequirements.push(requirementResponse);
                                });
                            }
                        });
                        return responseRequirements;
                    };

                    $scope.setCriteriasFromRequirementResponse = function () {
                        if ($scope.requirementResponse && $scope.requirementResponse.length) {
                            $scope.requirementResponse.forEach(function (response) {
                                var criteriaFromResponse = $scope.findCriteriaByRequirementId(response.requirementId);
                                criteriaFromResponse.response = response;
                                $scope.criteriasFromResponse.push(criteriaFromResponse); 
                            });

                            $scope.criteriasFromResponse.sort(function (a, b) {
                                return (a.isFirst === b.isFirst) ? 0 : a.isFirst ? -1 : 1;
                            });

                            $scope.fillCriterias();
                        }
                    };

                    $scope.setDisqualifyCriterias = function () {
                        $scope.disqualifyCriterias = tenderCriteriasService.getDisqualifyCriterias($scope.criterias);
                    };

                    $scope.fillCriterias = function () {
                        $scope.criteriasFromResponse.forEach(function (criteriaResponse) {
                            if (criteriaResponse.requirement) {
                                if (criteriaResponse.isFirst) {
                                    $scope.selectedTenderCriteriaRequirementGroups[$scope.lotId][criteriaResponse.singleCriteria.id] = criteriaResponse.requirement.title;
                                    var criteriaResponseValue = criteriaResponse.response.value;
                                    if (criteriaResponse.requirement.dataType === 'number') {
                                        criteriaResponseValue = Number(criteriaResponseValue);
                                    }
                                    $scope.onSelectedTenderCriteriaRequirementGroupChange(criteriaResponse.singleCriteria, criteriaResponse.criteriaGroup, false, criteriaResponseValue);
                                } else {
                                    if (criteriaResponse.requirement.dataType === 'boolean') {
                                        $scope.choosedTenderCriteriaRequirementValues[criteriaResponse.requirement.id] = criteriaResponse.response.value === 'true' ? true : false;
                                    } else if ($scope.isNumberOrIntegerTypeRequirement(criteriaResponse.requirement)) {
                                        $scope.choosedTenderCriteriaRequirementValues[criteriaResponse.requirement.id] = Number(criteriaResponse.response.value);
                                    } else {
                                        $scope.choosedTenderCriteriaRequirementValues[criteriaResponse.requirement.id] = criteriaResponse.response.value;
                                    }
                                }

                                var eligibleEvidenceTypesLength = {
                                    document: 0,
                                    statement: 0
                                };

                                eligibleEvidenceTypesLength.document = criteriaResponse.requirement.eligibleEvidences.filter(function (evidence) { return evidence.type === 'document'; }).length;
                                eligibleEvidenceTypesLength.statement = criteriaResponse.requirement.eligibleEvidences.filter(function (evidence) { return evidence.type === 'statement'; }).length;

                                criteriaResponse.response.evidences.forEach(function (evidence) {
                                    var generatedEvidence = {
                                        description: evidence.description,
                                        title: evidence.title,
                                        type: evidence.type,
                                        id: evidence.id,
                                        apiId: evidence.apiId,
                                    };

                                    if (evidence.type === 'document') {
                                        var evidenceDocument = $scope.filteredDocuments.find(function (document) {
                                            return document.id === evidence.relatedDocumentId;
                                        });
                                        $scope.requirementEvidenceDocs[$scope.lotId][evidence.id] = evidenceDocument;
                                        generatedEvidence.relatedDocumentId = evidence.relatedDocumentId;
                                    }

                                    if (eligibleEvidenceTypesLength[evidence.type] !== 0) {
                                        generatedEvidence.isRequired = true;
                                        eligibleEvidenceTypesLength[evidence.type]--;

                                        var indexToRemove = $scope.requirementEvidences[$scope.lotId][criteriaResponse.requirement.id].findIndex(function (evidenceToRemove) {
                                            return evidenceToRemove.type === evidence.type && evidenceToRemove.isRequired && !evidenceToRemove.id;
                                        });

                                        $scope.requirementEvidences[$scope.lotId][criteriaResponse.requirement.id].splice(indexToRemove, 1);
                                    } else {
                                        generatedEvidence.isRequired = false;
                                    }

                                    $scope.requirementEvidences[$scope.lotId][criteriaResponse.requirement.id].push(generatedEvidence);
                                });
                            }
                        });

                        $scope.isFormValid(false);
                    };

                    $scope.findCriteriaByRequirementId = function (requirementId) {
                        var choosedCriteria = {
                            singleCriteria: null,
                            criteriaGroup: null,
                            requirement: null,
                            isFirst: false
                        };

                        $scope.criterias.forEach(function (criteria) {
                            criteria.requirementGroups.forEach(function (group) {
                                group.requirements.forEach(function (requirement, index) {
                                    if (requirement.id === requirementId.toString()) {
                                        choosedCriteria.singleCriteria = criteria;
                                        choosedCriteria.criteriaGroup = group;
                                        choosedCriteria.requirement = requirement;
                                        choosedCriteria.isFirst = index === 0;
                                    }
                                });
                            });
                        });

                        return choosedCriteria;
                    };

                    $scope.checkIfCriteriaIsCancelled = function (criteria) {
                        var hasActiveRequirements = false;
                        criteria.requirementGroups.forEach(function (group) {
                            var activeRequirements = group.requirements.filter(function (requirement) {
                                return requirement.requirementStatus !== 'cancelled';
                            })
                            if (activeRequirements && activeRequirements.length) {
                                hasActiveRequirements = true
                            }
                        });

                        return !hasActiveRequirements;
                    }

                    var apiIdsToExclude = [
                        'CRITERION.OTHER.BID.LANGUAGE',
                        'CRITERION.OTHER.BID.GUARANTEE',
                        'CRITERION.OTHER.CONTRACT.GUARANTEE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                    ];

                    $scope.hasLccCriteria = function (criteriaApiId) {
                        var lccCriteriaApiIds = [
                            'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                            'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                            'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                            'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                        ];
                        
                        return lccCriteriaApiIds.indexOf(criteriaApiId) !== -1;
                    }

                    $scope.groupCriterias = function () {
                        var whichCriteriaArrayToUse = ($scope.tender.status == 'active.pre-qualification' && proceduresToShowDisqualifyCriteriasInPreQualification) ? 
                            $scope.disqualifyCriterias : $scope.criterias;
                            whichCriteriaArrayToUse.forEach(function (singleCriteria) {
                                if (apiIdsToExclude.indexOf(singleCriteria.classification.apiId) === -1) {
                                    $scope.filterCancelledCriteriaRequirements(singleCriteria);
                                    if ($scope.checkIfCriteriaHasRequirements(singleCriteria)) {
                                        $scope.groupedCriterias.main.push(singleCriteria);
                                    }
                                } else {
                                    if (singleCriteria.relatesTo === 'lot') {
                                        if (singleCriteria.relatedItem === $scope.lotApiId) {
                                            $scope.filterCancelledCriteriaRequirements(singleCriteria);
                                            if ($scope.checkIfCriteriaHasRequirements(singleCriteria)) {
                                                $scope.groupedCriterias.otherLanguage.push(singleCriteria);
                                            }
                                        }
                                    } else {
                                        $scope.filterCancelledCriteriaRequirements(singleCriteria);
                                        if ($scope.checkIfCriteriaHasRequirements(singleCriteria)) {
                                            $scope.groupedCriterias.otherLanguage.push(singleCriteria);
                                        }
                                    }
                                }
                        });
                    };

                    $scope.filterCancelledCriteriaRequirements = function (criteria) {
                        criteria.requirementGroups.forEach(function (group) {
                            group.requirements.forEach(function (requirement, index) {
                                if (requirement.requirementStatus === 'cancelled') {
                                    group.requirements[index] = null;
                                }
                            });
                            group.requirements = group.requirements.filter(function (requirement) {
                                return requirement != null;
                            });
                        });
                    };

                    $scope.checkIfCriteriaHasRequirements = function (criteria) {
                        var hasRequirements = false;
                        criteria.requirementGroups.forEach(function (group) {
                            if (group.requirements && group.requirements.length) {
                                hasRequirements = true
                            }
                        });

                        return hasRequirements;
                    };

                    $scope.getLocalizationTextFromDictionary = function (type, dictionary) {
                        if (type === 'lot') {
                            return dictionary[type] + ' ' + $scope.tender.lots.find(function (lot) {
                                return lot.id === $scope.lotId;
                            }).title;
                        } else {
                            return dictionary[type] || type;
                        }
                    };

                    $scope.checkIfEvidenceDocExist = function (docId) {
                        return !!$scope.filteredDocuments.find(function (document) {
                            return document.id === docId || document.originId === docId;
                        });
                    };

                    $scope.$on('choosedTemplate', function (evt, choosedTemplate) {
                        setChoosedTemplateInfoOnUi(choosedTemplate);
                    });

                    function setChoosedTemplateInfoOnUi(choosedTemplate) {
                        var criteriasTemplateResponse = [];

                        for (const key in $scope.requirementEvidences[$scope.lotId]) {
                            $scope.requirementEvidences[$scope.lotId][key].forEach(function (singleEvidence) {
                                if (singleEvidence.description && singleEvidence.title) {
                                    singleEvidence.description = '';
                                    singleEvidence.title = '';
                                }
                            });
                        }

                        choosedTemplate.requirementCriterionTemplates.forEach(function (template) {
                            criteriasTemplateResponse.push(findRequiremtnByTemplate(template));
                        });
                        criteriasTemplateResponse.sort(function (a, b) {
                            return (a.isFirst === b.isFirst) ? 0 : a.isFirst ? -1 : 1;
                        });

                        criteriasTemplateResponse.forEach(function (singleTemplateResponse) {
                            if (singleTemplateResponse.requirement) {
                                if (singleTemplateResponse.isFirst) {
                                    $scope.selectedTenderCriteriaRequirementGroups[$scope.lotId][singleTemplateResponse.singleCriteria.id] = singleTemplateResponse.requirement.title;
                                    var criteriaResponseValue = singleTemplateResponse.response.value;
                                    if (singleTemplateResponse.requirement.dataType === 'number') {
                                        criteriaResponseValue = Number(criteriaResponseValue);
                                    }
                                    $scope.onSelectedTenderCriteriaRequirementGroupChange(singleTemplateResponse.singleCriteria, singleTemplateResponse.criteriaGroup, false, criteriaResponseValue);
                                } else {
                                    if (singleTemplateResponse.requirement.dataType === 'boolean') {
                                        $scope.choosedTenderCriteriaRequirementValues[singleTemplateResponse.requirement.id] = singleTemplateResponse.response.value === 'true' ? true : false;
                                    } else if ($scope.isNumberOrIntegerTypeRequirement(singleTemplateResponse.requirement)) {
                                        $scope.choosedTenderCriteriaRequirementValues[singleTemplateResponse.requirement.id] = Number(singleTemplateResponse.response.value);
                                    } else {
                                        $scope.choosedTenderCriteriaRequirementValues[singleTemplateResponse.requirement.id] = singleTemplateResponse.response.value;
                                    }
                                }

                                var eligibleEvidenceStatementId = singleTemplateResponse.requirement.eligibleEvidences.findIndex(function (eligible) {
                                    return eligible.type === 'statement';
                                });

                                if (singleTemplateResponse.response.evidences && eligibleEvidenceStatementId !== -1) {
                                    var responseEvidences = singleTemplateResponse.response.evidences;
                                    var generatedEvidence = {
                                        description: responseEvidences.description,
                                        title: responseEvidences.title,
                                        type: responseEvidences.type,
                                        id: singleTemplateResponse.requirement.id,
                                        apiId: singleTemplateResponse.requirement.apiId,
                                    };

                                    if (generatedEvidence.type !== 'document' || singleTemplateResponse.requirement.eligibleEvidences.length) {
                                        $scope.requirementEvidences[$scope.lotId][singleTemplateResponse.requirement.id][eligibleEvidenceStatementId] = generatedEvidence;
                                        // $scope.isSingleCriteriaValid(singleTemplateResponse.singleCriteria);
                                    }
                                }
                            }
                        });
                        $scope.isFormValid();

                        toastr.success('Шаблон відповідей на критерії застосовано успішно.',
                            'Успіх!',
                            {
                                closeButton: true,
                                closeDuration: 20,
                                closeMethod: 'fadeOut'
                            }
                        );
                    }

                    function findRequiremtnByTemplate(template) {
                        var foundedCriteria = {
                            singleCriteria: null,
                            criteriaGroup: null,
                            requirement: null,
                            isFirst: false,
                            response: {
                                value: template.requirement.value,
                                evidences: template.evidence
                            }
                        };
                        $scope.groupedCriterias.main.forEach(function (singleCriteria) {
                            singleCriteria.requirementGroups.forEach(function (singleGroup) {
                                singleGroup.requirements.forEach(function (singeRequirement, index) {
                                    if (singeRequirement.title === template.requirement.title) {
                                        foundedCriteria.singleCriteria = singleCriteria;
                                        foundedCriteria.criteriaGroup = singleGroup;
                                        foundedCriteria.requirement = singeRequirement;
                                        foundedCriteria.isFirst = index === 0;
                                    }
                                });
                            });
                        });
                        if (!foundedCriteria.singleCriteria) {
                            $scope.groupedCriterias.otherLanguage.forEach(function (singleCriteria) {
                                singleCriteria.requirementGroups.forEach(function (singleGroup) {
                                    singleGroup.requirements.forEach(function (singeRequirement, index) {
                                        if (singeRequirement.title === template.requirement.title) {
                                            foundedCriteria.singleCriteria = singleCriteria;
                                            foundedCriteria.criteriaGroup = singleGroup;
                                            foundedCriteria.requirement = singeRequirement;
                                            foundedCriteria.isFirst = index === 0;
                                        }
                                    });
                                });
                            });
                        }
                        return foundedCriteria;
                    }

                    $scope.setDisqualifyCriterias($scope.criterias);
                    $scope.setlotIdToGroups();
                    $scope.isFormValid(false);
                    $scope.groupCriterias();
                    $scope.addEvidencesToRequirement();
                    $scope.setCriteriasFromRequirementResponse();
                }]
        };
    });
;
angular.module('app').directive('addContractGuaranteeCriteria', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('addContractGuaranteeCriteria from cache'),
            scope: {
                tender: '=',
                bid: '=',
                lot: '=',
                canUploadDocs: '='
            },
            controller: [
                '$scope',
                '$http',
                function ($scope, $http) {

                    var guaranteeClassificationId = 425979;

                    $scope.filteredDocuments = [];
                    $scope.requirementEvidences = {};
                    $scope.requirementEvidenceDocs = {};
                    $scope.oldRequirementEvidences = {};
                    $scope.oldRequirementEvidenceDocs = {};

                    $scope.guaranteeClassificationApiId = "CRITERION.OTHER.CONTRACT.GUARANTEE";

                    $scope.getSingleEligibleEvidencesForGuarantee = function () {
                        $scope.tenderGuaranteeCriteria = $scope.tender.tenderCriteria.find(function (criteria) {
                            if (criteria.relatesTo === 'lot') {
                                return criteria.classification.apiId === $scope.guaranteeClassificationApiId
                                    && criteria.relatedItem === $scope.lot.apiId;
                            } else {
                                return criteria.classification.apiId === $scope.guaranteeClassificationApiId;
                            }
                        });
                    };

                    $scope.getDocumentsForEvidence = function () {
                        $scope.filteredDocuments = $scope.bid.documents.filter(function (document) {
                            return document.documentType && document.documentType.type === 'contractGuarantees';
                        });
                    };

                    $scope.updateRequirementResponseEvidences = function () {
                        var url = '/api/services/etender/bidRequirementResponse/UpdateRequirementResponseEvidences';
                        var evidences = [];
                        var requirementResponseId = null;
                        $scope.tenderGuaranteeCriteria.requirementGroups.forEach(function (group) {
                            group.requirements.forEach(function (requirement) {
                                if (requirement.requirementStatus !== 'cancelled') {
                                    requirementResponseId = $scope.findRequirementResponseId(requirement);
                                    $scope.requirementEvidences[requirement.id].forEach(function (evidence) {
                                       evidences.push(evidence);
                                    });
                                }
                            });
                        });

                        $http({
                            url: url,
                            method: 'POST',
                            data: {
                                evidences: evidences,
                                requirementResponseId: requirementResponseId.id,
                                bidId: $scope.bid.id
                            },
                        }).then(function (response) {
                           if (response.data && response.data.success) {
                               abp.notify.success('Вимогу підтверджено');
                               $scope.close();
                               $scope.$emit('reloadTender');
                           } else {
                               abp.notify.error(response.data.error.message);
                           }
                        });
                    };

                    $scope.findRequirementResponseId = function (requirement) {
                        return $scope.bid.tenderCriteriaRequirementResponses.find(function (requirementResponse) {
                            return requirementResponse.requirementId.toString() === requirement.id;
                        });
                    };

                    $scope.close = function () {
                        $scope.tenderGuaranteeCriteria.requirementGroups.forEach(function (group) {
                            group.requirements.forEach(function (requirement) {
                                $scope.requirementEvidences[requirement.id].forEach(function (evidence) {
                                    evidence.title = null;
                                    evidence.description = null;
                                    evidence.relatedDocumentId = null;
                                });
                            });
                        });
                        $scope.$emit('closeCotractGuarantee', $scope.bid.id);
                        $scope.$broadcast('closeCotractGuarantee');
                    };

                    $scope.isEvidencesValid = function () {
                        var isValid = true;
                        $scope.tenderGuaranteeCriteria.requirementGroups.forEach(function (group) {
                            group.requirements.forEach(function (requirement) {
                                if (requirement.requirementStatus === 'active') {
                                    $scope.requirementEvidences[requirement.id].forEach(function (evidence) {
                                        if (evidence.type === 'document') {
                                            if (!evidence.relatedDocumentId || !$scope.checkIfEvidenceDocExist(evidence.relatedDocumentId)) {
                                                isValid = false;
                                            }
                                        } else {
                                            if (!evidence.title) {
                                                isValid = false;
                                            }
                                        }
                                    });
                                }
                            });
                        });

                        return isValid;
                    };

                    $scope.checkIfEvidenceDocExist = function (docId) {
                        return !!$scope.filteredDocuments.find(function (doc) {
                            return doc.id === docId;
                        });
                    };

                    $scope.addEvidencesToRequirement = function () {
                        $scope.tenderGuaranteeCriteria.requirementGroups.forEach(function (group) {
                            group.requirements.forEach(function (requirement) {
                                $scope.requirementEvidences[requirement.id] = [];
                                requirement.eligibleEvidences.forEach(function (evidence) {
                                    $scope.requirementEvidences[requirement.id].push({
                                        title: null,
                                        description: null,
                                        relatedDocumentId: null,
                                        type: evidence.type,
                                        isRequired: true
                                    });
                                });
                            });
                        });
                    };

                    $scope.fillEvidences = function () {
                        $scope.tenderGuaranteeCriteria.requirementGroups.forEach(function (group) {
                            group.requirements.forEach(function (requirement) {
                                var requirementResponse = $scope.bid.tenderCriteriaRequirementResponses.find(function (response) {
                                    return response.requirementId.toString() === requirement.id;
                                });

                                if (requirementResponse) {
                                    if (requirementResponse.evidences && requirementResponse.evidences.length) {
                                        $scope.requirementEvidences[requirement.id] = [];
                                        requirementResponse.evidences.forEach(function (evidence, evidenceIndex) {
                                            var evidenceToAdd = angular.copy(evidence);
                                            $scope.requirementEvidences[requirement.id].push(evidenceToAdd)
                                            if (evidence.type === 'document') {
                                                var evidenceDocument = $scope.filteredDocuments.find(function (doc) {
                                                    return doc.id === evidence.relatedDocumentId;
                                                });
                                                $scope.requirementEvidenceDocs[evidence.id] = evidenceDocument;
                                            }
                                        });
                                    }

                                }
                            });
                        });
                        $scope.oldRequirementEvidences = angular.copy($scope.requirementEvidences);
                        $scope.oldRequirementEvidenceDocs = angular.copy($scope.requirementEvidenceDocs);
                    };

                    $scope.$watch('tender', function () {
                        $scope.getDocumentsForEvidence();
                        $scope.getSingleEligibleEvidencesForGuarantee();
                        $scope.addEvidencesToRequirement();
                        $scope.fillEvidences();
                    });

                    $scope.$on('reloadDocumentsTable', function (event, docs, bidId) {
                        if ($scope.bid.id === bidId) {
                            $scope.bid.documents = docs;
                            $scope.getDocumentsForEvidence();
                        }
                    });

                    $scope.isRequirementEvidencesChanged = function () {
                        if (angular.equals($scope.requirementEvidences, {}) || angular.equals($scope.requirementEvidenceDocs, {})) {
                            return true;
                        }
                        return !angular.equals($scope.requirementEvidences, $scope.oldRequirementEvidences)
                            || !angular.equals($scope.requirementEvidenceDocs, $scope.oldRequirementEvidenceDocs);
                    };
                }
            ]
        }
    }
])
;
angular.module('app')
    .directive('bidCriterias', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/criterias/bidCriterias.html',
            scope: {
                requirementResponses: '=',
                tender: '=',
                bid: '=',
                isAward: '=',
                lotId: '='
            },
            controller: [
                '$scope',
                '$rootScope',
                'criteriasDictionaryService',
                function (
                    $scope,
                    $rootScope,
                    criteriasDictionaryService
                ) {
                    $scope.criterias = {};
                    $scope.groupedCriterias = {
                        main: {},
                        otherLanguage: {}
                    };

                    $scope.localizationDetailesDictionary = {
                        'tender': $rootScope.source('Tenders'),
                        'lot': $rootScope.source('forLot'),
                        'item': $rootScope.source('forItem'),
                        'tenderer': $rootScope.source('forTenderer'),
                        'buyer': $rootScope.source('forBuyer'),
                        'procuringEntity': $rootScope.source('forBuyer'),
                        'winner': $rootScope.source('ForWinner')
                    };

                    $scope.criteriaTypes = {
                        main: $rootScope.source('ReasonToRefuse'),
                        otherLanguage: $rootScope.source('Others')
                    };

                    $scope.buildCriteriaTree = function () {
                        $scope.requirementResponses.forEach(function (requirementResponse) {
                            $scope.tender.tenderCriteria.forEach(function (singleCriteria) {
                                singleCriteria.requirementGroups.forEach(function (group) {
                                    group.requirements.forEach(function (requirement, requirementIndex) {
                                        if (requirement.id === requirementResponse.requirementId.toString()) {
                                            var combinedRequirement = angular.copy(requirement);
                                            combinedRequirement.evidences = angular.copy(requirementResponse.evidences);
                                            combinedRequirement.value = requirementResponse.value;
                                            if ($scope.criterias[singleCriteria.id]) {
                                                if (requirementIndex === 0) {
                                                    $scope.criterias[singleCriteria.id].requirements.unshift(combinedRequirement);
                                                } else {
                                                    $scope.criterias[singleCriteria.id].requirements.push(combinedRequirement);
                                                }
                                            } else {
                                                $scope.criterias[singleCriteria.id] = {
                                                    criteria: singleCriteria,
                                                    requirements: [combinedRequirement],
                                                    group: group
                                                }
                                            }
                                        }
                                    });
                                });
                            });
                        });
                    };

                    var apiIdsToExclude = [
                        'CRITERION.OTHER.BID.LANGUAGE',
                        'CRITERION.OTHER.BID.GUARANTEE',
                        'CRITERION.OTHER.CONTRACT.GUARANTEE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                    ];
                    $scope.groupCriterias = function () {
                        for (var key in $scope.criterias) {
                            if (apiIdsToExclude.indexOf($scope.criterias[key].criteria.classification.apiId) === -1) {
                                $scope.groupedCriterias.main[key] = $scope.criterias[key];
                            } else {
                                $scope.groupedCriterias.otherLanguage[key] = $scope.criterias[key];
                            }
                        }
                    };

                    $scope.getLocalizationTextFromDictionary = function (type, dictionary) {
                        if (type === 'lot') {
                            return dictionary[type] + ' ' + $scope.tender.lots.find(function (lot) {
                                return lot.id === $scope.lotId;
                            }).title;
                        } else {
                            return dictionary[type] || type;
                        }
                    };

                    $scope.getEvidenceTypeTitle = function (evidence) {
                        return criteriasDictionaryService.getEvidenceTypeTitle(evidence);
                    };

                    $scope.getRealatedEviedenceDocument = function (evidence) {
                        if ($scope.isAward) {
                            return $scope.bid.awardDocuments.find(function (document) {
                                return document.originId === evidence.relatedDocumentId;
                            });
                        } else {
                            return $scope.bid.documents.find(function (document) {
                                return document.originId ? document.originId === evidence.relatedDocumentId
                                    : document.id === evidence.relatedDocumentId;
                            });
                        }
                    };

                    $scope.isObjectEmpty = function (object) {
                        return Object.keys(object).length === 0;
                    };

                    $scope.buildCriteriaTree();
                    $scope.groupCriterias();
                }]
        };
    });
;
angular.module('app')
    .directive('criteriaEvidence', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/criterias/criteriaEvidence.html',
            scope: {
                evidence: '=',
                documents: '=',
                requirement: '=',
                evidenceIndex: '=',
                requirementEvidences: '=',
                lotIndex: '=',
                relatedDocumentForEvidence: '=',
                isAward: '=',
                criteriaType: '=',
                skipDocumentsCheck: '=',
                lot: '=',
                bid: '=',
                tender: '=',
                isQualification: '=',
                canUploadDocs: '='
            },
            controller: [
                '$scope',
                '$rootScope',
                'criteriasDictionaryService',
                'documentsService',
                '$q',
                'siteSettingsService',
                'abp.services.etender.bidDocument',
                'bidHelperService',
                'documentsService',
                'loadTypesAndConfident',
                'abp.services.etender.getTender',
                function (
                    $scope,
                    $rootScope,
                    criteriasDictionaryService,
                    documentsService,
                    $q,
                    siteSettingsService,
                    bidDocument,
                    bidHelper,
                    documentsService,
                    loadTypesAndConfident,
                    getTender
                ) {
                    $scope.vm = {};
                    $scope.vm.relatedDocument = null;
                    $scope.newDocToBid = null;
                    $scope.isFirstLoad = true;
                    var warningMsngShowen = false;

                    if ($scope.relatedDocumentForEvidence) {
                        $scope.vm.relatedDocument = $scope.relatedDocumentForEvidence;
                    }

                    $scope.removeEvidence = function () {
                        $scope.requirementEvidences.splice($scope.evidenceIndex, 1);
                        $scope.$emit('onEvidenceChanged');
                    };

                    $scope.$on('reloadTenderSuccess', function () {
                        $scope.$emit('onEvidenceChanged');
                    });

                    $scope.onEvidenceChanged = function () {
                        $scope.$emit('onEvidenceChanged');
                    };

                    $scope.onEvidenceDocumentChanged = function () {
                        if ($scope.vm.relatedDocument) {
                            $scope.evidence.relatedDocumentId = $scope.vm.relatedDocument.originId ? $scope.vm.relatedDocument.originId :
                                $scope.vm.relatedDocument.id;
                        }
                        $scope.$emit('onEvidenceChanged');

                        if ($scope.evidence.relatedDocumentId) {
                            $scope.$emit('docAddedToEvidence', $scope.evidence.relatedDocumentId, $scope.vm.relatedDocument);
                        }
                    };

                    $scope.getEvidenceTypeTitle = function (evidence) {
                        return criteriasDictionaryService.getEvidenceTypeTitle(evidence);
                    };
                    
                    var criteriaTypesForDocumentsFilter = [
                        'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                    ];
                    
                    $scope.filterEvidenceDocsForNoGuarantee = function () {
                        if (criteriaTypesForDocumentsFilter.indexOf($scope.criteriaType) !== -1) {
                            $scope.filteredDocuments = $scope.documents.filter(function (document) {
                                return document.documentType && document.documentType.type === 'qualificationDocuments'
                                    && document.isExported
                                    && document.title.indexOf('.yaml') === -1
                                    && checkIfDocIsNotSign(document);
                            });
                        } else if ($scope.criteriaType !== 'CRITERION.OTHER.BID.GUARANTEE' && !$scope.skipDocumentsCheck) {
                            $scope.filteredDocuments = $scope.documents.filter(function (document) {
                                return document.documentType && document.documentType.type === 'eligibilityDocuments'
                                    && document.isExported
                                    && document.title.indexOf('.yaml') === -1 && checkIfDocIsNotSign(document);
                            });
                        } else {
                            $scope.filteredDocuments = $scope.documents.filter(function (document) {
                                return (document.isExported || document.isExported === null)
                                    && !documentsService.isDocumentChanged(document, $scope.documents)
                                    && !document.isDeleted
                                    &&  document.title.indexOf('.yaml') === -1
                                    &&  checkIfDocIsNotSign(document)
                                    && !(document.documentType && document.documentType.type === 'qualificationDocuments');
                            });
                        }
                        if (!$scope.isFirstLoad) {
                            setLastUploadedDocumentAsSelectValue($scope.filteredDocuments);
                        }
                    };
                    function setLastUploadedDocumentAsSelectValue(documents) {
                        if (documents && documents.length) {
                            if ($rootScope.lotEvidenceDocuments[$scope.lot.id][$scope.requirement.id]) {
                                var documentToAdd = documents.find(function (document) {
                                    return document.id === $rootScope.lotEvidenceDocuments[$scope.lot.id][$scope.requirement.id][$scope.evidenceIndex];
                                });
                                if (!documentToAdd) {
                                    var missingDocument = $scope.bid.documents.find(function (document) {
                                        return document.id === $rootScope.lotEvidenceDocuments[$scope.lot.id][$scope.requirement.id][$scope.evidenceIndex];
                                    });
                                    if (missingDocument) documents.push(missingDocument);
                                }
                                if (documentToAdd || missingDocument) {
                                    $scope.vm.relatedDocument = documentToAdd || missingDocument;
                                }
                            }
                        }
                    }

                    function checkIfDocIsNotSign (document) {
                        var documentTitleArr = document.title.split('.');
                        if (documentTitleArr[documentTitleArr.length - 1] === 'p7s') {
                            var supportedFormats =
                                ['png', 'jpg', 'jpeg', 'pdf', 'txt', 'xlsx', 'docx', 'doc', 'xls', 'ppt', 'KVT', 'xml'];
                                
                                return supportedFormats.includes(documentTitleArr[documentTitleArr.length - 2]);
                        } else {
                            return true;
                        }
                    }

                    $scope.$watch('documents', function () {
                        $scope.filterEvidenceDocsForNoGuarantee();
                    });
                    
                    $scope.$on('closeCotractGuarantee', function () {
                        $scope.isFirstLoad = true;
                    });

                    $scope.uploadNewDocToBid = function () {
                        abp.ui.setBusy();
                        var confidentiality = $scope.bid.confidentiality || '';
    
                        if (confidentiality && confidentiality.valueType != 'buyerOnlyType') {
                            $scope.bid.confidentialityRationale = null;
                        }
                        
                        var defer = $q.defer();
                        // check internet connection
                        siteSettingsService.isInternetConnection().then(function () {
                            $scope.sendRequestToAddDoc(defer, $scope.bid, $scope.lot, confidentiality);
                        }, function () {
                                abp.notify.error("Немає з'єднання з інтернетом, завантаження неможливе");
                                defer.reject();
                        });
                        return defer.promise;
                    }
    
                    $scope.sendRequestToAddDoc = function (defer, bid, lot, confidentiality) {
                        var draftDocs = documentsService.getDraftDocs(lot, bid);
    
                        if (bid.id && draftDocs && draftDocs.length) {
                            bidDocument.editNotExportBidDocuments(draftDocs).then(function () {
                                $scope.createOrUpdateBidDraft(defer, bid, lot, confidentiality);
                            });
                        } else {
                            $scope.createOrUpdateBidDraft(defer, bid, lot, confidentiality);
                        }
                        
                    }
    
                    $scope.createOrUpdateBidDraft = function (defer, bid, lot, confidentiality) {
                        bidHelper.createOrUpdateBidDraft(bid, lot, false, $scope.tender, bid.choosedProduct).then(function (data) {
                            var obj = {
                                tenderId: $scope.tender.id,
                                documentId: "",
                                confidentiality: confidentiality && confidentiality.value,
                                confidentialityRationale: bid.confidentialityRationale,
                                isDescriptionDecision: bidHelper.setDescriptionDecision(bid)
                            };
                            if ($scope.isQualification) {
                                obj.qualificationId = bid.id
                            } else {
                                obj.bidId =  bid.id
                            }
                            addDocumentTypeToDocument(obj);
    
                            if ($scope.tender.procurementMethodType === 'priceQuotation' || 
                                $scope.tender.isBelowThreshold || 
                                $scope.tender.isSimpleProcurementMethodRationale) 
                            {
                                delete obj.confidentiality;
                                delete obj.confidentialityRationale;
                                delete obj.isDescriptionDecision
                            }
    
                            $scope.newDocToBidFields = { myObj: obj, notExport: false, dontUpdateTender: true };
                            defer.resolve();
                        }, function () { defer.reject(); });
                    };

                    $scope.newDocUploaded = function (data) {
                        if (data && data.id) {
                            if (!$rootScope.lotEvidenceDocuments[$scope.lot.id][$scope.requirement.id]) {
                                $rootScope.lotEvidenceDocuments[$scope.lot.id][$scope.requirement.id] = {};
                            }
                            $rootScope.lotEvidenceDocuments[$scope.lot.id][$scope.requirement.id][$scope.evidenceIndex] = data.id;
                            $scope.evidence.relatedDocumentId = data.id;
                        }
                        $scope.needToSkipComplaints = true;
                        abp.notify.success("Файл (файли) додано!");
                        if (!$scope.bid.isDraft && !warningMsngShowen) {
                            warningMsngShowen = true;
                            abp.notify.warn('Час синхронізації файлів на ЦБД може зайняти до 20 хвилин.', 'Увага!');
                        }
                        window.onbeforeunload = null;
                        if ($scope.newDocToBidFields.dontUpdateTender) {
                            setTimeout(function () {
                                getTender.getTender({ "Id": $scope.tender.id }).then(function (response) {
                                    if (response && response.data) {
                                        var lot = response.data.lots.find(function (lot) {
                                            return lot.id === $scope.lot.id;
                                        });
    
                                        if ($scope.isQualification) {
                                            var qual = lot.qualifications.find(function (qual) {
                                                return qual.id === $scope.bid.id;
                                            });
                                            
                                            $rootScope.$broadcast('reloadDocumentsTable', qual.documents, qual.id);
                                            $rootScope.$emit('reloadDocumentsTable', qual.documents, qual.id);
                                        } else {
                                            lot.bids.forEach(function (bid) {
                                                $scope.$emit('reloadTenderAfterDocUpload', bid.documents);
                                                $rootScope.$broadcast('reloadDocumentsTable', bid.documents, bid.id);
                                                $rootScope.$broadcast('reloadDocumentTableForLots', bid.documents, bid.id);
                                            });
                                        }
                                    }
                                    abp.ui.clearBusy();
                                    $scope.isFirstLoad = false;
                                }, function (error) {
                                    console.log(error);
                                });
                            }, 3000)
                        }
                        $scope.isFirstLoad = false;
                    };

                    function addDocumentTypeToDocument(documentObject) {
                        loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                            var contractGuarantees_DocumentId = documentTypes.bidDocument.find(function (typeDocument) {
                                return typeDocument.type === 'contractGuarantees';
                            }).id;
                            var qualificationDocuments_DocumentId = documentTypes.bidDocument.find(function (typeDocument) {
                                return typeDocument.type === 'qualificationDocuments';
                            }).id;
                            var eligibilityDocuments_DocumentId = documentTypes.bidDocument.find(function (typeDocument) {
                                return typeDocument.type === 'eligibilityDocuments';
                            }).id;

                            if ($scope.criteriaType.indexOf('CONTRACT.GUARANTEE') !== -1) {
                                documentObject.type = contractGuarantees_DocumentId;
                            } else if (criteriaTypesForDocumentsFilter.indexOf($scope.criteriaType) !== -1) {
                                documentObject.type = qualificationDocuments_DocumentId;
                            } else if ($scope.criteriaType.indexOf('CRITERION.EXCLUSION') !== -1 || $scope.criteriaType.indexOf('OTHER.BID.GUARANTEE') !== -1) {
                                documentObject.type = eligibilityDocuments_DocumentId;
                            }
                        });
                    }

                }]
        };
    });
;
angular.module('app').directive('criteriaRequirementConfirmationMethod', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('criteriaRequirementMethod from cache'),
            scope: {
                singleRequirement: '=',
                choosedCriteriaRequirement: '=',
                needTitle: '=',
                needToShowSpecificType: '=',
                criteriaChange: '=',
                isFirst: '='
            },
            controller: [
                '$scope',
                function ($scope) {
                    $scope.getErrorBorder = function (requirementId) {
                        if ($scope.isFirst) {
                            return $scope.choosedCriteriaRequirement[requirementId] !== 0 && !$scope.choosedCriteriaRequirement[requirementId];
                        }
                        return !$scope.choosedCriteriaRequirement[requirementId];
                    };
                }
            ]
        };
    }
]);;
angular.module('app').directive('criteriaTemplates', [
    '$templateCache',
    function ($templaCache) {
        return {
            restrict: 'AE',
            template: $templaCache.get('criteriaTemplates from cache'),
            scope: {
                bid: '=',
                tenderStatus: '='
            },
            controller: [
                '$scope',
                'abp.services.etender.criterionTemplate',
                function ($scope, criterionTemplate) {

                    $scope.$watch(function() {
                        return $scope.bid && $scope.bid.isMyBid && $scope.tenderStatus && $scope.tenderStatus === 'active.tendering'
                    }, function(ownActiveBid) {
                        if (ownActiveBid) {
                            criterionTemplate.getMyTemplates().then(function (response) {
                                $scope.myTemplates = response.data;
                            });
                        }
                    });

                    $scope.getInfoFromTemplate = function (templateId, currentTemplate) {
                        $scope.myTemplates.forEach(function (templates) {
                            templates.active = false;
                        });
                        currentTemplate.active = true;

                        criterionTemplate.get(templateId).then(function (response) {
                            $scope.$emit('choosedTemplate', response.data);
                        });
                    }
                }
            ]
        }
    }
]);
angular.module('app').component('eCatalogProduct', {
    templateUrl: '/App/Main/base/directives/eCatalog/eCatalogProduct.html',
    bindings: {
        productId: '<',
        vm: '='
    },
    controllerAs: 'ctrl',
    controller: ['abp.services.etender.eCatalog', '$location', '$scope',
        function (eCatalog, $location, $scope) {
            this.$onInit = function () {
                var self = this;
                eCatalog.getProduct(self.productId).then(function (response) {
                    self.product = response.data;
                    if (self.vm) self.vm.product = response.data;
                    console.log('eCatalog Product: ', response.data);
                    $scope.$emit('canCreateOrUpdateConditions', response.data.canCreateOffer, response.data.canUpdateOffer);
                    $scope.$emit('getProductUrl', response.data.productUrl);
                }, function (errorResponse) {
                    console.log(errorResponse.data);
                        if (
                            errorResponse.data.message.includes('Товар не знайдено') ||
                            errorResponse.data.message.includes('Профіль не активний') ||
                            errorResponse.data.message.includes('Профіль не знайдено') ||
                            errorResponse.data.message.includes('Профіль товару не активний')
                        ) {
                            $location.path('/ProzorroMarket');
                    }
                });
            }
        }]
});;
angular.module('app').component('offerForm', {
    templateUrl: '/App/Main/base/directives/eCatalog/offerForm.html',
    bindings: {
        formName: '=',
        data: '=',
        condition: '=',
        vm: '='
    },
    controllerAs: 'ctrl',
    controller: ['$stateParams',
        function ($stateParams) {
            this.$onInit = function () {
                var self = this;
                self.productId = $stateParams.prodId;
            }

            this.amountOnChange = function (amount) {
                this.data.minOrderValue.amount = amount;
            }
        }]
});;
angular.module('app').directive('filterCalendarDirective', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('tendersSearchAndFilter from cache'),
        scope: {
            vm: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            'datesHelperService',
            'classificationSearchService',
            '$rootScope',
            'filterSearchService',
            function (
                $scope,
                $localStorage,
                datesHelperService,
                classificationSearchService,
                $rootScope,
                filterSearchService) {

                $scope.ng_localStorage = $localStorage;
                $scope.showClearFilterButton = false;

                var vm = $scope.vm;
                vm.pageNameForFilter = 'calendar';
                vm.isPriceIntervalValid = isPriceIntervalValid;
                vm.validDateFromAndTo = validDateFromAndTo;
                vm.changeSelProcTypes = changeSelProcTypes;
                vm.selectedProcTypes = [];
                vm.selectedCpvs = [];
                vm.changeSelCpvs = changeSelCpvs;
                vm.getAllCpvs = getAllCpvs;
                vm.selectedProcTypes = [];
                vm.getClearFilterButton = getClearFilterButton;
                vm.clear = clear;

                function isPriceIntervalValid() {
                    return filterSearchService.isPriceIntervalValid(vm);
                }

                function validDateFromAndTo(dateFrom, dateTo) {
                    return datesHelperService.validDateFromAndTo(dateFrom, dateTo);
                }

                function changeSelProcTypes(procType, checked) {
                    return filterSearchService.changeSelProcTypes(procType, checked, vm);
                }

                //#region Init Classification
                $scope.cleareChildCpv = function (cpvs) {
                    vm.changeSelCpvs(cpvs.code, true);
                };

                $scope.initClassification = function () {
                    classificationSearchService.initClassification($scope, $scope.vm.selectedCpvs);
                }

                function changeSelCpvs(cpv, remove) {
                    classificationSearchService.changeSelCpvs(cpv, remove, vm);
                }

                function getAllCpvs() {
                    return filterSearchService.getAllCpvs($scope);
                }


                function getClearFilterButton () {
                    if (!vm.pager.searchFilter.priceFrom &&
                        !vm.pager.searchFilter.priceTo &&
                        !vm.pager.searchFilter.tenderCreationTimeFrom &&
                        !vm.pager.searchFilter.tenderCreationTimeTo &&
                        !vm.pager.searchFilter.organizationName &&
                        !vm.pager.searchFilter.funderId &&
                        !vm.pager.searchFilter.title &&
                        vm.pager.searchFilter.parentCodesEDRPOU.length === 0 &&
                        (!vm.pager.searchFilter.cpvs || vm.pager.searchFilter.cpvs.length === 0)  &&
                        vm.pager.searchFilter.procurementMethodTypes.length === 0 &&
                        !vm.getClearFilterButtonSpec()) {
                        $scope.showClearFilterButton = false;
                        return;
                    }
                    $scope.showClearFilterButton = true;
                }

                function clear() {
                    vm.searchIdentifier = null;
                    vm.filter = {
                        description: null,
                        classificationCpv: null,
                        classificationDkpp: null,
                        organisation: null,
                        parentCodeEDRPOU: null,
                        priceFrom: null,
                        priceTo: null,
                        tenderCreationTimeFrom: '',
                        tenderCreationTimeTo: '',
                        tenderPeriodStartFrom: '',
                        tenderPeriodStartTo: '',
                        tenderPeriodEndFrom: '',
                        tenderPeriodEndTo: '',
                        title: null,
                        customerRegion: '',
                        tendersKind: '',
                        funderId: null
                    };
                    $rootScope.$broadcast('clearFunder', true);
                    vm.selectedStatuses = [];
                    vm.checkedStatuses = [];
                    vm.statusSearchText = null;
                    vm.statusSearchLabel = null;
                    vm.selectedProcTypes = [];
                    vm.checkedProcTypes = [];
                    vm.procTypeSearchText = null;
                    vm.selectedOrgCodes = [];
                    if (vm.selectedCpvs.length > 0) {
                        vm.selectedCpvs = [];
                        $rootScope.clearCheckbox();
                    }
                    getClearFilterButton();
                    vm.clearSpec();
                }
            }]
    };
}]);;
angular.module('app').directive('filterComplaintsDirective', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('tendersSearchAndFilter from cache'),
        scope: {
            vm: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            'datesHelperService',
            'classificationSearchService',
            'filterSearchService',
            'referenceService',
            'lookupService',
            'specialDataService',
            'complaintsService',
            function (
                $scope,
                $localStorage,
                datesHelperService,
                classificationSearchService,
                filterSearchService,
                referenceService,
                lookupService,
                specialDataService,
                complaintsService) {

                var vm = $scope.vm;
                var simpleProcType = { id: 15, procurementMethod: 'open', procurementMethodType: 'belowThresholdSimple', procurementMethodTypeDescription: 'Спрощена закупівля', procurementMethodTypeLocal: 'Спрощена закупівля', isSimpleProcurementMethodRationale: false };

                $scope.ng_localStorage = $localStorage;
                $scope.showClearFilterButton = $scope.showClearFilterButton;
                vm.procTypesDictionary = [];
                vm.procurementMethod = vm.procurementMethod || ['open', 'selective'];
                vm.selectedProcTypes = vm.selectedProcTypes || [];
                if (simpleProcType.isSimpleProcurementMethodRationale) {
                    vm.selectedProcTypes.push(simpleProcType.procurementMethodType);
                }
                vm.selectedStatuses = vm.selectedStatuses || [];
                vm.pageNameForFilter = 'claimsComplaints';
                vm.placeholderInputSearch = 'ПОШУК ВИМОГИ/СКАРГИ';
                var selectCpvs = true;

                vm.types = vm.types || [
                    {
                        type: 'claim',
                        description: 'Вимога',
                        checked: false
                    },
                    {
                        type: 'complaint',
                        description: 'Скарга',
                        checked: false
                    }
                ];
                vm.typesText = function () {
                    var text = '';
                    angular.forEach(vm.types,
                        function (type) {
                            if (!type.checked)
                                return;
                            if (text != '')
                                text += '; ';
                            text += type.description;
                        });
                    return text;
                };

                //#region Init Classification
                vm.selectedCpvs = vm.selectedCpvs || [];
                $scope.cleareChildCpv = function(cpvs) { return vm.changeSelCpvs(cpvs.code, selectCpvs); };
                $scope.initClassification = function() { return classificationSearchService.initClassification($scope, vm.selectedCpvs); };
                vm.changeSelCpvs = function(cpv, remove) { return filterSearchService.changeSelCpvs(cpv, remove, vm); };
                vm.getAllCpvs = function() { return filterSearchService.getAllCpvs($scope); };

                // check price values
                vm.isPriceIntervalValid = function() { return filterSearchService.isPriceIntervalValid(vm); };

                // check data values
                vm.validDateFromAndTo = function (dateFrom, dateTo) { return datesHelperService.validDateFromAndTo(dateFrom, dateTo); };

                // Proc Types funcs
                vm.changeSelProcTypes = function (procType, checked) {
                    return filterSearchService.changeSelProcTypes(procType, checked, vm);
                };

                vm.makeProcTypeSearchText = function () {
                    angular.forEach(vm.selectedProcTypes, function (simpleProc) {
                        if (simpleProc == 'simple') {
                            simpleProcType.isSimpleProcurementMethodRationale = true;
                        }
                        simpleProcType.isSimpleProcurementMethodRationale = false;
                    });
                    return filterSearchService.makeProcTypeSearchText(vm);
                };

                var filterProcTypes = function(procTypes) { return filterSearchService.filterProcTypes(procTypes, vm); };
                vm.getProcTypes = function() {
                    if (vm.procTypesDictionary && vm.procTypesDictionary.length > 0) return;
                    abp.ui.setBusy("#procTypesFilter");
                    referenceService
                        .getNonLimitedProcTypes()
                        .then(function(response) {
                                if (response.data) {
                                    angular.forEach(response.data.procTypes,
                                        function(pType) {
                                            pType.procurementMethodTypeLocal = lookupService
                                                .getTenderProcedureType(pType.procurementMethodType);
                                        });
                                    $scope.allProcTypes = response.data.procTypes;
                                    $scope.allProcTypes.splice(4, 0, simpleProcType);
                                    angular.forEach($scope.allProcTypes, function (type) {
                                        if (type.procurementMethodTypeLocal == 'Спрощена/Допорогова закупівля') {
                                            type.procurementMethodTypeLocal = 'Допорогова закупівля';
                                        }
                                    });
                                    vm.procTypesDictionary = filterProcTypes($scope.allProcTypes);
                                }
                                abp.ui.clearBusy("#procTypesFilter");
                            },
                            function() {
                                abp.ui.clearBusy("#procTypesFilter");
                            });
                };

                // Statuses funcs
                vm.getLabelClass = function (s) {return lookupService.getTenderLabelClass(s);}
                vm.statusesObj = specialDataService.statuses;
                vm.setSelected = function (s, checked) {return filterSearchService.setSelected(s, checked, vm);}
                vm.makeSelectedStatusesChecked = function () {return filterSearchService.makeStatusSearchText(vm);}
                vm.getStatusDetails = function() {
                    var r = [];
                    for (var i = 0; i < vm.statusesObj.length; i += 1) {
                        r.push({
                            name: vm.statusesObj[i],
                            desc: lookupService.getTenderStatusDesc(vm.statusesObj[i]),
                            labelClass: vm.getLabelClass(vm.statusesObj[i])
                        });
                    }
                    return r;
                }
                vm.statuses = vm.getStatusDetails();

                // Complaint Statuses and Types Funcs
                vm.complaintStatuses = setObjComplaintStatuses(complaintsService.complaintStatus());
                vm.relatedEntityTypes = complaintsService.relatedEntityTypes();
                function setObjComplaintStatuses(arrStatuses) {
                    var statusesObj = [];
                    arrStatuses.forEach(function(item) {
                        var obj = {
                            source: item,
                            name: complaintsService.getComplaintStatusUkr(item, undefined, true)
                        };
                        statusesObj.push(obj);
                    });
                    return statusesObj;
                }

                vm.closeComplainTypeDown = function() {
                    vm.isComplainTypeOpen = false;
                };
                vm.closeComplainStatusDown = function() {
                    vm.isComplainStatusOpen = false;
                };
                var getNameOfParamStatuse = function(arra)  {
                    return arra.map(function (item) {
                        return complaintsService.getComplaintStatusUkr(item, undefined, true)
                    });
                };
                var getNameOfParamType = function(arra) {
                    var readyArray = [];
                    vm.relatedEntityTypes.forEach(function(item, i) {
                        arra.forEach(function(item2, i2) {
                            if (item2 === item.source)
                                readyArray.push(vm.relatedEntityTypes[i].name);
                        })
                    });
                    return readyArray;
                };
                vm.setTypeComplTextInput = function() {
                    vm.typeComplTextInput = getNameOfParamType(vm.filter.selectedRelatedEntityTypes).join()
                };
                vm.setStatusComplTextInput = function() {
                    vm.statusComplTextInput = getNameOfParamStatuse(vm.filter.selectedComplaintStatuses).join()
                };

                // check if Filter need to clear
                vm.getClearFilterButton = function()  {
                    //  console.log(vm.requestCleanData);
                    //  console.log(vm.setFilter());
                    if (angular.equals(vm.requestCleanData, vm.setFilter())) {
                        $scope.showClearFilterButton = false;
                        return;
                    }
                    $scope.showClearFilterButton = true;
                };

                vm.getClearFilterButton();
                

            }]
    };
}]);;
angular.module('app')
    .directive('frameworksList', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('frameworksList from cache'),
        scope: {
            runRequest: '='
        },
        controller: [
            '$scope',
            'ngTableParams',
            '$rootScope',
            '$http',
            '$localStorage',
            'classificationSearchService',
            'abp.services.etender.reference',
            '$location',
            function (
                $scope,
                ngTableParams,
                $rootScope,
                $http,
                $localStorage,
                classificationSearchService,
                abpReferenceService,
                $location
            ) {
                $scope.myDealsOnly = false;
                $scope.isStatOpen = false;
                $scope.showClearFilterButton = false;
                $scope.statusSearchText = '';
                $scope.totalDealsLength = 0;
                $scope.selectedCpvs = [];
                $scope.requestParamsCPV = [];
                $scope.checkedStatuses = [];
                $scope.selectedStatuses = [];
                $scope.isRealTestMode = $localStorage.realTestMode;
                $scope.titles = [
                    $rootScope.source('SelectionName'),
                    $rootScope.source('Classificator'),
                    $rootScope.source('Status'),
                    $rootScope.source('EnquiriesEndDate'),
                    $rootScope.source('ApplicationDeadline')
                ];
                $scope.statusTraslation = [
                    {
                        status: 'active',
                        translation: $rootScope.source('QualificationPeriod')
                    },
                    {
                        status: 'unsuccessful',
                        translation: $rootScope.source('Unsuccessful')
                    },
                    {
                        status: 'draft',
                        translation: $rootScope.source('Draft')
                    },
                    {
                        status: 'complete',
                        translation: $rootScope.source('Complete')
                    }
                ];

                $scope.filter = {
                    qualificationPeriodEndFrom: '',
                    qualificationPeriodEndTo: '',
                    isProductionMode: true
                };

                $scope.setTranslationForItemStatus = function (itemStatus) {
                    return $scope.statusTraslation.find(function (translation) {
                        return itemStatus === translation.status;
                    });
                };

                $scope.initClassification = function () {
                    classificationSearchService.initClassification($scope, $scope.selectedCpvs);
                };

                $scope.$watch('runRequest', function (run) {
                    if (run) {
                        $scope.tableParams = new ngTableParams(
                            {
                                page: 1,
                                count: 10
                            },
                            {
                            counts: [],
                            getData: function ($defer, params) {
                                abp.ui.setBusy();
                                var urlFilterParams = $location;

                                var url = '/api/services/etender/Framework/GetFrameworks';
                                var requestParameters = {
                                    page: params.page(),
                                    pageSize: 10,
                                };
                                
                                requestParameters = Object.assign(requestParameters, createFilterFromQueryParams());
                                requestParameters.isProductionMode = $scope.filter.isProductionMode;

                                if ($scope.myDealsOnly) {
                                    if ($localStorage.isContractor) {
                                        requestParameters.isMySubmission = true;
                                    } else {
                                        requestParameters.isMyFramework = true;
                                    }
                                }
                                
                                if ($scope.filter.qualificationPeriodEndFrom) {
                                    requestParameters.QualificationPeriodStart = $scope.filter.qualificationPeriodEndFrom;
                                }
        
                                if ($scope.filter.qualificationPeriodEndTo) {
                                    requestParameters.QualificationPeriodEnd = $scope.filter.qualificationPeriodEndTo;
                                }
        
                                if ($scope.checkedStatuses && $scope.checkedStatuses.length) {
                                    requestParameters.statuses = $scope.checkedStatuses.join(';');
                                }
        
                                if ($scope.requestParamsCPV && $scope.requestParamsCPV.length) {
                                    requestParameters.cpvCodes = $scope.requestParamsCPV.join(';');
                                }
                                
                                if (!urlFilterParams.search(requestParameters)) {
                                    urlFilterParams.search(requestParameters);
                                }

                                $http({
                                    method: 'GET',
                                    url: url,
                                    params: requestParameters
                                }).then(function (response) {
                                    abp.ui.clearBusy();
                                    params.total(response.data.result.count);
                                    $scope.totalDealsLength = response.data.result.count;
                                    $defer.resolve(response.data.result);
                                }, function () {
                                    abp.ui.clearBusy();
                                });
                            }
                        });
                    }
                });

                function createFilterFromQueryParams() {
                    var url = $location.url();
                    var filter = {};
                    var queryParams = url.slice(url.indexOf('?') + 1);
                    if (queryParams.indexOf('cpvCodes') > -1) {
                        var querParamClassificationIndex = queryParams.indexOf('cpvCodes=');
                        filter.cpvCodes = queryParams.slice(querParamClassificationIndex + 'cpvCodes='.length);
                    }
                    if (filter.cpvCodes) {
                        $scope.showClearFilterButton = true;
                    }
                    
                    return filter;
                }

                $scope.onMyDealsChange = function () {
                    if ($scope.tableParams.page() === 1) {
                        $scope.tableParams.reload();
                    } else {
                        $scope.tableParams.page(1);
                    }
                };

                $scope.getStatusSearchText = function () {
                    $scope.statusSearchText  = '';
                    $scope.checkedStatuses.forEach(function (status, index) {
                        var translationStatus = $scope.statusTraslation.find(function (translationStatus) {
                            return translationStatus.status === status;
                        });

                        $scope.statusSearchText += index === $scope.checkedStatuses.length - 1 ? translationStatus.translation
                            : translationStatus.translation + ', ';
                    });
                };

                $scope.isDateIntervalGood = function (from, to) {
                    if (from != null && typeof (from) === "object")
                        from = from.toISOString().substring(0, 24);
                    if (to != null && typeof (to) === "object")
                        to = to.toISOString().substring(0, 24);
                    if (from && to) {
                        if (to >= from) return true;
                        else return false;
                    } else return true;
                };

                $scope.closeStatDropDown = function () {
                    $scope.isStatOpen = false;
                };

                $scope.changeSelection = function (st, checked) {
                    if (!st) {
                        $scope.checkedStatuses = [];
                    } else {
                        if (checked) $scope.checkedStatuses.push(st.status);
                        else $scope.checkedStatuses.splice($scope.checkedStatuses.indexOf(st.status), 1);
                    }
                    $scope.getStatusSearchText();
                };

                $scope.checkAllStatuses = function () {
                    var selectedStatusesLength = $scope.selectedStatuses.length;
                    var statusTraslationLength = $scope.statusTraslation.length;
                    $scope.checkedStatuses = [];
                    $scope.selectedStatuses = [];

                    if ($scope.selectedStatuses && selectedStatusesLength !== statusTraslationLength) {
                        $scope.statusTraslation.forEach(function (status) {
                            $scope.checkedStatuses.push(status.status);
                            $scope.selectedStatuses.push(true);
                        });
                    }

                    $scope.getStatusSearchText();
                };

                $scope.searchByFilter = function (needToClearData) {
                    $scope.showClearFilterButton = !needToClearData;

                    if ($scope.tableParams.page() === 1) {
                        $scope.tableParams.reload();
                    } else {
                        $scope.tableParams.page(1);
                    }
                };

                $scope.cleareChildCpv = function (cpvs) {
                    classificationSearchService.cleareChildCpv(cpvs, $scope.selectedCpvs);
                };

                $scope.clearAllFiltersAndTmpl = function () {
                    $('#frameworkListSearch').removeData('.modal-body');
                    $scope.clear();
                    if ($location.absUrl().indexOf('cpvCodes') > -1) {
                        $location.search('cpvCodes', null);
                    }
                    $scope.search(true);
                };

                $scope.clear = function () {
                    $scope.selectedCpvs = [];
                    $scope.checkedStatuses = [];
                    $scope.selectedStatuses = [];
                    $scope.requestParamsCPV = [];
                    $scope.statusSearchText = '';
                    $scope.filter = {
                        qualificationPeriodEndFrom: '',
                        qualificationPeriodEndTo: '',
                        isProductionMode: true
                    };
                    $rootScope.clearCheckbox();
                };

                $scope.hideModal = function () {
                    $("#frameworkListSearch").modal('hide');
                };

                function getChildCpvsAndSearchTenders(needToClearData) {

                    var itemsWithChildren = [];
                    $scope.selectedCpvs.forEach(function (cpvItem) {
                        if (cpvItem.rank < 8 && cpvItem.hasChildren) {
                            itemsWithChildren.push(cpvItem);
                        }
                    });
                    $scope.generateFilterCodes($scope.selectedCpvs);
                    $scope.searchByFilter(needToClearData);
                }

                $scope.search = function (needToClearData) {
                    if ($scope.selectedCpvs && $scope.selectedCpvs.length) {
                        getChildCpvsAndSearchTenders(needToClearData);
                    } else {
                        $scope.searchByFilter(needToClearData);
                    }
                };

                $scope.generateFilterCodes = function (data) {
                    $scope.requestParamsCPV = [];

                    if (data && data.length) {
                        $scope.requestParamsCPV = data.map(function (cpv) {
                            if (cpv.isOpen) {
                                return 'S' + cpv.code;
                            }
                            return cpv.code;
                        });
                    } else {
                        $scope.requestParamsCPV = $scope.selectedCpvs.map(function (cpv) {
                            return cpv.code;
                        });
                    }
                };

                $scope.$on('onCatalogTabChanged', function () {
                    $scope.clear();
                });
            }
        ]
    };
}]);
;
angular.module('app').directive('getPdfForComplaintButton', [
    function () {
        return {
            templateUrl: '/App/Main/base/directives/GetPdfModal/GetPdfForComplaintButton.html',
            restrict: 'AE',
            scope: {
                currentComplaint: '=',
                tender: '='
            },
            controller: [
                '$scope',
                '$ocLazyLoad',
                'abp.services.etender.complaintPayment',
                function (
                    $scope,
                    $ocLazyLoad,
                    complaintPayment
                ) {

                    $scope.id = ~~(Math.random() * 1000);
                    $scope.showPdfModal = function () {
                        $('#getPdfModal-' + $scope.id).modal('toggle');
                    };
                    $('body').on('hide.bs.modal', '#getPdfModal' + $scope.id, function () {
                        $scope.iban = '';
                    });

                    $scope.getDataForInvoice = function (complaint) {
                        if (complaint !== null && complaint !== 'undefined') {
                            complaintPayment.getDataForInvoice($scope.currentComplaint.id).then(
                                function (reponse) {
                                    $scope.generatePdf(reponse.data);
                                },
                                function () { console.log("Error"); });
                        }
                    };

                    $scope.generatePdf = function (data) {
                        $ocLazyLoad.load('Scripts/pdfmake.min.js').then(function () {
                            $ocLazyLoad.load('Scripts/vfs_fonts.js').then(function () {
                                console.log(data);
                                var docDefinition = {
                                    content: [
                                        {
                                            table: {
                                                // headers are automatically repeated if the table spans over multiple pages
                                                // you can declare how many rows should be treated as headers
                                                widths: [150, '*'],
                                                body: [
                                                    [
                                                        {
                                                            text: "Отримувач",
                                                            style: 'tableHeader'
                                                        },
                                                        {
                                                            text: data.owner,
                                                            style: 'tableHeader'
                                                        }
                                                    ],
                                                    [
                                                        {
                                                            text: "ЄДРПОУ",
                                                            style: 'tableHeader'
                                                        },
                                                        {
                                                            text: data.edrpou,
                                                            style: 'tableHeader'
                                                        }
                                                    ],
                                                    [
                                                        {
                                                            text: "IBAN",
                                                            style: 'tableHeader'
                                                        },
                                                        {
                                                            text: data.iban,
                                                            style: 'tableHeader'
                                                        }
                                                    ],
                                                    [
                                                        {
                                                            text: "",
                                                            style: 'tableHeader'
                                                        },
                                                        {
                                                            text: "Київська фiлiя АТ КБ «ПРИВАТБАНК»",
                                                            style: 'tableHeader'
                                                        }
                                                    ],
                                                    [
                                                        {
                                                            text: "Сума",
                                                            style: 'tableHeader'
                                                        },
                                                        {
                                                            text: data.sum,
                                                            style: 'tableHeader'
                                                        }
                                                    ],
                                                    [
                                                        {
                                                            text: "Призначення платежу",
                                                            style: 'tableHeader'
                                                        },
                                                        {
                                                            text: data.description + '\n' + $scope.iban,
                                                            style: 'tableHeader'
                                                        }
                                                    ]
                                                ]
                                            }
                                        }
                                    ],
                                    footer: [
                                        [
                                            {
                                                text: "Увага!" + '\n' + "Під  час  формування  платіжного  документа  необхідно  зазначити  всю  інформацію,  що міститься в шаблоні платіжного документа." + "\n" + "Будь ласка, уважно заповнюйте суму та призначення платежу, не змінюйте їх та переконайтесь у правильному наборі всіх символів, пробілів тощо." + "\n" + "У разі невідповідності введеної інформації або суми транзакції такий платіж не зараховується як плата за скаргу.",
                                                bold: true,
                                                margin: [50, -580, 50, 50]
                                            }
                                        ]
                                    ]
                                };

                                pdfMake.createPdf(docDefinition).download('Invoice.pdf');
                            });
                        });
                    };
                }
            ]
        }
    }
]);
angular.module('app').directive('tenderLogs', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/import/tenderLogs.html',
        scope: {
            apiId: '=',
            showTenderLogs: '='
        },
        controller: [
            '$scope',
            '$rootScope',
            '$http',
            'ngTableParams',
            'abp.services.etender.systemInfo',
            function ($scope, $rootScope, $http, ngTableParams, systemInfo) {
                
                $scope.tableParams = new ngTableParams({
                    page: 1,
                    count: 30,
                }, {
                    counts: [],
                    getData: function ($defer, params) {
                        var orderBy = params.orderBy();
                        var sorting = params.sorting();
                        var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'Date';
                        var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'DESC';

                        var pager = {
                            Page: params.page(),
                            PageSize: params.count(),
                            maxResultCount: params.count(),
                            skipCount: (params.page() - 1) * params.count(),
                            sorting: orderColumn + ' ' + orderDirection

                        };
                        if ($scope.showTenderLogs && $scope.apiId) {
                            abp.ui.setBusy(".panel-body:last");
                            systemInfo.getTenderLogs($scope.apiId, pager)
                            .then(function (reponse) {
                                params.total(reponse.data.totalCount);
                                $scope.logs = reponse.data.items;
                                $defer.resolve(reponse.data.items);
                                abp.ui.clearBusy(".panel-body");
                            }, function (data) {
                                abp.ui.clearBusy(".panel-body");
                            });
                        }
                    }
                });
                
                $scope.$watch("showTenderLogs", function () {
                    if ($scope.showTenderLogs && $scope.apiId) {
                        $scope.tableParams.page(1);
                        $scope.tableParams.reload();
                    }
                });
            }]
    }
});;
angular.module('app').directive('marketBreadcrumbs', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('marketBreadcrumbs from cache'),
            scope: {
                categoryPath: '='
            },
            controller: [
                '$scope',
                '$localStorage',
                '$window',
                '$location',
                function ($scope, $localStorage, $window, $location) {
                    $scope.ng_localStorage = $localStorage;

                    $scope.navigateToGoogleForm = function () {
                        $window.open('https://docs.google.com/forms/d/e/1FAIpQLSe0Os4_1TqUJ5O4KiJCzInXgPR4M-zyebH8vQqv4_sPv4WTqg/viewform', '_blank');
                    };

                    $scope.$watch(function () {
                        return $location.url();
                    }, function (url) {
                        $scope.catalogProfile = url.indexOf('/eCatalogOffers/') !== -1;
                    })

                    $scope.clearAllNotDefaultValues = function () {
                        if (!$window.location.href.indexOf('/ProzorroMarket')) return;

                        $scope.$emit('clearMarketValues');
                    }

                    $window.onscroll = function () {
                        var pageYOffset = $window.pageYOffset;
                        pageYOffset > 1 ? $(".breadcrumbs_block").addClass("resizeBreadcrumbs") 
                                        : $(".breadcrumbs_block").removeClass("resizeBreadcrumbs");
                    }
                }
            ]
        }
    }
]);;
angular.module('app').directive('marketModalEditItem', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/directives/marketModalEditItem/marketModalEditItem.html',
        scope: {
            editFor: '=',
            priceOptions: '=',
            isPriceValid: '=',
            changeItem: '=',
            status: '='
        }
    }
});
angular.module('app').directive('myDealsProzorroMarket', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/directives/marketMyDeals/myDealsProzorroMarket.html',
        scope: {
            table: '=',
            titles: '=',
            clear: '=',
            isShowClear: '='
        },
        controller: [
            '$scope',
            '$location',
            function ($scope, $location) {

                $scope.selectedAll = false;
                $scope.selectAllDeals = function () {
                    if (!$scope.selectedAll) {
                        $scope.selectedAll = true;
                    } else {
                        $scope.selectedAll = false;
                    }
                    angular.forEach($scope.table.data.result, function (item) {
                        item.Selected = $scope.selectedAll;
                    });
                };
            }
        ]
    }
});
angular.module('app').directive('marketQualification', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('marketQualification from cache'),
            scope: {
                agreement: '=',
                procuringEntity: '=',
                qualStatus: '='
            },
            controller: [
                '$scope',
                'organizationDataService',
                function ($scope, organizationDataService) {
                    console.log($scope);

                    var TITLE_LOCALE = {
                        'status': 'Статус реєстру',
                        'agreementId': 'Номер кваліфікованого списку постачальників',
                        'period': 'Період дії реєстру',
                        'nextCheck': 'Дата наступних змін',
                        'dateModified': 'Дата змін',
                        'country': 'Країна реєстрації',
                        'name': 'Назва організації',
                        'legalName': 'Повна назва юридичної організіції',
                        'address': 'Місцезнаходження',
                        'yourStatus': 'Ваш статус в реєстрі постачальників'
                    };

                    var STATUS_LOCALE = {
                        'active': 'Активний',
                        'terminated': 'Неактивний',
                        'awaitingDecision': 'Очікує рішення',
                        'qualifiedSupplier': 'Кваліфікований постачальник',
                        'disqualifiedSupplier': 'Дискваліфікований постачальник',
                        'bannedSupplier': 'Забанений постачальник'
                    }

                    $scope.getTitleTranslation = function (name) {
                        return TITLE_LOCALE[name] ? TITLE_LOCALE[name] : name;
                    }
                    $scope.getStatusTranslation = function (status) {
                        return STATUS_LOCALE[status] ? STATUS_LOCALE[status] : status;
                    }

                    $scope.getOrganizationToolTipText = function (organization) {
                        return organizationDataService.getOrganizationToolTipText(organization, true);
                    }
                }
            ]
        }
    }
]);
angular.module("app").directive('myOrdersProzorroMarket', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            scope: {
                firstRun: '='
            },
            template: $templateCache.get('myOrders from cache'),
            controller: [
                '$scope',
                'ngTableParams',
                'abp.services.etender.tender',
                '$rootScope',
                'numberOfRecordsIframe',
                'numberOfRecords',
                function ($scope, ngTableParams, tender, $rootScope, numberOfRecordsIframe, numberOfRecords) {
                    $scope.vm = {};
                    $scope.filter = {};

                    $scope.$watch('firstRun', function (run) {
                       if (run) {
                            getMyOrders();
                       } 
                    });
                    
                    if (!$scope.defaultSorting) {
                        $scope.defaultSorting = { '': 'desc' };
                    }

                    function getMyOrders() {
                        $scope.vm.tableParams = new ngTableParams({
                            page: 1,
                            count: $rootScope.isIframe ? numberOfRecordsIframe : numberOfRecords,
                            sorting: $scope.defaultSorting
                        }, {
                            total: 0,
                            counts: [],
                            getData: getData
                        });
                    }

                    function setPagerForTenderList(orderColumn, orderDirection, params) {
                        var pager = {
                            Page: params.page(),
                            PageSize: 10,
                            OrderColumn: orderColumn,
                            OrderDirection: orderDirection,
                            SearchFilter: $scope.filter
                        };
                        return pager;
                    }
                    function getData($defer, params) {
                        abp.ui.setBusy('body');
                        var orderBy = params.orderBy(); // add '-' on start str
                        var sorting = params.sorting();
                        var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'tenderStartDate';
                        var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
                        
                        var pager = null;
                        setTimeout(function () {
                            pager = setPagerForTenderList(orderColumn, orderDirection, params);
    
                            tender.getMyOrders(pager).then(function (response) {
                                var data = response.data;
                                $scope.tenders = data;
                                params.total(data.countAllRecords);
                                $defer.resolve(data.tender);
                            }).finally(function () {
                                abp.ui.clearBusy('body');
                            });
                            
                        }, 0);
                    }

                    $scope.$on('filterChange', function (evt, filter) {
                        $scope.filter = filter;
                    });
                    $scope.$on('cpvsList', function (evt, cpvList) {
                        $scope.filter.Cpvs = cpvList;
                    });
                }
            ]
        };
    }
]);;
angular.module('app').component('answerToRequestForCpbProcedure', {
    templateUrl: '/App/Main/base/directives/plans/answerToRequestForCpbProcedure.html',
    bindings: {
        plan: '<'
    },
    controllerAs: 'ctrl',
    controller: [
        'abp.services.etender.plan',
        '$rootScope',
        '$location',
        '$scope',
        function (
            planAppService,
            $rootScope,
            $location,
            $scope
        ) {

            var ctrl = this;
            ctrl.dateRegex = $rootScope.regex.date;

            ctrl.submit = function () {

                planAppService.addMilestone({
                    planId: ctrl.plan.id,
                    description: ctrl.description,
                    dueDate: ctrl.dueDate
                }).then(function (response) {
                    ctrl.description = null;
                    ctrl.dueDate = null;
                    $('#responseToRequestForCpbProcedure').modal('hide');
                    abp.notify.success("Відповідь надіслано");
                    $scope.$parent.getPlan && $scope.$parent.getPlan();
                }, function (error) {
                    console.log(error);
                });
            }

        }]
});;
angular.module('app').component('editAnswerToRequestForCpbProcedure', {
    templateUrl: '/App/Main/base/directives/plans/editAnswerToRequestForCpbProcedure.html',
    bindings: {
        plan: '<',
        milestonescheduled: '<',
        statusfordropdown: '<',
        selectedStatus: '=',
        milestone: '=',
        milestoneDropdownStatus: '=',
    },
    controllerAs: 'ctrl',
    controller: [
        'abp.services.etender.plan',
        '$rootScope',
        '$location',
        '$scope',
        function (
            planAppService,
            $rootScope,
            $location,
            $scope
        ) {

            var ctrl = this;
            ctrl.dateRegex = $rootScope.regex.date;
            ctrl.dateField = false;
            ctrl.statusField = false;
            ctrl.savedDate = null;
            $('#editToRequestForCpbProcedure').on('shown.bs.modal', function () {
                if (ctrl.milestonescheduled) {
                    ctrl.a = ctrl.milestonescheduled.dueDate;
                }
                $scope.milestoneStatus = ctrl.milestone;
                for (var i = 0; i < ctrl.statusfordropdown.length; i++) {
                    if (ctrl.selectedStatus == ctrl.statusfordropdown[i].name) {
                        $scope.selectedStatus = ctrl.statusfordropdown[i];
                        break;
                    }
                }
                ctrl.fieldChanges = function (whichField) {
                    if (whichField != ctrl.milestonescheduled.dueDate) {
                        ctrl.dateField = true;
                    } else {
                        ctrl.statusField = true;
                    }
                }
            });

            $('#editToRequestForCpbProcedure').on('hide.bs.modal', function () {
                //ctrl.dateField = false;
                ctrl.statusField = false;
                if (ctrl.milestonescheduled) {
                    ctrl.milestonescheduled.dueDate = ctrl.a;
                }
            });

            ctrl.submit = function () {
                planAppService.updateMilestone({
                    planId: ctrl.plan.id,
                    description: ctrl.milestonescheduled.description,
                    dueDate: ctrl.milestonescheduled.dueDate,
                    statusValue: selectedStatus.value
                }).then(function (response) {
                    $('#editToRequestForCpbProcedure').modal('hide');
                    abp.notify.success("Відповідь надіслано");
                    if (ctrl.dateField) $scope.$parent.signMilestone(ctrl.milestonescheduled);
                    $scope.$parent.getPlan && $scope.$parent.getPlan();
                    ctrl.dateField = false;
                }, function (error) {
                    $('#editToRequestForCpbProcedure').modal('hide');
                        console.log(error);
                        ctrl.dateField = false;
                });
            }
            

        }]
});;
angular.module('app').component('operatorPlanFeatures', {
    templateUrl: '/App/Main/base/directives/plans/operatorPlanFeatures.html',
    bindings: {
        plan: '<'
    },
    controllerAs: 'ctrl',
    controller: [
        'abp.services.etender.plan',
        '$rootScope',
        '$location',
        '$scope',
        function (
            planAppService,
            $rootScope,
            $location,
            $scope
        ) {

            var ctrl = this;
            ctrl.elasticIndex = abp.setting.get('ElasticPlansIndex');

            $scope.toElastic = function() {
                planAppService.toElastic(ctrl.plan.id).then(
                    function (response) {
                        abp.notify.success("Готово");
                    }
                );
            }
        }]
});
;
angular.module('app').component('planCancellationProcedure', {
    templateUrl: '~/App/Main/base/directives/plans/planCancellationProcedure.html',
    bindings: {
        planData: '='
    },
    controllerAs: 'ctrl',
    controller: ['abp.services.etender.plan',
        function (planAppService) {

            var ctrl = this;

            this.showStartDialog = function () {
                $('#startPlanCancelationProcedureDialog').modal('toggle');
            };

            this.startCancellation = function () {
                abp.ui.setBusy();
                planAppService.createPlanCancellation({
                    planId: ctrl.planData.id,
                    reason: ctrl.reason
                }).then(
                    function (resposne) {                        
                        $('#startPlanCancelationProcedureDialog').modal('toggle');
                        abp.ui.clearBusy();                        
                        abp.notify.success('Скасування плану створено');
                        ctrl.planData.cancellation = resposne.data;
                        ctrl.showContinueDialog();
                    },
                    function (error) {
                        console.log(error);
                        $('#startPlanCancelationProcedureDialog').modal('toggle');
                        abp.ui.clearBusy();                        
                    }
                );
            };

            this.showContinueDialog = function () {
                $('#continuePlanCancelationProcedureDialog').modal('toggle');
            };

            this.continueCancellation = function () {
                abp.ui.setBusy();
                planAppService
                    .activatePlanCancellation(ctrl.planData.id)
                    .then(
                        function (resposne) {
                            $('#continuePlanCancelationProcedureDialog').modal('toggle');
                            abp.ui.clearBusy();
                            abp.notify.success('Скасування плану підтверджено');

                            ctrl.planData.status = resposne.data.status;
                            ctrl.planData.cancellation = resposne.data.cancellation;
                        },
                        function (error) {
                            console.log(error);
                            $('#continuePlanCancelationProcedureDialog').modal('toggle');
                            abp.ui.clearBusy();
                        }
                    );
            };
        }]
});;
angular.module('app')
    .directive('planForm', ['$templateCache', function ($templateCache) {
        return {
            restrict: 'AE',
            //templateUrl: '/App/Main/base/directives/plans/planForm.html',
            template: $templateCache.get('planForm from cache'),
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                updatePlan: '=',
                createPlan: '=',
                procuringEntity: '<'
            },
            controller: [
                '$rootScope',
                '$scope',
                '$localStorage',
                '$modal',
                'abp.services.etender.organization',
                'organizationDataService',
                'referenceService',
                function (
                    $rootScope,
                    $scope,
                    $localStorage,
                    $modal,
                    organizationAppService,
                    organizationDataService,
                    referenceService) {

                    //$scope.procuringEntity = null;
                    $scope.ng_localStorage = $localStorage;
                    $scope.wordRegex = $rootScope.regex.word;
                    $scope.wordAnyLanguageRegex = $rootScope.regex.wordAnyLanguage;
                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.organisationNameRegex = $rootScope.regex.organisationName;
                    $scope.regexTenderName = $rootScope.regex.tenderName;
                    $scope.regexDate = $rootScope.regex.date;
                    $scope.dateTodey = new Date();
                    $scope.firstDateOfCurrentMonth = new Date(new Date().getFullYear(), new Date().getMonth(), 1);
                    $scope.startDateMonths = moment.months();
                    $scope.isRequired = true;
                    $scope.startYears = setStartYears();
                    $scope.endYears = setStartYears();

                    //Костыль для возможности выбрать предыдущий месяц
                    $scope.isPreviousMonthCanBeSelected = moment().subtract(7, 'days').startOf('month');

                    function setStartYears() {
                        var years = [];
                        for (var i = (new Date()).getFullYear() - 2; i < 2050; i++) {
                            years.push(i);
                        }
                        return years;
                    }

                    $scope.setEndYears = function () {
                        $scope.endYears = [];
                        for (var i = $scope.data.projectBudget.period.startDate; i < $scope.data.projectBudget.period.startDate + 5; i++) {
                            $scope.endYears.push(i);
                        }
                    }

                    $scope.validBudgetEndDate = function (data, formName) {
                        if (!data || !data.projectBudget) return;
                        if (!data.projectBudget.period || !data.projectBudget.period.startDate) return inputValid(formName);
                        if (!data.projectBudget.period.endDate) return inputNotValid(formName);

                        var startDate = data.projectBudget.period.startDate;
                        var endDate = data.projectBudget.period.endDate;

                        if (data.procurementMethodType === 'closeFrameworkAgreementUA') {
                            if (endDate && startDate <= endDate && (endDate - startDate <= 5)) return inputValid(formName);
                            return inputNotValid(formName);
                        } else {
                            if (data.projectBudget.period.startDate === data.projectBudget.period.endDate) return inputValid(formName);
                            return inputNotValid(formName);
                        }
                    }


                    function fillProcedureTypesEnabling() {
                        // доступность типов процедур в зависимости от Типа Заказчика
                        angular.forEach(vm.procedureTypes, function (type) {

                            var A = $scope.ng_localStorage.organizationKindId == 1; // general
                            var B = $scope.ng_localStorage.organizationKindId == 3; // special
                            var C = $scope.ng_localStorage.organizationKindId == 2; // defense
                            var D = $scope.ng_localStorage.organizationKindId == 4; // other
                            var E = $scope.ng_localStorage.organizationKindId == 5; // central

                            type.isEnabled = true;

                            if (type.procurementMethodTypes === "simple.defense"  ) {
                                if (A || B) {
                                    type.isEnabled = false;
                                }
                            }
                        });
                    }

                    $scope.$watch('ng_localStorage.organizationKindId', function () {
                        // onchange of status in controller 1
                        fillProcedureTypesEnabling();
                    });

                    function inputNotValid(formName) {
                        formName.$setValidity("setData", false);
                        return false;
                    }

                    function inputValid(formName) {
                        formName.$setValidity("setData", true);
                        return true;
                    }

                    $scope.isDeliveryDateRight = function (lastDate, firstDate) {
                        if ($scope.updatePlan) return true;
                        var isValid = false;
                        if (firstDate === undefined || !firstDate) firstDate = (new Date()).toISOString();
                        else if (typeof (firstDate) === "object") firstDate = firstDate.toISOString();


                        if (lastDate === undefined || !lastDate) lastDate = (new Date()).toISOString();
                        else if (typeof (lastDate) === "object") lastDate = lastDate.toISOString();

                        (lastDate >= firstDate) ?
                            (isValid = true) :
                            (isValid = false);
                        return isValid;
                    };

                    $scope.isClassificationEditable = function (item) {
                        return false; //disable classification edit
                        if (!item || !item.classification || (!item.classification.code && !item.classification.id)) return false;
                        var classificationCode = item.classification.code ? item.classification.code : item.classification.id;
                        return classificationCode.lastIndexOf('336', 0) === 0;
                    };

                    $scope.openClassificationModal = function (itemIndex) {
                        $scope.itemInd = itemIndex;
                        $('#planClassification').modal('toggle');
                    };

                    $scope.openAddClassificationModal = function (itemIndex, classificatorIndex) {
                        $scope.itemInd = itemIndex;
                        $scope.addClassificatorIndex = classificatorIndex;
                        $('#planAddClassification').modal('toggle');
                    };

                    $scope.addAdditionalClassification = function (parentIndex) {
                        $scope.data.additionalClassifications.push({});
                    };

                    $scope.removeAdditionalClassification = function (index) {
                        $scope.data.additionalClassifications.splice(index, 1);
                    };

                    $scope.getIndex = function (index) {
                        $scope.classificatorIndex = index;
                    };

                    $scope.addItem = function () {
                        var length = $scope.data.items.length;
                        var newClassificationObj = length > 0 ? $scope.data.items[length - 1].classification : $scope.data.classification;
                        var newClassification = newClassificationObj.code ?
                            { code: newClassificationObj.code, description: newClassificationObj.description, id: newClassificationObj.id }
                            :
                            { id: newClassificationObj.id, description: newClassificationObj.description }

                        $scope.data.items[length] = {
                            description: null,
                            quantity: null,
                            classification: newClassification,
                            additionalClassifications: [],
                            classificationId: null,
                            classificationDescription: null,
                            additionalClassificationIds: [],
                            deliveryDate: {
                                startDate: null,
                                endDate: null
                            }
                        };
                        $scope.data.items[length].additionalClassifications.push({});
                        //$scope.addAdditionalClassification(length);
                    };

                    $scope.removeItem = function (index) {
                        $scope.data.items.splice(index, 1);
                    };

                    $scope.isValidMonth = function (formName) {
                        if (!$scope.data) return;
                        var startDate = new Date($scope.data.startDateYear, $scope.data.startDateMonth - 1, 1);
                        var dateToCompare = new Date(new Date().getFullYear(), new Date().getMonth(), 1);
                        formName.$setValidity("startDateMonth", startDate >= dateToCompare);
                        return startDate >= dateToCompare;
                    };

                    var belowThreshold = {
                        title: $rootScope.source('BelowThreshold'),
                        procurementMethodTypes: 'belowThreshold',
                        procurementMethod: 'open'
                    };

                    var aboveThresholdUA = {
                        title: $rootScope.source('OpenMarket'),
                        procurementMethodTypes: 'aboveThresholdUA',
                        procurementMethod: 'open'
                    };

                    var aboveThresholdEU = {
                        title: $rootScope.source('OpenMarketEU'),
                        procurementMethodTypes: 'aboveThresholdEU',
                        procurementMethod: 'open'
                    };

                    var limitedReporting = {
                        title: $rootScope.source('Reporting'),
                        procurementMethodTypes: 'reporting',
                        procurementMethod: 'limited'
                    };

                    var limitedNegotiation = {
                        title: $rootScope.source('Negotiation'),
                        procurementMethodTypes: 'negotiation',
                        procurementMethod: 'limited'
                    };

                    var limitedNegotiationQuick = {
                        title: $rootScope.source('NegotiationQuick'),
                        procurementMethodTypes: 'negotiation.quick',
                        procurementMethod: 'limited'
                    };

                    var simpleDefense = {
                        title: $rootScope.source('SimpleDefense'),
                        procurementMethodTypes: 'simple.defense',
                        procurementMethod: 'open'
                    };

                    var dialogue = {
                        title: $rootScope.source('Dialogue'),
                        procurementMethodTypes: 'competitiveDialogueUA',
                        procurementMethod: 'open'
                    };

                    var dialogueEU = {
                        title: $rootScope.source('DialogueEU'),
                        procurementMethodTypes: 'competitiveDialogueEU',
                        procurementMethod: 'open'
                    };

                    var esco = {
                        title: $rootScope.source('Esco'),
                        procurementMethodTypes: 'esco',
                        procurementMethod: 'open'
                    }

                    var closeFrameworkAgreementUA = {
                        title: $rootScope.source('closeFrameworkAgreementUA'),
                        procurementMethodTypes: 'closeFrameworkAgreementUA',
                        procurementMethod: 'open'
                    }
                    

                    var centralizedProcurement = {
                        title: $rootScope.source('ProcurementThroughCentralizedPurchasingOrganization'),
                        procurementMethodTypes: 'centralizedProcurement',
                        procurementMethod: null
                    };

                    var priceQuotation = {
                        title: $rootScope.source('priceQuotation'),
                        procurementMethodTypes: 'priceQuotation',
                        procurementMethod: 'selective'
                    };

                    $scope.vm = {
                        changeProcedureType: changeProcedureType,
                        openKekvModal: openKekvModal,
                        sProcedureType: null,
                        cpb: null,
                        procedureTypes: [
                            belowThreshold,
                            aboveThresholdUA,
                            aboveThresholdEU,
                            limitedReporting,
                            limitedNegotiation,
                            limitedNegotiationQuick,
                            simpleDefense,
                            closeFrameworkAgreementUA,
                            dialogue,
                            dialogueEU,
                            esco,
                            centralizedProcurement,
                            priceQuotation
                        ],
                    };
                    if ($localStorage.organizationKindId === 4) {
                        $scope.vm.procedureTypes = [
                            belowThreshold,
                            limitedReporting,
                            priceQuotation
                        ]
                    }
                    var vm = $scope.vm;

                    var getRegion = referenceService.getRegionsByCountryId({ countryId: 1 });
                    getRegion.then(function (reponse) {
                        $scope.regions = reponse.data.regions;
                    });

                    organizationDataService.getOrganizationKinds($localStorage.codeOfOrganization, true).then(function (kinds) {
                        $scope.kinds = kinds;
                    });
                    var isLastProcedureTypeWasCpb = false;
                    function changeProcedureType() {

                        if ($scope.data.procurementMethodType === 'centralizedProcurement' && vm.sProcedureType.procurementMethodTypes !== 'centralizedProcurement') {
                            if ($scope.data.tenderPeriodStartDate) {
                                var date = new Date($scope.data.tenderPeriodStartDate);
                                date.setDate(1);
                                $scope.data.tenderPeriodStartDate = date;
                            }
                        }

                        $scope.data.procurementMethod = vm.sProcedureType.procurementMethod;
                        $scope.data.procurementMethodType = vm.sProcedureType.procurementMethodTypes;

                        if ($scope.data.procurementMethodType === 'centralizedProcurement') {
                            if (!$scope.data.items || !$scope.data.items.length) {
                                $scope.addItem();
                            }
                            isLastProcedureTypeWasCpb = true;
                            $scope.data.newProcuringEntity = false;

                            organizationAppService.getAuthorizedCpbs().then(function (response) {
                                $scope.cpbs = response.data;
                                $scope.data.procuringEntity.identifier = {
                                    apiId: null
                                };
                                $scope.data.procuringEntity.address = { countryName: $scope.data.procuringEntity.address.countryName  };   
                                $scope.data.procuringEntity.name = null;
                                $scope.data.procuringEntity.nameEn = null;
                                $scope.data.procuringEntity.kind = { name: 'central' };
                            });
                            $scope.vm.cpb = null;
                        } else {
                            $scope.cpbs = null;
                            if (isLastProcedureTypeWasCpb) {
                                (function () {
                                    abp.ui.setBusy();
                                    organizationDataService.getData().then(
                                        function (response) {
                                            $scope.data.procuringEntity = {
                                                identifier: {
                                                    apiId: response.data.codeOfOrganization
                                                },
                                                name: response.data.name,
                                                nameEn: response.data.nameEN,
                                                address: {
                                                    streetAddress: response.data.address.addressStr,
                                                    locality: response.data.address.city.title,
                                                    countryName: response.data.address.country.title,
                                                    postalCode: response.data.address.postIndex,
                                                    region: response.data.address.region.title 
                                                },
                                                kind: response.data.kind
                                            };
                                            if ($scope.data.buyers && $scope.data.buyers.length) $scope.data.buyers[0].kind = response.data.kind;
                                            abp.ui.clearBusy();
                                        },
                                        function (err) {
                                            abp.ui.clearBusy();
                                            console.log(err);
                                        }
                                    );
                                })();
                            }
                            isLastProcedureTypeWasCpb = false;
                        }
                    }

                    function updateCpb() {
                        if (!$scope.data) {
                            setTimeout(updateCpb, 1000);
                            return;
                        }
                        if ($scope.data.procurementMethodType === 'centralizedProcurement') {
                            organizationAppService.getAuthorizedCpbs().then(function (response) {
                                $scope.cpbs = response.data;
                                $scope.data.newProcuringEntity = false;
                                $scope.cpbs.forEach(function (cpb) {
                                    if (cpb.identifierApiId === $scope.data.procuringEntity.identifier.apiId) {
                                        $scope.vm.cpb = cpb;
                                    }
                                });
                            });
                        }
                    }
                    updateCpb();

                $scope.cpbOnChange = function () {
                    var cpb = $scope.vm.cpb;
                    if ($scope.cpbs && cpb) {
                        if (!$scope.data.procuringEntity) {
                            $scope.data.procuringEntity = {
                                identifier: {}
                            };
                        }
                        $scope.data.procuringEntity.identifier.apiId = cpb.identifierApiId;
                        $scope.data.procuringEntity.name = cpb.legalNameUk;
                        $scope.data.procuringEntity.nameEn = cpb.legalNameEn;
                        $scope.data.procuringEntity.address = cpb.address;
                    }
                };

                $scope.canRemoveItem = function (index) {
                    if ($scope.data.procurementMethodType === 'centralizedProcurement' && index === 0) {
                        return false;
                    } else {
                        return true;
                    }
                }

                function openKekvModal(ind) {
                    $scope.kekvInd = ind;
                    $('#kekv').modal('toggle');
                }


                $scope.setProcedureType = function (procurementMethodType) {
                    switch (procurementMethodType) {
                        case 'belowThreshold':
                            vm.sProcedureType = belowThreshold;
                            break;
                        case 'aboveThresholdUA':
                            vm.sProcedureType = aboveThresholdUA;
                            break;
                        case 'aboveThresholdEU':
                            vm.sProcedureType = aboveThresholdEU;
                            break;
                        case 'reporting':
                            vm.sProcedureType = limitedReporting;
                            break;
                        case 'negotiation':
                            vm.sProcedureType = limitedNegotiation;
                            break;
                        case 'negotiation.quick':
                            vm.sProcedureType = limitedNegotiationQuick;
                            break;
                        case 'simple.defense':
                            vm.sProcedureType = simpleDefense;
                            break;
                        case 'competitiveDialogueUA':
                            vm.sProcedureType = dialogue;
                            break;
                        case 'competitiveDialogueEU':
                            vm.sProcedureType = dialogueEU;
                            break;
                        case 'esco':
                            vm.sProcedureType = esco;
                            break;
                        case 'closeFrameworkAgreementUA':
                            vm.sProcedureType = closeFrameworkAgreementUA;
                            break;
                        case 'centralizedProcurement':
                            vm.sProcedureType = centralizedProcurement;
                            break;
                        case 'priceQuotation':
                            vm.sProcedureType = priceQuotation;
                            break;
                    }
                }

                activate();

                function activate() {

                    $scope.$watch("data",
                        function (n, o) {
                            if (!n) return;
                            //console.log(n);
                            //console.log(n.url);
                            $scope.setProcedureType(n.procurementMethodType);
                            isLastProcedureTypeWasCpb = n.procurementMethodType === 'centralizedProcurement';
                        });
                }

                $scope.showAddClassificationInn = function (lotInd, itemInd) {
                    $scope.lotInd = lotInd;
                    $scope.itemInd = itemInd;
                    $modal({
                        show: true,
                        controller: 'additionalClassificationInnCtrl',
                        templateUrl: '/Special/views/tenders/additionalClassification.html',
                        title: 'МНН',
                        scope: $scope
                    });
                };

                $scope.showAddClassificationAtc = function (lotInd, itemInd) {
                    $scope.lotInd = lotInd;
                    $scope.itemInd = itemInd;
                    $modal({
                        show: true,
                        controller: 'additionalClassificationAtcCtrl',
                        templateUrl: '/Special/views/tenders/additionalClassification.html',
                        title: 'АТХ',
                        scope: $scope
                    });
                };

                $scope.showAdditionalClassifications = function (classifi, data) {

                    if (classifi == null)
                        return;

                    var code;


                    if (classifi.code) {
                        code = classifi.code.substring(0, 3);
                    }
                    else if (classifi.id && typeof classifi.id === 'string') {
                        code = classifi.id.substring(0, 3);
                    }
                    else { return false; }

                    if (code === '336') {
                        $scope.setAdditionalclassification(data);
                        return true;
                    } else {
                        if (data.additionalClassificationInn)
                            delete data.additionalClassificationInn;
                        if (data.additionalClassificationAtc)
                            delete data.additionalClassificationAtc;
                    };
                    return false;
                };

                $scope.setAdditionalclassification = function (data) {
                    var i = 0;
                    for (i; i < data.additionalClassifications.length; i++) {
                        if (data.additionalClassifications[i].scheme &&
                            data.additionalClassifications[i].scheme === 'INN') {
                            data.additionalClassificationInn = angular.copy(data.additionalClassifications[i]);
                            data.additionalClassifications.splice(i, 1);
                        } else if (
                            data.additionalClassifications[i].scheme &&
                            data.additionalClassifications[i].scheme === 'ATC') {
                            data.additionalClassificationAtc = data.additionalClassifications[i];
                            data.additionalClassifications.splice(i, 1);
                        }
                    }
                }

                $scope.newProcuringEntityOnChange = function () {
                    if ($scope.data.newProcuringEntity)
                        $scope.data.procuringEntity = {
                            address: { countryName: $scope.data.procuringEntity.address.countryName }
                        };
                    else
                        $scope.data.procuringEntity = JSON.parse(JSON.stringify($scope.procuringEntity));
                }

                $scope.searchByEdrpou = function () {
                    abp.ui.setBusy();
                    organizationAppService.getOrganizationInfoForFillAward({ innOrEdrpou: $scope.data.procuringEntity.identifier.apiId })
                        .then(function (response) {
                            $scope.data.procuringEntity.name = response.data.organizationName;
                            $scope.data.procuringEntity.nameEn = response.data.organizationNameEn;
                            $scope.data.procuringEntity.address.region = response.data.regionTitle;
                            $scope.data.procuringEntity.address.locality = response.data.cityTitle;
                            $scope.data.procuringEntity.address.streetAddress = response.data.addressStr;
                            $scope.data.procuringEntity.address.postalCode = response.data.postIndex;
                            abp.ui.clearBusy();
                        },
                        function (err) {
                            abp.ui.clearBusy();
                        }
                    );                    
                }

                $scope.makeMeCustomer = function () {
                    abp.ui.setBusy();
                    organizationDataService.getData().then(
                        function (response) {
                            $scope.data.buyers =
                            [
                                {
                                    identifier: {
                                        apiId: ""
                                    },
                                    address: {
                                        streetAddress: "",
                                        locality: "",
                                        countryName: "",
                                        postalCode: "",
                                        region: ""
                                    },
                                    kind: null,
                                    name: ""
                                }
                            ];

                            $scope.data.buyers[0].identifier = {
                                apiId: response.data.codeOfOrganization
                            };
                            $scope.data.buyers[0].name = response.data.name;
                            $scope.data.buyers[0].address = {
                                streetAddress: response.data.address.addressStr,
                                locality: response.data.address.city.title,
                                countryName: response.data.address.country.title,
                                postalCode: response.data.address.postIndex,
                                region: response.data.address.region.title
                            };
                            $scope.data.buyers[0].kind = response.data.kind;
                            abp.ui.clearBusy();
                        },
                        function (err) {
                            abp.ui.clearBusy();
                            console.log(err);
                        }
                    );
                };

                    $scope.breakdownTitles = [];
                    referenceService.getProjectBudgetBreakdownType().then(function (response) {
                        if (response.data && response.data.length) {
                            $scope.breakdownTitles = response.data.map(function (title) {
                                return {
                                    title: title.name,
                                    value: title.value,
                                    id: title.id
                                };
                            });
                        }
                    });

                    $scope.breakdwonValueChagned = function (breakDownIndex) {
                        var currentBreakDown = $scope.data.projectBudget.breakdown[breakDownIndex];
                        if (!currentBreakDown) {
                            return;
                        }
                        $scope.data.projectBudget.breakdown.forEach(function (breakdown) {
                            breakdown.value.amout = currentBreakDown.value.amout;
                        });
                    };

                    $scope.validateBreakdownAmount = function () {
                        if (!$scope.vm.sProcedureType) {
                            return true;
                        }
                        if ($scope.vm.sProcedureType.procurementMethodTypes == 'esco')
                            return true;

                        var breakDownAmountSum = $scope.data.projectBudget.breakdown.reduce(function (acc, breakdown) {
                            return breakdown.value.amount !== undefined ? (+ acc + breakdown.value.amount).toFixed(2) : acc;
                        }, 0);

                        if (breakDownAmountSum > $scope.data.projectBudget.amount) {
                            return false;
                        } else {
                            return true;
                        }
                    };


                $scope.removeBreakdown = function (index) {
                    $scope.data.projectBudget.breakdown.splice(index, 1);
                };

                $scope.addBreakdown = function () {
                    $scope.data.projectBudget.breakdown.push({
                        value: {}
                    });
                };

                    $scope.shouldValidateBreakDown = function () {
                        if (!$scope.vm.sProcedureType) {
                            return false;
                        }
                        if ($scope.vm.sProcedureType.procurementMethodTypes === 'belowThreshold' ||
                            ($scope.vm.sProcedureType.procurementMethodTypes === 'reporting' && $scope.vm.sProcedureType.procurementMethod === 'limited') ||
                            ($scope.vm.sProcedureType.procurementMethodTypes === null && $scope.vm.sProcedureType.procurementMethod === null)) {
                            return false;
                        }
                        return true;
                    }

                $scope.checkCity = function (region) {
                    if (region) {
                        return region.indexOf('м. Київ') !== -1 
                            || region.indexOf('м. Киев') !== -1 
                            || region.indexOf('Севастополь') !== -1;
                    }
                };
            }]
        };
    }]);
;
angular.module('app').directive('priceQuotationProfilesModal', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('priceQuotationProfilesModal from cache'),
            scope: {
                data: '=',
                lots: '=',
                condition: '=',
                index: '=',
                currentItem: '=?',
                oldFlowPq: '=?'
            },
            controller: [
                '$scope',
                'ngTableParams',
                'abp.services.etender.eCatalog',
                '$localStorage',
                '$sessionStorage',
                '$window',
                function ($scope, ngTableParams, eCatalog, $localStorage, $sessionStorage, $window) {

                    var typingTimer;
                    $scope.data.selectedProfile = {
                        item: '',
                        id: ''
                    };
                    
                    $scope.checkIfUserIsCustomer = function () {
                        return $localStorage._isCustomer || $localStorage.isCustomer;
                    };
                    
                    $scope.navigateToGoogleForm = function () {
                        $window.open('https://docs.google.com/forms/d/e/1FAIpQLSe0Os4_1TqUJ5O4KiJCzInXgPR4M-zyebH8vQqv4_sPv4WTqg/viewform', '_blank');
                    };

                    $scope.tableParams = new ngTableParams({
                        page: 1,   // show first page
                        count: 999  // count per page
                    }, {
                        counts: [],
                        getData: function ($defer, params) {
                            //pager Params
                            var pager = {
                                Page: params.page(),
                                PageSize: params.count(),
                                SearchIdentifier: $scope.searchstring,
                            };
                            $scope.foundProfiles = false;

                            abp.ui.setBusy(".modal-body");
                            if ($scope.searchstring && $scope.searchstring.length > 0) {
                                eCatalog.searchProfileByTitle({
                                    'PartOfTitle': $scope.searchstring, 
                                    'frameworkAgreementId': !!($scope.data.choosedCategoryAgreementId) 
                                        ? ($scope.data.choosedCategoryAgreementId)
                                        : ''
                                }).then(function (response) {
                                    for (var index = 0; index < response.data.length; index++) {
                                        response.data[index].doesNotHaveChild = true;
                                    }
                                    $scope.foundProfiles = true;
                                    deferResponse(response, params, $defer);
                                }, function (error) {
                                    console.log(error);
                                });
                            } else {
                                if ($scope.data.frameworkAgreementId && needToAddFrameworkId()) {
                                    $scope.data.choosedCategoryAgreementId = $scope.data.frameworkAgreementId;
                                }
                                eCatalog.getGroupsWithCategoryForFilter({
                                    'frameworkAgreementId': !!($scope.data.choosedCategoryAgreementId) 
                                    ? ($scope.data.choosedCategoryAgreementId)
                                    : ''
                                }).then(function (response) {
                                    for (var index = 0; index < response.data.length; index++) {
                                        response.data[index].rank = 2;
                                    }
                                    deferResponse(response, params, $defer);
                                }, function (error) {
                                    console.log(error);
                                });
                            }
                        }
                    });

                    function deferResponse(response, params, $defer) {
                        abp.ui.clearBusy(".modal-body");
                        console.log('eCatalog Groups:', response.data);
                        $scope.profilesData = response.data;
                        params.total(response.data.length);
                        $defer.resolve(response.data);
                    }

                    function needToAddFrameworkId() {
                        if ($scope.data.status === '') {
                            return true;
                        } else if ($scope.data.status === 'draft') {
                            return true
                        } else {
                            return !$scope.data.needToSkipId;
                        }
                    }

                    $scope.$on('reloadTable', function (evt) {
                        $scope.data.needToSkipId = true;
                        $scope.tableParams.reload();
                    });

                    $scope.changeSelection = function (item, index) {
                        if (item.doesNotHaveChild) {
                            var d = $scope.tableParams.data;
                            for (var i = 0; i < d.length; i += 1) {
                                d[i].$selected = false;
                            }
                            item.$selected = true;
                            $scope.selectedData = item;
                            if ($scope.foundProfiles) {
                                $scope.data.lots[0].items[$scope.index].classification = {
                                    code: item.cpvCode,
                                    description: item.cpvDescription,
                                    id: item.cpvCode
                                };
                            }
                        } else {
                            $scope.showOrHideChildItems(item, index);
                        }
                    };

                    $scope.$watch('data', function (data) {
                        if (!$scope.oldFlowPq) {
                            data.profileItem = data.selectedProfile ? data.selectedProfile.item : data.profile.title;
                        }
                    }, true);

                    $scope.choose = function () {
                        for (var i = 0; i < $scope.profilesData.length; i++) {
                            if ($scope.profilesData[i].$selected) {
                                if ($scope.oldFlowPq || $scope.data.isPQBucket) {
                                    $scope.data.choosedCategoryAgreementId = $scope.profilesData[i].frameworkAgreementId;
                                    $scope.currentItem.cpvDescription = $scope.profilesData[i].cpvDescription;
                                    $scope.data.choosedProfileIds.push($scope.profilesData[i].apiId);
                                    $scope.currentItem.title = $scope.profilesData[i].title;
                                    $scope.currentItem.description = $scope.profilesData[i].description;
                                    $scope.currentItem.selectedItemRequirements = $scope.profilesData[i].requirements;
                                    $scope.lots[0].items[$scope.index].profile = { "Id": $scope.profilesData[i].id };
                                } else {
                                    if ($scope.condition == 'update') {
                                        $scope.data.profile = {
                                            title: $scope.profilesData[i].title,
                                            id: $scope.profilesData[i].id,
                                            profileId: $scope.profilesData[i].id
                                        }
                                    } else {
                                        $scope.data.selectedProfile.item = $scope.profilesData[i].title;
                                        $scope.data.selectedProfile.id = $scope.profilesData[i].id;
                                    }
                                    $scope.data.profileItemApiId = $scope.profilesData[i].apiId;
                                    $scope.data.selectedItemRequirements = $scope.profilesData[i].requirements;
                                    $scope.data.title = $scope.profilesData[i].title;
                                }
                                if ($scope.index === 0) {
                                    $scope.data.title = $scope.profilesData[i].cpvDescription;
                                }
                                $scope.currentItem.classification = {
                                    code: $scope.profilesData[i].cpvCodeProfile,
                                    description: $scope.profilesData[i].cpvDescription,
                                    id: $scope.profilesData[i].cpvCodeProfile
                                }
                                
                                return;
                            }
                        }
                    };

                    $scope.search = function (index) {
                        $('#classificationCode_' + index).keyup(function () {
                            clearTimeout(typingTimer);
                            typingTimer = setTimeout(function () {
                                $scope.tableParams.reload();
                            }, 1000);
                        });
                        $('#classificationCode_' + index).keydown(function (e) {
                            if (e.keyCode == 13) return false;
                        });
                    };

                    $scope.showOrHideChildItems = function (item, $index) {
                        var reversed = [];
                        var tableData = $scope.tableParams.data;
                        if (item.rank == 2) {
                            $scope.lots[0].items[$scope.index].classification = {
                                code: item.code,
                                description: item.description,
                                id: item.code
                            };
                        }
                        

                        if (item.isOpen) {
                            if (item.categories && item.categories != null) {
                                reversed = item.categories.reverse();
                                tableData.splice($index + 1, reversed.length);
                            } else {
                                reversed = item.profiles.reverse();
                                tableData.splice($index + 1, reversed.length);
                            }
                            
                            item.isOpen = false;
                            return;
                        }

                        item.isOpen = true;
                        if (item.categories && item.categories != null) {
                            reversed = item.categories.reverse();
                            for (var index = 0, j = item.categories.length; index < reversed.length; index++) {
                                reversed[index].rank = 3;
                                tableData.splice($index + 1, 0, reversed[index]);
                            }
                        } else {
                            eCatalog.getProfilesForFilter({
                                'CategoryIdOrSeoUrl': item.id, 
                                'FrameworkAgreementId' : !!($scope.data.choosedCategoryAgreementId) 
                                ? ($scope.data.choosedCategoryAgreementId)
                                : ''
                            }).then(function (response) {
                                if ($scope.data.choosedProfileIds && $scope.data.choosedProfileIds.length && $scope.lots[0].items.length > 1) {
                                    removeProfileIfApiIdIsCurrentlyChoosed(response.data);
                                }
                                item.profiles = response.data;
                                var reversed = response.data.reverse();
                                for (var index = 0; index < reversed.length; index++) {
                                    reversed[index].doesNotHaveChild = true;
                                    reversed[index].rank = 4;
                                    tableData.splice($index + 1, 0, reversed[index]);
                                }
                            }, function (error) {
                                console.log(error);
                            });
                        }
                    };
                    
                    function removeProfileIfApiIdIsCurrentlyChoosed(profiles) {
                        if ($scope.data.choosedProfileIds.length) {
                            $scope.data.choosedProfileIds.forEach(function (profileId) {
                                profiles.forEach(function (profile, index) {
                                    if (profileId === profile.apiId) {
                                        profiles.splice(index, 1);
                                    }
                                });
                            });
                        }

                        return profiles;
                    }

                    $scope.getTranslationForValue = function (value) {
                        if (value === 'True') {
                            return 'Так'
                        } else if (value === 'False') {
                            return 'Ні'
                        } else {
                            return value;
                        }
                    };

                }
            ]
        }
    }
])
;
angular.module('app').directive('accountNumber', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/accountNumber.html',
        scope: {
            formName: '=',
            data:'='
        },
        controller: [ '$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.number;
        }]
    };
});;
angular.module('app').directive('address', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/address.html',
        template: $templateCache.get('address from cache'),       

        scope: {
            directory: '=',
            formName: '=',
            disableIndexMask: '=',
            isDocRegionEnabled: '=',
            loadCitiesOnFirstRun: '=',
            data: '=',
            scheme: '=',
            dataname: '@',
            persType: '=',
            typeForm: '=',
            isRequired: '=',
            index: '=?',
            parentIndex: '=?',
            requiredObj: '=',
            isDisabled: '=',
            regionRequired: '='
        },
        controller: [
            '$scope', 'abp.services.etender.reference', 'referenceService', '$rootScope',
            function ($scope, reference, referenceService, $rootScope) {
                var accordingToDocText = 'Відповідно до документації';
                var isFirstRun = true;
                $scope.showCity = true;
                $scope.newScheme = {
                    scheme: null
                };
                $scope.myIndex = Math.ceil(Math.random() * 10000);
                $scope.regexPatternWord = $rootScope.regex.wordAnyLanguage;
                $scope.regexPatternNumber = $rootScope.regex.number;
                $scope.language = abp.localization.currentLanguage;
                $scope.newCity = {
                    title: null
                };
                $scope.disableIndexMask = $scope.disableIndexMask;
                if (!$scope.data || !$scope.data.country || !$scope.data.country.id)
                    $scope.data = {
                    country: { id: 1, title: "Україна" }
                    };
                $scope.data.accordingToDocuments = $scope.data.city &&
                    $scope.data.city.title == accordingToDocText;
                $scope.showFields = $scope.data.accordingToDocuments ? !$scope.data.accordingToDocuments : true;

                var getRegionModel = { countryId: 1 };
                var getRegion = referenceService.getRegionsByCountryId(getRegionModel);
                getRegion.then(function (reponse) {
                    $scope.regions = reponse.data.regions;
                });
                $scope.countries = [$scope.data.country];
                /*
                var getCountries = reference.getCountriesRegCodeExists();
                getCountries.then(function (reponse) {
                    $scope.countries = reponse.data.countries;
                });
                */
                $scope.loadCountries = function () {
                    if ($scope.countries.length === 1) {
                        var getCountries = reference.getCountriesRegCodeExists();
                        getCountries.then(function (reponse) {
                            $scope.countries = reponse.data.countries;
                            $scope.countriesLoaded = true;
                        });
                    }
                };

                $scope.$watch("data.country",
                    function (n, o) {
                        if (n == undefined || $scope.data.country.id === 1 || !n.code) return;
                        //$scope.scheme = null;
                        $scope.showCity = true;
                        var getRegCodes = reference.getRegCodesByCountryId({ countryCode: n.code });
                        getRegCodes.then(function (reponse) {
                            $scope.regCodes = reponse.data.regCodes;
                        });
                    }
                );
                $scope.$watch("data.accordingToDocuments",
                    function (n, o) {
                        if (n === o || n == undefined) return;
                        $scope.showFields = !n;
                        if (n === true) {
                            $scope.data.city = { title: accordingToDocText };
                            $scope.data.region = {
                                title: '',
                                countryId: 1
                            };
                            if ($scope.newCity) {
                                $scope.newCity.title = null;
                            }
                        } else {
                            $scope.data.city = null;
                            $scope.data.region = null;
                            $scope.newCity.title = null;
                        }
                        $scope.data.addressStr = null;
                        $scope.data.postIndex = null;
                    }
                );

                $scope.$watch('newScheme', function (data) {
                    if (data && data.scheme) {
                        $scope.scheme = data.scheme.id;
                    }
                }, true);

                $scope.isRegionCorrect = false;
                $scope.$watch('[data, regions]', function (param) {
                    //param[0] = data; param[1] = regions
                    if (param && (param[0] && param[1])) {
                        if (param[1] != null && (param[0].region != null && param[0].region)) {
                            $scope.isRegionCorrect = param[1].find(function (reg) {
                                return reg.title === param[0].region.title
                            }) || false;
                        }
                    }
                });
                $scope.$watch('isRegionCorrect', function (param) {
                    $scope.$emit('setFormValidity', { regionCheck: param, accordingToDocs: $scope.accordingToDocuments });
                });

                $scope.$watch("data.region",
                    function (n, o) {
                        $scope.isRegionCorrect = $scope.data.region

                        if (!$scope.isRequired) return $scope.isRegionCorrect = true;

                        if ($scope.data.country.id !== 1 || $scope.data.accordingToDocuments || n == undefined) return;

                        if (n.title === 'м. Київ' || n.title === 'м. Севастополь') {
                            $scope.data.city = { title: n.title };
                            $scope.cityChanged();
                            $scope.showCity = false;
                            return;
                        }

                        if (o && (o.title === 'м. Київ' || o.title === 'м. Севастополь')) {
                            $scope.data.city = null
                            $scope.showCity = true;
                        }
                        if ($scope.loadCitiesOnFirstRun) {
                            $scope.loadCities();
                        } else {
                            if (!isFirstRun) {
                                $scope.loadCities();
                            } else {
                                if ($scope.data.city) {
                                    $scope.cities = [$scope.data.city]; 
                                }
                            }
                        }
                    }
                );

                $scope.$watch('data', function (data) {
                    if (data.otherCity && !data.city) {
                        $scope.newCity.title = data.otherCity;
                    }
                }, true);

                $scope.loadCities = function () {
                    if (!$scope.data.region) return;
                    if ($scope.cities && $scope.cities.length > 1 && $scope.cities[0].regionId === $scope.data.region.id) return;
                    var getCityModel = { regionId: $scope.data.region.id };
                    reference.getCitiesByRegionId(getCityModel)
                        .then(function (reponse) {
                            $scope.cities = reponse.data.cities;

                            if (isFirstRun) {
                                setNewCity();
                                isFirstRun = false;
                            } else {
                                if ($scope.data && $scope.data.city) {
                                    setNewCity();
                                } else {
                                    $scope.data.city = $scope.newCity.title != null ? $scope.newCity : $scope.data.city;
                                }
                            }
                            $scope.$emit('citiesLoaded', $scope.cities);
                        });
                    function setNewCity() {
                        var city = $scope.data.city;
                        if (!city || city.title.indexOf('Відповідно до документації') !== -1) return;

                        var cities = $scope.cities;
                        for (var i = 0; i < cities.length; i += 1) {
                            if (cities[i].id == city.id) {
                                return;
                            }
                        }

                        if (isFirstRun) {
                            $scope.newCity = city;
                        } else {
                            $scope.newCity = {};
                        }

                        $scope.data.city.id = null;
                        if ($scope.data.city && !$scope.data.city.title) {
                            $scope.data.city = {};
                        }
                        
                    }
                };

                $scope.loadCities();

                $scope.cityChanged = function() {
                    if ($scope.data.city) {
                        $scope.newCity.title = null;
                    }
                    if (!$scope.data.city) {
                        $scope.data.city = $scope.newCity
                    }
                };

                $scope.newCityChanged = function () {
                    if ($scope.newCity.title && $scope.newCity.title.length) {
                        $scope.data.city = {
                            id: null,
                            title: $scope.newCity.title
                        };
                    } else {
                        $scope.newCity.title = null;
                        $scope.data.city = null;
                    }
                }

                $scope.isDocFilled = function (address) {
                    if (address && address.region && address.region.title) {
                        return !$scope.data.accordingToDocuments;
                    }
                    return false;
                };
            }
        ]
    };
}]);;
angular.module('app').directive('captcha', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/captcha.html',
        template: $templateCache.get('captcha from cache'),
        scope: {
            data: '=',
            curentUrl: '='
        },
        controller: [
            '$scope',
            '$rootScope',
            function (
                $scope,
                $rootScope) {
            }]
    };
}])
;
angular.module('app').directive('director', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/director.html',
        scope: {
            formName: '=',
            data: '=',
            persType: '='
        },
        controller: ['$scope','$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;
        }]
    };
});;
angular.module('app').directive('edrpou', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/edrpou.html',
        scope: {
            formName: '=',
            data: '=',
            bank: '=',
            dsbl: '=',
            reloadKindsFunc: '&'
        },
        controller:['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.number;
        }]
    };
});;
angular.module('app').directive('email', ['$templateCache', function ($templateCache) {
        return {
            restrict: 'AE',
            //templateUrl: '/App/Main/base/directives/profile/email.html', // name of file is very strange. We just can't use 'mail' because of corporate secure
            template: $templateCache.get('email from cache'),
            replace: true,
            scope: {
                formName: '=',
                data: '=',
                type: '@',
                typeForm: '=',
                newDesign: '=?',
                index: '=',
                hideLabel: '=?'
        },
        controller:['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexEmail = $rootScope.regex.email;
            $scope.newDesign = ($scope.newDesign || $scope.newDesign === undefined) ? true : false; // Во многих местах параметр не передается, поэтому ставим true по умолчанию 
        }]
    };
}]);;
angular.module('app').directive('fax', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('fax from cache'),
        scope: {
            formName: '=',
            data: '=',
            placeholder: '@',
            typeForm: '=',
            newDesign: '=?',
            index: '=',
            hideLabel: '=?'
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPhone = $rootScope.regex.phone;
            $scope.regexFax = /\+[0-9]{2}[ ]\([0-9]{3}\)[ ][0-9]{3}[-][0-9]{2}[-][0-9]{2}/;
            $scope.newDesign = ($scope.newDesign || $scope.newDesign === undefined) ? true : false;
            if (!$scope.placeholder) {
                $scope.placeholder = abp.localization.localize("Fax", "Shared");
            }
        }]
    };
}]);;
angular.module('app').directive('fio', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/fio.html',
        template: $templateCache.get('fio from cache'),
        scope: {
            formName: '=',
            data: '=',
            persType: '=',
            newDesign: '=?'
        },
        controller: ['$scope','$rootScope', function ($scope,$rootScope) {
            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;
            
        }]
    };
}]);;
angular.module('app').directive('inn', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/inn.html',
        scope: {
            formName: '=',
            data: '=',
            dsbl: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.number;

        }]
    };
});;
angular.module('app').directive('innOrEdrpou', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/innOrEdrpou.html',
        scope: {
            formName: '=',
            data: '=',
            dsbl: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.number;
            $scope.value8or12 = function(a) {
                if (a.$viewValue && a.$viewValue.length > 8 && a.$viewValue.length < 12)
                    a.$valid = false;
            }
        }]
    };
});;
angular.module('app').directive('isCustomer', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/isCustomer.html',
        scope: {
            formName: '=',
            data: '=',
            dsbl: '='
        }
    };
});;
angular.module('app').directive('isMainAccount', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/isMainAccount.html',
        scope: {
            formName: '=',
            data: '=',
        }
    };
});;
angular.module('app').directive('itemDeliveryAddress', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('itemDeliveryAddress from cache'),
        scope: {
            item: '=',
            iIndex: '=',
            lIndex: '=',
            formName: '=',
            isPriceQuotation: '='
        },
        controller: [function () { }]
    };
}]);;
angular.module('app').directive('listProfile', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/directives/profile/listProfiles.html',
        scope: {
            //mode: '@'
        },
        controller: ['$scope', 'abp.services.etender.organization', '$q', 'ngTableParams', '$timeout', '$rootScope', '$location', '$localStorage',
            function ($scope, organization, $q, ngTableParams, $timeout, $rootScope, $location, $localStorage) {

                $scope.ng_localStorage = $localStorage;

                //if (!$scope.ng_localStorage.isOperator) {
                //    abp.notify.error('Недостатньо прав!');
                //    $location.path("#");
                //    return;
                //}
                

                //$scope.regexNumber = $rootScope.regex.number;
                //$scope.regexDate = $rootScope.regex.date;

                //$scope.isIntervalGood = function (from, to) {
                //    var fromValue = 0;
                //    var toValue = 0;
                //    if (from && to) {
                //        fromValue = parseInt(from);
                //        toValue = parseInt(to);
                //        if (toValue >= fromValue) return true;
                //        else return false;
                //    } else return true;
                //};

                //$scope.isDateIntervalGood = function (from, to) {
                //  if (from && to) {
                //       if (to >= from) return true;
                //        else return false;
                //    } else return true;
                //};

                //$scope.isAllDataGood = function () {
                //    if ($scope.isIntervalGood($scope.filter.priceFrom, $scope.filter.priceTo) &&
                //        $scope.isDateIntervalGood($scope.filter.tenderPeriodStartFrom, $scope.filter.tenderPeriodStartTo) &&
                //        $scope.isDateIntervalGood($scope.filter.tenderPeriodEndFrom, $scope.filter.tenderPeriodEndTo) )
                //        return true;

                //    else return false;
                //};


                $scope.pagerSearchFilter = {
                    //testModeIsReadyForApprovement: true,
                    productionModeIsReadyForApprovement: true
                };
                var timer;

                $scope.search = function () {
                    $timeout.cancel(timer);
                    timer = $timeout(function () {
                        $scope.pagerSearchFilter = {
                            //testModeIsReadyForApprovement: true
                            //productionModeIsReadyForApprovement:true
                            //PriceFrom: $scope.filter.priceFrom,
                            //PriceTo: $scope.filter.priceTo,
                            //Status: $scope.selectedStatus ? $scope.selectedStatus.name : "",
                            //ColumnFilters: [{ Name: 'Title', Filter: $scope.filter.title },
                            //    { Name: 'Description', Filter: $scope.filter.description },
                            //    { Name: 'OrganizationName', Filter: $scope.filter.organisation },
                            //    { Name: 'tenderPeriodEndFrom', Filter: $scope.filter.tenderPeriodEndFrom },
                            //    { Name: 'tenderPeriodEndTo', Filter: $scope.filter.tenderPeriodEndTo },
                            //    { Name: 'tenderPeriodStartFrom', Filter: $scope.filter.tenderPeriodStartFrom },
                            //    { Name: 'tenderPeriodStartTo', Filter: $scope.filter.tenderPeriodStartTo },
                            //    { Name: 'classificationCpv', Filter: $scope.filter.classificationCpv },
                            //    { Name: 'classificationDkpp', Filter: $scope.filter.classificationDkpp }]
                        };
                        $scope.tableParams.reload();
                        $scope.tableParams.page(1);
                    }, 1000);
                };
                //$scope.selectedStatus = { name: '' };
                //$scope.changeSelection = function (st) {
                //    if (!st) $scope.selectedStatus = null;
                //    $scope.selectedStatus = st;
                //};
                //$scope.tenderLabelClass = "label-default";
                //$scope.getTenderDescriptionByStatus = function (st) {
                //    switch (st) {
                //        case ('active.enquiries'): { return 'Заявка'; break; }
                //        case ('active.tendering'): { return 'Пропозиція'; break; }
                //        case ('active.auction'): { return 'Аукціон'; break; }
                //        case ('active.qualification'): { return 'Оцінка'; break; }
                //        case ('active.awarded'): { return 'Рішення прийнято'; break; }
                //        case ('unsuccessful'): { return 'Помилковий'; break; }
                //        case ('complete'): { return 'Завершено'; break; }
                //        case ('cancelled'): { return 'Відмінено'; break; }
                //    }

                //};
                //$scope.getLabelClassByStatus = function (st) {
                //    switch (st) {
                //        case ('active.enquiries'): { return "label-info"; break; }
                //        case ('active.tendering'): { return 'label-success'; break; }
                //        case ('active.auction'): { return 'label-warning'; break; }
                //        case ('active.qualification'): { return 'label-warning'; break; }
                //        case ('active.awarded'): { return 'label-danger'; break; }
                //        case ('unsuccessful'): { return 'label-primary'; break; }
                //        case ('complete'): { return 'label-danger'; break; }
                //        case ('cancelled'): { return 'label-primary'; break; }
                //    }
                //};
                //$scope.filter = { title: '', description: '', priceFrom: '', priceTo: '', organisation: '', status: { name: '' } };

                //$scope.clear = function () {
                //    $scope.filter = {
                //        title: '',
                //        description: '',
                //        organisation: '',
                //        priceFrom: '', priceTo: '',
                //        tenderPeriodStartFrom: '',
                //        tenderPeriodStartTo: '',
                //        tenderPeriodEndFrom: '',
                //        tenderPeriodEndTo: '',
                //        classificationCpv: '',
                //        classificationDkpp: ''
                //    };
                //    $scope.selectedStatus = { name: '' };
                //};
                //var allStatuses = ['active.enquiries', 'active.tendering',
                //                   'active.auction', 'active.qualification',
                //                   'active.awarded', 'unsuccessful',
                //                   'complete', 'cancelled'];

                //function getStatusDictionary(statuses) {
                //    var statusDict = [];

                //    _(statuses).each(function (st) {
                //        var description = $scope.getTenderDescriptionByStatus(st);
                //        var label = $scope.getLabelClassByStatus(st);
                //        statusDict.push({
                //            name: st,
                //            description: description,
                //            label: label
                //        });
                //    });
                //    return statusDict;
                //}

                //$scope.statusDictionary = getStatusDictionary(allStatuses);

                $scope.tableParams = new ngTableParams({
                    page: 1,
                    count: 10,
                    sorting: {
                    isBankingConfirmed: 'desc', shortName: 'asc'
                    },
                }, {
                    counts: [],
                    getData: function ($defer, params) {
                        var pager = {
                            Page: params.page(),
                            PageSize: params.count(),
                            OrderColumn: (params.orderBy())[0].slice(1),
                            OrderDirection: (params.sorting())[(params.orderBy())[0].slice(1)],
                            SearchFilter: $scope.pagerSearchFilter
                        };

                        // if ($scope.mode === 'my') pager.SearchFilter.UserName = $scope.ng_localStorage.username || $scope.ng_localStorage.username;

                        if ($scope.searchString && $scope.searchString != "")
                         pager.searchIdentifier = $scope.searchString;

                        var getListOfOrganizations = organization.getOrganizations(pager);
                        abp.ui.setBusy(".panel-default:first");

                        getListOfOrganizations.then(function (reponse) {
                            //console.log("List of profiles");
                            //console.log(data);
                            abp.ui.clearBusy(".panel-default");
                            params.total(reponse.data.countAllRecords);
                            $defer.resolve(reponse.data.organizations);
                            reponse.data.organizations.forEach(function (item, i, arr) {
                                (function setTypeOfOrganization() {
                                    if (item.typeOfOrganization) {
                                        var type = item.typeOfOrganization;

                                        switch (type) {
                                            case (1):
                                                item.typeOfOrganization = { value: type, typeName: "Фізична особа" };
                                                break;
                                            case (2):
                                                item.typeOfOrganization = { value: type, typeName: "Юридична особа" };
                                                break;
                                            case (4):
                                                item.typeOfOrganization =
                                                    { value: type, typeName: "Юридична особа(Фінансова компанія)" };
                                                break;
                                            case (5):
                                                item.typeOfOrganization = { value: type, typeName: "Замовник" };
                                                break;
                                            case (6):
                                                item.typeOfOrganization =
                                                    { value: type, typeName: "Фізична особа підприємець" };
                                                break;
                                        }
                                        return true;
                                    } else {
                                        return false;
                                    }
                                })();
                            });
                        });

                    }
                });
            }]
    };
});;
angular.module('app').directive('login', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/login.html',
        template: $templateCache.get('login from cache'),
        replace: true,
        scope: {
            formName: '=',
            data:'='
        },
        controller:['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.login;
        }]
    };
}]);;
angular.module('app').directive('mfo', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/mfo.html',
        scope: {
            formName: '=',
            data:'='
        },
        controller:['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.number;
        }]
    };
});;
angular.module('app').directive('nonResidentOrgCode', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/nonResidentOrgCode.html',
        scope: {
            formName: '=',
            data: '=',
            dsbl: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {

        }]
    };
});;
angular.module('app').directive('organisationFullName', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/organisationFullName.html',
        template: $templateCache.get('organisationFullName from cache'),
        scope: {
            formName: '=',
            data: '=', // Повна назва:
            nameEn: '=', // Повна назва (англ):
            useNameEn: '=' // если это поле = false, то поле nameEn не отображаем
        },
        controller: ['$scope', '$rootScope', 'translitService', function ($scope, $rootScope, translitService) {
            $scope.regexPattern = $rootScope.regex.organisationName;
            $scope.regexEN = $rootScope.regex.english;

            $scope.translit = function  () {
                $scope.nameEn = translitService.getData().transform($scope.data);
            }


        }]
    };
}]);;
angular.module('app').directive('organisationShortName', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/organisationShortName.html',
        scope: {
            formName: '=',
            data:'='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.organisationName;
        }]
    };
});;
angular.module('app')
    .directive('passwordForm', function () {
        return {
            restrict: 'AE',
            templateUrl: '/App/Main/base/directives/profile/passwordForm.html',
            scope: {
                formname: '=',
                password: '=',
                isPasswordsMatch: '='
            },
            controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
                'use strict';
                $scope.regexPattern = $rootScope.regex.password;
                $scope.$watchGroup(['password', 'password_c'], function (newValues, oldValues) {
                    if (newValues[0] == newValues[1]) {
                        $scope.isPasswordsMatch = true;
                        //console.log("Совпадают");
                    } else {
                        $scope.isPasswordsMatch = false;
                        //console.log("НЕ совпадают!!!");
                    }
                });
            }]
        };
    });;
angular.module('app').directive('passwordSingle', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/passwordSingle.html',
        template: $templateCache.get('passwordSingle from cache'),
        scope: {
            data: '=',
            formName: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.password;
        }]
    };
}]);
angular.module('app').directive('personType', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/personType.html',
        template: $templateCache.get('personType from cache'),
        scope: {
            formName: '=',
            data: '=',
            dsbl: '='
        },
        controller: ['$scope', function ($scope) {
            $scope.persons = [
                {
                    typeName: abp.localization.localize("IndividualPerson", "Shared"),
                    value: 1
                },
                {
                    typeName: abp.localization.localize("LegalEntity", "Shared"),
                    value: 2
                },
                {
                    typeName: abp.localization.localize("NonResident", "Shared"),
                    value: 3
                }];
        }]
    };
}]);;
angular.module('app').directive('phone', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/phone.html',
        scope: {
            formName: '=',
            data: '='
        },
        controller:['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPhone = $rootScope.regex.phone;
        }]
    };
});;
angular.module('app').directive('phoneListEditor', function () {
    return {
        templateUrl: '/App/Main/base/directives/profile/phoneListEditor.html',
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexPhone = $rootScope.regex.phone;
            $scope.addNewChoice = function () {
                var newItemNo = $scope.choices.length + 1;
                $scope.choices.push({
                    'id': 'choice' + newItemNo, 'name': '', valid: true
                });
            };
            $scope.removeChoice = function () {
                var lastItem = $scope.choices.length - 1;
                $scope.choices.splice(lastItem);
            };
            $scope.isValidPhone = function (obj) {
                obj.valid = false;
                if (obj.name && obj.name.length > 2) {
                    obj.valid = true;
                }
                return obj.valid;
            };
        }]
    }
});

angular.module('app').directive('phoneWithMask', ['$templateCache', function ($templateCache) {
        return {
            restrict: 'AE',
            //templateUrl: '/App/Main/base/directives/profile/phoneWithMask.html',
            template: $templateCache.get('phoneWithMask from cache'),
            scope: {
                formName: '=',
                phoneLen: '=',
                data: '=',
                isRequired: '=?',
                placeholder: '@',
                orgType: '=',
                typeForm: '=',
                index: '=',
                newDesign: '=?',
                isValidPhone: '=',
                isPhoneRequired: '=',
                place: '=',
                hideLabel: '=?'
    },
        controller: ['$scope', '$rootScope', '$element', '$attrs', function ($scope, $rootScope, $element, $attrs) {
            $scope.regexPhone = $rootScope.regex.phone;
            $scope.newDesign = ($scope.newDesign || $scope.newDesign===undefined) ? true : false; // Во многих местах параметр не передается, поэтому ставим true по умолчанию 
            $scope.isValidPhone = function () {
                var isValid = false;
                if (!$scope.data && $scope.isRequired == false) {
                    isValid = true;
                }
                if ($scope.data && ($scope.data.length == 12 || $scope.orgType == 3 || $scope.phoneLen)) {
                    isValid = true;
                }
                if ($scope.formName.phone)
                $scope.formName.phone.$setValidity('isValidPhone', isValid);
                return isValid;
            }
        }]
    };
}]);

angular.module('app').directive('phoneInput', ['$filter', '$browser', function ($filter, $browser) {
    return {
        require: 'ngModel',
        link: function ($scope, $element, $attrs, ngModelCtrl) {
            if ($scope.isRequired === false)
                $scope.isRequired = false;
            else
                $scope.isRequired = true;
            if (!$scope.placeholder) {
                $scope.placeholder = abp.localization.localize("Telephone", "Shared");
            }

            var phoneLength = $scope.phoneLen ? $scope.phoneLen : 12;

            var listener = function () {
                var c1 = $(this);
                var value = $element.val().replace(/[^0-9]/g, '');
                $element.val($filter('tel')(value, $scope.orgType, phoneLength, false));
            };

            // This runs when we update the text field
            ngModelCtrl.$parsers.push(function (viewValue) {
                if ($scope.orgType == 3)
                    return viewValue.replace(/[^0-9]/g, '').slice(0, viewValue.length);
                else return viewValue.replace(/[^0-9]/g, '').slice(0, phoneLength);
            });

            // This runs when the model gets updated on the scope directly and keeps our view in sync
            ngModelCtrl.$render = function () {
                $element.val($filter('tel')(ngModelCtrl.$viewValue, $scope.orgType, phoneLength, false));
            };

            $element.bind('change', listener);
            $element.bind('keydown', function (event) {
                var key = event.keyCode;
                // If the keys include the CTRL, SHIFT, ALT, or META keys, or the arrow keys, do nothing.
                // This lets us support copy and paste too
                if (key == 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) {
                    return;
                }
                $browser.defer(listener); // Have to do this or changes don't get picked up properly
            });

            $element.bind('paste cut', function () {
                $browser.defer(listener);
            });
        }

    };
}]);


angular.module('app').filter('tel', function () {
    return function (tel, orgType, len) {
        if (!tel) { return ''; }

        var value = tel.toString().trim().replace(/^\+/, '');
        if (value.match(/[^0-9]/)) {
            return tel;
        }

        var country, city, num1, num2, num3;

        switch (value.length) {

            default:
                country = value.slice(0, 2);
                city = value.slice(2, 5);
                num1 = value.slice(5, 8);
                num2 = value.slice(8, 10);
                if (orgType == 3) num3 = value.slice(10, value.length);
                else num3 = value.slice(10, len);
        }

        if (country && city && num1 && num2 && num3) {
            return ("+" + country + " (" + city + ") " + num1 + "-" + num2 + "-" + num3).trim();
        }
        else if (country && city && num1 && num2) {
            return ("+" + country + " (" + city + ") " + num1 + "-" + num2).trim();
        } else if (country && city && num1) {
            return ("+" + country + " (" + city + ") " + num1).trim();
        } else if (country && city) {
            return ("+" + country + " (" + city).trim();
        } else if (country) {
            return ("+" + country).trim();
        }

    };
});;
;
angular.module('app').directive('profTabset', function () {
    return {
        restrict: 'E',
        replace: true,
        transclude: true,
        controller: ['$scope', '$rootScope', '$location', '$localStorage', function ($scope, $rootScope, $location, $localStorage) {
            $scope.ng_localStorage = $localStorage;
            $scope.templateUrl = '';
            var tabs = $scope.tabs = [];
            var controller = this;
            
            this.selectTab = function (tab) {
                angular.forEach(tabs, function (tab) {
                    tab.selected = false;
                });
                tab.selected = true;
                
            };

            this.setTabTemplate = function(templateUrl) {
                $scope.templateUrl = templateUrl;
            };

            this.addTab = function (tab) {
                if (tabs.length === 0) {
                    controller.selectTab(tab);
                }
                tabs.push(tab);
                
                $scope.$watch('location.hash()', function () {
                    if (($location.hash()).indexOf('myTenders') > (-1)) {
                        $scope.ng_localStorage.isAdmin ? controller.selectTab(tabs[2]) : controller.selectTab(tabs[1]);
                    }
                    if (($location.hash()).indexOf('bankOperations') > (-1)) {
                        controller.selectTab(tabs[3]);
                    }
                });
            };
        }],
        template:
          '<div class="row-fluid">' +
            '<div class="row-fluid">' +
              '<div class="nav nav-tabs" ng-transclude></div>' +
            '</div>' +
            '<div class="row-fluid">' +
              '<ng-include src="templateUrl"></ng-include>' +
            '</div>' +
          '</div>'
    };
});

angular.module('app').directive('profTab', function () {
    return {
        restrict: 'E',
        replace: true,
        require: '^profTabset',
        scope: {
            title: '@',
            templateUrl: '@'
           
        },
        link: function (scope, element, attrs, profTabsetController) {
            profTabsetController.addTab(scope);

            scope.select = function() {
                profTabsetController.selectTab(scope);
            };

            scope.$watch('selected', function () {
                if (scope.selected) {
                    profTabsetController.setTabTemplate(scope.templateUrl);
                }
            });

           
        },
        template:
          '<li ng-class="{active: selected}">' +
            '<a href="" ng-click="select()">{{ title }}</a>' +
          '</li>'
    };
});;
angular.module('app').directive('url', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/profile/url.html',
        template: $templateCache.get('url from cache'),
        scope: {
            formName: '=',
            data: '=',
            typeForm: '=',
            newDesign: '=?',
            index: '=',
            hideLabel: '=?'
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexUrl = $rootScope.regex.url;
            $scope.newDesign = ($scope.newDesign || $scope.newDesign === undefined) ? true : false; // Во многих местах параметр не передается, поэтому ставим true по умолчанию 
        }]
    };
}]);;
angular.module('app').directive('userName', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/profile/userName.html',
        scope: {
            formName: '=',
            data: '='
        },
        controller: ['$scope', '$rootScope', function($scope, $rootScope) {
            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;
            $scope.language = abp.localization.currentLanguage;
        }]
    };
});;
angular.module('app').directive('covidAndArmyHelp', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/directives/tender/covid.html',
        scope: {
            data: '=',
            isEditMode: '='
        },
        controller: ['$scope', function ($scope) {
            $scope.vm = {};
            $scope.vm.covid19 = false;
            $scope.vm.helpArmy = false;
            $scope.$watch('data', function (n) {
                if (!n.procurementMethodType) return;
                $scope.vm.covid19 = !!$scope.data.isCovid19;
            });

            $scope.changeCovid19 = changeCovid19;

            $scope.changeHelpArmyUkraine = function () {
                if ($scope.vm.helpArmy) {
                    $scope.data.procurementMethodRationale = 'war_for_freedom';
                } else {
                    $scope.data.procurementMethodRationale = undefined;
                }
            }

            function changeCovid19() {
                if ($scope.vm.covid19) {
                    $scope.data.procurementMethodRationale = 'COVID-19';
                } else {
                    $scope.data.procurementMethodRationale = undefined;
                }
            }
        }]
    }
});
;
angular.module('app').directive('criteriaConfirmationMethod', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('criteriaConfirmationMethod from cache'),
            scope: {
                evidences: '=',
                docs: '=',
                requirementStatus: '='
            },
            controller: [
                '$scope',
                'criteriasDictionaryService',
                function ($scope, criteriasDictionaryService) {
                    $scope.getRealatedEviedenceDocument = function (evidence) {
                        return $scope.docs.find(function (document) {
                            return document.originId === evidence.tenderDocumentId;
                        });
                    };

                    $scope.getEvidenceTypeTitle = function (evidence) {
                        return criteriasDictionaryService.getEvidenceTypeTitle(evidence);
                    };
                }
            ]
        }
    }
])
;
angular.module('app').directive('customerInfo', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/customerInfo.html',
        scope: {
            customer: '='
        },
        controller: ['$scope', 'lookupService', function ($scope, lookupService) {

            activate();
            function activate() {
                $scope.$watch("customer",
                    function (n, o) {
                        if (!n) return;

                        var language = lookupService.getLanguage(n.organization.contactPoint.language);
                        if (language) {
                            $scope.customer.organization.contactPoint.languageTitle = language.title;
                        }

                        if (!n.contactPoints) return;

                        for (var i = 0; i < n.contactPoints.length; i += 1) {
                            var cp = n.contactPoints[i];
                            var l = lookupService.getLanguage(cp.language);
                            if (!l) continue;
                            cp.languageTitle = l.title;
                        }
                    });
            }

        }]
    };
});;
angular.module('app').directive('goToTender', function () {
    return {
        scope: {
            goToTender: '=',
            tenderId: '='
        },
        link: function (scope, element, attrs) {
            if (scope.goToTender && scope.goToTender.url)
                attrs.$set('href', scope.goToTender.url);
            else attrs.$set('href', 'tenderDetailes/' + scope.tenderId);
        }
    };
});

angular.module('app').service('goToTenderService',
    ['$window', '$location', function ($window, $location) {
        return new function () {
            this.setTenderUrl = function (data, tenderId) {
                if (data && data.url) {
                    return data.url;
                } else {
                    return 'tenderDetailes/' + tenderId;
                }

            };
            this.redirect = function (data, tenderId) {
                if (data && data.url) {
                    var url = data.url.replace("#", "");
                    $location.path(url);
                } else $location.path("/tenderDetailes/" + tenderId);
            };
            this.criteriaRedirect = function(tenderId) {
                $location.path("/CreateTenderCriteria/" + tenderId);
            };
            this.documentsRedirect = function (tenderId) {
                $location.path("/addDocuments/" + tenderId);
            };
        };
    }]);


;
angular.module('app').directive('operatorTenderFeatures', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/operatorTenderFeatures.html',
        scope: {
            tender: '=',
            reload: '&'
        },
        controller: ['$scope', '$rootScope', 'abp.services.etender.tender', '$location', '$localStorage',
            function ($scope, $rootScope, tenderService, $location, $localStorage) {
                $scope.ng_localStorage = $localStorage;
                $scope.showTenderLogs = false;
                $scope.elasticTendersIndex = abp.setting.get('ElasticTendersIndex');
                $scope.tenderEventLogs = null;
                $scope.syncTender = function (isFullUpdate) {
                    var syncTender = tenderService.syncTender({ id: $scope.tender.id, isFullUpdate: isFullUpdate });
                    syncTender.then(function (data) {
                        $scope.reload();
                        abp.notify.success("Тендер буде сiнхронiзовано позачергово! Це може зайняти декiлька хвилин.");
                    });
                };

                $scope.syncContractings = function () {
                    var syncTender = tenderService.syncContractings({ id: $scope.tender.id });
                    syncTender.then(function (data) {
                        $scope.reload();
                        abp.notify.success("Всi постконтракти синхронiзованi.");
                    });
                };

                $scope.activeTender = function (tenderId) {
                    var activateTender = tenderService.activateTenderDraft(tenderId);
                    activateTender.then(function (response) {
                        if (response.data === true)
                            abp.notify.success("Тендер успішно активовано.");
                        else
                            abp.notify.error("Виникла непередбачена помилка.");
                    });
                }

                $scope.getTenderEventLogs = function () {
                    var syncTender = tenderService.getTenderEventLogs({ id: $scope.tender.id });
                    syncTender.then(function (response) {
                        $scope.tenderEventLogs = response.data;
                        //$scope.reload();
                        abp.notify.success("Логи тендера отриманi.");
                    });
                };

                $scope.isOperatorNow = function () {
                    return $scope.ng_localStorage.isOperator || $location.search().operator123 ? true : false;
                };

                $scope.updateInElastic = function () {
                    tenderService.updateInElastic($scope.tender.id).then(
                        function (response) {
                            abp.notify.success("Готово");
                        }
                    );
                };

            }]
    };
});;
angular.module('app').directive('addAwardCreate', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('addAwardCreate from cache'),
        scope: {
            data: '=',
            formName: '=',
            name: '=',
            isEditMode: '='
        },
        controller: ['$scope', function ($scope) {
            $scope.$watch('data', function () {
               if (!$scope.data) {
                   $scope.data = 'lowestCost';
               }
            });
        }]
    };
}]);;
angular.module('app').directive('addDescription', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('addDescription from cache'),
        scope: {
            data: '=',
            formName: '=',
            isRequired: '=',
            anotherTitle: '=',
            inputTitle: '=',
            pattern: '=',
            name: '=',
            isDisabled: '='


        }
    };
}]);;
angular.module('app').directive('addFeatures', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/addFeatures.html',
        scope: {
            data: '=',
            formName: '=',
            featureSector: '=', // 'tender' or 'lot or 'item',
            checkFeatureSum: '&',
            checkFeaturesValue: '&valueSum',
            setFeatureValue: '&featureValue',
            maxValue: '=',
            englFeatures: '=',
            tenderType: '=',
            isDisable: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {

            $scope.numberRegex = $rootScope.regex.number;
            $scope.regexEN = $rootScope.regex.english;

            // names in <form>
            $scope.featureTitle = 'feature-' + $scope.featureSector;
            $scope.featureTitleEng = 'feature-eng-' + $scope.featureSector;
            $scope.featureDescEng = 'feature-desc-eng-' + $scope.featureSector;
            $scope.featureTitleValue = $scope.featureTitle + 'Value';
            $scope.featureOptionTitle = $scope.featureTitle + 'Option';
            $scope.featureOptionTitleEng = $scope.featureTitle + 'Option-eng';
            $scope.featureOptionTitleValue = $scope.featureTitle + 'Option' + 'Value';

            $scope.addFeatureOption = function (feature) {
                feature.options.push({
                    title: null,
                    value: null
                });
            }

            $scope.addFeature = function () {
                var obj = {
                    description: null,
                    title: null,
                    value: null,
                    options: []
                };
                if (!$scope.tenderType || $scope.tenderType && $scope.tenderType !== 'limited')
                    obj.options = [
                        {
                            title: null,
                            value: 0
                        }, {
                            title: null,
                            value: null
                        }
                    ];
                $scope.data.push(obj);
            }

            $scope.removeFeature = function(index) {
                $scope.data.splice(index, 1);
            }

            $scope.removeFeatureOption = function (feature, index) {
                feature.options.splice(index, 1);
            }

            $scope.sameOptionValue = function (arr, v, ind) {
                for (var i = 0; i < arr.length; i += 1) {
                    if (i === ind) continue;
                    if (arr[i].value === v && v != undefined) {
                        $scope.formName.$valid = false;
                        return true;
                    }
                }
                return false;
            }

            $scope.setFormValidate = function (form, fValue, fSum) {
                if (fValue || !fSum) {
                    form.$setValidity("featuresNotValid", false);
                } else {
                    form.$setValidity("featuresNotValid", true); 
                }
            }

        }]
    };
});;
angular.module('app').component('addFunder', {
    templateUrl: '~/App/Main/base/directives/tender/createTender/addFunder.html',
    bindings: {
        data: '='
    },
    controllerAs: 'ctrl',
    controller: [        
        '$scope',
        function (
            $scope
        ) {
            this.isFunder = false;

            this.isFunderOnClick = function () {
                if (!this.isFunder)
                    this.data.funder = null;                
            };
            
        }]
});
;
angular.module('app').directive('addGuarantee', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/addGuarantee.html',
        scope: {
            data: '=',
            label: '=',
            formName: '=',
            index: '=',
            isRequired: '='
        },
        controller: ['$scope', function ($scope) {

            if (!$scope.data.guarantee && !$scope.data.hasGuarantee)
                $scope.data.hasGuarantee = '0';

            $scope.changeGuarantee = function (o) {
                if (o.hasGuarantee === '0') {
                    o.guarantee = null;
                }
                $scope.$emit('hasGuaranteeChanged');
            }
        }]
    };
});;
angular.module('app').directive('addItemData', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('addItemData from cache'),
        scope: {
            data: '=',
            formName: '=',
            label: '=',
            inputSize: '=',
            isRequired: '=',
            pattern: '=',
            index: '=',
            lIndex: '=',
            name: '=',
            isDisabled: '='
        }
    };
}]);;
angular.module('app').directive('addItemQuantity', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('addItemQuantity from cache'),
        scope: {
            data: '=',
            formName: '=',
            label: '=',
            isRequired: '=',
            index: '=',
            lIndex: '=',
            isDisabled: '='
        }
    };
}]);;
angular.module('app').directive('addLotData', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/addLotData.html',
        scope: {
            data: '=',
            formName: '=',
            label: '=',
            inputSize: '=',
            isRequired: '=',
            pattern: '=',
            index: '=',
            name: '=',
            isDisabled: '='
        }
    };
});;
angular.module('app').directive('addPeriod', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/addPeriod.html',
        scope: {
            data: '=',
            minDate: '=',
            maxDate: '=',
            inputName: '=',
            hasError: '=',
            isRequired: '=',
            title: '=',
            hideTitle: '=',
            formName: '=',
            canBeEmpty: '=',
            needToEnableWeekendDays: '=',
            customPlaceholder: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.dateRegex = $scope.canBeEmpty ? $rootScope.regex.dateOrEmpty : $rootScope.regex.date;
            $scope.rongDay = false;
            $scope.disabledDays = '0,7'
            $scope.$watch('maxDate', function () {
                if (!$scope.maxDate) {
                    $scope.maxDateValue = Infinity;
                } else {
                    $scope.maxDateValue = new Date($scope.maxDate);
                }
            });

            var marchMonth = 3, year = 2021;
            var firstLoad = true;
            function timeIsInMarch(time) {
                return time && time.getMonth() + 1 === marchMonth && time.getFullYear() === year
            }
            function checkIfDateIsValidObject(time) {
                return time && time instanceof Date && !isNaN(time);
            }

            $scope.$watch('data', function (timeStamp, oldtimeStamp) {
                if (!checkIfDateIsValidObject(timeStamp)) return false;
                if (timeIsInMarch(timeStamp)) {
                    if (timeStamp.getHours() === 0) {
                        if (!firstLoad && timeStamp.getMinutes() <= 59) {
                            $scope.hasErrorInMarchMonth = true;
                            return;
                        }
                        if (firstLoad && timeStamp.getMinutes() === 0) {
                            firstLoad = false;
                            timeStamp.setHours(timeStamp.getHours() + 1);
                            $scope.hasErrorInMarchMonth = false;
                            return;
                        }
                    } else {
                        firstLoad = false;
                        $scope.hasErrorInMarchMonth = false;
                    }
                }
            });

            $scope.checkIfWorkDay = function (date) {
                if ($scope.needToEnableWeekendDays) return true; //флаг для календарей аналитике что бы не валидировать их
                if (ifWorkDay(date)) {
                    $scope.rongDay = false;
                    $scope.formName.$setValidity($scope.inputName, true);
                } else {
                    $scope.rongDay = false;
                    $scope.formName.$setValidity($scope.inputName, true);
                }
            }

            function ifSaturday(date) {
                if (!date) return false;
                var weekDay = date.getDay();
                if (weekDay === 6)
                    return true;
                return false;
            };            

            function ifWorkDay(date) {
                if (!date) return false;
                var day = date.getDate();
                var month = date.getMonth() + 1;
                var year = date.getFullYear();
                if ((day === 21 && month === 12 && year === 2019) || (day === 28 && month === 12 && year === 2019) || (day === 11 && month === 01 && year === 2020) ||
                    (day === 16 && month === 1 && year === 2021))
                    return true;
                return false;
            }

        }]
    };
});
;
angular.module('app').component('addPlanId', {
    templateUrl: '~/App/Main/base/directives/tender/createTender/addPlanId.html',
    bindings: {
        data: '=',
        form: '=',
        condition: '<'
    },
    controllerAs: 'ctrl',
    controller: [
        'abp.services.etender.plan',
        '$rootScope',
        '$location',
        '$scope',
        '$localStorage',
        function (
            planAppService,
            $rootScope,
            $location,
            $scope,
            $localStorage
        ) {
            $scope.ng_localStorage = $localStorage;
            var ctrl = this;
            if (!this.plans) this.plans = [{}];
            ctrl.inputPattern = /^ua-p-\d{4}-\d{2}-\d{2}-\d{6}-[a-z]$/i;

            function clearServerData(plan) {
                plan.errors = null;
                plan.tender = null;
                plan = null;
            }
            $scope.addPlan = function () {
                ctrl.plans.push({});
            }

            function findCodeCpv() {
                if (ctrl.data.lots && ctrl.data.lots.length) {
                    for (var i = 0; i < ctrl.data.lots.length; i++) {
                        for (var j = 0; j < ctrl.data.lots[i].items.length; j++) {
                            if (ctrl.data.lots[i].items[j] && ctrl.data.lots[i].items[j].classification.id && ctrl.data.lots[i].items[j].classification.code) {
                                return ctrl.data.lots[i].items[j].classification.code;  //for draft id is codeCpv
                            }
                            else if (ctrl.data.lots[i].items[j] && !ctrl.data.lots[i].items[j].classification.code) {
                                return ctrl.data.lots[i].items[j].classification.id;
                            }
                        }
                    }
                }
                return null;
            }

            function findPlan(plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', null);
                if (!plan.planUaId) return;
                if (ctrl.plans.some(function (x) { return x.planUaId === plan.planUaId && x.id })) {
                    plan.errors = ['Цей рядок плану закупівлі уже прив\'язано'];
                    return;
                }
                clearServerData(plan);

                abp.ui.setBusy();
                planAppService.getPlanWithExceptionForCreateTender({
                    planIdUa: plan.planUaId,
                    procurementMethodType: ctrl.data.procurementMethodType,
                    tenderCodeCpv: findCodeCpv(),
                    PlanIds: ctrl.data.PlanIds
                }).then(
                    function (response) {
                        plan.errors = response.data.errors;
                        plan.tender = response.data.tender;
                        if (!ctrl.data.PlanIds) ctrl.data.PlanIds = [];
                        if (response.data.errors.length == 0) {
                            ctrl.data.PlanIds = ctrl.data.PlanIds.concat(response.data.plan.id);
                            plan.id = response.data.plan.id;
                            plan.procurementMethodType = response.data.plan.procurementMethodType;
                            plan.disableInput = true;
                            $rootScope.$broadcast('fillItemCpvByPlanId', response.data.plan.id);
                        } else {
                            plan.disableInput = false;
                        }
                        
                        abp.ui.clearBusy();
                    },
                    function (error) {
                        plan.disableInput = false;
                        abp.ui.clearBusy();
                    }
                );
            }

            ctrl.onBlur = function () {
                findPlan();
            }

            ctrl.isCorrectPlan = function (value, plan) {
                if (!value)
                    return true;
                if (plan.errors && plan.errors.length)
                    return false;
                return ctrl.isPlanRequired(plan);
            }
            ctrl.isPlanRequired = function (plan) {
                if (!ctrl.data.PlanIds &&
                    (!(ctrl.data.procurementMethodType === 'belowThreshold' ||
                        ctrl.data.procurementMethodType === 'reporting') /*|| ctrl.planExternalId != null*/))
                    return false;
                if (plan.disableInput) return true;
                return !(ctrl.data.procurementMethodRationale == 'COVID-19' || ctrl.data.procurementMethodRationale == 'simple');
            }

            var firstPlanSearch = true;
            $scope.searchPlan = function(plan, event) {
                if (event.type == 'click' && !firstPlanSearch) return false;
                findPlan(plan);
                firstPlanSearch = false;
            };

            ctrl.onChange = function (plan) {
                //$rootScope.$broadcast('fillItemCpvByPlanId', null);
                plan.disableInput = false;
                clearServerData(plan);
            }
            this.$onChanges = function () {
                if (!angular.equals($location.search(), {}) && $location.search().planIdUa) {
                    ctrl.plans[0].planUaId = $location.search().planIdUa;
                    ctrl.plans[0].disableInput = true;
                    findPlan(ctrl.plans[0]);
                }
                else
                    ctrl.plans[0].disableInput = false;
            }

            $scope.isCanAddPlans = function() {
                if ($scope.ng_localStorage.organizationKindId !== 5)
                    return false;
                var haveErrors = ctrl.plans.some(function (x) { return x.errors && x.errors.length > 0; } );
                var allPlansCzo = ctrl.plans.some(function (x) { return x.procurementMethodType !== 'centralizedProcurement' });
                return !haveErrors && !allPlansCzo;
            }
            $scope.isCanEditPlan = function() {
                return ctrl.condition === 'create' || (ctrl.data.notExport && !(ctrl.data.id && ctrl.data.plans.length > 0));
            }
            $scope.removePlan = function (plan) {
                var planIndex = ctrl.plans.indexOf(plan);
                firstPlanSearch = true;
                if (planIndex > -1) {
                    ctrl.plans.splice(planIndex, 1);
                    if (ctrl.plans.length < 1) ctrl.plans.push({});
                    if (ctrl.data.PlanIds) {
                        var listPlanIndex = ctrl.data.PlanIds.indexOf(plan.id);
                        if (listPlanIndex > -1) ctrl.data.PlanIds.splice(listPlanIndex, 1);
                    }
                }
            }
            $scope.searchByEDRPOU = function (edrpou) {
                if (!edrpou) return;
                $localStorage.searchPage = null;
                $location.path('edrpouSearch/' + edrpou);
            }

        }]
});
;
angular.module('app').directive('addTitle', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('addTitle from cache'),
        scope: {
            data: '=',
            label: '=',
            formName: '=',
            inputTitle: '=',
            isDisabled: '='
        }
    };
}]);;
angular.module('app').directive('addTitleEn', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/addTitleEn.html',
        scope: {
            data: '=',
            label: '=',
            formName: '=',
            isRequired: '=',
            isDisabled: '='
        },
        controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.regexEN = $rootScope.regex.english;
        }]
    };
});;
angular.module('app').directive('createTenderAccelerator', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('createTenderAccelerator from cache'),
        scope: {
            data: '=',
            formName: '=',
            condition: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            function ($scope, $localStorage) {

                $scope.isProdMode = $localStorage.isProdMode;
                $scope.isTestSite = $localStorage.isProductionSite;
                $scope.isCreateTender = $scope.condition === 'create';

                $scope.vm = {
                    acceleratorTypes: [{ name: '', type: '' }, { name: 'no-auction', type: 'quick(mode:no-auction)' }, { name: 'fast-forward', type: 'quick(mode:fast-forward)' }]
                }
            }
        ]
    }
}]);
angular.module('app').directive('isMultilots', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/isMultilots.html',
        scope: {
            data: '=',
            isDisabled: '=',
            inputTitle: '='
        }, controller: [
            '$scope', function ($scope) {

                $scope.settingsForTender = function (data) {
                    if (!data.isMultilots) $scope.data.lots.length = 1; 
                    if (data.isMultilots && data.milestones) 
                        delete data.milestones;
                    else if (!data.isMultilots && data.lots[0].milestones)
                        delete data.lots[0].milestones;
                };

            }]
    };
});;
angular.module('app').directive('taxIncluded', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/createTender/taxIncluded.html',
        scope: {
            data: '='
        }
    };
});;
angular.module('app')
    .directive('tenderForm', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderForm.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                isEditMode: '=',
                condition: '=',
                vm: '=',
                skipEndDateValidation: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                'datesHelperService',
                '$location',
                '$localStorage',
                'addFeaturesService',
                'tenderFormService',
                'tenderFormMinStepService',
                'abp.services.etender.workingDays',
                function (
                    $rootScope,
                    $scope,
                    datesHelperService,
                    $location,
                    $localStorage,
                    addFeaturesService,
                    tenderFormService,
                    tenderFormMinStepService,
                    workingDays) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.isFirstRun = true;

                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        changeGuarantee: changeGuarantee,
                        isFunder: false,
                        addLotAndItem: addLotAndItem
                    };
                    var vm = $scope.vm;
                    $scope.tenderPeriodMinDate = -Infinity;
                    $scope.$watch('data.tenderPeriod.startDate', function () {
                        if ($localStorage.isProdMode && $scope.data.tenderPeriod && $scope.data.tenderPeriod.startDate) {
                            var startDate = new Date($scope.data.tenderPeriod.startDate);
                            if (!$scope.skipEndDateValidation) {
                                if ($scope.isFirstRun) {
                                    $scope.isFirstRun = false;
                                } else {
                                    workingDays.getLastWorkingDayByCount(startDate.toDateString(), 3).then(function (request) {
                                        $scope.tenderPeriodMinDate = new Date(request.data);
                                    });
                                }
                            }
                        }
                    });
                    $scope.$watch('data.enquiryPeriod.endDate', function () {
                        if ($localStorage.isProdMode && $scope.data.enquiryPeriod) {
                            var endDate = new Date($scope.data.enquiryPeriod.endDate);
                            $scope.tenderPeriodStartMinDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());
                        } else {
                            $scope.tenderPeriodStartMinDate = -Infinity;
                        }
                    });

                    $scope.tooltipOptionValue = { 'title': 'Зверніть увагу! Найкраща опція має складати найбільший відсоток ваги.' };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };


                    // если мы в создании тендера (не из шаблона) - сразу по умолчанию добавляем лот и айтем
                    //if ($location.url().indexOf("create") > -1 && ($location.url().indexOf("createTender") === -1)) {
                    if ($location.url().indexOf("create") > -1 && $scope.data && $scope.data.lots) {
                        $scope.vm.addLot();
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;
                    $scope.date2017 = new Date('2017/01/01');

                    $scope.checkIsDate1970 = function (date) {
                        if (!date)
                            return;
                        var curDate = new Date();
                        if (date.getMonth() == 0 && date.getDate() == 1 && date.getFullYear() == 1970) {
                            date.setFullYear(curDate.getFullYear());
                            date.setMonth(curDate.getMonth());
                            date.setDate(curDate.getDate());
                        }
                    };
                    $scope.checkAllIsDate1970 = function () {
                        $scope.checkIsDate1970($scope.data.enquiryPeriod.endDate);
                        $scope.checkIsDate1970($scope.data.tenderPeriod.startDate);
                        $scope.checkIsDate1970($scope.data.tenderPeriod.endDate);
                    };

                    $scope.isStepValid = function (lot, element) {
                        var isValid = false;
                        isValid = tenderFormMinStepService.isStepValidWithThresholds(lot);

                        if (lot.value.budgetNotDeterm) isValid = true;
                        if (element) {
                            element.$setValidity("isStepValid", isValid);
                        }
                        return isValid;
                    };

                    // валиден ли период для вопросов
                    $scope.isTenderPeriodEnough = function (firstDate, lastDate) {
                        // только для Реального режима
                        if (!$scope.ng_localStorage.isProdMode || !$scope.data.lots) {
                            return true;
                        }
                        var lots = $scope.data.lots;
                        var isValid = true;

                        if (!lastDate || !firstDate || !lots || lots.length < 1) {
                            return true;
                        }
                        var daysBetwen = datesHelperService.howManyDaysLeftBetweenDates(firstDate, lastDate);
                        // сумма максимального лота
                        var lotMaxSum = $scope.getLotMaximumSum(lots);
                        if (lotMaxSum > 0 && lotMaxSum < 50000 && daysBetwen < $scope.minimumDaysNeedForTenderPeriod(lotMaxSum)) {
                            isValid = false;
                        } else if (lotMaxSum >= 50000 && lotMaxSum <= 1500000 && daysBetwen < $scope.minimumDaysNeedForTenderPeriod(lotMaxSum)) {
                            isValid = false;
                        }

                        //console.log('daysBetwen=' + daysBetwen + '   lotMaxSum=' + lotMaxSum + '   isValid=' + isValid);

                        // выставляем валидность формы
                        $scope.formname.$setValidity("startDate", isValid);
                        return isValid;
                    };

                    $scope.isWeekend = function (date, element) {
                        // только для Реального режима
                        if (!$scope.ng_localStorage.isProdMode) {
                            return false;
                        }
                        if (date) {

                            var isWeekEnd = datesHelperService.isWeekend(date);
                            //if (date.getDay === undefined) {
                            //    isWeekEnd = ((new Date(date)).getDay() % 6 == 0);
                            //} else {
                            //    isWeekEnd = (date.getDay() % 6 == 0);
                            //}

                            if (element) {
                                element.$setValidity("isWeekend", !isWeekEnd);
                            }
                            return isWeekEnd;
                        }
                        return false;
                    }

                    $scope.$watch('data.creationTime', function () {
                        $scope.enquiryPeriodEndDateMin = -Infinity;
                        if ($localStorage.isProdMode) {
                            if ($scope.isEditMode) {
                                if ($scope.data.creationTime) {
                                    workingDays.getLastWorkingDayByCount($scope.data.creationTime, 3).then(function (request) {
                                        $scope.enquiryPeriodEndDateMin = new Date(request.data);
                                    });
                                }

                            }
                        }
                    });

                    // минимальное кол-во дней для вопросов исходя из max сумы тендера
                    $scope.minimumDaysNeedForTenderPeriod = function (lotMaxSum) {
                        if (lotMaxSum > 0 && lotMaxSum < 50000) {
                            return 1;
                        } else if (lotMaxSum >= 50000 && lotMaxSum <= 1500000) {
                            return 2;
                        }
                    };

                    // валиден ли период для вопросов
                    $scope.isEnquiryPeriodEnough = function (firstDate) {

                        // только для Реального режима
                        if (!$scope.ng_localStorage.isProdMode || !$scope.data.lots) {
                            return true;
                        }

                        var lots = $scope.data.lots;
                        var isValid = true;



                        if (!firstDate || !lots || lots.length < 1) {
                            return true;
                        }

                        // БУДЕМ ВЫСЧИТЫВАТЬ РАЗНИЦУ МЕЖДУ ТЕКУЩИМ ВРЕМЕНЕМ
                        var nowDate = new Date();
                        if ($scope.isEditMode) {
                            nowDate = $scope.data.creationTime;
                        }


                        var daysBetwen = datesHelperService.howManyDaysLeftBetweenDates(nowDate, firstDate);
                        if ($scope.isEditMode) {
                            daysBetwen = daysBetwen + 0.3; // UTC time
                        }
                        // сумма максимального лота
                        var lotMaxSum = $scope.getLotMaximumSum(lots);
                        if (lotMaxSum > 0 && lotMaxSum < 50000 && daysBetwen < $scope.minimumDaysNeedForEnquiryPeriod(lotMaxSum)) {
                            isValid = false;
                        } else if (lotMaxSum >= 50000 && lotMaxSum <= 1500000 && daysBetwen < $scope.minimumDaysNeedForEnquiryPeriod(lotMaxSum)) {
                            isValid = false;
                        }
                        // выставляем валидность формы
                        $scope.formname.$setValidity("enquiryPeriod", isValid);
                        //console.log('daysBetwen=' + daysBetwen + '   lotMaxSum=' + lotMaxSum + '   isValid=' + isValid);
                        return isValid;
                    };

                    // минимальное кол-во дней для вопросов исходя из max сумы тендера
                    $scope.minimumDaysNeedForEnquiryPeriod = function (lotMaxSum) {
                        if (lotMaxSum > 0 && lotMaxSum < 50000) {
                            return 1;
                        } else if (lotMaxSum >= 50000 && lotMaxSum <= 1500000) {
                            return 3;
                        }
                    };

                    $scope.disableWeekEndsAndDayOffs = function (date, mode) {
                        //return datesHelperService.disableWeekEndsAndDayOffs(date, mode);
                        //return (mode === 'day' && (date.getDay() === 0 || date.getDay() === 6));
                        var curDate = new Date();
                        return {
                            start: curDate.getTime() - 1000,
                            end: curDate.getTime() + 1000
                        };
                    };



                    // сумма максимального лота
                    $scope.getLotMaximumSum = function (lots) {
                        var lotMaxSum = 0;
                        angular.forEach(lots, function (lot) {
                            if (!lot || !lot.value || !lot.value.amount)
                                return 0;
                            var lotSum = parseInt(lot.value.amount);
                            if (lotSum) {
                                lotMaxSum = lotSum > lotMaxSum ? lotSum : lotMaxSum;
                            }
                        });
                        return lotMaxSum;
                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };

                    $scope.$watch("data.value.valueAddedTaxIncluded",
                        function (n) {
                            angular.forEach($scope.data.lots, function (lot) {
                                lot.value.valueAddedTaxIncluded = n;
                                lot.minimalStep.valueAddedTaxIncluded = n;
                            });
                        });

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function addLotAndItem() {
                        tenderFormService.addLotAndItem($scope.data);
                    }

                    function addLot() {
                        tenderFormService.addLot($scope.data);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }

                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    //function removeItemAdditionalClassification(item, ind) {
                    //    item.additionalClassifications.splice(ind, 1);
                    //}

                    $scope.$on('showModalAddClassification',
                        function (data, modal, lotInd, itemInd) {
                            $scope.lotInd = lotInd;
                            $scope.itemInd = itemInd;
                            var id = modal + '_' + lotInd + '_' + itemInd;
                            $(id).modal('show');
                        });

                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };
                }]
        };
    });
;
angular.module('app').directive('tenderProfile', [
    '$templateCache',
    function ($templateCache) {
        return {
            //template: $templateCache.get('tenderProfile from cache'),
            templateUrl: '/App/Main/base/directives/tender/createTender/tenderProfile.html',
            restrict: 'AE',
            scope: {
                data: '=',
                condition: '=',
                showButtonOnCreatePage: '='
            },
            controller: [
                '$scope',
                '$window',
                'classificationSearchService',
                'abp.services.etender.reference',
                '$localStorage',
                '$sessionStorage',
                '$timeout',
                '$location',
                function ($scope, $window, classificationSearchService, reference, $localStorage, $sessionStorage, $timeout, $location) {

                    $scope.showGroupsModal = function (index) {
                        modalWithIndex(index);
                    };
                    
                    $scope.$watch(function () {
                        return $scope.data.lots[0]
                    }, function (lotExist) {
                        $scope.data.choosedProfileIds = [];
                        if (lotExist && $scope.condition === 'update') {
                            getAllProfileApiIdsForUpdatePage(lotExist.items)
                        }
                    });

                    $scope.addGroupsModal = function (index) {
                        $scope.data.lots[0].items.push({
                            description: '',
                            title: '',
                            features: [],
                            deliveryAddress : {
                                region: ''
                            }
                        });
                        $timeout(function () {
                            modalWithIndex(index + 1);
                        }, 200);
                    }

                    function modalWithIndex(index) {
                        $('#modalTenderProfileGroups_' + index).modal('show');
                    }

                    function getAllProfileApiIdsForUpdatePage(items) {
                        items.forEach(function (item) {
                            if (item.profile) {
                                $scope.data.choosedProfileIds.push(item.profile.apiId);
                            }
                        });
                    }

                    $scope.clearProfileValue = function (item, index) {
                        delete $scope.data.lots[0].items[index].selectedItemRequirements;
                        item.classification = '';
                        item.description = '';
                        item.title = '';
                        item.profileId = '';
                        item.additionalClassifications = [{
                            description: '',
                            id: '',
                            scheme: ''
                        }];
                        if ($scope.data.choosedProfileIds && $scope.data.choosedProfileIds.length) {
                            $scope.data.choosedProfileIds.splice(index, 1);
                        }
                        item.quantity = '';
                        item.deliveryDate = {
                            endDate: '',
                            startDate: ''
                        }
                        if (item.deliveryAddress) {
                            delete item.deliveryAddress.region;
                            delete item.deliveryAddress.city;
                            delete item.deliveryAddress.addressStr;
                            delete item.deliveryAddress.postIndex;
                        }
                        if (item.profile && item.profile.title) {
                            item.profile.title = '';
                        }
                        if ($scope.data.profile && $scope.data.profile.title) {
                            $scope.data.profile.title = '';
                        }
                        if (index >= 1 || $scope.data.lots[0].items.length > 1) {
                            $scope.data.lots[0].items.splice(index, 1);
                        }
                        if ((!$scope.data.lots[0].items[0].profile.title && $scope.condition == 'update') ||
                            !$scope.data.lots[0].items[0].title &&
                            $scope.data.lots[0].items.length === 1) {
                            $scope.data.choosedCategoryAgreementId = '';
                            $scope.$broadcast('reloadTable');
                        }
                        if (!$scope.data.pqDate) {
                            $scope.data.selectedProfile.item = '';
                        }
                    };

                    $scope.getTranslationForValue = function (value) {
                        if (value === 'True') {
                            return 'Так'
                        } else if (value === 'False') {
                            return 'Ні'
                        } else {
                            return value;
                        }
                    };
                }
            ]
        };
    }
]);
;
angular.module('app').directive('tenderContactPoint', [
    '$templateCache',
    function ($templateCache) {
        return {
            template: $templateCache.get('tenderContactPoint from cache'),
            restrict: 'AE',
            scope: {
                data: '=',
                formName: '='
            },
            controller: [
                '$scope',
                '$localStorage',
                function ($scope, $localStorage) {
                    $scope.isEmailRequired = true;
                    $scope.isPhoneRequired = true;
                    var copiedUserData = {};

                    $scope.$watch('data', function (data) {
                        var orgName = data.organization ? data.organization.contactPoint.name : ($localStorage.userData.surname || '') + ' ' + ($localStorage.userData.name || '') + ' ' + ($localStorage.userData.patronymic || ''),
                            orgEmail = data.organization ? data.organization.contactPoint.email : $localStorage.userData.emailAddress,
                            orgPhone = data.organization ? data.organization.contactPoint.telephone : $localStorage.userData.phone,
                            orgFax = data.organization ? data.organization.contactPoint.faxNumber : $localStorage.userData.fax,
                            orgUrl = data.organization ? data.organization.contactPoint.url : $localStorage.userData.url;
                        $scope.userData = {
                            name: orgName,
                            email: orgEmail,
                            url: orgUrl,
                            phone: orgPhone,
                            fax: orgFax
                        }
                    });

                    $scope.toggleBetweenEditMode = function () {
                        copiedUserData = angular.copy($scope.userData)
                        $scope.contactEditMode = !$scope.contactEditMode;
                    }

                    $scope.cancelOrUpdateContactUserData = function (param) {
                        if (param === 'fill') {
                            $scope.userData = {
                                name: ($localStorage.userData.surname || '') + ' ' + ($localStorage.userData.name || '') + ' ' + ($localStorage.userData.patronymic || ''),
                                email: $localStorage.userData.emailAddress,
                                url: null,
                                phone: $localStorage.userData.phone,
                                fax: $localStorage.userData.fax
                            }
                        }
                        if (param === 'cancel') {
                            $scope.userData = {
                                name: copiedUserData.name,
                                email: copiedUserData.email,
                                url: copiedUserData.url,
                                phone: copiedUserData.phone,
                                fax: copiedUserData.fax
                            }                            
                            $scope.toggleBetweenEditMode();
                        }
                    }

                    $scope.$watch('userData', function () {
                        $scope.$emit('userDataFields', $scope.userData);
                    }, true);

                    $scope.$watch('userData.email', function (data) {
                        return data && data !== '' ? $scope.isPhoneRequired = false : $scope.isPhoneRequired = true;
                    });
                    $scope.$watch('userData.phone', function (data) {
                        return data && data !== '' ? $scope.isEmailRequired = false : $scope.isEmailRequired = true;
                    });

                    $scope.isFormInvalid = function () {
                        return (
                            $scope.formName.input_name.$invalid || 
                            $scope.formName.input_email.$invalid ||
                            $scope.formName.input_url.$invalid
                        )
                    }

                }
            ]
        }
    }
]);
angular.module('app').directive('awardsInfo',
    ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/App/Main/base/directives/tender/tenderDetailes/awardsInfo.html',
        //template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/awardsInfo.html'),
        template: $templateCache.get('awardsInfo from cache'),
        scope: {
            tender: '=',
            lot: '=',
            reload: '&'
        },
        controller: [
            '$scope',
            '$localStorage',
            '$rootScope',
            '$timeout',
            '$http',
            '$window',
            '$ocLazyLoad',
            'documentsService',
            'organizationDataService',
            'abp.services.etender.youControl',
            'abp.services.etender.award',
            'abp.services.etender.filePath',
            function (
                $scope,
                $localStorage,
                $rootScope,
                $timeout,
                $http,
                $window,
                $ocLazyLoad,
                documentsService,
                organizationDataService,
                youControl,
                award,
                filePathService) {

            $scope.yamlInfo = {};
            $scope.isUserLoggedIn = $localStorage.isAuthorized;
            $scope.localStorage = $localStorage;

            
            // show documents .yaml format in modal window
            $scope.formatDetect = function (doc, id) {
                var title = doc.title;
                if (title.indexOf('.yaml') !== -1) {
                    modalYamlOpen(doc, id);
                } else {
                    $scope.previewDoc(doc);
                }
            }

                $scope.searchOnYouControl = function (edrpou) {
                    abp.ui.setBusy();
                    youControl.getYouControlLink(edrpou)
                        .then(function (response) {
                            window.open(response.data, "_blank");
                        })
                        .finally(function () { abp.ui.clearBusy(); });
                }

            function modalYamlOpen(doc, id) {
                    $ocLazyLoad.load('Scripts/yaml.js').then(function () {
                        var url = doc.url;
                        var modalName = '#modalYamil' + '-' + id;
                        $http.get(url).then(function (data) {
                            $scope.yamlInfo = YAML.parse(data.data);
                            delete $scope.yamlInfo.meta;
                            jQuery(modalName).modal('show');
                            //console.log($scope.yamlInfo);
                        });
                    });
                }

            $scope.awardAcceptedBySupplier = function (awardId) {
                abp.ui.setBusy('body');
                award.acceptSupplierAward(awardId).then(
                    function (data) {
                        $scope.reload();
                        abp.ui.clearBusy('body');
                    },
                    function (error) {
                        $scope.reload();
                        abp.ui.clearBusy('body');
                        console.log(error);
                    }
                )
            };

            $scope.awardCancelledBySupplier = function (awardId) {
                abp.ui.setBusy('body');
                award.cancelSupplierAward(awardId).then(
                    function (data) {
                        $scope.reload();
                        abp.ui.clearBusy('body');
                    },
                    function (error) {
                        $scope.reload();
                        abp.ui.clearBusy('body');
                        console.log(error);
                    }
                )
            };
                
            // print .yaml document
            $scope.printDiv = function (index, parentIndex, lotIndex) {
                var divNamePrint = 'printDiv' + '-' + index + '-' + parentIndex + '-' + lotIndex;
                var printContents = document.getElementById(divNamePrint).innerHTML;
                var popupWin = window.open('', '_blank', 'width=600,height=300');
                popupWin.document.open();
                popupWin.document.write('<html><head><link rel="stylesheet" type="text/css" href="' + abp.setting.get('ProzorroSiteUrl') + 'Content/bootstrap-cerulean.min.css" /></head><body onload="window.print()">' + printContents + '</body></html>');
                popupWin.document.close();
            }

            // change .yaml name to 'Виписка з ЄДР'
            $scope.detectYamlName = function (title) {
                if (title.indexOf('.yaml') !== -1)
                    return 'Виписка з ЄДР';
                    return title;

            };

            // Documents Prev START

            $scope.previewDoc = function (doc, award) {
                if (doc.url) {
                    documentsService.previewDoc(doc, $scope);
                } else {
                    $scope.getConfidentialityFileUrl(doc, award).then(function (response) {
                        doc.url = response.data;
                        documentsService.previewDoc(doc, $scope);
                    })
                }
            }

            $scope.trustSrc = function (src) {
                return documentsService.trustSrcForDocLoad(src);
            }

                $scope.goToUrl = function (url) {
                    window.location = url;
                }

            // Documents Prev END

            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;

            $scope.getContractingDate = function(dt) {
                return new Date(dt);
            };

            $scope.canShowContract = function (currentAward) {
                if (currentAward) {
                    if (currentAward.status == "active" && currentAward.contracts.length > 0) {
                        return true;
                    }

                    if (currentAward.status != "active" && currentAward.contracts.length > 0 && currentAward.contracts[0].documents && currentAward.contracts[0].documents.length > 0) {
                        return true;
                    }
                }

                return false;
            };

            $scope.currentContract = {};

            $scope.getOrganizationToolTipText = function (organization) {
               return organizationDataService.getOrganizationToolTipText(organization);
            }

            $scope.sortDocs = function (change) {
                console.log(change);
                change.documents = documentsService.sortListOfDocs(change.documents);
            }

            $scope.getFileTitle = function (title) {                

                if (title.indexOf('.yaml') !== -1)
                    return 'Виписка з ЄДР';

                else if (title.match(/^\w{14}J16\w*\.KVT\.p7s$/i) != null)
                    // Расширение .KVT.p7s
                    // В названии с 15 по 17 знак указано значение J16
                    // Пример названия файла 26590002426097J1603101100000000111220172659.KVT.p7s
                    return 'Квитанція №1 з ДФС про відсутність заборгованості';

                else if (title.match(/^\w{14}J17\w*\.XML\.p7s$/i) != null)
                    // Расширение .XML.p7s
                    // В названии с 15 по 17 знак указано значение J17
                    // Пример названия файла 26590039292197J1703101100000000111220172659.XML.p7s
                    return 'Інформація (Квитанція №2) з ДФС про відсутність заборгованості';

                return title;
            }

            $scope.getDocumentFormat = documentsService.getFormat;

            $scope.downloadDocument = function (doc) {
                if (documentsService.getFormat(doc) === 'dfs') 
                    documentsService.downloadDfsPdf(doc, $scope);
            }

            $scope.loadInfoAboutCustomerDisabled = function () {

                var tenderFromECatalog = ($scope.tender.tenderOffers.length > 0);

                var tenderSigned = $scope.tender.documents.some(function (doc) {
                    return doc.title === "sign.p7s";
                })

                if (tenderFromECatalog && !tenderSigned && $scope.tender.status === "active") {
                    return true;
                }

                return false;
                }

            $scope.cancelAward = function (awardId) {
                var cancelAwardInput = {
                    awardId: awardId,
                    tenderId: $scope.tender.id, 
                    description: ''
                };
                
                var cancelAward = award.cancelAward(cancelAwardInput);
                cancelAward.then(function (data) {
                    $scope.reload && $scope.reload();
                });

                return cancelAward;
            }

                $scope.getAwardDocsInfo = function (lotId, awardId) {
                    abp.ui.setBusy('.modal-content');
                    award.getAward({ lotId: lotId, awardId: awardId })
                        .then(function (response) {
                            if (response && response.data) {
                                $rootScope.$broadcast('award', { lotId: lotId, award: response.data });
                                abp.ui.clearBusy('.modal-content');
                            }
                        });
                }

                $scope.getConfidentialityFileUrl = function (doc, award) {
                    return filePathService.getConfidentialityFileUrl({
                        TenderApiId: $scope.tender.apiId,
                        BidApiId: $scope.getBidApiIdForDoc(award.bidId),
                        DocumentApiId: doc.apiId || doc.id
                    }).then(function (resp) {
                        return filePathService.getDownloadUrlForPrivateDoc({ FileUri: resp.data });
                    });
                }

                $scope.downloadPrivateDoc = function (doc, award) {
                    $scope.getConfidentialityFileUrl(doc, award).then(function (response) {
                        $window.open(response.data, '_self');
                    });
                }

                $scope.getBidApiIdForDoc = function (bidId) {
                    return $scope.lot.bids.find(function (simpleBid) { return bidId === simpleBid.id }).apiId;
                }

                $scope.getAwardBid = function (bidId) {
                    return $scope.lot.bids.find(function (bid) {
                        return bid.id === bidId;
                    });
                }

                $scope.isMyAward = function (bidId) {
                    var bid = $scope.getAwardBid(bidId);
                    return bid && bid.isMyBid;
                }

                $scope.canDownloadPrivateDoc = function (bidId) {
                    if ($localStorage.organization) {
                        return $scope.isMyAward(bidId) ||
                            $localStorage.organization.identifier.apiId === $scope.tender.organization.identifier.apiId;
                    } else {
                        return false;
                    }
                   
                }

                $scope.showCity = function (city) {
                    if (city) {
                        return city.indexOf('м. Київ') !== -1 
                            || city.indexOf('м. Киев') !== -1 
                            || city.indexOf('Севастополь') !== -1;
                    }
                }
        }]
    };
}]);;
angular.module('app').component('enquiryPeriodInfo', {
    // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/enquiryPeriodInfo.html',
    template: ['$templateCache', function ($templateCache) {
        return $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/enquiryPeriodInfo.html')
    }],
    bindings: {
        tender: '<'
    },
    controllerAs: 'ctrl',
    controller: ['$rootScope', function enquiryPeriodInfoCtrl($rootScope) {
        this.regexPattern = $rootScope.regex.wordAnyLanguage;
        this.root = $rootScope;
        var s = new Date();
        this.dateToDay = Date.parse(s);

    }]
});

//angular.module('app').directive('enquiryPeriodInfo', function () {
//    return {
//        restrict: 'AE',
//        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/enquiryPeriodInfo.html',
//        scope: {
//            tender: '='
//        },
//        controller: ['$scope', '$rootScope', '$timeout', function ($scope, $rootScope, $timeout) {
//            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;
//            var s = new Date();
//            $scope.dateToDay = Date.parse(s);
//        }]
//    };
//});;
angular.module('app').directive('infoBlock', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/infoBlock.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/infoBlock.html'),
        scope: {
            tender: '='
        }
    };
}]);;
angular.module('app').directive('lotBid',
    ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/lotBid.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/lotBid.html'),
        scope: false
    };
}]);;
angular.module('app').directive('lotBids', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/lotBids.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/lotBids.html'),
        scope: {
            tender: '=',
            canSetFutersBid: '=',
            lot: '=',
            reload: '&',
            doctype: '=',
            allowedExtensions: '=',
            reloadBid: '&',
            parentIndex: '=',
            vm: '='
        },
        controller: [
            '$scope',
            '$rootScope',
            'abp.services.etender.bid',
            'abp.services.etender.bidDocument',
            '$location',
            '$http',
            'Upload',
            '$timeout',
            'documentsService',
            'lookupService',
            '$localStorage',
            '$q',
            '$sessionStorage',
            '$ocLazyLoad',
            'abp.services.etender.log',
            'siteSettingsService',
            'organizationDataService',
            'loadTypesAndConfident',
            'abp.services.etender.youControl',
            'uploadFileService',
            'bidHelperService',
            'bidDocumentTypeService',
            'abp.services.etender.getTender',
            'addFeaturesService',
            '$cookies',
            function (
                $scope,
                $rootScope,
                bidService,
                bidDocument,
                $location,
                $http,
                Upload,
                $timeout,
                documentsService,
                lookupService,
                $localStorage,
                $q,
                $sessionStorage,
                $ocLazyLoad,
                logAppService,
                siteSettingsService,
                organizationDataService,
                loadTypesAndConfident,
                youControl,
                uploadFileService,
                bidHelper,
                bidDocumentTypeService,
                getTender,
                addFeaturesService,
                $cookies
            ) {

                var simultaneouslyUploadFilesCount = $localStorage.simultaneouslyUploadFilesCount || 5;
                $localStorage.sameTimeUploadFilesCount = $localStorage.sameTimeUploadFilesCount || 0;

                $scope.WriteAddress = function (tender) {
                    logAppService.logIpAddress("BidParticipationUrl", tender.tenderId);
                };

                var tooltip = '<p><b>' +
                    $rootScope.source('PayAttention') +
                    '</b> ' +
                    $rootScope.source('InfoBidRegister') +
                    '<br /> <b>' +
                    $rootScope.source("Attention") +
                    '</b> ' +
                    $rootScope.source("Draft") +
                    '<b> ' +
                    $rootScope.source("notMean") +
                    '</b> ' +
                    $rootScope.source("bidMustBe") +
                    ' <b><u>' +
                    $rootScope.source("registered") +
                    '</u></b> ' +
                    $rootScope.source("proofMessage") +
                    '</p>';
                $scope.tooltip = { 'title': tooltip };

                // Удалить
                // $scope.tender.myContractId = '112804c118ec409d8b66b7d599c7da54';

                if ($scope.tender.myBidFeatures) {
                    $timeout(function () {
                        setMyBidFeatures();
                    }, 2000);
                }

                $scope.searchOnYouControl = function (edrpou) {
                    abp.ui.setBusy();
                    youControl.getYouControlLink(edrpou)
                        .then(function (response) {
                            window.open(response.data, "_blank");
                        })
                        .finally(function () { abp.ui.clearBusy(); });
                }

                $scope.checkBidDocsHasDraft = function (lotIndex, $index, documents) {
                    $scope.showBidDocs = $scope.showBidDocs || [];
                    $scope.showBidDocs[lotIndex] = $scope.showBidDocs[lotIndex] || [];
                    if (documents.some(function (document) {
                        return document.notExport;
                    })) {
                        $scope.showBidDocs[lotIndex][$index] = true;
                    }
                }

                function setMyBidFeatures() {
                    var i = 0;
                    var lFuter = $scope.tender.myBidFeatures.length;
                    for (i; i < lFuter; i++) {
                        var myFeature = $scope.tender.myBidFeatures[i];
                        selectFeatures($scope.lot.features, myFeature);
                        selectFeatures($scope.lot.featuresTender, myFeature);
                    }
                }

                function selectFeatures(features, myFeature) {
                    var i = 0;
                    var lFuter = features.length;
                    for (i; i < lFuter; i++) {
                        var feature = features[i];
                        if (feature.id === myFeature.featureId)
                            setFeatureOptions(feature, myFeature);
                    }
                }

                function setFeatureOptions(feature, myFeature) {
                    var i = 0;
                    var lOptions = feature.options.length;
                    for (i; i < lOptions; i++) {
                        var option = feature.options[i];
                        if (option.id === myFeature.featureOptionId)
                            feature.soption = option;
                    }
                }

                $scope.ng_localStorage = $localStorage;
                $scope.uploadFilesCounter = 0;
                $scope.userTenantId = $scope.ng_localStorage.userTenantId;
                $scope.regexFloatNumber = $rootScope.regex.floatNumber;
                $scope.regexNumber = $rootScope.regex.number;
                $scope.fileUploadObj = {};
                $scope.bidToCheck = {};
                $scope.UserId = abp.session.userId;
                $scope.filesCounter = 0;
                $scope.editBidClicked = !$scope.lot.bids[0] || !$scope.lot.bids[0].status;
                $scope.isEsco = $scope.tender.procurementMethodType === 'esco';
                $scope.draftDocs = [];
                $scope.canExportDraft = true;
                $scope.maxDocsDeleted = 20;
                $scope.evidenceDocs = [];

                $scope.vm.choosedProduct = null;
                $scope.vm.choosedProductRequirements = [];
                $scope.vm.features = [];
                $scope.vm.finallyPrice = finallyPrice;
                $scope.vm.finallyPriceUpdate = finallyPriceUpdate;
                $scope.vm.featureWeight = 0;
                $scope.vm.priceWeight = 0;
                $scope.vm.coef = coef;
                $scope.vm.coefUpdate = coefUpdate;
                $scope.vm.maxCoef = 1;
                $scope.vm.optionSum = optionSum;
                $scope.vm.optionSumUpdate = optionSumUpdate;
                $scope.vm.isBidInvalid = isBidInvalid;
                $scope.vm.confirmBid = confirmBid;
                $scope.isTenderCriteriaValid = true;
                $scope.isSingleCriteriaValid = true;
                $scope.criteriaResponses = [];
                $scope.isUpdateExportButtonDisabled = false;
                $scope.isCriteriaChanged = false;
                $scope.isDocumentChanged = false;
                $scope.showBlockCriteriasGuarantee = {};

                var warningMsngShowen = false;

                var vm = $scope.vm;

                //initAnnualCost();
                var s = new Date();
                $scope.dateToDay = Date.parse(s);

                $scope.isAuthorized = function () {
                    return $localStorage.isAuthorized;
                };

                $scope.changeEditBidClicked = function (i) {
                    if (!i && i !== 0) {
                        i = 0;
                    }

                    $scope.editBidClicked = !$scope.editBidClicked;
                    if ($scope.editBidClicked) {
                        $scope.lotBidsOld = angular.copy($scope.lot.bids[i])
                    }
                    else {
                        window.removeEventListener('beforeunload', beforeUnloadHandler, false);
                        if ($scope.lotBidsOld) {
                            $scope.lot.bids[i] = $scope.lotBidsOld; // return old bid values
                        }
                    }
                };

                $scope.closeEditBidClicked = function (i) {

                    $scope.checkBidUpdated(i);

                    if ($scope.isBidEdited || $scope.isCriteriaChanged || $scope.isDocumentChanged) {
                        $('#saveEditBidChanges-' + $scope.modalId).modal('show');
                    } else {
                        $scope.changeEditBidClicked(i);
                    }

                    $scope.lot.bids[i].forceCheckSign = false;
                };

                var draftDocs = documentsService.getDraftDocs($scope.lot, $scope.lot.bids[0])
                var hasDraftDocs = documentsService.getDraftDocs($scope.lot, $scope.lot.bids[0]) && draftDocs && draftDocs.length;

                var beforeUnloadHandler = function (event) {
                    if (hasDraftDocs) {
                        event.returnValue = '';
                        event.preventDefault();
                    }
                }

                $scope.getActiveDocs = function (bid) {
                    return bid.documents.filter(function (doc) {
                        return !doc.isDeleted;
                    });
                }

                $scope.docsWaitingForSignExist = function (i) {
                    i = i ? i : 0;
                    var docsWaiting = $scope.lot.bids[i].documents.filter(function (doc) {
                        return !doc.apiId && !doc.notExport;
                    });

                    return docsWaiting.length !== 0;
                }

                $scope.$on('exportDraftChanges', function (event, documentObj) {
                    $scope.canExportDraft = documentObj.isValid;
                    $scope.draftDocs = documentObj.docs;
                    $scope.getEvidenceLotBidsDocs($scope.lot);
                    $scope.isDocumentChanged = documentObj.isDocumentChanged;
                });

                $scope.checkIfBidHasSignInNotExportStatus = function (bid) {
                    var bidSignDocuments = bid.documents.filter(function (document) {
                        return document.title === 'sign.p7s';
                    });

                    if (bidSignDocuments.length) {
                        var hasNoExport = false;
                        bidSignDocuments.forEach(function (bidSignDocument) {
                            if (!bidSignDocument.isExported && !bidSignDocument.notExport) {
                                hasNoExport = true;
                            }
                        });

                        return hasNoExport;
                    } else {
                        return false
                    }
                }

                $scope.isBidSigned = function (bid) {
                    if ($scope.tender.isBidSignNeeded && ($scope.tender.isSimpleProcurementMethodRationale || $scope.tender.procurementMethodType !== 'belowThreshold')) {
                        return bid.isBidSigned;
                    } else {
                        return true;
                    }
                }

                $scope.$on('bidSigned', function () {
                    $scope.reload();
                });

                $scope.needToShowEditFormView = function (bid) {
                    return bid.status === 'draft' || $scope.editBidClicked;
                }

                $scope.$watch(function () {
                    return !!($scope.editBidClicked && hasDraftDocs);
                }, function (isEditAndHasDraftDocs) {
                    if (isEditAndHasDraftDocs) {
                        window.addEventListener('beforeunload', beforeUnloadHandler, false);

                        $scope.$on('$stateChangeStart', function (evt) {
                            if (documentsService.getDraftDocs($scope.lot, $scope.lot.bids[0]).length) {
                                if (!confirm('Ви впевнені? Увага! Наявні документи в стані "Чернетка"')) {
                                    evt.preventDefault();
                                }
                            }
                        });
                    }
                });

                $scope.exportDraftDocs = function (needToChangeState, currentBid) {
                    var draftDocs = documentsService.getDraftDocs($scope.lot, currentBid);
                    if (draftDocs && draftDocs.length) {
                        if ($scope.tender.isBelowThreshold) {
                            draftDocs.forEach(function (doc) {
                                doc.confidentiality = null;
                            });
                        }
                        delConfRationale(draftDocs);
                        abp.ui.setBusy();
                        bidDocument.editAndSendNotExportBidDocuments(draftDocs).then(function () {
                            abp.ui.clearBusy();
                            if (needToChangeState) {
                                $scope.editBidClicked = !$scope.editBidClicked;
                            }
                            $scope.$emit('reloadTender');
                        }, function () {
                            abp.ui.clearBusy();
                        });
                    } else {
                        if (needToChangeState) {
                            $scope.editBidClicked = !$scope.editBidClicked;
                        }
                        $scope.$emit('reloadTender');
                    }
                };

                $scope.$on('exportDraftDocuments', function (event, bid) {
                    $scope.exportDraftDocs(false, bid);
                }); 

                $scope.keepDraftDocs = function (currentBid, needToChangeState) {
                    var draftDocs = documentsService.getDraftDocs($scope.lot, currentBid);
                    delConfRationale(draftDocs);
                    abp.ui.setBusy();
                    bidDocument.editNotExportBidDocuments(draftDocs).then(function () {
                        abp.ui.clearBusy();
                        if (needToChangeState) {
                            $scope.editBidClicked = !$scope.editBidClicked;
                        }
                        window.removeEventListener('beforeunload', beforeUnloadHandler, false);
                        $scope.$emit('reloadTender');
                    }, function () {
                        abp.ui.clearBusy();
                    });
                };

                $scope.fillDocTypes = function (bid) {
                    $scope.docTypesToUpload = bidDocumentTypeService.getDocTypeByBidProperties($scope.tender, bid, $scope.documentTypes);
                }

                $scope.fillDocConfs = function (bid) {
                    $scope.confidentialityTypes = bidDocumentTypeService.getDocConfByBidProperties($scope.tender, bid);
                }

                loadTypesAndConfident.getDocumentTypesForAll().then(function (docTypeData) {
                    $scope.documentTypes = docTypeData;

                    $scope.lot.bids.forEach(function (bid) {
                        $scope.fillDocTypes(bid);
                    }); 
                    $scope.lot.bids.forEach(function (bid) {
                        $scope.fillDocConfs(bid);
                        if (bid.isMyBid && $scope.confidentialityTypes.length) {
                            bid.confidentiality = $scope.confidentialityTypes[0];
                        }
                    });

                    if ($scope.lot.auctionPeriod && $scope.lot.auctionPeriod.endDate) {
                        $scope.documentTypes = $scope.documentTypes.bidDocument.forEach(function (doc) {
                            if (doc.title.indexOf('розкриваються до аукціону') !== -1) {
                                doc.title = doc.title.replace(' - розкриваються до аукціону', '')
                            }
                            if (doc.title.indexOf('розкриваються після аукціону') !== -1) {
                                doc.title = doc.title.replace(' - розкриваються після аукціону', '')
                            }
                        });
                    }
                });

                // todo костыль для робот теста
                //$scope.setFile = function (element) {
                //    var arrFiles = [];
                //    arrFiles.push(element.files[0]);
                //    var bidId = element.attributes['data-bidid'].nodeValue;
                //    var confidentiality = element.attributes['data-confidentiality'].nodeValue;
                //    var confidentialityRationale = element.attributes['data-confidentialityrationale'].nodeValue;
                //    var type = element.attributes['data-doctype'].nodeValue;
                //    if (confidentiality === 'public' || $scope.tender.isDialogue || $scope.tender.isDialogueEU) {
                //        confidentialityRationale = null;
                //    }
                //    $scope.addNewDocToExistingBid(arrFiles, bidId, type, confidentiality, confidentialityRationale);
                //};

                $scope.selectFile = function (file) {
                    $scope.bidFile = file;
                };

                $scope.bidDocUploaded = function (bid) {
                    if (bid.isDraft && !warningMsngShowen) {
                        warningMsngShowen = true;
                        abp.notify.warn('Час синхронізації файлів на ЦБД може зайняти до 20 хвилин.', 'Увага!');
                    }
                    window.onbeforeunload = null;
                };

                $scope.addNewDocToBid = function (bid) {
                    var defer = $q.defer();
                    if (!bid.confidentiality || bid.confidentiality.value != 'buyerOnly') {
                        bid.confidentialityRationale = null;
                    }
                    if ($scope.tender.isEsco && $scope.tender.status === 'active.awarded') {
                        bid.confidentiality = "public";
                    }

                    if (!bid.confidentiality && $scope.tender.procurementMethodType !== 'belowThreshold') {
                        bid.confidentiality = "public";
                    }
                    var lot = $scope.lot;

                    // check internet connection
                    siteSettingsService.isInternetConnection().then(function () {
                        $scope.deleteEvidenceRequiredProperty();
                        bidHelper.createOrUpdateBidDraft(bid, lot, $scope.isEsco, $scope.tender, $scope.vm.choosedProduct, $scope.criteriaResponses).then(function (data) {
                            if (data) {
                                bid = data;
                                bidHelper.setBidFromDraft(bid, lot, 'docMethod');
                            }
                            var obj = {
                                tenderId: $scope.tender.id,
                                bidId: bid.id,
                                documentId: "",
                                confidentiality: bid.confidentiality && bid.confidentiality.value ? bid.confidentiality.value : null,
                                confidentialityRationale: bid.confidentialityRationale,
                                type: bid.docType && bid.docType.id  ? bid.docType.id : null,
                                isDescriptionDecision: bidHelper.setDescriptionDecision(bid)
                            };

                            if ($scope.tender.status !== 'active.qualification') {
                                $scope.bidDocFields = { myObj: obj, notExport: true };
                            } else {
                                $scope.bidDocFields = { myObj: obj };
                            }

                            defer.resolve();
                        }, function () { defer.reject(); } );                        
                    }, function () {
                        abp.notify.error("Немає з'єднання з інтернетом, завантаження неможливе");
                        defer.reject();
                    });
                    return defer.promise;
                };
              

                $scope.updateDoc = function (isDraft) {
                    var confidentialityVal = $scope.documentChanged.confidentiality;
                    
                    var o = {
                        tenderId: $scope.tender.id,
                        bidId: bid.id,
                        documentId: $scope.documentChanged.id,
                        confidentiality: confidentialityVal,
                        confidentialityRationale: $scope.documentChanged.confidentialityRationale,
                        isDescriptionDecision: bidHelper.setDescriptionDecision(bid),
                        type: type
                    };

                    addDocument(files, o, isDraft);
                };

                $scope.changeDoc = function (document) {
                    if ($scope.tender.lots && $scope.tender.lots.length) {
                        $scope.tender.lots.forEach(function (singleLot) {
                            singleLot.bids.forEach(function (singleBid) {
                                $scope.setDocumentsChangeToFalse(singleBid.documents);
                            });
                        });
                    }
                    $scope.documentChanged = document;
                    document.ch = true;
                };

                $scope.setDocumentsChangeToFalse = function (documents) {
                    documents.forEach(function (singleDoc) {
                        singleDoc.ch = false;
                    });
                };

                $scope.isContractYearsInCorrect = function (bid) {
                    if (!Number(bid.value.contractDurationYears) && !Number(bid.value.contractDurationDays) ||
                        Number(bid.value.contractDurationYears) > 15 ||
                        Number(bid.value.contractDurationYears) == 15 && Number(bid.value.contractDurationDays) > 0)
                        return true;
                    return false;
                };

                $scope.isContractDaysInCorrect = function (bid) {
                    if (!Number(bid.value.contractDurationYears) && !Number(bid.value.contractDurationDays) ||
                        Number(bid.value.contractDurationDays) > 364 ||
                        Number(bid.value.contractDurationYears) == 15 && Number(bid.value.contractDurationDays) > 0)
                        return true;
                    return false;
                };

                $scope.isContractPeriodCorrect = function (bid) {
                    var years = Number(bid.value.contractDurationYears);
                    var days = Number(bid.value.contractDurationDays);
                    return !(years === 0 && days === 0 || years === 15 && days > 0);
                };

                $scope.isPercentageCorrect = function (bid, lot) {
                    var n = Number(bid.value.yearlyPaymentsPercentage);
                    if (lot.escoLotExt.fundingKind === "other") return n >= 80 && n <= 100;
                    return n >= 0 && n <= Number((lot.escoLotExt.yearlyPaymentsPercentageRange * 100).toFixed(2));
                };
                
                $scope.draftDocument = abp.setting.get("UploadBidDocumentDraftByDefault") === 'True';

                $scope.toggleCheck = function () {
                    $scope.draftDocument = !$scope.draftDocument;
                }

                $scope.saveBidDraft = function (currentBid, changeEditBtnState) {
                    if ($scope.lot.canUserAddBid &&
                        $scope.tender.askToDeleteOtherResponsiblesManagers &&
                        !confirm("За цим тендером закріплений відповідальний менеджер. Ви впевнені, що бажаєте зробити чернетку ставки?"))
                        return;

                    delConfRationale($scope.draftDocs);
                    var bid = $scope.lot.bids.length ? $scope.lot.bids[0] : $scope.lot.bid; 
                    $scope.deleteEvidenceRequiredProperty();
                    return bidHelper.createOrUpdateBidDraft(bid, $scope.lot, $scope.isEsco, $scope.tender, $scope.vm.choosedProduct, $scope.criteriaResponses).then(function (data) {
                        abp.notify.success('Чернетку збережено!');
                        var draftDocs = documentsService.getDraftDocs($scope.lot, bid);
                        if (!draftDocs || !draftDocs.length) {
                            $scope.reloadBid();
                        }
                    }).then(function () {
                        var draftDocs = documentsService.getDraftDocs($scope.lot, bid);
                        if (draftDocs && draftDocs.length) {
                            delConfRationale($scope.draftDocs);
                            abp.ui.setBusy();
                            bidDocument.editNotExportBidDocuments(draftDocs).then(function () {
                                abp.ui.clearBusy();
                                $scope.editBidClicked = changeEditBtnState ? !$scope.editBidClicked : $scope.editBidClicked;
                                $scope.reloadBid();
                                return angular.noop();
                            }, function () {
                                abp.ui.clearBusy();
                            });
                        } else {
                            $scope.editBidClicked = changeEditBtnState ? !$scope.editBidClicked : $scope.editBidClicked;
                        }
                    });
                };
                
                $scope.removeBidDocument = function (documentId) {
                    if (confirm("Дійсно видалити файл?")) {
                        abp.ui.setBusy();
                        $scope.deleteEvidenceRequiredProperty();
                        bidHelper.createOrUpdateBidDraft($scope.lot.bids[0], $scope.lot, $scope.isEsco, $scope.tender, $scope.vm.choosedProduct, $scope.criteriaResponses).then(function () {
                            abp.notify.success('Чернетку збережено!');
                            delConfRationale($scope.draftDocs);
                            $scope.draftDocs = $scope.lot.bids[0].documents.filter(function (document) {
                                return document.notExport
                            });
                            if ($scope.draftDocs.length) {
                                bidDocument.editNotExportBidDocuments($scope.draftDocs).then(function () {
                                    abp.ui.clearBusy();
                                    var input = { 'BidDocumentId': documentId };
                                    deleteDocument(input);
                                }, function () {
                                    abp.ui.clearBusy();
                                });
                            } else {
                                var input = { 'BidDocumentId': documentId };
                                deleteDocument(input);
                            }
                        });
                    }
                };

                $scope.$on('removeAllDocs', function (event, docs) {
                    $scope.removeAllDocs(docs);
                });

                function removeAllDocs(docs) {
                        var promiseArr = []
                        docs.forEach(function (singleDoc, index) {
                            if (index < $scope.maxDocsDeleted) {
                                var removePromise = $http.post(abp.appPath + 'api/files/DeleteDocument', { 'BidDocumentId': singleDoc.id });
                                promiseArr.push(removePromise);
                            }
                        });
                        Promise.all(promiseArr).then(function () {
                            if (docs.length <= $scope.maxDocsDeleted) {
                                abp.notify.success('Файли видалено');
                                $scope.$emit('reloadTender', true);
                            } else if (docs.length > $scope.maxDocsDeleted) {
                                docs.splice(0, $scope.maxDocsDeleted);
                                removeAllDocs(docs);
                            }
                        }, function () {
                            abp.notify.error('Помилка при видаленні файлів');
                        });
                }

                $scope.removeAllDocs = function (docs) {
                    if (confirm("Дійсно видалити всі файли?")) {
                        $scope.deleteEvidenceRequiredProperty();
                        bidHelper.createOrUpdateBidDraft($scope.lot.bids[0], $scope.lot, $scope.isEsco, $scope.tender, $scope.vm.choosedProduct, $scope.criteriaResponses).then(function (data) {
                            if (data) {
                                bidHelper.setBidFromDraft(data, $scope.lot);
                            }
                            abp.notify.success('Чернетку збережено!');
                            removeAllDocs(docs);
                        });
                    }
                }

                $scope.getActualDocuments = function (docs) {
                    var adocs = [];
                    _(docs).each(function (doc) {
                        if (doc.isDeleted != true) adocs.push(doc);
                    });
                    return adocs;
                };

                $scope.getOrganizationToolTipText = function (organization) {
                    return organizationDataService.getOrganizationToolTipText(organization);
                }

                $scope.getBidStatusDesc = function (status) {
                    return lookupService.getBidStatusDesc(status);
                };

                $scope.isTenderStatusForShowingBidStatus = function (tenderStatus) {
                    var statuses = [
                        'active.tendering', 'active.pre-qualification.stand-still', 'active.pre-qualification', 'active.qualification',
                        'active.awarded', 'unsuccessful', 'complete', 'cancelled'
                    ];
                    return statuses.indexOf(tenderStatus) > -1;
                }

                $scope.isConfirmationForAddBidNeeded = function (tender) {
                    return !tender.isBelowThreshold && tender.procurementMethodType !== 'closeFrameworkAgreementSelectionUA' && tender.procurementMethodType !== 'priceQuotation';
                }

                function addDocument(file, obj, isDraft, draftDocument) {
                    // TODO: move to server
                    if ($scope.tender.status === "active.tendering"
                        || $scope.tender.status == "active.pre-qualification"
                        || $scope.tender.status == "active.qualification"
                        || $scope.tender.status == "active.awarded"
                        || $scope.tender.status == "active.qualification.stand-still") {
                        uploadUsing$Upload(file[0], file, obj, isDraft, draftDocument);
                    } else {
                        abp.notify.error('Статус закупівлі змінився і Ви не можете прикріпити файл!');
                    }
                }

                function deleteDocument(input) {
                    var removeDocument = $http.post(abp.appPath + 'api/files/DeleteDocument', input);
                    removeDocument.then(function (data) {
                        abp.notify.success('Файл видалено');
                        $scope.$emit('reloadTender', true);
                    }, function (data) {
                        abp.notify.error('Помилка при видаленні файла');
                    });
                }

                function uploadUsing$Upload(file, listOfFiles, obj, isDraft, notExport) {
                    if ($localStorage.sameTimeUploadFilesCount > simultaneouslyUploadFilesCount) {
                        setTimeout(function () {
                            uploadUsing$Upload(file, listOfFiles, obj, isDraft, notExport);
                        }, 500);
                        return;
                    } else {
                        $localStorage.sameTimeUploadFilesCount++;
                    }

                    notExport = !!notExport;
                    confermLeavingThePage();
                    file.uploadData = {
                        listOfFiles: listOfFiles,
                        obj: obj,
                        isDraft: isDraft
                    }
                    file.uploadAgain = uploadUsing$Upload;

                    if (!file) {
                        return;
                    }

                    if (documentsService.validateDocName(file.name) == 0) return;
                    file.upload = Upload.upload({
                        url: abp.appPath + 'api/Files/Upload',
                        method: 'POST',
                        fields: { myObj: obj, notExport: notExport},
                        file: file
                    });

                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                        });
                    }, function (response) {
                        if (response.status > 0)
                            $scope.errorMsg = response.status + ': ' + response.data;
                    });

                    file.upload.progress(function (evt) {
                        // Math.min is to fix IE which reports 200% sometimes
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });

                    file.upload.success(function () {
                        $scope.filesCounter = $scope.filesCounter - 1;
                        $localStorage.sameTimeUploadFilesCount--;
                        //console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                        if ($scope.filesCounter <= 0) {
                            abp.notify.success("Файл (файли) додано!");
                            if (!isDraft && !warningMsngShowen) {
                                warningMsngShowen = true;
                                abp.notify.warn('Час синхронізації файлів на ЦБД може зайняти до 20 хвилин.', 'Увага!');
                            }
                            window.onbeforeunload = null;
                            $scope.editBidClicked = false;
                            $scope.$emit('reloadTender');
                            $scope.reload();
                        }
                        file.frontStatus = 'success';
                        file.progress = 100;
                        $scope.uploadFilesCounter++;
                        if ($scope.uploadFilesCounter == listOfFiles.length) {
                            listOfFiles.splice(0, listOfFiles.length);
                            $scope.uploadFilesCounter = 0;
                        }
                    });

                    file.upload.error(function (data) {
                        $localStorage.sameTimeUploadFilesCount--;
                        file.progress = 0;
                        file.frontStatus = 'abort';

                        if (typeof (data) === "string")
                            abp.notify.error(data);
                        else
                            abp.notify.error(data.exceptionMessage || data.message);

                        $scope.filesCounter = $scope.filesCounter - 1;
                        if ($scope.filesCounter === 0) {
                            $scope.$emit('reloadTender');
                            $scope.reload();
                        }
                    });
                }

                $scope.dowloadZip = function (bid) {
                    abp.ui.setBusy('.hidden-print dowloadZipBtn');
                    var zipFilename = 'Документи пропозиції';
                    documentsService.downloadZipFile(bid.documents, zipFilename, $scope, $scope.tender.apiId, bid);
                    var listener = $scope.$on('clearBusy',
                        function () {
                            abp.ui.clearBusy('.hidden-print dowloadZipBtn');
                            listener();
                        });
                }

                $scope.$on('closeCotractGuarantee', function (event, bidId) {
                    $scope.showBlockCriteriasGuarantee[bidId] = false;
                });

                $scope.switchContractGuaranteeVisibility = function (bidId) {
                    $scope.showBlockCriteriasGuarantee[bidId] = !$scope.showBlockCriteriasGuarantee[bidId];
                };

                $scope.isLotActive = function (lot) { // status for fake lot is null
                    return !lot || !lot.status || lot.status == 'active';
                };

                $scope.modalId = ~~(Math.random() * 1000);

                $scope.canBid = function (lot, tender) {
                    if (lot.canUserAddBid &&
                        tender.askToDeleteOtherResponsiblesManagers &&
                        !confirm("За цим тендером закріплений відповідальний менеджер. Ви впевнені, що бажаєте зробити ставку?"))
                        return;

                    if ($scope.ng_localStorage.organization && !$scope.ng_localStorage.organization.isAgreementSigned) {
                        $location.path('/accessionTreaty');
                        return;
                    } else {
                        if (!lot.bids.length) {
                            var hasDraft = lot.bids.some(function (bid) {
                                return bid.documents.some(function (document) {
                                    return document.notExport;
                                });
                            });
                            if (hasDraft) {
                                if ($scope.tender.isBelowThreshold) {
                                    $scope.draftDocs.map(function (doc) {
                                        doc.confidentiality = null;
                                    });
                                }
                                delConfRationale($scope.draftDocs);
                                $rootScope.correctLot = lot;
                                $scope.exportAndCanBid($rootScope.correctLot, $scope.tender);
                            } else {
                                $scope.currentLotToAddBid = lot;

                                if ($scope.tender.isEsco && $scope.tender.mode === null) {
                                    return canBibForOrganization();
                                } else {
                                    return $scope.addBid(lot);
                                }
                            }
                        } else {
                            $scope.updateBid(lot.bids[0], true)
                        }
                    }
                };

                $scope.$on('onTenderCriteriaChanged', function (event, isTenderCriteriaValid, isErrorInSingleCriteria, criteriaResponses, isChanged) {
                    $scope.isTenderCriteriaValid = isTenderCriteriaValid;
                    $scope.isSingleCriteriaValid = !isErrorInSingleCriteria;
                    $scope.criteriaResponses = criteriaResponses;
                    $scope.isCriteriaChanged = isChanged;
                });

                $scope.showErrorIfBidHasNotExportedDocs = function (documents) {
                    return !!documents.find(function (document) {
                        return !document.isExported && !document.isDeleted
                    })
                }

                $scope.hasDocInEvidence = false;
                $scope.$on('docAddedToEvidence', function (evt, docId, doc) {
                    if (docId && !doc.isExported) {
                        $scope.hasDocInEvidence = true;
                    }
                });

                function canBibForOrganization() {
                  bidService.isBlockedOrganization($scope.tender.procurementMethodType)
                    .then(function (response) {
                      return $('#escoBlackList-' + $scope.modalId).modal('show');
                    }, function (error) {
                      return false;
                    });
                }

                $scope.allCriteriasAreCancelled = function () {
                    var allCriteriasCancelled = true;

                    if ($scope.tenderCriterias && $scope.tenderCriterias.length) {
                        $scope.tenderCriterias.forEach(function (criteria) {
                            criteria.requirementGroups.forEach(function (group) {
                                var isAllRequirementsCancelled = group.requirements.every(function (requirement) {
                                    return requirement.requirementStatus === 'cancelled';
                                });

                                if (!isAllRequirementsCancelled) {
                                    allCriteriasCancelled = false;
                                }
                            });
                        });
                    }
                    
                    return allCriteriasCancelled;
                }

                $scope.exportAndCanBid = function (lot, tender) {
                    if (lot.bids) {
                        var draftDocs = [];
                        lot.bids.forEach(function (bid) {
                            bid.documents.forEach(function (document) {
                                if (document.notExport && !document.isDeleted) {
                                    draftDocs.push(document);
                                };
                            });
                        });

                        bidDocument.editAndSendNotExportBidDocuments(draftDocs).then(function () {
                            abp.notify.success('Документи експортовані');
                            $scope.currentLotToAddBid = lot;
                            return $scope.addBid(lot);
                        });
                    }
                };

                $scope.canBidWithoutExprot = function (lot, tender) {
                    if (lot.bids) {
                        bidDocument.editNotExportBidDocuments($scope.draftDocs).then(function () {
                            $scope.currentLotToAddBid = lot;
                            return $scope.addBid(lot);
                        });
                    }
                };

                $scope.updateBidAndExportDocs = function (bid, needToActivate, needToSkipReload, skipExport) {
                    var isBelowThreshold = $scope.tender.procurementMethodType === 'belowThreshold' && !$scope.tender.isSimpleProcurementMethodRationale;
                    $scope.updateBid(bid, needToActivate, needToSkipReload, skipExport, false, (isBelowThreshold || !$scope.tender.isBidSignNeeded)).then(function () {
                        if (!skipExport) {
                            $scope.exportDraftDocs(false, bid);
                        } else {
                            $scope.reloadBid();
                        }
                    });
                };

                $scope.updateBidAndNotExportDocs = function (bid, needToActivate) {
                    var draftDocs = documentsService.getDraftDocs($scope.lot, bid);

                    $scope.updateBid(bid, needToActivate, !!draftDocs.length, false, false, true).then(function () {
                        if (draftDocs.length) {
                            $scope.keepDraftDocs(bid, false);
                        }
                    });
                };

                $scope.getCreateBidMethod = function () {

                    if ($scope.isEsco === false) {
                        return bidService.createBidAndActivateIfNeed;
                    }
                    else {
                        return bidService.createBidEscoAndActivateIfNeed;
                    }
                };

                $scope.checkifCanBidForDraft = function () {
                    if (!$scope.tender.isPQBucket) {
                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            return !!$scope.vm.choosedProduct;
                        }
                    } else {
                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            return !!$scope.vm.choosedItemProducts;
                        }
                    }

                    if ($scope.lot.features && $scope.lot.features.length && addFeaturesService.checkFeaturesNotFilled($scope.lot.features)) {
                        return false;
                    }
                    if ($scope.lot.featuresTender && $scope.lot.featuresTender.length && addFeaturesService.checkFeaturesNotFilled($scope.lot.featuresTender)) {
                        return false;
                    }

                    return true;
                };

                $scope.$on('reloadDocumentTableForLots', function (evt, docs, bidId) {
                    $scope.lot.bids.forEach(function (bid) {
                        if (bid.id === bidId) {
                            bid.documents = docs;
                        }
                    });
                });
                
                $scope.updateExportDocumentState = function (lotId, bidId) {
                    var buttonId = '#update-export-button-' + lotId + '-' + bidId;
                    $scope.isUpdateExportButtonDisabled = true;
                    abp.ui.setBusy(buttonId);

                    abp.ui.setBusy();
                    getTender.getTender({ "Id": $scope.tender.id }).then(function (response) {
                        if (response && response.data) {
                            var lot = response.data.lots.find(function (lot) {
                                return lot.id === lotId;
                            });

                            setFeatures($scope.tender);
                            manipulateWithLotAfterTenderUpdate(lot);
                            
                            lot.bids.forEach(function (bid) {
                                $scope.$broadcast('reloadDocumentsTable', bid.documents, bid.id);
                            });
                        }
                        abp.ui.clearBusy();
                    }, function (error) {
                        console.log(error);
                    });

                    $timeout(function () {
                        $scope.isUpdateExportButtonDisabled = false;
                        abp.ui.clearBusy(buttonId);
                    }, 5000);
                };

                $scope.addBid = function (lot) {
                    
                    abp.ui.setBusy();
                    var bidInput = bidHelper.createBidInput(lot, $scope.tender, $scope.vm.choosedProduct);

                    if ($scope.isEsco === true) {
                        bidInput = bidHelper.addEscoFields(bidInput, lot.bid);
                    }
                    var createBidMethod = $scope.getCreateBidMethod();
                    if ($scope.tender.procurementMethodType === 'priceQuotation') {
                        bidInput.requirementResponses = bidHelper.generateRequirementResponse($scope.vm.choosedProduct.requirementResponses);
                        bidInput.ProductId = $scope.vm.choosedProduct.id;
                    }
                    if ($scope.criteriaResponses.length) {
                        $scope.deleteEvidenceRequiredProperty();
                        bidInput.tenderCriteriaRequirementResponses = $scope.criteriaResponses;
                    }
                    return createBidMethod(bidInput)
                        .then(function (response) {
                            var tender = response.data;
                            if ((!$scope.bidFile || !$scope.bidFile.length) && $scope.tender.procurementMethodType === 'priceQuotation') {
                                $scope.generatePdfForPQ().then(function (response) {
                                    var blob = dataURItoBlob(response);
                                    var file = new File([blob], 'Технічна специфікація.pdf');
                                    $scope.bidFile.push(file);
                                    loadTypesAndConfident.getDocumentTypesForAll().then(function () {
                                        var data = loadTypesAndConfident.getData($scope.tender);
                                        var techSpecificType = data.documentTypesForDropDown.find(function (docType) {
                                            return docType.type === 'technicalSpecifications';
                                        });
                                        $scope.manipulateWithBidAfterCreate(tender, techSpecificType);
                                    });
                                });
                            } else {
                                $scope.manipulateWithBidAfterCreate(tender);
                            }
                        }, function (e) {
                            if (e.data.message.indexOf('недостатньо коштів') !== -1 && e.data.message.indexOf('ЕСКО процедурі') < 0) {
                              $scope.showNoMoneyError = true;
                                $timeout(function () {
                                    $("#noMoneyError").modal('show');
                                }, 1000);

                                $sessionStorage.noMoney = true;
                            }
                            abp.ui.clearBusy();
                        }).then(function () {
                            return angular.noop();
                        });
                };

                $scope.createInvoice = function (cost) {
                    if (cost && typeof cost === "number" && cost > 0)
                        $scope.$emit('createInvoice', cost);

                };

            function manipulateWithLotAfterTenderUpdate(l) {
                l.coef = 1;
                l.fSum = 0;
                if (!l.bid) {
                    l.bid = {
                        value: {
                            amount: '',
                            currency: l.value && l.value.currency,
                            valueAddedTaxIncluded: l.value && l.value.valueAddedTaxIncluded
                        }
                    };
                } else {
                    l.bid.value = {
                        amount: '',
                        currency: l.value && l.value.currency,
                        valueAddedTaxIncluded: l.value && l.value.valueAddedTaxIncluded
                    }
                }

                l.bids.forEach(function (bid) {
                    if (bid.isMyBid) {
                        $scope.lotBidsOld = angular.copy(bid);
                    }
                });

                if ($scope.isEsco) l.bid.value.annualCostsReduction = (new Array(21)).fill(0);
                l.isLargeDifference = false;
            }

            $scope.manipulateWithBidAfterCreate = function (tender, techSpecificType, needToSignModalSkip) {
                    if ($scope.bidFile && $scope.bidFile.length > 0) {
                        var docObj = { tenderId: $scope.tender.id, bidId: tender.id, documentId: "" };
                        if ($scope.tender.procurementMethodType === 'priceQuotation' && techSpecificType) {
                            docObj.type = techSpecificType.id;
                        }
                        addDocument($scope.bidFile, docObj, false);
                    }
                    abp.notify.success("Пропозицію додано!");
                    if ($scope.tender.isBidSignNeeded && !needToSignModalSkip) {
                        $scope.showSignModalBid(tender);
                    }
                    if (!$scope.bidFile || $scope.bidFile.length == 0) {
                        //бага с исчезновением feature из следующего лота
                        $scope.reloadBid();
                        //var currentTime = new Date().getTime();
                        //while (currentTime + 1000 >= new Date().getTime()) {
                        //}
                        //location.reload();
                        $scope.editBidClicked = false;
                    }
                };

                $scope.areAllDocumentsExported = function (bid) {
                    return documentsService.checkDocumentsIsExported(bid.documents);
                }

                $scope.createBidDraftForPQ = function (lot) {
                    abp.ui.setBusy();
                    if (lot.canUserAddBid &&
                        $scope.tender.askToDeleteOtherResponsiblesManagers &&
                        !confirm("За цим тендером закріплений відповідальний менеджер. Ви впевнені, що бажаєте зробити чернетку ставки?"))
                        return;

                    delConfRationale($scope.draftDocs);
                    var bid = lot.bid;
                    $scope.deleteEvidenceRequiredProperty();
                    var whichChoosedToUse = $scope.tender.isPQBucket ? $scope.vm.choosedItemProducts : $scope.vm.choosedProduct;
                    bidHelper.createOrUpdateBidDraft(bid, lot, $scope.isEsco, $scope.tender, whichChoosedToUse).then(function (response) {
                        var bid = response;
                        if ($scope.tender.isPQBucket) {
                            $scope.vm.choosedItemProducts.forEach(function (singleProduct) {
                                $cookies.put('choosedProduct_' + bid.id, singleProduct.id);
                            });
                        } else {
                            $cookies.put('choosedProduct_' + bid.id, $scope.vm.choosedProduct.id);
                        }
                        abp.notify.success('Чернетку збережено!');
                        $scope.generatePdfForPQ().then(function (response) {
                            var blob = dataURItoBlob(response);
                            var file = new File([blob], 'Технічна специфікація.pdf');
                            $scope.bidFile.push(file);
                            loadTypesAndConfident.getDocumentTypesForAll().then(function () {
                                abp.ui.clearBusy();
                                var data = loadTypesAndConfident.getData($scope.tender);
                                var techSpecificType = data.documentTypesForDropDown.find(function (docType) {
                                    return docType.type === 'technicalSpecifications';
                                });
                                $scope.manipulateWithBidAfterCreate(bid, techSpecificType, true);
                            });
                        });
                    });
                };

                $scope.addPQDocumentForBidDraft = function (bid) {
                    $scope.generatePdfForPQ(false,bid).then(function (response) {
                        var blob = dataURItoBlob(response);
                        var file = new File([blob], 'Технічна специфікація.pdf');
                        $scope.bidFile.push(file);
                        loadTypesAndConfident.getDocumentTypesForAll().then(function () {
                            var data = loadTypesAndConfident.getData($scope.tender);
                            var techSpecificType = data.documentTypesForDropDown.find(function (docType) {
                                return docType.type === 'technicalSpecifications';
                            });
                            $scope.manipulateWithBidAfterCreate(bid, techSpecificType, true);
                        });
                    });
                }

                $scope.checkIfConfirmationEntered = function (lot, tender) {
                    if ($scope.isConfirmationForAddBidNeeded(tender)) {
                        if (!tender.isECriteriaArticle17) {
                            return lot.bid.selfQualified && lot.bid.selfEligible;
                        } else {
                            return lot.bid.selfQualified;
                        }
                    } else {
                        return true;
                    }
                };

                $scope.canAnswerBidCriterias = function (lot, bid) {
                    return $scope.tenderCriterias && $scope.tenderCriterias.length && bid && bid.status;
                };

                $scope.createInvoiceOrBidDraft = function (lot) {
                    var bid = lot.bids[0] || lot.bid;
                   
                    if (bid && bid.status == 'draft') {
                        $scope.createInvoice(lot.lotCost);
                    } else {
                        $scope.saveBidDraft(bid, false);
                    }
                };

                $scope.getUpdateBidMethod = function (needActivate) {
                    if ($scope.isEsco === false) {
                        if (needActivate) {
                            return bidService.updateBidAndActivate;
                        } else {
                            return bidService.updateBid;
                        }
                    }
                    else {
                        if (needActivate) {
                            return bidService.updateBidEscoAndActivate;
                        } else {
                            return bidService.updateBidEsco;
                        }
                    }
                }

                $scope.getEvidenceLotBidsDocs = function (lot) {
                    $scope.evidenceDocs = lot.bids[0] && lot.bids[0].documents && lot.bids[0].documents.length
                        && lot.bids[0].documents.filter(function (doc) {
                            return ((doc.documentType && (doc.documentType.type === 'eligibilityDocuments' ||
                                    doc.documentType.type === 'qualificationDocuments')) || !doc.documentType)
                                && !doc.isDeleted
                                && !documentsService.isDocumentChanged(doc, lot.bids[0].documents);
                        }) || [];
                }

                $scope.getEvidenceLotBidsDocs($scope.lot);

                $scope.deleteEvidenceRequiredProperty = function () {
                    $scope.criteriaResponses.forEach(function (response) {
                        if (response.evidences && response.evidences.length) {
                            response.evidences.forEach(function (evidence) {
                                delete evidence.isRequired;
                                delete evidence.isAddedPreviously;
                            });
                        }
                    });
                }

                $scope.setTenderCriteria = function () {
                    $scope.tenderCriterias = $scope.tender.tenderCriteria && $scope.tender.tenderCriteria.length
                        && $scope.tender.tenderCriteria.filter(function (criteria) {
                            return criteria.source === 'tenderer' || criteria.source === 'winner';
                        }); 
                }

                $scope.setTenderCriteria();

                function getFeatureOptionIds(data) {
                    var ids = [];
                    for (var i = 0; i < data.length; i++) {
                        if (data[i]._id) {
                            ids.push(data[i]._id);
                        } else {
                            ids.push(data[i].id);
                        }
                    }
                    return ids;
                }

                function dataURItoBlob(dataURI) {
                    // convert base64 to raw binary data held in a string
                    // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
                    var byteString = atob(dataURI.split(',')[1]);

                    // separate out the mime component
                    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

                    // write the bytes of the string to an ArrayBuffer
                    var ab = new ArrayBuffer(byteString.length);
                    var ia = new Uint8Array(ab);
                    for (var i = 0; i < byteString.length; i++) {
                        ia[i] = byteString.charCodeAt(i);
                    }

                    //Old Code
                    //write the ArrayBuffer to a blob, and you're done
                    //var bb = new BlobBuilder();
                    //bb.append(ab);
                    //return bb.getBlob(mimeString);

                    //New Code
                    return new Blob([ab], {type: mimeString});


                }

                $scope.changeBidFeature = function (bid, bidFeature, index) {
                    bid.features[index]._id = bidFeature.id;
                };

                $scope.getBidFeatureValue = function (bidFeature, selectedFeature) {
                    var optionId = bidFeature._id ? bidFeature._id : bidFeature.id;

                    var option = selectedFeature.options.find(function (option) {
                        return option.id === optionId;
                    });
                    return option.value;
                };

                $scope.updateBid = function (bid, needActivate, needToSkipReload, needSkipExport, notCloseForm, notShowSignModal) {
                    //abp.ui.setBusy(".panel-default");
                    var updateBidInput = {
                        id: bid.id,
                        featureOptionIds: getFeatureOptionIds(bid.features),
                        lotValue: {
                            id: bid.lotValue.id,
                            subcontractingDetails: bid.lotValue.subcontractingDetails,
                            value: bid.lotValue.value
                        },
                        userId: $scope.UserId
                    };

                    if ($scope.isEsco === true) {
                        if (bid.lotValue) {
                            updateBidInput = bidHelper.addEscoFields(updateBidInput, bid.lotValue);
                        } else {
                            updateBidInput = bidHelper.addEscoFields(updateBidInput, bid);
                        }
                    }
                    if ($scope.criteriaResponses.length) {
                        $scope.deleteEvidenceRequiredProperty();
                        updateBidInput.tenderCriteriaRequirementResponses = $scope.criteriaResponses;
                    }

                    var updateBidMethod = $scope.getUpdateBidMethod(needActivate);
                    return updateBidMethod(updateBidInput)
                        .then(function (data) {
                            if ($scope.tender.procurementMethodType === 'priceQuotation' && needActivate && !needSkipExport) {
                                $scope.generatePdfForPQ().then(function (response) {
                                    var blob = dataURItoBlob(response);
                                    var file = new File([blob], 'Технічна специфікація.pdf');
                                    $scope.bidFile.push(file);
                                    loadTypesAndConfident.getDocumentTypesForAll().then(function () {
                                        var data = loadTypesAndConfident.getData($scope.tender);
                                        var techSpecificType = data.documentTypesForDropDown.find(function (docType) {
                                            return docType.type === 'technicalSpecifications';
                                        });
                                        addDocument($scope.bidFile, { tenderId: $scope.tender.id, bidId: bid.id, type: techSpecificType.id, documentId: "" }, false);
                                        abp.notify.success("Пропозицію змінено!");
                                        $scope.isBidEdit = false;
                                        if (!notCloseForm) {
                                            $scope.editBidClicked = false;
                                        }
                                        $scope.isBidEdited = false;
                                        abp.ui.clearBusy(".panel-default");
                                        if (!notShowSignModal) {
                                            autoShowSignModalBidAfterBidEdit(bid.id);
                                        }
                                        if (!needToSkipReload && (!$scope.bidFile || $scope.bidFile.length == 0)) {
                                            $scope.reloadBid();
                                        }
                                    });

                                });
                            } else {
                                abp.notify.success("Пропозицію змінено!");
                                $scope.isBidEdit = false;
                                if (!notCloseForm) {
                                    $scope.editBidClicked = false;
                                }
                                $scope.isBidEdited = false;
                                abp.ui.clearBusy(".panel-default");
                                if (!notShowSignModal) {
                                    autoShowSignModalBidAfterBidEdit(bid.id);
                                }
                                if (!needToSkipReload) {
                                    $scope.reloadBid();
                                }
                            }
                        }, function () {
                            abp.ui.clearBusy(".panel-default");
                        }).then(function () {
                            return angular.noop();
                        });
                };

                function delConfRationale(documents) {
                    angular.forEach(documents, function (i) {
                        if (!i.confidentiality || i.confidentiality !== 'buyerOnly')
                            delete i.confidentialityRationale;
                        if ((i.confidentiality || i.confidentiality === 'buyerOnly') && i.confidentialityRationale === null)
                            delete i.confidentialityRationale;
                    });
                }

                $scope.showSignModalBid = function (bidObj, numberOfSign) {

                    bidDocument.isAllDocumentsExported({ bidId: bidObj.id })
                        .then(function (response) {
                            if (response.data != true)
                                abp.notify.error(
                                    'Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                            else {
                                bidService.getBidEntityForSign({ bidId: bidObj.id })
                                    .then(function (response) {
                                        bidForSign = response.data.data;
                                        bidForSign.type = 'bid';
                                        bidForSign.id = bidObj.apiId;
                                        bidForSign.ourId = bidObj.id;
                                        if ($scope.tender.isOpenEU || $scope.tender.isDialogueEU || $scope.tender.isDialogueEUStage2 || $scope.tender.isCloseFrameworkAgreementUA || $scope.tender.isEsco) {
                                            delConfRationale(bidForSign.documents);
                                            delConfRationale(bidForSign.financialDocuments);
                                            delConfRationale(bidForSign.eligibilityDocuments);
                                        }
                                        if (numberOfSign === 2) {
                                            delete bidForSign.value;
                                            delete bidForSign.financialDocuments;
                                        }

                                        abp.ui.clearBusy(".panel-default");
                                        $scope.$emit('showModalSignBid', bidForSign, null, numberOfSign);
                                    },
                                        function (e) {
                                            abp.ui.clearBusy(".panel-default");
                                            abp.notify.error(e.message);
                                        });
                            }
                        });
                };

                $scope.forceCheckSignClick = function (bid) {

                    if ($scope.tender.status === 'active.tendering' || $scope.tender.status === 'active.auction') {
                        //bid.isClosed = true;                       

                        bidService.getSignString({ bidId: bid.id })
                            .then(function (response) {
                                bid.sign = response.data;
                                bidService.getBidEntityForSign({ bidId: bid.id })
                                    .then(function (response) {
                                        $scope.bidToCheck = response.data.data;
                                        $scope.bidToCheck.id = bid.apiId;
                                        $scope.bidToCheck.isClosed = true;
                                        $scope.bidToCheck.ignoreValue = true;
                                        $scope.bidToCheck.sign = bid.sign;

                                        if ($scope.tender.isOpenEU || $scope.tender.isDialogueEU || $scope.tender.isDialogueEUStage2 || $scope.tender.isCloseFrameworkAgreementUA) {
                                            delConfRationale($scope.bidToCheck.documents);
                                            delConfRationale($scope.bidToCheck.financialDocuments);
                                            delConfRationale($scope.bidToCheck.eligibilityDocuments);
                                        }

                                        if ($scope.tender.procurementMethodType === 'aboveThresholdEU'
                                            || $scope.tender.procurementMethodType === 'competitiveDialogueEU.stage2'
                                            || $scope.tender.procurementMethodType === 'closeFrameworkAgreementUA'
                                            || $scope.tender.procurementMethodType === 'esco') {

                                            delete $scope.bidToCheck.value;
                                        }

                                        bid.forceCheckSign = true;
                                    }, function (e) {
                                        //abp.ui.clearBusy(".panel-default");
                                        abp.notify.error(e.message);
                                    });
                            }, function (e) {
                                abp.notify.error(e.message);
                            });
                    } else {
                        $scope.bidToCheck.id = bid.apiId;
                        $scope.bidToCheck.isClosed = false;
                        $scope.bidToCheck.ignoreValue = ($scope.tender.status === 'active.pre-qualification' || $scope.tender.status === 'active.pre-qualification.stand-still'
                            || $scope.tender.status === 'active.auction' || $scope.tender.isBelowThreshold);

                        bid.forceCheckSign = true;
                    }
                }

                $scope.cancelBid = function (id) {
                    abp.ui.setBusy(".panel-default");
                    var cancelBidInput = {
                        id: id,
                        userId: $scope.UserId
                    };
                    //initAnnualCost(); // to clear bid.value.annualCostReduction

                    bidService.cancelBid(cancelBidInput)
                        .then(function (data) {
                            $scope.bidFile = null;
                            //console.log(data);
                            abp.notify.success("Пропозицію скасовано!");
                            abp.ui.clearBusy(".panel-default");
                            $scope.reloadBid();
                        }, function () {
                            abp.ui.clearBusy(".panel-default");
                        }
                        );

                };

                function getSelectedBidProduct(bid) {
                    return $scope.tender.profile && $scope.tender.profile.products.find(function (product) {
                        return product.id === bid.productId;
                    });
                }

                $scope.generatePdfForPQ = function (needToDownloadFile, bid) {
                    return new Promise(function (resolve, reject) {
                        $ocLazyLoad.load('Scripts/pdfmake.min.js').then(function () {
                            $ocLazyLoad.load('Scripts/vfs_fonts.js').then(function () {
                                var organization = $localStorage.organization;
                                var userName = $localStorage.userNameDisplay, 
                                    userEmail = $localStorage.emailAddress, 
                                    userPhoneNumber = $localStorage.userPhone;
                                var address = organization.address;
                                var userKind = organization.scale.name;
                                var profile = bid ? getSelectedBidProduct(bid) : $scope.vm.choosedProduct;
                                var productProfile = $scope.tender.profile;
                                var productItems = $scope.tender.lots[0].items;
                                var url = $location.absUrl();
                                var tenderId = $scope.tender.tenderId;

                                if (!$scope.tender.isPQBucket) {
                                    var docDefinition = {
                                        content:
                                            [
                                                { text: 'Технічна специфікація', alignment: 'center', bold: true, fontSize: 16},
                                                {
                                                    text: [
                                                        {
                                                            text: 'Запит ціни пропозиції: ',
                                                            width: 400,
                                                            bold: true,
                                                            fontSize: 14
                                                        },
                                                        {
                                                            text: tenderId,
                                                            link: url,
                                                            width: 200,
                                                            bold: true,
                                                            color: '#3e9bdc',
                                                            fontSize: 14,
                                                            decoration: 'underline'
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 40],
                                                    alignment: 'center'
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Постачальник:',
                                                            width: '50%',
                                                            bold: true,
                                                            margin: [0, 0, 0, 0]
                                                        },
                                                        {
                                                            text: organization.name,
                                                            width: '50%',
                                                            bold: true,
                                                            margin: [0, 0, 0, 0]
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Код ЄДРПОУ / ІПН:',
                                                            width: '50%',
                                                            bold: true
                                                        },
                                                        {
                                                            text: organization.codeOfOrganization,
                                                            width: '50%',
                                                            bold: true
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 10]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Повна назва юридичної особи:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: organization.name,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Контактна особа (Прізвище, Ім\'я, по батькові):',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: userName,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Електронна пошта:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: userEmail,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Телефон:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: userPhoneNumber,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Місцезнаходження:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: $scope.generateAddress(address),
                                                            width: '50%'
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 10]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Інформація про профілі запиту цінових пропозицій:',
                                                            width: '50%',
                                                            bold: true
                                                        },
                                                        {
                                                            text: productProfile.title,
                                                            width: '50%'
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 10]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Найменування товару:',
                                                            width: '50%',
                                                            bold: true
                                                        },
                                                        {
                                                            text: profile.title,
                                                            width: '50%',
                                                            bold: true
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 10]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Кількість товару:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: $scope.lot.items[0].quantity + ' ' + getUnitName($scope.lot.items[0].unit),
                                                            width: '50%'
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 10]
                                                },
                                                { text: 'Специфікація товару:',  margin: [0, 20, 0, 20], bold: true, margin: [0, 0, 0, 10] },
                                            ]
                                    };
                                } else {
                                    var docDefinition = {
                                        content: [
                                            { text: 'Технічна специфікація', alignment: 'center', bold: true, fontSize: 16},
                                                {
                                                    text: [
                                                        {
                                                            text: 'Запит ціни пропозиції: ',
                                                            width: 400,
                                                            bold: true,
                                                            fontSize: 14
                                                        },
                                                        {
                                                            text: tenderId,
                                                            link: url,
                                                            width: 200,
                                                            bold: true,
                                                            color: '#3e9bdc',
                                                            fontSize: 14,
                                                            decoration: 'underline'
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 40],
                                                    alignment: 'center'
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Постачальник:',
                                                            width: '50%',
                                                            bold: true,
                                                            margin: [0, 0, 0, 0]
                                                        },
                                                        {
                                                            text: organization.name,
                                                            width: '50%',
                                                            bold: true,
                                                            margin: [0, 0, 0, 0]
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Код ЄДРПОУ / ІПН:',
                                                            width: '50%',
                                                            bold: true
                                                        },
                                                        {
                                                            text: organization.codeOfOrganization,
                                                            width: '50%',
                                                            bold: true
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 10]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Повна назва юридичної особи:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: organization.name,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Контактна особа (Прізвище, Ім\'я, по батькові):',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: userName,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Електронна пошта:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: userEmail,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Телефон:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: userPhoneNumber,
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Місцезнаходження:',
                                                            width: '50%'
                                                        },
                                                        {
                                                            text: $scope.generateAddress(address),
                                                            width: '50%'
                                                        }
                                                    ]
                                                },
                                                {
                                                    columns: [
                                                        {
                                                            text: 'Класифікація суб\'єктів господарювання:',
                                                            width: '50%',
                                                            bold: true
                                                        },
                                                        {
                                                            text: userKind,
                                                            width: '50%'
                                                        }
                                                    ],
                                                    margin: [0, 0, 0, 20]
                                                }
                                        ]
                                    };

                                    productItems.forEach(function (item, index) {
                                        docDefinition.content.push(
                                            {
                                                columns: [
                                                    {
                                                        text: 'Позиція:',
                                                        width: '50%',
                                                        bold: true
                                                    }, 
                                                    {
                                                        text: item.title || item.description,
                                                        widht: '50%'
                                                    }
                                                ],
                                                margin: [0, 0, 0, 15]
                                            }
                                        )
                                        docDefinition.content.push(
                                            {
                                                columns: [
                                                    {
                                                        text: 'Інформація про профілі запиту цінових пропозицій:',
                                                        width: '50%',
                                                        bold: true
                                                    },
                                                    {
                                                        text: item.profile.title,
                                                        width: '50%'
                                                    }
                                                ],
                                                margin: [0, 0, 0, 10]
                                            }
                                        );
                                        if ($scope.vm.choosedItemProducts[index]) {
                                            for (var key in $scope.vm.choosedItemProducts) {
                                                if (Number(key) === index) {
                                                    docDefinition.content.push(
                                                        {
                                                            columns: [
                                                                {
                                                                    text: 'Найменування товару:',
                                                                    width: '50%',
                                                                    bold: true
                                                                },
                                                                {
                                                                    text: $scope.vm.choosedItemProducts[key].title,
                                                                    width: '50%',
                                                                    bold: true
                                                                }
                                                            ]
                                                        }
                                                    );
                                                }
                                            }
                                        }
                                        docDefinition.content.push(
                                            {
                                                columns: [
                                                    {
                                                        text: 'Кількість товару:',
                                                        width: '50%'
                                                    },
                                                    {
                                                        text: item.quantity + ' ' + getUnitName(item.unit),
                                                        width: '50%'
                                                    }
                                                ],
                                                margin: [0, 0, 0, 10]
                                            }
                                        )
                                        if ($scope.vm.choosedItemProducts[index]) {
                                            docDefinition.content.push(
                                                {
                                                    columns: [
                                                        { 
                                                            text: 'Специфікація товару:',  
                                                            margin: [0, 20, 0, 0], 
                                                            bold: true,
                                                        }
                                                    ],
                                                }
                                            );
                                            $scope.vm.choosedItemProducts[index].requirementResponses.forEach(function (responses) {
                                                if (responses.value == 'True') {
                                                    responses.value = 'Так'
                                                }
                                                if (responses.value == 'False') {
                                                    responses.value = 'Ні'
                                                }
                                                docDefinition.content.push(
                                                    {
                                                        columns: [
                                                            { 
                                                                text: responses.requirement.title + ':',
                                                                width: '50%'
                                                            },
                                                            {
                                                                text: responses.value || responses.requirement.minValue,
                                                                width: '50%'
                                                            }
                                                        ],
                                                        margin: [0, 0, 0, 5]
                                                    }
                                                );
                                            });
                                        }
                                        docDefinition.content.push(
                                            {
                                                columns: [],
                                                margin: [0, 0, 0, 25]
                                            }
                                        )
                                    });

                                }


                                $scope.generateColumnsForProduct(docDefinition.content);
                                var pdfDocGenerator = pdfMake.createPdf(docDefinition);
                                if (needToDownloadFile) {
                                    pdfDocGenerator.download('Технічна специфікація.pdf');
                                }
                                $scope.bidFile = [];
                                pdfDocGenerator.getDataUrl(function (document) {
                                    resolve(document);
                                });
                            });
                        });
                    });
                };
                
                function getUnitName(unit) {
                    return unit && unit.nameUA ? unit.nameUA : '';
                }

                $scope.generateColumnsForProduct = function (content) {
                    $scope.vm.choosedProductRequirements.forEach(function (productRequirement) {
                        var value = '';
                        if (productRequirement.value === 'False') {
                            value = 'Ні';
                        } else if (productRequirement.value === 'True') {
                            value = 'Так';
                        } else {
                            value = productRequirement.value;
                        }
                        var column = {
                                columns: [
                                    {
                                        text: productRequirement.requirement.title,
                                        width: '50%'
                                    },
                                    {
                                        text: value,
                                        width: '50%'
                                    }
                                ]
                            }

                            content.push(column);
                    });
                }

                $scope.generateAddress = function (addressObj) {
                    var address = '';

                    if (addressObj.postIndex) {
                        address += addressObj.postIndex;

                        if (addressObj.country || addressObj.region || addressObj.city || addressObj.addressStr) {
                            address += ', ';
                        } else {
                            address += ' ';
                        }
                    }

                    if (addressObj.country) {
                        address += addressObj.country.title;

                        if (addressObj.region || addressObj.city || addressObj.addressStr) {
                            address += ', ';
                        } else {
                            address += ' ';
                        }
                    }

                    if (addressObj.region) {
                        address += addressObj.region.title;

                        if (addressObj.city || addressObj.addressStr) {
                            address += ', ';
                        } else {
                            address += ' ';
                        }
                    }

                    if (addressObj.city) {
                        address += addressObj.city.title;

                        if (addressObj.addressStr) {
                            address += ', ';
                        } else {
                            address += ' ';
                        }
                    }

                    if (addressObj.addressStr) {
                        address += addressObj.addressStr;
                    }

                    return address;

                };

                $scope.$watch('tender', function (n, o) {
                    if (!n || !n.lots) {
                        return;
                    }

                    //if ($rootScope.canSetFutersBid)
                    setFeatures(n);

                    // create bid
                    n.lots = n.lots.map(function (l) {
                        manipulateWithLotAfterTenderUpdate(l);
                        return l;
                    });

                    $scope.isStage2 = n.isDialogueStage2 || n.isDialogueEUStage2;
                });

                function confirmBid(bidId) {
                    abp.ui.setBusy(".panel-default");
                    return bidService.confirmBid({ id: bidId })
                        .then(function (data) {
                            abp.ui.clearBusy(".panel-default");
                            if (data) {
                                abp.notify.success("Пропозицію підтверджено!");
                                $scope.editBidClicked = true;
                                $scope.$emit('reloadTender');
                            }
                            else abp.notify.error("Невідома помилка");
                        }, function () {
                            abp.ui.clearBusy(".panel-default");
                        });
                }

                function autoShowSignModalBidAfterBidEdit(bidId) {
                    var myBid = null;
                    angular.forEach($scope.tender.lots, function (lot) {
                        var bid = lot.bids.find(function (node) {
                            return node.isMyBid && node.id === bidId;
                        });
                        if (bid) myBid = bid;
                    });
                    $scope.showSignModalBid(myBid);
                }

                $scope.isValidAmount = function (a, l, maxValue) {
                    if (!a || !l) return false;

                    if (a > maxValue) return false;

                    var bidAmount = parseFloat(a);
                    var lotAmount = l.value.amount;

                    l.isLargeDifference = false;
                    //if ($scope.isEsco === false) {
                    //    return true;
                    //}

                    if ((bidAmount > lotAmount) || (bidAmount < 0.01)) {
                        return false;
                    } else {
                        var diffInPercentage = bidAmount * 100 / lotAmount;
                        if (diffInPercentage <= 90) {
                            l.isLargeDifference = true;
                        }
                        return true;
                    }
                };

                // все ли неценовые выбраны для тендера
                $scope.isAllTenderFeaturesFilled = function (lot) {

                    if (lot && lot.featuresTender && lot.featuresTender.length > 0) {
                        for (var i = 0; i < lot.featuresTender.length; i += 1) {
                            var feature = lot.featuresTender[i];
                            if (!feature.soption) {
                                return false;
                            }
                        }
                    }
                    return true;
                }

                $scope.isAllLotFeaturesFilled = function (lot) {
                    if (lot && lot.features && lot.features.length > 0) {
                        for (var i = 0; i < lot.features.length; i += 1) {
                            var f = lot.features[i];
                            if (!f.soption) {
                                return false;
                            }
                        }
                    }
                    return true;
                }

                // ввели ли пользователь значение бида хоть для одного лота
                $scope.isAnyBidEntered = function () {
                    var _isAnyBidEntered = false;
                    if ($scope.tender && $scope.tender.lots) {
                        angular.forEach($scope.tender.lots, function (lot) {
                            if (lot.bid && lot.bid.value && lot.bid.value.amount) {
                                _isAnyBidEntered = true;
                                return;
                            }

                        });
                    }
                    return _isAnyBidEntered;
                }

                $scope.isEscoFieldsValid = function (lot, bid) {
                    bid = bid ? bid.lotValue : lot.bid;
                    return $scope.isPercentageCorrect(bid, lot) && !$scope.isContractYearsInCorrect(bid) && !$scope.isContractDaysInCorrect(bid) && $scope.isContractPeriodCorrect(bid);
                };

                $scope.checkBidUpdated = function (i) {
                    var bidlotNew = $scope.lot.bids[i];
                    if ($scope.lotBidsOld && !$scope.lotBidsOld.confidentiality) {
                        $scope.lotBidsOld.confidentiality = bidlotNew.confidentiality; 
                    }
                    $scope.isBidEdited = !angular.equals($scope.lotBidsOld, bidlotNew);
                }
                
                $scope.isTenderNeedToSignTwice = function () {
                    var tenderTypesToSignTwice = ['aboveThresholdEU', 'competitiveDialogueEU.stage2', 'esco', 'closeFrameworkAgreementUA'];
                    return tenderTypesToSignTwice.indexOf($scope.tender.procurementMethodType) !== -1;
                }

                $scope.initContractDays = function (bid) {
                    if (bid.value && !bid.value.contractDurationDays) {
                        bid.value.contractDurationDays = 0;
                    }
                    return bid;
                }

                $scope.isDateExpired = function () {
                    if ($scope.tender.tenderPeriod.tenderPeriodEnd) {
                        return $scope.tender.tenderPeriod.tenderPeriodEnd < $scope.dateToDay;
                    } else if ($scope.tender.tenderPeriod.endDate) {
                        return new Date($scope.tender.tenderPeriod.endDate) < new Date($scope.dateToDay);
                    } else {
                        return false;
                    }
                }

                $scope.$watch('vm.choosedProduct', function () {
                    if ($scope.vm.choosedProduct) {
                        $scope.vm.choosedProductRequirements = $scope.vm.choosedProduct.requirementResponses;
                        $scope.lot.bid.choosedProduct = $scope.vm.choosedProduct;
                    } else {
                        $scope.vm.choosedProductRequirements = [];
                        $scope.lot.bid.choosedProduct = null;
                    }
                });

                $scope.getChoosedProduct = function () {
                    if ($scope.lot && $scope.lot.bids && $scope.lot.bids.length) {
                        if ($scope.lot.bids[0].productId) {
                            $scope.vm.choosedProduct = $scope.tender.profile.products.find(function (product) {
                                return product.id === $scope.lot.bids[0].productId;
                            });
                        }
                    }
                };

                $scope.getChoosedProduct();

                $scope.canLoadDocs = function (bid) {
                    if (bid) {
                        if (bid.canLoadFiles && ($scope.tender.procurementMethodType === 'aboveThresholdUA.defense'
                            || $scope.tender.procurementMethodType === 'simple.defense')) {
                            return bid.confidentiality && bid.confidentiality.value === 'buyerOnly'
                                ? bid.confidentialityRationale && bid.confidentialityRationale.length > 30
                                : true;
                        }
                        if (bid.confidentiality && bid.confidentiality.value === 'buyerOnly') {
                            return bid.docType && bid.confidentialityRationale && bid.confidentialityRationale.length > 30;
                        } else {
                            return bid.docType;
                        }
                    } else {
                        return false;
                    }
                };

                $scope.isBidAmountValid = function (bid, lot) {
                    if (!$scope.tender.isEsco
                        && $scope.tender.procurementMethodType !== 'competitiveDialogueUA'
                        && $scope.tender.procurementMethodType !== 'competitiveDialogueEU') {

                        if (!bid.lotValue || !bid.lotValue.value) {
                            return false;
                        }
                        var bidAmount = parseFloat(bid.lotValue.value.amount)
                        if (isNaN(bidAmount)) {
                            return false;
                        }
                        var lotAmount = parseFloat(lot.value.amount);
                        if ((bidAmount > lotAmount) || (bidAmount === 0)) {
                            return false;
                        }
                    }

                    return true;
                }

                $scope.$on('reloadTenderSuccess', function () {
                    if ($scope.lot && $scope.lot.bids.length) {
                        $scope.getEvidenceLotBidsDocs($scope.lot);
                        $timeout(function () {
                            $scope.lot.bids.forEach(function (bid) {
                                if (bid.isMyBid) {
                                    if ($scope.confidentialityTypes) {
                                        bid.confidentiality = $scope.confidentialityTypes[0];
                                    }

                                    $scope.lotBidsOld = angular.copy(bid);
                                }
                            }); 
                            $scope.$broadcast('bidReloadFinish');
                        });
                    }
                });

                //function isEquivalent(a, b) {
                //    var aProps = Object.getOwnPropertyNames(a);
                //    var bProps = Object.getOwnPropertyNames(b);

                //    if (aProps.length != bProps.length) {
                //        return false;
                //    }

                //    for (var i = 0; i < aProps.length; i++) {
                //        var propName = aProps[i];
                //        if (a[propName] !== null && b[propName] !== null && typeof (a[propName]) == "object" && typeof (a[propName]) == "object") {
                //            if (!isEquivalent(a[propName], b[propName])) return false;
                //        }
                //        else if (a[propName] != b[propName]) {
                //            return false;
                //        }
                //    }

                //    return true;
                //}


                //function initAnnualCost() {
                //    if ($scope.isEsco) {
                //        $scope.annualCostsReduction = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
                //    };
                //}

                function isBidInvalid(lot) {
                    if (!$scope.tender.lots) return true;

                    if ($scope.isEsco) {
                        return !($scope.isEscoFieldsValid(lot) &&
                            (!$scope.tender.isECriteriaArticle17 && lot.bid.selfEligible || $scope.tender.isECriteriaArticle17) &&
                            lot.bid.selfQualified &&
                            $scope.isAllTenderFeaturesFilled(lot) &&
                            $scope.isAllLotFeaturesFilled(lot));
                    }

                    // bid without amount
                    if (($scope.tender.isDialogue || $scope.tender.isDialogueEU) && !lot.bid.value.amount) {
                        return !$scope.tender.isECriteriaArticle17 && !lot.bid.selfEligible || !lot.bid.selfQualified;
                    }

                    //var emptyBids = 0;
                    //for (var i = 0; i < $scope.tender.lots.length; i += 1) {
                    //var l = $scope.tender.lots[i];

                    var bidAmount = lot.bids.length && lot.bids[0].status === 'draft'
                        ? parseFloat(lot.bids[0].lotValue.value.amount)
                        : parseFloat(lot.bid.value.amount);
                    if (isNaN(bidAmount)) {
                        //emptyBids += 1;
                        //continue;
                        return true;
                    }
                    var lotAmount = parseFloat(lot.value.amount);
                    if ((bidAmount > lotAmount) || (bidAmount === 0)) {
                        return true;
                    }
                    //}
                    //if (emptyBids === $scope.tender.lots.length) {
                    //    return true;
                    //}

                    if (!$scope.tender.isPQBucket) {
                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            return !$scope.vm.choosedProductRequirements.length || !lot.bid;
                        }
                    } else {
                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            var itemsCount = $scope.vm.choosedItemProducts.filter( function() { return true; }).length
                            return itemsCount !== $scope.tender.lots[0].items.length || !lot.bid;
                        }
                    }

                    if (!$scope.tender.isBelowThreshold && $scope.tender.procurementMethodType !== 'closeFrameworkAgreementSelectionUA') {
                        if (!$scope.tender.isECriteriaArticle17 && !lot.bid.selfEligible || !lot.bid.selfQualified)
                            return true;
                    }
                    // todo - duplicated code with addBid

                    if ((lot.featuresTender && lot.featuresTender.length > 0)// есть ли неценов у тендера
                        || (lot.features && lot.features.length > 0)) {// или у лота

                        for (var i = 0; i < lot.featuresTender.length; i += 1) {
                            var feature = lot.featuresTender[i];
                            if (!feature.soption) {
                                return true;
                            }
                        }

                        for (var i = 0; i < lot.features.length; i += 1) {
                            var f = lot.features[i];
                            if (!f.soption) {
                                return true;
                            }
                        }
                    }
                    if (!$scope.isAllTenderFeaturesFilled() || !$scope.isAllLotFeaturesFilled(lot))
                        return true;
                    return false;
                }


                // Features                               
                //var bidFeatures = {};

                function finallyPrice(lot) {
                    if (!lot.bid.value.amount) {
                        return 0;
                    }
                    return roundDiv2(lot.bid.value.amount, lot.coef);
                }

                function finallyPriceUpdate(bid, lot) {
                    if (!bid.lotValue.value || !bid.lotValue.value.amount) {
                        return 0;
                    }
                    return roundDiv2(bid.lotValue.value.amount, lot.coef);
                }

                function coef(lot) {
                    lot.coef = parseFloat((1 + roundDiv2(lot.fSum, lot.priceWeight)).toFixed(2));
                    return lot.coef;
                }

                function coefUpdate(lot, bid) {
                    lot.coef = parseFloat((1 + roundDiv2(optionSumUpdate(lot, bid), lot.priceWeight)).toFixed(2));
                    return lot.coef;
                }

                function optionSum(lot) {
                    var bf = lot.featuresTender.concat(lot.features);
                    lot.fSum = bf.reduce(function (s, f) {
                        if (f.soption) {
                            return s + f.soption.value;
                        } else {
                            return s;
                        }
                    }, 0);
                    return lot.fSum;
                };

                function optionSumUpdate(lot, bid) {
                    var featureArr = lot.featuresTender.concat(lot.features);
                    var fSum = 0;
                    featureArr.forEach(function (feature) {
                        bid.features.forEach(function (option) {
                            if (feature.id === option.featureId) {
                                var optionId = option._id ? option._id : option.id;
                                var selectedOption = feature.options.find(function (featureOption) {
                                    return featureOption.id === optionId;
                                });

                                fSum += Number(selectedOption.value);
                            }
                        });
                    });
                    return fSum;
                };

                //добавляет в featuresDest лишь те элементы из featuresSource, которые там не содержатся
                function concatFeturesExceptDuplicated(featuresDest, featuresSource) {
                    angular.forEach(featuresSource, function (sourceItem) {
                        var isItemContains = false;
                        angular.forEach(featuresDest, function (destinationItem) {
                            if (sourceItem && destinationItem && sourceItem.id == destinationItem.id)
                                isItemContains = true;
                        });
                        if (!isItemContains)
                            featuresDest.push(sourceItem);
                    });
                }

                // internal
                function setFeatures(n) {

                    //vm.features = vm.features.concat(n.features);
                    //concatFeturesExceptDuplicated(vm.features, n.features);

                    n.lots = n.lots.map(function (l) {
                        //vm.features = vm.features.concat(l.features);
                        //concatFeturesExceptDuplicated(vm.features, l.features);

                        for (var i = 0; i < l.items.length; i += 1) {
                            //l.features = l.features.concat(l.items[i].features);
                            concatFeturesExceptDuplicated(l.features, l.items[i].features);

                            //vm.features = vm.features.concat(l.items[i].features);
                            //concatFeturesExceptDuplicated(vm.features, l.items[i].features);
                        }

                        var bf = n.features.concat(l.features);
                        l.featureWeight = bf.reduce(function (s, f) {
                            return s + f.value;
                        }, 0);
                        l.priceWeight = 100 - l.featureWeight;
                        // toFixed(2) must exists - floating error  1 + 0.36 = 1.359(9)
                        l.maxCoef = parseFloat((1 + roundDiv2(l.featureWeight, l.priceWeight)).toFixed(2));

                        return l;
                    });
                }

                function roundDiv2(ch, zn) {
                    return Math.round(ch / zn * 100) / 100;
                }

                // TODO ET-8156
                // Данный вариант не подходит, надо сравнивать копию старого бида и отредактированного используя функцию isEquivalent. находится в changeEditBidClicked 
                $scope.ifChangeAmount = function (data) {
                    var i = 0;
                    for (i; i < data.$$controls.length; i++) {
                        if (data.$$controls[i].$dirty === true)
                            return true;
                    }
                    return false;
                }

                $scope.showModalArticl = function () {
                    $scope.showModalArticle = true;
                    $timeout(function () {
                        $("#modalArticle").modal('show');
                    });
                }

                $scope.loadCheckListScript = function () {
                    //$ocLazyLoad.load('/Scripts/checklist-model.js?v=1');
                }

                $scope.$on('$locationChangeStart', function (event) {
                    if ($scope.filesCounter > 0 && !confirm('Не всі файли було завантажено. Ви впевнені що хочете вийти?'))
                        event.preventDefault();
                });

                function confermLeavingThePage() {
                    window.onbeforeunload = function () {
                        return 'Не всі файли було завантажено. Ви впевнені що хочете вийти?';
                    };
                }

                $scope.displayMsngUserCanNotAddBid = function (reason) {
                    switch (reason) {
                        case 'CanNotAddBidSelectionStage2':
                            return 'До участі у другому етапі допущено лише кваліфікованих учасників першого етапу.';
                        case 'HasNoRightsToDeleteResponsibleManagers':
                            return 'За цим тендером закріплений відповідальний менеджер - ви не можете подати пропозицію.';
                        default:
                            return reason;

                    }
                }

                $scope.getOrganozation = function() {
                    organizationDataService.getData();
                }

                $scope.getNotExportDocIds = function (lot) {
                    var notExportIds = [];
                    lot.bids.forEach(function (bid) {
                        bid.documents.forEach(function (document) {
                            if (document.notExport && !document.isDeleted) {
                                notExportIds.push(document.id);
                            }
                        });
                    });
                    return notExportIds;
                };

                $scope.showExportButton = function () {
                    if ($scope.getNotExportDocIds($scope.lot).length) {
                        return true;
                    } else {
                        return false;
                    }
                };

                $scope.exportDraftDocuments = function (lot) {
                    if (lot.bids) {
                        var notExportIds = $scope.getNotExportDocIds(lot);
                        if (notExportIds.length) {
                            bidDocument.sendNotExportBidDocuments(notExportIds).then(function () {
                                abp.notify.success('Документи експортовані');
                                $scope.$emit('reloadTender');
                            });
                        }
                    }
                };

                $scope.calculateWeightedValue = function (editBidClicked, currentBid) {
                    var weightedValue = currentBid.lotValue ? currentBid.lotValue.value.amount : 0;
                    var criteriaResponses = null;
                    var lccCriteriaApiIds = [
                        'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                    ];

                    var tenderCriterias = $scope.tenderCriterias.filter(function (singleCriteria) {
                        return lccCriteriaApiIds.indexOf(singleCriteria.classification.apiId) !== -1;
                    });
                    
                    if (editBidClicked) {
                        criteriaResponses = findAndFilterCriteiaArrays($scope.criteriaResponses, tenderCriterias);
                    } else {
                        criteriaResponses = findAndFilterCriteiaArrays(currentBid.tenderCriteriaRequirementResponses, tenderCriterias);
                    }
                    criteriaResponses.forEach(function (criteria) {
                        if (criteria.value) {
                            weightedValue += Number(criteria.value);
                        }
                    });
                    
                    return weightedValue.toFixed(2);
                }
                function findAndFilterCriteiaArrays (criteriasArray, tenderCriterias) {
                    return criteriasArray.filter(function (singleCriteriaResponse) {
                        return tenderCriterias.some(function (singleCriteria) {
                            return singleCriteria.requirementGroups.some(function (singleGroup) {
                                return singleGroup.requirements.some(function (singleRequirement) {
                                    return singleRequirement.id == singleCriteriaResponse.requirementId;
                                });
                            });
                        });
                    });
                }

                // New pq profile products logic
                $scope.vm.choosedItemProducts = [];

                $scope.productTranslation = function (title) {
                    if (title === 'True') {
                        return title = 'Так'
                    } else if (title === 'False') {
                        return title = 'Ні';
                    } else {
                        return title;
                    }
                }
            }
        ]
    };
}]);
;
angular.module('app').directive('milestoneGet', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/milestoneGet.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/milestoneGet.html'),
        scope: {
            data: '='
        }, controller: [
            '$scope',
            '$localStorage',
            function (
                $scope,
                $localStorage) {
                $scope.ng_localStorage = $localStorage;

           
            }]
    };
}]);;
angular.module('app').directive('milestones', ['$templateCache', function ($templateCache) {
    return {
        template: $templateCache.get('milestones from cache'),
        restrict: 'E',
        scope: {
            data: '='
        },
        controller: ['$scope', function ($scope) {
            var now = moment();
            angular.forEach($scope.data, function (milestone) {
                var dueDate = moment(milestone.dueDate);
                var diff = now.diff(dueDate);
                var remain = moment.duration(diff);
                milestone.remain = remain.humanize();
                milestone.isDueDateNotPassedYet = diff >= 60 * 60 * 1000 * 2;
            });
        }]
    };
}]);;
(function () {
    angular.module('app').directive('sign', signDirective);
    signDirective.$inject = ['$templateCache'];
    function signDirective($templateCache) {
        return {
            restrict: 'AE',
            //templateUrl: '/App/Main/base/directives/tender/tenderDetailes/sign.html',
            template: $templateCache.get('sign from cache'),
            link: function (scope, element, attrs) {
                //
            },
            scope: {
                tenderId: '<?',
                planId: '<',
                apiId: '<',
                entityOutOfTender: '=?', // если в API подпись ложится не в тендер - а напрямую - https://lb-api-sandbox.prozorro.gov.ua/api/2.3/contracts/d18ab36c358a447ab2f135ef2ad2ea31
                isSignFile: '<',
                detailes: '=?'
            },
            controller: controller
        };
    };
    controller.$inject = [
        '$window',
        '$scope',
        '$element',
        '$http',
        '$rootScope',
        '$localStorage',
        '$timeout',
        'abp.services.etender.log',
        '$interpolate'
    ];
    function controller(
        $window,
        $scope,
        $element,
        $http,
        $rootScope,
        $localStorage,
        $timeout,
        logService,
        $interpolate) {
        var vm = $scope;

        //var sandboxVersion = $localStorage.apiVersion;
        //var sandboxUrl = "https://lb-api-sandbox.prozorro.gov.ua/api";
        var sandboxUrl = $localStorage.readOnlyApiUri;
        var signButton;
        var docType = null;

        var signObjName = "";
        var needToSignTwice = false;
        var countFileSign = null;
        var countBidSign = 0;
      
        vm.init = function () {
            abp.notify.warn('Якщо вікно підпису не завантажується, будь ласка почистіть кеш - історію браузера.', 'Увага!');
            signObjName = 'tenders';
            if (vm.planId || vm.plansArray) {
                signObjName = 'plans';
            }
            if (vm.plansArray) { // масовое подписание планов
                options.apiResourceUrl = [];
                vm.plansArray.forEach(function (plan) {
                    options.apiResourceUrl.push(sandboxUrl + signObjName + "/" + plan.apiId);
                });
            } else {
                options.apiResourceUrl = sandboxUrl + signObjName + "/" + vm.apiId;
                if (vm.contractId) {
                    if (vm.entityOutOfTender === true) {
                        options.apiResourceUrl = sandboxUrl + "contracts/" + vm.contractId;
                    } else
                        options.apiResourceUrl = options.apiResourceUrl + "/contracts/" + vm.contractId;
                }
                if (vm.awardId)
                    options.apiResourceUrl = options.apiResourceUrl + "/awards/" + vm.awardId;
                if (vm.cancellationId)
                    options.apiResourceUrl = options.apiResourceUrl + "/cancellations/" + vm.cancellationId;
                if (vm.qualificationId)
                    options.apiResourceUrl = options.apiResourceUrl + "/qualifications/" + vm.qualificationId;
                if (vm.bid) {
                    //options.apiResourceUrl = options.apiResourceUrl + "/bids/" + vm.bid.apiId;
                    options.disableLoadObj = true;
                }
                if (vm.monitoringPostId || vm.monitoringAppealId || vm.eliminationReportId)
                    options.disableLoadObj = true;
                if (vm.agreementApiId) {
                    if (vm.entityOutOfTender === true) {
                        options.apiResourceUrl = sandboxUrl + "agreements/" + vm.agreementApiId;
                    } else
                        options.apiResourceUrl = options.apiResourceUrl + "/agreements/" + vm.agreementApiId;
                }
                if (vm.planMilestoneId)
                    options.apiResourceUrl = sandboxUrl + "plans/" + vm.planMilestone.planApiId + "/milestones/" + vm.planMilestone.apiId;
            }

            if (vm.bid && vm.detailes && (vm.detailes.procurementMethodType === 'aboveThresholdEU' ||
                vm.detailes.procurementMethodType === 'competitiveDialogueEU.stage2' ||
                vm.detailes.procurementMethodType === 'esco' ||
                (vm.detailes.procurementMethodType === 'closeFrameworkAgreementUA' && vm.detailes.status !== "active.awarded"))) {

                needToSignTwice = true;
            }


            abp.ui.setBusy('#signPlaceholder');

            //options.apiResourceUrl = 
            //    ["https://lb-api-sandbox.prozorro.gov.ua/api/2.3/plans/0ee91883220e45b4a56c2b4e587f45e0",
            //        "https://lb-api-sandbox.prozorro.gov.ua/api/2.3/plans/72b023adb2e540c39f9dd0a6c004f398"];

            opSign.init(options);
        };

        $('#modalSignPlan').on('show.bs.modal', function (event, obj) {
            if (!obj)
                return;

            localData.sign = undefined;

            var modalTitle = obj.type === "milestone"
                ? "Підпис відповіді на запит для проведення процедури ЦЗО закупівлі"
                : "Підпис плану";

            $('#modalSignPlan .modal-title').text(modalTitle);

            vm.plansArray = null;
            vm.planMilestoneId = null;
            vm.planMilestone = null;
            vm.planId = null;
            vm.apiId = null;

            if (obj instanceof Array)
                vm.plansArray = obj;
            else if (obj.type === "milestone") {
                vm.planMilestoneId = obj.id;
                vm.planMilestone = obj;
            }
            else if (obj.type === "plan") {
                vm.planId = obj.id;
                vm.apiId = obj.apiId || obj.id;
            }
            vm.init();
        });

        $('#modalSign').on('show.bs.modal', function (event, obj, tender, numberOfSign) {
            onModalOpenActions(event, obj, tender, numberOfSign)
        });

        $('#modalSignTender').on('show.bs.modal', function (event, obj, tender) {
            onModalOpenActions(event, obj, tender)
        });

        var options = {
            /* {url} full address of object in API */
            apiResourceUrl: sandboxUrl + signObjName + "/" + vm.apiId, //"https://lb-api-sandbox.prozorro.gov.ua/api/0.11/tenders/b64001cdaa1540e7a17c14d0207e3feb",
            /* {string} element id (jquery) to render html */
            placeholderId: "#signPlaceholder",
            /* {boolean} verify signature on start, if exist */
            verifySignOnInit: true,
            /* {boolean} if verification error, allow sign whatever */
            ignoreVerifyError: false,
            /* callback obtaining json from API  */
            callbackRender: "renderJson",
            /* callback after put sign */
            callbackPostSign: postSign,
            /* callback after init all libs */
            callbackOnInit: onInit,
            /* callback before init all libs */
           // callbackBeforeInit: "beforeInit",
            /* callback after verify signature */
            callbackCheckSign: checkSign,
            /* callback after error */
            _onError: "onError",
            /* using jsondiffpatch-formatters for render difference */
            userJsonDiffHtml: true
        };

        $window.signDiff = true;
        //options.apiResourceUrl = "https://lb-api-sandbox.prozorro.gov.ua/api/2.1/tenders/" + (data.apiId || data.id);


        $(function () {
        /* {string} custom html for render */
            var compiledHtmlTemplate = $interpolate($('#htmlTemplate').text())($scope);
            options.customHtmlTemplate = compiledHtmlTemplate;
        });
        $(function () {
            /* {string} custom html for render */
            var compiledNewHtmlTemplate = $interpolate($('#htmlTemplateNew').text())($scope);
            options.customNewHtmlTemplate = compiledNewHtmlTemplate;
        });

        /**
         * Callback function, before init crypto libs, for redefine gui elements
         */
        //function beforeInit(obj) {
            //console.log('beforeInit', arguments);
            // override proxy
            //URL_XML_HTTP_PROXY_SERVICE = "https://vpn.unity-bars.com.ua/proxy/ProxyHandler.ashx";

            // if using custom html template - can redefine elements id
            //obj.uiSignPanel = document.getElementById('signPanel'); // панель наложения подписи
            //obj.uiCheckPanel = document.getElementById('checkPanel'); // панель верификации подписи
            //obj.uiVerifyBtn = document.getElementById('VerifyDataButton'); // кнопка проверки подписи
            //obj.uiSignBtn = document.getElementById('SignDataButton'); // кнопка наложения подписи
            //obj.uiPkSelectBtn = document.getElementById('PKeySelectFileButton'); // кнопка выбора файла ключа
            //obj.uiPkFileName = document.getElementById('PKeyFileName'); // поле с файлом ключа
            //obj.uiPkCertsDiv = document.getElementById('PKCertsSelectZone'); // блок с загрузкой личных сертификатов
            //obj.uiCaServersSelect = document.getElementById('CAsServersSelect'); // dropdown со списком ЦСК
            //obj.uiPkStatusInfo = document.getElementById('PKStatusInfo'); // span для сообщений о процессе работы с ключем
            //obj.uiPkPassword = document.getElementById('PKeyPassword'); // поле пароля для ключа
            //obj.uiPkReadBtn = document.getElementById('PKeyReadButton'); // кнопка чтения ключа
            //obj.uiPkFileInput = document.getElementById('PKeyFileInput'); // input(type=file) для загрузки ключа
            //obj.uiCertInfo = document.getElementById('certInfo'); // блок с информацией о сертификате
            //obj.uiVerifyCertInfo = document.getElementById('certInfo'); // блок с информацией о сертификате при проверке подписи
            //obj.uiVerifyErrorInfo = document.getElementById('verificationError'); // блок с информацией о неверной подписи
            //obj.uiVerifyDiffInfo = document.getElementById('verificationErrorDiff'); // блок с информацией о различиях данных
            //obj.uiVerifySuccessInfo = document.getElementById('verificationSuccess'); // блок с информацией о успешной проверке подписи
            //obj.uiCertFileInput = document.getElementById('ChoosePKCertsInput');// input(type=file) для загрузки сертификата
            //obj.uiCertList = document.getElementById('SelectedPKCertsList'); // output для отображения загруженого сертификата
        //}

        /**
         * Callback function, after init crypto libs
         */
        function onInit(obj) {
            //console.log('externalInit', arguments);

            if (localData.sign) {
                abp.ui.setBusy('#signPlaceholder');
                //console.log('signed');
            } else {
                abp.ui.clearBusy('#signPlaceholder');
                //console.log('not signed');
            }
            if (vm.bid) {
                localData.obj = vm.bid;
            }
            if (vm.monitoring) {
                localData.obj = vm.monitoring;
            }
        };

        /**
         * Callback function, after obtaining json from API
         * @param {object} data - json object
         */
        $window.renderJson = function renderJson(data) {
            abp.ui.setBusy('#signPlaceholder');
            //console.log('renderJson', data);
        };

        /**
         * Callback function, after sign verification
         * @param {object} signData - json object from signature
         * @param {object} currData - json object from database
         * @param {object} diff     - difference, json object (undefined if equal), see https://github.com/benjamine/jsondiffpatch
         * @param {object} obj      - reference to main lib
         */
        function checkSign(signData, currData, diff, obj, timeInfo) {
            //console.log('externalcheckSign', diff);
            if (diff) {
                $window.signDiff = true;
                $("#signPanel").show();
                $("#exceptionSign").show().text("Підпис невірний - були модифіковані дані!");
            } else {
                $window.signDiff = false;
                $("#signPanel").hide();
                var signTime = ('0' + timeInfo.time.getDate()).slice(-2) + '-' + ('0' + (timeInfo.time.getMonth() + 1)).slice(-2) + '-' +
                    timeInfo.time.getFullYear() + ' ' + timeInfo.time.getHours() + ":" + timeInfo.time.getMinutes();
                $("#checkSign").show();
                $("#timeSign").show().text(signTime);

                $("#certInfoSign").show();
                $("#subjCN").show().text(obj.subjCN);
                $("#issuerCN").show().text(obj.issuerCN);
                $("#serial").show().text(obj.serial);
            }
            abp.ui.clearBusy('#signPlaceholder');
        };

        $window.onError = function onError(exception) {
            console.log('exception', exception);
            $("#exceptionSign").show().text(exception.message);
            if (exception.errorCode === 51) {
                $('#eu-certs').show();
            }
        };

        /**
         * Callback function, post sign to server
         * @param {string} signature - base64 string with CMS signature
         */
        
        function postSign(signature) {
            if (!countFileSign) {
                countBidSign++;
            }
            abp.ui.setBusy("#signPlaceholder:first");
            if (signButton === undefined)
                //TODO: хардкод селектора из за либы прозорро, ПОМЕНЯТЬ в дальнейших переработках
                // протестить в сафари
                // signButton = $('#SignDataButton')[0] ?
                //                 $('#SignDataButton')[0].id :
                //                 ($('#sign-from-file')[0] ? $('#sign-from-file')[0].id : $('#sign-from-device')[0].id);
                signButton = document.activeElement.id;
            //document.getElementById(signButton).disabled = true;
            var signData = {};

            function buildLog(context, id) {
                var data =
                    {
                        userId : $localStorage.userId,
                        tenantId : $localStorage.userTenantId,
                        context : context,
                        id : id,
                        sign : signData.signString
                    };
                return data;
            }
            

            if (vm.plansArray) {
                signData.PlansListToSign = [];
                var logArray = [];
                for (var key in signature) {
                    if (signature.hasOwnProperty(key)) {
                        signData.PlansListToSign.push({ ApiId: key, SignString: signature[key] });

                        var plan =
                            {
                                userId : $localStorage.username,
                                tenantId : $localStorage.userTenantId,
                                context : "Plan",
                                id : key,
                                sign : signature[key]
                        };
                        logArray.push(plan);
                    }
                }
                logService.logSignArray({ signList: logArray});
            } else {
                signData = { signString: signature };
                
                if (vm.bid)
                {
                    signData.bidId = vm.bidId;
                    logService.logSign(buildLog("Bid", vm.bidId));
                }
                if (vm.tenderId)
                {
                    signData.tenderId = vm.tenderId;
                    logService.logSign(buildLog("Tender", vm.tenderId));
                }
                if (vm.planId)
                {
                    signData.planId = vm.planId;
                    logService.logSign(buildLog("Plan", vm.planId));
                }
                if (vm.contractId)
                {
                    signData.contractId = vm.contractId;
                    logService.logSign(buildLog("Contract", vm.contractId));
                    if (vm.entityOutOfTender === true)
                        signData.isContracting = true;
                }
                if (vm.changeId)
                {
                    signData.changeId = vm.changeId;
                    logService.logSign(buildLog("Change", vm.changeId));
                }
                if (vm.awardId)
                {
                    signData.awardId = vm.awardId;
                    logService.logSign(buildLog("Award", vm.awardId));
                }
                if (vm.cancellationId) {
                    signData.cancellationId = vm.cancellationId;
                }
                if (vm.qualificationId)
                    signData.qualificationId = vm.qualificationId;
                if (vm.monitoringPostId)
                    signData.MonitoringPostId = vm.monitoringPostId;
                if (vm.monitoringAppealId)
                    signData.MonitoringAppealId = vm.monitoringAppealId;
                if (vm.eliminationReportId)
                    signData.EliminationReportId = vm.eliminationReportId;
                if (vm.agreementId) {
                    signData.agreementId = vm.agreementId;
                    logService.logSign(buildLog("Agreement", vm.agreementId));
                    if (vm.entityOutOfTender === true)
                        signData.isAgreementModule = true;
                }
                    
                if (vm.planMilestoneId)
                    signData.planMilestoneId = vm.planMilestoneId;
            }
            httpRequest(signData, signButton);
        };

        function bidSign(signData, signButton) {
            if ($scope.countBidSign === 1) {
                httpRequest(signData, signButton);

                delete vm.bid.value;
                signObjName = 'tenders';
                options.disableLoadObj = true;
                opSign.init(options);

                $scope.countBidSign++;
            } else if ($scope.countBidSign > 1) {
                $scope.countBidSign = 0;
            }
            return;
        };

        function httpRequest(signData, signButton) {

            var errorText = 'Помилка при передачі підпису до ЦБД';

            signData.docType = null;
            if (needToSignTwice && countBidSign == 1)
                signData.docType = 'commercialProposal';
            else if (!needToSignTwice && vm.detailes && vm.detailes.procurementMethodType === 'closeFrameworkAgreementUA' &&
                vm.detailes.status === "active.awarded")
                signData.docType = 'commercialProposal';

            $http({
                    method: 'POST',
                    url: '.' + abp.appPath + 'api/files/CreateFileFromString',
                    data: signData
                })
                .then(function (reponse) {
                    if (!reponse.data.success && reponse.data.error) {
                        if (signButton == 'SignDataButton')
                            setKeyStatus(reponse.data.error.message, 'error');
                        else
                            $("#exceptionSign").show().text(reponse.data.error.message);
                    } else {

                        if (needToSignTwice && countBidSign == 1 && !countFileSign) {
                            delete vm.bid.value;
                            delete vm.bid.financialDocuments;
                            //document.getElementById(signButton).disabled = false;
                            $timeout(function () {
                                angular.element('#' + signButton).trigger('click');
                            }, 300);
                            //document.getElementById(signButton).disabled = true;
                            return;
                        }

                        if (signButton == 'SignDataButton')
                            setKeyStatus('Будь ласка дочекайтеся експортування файлу підпису до ЦБД (для оновлення статусу - потрібно оновити сторінку)', 'success');
                        else {
                            $("#exceptionSign").hide();
                            $("#successSign").show().text('Будь ласка дочекайтеся експортування файлу підпису до ЦБД (для оновлення статусу - потрібно оновити сторінку)');
                        }
                        $rootScope.$broadcast('tenderSigned');
                        if (countBidSign === 2) {
                            countBidSign = 0;
                        }
                        vm.isSignFile = true;
                    }
                    abp.ui.clearBusy("#signPlaceholder");
                }, function (reponse) {
                    if (reponse.data && reponse.data.message)
                        errorText = reponse.data.message;
                    if (signButton == 'SignDataButton')
                        setKeyStatus(errorText, 'error');
                    vm.isSignFile = false;
                    abp.ui.clearBusy("#signPlaceholder");
                    //document.getElementById(signButton).disabled = false;
                });
            // todo post to server with sign
        };

        function onModalOpenActions (event, obj, tender, numberOfSign) {
            countBidSign = numberOfSign ? numberOfSign : 0;
            countFileSign = numberOfSign ? numberOfSign : null;

            vm.awardId = null;
            vm.cancellationId = null;
            vm.contractId = null;
            vm.changeId = null;
            vm.qualificationId = null;
            vm.bid = null;
            vm.bidId = null;
            vm.plansArray = null;

            vm.monitoringPostId = null;
            vm.monitoringAppealId = null;
            vm.eliminationReportId = null;
            vm.monitoring = null;

            localData.sign = undefined;

            if (tender) {
                vm.tenderId = tender.id;
                vm.apiId = tender.apiId;
                vm.isSignFile = tender.isSignatureFileExists;
            }
            if (obj && obj.type) {
                if (obj.type == 'contract') {
                    vm.contractId = obj.id;
                }
                if (obj.type == 'change') {
                    vm.changeId = obj.id;
                    vm.contractId = obj.contractId;
                }
                if (obj.type == 'award') {
                    vm.awardId = obj.id;
                }
                if (obj.type == 'cancellation') {
                    vm.cancellationId = obj.id;
                }
                if (obj.type == 'qualification') {
                    vm.qualificationId = obj.id;
                }
                if (obj.type == 'bid') {
                    vm.bidId = obj.ourId;
                    delete obj.ourId;
                    delete obj.type;
                    vm.bid = obj;
                }
                if (obj.type == 'monitoringPostId') {
                    vm.monitoringPostId = obj.id;
                    delete obj.type;
                    vm.monitoring = obj;
                }
                if (obj.type == 'monitoringAppealId') {
                    vm.monitoringAppealId = obj.id;
                    delete obj.type;
                    vm.monitoring = obj;
                }
                if (obj.type == 'eliminationReportId') {
                    vm.eliminationReportId = obj.id;
                    delete obj.type;
                    vm.monitoring = obj;
                }
                if (obj.type === "agreement") {
                    vm.agreementId = obj.id;
                    vm.agreementApiId = obj.apiId;
                }

                vm.init();
            }
            // do something…
        }

    };
})();
;
(function () {
    angular.module('app').directive('signCheck', signCheckDirective);

    signCheckDirective.$inject = ['$templateCache'];
    function signCheckDirective($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('signCheck from cache'),
            link: function (scope, element, attrs) {

            },
            scope: {
                tenderId: '=',
                planId: '=',
                apiId: '=',
                contractId: '=',
                agreementId: '=',
                changeId: '=',
                bid: '=',
                isSignatureFileExist: '=',
                entityOutOfTender: '=', // если в API подпись ложится не в тендер - а напрямую - https://lb-api-sandbox.prozorro.gov.ua/api/2.3/contracts/d18ab36c358a447ab2f135ef2ad2ea31
                isSigned: '=?',  // сюда возвращаем результат проверки - подписано или нет?
                border: '='
            },
            controller: controller
        };
    };

    controller.$inject = ['$window', '$scope', '$element', '$http', '$rootScope', '$localStorage'];
    function controller($window, $scope, $element, $http, $rootScope, $localStorage) {
        var vm = $scope;
        var sandboxUrl = $localStorage.readOnlyApiUri;

        var signObjName = "";
        vm.border = $scope.border;
        vm.init = function () {
            signObjName = 'tenders';
            if (vm.planId)
                signObjName = 'plans';
            options.apiResourceUrl = sandboxUrl + signObjName + "/" + vm.apiId;
            if (vm.contractId) {
                if (vm.entityOutOfTender === true) {
                    options.apiResourceUrl = sandboxUrl + "contracts/" + vm.contractId;
                } else
                    options.apiResourceUrl = options.apiResourceUrl + "/contracts/" + vm.contractId;
            }
            if (vm.bid) {
                if (vm.bid.isClosed) {
                    options.disableLoadObj = true;
                    options.disableLoadSign = true;
                    options.verifySignOnInit = true;
                } else {
                    options.apiResourceUrl = options.apiResourceUrl + "/bids/" + vm.bid.id;
                    if (vm.bid.ignoreValue) options.ignoreFields = ['value', 'financialDocuments', 'id'];
                    else
                        options.ignoreFields = ['value', 'id'];
                }
            }
            if (vm.agreementId) {
                if (vm.entityOutOfTender === true) {
                    options.apiResourceUrl = sandboxUrl + "agreements/" + vm.agreementId;
                } else
                    options.apiResourceUrl = options.apiResourceUrl + "/agreements/" + vm.agreementId;
            }

            $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
                options.async = true;
            });
            (function waitForOpSignToLoad() {
                if (window.opSign) {
                    window.opSign.init(options);
                } else {
                    setTimeout(waitForOpSignToLoad, 500);
                }
            }());
        };

        $scope.$watch('tenderId', function (data) {
            $scope.formUpload = false;
            if (data != null) {
                if ($scope.isSignatureFileExist === true) {
                    vm.init();
                } else {
                    vm.isSigned = false;
                }
                
            }
        });
        $scope.$watch('planId', function (data) {
            abp.ui.setBusy('#myPlansDiv');
            $scope.formUpload = false;
            if (data != null) {
                if ($scope.isSignatureFileExist === true) {
                    vm.init();
                } else {
                    vm.isSigned = false;
                }

            }
        });
        vm.isSigned = undefined;
        $scope.isSignedDiff = false;
        $scope.signDiff = "";

        $scope.showSignDiff = function () {
            return /[\?&]operator123/.test(window.location.href);
        }

        var options = {
            /* {url} full address of object in API */
            apiResourceUrl: sandboxUrl + signObjName + "/" + vm.apiId, //"https://lb-api-sandbox.prozorro.gov.ua/api/0.11/tenders/b64001cdaa1540e7a17c14d0207e3feb",           
            /* {string} element id (jquery) to render html */
            //placeholderId: "#signPlaceholderCheck",
            ///* {boolean} verify signature on start, if exist */
            //verifySignOnInit: true,
            ///* {boolean} if verification error, allow sign whatever */
            //ignoreVerifyError: false,
            /* callback obtaining json from API  */
            callbackRender: "renderJson2",
            /* callback after put sign */
            //callbackPostSign: "postSign",
            ///* callback after init all libs */
            //callbackOnInit: "onInit",
            ///* callback before init all libs */
            //callbackBeforeInit: "beforeInit",
            /* callback after verify signature */
            callbackCheckSign: "checkSign2",
            verifyOnly: true
            /* using jsondiffpatch-formatters for render difference */
            //userJsonDiffHtml: true
        };

        //$window.signDiff = true;
        $window.checkSign2 = function checkSign2(signData, currData, diff, obj) {
            //currData - данные из ЦБД
            //signData - данные из файла подписи

            //console.log('externalcheckSign', diff);

            if (!signData) {
                vm.isSigned = false;
            } else {
                vm.isSigned = true;
            }
            //console.log("json полученный из подписи: "+JSON.parse(JSON.stringify(signData)));
            if (diff) {
                vm.isSigned = false;
                $scope.isSignedDiff = true;
                $scope.signDiff = diff;
            }
            abp.ui.clearBusy('#myPlansDiv');
        };


        $window.renderJson2 = function renderJson2(data) {
            console.log('renderJson2', data);
            if (vm.bid && vm.bid.isClosed) {
                localData.sign = vm.bid.sign;
                delete vm.bid.sign;
                delete vm.bid.isClosed;
                delete vm.bid.ignoreValue;
                localData.obj = vm.bid;
            }
        };


    }
})();;
(function () {
    angular.module('app').directive('signCheckNew', signCheckNewDirective);

    signCheckNewDirective.$inject = ['$templateCache'];
    function signCheckNewDirective($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('signCheck from cache'),
            link: function (scope, element, attrs) {

            },
            scope: {
                detailes: '=?',
                bid: '=',
                lot: '=',
                entityType: '=',
                award: '=',
                plan: '=',
                milestone: '=',
                contract: '=',
                contractingChange: '=',
                contractingClose: '=',
                cancellation: '=',
                agreement: '=',
                entityOutOfTender: '=',
                isSigned: '=?',
                isSignatureFileExist: '='
            },
            controller: controller
        };
    };

    controller.$inject = ['$window', '$scope', '$element', '$http', '$rootScope', '$localStorage', '$timeout'];
    function controller($window, $scope, $element, $http, $rootScope, $localStorage, $timeout) {
        var sandboxUrl = $localStorage.readOnlyApiUri;

        $scope.options = {
            debug: false,
            ignoreFields: []
        };

        $scope.init = function () {
            $scope.tryToVerify();
        };

        $scope.tryToVerify = function () {
            generateTenderAndPlanApiId();
            if ($scope.tenderApiId || $scope.planApiId) {
                $scope.checkSignByUrl();
            } else {
                $scope.tryToVerify();
            }
        }

        $scope.isSigned = undefined;
        $scope.isSignedDiff = false;
        $scope.signDiff = "";

        $scope.showSignDiff = function () {
            return /[\?&]operator123/.test(window.location.href);
        };

        $scope.checkSignByUrl = function () {
            $window.eds.init($scope.options).then(function () {
                var url = generateRequestUrl();
                $window.eds.verifyObjects([url])
                    .then(function (response) {
                        if (!response[0].difference) {
                            $scope.isSigned = true;
                        } else {
                            $scope.isSigned = false;
                            console.log('difference:', response[0].difference);
                        }
                    });
            });
        };

        function generateRequestUrl () {
            var url = sandboxUrl;
            if (isPlanTypeSign()) {
                url += 'plans/' + $scope.planApiId;
                if ($scope.entityType === 'planMilestone') {
                    url += '/milestones/' + $scope.milestone.apiId;
                }
            } else {
                if (!$scope.entityOutOfTender) {
                    url += 'tenders/' + $scope.tenderApiId;
                    url += $scope.entityType === 'detailes' ? '' : '/';
                }
                switch ($scope.entityType) {
                    case 'award':
                        url += 'awards/' + $scope.award.id;
                        break;
                    case 'contract':
                    case 'contractingBreaking':
                    case 'contracting':
                        url+= 'contracts/' + $scope.contract.id;
                        break;
                    case 'contractingChange':
                        url+= 'contracts/' + $scope.contractingChange.contractId;
                        break;
                    case 'contractingClose':
                        url+= 'contracts/' + $scope.contractingClose.id;
                        break;
                    case 'cancellation':
                        url += 'cancellations/' + $scope.cancellation.id;
                        break;
                    case 'agreement':
                    case 'agreementModule':
                        url+= 'agreements/' + $scope.agreement.apiId;
                        break;
                    case 'bid':
                        url+= 'bids/' + $scope.bid.apiId;
                }
            }

            return url;
        }

        $scope.$watch('contract', function () {
            if ($scope.contract && $scope.contract.id) {
                if ($scope.isSignatureFileExist || $scope.contract.isSignatureExist ||
                    ($scope.entityType === 'contracting' && $scope.contract.changes[$scope.contract.changes.length - 1].isSignatureExist)) {
                    $scope.init();
                } else {
                    $scope.isSigned = false;
                }
            }
        });

        $scope.$watch('agreement', function () {
            if ($scope.agreement && $scope.agreement.id) {
                if ($scope.isSignatureFileExist || $scope.agreement.isSignatureExist) {
                    $scope.init();
                } else {
                    $scope.isSigned = false;
                }
            }
        });

        $scope.$watch('contractingClose', function () {
            if ($scope.contractingClose && $scope.contractingClose.id) {
                if ($scope.isSignatureFileExist || $scope.contractingClose.isSignatureExist) {
                    $scope.init();
                } else {
                    $scope.isSigned = false;
                }
            }
        });

        $scope.$watch('detailes', function () {
            if ($scope.detailes && $scope.detailes.id) {
                if ($scope.isSignatureFileExist || $scope.detailes.isSignatureFileExist) {
                    $scope.init();
                } else {
                    $scope.isSigned = false;
                }
            }
        });

        $scope.$watch('plan', function () {
            if ($scope.plan && $scope.plan.id) {
                if ($scope.isSignatureFileExist || $scope.plan.isSignatureFileExist) {
                    $scope.init();
                } else {
                    $scope.isSigned = false;
                }
            }
        });

        function isPlanTypeSign () {
            return $scope.entityType === 'plan' || $scope.entityType === 'planMilestone';
        }

        function isContractTypeSign () {
            return $scope.entityType === 'contract'
                || $scope.entityType === 'contracting'
                || $scope.entityType === 'contractingBreaking'
                || $scope.entityType === 'contractingChange'
                || $scope.entityType === 'contractingClose';
        }

        function generateTenderAndPlanApiId() {
            if (!isPlanTypeSign()) {
                if (!isContractTypeSign()) {
                    if ($scope.entityType !== 'agreement' && $scope.entityType !== 'agreementModule') {
                        $scope.tenderApiId = $scope.detailes.apiId;
                    } else {
                        $scope.tenderApiId = $scope.agreement.tenderNewApiID;
                    }
                } else {
                    switch ($scope.entityType) {
                        case 'contract':
                        case 'contractingBreaking':
                        case 'contracting':
                            $scope.tenderApiId = $scope.contract.tenderApiId;
                            break;
                        case 'contractingChange':
                            $scope.tenderApiId = $scope.contractingChange.tenderApiId;
                            break;
                        case 'contractingClose':
                            $scope.tenderApiId = $scope.contractingClose.tenderApiId;
                            break;
                    }
                }
            } else {
                if ($scope.entityType === 'plan') {
                    $scope.planApiId = $scope.plan.apiId;
                } else {
                    $scope.planApiId = $scope.milestone.planApiId;
                }
            }
        }
    }
})();
;
(function () {
    angular.module('app').directive('signNew', signDirective);
    signDirective.$inject = ['$templateCache'];
    function signDirective($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('signNew from cache'),
            scope: {
                detailes: '=?',
                bid: '=',
                lot: '=',
                directSignCount: '=',
                entityType: '=',
                award: '=',
                plan: '=',
                milestone: '=',
                contract: '=',
                contractingChange: '=',
                contractingClose: '=',
                cancellation: '=',
                agreement: '=',
                entityOutOfTender: '=',
                monitoring: '=',
                signDocs: '=',
                submission: '='
            },
            controller: controller
        };
    };
    controller.$inject = [
        '$window',
        '$scope',
        '$element',
        '$http',
        '$rootScope',
        '$localStorage',
        'abp.services.etender.signature',
        'abp.services.etender.filePath',
        'abp.services.etender.prozorroAuthorizedIdentifier'
    ];
    function controller(
        $window,
        $scope,
        $element,
        $http,
        $rootScope,
        $localStorage,
        signatureService,
        filePath,
        prozorroAuthorizedIdentifier) {

        var sandboxUrl = $localStorage.readOnlyApiUri;
        var monitoringUrl = $localStorage.monitoringApiUri;

        $scope.options = {
            debug: false,
            callbackAfterAuth: onCallBackAfterAuth,
            ignoreFields: []
        };

        $scope.widgetService = null;
        $scope.dataToSign = null;
        $scope.tenderApiId = null;
        $scope.planApiId = null;
        $scope.planApiIdArr = [];
        $scope.docDataArr = [];
        $scope.requestDocData = [];
        $scope.signCount = 0;
        $scope.fileCount = 0;
        $scope.docsSignedAmount = 0;
        $scope.docsSignedFinished = 0;
        $scope.docsPartAmountToSign = 3;
        $scope.bidId = null;
        $scope.needToSignTwice = false;
        $scope.canSign = false;
        $scope.isSigned = false;
        $scope.signError = false;
        $scope.isLastPartOfDocsSign = false;
        $scope.documentUploadStarted = false;
        $scope.testUserSigner = 'Тестовий ЦСК АТ "ІІТ"';
        $scope.testUserEmail = 'k.skripelov@e-tender.ua';

        $scope.init = function () {
            if (!$scope.widgetService) {
                $window.eds.init($scope.options).then(function () {
                    $window.eds.loadWidget($scope.options).then(function (response) {
                        $scope.widgetService = response;
                    });
                });
            }
        };

        $('#modalSignNew').on('show.bs.modal', function () {
            $scope.canSign = false;
            $scope.isSigned = false;
            $scope.signError = false;
            $scope.onModalOpenActions();
        });

        $('body').on('hide.bs.modal', '#modalSignNew', function () {
            onCloseModalEvents();
        });

        $('#modalSignNewTender').on('show.bs.modal', function () {
            $scope.canSign = false;
            $scope.isSigned = false;
            $scope.signError = false;
            $scope.onModalOpenActions();
        });

        $('body').on('hide.bs.modal', '#modalSignNewTender', function () {
            onCloseModalEvents();
        });

        $window.onError = function onError(exception) {
            console.log('exception', exception);
            $('#exceptionSign').show().text(exception.message);
            if (exception.errorCode === 51) {
                $('#eu-certs').show();
            }
        }

         $scope.onModalOpenActions = function () {
            $scope.init();
        };

        $scope.signData = function () {
            generateTenderAndPlanApiId();
            switch ($scope.entityType) {
                case 'bid':
                    $scope.signBid();
                    break;
                case 'documentHash':
                    $scope.signDoc();
                    break;
                case 'submission':
                    $scope.signSubmission();
                    break;
                default:
                    $scope.signByUrl();
                    break;
            }
        };

        $scope.signBid = function () {
            isNeedToSignTwice();
            if ($scope.directSignCount || $scope.directSignCount === 0) {
                $scope.signCount = $scope.directSignCount;
                $scope.needToSignTwice = false;
            }

            if ($scope.bid && $scope.bid.ourId) {
                $scope.bidId = angular.copy($scope.bid.ourId);
            }

            if ($scope.signCount === 1) {
                delete $scope.bid.value;
                delete bidForSign.financialDocuments;
            }

            delete $scope.bid.type;
            delete $scope.bid.ourId;
            var signData = JSON.stringify($scope.bid);

            $window.eds.sign(signData, {asBase64String: true})
                .then(function (response) {
                    var signData = {};
                    if (($scope.signCount === 0 && $scope.needToSignTwice) || $scope.directSignCount === 0) {
                        signData = generateRequestParams(response, 'commercialProposal');
                    } else {
                        if ($scope.detailes.procurementMethodType === 'closeFrameworkAgreementUA'
                            && $scope.detailes.status === 'active.awarded') {
                            signData = generateRequestParams(response, 'commercialProposal');
                        } else {
                            signData = generateRequestParams(response);
                        }
                    }

                    $http({
                        method: 'POST',
                        url: '.' + abp.appPath + 'api/files/CreateFileFromString',
                        data: signData
                    }).then(function (response) {
                        if ($scope.needToSignTwice && $scope.signCount === 0) {
                            $scope.signCount++;
                            $scope.signData();
                        } else {
                            if ($scope.needToSignTwice && $scope.signCount === 1) {
                                $scope.signCount = 0;
                            }
                            abp.notify.success('Дані підписано');
                            $rootScope.$broadcast('tenderSigned');
                            $('#modalSignNew').modal('hide');
                            $scope.isSigned = true;
                            $scope.canSign = false;
                        }
                    });
                });
        };

        $scope.signSubmission = function () {
            var signData = JSON.stringify($scope.submission);

            $window.eds.sign(signData, {asBase64String: true})
                .then(function (response) {
                    var signData = {};
                    signData = generateRequestParams(response);

                    $http({
                        method: 'POST',
                        url: '.' + abp.appPath + 'api/files/CreateFileFromString',
                        data: signData
                    }).then(function (response) {
                        abp.notify.success('Дані підписано');
                        $('#modalSignNew').modal('hide');
                        $scope.isSigned = true;
                        $scope.canSign = false;
                    });
                });
        };

        $scope.signDoc = function () {
            abp.ui.setBusy('#sign-entity');
            $scope.docsSignedAmount = 0;
            $scope.docsSignedFinished = 0;
            $scope.documentUploadStarted = true;
            if ($scope.bid && $scope.bid.id) {
                $scope.bidId = angular.copy($scope.bid.id);
            }
            var urlsForExportedDocs = [];
            $scope.signDocs.forEach(function (document) {
                if (document.isExported && $scope.detailes.status === 'active.tendering') {
                    urlsForExportedDocs.push(document.url);
                }
            });

            if (urlsForExportedDocs.length) {
                filePath.getDownloadUrlsForPrivateDocs({ urls: urlsForExportedDocs }).then(function (response) {
                    response.data.forEach(function (docUrlParams) {
                        var documentIndex = $scope.signDocs.findIndex(function (doc) {
                            return doc.url === docUrlParams.inputUrl;
                        })

                        if (documentIndex !== -1) {
                            $scope.signDocs[documentIndex].url = docUrlParams.downloadUrl;
                        }
                    });
                    $scope.downloadAndSignDocsInParts(0);
                });
            } else {
                $scope.downloadAndSignDocsInParts(0);
            }
        };

        $scope.downloadAndSignDocsInParts = function(partNumber) {
            var firstIndexOfPart = partNumber * $scope.docsPartAmountToSign;
            var lastIndexOfPart = (partNumber + 1) * $scope.docsPartAmountToSign < $scope.signDocs.length
                ? (partNumber + 1) * $scope.docsPartAmountToSign
                : $scope.signDocs.length;

            if (lastIndexOfPart === $scope.signDocs.length) {
                $scope.isLastPartOfDocsSign = true;
            }

            for (var i = firstIndexOfPart; i < lastIndexOfPart; i++) {
                $scope.signDocAfterGettingUrl($scope.signDocs[i], $scope.signDocs[i].url, lastIndexOfPart);
            }
        }

        $scope.signDocAfterGettingUrl = function (document, url, lastIndexOfPart) {
            fetch(url).then(function (response) {
                response.arrayBuffer().then(async function (arrayBufferDocument) {
                    var uint8View = new Uint8Array(arrayBufferDocument);
                    $scope.docDataArr.push({uint8View: uint8View, document: document});

                    var docsAmountToSign = 0;
                    if ($scope.isLastPartOfDocsSign) {
                        docsAmountToSign = lastIndexOfPart % $scope.docsPartAmountToSign === 0
                            ? $scope.docsPartAmountToSign
                            : lastIndexOfPart % $scope.docsPartAmountToSign;
                    } else {
                        docsAmountToSign = $scope.docsPartAmountToSign;
                    }
                    if ($scope.docDataArr.length === docsAmountToSign) {
                        $scope.docDataArr.sort(function (a, b) {
                            return a.uint8View - b.uint8View;
                        });
                        for (var [index, documentObj] of $scope.docDataArr.entries()) {
                            await $scope.signDocsConsistently(documentObj, index, lastIndexOfPart, docsAmountToSign);
                        }
                    }
                });
            });
        };

        $scope.signDocsConsistently = async function (documentObj, index, lastIndexOfPart, docsAmountToSign) {
            var signResponse = null;
            signResponse = await $window.eds.sign(documentObj.uint8View, {external: true});
            var document = angular.copy(documentObj.document);
            var requestDataObj =  {
                documentId: document.id,
                signature: Array.from(signResponse)
            };
            $scope.requestDocData.push(requestDataObj);
            $scope.docsSignedAmount++;
            if ($scope.docsSignedAmount === docsAmountToSign) {
                signatureService.signBidDocuments($scope.requestDocData).then(function () {
                    $scope.docsSignedFinished += $scope.requestDocData.length;
                    $scope.docsSignedAmount = 0;
                    $scope.requestDocData = [];
                    $scope.docDataArr = [];
                    if ($scope.isLastPartOfDocsSign) {
                        $scope.isLastPartOfDocsSign = false;
                        abp.ui.clearBusy();
                        abp.notify.success('Дані підписано');
                        $rootScope.$broadcast('tenderSigned');
                        $('#modalSignNew').modal('hide');
                        $scope.isSigned = true;
                        $scope.canSign = false;
                        $scope.documentUploadStarted = false;
                    } else {
                        $scope.downloadAndSignDocsInParts(lastIndexOfPart / $scope.docsPartAmountToSign);
                    }
                });
            }
        };

        $scope.signByUrl = function () {
            var url = generateRequestUrl();
            $scope.signObjects(url, {asBase64String: true})
                .then(function (response) {
                    var responseData = response;
                    $scope.fileCount = 0;
                    var fileIndex = 0;
                    responseData.forEach(function (signDataObj, index) {
                        var signData = generateRequestParams(signDataObj, null, index);
                        $scope.fileCount++;
                        $http({
                            method: 'POST',
                            url: '.' + abp.appPath + 'api/files/CreateFileFromString',
                            data: signData
                        }).then(function () {
                            fileIndex++;
                            if (fileIndex === responseData.length) {
                                abp.notify.success('Дані підписано');
                                $rootScope.$broadcast('tenderSigned');
                                $rootScope.$broadcast('contractSigned');
                                $('#modalSignNew').modal('hide');
                                $scope.isSigned = true;
                                $scope.canSign = false;
                            }
                        });
                    });
                });
        };
        
        $scope.signHash = function (signString) {
            $window.eds.signHash(signString, $scope.options)
                .then(function (response) {
                    console.log(response);
                });
        };

        $scope.signObjects = function (signStringArr) {
            return $window.eds.signObjects(signStringArr, {asBase64String: true});
        };
        
        function onCallBackAfterAuth (certificateTypes) {
            if ((certificateTypes[0].infoEx.issuerCN === $scope.testUserSigner
                && certificateTypes[0].infoEx.subjEMail === $scope.testUserEmail
                && !$localStorage.isProductionSite) || $scope.entityType === 'submission') {
                
                $scope.requestDocData = [];
                $scope.docDataArr = [];
                $scope.canSign = true;
                return;
            } else {
                var isNeedPersonCheck = false;
                if ($scope.entityType === 'plan') {
                    if (Array.isArray($scope.plan)) {
                        isNeedPersonCheck = $scope.plan[0].isProzorroAuthorizedPersonCheckRequired;
                    } else {
                        isNeedPersonCheck = $scope.plan.isProzorroAuthorizedPersonCheckRequired;
                    }
                } else {
                    if (isContractTypeSign()) {
                        switch ($scope.entityType) {
                            case 'contract':
                            case 'contractingBreaking':
                            case 'contracting':
                            case 'contractingChange':
                                isNeedPersonCheck = $scope.contract.isProzorroAuthorizedPersonCheckRequired;
                                break;
                            case 'contractingClose':
                                isNeedPersonCheck = $scope.contractingClose.isProzorroAuthorizedPersonCheckRequired;
                                break;
                        }
                    } else if ($scope.entityType === 'agreement' || $scope.entityType === 'agreementModule') {
                        isNeedPersonCheck = $scope.agreement.isProzorroAuthorizedPersonCheckRequired;
                    } else {
                        isNeedPersonCheck = $scope.detailes.isProzorroAuthorizedPersonCheckRequired;
                    }
                }

                if (isNeedPersonCheck) {
                    $scope.dataToSign = certificateTypes[0].infoEx;
                    prozorroAuthorizedIdentifier.checkIsProzorroAuthorizedIdentifier($scope.dataToSign.subjDRFOCode).then(function (response) {
                        if (response.data) {
                            $scope.requestDocData = [];
                            $scope.docDataArr = [];
                            $scope.canSign = true;
                            return;
                        } else {
                            $('#modalSignNew').modal('hide');
                            $('#modalSignNewTender').modal('hide');
                            $scope.$emit('onPersonSignDataErrorModalOpen');
                            return;
                        }
                    }, function () {
                        $('#modalSignNew').modal('hide');
                        $('#modalSignNewTender').modal('hide');
                        $scope.$emit('onPersonSignDataErrorModalOpen');
                        return;
                    }, function () {
                        $('#modalSignNew').modal('hide');
                        $('#modalSignNewTender').modal('hide');
                        abp.notify.error('Сталася помилка');
                    });
                } else {
                    $scope.requestDocData = [];
                    $scope.docDataArr = [];
                    $scope.canSign = true;
                    return;
                }
            }
        }

        function generateTenderAndPlanApiId() {
            if ($scope.entityType === 'documentHash' || $scope.entityType === 'submission') {
                return
            }
            if (!isPlanTypeSign()) {
                if (!isContractTypeSign()) {
                    if ($scope.entityType !== 'agreement' && $scope.entityType !== 'agreementModule') {
                        $scope.tenderApiId = $scope.detailes.apiId;
                    } else {
                        $scope.tenderApiId = $scope.agreement.tenderNewApiID;
                    }
                } else {
                    switch ($scope.entityType) {
                        case 'contract':
                        case 'contractingBreaking':
                        case 'contracting':
                            $scope.tenderApiId = $scope.contract.tenderApiId;
                            break;
                        case 'contractingChange':
                            $scope.tenderApiId = $scope.contractingChange.tenderApiId;
                            break;
                        case 'contractingClose':
                            $scope.tenderApiId = $scope.contractingClose.tenderApiId;
                            break;
                    }
                }
            } else {
                if ($scope.entityType === 'plan' || $scope.entityType === 'documentHash') {
                    if (Array.isArray($scope.plan)) {
                        $scope.plan.forEach(function (singlePlan) {
                            $scope.planApiIdArr.push(singlePlan.apiId);
                        });
                    } else {
                        $scope.planApiId = $scope.plan.apiId;
                    }
                } else {
                    $scope.planApiId = $scope.milestone.planApiId;
                }
            }
        }

        function isPlanTypeSign () {
            return $scope.entityType === 'plan' || $scope.entityType === 'planMilestone';
        }

        function isContractTypeSign () {
            return $scope.entityType === 'contract'
                || $scope.entityType === 'contracting'
                || $scope.entityType === 'contractingBreaking'
                || $scope.entityType === 'contractingChange'
                || $scope.entityType === 'contractingClose';
        }

        function generateRequestParams (data, docType, index) {
            var docTypeData = docType || null;
            var dataToSign = null;

            if (typeof data === 'object') {
                dataToSign = data.sign;
            } else {
                dataToSign = data;
            }

            var requestParams = {
                docType: docTypeData,
                signString: dataToSign
            };

            if (!isPlanTypeSign()) {
                requestParams.tenderId = $scope.entityType === 'tender' || $scope.entityType === 'cancellation'
                    ? $scope.detailes.id
                    : $scope.tenderApiId;
            }

            switch ($scope.entityType) {
                case 'bid':
                    requestParams.bidId = $scope.bidId;
                    break;
                case 'award':
                    requestParams.awardId = $scope.award.id;
                    break;
                case 'plan':
                    if (Array.isArray($scope.plan)) {
                        requestParams.planId = $scope.plan[index].id;
                    } else {
                        requestParams.planId = $scope.plan.id;
                    }
                    break;
                case 'documentHash':
                    requestParams.bidId = $scope.bidId;
                    break;
                case 'planMilestone':
                    requestParams.planMilestoneId = $scope.milestone.id;
                    requestParams.planId = $scope.milestone.planApiId;
                    break;
                case 'contract':
                    requestParams.contractId = $scope.contract.id;
                    break;
                case 'contractingBreaking':
                case 'contracting':
                    requestParams.isContracting = true;
                    requestParams.contractId = $scope.contract.id;
                    break;
                case 'contractingChange':
                    requestParams.isContracting = true;
                    requestParams.contractId = $scope.contractingChange.contractId;
                    requestParams.changeId = $scope.contractingChange.id;
                    break;
                case 'contractingClose':
                    requestParams.isContracting = true;
                    requestParams.contractId = $scope.contractingClose.id;
                    break;
                case 'cancellation':
                    requestParams.cancellationId = $scope.cancellation.id;
                    break;
                case 'agreement':
                    requestParams.agreementId = $scope.agreement.id;
                    requestParams.tenderId = $scope.agreement.tenderNewID;
                    break;
                case 'agreementModule':
                    requestParams.isAgreementModule = true;
                    requestParams.agreementId = $scope.agreement.id;
                    requestParams.tenderId = $scope.agreement.tenderNewID;
                    break;
                case 'monitoringPostId':
                    requestParams.monitoringPostId = $scope.monitoring.id;
                    break;
                case 'monitoringAppealId':
                    requestParams.monitoringAppealId = $scope.monitoring.id;
                    break;
                case 'eliminationReportId':
                    requestParams.eliminationReportId = $scope.monitoring.id;
                    break;
                case 'submission':
                    requestParams.submissionId = $scope.submission.id;
                    break;
            }

            return requestParams;
        }

        function generateRequestUrl () {
            var url = sandboxUrl;
            var monitoring = monitoringUrl;
            if (isPlanTypeSign()) {
                if (Array.isArray($scope.plan)) {
                    var urlArr = [];
                    $scope.planApiIdArr.forEach(function (planApiId) {
                        urlArr.push(url + 'plans/' + planApiId);
                    });
                } else {
                    url += 'plans/' + $scope.planApiId;
                    if ($scope.entityType === 'planMilestone') {
                        url += '/milestones/' + $scope.milestone.apiId;
                    }
                }
            } else {
                if (!$scope.entityOutOfTender) {
                    url += 'tenders/' + $scope.tenderApiId;
                }
                switch ($scope.entityType) {
                    case 'award':
                        url += '/awards/' + $scope.award.id;
                        break;
                    case 'contract':
                    case 'contracting':
                        url+= '/contracts/' + $scope.contract.id;
                        break;
                    case 'contractingBreaking':
                        url+= 'contracts/' + $scope.contract.id;
                        break;
                    case 'contractingChange':
                        url+= 'contracts/' + $scope.contractingChange.contractId;
                        break;
                    case 'contractingClose':
                        url+= 'contracts/' + $scope.contractingClose.id;
                        break;
                    case 'cancellation':
                        url += '/cancellations/' + $scope.cancellation.id;
                        break;
                    case 'agreement':
                        url += '/agreements/' + $scope.agreement.apiId;
                        break;
                    case 'agreementModule':
                        url+= 'agreements/' + $scope.agreement.apiId;
                        break;
                    case 'monitoringPostId':
                        monitoring += '/' + $scope.monitoring.monitoringId + '/posts/' + $scope.monitoring.id;
                        break;
                    case 'monitoringAppealId':
                        monitoring += '/' + $scope.monitoring.id + '/appeal';
                        break;
                    case 'eliminationReportId':
                        monitoring += '/' + $scope.monitoring.id + '/eliminationReport';
                        break;
                }
            }

            if ($scope.entityType === 'monitoringPostId' || $scope.entityType === 'monitoringAppealId' || $scope.entityType === 'eliminationReportId') {
                return [monitoring];
            }
            return urlArr || [url];
        }

        function isNeedToSignTwice () {
            if ($scope.bid && $scope.detailes && ($scope.detailes.procurementMethodType === 'aboveThresholdEU' ||
                $scope.detailes.procurementMethodType === 'competitiveDialogueEU.stage2' ||
                $scope.detailes.procurementMethodType === 'esco' ||
                ($scope.detailes.procurementMethodType === 'closeFrameworkAgreementUA' && $scope.detailes.status !== 'active.awarded'))) {

                $scope.needToSignTwice = true;
            } else {
                $scope.needToSignTwice = false;
            }
        }

        function onCloseModalEvents () {
            $scope.signCount = 0;
            $scope.planApiIdArr = [];
            $scope.canSign = false;
            $scope.isSigned = false;
            if ($scope.widgetService) {
                $scope.widgetService.resetKey();
            }
        }
    }
})();
;
angular.module('app').directive('tenderAuctionInfo', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/tenderAuctionInfo.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderAuctionInfo.html'),
        scope: {
            tender: '='
        },
        controller: ['$scope', '$rootScope', '$timeout', function ($scope, $rootScope, $timeout) {
            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;

            var s = new Date();
            $scope.dateToDay = Date.parse(s);
            if ($scope.tender && $scope.tender.tenderPeriod && $scope.tender.tenderPeriod.startDate)
                $scope.tenderPeriodStart = Date.parse($scope.tender.tenderPeriod.startDate);
        }]
    };
}]);;
angular.module('app').directive('tenderBidsBlock', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/Special/directives/tender/tenderDetailes/tenderBidsBlock.html',
        template: $templateCache.get('~/Special/directives/tender/tenderDetailes/tenderBidsBlock.html'),
        scope: {
            lot: '=',
            detailes: '=',
            vm: '=',
            tenderHasBids: '=',
            reloadDetailes: '&',
            reloadBid: '&',
            doctype: '=',
            id: '=',
            documentsService: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            '$sessionStorage',
            '$timeout',
            'treeMoveService',
            'abp.services.etender.qualification',
            'abp.services.etender.organization',
            'documentsService',
            'reloadService',
            function (
                $scope,
                $localStorage,
                $sessionStorage,
                $timeout,
                treeMoveService,
                qualificationService,
                organizationService,
                documentsService,
                reloadService
            ) {

                $scope.ng_localStorage = $localStorage;
                $scope.ng_sessionStorage = $sessionStorage;
                $sessionStorage.noMoney = false;
                $scope.tId = $scope.detailes.id;

                // tree move functions
                $scope.$on('togleAllTree',
                    function () {
                        $timeout(function () {
                            if (!$scope['treeBid' + $scope.lot.index])
                                $scope.collapseTree($scope.lot.index, 'treeBid');
                            if (!$scope['treeAgreement' + $scope.lot.index])
                                $scope.collapseTree($scope.lot.index, 'treeAgreement');
                            abp.ui.clearBusy();
                        }, 2000);
                        $scope.colapseShow('#profileDropDown');
                        $scope.colapseShow('#profileContactUser');
                    });

                if ($scope.detailes.lots.length === 1)
                    togleTreeScope(true);
                else togleTreeScope(false);

                function togleTreeScope(data) {
                    $scope['treeBid' + $scope.lot.index] = data;
                    $scope['treeAgreement' + $scope.lot.index] = data;
                }

                $scope.collapseTree = function (index, idBlock) {
                    treeMoveService.collapseTree(idBlock, index, $scope);
                }

                $scope.showTreeBlock = function (index, idBlock) {
                    return treeMoveService.showTreeBlock(index, $scope, idBlock);
                }

                $scope.colapseShow = function (id) {
                    $(id).collapse("show");
                }
                $scope.colapseHide = function (id) {
                    $(id).collapse("hide");
                }
                // tree move functions END

                $scope.getTenderBefore = function () {
                    $scope.documentsToAdd = null;
                    abp.ui.setBusy();
                    $(".hide-move-efect").fadeOut();
                };

                // Documents Prev START

                $scope.previewDoc = function (doc) {
                    documentsService.previewDoc(doc, $scope);
                }

                $scope.trustSrc = function (src) {
                    return documentsService.trustSrcForDocLoad(src);
                }

                $scope.goToUrl = function (url) {
                    window.location = url;
                }

                // Documents Prev END


                $scope.showQualifications = function (detailes) {
                    $scope.tendDetailes = detailes;
                    if (($scope.tendDetailes.isOpenEU
                        || $scope.tendDetailes.isDialogue
                        || $scope.tendDetailes.isDialogueEU
                        || $scope.tendDetailes.isDialogueEUStage2
                        || $scope.tendDetailes.isBelowThreshold
                        || $scope.tendDetailes.isOpenUA
                        || $scope.tendDetailes.isDefense
                        || $scope.tendDetailes.isSimpleDefense
                        || $scope.tendDetailes.isOpenTS
                        || $scope.tendDetailes.isLimitedReporting
                        || $scope.tendDetailes.isLimited
                        || $scope.tendDetailes.isEsco
                        || $scope.tendDetailes.procurementMethodType === 'closeFrameworkAgreementUA')
                        && ($scope.tendDetailes.status == 'active.pre-qualification.stand-still'
                            || $scope.tendDetailes.status == 'active.pre-qualification'
                            || $scope.tendDetailes.status == 'active.qualification'
                            || $scope.tendDetailes.status == 'active.awarded'
                            || $scope.tendDetailes.status == 'active.auction'
                            || $scope.tendDetailes.status == 'complete'
                            || ($scope.tendDetailes.status == 'cancelled' && $scope.tendDetailes.lots[0].qualifications[0])
                            || ($scope.tendDetailes.status == 'unsuccessful' && $scope.tendDetailes.lots[0].qualifications[0])
                            || $scope.tendDetailes.status == 'active.stage2.pending'
                            || $scope.tendDetailes.status == 'active.stage2.waiting')) {
                        return true;
                    } else {
                        return false;
                    }
                }

                $scope.canStandStill = function (lot) {
                    if (lot && (lot.status === 'active' || lot.isFake)) {
                        for (var i = 0; i < $scope.detailes.lots.length; i += 1) {
                            if ($scope.detailes.lots[i].status === 'active' || lot.isFake) {
                                for (var j = 0; j < $scope.detailes.lots[i].qualifications.length; j += 1) {
                                    if ($scope.detailes.lots[i].qualifications[j].status === 'pending') {
                                        return false;
                                    }
                                }
                            }
                        }
                        return true;
                    } else {
                        return false;
                    }
                }

                $scope.canShowLotBids = function (lot, tender) {
                    return lot.status != 'cancelled'
                        && (lot.bids && lot.bids.length > 0 || $localStorage.isAuthorized && (tender.status == 'active.tendering') && !tender.isEdit && $localStorage.userTenantId != tender.organization.tenantId)
                        || lot.awards.length > 0 && lot.status === 'cancelled';
                }

                $scope.standStill = function () {
                    qualificationService.tenderStandStill($scope.detailes.id)
                        .then(function (data) {
                            reloadService.reloadDetailes($scope);
                        });
                }

                $scope.fillByEdrpou = function () {
                    abp.ui.setBusy();
                    organizationService.getOrganizationInfoForFillAward({ innOrEdrpou: $scope.lot.ac.code })
                        .then(function (e) {
                            var info = e.data;
                            $scope.lot.ac.name = info.organizationName;
                            $scope.lot.ac.address.region = {
                                countryId: info.countryId,
                                id: info.regionId,
                                title: info.regionTitle
                            };


                            $scope.lot.ac.address.city = {
                                id: info.cityId,
                                regionId: info.regionId,
                                title: info.cityTitle
                            };
                            
                            // if (e.data.isNewCity)
                            //     $scope.lot.ac.address.newCity = {
                            //         id: info.cityId,
                            //         regionId: info.regionId,
                            //         title: info.cityTitle
                            //     };
                            // else
                            //     $scope.lot.ac.address.city = {
                            //         id: info.cityId,
                            //         regionId: info.regionId,
                            //         title: info.cityTitle
                            //     };


                            $scope.lot.ac.cp.name = info.contactPointName;
                            $scope.lot.ac.cp.telephone = info.contactPointTelephone;
                            $scope.lot.ac.cp.url = info.contactPointUrl;
                            $scope.lot.ac.cp.faxNumber = info.contactPointFaxNumber;
                            $scope.lot.ac.address.addressStr = info.addressStr;
                            $scope.lot.ac.address.postIndex = info.postIndex;
                            abp.ui.clearBusy();
                            abp.notify.success('Перевірте правильність даних, будь ласка!');
                        },
                        function (err) {
                            abp.ui.clearBusy();
                        }
                    );
                };
            }
        ]
    };
}]);
;
angular.module('app').directive('tenderCriteria', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('tenderCriteria from cache'),
            scope: {
                criterias: '=',
                docs: '=',
                detailes: '='
            },
            controller: [
                '$scope',
                '$rootScope',
                'criteriasDictionaryService',
                function ($scope, $rootScope, criteriasDictionaryService) {

                    $scope.getDetailesLocalizationText = function (type) {
                        return criteriasDictionaryService.getDetailesLocalizationText(type);
                    };

                    $scope.setCollapseTitle = function (index) {
                        switch (index) {
                            case 0:
                                return 'Підстави для відмови в участі у процедурі закупівлі'
                            case 1:
                                return 'Інформація про інші технічні, якісні та кількісні характеристики та вимоги до учасника'
                            default:
                                break;
                        }
                    };

                    $scope.hasLccCriteria = function (criteriaApiId) {
                        var lccCriteriaApiIds = [
                            'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                            'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                            'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                            'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                        ];
                        
                        return lccCriteriaApiIds.indexOf(criteriaApiId) !== -1;
                    }

                    $scope.$watch('criterias', function () {
                        sortCriterias();
                    });

                    $scope.getRequirementStatusTranslation = function (status) {
                        return status === 'active'
                            ? $rootScope.source('ActiveStatus')
                            : $rootScope.source('CancelledStatus');
                    };

                    $scope.getDetailesLocalizationTextRelatesTo = function (criteria, relatesTo) {
                        if (relatesTo === 'lot') {
                            var lotTitle = $scope.getLotName(criteria.relatedItem);
                            return $scope.getDetailesLocalizationText(relatesTo) + ' ' + lotTitle;
                        } else {
                            return $scope.getDetailesLocalizationText(relatesTo);
                        }
                    };

                    $scope.getLotName = function (apiId) {
                        var lot = $scope.detailes.lots.find(function(lot) {
                            return lot.apiId === apiId;
                        });
                        return lot ? lot.title : '';
                    };

                    function sortCriterias() {
                        var excludedCriterias = $scope.criterias.filter(function (e) {
                            var excludedString = "CRITERION.EXCLUSION";
                            return e.classification.apiId.includes(excludedString);
                        });
                        var criteriasOther = $scope.criterias.filter(function (e) {
                            var excludedString = "CRITERION.OTHER";
                            return e.classification.apiId.includes(excludedString);
                        });

                        $scope.sortedCriterias = [
                            excludedCriterias, criteriasOther
                        ];
                    };

                    sortCriterias();
                }
            ]
        }
    }
])
;
angular.module('app').directive('tenderDetailesAbout', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/tenderDetailesAbout.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderDetailesAbout.html'),
        scope: {
            detailes: '=',
            doctype: '=',
            openModalCancelTender: '=',
            openCloseTreeBid: '&',
            reloadDetailes: '&',
            statusClarify: '=',
            reasonTypes: '=',
            vm: '=',
            doctypeBid: '=',
            tenderHasBids: '=',
            reloadBid: '&'
        },
        controller: [
            '$scope',
            '$rootScope',
            '$localStorage',
            '$timeout',
            'lookupService',
            'abp.services.etender.log',
            'documentsService',
            'requestService',
            '$location',
            function (
                $scope,
                $rootScope,
                $localStorage,
                $timeout,
                lookupService,
                logAppService,
                documentsService,
                requestService,
                $location) {
                $scope.ng_localStorage = $localStorage;
                $scope.dom = {};

                // togle - open, close tree in about block
                $scope.openCloseTree = function (togle) {

                    if (togle === 'show') {
                        abp.ui.setBusy();
                        $timeout(function () {
                            $scope.$broadcast('togleAllTree', togle);
                        }, pauseColapse());
                    }


                    jQuery('#tree-00').collapse(togle);
                    jQuery('#tree-01-01').collapse(togle);
                    jQuery('#tree-01-02').collapse(togle);
                    jQuery('#tree-01-03').collapse(togle);
                    jQuery('#tree-01-04').collapse(togle);
                    var a = 0;
                    var length = $scope.detailes.lots.length;
                    for (a; a < length; a++) {
                        $scope.$broadcast('togle', a, togle);
                        var name00 = '#treeLot-00-' + a;
                        var name01 = '#treetree-01-01-' + a;
                        var name02 = '#treetree-01-02-' + a;
                        var name03 = '#treetree-01-03-' + a;
                        var name04 = '#treetree-01-04-' + a;
                        jQuery(name00).collapse(togle);
                        jQuery(name01).collapse(togle);
                        jQuery(name02).collapse(togle);
                        jQuery(name03).collapse(togle);
                        jQuery(name04).collapse(togle);
                    }
                }

                var locationSearch = $location.search();
                if (locationSearch.showall) {
                    $timeout(function () {
                        $scope.openCloseTree('show');
                    }, 0);
                }

                $scope.ifSideBarHasClass = function () {
                    return $('.e-tender').hasClass('open')
                }

                function pauseColapse() {
                    var lotLength = $scope.detailes.lots.length;
                    var pause = 1000;
                    if (lotLength >= 5 && lotLength < 11) pause = 1500;
                    if (lotLength >= 11 && lotLength < 21) pause = 2000;
                    if (lotLength >= 21 && lotLength < 50) pause = 3500;
                    if (lotLength >= 50) pause = 5000;
                    return pause;
                }

                $scope.collapseTree = function (index, idBlock) {
                    //var id = '#treeLot' + index;
                    var id = '#treeLot-00-' + index;
                    var idBid = '#treeLotBid' + index;
                    if ($scope[idBlock + index]) {
                        closeTree(id, index);
                        closeTree(idBid, index);
                    } else {
                        openTree(id, index);
                        openTree(idBid, index);
                    }
                }
                
                var quantityOfLotsCanNotAddDoc = 0;
                for (var key in $scope.detailes.lots) {
                    if ($scope.detailes.lots.hasOwnProperty(key)) {
                        if ($scope.detailes.lots[key].reasonsUserCanNotAddBid.length) {
                            quantityOfLotsCanNotAddDoc++;
                            if ($scope.detailes.lots.length === quantityOfLotsCanNotAddDoc) {
                                $scope.isUserCantAddAnyDoc = true;
                            }
                        }
                    }
                }

                $scope.tenderLocalization = $rootScope.source('Tender');
                $scope.tenderDescriptionLocalization = $rootScope.source('TenderDescription');

                $scope.getReasonTypeNameById = function (id) {
                    var title = null;
                    if (id) {
                        angular.forEach($scope.reasonTypes, function (el) {
                            if (el.value == id) {
                                title = el.name;
                            }
                        });
                    }
                    return title;
                };

                // lot statuses
                // todo move to common service
                $scope.getLotStatusLabelClass = function (s) {
                   return lookupService.getLotStatusLabelClass(s);
                };

                $scope.getLotStatusUkr = function (s) {
                   return lookupService.getLotStatusUkr(s);
                };

                // add bit buttons in about block
                $scope.addBid = function (index) {
                    abp.ui.setBusy();
                    //$rootScope.menuPress('menuBids');
                    $scope.second_passed = function () {
                        $scope.openCloseTreeBid('hide', index);
                        setTimeout($scope.openDiv, 400);
                        setTimeout($scope.moovToDiv, 800);
                    }
                    setTimeout($scope.second_passed, 800);

                    $scope.openDiv = function () {
                        var collapseId = '#treeLotBid-00-' + index;
                        var collapseBid = '#treeBid-01-03-' + index;
                        jQuery(collapseId).collapse('show');
                        jQuery(collapseBid).collapse('show');
                    }
                    $scope.moovToDiv = function () {
                        var moovId = '.lotBid-lot-' + index;
                        jQuery('html, body').animate({ scrollTop: jQuery(moovId).offset().top - 7 }, 'slow');
                        abp.ui.clearBusy();
                    }
                };

                $scope.isItemsFeatures = function (q) {
                    var a = 0;
                    var length = q.length;
                    for (a; a < length; a++) {
                        if (q[a].features.length !== 0) {
                            return true;
                        }
                    }
                    return false;
                };

                $scope.areLotFeaturesPresented = function () {
                    var areLotFeaturesPresented = false;
                    $scope.detailes.lots.forEach(function (lot) {
                        if ((lot.features && lot.features.length) || (lot.featuresTender && lot.featuresTender.length)) {
                            areLotFeaturesPresented = true;
                        }
                    });

                    return areLotFeaturesPresented;
                };

                $scope.additionalClassifications = function (items) {
                    var length = items.length;
                    for (var i = 0; i < length; i++) {
                        if (items[i].additionalClassifications.length > 0) {
                            return true;
                        }
                    }
                    return false;
                }

                $scope.includePoints = function (title) {
                    if (title && title.length > 30) {
                        return '...';
                    }
                };

                $scope.getDate = function (date) {
                    return Date.parse(date);
                }

                var colapseShow = function (id) {
                    $(id).collapse("show");
                }
                var colapseHide = function (id) {
                    $(id).collapse("hide");
                }
                var hideIf = function (index) {
                    $scope['treeLot' + index] = false;
                    $scope['treeLotBid' + index] = false;
                }

                function openTree (id, index) {
                    $scope['treeLot' + index] = true;
                    $scope['treeLotBid' + index] = true;
                    $timeout(function () {
                        colapseShow(id);
                    }, 200);
                }

                function closeTree (id, index) {
                    colapseHide(id);
                    $timeout(function () {
                        hideIf(index);
                    }, 500);
                }

                $scope.showTreeBlock = function (index, idBlock) {
                    if (!$scope.showTree) return false;
                    if ($scope[idBlock + index]) {
                        $scope.$emit('showTreeBlock', index, true);
                        return true;
                    } else {
                        $scope.$emit('showTreeBlock', index, false);
                        return false;
                    }
                }

                $scope.$on('togle',
                    function (evt, index, togle) {
                        var id = '#treeLot' + index;
                        var idBid = '#treeLotBid' + index;
                        if (togle === 'hide') {
                            closeTree(id, index);
                            closeTree(idBid, index);
                        } else {
                            openTree(id, index);
                            openTree(idBid, index);
                        }
                    });


                var listener = $scope.$watch("detailes", function (n, o) {
                    if (!n) return;
                    $scope.showTree = true;
                    (function () {
                        var i = 0;
                        for (i; i < $scope.detailes.lots.length; i++) {
                            if ($scope.detailes.lots.length === 1) {
                                $scope['treeLot' + i] = true;
                                $scope['treeLotBid' + i] = true;
                            } else {
                                $scope['treeLot' + i] = false;
                                $scope['treeLotBid' + i] = false;
                            }
                        }
                    }());
                    $scope.detailes.cause = lookupService.getCause(n.cause);
                    $scope.status = lookupService.getTenderStatusDesc($scope.detailes.status, $scope.detailes.procurementMethodType, $scope.detailes.notExport);
                    listener();
                });

                $scope.treeBlocks = {
                    generateBidsInputs: false
                }

                $scope.getParticipationUrl = function (lot) {
                    var i = 0;
                    if (lot.bids)
                        for (i; i < lot.bids.length; i++) {
                            if (lot.bids[i].lotValue && lot.bids[i].lotValue.participationUrl)
                                return lot.bids[i].lotValue.participationUrl;
                        }
                    return '';
                }

                $scope.showParticipationUrl = function (lot) {
                    var i = 0;
                    if (lot && lot.bids)
                        for (i; i < lot.bids.length; i++) {
                            if (lot.bids[i].lotValue && lot.bids[i].lotValue.participationUrl)
                                return true;
                        }
                    return false;
                }

                $scope.isMyBidHere = function (bids) {
                    if (bids.length > 0) {
                        var a = 0;
                        for (a; a < bids.length; a++) {
                            if (bids[a].isMyBid) {
                                $scope.detailes.isMyBidHere = true;
                                if ($scope.detailes.status === 'active.auction' && bids[a].status === 'active') {
                                    $scope.detailes.isMyBidActiveHere = true;
                                }
                                return true;
                            }
                        }
                    }
                    $scope.detailes.isMyBidHere = false;
                    $scope.detailes.isMyBidActiveHere = false;
                    return false;
                }
                var s = new Date();
                $scope.dateToDay = Date.parse(s);
                $scope.lessThenToday = function (date) {
                    return $scope.dateToDay > Date.parse(date);
                }

                $scope.isMyBidInTender = function (getLotIndexs) {
                    var lotBidIndexs = [];
                    if (!$scope.detailes) return false;
                    var i = 0;
                    for (i; i < $scope.detailes.lots.length; i++) {
                        var b = 0;
                        for (b; b < $scope.detailes.lots[i].bids.length; b++) {
                            if ($scope.detailes.lots[i].bids[b].isMyBid) {
                                if (!getLotIndexs) return true;
                                lotBidIndexs.push(i);
                            }

                        }
                    }
                    if (!getLotIndexs) return false;
                    return lotBidIndexs;
                }

                $scope.showMyBids = function () {
                    $scope.openCloseTree('hide');
                    $timeout(function () {
                        openTrees();
                    }, 1000);
                }

                function openTrees() {
                    var lotBidIndexs = $scope.isMyBidInTender(true);
                    for (i = 0; i < lotBidIndexs.length; i++) {
                        $scope.collapseTree(lotBidIndexs[i]);
                    }
                }

                $scope.WriteAddress = function(tender){
                    logAppService.logIpAddress("BidParticipationUrl", tender.tenderId);
                };

                $scope.checkIfLotHasRelatedBuyer = function (items) {
                    var hasRelatedBuyer = false;

                    items.forEach(function (item) {
                        if (item.relatedBuyer) {
                            hasRelatedBuyer = true;
                        }
                    });

                    return hasRelatedBuyer;
                };

                $scope.getRelatedBuyer = function (apiId) {
                    return $scope.detailes.buyers.find(function (buyer) {
                        return buyer.apiId === apiId;
                    });
                }

                $scope.openMassFeedDocuments = function () {
                    if (!$scope.showMassFeedDocuments) {
                        $scope.showMassFeedDocuments = true;
                        $timeout(function () {
                            jQuery("#collapse-add-docs").collapse('toggle');
                        },500);
                    } else {
                        jQuery("#collapse-add-docs").collapse('toggle');
                    }
                }

                $scope.showDocsInItem = function (id, item) {
                    if (!item.showDocsInItems) {
                        item.showDocsInItems = true;
                        $timeout(function() {
                                $(id).collapse('show');
                            },
                            500);
                    } else {
                        $(id).collapse('hide');
                        $timeout(function () {
                                item.showDocsInItems = false;
                            },
                            500);
                       }
                }

                $scope.postUserSubscriptionByConcreteCpvCode = function (id) {
                    requestService.postUserSubscriptionByConcreteCpvCode(id)
                };

                // Documents Prev START

                $scope.previewDoc = function (doc) {
                    documentsService.previewDoc(doc, $scope);
                }

                $scope.trustSrc = function (src) {
                    return documentsService.trustSrcForDocLoad(src);
                }

                $scope.goToUrl = function (url) {
                    window.location = url;
                }

                $scope.requirementsArray = [];
                $scope.$watch(function () {
                    return $scope.detailes.selfRequirements
                }, function (selfRequirements) {
                    if (selfRequirements && !$scope.detailes.isPQBucket) {
                        for (var self = 0; self < selfRequirements.length; self++) {
                            for (var group = 0; group < selfRequirements[self].requirementGroups.length; group++) {
                                for (var requirement = 0; requirement < selfRequirements[self].requirementGroups[group].requirements.length; requirement++) {
                                    var currentRequirement = selfRequirements[self].requirementGroups[group].requirements[requirement];
                                    if (currentRequirement.expectedValue === 'False') {
                                        currentRequirement.expectedValue = 'Ні';
                                    }
                                    if (currentRequirement.expectedValue === 'True') {
                                        currentRequirement.expectedValue = 'Так';
                                    }
                                    $scope.requirementsArray.push(currentRequirement);
                                }
                            }
                        }                  
                    }
                });

                $scope.getRequirementsFromItem = function (item) {
                    var requirementsArray = [];

                    if (item && item.profile && item.profile.products.length) {
                        item.profile.products[0].relatedProfile.criteria.forEach(function (singleCriteria) {
                            singleCriteria.requirementGroups.forEach(function (singleGroup) {
                                singleGroup.requirements.forEach(function (requirement) {
                                    if (requirement.expectedValue === 'True') {
                                        requirement.expectedValue = 'Так';
                                    }
                                    if (requirement.expectedValue === 'False') {
                                        requirement.expectedValue = 'Ні'
                                    }
                                    requirementsArray.push(requirement);
                                });
                            });
                        });
                    }
                    
                    return requirementsArray;
                }
            }]
    };
}]);
;
angular.module('app').directive('tenderDetailesTop',
    ['$templateCache', function($templateCache) {
            return {
                restrict: 'E',
               // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/tenderDetailesTop.html',
                template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderDetailesTop.html'),
                scope: {
                    detailes: '=',
                    project: '=',
                    statusDescription: '=',
                    getTenderProcedureType: '&',
                    clarify: '=',
                    forceCheckSignClick: '&'
                },
                controller: [
                    '$scope',
                    '$localStorage',
                    'abp.services.etender.tender',
                    'abp.services.etender.emailNotification',
                    '$location',
                    '$timeout',
                    'siteSettingsService',
                    'abp.services.etender.userTender',
                    'requestService',
                    'abp.services.etender.youControl',
                    function(
                        $scope,
                        $localStorage,
                        tenderAppService,
                        emailNotification,
                        $location,
                        $timeout,
                        siteSettingsService,
                        userTender,
                        requestService,
                        youControl)
                    {
                        $scope.ng_localStorage = $localStorage;
                        $scope.forceCheckSign = null;
                        $scope.englishMethodTypes =
                            ['aboveThresholdUA.defense', 'simple.defense', 'aboveThresholdEU', 'competitiveDialogueEU'];

                        var awardCriteriaDictionary = [
                            {
                                title: 'За вартістю придбання',
                                value: 'lowestCost'
                            },
                            {
                                title: 'За вартістю життєвого циклу',
                                value: 'lifeCycleCost'
                            },
                            {
                                title: 'За показником ефективності енергосервісного договору',
                                value: 'ratedCriteria'
                            }
                        ];

                        $scope.getAwardCriteriaLabel = function (awardCriteria) {
                            return awardCriteriaDictionary.find(function (param) {
                                return param.value === awardCriteria
                            })
                        }

                        $scope.getHistory = function () {
                            var user = userTender.getAssignmentHistory($scope.detailes.id)
                            user.then(function (reponse) {
                                console.log('AssignmentHistory ', reponse.data)
                                var string = '';
                                var i = 0;
                                var leng = reponse.data.length;
                                for (i; i < leng; i++) {
                                    var user = reponse.data[i];
                                    string = string + '<tr><td class="pr10">' + user.creatorUserFullName + '</td><td class="pr10"><span class="userAction">' + user.action + '</span></td><td class="pr10">' + user.userFullName + '</td><td><span class="creationTime">' + moment(user.creationTime).format('DD.MM.YYYY') + '</span></td></tr>';

                                }
                                var footerBlock = '<i class="fa fa-times-circle hide-popover" aria-hidden="true"></i>';
                                var assignmentHistory = '<table>' + string + '</table>' + footerBlock;
                                $("#divisionHistory").popover({
                                    title: 'Історія призначення:',
                                    content: assignmentHistory,
                                    html: true
                                }); 
                                $(document).on("click", ".hide-popover", function () {
                                    $(this).parents(".popover").popover('hide');
                                });
                                $('body').on('hidden.bs.popover', function (e) {
                                    $(e.target).data("bs.popover").inState = { click: false, hover: false, focus: false }
                                });
                            });
                        }

                        // add remove to Favorite
                        $scope.toggleFavourite = function(event) {
                            if (!$localStorage.isAuthorized) {
                                abp.notify.info('Спочатку авторизуйтесь');
                                return;
                            }
                            var tenderId = $scope.detailes.id;
                            if ($scope.detailes.isFavorite) {
                                tenderAppService
                                    .deleteFavorite({ tenderId: tenderId })
                                    .then(function(reponse) {
                                        if (reponse.data) {
                                            $scope.detailes.isFavorite = !reponse.data;
                                            abp.notify.info('Видалено з обраного');
                                        }
                                    });
                            } else {
                                tenderAppService
                                    .createFavorite({ tenderId: tenderId })
                                    .then(function(reponse) {
                                        if (reponse.data) {
                                            abp.notify.success('Додано до обраного');
                                            $scope.detailes.isFavorite = reponse.data;
                                        }
                                    });
                            }
                        };


                        // set block possition 
                        $scope.initBlocks = function() {
                            $timeout(function() {
                                    var leftBlockHeight = angular.element(".left-top-block")[0].offsetHeight;
                                    var rightBlockHeight = angular.element(".right-top-block")[0].offsetHeight;
                                    if (leftBlockHeight > rightBlockHeight || rightBlockHeight - leftBlockHeight < 50) {
                                        $scope.secondBlock = true;
                                    } else {
                                        $scope.firstBlock = true;
                                    }
                                },
                                500);
                        }


                        // get Bank Guarantee
                        $scope.getBankGuarantee = {};
                        $scope.getBankGuaranteeF = function(amount) {
                            $scope.getBankGuarantee = {};
                            if ($scope.ng_localStorage.userTenantId) {
                                $scope.getBankGuarantee.amount = amount;
                                $scope.getBankGuarantee.organizationName = $scope.ng_localStorage.organizationName;
                                $scope.getBankGuarantee.EDRPOUcode = $scope.ng_localStorage.EDRPOUcode;
                                $scope.getBankGuarantee.organizationContactName =
                                    $scope.ng_localStorage.userNameDisplay;
                                $scope.getBankGuarantee.organizationContactTelephone = $scope.ng_localStorage.userPhone;
                                $scope.getBankGuarantee.organizationContactEmail = $scope.ng_localStorage.emailAddress;
                            }
                            $scope.showModalBankGuarantee = true;
                            $timeout(function() {
                                    $('#getBankGuarantee').modal('show');
                                },
                                1000);

                        };
                        $scope.sendFunction = function() {
                            //$localStorage.getBankGuarantee = $scope.getBankGuarantee;
                            var email = {};
                            email.title = 'Отримати банківську гарантію';
                            email.message = (
                                'Назва організації: ' +
                                    $scope.getBankGuarantee.organizationName +
                                    '<br>' +
                                    'Код ЄДРПОУ: ' +
                                    $scope.getBankGuarantee.EDRPOUcode +
                                    '<br>' +
                                    'Контактна особа: ' +
                                    $scope.getBankGuarantee.organizationContactName +
                                    '<br>' +
                                    'Контактний телефон: ' +
                                    $scope.getBankGuarantee.organizationContactTelephone +
                                    '<br>' +
                                    'E-mail: ' +
                                    $scope.getBankGuarantee.organizationContactEmail +
                                    '<br>' +
                                    ($scope.getBankGuarantee.comment && $scope.getBankGuarantee.comment !== ''
                                        ? 'Коментар: ' + $scope.getBankGuarantee.comment + '<br>'
                                        : '') +
                                    '<br>' +
                                    'На суму: ' +
                                    $scope.getBankGuarantee.amount +
                                    ' UAH'
                            );
                            var getMessage = emailNotification.sendEmailToSupport(email);
                            getMessage.then(function(data) {
                                abp.notify.success('Дякуємо, повідомлення надіслано!');
                                $scope.getBankGuarantee = {};
                            });
                        };

                        // createInvoice PDF
                        $scope.createInvoice = function(cost) {
                            $scope.$emit('createInvoice', cost);
                        }

                        $scope.forceCheckSignClick = function() {
                            $scope.forceCheckSign = true;
                        }

                        $scope.searchByEDRPOU = function(edrpou) {
                            if (!edrpou) return;
                            $localStorage.searchPage = null;
                            $location.path('edrpouSearch/' + edrpou);
                        }

                        $scope.searchOnYouControl = function (edrpou) {
                            abp.ui.setBusy();
                            youControl.getYouControlLink(edrpou)
                                .then(function (response) {
                                    window.open(response.data, "_blank");
                                })
                                .finally(function () { abp.ui.clearBusy();});
                        }

                        $scope.getGuarantee = function(detailes) {
                            if (!detailes) {
                                $timeout(function() {
                                        $scope.getGuarantee(detailes);
                                    },
                                    1000);
                                return;
                            }
                            if (detailes.lots.length === 1 &&
                                detailes.lots[0].guarantee &&
                                detailes.lots[0].guarantee.amount)
                                return detailes.lots[0].guarantee.amount;
                            if (detailes.lots.length > 1) {
                                var guaranteeSum = 0;
                                detailes.lots.forEach(function(lot, i, arr) {
                                    if (lot.guarantee && lot.guarantee.amount)
                                        guaranteeSum += lot.guarantee.amount;
                                });
                                if (guaranteeSum > 0)
                                    return guaranteeSum;
                            }
                            return false;
                        }

                        $scope.titleEnDisplay = function(procurementMethodType) {
                            switch (procurementMethodType) {
                            case ('aboveThresholdEU'):
                                return true;
                            case ('competitiveDialogueEU'):
                                return true;
                            case ('competitiveDialogueEU.stage2'):
                                return true;
                            case ('aboveThresholdUA.defense'):
                                return true;
                            case ('simple.defense'):
                                return true;
                            case ('esco'):
                                return true;
                            case ('closeFrameworkAgreementUA'):
                                return true;
                            default:
                                return false;
                            }
                        }

                        $scope.translateReason = function(reason) {
                            switch (reason) {
                            case ('agreements[0] status is not active'):
                                return 'Рамкову угоду виконано або розірвано.';
                            case ('agreements[0] items is not subset of tender items'):
                                return 'Позиції в даному запрошенні на відбір не зазначені в рамковій угоді.';
                            case ('agreements[0].period.startDate is > tender.date'):
                                return 'Початок строку дії рамкової угоди ще не настав.';
                            case ('agreements[0] has pending change'):
                                return 'В рамковій угоді є непідтверджена зміна.';
                            case ('agreement[0] not found in agreements'):
                                return 'Рамкової угоди не існує.';
                            default:
                                return getOtherTranslate(reason);
                            }
                        }

                        function getOtherTranslate(reason) {
                            var data;
                            if (reason.indexOf('agreements[0] ends less than') !== -1 &&
                                reason.indexOf('days') !== -1) {
                                data = cutNumber('agreements[0] ends less than ', ' days', reason);;
                                return 'Строк дії рамкової угоди спливе через ' + data + ' днів.';
                            } else if (reason.indexOf('agreements[0] has less than') !== -1 &&
                                reason.indexOf('active contracts') !== -1) {
                                data = cutNumber('agreements[0] has less than ', ' active contracts', reason);
                                return 'Кількість учасників рамкової угоди ' +
                                    data +
                                    ' недостатня для проведення відбору.';
                            } else if (reason.indexOf('doesnt match') !== -1) {
                                return 'Код ЄДРПОУ замовника, що публікує запрошення на відбір, відрізняється від коду, що визначено рамковою угодою.';
                            } else if (reason) {
                                return reason;
                            }
                            return '';
                        }

                        function cutNumber(firstText, secondText, reason) {
                            var data = reason.replace(firstText, '');
                            data = data.replace(secondText, '');
                            return data;
                        }
                        
                        $scope.selectText = function (containerid) {
                            siteSettingsService.selectText(containerid);
                        }

                        $scope.goToDeliveryCost = function () {
                            dataLayer.push({
                                'event': 'virtualPageView',
                                'virtualPageURL': '/deliveryRequest',
                                'virtualPageTitle': 'deliveryRequest'
                            });
                            window.open(
                                'https://docs.google.com/forms/d/e/1FAIpQLScmTpumKkbXkX2dLiu6etCE3i7GEojFKEfAJaHWkkiuhiKkRA/viewform',
                                '_blank');
                        }

                        $scope.showBadgeIfSimple = $scope.detailes.isSimpleProcurementMethodRationale;
                        $scope.showBadgeIfCatalogue = $scope.detailes.procurementMethodRationale && $scope.detailes.procurementMethodRationale.match(/(catalogue)/);
                        $scope.showBadge = $scope.showBadgeIfSimple || $scope.showBadgeIfCatalogue;

                        $scope.portalProzorroUrl = abp.setting.values.ProzorroGovUrl;

                        $scope.showCity = function (city) {
                            if (city) {
                                return city.indexOf('м. Київ') !== -1 
                                        || city.indexOf('м. Киев') !== -1 
                                        || city.indexOf('Севастополь') !== -1;
                            }
                        }
                    }
                ]
            };
        }
    ]);
//    .run(['$templateCache', '$http', '$localStorage', function ($templateCache, $http, $localStorage) {
//    if (!$localStorage.html_tenderDetailesTop)
//        $http.get('/App/Main/base/directives/tender/tenderDetailes/tenderDetailesTop.html').then(
//            function (response) {
//                $templateCache.put('tenderDetailesTop', response.data);
//                $localStorage.html_tenderDetailesTop = response.data;
//            });
//    else if (!$templateCache.get('tenderDetailesTop')) $templateCache.put('tenderDetailesTop', $localStorage.html_tenderDetailesTop);
//}]);;
angular.module('app').directive('tenderPeriodInfo', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/tenderPeriodInfo.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderPeriodInfo.html'),
        scope: {
            tender: '='
        },
        controller: ['$scope', '$rootScope', '$timeout', function ($scope, $rootScope, $timeout) {
            $scope.regexPattern = $rootScope.regex.wordAnyLanguage;
            var s = new Date();
            $scope.dateToDay = Date.parse(s);
            if ($scope.tender && $scope.tender.tenderPeriod && $scope.tender.tenderPeriod.startDate)
                $scope.tenderPeriodStart = Date.parse($scope.tender.tenderPeriod.startDate);

        }]
    };
}]);;
angular.module('app').directive('tenderQuestions', function() {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/tenderQuestions.html',
        scope: {
            detailes: '=',
            isEdit: '=',
            reload: '&',
            canAsk: '&',
            hasRight: '&',
            reloadComplaints: '&'
        },
        controller: [
            '$scope', 
            '$rootScope',
            'abp.services.etender.tender',
            '$localStorage',
            '$timeout',
            function (
                $scope,
                $rootScope,
                tender, 
                $localStorage,
                $timeout) {
                $scope.ng_localStorage = $localStorage;
                $scope.regexPattern = $rootScope.regex.wordAnyLanguage;

                $scope.goToFormDozorro = function (formId, apiId) {
                    $scope.$emit('showDozorroForm', formId, apiId);
                }

                // 2647
                // TODO: add watch to isEdit
                $scope.addAnswer = function (questionId, answerText) {
                    if (!answerText) return;
                
                    var addAnswer = tender.addAnswer({
                        questionId: questionId,
                        answer: answerText
                    });
                    abp.ui.setBusy(".panel-default:first");

                    addAnswer.then(function (data) {
                        $timeout(function () {
                            $scope.reload();
                             abp.ui.clearBusy(".panel-default");
                            },
                            3000);
                    }, function (data) {
                        abp.ui.clearBusy(".panel-default");
                    });
                };

                $scope.isEnquiries = function() {
                    if ($scope.detailes.status == 'active.enquiries') return true;

                    // TODO: check 'active.enquiries' = 'active.tendering' - 3d
                    if ($scope.detailes.status == 'active.tendering') {
                        if ($scope.detailes.procurementMethodType !== 'belowThreshold') {
                            return true;
                        };
                    }

                    return false;
                };

                // todo duplicated method
                $scope.findLotById = function(lotId) {
                    var findedLot = null;
                    if (lotId) {
                        angular.forEach($scope.detailes.lots, function (lot) {
                            if (lot.id == lotId) {
                                findedLot = lot;
                                return;
                            }
                        });
                    }
                    return findedLot;
                }

                // todo duplicated method
                $scope.findItemById = function(itemId) {
                    var findedItem = null;
                    if (itemId) {
                        angular.forEach($scope.detailes.lots, function (lot) {
                            angular.forEach(lot.items, function (item) {
                                if (item.id == itemId) {
                                    findedItem = item;
                                    return;
                                }
                            });
                        });
                    }
                    return findedItem;
                }

                $scope.getQuestionErrorTooltip = function (question) {
                    var str = "Увага! Виникли помилки експорту вiдповiдi до ЦБД<br/><br/><p>Звернiться до служби пiдтримки майданчику</p>";
                    if (question) {
                        
                        if (question.errorMessage) {
                            str += "<br/><p><b>Текст помилки: </b>" + question.errorMessage.replace(/[`~!@#$%^&*()_|+\-='"<>\{\}\[\]\\\/]/gi, '') + "</p>";
                        }
                        if (question.exportVainAttemptCount) {
                            str += "<p><b>Кiлькiсть спроб експорту до ЦБД: </b>" + question.exportVainAttemptCount + "</p>";
                        }
                       
                    }
                    return str.replace('\'', '');
                }

            }
        ]
    };
});;
angular.module('app').directive('tenderSubjectInfo', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '~/App/Main/base/directives/tender/tenderDetailes/tenderSubjectInfo.cфshtml',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderSubjectInfo.html'),
        scope: {
            lot: '=',
            lIndex: '=',
            subject: '=',
            clarify: '=',
            reload: '=',
            getLotStatusLabelClass: '=',
            getLotStatusUkr: '=',
            isItemsFeatures: '=',
            additionalClassifications: '=',
            addBid: '=',
            //isBid: '=',
            canModifyDocuments: '=',
            openCloseTreeBid: '=',
            openModalCancelTender: '=',
            allowedExtensions: '=',
            getReasonTypeNameById: '=',
            status: '=',
            subscribeCpvCode: '&subscribeCpvCode',
            documentType: '=',
            detailes: '='
        },
        controller: [
            '$rootScope',
            '$scope',
            '$localStorage',
            'treeMoveService',
            'requestService',
            '$timeout',
            'tenderReasonTypeService',
            function (
                $rootScope,
                $scope,
                $localStorage,
                treeMoveService,
                requestService,
                $timeout,
                tenderReasonTypeService
            ) {

                $scope.showTree = false;
                $scope.ng_localStorage = $localStorage;
                var s = new Date();
                $scope.dateToDay = Date.parse(s);
                $scope.regexPattern = $rootScope.regex.wordAnyLanguage;

                setTimeout(function () {
                    $scope.reasonTypes = tenderReasonTypeService.getReasonTypes($scope.subject.isNewCancellationFlow2020, $scope.subject.procurementMethodType);
                }, 0);

                // tree move functions
                $scope.$on('togleAllTree',
                    function () {
                        $timeout(function () {
                            if (!$scope['treeDocs' + $scope.lot.index])
                                $scope.collapseTree($scope.lot.index, 'treeDocs');
                            if (!$scope['treeItems' + $scope.lot.index])
                                $scope.collapseTree($scope.lot.index, 'treeItems');
                            if (!$scope['featuresLot' + $scope.lot.index])
                                $scope.collapseTree($scope.lot.index, 'featuresLot');
                            $timeout(function () {
                                colapseItemFutersAndDocs();
                            }, 1000);
                            abp.ui.clearBusy();
                        }, 1000);
                    });

                if ($scope.subject.lots.length === 1)
                    togleTreeScope(true);
                else togleTreeScope(false);

                function colapseItemFutersAndDocs() {
                    $scope.lot.items.forEach(function (item, i) {
                        var index = $scope.lot.index + '-' + i;
                        var futersId = '#item-futers-' + index;
                        var docsId = '#item-docs-' + index;
                        $scope.colapseShow(futersId);
                        $scope.colapseShow(docsId);
                    });
                    $scope.colapseShow('#profileDropDown');
                    $scope.colapseShow('#profileContactUser');
                }

                function togleTreeScope(data) {
                    $scope['treeDocs' + $scope.lot.index] = data;
                    $scope['treeItems' + $scope.lot.index] = data;
                    $scope['featuresLot' + $scope.lot.index] = data;
                }

                $scope.collapseTree = function (index, idBlock) {
                    treeMoveService.collapseTree(idBlock, index, $scope);
                }

                $scope.showTreeBlock = function (index, idBlock) {
                    return treeMoveService.showTreeBlock(index, $scope, idBlock);
                }

                $scope.colapseShow = function (id) {
                    jQuery(id).collapse("show");
                }
                $scope.colapseHide = function (id) {
                    jQuery(id).collapse("hide");
                }
                // tree move functions END

                $scope.isAllAwardsUnsuccessful = function (lot) {
                    if (!lot.awards) return false;

                    return !lot.awards.some(function (award) {
                        return award.status !== "unsuccessful";
                    });
                }

                $scope.getRelatedBuyer = function (apiId) {
                    return $scope.detailes.buyers.find(function (buyer) {
                        return buyer.apiId === apiId;
                    });
                }

                $scope.checkIfLotHasRelatedBuyer = function (items) {
                    var hasRelatedBuyer = false;

                    items.forEach(function (item) {
                        if (item.relatedBuyer) {
                            hasRelatedBuyer = true;
                        }
                    });

                    return hasRelatedBuyer;
                }

                // date whith 99999 miliseconds to normal date
                $scope.getDate = function (date) {
                    return Date.parse(date);
                }

                $scope.postUserSubscriptionByConcreteCpvCode = function (id) {
                    requestService.postUserSubscriptionByConcreteCpvCode(id)
                };

                $scope.showCity = function (city) {
                    if (city) {
                        return city.indexOf('м. Київ') !== -1 
                                || city.indexOf('м. Киев') !== -1 
                                || city.indexOf('Севастополь') !== -1;
                    }
                };

            }]
    };
}]);
;
angular.module('app').directive('transactions', function () {
    return {
        restrict: 'E',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/transactions.html',
        scope: {
            transactions: '=',
            lotId: '='
        },
        controller: ['$scope', function ($scope) {
            $scope.transationsToShow = {};
            $scope.transactionDocumentsToShow = new Array($scope.transactions.length);

            $scope.transactionDocumentsToShow = $scope.transactionDocumentsToShow.fill(false, 0, $scope.transactions.length);
            
            $scope.getDateTimezone = function (date) {
                if (date.indexOf('+') !== -1) {
                    var dateAndTimeZone = date.split('+');
                    return '+' + dateAndTimeZone[1].replace(':', '');
                } else {
                    return '';
                }
            }
        }]
    };
});
;
angular.module('app').directive('addLotBidDocument', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/addLotBidDocument.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/addLotBidDocument.html'),
        scope: {
            tender: '=',
            bid: '=',
            lot: '=',
            addNewDocToBid: '=',
            allowedExtensions: '=',
            isLotActive: '=',
            parentIndex: '=',
            filesCounter: '=',
            isEsco: '=',
            doctype: '=',
            isDisabled: '='
        },
        controller: [
            '$q',
            '$timeout',
            '$scope',
            '$localStorage',
            'loadTypesAndConfident',
            'abp.services.etender.bidDocument',
            'siteSettingsService',
            'bidHelperService',
            '$rootScope',
            'documentsService',
            'addFeaturesService',
            function (
                $q,
                $timeout,
                $scope,
                $localStorage,
                loadTypesAndConfident,
                bidDocument,
                siteSettingsService,
                bidHelper,
                $rootScope,
                documentsService,
                addFeaturesService) {

                $scope.ng_localStorage = $localStorage;
                $scope.draftDocs = [];
                $scope.canUploadDoc = true;
                $scope.selectedConfidentialityItems = {};

                $scope.draftDocument = abp.setting.get("UploadBidDocumentDraftByDefault") === 'True';
                
                $scope.toggleCheck = function () {
                    $scope.draftDocument = !$scope.draftDocument;
                }

                $scope.newDocToBid = null;
                $scope.newDocToBidFields = null;

                loadTypesAndConfident.getDocumentTypesForAll().then(function () {
                    var data = loadTypesAndConfident.getData($scope.tender, $scope.lot);
                    if ($scope.tender.procurementMethodType === 'priceQuotation') {
                        $scope.documentTypesForDropDown = data.documentTypesForDropDown.filter(function (docType) {
                            return docType.type === 'technicalSpecifications';
                        });
                        $scope.bid.docType = $scope.documentTypesForDropDown[0];
                    } else {
                        $scope.documentTypesForDropDown = data.documentTypesForDropDown.filter(function (docType) {
                            return docType.type !== 'contractGuarantees';
                        });
                    }
                    $scope.confidentialityTypes = data.confidentialityTypes;
                    if (!$scope.confidentialityTypes || !$scope.confidentialityTypes.length) {
                        $scope.confidentialityTypes = [
                            {
                                title: $rootScope.source('PublicDocument'),
                                value: 'public',
                                valueType: 'publicType'
                            }];
                    }
                    if ($scope.tender.procurementMethodType !== 'priceQuotation' && $scope.confidentialityTypes.length) {
                        $scope.selectedConfidentialityItems[$scope.bid.id] = $scope.confidentialityTypes[0];
                        $scope.bid.confidentiality = $scope.selectedConfidentialityItems[$scope.bid.id];
                    }
                });
                var warningMsngShowen = false;
                $scope.newDocUploaded = function () {
                    $scope.needToSkipComplaints = true;
                    abp.notify.success("Файл (файли) додано!");
                    if (!$scope.bid.isDraft && !warningMsngShowen) {
                        warningMsngShowen = true;
                        abp.notify.warn('Час синхронізації файлів на ЦБД може зайняти до 20 хвилин.', 'Увага!');
                    }
                    window.onbeforeunload = null;
                };

                $scope.openMassFeedDocuments = function () {
                    if (!$scope.showMassFeedDocuments) {
                        $scope.showMassFeedDocuments = true;
                        $timeout(function () {
                            jQuery("#collapse-add-docs.bid").collapse('toggle');
                        }, 500);
                    } else {
                        jQuery("#collapse-add-docs.bid").collapse('toggle');
                    }
                };
                $scope.showMassFeedDocuments = true;

                $scope.$on('uploadHasInvalidFile', function (evt, message, file) {
                    toastr.error(message + ' ' + file.name,
                        'Увага!',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
                    $scope.fileHasError = true;
                    $scope.$emit('reloadTender', true);
                });

                $scope.$on('exportDraftChanges', function (event, documentObj) {
                    $scope.canUploadDoc = documentObj.isValid;
                    $scope.draftDocs = documentObj.docs;
                });

                $scope.$on('bidReloadFinish', function () {
                    if ($scope.bid) {
                        $scope.selectedConfidentialityItems[$scope.bid.id] = $scope.confidentialityTypes[0];
                        $scope.bid.confidentiality = $scope.selectedConfidentialityItems[$scope.bid.id];
                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            $scope.bid.docType = $scope.documentTypesForDropDown[0];
                        }
                    }
                });

                $scope.onConfidentialityChange = function () {
                     $scope.bid.confidentiality = $scope.selectedConfidentialityItems[$scope.bid.id];
                };

                $scope.onConfidentialityChange = function () {
                     $scope.bid.confidentiality = $scope.selectedConfidentialityItems[$scope.bid.id];
                };

                $scope.uploadNewDocToBid = function () {
                    var bid = $scope.bid;
                    var confidentiality = bid.confidentiality;
                    var lot = $scope.lot;

                    if (confidentiality && confidentiality.valueType != 'buyerOnlyType') {
                        bid.confidentialityRationale = null;
                    }

                    var defer = $q.defer();
                    // check internet connection
                    siteSettingsService.isInternetConnection().then(function () {
                        $scope.sendRequestToAddDoc(defer, bid, lot, confidentiality);
                    }, function () {
                            abp.notify.error("Немає з'єднання з інтернетом, завантаження неможливе");
                            defer.reject();
                    });
                    return defer.promise;
                }

                $scope.sendRequestToAddDoc = function (defer, bid, lot, confidentiality) {
                    var draftDocs = documentsService.getDraftDocs(lot, bid);

                    if (bid.id && draftDocs && draftDocs.length) {
                        bidDocument.editNotExportBidDocuments(draftDocs).then(function () {
                            $scope.createOrUpdateBidDraft(defer, bid, lot, confidentiality);
                        });
                    } else {
                        $scope.createOrUpdateBidDraft(defer, bid, lot, confidentiality);
                    }
                    
                }

                $scope.createOrUpdateBidDraft = function (defer, bid, lot, confidentiality) {
                    bidHelper.createOrUpdateBidDraft(bid, lot, $scope.isEsco, $scope.tender, bid.choosedProduct).then(function (data) {
                        if (data) {
                            angular.extend(bid, data);
                            bidHelper.setBidFromDraft(bid, lot, 'docMethod');
                        }
                        var obj = {
                            tenderId: $scope.tender.id,
                            bidId: bid.id,
                            documentId: "",
                            confidentiality: confidentiality && confidentiality.value,
                            confidentialityRationale: bid.confidentialityRationale,
                            type: bid.docType && bid.docType.id ? bid.docType.id : null,
                            isDescriptionDecision: bidHelper.setDescriptionDecision(bid)
                        };

                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            delete obj.confidentiality;
                            delete obj.confidentialityRationale;
                        }

                        $scope.newDocToBidFields = { myObj: obj, notExport: true }
                        //$scope.$emit('reloadTender', true);
                        defer.resolve();
                    }, function () { defer.reject(); });
                };

                $scope.canAddDoc = function (bid) {
                    if ($scope.tender.bidSetting.bidDocument.isShowConfidentialityBuyerOnly) {
                        if (!bid.confidentiality ||
                            bid.confidentiality.valueType === 'buyerOnlyType' &&
                            (!bid.confidentialityRationale || bid.confidentialityRationale.length < 30))
                            return false;
                    }

                    if ($scope.tender.procurementMethodType == 'aboveThresholdEU') {
                        if (!bid.confidentiality) return false;
                        if (bid.confidentiality.value == 'buyerOnly' && !bid.confidentialityRationale) return false;
                    }

                    if ($scope.tender.procurementMethodType === 'priceQuotation') {
                        if (!bid.docType) return false;
                    }

                    if (!bid.id) {
                        if ($scope.tender.procurementMethodType !== 'competitiveDialogueUA'
                            && $scope.tender.procurementMethodType !== 'competitiveDialogueEU'
                            && $scope.lot.features && $scope.lot.features.length
                            && addFeaturesService.checkFeaturesNotFilled($scope.lot.features, bid.features)) {
                            return false;
                        }
                        if ($scope.tender.procurementMethodType !== 'competitiveDialogueUA'
                            && $scope.tender.procurementMethodType !== 'competitiveDialogueEU'
                            && $scope.lot.featuresTender && $scope.lot.featuresTender.length
                            && addFeaturesService.checkFeaturesNotFilled($scope.lot.featuresTender, bid.features)) {
                            return false;
                        }
                    }

                    return true;
                };

                $scope.getNotExportDocIds = function (lot) {
                    var notExportIds = [];
                    lot.bids.forEach(function (bid) {
                        bid.documents.forEach(function (document) {
                            if (document.notExport && !document.isDeleted) {
                                notExportIds.push(document.id);
                            }
                        });
                    });
                    return notExportIds;
                };

                $scope.showExportButton = function () {
                    if ($scope.getNotExportDocIds($scope.lot).length) {
                        return true;
                    } else {
                        return false;
                    }
                };

                $scope.exportDraftDocuments = function (lot) {
                    if (lot.bids) {
                        var notExportIds = $scope.getNotExportDocIds(lot);
                        if (notExportIds.length) {
                            bidDocument.sendNotExportBidDocuments(notExportIds).then(function () {
                                if ($scope.reload) {
                                    $scope.reload();
                                }
                                $scope.$emit('reloadTender', true);
                                abp.notify.success('Документи експортовані');
                            });
                        }
                    }
                };
            }
        ]
    };
}]);
;
angular.module('app').directive('changeDocument', function() {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/changeDocument.html',
        scope: {
            document: '=',
            allowedExtensions: '=',
            documentsToUpdate: '='
        },
        controller: [
            '$scope',
            function (
                $scope) {


            }
        ]
    };
});;
angular.module('app').directive('editDocumentsWrapper', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('editDocumentsWrapper from cache'),
        scope: {
            tenderDetailes: '=?',
            tenderId: '=',
            documents: '=?',
            isEdit: '='
        },
        controller: [
            '$scope', '$timeout', '$location', '$stateParams', 'abp.services.etender.getTender', 'getTenderService', 'goToTenderService',
            function ($scope, $timeout, $location, $stateParams, getTender, getTenderService, goToTenderService) {
                var queryParams = $location.search();

                $scope.vm = {};
                $scope.isUpdateExportButtonDisabled = false;
                $scope.isFirstLoad = true;
                $scope.tId = null;
                $scope.getTenderCounter = 0;
                $scope.skipSign = queryParams && queryParams.noSign;

                $scope.updateTenderStatus = function () {
                    abp.ui.setBusy('#update-export-status');
                    $scope.isUpdateExportButtonDisabled = true;
                    getTenderInfoRequest($scope.tenderId, false);

                    $timeout(function () {
                        abp.ui.clearBusy('#update-export-status');
                        $scope.isUpdateExportButtonDisabled = false;
                    }, 5000);
                };

                $scope.canModifyDocuments = function () {
                    if (!$scope.detailes || $scope.detailes.procurementMethodType === 'closeFrameworkAgreementSelectionUA') return false;

                    if ($scope.detailes.status == 'active.enquiries' && $scope.detailes.isEnquiryPeriod) return true;

                    // TODO: check 'active.enquiries' = 'active.tendering' - 3d
                    if ($scope.detailes.status == 'active.tendering') {
                        return $scope.detailes.isAbove;
                    }

                    if ($scope.detailes.status == 'active') {
                        if ($scope.detailes.procurementMethod == 'limited'
                            && $scope.detailes.lots[0].awards && $scope.detailes.lots[0].awards.length == 0) {
                            return true;
                        }
                    }

                    //для чернетки тендера
                    if ($scope.detailes.status === '' && !$scope.detailes.isExported) return true;

                    return false;
                };

                $scope.getTenderBefore = function () {
                    $scope.documentsToAdd = null;
                    abp.ui.setBusy();
                    $(".hide-move-efect").fadeOut();
                };

                $scope.$on('onAddDocumentsTabSubmit', function () {
                    if (($scope.detailes.procurementMethodType === 'belowThreshold' && !$scope.detailes.isSimpleProcurementMethodRationale)
                        || $scope.skipSign) {
                        goToTenderService.redirect($scope.dataToRedirect, $scope.tId);
                    } else {
                        if (!$scope.detailes.apiId) {
                            getTenderInfoRequest($scope.detailes.id, true);
                        } else {
                            $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                        }
                    }
                });

                $scope.$on('onPersonSignDataErrorModalOpen', function () {
                    $timeout(function () {
                        $('#personSignDataErrorModal').modal('show');
                    }, 1000);
                });

                function getTenderInfoRequestWithSign(tenderId) {
                    if ($scope.getTenderCounter <= 5) {
                        $timeout(function () {
                            getTenderInfoRequest(tenderId, true);
                        }, 1000);
                    } else {
                        $scope.getTenderCounter = 0;
                        abp.notify.error('Сталася помилка при публікації закупівлі.');
                    }
                }

                function getTenderInfoRequest(tenderId, needToSign) {
                    abp.ui.setBusy();
                    getTender.getTender({ "Id": tenderId }).then(function (response) {
                        $scope.isFirstLoad = false;
                        getTenderService.getTenderThen(response.data, $scope, true);
                        $scope.documents = response.data.documents;
                        $scope.tenderDetailes = $scope.detailes;
                        $scope.dataToRedirect = response.data;
                        $scope.tId = $scope.detailes.id;
                        if (needToSign) {
                            if (!$scope.detailes.apiId) {
                                $scope.getTenderCounter++;
                                getTenderInfoRequestWithSign($scope.detailes.id);
                            } else {
                                $scope.getTenderCounter = 0;
                                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                            }
                        }
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                }

                $scope.reload = function () {
                    if ($scope.isFirstLoad) {
                        abp.ui.setBusy();
                        $timeout(function () {
                            getTenderInfoRequest($scope.tenderId);
                        }, 1000);
                    } else {
                        getTenderInfoRequest($scope.tenderId);
                    }
                };

                function getTenderDataIfNoDataPresented() {
                    if (!$scope.tenderDetailes
                        && $location.url().indexOf('CreateTenderCriteria') === -1
                        && $location.url().indexOf('updateTender') === -1) {
                        $scope.reload();
                    } else {
                        if ($scope.tenderDetailes) {
                            getTenderService.getTenderThen($scope.tenderDetailes, $scope, true);
                            $scope.tenderDetailes = $scope.detailes;
                        }
                    }
                };

                $scope.$on('reloadTender', function () {
                    $scope.reload();
                });

                $scope.$on('onUpdateTenderFinished', function () {
                    getTenderDataIfNoDataPresented();
                });

                $scope.$watch('tenderDetailes', function () {
                    getTenderDataIfNoDataPresented();
                });

                $scope.showSignModal = function (isAllDocumentsExported) {
                    $scope.$emit('needToSignTenderFromCriterias', $scope.detailes);
                    if (!isAllDocumentsExported) {
                        abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                        return;
                    }
                    $timeout(function () {
                        $('#modalSignNewTender').modal('toggle');
                    }, 1000);
                };

                $scope.$on('tenderSigned', function () {
                    $('#modalSignTender').modal('hide');
                    $('body').removeClass('modal-open');
                    $('.modal-backdrop').remove();
                    goToTenderService.redirect($scope.dataToRedirect, $scope.tId);
                });
            }
        ]
    };
}]);
;
(function () {
    'use strict';

    angular
        .module('app')
        .directive('itemDocuments', itemDocuments);

    itemDocuments.$inject = ['baseDocumentsDirective', 'documentsService', 'Upload', '$timeout'];
    function itemDocuments(baseDocumentsDirective, documentsService, Upload, $timeout) {
        return angular.extend({}, baseDocumentsDirective[0], {
            templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/itemDocuments.html',
            link: function ($scope) {

                $scope.fileUploadObj = { tenderId: "", documentId: "", itemid: "" };

                // todo костыль для робот теста
                $scope.setFile = function (element) {
                    //$scope.$apply(function ($scope) {
                    $scope.files = [];
                    $scope.files.push(element.files[0]);
                    //$scope.files = arr;
                    //});
                };

                $scope.isDocModify = function () {
                    var result = $scope.isEdit && (!$scope.lot.isFake
                        || $scope.status === ""
                        || $scope.lot.isFake && $scope.tender.procurementMethodType === 'belowThreshold' && $scope.tender.status === 'active.enquiries'
                        || $scope.lot.isFake && $scope.tender.status === 'active.tendering' &&
                        ($scope.tender.procurementMethodType === 'aboveThresholdUA'
                            || $scope.tender.procurementMethodType === 'aboveThresholdEU'
                            || $scope.tender.procurementMethodType === 'aboveThresholdUA.defense'
                            || $scope.tender.procurementMethodType === 'simple.defense'
                            || $scope.tender.procurementMethodType === 'competitiveDialogueUA'
                            || $scope.tender.procurementMethodType === 'competitiveDialogueEU'));
                    return result;
                };

            
                $scope.uploadUsing$upload = function (file, listOfFiles, selectedDocTypeId) {

                    if (documentsService.validateDocName(file.name) == 0) return;

                    file.upload = Upload.upload({
                        url: abp.appPath + 'api/Files/Upload',
                        method: 'POST',
                        fields: { myObj: $scope.fileUploadObj, "DocumentType": selectedDocTypeId, itemId: $scope.itemid },
                        file: file
                    });

                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                        });
                    }, function (response) {
                        if (response.status > 0)
                            $scope.errorMsg = response.status + ': ' + response.data;
                    });

                    file.upload.progress(function (evt) {
                        // Math.min is to fix IE which reports 200% sometimes
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });

                    file.upload.success(function () {
                        $scope.uploadFilesSuccess(listOfFiles);

                    }).error(function (data) {
                        abp.notify.error(data.exceptionMessage || data.message);
                        $scope.reload();
                    });

                    file.upload.xhr(function (xhr) {
                        // xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
                    });
                }

            }
        });
    }
})();;
angular.module('app').directive('lotAndPositionsDocuments', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('lotAndPositionsDocuments from cache'),
        scope: {
            detailes: '=',
            reload: '&'
        },
        controller: [
            '$scope',
            '$timeout',
            'treeMoveService',
            'lookupService',
            function ($scope, $timeout, treeMoveService, lookupService) {
                $scope.isEdit = true;
                $scope.showDocsInItem = function (id, item) {
                    if (!item.showDocsInItems) {
                        item.showDocsInItems = true;
                        $timeout(function() {
                                $(id).collapse('show');
                            },
                            500);
                    } else {
                        $(id).collapse('hide');
                        $timeout(function () {
                                item.showDocsInItems = false;
                            },
                            500);
                    }
                };

                $scope.showTreeBlock = function (index, idBlock) {
                    return treeMoveService.showTreeBlock(index, $scope, idBlock);
                };

                $scope.collapseTree = function (index, idBlock) {
                    treeMoveService.collapseTree(idBlock, index, $scope);
                };

                $scope.getLotStatusUkr = function (s) {
                    return lookupService.getLotStatusUkr(s);
                };

                $scope.includePoints = function (title) {
                    if (title && title.length > 30) {
                        return '...';
                    }
                };

                $scope.additionalClassifications = function (items) {
                    var length = items.length;
                    for (var i = 0; i < length; i++) {
                        if (items[i].additionalClassifications.length > 0) {
                            return true;
                        }
                    }
                    return false;
                }

                $scope.canModifyDocuments = function () {
                    if (!$scope.detailes ||
                        !$scope.detailes.isEdit ||
                        $scope.detailes.isEdit && $scope.detailes.procurementMethodType === 'closeFrameworkAgreementSelectionUA') return false;

                    if ($scope.detailes.status == 'active.enquiries' && $scope.detailes.isEnquiryPeriod) return true;

                    // TODO: check 'active.enquiries' = 'active.tendering' - 3d
                    if ($scope.detailes.status == 'active.tendering') {
                        return $scope.detailes.isAbove;
                    }

                    if ($scope.detailes.status == 'active') {
                        if ($scope.detailes.procurementMethod == 'limited'
                            && $scope.detailes.lots[0].awards && $scope.detailes.lots[0].awards.length == 0) {
                            return true;
                        }
                    }

                    //для чернетки тендера
                    if ($scope.detailes.status === '' && !$scope.detailes.isExported) return true;

                    return false;
                };

                $scope.colapseShow = function (id) {
                    jQuery(id).collapse("show");
                };

                $scope.colapseHide = function (id) {
                    jQuery(id).collapse("hide");
                };

                $scope.getDate = function (date) {
                    return Date.parse(date);
                };
            }
        ]
    };
}]);

;
angular.module('app').directive('lotBidDocuments', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('lotBidDocuments from cache'),
        scope: {
            tender: '=',
            documents: '=',
            bid: '=',
            updateFiles: '=',
            dateToDay: '=',
            allowedExtensions: '=',
            changeDoc: '=',
            removeDoc: '=',
            removeAllDocs: '=',
            uploadFile: '=',
            isLotActive: '=',
            updateDoc: '=',
            isEdit: '=',
            lot: '='
        },
        controller: [
            '$scope',
            '$http',
            '$timeout',
            '$rootScope',
            '$localStorage',
            'documentsService',
            'abp.services.etender.bidDocument',
            'abp.services.etender.getTender',
            'bidHelperService',
            '$filter',
            'ngTableParams',
            'lotBidDocumentTableService',
            'loadTypesAndConfident',
            function (
                $scope,
                $http,
                $timeout,
                $rootScope,
                $localStorage,
                documentsService,
                bidDocument,
                getTender,
                bidHelper,
                $filter,
                ngTableParams,
                lotBidDocumentTableService,
                loadTypesAndConfident
            ) {
                $scope.ng_localStorage = $localStorage;
                $scope.data = [];
                $scope.filteredDocs = [];
                $scope.bidHelper = bidHelper;
                $scope.isReasonFinished = true;
                $scope.isWaterMarkButtonDisabled = false;
                $scope.needToCheckDocs = false;
                $scope.documents = documentsService.sortListOfDocs($scope.documents);
                $scope.lotBidDocumentTableService = lotBidDocumentTableService;
                $scope.confidentialityOptionsForDocs = [];
                $scope.showReason = {};
                $scope.draftConfidentiality = {};
                $scope.selectedCheckboxItems = {};
                $scope.selectedDocuments = [];
                $scope.vm = {
                    checkAllItems: false
                };
                $scope.myDocs = [];
                $scope.waterMarkErrorText = '';
                $scope.textForUploadDocs = 
                    ($scope.tender.tenderCriteria && $scope.tender.tenderCriteria.length) &&
                    ($scope.tender.procurementMethodType == 'aboveThresholdUA' ||
                    $scope.tender.procurementMethodType == 'aboveThresholdEU' ||
                    $scope.tender.procurementMethodType == 'competitiveDialogueUA' ||
                    $scope.tender.procurementMethodType == 'competitiveDialogueEU' ||
                    $scope.tender.procurementMethodType == 'competitiveDialogueUA.stage2' ||
                    $scope.tender.procurementMethodType == 'competitiveDialogueEU.stage2' ||
                    $scope.tender.procurementMethodType == 'esco' ||
                    $scope.tender.procurementMethodType == 'closeFrameworkAgreementUA') ?
                        'Документи, що мають бути додані до відповідей на критерії завантажуйте до типу "Документи, що підтверджують відповідність"' :
                        'Не забудьте експортувати документи до пропозиції!';

                $scope.docsTable = new ngTableParams({
                    page: 1,
                    count: 10,
                    sorting: { title: 'asc' },
                }, {
                    total: $scope.filteredDocs && $scope.filteredDocs.length ? $scope.filteredDocs.length : 0,
                    getData: function ($defer, params) {
                        if ($scope.filteredDocs && $scope.filteredDocs.length) {
                            $scope.data = $scope.filteredDocs;
                            $scope.data = sortDraftsinViewMode($scope.data);
                            $scope.data = $scope.data.slice((params.page() - 1) * params.count(), params.page() * params.count());
                            if ($scope.confidentialityTypes && $scope.confidentialityTypes.length) {
                                fillConfidentialityOptionsOrSetReasons();
                            }
                            params.total($scope.filteredDocs.length);
                        } else {
                            $scope.data = [];
                            params.total(0);
                        }
                        $scope.selectedCheckboxItems = {};
                        $scope.selectedDocuments = [];
                        if ($scope.needToCheckDocs) {
                            $scope.onAllDocumentSelected();
                        }
                        $defer.resolve($scope.data);
                    }

                });

                $scope.removeAllDraftDocs = function () {
                    var draftDocs = $scope.documents.filter(function (doc) {
                        return doc.notExport;
                    });
                    $scope.$emit('removeAllDocs', draftDocs);
                };

                $scope.docsTable.settings().$scope = $scope;

                function fillConfidentialityOptionsOrSetReasons() {
                        $scope.confidentialityOptionsForDocs = [];
                        $scope.data.forEach(function (doc) {
                            if (!doc.isExported) {
                                if (doc.confidentiality === 'buyerOnly') {
                                    if (!doc.confidentialityRationale) {
                                        $scope.confidentialityOptionsForDocs.push(findConfidentialityOption('decisionDescriptionType'));
                                        $scope.showReason[doc.id] = false;
                                    } else {
                                        $scope.confidentialityOptionsForDocs.push(findConfidentialityOption('buyerOnlyType'));
                                        $scope.showReason[doc.id] = true;
                                        $scope.draftConfidentiality[doc.id] = doc.confidentialityRationale;
                                    }
                                } else {
                                    $scope.confidentialityOptionsForDocs.push(findConfidentialityOption('publicType'));
                                }
                            } else {
                                if (doc.confidentiality === 'buyerOnly') {
                                    $scope.showReason[doc.id] = false;
                                }
                            }

                        });
                }

                function findConfidentialityOption(valueType) {
                    return $scope.confidentialityTypes.find(function (type) {
                        return type.valueType === valueType;
                    });
                    
                }

                $scope.checkIfChangedDocumentIsSigned = function (data) {
                    var changedDocId = data.id;
                    getTender.getTender({ "Id": $scope.tender.id }).then(function (response) {
                        var selectedLotIndex = response.data.lots.findIndex(function (responseLot) {
                            return responseLot.id === $scope.lot.id;
                        });

                        var selectedBidIndex = response.data.lots[selectedLotIndex].bids.findIndex(function (responseBid) {
                            return responseBid.id === $scope.bid.id;
                        });

                        var responseDocuments = response.data.lots[selectedLotIndex].bids[selectedBidIndex].documents;
                        var documentSign = responseDocuments.find(function (document) {
                            return document.description === $scope.changedDocument.id;
                        });
                        $scope.documents = responseDocuments;

                        if (documentSign) {
                            var docToSign = responseDocuments.find(function (document) {
                                return document.id === changedDocId;
                            });
                            $localStorage['documentToSign'] = [docToSign];
                            $('#modalSignChangeDoc').modal('show');
                        }

                    }, function (error) {
                        console.log(error);
                    });
                }

                $scope.setDocumentChange = function (document) {
                    $scope.changedDocument = document;
                }

                $scope.signDocument = function (bid) {
                    $scope.myDocs = angular.copy($localStorage['documentToSign']);
                    delete $localStorage['documentToSign'];
                    $('#modalSignChangeDoc').modal('toggle');
                    $scope.$emit('onSignDocsEvent', bid);
                    $scope.$emit('onDocsSignSelectEvent', $scope.myDocs);
                }

                function sortDraftsinViewMode(docsArr) {
                    var draftDocsArr = [];
                    var activeDocsArr = [];

                    docsArr.forEach(function (doc) {
                        if (doc.isDeleted && doc.notExport) {
                            return false;
                        }
                        doc.notExport ? draftDocsArr.push(doc) : activeDocsArr.push(doc);
                    });

                    return draftDocsArr.concat(activeDocsArr)
                }


                $scope.$watch('documents', function (data) {
                    $scope.updateDocs(true);
                });

                $scope.$on('reloadDocumentsTable', function (event, docs, bidId) {
                    if ($scope.bid.id === bidId) {
                        $scope.documents = docs;
                        $scope.updateDocs(true);
                    }
                });

                $scope.onAllDocumentSelected = function () {
                    $scope.data.forEach(function (document) {
                        if (!$scope.checkDocumentIsSignedOrChanged(document)) {
                            $scope.selectedCheckboxItems[document.id] = $scope.vm.checkAllItems;
                        }
                    });

                    $scope.selectedDocuments = $scope.getSelectedDocuments();
                };

                $scope.onSelectDocumentChange = function () {
                    $scope.selectedDocuments = $scope.getSelectedDocuments();
                };

                $scope.getSelectedDocuments = function () {
                    var selectedDocuments = [];

                    for (var key in $scope.selectedCheckboxItems) {
                        if ($scope.selectedCheckboxItems[key]) {
                            selectedDocuments.push(key);
                        }
                    }

                    return selectedDocuments;
                };

                $scope.signDocs = function (bid, lot) {
                    $scope.myDocs = [];
                    $scope.$emit('onSignDocsEvent', bid);

                    var draftDocs = $scope.getDraftDocs();
                    if (draftDocs && draftDocs.length) {
                        bidDocument.editNotExportBidDocuments(draftDocs).then(function () {
                            getTender.getTender({ "Id": $scope.tender.id }).then(function (response) {
                                var selectedLotIndex = response.data.lots.findIndex(function (responseLot) {
                                    return responseLot.id === lot.id;
                                });

                                var selectedBidIndex = response.data.lots[selectedLotIndex].bids.findIndex(function (responseBid) {
                                    return responseBid.id === bid.id;
                                });

                                $scope.documents = response.data.lots[selectedLotIndex].bids[selectedBidIndex].documents;
                                $scope.getDocsFromSelectedIds();
                                $scope.$emit('onDocsSignSelectEvent', $scope.myDocs);
                            }, function (error) {
                                console.log(error);
                            });

                        });
                    } else {
                        $scope.getDocsFromSelectedIds();
                        $scope.$emit('onDocsSignSelectEvent', $scope.myDocs);
                    }
                };

                $scope.getDocsFromSelectedIds = function () {
                    $scope.myDocs = [];
                    $scope.selectedDocuments.forEach(function (docId) {
                        var selectedDoc = $scope.documents.find(function (document) {
                            return document.id === docId;
                        });

                        if (selectedDoc) {
                            $scope.myDocs.push(selectedDoc);
                        }
                    });
                }

                $scope.setWaterMark = function (lotId) {
                    var buttonId = '#waterMarks_' + lotId;
                    var url = '/api/services/etender/Watermark/AddWatermark';

                    $scope.isWaterMarkButtonDisabled = true;
                    abp.ui.setBusy();
                    abp.ui.setBusy(buttonId);

                    $http({
                        method: 'POST',
                        url: url,
                        data: { FilesIds: $scope.getSelectedDocuments() }
                    }).then(function (response) {

                        var failedGeneral = [];
                        var faliedCorrupted = [];
                        var corruptedErrorMessage = "The file may be corrupted.";
                        $scope.waterMarkErrorText = '';

                        response.data.result.forEach(function (result){
                            if(result.succeeded){

                                var changeNameDocument = documentsService.getDocumentById($scope.filteredDocs, result.oldId);
                                changeNameDocument.title = result.newName;
                                changeNameDocument.id = result.newId;
                                changeNameDocument.url = changeNameDocument.url.replace(result.oldId, result.newId);
                                delete $scope.selectedCheckboxItems[result.oldId];
                            } else{

                                if(result.errorMessage.includes(corruptedErrorMessage)){
                                    faliedCorrupted.push(result);
                                } else {
                                    failedGeneral.push(result);
                                }                                
                            }
                        });

                        $scope.vm.checkAllItems = false;
                        $scope.waterMarkErrorText = $scope.getWaterMarkErrorText(failedGeneral, faliedCorrupted);

                    }).finally(function () {
                        abp.ui.clearBusy();
                    });

                    $timeout(function () {
                        $scope.isWaterMarkButtonDisabled = false;
                        abp.ui.clearBusy(buttonId);
                    }, 5000);
                };

                $scope.updateDocs = function (needRefresh) {
                    $scope.removeDeletedDocsFromTableAndSortDraft(needRefresh);
                    $scope.isPagerNeeded = $scope.filteredDocs && $scope.filteredDocs.length && $scope.filteredDocs.length > 10;
                }

                $scope.removeDeletedDocsFromTableAndSortDraft = function (needRefresh) {
                    $scope.filteredDocs = $scope.documents;
                    if (needRefresh) {
                        $scope.docsTable.reload();
                    }
                }

                $scope.getDraftDocs = function () {
                    return $scope.documents.filter(function (document) {
                        return !document.isExported;
                    });
                };

                $scope.checkIfDocsHasDrafts = function () {
                    var hasDraftDocs = $scope.documents.find(function (doc) {
                        return doc.notExport;
                    });
                    if (hasDraftDocs) return true;
                    var allDocsIsExported = $scope.documents.filter(function (doc) {
                        return doc.isExported;
                    });
                    if (allDocsIsExported.length === $scope.documents.length) return allDocsIsExported;

                    return $scope.documents.filter(function (document) {
                        return !document.isExported && !document.notExport;
                    });
                }

                $scope.updateDocs(false);

                $scope.countDocsOnLastPagePagin = function (value) {
                    var summ = value.toString();
                    if (summ.slice(-1) === '0') return '10';
                    return summ.slice(-1);
                };

                $scope.getActiveDocs = function (bid) {
                    return bid.documents && bid.documents.filter(function (doc) {
                        return !doc.isDeleted;
                    });
                }

                $scope.getPagesAmount = function (bid) {
                    if ($scope.getActiveDocs(bid)) {
                        var length = $scope.getActiveDocs(bid).length;
                        return lotBidDocumentTableService.getPagesAmount($scope.docsTable, length);
                    }
                        
                }

                $scope.isLastPageDisabled = function (bid) {
                    if ($scope.getActiveDocs(bid)) {
                        var length = $scope.getActiveDocs(bid).length;
                        return lotBidDocumentTableService.isLastPageDisabled($scope.docsTable, length);                        
                    }
                }

                $scope.getDocsAmount = function (bid) {
                    if ($scope.getActiveDocs(bid)) {
                        return $scope.getActiveDocs(bid).length;
                    }
                }

                $scope.switchExpandTable = function (needExpand, needToCheckDocs) {
                    $scope.needToCheckDocs = needToCheckDocs;
                    needExpand
                        ? $scope.lotBidDocumentTableService.expandTable($scope.docsTable, $scope.filteredDocs.length)
                        : $scope.lotBidDocumentTableService.collapseTable($scope.docsTable);
                    $scope.isPagerNeeded = !needExpand;
                    $scope.isExpanded = needExpand;
                };

                $scope.checkTenderPostAuctionStatus = function (tender, bid) {

                    if (!tender || !tender.lots)
                        return false;

                    if (tender.isBelowThreshold) {
                        var isPendingAwardPresent = false;
                        for (l in tender.lots) {
                            if (tender.lots[l].awards) {
                                for (a in tender.lots[l].awards) {
                                    var awardItem = tender.lots[l].awards[a];

                                    if (bid.isMyBid && awardItem.bidId === bid.id && awardItem.status === 'pending') {
                                        //return true;
                                        isPendingAwardPresent = true;
                                    }

                                }
                            }
                        }
                        return isPendingAwardPresent;                        
                    }
 
                    if (tender.status === 'active.qualification' || tender.status === 'active.awarded' || tender.status === 'active.qualification.stand-still') {
                        for (l in tender.lots) {
                            if (tender.lots[l].awards) {
                                for (a in tender.lots[l].awards) {
                                    var awardItem = tender.lots[l].awards[a];
                                    if (bid.isMyBid && awardItem.bidId === bid.id &&
                                        (awardItem.status === 'active' || awardItem.status === 'pending') &&
                                        (awardItem.contracts && awardItem.contracts.length > 0 && awardItem.contracts[0].status === 0 || !awardItem.contracts || awardItem.contracts && awardItem.contracts.length === 0)) {
                                        return true;
                                    }
                                }
                            }
                        }
                        return false;
                    }
                    return false;
                };

                $scope.loadDropdownOptionsIfNeeded = function (lot) {
                    var index = $scope.documents.findIndex(function (doc) {
                        return !doc.isExported;
                    });
                    if (index !== -1) {
                        loadTypesAndConfident.getDocumentTypesForAll().then(function () {
                            var data = loadTypesAndConfident.getData($scope.tender, lot);
                            if ($scope.tender.procurementMethodType === 'priceQuotation') {
                                $scope.documentTypesForDropDown = data.documentTypesForDropDown.filter(function (docType) {
                                    return docType.type === 'technicalSpecifications';
                                });
                            } else {
                                $scope.documentTypesForDropDown = data.documentTypesForDropDown.filter(function (docType) {
                                    return docType.type !== 'contractGuarantees';
                                });
                            }
                            $scope.confidentialityTypes = data.confidentialityTypes;
                            if (!$scope.confidentialityTypes || !$scope.confidentialityTypes.length) {
                                $scope.confidentialityTypes = [
                                    {
                                        title: $rootScope.source('PublicDocument'),
                                        value: 'public',
                                        valueType: 'publicType'
                                    }];
                            }
                        });
                    }
                }

                $scope.$watch('lot', function (lot) {
                    $scope.loadDropdownOptionsIfNeeded(lot);
                });

                $scope.canChangeDoc = function (tender, doc, bid) {
                    if (doc.title.endsWith('.p7s')) {
                        return false;
                    }
                    if (doc.title !== 'sign.p7s') {
                        if (tender.status === 'active.tendering' && !doc.notExport) {
                            return true;
                        } else if (tender.status === 'active.pre-qualification') {
                            if (bid.isMyBid && bid.status !== 'invalid') {
                                if (bid.canLoadFilesFor24hMilestone) {
                                    if (doc && doc.documentType) {
                                        if (doc.documentType.type === 'commercialProposal' || doc.documentType.type === 'billOfQuantity') {
                                            return false;
                                        }
                                        if (doc.confidentiality === 'buyerOnly' && !doc.confidentialityRationale
                                            && (tender.procurementMethodType === 'competitiveDialogueEU' || tender.procurementMethodType === 'competitiveDialogueUA')) {
                                            return false;
                                        }
                                        return true;
                                    }
                                }
                            }
                        } 
                        else if (tender.status === 'active.qualification') {
                            if (bid.isMyBid && bid.status !== 'invalid') {
                                if (bid.canLoadFilesForAlpMilestone && $scope.checkStatuses(tender, doc, bid)) {
                                    if (doc && doc.documentType && doc.documentType.type === 'evidence') {
                                        return true;
                                    } else if (bid.canLoadFilesFor24hMilestone) {
                                        return true;
                                    }
                                }
                                if (bid.canLoadFilesFor24hMilestone || bid.canLoadFiles) {
                                    if (doc && doc.documentType && doc.documentType.type !== 'evidence') {
                                        return $scope.checkStatuses(tender, doc, bid);
                                    }
                                }
                                return false;
                            }
                        }
                        else if (tender.status === 'active.awarded' || tender.status === 'active.qualification.stand-still') {
                            if (doc && doc.documentType && doc.documentType.type !== 'evidence') return $scope.checkStatuses(tender, doc, bid);
                        }
                    }
                    return false;
                };

                $scope.checkDocumentIsSignedOrChanged = function (document) {
                    return document.title.indexOf('.p7s') !== -1
                        || checkIfDocumentHasIdDescriptionInOtherDocs(document)
                        || $scope.isDocumentChanged(document);
                };

                function checkIfDocumentHasIdDescriptionInOtherDocs (document) {
                    return $scope.documents.find(function (doc) {
                        return doc.description === document.id;
                    });
                };

                $scope.isDocumentChanged = function (document) {
                    return documentsService.isDocumentChanged(document, $scope.documents);
                };

                $scope.exportDraftDocs = function (bid) {
                    $scope.$emit('exportDraftDocuments', bid)
                };

                $scope.getDocConfidentiality = function (doc) {
                    if (doc.confidentiality) {
                        return doc.confidentiality;
                    } else {
                        if ($scope.tender.procurementMethodType === 'priceQuotation') {
                            return null;
                        } else {
                            return 'public';
                        }
                    }
                }

                $scope.areSelectedDocumentsFilledCorrectly = function () {
                    var isFilledCorrectly = true;
                    $scope.getDocsFromSelectedIds();

                    $scope.myDocs.forEach(function (document) {
                        if (document.confidentiality === 'buyerOnly' && $scope.showReason[document.id] === true) {
                            if (!document.confidentialityRationale || document.confidentialityRationale.length < 30) {
                                isFilledCorrectly = false;
                            }
                        }
                    });

                    return isFilledCorrectly;
                }

                $scope.isShowColumn = function (tender, documents) {
                    for (var i = 0; i < documents.length; i++) {
                        if ($scope.canChangeDoc(tender, bid.documents[i], $scope.bid)) {
                            return true;
                        }
                    }
                }

                $scope.switchReasonView = function (id) {
                    $scope.showReason[id] = !$scope.showReason[id];
                } 

                $scope.isPostAuction = function (document, tender) {
                    if (!tender.awardPeriod || !tender.awardPeriod.startDate) {
                        return false
                    }

                    if (document.datePublished > tender.awardPeriod.startDate) {
                        return true;
                    } else {
                        return false;
                    }
                };

                $scope.checkIfConfidentialityRationaleFilled = function () {
                    var isFilled = true;
                    $scope.filteredDocs.forEach(function (doc) {
                        if (doc.confidentiality === 'buyerOnly' && $scope.showReason[doc.id] === true) {
                            if (!doc.confidentialityRationale || doc.confidentialityRationale.length < 30) {
                                isFilled = false;
                            }
                        }
                    });

                    return isFilled;
                }

                $scope.isDocTypeFilledForPQ = function () {
                    if ($scope.tender.procurementMethodType === 'priceQuotation') {
                        var isFilled = true;
                        $scope.filteredDocs.forEach(function (doc) {
                            if (!doc.documentType) {
                                isFilled = false;
                            }
                        });

                        return isFilled;
                    } else {
                        return true;
                    }
                }

                $scope.changeDocumentType = function (doc) {
                    $rootScope.$broadcast('exportDraftChanges', { isValid: $scope.checkIfConfidentialityRationaleFilled() && $scope.isDocTypeFilledForPQ(), docs: $scope.filteredDocs, isDocumentChanged: true });
                }

                $scope.changeDocumentConfidentiality = function (doc, index) {
                    doc.confidentiality = $scope.confidentialityOptionsForDocs[index].value;
                    if ($scope.confidentialityOptionsForDocs[index].valueType === 'decisionDescriptionType') {
                        $scope.showReason[doc.id] = false;
                        doc.confidentialityRationale = null;
                    } else if ($scope.confidentialityOptionsForDocs[index].valueType === 'buyerOnlyType') {
                        $scope.showReason[doc.id] = true;
                        doc.confidentialityRationale = $scope.draftConfidentiality[doc.id];
                    } else {
                        doc.confidentialityRationale = null;
                    }
                    $rootScope.$broadcast('exportDraftChanges', { isValid: $scope.checkIfConfidentialityRationaleFilled() && $scope.isDocTypeFilledForPQ(), docs: $scope.filteredDocs, isDocumentChanged: true });

                }

                $scope.changeDocumentConfidentialityRationale = function (doc) {
                    $scope.draftConfidentiality[doc.id] = doc.confidentialityRationale;
                    $rootScope.$broadcast('exportDraftChanges', { isValid: $scope.checkIfConfidentialityRationaleFilled() && $scope.isDocTypeFilledForPQ(), docs: $scope.filteredDocs, isDocumentChanged: true });
                }

                $scope.checkDocValidity = function () {
                    return $scope.checkIfConfidentialityRationaleFilled() && $scope.isDocTypeFilledForPQ();
                }

                $scope.checkStatuses = function (tender, document, bid) {
                    if ($scope.isPostAuction(document, tender) && $scope.checkTenderPostAuctionStatus(tender, bid)) {
                        return true;
                    }

                    return false;
                };

                $scope.previewDoc = function (document) {
                    $rootScope.$broadcast('previewDoc', document);
                };

                $scope.renameDoc = function (document) {
                    bidDocument.renameNotExportBidDocuments(document).then(function () {
                        document.isRename = false;
                        if ($scope.reload) {
                            $scope.reload();
                        }
                    });
                };

                $scope.showRenameDoc = function (document) {
                    document._oldTitle = document.title;
                    document.isRename = true;
                };

                $scope.cancelRenameDoc = function (document) {
                    document.title = document._oldTitle;
                    document.isRename = false;
                };

                $scope.getWaterMarkErrorText = function (failedGeneral, faliedCorrupted) {
                    
                    var result = "";
                    var amountOfDocuments = failedGeneral.length + faliedCorrupted.length;
                    
                    if(amountOfDocuments === 0){
                        return "";
                    } else if (amountOfDocuments === 1) {                        
                        result = 'Помилка накладання водяного знаку на документ ';
                    } else {
                        result = 'Помилка накладання водяного знаку на документи ';
                    }
                    
                    failedGeneral.forEach(function (document, index) {

                        result += document.oldName;
                        if (index !== failedGeneral.length - 1) {
                            result += ', ';
                        }
                    });

                    if(failedGeneral.length === 1){
                        result += '. Формат цього файлу не підтримується.';
                    } else if (failedGeneral.length > 1){
                        result += '. Формати цих файлів не підтримуються.';
                    }

                    if(faliedCorrupted.length > 0){

                        result += '\r\n';
                        faliedCorrupted.forEach(function (document, index) {

                            result += document.oldName;
                            if (index !== faliedCorrupted.length - 1) {
                                result += ', ';
                            }
                        });

                        result += faliedCorrupted.length === 1 ? " - Файл пошкоджений." : " - Файли пошкоджені.";
                    }
                    
                    return result;
                };

                $scope.$watch('filteredDocs', function (docs) {
                    $rootScope.$broadcast('exportDraftChanges', { isValid: $scope.checkIfConfidentialityRationaleFilled() && $scope.isDocTypeFilledForPQ(), docs: docs, isDocumentChanged: false });
                });

                $rootScope.$broadcast('exportDraftChanges', { isValid: true, docs: $scope.filteredDocs, isDocumentChanged: false });
            }
        ]
    };
}]);
;
(function () {
    'use strict';

    angular
        .module('app')
        .directive('lotDocuments', lotDocuments);

    lotDocuments.$inject = ['baseDocumentsDirective', 'documentsService', 'Upload', '$timeout', '$templateCache'];
    function lotDocuments(baseDocumentsDirective, documentsService, Upload, $timeout, $templateCache) {
        return angular.extend({}, baseDocumentsDirective[0], {
            template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/lotDocuments.html'),
            link: function ($scope) {

                $scope.fileUploadObj = { tenderId: "", documentId: "", lotId: "" };

                $scope.uploadUsing$upload = function (file, listOfFiles, selectedDocTypeId) {

                    if (documentsService.validateDocName(file.name) == 0) return;

                    file.upload = Upload.upload({
                        url: abp.appPath + 'api/Files/Upload',
                        method: 'POST',
                        fields: { myObj: $scope.fileUploadObj, "DocumentType": selectedDocTypeId, lotId: $scope.lotid },
                        file: file
                    });

                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                        });
                    }, function (response) {
                        if (response.status > 0)
                            $scope.errorMsg = response.status + ': ' + response.data;
                    });

                    file.upload.progress(function (evt) {
                        // Math.min is to fix IE which reports 200% sometimes
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });

                    file.upload.success(function () {
                        $scope.uploadFilesSuccess(listOfFiles);

                    }).error(function (data) {
                        abp.notify.error(data.exceptionMessage || data.message);
                        $scope.reload();
                    });

                    file.upload.xhr(function (xhr) {
                        // xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
                    });
                }

            }
        });
    }
})();;
angular.module('app').directive('massFeedDocuments', function () {
    return {
        restrict: 'AE',
        require: 'lotBids',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/massFeedDocuments.html',
        scope: {
            tender: '=',
            lot: '=',
            bid: '=',
            confidentialityForm: '=',
            allowedExtensions: '=',
            doctype: '=',
            isMyBidHere: '&',
            reload: '&',
            generateBidsInputs: '=',
            block: '=',
            isUploadToBid: '=?'
        },
        controller: [
            '$scope',
            '$rootScope',
            'abp.services.etender.bid',
            'Upload',
            '$http',
            'documentsService',
            '$localStorage',
            '$timeout',
            'loadTypesAndConfident',
            'uploadFileService',
            'bidHelperService',
            'uploadFileService',
            function (
                $scope,
                $rootScope,
                bidService,
                Upload,
                $http,
                documentsService,
                $localStorage,
                $timeout,
                loadTypesAndConfident,
                uploadFileService,
                bidHelper,
                uploadFileService
            ) {

                $scope.ng_localStorage = $localStorage;
                $scope.regexFloatNumber = $rootScope.regex.floatNumber;
                $scope.regexNumber = $rootScope.regex.number;
                $scope.filesCounter = 0;
                $scope.addDocsToAllLots = false;
                $scope.oldDataOfLots = {};

                $scope.vm = {
                    selfEligible: false,
                    selfQualified: false,
                    esco: {
                        annualCostsReduction: (new Array(21)).fill(0),
                        contractDurationDays: 0
                    }
                };

                //приховуємо тендери зі стасусом cancelled
                $scope.filterByStatus = function (lots) {
                    var result = {};
                    angular.forEach(lots,
                        function (value, key) {
                            if (value.status !== 'cancelled')
                                result[key] = value;
                        });
                    return result;
                };

                loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                    var data = loadTypesAndConfident.getData($scope.tender);
                    var contractGuaranteeIndex = data.documentTypesForDropDown.findIndex(function (element) {
                        return element.type === 'contractGuarantees';
                    });
                    if (contractGuaranteeIndex !== -1) {
                        data.documentTypesForDropDown.splice(contractGuaranteeIndex, 1);
                        $scope.documentTypesForDropDown = data.documentTypesForDropDown;
                    } else {
                        $scope.documentTypesForDropDown = data.documentTypesForDropDown;
                    }
                    $scope.confidentialityTypes = data.confidentialityTypes;
                    if ($scope.isUploadToBid && $scope.docsToAdd && $scope.docsToAdd.length) {
                        $scope.docsToAdd.forEach(function (doc) {
                            doc.confidentiality = $scope.confidentialityTypes[0];
                            if ($scope.tender && $scope.tender.procurementMethodType === 'competitiveDialogueUA' || $scope.tender.procurementMethodType === 'competitiveDialogueEU') {
                                doc.docType = $scope.documentTypesForDropDown[0];
                            } else {
                                doc.docType = $scope.documentTypesForDropDown[2];
                            }
                        });
                    }
                });


                $scope.massAddDocs = {
                    ids: {}
                };
                $scope.docsToAdd = [];
                $scope.filesToAdd = [];
                $scope.filesChange = function (files) {
                    if (files && files.length) {
                        $scope.docsToAdd = $scope.docsToAdd.concat(files);
                    }
                };

                $scope.allTypesHasSet = function () {
                    if ($scope.docsToAdd) {
                        var i = 0;
                        for (i; i < $scope.docsToAdd.length; i++) {
                            if (!$scope.docsToAdd[i].docType) {
                                return false;
                            }
                        }
                        return true;
                    } return false;
                }

                $scope.allConfidentHasSet = function () {
                    if ($scope.docsToAdd) {
                        var i = 0;
                        for (i; i < $scope.docsToAdd.length; i++) {
                            if (!$scope.docsToAdd[i].confidentiality) {
                                return false;
                            }
                        }
                        return true;
                    } return false;
                }

                $scope.isPercentageCorrect = function () {
                    return !!Number($scope.vm.esco.yearlyPaymentsPercentage) && Number($scope.vm.esco.yearlyPaymentsPercentage) >= 80 && Number($scope.vm.esco.yearlyPaymentsPercentage) <= 100;
                };

                $scope.addDocsToAllLotsFunc = function () {
                    $scope.addDocsToAllLots = !$scope.addDocsToAllLots;
                    if ($scope.addDocsToAllLots) {
                        $scope.oldDataOfLots = angular.copy($scope.tender.lots);
                        var a = 0;
                        for (a; a < $scope.tender.lots.length; a++) {
                            if ($scope.tender.lots[a].reasonsUserCanNotAddBid.length <= 0) {
                                $scope.tender.lots[a].massAddDocs = true;
                            }
                        }
                    } else {
                        $scope.tender.lots = angular.copy($scope.oldDataOfLots);
                    }
                };

                $scope.lotsToAdd = function () {
                    if ($scope.addDocsToAllLots || $scope.lotsToAddDocs().length > 0) {
                        return true;
                    }
                    return false;
                };

                $scope.lotsToAddDocs = function () {
                    var lots = [];
                    var i = 0;
                    for (i; i < $scope.tender.lots.length; i++) {
                        if ($scope.tender.lots[i].massAddDocs)
                            lots.push($scope.tender.lots[i]);
                    }
                    return lots;
                };

                $scope.addNewDocsToBids = function (param, toBid) {
                    var docs = param;
                    $scope.filesCounter = docs.length;
                    if (docs.length == 0) return;
                    abp.ui.setBusy("body");
                    if (toBid === 'uploadToBid') {
                        var lot = $scope.lot;
                        var bid = $scope.bid;
                        if ($scope.tender.procurementMethodType !== 'belowThreshold') {
                            bid.selfQualified = $scope.vm.selfQualified;
                            if (!$scope.tender.isECriteriaArticle17) {
                                bid.selfEligible = $scope.vm.selfEligible;
                            } 
                        }
                        bidHelper.createOrUpdateBidDraft(bid, lot, $scope.tender.isEsco, $scope.tender).then(function (data) {
                            var bids = [];
                            if (data && data.length) bids = data;
                            if (data && !data.length) bids = [data];
                            if (!data && bid) bids = [bid];

                            addDocToBid(docs, bids);
                        });
                    } else {
                        $scope.createOrUpdateBidDraft($scope.lotsToAddDocs()).then(function (data) {
                            var bids = [];
                            if (data) bids = data;
                            addDocToBid(docs, bids);
                        });
                    }
                };

                function addDocToBid(docs, bids) {
                    $scope.allIds = [];
                    $scope.isDraft = true;
                    $scope.isMassFeed = true;
                    var i = 0;
                    for (i; i < bids.length; i++) {
                        $scope.allIds.push(bids[i].id);
                    }
                    addDocument(docs);
                };

                $scope.ifConfidentiality = function (uploadDoc, type) {
                    if (!uploadDoc.confidentiality) return null;
                    if (type === 'confidentiality') return uploadDoc.confidentiality.value;
                    if (type === 'confidentialityRationale') {
                        if (uploadDoc.confidentiality.valueType == 'buyerOnlyType') {
                            return uploadDoc.confidentialityRationale;
                        } else {
                            return null;
                        }
                    }
                };

                function addDocument(files) {
                    // TODO: move to server
                    if ($scope.tender.status == "active.tendering" ||
                        $scope.tender.status == "active.pre-qualification" ||
                        $scope.tender.status == "active.qualification" ||
                        $scope.tender.status == "active.awarded" ||
                        $scope.tender.status == "active.qualification.stand-still") {
                            uploadFileService.upload(files, $scope);
                    } else {
                        abp.notify.error('Статус закупівлі змінився і Ви не можете прикріпити файл!');
                        $scope.reload();
                    }
                }

                $scope.getFeatureOptionsForCreate = bidHelper.getFeatureOptionsForCreate;

                $scope.removeDoc = function (docs, documentIndex) {
                    docs.splice(documentIndex, 1);
                };

                $scope.checkLotsInput = function () {
                    var a = 0;
                    for (a; a < $scope.tender.lots.length; a++) {
                        if (($scope.tender.lots[a].massAddDocs === false || !$scope.tender.lots[a].massAddDocs) && $scope.tender.lots[a].reasonsUserCanNotAddBid.length <= 0) {
                            $scope.addDocsToAllLots = false;
                            return;
                        } else {
                            $scope.addDocsToAllLots = true;
                        }

                    };
                };
                $scope.isConfidentialityShow = function () {
                    var tender = $scope.tender;
                    return tender.isOpenEU ||
                        tender.isDialogue ||
                        tender.isDialogueEU ||
                        tender.procurementMethodType == 'esco' ||
                        tender.procurementMethodType == 'aboveThresholdEU' ||
                        tender.procurementMethodType == 'aboveThresholdUA' ||
                        tender.procurementMethodType == 'aboveThresholdUA.defense' ||
                        tender.procurementMethodType == 'simple.defense' ||
                        tender.procurementMethodType == 'competitiveDialogueUA' ||
                        tender.procurementMethodType == 'competitiveDialogueUA.stage2' ||
                        tender.procurementMethodType == 'competitiveDialogueEU' ||
                        tender.procurementMethodType == 'competitiveDialogueEU.stage2' ||
                        tender.procurementMethodType == 'closeFrameworkAgreementUA';
                };

                $scope.isAllowedToPerformActions = function () {
                    if ($scope.tender.procurementMethodType !== 'belowThreshold') {
                        if ($scope.tender.isECriteriaArticle17) {
                            return $scope.vm.selfQualified;
                        } else {
                            return $scope.vm.selfQualified && $scope.vm.selfEligible;
                        }
                    } else {
                        return true;
                    }
                };

                $scope.isEscoFieldsFilled = function () {
                    if ($scope.tender.isEsco) {
                        if (!$scope.isPercentageCorrect()) {
                            return false;
                        }

                        if (!$scope.vm.esco.contractDurationDays && $scope.vm.esco.contractDurationDays !== 0) {
                            return false;
                        }

                        if (!$scope.vm.esco.contractDurationYears && $scope.vm.esco.contractDurationYears !== 0) {
                            return false;
                        }

                        if ($scope.vm.esco.annualCostsReduction.some(isNaN)) {
                            return false;
                        }
                    }

                    return true;
                };

                $scope.isAnnualCostReductionFilledCorrectly = function (i) {
                    return !isNaN($scope.vm.esco.annualCostsReduction[i]);
                }

                $scope.showModalArticl = function () {
                    $scope.showModalArticle = true;
                    $timeout(function () {
                        $("#modalArticle").modal('show');
                    });
                };

            }]
    };
});
;
angular.module('app').directive('qualificationBidDocs', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/qualificationBidDocs.html',
        scope: {
            value: '=',
            tender: '=',
            lot: '='
        },
        controller: [
            '$scope', '$rootScope', '$localStorage', 'documentsService', 'abp.services.etender.filePath',
            function ($scope, $rootScope, $localStorage, documentsService, filePathService) {
                $scope.ng_localStorage = $localStorage;
                $scope.value = documentsService.sortListOfDocs($scope.value);
                // documents pagination
                $scope.settings = {
                    currentPage: 0,
                    offset: 0,
                    pageLimit: 10,
                    pageLimits: ['10', '50', '100']
                };
                var summ = $scope.value.length.toString();
                $scope.settings.totalOnLast = summ.slice(-1);

                $scope.getBidApiIdForDoc = function (lot, docId) {
                    return $scope.lot.bids.find(function (simpleBid) {
                        return simpleBid.documents.some(function (doc) {
                            return doc.id == docId || doc.apiId == docId;
                        })
                    }).apiId;                    
                }

                $scope.getConfidentialityFileUrl = function (doc) {
                    var bidId = $scope.getBidApiIdForDoc($scope.lot, doc.id);
                    return filePathService.getConfidentialityFileUrl({
                        TenderApiId: $scope.tender.apiId,
                        BidApiId: bidId,
                        DocumentApiId: doc.apiId || doc.id
                    }).then(function (response) {
                        var url = response.data;
                        if (url) {
                            return filePathService.getDownloadUrlForPrivateDoc({ fileUri: url });
                        } else {
                            return response;
                        }
                    });
                }

                $scope.getQualificationBid = function (doc) {
                    var bidId = $scope.getBidApiIdForDoc($scope.lot, doc.id);

                    return $scope.lot.bids.find(function (bid) {
                        return bid.id === bidId;
                    });
                }

                $scope.downlaodPrivateDoc = function (doc) {
                    $scope.getConfidentialityFileUrl(doc).then(function (resp) {
                        window.open(resp.data, '_self');
                    });
                }

                $scope.previewDoc = function (doc) {
                    if (doc.url) {
                        $scope.$emit('previewDoc', doc);
                    } else {
                        $scope.getConfidentialityFileUrl(doc).then(function (response) {
                            doc.url = response.data;
                            $scope.$emit('previewDoc', doc);
                        })
                    }
                }

                $scope.isMyQualification = function (doc) {
                    var bid = $scope.getQualificationBid(doc);
                    return bid && bid.isMyBid;
                }
            }
        ]
    };
});;
angular.module('app').directive('qualificationDocs', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/qualificationDocs.html',
        scope: {
            value: '=',
            yamlFormatDetect: '=',
            detectYamlName: '=',
            yamlInfo: '=',
            printDiv: '=',
            parentIndex: '=',
            lot: '=',
            qualificationId: '='
        },
        controller: [
            '$scope', '$rootScope', '$localStorage', 'documentsService',
            function ($scope, $rootScope, $localStorage, documentsService) {
                $scope.ng_localStorage = $localStorage;
                $scope.value = documentsService.sortListOfDocs($scope.value);
                // documents pagination
                $scope.settings = {
                    currentPage: 0,
                    offset: 0,
                    pageLimit: 10,
                    pageLimits: ['10', '50', '100']
                };
                var summ = $scope.value.length.toString();
                $scope.settings.totalOnLast = summ.slice(-1);
                // documents pagination

                $rootScope.$on('reloadDocumentsTable', function (evt, documents, id) {
                    if ($scope.qualificationId === id) {
                        $scope.value = documents;
                    }
                })
            }
        ]
    };
});;
(function () {
    'use strict';

    angular
        .module('app')
        .directive('tenderDocuments', tenderDocuments);
    tenderDocuments.$inject = ['baseDocumentsDirective', 'documentsService', 'Upload', '$timeout', '$templateCache'];
    function tenderDocuments(baseDocumentsDirective, documentsService, Upload, $timeout, $templateCache) {
        return angular.extend({}, baseDocumentsDirective[0], {
           // templateUrl: '~/App/Main/base/directives/tender/tenderDetailes/documents/tenderDocuments.html',
            template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/tenderDocuments.html'),
            link: function ($scope) {

                $scope.fileUploadObj = { tenderId: "", documentId: "" };

                // todo костыль для робот теста
                $scope.setFile = function (element) {
                    //$scope.$apply(function ($scope) {
                    $scope.files = [];
                    $scope.files.push(element.files[0]);
                    //$scope.files = arr;
                    //});
                };

                $scope.uploadUsing$upload = function (file, listOfFiles, selectedDocTypeId) {

                    if (documentsService.validateDocName(file.name) == 0) return;

                    file.upload = Upload.upload({
                        url: abp.appPath + 'api/Files/Upload',
                        method: 'POST',
                        fields: { myObj: $scope.fileUploadObj, "DocumentType": selectedDocTypeId },
                        file: file
                    });

                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                        });
                    }, function (response) {
                        if (response.status > 0)
                            $scope.errorMsg = response.status + ': ' + response.data;
                    });

                    file.upload.progress(function (evt) {
                        // Math.min is to fix IE which reports 200% sometimes
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });

                    file.upload.success(function () {
                        $scope.uploadFilesSuccess(listOfFiles);
                    }).error(function (data) {
                        abp.notify.error(data.exceptionMessage || data.message);
                        $scope.reload();
                    });

                    file.upload.xhr(function (xhr) {
                        // xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
                    });
                }

                $scope.$on('reloadTender', function () {
                    $scope.reload();
                });


            }
        });
    }
})();;
angular.module('app').directive('baseDocuments', function () {
    return {
        restrict: 'AE',
        scope: {
            tenderid: '=',
            itemid: '=',
            lotid: '=',

            tender: '=',
            lot: '=',
            awardId: '@',
            contractId: '@',
            bidId: '@',
            cancellationId: '@',
            canModifyDocuments: '&',
            documents: '=',
            status: '=',
            type: '=',
            procurementmethodtype: '=',
            doctype: '@',
            isEdit: '=',
            reload: '&',
            documentTypes: '=',
            allowedExtensions: '=',
            tenderEndDate: '=',
            tenderType: '='
        },
        controller: [
            '$scope',
            '$http',
            'loadTypesAndConfident',
            'documentsService',
            '$localStorage',
            'uploadFileService',
            function (
                $scope,
                $http,
                loadTypesAndConfident,
                documentsService,
                $localStorage,
                uploadFileService)
            {
                $scope.ng_localStorage = $localStorage;


                $scope.uploadFilesCounter = 0;
                $scope.filesCounter = 0;
                $scope.selectedDocType = null;
                $scope.isChangeDisabled = false;
                $scope.vm = $scope;
                setDocTypes();

                $scope.init = (function () {
                    $scope.documents2 = $scope.documents;
                })();

                $scope.$watch('documents', function (docs) {

                    if (docs != null) {
                        // check file size
                        for (var i = 0; i < docs.length; i++) {
                            //console.log('inited DOCUMENTS', docs[i]);
                            docs[i]["documentTypeForEditing"] = cloneObject(docs[i].documentType);
                        }
                    }
                });

                function loadTypesForEsco() {
                    if ($scope.procurementmethodtype === "esco" && $scope.ng_localStorage.documentTypes && $scope.documentTypesForDropDown) {
                        $scope.documentTypesForDropDown.map(function (item) {
                            switch (item.type) {
                                case 'technicalSpecifications':
                                    item.title = "Технічний опис предмету закупівлі (опис об`єкту)"; break;
                            }
                            return item;
                        });
                    }
                }

                function setDocTypes() {
                    if ($localStorage.refs.documentTypes && $localStorage.refs.documentTypes.tenderDocuments) {
                        $scope.documentTypesForDropDown = angular.copy($localStorage.refs.documentTypes.tenderDocuments);
                    } else {
                        loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                            $scope.documentTypesForDropDown = documentTypes.tenderDocuments;
                        });
                    }
                }


                function cloneObject(obj) {
                    if (null == obj || "object" != typeof obj) return obj;
                    var copy = obj.constructor();
                    for (var attr in obj) {
                        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
                    }
                    return copy;
                }                

                $scope.docsUpload = function () {
                    $scope.errorMsg = null;
                    $scope.fileUploadObj = { tenderId: $scope.tenderid, documentId: "" };
                    var selectedDocTypeId = $scope.selectedDocType ? $scope.selectedDocType.id : null;
                    $scope.docsFields = { myObj: $scope.fileUploadObj, "DocumentType": selectedDocTypeId, lotId: $scope.lotid, itemId: $scope.itemid, isShowModal: true};
                };
                $scope.docsUploaded = function () {
                    if ($scope.status !== '') {
                        if ($scope.procurementmethodtype === 'belowThreshold') {
                            $scope.$emit('showModalDocNotification', '#modalDocNotificationThreshold');
                        }
                    }
                };

                $scope.uploadFilesSuccess = function (listOfFiles) {
                    //console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                    $scope.filesCounter = $scope.filesCounter - 1;
                    if ($scope.filesCounter === 0) abp.notify.success("Файл (файли) додано!");
                    $scope.uploadFilesCounter++;
                    if ($scope.uploadFilesCounter == listOfFiles.length) {
                        listOfFiles.splice(0, listOfFiles.length);
                        $scope.uploadFilesCounter = 0;
                        if ($scope.status !== '') {
                            if ($scope.procurementmethodtype !== 'belowThreshold') {
                                $scope.$emit('showModalDocNotification', '#modalDocNotification');
                            } else {
                                $scope.$emit('showModalDocNotification', '#modalDocNotificationThreshold');
                            }
                        }
                        $scope.$emit('reloadTender');
                        $scope.reload();

                    }
                    $scope.selectedDocType = null;  
                }

                $scope.dowloadZip = function () {
                    abp.ui.setBusy('.hidden-print dowloadZipBtn');
                    var zipFilename = 'Документи тендера';
                    var docs = $scope.documents;
                    documentsService.downloadZipFile(docs, zipFilename, $scope);
                    var listener = $scope.$on('clearBusy',
                        function () {
                            abp.ui.clearBusy('.hidden-print dowloadZipBtn');
                            listener();
                        });
                }               

                $scope.update = function (files, userSelectedDocType) {
                    var selectedDocTypeId = userSelectedDocType ? userSelectedDocType.id : null;
                    $scope.fileUploadObj.tenderId = $scope.tenderid;
                    if (files != null) {
                        for (var i = 0; i < files.length; i++) {
                            $scope.errorMsg = null;
                            (function (file) {
                                $scope.uploadUsing$upload(file, files, selectedDocTypeId);
                            })(files[i]);
                        }
                    }
                };

                $scope.changeDoc = function (document) {
                    $scope.fileUploadObj.documentId = document.id;
                    _($scope.documents).each(function (doc) {
                        doc.ch = false;
                    });
                    document.ch = true;
                };

                $scope.$on('onUploadStarted', function () {
                    $scope.isChangeDisabled = true;
                });

                $scope.$on('onUploadFinished', function () {
                    $scope.isChangeDisabled = false;
                });

                $scope.clearDoc = function () {
                    $scope.fileUploadObj.documentId = "";
                };

                var deleteDocument = function (input) {
                    if (confirm("Ви дійсно бажаєте видалити документ?")) {
                        var removeDocument = $http.post('.' + abp.appPath + 'api/files/DeleteDocument', input);
                        removeDocument.then(function (data) {
                            //console.log(data);
                            $scope.$emit('reloadTender');
                        });
                    }
                };
                $scope.removeTenderDocument = function (documentId) {
                    var input = { 'TenderDocumentId': documentId };
                    deleteDocument(input);
                };

                validDocPeriod();
                function validDocPeriod() {
                    var period = new Date($scope.tenderEndDate) - new Date();
                    var isTestTenders = !$scope.ng_localStorage.isProdMode;
                    if (((period < 604800000 && !isTestTenders) || (period < 420000 && isTestTenders)) && ($scope.procurementmethodtype == 'aboveThresholdEU' || $scope.procurementmethodtype == 'aboveThresholdUA')) {
                        $scope.validDocPeriod = 'above';
                    } else {
                        if (((period < 172800000 && !isTestTenders) || (period < 120000 && isTestTenders)) && ($scope.procurementmethodtype == 'aboveThresholdUA.defense' || $scope.procurementmethodtype == 'simple.defense'))
                            $scope.validDocPeriod = 'above.defense';
                        else {
                            $scope.validDocPeriod = true;
                        }
                    }
                }
            }]
    };
});
;
angular.module('app').directive('docsTable',
    ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/sharedDocsStructure/docsTable.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/sharedDocsStructure/docsTable.html'),
        scope: {
            vm: '=',
            modifyDocs: '=',
            docAddId: '=',
            documents: '='
        },
        controller: ['$scope', 'documentsService', 'uploadFileService', function ($scope, documentsService, uploadFileService) {

            $scope.value = documentsService.sortListOfDocs($scope.documents);
            
            $scope.update = function (docTypeId) {
                var userSelectedDocType = $scope.document && $scope.document.documentTypeForEditing;
                var selectedDocTypeId = userSelectedDocType ? userSelectedDocType.id : null;

                if (docTypeId) {
                    selectedDocTypeId = docTypeId;
                }
                if ($scope.vm.fileUploadObj.documentType) {
                    selectedDocTypeId = $scope.vm.fileUploadObj.documentType;
                }
                if ($scope.vm.tenderid) {
                    $scope.vm.fileUploadObj.tenderId = $scope.vm.tenderid;
                }

                $scope.vm.documentsToUpdateFields = { myObj: $scope.vm.fileUploadObj, "DocumentType": selectedDocTypeId, lotId: $scope.vm.lotid, itemId: $scope.vm.itemid, isShowModal: true };
            };

            $scope.previewDoc = function (document) {
                $scope.$emit('previewDoc', document);
            };

            $scope.$watch('documents', function () {
                $scope.value = documentsService.sortListOfDocs($scope.documents);
            });

        }
        ]
    };
}]);;
angular.module('app').directive('docsTableAgreement', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/sharedDocsStructure/docsTableAgreement.html',
        scope: {
            vm: '=',
            docs: '=',
            canModift: '='
        },
        controller: ['$scope', function ($scope) {

        }
        ]
    };
});;
angular.module('app').directive('docsTableCancellations', function () {
    return {
        restrict: 'AE',
        templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/sharedDocsStructure/docsTableCancellations.html',
        scope: {
            documents: '='
        },
        controller: ['$scope', function ($scope) {

            $scope.previewDoc = function (document) {
                $scope.$emit('previewDoc', document);
            }

            }
        ]
    };
});;
angular.module('app').directive('docsUpload', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
       // templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/sharedDocsStructure/docsUpload.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/sharedDocsStructure/docsUpload.html'),
        scope: {
            vm: '=',
            docAddId: '='
        },
        controller: ['$scope', function ($scope) {
               // 
            }
        ]
    };
}]);;
(function () {
    'use strict';
    angular.module('app').directive('tenderTable', ['$templateCache', function ($templateCache) {
        return {
            restrict: 'E',
            // templateUrl: '/App/Main/base/directives/tender/tenderTable/tenderTable.html',
            template: $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTable.html'),
            controller: 'tenderTableCtrl',
            scope: {
                mode: '@',
                user: '@'
            }
        };
    }]);
    angular.module('app').controller('tenderTableCtrl', tenderTableCtrl);
    tenderTableCtrl.$inject = [
        '$scope',
        'abp.services.etender.tender',
        'ngTableParams',
        '$timeout',
        '$rootScope',
        'numberOfRecordsIframe',
        'numberOfRecords',
        'lookupService',
        'tenderHelperService',
        'abp.services.etender.reference',
        'abp.services.etender.search',
        '$location',
        '$localStorage',
        '$sessionStorage',
        '$cookies',
        '$http',
        '$window',
        'abp.services.etender.organization',
        '$stateParams',
        'siteSettingsService',
        'classificationSearchService',
        'abp.services.etender.readTender',
        'userDataService',
        'referenceService'
    ];
    function tenderTableCtrl(
        $scope,
        tenderAppService,
        ngTableParams,
        $timeout,
        $rootScope,
        numberOfRecordsIframe,
        numberOfRecords,
        lookupService,
        tenderHelperService,
        abpReferenceService,
        searchService,
        $location,
        $localStorage,
        $sessionStorage,
        $cookies,
        $http,
        $window,
        organization,
        $stateParams,
        siteSettingsService,
        classificationSearchService,
        readTenderAppService,
        userDataService,
        referenceService) {

        $scope.showClearFilterButton = false;
        $scope.ng_localStorage = $localStorage;
        $scope.ng_sessionStorage = $sessionStorage;
        $scope.ng_cookies = $cookies;
        $scope.site = abp.setting.get('ProzorroSiteUrl');
        $scope.tenderTableFilter = {};
        $scope.showModalClassifications = true;
        $scope.maxPageValue = 999999999;
        var simpleProcType = { id: 15, procurementMethod: 'open', procurementMethodType: 'belowThresholdSimple', procurementMethodTypeDescription: 'Спрощена закупівля', procurementMethodTypeLocal: 'Спрощена закупівля', isSimpleProcurementMethodRationale: false };

        $scope.vModel = {};
        var vModel = $scope.vModel;

        var end;
        $scope.end = [];

        // set main page filter catch
        (function () {
            var absUrl = $location.url();
            var saveFilter;
            if (absUrl === '/') { saveFilter = 'saveFilter' + 'MainPage' }
            else if (absUrl === '/toDoTenders') { saveFilter = 'saveFilter' + 'ToDoTenders' }
            else if (absUrl === '/ChoosedTenders') { saveFilter = 'saveFilter' + 'ChoosedTenders' }
            else { return }
            if (!$sessionStorage[saveFilter]) { $sessionStorage[saveFilter] = $scope.tenderTableFilter; }
            else { $scope.tenderTableFilter = $sessionStorage[saveFilter]; }
        })();

        $scope.regexNumber = $rootScope.regex.number;
        $scope.regexDate = $rootScope.regex.date;
        $scope.regexCpv = /^\d{8}\-\d{1}$/;
        $scope.regexQuote = /^[^"]*$/;
        $scope.edrpouFromParams = '';
        $scope.pagerSearchFilter = {};

        $scope.isPM = true; // isProductionMode
        $scope.isMy = $scope.mode === 'my';
        $scope.isShowOnlyTendersCreatedOnOurSite = false;
        $scope.selectedCpvs = {};
        $scope.showDropdown = false;
        $scope.savedObjList = [];
        $scope.searchStringIframe = '';
        $scope.tendersArchive = $rootScope.source('TendersArchive');

        $scope.specialClass = 'prozorroNavigation';

        $scope.filter = {};
        $scope.selectedStatuses = [];
        $scope.selectedLotStatuses = [];
        $scope.selectedBidStatuses = [];
        $scope.selectedProcTypes = [];
        $scope.checkedProcTypes = [];
        $scope.procTypeSearchText = null;
        $scope.temporaryOrgCode = '';
        // regions
        vModel.selectedRegions = [];
        vModel.checkedRegions = [];
        vModel.regionsSearchText = null;

        $scope.checkedStatuses = [];
        $scope.checkedLotStatuses = [];
        $scope.checkedBidStatuses = [];
        $scope.statusSearchText = null;
        $scope.statusSearchLabel = null;
        $scope.selectedCpvs = [];
        $scope.childCpvs = [];
        $scope.selectedOrgCodes = [];
        $scope.isArchive = false;
        $scope.templateToLoad = null;
        $scope.filterfromtemplate = false;
        var archiveChanged = false;

        $scope.localization = {
            tenderTitle: $rootScope.source('TenderTitle'),
            tenderValue: $rootScope.source('TenderValue'),
            searchById: $rootScope.source('SearchByTenderID'),
            title: $rootScope.source('TenderTitle'),
            creationDate: $rootScope.source('CreationDate'),
            status: $rootScope.source('CreationDate'),
            completion: $rootScope.source('completion')
        }

        // ******* date today ******* 
        var s = new Date();
        $scope.dateToDay = Date.parse(s);

        // todo переделать на SignalR - чтобы если юзера подтвердили - он об этом узнал без нажатия F5
        // ******* redirect *******
        $timeout(function () {
            //if ($localStorage.userTenantId === null && $localStorage.username) { $location.path('/createProfile'); }
            if (!abp.session.userId || userDataService.hasUserAndOrganization())
                return;
            
            organization.isCanOrganizationCreate()
                .then(function (response) {
                    if (response.data === true)
                        $location.path('/createProfile');
                },
                    function (error) {
                        $location.path('/createProfile');
                    });
        }, 3);

        $scope.naviragionRightClass = function () {
            return !$localStorage.isAuthorized;
        }

        // ******* is Operator *******
        $scope.isOperator = function isOperator() {
            return ($localStorage.isOperator !== undefined) &&
                $localStorage.isOperator === 'true';
        };

        // ******* is Authorized*******
        $scope.isAuthorized = function () {
            return $localStorage.isAuthorized;
        };

        //****** get procurement Method
        if (!$sessionStorage.procType) {
            $sessionStorage.procType = ['open', 'selective'];
            $scope.procurementMethod = $sessionStorage.procType;
        } else {
            $scope.procurementMethod = $sessionStorage.procType;
        };

        // ******* navigation *******

        $scope.showMenuBlocks = function () {
            if ($window.innerWidth < 425) {
                return true;
            }
            else if (document.querySelector('.mob_top.content')) {
                return true;
            }
            return false;
        }

        $scope.navigation = [
            {
                title: $rootScope.source('CompetitiveProcedures'),
                type: 'open-selective',
                active: !$sessionStorage.isPlansTabOpened && $sessionStorage.procType && angular.equals($sessionStorage.procType, ['open', 'selective']) || false,
                show: true,
                openFunc: function () {
                    $sessionStorage.isPlansTabOpened = false;
                    var savedFilter = {
                        selectedOrgCodes: $scope.selectedOrgCodes,
                        title: $scope.filter.title
                    };
                    $scope.clear(savedFilter);
                    navigationClicked(['open', 'selective']);
                    //if ($window.location.hash === '')
                    //$window.location.href = $window.location.origin + "/?open-selective";
                },
                imgClass: 'ico_konk-g'

            }, {
                title: $rootScope.source('NoncompetitiveProcedures'),
                type: 'limited',
                active: !$sessionStorage.isPlansTabOpened && $sessionStorage.procType && angular.equals($sessionStorage.procType, ['limited']) || false,
                show: true,
                openFunc: function () {
                    $sessionStorage.isPlansTabOpened = false;
                    var savedFilter = {
                        selectedOrgCodes: $scope.selectedOrgCodes,
                        title: $scope.filter.title
                    };
                    $scope.clear(savedFilter);
                    navigationClicked(['limited']);
                    //if ($window.location.hash === '')
                    //$window.location.href = $window.location.origin + "/?limited";
                },
                imgClass: 'ico_nokonk-g'
            }, {
                title: $rootScope.source('ProZorroPlans'),
                type: 'plans',
                active: !!$sessionStorage.isPlansTabOpened,
                show: true,
                openFunc: function () {
                    $scope.clear();
                    $sessionStorage.isPlansTabOpened = true;
                    $scope.switchedBlock = 'plans';
                    //$window.location.href = $window.location.origin + "/?plans";
                },
                imgClass: 'ico_plans-g'
            }, {
                title: $rootScope.source('ElectronicCatalogs'),
                type: 'eCatalog',
                active: false,
                show: !$localStorage.isAuthorized,
                openFunc: function () {
                    $sessionStorage.isPlansTabOpened = false;
                    $scope.clear();
                    abp.ui.setBusy();
                    //$window.location.href = $window.location.origin + "/";
                    //$timeout((function() {
                    //    $location.path('/ProzorroMarket');
                    //}), 500);
                    $location.path('/ProzorroMarket');
                    this.active = false;
                },
                imgClass: 'ico_ecatalog-g'
            }, {
                title: $rootScope.source('ProZorroAnalytics'),
                type: 'proZorroAnalytics',
                active: false,
                show: true,
                openFunc: function () {
                    $window.open('https://bi.prozorro.org/sense/app/fba3f2f2-cf55-40a0-a79f-b74f5ce947c2/sheet/HbXjQep/state/analysis', '_blank');
                    this.active = false;
                },
                imgClass: 'ico_analitic-g'
            }, {
                title: $rootScope.source('TenderWidget'),
                type: 'widget',
                active: false,
                show: $localStorage.isAuthorized,
                openFunc: function () {
                    $sessionStorage.isPlansTabOpened = false;
                    $scope.clear();
                    $scope.switchedBlock = 'widget';
                    //$window.location.href = $window.location.origin + "/?widget";
                }
            }
        ];

        function setNavigation(tab) {
            $scope.switchedBlock = tab;
            $scope.navigation.forEach(function (item, i, arr) {
                if (item.type === tab) item.active = true;
                else item.active = false;
            });
        }

        $scope.generateTableTenders = function () {
            var oldPage = $scope.tableParams.page();
            $scope.tableParams.page(1);
            if (oldPage === 1) {
                $scope.tableParams.reload();
            }
        }

        // ******* navigation END *******

        $scope.clearAllFiltersAndTmpl = function () {
            $('#modalClassifications').removeData('bs.modal')
            $scope.clear();
            $scope.search();
        }

        //***** rial or not rial tenders checkbox *****

        if ($localStorage.isUserNotIdentified == null)
            IsUserNotIdentified();
        else {
            vModel.isUserNotIdentified = $localStorage.isUserNotIdentified;
            vModel.realTestMode = $localStorage.realTestMode;
        }

        function IsUserNotIdentified() {
            if (!$localStorage.isAuthorized || $localStorage.isProdMode === true || $localStorage.userTenantId == null || $localStorage.userTenantId == undefined) {
                vModel.isUserNotIdentified = false;
            }
            else {
                vModel.isUserNotIdentified = $localStorage.isOrganizationApproved == null || $localStorage.isOrganizationApproved == undefined || $localStorage.isOrganizationApproved === false;
            }
            vModel.realTestMode = vModel.isUserNotIdentified;
            $localStorage.isUserNotIdentified = vModel.isUserNotIdentified;
            $localStorage.realTestMode = vModel.isUserNotIdentified;
        }

        vModel.changeRealMode = function () {
            $localStorage.realTestMode = vModel.realTestMode;
            var oldPage = $scope.tableParams.page();
            if (!$scope.doNotNeedToSetPage) {
                $location.search('page', 1);
            }
            $scope.tableParams.page(1);
            if (oldPage === 1) {
                $scope.tableParams.reload();
            }
        };
        //***** rial or not rial tenders checkbox END *****


        $scope.getClearFilterButton = function () {
            if ($scope.pagerSearchFilter.Cpvs && $scope.pagerSearchFilter.Cpvs.length === 0 &&
                !$scope.pagerSearchFilter.CustomerRegion &&
                !$scope.pagerSearchFilter.Dkpp &&
                !$scope.pagerSearchFilter.FunderId &&
                !$scope.pagerSearchFilter.OrganizationName &&
                !$scope.pagerSearchFilter.PriceFrom &&
                !$scope.pagerSearchFilter.PriceTo &&
                angular.equals($scope.pagerSearchFilter.statuses, $scope.statuses) &&
                angular.equals($scope.pagerSearchFilter.ProcurementMethod, $scope.procurementMethod) &&
                !$scope.pagerSearchFilter.Title &&
                !$scope.pagerSearchFilter.codeEDRPOUs &&
                !$scope.pagerSearchFilter.isShowOnlyTendersCreatedOnOurSite &&
                $scope.pagerSearchFilter.parentCodesEDRPOU.length === 0 &&
                $scope.pagerSearchFilter.procurementMethodTypes.length === 0 &&
                $scope.pagerSearchFilter.regions && $scope.pagerSearchFilter.regions.length === 0 &&
                !$scope.pagerSearchFilter.searchTimeType &&
                !$scope.pagerSearchFilter.tenderCreationTimeFrom &&
                !$scope.pagerSearchFilter.tenderCreationTimeTo &&
                !$scope.pagerSearchFilter.tenderPeriodEndFrom &&
                !$scope.pagerSearchFilter.tenderPeriodEndTo &&
                !$scope.pagerSearchFilter.tenderPeriodStartFrom &&
                !$scope.pagerSearchFilter.tenderPeriodStartTo &&
                !$scope.vModel.searchString &&
                !$scope.ifAnyIsDefultTmpltsFltr &&
                !$scope.pagerSearchFilter.myBidsOnly &&
                !$scope.pagerSearchFilter.mainProcurementCategory &&
                !$scope.pagerSearchFilter.milestoneCodeType &&
                !$scope.pagerSearchFilter.isCovid19 &&
                !$scope.pagerSearchFilter.isDirectOrder) {
                $scope.showClearFilterButton = false;
                return;
            }
            $scope.showClearFilterButton = true;
        }

        $scope.isIntervalGood = function (startPrice, endPrice) {
            if (startPrice && endPrice) {
                return startPrice < endPrice;
            } else return true;
        };

        $scope.isDateIntervalGood = function (from, to) {
            if (from != null && typeof (from) === "object")
                from = from.toISOString().substring(0, 24);
            if (to != null && typeof (to) === "object")
                to = to.toISOString().substring(0, 24)
            if (from && to) {
                if (to >= from) return true;
                else return false;
            } else return true;
        };

        $scope.getTenderProcedureType = function (tender) {
            if (!tender) return null;
            return lookupService.getTenderProcedureType(tender.procurementMethodType);
        };

        $scope.isAllDataGood = function () {
            if ($scope.isIntervalGood($scope.filter.priceFrom, $scope.filter.priceTo) &&
                $scope.isDateIntervalGood($scope.filter.tenderPeriodStartFrom,
                    $scope.filter.tenderPeriodStartTo) &&
                $scope.isDateIntervalGood($scope.filter.tenderPeriodStartFrom,
                    $scope.filter.tenderPeriodStartTo) &&
                $scope.isDateIntervalGood($scope.filter.tenderCreationTimeFrom,
                    $scope.filter.tenderCreationTimeTo))
                return true;

            else return false;
        };
        var timer;
        $scope.getObjFromCookies = function () {
            var savedObjList = [];
            $timeout.cancel(timer);
            timer = $timeout(function () {
                var cookiesList = $cookies.getObject('savedObjList')
                    ? $cookies.getObject('savedObjList')
                    : [];
                //console.log(cookiesList);
                angular.forEach(cookiesList,
                    function (cook, key) {
                        savedObjList.push(cook.objValue || '');
                    });
            },
                0);
            //console.log(savedObjList);
            return savedObjList;
        };

        $scope.savedObjList = $scope.getObjFromCookies();

        $scope.inputBlur = function () {
            $scope.showDropdown = false;
        };

        var addSpaces = function (string, symbolsString) {

            var symbols = symbolsString.split("");

            var words = string.split(" ");

            for (var i = 0; i < words.length; i++) {
                for (var j = 0; j < symbols.length; j++) {
                    if (symbols[j] == ".")
                        var regex = new RegExp("%" + symbols[j], "gi");
                    else {
                        regex = new RegExp(symbols[j], "gi");
                    }
                    words[i] = words[i].replace(regex, symbols[j] + " ");
                }
            }

            string = words.join(" ");
            return string;
        };
        var truncString = function (string, length) {

            if (length < 5) {
                //console.log("Non valid parameter 'length' in function 'truncString'. It should be >4.");
                return string;
            }

            var words = string.split(" ");

            for (var i = 0; i < words.length; i++) {
                if (words[i].length > length)
                    words[i] = words[i].substr(0, length - 2) + "...";
            }

            string = words.join(" ");
            return string;
        };

        var cleanArray = function (arr) {
            if (arr && arr instanceof Array) {
                var result = [];
                for (var i = 0; i < arr.length; i++)
                    if (arr[i])
                        result.push(arr[i]);
                return result;
            } else
                return [];
        };

        function GetSearchTimeTypes() {
            var types = [];
            types.push({ type: "", name: "" });
            types.push({ type: "today", name: abp.localization.localize("CreationTime_Today", "Shared") });
            types.push({ type: "yesterday", name: abp.localization.localize("CreationTime_Yesterday", "Shared") });
            types.push({ type: "lastWeek", name: abp.localization.localize("CreationTime_LastWeek", "Shared") });
            types.push({ type: "lastMonth", name: abp.localization.localize("CreationTime_LastMonth", "Shared") });
            return types;
        }

        function getArrayFromParams(params) {
            return (params && params.indexOf(',') > -1) ? cleanArray(params.split(',')) : (params ? [params] : null);
        }

        if ($rootScope.isIframe) {
            $scope.edrpouFromParams = getArrayFromParams($localStorage.siteSettings.codeEDRPOU);
            $scope.cpvsFromParams = getArrayFromParams($localStorage.siteSettings.codeCPVS);

            $scope.isPM = true;
            $scope.pagerSearchFilter = {
                codeEDRPOUs: $scope.edrpouFromParams,
                parentCodesEDRPOU: $localStorage.siteSettings.parentCodeEDRPOU,
                isProductionMode: $scope.isPM
            };
        } else {
            if ($localStorage.isAuthorized) {
                $scope.isPM = $localStorage.isProdMode;
                $scope.pagerSearchFilter.isProductionMode = $scope.isPM;
            }
        }

        if ($scope.tenderTableFilter && $scope.tenderTableFilter.userFilter) {
            $scope.filter = $scope.tenderTableFilter.userFilter;
        } else {
            $scope.filter = {
                title: null,
                description: null,
                parentCodesEDRPOU: null,
                organizationName: null,
                priceFrom: null,
                priceTo: null,
                tenderPeriodStartFrom: null,
                tenderPeriodStartTo: null,
                tenderPeriodEndFrom: null,
                tenderPeriodEndTo: null,
                classificationCpv: null,
                dkpp: null,
                customerRegion: null,
                searchTimeType: null,
                myBidsOnly: false,
                mainProcurementCategory: null,
                milestoneCodeType: null
            };
        }

        function setPagerSearchFilter(isSearchChanged) {
            var childCpvs = $scope.tenderTableFilter.childCpvs;

            var cpvList = [];
            if (!childCpvs) childCpvs = [];
            $scope.selectedCpvs.concat(childCpvs)
                .forEach(function (cpv) {
                    var code = cpv.code ? cpv.code : cpv;
                    if (cpvList.indexOf(code) === -1) {
                        cpvList.push(code);
                    }
                });
            if ($scope.selectedStatuses.length > 0) makeSelectedStatusesChecked();
            $scope.generatePagerSearchFilter(cpvList, isSearchChanged);

            // встановлюємо обрані статуси лотов
            if ($scope.filter.lotsFilter &&
                $scope.filter.lotsFilter.statuses &&
                $scope.filter.lotsFilter.statuses.length > 0) {
                $scope.selectedLotStatuses = $scope.filter.lotsFilter.statuses;
                makeSelectedLotStatusesChecked();
            }
            // встановлюємо обрані статуси бідов
            if ($scope.filter.bidsFilter &&
                $scope.filter.bidsFilter.statuses &&
                $scope.filter.bidsFilter.statuses.length > 0) {
                $scope.selectedBidStatuses = $scope.filter.bidsFilter.statuses;
                makeSelectedBidStatusesChecked();
            }

        }

        function getStatusesForPageSearch() {
            return $scope.selectedStatuses.length > 0 ? $scope.selectedStatuses : setStatuse($sessionStorage.procType);
        }

        $scope.generatePagerSearchFilter = function (cpvList, isSearchChanged) {
            if (isSearchChanged || !$localStorage.pagerSearchFilter) {
                $scope.pagerSearchFilter = {
                    PriceFrom: $scope.filter.priceFrom || null,
                    PriceTo: $scope.filter.priceTo || null,
                    ProcurementMethod: $scope.procurementMethod || null,
                    procurementMethodTypes: $scope.selectedProcTypes || null,
                    regions: vModel.selectedRegions || null,
                    statuses: getStatusesForPageSearch(),
                    IsStasusesDefaulted: $scope.selectedStatuses.length > 0 ? false : true, // used for cache on server
                    Cpvs: $scope.cpvsFromParams || cpvList || [],
                    Dkpp: $scope.filter.dkpp || null,
                    isProductionMode: $scope.isPM || null,
                    parentCodesEDRPOU: $localStorage.siteSettings && $localStorage.siteSettings.parentCodeEDRPOU && [$localStorage.siteSettings.parentCodeEDRPOU] ||
                        $scope.findByEdrpou && [$scope.findByEdrpou] || $scope.selectedOrgCodes || $localStorage.siteSettings.parentCodeEDRPOU || [],
                    codeEDRPOUs: $scope.edrpouFromParams || null,
                    Title: $scope.filter.title || null,
                    OrganizationName: $scope.filter.organizationName || null,
                    FunderId: $scope.filter.funder && $scope.filter.funder.id || $scope.filter.funderId || null,
                    searchTimeType: $scope.filter.searchTimeType || null,
                    tenderPeriodEndFrom: $scope.filter.tenderPeriodEndFrom || null,
                    tenderPeriodEndTo: $scope.filter.tenderPeriodEndTo || null,
                    tenderCreationTimeFrom: $scope.filter.tenderCreationTimeFrom || null,
                    tenderCreationTimeTo: $scope.filter.tenderCreationTimeTo,
                    tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom || null,
                    tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo || null,
                    CustomerRegion: $scope.filter.customerRegion || null,
                    isShowOnlyTendersCreatedOnOurSite: $scope.isShowOnlyTendersCreatedOnOurSite,
                    mainProcurementCategory: $scope.filter.mainProcurementCategory && $scope.filter.mainProcurementCategory.value || null,
                    milestoneCodeType: $scope.filter.milestoneCodeType || null,
                    myBidsOnly: $scope.filter.myBidsOnly || false,
                    bidsFilter: $scope.filter.bidsFilter || null,
                    lotsFilter: $scope.filter.lotsFilter || null,
                    isCovid19: $scope.filter.isCovid19,
                    isDirectOrder: $scope.filter.isDirectOrder
                };

                $localStorage.pagerSearchFilter = $scope.pagerSearchFilter;
            } else {
                $scope.pagerSearchFilter = $localStorage.pagerSearchFilter;
            }
        }

        $scope.search = function () {
            if ($scope.temporaryOrgCode && !$scope.selectedOrgCodes.find(function (orgCode) { return orgCode === $scope.temporaryOrgCode })) {
                $scope.changeSelOrgCodes($scope.temporaryOrgCode, false);
                $scope.temporaryOrgCode = '';
            }
            if ($scope.selectedCpvs && $scope.selectedCpvs.length > 0) {
                getChildCpvsAndSearchTenders();
            } else {
                searchTenders();
            }
        };

        function getChildCpvsAndSearchTenders() {

            var itemsWithChildren = [];
            $scope.selectedCpvs.forEach(function (cpvItem) {
                if (!cpvItem.isOpen && cpvItem.rank < 8 && cpvItem.hasChildren) {
                    itemsWithChildren.push(cpvItem);
                }
            });
            var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);
            classificationData.then(function (response) {
                $scope.tenderTableFilter.childCpvs = response.data;
                searchTenders();
            });
        }

        function searchTenders() {
            if ($scope.mode === 'my') {
                var mySearchFilter = {
                    UserName: '',
                    PriceFrom: $scope.filter.priceFrom,
                    PriceTo: $scope.filter.priceTo,
                    ProcurementMethod: $scope.procurementMethod,
                    procurementMethodTypes: $scope.selectedProcTypes,
                    regions: vModel.selectedRegions,
                    statuses: $scope.selectedStatuses.length > 0 ? $scope.selectedStatuses : $scope.statuses,
                    IsStasusesDefaulted: $scope.selectedStatuses.length > 0 ? false : true, // used for cache on server
                    Cpvs: $scope.selectedCpvs.concat($scope.tenderTableFilter.childCpvs),
                    Dkpp: $scope.filter.dkpp,
                    isProductionMode: $scope.isPM,
                    parentCodesEDRPOU: $scope.selectedOrgCodes || $localStorage.siteSettings.parentCodeEDRPOU,
                    codeEDRPOUs: $scope.edrpouFromParams,
                    Title: $scope.filter.title,
                    OrganizationName: $scope.filter.organizationName,
                    FunderId: $scope.filter.funder ? $scope.filter.funder.id : null,
                    searchTimeType: $scope.filter.searchTimeType,
                    tenderPeriodEndFrom: $scope.filter.tenderPeriodEndFrom,
                    tenderPeriodEndTo: $scope.filter.tenderPeriodEndTo,
                    tenderCreationTimeFrom: $scope.filter.tenderCreationTimeFrom,
                    tenderCreationTimeTo: $scope.filter.tenderCreationTimeTo,
                    tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom,
                    tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo,
                    CustomerRegion: $scope.filter.customerRegion,
                    mainProcurementCategory: $scope.filter.mainProcurementCategory && $scope.filter.mainProcurementCategory.value || null,
                    milestoneCodeType: $scope.filter.milestoneCodeType && $scope.filter.milestoneCodeType.value || null,
                    myBidsOnly: $scope.filter.myBidsOnly || false,
                    bidsFilter: $scope.filter.bidsFilter || null,
                    lotsFilter: $scope.filter.lotsFilter || null
                };
            } else {
                setPagerSearchFilter(true);
                $scope.putDataToSessionStorage();
                if ($scope.vModel.searchString) {
                    saveObjIntoCookies($scope.vModel.searchString);
                }
                $scope.tenderTableFilter.userFilter = $scope.filter;
                $scope.tenderTableFilter.userSelectedStatuses = $scope.selectedStatuses;
                $scope.tenderTableFilter.userSelectedProcTypes = $scope.selectedProcTypes;
                $scope.tenderTableFilter.userSelectedRegions = vModel.selectedRegions;
                $scope.tenderTableFilter.userSelectedCpvs = $scope.selectedCpvs;
                $scope.tenderTableFilter.userSelectedOrgCodes = $scope.selectedOrgCodes;
                if (simpleProcType.isSimpleProcurementMethodRationale) {
                    $scope.tenderTableFilter.userSelectedProcTypes.push(simpleProcType.procurementMethodType);
                }
            }
            if ($scope.tableParams.page() !== 1) {
                if (!$scope.doNotNeedToSetPage) {
                    $location.search('page', 1);
                }
                $scope.tableParams.page(1);
            } else {
                $scope.tableParams.reload();
            }
            $scope.savedObjList = $scope.getObjFromCookies();
        }

        $scope.putDataToSessionStorage = function () {
            $sessionStorage.tenderTableSearchString = $scope.vModel.searchString;
        }

        //var timer;
        $scope.searchChange = function (searchStringIframe) {
            if (searchStringIframe || searchStringIframe === '') $scope.searchStringIframe = searchStringIframe;
            $timeout.cancel(timer);
            timer = $timeout(function () {
                if ($scope.mode === 'my') {
                    var mySearchFilter = {
                        UserName: '',
                        PriceFrom: $scope.filter.priceFrom,
                        PriceTo: $scope.filter.priceTo,
                        ProcurementMethod: $scope.procurementMethod,
                        procurementMethodTypes: $scope.selectedProcTypes,
                        regions: vModel.selectedRegions,
                        statuses: $scope.selectedStatuses.length > 0 ? $scope.selectedStatuses : $scope.statuses,
                        IsStasusesDefaulted: $scope.selectedStatuses
                            .length >
                            0
                            ? false
                            : true, // used for cache on server
                        Cpvs: $scope.selectedCpvs,
                        Dkpp: $scope.filter.dkpp,
                        isProductionMode: $scope.isPM,
                        parentCodesEDRPOU: $scope.selectedOrgCodes ||
                            $localStorage.siteSettings.parentCodeEDRPOU,
                        codeEDRPOUs: $scope.edrpouFromParams,
                        Title: $scope.filter.title,
                        OrganizationName: $scope.filter.organizationName,
                        FunderId: $scope.filter.funder ? $scope.filter.funder.id : null,
                        searchTimeType: $scope.filter.searchTimeType,
                        tenderPeriodEndFrom: $scope.filter.tenderPeriodEndFrom,
                        tenderPeriodEndTo: $scope.filter.tenderPeriodEndTo,
                        tenderCreationTimeFrom: $scope.filter.tenderCreationTimeFrom,
                        tenderCreationTimeTo: $scope.filter.tenderCreationTimeTo,
                        tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom,
                        tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo,
                        CustomerRegion: $scope.filter.customerRegion,
                        mainProcurementCategory: $scope.filter.mainProcurementCategory && $scope.filter.mainProcurementCategory.value || null,
                        milestoneCodeType: $scope.filter.milestoneCodeType && $scope.filter.milestoneCodeType.value || null,
                        myBidsOnly: $scope.filter.myBidsOnly || false,
                        bidsFilter: $scope.filter.bidsFilter || null,
                        lotsFilter: $scope.filter.lotsFilter || null
                    };
                } else {
                    setPagerSearchFilter(true);
                    $scope.putDataToSessionStorage();
                    $scope.tenderTableFilter.userFilter = $scope.filter;
                    $scope.tenderTableFilter.userSelectedStatuses = $scope.selectedStatuses;
                    $scope.tenderTableFilter.userSelectedProcTypes = $scope.selectedProcTypes;
                    $scope.tenderTableFilter.userSelectedRegions = vModel.selectedRegions;
                    $scope.tenderTableFilter.userSelectedCpvs = $scope.selectedCpvs;
                    $scope.tenderTableFilter.userSelectedOrgCodes = $scope.selectedOrgCodes;
                    if (simpleProcType.isSimpleProcurementMethodRationale) {
                        $scope.tenderTableFilter.userSelectedProcTypes.push(simpleProcType.procurementMethodType);
                    }
                }
                $scope.tableParams.page(1);
                $scope.tableParams.reload();

            },
                1000);
        };

        function saveObjIntoCookies(srchStr) {
            var exp = new Date(s.getFullYear(), s.getMonth() + 2, s.getDate());
            var savedObjList = $cookies.getObject('savedObjList') ? $cookies.getObject('savedObjList') : [];
            var equal = null;
            angular.forEach(savedObjList,
                function (obj, key) {
                    if (!obj.objValue || obj.objValue == '') {
                        savedObjList.splice(savedObjList.indexOf(obj), 1);
                    }
                    if (obj.objValue === srchStr) {
                        equal = obj.objValue;
                    }
                });
            var cookindex = (savedObjList != null && savedObjList != '') ? savedObjList.length : 0;
            if (cookindex > 9) {
                savedObjList.shift();
                cookindex = savedObjList.length;
            }
            if (srchStr.length > 2 && equal == null) {
                //var objKey = 'searchObject' + cookindex.toString();
                var objValue = srchStr;
                savedObjList.push({ 'objValue': objValue });
                $cookies.putObject('savedObjList', savedObjList, { 'expires': exp });
            }
        }

        $scope.getStatusDictionary = function (statuses) {
            var statusDict = [];

            angular.forEach(statuses,
                function (st, key) {
                    var description = getTenderDescriptionByStatus(st, '');
                    var label = lookupService.getTenderLabelClass(st);
                    statusDict.push({
                        name: st,
                        description: description,
                        label: label
                    });
                });
            return statusDict;
        }

        $scope.getStatusLotDictionary = function (statuses) {
            var statusDict = [];

            angular.forEach(statuses,
                function (st, key) {
                    var description = getLotDescriptionByStatus(st, '');
                    var label = lookupService.getLotStatusLabelClass(st);
                    statusDict.push({
                        name: st,
                        description: description,
                        label: label
                    });
                });
            return statusDict;
        }

        $scope.getStatusBidDictionary = function (statuses) {
            var statusDict = [];

            angular.forEach(statuses,
                function (st, key) {
                    var description = getBidDescriptionByStatus(st, '');
                    var label = lookupService.getBidStatusClass(st);
                    statusDict.push({
                        name: st,
                        description: description,
                        label: label
                    });
                });
            return statusDict;
        }

        $scope.$on('broadcastChangedCpvs', function (evt, changedCpvs) {
            $scope.selectedCpvs = changedCpvs;
        });

        $scope.archiveStatuses = lookupService.getTenderArchiveStatuses;
        $scope.defaultStatuses = lookupService.getTenderDefaultStatuses;
        $scope.statuses = $scope.defaultStatuses.concat($scope.archiveStatuses);
        $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);
        $scope.statusLotDictionary = $scope.getStatusLotDictionary(lookupService.lotStatuses);
        $scope.statusBidDictionary = $scope.getStatusBidDictionary(lookupService.bidStatuses);
        $scope.searchTimeTypes = GetSearchTimeTypes();

        $scope.filterProcTypes = function (procTypes) {

            return procTypes.filter(function (pt) {
                //return pt.procurementMethod === $scope.procurementMethod;
                return $scope.procurementMethod.indexOf(pt.procurementMethod) > -1;
            });
        }

        if (!$scope.procTypesDictionary) $scope.procTypesDictionary = [];

        $scope.getProcTypes = function () {
            //if ($scope.procTypesDictionary.length > 0) return;
            abp.ui.setBusy("#procTypesFilter");
            referenceService
                .getAllProcTypes()
                .then(function (response) {
                    if (response.data) {
                        angular.forEach(response.data.procTypes,
                            function (pType) {
                                pType.procurementMethodTypeLocal = lookupService
                                    .getTenderProcedureType(pType.procurementMethodType);
                            });
                        $scope.allProcTypes = response.data.procTypes;
                        $scope.allProcTypes.splice(4, 0, simpleProcType);
                        angular.forEach($scope.allProcTypes, function (type) {
                            if (type.procurementMethodTypeLocal == 'Спрощена/Допорогова закупівля') {
                                type.procurementMethodTypeLocal = 'Допорогова закупівля';
                            }
                        });
                        getProcTypes();
                    }
                    abp.ui.clearBusy("#procTypesFilter");
                }, function () {
                    abp.ui.clearBusy("#procTypesFilter");
                });

            function getProcTypes() {
                var arr = $scope.allProcTypes;
                $scope.procTypesDictionary = $scope.filterProcTypes(arr);
                $scope.checkedProcTypes.length = $scope.procTypesDictionary.length;
                $scope.checkedProcTypes.fill(false);
                makeSelectedProcTypesChecked();
            }
        }


        if ($scope.tenderTableFilter && $scope.tenderTableFilter.userSelectedStatuses && $scope.tenderTableFilter.userSelectedStatuses.length > 0) {
            $scope.selectedStatuses = $scope.tenderTableFilter.userSelectedStatuses;
            makeSelectedStatusesChecked();
        }
        //} else {
        //    selectedStatuses = [];
        //}

        $scope.setProcTypesChecked = function () {
            if ($scope.tenderTableFilter && $scope.tenderTableFilter.userSelectedProcTypes &&
                $scope.tenderTableFilter.userSelectedProcTypes !== '') {
                $scope.selectedProcTypes = $scope.tenderTableFilter.userSelectedProcTypes;
                if (!$scope.procTypesDictionary) $scope.getProcTypes();
                makeSelectedProcTypesChecked();
            }
        }
        $scope.setProcTypesChecked();

        if ($scope.tenderTableFilter && $scope.tenderTableFilter.userSelectedRegions &&
            $scope.tenderTableFilter.userSelectedRegions !== '') {
            vModel.selectedRegions = $scope.tenderTableFilter.userSelectedRegions;
                $timeout(function () {
                    if (!vModel.regionsDictionary)
                        vModel.getRegions && vModel.getRegions();
                    vModel.makeSelectedRegionsChecked && vModel.makeSelectedRegionsChecked();
                }, 2000);

        }
        //} else {
        //    selectedProcTypes = [];
        //}

        if ($scope.tenderTableFilter && $scope.tenderTableFilter.userSelectedCpvs && $scope.tenderTableFilter.userSelectedCpvs.length > 0) {
            $scope.selectedCpvs = $scope.tenderTableFilter.userSelectedCpvs;
        }
        //} else {
        //    $scope.selectedCpvs = [];
        //}
        if ($scope.tenderTableFilter && $scope.tenderTableFilter.userSelectedOrgCodes && $scope.tenderTableFilter.userSelectedOrgCodes.length > 0) {
            $scope.selectedOrgCodes = $scope.tenderTableFilter.userSelectedOrgCodes;
        }

        function makeStatusSearchText() {
            $scope.statusSearchText = null;
            angular.forEach($scope.selectedStatuses,
                function (status) {
                    angular.forEach($scope.statusDictionary,
                        function (dict) {
                            if (dict.name === status &&
                                (!$scope.statusSearchText ||
                                    $scope.statusSearchText.indexOf(dict.description) === -1))
                                $scope
                                    .statusSearchText =
                                    $scope.statusSearchText
                                        ? $scope.statusSearchText + dict.description + '; '
                                        : dict.description + '; ';
                        });
                });
        }

        function makeStatusLotSearchText() {
            $scope.statusLotSearchText = null;
            angular.forEach($scope.filter.lotsFilter.statuses,
                function (status) {
                    angular.forEach($scope.statusLotDictionary,
                        function (dict) {
                            if (dict.name === status &&
                                (!$scope.statusLotSearchText ||
                                    $scope.statusLotSearchText.indexOf(dict.description) === -1))
                                $scope.statusLotSearchText =
                                    $scope.statusLotSearchText
                                        ? $scope.statusLotSearchText + dict.description + '; '
                                        : dict.description + '; ';
                        });
                });
        }

        function makeStatusBidSearchText() {
            $scope.statusBidSearchText = null;
            angular.forEach($scope.filter.bidsFilter.statuses,
                function (status) {
                    angular.forEach($scope.statusBidDictionary,
                        function (dict) {
                            if (dict.name === status &&
                                (!$scope.statusBidSearchText ||
                                    $scope.statusBidSearchText.indexOf(dict.description) === -1))
                                $scope.statusBidSearchText =
                                    $scope.statusBidSearchText
                                        ? $scope.statusBidSearchText + dict.description + '; '
                                        : dict.description + '; ';
                        });
                });
        }

        function makeStatusSearchLabel() {
            $scope.statusSearchLabel = null;
            if ($scope.selectedStatuses.length === 1)
                angular.forEach($scope.statusDictionary,
                    function (dict) {
                        if (dict.name === $scope.selectedStatuses[0])
                            $scope.statusSearchLabel = dict.label;
                    });
        }

        function makeStatusLotSearchLabel() {
            $scope.statusLotSearchLabel = null;
            if ($scope.filter.lotsFilter.statuses.length === 1)
                angular.forEach($scope.statusLotDictionary,
                    function (dict) {
                        if (dict.name === $scope.filter.lotsFilter.statuses[0])
                            $scope.statusLotSearchLabel = dict.label;
                    });
        }

        function makeStatusBidSearchLabel() {
            $scope.statusBidSearchLabel = null;
            if ($scope.filter.bidsFilter.statuses.length === 1)
                angular.forEach($scope.statusBidDictionary,
                    function (dict) {
                        if (dict.name === $scope.filter.bidsFilter.statuses[0])
                            $scope.statusBidSearchLabel = dict.label;
                    });
        }

        $scope.changeSelection = function (st, checked) {
            if (!st) {
                $scope.selectedStatuses = [];
                $scope.checkedStatuses = [];
                $scope.statusSearchText = null;
                $scope.statusSearchLabel = null;
            } else {
                if (checked) $scope.selectedStatuses.push(st.name);
                else $scope.selectedStatuses.splice($scope.selectedStatuses.indexOf(st.name), 1);
                makeStatusSearchText();
                makeStatusSearchLabel();
            }
        };
        $scope.changeLotSelection = function (st, checked) {
            if (!st) {
                $scope.filter.lotsFilter.statuses = [];
                $scope.checkedLotStatuses = [];
                $scope.statusLotSearchText = null;
                $scope.statusLotSearchLabel = null;
            } else {
                if (checked) $scope.filter.lotsFilter.statuses.push(st.name);
                else $scope.filter.lotsFilter.statuses.splice($scope.filter.lotsFilter.statuses.indexOf(st.name), 1);
                makeStatusLotSearchText();
                makeStatusLotSearchLabel();
            }
        };
        $scope.changeBidSelection = function (st, checked) {
            if (!st) {
                $scope.filter.bidsFilter.statuses = [];
                $scope.checkedBidStatuses = [];
                $scope.statusBidSearchText = null;
                $scope.statusBidSearchLabel = null;
            } else {
                if (checked) $scope.filter.bidsFilter.statuses.push(st.name);
                else $scope.filter.bidsFilter.statuses.splice($scope.filter.bidsFilter.statuses.indexOf(st.name), 1);
                makeStatusBidSearchText();
                makeStatusBidSearchLabel();
            }
        };

        $scope.selectNotArchived = function () {
            $scope.isArchive = false;
            $scope.selectedStatuses = $scope.defaultStatuses;
            makeSelectedStatusesChecked();
        };

        $scope.tenderLabelClass = "label-default";

        $scope.getTenderDescriptionByStatusForInTable = function (tender) {
            if (tender) {
                var status = getTenderDescriptionByStatus(tender.status, tender.procurementMethodType, tender.notExport);
                if (status.indexOf($rootScope.source('Negotiation')) > -1)
                    status = 'Активна закупівля';
                return status;
            }
        };

        $scope.searchByEDRPOU = function (edrpou) {
            if (!edrpou) return;
            $localStorage.searchPage = null;
            $scope.selectedOrgCodes = [edrpou];
            $scope.search();
        }


        function getTenderDescriptionByStatus(status, procurementMethodType) {
            return lookupService.getTenderStatusDesc(status, procurementMethodType);
        };

        function getLotDescriptionByStatus(status) {
            return lookupService.getLotStatusUkr(status);
        };

        function getBidDescriptionByStatus(status) {
            return lookupService.getBidStatusDesc(status);
        };

        $scope.getLabelClassByStatus = function (status) {
            return lookupService.getTenderLabelClass(status);
        };

        $scope.clear = function (savedFilter) {
            delete $localStorage.pagerSearchFilter;
            $scope.vModel.searchString = null;
            $scope.filter = {
                title: savedFilter && savedFilter.title || null,
                description: null,
                parentCodesEDRPOU: null,
                organizationName: null,
                priceFrom: null,
                priceTo: null,
                tenderPeriodStartFrom: null,
                tenderPeriodStartTo: null,
                tenderPeriodEndFrom: null,
                tenderPeriodEndTo: null,
                classificationCpv: null,
                dkpp: null,
                customerRegion: null,
                searchTimeType: null,
                mainProcurementCategory: null,
                milestoneCodeType: null
            };
            $rootScope.$broadcast('clearFunder', true);

            $scope.selectedStatuses = [];
            $scope.checkedStatuses = [];
            $scope.statusSearchText = null;
            $scope.statusSearchLabel = null;

            $scope.selectedProcTypes = [];
            $scope.checkedProcTypes = [];
            $scope.procTypeSearchText = null;
            vModel.selectedRegions = [];
            vModel.checkedRegions = [];
            vModel.regionsSearchText = null;
            $scope.selectedOrgCodes = savedFilter && savedFilter.selectedOrgCodes || [];
            $scope.tenderTableFilter.childCpvs = [];
            $scope.tenderTableFilter.userFilter = $scope.filter;
            $scope.tenderTableFilter.userSelectedStatuses = $scope.selectedStatuses;
            $scope.tenderTableFilter.userSelectedProcTypes = $scope.selectedProcTypes;
            $scope.tenderTableFilter.userSelectedRegions = vModel.selectedRegions;
            $scope.tenderTableFilter.userSelectedCpvs = $scope.selectedCpvs;
            $scope.tenderTableFilter.userSelectedOrgCodes = $scope.selectedOrgCodes;
            $scope.pagerSearchFilter.Cpvs = [];
            if ($scope.selectedCpvs.length > 0)
                clearSelectedCpvs();
            //if ($localStorage && $localStorage.siteSettings && $localStorage.siteSettings.parentCodeEDRPOU && !saveEdrpou)
            //    $localStorage.siteSettings.parentCodeEDRPOU = null;
            clearBidsSearch();
            clearLotsSearch();
        };

        function clearBidsSearch() {
            $scope.filter.myBidsOnly = false;
            $scope.filter.bidsFilter = null;
            $scope.checkedBidStatuses = [];
            $scope.statusBidSearchText = null;
            $scope.statusBidSearchLabel = null;
        };

        function clearLotsSearch() {
            $scope.filter.lotsFilter = null;
            $scope.checkedLotStatuses = [];
            $scope.statusLotSearchText = null;
            $scope.statusLotSearchLabel = null;
        }

        function clearSelectedCpvs() {
            $scope.selectedCpvs = [];
            $rootScope.clearCheckbox();
        }

        // ******* get search EDRPOU ******* 
        if ($stateParams.edrpou) {
            $scope.clear();
            $scope.selectedOrgCodes.push($stateParams.edrpou);
        }

        //if ($scope.isMy || $rootScope.isIframe) {
        //    allStatuses = allStatuses.concat(['unsuccessful', 'complete', 'cancelled']);
        //}

        //#region Favorites


        $scope.toggleFavourite = function (event) {
            if (!$localStorage.isAuthorized) {
                abp.notify.info('Спочатку авторизуйтесь');
                return;
            }
            var i = $(event.target);
            var tenderId = $(event.target).attr('data-tenderId');

            tenderAppService
                .triggerFavoriteTender({ tenderId: tenderId })
                .then(function (response) {
                    if (response.data) 
                    {
                        i.toggleClass('opacity1');
                        abp.notify.success('Додано до обраного');
                    }
                    else
                    {
                        i.toggleClass('opacity1');
                        abp.notify.info('Видалено з обраного');
                    }
                });
        };
        //#endregion


        function makeProcTypeSearchText() {
            $scope.procTypeSearchText = null;
            angular.forEach($scope.selectedProcTypes,
                function (pType) {
                    angular.forEach($scope.procTypesDictionary,
                        function (dict) {
                            if (dict.procurementMethodType === pType &&
                                (!$scope.procTypeSearchText ||
                                    $scope.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                                $scope
                                    .procTypeSearchText =
                                    $scope.procTypeSearchText
                                        ? $scope.procTypeSearchText + dict.procurementMethodTypeLocal + '; '
                                        : dict.procurementMethodTypeLocal + '; ';
                        });
                });
            angular.forEach($scope.selectedProcTypes, function (simpleProc) {
                if (simpleProc == 'simple') {
                    return simpleProcType.isSimpleProcurementMethodRationale = true;
                }
                return simpleProcType.isSimpleProcurementMethodRationale = false;
            });
        }


        $scope.changeSelProcTypes = function (procType, checked) {
            if (procType) {
                if (checked) {
                    $scope.selectedProcTypes.push(procType.procurementMethodType);
                } else {
                    $scope.selectedProcTypes.splice($scope.selectedProcTypes.indexOf(procType.procurementMethodType), 1);
                }
                makeProcTypeSearchText();
            } else if (checked) {
                $scope.selectedProcTypes = [];
                $scope.checkedProcTypes = [];
                $scope.procTypeSearchText = null;
            }
        }


        $scope.changeSelCpvs = function (cpv, remove) {
            if (cpv) {
                if (!remove) {
                    if ($scope.selectedCpvs.indexOf(cpv) === -1)
                        $scope.selectedCpvs.push(cpv);
                } else $scope.selectedCpvs.splice($scope.selectedCpvs.indexOf(cpv), 1);
            }
        }

        $scope.changeSelOrgCodes = function (code, remove) {
            if (code) {
                if (!remove)
                    $scope.selectedOrgCodes.push(code);
                else $scope.selectedOrgCodes.splice($scope.selectedOrgCodes.indexOf(code), 1);
            }
        }

        $scope.checkCodeOrgExists = function (code, isValidInput) {
            if (!isValidInput || !code) {
                $scope.orgCodeNotExists = null;
                return;
            }
            abp.ui.setBusy("#codeFilter");
            abpReferenceService
                .isOrganizationExists({ innOrEdrpou: code })
                .then(function (response) {
                    if (response.data) {
                        $scope.orgCodeNotExists = false;
                        $scope.temporaryOrgCode = code;
                    } else {
                        $scope.orgCodeNotExists = true;
                    }
                    abp.ui.clearBusy("#codeFilter");
                }, function (e) {
                    abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                    $scope.orgCodeNotExists = true;
                    abp.ui.clearBusy("#codeFilter");
                });
        }

        $scope.checkCpvExists = function (cpv, isValidInput) {
            if (!isValidInput || !cpv) {
                $scope.cpvNotExists = null;
                return;
            }
            abp.ui.setBusy("#cpvFilter");
            abpReferenceService
                .isCpvExists({ code: cpv })
                .then(function (response) {
                    if (response.data) $scope.cpvNotExists = false;
                    else $scope.cpvNotExists = true;
                    abp.ui.clearBusy("#cpvFilter");
                }, function (e) {
                    abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                    $scope.cpvNotExists = true;
                    abp.ui.clearBusy("#cpvFilter");
                });
        }

        $scope.searchTemplates = [];
        $scope.getSearchTemplates = function () {
            if ($scope.searchTemplates.length === 0) {
                $scope.getUserFilterTemplates();
            }
            $('#searchTemplates').modal('show');
        }

        $scope.getUserFilterTemplates = function () {
            abp.ui.setBusy('#searchTemplates');
            searchService
                .getUserFilterTemplates()
                .then(function (response) {
                    if (response.data) {
                        $localStorage.userFilterTemplates = response.data.userFilterTemplates;
                        $scope.searchTemplates = $localStorage.userFilterTemplates;
                        abp.ui.clearBusy('#searchTemplates');
                    }
                }, function () {
                    abp.ui.clearBusy('#searchTemplates');
                });
        }

        function makeSelectedStatusesChecked() {
            if ($scope.selectedStatuses.length > 0) {
                angular.forEach($scope.statusDictionary,
                    function (stat) {
                        if ($scope.selectedStatuses
                            .indexOf(stat.name) >
                            -1) $scope.checkedStatuses[$scope.statusDictionary.indexOf(stat)] = true;
                    });
                makeStatusSearchText();
                makeStatusSearchLabel();
            }
        }

        function makeSelectedLotStatusesChecked() {
            if ($scope.selectedLotStatuses && $scope.selectedLotStatuses.length > 0) {
                angular.forEach($scope.statusLotDictionary,
                    function (stat) {
                        if ($scope.selectedLotStatuses
                            .indexOf(stat.name) >
                            -1) $scope.checkedLotStatuses[$scope.statusLotDictionary.indexOf(stat)] = true;
                    });
                makeStatusLotSearchText();
                makeStatusLotSearchLabel();
            }
        }

        function makeSelectedBidStatusesChecked() {
            if ($scope.selectedBidStatuses && $scope.selectedBidStatuses.length > 0) {
                angular.forEach($scope.statusBidDictionary,
                    function (stat) {
                        if ($scope.selectedBidStatuses
                            .indexOf(stat.name) >
                            -1) $scope.checkedBidStatuses[$scope.statusBidDictionary.indexOf(stat)] = true;
                    });
                makeStatusBidSearchText();
                makeStatusBidSearchLabel();
            }
        }

        function makeSelectedProcTypesChecked() {
            if ($scope.selectedProcTypes.length > 0) {
                if ($scope.procTypesDictionary.length === 0) $scope.getProcTypes();
                angular.forEach($scope.procTypesDictionary,
                    function (procType) {
                        if ($scope.selectedProcTypes.indexOf(procType.procurementMethodType) > -1)
                            $scope.checkedProcTypes[$scope.procTypesDictionary.indexOf(procType)] = true;
                    });
                makeProcTypeSearchText();
            }
        }

        $scope.showCovidAndDirectOrderChecboxes = angular.equals($sessionStorage.procType, ['limited']);
        function navigationClicked(procType) {
            $scope.procurementMethod = procType;
            $sessionStorage.procType = procType;
            $scope.isArchive = false;
            $scope.showCovidAndDirectOrderChecboxes = angular.equals($sessionStorage.procType, ['limited']);
            procurementMethodChanged(procType);
            $scope.generateTableTenders();
        };

        $scope.navigationClicked = navigationClicked;

        function setStatuse(val) {
            if (window.location.href.indexOf('toDoTenders') === -1)
                if (val.indexOf("limited") > -1) {
                    $scope.statuses = ['active', 'unsuccessful', 'complete', 'cancelled'];
                } else {
                    $scope.statuses = !$rootScope.iFrame && $scope.defaultStatuses.concat($scope.archiveStatuses); //ET-8397
                }
            if (window.location.href.indexOf('ChoosedTenders') > -1 && $scope.procurementMethod.indexOf('limited') > -1) {
                $scope.statuses = ['active', 'unsuccessful', 'complete', 'cancelled'];
            }
            $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);
            return $scope.statuses;
        }

        function procurementMethodChanged(val) {
            setStatuse(val);

            $scope.procTypesDictionary = [];

            if ($scope.templateToLoad !== null) { //&& !archiveChanged
                $scope.tableParams.page(1);
                $scope.tableParams.reload();
                setSelectedFromTemplate();
            }
        };
        $scope.$watch('procurementMethod',
            function (n, o) {
                if (n !== o && $scope.templateToLoad !== null) procurementMethodChanged(n);
            });

        function setSelectedFromTemplate() {
            $scope.clear();
            $scope.filter = $scope.templateToLoad;
            if ($scope.filter.mainProcurementCategory && typeof $scope.filter.mainProcurementCategory === 'string') {
                $scope.filter.mainProcurementCategory = { value: $scope.filter.mainProcurementCategory}
            }
            if ($scope.templateToLoad.funderId) {
                $scope.vModel.getFunders($scope.templateToLoad.funderId);
                $scope.pagerSearchFilter.FunderId = $scope.templateToLoad.funderId;
            }
            if ($scope.templateToLoad.priceFrom === 0) $scope.filter.priceFrom = null;
            if ($scope.templateToLoad.priceTo === 0) $scope.filter.priceTo = null;
            // встановлюємо обрані статуси
            $scope.selectedStatuses = $scope.templateToLoad.statuses;
            makeSelectedStatusesChecked();

            // встановлюємо обрані статуси лотов
            $scope.selectedLotStatuses = $scope.templateToLoad.lotsFilter && $scope.templateToLoad.lotsFilter.statuses;
            makeSelectedLotStatusesChecked();

            // встановлюємо обрані статуси бідов
            $scope.selectedBidStatuses = $scope.templateToLoad.bidsFilter && $scope.templateToLoad.bidsFilter.statuses;
            makeSelectedBidStatusesChecked();

            // встановлюємо обрані типи процедур
            $scope.selectedProcTypes = $scope.templateToLoad.procurementMethodTypes;
            makeSelectedProcTypesChecked();
            // встановлюємо обрані регіони
            vModel.selectedRegions = $scope.templateToLoad.regions ? $scope.templateToLoad.regions : [];
            vModel.makeSelectedRegionsChecked();
            // сpv
            $scope.selectedCpvs = $scope.templateToLoad.cpvs;
            // коди організацій
            $scope.selectedOrgCodes = $scope.templateToLoad.parentCodesEDRPOU;
            if (!archiveChanged) $scope.templateToLoad = null;
        }

        $scope.getSearchFilter = function (templId, $event, idBlock) {
            //if ($event && angular.element('#searchParameters')[0].attributes['aria-expanded'] &&
            //    angular.element('#searchParameters')[0].attributes['aria-expanded']
            //        .value ===
            //    'true') $event.stopPropagation();
            $scope.hideModal(idBlock);
            searchService
                .getSearchFilterFromTemplate({ id: templId })
                .then(function (response) {
                    var data = response.data;
                    $scope.templateToLoad = data;
                    $scope.filterfromtemplate = true;

                    archiveChanged = $scope.isArchive !== data.isArchive;
                    $scope.isArchive = data.isArchive;

                    if (data.procurementMethod &&
                        data.procurementMethod.length > 0 &&
                        !angular.equals($scope.procurementMethod, data.procurementMethod)) {
                        $scope.procurementMethod = data.procurementMethod;
                    }

                    setSelectedFromTemplate();
                    $('#searchTemplates').modal('hide');
                    $scope.search();

                });
        }

        $scope.saveTemplate = function (name, forAllOrg) {
            setPagerSearchFilter(true);
            var filterToSave = $scope.pagerSearchFilter;
            filterToSave.statuses = $scope.selectedStatuses;
            if ($scope.selectedStatuses.length === 0 && $scope.selectedProcTypes.length === 0)
                filterToSave.procurementMethod = null;
            searchService
                .createTemplate({
                    'name': name,
                    'filter': $scope.pagerSearchFilter,
                    'forWholeOrganization': forAllOrg || null
                })
                .then(function (response) {
                    //$scope.getSearchTemplates();
                    var tmplObj = {
                        id: response.data,
                        name: name
                    };
                    $scope.searchTemplates.push(tmplObj);
                    if ($scope.searchTmpltsQuickFltr) $scope.searchTmpltsQuickFltr.push(tmplObj);
                    $localStorage.userFilterTemplates = $scope.searchTemplates;
                    $scope.getUserFilterTemplates();
                    $('#enterTemplName').modal('hide');
                    $('#tenderSearch').modal('hide');
                    abp.notify.success('Успішно збережено.');
                }, function (e) {
                    abp.notify.error(e.data);
                });
        }

        $scope.removeTemplate = function (templ) {
            if (confirm('Ви підтверджуєте видалення шаблону?')) {
                searchService
                    .removeTemplate(templ)
                    .then(function () {
                        $scope.afterRemoveTemplate(templ);
                    }, function (e) {
                        abp.notify.error(e.message);
                    });
            }
        }

        $scope.afterRemoveTemplate = function (templ) {
            abp.notify.success('Успішно видалено.');
            $scope.searchTemplates.splice($scope.searchTemplates.indexOf(templ), 1);
            $localStorage.userFilterTemplates = $scope.searchTemplates;
        }

        $scope.clearAllFiltersAndTmpl = function () {
            if ($stateParams.edrpou) $location.path('/');
            $('#modalClassifications').removeData('bs.modal')
            $scope.clear();
            $scope.search();
        }

        $scope.isIframe = $rootScope.isIframe;

        if (!$scope.defaultSorting)
            $scope.defaultSorting = { '': 'desc' };


        function getLocationPage () {
            var locationPage = null;
            for (var key in $location.search()) {
                if (key === 'page') {
                    locationPage = $location.search()[key];
                }
            }

            return locationPage;
        }

        $scope.tableParams = new ngTableParams({
            page: (function () {
                var locationPage = Number(getLocationPage());
                if (!!locationPage && Number.isInteger(locationPage) && locationPage > 0 && locationPage <= $scope.maxPageValue) {
                    return locationPage;
                } else {
                    $location.search('page', 1);
                    return 1;
                }
            })(),
            count: $rootScope.isIframe ? numberOfRecordsIframe : numberOfRecords,
            sorting: $scope.defaultSorting
        },
            {
                counts: [],
                getData: function ($defer, params) {
                    var defer = $defer;
                    if ($scope.pagerSearchFilter.isProductionMode == undefined) {
                        $scope.pagerSearchFilter.isProductionMode = $scope.isPM;
                    }

                    if ($scope.mode === 'my') {
                        $scope.tenderTableFilter.mySearchPage = params.page();
                    } else {
                        $scope.tenderTableFilter.searchPage = params.page();
                    }
                    setPagerSearchFilter();

                    $scope.pagerSearchFilter.IsRealTendersForTestMode = !$rootScope.isIframe ? vModel.realTestMode : true; // real test mode check box

                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        OrderColumn: (params.orderBy())[0].slice(1),
                        OrderDirection: (params.sorting())[(params.orderBy())[0].slice(1)],
                        SearchFilter: $scope.pagerSearchFilter
                    };

                    if ($scope.filterfromtemplate && $scope.filter && $scope.filter.milestoneCodeType) {
                        pager.SearchFilter.milestoneCodeType = $scope.filter.milestoneCodeType;
                        $scope.filterfromtemplate = false;
                    }

                    // set funders if it in search template
                    if ($scope.filter && $scope.filter.funderId) {
                        pager.SearchFilter.FunderId = $scope.filter.funderId;
                        if (!$scope.pagerSearchFilter.FunderId)
                            $scope.vModel.getFunders($scope.filter.funderId);
                    };

                    if ($scope.mode === 'my') {
                        pager.SearchFilter.UserName = $localStorage.username;
                    }

                    if ($scope.user) {
                        pager.SearchFilter.UserName = $scope.user;
                    }

                    if ($rootScope.isIframe) {
                        pager.searchIdentifier = $scope.searchStringIframe;
                    } else {
                        $scope.setSearchStringFromSessionStorage(pager);
                    }

                    // set saved procType if go anothe page
                    setStatuse($sessionStorage.procType);
                    // save pager params to localStorage
                    $scope.tenderTableFilter.paramsTenderTable = pager;
                    abp.ui.setBusy('.preWrapper');
                    $scope.getTendersFunc(pager, params, defer);
                }

            });

        $scope.setSearchStringFromSessionStorage = function (pager) {
            if ($sessionStorage.tenderTableSearchString) {
                $scope.vModel.searchString = $sessionStorage.tenderTableSearchString;
                pager.searchIdentifier = $sessionStorage.tenderTableSearchString;
            }
        }

        $scope.getTendersFunc = function (pager, params, defer) {
            var getListOfTenders = readTenderAppService.getTenders(pager);
            getListOfTenders.then(function (response) {
                $scope.showTendersFunc(response, params, defer, 0);
            },
                function (errorResponse) {
                    console.log(errorResponse.data);
                });
        }

        $scope.showTendersFunc = function (response, params, defer, tryNumbers) {
            var data = response.data;
            if (data.tender.length === 0 && params.$params.page !== 0) {
                $location.search('page', 1);
                params.page(1);
            }
            $scope.tenders = data;
            params.total(data.countAllRecords);
            if (data.tender)
                for (var i = 0; i < data.tender.length; i++) {
                    data.tender[i].title = addSpaces(data.tender[i].title, ":;.,!");
                    data.tender[i].title = truncString(data.tender[i].title, 20);

                    end = data.tender[i].tenderEndDate;
                    $scope.end[i] = Date.parse(end);
                }
            defer.resolve(data.tender);
            siteSettingsService.onScrollFilter();
            $scope.getClearFilterButton();
            $scope.switchedBlock = 'tenders';
            $scope.allRecords = data.countAllRecords;
            if (!$scope.doNotNeedToSetPage && (!$location.search() || !$location.search().page)) {
                $location.search('page', params.page());
            }
            if (getLocationPage())
            $timeout(function () {
                var elements = document.getElementById("table-content");
                if (elements) {
                    var pagination = elements.getElementsByClassName("ng-table-pagination");
                    var paginationArray = Array.from(pagination);
                    var currentPage = getLocationPage();
                    var currentPagePath = $location.path();
                    
                    paginationArray.forEach(function (paginationItem) {
                        if (paginationItem.children && paginationItem.children.length) {
                            var linkList = Array.from(paginationItem.children);
                            linkList.forEach(function (link, index) {
                                if (index === 0) {
                                    var pageToRedirect = Number(currentPage) - 1;
                                    if (pageToRedirect) {
                                        link.firstElementChild.setAttribute('href', currentPagePath + '?page=' + pageToRedirect);
                                    }
                                } else if (index === linkList.length - 1) {
                                    if (checkIfUserIsOnLastTablePage(Number(currentPage), params)) {
                                        var pageToRedirect = Number(currentPage) + 1;
                                        link.firstElementChild.setAttribute('href', currentPagePath+ '?page=' + pageToRedirect);
                                    }
                                } else {
                                    var spanElement = link.getElementsByTagName('span')[0];
                                    if (spanElement) {
                                        var pageToRedirect = spanElement.textContent;
                                        link.firstElementChild.setAttribute('href', currentPagePath + '?page=' + pageToRedirect);
                                    }
                                }
                            });
                        }
                    });
                } else if (tryNumbers < 3) {
                    $scope.showTendersFunc(response, params, defer, tryNumbers + 1);
                }

                abp.ui.clearBusy('.preWrapper');
                abp.ui.clearBusy();

            });
        }

        function checkIfUserIsOnLastTablePage(currentPage, params) {
            var reminder = params.total() % params.count();

            if (reminder) {
                return Math.floor(params.total() / params.count()) + 1 !== currentPage;
            } else {
                return (params.total() / params.count()) !== currentPage;
            }
        }

        $scope.getToDoTendersExcel = function (includeData) {
            getTendersExcel(tenderAppService.getToDoTendersExcel, includeData);
        }

        $scope.getTendersExcel = function () {
            getTendersExcel();
        }

        var getTendersExcel = function (getTendersExcelFunc, includeData) {
            toastr.error('В Excel файл система завантажить не більше 10000 тендерів за обраними Вами параметрами.',
                'Зверніть увагу!', {
                    timeOut: 10000
                });
            if ($scope.pagerSearchFilter.isProductionMode == undefined) {
                $scope.pagerSearchFilter.isProductionMode = $scope.isPM;
            }
            var time = Date.parse($scope.filter.tenderCreationTimeTo) -
                Date.parse($scope.filter.tenderCreationTimeFrom);
            if (!$scope.filter.searchTimeType && isNaN(time)) {
                return toastr
                    .warning('Ви не вказали період створення закупівлі для формування звіту. Оберіть параметр "Дата створення закупівлі" в закладці "Фільтрувати". Зверніть увагу! Ви можете обрати період не більше 360 календарних днів.',
                        'Увага!',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
            }
            if (time > 12 * 30 * 24 * 1000 * 3600) {
                return toastr
                    .warning('Ви вказали параметр "Дата створення закупівель" за період більше 360 календарних днів. ' +
                        'Для формування звіту вкажіть період до 360 календарних днів включно. Оберіть параметр "Дата створення закупівлі" в закладці ' +
                        '"Фільтрувати" в меню "Закупівлі/Плани Prozorro',
                        'Увага!',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
            }
            var pager = {
                Page: 1,
                PageSize: 10000,
                SearchFilter: $scope.pagerSearchFilter,
                OrderDirection: 'desc'
            };
            if (includeData === 'includeArchive')
                pager.SearchFilter.statuses = pager.SearchFilter.statuses.concat(lookupService.getTenderArchiveStatuses);
            $scope.blockDownloadExcel = true;
            var getListOfTenders = (getTendersExcelFunc || tenderAppService.getTendersExcel)(pager);
            abp.ui.setBusy("#myTendersDiv");
            getListOfTenders.then(function (fileName) {
                $http({
                    url: "api/files/DownloadAndDelete",
                    method: "POST",
                    params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                    responseType: 'arraybuffer'
                })
                    .then(function (response) {
                        var file = new Blob([response.data], { type: 'application/octet-stream' });
                        saveAs(file, fileName.data);
                        abp.ui.clearBusy("#myTendersDiv");
                        $scope.blockDownloadExcel = false;
                    }, function (data, status, headers, config) {
                        abp.ui.clearBusy("#myTendersDiv");
                        $scope.blockDownloadExcel = false;
                    });;
            }, function () {
                abp.ui.clearBusy("#myTendersDiv");
                $scope.blockDownloadExcel = false;
            });;
        };

        $scope.hideModal = function () {
            $("#modalUserTenders").modal('hide');
        };

        $scope.$on('userNameChange',
            function (event, user) {
                $scope.user = user;
                $scope.hideColumns = true;
                $scope.tableParams.reload();
            });

        $scope.$on('clearSearch',
            function () {
                $scope.clear();
                $('#searchParameters').collapse('hide');
            });


        $scope.addToFavorites = function (el) {
            var i = el.target;
            $(i).toggleClass('opacity1');
        };

        $scope.customTendTitle = function (title) {
            return tenderHelperService.customTendTitle(title);
        };

        $scope.closeStatDropDown = function () {
            $scope.isStatOpen = false;
        };

        $scope.closeProcTypDropDown = function () {
            $scope.isProcTypOpen = false;
        };



        $scope.isArchiveChanged = function (val) {
            if (val) {
                $scope.statuses = ['unsuccessful', 'complete', 'cancelled'];
                makeSelectedStatusesChecked();
            } else {
                if ($scope.procurementMethod.indexOf("limited") > -1) {
                    $scope.statuses = ['active', 'unsuccessful', 'complete', 'cancelled'];
                } else {
                    $scope.selectedStatuses = $scope.defaultStatuses;
                    makeSelectedStatusesChecked();
                }
            }

            $scope.clear();
            $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);
            $scope.procTypesDictionary = [];

            if ($scope.templateToLoad !== null) {
                $scope.tableParams.page(1);
                $scope.tableParams.reload();
                setSelectedFromTemplate();
            }
        };

        $scope.$watch('isArchive',
            function (n, o) {
                if (n !== o && $scope.templateToLoad !== null) $scope.isArchiveChanged(n);
                $scope.templateToLoad = null;
            });


        $scope.isCrimea = function (region) {
            if (!region || !region.id) return false;
            //АР Крим or Севастополь
            //console.log('region sevas', region.id);
            return (region.id == 1 || region.id == 487) ? true : false;
        }

        //#region Init Classification
        $scope.cleareChildCpv = function (cpvs) {
            classificationSearchService.cleareChildCpv(cpvs, $scope.tenderTableFilter.childCpvs);
        };

        $scope.initClassification = function () {
            classificationSearchService.initClassification($scope, $scope.selectedCpvs);
        }

        // main page width set 
        $scope.setMainPageWidth = function () {
            var preWrapper = document.getElementsByClassName('preWrapper');
            if (preWrapper.length > 0)
                var div = document.getElementsByClassName('preWrapper')[0].className += " mainPageWidth";
        }
        if (!$localStorage.isAuthorized)
            $scope.setMainPageWidth();

        $scope.setBidsFilter = function (filter) {
            if (filter.myBidsOnly) {
                filter.lotsFilter = {
                    statuses: []
                };
                filter.bidsFilter = {
                    statuses: []
                };
            } else {
                clearBidsSearch();
                clearLotsSearch();
            }
        };

        $scope.selectText = function (containerid) {
            siteSettingsService.selectText(containerid);
        }

        function openTabByUrl() {
            if ($window.location.hash.indexOf('open-selective') !== -1) {
                navigationClicked(['open', 'selective']);
                setNavigation('open-selective');
            }
            if ($window.location.hash.indexOf('limited') !== -1) {
                navigationClicked(['limited']);
                setNavigation('limited');
            }
            else if ($window.location.hash.indexOf('plans') !== -1) {
                setNavigation('plans');
            }
            else if ($window.location.hash.indexOf('eCatalog') !== -1) {
                setNavigation('eCatalog');
            }
            else if ($window.location.hash.indexOf('widget') !== -1) {
                setNavigation('widget');
            } else {
                $scope.switchedBlock = 'tenders';
            }   
        }

        $scope.hideModal = function(id) {
            $(id).modal('hide');
        }

        openTabByUrl();

        if ($sessionStorage.isPlansTabOpened) {
            $scope.switchedBlock = 'plans';
        }
    }
})();
;
angular.module('app').directive('tenderTableMain', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/App/Main/base/directives/tender/tenderTable/tenderTableMain.html',
        template: $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTableMain.html'),
        scope: false
    };
}]);

;
angular.module("app").directive('tenderTableMainWithFilter', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            scope: {
                tableParams: '=',
                filter: '=',
                tenders: '='
            },
            template: $templateCache.get('tenderTableMainWithFilter from cache'),
            controller: [
                '$scope',
                'abp.services.etender.tender',
                'abp.services.etender.reference',
                '$sessionStorage',
                '$rootScope',
                'lookupService',
                '$localStorage',
                '$timeout',
                '$cookies',
                '$http',
                'classificationSearchService',
                'tenderHelperService',
                'referenceService',
                function ($scope, tenderAppService, abpReferenceService, $sessionStorage, $rootScope, lookupService, $localStorage, $timeout, $cookies, $http, classificationSearchService, tenderHelperService, referenceService) {
                    $scope.vModel = {
                        checkedRegions: []
                    };
                    
                    $scope.isProductionModeForFilter = true; // isProductionMode
                    $scope.isShowOnlyTendersCreatedOnOurSite = false;

                    $scope.tenderTableFilter = {};
                    $scope.selectedStatuses = [];
                    $scope.selectedLotStatuses = [];
                    $scope.selectedBidStatuses = [];
                    $scope.selectedProcTypes = [];
                    $scope.checkedProcTypes = [];
                    $scope.procTypeSearchText = null;
                    $scope.temporaryOrgCode = '';
                    // regions
                    $scope.vModel.selectedRegions = [];
                    $scope.vModel.checkedRegions = [];
                    $scope.vModel.regionsSearchText = null;
            
                    $scope.checkedStatuses = [];
                    $scope.checkedLotStatuses = [];
                    $scope.checkedBidStatuses = [];
                    $scope.statusSearchText = null;
                    $scope.statusSearchLabel = null;
                    $scope.selectedCpvs = [];
                    $scope.childCpvs = [];
                    $scope.selectedOrgCodes = [];
                    $scope.isArchive = false;
                    $scope.templateToLoad = null;
                    $scope.statusDictionary = [];
                    $scope.filterfromtemplate = false;

                    $scope.searchTimeTypes = GetSearchTimeTypes();

                    $scope.localization = {
                        tenderTitle: $rootScope.source('TenderTitle'),
                        tenderValue: $rootScope.source('TenderValue'),
                        searchById: $rootScope.source('SearchByTenderID'),
                        title: $rootScope.source('TenderTitle'),
                        creationDate: $rootScope.source('CreationDate'),
                        status: $rootScope.source('CreationDate'),
                        completion: $rootScope.source('completion')
                    }

                    $scope.vModel.realTestMode = $localStorage.realTestMode;
                    $scope.showClearFilterButton = false;

                    
                    $scope.archiveStatuses = lookupService.getTenderArchiveStatuses;
                    $scope.defaultStatuses = lookupService.getTenderDefaultStatuses;
                    $scope.statuses = $scope.defaultStatuses.concat($scope.archiveStatuses);

                    var s = new Date();
                    $scope.dateToDay = Date.parse(s);
                    var timer;

                    if (!$sessionStorage.procType) {
                        $sessionStorage.procType = ['open', 'selective'];
                        $scope.procurementMethod = $sessionStorage.procType;
                    } else {
                        $scope.procurementMethod = $sessionStorage.procType;
                    }

                    $scope.hideModal = function(id) {
                        $(id).modal('hide');
                    };

                    $scope.defaultStatuses = lookupService.getTenderDefaultStatuses;
                    var simpleProcType = { id: 15, procurementMethod: 'open', procurementMethodType: 'belowThresholdSimple', procurementMethodTypeDescription: 'Спрощена закупівля', procurementMethodTypeLocal: 'Спрощена закупівля', isSimpleProcurementMethodRationale: false };

                    if ($scope.tenderTableFilter && $scope.tenderTableFilter.userFilter) {
                        $scope.filter = $scope.tenderTableFilter.userFilter;
                    } else {
                        $scope.filter = {
                            title: null,
                            description: null,
                            parentCodesEDRPOU: null,
                            organizationName: null,
                            priceFrom: null,
                            priceTo: null,
                            tenderPeriodStartFrom: null,
                            tenderPeriodStartTo: null,
                            tenderPeriodEndFrom: null,
                            tenderPeriodEndTo: null,
                            classificationCpv: null,
                            dkpp: null,
                            customerRegion: null,
                            searchTimeType: null,
                            myBidsOnly: false,
                            mainProcurementCategory: null,
                            milestoneCodeType: null
                        };
                    }

                    $scope.customTendTitle = function (title) {
                        return tenderHelperService.customTendTitle(title);
                    };

                    $scope.isDateIntervalGood = function (startDate, endDate) {
                        if ((startDate && !(startDate instanceof Date)) || (endDate && !(endDate instanceof Date))) {
                            return false;
                        }
                        if (startDate && endDate) {
                            return startDate.getTime() < endDate.getTime();
                        }
                        return true;
                    };

                    $scope.isIntervalGood = function (startPrice, endPrice) {
                        if (startPrice && endPrice) {
                            return startPrice < endPrice;
                        } else return true;
                    };

                    $scope.isAllDataGood = function () {
                        if ($scope.isIntervalGood($scope.filter.priceFrom, $scope.filter.priceTo) &&
                            $scope.isDateIntervalGood($scope.filter.tenderPeriodStartFrom,
                                $scope.filter.tenderPeriodStartTo) &&
                            $scope.isDateIntervalGood($scope.filter.tenderPeriodStartFrom,
                                $scope.filter.tenderPeriodStartTo) &&
                            $scope.isDateIntervalGood($scope.filter.tenderCreationTimeFrom,
                                $scope.filter.tenderCreationTimeTo))
                            return true;
            
                        else return false;
                    };

                    $scope.search = function () {
                        if ($scope.temporaryOrgCode && !$scope.selectedOrgCodes.find(function (orgCode) { return orgCode === $scope.temporaryOrgCode; })) {
                            $scope.changeSelOrgCodes($scope.temporaryOrgCode, false);
                            $scope.temporaryOrgCode = '';
                        }
                        if ($scope.selectedCpvs && $scope.selectedCpvs.length > 0) {
                            getChildCpvsAndSearchTenders();
                        } else {
                            searchTenders();
                        }
                    };

                    function getChildCpvsAndSearchTenders() {

                        var itemsWithChildren = [];
                        $scope.selectedCpvs.forEach(function (cpvItem) {
                            if (!cpvItem.isOpen && cpvItem.rank < 8 && cpvItem.hasChildren) {
                                itemsWithChildren.push(cpvItem);
                            }
                        });
                        var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);
                        classificationData.then(function (response) {
                            $scope.tenderTableFilter.childCpvs = response.data;
                            searchTenders();
                        });
                    }

                    $scope.changeSelOrgCodes = function (code, remove) {
                        if (code) {
                            if (!remove)
                                $scope.selectedOrgCodes.push(code);
                            else $scope.selectedOrgCodes.splice($scope.selectedOrgCodes.indexOf(code), 1);
                        }
                    };

                    function GetSearchTimeTypes() {
                        var types = [];
                        types.push({ type: "", name: "" });
                        types.push({ type: "today", name: abp.localization.localize("CreationTime_Today", "Shared") });
                        types.push({ type: "yesterday", name: abp.localization.localize("CreationTime_Yesterday", "Shared") });
                        types.push({ type: "lastWeek", name: abp.localization.localize("CreationTime_LastWeek", "Shared") });
                        types.push({ type: "lastMonth", name: abp.localization.localize("CreationTime_LastMonth", "Shared") });
                        return types;
                    }

                    function searchTenders() {
                        if ($scope.mode === 'my') {
                            var mySearchFilter = {
                                UserName: '',
                                PriceFrom: $scope.filter.priceFrom,
                                PriceTo: $scope.filter.priceTo,
                                ProcurementMethod: $scope.procurementMethod,
                                procurementMethodTypes: $scope.selectedProcTypes,
                                regions: $scope.vModel.selectedRegions,
                                statuses: $scope.selectedStatuses.length > 0 ? $scope.selectedStatuses : $scope.statuses,
                                IsStasusesDefaulted: $scope.selectedStatuses.length > 0 ? false : true, // used for cache on server
                                Cpvs: $scope.selectedCpvs.concat($scope.tenderTableFilter.childCpvs),
                                Dkpp: $scope.filter.dkpp,
                                isProductionMode: $scope.isProductionModeForFilter,
                                parentCodesEDRPOU: $scope.selectedOrgCodes || $localStorage.siteSettings.parentCodeEDRPOU,
                                codeEDRPOUs: $scope.edrpouFromParams,
                                Title: $scope.filter.title,
                                OrganizationName: $scope.filter.organizationName,
                                FunderId: $scope.filter.funder ? $scope.filter.funder.id : null,
                                searchTimeType: $scope.filter.searchTimeType,
                                tenderPeriodEndFrom: $scope.filter.tenderPeriodEndFrom,
                                tenderPeriodEndTo: $scope.filter.tenderPeriodEndTo,
                                tenderCreationTimeFrom: $scope.filter.tenderCreationTimeFrom,
                                tenderCreationTimeTo: $scope.filter.tenderCreationTimeTo,
                                tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom,
                                tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo,
                                CustomerRegion: $scope.filter.customerRegion,
                                mainProcurementCategory: $scope.filter.mainProcurementCategory && $scope.filter.mainProcurementCategory.value || null,
                                milestoneCodeType: $scope.filter.milestoneCodeType && $scope.filter.milestoneCodeType.value || null,
                                myBidsOnly: $scope.filter.myBidsOnly || false,
                                bidsFilter: $scope.filter.bidsFilter || null,
                                lotsFilter: $scope.filter.lotsFilter || null
                            };
                        } else {
                            setPagerSearchFilter();
                            $scope.putDataToSessionStorage();
                            if ($scope.vModel.searchString) {
                                saveObjIntoCookies($scope.vModel.searchString);
                            }
                            $scope.tenderTableFilter.userFilter = $scope.filter;
                            $scope.tenderTableFilter.userSelectedStatuses = $scope.selectedStatuses;
                            $scope.tenderTableFilter.userSelectedProcTypes = $scope.selectedProcTypes;
                            $scope.tenderTableFilter.userSelectedRegions = $scope.vModel.selectedRegions;
                            $scope.tenderTableFilter.userSelectedCpvs = $scope.selectedCpvs;
                            $scope.tenderTableFilter.userSelectedOrgCodes = $scope.selectedOrgCodes;
                            if (simpleProcType.isSimpleProcurementMethodRationale) {
                                $scope.tenderTableFilter.userSelectedProcTypes.push(simpleProcType.procurementMethodType);
                            }
                        }
                        if ($scope.tableParams.page() !== 1) {
                            $scope.tableParams.page(1);
                        } else {
                            $scope.tableParams.reload();
                        }
                        $scope.savedObjList = $scope.getObjFromCookies();
                        $scope.getClearFilterButton();
                    }

                    function setPagerSearchFilter() {
                        var childCpvs = $scope.tenderTableFilter.childCpvs;
            
                        var cpvList = [];
                        if (!childCpvs) childCpvs = [];
                        $scope.selectedCpvs.concat(childCpvs)
                            .forEach(function (cpv) {
                                var code = cpv.code ? cpv.code : cpv;
                                if (cpvList.indexOf(code) === -1) {
                                    cpvList.push(code);
                                }
                            });
                        if ($scope.selectedStatuses.length > 0) makeSelectedStatusesChecked();
                        $scope.generatePagerSearchFilter(cpvList);
            
                        // встановлюємо обрані статуси лотов
                        if ($scope.filter.lotsFilter &&
                            $scope.filter.lotsFilter.statuses &&
                            $scope.filter.lotsFilter.statuses.length > 0) {
                            $scope.selectedLotStatuses = $scope.filter.lotsFilter.statuses;
                            makeSelectedLotStatusesChecked();
                        }
                        // встановлюємо обрані статуси бідов
                        if ($scope.filter.bidsFilter &&
                            $scope.filter.bidsFilter.statuses &&
                            $scope.filter.bidsFilter.statuses.length > 0) {
                            $scope.selectedBidStatuses = $scope.filter.bidsFilter.statuses;
                            makeSelectedBidStatusesChecked();
                        }
            
                    }

                    function makeSelectedStatusesChecked() {
                        if ($scope.selectedStatuses.length > 0) {
                            angular.forEach($scope.statusDictionary,
                                function (stat) {
                                    if ($scope.selectedStatuses
                                        .indexOf(stat.name) >
                                        -1) $scope.checkedStatuses[$scope.statusDictionary.indexOf(stat)] = true;
                                });
                            makeStatusSearchText();
                            makeStatusSearchLabel();
                        }
                    }

                    function makeStatusSearchText() {
                        $scope.statusSearchText = null;
                        angular.forEach($scope.selectedStatuses,
                            function (status) {
                                angular.forEach($scope.statusDictionary,
                                    function (dict) {
                                        if (dict.name === status &&
                                            (!$scope.statusSearchText ||
                                                $scope.statusSearchText.indexOf(dict.description) === -1))
                                            $scope
                                                .statusSearchText =
                                                $scope.statusSearchText ? 
                                                    $scope.statusSearchText + dict.description + '; ' : 
                                                    dict.description + '; ';
                                    });
                            });
                    }

                    function makeStatusSearchLabel() {
                        $scope.statusSearchLabel = null;
                        if ($scope.selectedStatuses.length === 1)
                            angular.forEach($scope.statusDictionary,
                                function (dict) {
                                    if (dict.name === $scope.selectedStatuses[0])
                                        $scope.statusSearchLabel = dict.label;
                                });
                    }

                    $scope.getProcTypes = function () {
                        getProcTypes();
                        function getProcTypes() {
                            var arr = [{
                                id: 3,
                                procurementMethod: "limited",
                                procurementMethodType: "reporting",
                                procurementMethodTypeDescription: "Закупівля без використання електронної системи",
                                procurementMethodTypeLocal: "Закупівля без використання електронної системи"
                            }];
                            $scope.procTypesDictionary = arr;
                            $scope.checkedProcTypes.length = $scope.procTypesDictionary.length;
                            $scope.checkedProcTypes.fill(false);
                            makeSelectedProcTypesChecked();
                        }
                    };

                    $scope.getTenderProcedureType = function (tender) {
                        if (!tender) return null;
                        return lookupService.getTenderProcedureType(tender.procurementMethodType);
                    };

                    $scope.getLabelClassByStatus = function (status) {
                        return lookupService.getTenderLabelClass(status);
                    };

                    function procurementMethodChanged(val) {
                        setStatuse(val);
            
                        $scope.procTypesDictionary = [];
            
                        if ($scope.templateToLoad !== null) { //&& !archiveChanged
                            $scope.tableParams.page(1);
                            $scope.tableParams.reload();
                            setSelectedFromTemplate();
                        }
                    };
                    $scope.$watch('procurementMethod',
                        function (n, o) {
                            if (n !== o && $scope.templateToLoad !== null) procurementMethodChanged(n);
                        });

                    $scope.changeSelCpvs = function (cpv, remove) {
                        if (cpv) {
                            if (!remove) {
                                if ($scope.selectedCpvs.indexOf(cpv) === -1)
                                    $scope.selectedCpvs.push(cpv);
                            } else $scope.selectedCpvs.splice($scope.selectedCpvs.indexOf(cpv), 1);
                        }
                    }

                    $scope.changeSelection = function (st, checked) {
                        if (!st) {
                            $scope.selectedStatuses = [];
                            $scope.checkedStatuses = [];
                            $scope.statusSearchText = null;
                            $scope.statusSearchLabel = null;
                        } else {
                            if (checked) $scope.selectedStatuses.push(st.name);
                            else $scope.selectedStatuses.splice($scope.selectedStatuses.indexOf(st.name), 1);
                            makeStatusSearchText();
                            makeStatusSearchLabel();
                        }
                    };

                    $scope.setProcTypesChecked = function () {
                        if ($scope.tenderTableFilter && $scope.tenderTableFilter.userSelectedProcTypes &&
                            $scope.tenderTableFilter.userSelectedProcTypes !== '') {
                            $scope.selectedProcTypes = $scope.tenderTableFilter.userSelectedProcTypes;
                            if (!$scope.procTypesDictionary) $scope.getProcTypes();
                            makeSelectedProcTypesChecked();
                        }
                    };
                    $scope.setProcTypesChecked();

                    $scope.changeSelProcTypes = function (procType, checked) {
                        if (procType) {
                            if (checked) {
                                $scope.selectedProcTypes.push(procType.procurementMethodType);
                            } else {
                                $scope.selectedProcTypes.splice($scope.selectedProcTypes.indexOf(procType.procurementMethodType), 1);
                            }
                            makeProcTypeSearchText();
                        } else if (checked) {
                            $scope.selectedProcTypes = [];
                            $scope.checkedProcTypes = [];
                            $scope.procTypeSearchText = null;
                        }
                    };

                    function makeSelectedProcTypesChecked() {
                        if ($scope.selectedProcTypes.length > 0) {
                            if ($scope.procTypesDictionary.length === 0) $scope.getProcTypes();
                            angular.forEach($scope.procTypesDictionary,
                                function (procType) {
                                    if ($scope.selectedProcTypes.indexOf(procType.procurementMethodType) > -1)
                                        $scope.checkedProcTypes[$scope.procTypesDictionary.indexOf(procType)] = true;
                                });
                            makeProcTypeSearchText();
                        }
                    }

                    function makeProcTypeSearchText() {
                        $scope.procTypeSearchText = null;
                        angular.forEach($scope.selectedProcTypes,
                            function (pType) {
                                angular.forEach($scope.procTypesDictionary,
                                    function (dict) {
                                        if (dict.procurementMethodType === pType &&
                                            (!$scope.procTypeSearchText ||
                                                $scope.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                                            $scope
                                                .procTypeSearchText =
                                                $scope.procTypeSearchText
                                                    ? $scope.procTypeSearchText + dict.procurementMethodTypeLocal + '; '
                                                    : dict.procurementMethodTypeLocal + '; ';
                                    });
                            });
                        angular.forEach($scope.selectedProcTypes, function (simpleProc) {
                            if (simpleProc == 'simple') {
                                return simpleProcType.isSimpleProcurementMethodRationale = true;
                            }
                            return simpleProcType.isSimpleProcurementMethodRationale = false;
                        });
                    }
                    
                    $scope.filterProcTypes = function (procTypes) {
                        return procTypes.filter(function (pt) {
                            //return pt.procurementMethod === $scope.procurementMethod;
                            return $scope.procurementMethod.indexOf(pt.procurementMethod) > -1;
                        });
                    };

                    $scope.generatePagerSearchFilter = function (cpvList) {
                        $scope.pagerSearchFilter = {
                            PriceFrom: $scope.filter.priceFrom || null,
                            PriceTo: $scope.filter.priceTo || null,
                            ProcurementMethod: ["limited"],
                            procurementMethodTypes: $scope.selectedProcTypes || [],
                            regions: $scope.vModel.selectedRegions || null,
                            statuses: getStatusesForPageSearch(),
                            IsStasusesDefaulted: $scope.selectedStatuses.length > 0 ? false : true, // used for cache on server
                            Cpvs: cpvList || $scope.cpvsFromParams || [],
                            Dkpp: $scope.filter.dkpp || null,
                            isProductionMode: $scope.isProductionModeForFilter || null,
                            parentCodesEDRPOU: $localStorage.siteSettings && $localStorage.siteSettings.parentCodeEDRPOU && [$localStorage.siteSettings.parentCodeEDRPOU] ||
                                $scope.findByEdrpou && [$scope.findByEdrpou] || $scope.selectedOrgCodes || $localStorage.siteSettings.parentCodeEDRPOU || [],
                            codeEDRPOUs: $scope.edrpouFromParams || null,
                            Title: $scope.filter.title || null,
                            OrganizationName: $scope.filter.organizationName || null,
                            FunderId: $scope.filter.funder && $scope.filter.funder.id || $scope.filter.funderId || null,
                            searchTimeType: $scope.filter.searchTimeType || null,
                            tenderPeriodEndFrom: $scope.filter.tenderPeriodEndFrom || null,
                            tenderPeriodEndTo: $scope.filter.tenderPeriodEndTo || null,
                            tenderCreationTimeFrom: $scope.filter.tenderCreationTimeFrom || null,
                            tenderCreationTimeTo: $scope.filter.tenderCreationTimeTo,
                            tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom || null,
                            tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo || null,
                            CustomerRegion: $scope.filter.customerRegion || null,
                            isShowOnlyTendersCreatedOnOurSite: $scope.isShowOnlyTendersCreatedOnOurSite || false,
                            mainProcurementCategory: $scope.filter.mainProcurementCategory && $scope.filter.mainProcurementCategory.value || null,
                            milestoneCodeType: $scope.filter.milestoneCodeType || null,
                            myBidsOnly: $scope.filter.myBidsOnly || false,
                            bidsFilter: $scope.filter.bidsFilter || null,
                            lotsFilter: $scope.filter.lotsFilter || null,
                            isCovid19: $scope.filter.isCovid19,
                            isDirectOrder: $scope.filter.isDirectOrder,
                            IsRealTendersForTestMode: !$rootScope.isIframe ? $scope.vModel.realTestMode : true
                        };
                    };
                    
                    $scope.getStatusDictionary = function (statuses) {
                        var statusDict = [];
                        angular.forEach(statuses,
                            function (st, key) {
                                var description = getTenderDescriptionByStatus(st, '');
                                var label = lookupService.getTenderLabelClass(st);
                                statusDict.push({
                                    name: st,
                                    description: description,
                                    label: label
                                });
                            });
                        return statusDict;
                    };
                    $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);

                    $scope.generatePagerSearchFilter();

                    function getStatusesForPageSearch() {
                        return $scope.selectedStatuses.length > 0 ? $scope.selectedStatuses : setStatuse($sessionStorage.procType);
                    }

                    function setStatuse(val) {

                        if (window.location.href.indexOf('toDoTenders') === -1) {
                            $scope.statuses = ['active', 'unsuccessful', 'complete', 'cancelled'];
                        }
                        $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);
                        return $scope.statuses;
                    }

                    function makeSelectedLotStatusesChecked() {
                        if ($scope.selectedLotStatuses && $scope.selectedLotStatuses.length > 0) {
                            angular.forEach($scope.statusLotDictionary,
                                function (stat) {
                                    if ($scope.selectedLotStatuses
                                        .indexOf(stat.name) >
                                        -1) $scope.checkedLotStatuses[$scope.statusLotDictionary.indexOf(stat)] = true;
                                });
                            makeStatusLotSearchText();
                            makeStatusLotSearchLabel();
                        }
                    }

                    function makeStatusLotSearchText() {
                        $scope.statusLotSearchText = null;
                        angular.forEach($scope.filter.lotsFilter.statuses,
                            function (status) {
                                angular.forEach($scope.statusLotDictionary,
                                    function (dict) {
                                        if (dict.name === status &&
                                            (!$scope.statusLotSearchText ||
                                                $scope.statusLotSearchText.indexOf(dict.description) === -1))
                                            $scope.statusLotSearchText =
                                                $scope.statusLotSearchText ? $scope.statusLotSearchText + dict.description + '; '
                                                    : dict.description + '; ';
                                    });
                            });
                    }

                    function makeStatusLotSearchLabel() {
                        $scope.statusLotSearchLabel = null;
                        if ($scope.filter.lotsFilter.statuses.length === 1)
                            angular.forEach($scope.statusLotDictionary,
                                function (dict) {
                                    if (dict.name === $scope.filter.lotsFilter.statuses[0])
                                        $scope.statusLotSearchLabel = dict.label;
                                });
                    }

                    $scope.putDataToSessionStorage = function () {
                        $sessionStorage.tenderTableSearchString = $scope.vModel.searchString;
                    };

                    function saveObjIntoCookies(srchStr) {
                        var exp = new Date(s.getFullYear(), s.getMonth() + 2, s.getDate());
                        var savedObjList = $cookies.getObject('savedObjList') ? $cookies.getObject('savedObjList') : [];
                        var equal = null;
                        angular.forEach(savedObjList,
                            function (obj, key) {
                                if (!obj.objValue || obj.objValue == '') {
                                    savedObjList.splice(savedObjList.indexOf(obj), 1);
                                }
                                if (obj.objValue === srchStr) {
                                    equal = obj.objValue;
                                }
                            });
                        var cookindex = (savedObjList != null && savedObjList != '') ? savedObjList.length : 0;
                        if (cookindex > 9) {
                            savedObjList.shift();
                            cookindex = savedObjList.length;
                        }
                        if (srchStr.length > 2 && equal == null) {
                            //var objKey = 'searchObject' + cookindex.toString();
                            var objValue = srchStr;
                            savedObjList.push({ 'objValue': objValue });
                            $cookies.putObject('savedObjList', savedObjList, { 'expires': exp });
                        }
                    }

                    $scope.getObjFromCookies = function () {
                        var savedObjList = [];
                        $timeout.cancel(timer);
                        timer = $timeout(function () {
                            var cookiesList = $cookies.getObject('savedObjList') ? $cookies.getObject('savedObjList')
                                : [];
                            //console.log(cookiesList);
                            angular.forEach(cookiesList,
                                function (cook, key) {
                                    savedObjList.push(cook.objValue || '');
                                });
                        },
                            0);
                        //console.log(savedObjList);
                        return savedObjList;
                    };

                    function getTenderDescriptionByStatus(status, procurementMethodType) {
                        return lookupService.getTenderStatusDesc(status, procurementMethodType);
                    }

                    $scope.getTenderDescriptionByStatusForInTable = function (tender) {
                        if (tender) {
                            var status = getTenderDescriptionByStatus(tender.status, tender.procurementMethodType, tender.notExport);
                            if (status.indexOf($rootScope.source('Negotiation')) > -1)
                                status = 'Активна закупівля';
                            return status;
                        }
                    };

                    $scope.clear = function (savedFilter) {
                        $scope.vModel.searchString = null;
                        $scope.filter = {
                            title: savedFilter && savedFilter.title || null,
                            description: null,
                            parentCodesEDRPOU: null,
                            organizationName: null,
                            priceFrom: null,
                            priceTo: null,
                            tenderPeriodStartFrom: null,
                            tenderPeriodStartTo: null,
                            tenderPeriodEndFrom: null,
                            tenderPeriodEndTo: null,
                            classificationCpv: null,
                            dkpp: null,
                            customerRegion: null,
                            searchTimeType: null,
                            mainProcurementCategory: null,
                            milestoneCodeType: null
                        };
                        $rootScope.$broadcast('clearFunder', true);
            
                        $scope.selectedStatuses = [];
                        $scope.checkedStatuses = [];
                        $scope.statusSearchText = null;
                        $scope.statusSearchLabel = null;
            
                        $scope.selectedProcTypes = [];
                        $scope.checkedProcTypes = [];
                        $scope.procTypeSearchText = null;
                        $scope.vModel.selectedRegions = [];
                        $scope.vModel.checkedRegions = [];
                        $scope.vModel.regionsSearchText = null;
                        $scope.selectedOrgCodes = savedFilter && savedFilter.selectedOrgCodes || [];
                        $scope.tenderTableFilter.childCpvs = [];
                        $scope.tenderTableFilter.userFilter = $scope.filter;
                        $scope.tenderTableFilter.userSelectedStatuses = $scope.selectedStatuses;
                        $scope.tenderTableFilter.userSelectedProcTypes = $scope.selectedProcTypes;
                        $scope.tenderTableFilter.userSelectedRegions = $scope.vModel.selectedRegions;
                        $scope.tenderTableFilter.userSelectedCpvs = $scope.selectedCpvs;
                        $scope.tenderTableFilter.userSelectedOrgCodes = $scope.selectedOrgCodes;
                        $scope.pagerSearchFilter.Cpvs = [];
                        if ($scope.selectedCpvs.length > 0)
                            clearSelectedCpvs();
                        //if ($localStorage && $localStorage.siteSettings && $localStorage.siteSettings.parentCodeEDRPOU && !saveEdrpou)
                        //    $localStorage.siteSettings.parentCodeEDRPOU = null;
                        clearBidsSearch();
                        clearLotsSearch();

                        $scope.generatePagerSearchFilter();
                        $scope.$emit('onClearFilter', $scope.pagerSearchFilter);
                    };
                    function clearBidsSearch() {
                        $scope.filter.myBidsOnly = false;
                        $scope.filter.bidsFilter = null;
                        $scope.checkedBidStatuses = [];
                        $scope.statusBidSearchText = null;
                        $scope.statusBidSearchLabel = null;
                    }
            
                    function clearLotsSearch() {
                        $scope.filter.lotsFilter = null;
                        $scope.checkedLotStatuses = [];
                        $scope.statusLotSearchText = null;
                        $scope.statusLotSearchLabel = null;
                    }
            
                    function clearSelectedCpvs() {
                        $scope.selectedCpvs = [];
                        $rootScope.clearCheckbox();
                    }
                    $scope.clearAllFiltersAndTmpl = function () {
                        $('#modalClassifications').removeData('bs.modal');
                        $scope.clear();
                        $scope.search();
                    };

                    $scope.cleareChildCpv = function (cpvs) {
                        classificationSearchService.cleareChildCpv(cpvs, $scope.tenderTableFilter.childCpvs);
                    };
                    $scope.initClassification = function () {
                        classificationSearchService.initClassification($scope, $scope.selectedCpvs);
                    };

                    $scope.getClearFilterButton = function () {
                        if ($scope.pagerSearchFilter.Cpvs.length === 0 &&
                            !$scope.pagerSearchFilter.CustomerRegion &&
                            !$scope.pagerSearchFilter.Dkpp &&
                            !$scope.pagerSearchFilter.FunderId &&
                            !$scope.pagerSearchFilter.OrganizationName &&
                            !$scope.pagerSearchFilter.PriceFrom &&
                            !$scope.pagerSearchFilter.PriceTo &&
                            angular.equals($scope.pagerSearchFilter.statuses, $scope.statuses) &&
                            angular.equals($scope.pagerSearchFilter.ProcurementMethod, ["limited"]) &&
                            !$scope.pagerSearchFilter.Title &&
                            !$scope.pagerSearchFilter.codeEDRPOUs &&
                            !$scope.pagerSearchFilter.isShowOnlyTendersCreatedOnOurSite &&
                            $scope.pagerSearchFilter.parentCodesEDRPOU.length === 0 &&
                            $scope.pagerSearchFilter.procurementMethodTypes.length === 0 &&
                            $scope.pagerSearchFilter.regions.length === 0 &&
                            !$scope.pagerSearchFilter.searchTimeType &&
                            !$scope.pagerSearchFilter.tenderCreationTimeFrom &&
                            !$scope.pagerSearchFilter.tenderPeriodEndFrom &&
                            !$scope.pagerSearchFilter.tenderPeriodEndTo &&
                            !$scope.pagerSearchFilter.tenderPeriodStartFrom &&
                            !$scope.pagerSearchFilter.tenderPeriodStartTo &&
                            !$scope.vModel.searchString &&
                            !$scope.pagerSearchFilter.myBidsOnly &&
                            !$scope.pagerSearchFilter.mainProcurementCategory &&
                            !$scope.pagerSearchFilter.milestoneCodeType &&
                            !$scope.ifAnyIsDefultTmpltsFltr &&
                            !$scope.pagerSearchFilter.milestoneCodeType &&
                            !$scope.pagerSearchFilter.isCovid19 &&
                            !$scope.pagerSearchFilter.isDirectOrder) {
                                $scope.showClearFilterButton = false;
                                return;
                        }
                        $scope.showClearFilterButton = true;
                    };

                    if ($rootScope.isIframe) {
                        $scope.edrpouFromParams = getArrayFromParams($localStorage.siteSettings.codeEDRPOU);
                        $scope.cpvsFromParams = getArrayFromParams($localStorage.siteSettings.codeCPVS);
            
                        $scope.isProductionModeForFilter = true;
                        $scope.pagerSearchFilter = {
                            codeEDRPOUs: $scope.edrpouFromParams,
                            parentCodesEDRPOU: $localStorage.siteSettings.parentCodeEDRPOU,
                            isProductionMode: $scope.isProductionModeForFilter
                        };
                    } else {
                        if ($localStorage.isAuthorized) {
                            $scope.isProductionModeForFilter = $localStorage.isProdMode;
                            $scope.pagerSearchFilter.isProductionMode = $scope.isProductionModeForFilter;
                        }
                    }
                    if ($localStorage.isUserNotIdentified == null)
                        IsUserNotIdentified();
                    else {
                        $scope.vModel.isUserNotIdentified = $localStorage.isUserNotIdentified;
                        $scope.vModel.realTestMode = $localStorage.realTestMode;
                    }

                    function IsUserNotIdentified() {
                        if (!$localStorage.isAuthorized || $localStorage.isProdMode === true || $localStorage.userTenantId == null || $localStorage.userTenantId == undefined) {
                            $scope.vModel.isUserNotIdentified = false;
                        }
                        else {
                            $scope.vModel.isUserNotIdentified = $localStorage.isOrganizationApproved == null || $localStorage.isOrganizationApproved == undefined || $localStorage.isOrganizationApproved === false;
                        }
                        $scope.vModel.realTestMode = $scope.vModel.isUserNotIdentified;
                        $localStorage.isUserNotIdentified = $scope.vModel.isUserNotIdentified;
                        $localStorage.realTestMode = $scope.vModel.isUserNotIdentified;
                    }

                    $scope.$watch('tenderTableFilter.childCpvs', function (cpvs) {
                        if (cpvs != null) {
                            $scope.$emit('cpvsList', $scope.pagerSearchFilter.Cpvs);
                        }
                    }, true);
                    $scope.$watch('selectedStatuses', function (status) {
                        $scope.pagerSearchFilter.statuses = status;
                    }, true);
                    $scope.$watch('filter', function (pagerFilter) {
                        if (pagerFilter != null) {
                            $scope.generatePagerSearchFilter();
                            $scope.$emit('filterChange', $scope.pagerSearchFilter);
                        }
                    }, true);

                    // ******* is Authorized*******
                    $scope.isAuthorized = function () {
                        return $localStorage.isAuthorized;
                    };

                    $scope.getTendersExcel = function () {
                        getTendersExcel(tenderAppService.getDirectOfferTendersExcel);
                    }

                    var getTendersExcel = function (getTendersExcelFunc, includeData) {
                        toastr.error('В Excel файл система завантажить не більше 10000 тендерів за обраними Вами параметрами.',
                            'Зверніть увагу!', {
                            timeOut: 10000
                        });
                        $scope.pagerSearchFilter.UserEdrpou = $localStorage.codeOfOrganization;
                        $scope.pagerSearchFilter.MyOrders = true;
                        var time = Date.parse($scope.filter.tenderCreationTimeTo) -
                            Date.parse($scope.filter.tenderCreationTimeFrom);
                        if (!$scope.filter.searchTimeType && isNaN(time)) {
                            return toastr
                                .warning('Ви не вказали період створення закупівлі для формування звіту. Оберіть параметр "Дата створення закупівлі" в закладці "Фільтрувати". Зверніть увагу! Ви можете обрати період не більше 360 календарних днів.',
                                    'Увага!',
                                    {
                                        closeButton: true,
                                        timeOut: 0,
                                        extendedTimeOut: 0
                                    });
                        }
                        if (time > 12 * 30 * 24 * 1000 * 3600) {
                            return toastr
                                .warning('Ви вказали параметр "Дата створення закупівель" за період більше 360 календарних днів. ' +
                                    'Для формування звіту вкажіть період до 360 календарних днів включно. Оберіть параметр "Дата створення закупівлі" в закладці ' +
                                    '"Фільтрувати" в меню "Закупівлі/Плани Prozorro',
                                    'Увага!',
                                    {
                                        closeButton: true,
                                        timeOut: 0,
                                        extendedTimeOut: 0
                                    });
                        }
                        var pager = {
                            Page: 1,
                            PageSize: 10000,
                            SearchFilter: $scope.pagerSearchFilter,
                            OrderDirection: 'desc'
                        };
                        if (includeData === 'includeArchive')
                            pager.SearchFilter.statuses = pager.SearchFilter.statuses.concat(lookupService.getTenderArchiveStatuses);
                        $scope.blockDownloadExcel = true;
                        var getListOfTenders = (getTendersExcelFunc || tenderAppService.getTendersExcel)(pager);
                        abp.ui.setBusy("#myTendersDiv");
                        getListOfTenders.then(function (fileName) {
                            $http({
                                url: "api/files/DownloadAndDelete",
                                method: "POST",
                                params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                                responseType: 'arraybuffer'
                            })
                                .then(function (response) {
                                    var file = new Blob([response.data], { type: 'application/octet-stream' });
                                    saveAs(file, fileName.data);
                                    abp.ui.clearBusy("#myTendersDiv");
                                    $scope.blockDownloadExcel = false;
                                }, function (data, status, headers, config) {
                                    abp.ui.clearBusy("#myTendersDiv");
                                    $scope.blockDownloadExcel = false;
                                });;
                        }, function () {
                            abp.ui.clearBusy("#myTendersDiv");
                            $scope.blockDownloadExcel = false;
                        });;
                    };
                }
            ]
        };
    }
]);;
angular.module('app').directive('tenderTableIfraim', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderTable/tenderTableIfraim/tenderTableIfraim.html',
        scope: false
    };
});

;
//Не знаю зачем это здесь, в проекте не используется
angular.module('filters', []).
filter('numberWithSpaces',['$filter', function ($filter) {
    return function (input, fractionSize) {
        if (isNaN(input)) {
            return input;
        } else {
            return $filter('number')(input, fractionSize).replace(/,/g, " ");;
        };
    };
}]);

//повертає колекцію даних відсортовану у зворотньому порядку
angular.module('filters', []).
    filter('reverse', ['$filter', function ($filter) {
        return function (items) {
            return items.slice().reverse();
        };
    }]);

// убираем нули после запятой, если целое - добавляем два нуля
angular.module('filters', []).
filter('numberDecimal', ['$filter', function ($filter) {
    return function (input) {
        if (input === 0)
            return $filter('number')(input, 2);
        if (!input) return;
        if (isNaN(input)) {
            return input;
        } 
        if (parseFloat(input).toFixed() == input) {
            return $filter('number')(input, 2); 
        } else {
            var s = input.toString();
            var n = s.length - s.indexOf('.') - 1;
            return $filter('number')(input, n > 2 ? n : 2); // считаем сколько знаков после запятой (чтобы не обрезать) и используем это число как точность
        };
    };
}]);;
angular.module('app').service('activateNavigationService', [
    '$rootScope',
    'menuPressService',
    function ($rootScope, menuPressService) {
        return new function () {

            this.activateNavigation = function ($scope) {

                $scope.questionsLength = function () {
                    if (!$scope.detailes.questions) return [];
                    var length = $scope.detailes.questions.length;
                    var questions = 0;
                    for (i = 0; i < length; i++) {
                        if ($scope.detailes.questions[i].isExported && $scope.detailes.questions[i].isOwn || !$scope.detailes.questions[i].isOwn)
                            questions = questions + 1;
                    };
                    return questions;
                }

                $scope.navigation = [
                    {
                        title: $rootScope.source('DescriptionPurchases'),
                        type: 'menuAboutBlock',
                        active: true,
                        show: true,
                        openFunc: function () {
                            menuPressService.menuPress('menuAboutBlock', $scope);
                        }
                    }, {
                        title: $rootScope.source('Question'),
                        type: 'menuQuestionsBlock',
                        active: false,
                        show: !$scope.detailes.isLimitedReporting && $scope.detailes.procurementMethodType !== 'closeFrameworkAgreementSelectionUA',
                        count: $scope.questionsLength(),
                        openFunc: function () {
                            menuPressService.menuPress('menuQuestionsBlock', $scope);
                        }
                    }, {
                        title: $rootScope.source('ClaimsComplaints'),
                        type: 'menuComplainBlock',
                        active: false,
                        show: !$scope.detailes.isLimitedReporting && $scope.detailes.procurementMethodType !== 'closeFrameworkAgreementSelectionUA',
                        count: $scope.vm.complaintsCount || 0,
                        openFunc: function () {
                            menuPressService.menuPress('menuComplainBlock', $scope);
                        }
                    },
                    {
                        title: 'Dozorro',
                        type: 'menuDozorroBlock',
                        active: false,
                        show: true,
                        openFunc: function () {
                            menuPressService.menuPress('menuDozorroBlock', $scope);
                        }
                    },
                    {
                        title: 'Держаудитслужба України',
                        type: 'menuDasuBlock',
                        active: false,
                        show: true,
                        openFunc: function () {
                            menuPressService.menuPress('menuDasuBlock', $scope);
                        }
                    }
                ];
                    // $scope.specialProgectSettings();
            }
        }
    }
]);
angular.module('app').
    service('addFeaturesService', ['specialDataService', function (specialDataService) {
        return new function () {

            this.setFeatureValue = function (f) {
                if (f.options.length === 0) {
                    f.value = null;
                    return '';
                }
                var array = [];
                for (var i = 0; i < f.options.length; i += 1) {
                    array.push(f.options[i].value);
                }
                f.value = Math.max.apply(null, array);
                return Math.max.apply(null, array);
            };

            this.checkFeatureSum = function (data, maxValue) {
                maxValue = getMaxValue(data, maxValue);
                var tFeatures = data.features.map(function (f){return f;});
                if (getFeatureSum(tFeatures) > maxValue) return false;


                for (var i = 0; i < data.lots.length; i ++) {
                    var lot = data.lots[i];
                    var features = tFeatures.concat(lot.features);
                    for (var j = 0; j < lot.items.length; j += 1) {
                        var item = lot.items[j];
                        features = features.concat(item.features);
                    }
                    if (getFeatureSum(features) > maxValue) return false;
                }
                return true;
            };

            this.checkLotFeatureSum = function (lot, data, maxValue) {
                maxValue = getMaxValue(data, maxValue);
                var tFeatures = data.features.map(function (f){return f;});
                if (getFeatureSum(tFeatures) > maxValue) return false;


                var features = tFeatures.concat(lot.features);
                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    features = features.concat(item.features);
                }
                if (getFeatureSum(features) > maxValue) return false;
                return true;
            };

            function getMaxValue(data, maxValue) {
                if (data.procurementMethodType === 'esco') return 25;
                return maxValue ? maxValue : specialDataService.ableFeatureSum;
            }

            function getFeatureSum(features) {
                var fSum = features.reduce(function (sum, f) {
                    return sum + parseInt(f.value !== null ? f.value : 0);
                }, 0);
                return fSum;
            };

            function getAllFeatures(data) {
                var allFeatures = [];
                var tenderFeatures = data.features.map(function (f) { return f; });
                var lotsFeatures = [];
                var itemsFeatures = [];
                for (var i = 0; i < data.lots.length; i++) {
                    var lot = data.lots[i];
                    lotsFeatures.push.apply(lotsFeatures, lot.features);
                    for (var j = 0; j < lot.items.length; j++) {
                        var item = lot.items[j];
                        itemsFeatures.push.apply(itemsFeatures, item.features);
                    }
                }
                allFeatures = tenderFeatures.concat(lotsFeatures, itemsFeatures);
                return allFeatures;
            }

            this.checkFeaturesValue = function (feature, data) {
                var allFeatures = getAllFeatures(data);
                for (var i = 0; i < allFeatures.length; i++) {
                    if (allFeatures[i].sectorName !== feature.sectorName &&
                        allFeatures[i].value === feature.value)
                        return true;
                }
                return false;
            }

            this.checkFeatureSumCreateUpdate = function (model, sum) {
                if (!sum) var sum = specialDataService.ableFeatureSum;

                var tFeatures = model.features.map(function (f) {
                    return f;
                });

                if (this.getFeatureSumCreateUpdate(tFeatures) > sum) return false;

                for (var i = 0; i < model.lots.length; i += 1) {
                    var lot = model.lots[i];
                    var features = tFeatures.concat(lot.features);

                    for (var j = 0; j < lot.items.length; j += 1) {
                        var item = lot.items[j];
                        features = features.concat(item.features);
                    }

                    if (this.getFeatureSumCreateUpdate(features) > sum) return false;
                }

                return true;
            }

            this.getFeatureSumCreateUpdate = function (features) {
                var fSum = features.reduce(function (sum, f) {
                    return sum + parseInt(f.value);
                }, 0);

                return fSum;
            }

            this.checkFeatureCreateUpdate = function (feature) {
                if (feature.options.length === 0) return false;

                var ov = feature.options.map(function (o) {
                    return parseInt(o.value);
                });
                if (Math.max.apply(null, ov) > feature.value) return false;

                return true;
            }

            this.checkFeaturesNotFilled = function (options) {
                var sOptionNotFilled = options.find(function (option) {
                    return !option.soption;
                });

                if (sOptionNotFilled) {
                    return true;
                } else {
                    return false;
                }
            };

        };
    }]);;
angular.module('app').service('awardValidationService', ['lookupService', function (lookupService) {
        return new function () {
            function priceCheck(userPriceInput, modelPriceValue) {
                if (userPriceInput == 0 || userPriceInput > modelPriceValue)
                    return false;
                return true;
            }
            function priceMultiplierCheck(userPriceInput, modelPriceValue) {
                var priceMultiplier = 5;
                if (userPriceInput > (modelPriceValue * priceMultiplier) || userPriceInput < (modelPriceValue / priceMultiplier))
                    return false;
                return true;
            }
            this.priceValidation = function (model, isScopeMethodLimited) {
                var v = parseFloat(model.ac.value);
                if (lookupService.isLimitedReporting(isScopeMethodLimited)) {
                    return priceMultiplierCheck(v, model.value.amount);
                } else {
                    return priceCheck(v, model.value.amount);
                }
            }
        }
    }
]);;
angular.module('app').
    service('bidDocumentTypeService', ['lookupService', function (lookupService) {
        return new function () {
            this.getDocTypeByBidProperties = function (tender, bid, documentTypes) {
                var docTypesToUpload = [];
                if (bid.isMyBid) {
                    if (bid.canLoadFilesFor24hMilestone && bid.canLoadFilesForAlpMilestone) {
                        docTypesToUpload = documentTypes.bidDocument.filter(function (docType) {
                            return [
                                'commercialProposal',
                                'billOfQuantity',
                                'eligibilityDocuments',
                                'technicalSpecifications',
                                'contractGuarantees'
                            ].every(function (type) {
                                return type !== docType.type;
                            });
                        });
                    }
                    else if (bid.canLoadFilesFor24hMilestone && !bid.canLoadFilesForAlpMilestone) {
                        if (tender.procurementMethodType === 'aboveThresholdUA.defense'
                            || tender.procurementMethodType === 'simple.defense') {
                            docTypesToUpload = documentTypes.bidDocument.filter(function (docType) {
                                return [
                                    'evidence',
                                    'contractGuarantees'
                                ].every(function (type) {
                                    return type !== docType.type;
                                });
                            });
                        } else {
                            docTypesToUpload = documentTypes.bidDocument.filter(function (docType) {
                                return [
                                    'commercialProposal',
                                    'billOfQuantity',
                                    'evidence',
                                    'eligibilityDocuments',
                                    'technicalSpecifications',
                                    'contractGuarantees'
                                ].every(function (type) {
                                    return type !== docType.type;
                                });
                            });
                        }
                    }
                    else if (bid.canLoadFilesForAlpMilestone) {
                        docTypesToUpload = documentTypes.bidDocument.filter(function (docType) {
                            return [
                                'technicalSpecifications',
                                'qualificationDocuments',
                                'commercialProposal',
                                'billOfQuantity',
                                'eligibilityDocuments',
                                'winningBid',
                                'contractGuarantees'
                            ].every(function (type) {
                                return type !== docType.type;
                            });
                        });
                    }
                    else if (bid.canLoadFiles) {
                        if (tender.procurementMethodType === 'aboveThresholdUA.defense'
                            || tender.procurementMethodType === 'simple.defense') {
                            docTypesToUpload = documentTypes.bidDocument.filter(function (docType) {
                                return [
                                    'evidence',
                                    'contractGuarantees'
                                ].every(function (type) {
                                    return type !== docType.type;
                                });
                            });
                        } else if (tender.procurementMethodType === 'closeFrameworkAgreementUA' &&
                            tender.status === 'active.awarded') {
                            docTypesToUpload = documentTypes.bidDocumentActiveAwarded;
                        } else {
                            docTypesToUpload = documentTypes.bidDocument.filter(function (docType) {
                                return [
                                    'evidence',
                                    'billOfQuantity',
                                    'technicalSpecifications',
                                    'qualificationDocuments',
                                    'commercialProposal',
                                    'contractGuarantees'
                                ].every(function (type) {
                                    return type !== docType.type;
                                });
                            });
                        }
                    } if (bid.canLoadFilesForGuaranteeRequirement) {
                         if (!docTypesToUpload) {
                             docTypesToUpload = [];
                         }
                         var contractType = documentTypes.bidDocument.find(function (docType) {
                             return docType.type === 'contractGuarantees';
                         });

                         docTypesToUpload.push(contractType);
                    }
                }
                return docTypesToUpload;
            };

            this.getDocConfByBidProperties = function (tender, bid) {
                var docConfsToUpload = [];
                if (bid.isMyBid) {
                    if (bid.canLoadFilesFor24hMilestone && !bid.canLoadFilesForAlpMilestone) {
                        docConfsToUpload = lookupService.confidentialityTypes;
                    }
                    else if (bid.canLoadFilesForAlpMilestone) {
                        docConfsToUpload.push(lookupService.confidentialityTypes[0]);
                    }
                    else if (bid.canLoadFiles && tender.procurementMethodType !== 'belowThreshold') {

                        if (tender.procurementMethodType === 'aboveThresholdUA.defense' || tender.procurementMethodType === 'simple.defense') {
                            docConfsToUpload = lookupService.confidentialityTypes;
                        } else {
                            docConfsToUpload.push(lookupService.confidentialityTypes[0]);
                        }
                    }
                }
                return docConfsToUpload;
            }
        };
    }]);
;
angular.module('app').
    service('bidHelperService',
        ['abp.services.etender.bid', '$q', '$localStorage', function (bidService, $q, $localStorage) {
            return new function () {
                this.addEscoFields = addEscoFields;
                this.getFeatureOptionsForCreate = getFeatureOptionsForCreate;
                this.getFeatureOptionsForUpdate = getFeatureOptionsForUpdate;
                this.createBidInput = createBidInput;
                this.createOrUpdateBidDraft = createOrUpdateBidDraft;
                this.setDescriptionDecision = setDescriptionDecision;
                this.setBidFromDraft = setBidFromDraft;
                this.generateRequirementResponse = generateRequirementResponse;


                function addEscoFields(input, bid) {
                    input.contractDurationYears = bid.value.contractDurationYears;
                    input.contractDurationDays = bid.value.contractDurationDays || 0;
                    input.yearlyPaymentsPercentage = bid.value.yearlyPaymentsPercentage;
                    input.annualCostsReduction = bid.value.annualCostsReduction;// ? bid.value.annualCostsReduction : $scope.annualCostsReduction; // for update

                    return input;
                }
                function getFeatureOptionsForCreate(lot) {
                    var featureOptionIds = [];

                    for (var i = 0; i < lot.featuresTender.length; i += 1) {
                        var feature = lot.featuresTender[i];
                        if (feature.soption) {
                            featureOptionIds.push(feature.soption.id);
                        }
                    }

                    for (var i = 0; i < lot.features.length; i += 1) {
                        var f = lot.features[i];
                        if (f.soption) {
                            featureOptionIds.push(f.soption.id);
                        }
                    }

                    return featureOptionIds;
                };

                function getFeatureOptionsForUpdate(data) {
                    var ids = [];

                    for (var i = 0; i < data.length; i++) {
                        if (data[i]._id) {
                            ids.push(data[i]._id);
                        } else {
                            ids.push(data[i].id);
                        }
                    }
                    return ids;
                };

                function createBidInput(lot, tender) {
                    var createBidInput = {
                        tenderId: tender.id,
                        lotValues: [],
                        featureOptionIds: getFeatureOptionsForCreate(lot),
                        userId: $localStorage.userId,
                        selfEligible: lot.bid.selfEligible,
                        selfQualified: lot.bid.selfQualified,
                    };

                    if (lot.bid.id)
                        createBidInput.id = lot.bid.id;

                    if (lot.bid)

                    createBidInput.lotValues.push({
                        lotId: lot.id,
                        subcontractingDetails: lot.bid.subcontractingDetails,
                        value: {
                            amount: lot.bid.value.amount,
                            currencyId: lot.value.currencyId,
                            valueAddedTaxIncluded: lot.bid.value.valueAddedTaxIncluded
                        }
                    });
                    return createBidInput;
                }
                function createOrUpdateBidDraft(bid, lot, isEsco, tender, choosedProduct, criteriaResponses) {
                    if (!bid.id) {

                        var bidInput = createBidInput(lot, tender, choosedProduct);

                        if (tender.procurementMethodType === 'priceQuotation' && choosedProduct) {
                            bidInput.ProductId = choosedProduct.id;
                            if (choosedProduct.requirementResponses && choosedProduct.requirementResponses.length) {
                                bidInput.requirementResponses = generateRequirementResponse(choosedProduct.requirementResponses, false);
                            } else {
                                bidInput.requirementResponses = generateRequirementResponse(choosedProduct, true);
                            }
                        }

                        if (criteriaResponses && criteriaResponses.length) {
                            bidInput.tenderCriteriaRequirementResponses = criteriaResponses;
                        }

                        var createBidDraftMethod;
                        if (isEsco === false) {
                            createBidDraftMethod = bidService.createBidDraft;
                        } else {
                            createBidDraftMethod = bidService.createBidEsco;
                            bidInput = addEscoFields(bidInput, lot.bid);
                        }
                        
                        return createBidDraftMethod(bidInput).then(function (reponse) {
                            //bid.id = data;
                            toastr.warning("Було створено чернетку пропозиції!", "Увага!");
                            return reponse.data;
                        });
                    } else {
                        if (bid.isDraft || bid.status === 'draft') {

                            var updateBidInput = {
                                id: bid.id,
                                lotValue: {
                                    id: bid.lotValue.id || lot.bid.lotValueId,
                                    subcontractingDetails: bid.lotValue.subcontractingDetails || null,
                                    value: bid.lotValue.value || lot.bid.value
                                },
                                featureOptionIds: getFeatureOptionsForUpdate(bid.features),
                                selfEligible: bid.selfEligible,
                                selfQualified: bid.selfQualified
                            };
                            var updateBidDraftMethod;
                            if (isEsco === false) {
                                updateBidDraftMethod = bidService.updateBid;
                            }
                            else {
                                updateBidInput = addEscoFields(updateBidInput, bid.lotValue);
                                updateBidDraftMethod = bidService.updateBidEsco;
                            }

                            if (tender.procurementMethodType === 'priceQuotation' && choosedProduct) {
                                updateBidInput.ProductId = choosedProduct.id;
                            }

                            if (criteriaResponses && criteriaResponses.length) {
                                updateBidInput.tenderCriteriaRequirementResponses = criteriaResponses;
                            }

                            return updateBidDraftMethod(updateBidInput).then(function (reponse) {
                                return reponse.data;
                            });
                        }
                    }
                    return $q.when(bid.id).then(function () { return bid; });
                }
                function setDescriptionDecision(bid) {
                    return bid.confidentiality && bid.confidentiality.valueType === 'decisionDescriptionType';
                }
                function setBidFromDraft(bidDraft, lot, docMethod) {
                    lot.bid.id = bidDraft.id;
                    lot.bid.isMyBid = bidDraft.isMyBid;
                    if (!docMethod) lot.bid.isDraft = true;
                    if (bidDraft.lotValue) {
                        lot.bid.lotValueId = bidDraft.lotValue.id;
                        lot.bid.value.amount = bidDraft.lotValue.value.amount;
                        lot.bid.value.currencyId = bidDraft.lotValue.value.currencyId;
                        lot.bid.subcontractingDetails = bidDraft.lotValue.subcontractingDetails;
                        if (bidDraft.lotValue.value.contractDurationDays) lot.bid.value.contractDurationDays = bidDraft.lotValue.value.contractDurationDays;
                        if (bidDraft.lotValue.value.contractDurationYears) lot.bid.value.contractDurationYears = bidDraft.lotValue.value.contractDurationYears;
                        if (bidDraft.lotValue.value.yearlyPaymentsPercentage) lot.bid.value.yearlyPaymentsPercentage = bidDraft.lotValue.value.yearlyPaymentsPercentage;
                        if (bidDraft.lotValue.value.annualCostsReduction) lot.bid.value.annualCostsReduction = bidDraft.lotValue.value.annualCostsReduction;
                    }
                    lot.bid.selfEligible = bidDraft.selfEligible;
                    lot.bid.selfQualified = bidDraft.selfQualified;

                    angular.forEach(lot.features, function (f) {
                        angular.forEach(bidDraft.features, function (bf) {
                            if (bf.featureId === f.id)
                                f.soption = bf;
                        });
                    });
                    angular.forEach(lot.featuresTender, function (f) {
                        angular.forEach(bidDraft.features, function (bf) {
                            if (bf.featureId === f.id)
                                f.soption = bf;
                        });
                    });
                }

                function generateRequirementResponse (choosedProductRequirements, responsesInside) {
                    var responseRequirements = [];
                    if (!responsesInside) {
                        choosedProductRequirements.forEach(function (requirement) {
                            responseRequirements.push({
                                requirementId: requirement.requirement.id,
                                requirementApiId: requirement.requirement.apiId,
                                value: requirement.value
                            });
                        });
                    } else {
                        var obj = [];
                        choosedProductRequirements.forEach(function (responses) {
                            if (choosedProductRequirements.length > 1) {
                                responses.requirementResponses.forEach(function (singleResponse) {
                                    obj.push(singleResponse);
                                });
                            } else {
                                obj = responses.requirementResponses;
                            }
                        });
                        obj.forEach(function (singleResponse) {
                            responseRequirements.push({
                                requirementId: singleResponse.requirement.id,
                                requirementApiId: singleResponse.requirement.apiId,
                                value: singleResponse.value
                            });
                        });
                    }
                    return responseRequirements;
                }
            };


        }]);

;
angular.module('app').
    service('classificationSearchService',
       ['abp.services.etender.reference',
        '$controller',
        '$timeout',
        '$rootScope',
        function (
            referenceService,
            $controller,
            $timeout,
            $rootScope) {

        return new function () {

            this.cleareChildCpv = function (cpvs, childCpvs) {
                var code = cpvs.code;
                var index = code.indexOf(0, 1);
                var smallCod = code.slice(0, index);
                var i = 0;
                var tempChildCpvsArray = childCpvs;
                if (tempChildCpvsArray)
                    for (i; i < tempChildCpvsArray.length; i++) {
                        if (tempChildCpvsArray[i] && tempChildCpvsArray[i].code) {
                            var childCpvsCode = tempChildCpvsArray[i].code.slice(0, index);
                            if (childCpvsCode === smallCod) {
                                delete tempChildCpvsArray[i];
                            }
                        }
                    }
                childCpvs = tempChildCpvsArray;
            };

            this.initClassification = function(scope, selectedCpvs) {
                scope.searchCpv = angular.element($("#modalClassifications")).scope().$parent;
                $controller('modalClassificationsCtrl', { $scope: scope.searchCpv });
                scope.searchCpv.init(getDataCpv, updateDataCpv);

                function getDataCpv($defer, params) {
                    abp.ui.setBusy(".modal-body");
                    var searchString = null;
                    if (scope.searchCpv && scope.searchCpv.vm) searchString = scope.searchCpv.vm.searchStringCpv;
                    var pager = {
                        page: params.page(),
                        pageSize: params.count(),
                        searchIdentifier: searchString
                    };

                    if (searchString && searchString.length > 0) {
                        var searchClassificationData = referenceService.getSearchClassificationsRef(searchString);
                        searchClassificationData.then(function(response) {
                            //response.data.forEach(function (cpv) { cpv.rank = 0; });
                            params.total(response.data.length);
                            if (scope.needBindForSubscribesCpvs) {
                                changeCpvsFromStringToObject(response.data);
                            }
                            var tableScope = $('#modalClassifications table').scope();
                            tableScope.$data = setSelected(response.data);
                            abp.ui.clearBusy(".modal-body");
                        });
                    } else {
                        var classificationData = referenceService
                            .getClassificationWithChildrensRef(selectedCpvs);
                        classificationData.then(function(response) {
                            params.total(response.data.length);
                            if (scope.needBindForSubscribesCpvs) {
                                changeCpvsFromStringToObject(response.data);
                            }
                            var tableScope = $('#modalClassifications table').scope();
                            tableScope.$data = setSelected(response.data);
                            abp.ui.clearBusy(".modal-body");
                        });
                    }

                    function setSelected(items) {
                        var cpvs = selectedCpvs;
                        var cl = cpvs.length;
                        return items.map(function(item) {
                            for (var i = 0; i < cl; i += 1) {
                                if (cpvs[i] && cpvs[i].id == item.id || cpvs[i] == item.code) {
                                    item.$selected = true; 
                                    return item;
                                }
                            }
                            return item;
                        });
                    }
                }

                function changeCpvsFromStringToObject(data) {
                    var selectedCpvsArray = [];
                    selectedCpvs.forEach(function (cpv) {
                        if (typeof cpv === 'string') {
                            var cpvObject = data.find(function (tableCpv) {
                                return tableCpv.code === cpv;
                            });
                            selectedCpvsArray.push(cpvObject);
                        }
                    });
                    if (selectedCpvsArray.length === selectedCpvs.length) {
                        selectedCpvs = selectedCpvsArray;
                    }

                    $rootScope.$broadcast('broadcastChangedCpvs', selectedCpvs);
                    $rootScope.$broadcast('responseCpvs', data);
                }

                function updateDataCpv(data, item, isCheckbox) {
                    scope.searchCpv.vm.tableParamsCpv.data = data;
                    if (!isCheckbox) {
                        item.$selected = !item.$selected;
                    }
                    setItem(item);
                    updateChildItems(item);
                    $rootScope.$broadcast('unselectCpvCode', item);
                };

                function updateChildItems(item) {
                    if (scope.searchCpv.vm.tableParamsCpv.data.length == 1) return;
                    var cursor = 0;
                    scope.searchCpv.vm.tableParamsCpv.data.some(function(cpvItem, i) {
                        if (cpvItem.id === item.id) {
                            cursor = i;
                            return true;
                        }
                    });
                    cursor = 0;
                    while (cursor + 1 > item.childsCount) {
                        scope.searchCpv.vm.tableParamsCpv.data[cursor + 1].$selected = item.$selected;
                        setItem(scope.searchCpv.vm.tableParamsCpv.data[cursor + 1], scope, selectedCpvs);
                        cursor++;
                    }
                }

                function setItem(item) {
                    var cpvs = selectedCpvs;
                    var alreadySelectedItem = selectedCpvs.filter(function(cpv) {
                        return cpv.code == item.code;
                    });
                    if (item.$selected && alreadySelectedItem.length == 0) {
                        cpvs.push({
                            id: item.id,
                            code: item.code,
                            desc: item.description,
                            rank: item.rank,
                            hasChildren: item.hasChildren,
                            isOpen: item.isOpen
                        });
                    } else if (item.$selected && alreadySelectedItem.length) {
                        addChildItemsToSelected(cpvs, item, scope);
                    } else if (!item.$selected) {
                        var index = selectedCpvs.indexOf(alreadySelectedItem[0]);
                        if (index > -1) {
                            if (cpvs[index].hasChildren && !cpvs[index].isOpen)
                                scope.cleareChildCpv(cpvs[index]);
                            cpvs.splice(index, 1);
                        }
                    }
                }
            };

            function addChildItemsToSelected(cpvs, item, scope) {
                var selectedItem = cpvs.find(function (value) {
                    return value.code === item.code;
                });
                findAndUpdateItem(cpvs, selectedItem, item);

                var childCpvs = scope.searchCpv.vm.tableParamsCpv.data.filter(function (cpv) {
                    return item.rank === cpv.rank - 1;
                });
                findChildItemsAndAdd(cpvs, childCpvs);
            }

            function findAndUpdateItem(cpvs, selectedItem, item) {
                var selectedItemIndex = cpvs.indexOf(selectedItem);
                if (selectedItemIndex !== -1) {
                    cpvs[selectedItemIndex] = {
                        id: item.id,
                        code: item.code,
                        desc: item.description,
                        rank: item.rank,
                        hasChildren: item.hasChildren,
                        isOpen: item.isOpen
                    };
                }
            }

            function findChildItemsAndAdd(cpvs, childCpvs) {
                childCpvs.forEach(function (cpv) {
                    var isPushedCpv = cpvs.find(function (childCpv) {
                        return cpv.code === childCpv.code;
                    });
                    if (!isPushedCpv) {
                        cpvs.push(cpv);
                    }
                });
            }

            this.search = function (searchstring, scope) {
                scope.searchstring = searchstring;
                $timeout(function () {
                    scope.tableParams.reload();
                    scope.tableParams.page(1);
                }, 1000);
            }

            this.changeSelection = function (item, scope) {
                var d = scope.tableParams.data;
                for (var i = 0; i < d.length; i += 1) {
                    d[i].$selected = false;
                }
                item.$selected = true;
                scope.selectedData = item;
            }

            this.choose = function (scope, place) {
                if (!scope.selectedData) return;

                var entity = null;
                if (scope.lotInd != null && scope.itemInd != null) {
                    var lotInd = Number(scope.lotInd); // @hack @todo figure-out why $scope.lotInd  could be an empty string.
                    entity = scope.data.lots[lotInd].items[scope.itemInd];
                } else if (scope.itemInd != null) {
                    var itemInd = Number(scope.itemInd); // @hack @todo figure-out why $scope.itemInd could be an empty string.
                    entity = scope.data.items[itemInd]; // for plan items
                } else {
                    entity = scope.data;// for plan
                }

                entity[place] = angular.copy(scope.selectedData);
                scope.$parent.cansave = true;
            }
        };
    }]);;
angular.module('app').
service('complaintsService', function () {

    return new function () {

        var currentComplaint = null;
        this.currentComplaint = function (complaint) {
            if (complaint == null)
                return currentComplaint;
            else
                currentComplaint = complaint;
        };

        this.getComplaintFor = function (complaint) {
            if (!complaint) return '';
            if (complaint.award != null) {
                var suppliersInfo = '';
                if (complaint.award.suppliers && complaint.award.suppliers.length > 0 && complaint.award.suppliers[0].name) {
                    suppliersInfo = complaint.award.suppliers[0].name + ' ,';
                }
                var priceInfo = ' (' + suppliersInfo + complaint.award.value.amount + '  ' + complaint.award.value.currencyCode + ')';
                if (complaint.lot != null)
                    return 'рішення замовника для лота ' + complaint.lot.title + priceInfo;
                else {
                    return 'рішення замовника ' + priceInfo;
                }
            }
            else if (complaint.qualificationId != null) {
                return "Кваліфікацію";
            }
            else if (complaint.cancellationId) {
                return 'Скасування тендеру/лоту';
            }
            else if (complaint.lot != null) {
                return 'Лот ' + complaint.lot.title;
            }
            else {
                return 'Тендер';
            }
        };

        this.getStatusLabelClass = function (s) {
            switch (s) {
                case ('draft'):
                    return 'label-default';
                case ('claim'):
                    return 'label-warning';
                case ('answered'):
                    return 'label-info';
                case ('pending'):
                    return 'label-primary';
                case ('invalid'):
                    return 'label-danger';
                case ('declined'):
                    return 'label-danger';
                case ('resolved'):
                    return 'label-success';
                case ('cancelled'):
                    return 'label-danger';

                case ('accepted'):
                    return 'label-info';
                case ('satisfied'):
                    return 'label-success';
                case ('stopped'):
                    return 'label-danger';
                case ('stopping'):
                    return 'label-warning';

                default:
                    return '';
            }
        };

        this.getTypeLabelClass = function (s) {
            switch (s) {
                case ('claim'):
                    return 'label-warning';
                case ('complaint'):
                    return 'label-danger';
                default:
                    return '';
            }
        };
        this.getTypeUkr = function (s) {
            switch (s) {
                case ('claim'):
                    return 'Вимога';
                case ('complaint'):
                    return 'Скарга';
                default:
                    return '';
            }
        };

        this.complaintStatus = function() {
            return [
                'draft',
                'claim',
                'answered',
                'pending',
                'invalid',
                'declined',
                'resolved',
                'cancelled',
                'mistaken',
                'accepted',
                'satisfied',
                'stopped',
                'stopping',
                'ignored'
            ];
        }

        //TODO: refactor view statuses & localization
        this.getComplaintStatusUkr = function (s, type, newFlow) {
            if (s == 'resolved' && type == 'claim' && !newFlow) return 'Задоволено';
            if (s == 'resolved' && type == 'claim' && (newFlow || !newFlow)) return 'Вирішена';
            if (s == 'declined' && type == 'claim' && newFlow) return 'Відхилена';
            if (s == 'declined' && type == 'claim') return 'Не задоволено';
            if (s == 'invalid' && type == 'claim') return 'Відхилено';

            switch (s) {
                case ('draft'): return 'Чернетка';
                case ('claim'): return 'Вимога';
                case ('answered'): return 'Відповідь надана';
                case ('pending'): return 'Очікує розгляду Органом оскарження';
                case ('invalid'): return 'Залишена без розгляду';
                case ('declined'):
                    if (newFlow) return 'Відхилена';
                    return 'Не задоволена Органом оскарження';
                case ('resolved'): return 'Виконано';
                case ('cancelled'): return 'Скасована скаржником';
                case ('mistaken'):
                    if (newFlow) return 'Скасована';
                    return 'Повернуто, як помилково направлену';
                case ('accepted'): return 'Прийнята до розгляду Органом оскарження';
                case ('satisfied'): return 'Скаргу задоволено Органом оскарження';
                case ('stopped'): return 'Розгляд припинено';
                case ('stopping'): return 'Відкликається скаржником';
                case ('ignored'): return 'Залишена без відповіді';
                default:
                    return s;
            }
        };

        this.relatedEntityTypes = function() {
            return [
                {
                    source: 'tender',
                    name: 'На умови закупівлі'
                },
                {
                    source: 'qualification',
                    name: 'На результат прекваліфікації'
                },
                {
                    source: 'award',
                    name: 'На результат кваліфікації'
                },
                {
                    source: 'cancellation',
                    name: 'На відміну закупівлі'
                }
            ];
        }

        this.getComplaintForType = function (complaint) {
            if (complaint.award != null) {
                return 'award';
            } else if (complaint.qualificationId != null) {
                return 'qualification';
            } else if (complaint.cancellationId) {
                return 'cancellation';
            } else {
                return 'tender';
            }
        }
    };

});
;
angular.module('app').service('criteriasDictionaryService', [
    '$rootScope',
    function ($rootScope) {
        return new function () {
            var localizationDetailesDictionary = {
                'tender': $rootScope.source('Tenders'),
                'lot': $rootScope.source('forLot'),
                'item': $rootScope.source('forItem'),
                'tenderer': $rootScope.source('forTenderer'),
                'buyer': $rootScope.source('forBuyer'),
                'procuringEntity': $rootScope.source('forBuyer'),
                'winner': $rootScope.source('TenderWinner')
            };

            this.getDetailesLocalizationText = function (type) {
                return localizationDetailesDictionary[type] || type;
            };

            this.getEvidenceTypeTitle = function (evidence) {
                return evidence.type === 'document' ? $rootScope.source('Document') : $rootScope.source('Statement');
            };
        }
    }
])
;
angular.module('app').
service('datesHelperService', function ( ) {
      
    return new function () {

        this.jsonStringToDate = function (string) {
            function toInt(str) {
                return parseInt(str, 10);
            }
            var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
            // 1        2       3         4          5          6          7          8  9     10      11
            var match;
            if (match = string.match(R_ISO8601_STR)) {
                var date = new Date(0),
                    tzHour = 0,
                    tzMin = 0,
                    dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
                    timeSetter = match[8] ? date.setUTCHours : date.setHours;

                if (match[9]) {
                    tzHour = toInt(match[9] + match[10]);
                    tzMin = toInt(match[9] + match[11]);
                }
                dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));
                var h = toInt(match[4] || 0) - tzHour;
                var m = toInt(match[5] || 0) - tzMin;
                var s = toInt(match[6] || 0);
                var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
                timeSetter.call(date, h, m, s, ms);
                return date;
            }
            return string;
        }

        this.howManyDaysLeftBetweenDates = function (firstDate, lastDate, isTakeIntoWeekEnds) {

            // учитывать ли выходные дни
            isTakeIntoWeekEnds = typeof isTakeIntoWeekEnds !== 'undefined' ? isTakeIntoWeekEnds : true;
            //console.log('isTakeIntoWeekEnds=' + isTakeIntoWeekEnds);
            if (!firstDate || !lastDate) return 0;

            if (firstDate.getDay == undefined) { // значит умы имеем дело со строкой
                firstDate = this.jsonStringToDate(firstDate);
            }
            if (lastDate.getDay == undefined) { // значит умы имеем дело со строкой
                lastDate = this.jsonStringToDate(lastDate);
            }
            
            var daysDelta = 24 * 60 * 60 * 1000;
            var daysDiff = (lastDate - firstDate) / daysDelta;

            var calcTo = daysDiff;
            
            if (isTakeIntoWeekEnds && daysDiff >= 1 ) {
                for (var i = 1; i <= calcTo; i++) {
                    var dayBefore = new Date(lastDate);
                    dayBefore.setDate(lastDate.getDate() - i);
                    
                    var isWeekend = (dayBefore.getDay() % 6 == 0);
                    if (isWeekend) { // если вых - не учитуем его
                        daysDiff--;
                    }
                    //console.log('dayBefore=' + dayBefore + '  isWeekend=' + isWeekend);
                }
            }

            return daysDiff;
        };

        // Disable weekend selection
        this.disableWeekEndsAndDayOffs = function (date, mode) {
            return (mode === 'day' && (date.getDay() === 0 || date.getDay() === 6));
        };
       

        this.howManyDaysLeftFromNow = function (firstDate) {

            if (!firstDate) return 1;

            firstDate = this.jsonStringToDate(firstDate);
            var isValid = false;
            var lastDate = new Date();
            var daysDelta = 24 * 60 * 60 * 1000;
            return (lastDate - firstDate) / daysDelta;
        };

        
        this.isWeekend = function (date) {
            if (date) {
                if (date.getDay == undefined) { // значит умы имеем дело со строкой
                    date = this.jsonStringToDate(date);
                }
                var isWeekEnd;
                if (date.getDay === undefined) {
                    isWeekEnd = ((new Date(date)).getDay() % 6 == 0);
                } else {
                    //Временный костыль на рабочую субботу
                    var year = date.getFullYear();
                    var month = date.getMonth();
                    var day = date.getDate();
                    if ((year === 2019 && month === 11 && day === 21) || (year === 2019 && month === 11 && day === 28) || (year === 2020 && month === 00 && day === 11) ||
                        (year === 2021 && month === 0 && day === 16))
                        isWeekEnd = false;
                    else
                        isWeekEnd = (date.getDay() % 7 == 0);

                    //isWeekEnd = (date.getDay() % 6 == 0);
                }
                
                return isWeekEnd;
            }
            return false;
        }

        

        // Disable weekend selection
        this.disableDayOffs = function (date) {
            return new Date();
        };

        // for 1-based month (1 - January, not 0 - January)
        this.daysInMonth = function (month, year) {
            return new Date(year, month, 0).getDate();
        };

        this.minDateProposals = function (nowDate, createDate, diffDayCreate, diffDayUpdate) {
            if (!nowDate && !createDate && !diffDayCreate && !diffDayUpdate) return 1;
            var maxDate = createDate.setDate(createDate.getDate() + diffDayCreate);
            var minDate = createDate.setDate(createDate.getDate() + diffDayCreate - diffDayUpdate);
            maxDate = new Date(maxDate);
            minDate = new Date(minDate);

            if (minDate > nowDate)
                return maxDate;
            else {
                nowDate = nowDate.setDate(nowDate.getDate() + diffDayUpdate);
                nowDate = new Date(nowDate);
                return nowDate;
            }
        };

        this.getNextDayWithoutTime = function (tenderCreationFullDate) {
            return new Date(new Date(tenderCreationFullDate).getFullYear(), new Date(tenderCreationFullDate).getMonth(), new Date(tenderCreationFullDate).getDate() + 1);
        };

        this.getMinimalTenderDateForUpdate = function (tenderCreationFullDate, minimalStepForValidDateCreate, minimalStepForValidDateUpdate) {
            var nowDate = new Date();
            var creationDate = this.getNextDayWithoutTime(tenderCreationFullDate);
            var minDateProposals = this.minDateProposals(nowDate, creationDate, minimalStepForValidDateCreate, minimalStepForValidDateUpdate);

            return minDateProposals;
        };

        this.checkDate = function (lastDate, firstDate) {
            if (!firstDate) firstDate = (new Date()).toISOString();
            else if (typeof (firstDate) === "object") firstDate = firstDate.toISOString();
            else firstDate = new Date(firstDate).toISOString();


            if (!lastDate) lastDate = (new Date()).toISOString();
            else if (typeof (lastDate) === "object") lastDate = lastDate.toISOString();
            else lastDate = new Date(lastDate).toISOString();

            return (lastDate >= firstDate);
        };

        this.setFirstAndLastDateOfYear = function (dates)
        {
            dates.startDate = moment({ years: dates.startDate }).startOf('year').format("YYYY-MM-DD HH:mm"); 
            dates.endDate = moment({ years: dates.endDate}).endOf('year').format("YYYY-MM-DD HH:mm"); 
        }

        this.validDateFromAndTo = function(dateFrom, dateTo) {
            if (!dateFrom || !dateTo) return true;
            if (dateTo < dateFrom) return false;
            return true;
        }

    };

});;
angular.module('services', []).
    factory('documentsService', [
        'abp.services.etender.filePath',
        '$localStorage',
        '$q',
        '$filter',
        '$sce',
        '$timeout',
        '$http',
        '$window',
        'loadTypesAndConfident',
        function (
            filePath,
            $localStorage,
            $q,
            $filter,
            $sce,
            $timeout,
            $http,
            $window,
            loadTypesAndConfident) {

            return new function () {

                this.getFormat = getFormat;

                this.sortListOfDocs = function (documents) {

                    var listOfDocs = [];
                    if (documents && documents.length) {
                        for (var i = 0, len = documents.length; i < len; i++) { //sort all docs into two-dimensional arrays, where first key is document.id

                            if (!(documents[i].id in listOfDocs)) { //check, if list with new key=doc.is has been already created
                                listOfDocs[documents[i].id] = []; //create new list, if not
                            }
                            if (!documents[i].isExportError)
                                listOfDocs[documents[i].id].push(documents[i]); //put new element into list with documents with the same id
                            else {
                                if (!((documents[i].id + 'error') in listOfDocs)) { //check, if list with new key=doc.is has been already created
                                    listOfDocs[documents[i].id + 'error'] = []; //create new list, if not
                                }
                                listOfDocs[documents[i].id + 'error'].push(documents[i]); // element with error - separately with 
                            }

                        };
                    }

                    documents = [];
                    for (var item in listOfDocs) {
                        if (listOfDocs[item].length > 1) {
                            listOfDocs[item].sort(function (a, b) {
                                if (a.dateModified && !b.dateModified) {
                                    a.isDeleted = true;
                                    a.indent = true;
                                    return 1;
                                }
                                if (!a.dateModified && b.dateModified) {
                                    b.isDeleted = true;
                                    b.indent = true;
                                    return -1;
                                }
                                if (a.dateModified && b.dateModified) {
                                    if (a.dateModified > b.dateModified) {

                                        b.isDeleted = true;
                                        b.indent = true;
                                        return -1;
                                    } else {
                                        a.isDeleted = true;
                                        a.indent = true;
                                        return 1;
                                    }

                                } else return 0;
                            });

                            listOfDocs[item][0].indent = false;
                        }

                        //console.log("Отсортированный доклист " + item + ": ", listOfDocs[item]);
                        if (listOfDocs.hasOwnProperty(item)) {
                            documents = documents.concat(listOfDocs[item]);
                        }
                        //console.log("Обновляем масив доков:", documents);
                    }

                    //console.log("После всех махинаций:", documents);
                    return documents;
                };

                this.validateDocName = function (name) {
                    if (name.match(/(\\|\/|\:|\*|\?|\"|\<|\>|\|)/) != null) {
                        abp.notify.error("Некоректа назва документа. В назві файла не повинно бути символів \ / : * ? " + "<" + ">" + "|" + "!");
                        return 0;
                    }
                    return 1;
                }

                this.isBidDocument = function (document) {
                    var bidDocumentTypes = $localStorage.refs.documentTypes.bidDocument;
                    return bidDocumentTypes.some(function (doc) {
                        return document.documentTypeId === doc.id || !document.documentTypeId;
                    });
                }

                this.getUrlDocument = function (url) {
                    var defer = $q.defer();
                    var input = { fileUri: url };
                    var requestUri;
                    filePath.getDownloadUrlForPrivateDoc(input).then(function (response) {
                        requestUri = response.data;
                        defer.resolve(response.data);
                    });
                    return defer.promise;
                }

                this.getConfigFilePath = function (doc, bidApiId, tenderApiId) {
                    var defer = $q.defer();
                    var input = {
                        bidApiId: bidApiId || undefined,
                        documentApiId: doc.apiId || doc.id || undefined,
                        tenderApiId: tenderApiId || undefined
                    };
                    filePath.getConfidentialityFileUrl(input).then(function (response) {
                        defer.resolve(response.data);
                    });
                    return defer.promise;
                }

                this.checkDocumentsIsExported = function (documents) {
                    var isExported = true;
                    if (documents && documents.length > 0) {
                        for (var j = 0; j < documents.length; j++) {
                            if (documents[j].isExported === false) {
                                isExported = false;
                                break;
                            }
                        }
                    }
                    return isExported;
                }

                this.loadDocumentTypes = function ($scope) {
                    loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                        $scope.documentTypes = documentTypes;
                    });
                }

                this.downloadZipFile = function (documents, zipFilename, scope, tenderApiId, bid) {
                    var self = this;
                    disabledButton();
                    var isBidDocument = documents.some(this.isBidDocument);
                    var count = 0;
                    var downloadDocs = [];
                    var getConfigFilePathPromises = [];
                    
                    documents.forEach(function (doc) {
                        if (!(doc.isExported === false || doc.isDeleted || (doc.confidentiality === 'buyerOnly' && !isMyTender(scope.tender) && !bid.isMyBid))) {
                            var date = $filter('date')(doc.dateModified, 'dd-MM-yyyy HH:mm:ss');
                            var filename = ('[' + date + ']' + doc.title).
                                replace(/—/g, "-").
                                replace(/:/g, ".");
                            var downloadDoc = {
                                title: doc.title,
                                url: doc.url || '/', // if replace null with invalid url to avoid server error.
                                filename: filename,
                                dateModified: doc.dateModified,
                                confidentiality: doc.confidentiality,
                                apiId: doc.apiId || doc.id
                            };
                            downloadDocs.push(downloadDoc);

                            if (!doc.url || doc.url == '/') {
                                var promise = new Promise(function (resolve, reject) {
                                    self.getConfigFilePath(doc, bid.apiId, tenderApiId).then(function (cfpUrl) {
                                        doc.url = cfpUrl;
                                        if (downloadDoc) {
                                            downloadDoc.url = cfpUrl;
                                        }
                                        if (!cfpUrl || cfpUrl == '/') {
                                            var input = {
                                                bidApiId: bid ? bid.apiId : undefined,
                                                documentApiId: doc.apiId || doc.id || undefined,
                                                tenderApiId: tenderApiId || undefined
                                            };
                                            filePath.getConfidentialityFileUrl(input).then(function (url) {
                                                doc.url = url;
                                                if (downloadDoc) {
                                                    downloadDoc.url = url;
                                                }
                                                resolve();
                                            });
                                        } else {
                                            resolve();
                                        }
                                    }).catch(function () {
                                        // ???
                                        resolve();
                                    });
                                });                                
                                getConfigFilePathPromises.push(promise);
                            }
                        };
                    });
                    if (!downloadDocs || downloadDocs.length < 1) return abp.notify.error("Немає файлів для завантаження");
                    
                    var zip = new JSZip();
                    
                    if (isBidDocument === true) {
                        Promise.all(getConfigFilePathPromises).then(function () {     
                            var urls = downloadDocs.map(function (doc) { return doc.url; });
                            filePath.getDownloadUrlsForPrivateDocs({ urls: urls }).then(function (response) {
                                var urls = response.data;
                                downloadDocs.forEach(function (doc, docIndex) {
                                    var filename = docIndex + '_' + doc.filename;
                                    var url = urls[docIndex].downloadUrl;
                                    if (!urls[docIndex].isError) {
                                        zip.file(filename, urlToPromise(url), { binary: true });
                                    } else {
                                        // todo: should we notify user if some doc is missing?
                                    }
                                    // should call zipFile and incrize count any way, 'cause file with error could be last.
                                    count++;
                                    zipFile(count, zipFilename, scope, downloadDocs, zip);
                                });
                            });
                        });
                    } else {
                        downloadDocs.forEach(function (doc) {
                            var filename = doc.filename;
                            var url = doc.url;
                            count++;
                            zip.file(filename, urlToPromise(url), { binary: true });
                            zipFile(count, zipFilename, scope, downloadDocs, zip);
                        });
                    }                    
                };

                function disabledButton() {
                    $('.dowloadZipBtn').each(function () {
                        $(this).after('<div class="w100 fl loadDocDiv"><img src="Content/images/pre-loading.gif"/>Архів створюється...</div>');
                        $(this).prop('disabled', true);
                    });
                }

                function isMyTender(tender) {
                    return $localStorage.organization && tender.organization && tender.organization.identifier.apiId === $localStorage.organization.identifier.apiId;
                }

                function enableButton(scope) {
                    $('.loadDocDiv').each(function () {
                        $(this).remove();
                    });
                    $('.dowloadZipBtn').each(function () {
                        $(this).prop('disabled', false);
                    });
                    scope.$broadcast('clearBusy');
                }

                function zipFile(count, zipFilename, scope, downloadDocs, zip) {
                    if (count === downloadDocs.length) {
                        zip.generateAsync({ type: "blob" }).then(function callback(blob) {
                            saveAs(blob, zipFilename);
                            abp.notify.success("Файл завантажується!");
                            enableButton(scope);
                        }, function (e) {
                            abp.notify.error("Помилка завантаження " + e);
                            enableButton(scope);
                        });
                    }
                }

                var Promise = window.Promise;
                if (!Promise) {
                    Promise = JSZip.external.Promise;
                }
                function urlToPromise(url) {
                    return new Promise(function (resolve, reject) {
                        JSZipUtils.getBinaryContent(url, function (err, data) {
                            if (err) {
                                reject(err);
                            } else {
                                resolve(data);
                            }
                        });
                    });
                }

                this.previewDoc = function (doc, scope) {
                    scope.showPrevBlock = true;

                    scope.bodyHeight = $(window).height();

                    if ( getFormat(doc) === 'office') {
                        abp.ui.setBusy();
                        prevOfficeDoc(doc, scope);
                        return;
                    }
                    if (getFormat(doc) === 'pdf') {
                        abp.ui.setBusy();
                        prevPdfDoc(doc, scope);
                        return;
                    }
                    if (getFormat(doc) === 'img') {
                        abp.ui.setBusy();
                        prevImgDoc(doc, scope);
                        return;
                    }
                    if (getFormat(doc) === 'txt') {
                        abp.ui.setBusy();
                        prevTxtDoc(doc, scope);
                        return;
                    }
                    if (getFormat(doc) === 'dfs') {
                        $window.eds.init().then(function (response) {
                            $window.signToDoc.init($window.eds);
                            $window.signToDoc.setConfig({url: scope.tender.prozzoroApiUrl, type: $window.signToDoc.TYPES.TICKET}).then(function (response) {
                                $window.signToDoc.open({title: doc.title});
                            });
                        });
                        return;
                    }

                    abp.notify.warn('Попередній перегляд даного формату недоступний');
                    downloadDoc(doc);

                    function downloadDoc(doc) {
                        $window.open(doc.url, '_self');
                    }

                    function prevOfficeDoc(doc, scope) {
                        scope.docPrevUrl = {
                            prevUrl: 'https://view.officeapps.live.com/op/embed.aspx?src=' + encodeUri(doc.url),
                            docUrl: doc.url,
                            type: 'office',
                            isOpen: true
                        };
                        showModalDocPrev(scope.docPrevUrl);
                    }

                    function prevTxtDoc(doc, scope) {
                        $http.get(doc.url)
                            .then(function (data) {
                                console.log(data);
                                var stringHtml = data.data.replace(/(\r\n|\n|\r)/gm, "<br>");
                                scope.docPrevUrl = {
                                    docUrl: doc.url,
                                    type: 'txt',
                                    data: stringHtml,
                                    isOpen: true
                                };
                                showModalDocPrev(scope.docPrevUrl);
                            }, function (data) {
                                abp.ui.clearBusy();
                            });
                    }

                    function prevPdfDoc(doc, scope) {
                        scope.docPrevUrl = {
                            prevUrl: 'https://docs.google.com/viewer?url=' + encodeUri(doc.url) + '&embedded=true',
                            docUrl: doc.url,
                            type: 'pdf',
                            isOpen: true
                        };
                        ifNotLoadPdf(doc, scope);
                        showModalDocPrev(scope.docPrevUrl);
                    }

                    function ifNotLoadPdf(doc, scope) {
                        $timeout(function () {
                            var body = $("#iframePdf").contents().find("body").html();
                            if (body === '') {
                                $timeout(function () {
                                    var body = $("#iframePdf").contents().find("body").html();
                                    if (body === '') {
                                        reloadPdf(doc, scope);
                                    } else {
                                        abp.ui.clearBusy();
                                        abp.ui.clearBusy(".modalDocPreview");
                                        return;
                                    }
                                }, 5000);
                            } else {
                                abp.ui.clearBusy();
                                abp.ui.clearBusy(".modalDocPreview");
                                return;
                            }
                        }, 3000);
                    }

                    function reloadPdf(doc, scope) {
                        scope.docPrevUrl.isOpen = false;
                        $timeout(function () {
                            var modalIsOpen = $("#modalDocPreview").data('bs.modal').isShown;
                            if (!modalIsOpen) {
                                return;
                            }
                            scope.docPrevUrl.isOpen = true;
                            prevPdfDoc(doc, scope);
                        }, 2000);
                    }

                    function prevImgDoc(doc) {
                        scope.docPrevUrl = {
                            docUrl: doc.url,
                            type: 'img',
                            isOpen: true
                        };
                        showModalDocPrev(scope.docPrevUrl);
                    }

                    function showModalDocPrev(docPrevUrl) {
                        $timeout(function () {
                            abp.ui.clearBusy();
                            $('#modalDocPreview').modal('show');
                        }, 2000);
                    }

                    function encodeUri(url) {
                        return encodeURIComponent(url);
                    }  
                }

                this.downloadDfsPdf = function (doc, scope) {
                    $window.eds.init().then(function (response) {
                        $window.signToDoc.init($window.eds);
                        $window.signToDoc.setConfig({url: scope.tender.prozzoroApiUrl, type: $window.signToDoc.TYPES.TICKET}).then(function () {
                            $window.signToDoc.save({title: doc.title});
                        });
                    });
                }

                this.getDraftDocs = function (lot, bid) {
                    if (lot.bids.length && lot.bids[0]) {
                        var myBid = lot.bids.find(function (bid) { return bid.isMyBid; });
                        if (myBid && myBid.id === bid.id) {
                            return myBid.documents.filter(function (doc) {
                                return doc.notExport && !doc.isDeleted;
                            });
                        } else {
                            return [];
                        }
                    } else {
                        return [];
                    }
                }

                function docCutTypet(title) {
                    return title.substr(title.length - 4);
                }

                function getFormat(doc) {
                    var type = docCutTypet(doc.title.trim()).toLowerCase();
                    if (type.indexOf('png') !== -1 ||
                        type.indexOf('jpg') !== -1 ||
                        type.indexOf('jpeg') !== -1) {
                        return 'img';
                    } else if (type.indexOf('pdf') !== -1 ||
                        doc.format && doc.format.indexOf('pdf') !== -1
                    ) {
                        return 'pdf';
                    } else if (type.indexOf('txt') !== -1) {
                        return 'txt';
                    } else if (type.indexOf('xlsx') !== -1 ||
                        type.indexOf('docx') !== -1 ||
                        type.indexOf('doc') !== -1 ||
                        type.indexOf('xls') !== -1 ||
                        type.indexOf('ppt') !== -1 ||
                        doc.format && (
                            doc.format.indexOf('officedocument') !== -1 ||
                            doc.format.indexOf('msword') !== -1
                        )
                    ) {
                        return 'office';
                    }
                    else if (doc.title.endsWith('.KVT.p7s') || doc.title.endsWith('.XML.p7s')) {
                        return 'dfs';
                    }

                    return false;
                }

                this.trustSrcForDocLoad = function (src) {
                    return $sce.trustAsResourceUrl(src);
                }

                this.isDocumentChanged = function (document, documents, documentPlanCheck) {
                    if (documentPlanCheck) {
                        var documentModifiedDate = moment(document.dateModified), 
                            documentPublishDate = moment(document.datePublished);

                        return documentModifiedDate.isAfter(documentPublishDate);
                    } else {
                        var tableDocumentsChanged = documents.filter(function (tableDocument) {
                            return (document.originId && document.originId === tableDocument.originId) ||
                                    (document.apiId && document.apiId === tableDocument.apiId) ||
                                    (document.id && document.id === tableDocument.id);
                        });
    
                        if (document && tableDocumentsChanged) {
                            tableDocumentsChanged.sort(function (first, second) {
                                if (!first.dateModified) {
                                    return 1;
                                } else if (!second.dateModified) {
                                    return -1;
                                } else {
                                    return new Date(first.dateModified) - new Date(second.dateModified);
                                }
                            });
    
                            if (tableDocumentsChanged.indexOf(document) !== tableDocumentsChanged.length - 1) {
                                return true;
                            }
                        }
                    }
                    return false;
                };

                this.displayDocFunction = function myFunc(vm) {
                    vm.showDoc = true;
                    $timeout(function() {
                            var body = $("#iframe").contents().find("body").html();
                            if (body === '') {
                                vm.showDoc = false;
                                $timeout(function() {
                                    myFunc(vm);
                                    },
                                    1000);
                            } else {
                                return;
                            }
                        },
                        2000);
                };

                this.getUrlForIframeOfficeaApps = function (documentOnSite) {
                    var siteUrl = abp.setting.values.CurrentSiteUrl;
                    var startUrl = 'https://view.officeapps.live.com/op/embed.aspx?src=';
                    return $sce.trustAsResourceUrl(startUrl + siteUrl + documentOnSite);
                };

                this.getDocumentById = function (documents, id) {
                    return documents.find(function (document) {
                        return document.id === id;
                    });
                };

            };

        }]);;
angular.module('app').
    service('eCatalogService',
        [function () {
            return new function () {
                this.displayDelivtry = function (data) {
                    if (data &&
                        data.region && data.region.title &&
                        data.city && data.city.title) {
                        return data.city.title + ', ' + data.region.title + ', ' + data.country.title + ', ' + data.postIndex;
                    } else if (data && data.country && data.country.title && data.region && data.region.title) {
                        return data.region.title + ', ' + data.country.title;
                    } else if (data && data.country && data.country.title) {
                        return data.country.title;
                    } else {
                        return '';
                    }
                };

                this.displayDeliveryAdressWithStreet = function (data) {
                    if (data &&
                        data.region && data.region.title &&
                        data.city && data.city.title &&
                        data.addressStr) {
                        return data.addressStr + ', ' + data.city.title + ', ' + data.region.title + ', ' + data.country.title + ', ' + data.postIndex;
                    }  else if (data && data.country && data.country.title && data.region && data.region.title) {
                        return data.region.title + ', ' + data.country.title;
                    } else if (data && data.country && data.country.title) {
                        return data.country.title;
                    } else {
                        return '';
                    }
                };

            };
        }]);
;
angular.module('app').
    service('filterSearchService', [function () {
        return new function () {

            this.getAllCpvs = function (scope) {
                var allCpvs = [];
                if (!scope.childCpvs) scope.childCpvs = [];
                for (var i = 0; i < scope.vm.selectedCpvs.length; i++) {
                    allCpvs.push(scope.vm.selectedCpvs[i].code);
                }
                scope.vm.selectedCpvs.concat(scope.childCpvs);
                return allCpvs;
            }

            this.changeSelCpvs = function (cpv, remove, vm) {
                if (cpv) {
                    if (!remove)
                        vm.selectedCpvs.push(cpv);
                    else vm.selectedCpvs.splice(vm.selectedCpvs.indexOf(cpv), 1);
                }
            };

            this.isPriceIntervalValid = function (vm) {
                var from = parseInt(vm.filter.priceFrom);
                var to = parseInt(vm.filter.priceTo);
                if (isNaN(from) || isNaN(to)) {
                    return true;
                }
                if (from <= to) {
                    return true;
                }
                return false;
            }

            this.changeSelProcTypes = function (procType, checked, vm) {
                if (procType) {
                    if (checked) vm.selectedProcTypes.push(procType.procurementMethodType);
                    else vm.selectedProcTypes.splice(vm.selectedProcTypes.indexOf(procType.procurementMethodType), 1);
                    this.makeProcTypeSearchText(vm);
                } else if (checked) {
                    vm.selectedProcTypes = [];
                    vm.checkedProcTypes = [];
                    vm.procTypeSearchText = null;
                }
            }

            this.makeProcTypeSearchText = function (vm) {
                vm.procTypeSearchText = null;
                angular.forEach(vm.selectedProcTypes, function (pType) {
                    angular.forEach(vm.procTypesDictionary, function (dict) {
                        if (dict.procurementMethodType === pType &&
                            (!vm.procTypeSearchText || vm.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                            vm.procTypeSearchText = vm.procTypeSearchText ? vm.procTypeSearchText + dict.procurementMethodTypeLocal + '; ' : dict.procurementMethodTypeLocal + '; ';
                    });
                });
            }

            this.setSelected = function (s, checked, vm) {
                if (!s) {
                    vm.selectedStatuses = [];
                    vm.checkedStatuses = [];
                    vm.statusSearchText = null;
                    vm.statusSearchLabel = null;
                } else {
                    if (checked) vm.selectedStatuses.push(s.name);
                    else vm.selectedStatuses.splice(vm.selectedStatuses.indexOf(s.name), 1);
                    makeStatusSearchText(vm);
                    makeStatusSearchLabel(vm);
                }
            }

            this.makeSelectedStatusesChecked = function(vm) {
                if (vm.selectedStatuses.length > 0) {
                    angular.forEach(vm.statuses, function (stat) {
                        if (vm.selectedStatuses.indexOf(stat.name) > -1) vm.checkedStatuses[vm.statuses.indexOf(stat)] = true;
                    });
                    makeStatusSearchText(vm);
                    makeStatusSearchLabel(vm);
                }
            }

            this.makeStatusSearchText = function (vm) {
                vm.statusSearchText = null;
                angular.forEach(vm.selectedStatuses, function (status) {
                    angular.forEach(vm.statuses, function (dict) {
                        if (dict.name === status &&
                            (!vm.statusSearchText || vm.statusSearchText.indexOf(dict.desc) === -1))
                            vm.statusSearchText = vm.statusSearchText ? vm.statusSearchText + dict.desc + '; ' : dict.desc + '; ';
                    });
                });
            }

            this.filterProcTypes = function (procTypes, vm) {
                return procTypes.filter(function (pt) {
                    return vm.procurementMethod.indexOf(pt.procurementMethod) > -1;
                });
            }

            function makeStatusSearchText(vm) {
                vm.statusSearchText = null;
                angular.forEach(vm.selectedStatuses, function (status) {
                    angular.forEach(vm.statuses, function (dict) {
                        if (dict.name === status &&
                            (!vm.statusSearchText || vm.statusSearchText.indexOf(dict.desc) === -1))
                            vm.statusSearchText = vm.statusSearchText ? vm.statusSearchText + dict.desc + '; ' : dict.desc + '; ';
                    });
                });
            }

            function makeStatusSearchLabel(vm) {
                vm.statusSearchLabel = null;
                if (vm.selectedStatuses.length === 1)
                    angular.forEach(vm.statuses, function (dict) {
                        if (dict.name === vm.selectedStatuses[0])
                            vm.statusSearchLabel = dict.labelClass;
                    });
            }

        };
    }]);;
angular.module('app').service('findLotService', [
    function () {
        return new function () {
            this.findLotById = function (lotId, $scope) {
                var found = null;
                if (lotId) {
                    angular.forEach($scope.detailes.lots, function (lot) {
                        if (lot.id == lotId) {
                            found = lot;
                        }
                    });
                }
                return found;
            }
        }
    }
]);
angular.module('app').service('getAuctionDatesService', [

    function () {
        return new function () {
            this.getAuctionDates = function ($scope) {
                $scope.detailes.lotsStartAuction = [];
                $scope.detailes.lotsEndAuction = [];
                var a = 0;
                var lotsLength = $scope.detailes.lots.length - 1;
                for (a; a <= lotsLength; a++) {
                    if ($scope.detailes.lots[a].auctionPeriod !== null) {
                        if ($scope.detailes.lots[a].auctionPeriod.startDate !== null)
                            $scope.detailes.lotsStartAuction.push(Date.parse($scope.detailes.lots[a].auctionPeriod.startDate));
                        if ($scope.detailes.lots[a].auctionPeriod.endDate !== null)
                            $scope.detailes.lotsEndAuction.push(Date.parse($scope.detailes.lots[a].auctionPeriod.endDate));
                    }
                }

                if ($scope.detailes.lotsStartAuction.length > 0) {
                    $scope.detailes.auctionFirstStartDate = Math.min.apply(null, $scope.detailes.lotsStartAuction);
                    $scope.detailes.auctionLastStartDate = Math.max.apply(null, $scope.detailes.lotsStartAuction);
                }
                if ($scope.detailes.lotsEndAuction.length > 0) {
                    $scope.detailes.auctionFirstEndDate = Math.min.apply(null, $scope.detailes.lotsEndAuction);
                    $scope.detailes.auctionLastEndDate = Math.max.apply(null, $scope.detailes.lotsEndAuction);
                }
            }
        }
    }
]);
angular.module('app').service('getTenderService', [
    '$localStorage',
    'lookupService',
    '$window',
    'tenderHelperService',
    '$location',
    '$timeout',
    'setCurrentCancelLotForModalService',
    'findLotService',
    'documentsService',
    'getAuctionDatesService',
    'documentsService',
    'menuPressService',
    'tenderHasBidsService',
    'abp.services.etender.complaintCommon',
    'activateNavigationService',
    function (
        $localStorage,
        lookupService,
        $window,
        tenderHelperService,
        $location,
        $timeout,
        setCurrentCancelLotForModalService,
        findLotService,
        documentsService,
        getAuctionDatesService,
        documentsService,
        menuPressService,
        tenderHasBidsService,
        complaintCommon,
        activateNavigationService
    ) {
        return new function () {
            function goToAnotherBlock(url, $scope) {
                if (url.indexOf('?monitoringid') !== -1) {
                    $scope.naviBlock = 'menuDasuBlock';
                    var monitoringid = $location.$$url.slice(-22);
                    goToMonitoring(monitoringid, $scope);
                }
            }
            function goToMonitoring(goTo, $scope) {
                $scope.detailes.showDasu = goTo;
                menuPressService.menuPress('menuDasuBlock', $scope);
            }
            function setAwards(awards) {
                awards.forEach(function (award, i, arr) {
                    award.awardDocuments = documentsService.sortListOfDocs(award.awardDocuments);
                });
            }
            function getPendingAwards(data) {
                if (!data.lots || !data.lots.length || !data.lots[0].awards) return;
                var awards = data.lots[0].awards;
                var value = 0;
                for (var i = 0; i < awards.length; i++) {
                    if (awards[i].status === 'pending') value++;
                }
                return value;
            }
            function reloadComplaints (_tenderId, $scope) {
                var getComplaintsForTender = complaintCommon.getTenderComplaints({ "tenderId": _tenderId });
                getComplaintsForTender.then(function (response) {
                    $scope.complaints = response.data.complaints;
                    $scope.vm.complaintsCount = $scope.complaints.length;
                });
            };

            function showDeliveryAddress (data) {
                data.deliveryAddressShow = [];
                if (data.deliveryAddress) {
                    if (data.deliveryAddress.postIndex)
                        data.deliveryAddressShow.push({
                            id: 'delivery_postIndex_0',
                            data: data.deliveryAddress.postIndex
                        });
                    if (data.deliveryAddress.country && data.deliveryAddress.country.title)
                        data.deliveryAddressShow.push({
                            id: 'delivery_country_0',
                            data: data.deliveryAddress.country.title
                        });
                    if (data.deliveryAddress.region && data.deliveryAddress.region.title)
                        data.deliveryAddressShow.push({
                            id: 'delivery_region_0',
                            data: data.deliveryAddress.region.title
                        });
                    if (data.deliveryAddress.locality)
                        data.deliveryAddressShow.push({
                            id: 'delivery_locality_0',
                            data: data.deliveryAddress.locality
                        });
                    if (data.deliveryAddress.city && data.deliveryAddress.city.title)
                        data.deliveryAddressShow.push({
                            id: 'delivery_city_0',
                            data: data.deliveryAddress.city.title
                        });
                    if (data.deliveryAddress.addressStr)
                        data.deliveryAddressShow.push({
                            id: 'delivery_addressStr_0',
                            data: data.deliveryAddress.addressStr
                        });
                }
            };

            this.getTenderThen = function (data, $scope, skipReloadComplaints) {
                $scope.getTenderBefore();
                $scope.detailes = data;
                $scope.tId = data.id;
                documentsService.loadDocumentTypes($scope);
                if ($scope.detailes.countOfComplaints > 0 && !skipReloadComplaints) {
                    reloadComplaints($scope.tId, $scope);
                }
                $timeout(activateNavigationService.activateNavigation($scope), 1000);

                //if ($localStorage.isAuthorized && $scope.detailes.isEdit && $scope.detailes.canSigned)
                //    abp.notify.warn($scope.$root.source('DontForgerSign'));

                if ($location.$$url.indexOf('?') !== -1) {
                    goToAnotherBlock($location.$$url, $scope);
                }

                if (data.procurementMethodType === 'closeFrameworkAgreementUA') {
                    data.pendingAwards = getPendingAwards(data);
                }

                $timeout($scope.showButton, 2000);
                $scope.tenderQuestions = $scope.detailes.questions;
                $scope.tenderComplaints = $scope.detailes.complaints;

                // save open block after reload page
                $scope.ifDozorroBlockOpen = [data.id, 'menuDozorroBlock'];
                if ($localStorage.openBlockInTender && $scope.ifDozorroBlockOpen[0] === $localStorage.openBlockInTender[0]
                    && $scope.ifDozorroBlockOpen[1] === $localStorage.openBlockInTender[1]) {
                    menuPressService.menuPress('menuDozorroBlock', $scope);
                }
                $scope.ifQuestionsBlockOpen = [data.id, 'menuQuestionsBlock'];
                if ($localStorage.openBlockInTender && $scope.ifQuestionsBlockOpen[0] === $localStorage.openBlockInTender[0]
                    && $scope.ifQuestionsBlockOpen[1] === $localStorage.openBlockInTender[1]) {
                    menuPressService.menuPress('menuQuestionsBlock', $scope);
                }
                $scope.ifComplainBlock = [data.id, 'menuComplainBlock'];
                if ($localStorage.openBlockInTender && $scope.ifComplainBlock[0] === $localStorage.openBlockInTender[0]
                    && $scope.ifComplainBlock[1] === $localStorage.openBlockInTender[1]) {
                    menuPressService.menuPress('menuComplainBlock', $scope);
                }
                $scope.ifDasuBlock = [data.id, 'menuDasuBlock'];
                if ($localStorage.openBlockInTender && $scope.ifDasuBlock[0] === $localStorage.openBlockInTender[0]
                    && $scope.ifDasuBlock[1] === $localStorage.openBlockInTender[1]) {
                    menuPressService.menuPress('menuDasuBlock', $scope);
                }

                tenderHasBidsService.setTenderHasBids(data, $scope);

                $scope.lotSet = function () {
                    var a = 0;
                    var length = $scope.detailes.lots.length;
                    for (a; a < length; a++) {
                        $scope.detailes.lots[a].index = a;
                        $scope.detailes.lots[a].featuresLot = angular.copy(data.lots[a].features);
                        $scope.detailes.lots[a].featuresTender = angular.copy($scope.detailes.features);
                        if ($scope.detailes.lots[a].awards && $scope.detailes.lots[a].awards.length)
                            setAwards($scope.detailes.lots[a].awards);
                    }
                }
                $scope.lotSet();

                console.log('tenderDetailes', data);
                //console.log( data.url);
                $scope.hasSign = $window.signDiff;

                getAuctionDatesService.getAuctionDates($scope);

                if (data.enquiryPeriod) {
                    enquiryPeriodEnd = data.enquiryPeriod.endDate;
                    $scope.detailes.enquiryPeriod.enquiryPeriodEnd = Date.parse(enquiryPeriodEnd);

                    tenderPeriodEnd = data.tenderPeriod.endDate;
                    $scope.detailes.tenderPeriod.tenderPeriodEnd = Date.parse(tenderPeriodEnd);
                }

                //var a = 0;
                //for (a; a <= $scope.detailes.lots.length - 1; a++) {
                //    $scope.detailes.lots[a].auctionPeriod.lotStartAuction = Date.parse($scope.detailes.lots[a].auctionPeriod.startDate);
                //}

                $scope.detailes.isLimitedReporting = lookupService.isLimitedReporting(data.procurementMethodType);

                if ($scope.cancelTenderModel && $scope.cancelTenderModel.cancelFor) { // если делаем reload из модального окна отмены тендера/лота
                    setCurrentCancelLotForModalService.setCurrentCancellationsForModal(findLotService.findLotById($scope.cancelTenderModel.cancelFor.lotId, $scope), $scope);
                }

                $scope.statusDescription = lookupService.getTenderStatusDesc($scope.detailes.status, $scope.detailes.procurementMethodType, $scope.detailes.notExport);

                if ($scope.detailes.documents !== null && $scope.detailes.documents instanceof Array) {
                    var docs = $scope.detailes.documents;
                    docs.forEach(function (doc) {
                        if (doc.title == 'sign.p7s')
                            $scope.detailes.isSignatureFileExist = true;
                    });
                    $scope.forceCheckSign = $scope.detailes.isSignatureFileExist !== true; // если файла подписи нет - то проверка подписи не вызывает обращение к скриптам ЦБД
                    $scope.detailes.documents = [];
                    $scope.detailes.documents = documentsService.sortListOfDocs(docs);
                }

                if ($scope.detailes.lots)
                    angular.forEach($scope.detailes.lots, function (lot) {
                        lot.messageEndContract = false; // message: "У Вас є незавершена зміна до ...."
                        if (lot.awards)
                            angular.forEach(lot.awards, function (award) {
                                if (award.contracts)
                                    angular.forEach(award.contracts, function (contract) {
                                        contract.documents = documentsService.sortListOfDocs(contract.documents);
                                    });
                                if (award.contractings)
                                    angular.forEach(award.contractings, function (contract) {
                                        contract.documents = documentsService.sortListOfDocs(contract.documents);
                                        if (contract.changes) {
                                            angular.forEach(contract.changes, function (change) {
                                                if (change.status === 'pending') {
                                                    lot.messageEndContract = true; // message: "У Вас є незавершена зміна до ...."
                                                }

                                            });
                                        };
                                    });
                            });

                        if (lot.qualifications)
                            angular.forEach(lot.qualifications, function (qualification) {
                                qualification.bidDocuments = documentsService.sortListOfDocs(qualification.bidDocuments);
                            });
                    });

                $scope.validDocPeriod = tenderHelperService.validDocPeriod($scope.detailes);
                if ($scope.detailes.cancellations) {
                    $scope.detailes.cancellations.forEach(function (c) {
                        switch (c.status) {
                            case 'pending':
                                c.statusDesc = 'Запит оформляється';
                            case 'active':
                                c.statusDesc = 'Скасування активоване';
                            default:
                                c.statusDesc = '-';
                        }
                    });
                }

                if ($localStorage.getAwards)
                    $scope.detailes.hasPendingAwards = false;

                abp.ui.clearBusy();
                $timeout($scope.showBlock, 400);
                $timeout($scope.setTreeState, 100);

                if ($scope.detailes.bids && $scope.detailes.bids.length > 0) {
                    angular.forEach($scope.detailes.bids, function (bid) {
                        bid.documents = documentsService.sortListOfDocs(bid.documents);
                    });
                } else
                    angular.forEach($scope.detailes.lots, function (lot) {
                        angular.forEach(lot.bids, function (bid) {
                            bid.documents = documentsService.sortListOfDocs(bid.documents);
                        });
                    });

                //set is bid exists
                if (data.bids != null && data.bids.length > 0) {
                    //$scope.isBidExist = true;
                    for (var bidNumber = 0; bidNumber < data.bids.length; bidNumber++) {
                        if (data.bids[bidNumber].documents && data.bids[bidNumber].documents.length != 0) continue;

                        data.bids[bidNumber].documents = documentsService.sortListOfDocs(data.bids[bidNumber].documents);

                        if (!data.bids[bidNumber].isMyBid) continue;

                        for (var docNumber = 0; docNumber < data.bids[bidNumber].documents.length; docNumber++) {
                            var docUrl = data.bids[bidNumber].documents[docNumber].url;
                            if (docUrl && docUrl != '') {
                                var input = {
                                    fileUri: docUrl
                                };
                                var getRightUrl = filePath.getDownloadUrlForPrivateDoc(input);

                                (function (bidNumber, docNumber, getRightUrl) {

                                    getRightUrl.then(function (response) {
                                        $scope.detailes.bids[bidNumber].documents[docNumber].url = response.data;
                                    });
                                })(bidNumber, docNumber, getRightUrl);
                            }
                        }
                    }
                } else {
                    //$scope.isBidExist = false;
                    angular.forEach(data.lots, function (lot) {
                        if (lot.bids && lot.bids.length) {
                            for (var bidNumber = 0; bidNumber < lot.bids.length; bidNumber++) {
                                if (lot.bids[bidNumber].documents && lot.bids[bidNumber].documents.length != 0) continue;
    
                                lot.bids[bidNumber].documents = documentsService.sortListOfDocs(lot.bids[bidNumber].documents);
    
                                if (!lot.bids[bidNumber].isMyBid) continue;
    
                                for (var docNumber = 0; docNumber < lot.bids[bidNumber].documents.length; docNumber++) {
                                    var docUrl = lot.bids[bidNumber].documents[docNumber].url;
                                    if (docUrl && docUrl != '') {
                                        var input = {
                                            fileUri: docUrl
                                        };
                                        var getRightUrl = filePath.getDownloadUrlForPrivateDoc(input);
    
                                        (function (bidNumber, docNumber, getRightUrl) {
    
                                            getRightUrl.then(function (response) {
                                                $scope.detailes.bids[bidNumber].documents[docNumber].url = response.data;
                                            });
                                        })(bidNumber, docNumber, getRightUrl);
                                    }
                                }
                            }
                        }
                    });
                }

                for (var j = 0; j < $scope.detailes.lots.length; j += 1) {

                    var lot = $scope.detailes.lots[j];

                    var docs = lot.documents;
                    lot.documents = [];
                    lot.documents = documentsService.sortListOfDocs(docs);
                    lot.items.forEach(function (item) {
                        var itemDocs = item.documents;
                        item.documents = [];
                        item.documents = documentsService.sortListOfDocs(itemDocs);
                    });

                    if (lot.awards && lot.awards.length) {
                        for (var i = 0; i < lot.awards.length; i += 1) {
                            var curAward = lot.awards[i];
    
                            if (curAward && curAward.bidDocuments && curAward.bidDocuments.length > 0)
                                curAward.bidDocuments = documentsService.sortListOfDocs(curAward.bidDocuments);
                            if (curAward && curAward.awardDocuments && curAward.awardDocuments.length > 0)
                                curAward.awardDocuments = documentsService.sortListOfDocs(curAward.awardDocuments);
    
                            if (curAward.status == 'active' || curAward.status == 'cancel') {
    
                                lot.awardId = curAward.id;
                                lot.activeAward = curAward;
                                lot.hasActiveAward = curAward.status == 'active';
                                lot.winner = {
                                    name: curAward.suppliers && curAward.suppliers.length > 0 ? curAward.suppliers[0].name : null
                                };
                                lot.isExportedAwardDocs = documentsService.checkDocumentsIsExported(lot.activeAward.awardDocuments);
    
                                if (curAward.contracts.length > 0) {
                                    lot.hasContract = true;
                                    lot.contractStatusKey = curAward.contracts[0].status;
                                }
    
                                if (curAward.contractings.length > 0) {
                                    lot.hasContracting = true;
                                }
    
                                break;
                            }
    
                            if (curAward.status == 'pending' && curAward.cancelAwardId) {
    
                                lot.awardIsReadyForAnnuled = true;
                                lot.pendingAward = curAward;
                                lot.readyForAnulledAward = curAward;
                                lot.winner = {
                                    name: curAward && curAward.suppliers && curAward.suppliers.length > 0 ? curAward.suppliers[0].name : null
                                };
                                lot.readyForAnulledAward.awardDocuments = lot.readyForAnulledAward.awardDocuments.filter(function (doc) {
                                    return doc.documentTypeId != 1;
                                });
                                lot.isExportedAwardDocs = documentsService.checkDocumentsIsExported(lot.readyForAnulledAward.awardDocuments);
                                break;
                            }
    
    
                            if (curAward.status == 'pending' && !curAward.cancelAwardId) {
    
                                lot.pendingAward = curAward;
                                lot.winner = {
                                    name: curAward.suppliers && curAward.suppliers.length > 0 ? curAward.suppliers[0].name : null
                                };
                                lot.isExportedAwardDocs = documentsService.checkDocumentsIsExported(lot.pendingAward.awardDocuments);
                                break;
                            }
    
    
                        }
                    }

                    if (lot.hasActiveAward && $scope.detailes.status == 'active.awarded') {
                        $scope.statusClarify = '[Переможця визначено]';
                    } else {
                        $scope.statusClarify = null;
                    }
                    if ($scope.detailes.lots && $scope.detailes.lots.length) {
                        $scope.detailes.lots.forEach(function (lot) {
                            if (lot.items && lot.items.length) {
                                lot.items.forEach(function (item) {
                                    showDeliveryAddress(item);
                                });
                            }
                        });
                    }

                }
                $timeout($scope.getTree, 100);
            }
        }
    }
])
;
angular.module('app').service('loadTypesAndConfident', [
    '$rootScope',
    'lookupService',
    '$localStorage',
    'abp.services.etender.document',
    '$q',
    'referenceService',
    function (
        $rootScope,
        lookupService,
        $localStorage,
        documentAppService,
        $q,
        referenceService) {

        this.getConfidentialityTypes = function (bidSetting) {
            if (bidSetting && bidSetting.bidDocument && bidSetting.bidDocument.isShowConfidentialityBuyerOnly) {
                if (bidSetting.bidDocument.isShowConfidentialityRationale)
                    return lookupService.confidentialityTypes;
                else
                    return lookupService.confidentialityTypesDialogue;
            }
            return null;
        }

        this.getData = function (tender, currentLot) {
            var data = {
                confidentialityTypes: {},
                documentTypesForDropDown: $localStorage.refs.documentTypes.bidDocument
            }

            data.confidentialityTypes = this.getConfidentialityTypes(tender.bidSetting);

            if ((tender.isDialogue || tender.isDialogueEU) && data.documentTypesForDropDown) {
                data.documentTypesForDropDown = data.documentTypesForDropDown.filter(function (item) {
                    return item.type !== 'commercialProposal'
                        && item.type !== 'billOfQuantity'
                        && item.type !== 'winningBid';
                });
            }

            data.documentTypesForDropDown = data.documentTypesForDropDown.filter(function (item) {
                return item.type !== 'evidence';
            });
            
            // для европейских - выводим подсказки о времени раскрытия доков
            if (tender.isOpenEU && $localStorage.refs.documentTypes && data.documentTypesForDropDown) {
                data.documentTypesForDropDown.map(function (item) {
                    switch (item.type) {
                        case 'commercialProposal':
                            if (currentLot && currentLot.auctionPeriod && !currentLot.auctionPeriod.endDate) item.title = $rootScope.source('CommercialProposalEu'); 
                            if (currentLot && currentLot.auctionPeriod && currentLot.auctionPeriod.endDate) item.title = $rootScope.source('CommercialProposal');
                            break;
                        case 'qualificationDocuments':
                            if (currentLot && currentLot.auctionPeriod && !currentLot.auctionPeriod.endDate) item.title = $rootScope.source('QualificationDocumentsEu');
                            if (currentLot && currentLot.auctionPeriod && currentLot.auctionPeriod.endDate) item.title = $rootScope.source('QualificationDocuments');
                            break;
                        case 'eligibilityDocuments':
                            if (currentLot && currentLot.auctionPeriod && !currentLot.auctionPeriod.endDate) item.title = $rootScope.source('EligibilityDocumentsEu'); 
                            if (currentLot && currentLot.auctionPeriod && currentLot.auctionPeriod.endDate) item.title = $rootScope.source('EligibilityDocuments');
                            break;
                        case 'technicalSpecifications':
                            if (currentLot && currentLot.auctionPeriod && !currentLot.auctionPeriod.endDate) item.title = $rootScope.source('TechnicalSpecificationsEu'); 
                            if (currentLot && currentLot.auctionPeriod && currentLot.auctionPeriod.endDate) item.title = $rootScope.source('TechnicalSpecifications');
                            break;
                        case 'billOfQuantity':
                            if (currentLot && currentLot.auctionPeriod && !currentLot.auctionPeriod.endDate) item.title = $rootScope.source('BillOfQuantityEu'); 
                            if (currentLot && currentLot.auctionPeriod && currentLot.auctionPeriod.endDate) item.title = $rootScope.source('BillOfQuantity');
                            break;
                        case 'winningBid':
                            if (currentLot && currentLot.auctionPeriod && !currentLot.auctionPeriod.endDate) item.title = $rootScope.source('WinningBidEu'); 
                            if (currentLot && currentLot.auctionPeriod && currentLot.auctionPeriod.endDate) item.title = $rootScope.source('WinningBid');
                            break;
                    }
                    return item;
                });
            }
            // для остальных типов процедур - НЕ выводим подсказки о времени раскрытия доков
            if (!tender.isOpenEU && $localStorage.refs.documentTypes && data.documentTypesForDropDown) {
                data.documentTypesForDropDown.map(function (item) {
                    switch (item.type) {
                        case 'commercialProposal':
                            item.title = $rootScope.source('CommercialProposal');
                            break;
                        case 'qualificationDocuments':
                            item.title = $rootScope.source('QualificationDocuments'); break;
                        case 'eligibilityDocuments':
                            item.title = $rootScope.source('EligibilityDocuments'); break;
                        case 'technicalSpecifications':
                            item.title = $rootScope.source('TechnicalSpecifications'); break;
                        case 'billOfQuantity':
                            item.title = $rootScope.source('BillOfQuantity'); break;
                        case 'winningBid':
                            item.title = $rootScope.source('WinningBid'); break;
                    }
                    return item;
                });
            }

            return data;
        };
        this.getDocumentTypesForAll = function () {
            var deferred = $q.defer();
            var getDocumentTypesForAll = referenceService.getAllDocumentTypes();
            getDocumentTypesForAll.then(function (response) {
                //todo ET-13913 костыль, чтобы временно убрать тип документа контрактинга 
                if (response.data != null && response.data.contractingDocument != null) {
                    response.data.contractingDocument.forEach(function (item, i) {
                        if (item.type === 'change')
                            response.data.contractingDocument.splice(i, 1);
                    });
                }
                deferred.resolve(response.data);
            });
            return deferred.promise;
        }
    }
]);

;
(function () {
    'use strict';

    angular
        .module('app')
        .service('lookupService', lookupService);

    lookupService.$inject = ['$rootScope'];

    function lookupService($rootScope) {

        var allCauses = [
            {
                title: 'Закупівля творів мистецтва або закупівля, пов’язана із захистом прав інтелектуальної власності, або укладення договору про закупівлю з переможцем архітектурного чи мистецького конкурсу',
                value: 'artContestIP'
            }, {
                title: 'Закупівля товарів за процедурою відновлення платоспроможності боржника згідно із законодавством',
                value: 'resolvingInsolvency'
            }, {
                title: 'Роботи, товари чи послуги можуть бути виконані, поставлені чи надані виключно певним суб’єктом господарювання',
                value: 'noCompetition'
            }, {
                title: 'Виникла нагальна потреба здійснити закупівлю у разі настання підстав, що перераховані в абзацах 2-6 пункту 3 частини 2 статті 40 Закон',
                value: 'quick'
            }, {
                title: 'Двічі відмінено процедуру відкритих торгів, у тому числі частково (за лотом), через відсутність достатньої кількості тендерних пропозицій, визначеної цим Законом',
                value: 'twiceUnsuccessful'
            }, {
                title: 'Виникла необхідність у постачанні додаткового обсягу товару у того самого постачальника, що здійснюється протягом трьох років після укладення договору про закупівлю і загальна вартість такого постачання не перевищує 50 відсотків ціни договору про закупівлю',
                value: 'additionalPurchase'
            }, {
                title: 'Виникла необхідність у закупівлі додаткових аналогічних робіт чи послуг у того самого учасника, що передбачені в основному договорі про закупівлю, який укладений за результатами проведення тендера та/або здійснюється протягом трьох років після укладення договору про закупівлю і загальна вартість таких робіт чи послуг не перевищує 50 відсотків ціни основного договору про закупівлю',
                value: 'additionalConstruction'
            }, {
                title: 'Закупівля юридичних послуг, пов’язаних із захистом прав та інтересів України, захисту національної безпеки і оборони, а також закупівлі товарів, робіт і послуг у разі участі замовника на підставі рішення Кабінету Міністрів України в міжнародних виставкових заходах',
                value: 'stateLegalServices'
            }, {
                title: "Предмет закупівлі полягає у створенні або придбанні витвору мистецтва",
                value: 'artPurchase'
            }, {
                title: 'Укладення договору з переможцем архітектурного або мистецького конкурсу',
                value: 'contestWinner'
            }, {
                title: 'Відсутність конкуренції з технічних причин',
                value: 'technicalReasons'
            }, {
                title: 'Необхідність захисту прав інтелектуальної власності',
                value: 'intProperty'
            }, {
                title: 'Укладення договору з постачальником останньої надії',
                value: 'lastHope'
            }, {
                title: 'Виникнення особливих економічних обставин з негайною ліквідацією наслідків надзвичайних ситуацій',
                value: 'emergency'
            }, {
                title: 'Надання Україною гуманітарної допомоги іншим державам',
                value: 'humanitarianAid'
            }, {
                title: 'Розірвання договору про закупівлю з вини учасника',
                value: 'contractCancelled'
            }, {
                title: 'Оскарження прийнятих рішень, дій чи бездіяльності замовника щодо триваючого тендера',
                value: 'activeComplaint'
            }
        ];

        var disqualifyDefenseCauses = [
            {
                title: 'Ненадання або несвоєчасне надання учасником одиниці товару на перевірку відповідності зразку-еталону (якщо подання одиниці товару вимагалося в оголошенні про проведення відбору) та/або іншим вимогам замовника до предмета закупівлі, зазначеним в оголошенні про проведення відбору, або документів про підтвердження відповідності товару, роботи чи послуги технічним, якісним та кількісним характеристикам предмета закупівлі, визначеним замовником',
                description: ''
            },
            {
                title: 'Невідповідність товарів, робіт чи послуг учасника технічним, якісним та кількісним характеристикам предмета закупівлі',
                description: ''
            },
            {
                title: 'Відсутність підтвердження подання забезпечення цінової пропозиції (якщо подання забезпечення вимагалося замовником в оголошенні про проведення відбору)',
                description: ''
            },
            {
                title: 'Відмова або неучасть учасника відбору в переговорах, призначених у визначену замовником дату їх проведення',
                description: ''
            },
            {
                title: 'Відмова учасника відбору від участі в переговорах з ціною/приведеною ціною, поданою ним за результатами проведеного аукціону',
                description: ''
            },
            {
                title: 'Невідповідність учасника кваліфікаційним критеріям та вимогам, визначеним у статті 17 Закону України "Про публічні закупівлі"',
                description: ''
            },
            {
                title: 'Неусунення учасником недоліків у поданих ним документах протягом наступних 24 годин з моменту ознайомлення учасника з такими недоліками під час проведення переговорів',
                description: ''
            },
            {
                title: 'Якщо учасник протягом одного року до дати проведення електронного аукціону вчинив порушення в одного й того самого замовника: не брав участі або відмовився від участі в переговорній процедурі закупівлі до оприлюднення повідомлення про намір укласти договір - більше трьох разів',
                description: ''
            },
            {
                title: 'Якщо учасник протягом одного року до дати проведення електронного аукціону вчинив порушення в одного й того самого замовника: відмовився від підписання договору про закупівлю у визначені замовником терміни - більше двох разів',
                description: ''
            },
            {
                title: 'Якщо учасник протягом одного року до дати проведення електронного аукціону вчинив порушення в одного й того самого замовника: не виконав умови договору щодо якості та/або терміну поставлених товарів, виконаних робіт, наданих послуг - більше одного разу',
                description: ''
            }
        ];
        var disqualifyCauses = [
            {
                title: 'Учасник процедури закупівлі не відповідає кваліфікаційним (кваліфікаційному) критеріям, установленим статтею 16 Закону та/або наявні підстави, встановлені частиною першою статті 17 Закону',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі не відповідає встановленим абзацом першим частини третьої статті 22 Закону вимогам до учасника відповідно до законодавства',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі зазначив у тендерній пропозиції недостовірну інформацію, що є суттєвою при визначенні результатів процедури закупівлі, яку замовником виявлено згідно з частиною п’ятнадцятою статті 29 Закону',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі не надав забезпечення тендерної пропозиції, якщо таке забезпечення вимагалося замовником, та/або забезпечення тендерної пропозиції не відповідає умовам, що визначені замовником у тендерній документації до такого забезпечення тендерної пропозиції',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі не виправив виявлені замовником після розкриття тендерних пропозицій невідповідності в інформації та/або документах, що подані ним у своїй тендерній пропозиції, протягом 24 годин з моменту розміщення замовником в електронній системі закупівель повідомлення з вимогою про усунення таких невідповідностей',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі не надав обґрунтування аномально низької ціни тендерної пропозиції протягом строку, визначеного в частині чотирнадцятій статті 29 Закону',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі визначив конфіденційною інформацію, що не може бути визначена як конфіденційна відповідно до вимог частини другої статті 28 Закону',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі не надав належного обґрунтування ціни або вартості тендерної пропозиції, що була визначена електронною системою закупівель як аномально низька (відповідно до частини 14 статті 29 Закону)',
                description: ''
            },
            {
                title: 'Учасник процедури закупівлі не виконав свої зобов’язання за раніше укладеним договором про закупівлю з цим самим замовником, що призвело до його дострокового розірвання, і було застосовано санкції у вигляді штрафів та/або відшкодування збитків протягом трьох років з дати дострокового розірвання такого договору.',
                description: ''
            },
            {
                title: 'Тендерна пропозиція учасника не відповідає умовам технічної специфікації та іншим вимогам щодо предмета закупівлі тендерної документації',
                description: ''
            },
            {
                title: 'Тендерна пропозиція учасника викладена іншою мовою (мовами), аніж мова (мови), що вимагається тендерною документацією',
                description: ''
            },
            {
                title: 'Тендерна пропозиція учасника є такою, строк дії якої закінчився',
                description: ''
            },
            {
                title: 'Переможець процедури закупівлі відмовився від підписання договору про закупівлю відповідно до вимог тендерної документації або укладення договору про закупівлю',
                description: ''
            },
            {
                title: 'Переможець процедури закупівлі не надав у спосіб, зазначений в тендерній документації, документи, що підтверджують відсутність підстав, установлених статтею 17 Закону',
                description: ''
            },
            {
                title: 'Переможець процедури закупівлі не надав копію ліцензії або документа дозвільного характеру (у разі їх наявності) відповідно до частини другої статті 41 Закону',
                description: ''
            },
            {
                title: 'Переможець процедури закупівлі не надав забезпечення виконання договору про закупівлю, якщо таке забезпечення вимагалося замовником',
                description: ''
            }
        ];

        var disqualifyBelowCauses = [
            {
                title: 'Пропозиція учасника не відповідає умовам, визначеним в оголошенні про проведення спрощеної закупівлі, та вимогам до предмета закупівлі'
            },
            {
                title: 'Учасник не надав забезпечення пропозиції, якщо таке забезпечення вимагалося замовником'
            },
            {
                title: 'Учасник, який визначений переможцем спрощеної закупівлі, відмовився від укладення договору про закупівлю'
            },
            {
                title: 'Учасник протягом одного року до дати оприлюднення оголошення про проведення спрощеної закупівлі відмовився від підписання договору про закупівлю (у тому числі через неукладення договору з боку учасника) більше двох разів із замовником, який проводить таку спрощену закупівлю'
            }
        ];

        var disqualifyPQCauses = [
            {
                title: 'Переможець процедури закупівлі відмовився від підписання договору про закупівлю відповідно до вимог тендерної документації або укладення договору про закупівлю'
            }
        ];

        this.getDisqualifyDefenseCauses = function () {
            return disqualifyDefenseCauses;
        };

        this.getDisqualifyCauses = function () {
            return disqualifyCauses;
        };

        this.getDisqualifyBelowCauses = function () {
            return disqualifyBelowCauses;
        };

        this.getDisqualifyPQCauses = function () {
            return disqualifyPQCauses;
        };


        this.getCause = function (value) {
            if (value && value.title && value.value)
                return value;
            for (var j = 0; j < allCauses.length; j += 1) {
                if (allCauses[j].value === value) {
                    return {
                        title: allCauses[j].title,
                        value: value
                    };
                }
            }
            return null;
        };


        this.languages = [
            {
                title: 'українська',
                code: 'uk'
            }, {
                title: 'англійська',
                code: 'en'
            }, {
                title: 'російська',
                code: 'ru'
            }
        ];
        this.getLanguage = function (code) {
            switch (code) {
                case 'uk':
                    return this.languages[0];
                case 'en':
                    return this.languages[1];
                case 'ru':
                    return this.languages[2];
                default:
                    return {};
            }
        };


        this.confidentialityTypes = [
            {
                title: $rootScope.source('PublicDocument'),
                value: 'public',
                valueType: 'publicType'
            }, {
                title: $rootScope.source('PrivateDocument'),
                value: 'buyerOnly',
                valueType: 'buyerOnlyType'
            }
        ];

        this.confidentialityTypesDialogue = [
            {
                title: $rootScope.source('PublicDocument'),
                value: 'public',
                valueType: 'publicType'
            }, {
                title: $rootScope.source('PrivateDocument'),
                value: 'buyerOnly',
                valueType: 'buyerOnlyType'
            }, {
                title: $rootScope.source('DecisionDescriptionDialogue'),
                value: 'buyerOnly',
                valueType: 'decisionDescriptionType'
            }
        ];

        this.getTenderProcedureType = function (procurementMethodType, isFilter) {
            if ((isFilter || !isFilter) && isFilter !== undefined) {
                switch (procurementMethodType) {
                    case 'belowThreshold':
                        return 'Допорогова закупівля';
                    case 'belowThresholdSimple':
                        return 'Спрощена закупівля';
                }
            }
            switch (procurementMethodType) {
                case 'belowThreshold':
                    return 'Спрощена/Допорогова закупівля';
                case 'priceQuotation':
                    return 'Запит ціни пропозиції';
                case 'aboveThresholdUA':
                    return $rootScope.source('OpenMarket');
                case 'aboveThresholdEU':
                    return $rootScope.source('OpenMarketEU');
                case 'reporting':
                    return $rootScope.source('Reporting');
                case 'negotiation':
                    return $rootScope.source('Negotiation');
                case 'negotiation.quick':
                    return $rootScope.source('NegotiationQuick');
                case 'aboveThresholdUA.defense':
                    return $rootScope.source('Defense');
                case 'simple.defense':
                    return $rootScope.source('SimpleDefense');
                case 'competitiveDialogueUA':
                    return $rootScope.source('Dialogue');
                case 'competitiveDialogueUA.stage2':
                    return $rootScope.source('DialogueStage2');
                case 'competitiveDialogueEU':
                    return $rootScope.source('DialogueEU');
                case 'competitiveDialogueEU.stage2':
                    return $rootScope.source('DialogueEUStage2');
                case 'esco':
                    return $rootScope.source('Esco');
                case 'closeFrameworkAgreementUA':
                    return $rootScope.source('closeFrameworkAgreementUA');
                case 'closeFrameworkAgreementSelectionUA':
                    return $rootScope.source('AgreementSelectionTender');
                case 'centralizedProcurement':
                    return $rootScope.source('ProcurementThroughCentralizedPurchasingOrganization');
                case null:
                    return $rootScope.source('WithoutProcurementMethodType');
                default:
                    return null;
            }
        };

        this.isBelow = function (procurementMethodType) {
            return procurementMethodType == 'belowThreshold';
        };

        this.isLimitedReporting = function (procurementMethodType) {
            return procurementMethodType == 'reporting';
        };

        this.isLimitedNegotiation = function (procurementMethodType) {
            return procurementMethodType == 'negotiation';
        };

        this.isLimitedNegotiationQuick = function (procurementMethodType) {
            return procurementMethodType == 'negotiation.quick';
        };

        this.isOpenUA = function (procurementMethodType) {
            return procurementMethodType == 'aboveThresholdUA';
        };

        this.isOpenEU = function (procurementMethodType) {
            return procurementMethodType == 'aboveThresholdEU';
        };

        this.isDefense = function (procurementMethodType) {
            return procurementMethodType == 'aboveThresholdUA.defense';
        };

        this.isSimpleDefense = function (procurementMethodType) {
            return procurementMethodType == 'simple.defense';
        };

        this.isDialogue = function (procurementMethodType) {
            return procurementMethodType == 'competitiveDialogueUA';
        };

        this.isDialogueStage2 = function (procurementMethodType) {
            return procurementMethodType == 'competitiveDialogueUA.stage2';
        };

        this.isDialogueEU = function (procurementMethodType) {
            return procurementMethodType == 'competitiveDialogueEU';
        };

        this.isEsco = function (procurementMethodType) {
            return procurementMethodType == 'esco';
        };

        this.isDialogueEUStage2 = function (procurementMethodType) {
            return procurementMethodType == 'competitiveDialogueEU.stage2';
        };
        
        this.agreementTender = function (procurementMethodType) {
            return procurementMethodType == 'closeFrameworkAgreementUA';
        };

        this.agreementSelectionTender = function (procurementMethodType) {
            return procurementMethodType == 'closeFrameworkAgreementSelectionUA';
        };

        this.isAbove = function (procurementMethodType) {
            return !this.isBelow(procurementMethodType)
                && !this.isLimitedReporting(procurementMethodType)
                && !this.isLimitedNegotiation(procurementMethodType)
                && !this.isLimitedNegotiationQuick(procurementMethodType);
        };

        // Tenders

        this.getTenderArchiveStatuses = [
            'unsuccessful',
            'complete',
            'cancelled'
        ];

        this.getTenderDefaultStatuses = [
            'active.enquiries',
            'active.tendering',
            'active.pre-qualification',
            'active.pre-qualification.stand-still',
            'active.stage2.pending',
            'active.stage2.waiting',
            'active.auction',
            'active.qualification',
            'active.qualification.stand-still',
            'active.awarded'
        ];

        this.getTenderLabelClass = function (status, corporationStatus) {
            if (corporationStatus != null) {
                switch (corporationStatus) {
                    case 'preparation':
                        return 'label-info';
                    case 'pendingApproval':
                        return 'label-warning';
                    case 'canceledApproval':
                        return 'label-danger';
                    case 'approved':
                        return 'label-success';
                    default:
                        return '';
                }
            }
            switch (status) {
                case ('active.enquiries'):
                    return "label-info";
                case ('active.tendering'):
                    return 'label-success';
                case ('active.pre-qualification'):
                    return 'label-warning';
                case ('active.pre-qualification.stand-still'):
                    return 'label-danger';
                case ('active.auction'):
                    return 'label-warning';
                case ('active.qualification'):
                    return 'label-warning';
                case ('active.awarded'):
                    return 'label-danger';
                case ('active'):
                    return 'label-warning';
                case ('unsuccessful'):
                    return 'label-primary';
                case ('draft.unsuccessful'):
                    return 'label-primary';
                case ('complete'):
                    return 'label-danger';
                case ('cancelled'):
                    return 'label-primary';
                case (''):
                    return 'label-primary';
                default:
                    return '';
            }
        };

        this.getTenderStatusDesc = function (status, procurementMethodType, notExport, corporationStatus) {
            if (notExport) {
                if (corporationStatus != null) {
                    switch (corporationStatus) {
                        case 'preparation':
                            return 'Формування закупівлі';
                        case 'pendingApproval':
                            return 'Потребує рекомендації';
                        case 'canceledApproval':
                            return 'Рекомендація скасована';
                        case 'approved':
                            return 'Рекомендовано';
                        default:
                            return '';
                    }
                }
                return "Чернетка";
            }
            switch (status) {
                case ('active.enquiries'):
                    if (procurementMethodType && (this.agreementSelectionTender(procurementMethodType)))
                        return $rootScope.getSpecificOrDefault('InvitationPeriod');
                    else
                        return $rootScope.getSpecificOrDefault('EnquiriesPeriod');
                case ('active.tendering'):
                    return $rootScope.getSpecificOrDefault('TenderingPeriod');
                case ('active.pre-qualification'):
                    if (procurementMethodType && (this.isDialogue(procurementMethodType) || this.isDialogueEU(procurementMethodType))) {
                        return $rootScope.getSpecificOrDefault('EvaluationOfProposals');
                    }
                    return $rootScope.getSpecificOrDefault('PreQulificationPeriod');
                case ('active.pre-qualification.stand-still'):
                    if (procurementMethodType && (this.isDialogue(procurementMethodType) || this.isDialogueEU(procurementMethodType))) {
                        return $rootScope.getSpecificOrDefault('Negotiations');
                    }
                    return $rootScope.getSpecificOrDefault('StandstillBeforeAuction');
                case ('active.stage2.pending'):
                    return $rootScope.getSpecificOrDefault('TheFirstIntermediateStage');
                case ('active.stage2.waiting'):
                    return $rootScope.getSpecificOrDefault('2ndInterimStatus');
                case ('active.auction'):
                    return $rootScope.getSpecificOrDefault('AuctionPeriod');
                case ('active.qualification'):
                    return $rootScope.getSpecificOrDefault('WinnerQualification');
                case ('active.qualification.stand-still'):
                    return $rootScope.getSpecificOrDefault('WinnerQualificationStandStill');
                case ('active'):
                    return $rootScope.getSpecificOrDefault('ActivePurchase');
                case ('active.awarded'):
                    return $rootScope.getSpecificOrDefault('ProposalsConsidered');
                case ('unsuccessful'):
                    return $rootScope.getSpecificOrDefault('UnsuccessfulTender');
                case ('complete'):
                    if (procurementMethodType && (this.isDialogue(procurementMethodType) || this.isDialogueEU(procurementMethodType))) {
                        return $rootScope.getSpecificOrDefault('TheFirstPhaseCompleted');
                    }
                    return $rootScope.getSpecificOrDefault('CompleteTender');
                case ('cancelled'):
                    return $rootScope.getSpecificOrDefault('CancelledTender');
                case ('draft'):
                    return $rootScope.getSpecificOrDefault('NotActivatedAds');
                case ('draft.publishing'):
                    return $rootScope.getSpecificOrDefault('DraftPublish');
                    
                //аля особые статусы для комбобокса (явное получение, без procurementMethodType)
                case ('evaluation.of-proposals'):
                    return $rootScope.getSpecificOrDefault('EvaluationOfProposals');
                case ('negotiations'):
                    return $rootScope.getSpecificOrDefault('Negotiations');
                case ('the.first-phase-completed'):
                    return $rootScope.getSpecificOrDefault('TheFirstPhaseCompleted');
                case ('draft.unsuccessful'):
                    return $rootScope.getSpecificOrDefault('UnsuccessfulPurchase');
                case ('draft.pending'):
                    return $rootScope.getSpecificOrDefault('InactiveRequest');
                default:
                    return '';
            }
        };

        // Bids

        this.bidStatuses = [
            'draft',
            'pending',
            'invalid',
            'invalid.pre-qualification',
            'deleted',
            'active',
            'unsuccessful'
        ];

        this.getBidStatusDesc = function (status) {
            switch (status) {
                case ('draft'):
                    return $rootScope.source('Draft');
                case ('pending'):
                    return $rootScope.source('BidRegistered');
                case ('invalid'):
                    return $rootScope.source('BidInvalidLong');
                case ('invalid.pre-qualification'):
                    return $rootScope.source('BidInvalidLong');
                case ('deleted'):
                    return $rootScope.source('BidDeletedLong');
                case ('active'):
                    return $rootScope.source('BidActiveLong');
                case ('unsuccessful'):
                    return $rootScope.source('BidUnsuccessfulLong');
                case (null):
                    return $rootScope.source('Draft');
                default:
                    return '';
            }
        };

        this.getBidStatusClass = function (status) {
            switch (status) {
                case ('draft'):
                    return 'label-warning';
                case ('pending'):
                    return "label-info";
                case ('invalid'):
                    return 'label-danger';
                case ('invalid.pre-qualification'):
                    return 'label-danger';
                case ('deleted'):
                    return 'label-danger';
                case ('active'):
                    return 'label-success';
                case ('unsuccessful'):
                    return 'label-danger';
                default:
                    return '';
            }
        };

        this.getEntityDesc = function (status) {
            switch (status) {
                case ('bid'):IMapperConfiguration
                    return $rootScope.source('Bid');
                case ('qualification'):
                    return $rootScope.source('Prequalification');
                case ('award'):
                    return $rootScope.source('Award');
                case ('contract'):
                    return $rootScope.source('Contract');
                case ('NotWinner'):
                    return $rootScope.source('NotWinner');
                case ('QualifOtherCandidate'):
                    return $rootScope.source('QualifOtherCandidate');
                case ('draft'):
                    return $rootScope.source('Draft');
                default:
                    return '';
            }
        };

        this.getDynamicStatusDesc = function (status, fullText) {
            switch (status) {
                case ('award.pending'):
                    return $rootScope.source('YourBidOnQualif');
                case ('award.active'):
                    return $rootScope.source('YouAreWinner');
                case ('award.unsuccessful'):
                    return $rootScope.source('AwardUnsuccessful');
                case ('award.cancelled'):
                    return $rootScope.source('AwardCancelled');
                case ('qualification.active'):
                    return $rootScope.source('YouGotAccessToAuction');
                case ('qualification.unsuccessful'):
                    return $rootScope.source('YouGotNoAccessToAuction');
                case ('qualification.pending'):
                    return $rootScope.source('CustomerHasNoAwardYet');
                case ('qualification.cancelled'):
                    return $rootScope.source('QualifCancelled');
                case ('bid.active.active_tendering'):
                    if (fullText)
                        return $rootScope.source('BidIsRegistered');
                    else return $rootScope.source('BidIsRegistered_short');
                case ('bid.invalid'):
                    if (fullText)
                        return $rootScope.source('BidIsNotConfirmed');
                    else return $rootScope.source('BidIsNotConfirmed_short');
                case ('bid.draft'):
                        return $rootScope.source('Draft');
                case ('bid.another_winner'):
                    return $rootScope.source('BidAnotherWinner');
                case ('bid.prequalification'):
                    return $rootScope.source('BidInvalid');
                case ('bid.deleted'):
                    return $rootScope.source('BidDeleted');
                case ('bid.unsuccessful'):
                    return $rootScope.source('BidUnsuccessful');
                case ('bid.pending'):
                    return $rootScope.source('BidPending');
                case ('bid.active'):
                    return $rootScope.source('BidActive');
                case ('contract.active'):
                    return $rootScope.source('YourContractIsPublished');
                case ('contract.pending'):
                    return $rootScope.source('ContractPending');
                case ('contract.cancelled'):
                    return $rootScope.source('ContractCancelled');
                case ('award.absent'):
                    return $rootScope.source('AwardAbsent');
                case ('award.active.notLoadedDocuments'):
                    return $rootScope.source('BidsNeedLoadDocumentsCount');
                case ('award.24h'):
                    return $rootScope.source('Award24');
                case ('award.alp'):
                    return $rootScope.source('AwardAlp');
                case ('qualification.24h'):
                    return $rootScope.source('Qualification24');
                case ('award.24hAlp'):
                    return $rootScope.source('Award24Alp');
                default:
                    return '';
            }
        };

        // Lots

        this.getLotStatusDesc = function (status) {
            switch (status) {
                case ('active'):
                    return $rootScope.source('LotActive');
                case ('unsuccessful'):
                    return $rootScope.source('LotUnsuccessful');
                case ('complete'):
                    return $rootScope.source('LotComplete');
                case ('cancelled'):
                    return $rootScope.source('LotCancelled');
                default:
                    return '';
            }
        };

        this.lotStatuses = [
            'active',
            'complete',
            'unsuccessful',
            'cancelled'
        ];


        this.getLotStatusLabelClass = function (s) {
            switch (s) {
                case ('complete'):
                    return 'label-default';
                case ('unsuccessful'):
                    return 'label-warning';
                case ('active'):
                    return 'label-success';
                case ('cancelled'):
                    return 'label-danger';
                default:
                    return '';
            }
        };

        this.getLotStatusUkr = function (s) {
            switch (s) {
                case ('active'):
                    return 'Активний';
                case ('unsuccessful'):
                    return 'Не відбувся';
                case ('complete'):
                    return 'Завершено';
                case ('cancelled'):
                    return 'Скасовано';
                default:
                    return '';
            }
        };

        this.chronologicalStatusesCalendar = [
            "active.enquiries",
            "active.tendering",
            "active.pre-qualification",
            "active.awarded",
            "active.auction",
            "complaint"
        ];

        this.relevanceStatusCalendar = [
            'active.enquiries',
            'active.tendering',
            'active.pre-qualification',
            'active.pre-qualification.stand-still',
            'active.stage2.pending',
            'active.stage2.waiting',
            'active.auction',
            'active.qualification',
            'active.qualification.stand-still',
            'active.awarded'
        ];

        this.canceledStatusesCalendar = [
            'unsuccessful',
            'cancelled'
        ];

        this.completeCalendar = [
            'complete'
        ];


        this.getOrganizationScales = function (s) {
            switch (s) {
                case ('micro'):
                    return $rootScope.source('microSubjectOfMicroBusiness');
                case ('sme'):
                    return $rootScope.source('smeSubjectOfSmallBusiness');
                case ('mid'):
                    return $rootScope.source('midSubjectOfMediumBusiness');
                case ('large'):
                    return $rootScope.source('largeSubjectOfLargeBusiness');
                case ('not specified'):
                    return $rootScope.source('NotSubjectOfBusiness');
                default:
                    return '';
            }
        };

    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .service('lotBidDocumentTableService', lotBidDocumentTableService);

    function lotBidDocumentTableService() {

        this.expandTable = function (docTableParams, documentsLength) {
            docTableParams.count(documentsLength);
            docTableParams.reload();
        }

        this.collapseTable = function (docTableParams) {
            docTableParams.count(10);
            docTableParams.reload();
        }

        this.nextPage = function (docTableParams) {
            docTableParams.page(docTableParams.page() + 1);
            docTableParams.reload();
        }

        this.prevPage = function (docTableParams) {
            docTableParams.page(docTableParams.page() - 1);
            docTableParams.reload();
        }

        this.getPagesAmount = function (docTableParams, documentsLength) {
            var amount = documentsLength / docTableParams.count();
            if ((amount ^ 0) === amount) {
                return amount;
            } else {
                var decimalPart = Number('0.' + amount.toString()[amount.toString().length - 1]);
                return amount - decimalPart + 1;
            }
        }

        this.isPrevPageDisabled = function (docTableParams) {
            return docTableParams.page() === 1;
        }

        this.isLastPageDisabled = function (docTableParams, documentsLength) {
            return docTableParams.page() === this.getPagesAmount(docTableParams, documentsLength);
        }
    }
})();;
angular.module('app').service('menuPressService', [
    '$timeout',
    '$localStorage',
    function (
        $timeout,
        $localStorage
    ) {
        return new function () {
            this.menuPress = function (a, $scope) {
                $timeout(function () {
                    function moveToMenu() {
                        if (!$scope.navigation) {
                            $timeout(moveToMenu, 500);
                            return
                        }
                        $scope.navigation.forEach(function (item, i, arr) {
                            if (item.type === a) {
                                item.active = true;
                                $scope.naviBlock = a
                                $localStorage.openBlockInTender = [$scope.detailes.id, a];
                            } else {
                                item.active = false;
                            }
                        });
                    }
                    function scrollTop() { $("html").scrollTop(scroll); }
                    function rightHeight() { $(".heightBlock").css("height", "auto"); abp.ui.clearBusy(); }
                    function fadeOut() { $(".fadeBlock").fadeOut(100); }
                    function hideBlock() { $(".hideBlock").css("display", "none"); }
                    function showBlock() { $(".hideBlock").css("display", "inherit"); }
                    function fadeIn() { $(".fadeBlock").fadeIn(400); }
                    blockHeight = $(".block").height();
                    scroll = $(window).scrollTop();
                    $(".heightBlock").css("height", blockHeight);
                    if (blockHeight) { $(".heightBlock").css("height", blockHeight); }
                    fadeOut();
                    $timeout(hideBlock, 100);
                    $timeout(moveToMenu, 500);
                    $timeout($scope.setTreeState, 100);
                    $timeout(showBlock, 400);
                    $timeout(scrollTop, 800);
                    $timeout(fadeIn, 400);
                    $timeout(rightHeight, 1000);
                }, 1100);
            };
        }
    }
]);
angular.module('app').service('organizationDataService', [
    'abp.services.etender.organization',
    '$location',
    '$localStorage',
    'lookupService',
    '$q',
    '$rootScope',
    function (
        organization,
        $location,
        $localStorage,
        lookupService,
        $q,
        $rootScope
        ) {
        this.getData = function () {
            var deferred = $q.defer();
            var getOrganization = organization.getOrganization({ tenantId: $localStorage.userTenantId });
            getOrganization.then(function (reponse) {
                var organizationOutputDto = reponse.data;
                console.log("Organization:", organizationOutputDto);
                $localStorage.organizationKindId = organizationOutputDto.organizationKindId;
                $localStorage.organizationIsCustomer = organizationOutputDto.isCustomer;
                $localStorage.isProductionMode = organizationOutputDto.isProductionMode;
                $localStorage.productionModeIsApproved = organizationOutputDto.productionModeIsApproved;
                $localStorage.codeOfOrganization = organizationOutputDto.codeOfOrganization;
                $localStorage.organization = organizationOutputDto;
                $localStorage.orgNonAnsweredQuestionsCount = organizationOutputDto.nonAnsweredQuestionsCount;
                $localStorage.orgNonAnsweredComplaintsCount = organizationOutputDto.nonAnsweredComplaintsCount;

                if (organizationOutputDto.kind !== null && organizationOutputDto.kind !== 'null' && organizationOutputDto.kind !== undefined) {
                    $localStorage.orgKind = organizationOutputDto.organizationKindId;
                }

                $localStorage.isOrganizationProductionMode = organizationOutputDto.isProductionMode;
                $localStorage.organizationName = organizationOutputDto.name;
                if (organizationOutputDto.contactPoint !== null) {
                    $localStorage.organizationContactTelephone = organizationOutputDto.contactPoint.telephone;
                    $localStorage.organizationContactName = organizationOutputDto.contactPoint.name;
                    $localStorage.organizationContactEmail = organizationOutputDto.contactPoint.email;
                }

                $localStorage.organizationId = organizationOutputDto.id;
                $localStorage.isRequiredContractNumber = organizationOutputDto.isRequiredContractNumber;
                $localStorage.isBankingConfirmed = organizationOutputDto.isBankingConfirmed;
                $localStorage.isOrganizationApproved = organizationOutputDto.productionModeIsApproved;
                $localStorage.isOrganizationReadyForApprovement = organizationOutputDto.productionModeIsReadyForApprovement;
                $localStorage.isOrganizationApprovedTest = organizationOutputDto.testModeIsApproved;
                $localStorage.isOrganizationReadyForApprovementTest = organizationOutputDto.testModeIsReadyForApprovement;
                $localStorage.isAgreementSigned = organizationOutputDto.isAgreementSigned;

                $localStorage.isUserNotIdentified = null;
                $localStorage.realTestMode = null;

                if (!organizationOutputDto.isCustomer && !organizationOutputDto.isAgreementSigned) {
                    $location.path('/accessionTreaty');
                }
                $rootScope.$emit('organiztionDataLoaded');
                deferred.resolve(reponse);
            }, function (data) {
                console.log(data);
                deferred.reject();
            });
            return deferred.promise;
        };

        this.getOrganizationScaleList = function () {
            var deferred = $q.defer();
            if (!$localStorage.organizationScaleList ||
                $localStorage.organizationScaleList &&
                $localStorage.organizationScaleList.lang &&
                $localStorage.organizationScaleList.lang !== abp.localization.currentLanguage.name) {
                var scalse = organization.getOrganizationsScale();
                scalse.then(function (reponse) {
                    var list = reponse.data || [];
                    // set translate
                    list.forEach(function (item, i, arr) {
                        var value = item.value.toLowerCase();
                        item.name = lookupService.getOrganizationScales(value);
                    });
                    $localStorage.organizationScaleList = {
                        data: list,
                        lang: abp.localization.currentLanguage.name
                        }
                    deferred.resolve(list);
                });
            } else return $localStorage.organizationScaleList;
            return deferred.promise;
        };

        this.updateOrCreateOrganization = function (input) {
            var deferred = $q.defer();
            var update = organization.updateOrCreateOrganization(input);
            update.then(function (response) {
                deferred.resolve(response);
            }, function () {
                deferred.reject();
            });
            return deferred.promise;
        };

        this.getShortOrganizationName = function(organizationName) {
            //словарик относительно комента в ET-21070
            var shortenedOrganizationName = null;
            var organizationDictionary = [
                {
                    fullName: 'Товариство з обмеженою відповідальністю',
                    shortName: 'ТОВ'
                }, {
                    fullName: 'Приватне підприємство',
                    shortName: 'ПП'
                }, {
                    fullName: 'Комунальне підприємство',
                    shortName: 'КП'
                }, {
                    fullName: 'Мале Приватне Підприємство',
                    shortName: 'МПП'
                }, {
                    fullName: 'Державне підприємство',
                    shortName: 'ДП'
                }, {
                    fullName: 'ПРИВАТНЕ АКЦІОНЕРНЕ ТОВАРИСТВО',
                    shortName: 'ПРАТ'
                }, {
                    fullName: 'Фізична особа',
                    shortName: 'ФОП'
                }, {
                    fullName: 'Публічне акціонерне товариство',
                    shortName: 'ПАТ'
                }, {
                    fullName: 'КОЛЕКТИВНЕ ПІДПРИЄМСТВО',
                    shortName: 'КП'
                }, {
                    fullName: 'Державна установа',
                    shortName: 'ДУ'
                }, {
                    fullName: 'КОМУНАЛЬНЕ НЕКОМЕРЦІЙНЕ ПІДПРИЄМСТВО',
                    shortName: 'КНП'
                }
            ];
            
            for (var index = 0; index < organizationDictionary.length; index++) {
                if (organizationName && (organizationName.toLowerCase()).indexOf((organizationDictionary[index].fullName.toLowerCase())) !== -1) {
                    var OrganizationSubstring = organizationName.substring(organizationDictionary[index].fullName.length)
                    shortenedOrganizationName = organizationDictionary[index].shortName + OrganizationSubstring;
                    break;
                }
            }

            return shortenedOrganizationName ? shortenedOrganizationName : organizationName;
        }

        this.getOrganizationToolTipText = function (organization, needAdditionalFields) {
            var str = "";
            if (organization) {
                if (organization.identifier && (organization.identifier.apiId || organization.identifier.id)) {
                    var whichIdToUse = organization.identifier && organization.identifier.apiId ? organization.identifier.apiId : organization.identifier.id;
                    str += "<p><b>Код ЄДРПОУ: </b>" + whichIdToUse + "</p>";
                }
                if (organization.scale) {
                    str += "<p><b>Клас суб'єкту господарювання: </b>" + organization.scale.name + "</p>";
                }
                if (organization.contactPoint && organization.contactPoint.name) {
                    str += "<p><b>Контактна особа: </b>" + organization.contactPoint.name.replace(/[`~!@#$%^&*()_|+\-='"<>\{\}\[\]\\\/]/gi, '') + "</p>";
                }
                if (organization.contactPoint && organization.contactPoint.telephone) {
                    str += "<p><b>Телефон: </b>" + organization.contactPoint.telephone + "</p>"; //.replace(/[`~!@#$%^&*()_|+\-='"<>\{\}\[\]\\\/]/gi, '')
                }
                if (organization.contactPoint && organization.contactPoint.email) {
                    str += "<p><b>email: </b>" + organization.contactPoint.email + "</p>";
                }
                if (needAdditionalFields) {
                    if (organization.identifier) {
                        str += "<p><b>Повна назва юридичної організіції: </b>" + organization.identifier.legalName + "</p>"
                    }
                    if (organization.address) {
                        str += "<p><b>Місцезнаходження: </b>" + organization.address.postalCode + ', ' + organization.address.country + ', ' + organization.address.region + ', ' + organization.address.locality + ', ' + organization.address.streetAddress + "</p>"
                    }
                }
            }
            return str.replace('\'', '');
        }

        this.scaleInfo = function() {
            var str = "";
            var p1 =
                "<p>Суб’єкт мікропідприємництва: кількість працівників за звітний період (календарний рік) не перевищує 10 осіб та річний дохід від будь-якої діяльності не перевищує суму, еквівалентну 2 мільйонам євро.</p>";
            var p2 =
                "<p>Суб’єкт малого підприємництва: середня кількість працівників за звітний період (календарний рік) не перевищує 50 осіб та річний дохід від будь-якої діяльності не перевищує суму, еквівалентну 10 мільйонам євро.</p>";
            var p3 =
                "<p>Суб’єкт середнього підприємництва: середня кількість працівників за звітний період (календарний рік) від 50 до 250 осіб та річний дохід від будь-якої діяльності від 10 до 50 мільйонів євро.</p>";
            var p4 =
                "<p>Суб’єкт великого підприємництва: середня кількість працівників за звітний період (календарний рік) перевищує 250 осіб та річний дохід від будь-якої діяльності перевищує суму, еквівалентну 50 мільйонам євро.</p>";
            str = p1 + p2 + p3 + p4;
            return str;
        }

        this.getOrganizationKinds = function (codeOfOrganization, getAllKinds) {

            var deferred = $q.defer();
            var kinds = [
                {
                    title: $rootScope.source("GeneralCustomer"),
                    code: 1, // 'general'
                    name: 'general'
                }, {
                    title: $rootScope.source("SeparateSpheresCustomer"),
                    code: 3, //'special'
                    name: 'special'
                },
                {
                    title: $rootScope.source("DefenseCustomer"),
                    code: 2, //'defense',
                    name: 'defense'
                },
                {
                    title: $rootScope.source("NotCustomer"),
                    code: 4, //'other'
                    name: 'other'
                },
                {
                    title: $rootScope.source("AuthorityCustomer"),
                    code: 6, //'authority'
                    name: 'authority'
                },
                {
                    title: $rootScope.source("SocialyCustomer"),
                    code: 7, //'social'
                    name: 'social'
                }
            ];
            var cpbKind = {
                title: "Юридична особа, яка забезпечує потреби держави або територіальної громади (ЦЗО)",
                code: 5,
                name: 'central'
            };
            if (!getAllKinds) {
                organization.isCpbEdrpou(codeOfOrganization).then(
                    function (response) {
                        if (response.data)
                            kinds.push(cpbKind);
                        deferred.resolve(kinds);
                    }, function (error) {
                        deferred.reject(error);
                    }
                );
            } else {
                kinds.push(cpbKind);
                deferred.resolve(kinds);
            }

            return deferred.promise;
        }

    }
]);

;
angular.module('app').service('paginationService', [
    function () {
        return new function () {

            // service implementation
            this.getPager = function (totalItems, currentPage, pageSize) {
                // default to first page
                currentPage = currentPage || 1;

                // default page size is 10
                pageSize = pageSize || 10;

                // calculate total pages
                var totalPages = Math.ceil(totalItems / pageSize);

                var startPage, endPage;
                if (totalPages <= 10) {
                    // less than 10 total pages so show all
                    startPage = 1;
                    endPage = totalPages;
                } else {
                    // more than 10 total pages so calculate start and end pages
                    if (currentPage <= 6) {
                        startPage = 1;
                        endPage = 10;
                    } else if (currentPage + 4 >= totalPages) {
                        startPage = totalPages - 9;
                        endPage = totalPages;
                    } else {
                        startPage = currentPage - 5;
                        endPage = currentPage + 4;
                    }
                }

                // calculate start and end item indexes
                var startIndex = (currentPage - 1) * pageSize;
                var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);

                // create an array of pages to ng-repeat in the pager control
                var pages = _.range(startPage, endPage + 1);

                // return object with all pager properties required by the view
                return {
                    totalItems: totalItems,
                    currentPage: currentPage,
                    pageSize: pageSize,
                    totalPages: totalPages,
                    startPage: startPage,
                    endPage: endPage,
                    startIndex: startIndex,
                    endIndex: endIndex,
                    pages: pages
                };
            }
        }
    }
])
;
angular.module('app').
    service('planHelperService', ['datesHelperService', 'abp.services.etender.reference', '$localStorage', 'referenceService', function (datesHelperService, abpReferenceService, $localStorage, referenceService) {

        return new function () {
            function addInnAtcToAdditionalClassifications(curItem, data) {
                if (curItem.classification.code || curItem.classification.id) {
                    data.hideRemoveButton = true;
                    if (curItem.additionalClassificationInn && curItem.additionalClassificationInn.id) {
                        curItem.additionalClassifications.push(curItem.additionalClassificationInn);
                    }
                    if (curItem.additionalClassificationAtc && curItem.additionalClassificationAtc.id) {
                        curItem.additionalClassifications.push(curItem.additionalClassificationAtc);
                    }
                }
            }

            this.setAdditionalClassifications = function (data) {
                addInnAtcToAdditionalClassifications(data, data);
                for (var j = 0; j < data.items.length; j++) {
                    addInnAtcToAdditionalClassifications(data.items[j], data);                    
                }

                if (data.procurementMethodType !== "centralizedProcurement") {
                    var pickerdate = new Date(data.tenderPeriodStartDate);
                    //var pickerdatelastDayOfMonth = new Date(pickerdate.getFullYear(), pickerdate.getMonth() + 1, 0);
                    pickerdate.setDate(1);
                    var pickerdateFirstDayOfMonth = pickerdate;
                    data.tenderPeriodStartDate = pickerdateFirstDayOfMonth;
                }
                return data;
            }

            this.getPlanStatuses = function ($scope) {
                referenceService.getPlanStatuses().then(function (response) {
                    for (var i = 0; i < response.data.length; i++) {
                        if (response.data[i].value === "draft")
                            continue;
                        $scope.statuses.all.push({
                            name: response.data[i].name,
                            value: response.data[i].value,
                            checked: false
                        });
                    }
                });
            }
            

        };
    }]);


;
angular.module('app').service('referenceService', [
    '$q',
    '$localStorage',
    'lookupService',
    '$rootScope',
    'abp.services.etender.reference',
    function ($q, $localStorage, lookupService, $rootScope, reference) {
        return new function () {
            if (!$localStorage.refs) $localStorage.refs = {};
            var isAlreadyRequested = false;
            $rootScope.$watch(function () { return $localStorage.refs; }, function (newVal, oldVal) {
                if (oldVal !== newVal && newVal === undefined) {
                    isAlreadyRequested = false;
                }
            });

            this.getAllReferences = function () {
                if (isAlreadyRequested) {
                    var deffered = $q.defer();
                    function loop() {
                        setTimeout(function () {
                            if ($localStorage.refs && $localStorage.refs.nonLimitedProcTypes) {
                                deffered.resolve($localStorage.refs);
                            } else {
                                loop();
                            }
                        }, 100);
                    };
                    loop();
                    return deffered.promise;
                }
                isAlreadyRequested = true;
                return reference.getAllReferences().then(function (response) {
                    $localStorage.refs = response.data;
                    $localStorage.refs.nonLimitedProcTypes = response.data.procedureTypes.filter(function (procType) {
                        return procType.procurementMethod != 'limited';
                    });  
                });
            };

            this._createGetReferenceFunction = function (srcFieldName, dstFieldName, isMultiple) {
                dstFieldName = dstFieldName || srcFieldName;
                return function () {
                    var deffered = $q.defer();
                    if ($localStorage.refs && $localStorage.refs[srcFieldName]) {
                        var data = isMultiple ? angular.copy($localStorage.refs[srcFieldName]) : {};
                        if (!isMultiple) {
                            data[dstFieldName] = angular.copy($localStorage.refs[srcFieldName]);
                        }

                        deffered.resolve({
                            data: data
                        });
                    } else {
                        this.getAllReferences().then(function () {
                            if (!$localStorage.refs) $localStorage.refs = {};
                            var data = isMultiple ? angular.copy($localStorage.refs[srcFieldName]) : {};
                            if (!isMultiple) {
                                data[dstFieldName] = angular.copy($localStorage.refs[srcFieldName]);
                            }
                            deffered.resolve({
                                data: data
                            });
                        });
                    }
                    return deffered.promise;
                }.bind(this);
            };

            this.getAllUnits = this._createGetReferenceFunction('units');
            this.getRegionsByCountryId = this._createGetReferenceFunction('ukraineRegions', 'regions');
            this.getAllDocumentTypes = this._createGetReferenceFunction('documentTypes', 'documentTypes', true);
            this.getMainProcurementCategories = this._createGetReferenceFunction('mainProcurementCategories', 'mainProcurementCategories', true);
            this.getMilestoneDirectory = this._createGetReferenceFunction('allMilestoneReferences', 'allMilestoneReferences', true);
            this.getPlanStatuses = this._createGetReferenceFunction('planStatuses', 'planStatuses', true);
            this.getProjectBudgetBreakdownType = this._createGetReferenceFunction('projectBudgetBreakdownTypes', 'projectBudgetBreakdownTypes', true);
            this.getNonLimitedProcTypes = this._createGetReferenceFunction('nonLimitedProcTypes', 'procTypes');

            this.getAllProcTypes = this._createGetReferenceFunction('procedureTypes', 'procTypes');
            this.getAllProcTypesForPlans = function () {
                return this.getAllProcTypes().then(function (resposne) {
                    var procTypes = [];
                    if (resposne.data) {
                        procTypes = angular.copy(resposne.data.procTypes);
                        angular.forEach(procTypes, function (pType) {
                            pType.procurementMethodTypeLocal = lookupService.getTenderProcedureType(pType.procurementMethodType);
                        });

                        // Есть 2 типа процедур, которые доступны только для планов, но для тендеров недоступны.
                        // И в БД и коде на бэке они нигде не описаны и не нужны. Так что добавляем здесь чисто для планов.
                        procTypes.push({
                            procurementMethod: '_',
                            procurementMethodType: 'centralizedProcurement',
                            procurementMethodTypeLocal: $rootScope.source('ProcurementThroughCentralizedPurchasingOrganization')
                        });

                        procTypes.push({
                            procurementMethod: '_',
                            procurementMethodType: '',
                            procurementMethodTypeLocal: $rootScope.source('WithoutProcurementMethodType')
                        });
                        // ET-19302 hide priceQuatation procurementMethod for production.
                        if (!$localStorage.isProductionSite) {
                            procTypes.push({
                                procurementMethod: '_',
                                procurementMethodType: 'priceQuotation',
                                procurementMethodTypeLocal: $rootScope.source('priceQuotation')
                            });
                        }
                    }
                    return procTypes;
                });
            };
        };
    }
]);;
;
angular.module('app').service('reloadService', [
    'requestService',
    'getTenderService',
    '$stateParams',
    '$rootScope',
    function (requestService, getTenderService, $stateParams, $rootScope) {
        return new function () {
            this.reloadDetailes = function ($scope, skipReloadComplaints) {
                $scope.getTenderBefore($scope);
                requestService.getTender($stateParams).then(function (response) {
                    getTenderService.getTenderThen(response, $scope, skipReloadComplaints);
                    $rootScope.$broadcast('reloadTenderSuccess');
                }, function (errorResponse) {
                    console.log(errorResponse);
                    abp.ui.clearBusy();
                });
            };
        }
    }
]);
angular.module('app').
    service('requestService',
        ['$localStorage',
            '$q',
            '$rootScope',
            '$window',
            '$location',
            'abp.services.etender.emails',
            'goToTenderService',
            'abp.services.etender.reference',
            'abp.services.etender.getTender',
            'referenceService',
            function (
                $localStorage,
                $q,
                $rootScope,
                $window,
                $location,
                emails,
                goToTenderService,
                reference,
                getTenderAppService,
                referenceService
            ) {
                return new function () {

                    this.getTender = function (stateParams) {
                        abp.ui.setBusy();
                        var deferred = $q.defer();
                        getTenderAppService.getTender({
                            id: stateParams.tId || null,
                            userName: $localStorage.username || null,
                            display: true,
                            url: stateParams.seoUrl || null,
                            categoryUrl: stateParams.categoryName || null
                        }).then(function (response) {
                            abp.ui.clearBusy();

                           // redirect if seo url exist
                            if (!stateParams.seoUrl && response.data.url) {
                                goToTenderService.redirect(response.data);
                                return;
                            }

                            deferred.resolve(response.data);
                            setMeta(response.data);
                        }, function(error) {
                            abp.notify.error(error.status);
                            abp.ui.clearBusy();
                        }); //.$promise;
                        return deferred.promise;
                    };

                    function setMeta(data) {
                        if (!$rootScope.meta) $rootScope.meta = {};
                        $rootScope.meta.title = data.titleSeo;
                        $window.document.getElementsByName('description')[0].content = data.descriptionSeo;
                    }

                    this.postUserSubscriptionByConcreteCpvCode = function (id) {
                        abp.ui.setBusy();
                        emails.subscribeByCpvCode({ cvpCode: id })
                            .then(function (response) {
                                abp.ui.clearBusy();
                                if (response.data.success)
                                    abp.notify.success('Підписку оформлено');
                                else if (response.data.error && response.data.error.indexOf('Subscription already exist') !== -1) {
                                    abp.notify.error('Підписка вже додана');
                                } else {
                                    abp.notify.error(response.data.error);
                                }
                            },
                                function () {
                                    abp.ui.clearBusy();
                                });
                    };
                    
                    this.getProcurementCategories = function () {
                        var deferred = $q.defer();
                        referenceService.getMainProcurementCategories().then(function (response) {                            
                            deferred.resolve(response.data);
                        },
                            function (response) {
                                console.log(response);
                                deferred.reject(response);
                            });
                        return deferred.promise;
                    };
                    
                    this.getMilestoneCodeType = function () {
                        return referenceService.getMilestoneDirectory();
                    }

                    this.getPlanMilestoneStatuses = function () {
                        abp.ui.setBusy();
                        return reference.getPlanMilestoneStatuses().then(function (response) {
                            $localStorage.milistoneStatusForDropDown = response.data;
                            abp.ui.clearBusy();
                        });

                    }

                };
            }]);
;
angular.module('app').service('setCurrentCancelLotForModalService', function () {
    return new function () {
        this.setCurrentCancellationsForModal = function (lot, $scope) {
            // тут лежат текущие cancellations для модального окна
            $scope.detailes.curCancellations = null;
            $scope.cancelTenderModel.cancelFor = {};
            if (lot) {
                $scope.detailes.curCancellations = lot.cancellations;
                $scope.cancelTenderModel.cancelFor = {
                    lotId: lot.id,
                    title: "Лот " + lot.title,
                    type: "lot"
                }
            } else {
                $scope.detailes.curCancellations = $scope.detailes.cancellations;
                $scope.cancelTenderModel.cancelFor = {
                    lotId: null,
                    title: "Тендер",
                    type: "tender"
                }
            }

            $scope.cancelTenderModel.relatedLot = null;
            $scope.cancelTenderModel.reason = null;
        }
    }
});
angular.module('app').service('setModalPositionService', [
    '$location',
    function ($location) {
        return new function () {
            this.setPositionSecond = function () {
                if ($location.absUrl().indexOf('tenderDetailes') === -1 && $location.absUrl().indexOf('/tender/') === -1 && $('.bidButton-fixed')) {
                    return;
                }

                var winWidth = $(window).width(),
                    button = $('.bidButton-fixed'),
                    tenderDetailes = $('.tenderDetailes'),
                    //buttonHeight = button.outerHeight(),
                    tenderDetailesHeight = tenderDetailes.height()
                //buttonOffset = button.offset().top + buttonHeight,

                if (!tenderDetailes.offset() || !tenderDetailes.offset().top) return;
                var tenderDetailesOffset = tenderDetailes.offset().top + tenderDetailesHeight,
                    windowScroll = $(window).scrollTop() + $(window).height() - 5;

                // on down
                if (windowScroll >= tenderDetailesOffset) {
                    button.addClass(' fixBottom');

                    if (winWidth > 1310) {
                        $(button).css("right", "-80px");
                    } else if (winWidth < 1310 && winWidth > 1200) {
                        $(button).css("right", "-20px");
                    } else if (winWidth < 1200 && winWidth > 1140) {
                        $(button).css("right", "25px");
                    } else {
                        $(button).css("right", "25px");
                    }

                }

                // go top
                if (windowScroll < tenderDetailesOffset) {
                    button.removeClass(' fixBottom');
                    if (winWidth > 1310) {
                        var rightL = (winWidth - 1140) / 2 - 80;
                        $(button).css("right", rightL + "px");
                    } else if (winWidth < 1310 && winWidth > 1200) {
                        var rightS = (winWidth - 1140) / 2 - 20;
                        $(button).css("right", rightS + "px");
                    } else if (winWidth < 1200 && winWidth > 1140) {
                        var rightSs = (winWidth - 1140) / 2 + 25;
                        $(button).css("right", rightSs + "px");
                    } else {
                        $(button).css("right", "25px");
                    }
                }
            }
        }
    }
]);
angular.module('app').service('signalRService',
    ['$localStorage', function ($localStorage) {
        this.needToActivate = function (need) {

            if (need) startConaction();
            else stopConaction();

           function startConaction() {
                    var tenderHub = $.connection.tenderHub;
                    if (!$localStorage.counters) $localStorage.counters = {};

                    tenderHub.client.signalRTest = function (message) {
                        console.log(message);
                    }

                    tenderHub.client.MessagesOnChanged = function (data) {
                        console.log("MessagesOnChanged: " + data.all + ", " + data.unread);
                        $localStorage.counters.messages = data;
                    }

                    tenderHub.client.QuestionsOnChanged = function (data) {
                        console.log("QuestionsOnChanged: " + data.nonAnswered);
                        $localStorage.counters.questions = data;
                    }

                    tenderHub.client.ComplaintsOnChanged = function (data) {
                        console.log("ComplaintsOnChanged: " + data.nonAnswered);
                        $localStorage.counters.complaints = data;
                    }

                    tenderHub.client.AccountTransactionsOnChanged = function (data) {
                        $localStorage.counters.banking.free = data.free;
                        console.log("AccountTransactionsOnChanged: " +
                            data.free +
                            ", " +
                            data.lockMin +
                            ", " +
                            data.lockEnsure +
                            ", " +
                            data.lockDebit);
                    }

                    $.connection.hub.start().done(function() {
                        tenderHub.server.connect(abp.session.userId || 0);
                        console.log("SignalR connect started");
                    }).fail(function(reason) {
                        console.log("SignalR connection failed: " + reason);
                    });
                }

                function stopConaction() {
                    $.connection.hub.stop();
                }
        };        
    }
]);

;
angular.module('app').service('siteSettingsService', [
    '$location',
    '$timeout',
    'abp.services.etender.settings',
    '$localStorage',
    '$q',
    function (
        $location,
        $timeout,
        settings,
        $localStorage,
        $q) {

        this.getSiteSettings = function () {
            if ($localStorage.readOnlyApiUri && $localStorage.googleReCaptchaSiteKeyV3) {
                createCaptchaScript();
                return;
            }
            var getSettings = settings.getSetting();
            getSettings.then(function (response) {
                var data = response.data;
                console.log("Settings: ", data);
                $localStorage.allowedFileExtensions = '.' + data.allowedUploadFileExtensions.split(',').join(',.');
                $localStorage.apiUri = data.apiUri;
                $localStorage.readOnlyApiUri = data.readOnlyApiUri;
                $localStorage.apiVersion = data.apiUri.split('/api/')[1].replace('/', '');
                $localStorage.isProductionSite = (abp.setting.get("isProductionSite") == 'True');
                $localStorage.controlDatesOfProcedures = data.controlDatesOfProcedures;
                $localStorage.maxFilesCount = 70;
                $localStorage.simultaneouslyUploadFilesCount = 5;
                $localStorage.monitoringApiUri = data.monitoringApiUri;
                $localStorage.pqBucketDate = data.pqBucketDate;
                $localStorage.googleReCaptchaSiteKeyV3 = data.googleReCaptchaSiteKeyV3;
                createCaptchaScript();
            });
        };

        this.clearBusy = function () {
            abp.ui.clearBusy();
            $timeout(function () {
                abp.ui.clearBusy();
            },
                3000);
        }

        //this.getSiteSettings = function() {
        //    if ($localStorage.readOnlyApiUri) {
        //        $rootScope.allowedFileExtensions = $localStorage.allowedFileExtensions;
        //        $rootScope.apiUri = $localStorage.apiUri;
        //        $rootScope.readOnlyApiUri = $localStorage.readOnlyApiUri;
        //        $rootScope.apiVersion = $localStorage.apiVersion;
        //        $rootScope.isProductionSite = $localStorage.isProductionSite;
        //        $rootScope.controlDatesOfProcedures = $localStorage.controlDatesOfProcedures;
        //    } else {
        //        var getSettings = settings.getSetting();
        //        getSettings.then(function (response) {
        //            var data = response.data;
        //            //console.log("Settings: ", data);
        //            $rootScope.allowedFileExtensions = '.' + data.allowedUploadFileExtensions.split(',').join(',.');
        //            $localStorage.allowedFileExtensions = '.' + data.allowedUploadFileExtensions.split(',').join(',.');
        //            $rootScope.apiUri = data.apiUri;
        //            $localStorage.apiUri = data.apiUri;
        //            $rootScope.readOnlyApiUri = data.readOnlyApiUri;
        //            $localStorage.readOnlyApiUri = data.readOnlyApiUri;
        //            $rootScope.apiVersion = data.apiUri.split('/api/')[1].replace('/', '');
        //            $localStorage.apiVersion = data.apiUri.split('/api/')[1].replace('/', '');
        //            $rootScope.isProductionSite = (abp.setting.get("isProductionSite") == 'True');
        //            $localStorage.isProductionSite = (abp.setting.get("isProductionSite") == 'True');
        //            $rootScope.controlDatesOfProcedures = data.controlDatesOfProcedures;
        //            $localStorage.controlDatesOfProcedures = data.controlDatesOfProcedures;
        //        });
        //    }
        //};

        // set windows height for footer
        this.setWindowHeight = function getheight() {
            if ($('.preFooter').height() === null) {
                $timeout(getheight, 1000);
                return;
            }
            var winHeight = $(window).height();
            var preFooterHeight = $('.preFooter').height();
            var contentHeight = winHeight - preFooterHeight;
            $('.mob_top').css('min-height', contentHeight + 17);

        }

        this.onScrollFilter = function () {

            var url = window.location.pathname;
            if (url === '/MyTenders' || url === '') {
                if (window.innerWidth > 766)
                    window.onscroll = function () { myFunctionScroll() };

                var filter = document.getElementById("topFilters");
                if (!filter) return;
                var elements = document.getElementById("table-content");
                if (!elements) return;
                var pagination = elements.getElementsByClassName("ng-table-pagination");
                var sticky = filter.offsetTop;

                function myFunctionScroll() {
                    url = window.location.hash;
                    if (!pagination || !pagination.length) {
                        return;
                    }
                    if (window.pageYOffset > sticky && (url === 'MyTenders' || url === '')) {
                        filter.classList.add("sticky");
                        pagination[0].classList.add("stickyP");
                    } else if (filter && (url === 'MyTenders' || url === '')) {
                        filter.classList.remove("sticky");
                        pagination[0].classList.remove("stickyP");
                    } else {
                        return;
                    }
                }
            } else {
                return;
            }
        }

        this.isInternetConnection = function () {
            var deferred = $q.defer();
            $.ajax({
                url: '/Content/images/dot.gif',
                timeout: 4000,
                success: function () {
                    deferred.resolve(true);
                },
                error: function () {
                    deferred.reject(false);
                }
            });
            return deferred.promise;
        }

        this.selectText = function (containerid) {
            var range;
            if (document.selection) { // IE
                range = document.body.createTextRange();
                range.moveToElementText(document.getElementById(containerid));
                range.select();
            } else if (window.getSelection) {
                range = document.createRange();
                range.selectNode(document.getElementById(containerid));
                window.getSelection().removeAllRanges();
                window.getSelection().addRange(range);
            }
        }

        // *** User Special Css Style *** START ***
        this.addClearUserSpecialCssStyle = function userSpecialCssClass() {
            var usingDivForAddClass = ".organizationInfoBlock";
            var preNameClass = "tenantid";

            if ($localStorage.isAuthorized && $localStorage.userTenantId)
                addUserSpecialClass(usingDivForAddClass, preNameClass)
            else if ($localStorage.isAuthorized && !$localStorage.userTenantId)
                $timeout(userSpecialCssClass, 1000);
            else if (!$localStorage.isAuthorized)
                clearUserSpecialClass(usingDivForAddClass, preNameClass);
        }

        function addUserSpecialClass(usingDivForAddClass, preNameClass) {
            var userClass = preNameClass + $localStorage.userTenantId;
            $(usingDivForAddClass).addClass(userClass);
        }

        function clearUserSpecialClass(usingDivForAddClass, preNameClass) {
            var classList = $(usingDivForAddClass).attr('class').split(/\s+/);
            $.each(classList, function (index, item) {
                if (item.indexOf(preNameClass) !== -1) {
                    $(usingDivForAddClass).removeClass(item);
                }
            });
        }

        function createCaptchaScript() {
            let script = document.createElement('script');
            script.src = 'https://www.google.com/recaptcha/api.js?render=' + $localStorage.googleReCaptchaSiteKeyV3;

            document.head.append(script);
        }

        // *** User Special Css Style *** END ***

        this.getDocumentWayType = function () {
            //todo избавиться от хадкода
            var documentWayTypeNumber = abp.setting.values.DocumentWayType;
            if (documentWayTypeNumber === "1")
                return "paper";
            else if (documentWayTypeNumber === "2")
                return "electronic";

            return null;
        }
    }
]);
;
angular.module('app').service('submissionDataService', [
    '$rootScope',
    function (
        $rootScope
    ) {
        this.getSubmissionTendererToolTipText = function (submission) {
            var str = "";
            if (submission) {
                if (submission.identifier) {
                    var whichIdToUse = submission.identifier.apiId ? submission.identifier.apiId : submission.identifier.id;
                    str += "<p><b>Код ЄДРПОУ: </b>" + whichIdToUse + "</p>";
                }
                if (submission.scale) {
                    str += "<p><b>Клас суб'єкту господарювання: </b>" + submission.scale.name + "</p>";
                }
                if (submission.contactPoint && submission.contactPoint.name) {
                    str += "<p><b>Контактна особа: </b>" + submission.contactPoint.name.replace(/[`~!@#$%^&*()_|+\-='"<>\{\}\[\]\\\/]/gi, '') + "</p>";
                }
                if (submission.contactPoint && submission.contactPoint.telephone) {
                    str += "<p><b>Телефон: </b>" + submission.contactPoint.telephone + "</p>"; //.replace(/[`~!@#$%^&*()_|+\-='"<>\{\}\[\]\\\/]/gi, '')
                }
                if (submission.contactPoint && submission.contactPoint.email) {
                    str += "<p><b>Електронна пошта: </b>" + submission.contactPoint.email + "</p>";
                }
                if (submission.address) {
                    str += "<p><b>Місцезнаходження: </b>";
                    if (submission.address.postIndex) {
                        str+= submission.address.postIndex + ', ';
                    }
                    if (submission.address.country) {
                        str+= submission.address.country.title + ', ';
                    }
                    if (submission.address.region) {
                        str+= submission.address.region.title + ', ';
                    }
                    if (submission.address.city) {
                        str+= submission.address.city.title;
                        if (submission.address.addressStr) {
                            str+= ', ';
                        } else {
                            str+= "</p>";
                        }
                    }
                    if (submission.address.addressStr) {
                        str+= submission.address.addressStr + "</p>";
                    }
                }

                if (submission.name) {
                    str += "<p><b>Повна назва юридичної особи: </b>" + submission.name + "</p>";
                }
            }
            return str.replace('\'', '');
        }
    }
]);

;
angular.module('app').
    service('templateCacheService',
        ['$templateCache', function ($templateCache) {
                return new function () {
                    this.setTemplateCache = function (stateParams) {
                        // catch ng include
                        $templateCache.put('footer from cache',
                            $templateCache.get('~/App/Main/base/views/layout/footer.html'));
                        $templateCache.put('callBackForm from cache',
                            $templateCache.get('~/App/Main/base/views/help/callBackForm.html'));
                        $templateCache.put('tenderSearch from cache',
                            $templateCache.get('~/Special/views/tenders/tenderSearch.html'));
                        $templateCache.put('tenderDetailesTopTimeData from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderDetailesTopTimeData.html'));
                        $templateCache.put('tenderDetailesTopLocality from cache',
                            $templateCache.get('~/App/Main/share/directives/tender/tenderDetailesTopLocality.html'));
                        $templateCache.put('tenderDetailesTopEye from cache',
                            $templateCache.get('~/App/Main/share/directives/tender/tenderDetailesTopEye.html'));
                        $templateCache.put('tenderDetailesAboutStartDate from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutStartDate.html'));
                        $templateCache.put('tenderDetailesAboutBudget from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutBudget.html'));
                        $templateCache.put('tenderDetailesAboutMinStep from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutMinStep.html'));
                        $templateCache.put('tenderDetailesAboutDocs from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutDocs.html'));
                        $templateCache.put('tenderDetailesAboutFeature from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutFeature.html'));
                        $templateCache.put('tenderDetailesAboutItemDescr from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutItemDescr.html'));
                        $templateCache.put('tenderDetailesAboutItemQuantity from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutItemQuantity.html'));
                        $templateCache.put('tenderDetailesAboutItemDelivery1 from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutItemDelivery1.html'));
                        $templateCache.put('tenderDetailesAboutItemDelivery2 from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutItemDelivery2.html'));
                        $templateCache.put('tenderDetailesAboutItemClassifi from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutItemClassifi.html'));
                        $templateCache.put('featureAndDocs from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/featureAndDocs.html'));
                        $templateCache.put('tenderTableTitle from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTableBlocks/tenderTableTitle.html'));
                        $templateCache.put('tenderTableValue from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTableBlocks/tenderTableValue.html'));
                        $templateCache.put('tenderTableStatus from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTableBlocks/tenderTableStatus.html'));
                        $templateCache.put('tenderTableDate from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTableBlocks/tenderTableDate.html'));
                        $templateCache.put('tenderTableTopFilters from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderTableTopFilters.html'));
                        $templateCache.put('modalSaveTemplate from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalSaveTemplate.html'));
                        $templateCache.put('tenderSearchDirective from cache',
                            $templateCache.get('~/App/Main/base/directives/filters/tenderSearchFilter.html'));
                        $templateCache.put('modalClassifications from cache',
                            $templateCache.get('~/App/Main/base/views/profile/modalClassifications.html'));
                        $templateCache.put('qualifications from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/qualifications.html'));
                        $templateCache.put('awardContract from cache',
                            $templateCache.get('~/App/Main/base/views/awards/awardContract.html'));
                        $templateCache.put('modalSign from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalSign.html'));
                        $templateCache.put('modalSignNew from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalSignNew.html'));
                        $templateCache.put('personSignDataErrorModal from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/personSignDataErrorModal.html'));
                        $templateCache.put('modalSignNewTender from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalSignNewTender.html'));
                        $templateCache.put('modalSignTender from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalSignTender.html'));
                        $templateCache.put('sideBarContent from cache',
                            $templateCache.get('~/App/Main/base/views/layout/sideBarContent.html'));
                        $templateCache.put('sideBar from cache',
                            $templateCache.get('~/App/Main/base/views/layout/sideBar.html'));
                        $templateCache.put('scaleNotice from cache',
                            $templateCache.get('~/App/Main/base/directives/scaleNotice.html'));
                        $templateCache.put('awardsInfo from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/awardsInfo.html'));
                        $templateCache.put('modalAddRequestToTenant from cache',
                            $templateCache.get('~/App/Main/base/views/profile/modalAddRequestToTenant.html'));
                        $templateCache.put('loginNew from cache',
                            $templateCache.get('~/App/Main/Base/views/auth/loginNew.html'));
                        $templateCache.put('passwordSingle from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/passwordSingle.html'));
                        $templateCache.put('messages from cache',
                            $templateCache.get('~/App/Main/Base/views/profile/messages.html'));
                        $templateCache.put('planForm from cache',
                            $templateCache.get('~/App/Main/base/directives/plans/planForm.html'));         

                        $templateCache.put('sign from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/sign.html'));   
                        $templateCache.put('signNew from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/signNew.html'));   
                        $templateCache.put('planSearch from cache',
                            $templateCache.get('~/App/Main/base/views/plans/planSearch.html'));       
                        $templateCache.put('baseModalSign from cache',
                            $templateCache.get('~/App/Main/base/views/profile/modalSign.html'));       
                        $templateCache.put('plansTable from cache',
                            $templateCache.get('~/Special/views/plans/plansTable.html'));
                        $templateCache.put('dasuProceedingForm from cache',
                            $templateCache.get('~/Special/directives/tender/tenderDetailes/dasu/dasuProceedingForm.html'));
                        $templateCache.put('dasuLiabilities from cache',
                            $templateCache.get('~/Special/directives/tender/tenderDetailes/dasu/dasuLiabilities.html'));
                        $templateCache.put('tendersSearchModal from cache',
                            $templateCache.get('~/App/Main/base/views/myTenders/tendersSearchModal.html'));       
                        $templateCache.put('myTendersCustomer from cache',
                            $templateCache.get('~/Special/views/myTenders/myTendersCustomer.html'));       
                        $templateCache.put('organizationKindNotification from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/organizationKindNotification.html'));       
                        $templateCache.put('login from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/login.html'));

                        $templateCache.put('modalCancelAward from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalCancelAward.html'));       
                        $templateCache.put('modalGetAwards from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalGetAwards.html'));       
                        $templateCache.put('awardsInfoDocuments from cache',
                            $templateCache.get('~/App/Main/share/directives/tender/awardsInfoDocuments.html'));       

                        $templateCache.put('address from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/address.html'));
                        $templateCache.put('email from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/email.html'));       
                        $templateCache.put('fio from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/fio.html'));       
                        $templateCache.put('organisationFullName from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/organisationFullName.html'));       
                        $templateCache.put('personType from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/personType.html'));       
                        $templateCache.put('phoneWithMask from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/phoneWithMask.html'));       
                        $templateCache.put('url from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/url.html'));       
                        $templateCache.put('registerSteps from cache',
                            $templateCache.get('~/App/Main/base/directives/registerSteps.html'));       
                        $templateCache.put('createProfileNew from cache',
                            $templateCache.get('~/Special/views/profile/createProfileNew.html'));       
                        $templateCache.put('myBids from cache',
                            $templateCache.get('~/App/Main/base/views/profile/myBids.html'));
                        $templateCache.put('contractingClose from cache',
                            $templateCache.get('~/App/Main/share/views/contracting/contractingClose.html'));
                        $templateCache.put('additional Contact Points',
                            $templateCache.get('~/Special/directives/contactPoint/additionalContactPoints.html'));
                        $templateCache.put('buyersView from cache',
                            $templateCache.get('~/App/Main/base/directives/buyersView.html'));
                        $templateCache.put('itemDeliveryAddress from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/itemDeliveryAddress.html'));
                        $templateCache.put('buyersEdit from cache',
                            $templateCache.get('~/App/Main/base/directives/buyersEdit.html'));
                        $templateCache.put('modalCreateMilestone from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalCreateMilestone.html'));
                        $templateCache.put('modalCancelTenderButton from cache',
                            $templateCache.get('~/App/Main/base/directives/modalCancelTenderButton.html'));
                        $templateCache.put('tendersSearchAndFilter from cache',
                            $templateCache.get('~/App/Main/share/views/myTenders/tendersSearchAndFilter.html'));
                        $templateCache.put('notificationsModal from cache',
                            $templateCache.get('~/App/Main/base/views/profile/notificationsModal.html'));
                        $templateCache.put('milestones from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/milestones.html'));

                        $templateCache.put('modalProcedureType from cache',
                            $templateCache.get('~/App/Main/base/views/profile/modalProcedureType.html'));
                        $templateCache.put('modalMyTemplates from cache',
                            $templateCache.get('~/App/Main/base/views/profile/modalMyTemplates.html'));
                        $templateCache.put('myTendersFilterButtons from cache',
                            $templateCache.get('~/App/Main/share/views/myTenders/myTendersFilterButtons.html'));
                        $templateCache.put('myTendersCreateAndRefresh from cache',
                            $templateCache.get('~/App/Main/share/views/myTenders/myTendersCreateAndRefresh.html'));

                        $templateCache.put('tenderDetailesAboutCause from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/tenderDetailesAbout/tenderDetailesAboutCause.html'));
                        $templateCache.put('myTendersNoCustomer from cache',
                            $templateCache.get('~/App/Main/base/views/myTenders/myTendersNoCustomer.html'));
                        $templateCache.put('modalDocPreview from cache',
                            $templateCache.get('~/App/Main/share/views/tenders/modalDocPreview.html'));
                        $templateCache.put('additionalClassifications from cache',
                            $templateCache.get('~/Special/views/plans/include/additionalClassifications.html'));
                        $templateCache.put('currency from cache',
                            $templateCache.get('~/App/Main/base/directives/currency.html'));
                        $templateCache.put('signCheck from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/signCheck.html'));
                        $templateCache.put('planDetails from cache',
                            $templateCache.get('~/App/Main/base/views/plans/planDetails.html'));
                        $templateCache.put('myBidsFilters from cache',
                            $templateCache.get('~/App/Main/base/views/profile/myBidsFilters.html'));
                        $templateCache.put('toDoTenders from cache',
                            $templateCache.get('~/Special/views/toDoTenders/toDoTenders.html'));
                        $templateCache.put('createReport from cache',
                            $templateCache.get('~/App/Main/base/views/analytics/createReport.html'));
                        $templateCache.put('myReports from cache',
                            $templateCache.get('~/App/Main/base/views/analytics/myReports.html'));
                        $templateCache.put('analytics from cache',
                            $templateCache.get('~/App/Main/base/views/analytics/analytics.html'));
                        $templateCache.put('planCancellationProcedure from cache',
                            $templateCache.get('~/App/Main/base/directives/plans/planCancellationProcedure.html'));

                        $templateCache.put('contractsSign from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/sign.html'));
                        $templateCache.put('complaintPeriodEndDate from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/complaintPeriodEndDate.html'));
                        $templateCache.put('contractNumber from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/contractNumber.html'));
                        $templateCache.put('contractStatusName from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/contractStatusName.html'));
                        $templateCache.put('lotBidDocuments from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/lotBidDocuments.html'));
                        $templateCache.put('dateSigned from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/dateSigned.html'));
                        $templateCache.put('description from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/description.html'));
                        $templateCache.put('footerButton from cache',
                            $templateCache.get('~/Special/views/contracts/footerButton.html'));
                        $templateCache.put('contractPeriod from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/contractPeriod.html'));
                        $templateCache.put('valueAmount from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/valueAmount.html'));
                        $templateCache.put('unitPrice from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/unitPrice.html'));
                        $templateCache.put('modalSaveData from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalSaveData.html'));
                        $templateCache.put('contractsDocuments from cache',
                            $templateCache.get('~/App/Main/base/views/contracts/contractsDocuments.html'));
                        $templateCache.put('unit from cache',
                            $templateCache.get('~/App/Main/base/directives/unit.html'));
                        $templateCache.put('modalClassification from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/modalClassification.html'));
                        $templateCache.put('itemAdditionalClassification from cache',
                            $templateCache.get('~/Special/directives/tender/createTender/itemAdditionalClassification.html'));
                        $templateCache.put('addItemQuantity from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addItemQuantity.html'));
                        $templateCache.put('addItemData from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addItemData.html'));
                        $templateCache.put('itemClassification from cache',
                            $templateCache.get('~/Special/directives/tender/createTender/itemClassification.html'));
                        $templateCache.put('additionalClassification from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/additionalClassification.html'));
                        $templateCache.put('milestoneSet from cache',
                            $templateCache.get('~/Special/directives/tender/createTender/milestoneSet.html'));
                        $templateCache.put('addTitle from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addTitle.html'));
                        $templateCache.put('addPlanId from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addPlanId.html'));
                        $templateCache.put('addDescription from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addDescription.html'));
                        $templateCache.put('fax from cache',
                            $templateCache.get('~/App/Main/base/directives/profile/fax.html'));
                        $templateCache.put('planAdditionalClassification from cache',
                            $templateCache.get('~/App/Main/base/views/plans/planAdditionalClassification.html'));
                        $templateCache.put('planClassification from cache',
                            $templateCache.get('~/App/Main/base/views/plans/planClassification.html'));
                        $templateCache.put('kekv from cache',
                            $templateCache.get('~/App/Main/base/views/plans/kekv.html'));
                        $templateCache.put('addFunder from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addFunder.html'));
                        $templateCache.put('cancelComplaint from cache',
                            $templateCache.get('~/Special/views/complaint/cancelComplaint.html'));
                        $templateCache.put('uploadFile from cache',
                            $templateCache.get('~/App/Main/base/directives/uploadFile.html'));

                        $templateCache.put('tenderContactPoint from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderContactPoint/tenderContactPoint.html'));

                        $templateCache.put('holdingFilterButtons from cache',
                            $templateCache.get('~/App/Main/base/views/myTenders/myHoldingTendersFilterButtons.html'));

                        $templateCache.put('classificationInput from cache',
                            $templateCache.get('~/App/Main/base/directives/classificationInput.html'));

                        $templateCache.put('createTenderAccelerator from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/createTenderAccelerator.html'));

                        $templateCache.put('createTenderCriteria from cache',
                            $templateCache.get('~/App/Main/base/views/tenders/createTenderCriteria.html'));
                        $templateCache.put('tenderCriteria from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/tenderCriteria.html'));

                        $templateCache.put('criteriaConfirmationMethod from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/criteriaConfirmationMethod.html'));
                        $templateCache.put('frameworksList from cache',
                            $templateCache.get('~/App/Main/base/directives/frameworks/frameworksList.html'));
                        $templateCache.put('frameworksListSearchFilter from cache',
                            $templateCache.get('~/App/Main/base/directives/frameworks/frameworksListSearch.html'));
                        $templateCache.put('submission from cache',
                            $templateCache.get('~/App/Main/base/views/eCatalog/submission.html'));
                        $templateCache.put('eCatalogFilter from cache',
                            $templateCache.get('~/App/Main/base/views/eCatalog/eCatalogFilter.html'));
                        $templateCache.put('eCatalogNewProducts from cache',
                            $templateCache.get('~/App/Main/base/views/eCatalog/eCatalogNewProducts.html'));
                        $templateCache.put('editDocumentsWrapper from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/editDocumentsWrapper.html'));
                        $templateCache.put('lotAndPositionsDocuments from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderDetailes/documents/lotAndPositionsDocuments.html'));

                        $templateCache.put('myOrders from cache',
                            $templateCache.get('~/App/Main/base/directives/markeyMyOrders/myOrdersProzorroMarket.html'));

                        $templateCache.put('tenderTableMainWithFilter from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/tenderTable/tenderTableMainWithFilter.html'));
                        $templateCache.put('editDocumentsWrapperTab from cache',
                            $templateCache.get('~/App/Main/base/views/document/editDocumentsWrapperTab.html'));

                        $templateCache.put('addContractGuaranteeCriteria from cache',
                            $templateCache.get('~/App/Main/base/directives/criterias/addContractGuaranteeCriteria.html'));
                        $templateCache.put('addAwardCreate from cache',
                            $templateCache.get('~/App/Main/base/directives/tender/createTender/addAwardCreate.html'));

                        $templateCache.put('criteriaRequirementMethod from cache',
                            $templateCache.get('~/App/Main/base/directives/criterias/criteriaRequirementConfirmationMethod.html'));

                        $templateCache.put('marketQualification from cache',
                            $templateCache.get('~/App/Main/base/directives/MarketQualification/marketQualification.html'));

                        $templateCache.put('marketBreadcrumbs from cache',
                            $templateCache.get('~/App/Main/base/directives/marketBreadcrumbsHeader/marketBreadcrumbs.html'));

                        $templateCache.put('priceQuotationProfilesModal from cache',
                            $templateCache.get('~/App/Main/base/directives/priceQuotationProfilesModal/priceQuotationProfilesModal.html'));

                        $templateCache.put('criteriaTemplates from cache',
                            $templateCache.get('~/App/Main/base/directives/criteriaTemplates/criteriaTemplates.html'));

                    };

                };
            }]);
;
angular.module('app').service('tenderCriteriasService', [
    'abp.services.etender.tenderCriteria',
    function (tenderCriteria) {

        var lifeCycleCriteriasTypes = [
            'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
            'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
            'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
            'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
        ];

        this.saveTenderWithCriterias = function (tenderCriteriasDto, tenderId, updateTenderStatus) {
            abp.ui.setBusy();
            var filteredCriteriasDto = angular.copy(tenderCriteriasDto);

            angular.forEach(filteredCriteriasDto, function (criteria) {
                if (!criteria.id) {
                    criteria.apiId = null;
                    criteria.id = null;
                }
            });
            for (var criteriaIndex = 0; criteriaIndex < tenderCriteriasDto.length; criteriaIndex++) {
                if ((filteredCriteriasDto[criteriaIndex].isOptional && filteredCriteriasDto[criteriaIndex].isOptionalChecked) || !filteredCriteriasDto[criteriaIndex].isOptional) {
                    delete filteredCriteriasDto[criteriaIndex].isOptional;
                    delete filteredCriteriasDto[criteriaIndex].isOptionalChecked;
                    for (var groupIndex = 0; groupIndex < tenderCriteriasDto[criteriaIndex].requirementGroups.length; groupIndex++) {
                        for (var requirementIndex = 0; requirementIndex < tenderCriteriasDto[criteriaIndex].requirementGroups[groupIndex].requirements.length; requirementIndex++) {
                            filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].requirements = tenderCriteriasDto[criteriaIndex].requirementGroups[groupIndex].requirements.filter(function (el) {
                                return el.isOptionalChecked && !el.datePublished && !el.apiId;
                            });
                            filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements = tenderCriteriasDto[criteriaIndex].requirementGroups[groupIndex].requirements.filter(function (el) {
                                return el.isOptionalChecked && (el.datePublished || el.apiId);
                            });

                            filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements.forEach(function (requirement) {
                                var sameIdRequirements =
                                    filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements.filter(function (sameIdRequirement) {
                                        return  requirement.apiId === sameIdRequirement.apiId;
                                    });

                                if (sameIdRequirements.length > 1) {
                                    sameIdRequirements.sort(function (a, b) {
                                        return new Date(b.datePublished) - new Date(a.datePublished);
                                    });

                                    sameIdRequirements.forEach(function (requirement, index) {
                                        if (index !== 0) {
                                            var requirementIndex =
                                                filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements.indexOf(requirement);
                                            filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements.splice(requirementIndex, 1);
                                        }
                                    });
                                }

                                filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements.forEach(function (requirement) {
                                    if (requirement.requirementStatus === 'cancelled') {
                                        requirement.eligibleEvidences = requirement.eligibleEvidences.filter(function (evidence) {
                                            return evidence.apiId;
                                        });
                                    }
                                });
                            });

                            if (!filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].requirements.length) {
                                delete filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].requirements;
                            }

                            if (!filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements.length) {
                                delete filteredCriteriasDto[criteriaIndex].requirementGroups[groupIndex].lastUniqueRequirements;
                            }
                        }
                    }
                } else {
                    delete filteredCriteriasDto[criteriaIndex];
                }
            }

            filteredCriteriasDto = filteredCriteriasDto.filter(function (criteria) {
               return criteria != null;
            });

            tenderCriteria.insertOrUpdateTenderCriteria({ "tenderCriterionInputDtos": filteredCriteriasDto, "tenderNewId": tenderId }).then(function (response) {
                response.data.forEach(function (responseCriteria) {
                    setIdToCriteria(responseCriteria);
                });
                updateTenderStatus();
                abp.notify.success('Критерії додано успішно');
            }, function (error) {
                console.log(error)
            }).finally(function () {
                abp.ui.clearBusy();
            });

            function setIdToCriteria(responseCriteria) {
                tenderCriteriasDto.forEach(function (criteria) {
                    if (responseCriteria.id === criteria.id) {
                        criteria.id = responseCriteria.id;
                        criteria.apiId = responseCriteria.apiId;
                        setIdsToRequirementGroups(criteria.requirementGroups, responseCriteria.requirementGroups);
                    }
                });
            };

            function setIdsToRequirementGroups(localGroups, responseGroups) {
                localGroups.forEach(function (group) {
                    responseGroups.forEach(function (responseGroup) {
                        if (group.id === responseGroup.id) {
                            group.id = responseGroup.id;
                            group.apiId = responseGroup.apiId;
                            setIdsToRequirements(group.requirements, responseGroup.requirements);
                        }
                    });
                });
            };

            function setIdsToRequirements(localRequirements, responseRequirements) {
                localRequirements.forEach(function (requirement) {
                    responseRequirements.forEach(function (responseRequirement) {
                        if (requirement.title === responseRequirement.title) {
                            requirement.id = responseRequirement.id;
                            requirement.apiId = responseRequirement.apiId;
                            if (requirement.eligibleEvidences && requirement.eligibleEvidences.length && responseRequirement.eligibleEvidences.length) {
                                setIdsToEligibleEvidences(requirement.eligibleEvidences, responseRequirement.eligibleEvidences);
                            }
                        }
                    });
                });
            };

            function setIdsToEligibleEvidences(localEvidences, responseEvidences) {
                localEvidences.forEach(function (evidence) {
                    responseEvidences.forEach(function (responseEvidence) {
                        if (evidence.title === responseEvidence.title) {
                            evidence.id = responseEvidence.id;
                            evidence.apiId = responseEvidence.apiId;
                        }
                    });
                });
            };
        };

        this.getDisqualifyCriterias = function (tenderCriteria) {
            return tenderCriteria && tenderCriteria.length ? tenderCriteria.filter(function (criteria) {
                return criteria.source === 'procuringEntity';
            }) : [];
        };
        
        this.isLifeCycleCriteriasValid = function (criterias, detailes) {
            var isValid = true;

            if (criterias && criterias.length) {
                var lifeCycleCriterias = criterias.filter(function (criteria) {
                    return lifeCycleCriteriasTypes.indexOf(criteria.classification.id) !== -1
                        || lifeCycleCriteriasTypes.indexOf(criteria.classification.apiId) !== -1;
                });

                if (lifeCycleCriterias.length) {
                    var activeCriterias = lifeCycleCriterias.filter(function (criteria) {
                        return (!criteria.isOptional || (criteria.isOptional && criteria.isOptionalChecked)) && criteria.apiId;
                    });

                    if (activeCriterias.length) {
                        detailes.lots.forEach(function (lot) {
                            var activeLotRequirements = [];
                            if (lot.isFake) {
                                activeLotRequirements = angular.copy(activeCriterias);
                            } else {
                                activeLotRequirements = activeCriterias.filter(function (criteria) {
                                    return criteria.relatedItem === lot.id || criteria.relatedItem === lot.apiId;
                                });
                            }

                            var criteriaHasActiveRequirements = [];
                            activeLotRequirements.forEach(function (activeCriteria) {
                                var hasActiveRequirement = false;
                                activeCriteria.requirementGroups.forEach(function (group) {
                                    group.requirements.forEach(function (requirement) {
                                        if (requirement.requirementStatus !== 'cancelled') {
                                            hasActiveRequirement = true;
                                        }
                                    })
                                });
                                criteriaHasActiveRequirements.push(hasActiveRequirement);
                            });

                            var hasActiveRequirements = criteriaHasActiveRequirements.some(function (hasRequirement) {
                                return hasRequirement === true;
                            });

                            if (!hasActiveRequirements) {
                                isValid = false;
                            }
                        });
                    } else {
                        isValid = false;
                    }
                }

            }
            return isValid;
        };
    }
]);
;
angular.module('app').service('tenderHasBidsService', [
    function () {
        return new function () {
            this.setTenderHasBids = function (tender, $scope) {
                if (tender.bids && tender.bids.length > 0) {
                    $scope.tenderHasBids = true;
                    return;
                }
                angular.forEach(tender.lots, function (lot) {
                    if (lot.bids && lot.bids.length > 0) {
                        $scope.tenderHasBids = true;
                        return;
                    }
                });
            };
        }
    }
])
;
angular.module('app').
    service('tenderHelperService', ['datesHelperService', '$localStorage', 'loadTypesAndConfident', 'DEFAULT_ACCELERATOR_VALUE', function (datesHelperService, $localStorage, loadTypesAndConfident, DEFAULT_ACCELERATOR_VALUE) {

    return new function () {

        this.isDeliveryStartDateGoodForAbove = function (deliveryDate, tenderPeriod) {

            if (deliveryDate && deliveryDate.startDate && deliveryDate.startDate.getDay == undefined) { // значит умы имеем дело со строкой
                deliveryDate.startDate = datesHelperService.jsonStringToDate(deliveryDate.startDate);
            }
            if (tenderPeriod && tenderPeriod.endDate && tenderPeriod.endDate.getDay == undefined) { // значит умы имеем дело со строкой
                tenderPeriod.endDate = datesHelperService.jsonStringToDate(tenderPeriod.endDate);
            }

            if (deliveryDate && tenderPeriod && deliveryDate.startDate
                      && ((deliveryDate.startDate < tenderPeriod.endDate) || (deliveryDate.startDate < tenderPeriod.endDate))) {
                    return false;
            }
            return true;
        };

        this.isDeliveryEndDateGoodForAbove = function (deliveryDate, tenderPeriod) {

            if (deliveryDate && deliveryDate.startDate && deliveryDate.startDate.getDay == undefined) { // значит умы имеем дело со строкой
                deliveryDate.startDate = datesHelperService.jsonStringToDate(deliveryDate.startDate);
            }
            if (deliveryDate && deliveryDate.endDate && deliveryDate.endDate.getDay == undefined) { // значит умы имеем дело со строкой
                deliveryDate.endDate = datesHelperService.jsonStringToDate(deliveryDate.endDate);
            }
            if (tenderPeriod && tenderPeriod.endDate && tenderPeriod.endDate.getDay == undefined) { // значит умы имеем дело со строкой
                tenderPeriod.endDate = datesHelperService.jsonStringToDate(tenderPeriod.endDate);
            }

            if (!tenderPeriod || !deliveryDate || !deliveryDate.endDate || (
                         (deliveryDate.startDate && (deliveryDate.endDate < deliveryDate.startDate) )
                      || (!deliveryDate.startDate && (deliveryDate.endDate < tenderPeriod.endDate))
                     )) {
                return false;
            }
            return true;
        };

        this.isDeliveryDateGoodForAbove = function (deliveryDate, tenderPeriod) {
            return this.isDeliveryStartDateGoodForAbove(deliveryDate, tenderPeriod) && this.isDeliveryEndDateGoodForAbove(deliveryDate, tenderPeriod);
        };

        this.isBefore2017 = function (endDate) {
            var date2017 = new Date('2017/01/01');
            return endDate < date2017;
        };

        this.customTendTitle = function(title) {
            if (title !== null && title.length > 300) return title.substring(0, 299) + '...';
            else return title;
        };

        this.validDocPeriod = function (tender) {
            if (tender.procurementMethod === 'limited') return true;
            if (tender.tenderPeriod == null) return false;
            var tenderEndDate = tender.tenderPeriod.endDate;
            var period = new Date(tenderEndDate) - new Date();
            var isTestTenders = !$localStorage.isProdMode;
            if (((period < 604800000 && !isTestTenders) || (period < 420000 && isTestTenders)) && (tender.procurementMethodType == 'aboveThresholdEU' || tender.procurementMethodType == 'aboveThresholdUA')) {
                return 'above';
            } else {
                if (((period < 172800000 && !isTestTenders) || (period < 120000 && isTestTenders)) && (tender.procurementMethodType == 'aboveThresholdUA.defense' || tender.procurementMethodType == 'simple.defense'))
                    return 'above.defense';
                else {
                    return true;
                }
            }
        };

        this.isFilledEnName = function (organization, userNameEn) {
            if (!organization.nameEN || (!organization.contactPoint.nameEN && !userNameEn) || !organization.identifier.legalNameEN) {
                abp.notify.error('Для оголошення закупівлі даного типу, заповніть поля "Повна назва (англ)", "ПІБ (англ.)", "Мова спілкування", в налаштуваннях організації / моїх даних.');
                return false;
            }
            return true;
        };

        this.diffBetweenDates = function (diffDates, getData) {
            var nowDate = new Date();
            var endDate = new Date(getData);
            var st = nowDate.getTime();
            var et = endDate.getTime();
            var diff = (et - st) / (1000 * 3600 * 24);
            if ($localStorage.isProductionSite) {
                return diff >= diffDates;
            }
            // для тестовых закупок валидация отключена
            if (!$localStorage.isProdMode && (diff > 0))
                return true;
                return diff >= diffDates;
        };

        //for rialto
        this.hasNotDeterminedBudget = function(lots) {
            var has = false;
            angular.forEach(lots, function(l) {
                if (l.value.amount === 999999999) {
                    has = true;
                }                      
            });
            return has;
        };

        this.selectedProcType = "";

        this.setAdditionalClassifications = function(data) {
            for (var k = 0; k < data.lots.length; k += 1) {
                var lot = data.lots[k];        
                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];
                    if (curItem.classification.code || curItem.classification.id) {
                        data.hideRemoveButton = true;
                        if (curItem.additionalClassificationInn && curItem.additionalClassificationInn.id) {
                            curItem.additionalClassifications.push(curItem.additionalClassificationInn);
                            delete curItem.additionalClassificationInn;
                        }
                        if (curItem.additionalClassificationAtc && curItem.additionalClassificationAtc.id) {
                            curItem.additionalClassifications.push(curItem.additionalClassificationAtc);
                            delete curItem.additionalClassificationAtc;
                        }
                        if (curItem.additionalClassificationRoads && curItem.additionalClassificationRoads.id) {
                            curItem.additionalClassifications.push(curItem.additionalClassificationRoads);
                            delete curItem.additionalClassificationRoads;
                        }
                        if (curItem.additionalClassificationGmdns && curItem.additionalClassificationGmdns.id) {
                            curItem.additionalClassifications.push(curItem.additionalClassificationGmdns);
                            delete curItem.additionalClassificationGmdns;
                        }
                    }
                }
            }
            return data;
        }

        this.getDocTypes = function () {
            var documentTypesForDropDown = null;
            if ($localStorage.refs && $localStorage.refs.documentTypes && $localStorage.refs.documentTypes.tenderDocuments) {
                documentTypesForDropDown = angular.copy($localStorage.refs.documentTypes.tenderDocuments);
            } else {
                loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                    documentTypesForDropDown = documentTypes.tenderDocuments;
                });
            }
            return documentTypesForDropDown;
        }
        this.getCreateTenderModel = function (procurementType, procurementMethod, isProdMode, state) {
            var createTenderModel = {
                description: null,
                features: [],
                procurementMethod: procurementMethod,
                procurementMethodType: procurementType,
                title: null,
                lots: [],
                value: {
                    currencyId: 1, //'UAH'
                    valueAddedTaxIncluded: false
                },
                accelerator: {
                    procurementMethodDetails: DEFAULT_ACCELERATOR_VALUE
                },
                userId: abp.session.userId,
                isProdMode: isProdMode
            };

            if (!(procurementType == 'negotiation' || procurementType == 'negotiation.quick' || procurementType == 'reporting')) {
                createTenderModel.enquiryPeriod = {
                    startDate: null,
                    endDate: null
                };
                createTenderModel.tenderPeriod = {
                    startDate: null,
                    endDate: null
                };
            }

            switch (procurementType) {
                case 'belowThreshold':
                    createTenderModel.isSimpleProcurementMethodRationale = state.is('createTender', { subtype: 'simple' });
                    break;
                case 'competitiveDialogueUA':
                case 'competitiveDialogueEU':
                    createTenderModel.lots = [{
                        auctionPeriod: {
                            startDate: null,
                            endDate: null
                        },
                        awardPeriod: {
                            startDate: null,
                            endDate: null
                        },
                        items: [{
                            additionalClassifications: [
                                {
                                    code: '',
                                    description: ''
                                }],
                            classification: {},
                            deliveryDate: {
                                startDate: null,
                                endDate: null
                            },
                            description: null,
                            features: [],
                            quantity: null
                        }
                        ],
                        minimalStep: {
                            amount: '',
                        },
                        value: {
                            amount: '',
                            valueAddedTaxIncluded: false
                        },
                        features: [],
                        hasGuarantee: '0'
                    }];
                    break;
                case 'closeFrameworkAgreementUA':
                    createTenderModel.agreementDuration = null;
                    break;
                case 'esco':
                    createTenderModel.escoTenderExt = {
                        nbuDiscountRate: null,
                        fundingKind: 'other'
                    }
                    break;
                case 'negotiation':
                case 'negotiation.quick':
                case 'reporting':
                    createTenderModel.lots = [{
                        items: [],
                        title: 'Лот 1',
                        value: {
                            amount: '',
                            valueAddedTaxIncluded: false
                        }
                    }];
                    break;
                default:
                    break;
            }

            return createTenderModel;
        }

        this.addEmptyDk = function (lot) {
            var ifClassificationsDk = function (item) {
                var i = 0;
                for (i; i < item.additionalClassifications.length; i++) {
                    if (item.additionalClassifications[i].scheme === null ||
                        item.additionalClassifications[i].scheme !== null &&
                        item.additionalClassifications[i].scheme.indexOf('ДК') !== -1) {
                        return true;
                    }
                }
                return false;
            }
            lot.items.forEach(function (i) {
                if (!ifClassificationsDk(i)) {
                    i.additionalClassifications.push({
                        code: '',
                        description: ''
                    });
                }
                if (i.classification == null) {
                    i.classification = {}
                }
            });
        }

        this.setDefaultItems = function(data) {
            var i = 0;
            for (i; i <= data.lots.length - 1; i++) {
                var items = data.lots[i].items;
                var iI = 0;
                for (iI; iI <= items.length - 1; iI++)
                    items[iI].defaultItem = true;
            };
        };

        this.addAdditionalInfo = function (data) {

            var obj = {
                time: getCurentTime(),
                tabId: sessionStorage.tabID || 1,
                createId: getCreateId()
            }

            function getCurentTime() {
                var currentdate = new Date();
                var datetime = "Create time: " +
                    currentdate.getDate() +
                    "/" + currentdate.getHours() +
                    ":" + currentdate.getMinutes() +
                    ":" + currentdate.getSeconds() +
                    ":" + currentdate.getMilliseconds();
                return datetime;
            }

            function getCreateId() {
                function guid() {
                    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
                        s4() + '-' + s4() + s4() + s4();
                }
                function s4() {
                    return Math.floor((1 + Math.random()) * 0x10000)
                        .toString(16)
                        .substring(1);
                }
                return guid();
            }

            data.addAdditionalInfo = obj;
        }

        this.needVat = function (contract) {
            switch (contract.procurementMethodType) {
            case 'belowThreshold':
                return true;
            case 'aboveThresholdUA':
                return true;
            case 'aboveThresholdEU':
                return true;
            case 'aboveThresholdUA.defense':
                return true;
            case 'simple.defense':
                return true;
            case 'competitiveDialogueUA.stage2':
                return true;
            case 'competitiveDialogueEU.stage2':
                return true;
            case 'closeFrameworkAgreementSelectionUA':
                return true;
            case 'negotiation':
                return true;
            case 'negotiation.quick':
                return true;
            case 'reporting':
                return true;
            case 'priceQuotation':
                return true;
            //case 'esco':
            //    return true;
            default:
                return false;
            }
        }

    };

}]);;
angular.module('app').service('tenderReasonTypeService', [
    '$localStorage',
    function (
        $localStorage
    ) {
        return new function () {
            function getNewReasonTypesByProcurementMethodType(procMethodType) {
                if ($localStorage.isAuthorized) {
                    var newReasonTypes = $localStorage.refs.cancellationReasonTypes.new;
                    for (var index = 0; index < newReasonTypes.length; index++) {
                        if (newReasonTypes[index].procurementMethodType == procMethodType) {
                            return newReasonTypes[index].cancellationReasonTypes;
                        }
                    }
                }
            }

            this.getReasonTypes = function (isNewFlow, procMethodType) {
                var reasonTypes = $localStorage.refs.cancellationReasonTypes;
                var _getReasons = null;

                if (isNewFlow) {
                    _getReasons = getNewReasonTypesByProcurementMethodType(procMethodType);
                } else {
                    _getReasons = reasonTypes.old;
                }
                return _getReasons;
            }
        }
    }
]);
angular.module('app').service('tenderValidationService', [
    'datesHelperService',
    '$localStorage',
    function (datesHelperService, $localStorage) {
        return new function () {

            this.isValidDateToCreateTender = function (minimalStepForValidDateCreate) {
                var nowDate = new Date();
                nowDate = nowDate.setDate(nowDate.getDate() + minimalStepForValidDateCreate);
                nowDate = new Date(nowDate);
                return nowDate;
            };

            this.isValidDateToUpdateTender = function (tenderCreationFullDate, tenderPeriodEndDate, minimalStepForValidDateCreate, minimalStepForValidDateUpdate, isProdMode) {
                var isErrorDate = false;
                var nowDate = new Date();
                var creationDate = datesHelperService.getNextDayWithoutTime(tenderCreationFullDate);
                var minDateProposals = datesHelperService.minDateProposals(nowDate, creationDate, minimalStepForValidDateCreate, minimalStepForValidDateUpdate);

                if (!isProdMode && tenderPeriodEndDate != null && (new Date(tenderPeriodEndDate) > nowDate)) {
                    isErrorDate = false;
                } else {
                    if (tenderPeriodEndDate != null && (minDateProposals > new Date(tenderPeriodEndDate))) {
                        isErrorDate = true;
                    } else {
                        isErrorDate = false;
                    }
                }
                return isErrorDate;
            };

            this.isValidDateToUpdateDefenseTender = function (tenderPeriodEndDate, tenderCreationDate) {
                var daysBeforeTenderEndDate = 6;
                var daysBeforeTenderCreateDate = 3;

                var isErrorDate = false;
                var daysDifferenceForTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), tenderPeriodEndDate, true);
                var daysDifferenceForTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(tenderCreationDate, tenderPeriodEndDate, true);

                isErrorDate = ((tenderPeriodEndDate > daysBeforeTenderCreateDate && Math.floor(daysDifferenceForTenderCreateDate) < daysBeforeTenderEndDate) && daysBeforeTenderEndDate > Math.floor(daysDifferenceForTenderEndDate)) ? true : false;

                return isErrorDate;
            };

            this.checkTenderAbovePeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateOpenUaCreate;
                var minimalStepForValidDateUpdate = $localStorage.controlDatesOfProcedures.controlDateOpenUaEdit;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
            this.checkTenderAboveEuPeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate;
                var minimalStepForValidDateUpdate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuEdit;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
            this.checkTenderDefensePeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateDefenseCreate;
                var minimalStepForValidDateUpdate = $localStorage.controlDatesOfProcedures.controlDateDefenseEdit;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
            this.checkTenderEscoPeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate;
                var minimalStepForValidDateUpdate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuEdit;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
            this.checkTenderFrameworkPeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate;
                var minimalStepForValidDateUpdate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuEdit;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
            this.checkTenderPQPeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate;
                var minimalStepForValidDateUpdate = 3;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
            this.checkTenderDialoguePeriodForUpdate = function (updateTenderPeriodEndDate, updateTenderCreationDate) {
                var minimalStepForValidDateCreate = $localStorage.controlDatesOfProcedures.controlDateOpenUaCreate;
                var minimalStepForValidDateUpdate = $localStorage.controlDatesOfProcedures.controlDateOpenUaEdit;
                var isProdMode = $localStorage.isProdMode;

                var daysBeforeTenderEndDate = datesHelperService.howManyDaysLeftBetweenDates(new Date(), updateTenderPeriodEndDate, false);
                var daysBeforeTenderCreateDate = datesHelperService.howManyDaysLeftBetweenDates(updateTenderCreationDate, updateTenderPeriodEndDate, false);
                // для тестовых закупок валидация отключена
                if (!isProdMode && (daysBeforeTenderEndDate > 0))
                    return true;
                return (daysBeforeTenderEndDate >= minimalStepForValidDateUpdate && daysBeforeTenderCreateDate >= minimalStepForValidDateCreate) ? true : false;
            };
        }
    }
]);
angular.module('app').service('translitService', [
    function () {
        this.getData = function () {
            var associations = {
                "а": "a",
                "б": "b",
                "в": "v",
                "ґ": "g",
                "г": "g",
                "д": "d",
                "е": "e",
                "ё": "e",
                "є": "ye",
                "ж": "zh",
                "з": "z",
                "и": "i",
                "і": "i",
                "ї": "yi",
                "й": "i",
                "к": "k",
                "л": "l",
                "м": "m",
                "н": "n",
                "о": "o",
                "п": "p",
                "р": "r",
                "с": "s",
                "т": "t",
                "у": "u",
                "ф": "f",
                "х": "h",
                "ц": "c",
                "ч": "ch",
                "ш": "sh",
                "щ": "sh'",
                "ъ": "",
                "ы": "i",
                "ь": "",
                "э": "e",
                "ю": "yu",
                "я": "ya",
                "А": "A",
                "Б": "B",
                "В": "V",
                "Г": "G",
                "Д": "D",
                "Е": "E",
                "Ё": "E",
                "Є": "Ye",
                "Ж": "Zh",
                "З": "Z",
                "И": "I",
                "І": "I",
                "Ї": "Yi",
                "Й": "I",
                "К": "K",
                "Л": "L",
                "М": "M",
                "Н": "N",
                "О": "O",
                "П": "P",
                "Р": "R",
                "С": "S",
                "Т": "T",
                "У": "U",
                "Ф": "F",
                "Х": "H",
                "Ц": "Ts",
                "Ч": "Ch",
                "Ш": "Sh",
                "Щ": "Sh'",
                "Ы": "I",
                "Ь": "",
                "Э": "E",
                "Ю": "Yu",
                "Я": "Ya"
            };
            function transform(str, spaceReplacement) {
                if (!str) {
                    return "";
                }
                var newStr = "";
                for (var i = 0; i < str.length; i++) {
                    var strLower = str[i];
                    if (strLower === " " && spaceReplacement) {
                        newStr += spaceReplacement;
                        continue;
                    }
                    var newLetter = associations[strLower];
                    if ("undefined" === typeof newLetter) {
                        newStr += strLower;
                    }
                    else {
                        newStr += newLetter;
                    }
                }
                return newStr;
            }
            return {
                transform: transform
            };
        };
    }
]);

;
angular.module('app').
    service('treeMoveService', ['$timeout', function ($timeout) {
        return new function () {

            this.collapseTree = function (idBlock, index, scope) {
                var id = '#' + idBlock + index;
                if (scope[idBlock + index]) {
                    closeTree(id, index, scope, idBlock);
                } else {
                    scope[idBlock + index] = true;
                    openTree(id, index, scope);
                }
            };

            function closeTree(id, index, scope, idBlock) {
                scope.colapseHide(id);
                $timeout(function () {
                    hideIf(index, scope, idBlock);
                }, 500);
            }

            function hideIf(index, scope, idBlock) {
                scope[idBlock + index] = false;
            }

            function openTree(id, index, scope) {
                $timeout(function () {
                    scope.colapseShow(id);
                }, 200);
            }

            this.showTreeBlock = function (index, scope, idBlock) {
                if (scope[idBlock + index]) {
                    return true;
                } else {
                    return false;
                }
            }

        };
    }]);;
angular.module('app').
    service('uploadFileService', [
        '$localStorage',
        'documentsService',
        '$timeout',
        'Upload',
        '$q',
        'bidHelperService',
        '$rootScope',
        function (
            $localStorage,
            documentsService,
            $timeout,
            Upload,
            $q,
            bidHelper,
            $rootScope
        ) {
        return new function () {
            function isFileExtensionSupported(param) {
                var extensions = $localStorage.allowedFileExtensions.split(',');
                var fileExtension = '.' + param.name.split('.').pop();
                return extensions.some(function (ext) {
                    return ext.toLowerCase() === fileExtension.toLowerCase();
                });
            }

            function showModalDocNotification(id, $scope) {
                $scope.showModalDocNotification = true;
                $timeout(function () {
                    $(id).modal('toggle');
                }, 1000);
            }

            var simultaneouslyUploadFilesCount = $localStorage.simultaneouslyUploadFilesCount || 5;
            $localStorage.sameTimeUploadFilesCount = $localStorage.sameTimeUploadFilesCount || 0;
            var uploadFilesCounter = 0;
            function uploadUsing$upload(file, listOfFiles, $scope, obj) {
                var uploadProperties = null;
                if ($scope.isMassFeed) {
                    uploadProperties = $scope.fields ? angular.copy($scope.fields) : { myObj: obj, notExport: true };
                } else {
                    uploadProperties = $scope.fields ? angular.copy($scope.fields) : { myObj: obj };
                }
                if (isFileExtensionSupported(file)) {
                    if ($localStorage.sameTimeUploadFilesCount > simultaneouslyUploadFilesCount) {
                        setTimeout(function () {
                            uploadUsing$upload(file, listOfFiles, $scope, obj);
                        }, 500);
                        return;
                    } else {
                        $localStorage.sameTimeUploadFilesCount++;
                    }
                    if (!file) return;

                    if (documentsService.validateDocName(file.name) == 0) return;

                    var url = $scope.apiUrl ? $scope.apiUrl : abp.appPath + 'api/Files/Upload';
                    
                    var uploadObject = {
                        url: url,
                        method: 'POST',
                        fields: uploadProperties,
                        file: file
                    }
                    if ($scope.selectedDocType) { //это поле создается когда док загружается в modalGetAwards
                        uploadObject.fields.DocumentType = $scope.selectedDocType;
                    }

                    file.upload = Upload.upload(uploadObject);
                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                            $scope.$emit('reloadPlanTable', response.data);
                            $('#modalGetAwards').modal('hide');
                        });
                    }, function (response) {
                        if (response.status > 0)
                            $scope.errorMsg = response.status + ': ' + response.data;
                    });

                    file.upload.progress(function (evt) {
                        // Math.min is to fix IE which reports 200% sometimes
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });

                    file.upload.success(function (data, status, headers, config) {
                        $rootScope.$broadcast('onUploadFinished');
                        if (data.isError) {
                            $rootScope.$broadcast('uploadHasInvalidFile', data.errorMessage, file);
                            $rootScope.$broadcast('reloadTender', $scope.needToSkipComplaints);
                        } else {
                            abp.notify.success("Файл додано!");
                            if (!$scope.isDraft && $scope.isDraft !== undefined) toastr.warning('Час синхронізації файлів на ЦБД може зайняти до 20 хвилин. ' +
                                'У випадку затримки синхронізації, обов’язково зверніться на службу технічної підтримки: ' +
                                '0 800 30 77 55 (безкоштовно в межах України), +380 (44) 223 68 92, support@e-tender.ua',
                                'Увага!',
                                {
                                    closeButton: true,
                                    timeOut: 0,
                                    extendedTimeOut: 0
                                });
    
                            uploadFilesCounter++;
                            if (uploadFilesCounter == listOfFiles.length) {
                                listOfFiles.splice(0, listOfFiles.length);
                                uploadFilesCounter = 0;
                                if (angular.isFunction($scope.onSuccess)) {
                                    // $scope.onSuccessData = data;
                                    $scope.onSuccess(data);
                                }
                                if (uploadProperties.isShowModal) {
                                    $scope.$emit('showModalDocNotification', "#modalDocNotification");
                                }
    
                                if (!$scope.fields || !$scope.fields.dontUpdateTender) {
                                    $rootScope.$broadcast('reloadTender', $scope.needToSkipComplaints);
                                }
                                
                            }
                        }
                        $localStorage.sameTimeUploadFilesCount--;
                        abp.ui.clearBusy();
                    }).error(function (data) {
                        $localStorage.sameTimeUploadFilesCount--;
                        abp.notify.error(data.exceptionMessage || data.message);
                        if (angular.isFunction($scope.onError)) {
                            $scope.onError(data);
                        };
                        $rootScope.$broadcast('reloadTender', $scope.needToSkipComplaints);
                        abp.ui.clearBusy();
                    });
                } else {
                    abp.ui.clearBusy();
                    abp.notify.error('Невірне розширення завантаженого файлу. Спробуйте загрузити інший документ');
                }
            }

            this.isMaxUploadFilesCountGoodOrNotify = function (files, $scope) {
                if (files.length > $localStorage.maxFilesCount) {
                    abp.notify.error($scope.$root.source('MaxFilesCount') + $localStorage.maxFilesCount);
                    return true;
                }
                return false;
            };
            this.upload = function (files, $scope) {
                var defer = $q.defer();
                if (files && files.length) {
                    if ($scope.onUpload) {
                        var promise = $scope.onUpload($scope.onUploadData);
                        if (promise && angular.isFunction(promise.then)) {
                            return promise.then(doUpload);
                        }
                    }
                    doUpload();
                    defer.resolve();
                }
                return defer.promise;
                function doUpload() {
                    var o = {}
                    if ($scope.doNotUpload) {
                        $scope.onChange && $scope.onChange(files);
                        return;
                    }
                    // Wait for files field to update
                    $timeout(function () {
                        if ($scope.uploadToAward) {
                            o = { //поля для загрузки дока в modalGetAwards
                                tenderId: $scope.tId,
                                documentId: $scope.docIdForEditing || "",
                                awardId: $scope.award.id
                            };
                        }
                        files.forEach(function (file) {
                            if ($scope.isMassFeed) {
                                o = { //поля для массовой загрузки доков в лоты
                                    tenderId: $scope.tender.id,
                                    bidId: null,
                                    documentId: null,
                                    confidentiality: $scope.ifConfidentiality(file, 'confidentiality') ? $scope.ifConfidentiality(file, 'confidentiality') : 'public',
                                    confidentialityRationale: $scope.ifConfidentiality(file, 'confidentialityRationale'),
                                    type: file.docType && file.docType.id ? file.docType.id : null,
                                    sharedDocs: true,
                                    bidIds: $scope.allIds,
                                    isDescriptionDecision: bidHelper.setDescriptionDecision(file),
                                    isShowModal: false
                                };
                            }
                            uploadUsing$upload(file, files, $scope, o);
                        });
                    }, 0);
                }
            }
        };
    }]); 
;
angular.module('app').service('urlService', ['$location', '$rootScope', function ($location, $rootScope) {
    return new function () {
        this.redirectToAgreementDetailes = function (agreementId) {
            $location.path('/agreementDetailes/' + agreementId);
        };
        this.redirectToTenderDetailes = function (tenderId) {
            $location.path('/tenderDetailes/' + tenderId);
        }

        this.redirectToCorrectPage = function () {
            var page = 1;
            if ($rootScope.preserveLastPage) {
                $rootScope.preserveLastPage = false;
                page = $rootScope.lastPage || 1;
            }

            return page;
        };
    };
}]);;
angular.module('app').service('userDataService', ['abp.services.etender.user', '$localStorage', '$sessionStorage',
    function (user, $localStorage, $sessionStorage) {
        this.getData = function () {
            var getUser = user.getCurrentUser();
            getUser.then(function (response) {
                var data = response.data;
                console.log("User:", data);
                $localStorage.userData = data;
                if (data.patronymic) $localStorage.userNameDisplay = data.surname + ' ' + data.name + ' ' + data.patronymic;
                else $localStorage.userNameDisplay = data.surname + ' ' + data.name;
                $localStorage.name = data.name;
                $localStorage.surname = data.surname;
                $localStorage.isContractor = data.isContractor;
                $localStorage.userPhone = data.phone;
                $localStorage.emailAddress = data.emailAddress;
                $localStorage.userId = data.id;
                $localStorage.isAwaitingForJoin = data.isAwaitingForJoin;
                $localStorage.isProdMode = data.isProductionMode;
                $localStorage.userTenantId = data.tenantId;
                $localStorage.username = data.userName;
                $localStorage.usernameEN = data.nameEN;
                $localStorage.userPhone = data.phone;
                $localStorage.submittedDivisionsCount = data.submittedDivisionsCount;
                var roles = data.roles;
                $localStorage.isAdmin = roles.indexOf('Admin') > -1;
                $localStorage.isCustomer = roles.indexOf('Customer') > -1;
                $localStorage.isPreCustomer = roles.indexOf('PreCustomer') > -1;
                $localStorage.isSubscriber = roles.indexOf('Subscriber') > -1;
                $localStorage.isPreSubscriber = roles.indexOf('PreSubscriber') > -1;
                $localStorage.isOperator = roles.indexOf('Operator') > -1;
                $localStorage.isAccountant = roles.indexOf('Accountant') > -1;
                $localStorage.isChiefAccountant = roles.indexOf('ChiefAccountant') > -1;

                $sessionStorage.tenantId = data.tenantId;
                $sessionStorage.username = data.userName;
                
                $localStorage._isCustomer = data.isCustomer;

                $localStorage.netPromoterScore = data.netPromoterScore;

                return data;
            });
            return getUser;
        };    

        this.hasUserAndOrganization = function() {
            return abp.session.userId && abp.session.tenantId;
        }
    }
]);

;
angular.module('app').service('createTenderDialogueService',
    ['tenderFormService',
     '$q',
        'tenderHelperService',
        'abp.services.etender.tender',
        'addFeaturesService',
        '$location',
     function (
         tenderFormService,
         $q,
         tenderHelperService,
         tenderAppService,
         addFeaturesService,
         $location) {
        return new function () {

            this.submit = function (scope, isNotExport, setPendingApprovalStatusForTenderCorporation) {
                abp.ui.setBusy(".panel-default:first");
                var createAddressPromises = [];
                var model = scope.createTenderModel;

                if (!model.isMultilots) {
                    model.lots[0].isFake = true;
                    model.lots = model.lots.splice(0, 1);
                }

                if (isNotExport) model.templateType = 'tenderDraft';
                model.notExport = isNotExport;
                if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;

                for (var k = 0; k < model.lots.length; k += 1) {
                    var lot = model.lots[k];

                    for (var j = 0; j < lot.items.length; j++) {
                        var curItem = lot.items[j];

                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                        for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }

                        if (typeof curItem.deliveryLocation != 'undefined'
                            && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                            delete curItem.deliveryLocation;
                        }

                        if (curItem.deliveryAddress.region != null) {
                            tenderFormService.createAddressInput(curItem, createAddressPromises);
                        }
                    }
                }

                // create Tender Finally
                tenderFormService.createTenderFinally(scope, createAddressPromises);
            }

            this.isAllDataGood = function (scope, model) {
                if (!checkTenderPeriod(scope)) return false;

                if (model.lots.length === 0) {
                    return false;
                }

                if (model.features.length > 0) {
                    for (var f = 0; f < model.features.length; f += 1) {
                        if (!checkFeature(model.features[f])) return false;
                    }
                }

                for (var i = 0; i < model.lots.length; i += 1) {
                    var lot = model.lots[i];

                    // check minimalStep
                    var amount = parseFloat(lot.value.amount);
                    var step = parseFloat(lot.minimalStep.amount);
                    if (step > amount) {
                        return false;
                    }

                    if (lot.features.length > 0) {
                        for (var fl = 0; fl < lot.features.length; fl += 1) {
                            if (!checkFeature(lot.features[fl])) return false;
                        }
                    }

                    if (lot.items.length === 0) {
                        return false;
                    }

                    for (var j = 0; j < lot.items.length; j += 1) {
                        var item = lot.items[j];

                        if (item.features.length > 0) {
                            for (var fi = 0; fi < item.features.length; fi += 1) {
                                if (!checkFeature(item.features[fi])) return false;
                            }
                        }

                        if (!item.classification.id) {
                            return false;
                        }

                        if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                            return false;

                        if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                    }
                }

                if (!checkFeatureSum(model)) return false;
                if (!checkMilestonesPercentageSumm(model)) return false;

                return true;
            }

            function checkFeature(feature) {
                return addFeaturesService.checkFeatureCreateUpdate(feature);
            }
            function checkMilestonesPercentageSumm(model) {
                return tenderFormService.checkMilestonesPercentageSumm(model);
            }
            function checkFeatureSum(model) {
                var sum = 99;
                return addFeaturesService.checkFeatureSumCreateUpdate(model, sum);
            }


            function checkTenderPeriod(scope) {
                var startDate = new Date();
                var endDate = new Date(scope.createTenderModel.tenderPeriod.endDate);

                var st = startDate.getTime();
                var et = endDate.getTime();

                var diff = (et - st) / (1000 * 3600 * 24);

                // для тестовых закупок валидация отключена
                if (!scope.ng_localStorage.isProdMode && (diff > 0))
                    return true;
                if (diff >= 30) return true;

                return false;
            }

            };
        }]);;
angular.module('app').
    service('tenderFormAboveService', [
        'addFeaturesService',
        'tenderFormMinStepService',
        function (
            addFeaturesService,
            tenderFormMinStepService) {
        return new function () {

            this.getTenderModel = function (method) {
                return {
                    description: null,
                    features: [],
                    procurementMethod: 'open',
                    procurementMethodType: method,
                    tenderPeriod: {
                        startDate: null,
                        endDate: null
                    },
                    title: null,
                    lots: []
                }
            }
            
            this.isAllDataGood = function (model) {
                if (!model.lots || model.lots.length === 0) {
                    return false;
                }
                if (model.features && model.features.length > 0) {
                    for (var f = 0; f < model.features.length; f += 1) {
                        if (!checkFeature(model.features[f])) return false;
                    }
                }
                return true;
            }

            this.isAllDataGoodInLot = function (model, lot) {
                if (!lot || !tenderFormMinStepService.isStepValidWithThresholds(lot)) {
                    if (model.procurementMethodType !== 'priceQuotation') {
                        return false;
                    } 
                }

                if (lot.features.length > 0) {
                    for (var fl = 0; fl < lot.features.length; fl += 1) {
                        if (!checkFeature(lot.features[fl])) return false;
                    }
                }

                if (lot.items.length === 0) {
                    return false;
                }
                return true;
            }

            this.isAllDataGoodinItem = function(item) {
                if (item.features.length > 0) {
                    for (var fi = 0; fi < item.features.length; fi += 1) {
                        if (!checkFeature(item.features[fi])) return false;
                    }
                }

                if (item.classification && !item.classification.id) {
                    return false;
                }

                return true;
            }

            function checkFeature(feature) {
                return addFeaturesService.checkFeatureCreateUpdate(feature);
            }

            
        };
    }]);;
angular.module('app').
    service('tenderFormBelowThresholdService',
    [
        'addFeaturesService',
        'tenderFormMinStepService',
        'DEFAULT_ACCELERATOR_VALUE',
        function (
            addFeaturesService,
            tenderFormMinStepService,
            DEFAULT_ACCELERATOR_VALUE)
        {
        return new function () {

            this.setTenderData = function(scope, data) {
                console.log(data);
                scope.createTenderModel = data;
                scope.createTenderModel.currency = data.lots[0].value.currency;
                scope.createTenderModel.isMultilots = !data.lots[0].isFake;
                scope.createTenderModel.userId = abp.session.userId;
                scope.createTenderModel.accelerator = {
                    procurementMethodDetails: DEFAULT_ACCELERATOR_VALUE
                }
            }

            this.isAllDataGood = function (model) {
                if (!model.tenderPeriod || (model.tenderPeriod.startDate < model.enquiryPeriod.endDate) ||
                    (model.tenderPeriod.endDate < model.tenderPeriod.startDate)) {
                    return false;
                }

                if (model.lots.length === 0) {
                    return false;
                }

                if (model.features.length > 0) {
                    for (var f = 0; f < model.features.length; f += 1) {
                        if (!checkFeature(model.features[f])) return false;
                    }
                }
                return true;
            }

            this.isAllDataGoodInLot = function (model, lot) {
                if (!lot || !tenderFormMinStepService.isStepValidWithThresholds(lot)) {
                    return false;
                }

                if (lot.features.length > 0) {
                    for (var fl = 0; fl < lot.features.length; fl += 1) {
                        if (!checkFeature(lot.features[fl])) return false;
                    }
                }

                if (lot.items.length === 0) {
                    return false;
                }

                if (lot.hasGuarantee && lot.hasGuarantee !== '0' && (lot.guarantee == null || lot.guarantee.amount === 0)) return false;

                return true;
            };

            this.isAllDataGoodinItem = function (item) {
                if (item.features.length > 0) {
                    for (var fi = 0; fi < item.features.length; fi += 1) {
                        if (!checkFeature(item.features[fi])) return false;
                    }
                }

                if (!item.classification.id) {
                    return false;
                }

                return true;
            };

            function checkFeature(feature) {
                return addFeaturesService.checkFeatureCreateUpdate(feature);
            }

        };
    }]);;
angular.module('app').service('tenderFormEscoService',
    ['tenderHelperService', function (tenderHelperService) {
        return new function () {

            this.isAllDataGoodInLot = function (lot, scope) {
                if (lot.features.length > 0) {
                    for (var fl = 0; fl < lot.features.length; fl += 1) {
                        if (!scope.checkFeature(lot.features[fl])) return false;
                    }
                }
                if (lot.items.length === 0) {
                    return false;
                }
                return true;
            }

            };
        }]);;
angular.module('app').service('tenderFormFrameworkService',
    ['tenderHelperService', function (tenderHelperService) {
        return new function () {

            this.getTendetObj = function () {
                return {
                    description: null,
                    features: [],
                    procurementMethod: 'open',
                    procurementMethodType: 'closeFrameworkAgreementUA',
                    tenderPeriod: {
                        startDate: null,
                        endDate: null
                    },
                    title: null,
                    lots: [],
                    agreementDuration: null
                };
            }

        };
    }]);;
angular.module('app').service('tenderFormLimitedService',
    ['tenderHelperService', function (tenderHelperService) {
        return new function () {

            this.isAllDataGoodInItem = function (item, model) {
                if (!item.classification.id) {
                    return false;
                }
                if (tenderHelperService.isBefore2017(model.creationTime)) {
                    for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                        if (!item.additionalClassifications[a].id) {
                            return false;
                        }
                    }
                }
                if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                return true;
            }

            };
        }]);;
angular.module('app').
    service('tenderFormMinStepService', [
        function () {
            return new function () {

                this.changeMinimalStep = function (lot) {
                    if (!lot.minimalStep.amountPer) return;
                    var lva = isNaN(lot.value.amount) ? 0 : lot.value.amount;
                    lot.minimalStep.amount = (lva * lot.minimalStep.amountPer / 100);
                    if (lot.minimalStep.amount) {
                        lot.minimalStep.amount = this.cutAmountOnBottomThreshold(lot.minimalStep.amount);
                    }
                }

                this.changeMinimalStepPer = function (lot) {
                    if (!lot.minimalStep.amount) {
                        lot.minimalStep.amountPer = "";
                        return;
                    }
                    if (lot.minimalStep.amount && !isNaN(lot.value.amount) && lot.value.amount > 0) {
                        lot.minimalStep.amountPer = (lot.minimalStep.amount * 100 / lot.value.amount);
                        lot.minimalStep.amountPer = this.cutAmountOnBottomThreshold(lot.minimalStep.amountPer);
                    }
                }

                this.changeMinimalStepPer2 = function (lot) {
                    if (!lot.minimalStep.amount) return;
                    lot.minimalStep.amountPer = (lot.minimalStep.amount * 100 / lot.value.amount);
                }

                this.isStepValidWithThresholds = function (lot) {
                    var isValid = false;
                    if (typeof lot.minimalStep.amount === "string") {
                        lot.minimalStep.amount = Number(lot.minimalStep.amount);
                    }
                    if (typeof lot.minimalStep.amount === "string") {
                        lot.minimalStep.amountPer = Number(lot.minimalStep.amountPer);
                    }
                    if (lot.minimalStep.amount && lot.value.amount) {
                        var step = parseFloat(lot.minimalStep.amount);
                        if (step >= this.cutAmountOnBottomThreshold(lot.value.amount / 100 * 0.5) &&
                            step <= this.cutAmountOnTopThreshold(lot.value.amount / 100 * 3)) {
                            if (step != 0) {
                                isValid = true;
                            }
                        } else return false;
                    };
                    return isValid;
                }

                this.cutAmountOnBottomThreshold = function (amount) {
                    amount = amount.toString();
                    var dotIndex = amount.indexOf('.');
                    return dotIndex !== -1 ? Number(amount.slice(0, dotIndex + 3)) : Number(amount);
                }

                this.cutAmountOnTopThreshold = function (amount) {
                    amount = (amount + 0.01).toString();
                    var dotIndex = amount.indexOf('.');
                    return dotIndex !== -1 ? Number(amount.slice(0, dotIndex + 3)) : Number(amount);
                }
            };
    }]);;
angular.module('app').
    service('tenderFormService',
    [
        '$stateParams',
        'abp.services.etender.tender',
        '$q',
        '$rootScope',
        'tenderHelperService',
        'goToTenderService',
        'tenderFormMinStepService',
        'abp.services.etender.getTender',
        function (
            $stateParams,
            tender,
            $q,
            $rootScope,
            tenderHelperService,
            goToTenderService,
            tenderFormMinStepService,
            getTenderAppService) {
            return new function () {

                this.getTender = function (scope, tenderItem) {
                    if (!tenderItem)
                        tenderItem = {
                            id: $stateParams.tId,
                            display: true,
                            seoUrl: $stateParams.seoUrl
                        };
                    scope.createTenderModel = {};
                    abp.ui.setBusy();
                    getTenderAppService.getTender(tenderItem)
                        .then(function (response) {
                            var data = response.data;
                            scope.getTenderThen(data);
                        });
                }

                this.addLot = function (data) {
                    data.lots.push({
                        auctionPeriod: {
                            startDate: null,
                            endDate: null
                        },
                        awardPeriod: {
                            startDate: null,
                            endDate: null
                        },
                        items: [],
                        minimalStep: {
                            amount: '',
                            valueAddedTaxIncluded: data.value.valueAddedTaxIncluded
                        },
                        value: {
                            amount: '',
                            valueAddedTaxIncluded: data.value.valueAddedTaxIncluded
                        },
                        features: [],
                        hasGuarantee: '0'
                    });
                };

                this.addLotItem = function (lot) {
                    lot.items.push({
                        additionalClassificationInn: null,
                        additionalClassificationAtc: null,
                        additionalClassifications: [
                            {
                                code: '',
                                description: ''
                            }],
                        classification: {},
                        deliveryDate: {
                            startDate: null,
                            endDate: null
                        },
                        description: null,
                        features: [],
                        quantity: null
                    });
                }
                this.cloneLotItem = function (lot, item) {
                    var itemClone = angular.copy(item);
                    itemClone.id = null;
                    lot.items.push(itemClone);
                }

                this.addItemAdditionalClassification = function (item) {
                    item.additionalClassifications.push({
                        code: '',
                        description: ''
                    });
                }

                this.removeLot = function (ind, data) {
                    data.lots.splice(ind, 1);
                }

                this.removeLotItem = function (lot, ind) {
                    lot.items.splice(ind, 1);
                }

                this.addLotAndItem = function (data) {
                    this.addLot(data);
                    var lot = data.lots[data.lots.length - 1];
                    this.addLotItem(lot);
                }

                this.changeGuarantee = function (o) {
                    if (o.hasGuarantee == '0') {
                        o.guarantee = null;
                    }
                }

                this.removeItemAdditionalClassification = function (item, ind) {
                    item.additionalClassifications.splice(ind, 1);
                }

                this.addContactPoint = function (vm, data) {
                    var l = vm.languages[0];
                    if (!data.contactPoints) {
                        data.contactPoints = [];
                    }

                    data.contactPoints.push({
                        language: l.code,
                        sLang: l
                    });
                }

                this.removeContactPoint = function (ind, data) {
                    data.contactPoints.splice(ind, 1);
                }
                
                this.createAddressInput = function (curItem, createAddressPromises) {
                    // var createAddressInput = curItem.deliveryAddress;
                    // debugger;
                    // (function (it) {
                    //     createAddressPromises.push(
                    //         address.getOrCreateAddress(createAddressInput)
                    //             .then(function (response) {
                    //                 it.deliveryAddressId = response.data.address.id;
                    //                 //console.log(response.data);
                    //             }).catch(function (error) {
                    //                 console.log("rejected with", error);
                    //             })
                    //     );
                    // }(curItem));
                }

                this.goBackToTender = function () {
                    $('#SignModal').modal('hide');
                    parent.history.back();
                }

                this.isAllDataGood = function (model, scope) {
                    if (model.lots.length === 0) {
                        return false;
                    }
                    if (model.features.length > 0) {
                        for (var f = 0; f < model.features.length; f += 1) {
                            if (!scope.checkFeature(model.features[f])) return false;
                        }
                    }
                    return true;
                }

                this.isAllDataGoodInLot = function (lot, scope) {
                    if (!lot || !tenderFormMinStepService.isStepValidWithThresholds(lot)) {
                        return false;
                    }

                    if (lot.features.length > 0) {
                        for (var fl = 0; fl < lot.features.length; fl += 1) {
                            if (!scope.checkFeature(lot.features[fl])) return false;
                        }
                    }

                    if (lot.items.length === 0) {
                        return false;
                    }
                    return true;
                }

                this.isAllDataGoodinItem = function (item, scope) {
                    if (item.features.length > 0) {
                        for (var fi = 0; fi < item.features.length; fi += 1) {
                            if (!scope.checkFeature(item.features[fi])) return false;
                        }
                    }

                    if (!item.classification.id) {
                        return false;
                    }

                    return true;
                }

                this.createTenderFinally = function (scope, createAddressPromises) {

                    if (createAddressPromises.length > 0) {
                        $q.all(createAddressPromises)
                            .then(function () {
                                return createTenderFinally();
                            });
                    } else {
                        return createTenderFinally();
                    }

                    function createTenderFinally() {
                        var data = tenderHelperService.setAdditionalClassifications(scope.createTenderModel);
                        tenderHelperService.addAdditionalInfo(data);

                        for (var dataLot = 0; dataLot < data.lots.length; dataLot++) {
                            for (var dataItem = 0; dataItem < data.lots[dataLot].items.length; dataItem++) {
                                if (data.lots[dataLot].items[dataItem].unitPrice) {
                                    delete data.lots[dataLot].items[dataItem].unitPrice;
                                }
                            }
                        }

                        data.lots.forEach(function (lot) {
                            lot.items.forEach(function (item) {
                                if (item.deliveryAddress.city &&
                                    (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                                    item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                                    item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                        delete item.deliveryAddress.city;
                                }
                            });
                        });

                        tender.createTenderProzorro(data)
                            .then(function (response) {
                                if ((response.data.isNeedCreateECriteriaArticle17 || data.awardCriteria === 'lifeCycleCost')
                                    && !response.data.notExport) {
                                    goToTenderService.criteriaRedirect(response.data.id);
                                } else if (response.data.notExport) {
                                    goToTenderService.redirect(response.data, response.data.id);
                                } else {
                                    goToTenderService.documentsRedirect(response.data.id);
                                }
                                abp.ui.clearBusy(".panel-default:first");
                            }, function (err) {
                                console.log(err.data);
                                abp.ui.clearBusy(".panel-default:first");
                            });
                    }
                }

                this.updateTenderModelWithOrganization = function ($scope, param) {
                    var model = ($scope.updateTenderModel != null && $scope.updateTenderModel.isEdit) ? $scope.updateTenderModel : $scope.createTenderModel;
                    model.organization = {
                        contactPoint: {
                            name: param.name,
                            email: param.email,
                            telephone: param.phone,
                            faxNumber: param.fax,
                            url: param.url
                        }
                    }
                }

                this.updateTenderFinally = function (scope, model, createAddressPromises) {

                    if (createAddressPromises && createAddressPromises.length > 0) {
                        $q.all(createAddressPromises).then(function () {
                            return updateTenderFinally();
                        });

                    } else {
                        return updateTenderFinally();
                    }

                    function updateTenderFinally() {
                        var procurementMethodTypesWithoutCriteias = [ 'limited', 'belowThreshold', 'simple', 'priceQuotation' ];
                        var data = tenderHelperService.setAdditionalClassifications(model);
                        var needToSignDraft = isNeedTosSignDraftTender(data, procurementMethodTypesWithoutCriteias);
                        var isTenderInDraftState = !data.status || data.status === 'draft';
                        var procurementMethod = data.procurementMethodType;

                        data.lots.forEach(function (lot) {
                            lot.items.forEach(function (item) {
                                if (item.deliveryAddress.city &&
                                    (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                                    item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                                    item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                        delete item.deliveryAddress.city;
                                }
                            });
                        });

                        tender.updateTenderProzorro(data)
                            .then(function (response) {
                                abp.notify.success("Закупівлю змінено!");
                                scope.dataToRedirect = response.data;
                                if (scope.skipSign || scope.dataToRedirect.notExport || (!needToSignDraft && isTenderInDraftState)) {
                                    var needToRedirectToCreateCriteria = (procurementMethod === 'belowThreshold' || procurementMethod === 'simple.defense') && !scope.dataToRedirect.status;
                                    if (needToRedirectToCreateCriteria) {
                                        goToTenderService.criteriaRedirect(scope.dataToRedirect.id);
                                    } else {
                                        goToTenderService.redirect(scope.dataToRedirect, scope.dataToRedirect.id)
                                    }
                                } else {
                                    $rootScope.$broadcast('needToSignTender');
                                }
                            },
                                function (err, response) {
                                console.log(arguments);
                            }).then(function () {

                            });
                    }
                }

                this.checkMilestonesPercentageSumm = function (model) {

                    function checkInObj(data) {
                        if (!data || !data.milestones || data.milestones.length === 0) return true;
                        var summ = 0;
                        var i = 0;
                        var len = data.milestones.length;
                        for (i; i < len; i++) {
                            if (data.milestones[i].percentage === 0) return false;
                            var parsedValue = parseInt(data.milestones[i].percentage)
                            summ += parsedValue;
                        }
                        return summ === 100;
                    }

                    var i = 0;
                    var len = model && model.lots && model.lots.length ? model.lots.length : 0;
                    for (i; i < len; i++) {
                        if (!checkInObj(model.lots[i])) return false; 
                    }
                    if (!checkInObj(model) && !model.isMultilots) return false;

                    return true;
                }

                this.openTree = function (items) {
                    var i = 0;
                    var len = items.length;
                    for (i; i < len; i++) {
                        items[i].showInCode = true;
                        items[i].showInDom = true;
                    }
                }

                function isNeedTosSignDraftTender (data, listOfTypes) {
                    if (data.procurementMethodType === 'belowThreshold') {
                        return data.isSimpleProcurementMethodRationale;
                    } else {
                        return listOfTypes.indexOf(data.procurementMethodType) !== -1
                            || listOfTypes.indexOf(data.procurementMethod) !== -1;
                    }
                }

            };
        }]);
;
angular.module('app').service('updateTenderDialogueService',
    ['tenderFormService',
        '$q',
        '$rootScope',
        'tenderHelperService',
        'abp.services.etender.tender',
        'addFeaturesService',
        '$location',
        'datesHelperService',
        'goToTenderService',
        '$stateParams',
        'tenderValidationService',
     function (
         tenderFormService,
         $q,
         $rootScope,
         tenderHelperService,
         tenderAppService,
         addFeaturesService,
         $location,
         datesHelperService,
         goToTenderService,
         $stateParams,
         tenderValidationService) {
         return new function () {

             this.getTenderModel = function (procMethodType) {
                 return {
                     description: null,
                     features: [],
                     procurementMethod: 'open',
                     procurementMethodType: procMethodType,
                     tenderPeriod: {
                         startDate: null,
                         endDate: null
                     },
                     title: null,
                     lots: []
                 };
             }

             this.getTenderThen = function (data, scope) {
                 // TODO: hack for submit tender from draft from 'ET-21638'
                 data.isEdit = true;
                 if (!data.isEdit) {
                     abp.notify.error('Ви не можете редагувати цей тендер');
                     $location.path('/');
                     return;
                 }
                 //console.log(data);
                scope.updateTenderModel = data;
                scope.updateTenderModel.currency = data.lots[0].value.currency;
                scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
                scope.updateTenderModel.valueAddedTaxIncluded = data.lots[0].value.valueAddedTaxIncluded;
                scope.updateTenderModel.lots.forEach(function (l) {
                     l.hasGuarantee = '0';
                     if (l.guarantee && l.guarantee.amount > 0) {
                         l.hasGuarantee = '1';
                     }
                     tenderHelperService.addEmptyDk(l);
                     if (l.minimalStep.amount && l.value.amount) {
                         l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                     }
                 });
                 tenderHelperService.setDefaultItems(data);
                 abp.ui.clearBusy();
             }

             this.submit = function (scope, isNotExport, setPendingApprovalStatusForTenderCorporation) {
                var createAddressPromises = [];
                var model = angular.copy(scope.updateTenderModel);

                 model.notExport = isNotExport;
                 model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
                for (var k = 0; k < model.lots.length; k += 1) {
                    var lot = model.lots[k];

                    for (var j = 0; j < lot.items.length; j += 1) {
                        var curItem = lot.items[j];


                        if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                            curItem.classification.id = curItem.classification.code;
                            curItem.classification.description = curItem.classification.description;
                        }

                        for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                            if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                                curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                                curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                            }
                        }

                        if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                            delete curItem.deliveryLocation;
                        }

                        if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                            tenderFormService.createAddressInput(curItem, createAddressPromises);
                        }
                    }
                }

                if (createAddressPromises.length > 0) {
                    $q.all(createAddressPromises).then(function () {
                        return updateTenderFinally(model, scope);
                    });

                } else {
                    return updateTenderFinally(model, scope);
                }

                function updateTenderFinally(updateTenderModel, scope) {
                    var data = tenderHelperService.setAdditionalClassifications(updateTenderModel);
                    tenderAppService.updateTender(data)
                        .then(function (response) {
                            abp.notify.success('Закупівлю створено!');
                            scope.dataToRedirect = response.data;
                            if (scope.dataToRedirect.notExport || scope.skipSign || ((!data.status || data.status === 'draft') && !scope.dataToRedirect.notExport)) {
                                goToTenderService.redirect(scope.dataToRedirect, scope.dataToRedirect.id);
                            } else {
                                $rootScope.$broadcast('needToSignTender');
                            }

                        }, function (err, response) {
                            console.log(arguments);
                        }).then(function () { });
                }
            }

            this.isAllDataGood = function (scope, model) {
                if (!tenderValidationService.checkTenderDialoguePeriodForUpdate(scope.updateTenderModel.tenderPeriod.endDate, scope.updateTenderModel.creationTime)
                    || !tenderFormService.isAllDataGood(model, scope)) return false;

                for (var i = 0; i < model.lots.length; i += 1) {
                    var lot = model.lots[i];

                    if (!tenderFormService.isAllDataGoodInLot(lot, scope)) return false;

                    if (lot.guarantee == null && lot.hasGuarantee && lot.hasGuarantee !== '0') return false;

                    for (var j = 0; j < lot.items.length; j += 1) {
                        var item = lot.items[j];

                        if (!tenderFormService.isAllDataGoodinItem(item, scope)) return false;


                        if (tenderHelperService.isBefore2017(model.creationTime)) {
                            for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                                if (!item.additionalClassifications[a].id) {
                                    return false;
                                }
                            }
                        }

                        if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                            return false;

                        if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                    }
                }

                 if (!checkFeatureSum(model)) return false;
                 if (!checkMilestonesPercentageSumm(model)) return false;

                 return true;
             };

             function checkMilestonesPercentageSumm(model) {
                 return tenderFormService.checkMilestonesPercentageSumm(model);
             }


            //#region internal
            function checkFeatureSum(model) {
                var sum = 99;
                return addFeaturesService.checkFeatureSumCreateUpdate(model, sum);
            }
             //#endregion

            };
        }]);
;
(function () {
    var controllerId = 'aboutCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$http', function ($scope, $http) {
           $http.get('~/App/Main/base/data/about.txt')
                .then(function (reponse) {
                    $scope.text = reponse.data;
                },
                function () { $scope.text = "Файл не знайдено"; });
        }
    ]);
})();;
(function () {
    var controllerId = "amkuController";
    angular.module("app")
        .controller(controllerId, [
            "$scope", "abp.services.etender.amku", "$localStorage", '$http',
            function ($scope, amku, $localStorage, $http) {
                $scope.ng_localStorage = $localStorage;



                // 1 and 2 Users And Billings
                $scope.loadBidders = function () {
                    var amkuTenderInput = { TenderId: $scope.tenderId };
                    amku.getTenderBidders(amkuTenderInput).then(function (response) {
                        $scope.headerUsersInfoItemsResulta = response.data.items;
                    }, function (error) {
                        console.log(error);
                        abp.ui.clearBusy(".panel-default");
                    });

                };

                $scope.loadLogs = function () {
                    var amkuTenderInput = { TenderId: $scope.tenderId };
                    abp.ui.setBusy("#amkuDiv");
                    amku.getAmkuExcel(amkuTenderInput).then(function (fileName) {
                        $http({
                            url: "api/files/DownloadAndDelete",
                            method: "POST",
                            params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                            responseType: 'arraybuffer'
                        })
                            .then(function (response) {
                                var file = new Blob([response.data], { type: 'application/octet-stream' });
                                saveAs(file, fileName.data);
                                abp.ui.clearBusy("#amkuDiv");
                            }, function (data, status, headers, config) {
                                abp.ui.clearBusy("#amkuDiv");
                            });
                    }, function () {
                        abp.ui.clearBusy("#amkuDiv");
                    });

                };
            }
        ]);
})();;
(function () {
    'use strict';
    angular.module('app').controller('analyticsCtrl',
        [
            '$scope',
            '$window',
            '$rootScope',
            '$location',
            function (
                $scope,
                $window,
                $rootScope,
                $location
            ) {

                $scope.showMenuBlocks = function () {
                    if ($window.innerWidth < 425) {
                        return true;
                    }
                    else if (document.querySelector('.mob_top.content')) {
                        return true;
                    }
                    return false;
                }

                $scope.navigation = [
                    {
                        title: $rootScope.source('OrderReport'),
                        type: 'createReport',
                        active: false,
                        show: true,
                        openFunc: function () {
                            $location.hash('createReport');
                            $scope.openTabByUrl();
                        },
                    },
                    {
                        title: $rootScope.source('MyReports'),
                        type: 'reports',
                        active: ($window.location.hash === '') || ($window.location.hash.indexOf('reports') !== -1),
                        show: true,
                        openFunc: function () {
                            $rootScope.$broadcast('switchAnalyticsTab');
                            $location.hash('reports');
                            $scope.openTabByUrl();
                        },
                    }
                ];

                $scope.setNavigation = function (tab) {
                    $scope.switchedBlock = tab;
                    $scope.navigation.forEach(function (item, i, arr) {
                        item.active = item.type === tab;
                    });
                }

                $scope.openTabByUrl = function () {
                    if ($location.hash() === 'reports') {
                        $scope.setNavigation('reports');
                    }
                    if ($location.hash() === 'createReport') {
                        $scope.setNavigation('createReport');
                    }
                    if ($location.hash() === '') {
                        $location.hash('createReport');
                        $scope.setNavigation('createReport');
                    }
                }

                $scope.openTabByUrl();

            }]);
})()
;
(function () {
    'use strict';
    angular.module('app').controller('createReportCtrl',
        [
            '$scope',
            'classificationSearchService',
            'abp.services.etender.analytics',
            '$rootScope',
            'abp.services.etender.reference',
            'datesHelperService',
            '$localStorage',
            function (
                $scope,
                classificationSearchService,
                analyticsService,
                $rootScope,
                abpReferenceService,
                datesHelperService,
                $localStorage
            ) {

                $scope.typeOfReport = '';
                $scope.validDatesAuctionInterval = false;
                $scope.validDatesAuctionBeforStartDate = false;
                $scope.minDateAuction = -Infinity;

                $scope.avaliableReportTypes = [
                    {
                        title: $rootScope.source('ParticipantInCommercial'),
                        type: 'commercial',
                        needPermissions: true
                    },
                    {
                        title: $rootScope.source('MonitoringSuppliersAndCompetitors'),
                        type: 'monitoring',
                        needPermissions: true
                    },
                    {
                        title: $rootScope.source('ActiveTenders'),
                        type: 'new_tender',
                        needPermissions: true
                    },
                    {
                        title: $rootScope.source('MyTendersAnalyse'),
                        type: 'client_bid',
                        needPermissions: true
                    },
                    {
                        title: $rootScope.source('TendersWithoutMe'),
                        type: 'client_not_bid',
                        needPermissions: true
                    }
                ]; 

                $scope.hideFieldsAndValues = function (type) {
                    return !(type == 'new_tender' || type == 'client_bid' || type == 'client_not_bid');
                }

                $scope.selectedCpvs = [];
                $scope.choosedParentCpvs = [];
                $scope.selectedKeyWords = [];
                $scope.selectedCustomerNames = [];

                $scope.formData = {
                    classification: [],
                    keywords: '',
                    startDate: '',
                    endDate: '',
                    auctionPeriodStart: '',
                    auctionPeriodEnd: ''
                };

                $scope.$watch('typeOfReport', function (data) {
                    if (data.type == 'monitoring') {
                        $scope.formData.edrpouCode = '';
                        $scope.formData.searchTitlesIsAnd = false;
                    } else {
                        delete $scope.formData.edrpouCode;
                        delete $scope.formData.searchTitlesIsAnd;
                    }
                });

                $scope.isReportTypeAvaliable = function (reportType) {
                    if (reportType.needPermissions == false) {
                        return true;
                    } else if (reportType.type == "commercial" && abp.auth.grantedPermissions.ParticipantsForCommercialReport) {
                        return true;
                    } else if (reportType.type == "monitoring" && abp.auth.grantedPermissions.MonitoringSuppliersAndCompetitorsReport) {
                        return true;
                    } else if (!$scope.hideFieldsAndValues(reportType.type) && $localStorage.isContractor) {
                        return true;
                    } else {
                        return false;
                    }
                }

                $scope.$watch(function () {
                    return datesHelperService.validDateFromAndTo($scope.formData.startDate, $scope.formData.endDate);
                }, function (data) {
                    $scope.invalidDatesInterval = data;
                })

                $scope.$watch(function () {
                    return datesHelperService.validDateFromAndTo($scope.formData.auctionPeriodStart, $scope.formData.auctionPeriodEnd);
                }, function (data) {
                    $scope.validDatesAuctionInterval = data;
                })

                $scope.$watchGroup(['formData.startDate', 'formData.auctionPeriodStart'], function () {
                    $scope.validDatesAuctionBeforStartDate =
                        datesHelperService.validDateFromAndTo($scope.formData.startDate, $scope.formData.auctionPeriodStart);
                });

                $scope.initClassification = function () {
                    classificationSearchService.initClassification($scope, $scope.choosedParentCpvs);
                }

                $scope.cleareChildCpv = function (cpvs) {
                    classificationSearchService.cleareChildCpv(cpvs, $scope.selectedCpvs);
                };

                $scope.toggleSearchOptionOrAnd = function () {
                    $scope.formData.searchTitlesIsAnd = !$scope.formData.searchTitlesIsAnd;
                }

                $('body').on('hide.bs.modal', '#modalClassifications', function () {
                    $scope.selectedCpvs.splice(0);
                    if ($scope.choosedParentCpvs && $scope.choosedParentCpvs.length > 0) {
                        $scope.choosedParentCpvs.forEach(function (cpv, index) {
                            if (!cpv.hasChildren) {
                                $scope.selectedCpvs.push(cpv);
                                $scope.choosedParentCpvs.splice(index, 1);
                            }
                        });
                        $scope.getChildCpvs();
                    } else {
                        $scope.formData.classification = [];
                    }
                });

                $rootScope.$on('switchAnalyticsTab', function () {
                    $scope.clear();
                });

                $scope.getChildCpvs = function() {
                    abp.ui.setBusy();
                    var itemsWithChildren = [];
                    $scope.choosedParentCpvs.forEach(function (cpvItem) {
                        if (!cpvItem.isOpen && cpvItem.rank < 8 && cpvItem.hasChildren) {
                            itemsWithChildren.push(cpvItem);
                        } else {
                            $scope.selectedCpvs.push(cpvItem);
                        }
                    });
                    var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);
                    classificationData.then(function (response) {
                        if (response.data && response.data.length) {
                            if (!$scope.selectedCpvs.length) {
                                $scope.selectedCpvs = response.data;
                            } else {
                                response.data.forEach(function (item) {
                                    $scope.selectedCpvs.push(item);
                                });
                            }
                        }
                        abp.ui.clearBusy();

                        $scope.formData.classificationIds = $scope.selectedCpvs.map(function (cpv) { return cpv.id; });
                        $scope.formData.classification = $scope.selectedCpvs.map(function (cpv) { return cpv.code; });
                    });
                }

                $scope.sendReport = function () {
                    var whichTypeOfReportIsSelected = null;
                    if ($scope.typeOfReport.type == "commercial") {
                        whichTypeOfReportIsSelected = analyticsService.participantsForCommercial;
                    } else if ($scope.typeOfReport.type == "monitoring") {
                        whichTypeOfReportIsSelected = analyticsService.monitoringSuppliersAndCompetitors;
                    } else if ($scope.typeOfReport.type == "new_tender") {
                        whichTypeOfReportIsSelected = analyticsService.analyticNewTenderReport;
                    } else if ($scope.typeOfReport.type == "client_bid") {
                        whichTypeOfReportIsSelected = analyticsService.analyticClientBid;
                    } else if ($scope.typeOfReport.type == "client_not_bid") {
                        whichTypeOfReportIsSelected = analyticsService.analyticClientNotBid;
                    }

                    abp.ui.setBusy();
                    whichTypeOfReportIsSelected(setReportBodyFields($scope.typeOfReport.type == "monitoring")).then(function () {
                        abp.ui.clearBusy();
                        abp.notify.info('Ми обробляємо Ваш запит. Коли файл буде сформований - він буде доступний на сторінці "Мої звіти"', 'Успіх.');
                    }, function () {
                        abp.ui.clearBusy();
                        abp.notify.error('Помилка');
                    });
                }

                function setReportBodyFields(isMonitoring) {
                    var body = {
                        DateStart: $scope.formData.startDate,
                        DateEnd: $scope.formData.endDate
                    };
                    if ($scope.typeOfReport.type != 'client_bid') {
                        if ($scope.typeOfReport.type == 'commercial' || $scope.typeOfReport.type == 'monitoring') {
                            body.CpvCodes = $scope.formData.classification || [];
                        } else {
                            body.CpvCodes = $scope.formData.classificationIds || [];
                        }
                    }
                    if ($scope.hideFieldsAndValues($scope.typeOfReport.type)) {
                        body.SearchTitles = $scope.selectedKeyWords
                    }
                    if (isMonitoring) {
                        body.SearchTitlesIsAnd = $scope.formData.searchTitlesIsAnd;
                        body.EdrpouCode = $scope.formData.edrpouCode || '';
                        body.CustomerNames = $scope.selectedCustomerNames;
                    }

                    if ($scope.formData.auctionPeriodStart) {
                        body.auctionStartDate = $scope.formData.auctionPeriodStart;
                    }

                    if ($scope.formData.auctionPeriodEnd) {
                        body.auctionEndDate = $scope.formData.auctionPeriodEnd;
                    }

                    return body;
                }

                $scope.addKeyWord = function () {
                    $scope.selectedKeyWords.push($scope.formData.keywords);
                    $scope.formData.keywords = '';
                }

                $scope.removeKeyWord = function (keyword) {
                    $scope.selectedKeyWords.splice($scope.selectedKeyWords.indexOf(keyword), 1);
                }

                $scope.addCustomerName = function () {
                    $scope.selectedCustomerNames.push($scope.formData.customerNames);
                    $scope.formData.customerNames = '';
                }
                $scope.removeCustomerName = function (customerName) {
                    $scope.selectedCustomerNames.splice($scope.selectedCustomerNames.indexOf(customerName), 1);
                }

                $scope.clear = function () {
                    $scope.clearComercialReportData();
                }

                $scope.clearComercialReportData = function () {
                    $scope.formData = {
                        classification: [],
                        keywords: '',
                        startDate: '',
                        endDate: '',
                        auctionPeriodEnd: '',
                        auctionPeriodStart: ''
                    };
                    $scope.selectedCpvs.splice(0);
                    $scope.choosedParentCpvs.splice(0);
                    $scope.selectedKeyWords = [];
                    $rootScope.clearCheckbox();
                }

                $scope.$watch(function () {
                    return $scope.typeOfReport && $scope.typeOfReport.type;
                }, function (type) {
                    if (type) {
                        $scope.datesCorrect = type === 'monitoring' ? false : true;
                    }
                });
                $scope.validateDatesForAuction = function (dateStart, dateEnd) {
                    if ($scope.typeOfReport.type == 'monitoring') {
                        $scope.cannotExceedOneYearDifferenceForAuction = calculateYearDifference(dateStart, dateEnd);
                        if (dateStart && dateEnd) {
                            $scope.datesCorrect = true;
                        } else if ((dateStart && !dateEnd) || (!dateStart && dateEnd)) {
                            $scope.cannotExceedOneYearDifferenceForAuction = true;
                        }
                    }
                }

                $scope.validateDates = function (dateStart, dateEnd) {
                    if ($scope.typeOfReport.type == 'monitoring') {
                        $scope.cannotExceedOneYearDifference = calculateYearDifference(dateStart, dateEnd);
                        if (dateStart && dateEnd) {
                            $scope.datesCorrect = true;
                        } else if ((dateStart && !dateEnd) || (!dateStart && dateEnd)) {
                            $scope.cannotExceedOneYearDifference = true;
                        }
                    }
                }

                function calculateYearDifference (dateStart, dateEnd) {
                    var notValid = false;
                    var startDate = new Date(dateStart);
                    var endDate = new Date(dateEnd);

                    if (startDate && endDate && (!isNaN(startDate) && !isNaN(endDate))) {
                        if ((dateEnd - dateStart) / (1000 * 3600 * 24 * 365) > 1) {
                            notValid = true;
                        } else {
                            notValid = false;
                        }
                    }

                    return notValid
                }

            }]);
})()
;
(function () {
    'use strict';
    angular.module('app').controller('myReportsCtrl',
        [
            '$scope',
            'abp.services.etender.analytics',
            'ngTableParams',
            '$http',
            function (
                $scope,
                analyticsService,
                ngTableParams,
                $http
            ) {

                $scope.tableParams = new ngTableParams({
                    page: 1,
                    count: 50,
                    sorting: {
                        '': 'desc'
                    },

                }, {
                    total: 0,
                    counts: [50],
                    getData: getData
                });

                function getData($defer, params) {
                    abp.ui.setBusy();
                    analyticsService.getUserReports().then(function (response) {
                        $defer.resolve(response.data)
                        abp.ui.clearBusy();
                    })
                }

                $scope.getColorByStatus = function (report) {
                    var colorsMap = {
                        'Done': 'green',
                        'Failed': 'red'
                    };
                    return { 'color': colorsMap[report.reportStatus] };

                }

                $scope.downloadFile = function (report) {
                    abp.ui.setBusy();
                    var url = '/api/UserDocuments/DownloadFile?documentId=' + report.id;
                    $http({
                        method: 'GET',
                        url: url,
                        responseType: 'arraybuffer'
                    }).then(function (response) {
                        abp.ui.clearBusy();
                        var responseType = response.headers('content-type');
                        var fileName = response.headers('content-disposition').split(';')[1].slice(11, -1);
                        var report = new Blob([response.data], { type: responseType });
                        saveAs(report, fileName);
                        $scope.tableParams.reload();
                    }, function (error) {
                        abp.ui.clearBusy();
                    });
                }
            }]);
})();
(function () {
    var controllerId = 'loginNewCtrl';
    angular.module('app')
    .controller(controllerId, [
        '$scope',
        '$http',
        '$rootScope',
        '$location',
        'qa',
        '$localStorage',
        '$sessionStorage',
        'referenceService',
        'abp.services.etender.settings',
        function (
            $scope,
            $http,
            $rootScope,
            $location,
            qa,
            $localStorage,
            $sessionStorage,
            referenceService,
            settings,
        ) {

            abp.ui.clearBusy();
            $scope.curentUrl = $location.$$path;
            $scope.superTokenQuery = null;

            // redirect if Authorized
            if ($localStorage.isAuthorized) {
                $location.path('/');
            };

            if (!$localStorage.isAuthorized)
                $localStorage.siteSettings = {
                    css: 'styleLightShare'
                };

            //ga('send', 'pageview', '/login
            setTimeout(function () {
                dataLayer.push({
                    'event': 'virtualPageView',
                    'virtualPageURL': '/login',
                    'virtualPageTitle': 'login_access'
                });
            }, 0);
            $scope.loginFormData = {
                login: null,
                password: null,
                rememberMe: false,
                showSubmitButton: true,
            };


            var host = document.location.host;

            if (qa == host)
                $scope.isQA = true;
            else
                $scope.isQA = false;
            var count = 0;
            $sessionStorage.countAttempts = 0;
            var totalAttempts = 2;

            //if ($localStorage.isAuthorized)

            var changeAuthState = function (state) {
                $localStorage.isAuthorized = state;

            };

            var loginUser = function (logData) {
                return abp.ajax({
                    url: abp.appPath + "Account/Login",
                    type: 'POST',
                    data: JSON.stringify(logData),
                    beforeSend: abp.ui.setBusy()
                });
            };

            $scope.authorize = function (captchaVersion) {
                if (captchaVersion === 'v3') {
                    if ($scope.superTokenQuery) {
                        $scope.loginUserWithCaptcha3Version($scope.superTokenQuery);
                    } else {
                        var captchaSiteKey = $localStorage.googleReCaptchaSiteKeyV3;
                        grecaptcha.execute(captchaSiteKey, {action: 'Login'}).then(function (token) {
                            $scope.loginUserWithCaptcha3Version(token);
                        });
                    }
                } else {
                    abp.ui.clearBusy('body');
                    var captchaSiteKey = $localStorage.googleReCaptchaSiteKeyV2;
                    grecaptcha.render('recaptcha_v2', { 'sitekey': captchaSiteKey, 'callback': $scope.onCaptchaV2Success});
                }
            };

            $scope.onCaptchaV2Success = function (token) {
                var loginData = {
                    UsernameOrEmailAddress: $scope.loginFormData.login,
                    Password: $scope.loginFormData.password,
                    CaptchaTokenV2: token
                };
                var login = null;

                login = loginUser(loginData);
                login.then(function () {
                    $scope.doActionsAfterSubmit(login, loginData);
                }, function () {

                    $scope.isLoginButtonDisabled = false;
                    abp.ui.clearBusy('body');
                    changeAuthState(false);

                });
            }

            $scope.loginUserWithCaptcha3Version = function (token) {
                var loginData = {
                    UsernameOrEmailAddress: $scope.loginFormData.login,
                    Password: $scope.loginFormData.password,
                    CaptchaTokenV3: token
                };
                var login = null;

                login = loginUser(loginData);
                login.then(function () {
                    $scope.doActionsAfterSubmit(login, loginData);
                }, function (error) {
                    if (error && ((error.responseText && error.responseText.contains('Captcha не валідна'))
                        || (error.message && error.message.contains('Captcha не валідна')))) {
                        $scope.authorize('v2');
                    } else {
                        $scope.isLoginButtonDisabled = false;
                        abp.ui.clearBusy('body');
                        changeAuthState(false);
                    }
                });
            }

            $scope.doActionsAfterSubmit = function (login, loginData) {
                $scope.isLoginButtonDisabled = true;
                var tabId = sessionStorage.tabId;
                var tabsCount = localStorage.tabsCount;
                var siteUrlToRedirect = $localStorage.siteSettings.currentSiteUrl;

                $localStorage.$reset();
                localStorage.clear();
                $sessionStorage.$reset();
                sessionStorage.clear();

                sessionStorage.tabId = tabId;
                localStorage.tabsCount = tabsCount;
                $localStorage.siteSettings = { css: 'styleLightShare' };
                $rootScope.reloadGetScripts();
                $sessionStorage.countAttempts = 0;
                abp.notify.success('Ви успішно увійшли в систему!');
                dataLayer.push({
                    'event': 'virtualPageView',
                    'virtualPageURL': '/thankYouPageLogin',
                    'virtualPageTitle': 'Success_login'
                });
                abp.ui.clearBusy();
                $sessionStorage.username = loginData.UsernameOrEmailAddress;
                $localStorage.username = loginData.UsernameOrEmailAddress;
                changeAuthState(true);
                referenceService.getAllReferences();
                $rootScope.startFunctionWhenLogin();

                return login;
            }

            $scope.submit = function () {
                $scope.isLoginButtonDisabled = true;
                $scope.superTokenQuery = $location.search().superToken;
                if ((!$localStorage.googleReCaptchaSiteKeyV3 || !$localStorage.googleReCaptchaSiteKeyV2) && !$scope.superTokenQuery) {
                    var getSettings = settings.getSetting();
                    getSettings.then(function (response) {
                        $localStorage.googleReCaptchaSiteKeyV3 = response.data.googleReCaptchaSiteKeyV3;
                        $localStorage.googleReCaptchaSiteKeyV2 = response.data.googleReCaptchaSiteKeyV2;
                        $scope.authorize('v3');
                    });
                } else {
                    $scope.authorize('v3');
                }
            };
        }]);
})();
;
(function () {
    var controllerId = 'resetPasswordCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$stateParams', '$http','$state',  function ($scope, $stateParams, $http, $state) {
            $scope.isChangedPassword = false;

            $scope.submit = function () {
                var resetData = {
                    UserId: $stateParams.userId,
                    Password: $scope.password,
                    Code: $stateParams.code
                };
                abp.ui.setBusy();
                var response = $http.post("/Account/ResetPassword", resetData);
                response.then(function (reponse, status, headers, config) {
                    abp.ui.clearBusy();
                    if (!!reponse.data) {
                        $scope.isChangedPassword = true;
                        abp.notify.success('Пароль успішно змінено');
                        $state.go('login');
                    } else {
                        abp.notify.error('Помилка', 'Не вдалося змінити пароль');
                    }
                    ;
                });
            };
        }
    ]);
})();;
(function () {
    var controllerId = 'sendPasswordCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$http', '$rootScope', 'qa', '$location', '$localStorage', 'abp.services.etender.settings',
        function ($scope, $http, $rootScope, qa, $location, $localStorage, settings) {

            $scope.curentUrl = $location.$$path;
            var host = document.location.host;

            if (qa == host) {
                $scope.isQA = true;
            }
            else
                $scope.isQA = false;
            
            
            var forgotPassword = function (emailData) {
                return abp.ajax({
                    url: abp.appPath + "Account/ForgotPassword",
                    type: 'POST',
                    data: JSON.stringify(emailData)
                });
            };
            $scope.submit = function () {
                $scope.isPasswordButtonDisabled = true;
                if (!$localStorage.googleReCaptchaSiteKeyV3 || !$localStorage.googleReCaptchaSiteKeyV2) {
                    var getSettings = settings.getSetting();
                    getSettings.then(function (response) {
                        $localStorage.googleReCaptchaSiteKeyV3 = response.data.googleReCaptchaSiteKeyV3;
                        $localStorage.googleReCaptchaSiteKeyV2 = response.data.googleReCaptchaSiteKeyV2;
                        $scope.sendPassword('v3');
                    });
                } else {
                    $scope.sendPassword('v3');
                }
            };

            $scope.sendPassword = function (captchaVersion) {
                if (captchaVersion === 'v3') {
                    var captchaSiteKey = $localStorage.googleReCaptchaSiteKeyV3;
                    grecaptcha.execute(captchaSiteKey, {action: 'ForgotPassword'}).then(function (token) {
                        var emailData = {
                            Email: $scope.email,
                            captchaTokenV3: token
                        };
                        abp.ui.setBusy();
                        var forgotPass = forgotPassword(emailData);
                        forgotPass.then(function (data) {
                            if (data.res)
                                $scope.isSendMessage = true;
                            abp.ui.clearBusy();
                            $scope.isPasswordButtonDisabled = false;
                        }, function (error) {
                            if (error && ((error.responseText && error.responseText.contains('Captcha не валідна'))
                                || (error.message && error.message.contains('Captcha не валідна')))) {
                                $scope.sendPassword('v2');
                            } else {
                                $scope.isPasswordButtonDisabled = false;
                                abp.ui.clearBusy('body');
                            }
                        });
                    });
                } else {
                    abp.ui.clearBusy('body');
                    var captchaSiteKey = $localStorage.googleReCaptchaSiteKeyV2;
                    grecaptcha.render('recaptcha_v2', { 'sitekey': captchaSiteKey, 'callback': $scope.onCaptchaV2Success});
                }
            }

            $scope.onCaptchaV2Success = function (token) {
                var emailData = {
                    Email: $scope.email,
                    captchaTokenV2: token
                };
                abp.ui.setBusy();
                var forgotPass = forgotPassword(emailData);
                forgotPass.then(function (data) {
                    if (data.res)
                        $scope.isSendMessage = true;
                    abp.ui.clearBusy();
                    $scope.isPasswordButtonDisabled = false;
                }, function () {
                    $scope.isPasswordButtonDisabled = false;
                    abp.ui.clearBusy('body');
                });
            }
        }
    ]);
})();;
(function () {
angular.module('app').controller('userAgreementCtrl', ['$scope', '$http', function ($scope, $http) {

    abp.ui.setBusy(".modal-body");
    $http.get('App/Main/data/userAgreement.txt')
    .success(function (data) {
        $scope.agreementDocument = data;
        abp.ui.clearBusy('.modal-body');
        });

    }]);
})();;
angular.module('app').directive('awardContract', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('awardContract from cache'),
        scope: {
            award: '=',
            tender: '=',
            lot: '='
        },
        controller: ['$scope', '$rootScope', '$localStorage', function ($scope, $rootScope, $localStorage) {

            $scope.amountVisibilityFlags = {};
            $scope.contractingVisibilityFlags = {};
            $scope.documentsToContract = [];
            $scope.isUserLoggedIn = $localStorage.isAuthorized;
            $scope.isSmallScreen = false;
            $scope.localStorage = $localStorage;

            $scope.getContractings = function () {
                $scope.award.contracts.forEach(function (item, i, arr) {
                    item.relatedContracting = $scope.award.contractings.find(function (c) { return c.id === item.id });                  
                });
            };

            $scope.checkIfItemsHaveCountries = function (relatedContracting) {
                if (relatedContracting.items && relatedContracting.items.length) {
                    var hasCountry = false;
                    relatedContracting.items.forEach(function (item) {
                        if (item.additionalClassifications && item.additionalClassifications.length) {
                            item.additionalClassifications.forEach(function (classification) {
                                if (classification.scheme === 'COO') {
                                    hasCountry = true;
                                }
                            });
                        }
                    });
                    return hasCountry;
                } else {
                    return false;
                }
            }

            $scope.getCountryFromItem = function (classifications) {
                return classifications.find(function (classification) {
                    return classification.scheme === 'COO';
                });
            }

            $scope.getContractings();

            $scope.getContractStatusName = function (statusId) {
                var contractStatuses = [
                    "Договір поки що не опубліковано", // pending - Цей договір запропоновано, але він ще не діє. Можливо очікується його підписання
                    $rootScope.source("ContractHasBeenPublished"), //active - Цей договір підписаний всіма учасниками, і зараз діє на законних підставах
                    "Цей договір було скасовано до підписання",
                    "Цей договір був підписаний та діяв, але вже завершився. Це може бути пов’язано з виконанням договору, або з достроковим припиненням через якусь незавершеність",
                    "Невідомо"
                ];

                return contractStatuses[statusId];
            };

            $scope.getContractDocuments = function () {
                var awardContractings = $scope.award.contractings; 
                if (awardContractings && awardContractings.length && awardContractings[0].documents.length) {
                    $scope.documentsToContract = $scope.award.contractings[0].documents;
                } else {
                    $scope.documentsToContract = $scope.award.contracts[0].documents;
                }
            };

            $scope.getContractDocuments();

            $scope.isMyTender = function () {
                return $localStorage.organization ? $scope.tender.organization.identifier.apiId === $localStorage.organization.identifier.apiId : false;
            };

            $scope.checkIfItemsHaveUnitPriceInEntity = function (entity, contract) {
                var hasUnitPrice = false;
                if (entity.items && entity.items.length) {
                    entity.items.forEach(function (item) {
                        if (item.unitPrice) {
                            if (contract) {
                                if (contract.buyerApiId === item.relatedBuyer) {
                                    hasUnitPrice = true;
                                }
                            } else {
                                hasUnitPrice = true;
                            }
                        }
                    });
                }
                return hasUnitPrice;
            };

            function setSmallScreenProperty (sidebarOpened) {
                var sideBarWidth = sidebarOpened ? 260 : 0;
                $scope.isSmallScreen = window.innerWidth < (768 + sideBarWidth);
            };

            window.addEventListener('resize', function () {
                setSmallScreenProperty($scope.isSidebarOpened(angular.element('body').attr('class')));
            });

            $scope.canCancelContractBlockShow = function (contractings, amount, checkMyTender) {
                return amount || amount === 0 ||
                    ($scope.isUserLoggedIn && contractings.length > 0 && (contractings[0].status !== 'terminated' || contractings[0].canEdit) && (checkMyTender ? $scope.isMyTender() : true));
            };

            $scope.$watch(function () { return angular.element('body').attr('class'); }, function (newValue) {
                setSmallScreenProperty($scope.isSidebarOpened(newValue));
            });

            $scope.isSidebarOpened = function (classValue) {
                return classValue.indexOf('open') !== -1;
            };
        }]
    };
}]);
;
(function () {
    var controllerId = 'getAwardsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$location', 'abp.services.etender.profile', 'abp.services.etender.award', '$stateParams',
          function ($scope, $location, profile, award, $stateParams) {


              //var getAwards = award.getAward(tenderItem);
              //getAwards.success(function (data) {
              //    console.log("Переможець:");
              //    console.log(data);
              //    $scope.award = data;
              //});

              //$scope.acceptAward = function (files) {
              //    var acceptAwardModel = {
              //        awardId: $scope.award.id,
              //        tenderId: tenderItem.tenderId
              //    };

              //    add(files).then(function () {
              //        var acceptAward = award.acceptAward(acceptAwardModel);
              //        acceptAward.success(function () {
              //            abp.notify.success("Підтверджено!");
              //            $localStorage.getAwards = true;
              //             goToTenderService.redirect(tenderItem, tenderItem.tenderId)
              //        });
              //        return acceptAward;
              //    });
              //};

              //$scope.disqualifyAward = function (files) {
              //    var disqualifyAwardModel = {
              //        awardId: $scope.award.id,
              //        tenderId: tenderItem.tenderId
              //    };

              //    add(files).then(function () {
              //        var disqualifyAward = award.disqualifyAward(disqualifyAwardModel);
              //        disqualifyAward.success(function () {
              //            abp.notify.success("Відмінено!");
              //            $localStorage.getAwards = true;
              //            goToTenderService.redirect(tenderItem, tenderItem.tenderId);
              //        });

              //        return disqualifyAward;
              //    });
              //};

              //$scope.fileUploadObj = { tenderId: "", documentId: "", awardId: "" };
              //var add = function (files) {
              //    _(files).each(function (file) {
              //        $scope.fileUploadObj = { tenderId: $scope.tId, documentId: "", awardId: $scope.award.id };
              //        $scope.upload = $upload.upload({
              //            url: abp.appPath +'api/Files/Upload',
              //            fields: { myObj: $scope.fileUploadObj },
              //            file: file
              //        });
              //        $scope.upload
              //            .progress(function (evt) {
              //                console.log('progress: ' + parseInt(100.0 * evt.loaded / evt.total) + '% file :' + evt.config.file.name);
              //            })
              //            .success(function (data, status, headers, config) {
              //                console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
              //                abp.notify.success("Файл додано!");
              //            });
              //    });
              //    return $scope.upload;
              //};

          }]);

})();;
(function () {
    var controllerId = 'calendarCtrl';
    angular.module('app')
        .controller(controllerId, [
            '$scope',
            'lookupService',
            '$ocLazyLoad',
            'abp.services.etender.tender',
            '$localStorage',
            '$rootScope',
            '$timeout',
            'siteSettingsService',
            'referenceService',
            'goToTenderService',
            function (
                $scope,
                lookupService,
                $ocLazyLoad,
                tenderAppService,
                $localStorage,
                $rootScope,
                $timeout,
                siteSettingsService,
                referenceService,
                goToTenderService
            ) {
                var vm = {
                    filter: {},
                    eventInModalData: {},
                    popoverShow: null,
                    statusDictionary: getStatusDictionary(lookupService.chronologicalStatusesCalendar),
                    checkedStatuses: [],
                    eventSources: [
                        {
                            id: 1,
                            source: 'MyTenders',
                            name: 'Мої пропозиції та тендери'
                          //  active: true
                        },
                        {   id: 2,
                            source: 'InTheWork',
                            name: $rootScope.source("InTheWork"),
                            //active: true
                        },
                        {
                            id: 3,
                            source: 'ChoosedTenders',
                            name: $rootScope.source("ChoosedTenders")
                           // active: true
                        }
                    ],
                    eventClicked: 'MyTenders',
                    responsibleUsersFilter: {
                        ToMeAsHead: true,
                        ToMeAsManager: true,
                        AllUsersFromMyOrg: null
                    },
                    hideInFilter: {
                        status: true,
                        tenderBidStartDate: true,
                        tenderBidEndDate: true
                    },
                    procTypesDictionary: [],
                    procurementMethod: ["open", "selective", "limited"],
                    getProcTypes: getProcTypes,
                    search: search,
                    clearSpec: clearFilterSpec,
                    getClearFilterButtonSpec: getClearFilterButtonSpec,
                };

                $scope.vm = vm;

                // set data inputs for 'Актуальність'
                vm.relevanceStatus = [
                    {
                        id: 1,
                        name: 'Актуальні тендери',
                        type: 'relevanceStatus',
                        statuses: lookupService.relevanceStatusCalendar
                    }, {
                        id: 2,
                        name: 'Закупівля відмінена або не відбулась',
                        type: 'canceledStatuses',
                        statuses: lookupService.canceledStatusesCalendar
                    }, {
                        id: 3,
                        name: 'Завершена закупівля',
                        type: 'complete',
                        statuses: lookupService.completeCalendar
                    }
                ];
                vm.relevanceStatusChecked = [vm.relevanceStatus[0]];

                var dayToday = new Date(),
                    day = dayToday.getDate(),
                    year = dayToday.getFullYear(),
                    month = dayToday.getMonth() + 1,
                    dateToday = year + '-' + month + '-' + day;

                var calendarEl = document.getElementById('calendar');

                $ocLazyLoad.load('/Scripts/calendar/core/main.css',
                    '/Scripts/calendar/timeGrid/main.css',
                    '/Scripts/calendar/daygrid/main.css',
                    '/Scripts/calendar/list/main.css');
                $ocLazyLoad.load({
                    serie: true,
                    files: [
                        '/Bundles/App/calendar.js',
                    ]
                }).then(function () {
                    generateCalendar();
                });

                function search() {
                    calendarEl.innerHTML = "";
                    generateCalendar();
                }

                function generateCalendar() {
                    vm.calendar = new FullCalendar.Calendar(calendarEl, {
                        plugins: ['interaction', 'dayGrid', 'timeGrid', 'list'],
                        header: {
                            left: 'prev,next today',
                            center: 'title',
                            right: 'dayGridMonth,dayGridWeek,dayGridDay,listWeek'
                        },
                       // defaultDate: dateToday,
                        locale: abp.localization.currentCulture.name,
                        navLinks: true, // can click day/week names to navigate views
                        businessHours: true, // display business hours
                        weekNumbers: false,
                        editable: false,
                        eventLimit: true,
                        views: {
                            dayGridMonth: {
                                eventLimit: 5
                            }
                        },
                        // Get Events
                        events: function (info, successCallback, failureCallback) {
                            getTenders(info, successCallback, failureCallback)
                        },
                        // Render Events
                        eventRender: function (event, element) {
                            renderPopovers(event);
                        },
                        // Click Event
                        eventClick: function (info) {
                            info.jsEvent.preventDefault();
                            var className = '.popoverClass-' + info.el.id;
                            if (vm.popoverShow && vm.popoverShow !== className) {
                                hidePopover(vm.popoverShow);
                            }
                            setPositionModal(info, className);
                        }
                    });

                    vm.calendar.render();
                }

                // get Tenders Funcs
                function getTenders(info, successCallback, failureCallback) {
                    abp.ui.setBusy('.main-container');
                    vm.pager = setObjForGetTenders(info);
                    var getTenders = tenderAppService.getMyTendersForCalendar(vm.pager);
                    getTenders.then(function (response) {
                        var events = response.data;
                        console.log('Calendar data:', events);
                        abp.ui.clearBusy('.main-container');
                        vm.getClearFilterButton();
                        successCallback(events);
                    }, function (errorResponse) {
                        abp.ui.clearBusy('.main-container');
                        failureCallback(errorResponse.data);
                        console.log(errorResponse.data);
                    });
                }

                // set Obj And Search Filter for Get Tender
                function setObjForGetTenders(info) {
                    return {
                        searchFilter: {
                            chronologicalPeriod: {
                                startDate: moment(info.start.valueOf()).format(), // info.start.valueOf(), 
                                endDate:
                                    moment(info.end.valueOf())
                                        .format() // info.end.valueOf()    //calendar.view.activeEnd
                            },
                            chronologicalStatuses: vm.checkedStatuses.length > 0 && vm.checkedStatuses ||
                                lookupService.chronologicalStatusesCalendar,
                            procurementMethod: vm.procurementMethod,
                            userName: vm.eventClicked === 'MyTenders' && $localStorage.username || null, // sourceSelected('MyTenders') && $localStorage.username || null,
                            responsibleUsersFilter: vm.eventClicked === ('InTheWork') && vm.responsibleUsersFilter || null,
                            isFavourite: vm.eventClicked === 'ChoosedTenders' && true || false, // sourceSelected('ChoosedTenders') && true || false,
                            statuses: setSearchStatuses(),
                            // data from filter modal
                            priceFrom: vm.filter.priceFrom || null,
                            priceTo: vm.filter.priceTo || null,
                            parentCodesEDRPOU: [vm.filter.parentCodeEDRPOU] == "" ? [] : [vm.filter.parentCodeEDRPOU],
                            tenderCreationTimeFrom: vm.filter.tenderCreationTimeFrom || null,
                            tenderCreationTimeTo: vm.filter.tenderCreationTimeTo || null,
                            organizationName: vm.filter.organisation,
                            funderId: vm.filter.funder ? vm.filter.funder.id : null,
                            title: vm.filter.title,
                            cpvs: vm.getAllCpvs && vm.getAllCpvs() || null,
                            procurementMethodTypes: vm.selectedProcTypes,
                            isRealTendersForTestMode: false
                        },
                        pageSize: 1000,
                        page: 1,
                        orderDirection: "desc",
                        includeFavorite: sourceSelected('ChoosedTenders') && true || null
                    };
                }

                function setSearchStatuses() {
                    var statuses = [];
                    if (vm.relevanceStatusChecked.length > 0)
                        vm.relevanceStatusChecked.forEach(function (item) {
                            statuses = statuses.concat(item.statuses);
                        });
                    return statuses;
                }

                // Render Popovers
                function renderPopovers(event) {
                    event.el.id = (Math.random() * 100000).toFixed(0);
                    $timeout(function () {
                        var id = '#' + event.el.id;
                        var title = setEventTitle(event.event); // event.event.title;
                        var content = setEventContent(event.event, event.el.id);
                        $(id).popover({
                            container: '#calendarBlock',
                            placement: 'bottom',
                            title: title,
                            content: content,
                            toggle: 'popover',
                            html: true,
                            template: '<div class="popover popoverClass-' + event.el.id + '"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
                        });
                    }, 1000);
                }

                // Close Popover Methods
                $(document).on("click", 'button', function () {
                    if ($(".popover")) hidePopover(".popover");
                });
                $(document).on("click", ".hide-popover", function () {
                    $(this).parents(".popover").css('opacity', 0);
                    $(this).parents(".popover").popover('hide');
                });
                $(document).on("click", ".selectable", function () {
                    selectText(this.id);
                });
                $(document).on('hidden.bs.popover', function (e) {
                    $(e.target).data("bs.popover").inState = { click: false, hover: false, focus: false };
                });
                function hidePopover(popover) {
                    $(popover).css('opacity', 0);
                    $(popover).popover('hide');
                }

                // Set Position Popover
                function setPositionModal(info, className) {
                    if ($(className).css('opacity') === '0') {
                        $timeout(function () {
                            var left = (info.jsEvent.x - $('#sidebar').width() - 170) + 'px';
                            $(className).css('left', left);
                            $(className).css('opacity', 1);
                            vm.popoverShow = className;
                        }, 10);
                    } else {
                        $(className).css('opacity', 0);
                    }
                }

                // Set Event Title in Popover
                function setEventTitle(data) {
                    var tenderUrl = goToTenderService.setTenderUrl(data, data.id);
                    var leftCover = '<a target="_blank" href="';
                    var rightCover = '</a>';
                    var title = cutString(data.title, 300);
                    return leftCover + tenderUrl + '">' + title + rightCover;
                }

                function cutString(title, value) {
                    if (title.length > value)
                        return title.substring(0, value) + '...';
                    return title;
                }

                // Set Event Content in Popover
                function setEventContent(data, id) {
                    var leftCover = '<div class="row mb5"><div class="col-sm-4">';
                    var middleCover = '</div><div class="col-sm-8" >';
                    var rightCover = '</div></div>';

                    var tenderId = leftCover +
                        $rootScope.source('Tender') +
                        middleCover +
                        '<span id="selectable' + id + '" class="selectable">'
                        + data._def.extendedProps.tenderId + '</span>' +
                        rightCover;
                    var status = leftCover +
                        $rootScope.source('Status') +
                        middleCover +
                        (getTenderStatusDesc(data._def.extendedProps.status) || $rootScope.source('Complaints')) +
                        rightCover;
                    var date = leftCover +
                        $rootScope.source('Date') +
                        middleCover +
                        '<span style="font-weight: bold">' + $rootScope.source('since') + ' ' + moment(data.start).format('DD-MM-YYYY HH:mm') + '</span><br>' +
                        '<span>' + $rootScope.source('upTo') + ' ' + moment(data.end).format('DD-MM-YYYY HH:mm') + '</span>' +
                        rightCover;
                    var organizationName = leftCover +
                        $rootScope.source('Customer') +
                        middleCover +
                        data._def.extendedProps.organizationName + '</span>' +
                        rightCover;
                    var footerBlock = '<i class="fa fa-times-circle hide-popover" aria-hidden="true"></i>';
                    //Для сверхпорогов в статусе Ожидания предложений выводим доп инфу
                    if (data._def.extendedProps.status == 'active.tendering' && (data._def.extendedProps.enquiryPeriodStart || data._def.extendedProps.complainPeriodStart)) {
                        var enquiryPeriodStart = '<hr style="margin:0.2em auto">' + leftCover +
                            $rootScope.source('EnquiriesPeriod') +
                            middleCover +
                            '<span>' + $rootScope.source('since') + ' ' + moment(data._def.extendedProps.enquiryPeriodStart).format('DD-MM-YYYY') + '</span><br>' +
                            '<span>' + $rootScope.source('upTo') + ' ' + moment(data._def.extendedProps.enquiryPeriodEnd).format('DD-MM-YYYY') + '</span>' +
                            rightCover;
                        var complainPeriodStart =  leftCover +
                            $rootScope.source('ComplaintPeriod') +
                            middleCover +
                            '<span>' + $rootScope.source('since') + ' ' + moment(data._def.extendedProps.complainPeriodStart).format('DD-MM-YYYY') + '</span><br>' +
                            '<span>' + $rootScope.source('upTo') + ' ' + moment(data._def.extendedProps.complainPeriodEnd).format('DD-MM-YYYY') + '</span>' +
                            rightCover;
                        return tenderId + organizationName + status + date + enquiryPeriodStart + complainPeriodStart + footerBlock;
                    }
                    return tenderId + organizationName + status + date + footerBlock;
                }

                // get Tender Status Desc for Popover
                function getTenderStatusDesc(status) {
                    return lookupService.getTenderStatusDesc(status);
                }

                // select Text for Popover
                function selectText(containerid) {
                    siteSettingsService.selectText(containerid);
                }

                // get Status Dictionary for Dropdown Menu
                function getStatusDictionary(statuses) {
                    var statusDict = []; angular.forEach(statuses,
                        function (st) {
                            var description = getTenderStatusDesc(st, '') || $rootScope.source('Complaints');
                            var label = lookupService.getTenderLabelClass(st);
                            statusDict.push({
                                name: st,
                                description: description,
                                label: label
                            });
                        });
                    return statusDict;
                }

                var simpleProcType = {
                    id: 15,
                    procurementMethod: "open",
                    procurementMethodType: "belowThresholdSimple",
                    procurementMethodTypeDescription: "Спрощена закупівля",
                    procurementMethodTypeLocal: "Спрощена закупівля"
                };

                // for Filter Modal
                function getProcTypes() {
                    if (vm.procTypesDictionary.length > 0) return;

                    abp.ui.setBusy("#procTypesFilter");
                    referenceService
                        .getNonLimitedProcTypes()
                        .then(function (response) {
                            if (response.data) {
                                angular.forEach(response.data.procTypes,
                                    function (pType) {
                                        pType.procurementMethodTypeLocal = lookupService
                                            .getTenderProcedureType(pType.procurementMethodType, true);
                                    });
                                response.data.procTypes.splice(4, 0, simpleProcType);
                                vm.procTypesDictionary = filterProcTypes(response.data.procTypes);
                            }
                            abp.ui.clearBusy("#procTypesFilter");
                        },
                            function () {
                                abp.ui.clearBusy("#procTypesFilter");
                            });
                }

                // for Filter Modal
                function filterProcTypes(procTypes) {
                    return procTypes.filter(function (pt) {
                        return vm.procurementMethod.indexOf(pt.procurementMethod) > -1;
                    });
                }

                // Clear Filter in Dropdown Menu
                function clearFilterSpec() {
                    vm.eventSources.forEach(function (item) {
                        item.active = true;
                    });
                    vm.checkedStatuses = [];
                    // hide popover event if open
                    if ($(".popover")) hidePopover(".popover");
                }

                // for Filter Modal
                function getClearFilterButtonSpec() {
                    var isPositive = function (item) {
                        return item.active === false;
                    };
                    return vm.checkedStatuses.length > 0 || vm.eventSources.some(isPositive);
                }

                // for Dropdown Menu
                function sourceSelected(source) {
                    var i = 0;
                    var len = vm.eventSources.length;
                    for (i; i < len; i++) {
                        if (vm.eventSources[i].source === source && vm.eventSources[i].active)
                            return true;
                    }
                    return false;
                }

                // Event for Dropdown Menu
                $(document).on('click', '.dropdownEvent .dropdown-menu', function (e) {
                    e.stopPropagation();
                });

            }]);

})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('contractingCtrl', contracting);

    contracting.$inject = [
        '$rootScope',
        '$ocLazyLoad',
        '$scope',
        '$timeout',
        'abp.services.etender.contracting',
        'tenderHelperService',
        'Upload',
        '$stateParams',
        'documentsService',
        'datesHelperService',
        '$localStorage',
        'loadTypesAndConfident'];

    function contracting(
        $rootScope,
        $ocLazyLoad,
        $scope,
        $timeout,
        contractingAppService,
        tenderHelperService,
        Upload,
        $stateParams,
        documentsService,
        datesHelperService,
        $localStorage,
        loadTypesAndConfident)
    {
        $scope.ng_localStorage = $localStorage;
        $scope.shoOnlyButtonUpdate = false; // hide button when adding changes
        $scope.showFooterButtons = true;
        $scope.progect = window.projectOpen;

        var blockApplyBtn = true;
        var rationaleTypes = [
            {
                title: 'Зменшення обсягів закупівлі',
                value: 'volumeCuts'
            }, {
                title: 'Зміна ціни за одиницю товару',
                value: 'itemPriceVariation'
            }, {
                title: 'Покращення якості предмета закупівлі',
                value: 'qualityImprovement'
            }, {
                title: 'Продовження строку дії договору (через документально підтверджені об’єктивні обставини)',
                value: 'durationExtension'
            }, {
                title: 'Узгоджене зменшення ціни',
                value: 'priceReduction'
            }, {
                title: 'Зміна ціни у зв’язку із зміною ставок податків і зборів',
                value: 'taxRate'
            }, {
                title: 'Зміна сторонніх показників (курсу, тарифів...)',
                value: 'thirdParty'
            }, {
                title: 'Продовження строку дії договору на наступний рік',
                value: 'fiscalYearExtension'
            }];

        activate();

        var activeChange = function (change) {
            abp.ui.setBusy();
            $scope.vm.isShowApplyChangesBtn = true;
            contractingAppService.activeChange({ id: change.id, dateSigned: change.dateSigned })
                .then(function (data) {
                    abp.ui.clearBusy();
                    abp.notify.success("Статус змінено");
                    activate();
                        $scope.showFooterButtons = true;
                    },
                function (ex) {
                    abp.ui.clearBusy();
                });

        };

        var canAddChange = function () {
            if (vm.contract.changes.length === 0) {
                return false;
            }

            return !vm.contract.changes.some(function (c) {
                return !c.status || c.status == "pending";
            });
        }

        var canActiveChange = function (change) {
            if (!change.id) return false;
            if (!isValidDateSigned(change)) return false;

            if (change && change.status && change.status == "pending" //&& change.date && (change.date > datesHelperService.jsonStringToDate("2016-11-27T00:00:00")) // временный костыль
            ) {
                return true;
            }

            return false;
        };

        var isExistChangeCanBeActivated = function () {
            return vm.contract && vm.contract.changes && vm.contract.changes.some(canActiveChange);
        };

        var isValidDateSigned = function (change) {
            if (!vm.minDateSigned || !change.dateSigned)
                return true;

            return vm.minDateSigned < new Date(change.dateSigned);
        }

        var stepActiveChange = function(change) {
            if (change.documents.length < 2 || $scope.vm.contract.isAnyDocNotexported) return false;
            for (var doc in change.documents) {
                if (change.documents[doc].title === 'sign.p7s') {
                    return true;
                }
            }
            return false;
        };

        var stepSignEcp = function (change) {
            if (change.documents.length === 0 || $scope.vm.contract.isAnyDocNotexported) return false;
            return true;
        };

        $scope.reloadDocuments = function () {
            abp.ui.setBusy();
            contractingAppService.get($stateParams.id)
                .then(function (reponse) {
                    vm.contract.documents = reponse.data.documents;
                    abp.ui.clearBusy();
                    if (vm.contract.documents == null) return;

                    vm.contract.documents = documentsService.sortListOfDocs(vm.contract.documents);
                });
        }

        var havePendingChange = function (contract) {
            for (var index in contract.changes) {
                if (contract.changes[index].status === 'pending')
                    return true;
            }
            return false;
        }


        var updateDocumentUploaded = function () {
            $scope.documentsToAdd = null;
            $scope.changedDocument = null;
            activate();
        };

        var updateDocument = function () {
            var vm = $scope.vm;
            vm.contract.isAnyDocNotexported = true;

            var selectedDocTypeId = $scope.vm.selectedDocType != null ? $scope.vm.selectedDocType.id : null;

            var o = {
                tenderId: vm.contract.tenderId,
                documentId: $scope.changedDocument && $scope.changedDocument.id,
                contractingId: vm.contract.id
            };

            $scope.updateFields = { myObj: o, "DocumentType": selectedDocTypeId};            
        };

        var setChangedDocument = function (document) {
            $scope.changedDocument = document;
            _($scope.documents).each(function (doc) {
                doc.ch = false;
            });
            document.ch = true;
        };

        var isDocumentsLengthChagned = false;
        var update = function () {
            abp.ui.setBusy();

            vm.contract.changes.forEach(function (c) {
                var sRationaleTypes = c.sRationaleTypes.filter(function (t) {
                    return t.selected == true;
                }).map(function (t) {
                    return t.value;
                });
                c.rationaleTypes = sRationaleTypes.join(',');
            });
            
            var pendingChange = vm.contract.changes.filter(function (t) {
                return t.status === 'pending' || !t.status;
            })[0];

            vm.contract.value.amount =
                pendingChange.valueAmount != null ? pendingChange.valueAmount : vm.contract.value.amount;
            vm.contract.value.amountNet =
                pendingChange.valueAmountNet != null ? pendingChange.valueAmountNet : vm.contract.value.amountNet;

            vm.contract.period.startDate =
                pendingChange.periodStartDate != null ? pendingChange.periodStartDate : vm.contract.period.startDate;
            vm.contract.period.endDate =
                pendingChange.periodEndDate != null ? pendingChange.periodEndDate : vm.contract.period.endDate;

            vm.contract.amountPaid = null;

            //Костиляка через різний формат дати в системі
            //vm.contract.changes[0] не заверший контракт на якому злітає дата
            var change = null;
            if (vm.contract.changes) {
                for (var i = 0; i < vm.contract.changes.length; i++) {
                    if (vm.contract.changes[i].status === "pending") {
                        change = vm.contract.changes[i];
                        if (change.dateSigned && typeof (change.dateSigned) !== "object")
                            vm.contract.changes[i].dateSigned = datesHelperService.jsonStringToDate(change.dateSigned);
                    }
                }
            }
            vm.contract.inputUnitPrices = [];
            vm.contract.items.forEach(function (item) {
                if (item.unitPrice && item.unitPrice.amount >= 0) {
                    vm.contract.inputUnitPrices.push({
                        amount: item.unitPrice.amount,
                        itemId: Number(item.id)
                    });
                }
            });

            var indexesToRemove = [];
            vm.contract.items.forEach(function (item, index) {
                if (item.unitPrice && (!item.unitPrice.amount && item.unitPrice.amount === null) && item.quantity != 0) {
                    indexesToRemove.push(index);
                }
            });

            indexesToRemove.forEach(function (indexToRemove, i) {
                vm.contract.inputUnitPrices.splice(indexToRemove, 1);
                for (var k = i+1; k < indexesToRemove.length; k++) {
                    indexesToRemove[k] -= 1;
                }
            });

            contractingAppService.update(vm.contract)
                .then(function () {
                    abp.ui.clearBusy();
                    abp.notify.success("Зміни внесено!");
                    $scope.shoOnlyButtonUpdate = false;
                    blockApplyBtn = false;
                    isDocumentsLengthChagned = false;
                    activate();
                }, function (ex) {
                    abp.ui.clearBusy();
                });
        };

        $scope.vm = {
            activeChange: activeChange,
            activate: activate,
            addChange: addChange,
            canAddChange: canAddChange,
            canActiveChange: canActiveChange,
            isExistChangeCanBeActivated: isExistChangeCanBeActivated,
            isValidDateSigned: isValidDateSigned,
            contract: {
                changes: [],
                isAnyDocNotexported: false
            },
            isShowApplyChangesBtn: true,
            floatNumberRegex: $rootScope.regex.floatNumber,
            haveChanges: haveChanges,
            update: update,
            updateDocument: updateDocument,
            updateDocumentUploaded: updateDocumentUploaded,
            setChangedDocument: setChangedDocument,
            stepActiveChange: stepActiveChange,
            havePendingChange: havePendingChange,
            stepSignEcp: stepSignEcp,
            blockApplyBtn: blockApplyBtn,
            updateDocumentStatus: updateDocumentStatus,
            checkDocNotexported: checkDocNotexported
        };
        var vm = $scope.vm;

        $scope.showSignModalContract = function (contractObj) {
            $scope.entityType = 'contracting';
            contractObj.type = 'contract';
            $scope.myContract = contractObj;
            $scope.entityOutOfTender = $scope.myContract.entityOutOfTender;
            $('#modalSignNew').modal('toggle');
        };

        $scope.showSignModalChange = function (changeObj) {
            $scope.entityType = 'contractingChange';
            changeObj.contractId = vm.contract.id;
            changeObj.tenderApiId = vm.contract.tenderApiId;
            changeObj.entityOutOfTender = vm.contract.entityOutOfTender;
            $scope.changeContractingObj = changeObj;
            $scope.myContract = vm.contract;
            $scope.entityOutOfTender = $scope.changeContractingObj.entityOutOfTender;
            $('#modalSignNew').modal('toggle');
        };

        function checkIfChangesPending(changes) {
            for (var change in changes) {
                if (changes[change].status === 'pending') {
                    $scope.showFooterButtons = false;
                }
            }
        }

        function getDockType() {
            loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                $scope.documentTypes = documentTypes.contractingDocument;
            });
        }

        var currentPendingOld = null;
        var quantityChangesOld = null;
        var unitPriceChangesOld = null;
        var isNotChanged = true;

        function activate() {
            abp.ui.setBusy();
            getDockType();
            contractingAppService.get($stateParams.id)
                .then(function (reponse) {
                    abp.ui.clearBusy();
                    reponse.data.action = "change";
                    vm.contract = reponse.data;
                    vm.contract.needVat = tenderHelperService.needVat(reponse.data);
                    checkIfChangesPending(reponse.data.changes);
                    vm.minDateSigned = new Date(vm.contract.dateSigned);
                    vm.contract.dateModified = new Date(vm.contract.dateModified);

                    vm.contract.entityOutOfTender = true; //в API подпись ложится не в тендер - а напрямую - https://lb-api-sandbox.prozorro.gov.ua/api/2.3/contracts/d18ab36c358a447ab2f135ef2ad2ea31
                    console.log('Contracting: ', reponse.data);

                    reponse.data.value.amountOld = angular.copy(reponse.data.value.amount);
                    reponse.data.value.amountNetOld = angular.copy(reponse.data.value.amountNet);
                    reponse.data.itemsOld = angular.copy(reponse.data.items);

                    setContractDescriptionByStatus(vm.contract.status);
                    if (vm.contract.changes.length === 0) {
                        addChange();
                    } else {
                        vm.contract.changes.forEach(function (c) {
                            c.date = new Date(c.date);
                            c.valueAmount = reponse.data.value.amount;
                            c.valueAmountNet = reponse.data.value.amountNet;
                            c.periodStartDate = reponse.data.period.startDate;
                            c.periodEndDate = reponse.data.period.endDate;
                            if (c.status == "pending")
                                return;
                            var ds = new Date(c.dateSigned);
                            if (vm.minDateSigned < ds) {
                                vm.minDateSigned = ds;
                            }
                        });

                        setRationaleTypes(vm.contract.changes);
                    }
                    
                    var changes = vm.contract.changes.filter(function (element) {
                        return element.status === 'pending'
                    })
                    var quantityChanges = vm.contract.items.filter(function (element) {
                        return element.quantity;
                    })
                    var unitPriceAmountChanges = vm.contract.items.filter(function (item) {
                        return item.unitPrice && item.unitPrice.amount;
                    })
                    if (changes.length) {
                        currentPendingOld = angular.copy(changes[0]);
                    }
                    if (quantityChanges.length) {
                        quantityChangesOld = angular.copy(quantityChanges[0])
                    }
                    if (unitPriceAmountChanges.length) {
                        unitPriceChangesOld = angular.copy(unitPriceAmountChanges[0]);
                    }

                    if (vm.contract.documents != null)
                        vm.checkDocNotexported();

                    if (vm.contract.changes.length > 0) {
                        vm.contract.changes.forEach(function(c) {
                            if(c.documents)
                                c.documents = documentsService.sortListOfDocs(c.documents);
                        });
                    }
                    if (isDocumentsLengthChagned) {
                        isNotChanged = false;
                    } else {
                        isDocumentsLengthChagned = true;
                    }

                    $timeout(function () {
                        $scope.signCheck = true;
                    }, 5000);
                });
        };
        $scope.currentPendingNotChanged = function () {
            var currentPending = $scope.vm.contract.changes.filter(function (element) {
                return element.status === 'pending'
            })[0];
            var quantityChanges = vm.contract.items.filter(function (element) {
                return element.quantity;
            })[0];
            var unitPriceAmountChanges = vm.contract.items.filter(function (item) {
                return item.unitPrice && item.unitPrice.amount;
            })[0];
            if (!currentPending || !quantityChanges || !unitPriceAmountChanges ||!currentPendingOld || !unitPriceChangesOld) return false;
            return (currentPendingOld.rationale == currentPending.rationale
                && currentPendingOld.dateSigned == currentPending.dateSigned
                && currentPendingOld.contractNumber == currentPending.contractNumber
                && currentPendingOld.periodStartDate == currentPending.periodStartDate
                && currentPendingOld.periodEndDate == currentPending.periodEndDate
                && currentPendingOld.valueAmount == currentPending.valueAmount
                && currentPendingOld.valueAmountNet == currentPending.valueAmountNet
                && quantityChangesOld.quantity == quantityChanges.quantity
                && unitPriceChangesOld.unitPrice.amount == unitPriceAmountChanges.unitPrice.amount
                && isNotChanged
                && isDocumentsLengthChagned)
        }

        function checkDocNotexported() {
            vm.contract.documents = documentsService.sortListOfDocs(vm.contract.documents);
            vm.contract.isAnyDocNotexported = vm.contract.documents.some(function (d) {
                return !d.isExported;
            });
        };

        function updateDocumentStatus(index, change) {
            abp.ui.setBusy();
            contractingAppService.get($stateParams.id)
                .then(function(reponse) {
                    vm.contract.changes[index].documents = reponse.data.changes[index].documents;
                    vm.contract.documents = reponse.data.documents;
                    vm.contract.changes[index].documents = documentsService.sortListOfDocs(vm.contract.changes[index].documents);
                    vm.checkDocNotexported();
                    change.isSignatureExist = stepActiveChange(change);
                   abp.ui.clearBusy();
                });
        }

        function addChange() {
            $scope.shoOnlyButtonUpdate = true; // hide button when adding changes
            var sRationaleTypes = [];
            for (var j = 0; j < rationaleTypes.length; j += 1) {
                sRationaleTypes.push({
                    selected: false,
                    title: rationaleTypes[j].title,
                    value: rationaleTypes[j].value
                });
            };
            vm.contract.changes.push({
                valueAmount: vm.contract.value.amount,
                valueAmountNet: vm.contract.value.amountNet,
               // contractNumber: vm.contract.number,
                rationale: null,
                sRationaleTypes: sRationaleTypes
            });
        };

        function haveChanges() {
            if (vm.contract.changes.length == 0) return false;

            for (var i = 0; i < vm.contract.changes.length; i += 1) {
                var change = vm.contract.changes[i];
                if (!hasRationaleTypes(change)) return false;
                if (change.status == "pending" && !isValidDateSigned(change)) return false;
            }

            return true;

            function hasRationaleTypes(c) {
                for (var j = 0; j < c.sRationaleTypes.length; j += 1) {
                    if (c.sRationaleTypes[j].selected) return true;
                }

                return false;
            }
        }

        function setContractDescriptionByStatus(status) {
            switch (status) {
                case ('active'): { $scope.statusDesc = 'Договір підписаний всіма учасниками, і зараз діє на законних підставах'; break; }
                case ('terminated'): { $scope.statusDesc = 'Договір був підписаний та діяв, але вже завершився'; break; }
            };
        };

        function setRationaleTypes(changes) {
            for (var i = 0; i < changes.length; i += 1) {
                var change = changes[i];
                change.sRationaleTypes = [];
                var selectedTypes = change.rationaleTypes.split(',');

                for (var j = 0; j < rationaleTypes.length; j += 1) {
                    if (selectedTypes.indexOf(rationaleTypes[j].value) != -1) {
                        change.sRationaleTypes.push({
                            selected: true,
                            title: rationaleTypes[j].title,
                            value: rationaleTypes[j].value
                        });
                    } else {
                        change.sRationaleTypes.push({
                            selected: false,
                            title: rationaleTypes[j].title,
                            value: rationaleTypes[j].value
                        });
                    }
                }
            }
        }

        $scope.checkDate = function (lastDate, firstDate, element) {
            var isValid = false;
            if (firstDate === undefined || !firstDate) firstDate = (new Date()).toISOString();
            else if (typeof (firstDate) === "object") firstDate = firstDate.toISOString();


            if (lastDate === undefined || !lastDate) lastDate = (new Date()).toISOString();
            else if (typeof (lastDate) === "object") lastDate = lastDate.toISOString();

            (lastDate >= firstDate) ?
                (isValid = true) :
                (isValid = false);

            if (element) {
                element.$setValidity(element.$name, isValid);
            }

            return isValid;
        };

        $scope.needVat = function (data) {
            return tenderHelperService.needVat(data);
        }

        $scope.disabledContractValue = function (data) {
            var sRationaleTypes = data.sRationaleTypes.filter(function(t) {
                return t.selected === true
                    && (t.value === 'volumeCuts'
                    || t.value === 'itemPriceVariation'
                    || t.value === 'priceReduction'
                    || t.value === 'taxRate'
                    || t.value === 'thirdParty'
                    || t.value === 'fiscalYearExtension'
                    || vm.contract.oldContract
                );
            });
            return data.status === 'active' || sRationaleTypes.length == 0;
        }

        $scope.disabledContractPeriod = function (data) {
            var sRationaleTypes = data.sRationaleTypes.filter(function (t) {
                return t.selected === true &&
                (t.value === 'fiscalYearExtension' || t.value === 'durationExtension'
                );
            });
            return data.status === 'active' || sRationaleTypes.length == 0;
        }

        $scope.hideChangeItems = function (data) {
            var sRationaleTypes = data.sRationaleTypes.filter(function (t) {
                return t.selected === true &&
                    (t.value === 'volumeCuts');
            });
            return data.status === 'active' || sRationaleTypes.length == 0;
        }

        $scope.resetChangeValue = function (data) {
            if ($scope.disabledContractValue(data)) {
                data.valueAmount = vm.contract.value.amount;
                data.valueAmountNet = vm.contract.value.amountNet;
            }
            if ($scope.disabledContractPeriod(data)) {
                data.periodStartDate = vm.contract.period.startDate;
                data.periodEndDate = vm.contract.period.endDate;
            }
            if ($scope.hideChangeItems(data)) {
                vm.contract.items = vm.contract.itemsOld;
            }
            var currentCause = $scope.vm.contract.changes.filter(function (element) {
                return element.status === 'pending'
            })[0]
            isNotChanged = true;
            if (!currentCause) return;
            for (var i = 0; i < currentPendingOld.sRationaleTypes.length; i++) {
                if (currentPendingOld.sRationaleTypes[i].selected !== currentCause.sRationaleTypes[i].selected) {
                    isNotChanged = false;
                }
            }
        }

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.back = function () {
            window.history.back();
        }

        $scope.validValueAmounts = function(change) {
            if (!change.valueAmount || !change.valueAmountNet) return false;
            if ($scope.vm.contract.value.valueAddedTaxIncluded) {
                var count = change.valueAmount / 1.2;
                count = count.toFixed(2);
                if (count <= change.valueAmountNet &&
                    change.valueAmountNet < change.valueAmount ||
                    // if old Contract
                    $scope.vm.contract.oldContract &&
                    change.valueAmount === change.valueAmountNet) {
                    return true;
                }
            } else {
                if (change.valueAmount === change.valueAmountNet) {
                    return true;
                }
            }
            return false;
        };

        $scope.getItemsToChange = function(change, contract) {
            change.items = angular.copy(contract.items);
        };

        $scope.canChangeDocument = function (doc) {
            if (doc.title.endsWith('.p7s')) {
                return false;
            }

            return true;
        }

        $scope.$on('contractSigned', function (evt) {
            activate();
        });

    };
})();

;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('contractingBreakingCtrl', contractingBreaking);

    contractingBreaking.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$stateParams',
        'abp.services.etender.contracting',
        '$localStorage',
        '$controller',
        'documentsService',
        'Upload',
        'goToTenderService',
        '$timeout'
    ];

    function contractingBreaking(
        $rootScope,
        $scope,
        $location,
        $stateParams,
        contractingAppService,
        $localStorage,
        $controller,
        documentsService,
        Upload,
        goToTenderService,
        $timeout) {

        angular.extend(this, $controller('contractingCloseCtrl', {
            $scope: $scope
        }));

        $scope.ng_localStorage = $localStorage;
        $scope.selectedCountry = {};
        $scope.countries = [];

        function generateRequestParamsForCountry (selectedCountry) {
            return {
                id: selectedCountry.code,
                scheme: 'COO',
                description: selectedCountry.nameUk
            };
        }

        function manipulateWithCountryClassificationBeforeUpdate () {
            vm.contract.items.forEach(function (item) {
                var countryIndex = item.additionalClassifications.findIndex(function (classification) {
                    return classification.scheme === 'COO';
                });
                if ($scope.selectedCountry[item.id]) {
                    var countryObject = generateRequestParamsForCountry($scope.selectedCountry[item.id]);

                    if (countryIndex !== -1) {
                        item.additionalClassifications.splice(countryIndex, 1, countryObject);
                    } else {
                        item.additionalClassifications.push(countryObject);
                    }

                } else {
                    if (countryIndex !== -1) {
                        item.additionalClassifications.splice(countryIndex, 1);
                    }
                }
            });
        }

        var breaking = function () {
            if (!vm.canBreak) return;

            if (window.confirm(" Розірвати Договір \n Підтвердити дію?")) {
                manipulateWithCountryClassificationBeforeUpdate();
                abp.ui.setBusy();
                vm.contract.status = 'terminated';
                contractingAppService.update(vm.contract)
                    .then(function (response) {
                        abp.ui.clearBusy();
                        abp.notify.success("Договір розірвано!");
                        goToTenderService.redirect(response.data, vm.contract.tenderId)
                    },
                    function (ex) {
                        abp.ui.clearBusy();
                    });
            }
        };

        var confirm = function () {
            abp.ui.setBusy();
            manipulateWithCountryClassificationBeforeUpdate();
            contractingAppService.update(vm.contract)
                .then(function () {
                    abp.ui.clearBusy();
                    abp.notify.success("Зміни внесено!");
                    window.location.reload();
                }, function (ex) {
                    abp.ui.clearBusy();
                });
        };

        var showSignModalContract = function (contractObj) {
            $scope.myContract = contractObj;
            $scope.entityType = 'contractingBreaking';
            $scope.entityOutOfTender = $scope.myContract.entityOutOfTender;
            $('#modalSignNew').modal('toggle');
        };


        $scope.vm = {
            breaking: breaking,
            canBreak: false,
            confirm: confirm,
            showSignModalContract: showSignModalContract,
            contract: {},
            floatNumberRegex: $rootScope.regex.floatNumber
        };
        var vm = $scope.vm;

        $scope.activate = function () {
            abp.ui.setBusy();

            contractingAppService.get($stateParams.id)
                .then(function (reponse) {
                    abp.ui.clearBusy();
                    console.log('Contracting Breaking:', reponse.data);
                    reponse.data.action = "break";
                    vm.contract = reponse.data;
                    vm.contract.entityOutOfTender = true;
                    vm.contract.messageEndContract = false; // message: "У Вас є незавершена зміна до ...."
                    angular.forEach(vm.contract.changes, function (change) {
                        if (change.status === 'pending') {
                            vm.contract.messageEndContract = true; // message: "У Вас є незавершена зміна до ...."
                        }
                    });
                    var hasAmount = vm.contract.amountPaid && parseFloat(vm.contract.amountPaid.amount) >= 0;
                    if (hasAmount && vm.contract.terminationDetails) {
                        vm.contract.canSign = true;
                        vm.canBreak = true;
                    }

                    if (vm.contract.documents != null && vm.contract.documents instanceof Array) {
                        var docs = vm.contract.documents;
                        vm.contract.documents = [];
                        vm.contract.documents = documentsService.sortListOfDocs(docs);
                    }

                    vm.contract.terminationDetailsFromResponse = angular.copy(vm.contract.terminationDetails);
                    vm.contract.amountPaidFromResponse = angular.copy(vm.contract.amountPaid);

                    $scope.countries = $localStorage.refs.initialCountriesReference;

                    if (vm.contract.items && vm.contract.items.length) {
                        vm.contract.items.forEach(function (item) {
                            if (item.additionalClassifications && item.additionalClassifications.length) {
                                var countryScheme = item.additionalClassifications.find(function (classification) {
                                    return classification.scheme === 'COO';
                                });

                                if (countryScheme) {
                                    $scope.selectedCountry[item.id] = $scope.countries.find(function (country) {
                                        return country.code === countryScheme.id;
                                    });
                                }
                            }
                        });
                    }

                    $timeout(function () {
                        $scope.signCheck = true;
                    }, 5000);
                });
        };

        $scope.addDocument = function (files, docTypeId, docId) {
            if (files.length == 0) return;

            var selectedDocTypeId = $scope.selectedDocType != null ? $scope.selectedDocType.id : null;
            if (docTypeId) selectedDocTypeId = docTypeId;

            var filesCount = files.length;
            angular.forEach(files, function (file, key) {
                if (documentsService.validateDocName(file.name) == 0) return;
                $scope.fileUploadObj = { tenderId: vm.contract.tenderId, documentId: docId, contractingId: vm.contract.id };
                $scope.upload = Upload.upload({
                    url: abp.appPath + 'api/Files/Upload',
                    fields: { myObj: $scope.fileUploadObj, "DocumentType": selectedDocTypeId },
                    file: file
                });
                $scope.upload
                    .progress(function (evt) {
                        //console.log('progress: ' + parseInt(100.0 * evt.loaded / evt.total) + '% file :' + evt.config.file.name);
                    })
                    .then(function (data, status, headers, config) {
                        //console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                        abp.notify.success("Файл додано!");
                        filesCount--;
                        if (filesCount <= 0) {
                            $scope.documentsToAdd = null;
                            $scope.reloadDocuments();
                        }
                    });
            });
            return $scope.upload;
        };

        if ($location.$$url.indexOf('contractingBreaking') !== -1) {
            $scope.activate();
        }

        $scope.reloadDocuments = function () {
            abp.ui.setBusy();
            contractingAppService.get($stateParams.id)
                .then(function (reponse) {
                    var newDocs = reponse.data.documents;
                    if (newDocs && newDocs instanceof Array) {
                        vm.contract.documents = [];
                        vm.contract.documents = documentsService.sortListOfDocs(newDocs);
                    }
                    abp.ui.clearBusy();
                });
        };
        $scope.validDate = true;
        $scope.checkChangeDate = function (startDate, endDate) {

            if (!startDate && endDate) {
                $scope.validDate = true;
            } else {
                startDate = moment(startDate);
                endDate = moment(endDate);
                if (startDate <= endDate) {
                    $scope.validDate = true;
                } else
                    $scope.validDate = false;
            }
        }

        $scope.checkTerminationDetailsForChanges = function () {
            return vm.contract.terminationDetailsFromResponse === vm.contract.terminationDetails;
        }

        $scope.$watch('vm.contract', function (contract) {
            if (contract && contract.documents) {
                var signDocuments = contract.documents.filter(function (doc) {
                    return doc.title === 'sign.p7s';
                });
                signDocuments.sort(function (first, second) {
                    return new Date(second.dateModified) - new Date(first.dateModified);
                });
                if (signDocuments[0]) {
                    var signDocDateModified = new Date(signDocuments[0].dateModified);
                }
                var contractDateModified = new Date(contract.dateModified);

                contract.isSignedAfterChecking = signDocDateModified > contractDateModified;
            }
        }, true);

        $scope.compareContractingAmount = function () {
            if (vm.contract.amountPaidFromResponse
                && vm.contract.amountPaidFromResponse.amount === vm.contract.amountPaid.amount
                && vm.contract.amountPaidFromResponse.amountNet === vm.contract.amountPaid.amountNet) {
                return true;
            }
            return false;
        }
    };
})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('contractingCloseCtrl', contractingClose);

    contractingClose.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$stateParams',
        'abp.services.etender.contracting',
        'documentsService',
        'Upload',
        '$localStorage',
        'loadTypesAndConfident',
        'goToTenderService',
        'uploadFileService',
        '$timeout'
    ];

    function contractingClose(
        $rootScope,
        $scope,
        $location,
        $stateParams,
        contractingAppService,
        documentsService,
        Upload,
        $localStorage,
        loadTypesAndConfident,
        goToTenderService,
        uploadFileService,
        $timeout)
    {
        $scope.ng_localStorage = $localStorage;
        $scope.selectedCountry = {};
        $scope.countries = [];
        $scope.dateRegex = $rootScope.regex.date;

        var close = function () {
            if (!vm.canClose) return;

            if (window.confirm(" Завершити Договір \n Підтвердити дію?")) {
            abp.ui.setBusy();
            vm.contract.status = 'terminated';
            manipulateWithCountryClassificationBeforeUpdate();
            contractingAppService.update(vm.contract)
                .then(function (response) {
                    abp.ui.clearBusy();
                    abp.notify.success("Договір завершено!");
                    goToTenderService.redirect(response.data, vm.contract.tenderId);
                }, function (ex) {
                    abp.ui.clearBusy();
                });
            }
        };

        function generateRequestParamsForCountry (selectedCountry) {
            return {
                id: selectedCountry.code,
                scheme: 'COO',
                description: selectedCountry.nameUk
            };
        }

        function manipulateWithCountryClassificationBeforeUpdate () {
            vm.contract.items.forEach(function (item) {
                var countryIndex = item.additionalClassifications.findIndex(function (classification) {
                    return classification.scheme === 'COO';
                });
                if ($scope.selectedCountry[item.id]) {
                    var countryObject = generateRequestParamsForCountry($scope.selectedCountry[item.id]);

                    if (countryIndex !== -1) {
                        item.additionalClassifications.splice(countryIndex, 1, countryObject);
                    } else {
                        item.additionalClassifications.push(countryObject);
                    }

                } else {
                    if (countryIndex !== -1) {
                        item.additionalClassifications.splice(countryIndex, 1);
                    }
                }
            });
        }

        var confirm = function () {
            abp.ui.setBusy();
            manipulateWithCountryClassificationBeforeUpdate();
            contractingAppService.update(vm.contract)
                .then(function () {
                    abp.ui.clearBusy();
                    abp.notify.success("Зміни внесено!");
                    window.location.reload();
                }, function (ex) {
                    abp.ui.clearBusy();
                });
        };

        var showSignModalContract = function (contractObj) {
            $scope.entityType = 'contractingClose';
            contractObj.type = 'contract';
            $scope.contractingCloseObj = contractObj;
            $scope.entityOutOfTender = $scope.contractingCloseObj.entityOutOfTender;
            $('#modalSignNew').modal('toggle');
        };

        function getDockType() {
            loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                $scope.documentTypes = documentTypes.contractDocument;
            });
        }


        $scope.vm = {
            canClose: false,
            confirm: confirm,
            showSignModalContract: showSignModalContract,
            contract: {},
            close: close,
            floatNumberRegex: $rootScope.regex.floatNumber
        };
        var vm = $scope.vm;

        $scope.activate = function () {
            abp.ui.setBusy();
            contractingAppService.get($stateParams.id)
                .then(function (reponse) {
                    abp.ui.clearBusy();
                    console.log('Contracting Close: ', reponse.data);
                    reponse.data.action = "close";
                    vm.contract = reponse.data;
                    vm.contract.messageEndContract = false; // message: "У Вас є незавершена зміна до ...."
                    angular.forEach(vm.contract.changes, function (change) {

                        if (change.status === 'pending') {
                            vm.contract.messageEndContract = true; // message: "У Вас є незавершена зміна до ...."
                        }
                    });
                    vm.contract.entityOutOfTender = true;
                    vm.canClose = true;
                    vm.canClose = true;
                    vm.contract.amountPaidFromResponse = angular.copy(vm.contract.amountPaid);
                    if (vm.contract && vm.contract.amountPaid && vm.contract.amountPaid.amount) {
                        vm.contract.canSign = true;
                        vm.canClose = true;
                    }

                    if (vm.contract.documents != null && vm.contract.documents instanceof Array) {

                        var docs = vm.contract.documents;

                        vm.contract.documents = [];
                        vm.contract.documents = documentsService.sortListOfDocs(docs);

                    }
                    $scope.countries = $localStorage.refs.initialCountriesReference;

                    if (vm.contract.items && vm.contract.items.length) {
                        vm.contract.items.forEach(function (item) {
                            if (item.additionalClassifications && item.additionalClassifications.length) {
                                var countryScheme = item.additionalClassifications.find(function (classification) {
                                    return classification.scheme === 'COO';
                                });

                                if (countryScheme) {
                                    $scope.selectedCountry[item.id] = $scope.countries.find(function (country) {
                                        return country.code === countryScheme.id;
                                    });
                                }
                            }
                        });
                    }

                    $timeout(function () {
                        $scope.signCheck = true;
                    }, 5000);
                });
        };

        getDockType();

        (function () {
            $scope.minContrEndDate = new Date();

            if ($scope.minContrEndDate.getDate() === 1) {
                $scope.minContrEndDate.setDate($scope.minContrEndDate.getMonth() - 1);
            }
            $scope.minContrEndDate.setDate($scope.minContrEndDate.getDate() - 1);
        })();

        $scope.reloadDocuments = function () {
            abp.ui.setBusy();
            var getContracting = contractingAppService.get($stateParams.id);
            getContracting.then(function (reponse) {
                vm.contract.documents = reponse.data.documents;
                if (vm.contract.documents != null && vm.contract.documents instanceof Array) {

                    var docs = vm.contract.documents;

                    vm.contract.documents = [];
                    vm.contract.documents = documentsService.sortListOfDocs(docs);

                }
                abp.ui.clearBusy();
            });
        };
        
        $scope.changeDoc = function (document) {
            $scope.documentChanged = document;
            _($scope.documents).each(function (doc) {
                doc.ch = false;
            });
            document.ch = true;
        };

        if ($location.$$url.indexOf('contractingClose') !== -1) {
            $scope.activate();
        }

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.compareContractingAmount = function () {
            if (vm.contract.amountPaidFromResponse
                && vm.contract.amountPaidFromResponse.amount === vm.contract.amountPaid.amount
                && vm.contract.amountPaidFromResponse.amountNet === vm.contract.amountPaid.amountNet) {
                return true;
            }
            return false;
        }


        $scope.$watch('vm.contract', function (contract) {
            if (contract && contract.documents) {
                var signDocuments = contract.documents.filter(function (doc) {
                    return doc.title === 'sign.p7s';
                });
                signDocuments.sort(function (first, second) {
                    return new Date(second.dateModified) - new Date(first.dateModified);
                });
                if (signDocuments[0]) {
                    var signDocDateModified = new Date(signDocuments[0].dateModified);
                }
                var contractDateModified = new Date(contract.dateModified);

                contract.isSignedAfterChecking = signDocDateModified > contractDateModified;
            }
        }, true);
    };
})();

;
(function () {

    var controllerId = 'contractsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        'abp.services.etender.contract',
        'abp.services.etender.settings',
        'Upload',
        '$stateParams',
        'documentsService',
        '$localStorage',
        'loadTypesAndConfident',
        'tenderHelperService',
        '$timeout',
        'goToTenderService',
        'uploadFileService',
        function (
            $scope,
            $location,
            contract,
            settings,
            Upload,
            $stateParams,
            documentsService,
            $localStorage,
            loadTypesAndConfident,
            tenderHelperService,
            $timeout,
            goToTenderService,
            uploadFileService) {

            $scope.ng_localStorage = $localStorage;
            $scope.description = '';
            $scope.vm = {};
            $scope.contract = {
                period: {
                    startDate: null,
                    endDate: null
                }
            };

            $scope.showSignModalContract = function (contractObj) {
                $scope.entityType = 'contract';
                contractObj.type = $scope.entityType;
                $scope.myContract = contractObj;
                $scope.entityOutOfTender = $scope.myContract.entityOutOfTender;
                $('#modalSignNew').modal('toggle');
            };

            $scope.$on('contractSigned', function (evt) {
                $scope.reloadDocuments();
            });

            $scope.$on('onPersonSignDataErrorModalOpen', function () {
                $timeout(function () {
                    $('#personSignDataErrorModal').modal('show');
                }, 1000);
            });

            $scope.getSameData = function (date) {
                return Date.parse(date);
            };

            $scope.isRequiredNumber = $scope.ng_localStorage.isRequiredContractNumber;
            $scope.isComplaining = false;  //parametr shows, if complaint period is not finished. If not, we should show warning and block sign button
            var getContractDto = {
                awardId: $stateParams.tId
            };

            $scope.doctype = 'ContractDocument';
            $scope.selectedDocType = null;

            (function () {
                $scope.minContrEndDate = new Date();

                if ($scope.minContrEndDate.getDate() === 1) {
                    $scope.minContrEndDate.setDate($scope.minContrEndDate.getMonth() - 1);
                }
                $scope.minContrEndDate.setDate($scope.minContrEndDate.getDate() - 1);
            })();

            function getDockType() {
                loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                    $scope.documentTypes = documentTypes.contractDocument;
                });
            }
            getDockType();

            $scope.status = '';
            var setContractDescriptionByStatus = function () {
                switch ($scope.contract.status) {
                    case ('active'): { $scope.status = 'Договір опубліковано'; break; }
                    case ('pending'): { $scope.status = 'Договір не опубліковано'; break; }
                }
            };

            function checkDates(endDate) {
                var dateToDay = Date.parse(new Date());
                var complPeriodEnd = Date.parse(endDate);
                return dateToDay >= complPeriodEnd;
            }

            $scope.SetStandStillValue = function (data) {
                //return $scope.isProductionMode && data.isBelowThreshold ? data.awardDate.getTime() > Date.now() : false;
                return $scope.isProductionMode && data.isBelowThreshold ? Date.parse(data.awardDate) > Date.now() : false;
            };

            $scope.SetComplainingValue = function () {
                return true;
            };

            $scope.reload = function () {
                abp.ui.setBusy();
                var getContract = contract.getContract(getContractDto);

                getContract.then(function (response) {
                    var data = response.data;
                    if (data.period && data.period.startDate) {
                        data.period.endDate = new Date(data.period.endDate);
                        data.period.startDate = new Date(data.period.startDate);
                        var minutsEndDate = data.period.endDate.getHours();
                        data.period.startDate.setHours(minutsEndDate);
                    }

                    $scope.contract = data;

                    $scope.contract.needVat = tenderHelperService.needVat(data) || $scope.contract.procurementMethodType === 'esco';
                    if ($scope.contract.needVat) setValueAmounts(data);
                    $timeout(function () {
                        $scope.contract.valueCanEdit = true;
                    }, 2000);
                    $timeout(function () {
                        $scope.signCheck = true;
                    }, 3000);

                    var awardDate = new Date(data.awardDate);
                    awardDate.setDate(awardDate.getDate() + 2);
                    var maxDateSigned = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());
                    //maxDateSigned.setDate(maxDateSigned.getDate() - 1);
                    $scope.maxDateSigned = maxDateSigned;
                    $scope.isProductionMode = $scope.ng_localStorage.isProdMode;
                    //$scope.minDateSigned = $scope.isProductionMode && data.isBelowThreshold ? awardDate : new Date(data.awardDate);
                    $scope.isStandStill = $scope.SetStandStillValue(data);
                    
                    if (data.procurementMethodType == 'priceQuotation') {
                        var minDateSigned = new Date(data.awardDate);
                        minDateSigned = moment(minDateSigned).add('-1', 'd').toDate()
                        $scope.minDateSigned = minDateSigned;
                    } else {
                        $scope.minDateSigned = moment(data.isBelowThreshold ? awardDate : new Date(data.awardDate)).add(-14, 'day').toDate();
                    }
                    
                    console.log('Contracts: ', data);

                    abp.ui.clearBusy();
                    if (data.complaintPeriod && !(data.procurementMethodType === 'reporting' || data.procurementMethodType === 'closeFrameworkAgreementSelectionUA')) {
                        $scope.canUploadDocs = checkDates(data.complaintPeriod.endDate);
                    } else if (data.procurementMethodType === 'reporting' || data.procurementMethodType === 'closeFrameworkAgreementSelectionUA') {
                        $scope.canUploadDocs = true;
                    } else if (!data.complaintPeriod) {
                        $scope.canUploadDocs = true;
                    }
                    var getDt = settings.getDateAndTime();
                    getDt.then(function (reponse) {
                        var serverTime = Date.parse(reponse.data);
                        if ($scope.contract.complaintPeriod && $scope.contract.complaintPeriod.endDate) {
                            var complaintEndDate = Date.parse($scope.contract.complaintPeriod.endDate);
                            if (complaintEndDate > serverTime)
                                $scope.isComplaining = $scope.SetComplainingValue();

                            if (new Date(complaintEndDate).getFullYear() === (new Date()).getFullYear() - 1) $scope.minContrEndDate = new Date(complaintEndDate);
                        }
                    });

                    setContractDescriptionByStatus();

                    if ($scope.contract.documents != null && $scope.contract.documents instanceof Array) {

                        var docs = $scope.contract.documents;

                        $scope.contract.documents = [];
                        $scope.contract.documents = documentsService.sortListOfDocs(docs);

                    }
                });
            };

            var procurementMethods = [
                'belowThreshold', 'aboveThresholdUA', 
                'aboveThresholdEU', 'competitiveDialogueUA.stage2', 
                'competitiveDialogueEU.stage2', 'reporting', 
                'negotiation', 'negotiation.quick', 
                'priceQuotation', 'closeFrameworkAgreementSelectionUA', 'simple.defense'
            ]
            $scope.validatePricePerUnitField = function (contractProcMethod) {
                var valid = false;

                if (procurementMethods.indexOf(contractProcMethod) !== -1) {
                    valid = true;
                }

                return valid;
            }

            $scope.$watch('contract.isSigned', function (data) {
                if ($scope.contract.awardId == '2217167a37a045de9c67cb637be6877b') {
                    $scope.contract.isSigned = true;
                }
            })

            function setValueAmounts(contract) {
                //if (contract.tenderValueTaxIncluded && contract.value.valueAddedTaxIncluded) {
                //    contract.value.amountNet = contract.awardAmmount / 1.2;
                //    contract.value.amount = contract.awardAmmount;
                //} else if (!contract.tenderValueTaxIncluded && contract.value.valueAddedTaxIncluded) {
                //    contract.value.amountNet = contract.awardAmmount;
                //    contract.value.amount = contract.awardAmmount * 1.2;
                //} else

                if (contract.procurementMethodType === 'esco') { // Esco
                    if (!contract.value.amountNet) {
                        contract.value.amountNet = contract.awardAmmount / 1.2;
                    }
                } else { // Dafualt
                    if (!contract.value.valueAddedTaxIncluded && !contract.value.amountNet) {
                        contract.value.amount = contract.awardAmmount;
                        contract.value.amountNet = contract.awardAmmount;
                    }
                }
            }

            $scope.changeValueAddedTaxIncluded = function (contract) {
                if (contract.procurementMethodType === 'esco') {  // Esco
                    return;
                } else { // Dafualt
                    if (!contract.value.valueAddedTaxIncluded && contract.value.amount) {
                        contract.value.amount = contract.awardAmmount;
                        contract.value.amountNet = contract.awardAmmount;
                    } else setValueAmounts(contract);
                }
            };

            $scope.changeValueAmoun = function (contract) {
                if (contract.procurementMethodType === 'esco') {  // Esco
                    return;
                } else {  // Dafualt
                    if ($scope.contract.valueCanEdit && !contract.value.valueAddedTaxIncluded)
                        contract.value.amountNet = contract.value.amount;
                }
            };

            $scope.changeValueAmountNet = function (contract) {
                if (contract.procurementMethodType === 'esco') {   // Esco
                    return;
                } else {  // Dafualt
                    if ($scope.contract.valueCanEdit && !contract.value.valueAddedTaxIncluded)
                        contract.value.amount = contract.value.amountNet;
                }
            };

            $scope.reloadDocuments = function () {
                abp.ui.setBusy();
                var getContract = contract.getContract(getContractDto);
                getContract.then(function (reponse) {
                    $scope.contract.documents = reponse.data.documents;
                    if ($scope.contract.documents != null && $scope.contract.documents instanceof Array) {

                        var docs = $scope.contract.documents;

                        $scope.contract.documents = [];
                        $scope.contract.documents = documentsService.sortListOfDocs(docs);

                    }
                    abp.ui.clearBusy();
                });
            };
            $scope.reload();

            // ???
            $scope.$watch('documentsToUpdate', function (files) {
                //$scope.formUpload = false;
                if (files != null) {
                    for (var i = 0; i < files.length; i++) {
                        $scope.errorMsg = null;
                        (function (file) {
                            $scope.update(file);
                        })(files[i], i);
                    }
                }
            });


            // todo - there are few the same methods!
            $scope.getContractStatusName = function (statusId) {
                if (statusId >= 0 && statusId <= 4) {


                    var contractStatuses = [
                        "Договір поки що не опубліковано", // pending - Цей договір запропоновано, але він ще не діє. Можливо очікується його підписання
                        "Договір опубліковано", //active - Цей договір підписаний всіма учасниками, і зараз діє на законних підставах
                        "Цей договір було скасовано до підписання",
                        "Цей договір був підписаний та діяв, але вже завершився. Це може бути пов’язано з виконанням договору, або з достроковим припиненням через якусь незавершеність",
                        "Невідомо"
                    ];
                    return contractStatuses[statusId];
                }
            };

            $scope.fileUploadObj = { tenderId: "", documentId: "", contractId: "" };

            $scope.save = function () {         
                var summ = 0.0;
                if ($scope.validatePricePerUnitField($scope.contract.procurementMethodType)) {
                    $scope.contract.unitPrices.forEach(function (unitPrice) {
                        if (unitPrice.amount) {
                            unitPrice.amount = Number(unitPrice.amount.toString().replace(/\s/g, ''));
                        }
                        var amount = (isNaN(unitPrice.amount) || !unitPrice.amount) ? 0 : parseFloat(unitPrice.amount);
                        if (unitPrice.itemQuantity) {
                            amount = Number((amount * unitPrice.itemQuantity).toFixed(5));
                        }
                        summ += amount;
                    });
                }
                
                if (Number((summ).toFixed(2)) > $scope.contract.value.amount) {
                    abp.notify.error('Сума за одиниці товару перевищує суму договору');
                    return null;
                }

                var uiUnitPrices = angular.copy($scope.contract.unitPrices);

                var updateContractInput = {
                    id: $scope.contract.id,
                    dateSigned: new Date($scope.contract.dateSigned),
                    description: $scope.contract.description,
                    number: $scope.contract.number,
                    period: {
                        startDate: $scope.contract.period.startDate,
                        endDate: $scope.contract.period.endDate
                    },
                    value: $scope.contract.value,
                    unitPrices: uiUnitPrices
                };

                if ($scope.contract.status != 0) {
                    updateContractInput.unitPrices = updateContractInput.unitPrices.filter(function (unit, index) {
                        return unit.amount;
                    });
                }

                var indexesToRemove = [];
                updateContractInput.unitPrices.forEach(function (item, index) {
                    if ((!item.amount && item.amount === null) && item.itemQuantity != 0) {
                        indexesToRemove.push(index);
                    }
                });

                indexesToRemove.forEach(function (indexToRemove, i) {
                    updateContractInput.unitPrices.splice(indexToRemove, 1);
                    for (var k = i+1; k < indexesToRemove.length; k++) {
                        indexesToRemove[k] -= 1;
                    }
                });

                var updateContract = contract.updateContract(updateContractInput);

                updateContract.then(function () {
                    abp.notify.success("Підтверджено!");
                });
                return updateContract;
            };

            $scope.goToTender = function () {
                goToTenderService.redirect($scope.contract, $scope.contract.tenderId);
            };

            $scope.sign = function () {
                var contractModel = {
                    contractId: $scope.contract.id,
                    description: $scope.contract.description,
                    number: $scope.contract.number
                };

                //var updateContract = contract.signContract(contractModel);

                //updateContract.then(function () {
                //    abp.notify.success("Підтверджено!");
                //    goToTenderService.redirect($scope.contract, $scope.contract.tenderId);
                //});
                return updateContract = contract.signContract(contractModel).then(function () {
                    abp.notify.success("Підтверджено!");
                    goToTenderService.redirect($scope.contract, $scope.contract.tenderId);
                });
            };

            $scope.changeDoc = function (document) {
                $scope.documentChanged = document;
                _($scope.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

            $scope.isSignDocument = function (doc) {
                if (doc.title.endsWith('.p7s')) {
                    return true;
                }
    
                return false;
            }

            $scope.removeDoc = function (index) {
                $scope.documentsToAdd.splice(index, 1);

            };

            $scope.updateDoc = function () {
                var selectedDocTypeId = $scope.selectedDocType != null ? $scope.selectedDocType.id : null;
                $scope.fileUploadObj = { tenderId: $scope.contract.tenderId, documentId: null, contractId: $scope.contract.id };
                $scope.documentsToAddFields = { myObj: $scope.fileUploadObj, "DocumentType": selectedDocTypeId };
            };

            $scope.isAllDocumentsExported = function (documents) {
                //console.log('asdad');
                if ($scope.contract.isReporting) return true;

                if (!documents || !documents.length) return false;

                var hasDocuments = documents.some(function (d) {
                    return d.format !== 'application/pkcs7-signature';
                });

                if (!hasDocuments && !$scope.contract.isBelowThreshold) return false;

                return documents.every(function (doc) {
                    return doc && doc.url;
                });
            };

            $scope.checkDate = function (lastDate, firstDate, element) {
                var isValid = false;
                if (firstDate === undefined || !firstDate) firstDate = (new Date()).toISOString();
                else if (typeof (firstDate) === "object") firstDate = firstDate.toISOString();


                if (lastDate === undefined || !lastDate) lastDate = (new Date()).toISOString();
                else if (typeof (lastDate) === "object") lastDate = lastDate.toISOString();

                (lastDate >= firstDate) ?
                    (isValid = true) :
                    (isValid = false);

                if (element) {
                    element.$setValidity(element.$name, isValid);
                }

                return isValid;
            };

            $scope.checkSignDate = function () {
                /*
                if (!$scope.contract || !$scope.contract.complaintPeriod || !$scope.contract.complaintPeriod.endDate || !$scope.contract.dateSigned) return true;
                if ((new Date($scope.contract.complaintPeriod.endDate) < new Date($scope.contract.dateSigned)) && (new Date() >= new Date($scope.contract.dateSigned)))
                    return true;
                else return false;
                */
                var checkComplaintPeriod = true;
                var checkMinDateSigned = false;
                if ($scope.contract && $scope.contract.dateSigned) {
                    if ($scope.contract.complaintPeriod && $scope.contract.complaintPeriod.endDate) {
                        checkComplaintPeriod = ((new Date($scope.contract.complaintPeriod.endDate) <
                                new Date($scope.contract.dateSigned)) &&
                            (new Date() >= new Date($scope.contract.dateSigned)));
                    }
                    if ($scope.minDateSigned) {
                        var minDateSigned = moment($scope.minDateSigned).add(1, 'd').toDate();
                        checkMinDateSigned = (new Date($scope.contract.dateSigned)).getTime() >= minDateSigned.getTime();
                    }
                    if (new Date($scope.contract.dateSigned).getDate() !== new Date($scope.maxDateSigned).getDate()) {
                        $scope.setLocalTime = null;
                    } else {
                        $scope.setLocalTime = moment().format('HH:mm');
                    }
                    return (checkComplaintPeriod && checkMinDateSigned);
                } else {
                    return true;
                }
            };

            // Documents Prev START

            $scope.previewDoc = function(doc) {
                documentsService.previewDoc(doc, $scope);
            };

            $scope.trustSrc = function(src) {
                return documentsService.trustSrcForDocLoad(src);
            };

            $scope.goToUrl = function(url) {
                window.location = url;
            };

            // Documents Prev END

            $scope.validValueAmountNet = function(contract, formName) {
                if (!contract.value.amount || !contract.value.amountNet) return false;

                if (contract.procurementMethodType === 'esco') { // Esco
                    return validValueAmountsEsco(contract, formName); 
                } else {  // Default
                    return validValueAmountsDefault(contract, formName); 
                }
            };


            // Validation Amounts For Esco
            function validValueAmountsEsco(contract, formName) {
                if (contract.value.valueAddedTaxIncluded) {
                    var count = contract.value.amount / 1.2;
                    count = count.toFixed(2);
                    if (count <= contract.value.amountNet &&
                        contract.value.amountNet < contract.value.amount) {
                        setFormValidity(formName, true);
                        return true;
                    }
                } else {
                    if (contract.value.amountNet === contract.value.amount) {
                        setFormValidity(formName, true);
                        return true;
                    }
                }
                setFormValidity(formName, false);
                return false;
            }


            // Validation Amounts For Default
            function validValueAmountsDefault(contract, formName) {
                if (contract.value.valueAddedTaxIncluded) {     // контракт с ПДВ
                    if (contract.tenderValueTaxIncluded) {      // тендер с ПДВ,  контракт с ПДВ
                        var count = contract.value.amount / 1.2;
                        count = count.toFixed(2);
                        if (count <= contract.value.amountNet &&
                            contract.value.amountNet < contract.value.amount &&
                            contract.value.amount <= contract.awardAmmount) {
                            setFormValidity(formName, true);
                            return true;
                        }
                    } else {      // тендер без ПДВ, контракт с ПДВ
                        var contractValAmountNet = (contract.value.amountNet * 1.2).toFixed(2);
                        if (contract.value.amount <= contractValAmountNet &&
                            contract.value.amountNet <= contract.awardAmmount) {
                            if (contract.value.amount < contract.value.amountNet || contract.value.amount == contract.value.amountNet) {
                                setFormValidity(formName, false);
                                return true;
                            }
                            setFormValidity(formName, true);
                            return true;
                        }
                    }
                } else {       // контракт без ПДВ
                    if (contract.value.amount <= contract.awardAmmount &&
                        contract.value.amountNet <= contract.awardAmmount &&
                        contract.value.amountNet === contract.value.amount) {
                        setFormValidity(formName, true);
                        return true;
                    }
                }
                setFormValidity(formName, false);
                return false;
            }

            function setFormValidity(formName, value) {
                if (formName.valueNet && formName.valueNet.$setValidity) {
                    formName.valueNet.$setValidity("summInvalid", value);
                    formName.value.$setValidity("summInvalid-2", value);
                }
            }

            $scope.$watch('contract.unitPrices', function (unitPrices) {
                $scope.fullPriceForAllUnits = calculateFullAmountPerUnitPrice(unitPrices);
            }, true);
            
            function calculateFullAmountPerUnitPrice (unitPrices) {
                var unitPrice = null;

                angular.forEach(unitPrices, function (unit) {
                    unitPrice += (unit.amount * unit.itemQuantity);
                });

                return parseFloat(unitPrice).toFixed(2);
            }

            $scope.getFullUnitsPriceFormula = function (unitPrices) {
                var summ = '';

                angular.forEach(unitPrices, function (unit, index) {
                    if (index === 0) {
                        summ += '(';
                    }
                    if (unit.amount) {
                        summ += unit.amount + ' * ' + unit.itemQuantity;
                    }
                    if (index !== unitPrices.length - 1 && unitPrices[index + 1].amount) {
                        summ += ' + ';
                    }
                    if (index === unitPrices.length - 1) {
                        summ += ')';
                    }
                });

                return summ;
            }

            $scope.errorIfUnitPriceHigherThanAward = function (unitPrice, awardPrice) {
                $scope.notValid = false;

                if (unitPrice > awardPrice) {
                    $scope.notValid = true;
                }

                return $scope.notValid;
            }

        }]);
})();

;
angular.module('app').controller('editDocumentsWrapperTabController', [
    '$scope',
    '$stateParams',
    '$timeout',
    'goToTenderService',
    function ($scope, $stateParams, $timeout, goToTenderService) {
        $scope.tenderId = $stateParams.tId;
        $scope.entityType = 'tender';
        $scope.detailes = null;
        $scope.isFirstLoading = true;

        $scope.$on('needToSignTenderFromCriterias', function (event, detailes) {
            $scope.detailes = detailes;
        });

        $scope.navigateToTender = function () {
            $scope.$broadcast('onAddDocumentsTabSubmit');
        };

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $('body').on('hide.bs.modal', '#personSignDataErrorModal', function () {
            if (!$scope.isFirstLoading) {
                $timeout(function () {
                    $('#modalSignNewTender').modal('toggle');
                }, 1000);
            }
            $scope.isFirstLoading = false;
        });
    }
])
;
(function () {
    'use strict';
    angular.module('app').controller('notExportedDocumentsCtrl', notExportedDocuments);
    notExportedDocuments.$inject = ['$rootScope', '$scope', 'abp.services.etender.notExportDocument', 'ngTableParams'];
    function notExportedDocuments($rootScope, $scope, document, ngTableParams) {
        $scope.vm = {
            documents: [],
            tenderIdText: '',
            textOfId: '',
            planId: '',
            documentId: '',
            IsSearchable: false,
            withErrorsOnly: true
        };
        var vm = $scope.vm;
        var tableParams = new ngTableParams(
            {
                page: 1,
                count: 10
            },
            {
                counts: [],
                getData: function ($defer, params) {
                    //setSearchFilter();
                    var operationsInput = {
                        maxResultCount: params.count(),
                        skipCount: (params.page() - 1) * params.count(),
                        sorting: 'CreationTime DESC',
                        tenderIdText: vm.tenderIdText,
                        textOfId: vm.textOfId,
                        planId: vm.planId,
                        documentId: vm.documentId,
                        withErrorsOnly: vm.withErrorsOnly,
                        selectedDocTypes : vm.selectedDocTypes
                    };
                    if (vm.IsSearchable) {
                        var documents = document.getNotExportedDocuments(operationsInput);
                        abp.ui.setBusy(".panel-default:first");
                        documents.then(function (reponse) {
                            params.total(reponse.data.totalCount);
                                //console.log(data);
                            vm.documents = reponse.data.items;
                            $defer.resolve(reponse.data.items);
                                abp.ui.clearBusy(".panel-default");
                        },
                        function() {
                                abp.ui.clearBusy(".panel-default");
                            });
                    } else {
                        vm.documents = [];
                    }
                }
            }
        );
        vm.tableParams = tableParams;
        vm.checkedDocTypes = [];
        vm.selectedDocTypes = [];
        vm.exportDocTypes = [];

        vm.changeSearchValues = function () {
            vm.IsSearchable = vm.textOfId != '' || vm.planId != '' || vm.tenderIdText != '' || vm.documentId != '';
        }        
        vm.search = function search() {
            tableParams.reload();
            tableParams.page(1);
        };

        vm.getExportDocTypes = function () {
            if (vm.exportDocTypes == null || vm.exportDocTypes.length == 0) {
                document.getNotExportedDocTypes()
                    .then(function (reponse) {
                        //console.log(data);
                        vm.exportDocTypes = reponse.data;
                        vm.exportDocTypes.forEach(function(item) {
                            vm.checkedDocTypes.push(true);
                            vm.selectedDocTypes.push(item);
                        });
                    },
                    function() {
                        abp.ui.error("ups... something went wrong");
                    });
            }

            //return doctypes;
        };
        vm.getExportDocTypes();

        $scope.changeSelection = function (type, checked) {
            if (!type) {
                vm.selectedDocTypes = [];
                vm.checkedDocTypes = [];
                vm.exportDocTypes = [];
            }
            else {
                if (checked) {
                    vm.selectedDocTypes.push(type);
                }
                else vm.selectedDocTypes.splice(vm.selectedDocTypes.indexOf(type), 1);
            }
        };

        // сбрасываем ошибки чтобы документ экспортировался
        $scope.resetErrorForDocument = function (id, exportDocumentType) {
            //console.log("id, exportDocumentType:", id + "  " + exportDocumentType);
            document.resetErrorForNotExportedDocument({ 'id': id, 'exportDocumentType': exportDocumentType })
            .then(function (reponse) {
                abp.notify.success("Помилки документа '" + reponse.data + "' видалені.");
                //console.log("Помилки документа видалені:", data);
                vm.tableParams.reload();
            },
            function () {
                abp.notify.error(data);
            });
        };

        // сбрасываем ошибки чтобы документ экспортировался
        $scope.deleteDocument = function (id, exportDocumentType) {
            if (confirm("Удалить документ?")) {
                //console.log("id, exportDocumentType:", id + "  " + exportDocumentType);
                document.deleteDocument({ 'id': id, 'exportDocumentType': exportDocumentType })
                    .then(function (reponse) {
                        abp.notify.success("Документ видалено.");
                        vm.tableParams.reload();
                    }, function() {
                        abp.notify.error(data);
                    });
            }
        };

        $scope.clear = function () {
            vm.checkedDocTypes = [];
            vm.selectedDocTypes = [];
            vm.exportDocTypes = [];
            vm.tenderIdText = '';
            vm.textOfId = '';
            vm.planId = '';
            vm.documentId = '';
            vm.documents = [];
            vm.changeSearchValues();
        }
    };
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('eCatalogCtrl', eCatalog);

    eCatalog.$inject = [
        '$scope',
        '$rootScope',
        '$localStorage',
        'abp.services.etender.eCatalog',
        'abp.services.etender.offer',
        'ngTableParams',
        '$http',
        'Upload',
        'classificationSearchService',
        'abp.services.etender.reference',
        'paginationService',
        '$location',
        '$timeout',
        '$window'
    ];
    function eCatalog(
        $scope,
        $rootScope,
        $localStorage,
        eCatalog,
        offers,
        ngTableParams,
        $http,
        Upload,
        classificationSearchService,
        abpReferenceService,
        paginationService,
        $location,
        $timeout,
        $window
    ) {

        $scope.ng_localStorage = $localStorage;
        $scope.vm = {};
        $scope.isGroupsShown = true;

        //Top Menu
        $scope.disableBtn = false;
        $scope.newGroups = [];
        $scope.filterProducts = [];
        $scope.pager = {};
        $scope.productsCount = 0;

        $scope.breadcrumbs = "<a href='ProzorroMarket' class='mr5'>Prozorro Market</a> >"

        //Скачать эксель по всем предложениям
        $scope.getUserExcel = function () {
            $scope.disableBtn = true;
            abp.ui.setBusy('body');
            var userExel = offers.getUserOffersExcel($scope.setFilter);
            userExel.then(function (fileName) {
                $http({
                    url: "api/files/DownloadAndDelete",
                    method: "POST",
                    params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                    responseType: 'arraybuffer'
                }).then(function (response) {
                    var file = new Blob([response.data], { type: 'application/octet-stream' });
                    saveAs(file, fileName.data);
                    setTimeout(function () { $scope.disableBtn = false; }, 2000)
                    abp.ui.clearBusy("body");
                }, function (data, status, headers, config) {
                    setTimeout(function () { $scope.disableBtn = false; }, 2000)
                    abp.ui.clearBusy("body");
                });
            }, function () {
                abp.ui.clearBusy("body");
            });
        };

        $scope.getUserExcelWithFilter = function () {
            if ($scope.selectedCpvs && $scope.selectedCpvs.length) {
                var itemsWithChildren = [];
                $scope.selectedCpvs.forEach(function (cpvItem) {
                    if (!cpvItem.isOpen && cpvItem.rank < 8 && cpvItem.hasChildren) {
                        itemsWithChildren.push(cpvItem);
                    }
                });
                var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);
                classificationData.then(function (response) {
                    $scope.generateFilterCodes(response.data);
                    $scope.getUserExcel();
                });
            } else {
                $scope.setFilter.cpvCodes = [];
                $scope.getUserExcel();
            }
        };

        //Изменить инфо о предложении
        $scope.updateOffersByExel = function () {
            abp.ui.setBusy('body');
        };
        $scope.updateOffersByExelUploaded = function () {
            $scope.tableParams.reload();
            abp.ui.clearBusy("body");
        }

        //Открыть модалку
        $scope.openModalView = function (value, methodForStatusModal) {
            $scope.editFor = value;
            $scope.changeStatusValue = methodForStatusModal;
            $('#editModalView').modal('toggle');
        };

        $('#editModalView').on('hidden.bs.modal', function () {
            $scope.priceOptions.value = 0;
        });

        $scope.$on('onCatalogFilterChanged', function (event, products, needToReloadPager) {
            $scope.isGroupsShown = false;
            $scope.filterProducts = products.result.result;
            $scope.productsCount = products.result.count;
            if (needToReloadPager) {
                $scope.setPage(1, false);
            }
        });
        $scope.$on('clearedFilter', function (evt, categoryId) {
            $scope.userSearch = undefined;
            filter.genericSearchField = undefined;
            filter.cpvCodes = [];
            filter.deliveryRegionIds = [];
            filter.edrpou = undefined;
            filter.minimumSum = undefined;
            filter.productTitle = undefined
            filter.supplierName = undefined;
            filter.maximumSum = undefined;

            if (categoryId != null) {
                filter.categoryId = categoryId;
                filterByProductOffers();
            } else {
                $scope.userSearch = '';
                $scope.isGroupsShown = true;
                if ($scope.selected_ecatalog_search_type === 'groups') {
                    getGroups();
                } else if ($scope.selected_ecatalog_search_type === 'offers') {
                    filterByProductOffers();
                }
                $scope.$broadcast('clearFilterButton');
                $scope.$broadcast('clearedFilterFields');
            }
        });

        //Редактирование цены
        $scope.isPriceValid = false;
        $scope.priceOptions = {
            method: 'exact',
            value: 0
        };
        $scope.$watch('priceOptions.value', function (data) {
            if (data === 0 || !data) {
                $scope.isPriceValid = false;
            } else {
                $scope.isPriceValid = true;
            }
        });

        $scope.changeItem = function (_method, methodForStatusModal) {
            abp.ui.setBusy('body');
            var patchBody = [];
            var selectedDeals = $scope.tableParams.data.result.filter(function (item) {
                return item.Selected == true;
            });

            if (!selectedDeals.length) {
                if (_method == 'deactivate') {
                    toastr.warning('Увага! Спочатку треба обрати пропозиції для деактивації.',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
                } else {
                    toastr.warning('Увага! Спочатку треба обрати пропозиції для редагування.',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
                }
                $('#editModalView').modal('hide');
                abp.ui.clearBusy("body");
                return;
            }

            for (var index = 0; index < selectedDeals.length; index++) {
                patchBody.push({
                    'OfferId': selectedDeals[index].id,
                    'Value': selectedDeals[index].value,
                    'MinOrderValue': selectedDeals[index].minOrderValue,
                    'status': selectedDeals[index].status
                })
            };

            for (var index = 0; index < patchBody.length; index++) {
                if ($scope.priceOptions.value > patchBody[index].MinOrderValue.amount) {
                    toastr.warning('Увага! Введена сума для однієї або більше пропозицій перевищує суму мінімального замовлення.',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
                    abp.ui.clearBusy("body");
                    return false;
                }
            };

            if (_method == 'price') {
                switch ($scope.priceOptions.method) {
                    case 'exact':
                        for (var index = 0; index < patchBody.length; index++) {
                            patchBody[index].Value.amount = $scope.priceOptions.value;
                        }
                        break;
                    case 'uah':
                        for (var index = 0; index < patchBody.length; index++) {
                            patchBody[index].Value.amount += $scope.priceOptions.value;
                        }
                        break;
                    case 'percent':
                        for (var index = 0; index < patchBody.length; index++) {
                            var getFullAmount = patchBody[index].Value.amount + (patchBody[index].Value.amount * $scope.priceOptions.value / 100);

                            patchBody[index].Value.amount = parseFloat(getFullAmount.toFixed(2));
                        }
                        break;
                    default:
                }

                var updateOffersBulk = offers.updateOffersBulk({
                    IsUpdateContacts: false,
                    PatchData: patchBody,
                });
                updateOffersBulk.then(function (resp) {
                    $scope.tableParams.reload();
                }, function (err) {
                    $scope.tableParams.reload();
                });
            }
            if (_method == 'supplier') {
                var updateOffersBulk = offers.updateOffersBulk({
                    IsUpdateContacts: true,
                    IsUpdateUserContacts: true,
                    PatchData: patchBody,
                });
                updateOffersBulk.then(function (resp) {
                    $scope.tableParams.reload();
                }, function (err) {
                    $scope.tableParams.reload();
                });
            }
            if (_method == 'changeStatus') {
                angular.forEach(patchBody, function (item) {
                    item.status = methodForStatusModal;
                });
                var updateOffersBulk = offers.updateOffersBulk({
                    IsUpdateContacts: false,
                    PatchData: patchBody,
                });
                updateOffersBulk.then(function (resp) {
                    $scope.tableParams.reload();
                }, function (err) {
                    $scope.tableParams.reload();
                });
            }

            $('#editModalView').modal('hide');
            abp.ui.clearBusy("body");
        };
        //End Top Menu

        //Filter
        $scope.isIntervalValid = function (min, max) {
            var from = 0;
            var to = 0;
            if (min && max) {
                from = +min;
                to = +max;
                if (to >= from) return true;
                else return false;
            } else {
                return true;
            }
        }

        $scope.setFilter = {
            titleOrDescription: '',
            minimumSum: null,
            maximumSum: null,
            minimumMinSum: null,
            maximumMinSum: null,
            deliveryRegionIds: [],
            deliveryCity: '',
            statusId: null,
            cpvCodes: [],
        }
        var fillFilter = function (params) {
            return {
                titleOrDescription: $scope.setFilter.titleOrDescription || '',
                minimumSum: $scope.setFilter.minimumSum || null,
                maximumSum: $scope.setFilter.maximumSum || null,
                minimumMinSum: $scope.setFilter.minimumMinSum || null,
                maximumMinSum: $scope.setFilter.maximumMinSum || null,
                deliveryRegionIds: $scope.vm.selectedRegions || [],
                deliveryCity: $scope.setFilter.deliveryCity || '',
                statusId: $scope.setFilter.statusId || null,
                cpvCodes: $scope.setFilter.cpvCodes || [],
                page: params.page(),
                pagesize: params.count()
            }
        }

        //Справочник класификаторов
        $scope.selectedCpvs = [];
        $scope.cleareChildCpv = function (cpvs) {
            classificationSearchService.cleareChildCpv(cpvs, $scope.selectedCpvs);
        };
        $scope.initClassification = function () {
            classificationSearchService.initClassification($scope, $scope.selectedCpvs);
        }

        //Дропдаун статусов
        $scope.statusesFilter = [{ name: 'Всі', id: null }, { name: 'Активний', id: 1 }, { name: 'Деактивований', id: 2 }];
        $scope.selected = $scope.statusesFilter[0];

        $scope.vm = {
            isMarlet: true,
            checkedRegions: []
        }

        $scope.reloadWithFilter = function () {
            $scope.setFilter.deliveryRegionIds = $scope.vm.selectedRegions;
            $scope.setFilter.statusId = $scope.selected.id;
            $scope.showClearFilterButton = true;
            $('#filterModal').modal('hide');
            if ($scope.tableParams) {
                if ($scope.tableParams.page() === 1) {
                    $scope.tableParams.reload();
                }
                if ($scope.tableParams.$params.page === $scope.tableParams.page()) {
                    $scope.tableParams.page(1);
                }
            }
            
        }
        $scope.clearFilter = function (needToSkipReload) {
            $scope.selected = $scope.statusesFilter[0];
            $scope.vm.checkedRegions = $scope.vm.selectedRegionIds = [];
            $scope.vm.selectedRegions = []
            $scope.vm.regionsSearchText = '';
            $scope.$broadcast('clearedFilterFields');
            if ($scope.selectedCpvs.length > 0) {
                $scope.selectedCpvs = [];
            }
            $scope.setFilter = {
                titleOrDescription: '',
                minimumSum: null,
                maximumSum: null,
                minimumMinSum: null,
                maximumMinSum: null,
                deliveryRegionIds: [],
                deliveryCity: '',
                statusId: null,
                cpvCodes: [],
            };

            if (!needToSkipReload) {
                $scope.reloadWithFilter();
            }
            $scope.showClearFilterButton = false;
        }

        function getChildCpvsAndSearchTenders() {

            var itemsWithChildren = [];
            $scope.selectedCpvs.forEach(function (cpvItem) {
                if (!cpvItem.isOpen && cpvItem.rank < 8 && cpvItem.hasChildren) {
                    itemsWithChildren.push(cpvItem);
                }
            });
            var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);
            classificationData.then(function (response) {
                $scope.generateFilterCodes(response.data);
                $scope.reloadWithFilter();
            });
        }

        $scope.generateFilterCodes = function (data) {
            $scope.setFilter.cpvCodes = [];
            if (data && data.length) {
                $scope.setFilter.cpvCodes = data.map(function (cpv) {
                    return cpv.code;
                });
            } else {
                $scope.setFilter.cpvCodes = $scope.selectedCpvs.map(function (cpv) {
                    return cpv.code;
                });
            }
        };

        $scope.search = function () {
            if ($scope.selectedCpvs && $scope.selectedCpvs.length) {
                getChildCpvsAndSearchTenders();
            } else {
                $scope.setFilter.cpvCodes = [];
                $scope.reloadWithFilter();
            }
        }
        //End Filter

        $scope.selected_ecatalog_search_type = 'groups';

        $scope.$watch('selected_ecatalog_search_type', function (selectedType) {
            $scope.clearFilter(false);
            $scope.userSearch = '';
            filter.cpvCodes = [];
            filter.deliveryRegionIds = [];
            $scope.newGroups = [];
            if (selectedType === 'groups') {
                getGroups();
            } else if (selectedType === 'offers') {
                $location.url($location.path());
                $scope.userSearch = '';
                filter.genericSearchField = '';
                filterByProductOffers();
            }
        });

        $scope.isCurrentOrganizationVIP = function () {
            return [
                '41922095', // test user
                '42264086',
                '41860186',
                '23702466',
                '37167117',
                '30343947',
                '41269240',
                '30343947',
                '41269240',
                '36519759',
                '41925714'
            ].some(function (code) {
                return $localStorage.codeOfOrganization === code;
            });
        };

        //my Deals
        $scope.id = 'market';
        var firstMyDealsRequestRun = true;
        $scope.tHeadTitles = [{ name: 'Категорія' }, { name: 'Профіль' }, { name: 'Продукт' }, { name: 'Пропозиція'}]
        $scope.changeView = function (id) {
            $scope.clearFilter(true);
            $scope.$broadcast('clearFilterButton', true);

            $scope.$broadcast('onCatalogTabChanged');
            $scope.id = id;
            
            $location.url($location.path());

            if ($scope.id == 'market' && firstMyDealsRequestRun) {
                $scope.selected_ecatalog_search_type = 'groups';
                $scope.isGroupsShown = true;
                $scope.userSearch = '';
                $scope.$broadcast('onMarketTabClicked');
            }
            if ($scope.id == 'market') {
                $scope.searchResult();
            }
            if ($scope.id == 'myDeals' && firstMyDealsRequestRun) {
                getOffersByOrganizationHierarchy();
            }
            if ($scope.id == 'frameworksList') {
                $scope.firstFrameworkListRequestRun = true;
            }
            if ($scope.id == 'myOrders') {
                $scope.firstMyOrdersRequestRun = true;
            }
        };

        if (window.location.href.indexOf('page') > -1) {
            $scope.changeView('frameworksList')
        }

        function getOffersByOrganizationHierarchy() {
            if ($localStorage.isAuthorized) {
                $scope.tableParams = new ngTableParams({
                    page: 1,
                    count: 10
                }, {
                    getData: function ($defer, params) {
                        var filter = fillFilter(params)

                        abp.ui.setBusy();
                        var getAllUserOffers = offers.getOffersByOrganizationHierarchy(filter);
                        getAllUserOffers.then(function (resp) {
                            params.total(resp.data.count);
                            $defer.resolve(resp.data);
                        }).finally(function () {
                            abp.ui.clearBusy();
                        });
                    }
                });
                $scope.tableParams.settings().$scope = $scope;
            }
        }
        //End my Deals

        // Get Groups From Server
        function getGroups(checked) {
            if (checked == null || typeof checked == 'object') {
                checked = false;
            }
            abp.ui.setBusy();
            eCatalog.getGroups(checked).then(function (response) {
                $scope.groups = response.data;
                $scope.isGroupsShown = true;
                $scope.newGroups = angular.copy($scope.groups);
                abp.ui.clearBusy();
            },function (errorResponse) {
                    abp.ui.clearBusy();
            });
        }

         $scope.setPage = function (page, needToReload) {
            // get pager object from service
            $scope.pager = paginationService.getPager($scope.productsCount, page, 12);

            if (needToReload) {
                $scope.$broadcast('newProductPageChanged', page);
            }
        };

        $scope.filterGetGroups = function (isChecked) {
            getGroups(isChecked);
        };

        var filter = { //глобальный фильтр для эвентов с новыми полями
            genericSearchField: $scope.userSearch,
            page: $scope.pager.page || 1,
            pageSize: 12
        };
        $scope.$watch('userSearch', function (data) { //вотчер на ввод значения в поле поиска
            filter.genericSearchField = data;
        });

        function saveSearchStringToUrl() {
            if (!$scope.userSearch.length || $scope.selected_ecatalog_search_type === 'offers') return $location.url($location.path());
            $location.search('search', $scope.userSearch);
        }

        $scope.$watch(function () {
            return $location.search().search
        }, function (queryParam) {
            if (queryParam) {
                $scope.userSearch = queryParam;
                $timeout(function () {
                    $scope.searchResult();
                }, 1000);
            }
        });

        $scope.searchResult = function (event) {
            if ($scope.userSearch) {
                $scope.newGroups = [];
                $scope.groups.forEach(function (row) {
                    var description = row.description && row.description.toLowerCase() || '';
                    var cpvCode = row.cpvCode && row.cpvCode.toLowerCase() || '';
                    var userSearch = $scope.userSearch && $scope.userSearch.toLowerCase() || '';
                    if (!!(description.indexOf(userSearch || '') !== -1) || !!(cpvCode.indexOf(userSearch || '') !== -1)) {
                        $scope.newGroups.push(row);
                    } else {
                        var newRow = {
                            categories: [],
                            cpvCode: row.cpvCode,
                            description: ''
                        }
                        row.categories.forEach(function (category) {
                            var title = category.title && category.title.toLowerCase() || '';
                            var classificationScheme = category.classification && category.classification.id
                                && category.classification.id.toLowerCase() || '';
                            if (!!(title.indexOf(userSearch || '') !== -1) || !!(classificationScheme.indexOf(userSearch || '') !== -1)) {
                                newRow.categories.push(category);
                            }
                        });
                        if (newRow.categories.length) {
                            $scope.newGroups.push(newRow);
                        }
                    }
                });
            } else {
                $scope.newGroups = angular.copy($scope.groups)
            }
            saveSearchStringToUrl();
        };
        $scope.searchByEvent = function (event) {
            $scope._GENERIC_FIELD_SEARCH_searchResult(event);
        }

        function filterByProductOffers () {
            var url = '/api/services/etender/offer/getProductOffersByFilter';
            abp.ui.setBusy();

            $http({
                method: 'GET',
                url: url,
                params: filter
            }).then(function (response) {
                $scope.isGroupsShown = false;
                $scope.filterProducts = response.data.result.result;
                $scope.productsCount = response.data.result.count;
                $scope.setPage(1, false);
            }).finally(function () { abp.ui.clearBusy(); });
        }

        // Search Result For Search Input
        $scope._GENERIC_FIELD_SEARCH_searchResult = function (event) {
            if (event.which === 13 || event.keyCode === 13) {
                $scope.$broadcast('genericFieldSearchEvent'); //если нажат Энтер с клавиатуры в поле поиска по названии
                $scope.$broadcast('clearFilterButton', true);
                setTimeout(function () {
                    filterByProductOffers();
                }, 200);
            }
        }

        $scope.$watch(function () {
            return angular.element('#parent_container_groupShownFalse').is(':visible')
        }, function (element) {
            if (element && !!window.MSInputMethodContext && !!document.documentMode) {
                document.getElementById('parent_container_groupShownFalse').style.display = 'block'
            }
        });

        $scope.$on('passFilterToGenericFieldEvent', function (evt, filterValues) {
            for (var key in filterValues) { //получить новые поля для фильтра и сконкатенировать их в наш фильтр
                if (filterValues.hasOwnProperty(key) && (key !== 'genericSearchField' && key !== 'deliveryRegionIds' && key !== 'cpvCodes')) {
                    filter[key] = filterValues[key];
                }
            }
            if (filterValues.cpvCodes && filterValues.cpvCodes.length && Array.isArray(filterValues.cpvCodes)) {
                filter.cpvCodes = filterValues.cpvCodes.join(';');
            } else delete filter.cpvCodes;

            if (filterValues.deliveryRegionIds && filterValues.deliveryRegionIds.length && Array.isArray(filterValues.deliveryRegionIds)) {
                filter.deliveryRegionIds = filterValues.deliveryRegionIds.join(';');
            } else delete filter.deliveryRegionIds;
        });
        $scope.$on('groupValuesForRequest', function (evt, groupValue) {
            filter.requirements = groupValue;
        });

        $scope.$on('clearMarketValues', function (evt) {
            $scope.changeView('market');
            $scope.selected_ecatalog_search_type = 'groups';
        });

        // getGroups();
        $scope.LazyLoadImages = function() {
            var observer = lozad(); // lazy loads elements with default selector as '.lozad'
            observer.observe();
        }
    }
})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('eCatalogCartCtrl', eCatalogCart);

    eCatalogCart.$inject = [
        '$scope',
        '$localStorage',
        'tenderHelperService',
        'abp.services.etender.tender',
        'goToTenderService',
        'eCatalogService',
        'requestService',
        'abp.services.etender.address',
        'abp.services.etender.offer',
        '$timeout',
        '$location',
        'abp.services.etender.getTender'
    ];
    function eCatalogCart(
        $scope,
        $localStorage,
        tenderHelperService,
        createTender,
        goToTenderService,
        eCatalogService,
        requestService,
        addressService,
        offerService,
        $timeout,
        $location,
        getTender)
    {
        $scope.ng_localStorage = $localStorage;
        console.log('Cart: ', $localStorage.eCatalogCart);

        var queryParams = $location.search();
        var suppliers = $scope.ng_localStorage.eCatalogCart ? $scope.ng_localStorage.eCatalogCart.suppliers : undefined;

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage.eCatalogCart ? $scope.ng_localStorage.eCatalogCart.productValue = 0 : undefined;
        $scope.ng_localStorage.eCatalogCart ? $scope.ng_localStorage.eCatalogCart.productsQuantity = 0 : undefined;
        $scope.getTenderCounter = 0;

        $scope.vm = {};

        $scope.$watch(function () {
            return $localStorage.eCatalogCart && $localStorage.eCatalogCart.productValue;
        }, function (productValue) {
            if (productValue) {
                $localStorage.eCatalogCart.productValue = Number((Math.round(productValue * 100) / 100).toFixed(2));
            }
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        if (suppliers && suppliers.length) {
            for (var i = 0; i < suppliers.length; i++) {
                var value = 0;
                var quantity = 0;
                if (suppliers[i].PlanIds) {
                    suppliers[i].PlanIds = [];
                }
                for (var j = 0; j < suppliers[i].products.length; j++) {
                    if (suppliers[i].products[j].value < 1 || suppliers[i].products[j].quantity < 1) {
                        suppliers[i].products[j].value = suppliers[i].products[j].offerData.value.amount;
                        suppliers[i].products[j].quantity = 1;
                    }
                    value += suppliers[i].products[j].value;
                    quantity += suppliers[i].products[j].quantity;
                }
                suppliers[i].allProductsValue = value;
                suppliers[i].allProductsQuantity = quantity;
                $scope.ng_localStorage.eCatalogCart.productValue += value;
                $scope.ng_localStorage.eCatalogCart.productsQuantity += quantity;
            }
        }

        // Plus 1 Quantity And Value
        $scope.plusQuantity = function (product, supplierIndex) {
            product.quantity += 1;
            product.value += product.offerData.value.amount;
            $localStorage.eCatalogCart.productsQuantity += 1;
            $localStorage.eCatalogCart.productValue += product.offerData.value.amount;
            $localStorage.eCatalogCart.suppliers[supplierIndex].productsValue += product.offerData.value.amount;
            $scope.setPrdctsValueAndQuantityInSupplier($localStorage.eCatalogCart.suppliers[supplierIndex]);
        };

        // Minus 1 Quantity And Value
        $scope.minusQuantity = function (product, supplierIndex) {
            if (product.quantity === 0) return;
            product.quantity -= 1;
            product.value -= product.offerData.value.amount;
            $localStorage.eCatalogCart.productsQuantity -= 1;
            $localStorage.eCatalogCart.productValue -= product.offerData.value.amount;
            $localStorage.eCatalogCart.suppliers[supplierIndex].productsValue -= product.offerData.value.amount;
            $scope.setPrdctsValueAndQuantityInSupplier($localStorage.eCatalogCart.suppliers[supplierIndex]);
        };

        //$scope.plusDelivery = function (product) {
        //    product.delivery += 1;
        //}

        //$scope.minusDelivery = function (product) {
        //    if (product.delivery !== 1)
        //        product.delivery -= 1;
        //}

        $scope.setDeliveryData = function (product) {
            // setDefultChooseDeliveryAddress(product);
            if (!product.deliveryDate) {
                product.deliveryDate = {
                    startDate: setDeliveryDate(2),
                    endDate: setDeliveryDate(14)
                } ;
            }
        };

        $scope.setItemValueAndPrice = function (product) {
            product.quantity = product.quantity || 1;
            product.value = product.value || product.offerData.value.amount;
        };

        function setDefultChooseDeliveryAddress (product) {
            if (product.offerData.deliveryAddresses.length > 0)
                product.chooseThisAddres = product.offerData.deliveryAddresses[0];
        }

        function setDeliveryDate(daysFromNow) {
            var toDay = new Date();
            return new Date(toDay.getTime() + daysFromNow * 24 * 60 * 60 * 1000);
        }

        $scope.changeProductValue = function (product, supplierIndex) {
            product.value = product.offerData.value.amount * product.quantity;
            $scope.setPrdctsValueAndQuantityInSupplier($localStorage.eCatalogCart.suppliers[supplierIndex]);
            recountDataInCart();
        };

        function recountDataInCart() {
            $localStorage.eCatalogCart.productValue = setProductValueInCart();
            $localStorage.eCatalogCart.productsQuantity = setProductsQuantityInCart();
        }

        function setProductValueInCart() {
            var value = 0;
            var i = 0;
            var len = $localStorage.eCatalogCart.suppliers.length;
            for (i; i < len; i++) {
                value += $localStorage.eCatalogCart.suppliers[i].allProductsValue;
            }
            return value;
        }

        function setProductsQuantityInCart() {
            var quantity = 0;
            var i = 0;
            var len = $localStorage.eCatalogCart.suppliers.length;
            for (i; i < len; i++) {
                quantity += $localStorage.eCatalogCart.suppliers[i].allProductsQuantity;
            }
            return quantity;
        }

        $scope.deleteProduct = function (product, index, supplier) {
            $localStorage.eCatalogCart.productsQuantity -= product.quantity;
            $localStorage.eCatalogCart.productValue -= product.value;
            product.value = 0;
            product.quantity = 0;
            supplier.products.splice(index, 1);
            $scope.setPrdctsValueAndQuantityInSupplier(supplier);
        };

        // Count Summ in Supplier UAH
        $scope.setPrdctsValueAndQuantityInSupplier = function (supplier) {
            var value = 0;
            var quantity = 0;
            var i = 0;
            var len = supplier.products.length;
            for (i; i < len; i++) {
                value += supplier.products[i].value;
                quantity += supplier.products[i].quantity || 1;
            }
            supplier.allProductsValue = value;
            supplier.allProductsQuantity = quantity;
        };

        $scope.clearDraft = function (supplier) {
            clearOfferFromList(supplier);
            clearCountsFromCart(supplier);
            if ($localStorage.eCatalogCart.suppliers.length === 0)
                parent.history.back();
        };

        function CreateTenderFromModel(model, supplier) {
            var offers = [];
            for (var index in model.tenderOffers) {
                offers.push(model.tenderOffers[index].offerId);
            }
            var anyOffersDeactivated = offerService.getOffersThatHaveBeenDeactivated(offers);

            for (var lot = 0; lot < model.lots.length; lot++) {
                for (let item = 0; item < model.lots[lot].items.length; item++) {
                    if (model.lots[lot].items[item].deliveryAddress.city && model.lots[lot].items[item].deliveryAddress.city.title === 'Відповідно до документації') {
                        model.lots[lot].items[item].deliveryAddress.city.title = '';
                    }
                }
            }

            anyOffersDeactivated.then(function (response) {
                if (response.data.length) {
                    response.data.forEach(function (offerId) {
                        var product = supplier.products.find(function (p) { return p.offerId === offerId; });
                        if (product) {
                            var productIndex = supplier.products.indexOf(product);
                            $scope.deleteProduct(product, productIndex, supplier);
                        }
                    });
                    toastr.warning('Одну або декілька пропозицій було деактивовано, перевірте пропозиції додані до кошику!',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
                    abp.ui.clearBusy();
                    return false;
                } else {
                    createTender.createTenderProzorro(model)
                        .then(function (response) {
                            clearOfferFromList(supplier);
                            clearCountsFromCart(supplier);
                            var url = goToTenderService.setTenderUrl(response.data, response.data.id);
                            abp.notify.success(
                                "<a class='a-in-notify' href='" + url + "'>Закупівля без використання електронної системи доступна за посиланням</a>",
                                "<a class='a-in-notify' href='" + url + "'>Звіт створено!</a>",
                                true);
                            checkIfCartEmpty();
                            abp.ui.clearBusy();
                            $scope.dataToRedirect = response.data;
                            if ($scope.skipSign) {
                                goToTenderService.redirect($scope.dataToRedirect, $scope.dataToRedirect.id);
                            } else {
                                getTenderInfoRequest($scope.dataToRedirect.id);
                            }
                        }, function (err) {
                            console.log(err.data);
                            abp.ui.clearBusy();
                        });
                }
                return true;
            }, function (error) {
                console.log(error);
            });
        }

        function showWrongPricesModal(model, supplier) {
            $('#wrongPrice').modal('show');
            $scope.$watch('isUserAgreeWithPrices', function (data) {
                if (data) {
                    CreateTenderFromModel(model, supplier);
                    $('#wrongPrice').modal('hide');
                    $scope.isUserAgreeWithPrices = false;
                } else {
                    abp.ui.clearBusy();
                }
            });
        }

        // Create Draft (make oder)
        $scope.createDraft = function (supplier) {
            abp.ui.setBusy();

            var model = setObjforCreate(supplier);
            console.log(supplier, model, $scope);

            tenderHelperService.addAdditionalInfo(model);

            var offersWithPrice = [];
            for (var index in supplier.products) {
                offersWithPrice.push({ OfferId: supplier.products[index].offerId, Price: supplier.products[index].offerData.value.amount });
            }

            var wrongPrices = offerService.getOffersWhosePriceHasBeenUpdated(offersWithPrice);

            wrongPrices.then(function (response) {
                if (response.data.length) {
                    response.data.forEach(function (newPriceObj) {
                        var product = supplier.products.find(function (p) { return p.offerId === newPriceObj.offerId; });
                        if (product) {
                            product.offerData.value.amount = newPriceObj.price;
                            product.value = newPriceObj.price * product.quantity;
                        }
                    });
                    $scope.setPrdctsValueAndQuantityInSupplier(supplier);
                    recountDataInCart();
                    model = setObjforCreate(supplier);

                    showWrongPricesModal(model, supplier);
                } else {
                    CreateTenderFromModel(model, supplier);
                }
            }, function (error) {
                console.log(error);
            });
        };

        // Clear Cart If Empty
        function checkIfCartEmpty() {
            if ($scope.ng_localStorage.eCatalogCart.productValue === 0)
                $scope.clearCart();
        }

        // Clear Offer From List After Draft Created
        function clearOfferFromList(supplier) {
            var i = 0;
            var len = $scope.ng_localStorage.eCatalogCart.suppliers.length;
            for (i; i < len; i++) {
                var curentOffer = $scope.ng_localStorage.eCatalogCart.suppliers[i];
                if (curentOffer && curentOffer.supplierId === supplier.supplierId) {
                    $scope.ng_localStorage.eCatalogCart.suppliers.splice(i, 1);
                }
            }
        }

        // Clear Counts From Cart After Draft Created
        function clearCountsFromCart(supplier) {
            var productValue = supplier.allProductsValue;
            var productsQuantity = getProductQuantityToClear(supplier);

            $localStorage.eCatalogCart.productsQuantity -= productsQuantity;
            $localStorage.eCatalogCart.productValue -= productValue;
        }

        function getProductQuantityToClear(supplier) {
            if (supplier.products === undefined || supplier.products.length === 0) return 0;
            var sum = 0;
            var i = 0;
            var len = supplier.products.length;
            for (i; i < len; i++) {
                sum += supplier.products[i].quantity;
            }
            return sum;
        }

        // get Classifiction For Sorting Oder
        function getDataFromClassifiction(supplier) {
            if (!supplier.title) {
                var classificationDescriptions = [];
                supplier.products.forEach(function(item) {
                    if (classificationDescriptions.indexOf(item.productData.classification.description) < 0)
                        classificationDescriptions.push(item.productData.classification.description);
                });
                supplier.title = classificationDescriptions.join('. ');
            }
            return supplier.title;
        }

        // input number bun press - +
        $scope.inputSetings = function (id) {
            setTimeout(function () {
                var number = document.getElementById(id);
                // Listen for input event on numInput.
                number.onkeydown = function (e) {
                    if (!((e.keyCode > 95 && e.keyCode < 106) || 
                        (e.keyCode > 47 && e.keyCode < 58) || 
                        e.keyCode == 8)) {
                        return false;
                    }
                };
            }, 1000);
        };


        // Clear all Data From Cart
        $scope.clearCart = function () {
            delete $localStorage.eCatalogCart;
        }

        $scope.clearCartAndGoBack = function () {
            $scope.clearCart();
            parent.history.back();
        };


        $scope.showSignModal = function () {
            $scope.entityType = 'tender';
            $timeout(function () {
                $('#modalSignNewTender').modal('show');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignNewTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $scope.dataToRedirect.id);
        });

        function getTenderInfoRequest(tenderId) {
            if ($scope.getTenderCounter <= 5) {
                abp.ui.setBusy();
                $timeout(function () {
                    getTender.getTender({ "Id": tenderId }).then(function (response) {
                        $scope.detailes = response.data;
                        if (response.data.apiId) {
                            $scope.getTenderCounter = 0;
                            $scope.showSignModal();
                        } else {
                            $scope.getTenderCounter++;
                            getTenderInfoRequest(response.data.id);
                        }
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                }, 1000);
            } else {
                $scope.getTenderCounter = 0;
                abp.notify.error('Сталася помилка при публікації закупівлі.');
            }
        };

        // count Quantity in draft
        function getAllQuantityForDraft(products) {
            var quantity = 0;
            var i = 0;
            var len = products.length;
            for (i; i < len; i++) {
                quantity = quantity + products[i].quantity;
            }
            return quantity;
        }

        function setUnit(product) {
            if (product.productData.unit)
                return {
                    id: product.productData.unit.id,
                    code: product.productData.unit.code,
                    symbol: product.productData.unit.symbol,
                    name: product.productData.unit.name,
                    symbolUA: product.productData.unit.symbolUA,
                    nameUA: product.productData.unit.nameUA
                }
            else return {
                id: 1100,
                code: "H87",
                symbol: "",
                name: "piece",
                symbolUA: "шт.",
                nameUA: "штуки"
            };

        }

        function setOffers(supplier) {
            var offers = [];
            supplier.products.forEach(function (item) {
                offers.push({
                    offerId: item.offerId,
                    offerApiId: item.offerData.apiId,
                    quantity: item.quantity
                });
            });
            return offers;
        }

        // Set Obj For Create Draft
        function setObjforCreate(supplier) {
            var model = {
                tenderOffers: setOffers(supplier),
                templateType: "tenderDraft",
                description: getDataFromClassifiction(supplier),
                features: [],
                procurementMethod: "limited",
                procurementMethodType: "reporting",
                title: getDataFromClassifiction(supplier),
                organization: {
                    contactPoint: $scope.ng_localStorage.organization.contactPoint
                },
                isMultilots: false,
                value: {
                    currencyId: supplier.products[0].offerData.value.currencyId,
                    valueAddedTaxIncluded: supplier.products[0].offerData.value.valueAddedTaxIncluded
                },
                userId: $localStorage.userId,
                isProdMode: $localStorage.isProdMode,
                mainProcurementCategory: supplier.mainProcurementCategory,
                planIds: supplier.PlanIds,
                lots: setLot(supplier)
            };

            var offerIds = "";
            model.tenderOffers.forEach(function (item) {
                if (offerIds !== "")
                    offerIds += ";";
                offerIds += item.offerApiId;
            });
            model.procurementMethodRationale = "catalogue, offer=" + offerIds;
            return model;
        }

        // Set LOT For Create Draft
        function setLot(supplier) {
            return [
                {
                    title: getDataFromClassifiction(supplier),
                    value: {
                        amount: supplier.allProductsValue,
                        valueAddedTaxIncluded: supplier.products[0].offerData.value.valueAddedTaxIncluded
                    },
                    isFake: true,
                    items: setItems(supplier)
                }
            ];
        }

        $scope.$on('setFormValidity', function (param, obj) {
            if (obj.accordingToDocs) return $scope.invalidForm = true;
            $scope.invalidForm = !obj.regionCheck ? true : false;
        });

        // Set ITEM For Create Draft
        function setItems(supplier) {
            var items = [];
            var i = 0;
            var len = supplier.products.length;
            console.log(supplier);
            for (i; i < len; i++) {
                var productAdditionalProperties = '';
                var product = supplier.products[i];
                if (product.productData && product.productData.additionalProperties && product.productData.additionalProperties) {
                    product.productData.additionalProperties.forEach(function (item) {
                        productAdditionalProperties += item.name + ': ' + item.value + '; ';
                    });
                }
                items.push({
                    additionalClassificationInn: null,
                    additionalClassificationAtc: null,
                    additionalClassifications: product.productData.additionalClassifications && product.productData.additionalClassifications.length > 0 && product.productData.additionalClassifications || [],
                    classification: {
                        id: product.productData.classification.id,
                        code: product.productData.classification.id,
                        description: product.productData.classification.description
                    },
                    deliveryDate: {
                        startDate: product.deliveryDate.startDate,
                        endDate: product.deliveryDate.endDate
                    },
                    description: (product.productData.title || product.productData.productName) + ', '+productAdditionalProperties,
                    features: [],
                    quantity: product.quantity,
                    deliveryAddress: {
                        country: {
                            id: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].country.id || null,
                            title: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].country.title || null
                        },
                        region: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].region && {
                            title: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].region.title || null,
                            countryId: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].region.countryId || null,
                            id: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].region.id || null
                        },
                        city: product.offerData.deliveryAddresses[0] &&  product.offerData.deliveryAddresses[0].city && {
                            title: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].city.title || null,
                            regionId: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].city.regionId || null,
                            id: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].city.id || null
                        },
                        addressStr: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].addressStr || null,
                        postIndex: product.offerData.deliveryAddresses[0] && product.offerData.deliveryAddresses[0].postIndex || null
                    },
                    unit: setUnit(product)
                    //deliveryAddressId: product.chooseThisAddres && product.chooseThisAddres.id || null
                });
            }
            return items;
        }

        // Delivtry Data To Display
        $scope.displayDelivtry = function (data) {
            return eCatalogService.displayDeliveryAdressWithStreet(data);
        };
        $scope.mainProcurementCategories = [];
        $scope.setProcurementCategory = function (supplier) {
            if (!$scope.mainProcurementCategories.length) {
                requestService.getProcurementCategories().then(function (data) {
                    $scope.mainProcurementCategories = data;
                    return countCategoty(supplier);
                });
            } 
            if (supplier.mainProcurementCategory)
                return supplier.mainProcurementCategory.name;
            if ($scope.mainProcurementCategories.length) {
                return countCategoty(supplier);
            }
        }

        function countCategoty(supplier) {
            var classification = Number(supplier.productClassifiId.substring(0, 3));
            if (classification >= 30 && classification <= 449) return getProcCategoryName('goods', supplier);
            if (classification >= 450 && classification <= 454) return getProcCategoryName('works', supplier);
            return getProcCategoryName('services', supplier);
        }

        function getProcCategoryName(value, supplier) {
            var i = 0;
            var len = $scope.mainProcurementCategories.length;
            for (i; i < len; i++) {
                if ($scope.mainProcurementCategories[i].value === value)
                    supplier.mainProcurementCategory = angular.copy($scope.mainProcurementCategories[i]);
                return supplier.mainProcurementCategory.name;
            }
        }

        $scope.changeDeliveryAddress = function (product) {
            product.showEditBlock = !product.showEditBlock;
            /*
            abp.ui.setBusy();
            addressService.getOrCreateAddress(product.chooseThisAddres)
                .then(function (response) {
                    product.chooseThisAddres.id = response.data.address.id;
                    product.showEditBlock = !product.showEditBlock;
                    abp.ui.clearBusy();
                }).catch(function (error) {
                    console.log("rejected with", error);
                    abp.ui.clearBusy();
                });
            */
        };
    }
})();
;
angular.module('app').directive('eCatalogFilter', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('eCatalogFilter from cache'),
        scope: {
            vm: '=',
            genericSearchField: '=',
            categoryId: '='
        },
        controller: [
            '$scope',
            '$rootScope',
            'abp.services.etender.offer',
            'abp.services.etender.reference',
            '$http',
            'abp.services.etender.eCatalog',
            'paginationService',
            function ($scope, $rootScope, offer, abpReferenceService, $http, eCatalog, paginationService) {

                $scope.requirementsTitleWithValues = []
            
                $scope.filter = {};
                if ($scope.categoryId != null) {
                    $scope.filter.categoryId = $scope.categoryId;
                }
                $scope.isFilterVisible = true;
                $scope.currentPage = 1;
                var savedCheckedRegions = angular.copy($scope.vm.checkedRegions);
                $scope.inputModel = '';
                $scope.clearFilterButtonVisibility = false;

                $scope.vm.placeholder = 'Регіон поставки';
                $scope.vm.selectedCpvCodes = [];
                $scope.filter.cpvCodes = [];

                $scope.checkedGroups = {};

                $scope.searchByFilter = function (needToReloadPager) {
                    var url = '/api/services/etender/offer/getProductOffersByFilter';
                    if (window.location.href.indexOf('eCatalogProfiles') !== -1) {
                        $scope.filter.categoryId = /[^/]*$/.exec(window.location.href)[0];
                    }

                    abp.ui.setBusy();

                    if ($scope.vm.selectedRegions.length) {
                        $scope.filter.deliveryRegionIds = $scope.vm.selectedRegions;
                    }

                    if ($scope.genericSearchField) {
                        $scope.filter.genericSearchField = $scope.genericSearchField;
                    } else {
                        delete $scope.filter.genericSearchField;
                    }

                    $scope.filter.page = $scope.currentPage || 1;
                    $scope.filter.pageSize = 12;

                    if (!$scope.filter.minimumSum) {
                        delete $scope.filter.minimumSum;
                    }

                    if (!$scope.filter.maximumSum) {
                        delete $scope.filter.maximumSum;
                    }

                    var requestParams = $scope.filter;
                    if ($scope.filter.deliveryRegionIds && $scope.filter.deliveryRegionIds.length && Array.isArray($scope.filter.deliveryRegionIds)) {
                        requestParams.deliveryRegionIds = $scope.filter.deliveryRegionIds.join(';');
                    } else delete $scope.filter.deliveryRegionIds;
                    
                    if ($scope.filter.cpvCodes && $scope.filter.cpvCodes.length && Array.isArray($scope.filter.cpvCodes)) {
                        requestParams.cpvCodes = $scope.filter.cpvCodes.join(';');
                    } else delete $scope.filter.cpvCodes;

                    $http({
                        method: 'GET',
                        url: url,
                        params: requestParams
                    }).then(function (response) {
                        $scope.$emit('onCatalogFilterChanged', response.data, needToReloadPager);
                        $scope.clearFilterButtonVisibility = true;
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                };
                $scope.$on('filterProfilesByKeyboard', function (evt, filter) {
                    $scope.search(true);
                });

                $scope.isSearchDiasbled = function () {
                    var isEmptyObject = [];
                    if (!Object.values) {
                        isEmptyObject = Object.keys($scope.filter).every(function (property) {
                            return !property;
                        });
                    } else {
                        isEmptyObject = Object.values($scope.filter).every(function (property) {
                            return !property;
                        });
                    }
                     

                    var isStartPriceBigger = false;
                    if (Number($scope.filter.minimumSum) && Number($scope.filter.maximumSum)) {
                        isStartPriceBigger = Number($scope.filter.minimumSum) > Number($scope.filter.maximumSum); 
                    };

                    if (isEmptyObject) {
                        isEmptyObject = !$scope.vm.selectedRegions.length && !$scope.vm.selectedCpvCodes.length && !$scope.genericSearchField;
                    };

                    return isEmptyObject || isStartPriceBigger;
                };

                $scope.$on('genericFieldSearchEvent', function (evt) {
                    if ($scope.vm.selectedRegions.length) {
                        $scope.filter.deliveryRegionIds = $scope.vm.selectedRegions;
                    }
                    if ($scope.vm.selectedCpvCodes && $scope.vm.selectedCpvCodes.length) {
                        getChildCpvsForFilter();
                    } else {
                        delete $scope.filter.cpvCodes;
                        passFilterToGenericFieldIfNotEmpty();
                    }
                });
                function checkIfFilterIsEmpty(filter) {
                    for (var key in filter) {
                        if (filter.hasOwnProperty(key)) {
                            return false;
                        }
                    }
                    return true;
                }
                function passFilterToGenericFieldIfNotEmpty() {
                    if (!checkIfFilterIsEmpty($scope.filter)) {
                        $scope.$emit('passFilterToGenericFieldEvent', $scope.filter);
                    }
                }

                $scope.clearFilter = function () {
                    clearFilterFields();
                    $scope.$emit('clearedFilter', $scope.categoryId);
                    $scope.$broadcast('clearedFilterFields', $scope.categoryId);
                }
                $scope.$on('clearFilterButton', function (evt, state) {
                    $scope.clearFilterButtonVisibility = state || false;
                });
                $scope.filterByKeybordPress = function (event) {
                    if (event.key == 'Enter' || event.keyCode == 13) {
                        $scope.search(true);
                    }
                };

                function clearFilterFields () {
                    for (var key in $scope.filter) {
                        if (!(key == 'page' || key == 'pageSize')) {
                            $scope.filter[key] = undefined;
                        }
                    }
                    $scope.requirementsTitleWithValues = []
                    $scope.vm.regionsSearchText = undefined;
                    $scope.vm.selectedRegions = [];
                    $scope.vm.selectedCpvCodes = [];
                    $scope.filter.cpvCodes = [];
                    $scope.filter.edrpou = undefined;
                    $scope.filter.minimumSum = undefined;
                    $scope.filter.productTitle = undefined
                    $scope.filter.supplierName = undefined;
                    $scope.filter.maximumSum = undefined;
                    $scope.vm.checkedRegions = savedCheckedRegions;
                    $scope.inputModel = undefined;
                    if ($scope.groupedRequirements && $scope.groupedRequirements.length) {
                        $scope.groupedRequirements.forEach(function (group) {
                            $scope.checkedGroups[group.title] = {};
                        });
                    }
                }

                $scope.generateFilterCodes = function (data) {
                    $scope.filter.cpvCodes = [];
                    if (data && data.length) {
                        data.forEach(function (cpv) {
                            $scope.filter.cpvCodes.push(cpv.code);
                        });
                    } else {
                        $scope.vm.selectedCpvCodes.forEach(function (cpv) {
                            $scope.filter.cpvCodes.push(cpv.code);
                        });
                    }

                };

                $scope.switchFilterVisibility = function () {
                    $scope.isFilterVisible = !$scope.isFilterVisible;
                    $rootScope.$broadcast('onFilterCollapseChanged', !$scope.isFilterVisible);
                };

                $scope.search = function (needToReloadPager) {
                    if (needToReloadPager) {
                        $scope.currentPage = 1;
                    }
                    
                    if ($scope.vm.selectedCpvCodes && $scope.vm.selectedCpvCodes.length) {
                        getChildCpvsAndSearchTenders(needToReloadPager);
                    } else {
                        delete $scope.filter.cpvCodes;
                        $scope.searchByFilter(needToReloadPager);
                    }
                }

                $scope.$on('onMarketTabClicked', function () {
                    clearFilterFields();
                });

                $scope.$on('newProductPageChanged', function (event, page) {
                    $scope.currentPage = page;
                    $scope.search(false);
                });

                function getChildCpvsAndSearchTenders(needToReloadPager) {

                    var itemsWithChildren = [];
                    $scope.vm.selectedCpvCodes.forEach(function (cpvItem) {
                        if (!cpvItem.isOpen && cpvItem.rank < 8 && cpvItem.hasChildren) {
                            itemsWithChildren.push(cpvItem);
                        }
                    });
                    var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);
                    classificationData.then(function (response) {
                        $scope.generateFilterCodes(response.data);
                        $scope.searchByFilter(needToReloadPager);
                    });
                }

                function getChildCpvsForFilter() {
                    $scope.filter.cpvCodes = [];
                    var itemsWithChildren = [];
                    console.log($scope.vm.selectedCpvCodes);
                    $scope.vm.selectedCpvCodes.forEach(function (cpvItem) {
                        itemsWithChildren.push(cpvItem);
                    });
                    var classificationData = abpReferenceService.getCpvChildensRef(itemsWithChildren);

                    classificationData.then(function (response) {
                        if (response.data) {
                            response.data.forEach(function (cpv) {
                                $scope.filter.cpvCodes.push(cpv.code);
                            });
                            passFilterToGenericFieldIfNotEmpty();
                        }
                    });
                }

                $scope.getGroupRequirementsByCategoryId = function (id) {
                    eCatalog.getGroupedRequirements(id).then(function (response) {
                        $scope.groupedRequirements = response.data;
                    });
                }
                $scope.$watch('categoryId', function (id) {
                    if (id) {
                        $scope.getGroupRequirementsByCategoryId(id);
                    }
                });

                $scope.concatGroupValuesForRequest = function (title, value) {
                    var indexExistingRequirement = $scope.requirementsTitleWithValues.findIndex(function (requirement){
                        return requirement.title === title;
                    });
                    if (indexExistingRequirement === -1)
                        $scope.requirementsTitleWithValues.push({title: title, values: [value]});
                    else {
                        var requirementsValues = $scope.requirementsTitleWithValues[indexExistingRequirement].values;
                        var valueIndex = requirementsValues.indexOf(value);
                        if(valueIndex === -1)
                            requirementsValues.push(value);
                        else {
                            requirementsValues.splice(valueIndex, 1);
                            if(requirementsValues.length === 0)
                                $scope.requirementsTitleWithValues.splice(indexExistingRequirement, 1);
                        }
                    }
                    fillRequirementsGetParameters();
                }
                
                function fillRequirementsGetParameters(){
                    $scope.filter.requirements = '';
                    if($scope.requirementsTitleWithValues.length !== 0){
                        $scope.requirementsTitleWithValues.forEach(function (requirement){
                            $scope.filter.requirements += requirement.title;
                            $scope.filter.requirements += '|';
                            for (var i = 0; i < requirement.values.length; i++){
                                var value = requirement.values[i];
                                $scope.filter.requirements += value;
                                if(i + 1 === requirement.values.length)
                                    $scope.filter.requirements += ';';
                                else
                                    $scope.filter.requirements += '|';
                            }
                        });
                    }
                }

                $scope.setPage = function (page, needToReload) {
                    // get pager object from service
                    $scope.pager = paginationService.getPager($scope.productOffersCount, page, 12);
        
                    if (needToReload) {
                        $scope.$broadcast('newProductPageChanged', page);
                    }
                };
        }]
    };
}]);
;
angular.module('app').directive('eCatalogNewProducts', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('eCatalogNewProducts from cache'),
        scope: {
            products: '=',
            count: '='
        },
        controller: ['$scope', '$localStorage', '$location', '$rootScope', 'organizationDataService', function ($scope, $localStorage, $location, $rootScope, organizationDataService) {
            $scope.leftOffset = 0; // offset from left side of page
            $scope.margin = 10;
            $scope.windowWidth = window.innerWidth;
            $scope.elementWidth = 220;
            $scope.expandedProductIndex;
            $scope.isFilterCollapsed = false;
            $scope.lastSeletedElement = {
                height: null,
                index: null
            };

            $scope.expandProduct = function (index) {
                $scope.removeExpandedStyles($scope.expandedProductIndex);

                $scope.windowWidth = window.innerWidth;
                if (document.querySelector('#sidebar')) {
                    $scope.leftOffset = document.querySelector('#sidebar').offsetWidth + 16;
                }

                var productElement = document.querySelector('#e-catalog-product-' + index);
                var productAreaElement = document.querySelector('#e-catalog-product-area-' + index);

                var clone = document.querySelector('#e-catalog-product-' + index).cloneNode(true);
                clone.setAttribute('id', 'e-catalog-product-' + index + '-clone');

                var elementXPosition = productElement.getBoundingClientRect().x;
                var newWidth = ($scope.elementWidth * 2) + $scope.margin;
                var newStyles = 'position: absolute; z-index: 100; '


                productAreaElement.setAttribute('style', 'width:' + newWidth + 'px;');

                if (elementXPosition + ($scope.elementWidth * 2) + $scope.margin > $scope.windowWidth) {
                    var newPosition = elementXPosition - $scope.elementWidth - $scope.margin - $scope.leftOffset;
                    newStyles += 'left: ' + newPosition + 'px; ';
                }

                if (index % $scope.calculateAmountOfProductsInRow() === 0) {
                    var topOffset = index === 0 ? 0 : $scope.getTopOffsetForFistElementInRow(index);
                    if (document.querySelector('#sidebar')) {
                        var isCollapsedSidebar = document.querySelector('#sidebar').offsetWidth < 100;
                    }
                    var topPageOffset = 80; // height from container top side;
                    newStyles += 'top: ' + (topOffset + topPageOffset) + 'px;';

                    var leftOffset = 0;
                    if (!isCollapsedSidebar && !$scope.isFilterCollapsed) {
                        leftOffset = 325;
                    } else if (($scope.isFilterCollapsed && !isCollapsedSidebar) || (isCollapsedSidebar && $scope.isFilterCollapsed)) {
                        leftOffset = 70;
                    } else if (!$scope.isFilterCollapsed && isCollapsedSidebar) {
                        leftOffset = 325;
                    }
                    newStyles += 'left: ' + leftOffset + 'px;';
                }

                $scope.lastSeletedElement.index = index;
                $scope.lastSeletedElement.height = productElement.offsetHeight;
                $scope.expandedProductIndex = index;

                document.querySelector('e-catalog-new-products')
                    .insertBefore(clone, document.querySelector('#e-catalog-product-' + (index + 1)));
                productElement.setAttribute('style', newStyles);

            };

            $scope.calculateAmountOfProductsInRow = function () {
                var filterWidth = document.querySelector('#e-catalog-filter-container').offsetWidth;
                return Math.floor(($scope.windowWidth - $scope.leftOffset - filterWidth) / ($scope.elementWidth + $scope.margin));
            };

            $scope.getTopOffsetForFistElementInRow = function (indexOfElement) {
                var verticalMargin = 20;
                var elementsInRow = $scope.calculateAmountOfProductsInRow();
                var heightOfElement = 0;
                var totalHeight = 0;
                var beginIndex = 0;
                var rowNumber = 0;

                while (beginIndex < indexOfElement) {
                    rowNumber++;
                    for (var i = beginIndex; i < elementsInRow + beginIndex; i++) {
                        if (i === indexOfElement - elementsInRow) {

                            heightOfElement = i === $scope.lastSeletedElement.index
                                ? $scope.lastSeletedElement.height
                                : document.querySelector('#e-catalog-product-' + i).offsetHeight;
                        } else {
                            var newHeight = i === $scope.lastSeletedElement.index
                                ? $scope.lastSeletedElement.height
                                : document.querySelector('#e-catalog-product-' + i).offsetHeight;

                            if (newHeight > heightOfElement) {
                                heightOfElement = newHeight;
                            }
                        }
                    }

                    totalHeight += heightOfElement + verticalMargin;
                    beginIndex += elementsInRow;
                }

                if (rowNumber >= 4) {
                    totalHeight -= 35;
                }

                return totalHeight;

            };

            $scope.removeExpandedStyles = function (elementIndex) {
                var cloneElement = document.querySelector('#e-catalog-product-' + elementIndex + '-clone');
                if ((elementIndex || elementIndex === 0) && cloneElement) {
                    cloneElement.parentNode.removeChild(cloneElement);
                    //cloneElement.remove();
                }

                $scope.products && $scope.products.length && $scope.products.forEach(function (product, index) {
                    if (document.querySelector('#e-catalog-product-' + index)
                        && document.querySelector('#e-catalog-product-area-' + index)) {
                        document.querySelector('#e-catalog-product-' + index).removeAttribute('style');
                        document.querySelector('#e-catalog-product-area-' + index).removeAttribute('style');
                    }
                });
            };

            $scope.addToCart = function (product, offer) {
                if (!$localStorage.isAuthorized) {
                    organizationDataService.getData();
                    return;
                }
                if (!$localStorage.eCatalogCart) setEmptyCart();

                $localStorage.eCatalogCart.productsQuantity += 1;
                $localStorage.eCatalogCart.productValue += offer.value.amount;

                if (!$localStorage.eCatalogCart.suppliers || $localStorage.eCatalogCart.suppliers.length === 0) {
                    createNewDataObjInCart(offer, product);
                } else {
                    addSupplierToCart(offer, product);
                }

                abp.notify.success('Додано в кошик');
            };

            $scope.collapseItem = function () {
                $scope.removeExpandedStyles($scope.expandedProductIndex);
                $scope.expandedProductIndex = null;
            };

            function setEmptyCart() {
                $localStorage.eCatalogCart = {
                    productsQuantity: 0,
                    productValue: 0,
                    suppliers: []
                };
            };

            function createNewDataObjInCart(offer, product) {
                $localStorage.eCatalogCart.suppliers.push({
                    supplierId: offer.suppliers[0].identifier.apiId,
                    supplierData: offer.suppliers[0],
                    productClassifiId: product.classification.id,
                    products: [productObj(offer, product)]
                });
            };

            function addSupplierToCart(offer, product) {
                var i = 0;
                var len = $localStorage.eCatalogCart.suppliers.length;
                for (i; i < len; i++) {
                    if ($localStorage.eCatalogCart.suppliers[i].supplierId === offer.suppliers[0].identifier.apiId &&
                        equalClassifiIds($localStorage.eCatalogCart.suppliers[i].productClassifiId, product.classification.id)) {
                        putOfferToCurentSuplier($localStorage.eCatalogCart.suppliers[i], offer, product);
                        return;
                    }
                }
                createNewDataObjInCart(offer, product);
            };

            function equalClassifiIds(classifi1, classifi2) {
                if (classifi1 === classifi2) return true;

                var classifi1_3 = classifi1.substring(0, 3);
                var classifi2_3 = classifi2.substring(0, 3);
                if (classifi1_3.indexOf('336') !== -1 && classifi2_3.indexOf('336') !== -1) return true;

                var classifi1_4 = classifi1.substring(0, 4);
                var classifi2_4 = classifi2.substring(0, 4);
                if (classifi1_4 === classifi2_4) return true;

                return false;
            };

            function putOfferToCurentSuplier(curentSuplier, offer, product) {
                var i = 0;
                var len = curentSuplier.products.length;
                for (i; i < len; i++) {
                    if (curentSuplier.products[i].offerId === offer.id) {
                        curentSuplier.products[i].quantity += 1;
                        curentSuplier.products[i].value += offer.value.amount;
                        return;
                    }
                }
                addNewOfferToCurentSuplier(curentSuplier, offer, product);
            };

            function addNewOfferToCurentSuplier(curentSuplier, offer, product) {
                curentSuplier.products.push(productObj(offer, product));
            };

            function productObj(offer, product) {
                return {
                    offerData: offer,
                    productData: product,
                    offerId: offer.id,
                    quantity: 1,
                    value: offer.value.amount
                };
            };

            $scope.navigateToProduct = function (url) {
                $location.url(url);
            };

            $scope.getRequirementText = function (text) {
                if (text === 'True') {
                    return $rootScope.source('Yes');
                } else if (text === 'False') {
                    return $rootScope.source('No');
                } else {
                    return text;
                }
            }

            $scope.$watch('products', function () {
                $scope.collapseItem();
            });

            $scope.$on('onFilterCollapseChanged', function (event, isCollapsed) {
                $scope.collapseItem();
                $scope.isFilterCollapsed = isCollapsed;
            });

            $scope.$on('onSidebarCollapseChanged', function () {
                $scope.collapseItem();
            });
        }]
    };
}]);
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('eCatalogOffersCtrl', eCatalogOffers);

    eCatalogOffers.$inject = [
        '$scope',
        '$location',
        '$localStorage',
        'abp.services.etender.eCatalog',
        '$stateParams',
        'eCatalogService',
        'organizationDataService'];
    function eCatalogOffers(
        $scope,
        $location,
        $localStorage,
        eCatalog,
        $stateParams,
        eCatalogService,
        organizationDataService) {

        $scope.ng_localStorage = $localStorage;
        $scope.vm = { displayBlock: 'availablOffers' };

        // get IDs from URL
        $scope.groupCpvCode = $stateParams.gCpvCode;
        $scope.categiryId = $stateParams.cId;
        $scope.profileId = $stateParams.pId;
        $scope.productId = $stateParams.prodId;


        // Get Offers From Server
        function getOffers() {
            abp.ui.setBusy();
            eCatalog.getOffers($scope.productId).then(function (response) {
                console.log('eCatalog Offers:', response.data);
                $scope.offers = response.data;
                abp.ui.clearBusy();
            }, function (errorResponse) {
                console.log(errorResponse.data);
                abp.ui.clearBusy();
                    if (
                        errorResponse.data.message.includes('Товар не знайдено') ||
                        errorResponse.data.message.includes('Профіль не активний') ||                        
                        errorResponse.data.message.includes('Профіль не знайдено') ||
                        errorResponse.data.message.includes('Профіль товару не активний')
                    ) {
                        $location.path('/ProzorroMarket');
                }

            });
        }

        // Result For Search Input
        $scope.searchResult = function (row) {
            return !!(row.title.indexOf($scope.userSearch || '') !== -1);
        };

        // Add to Cart Funcs START
        $scope.addToCart = function (product, offer) {
            if (!$localStorage.isAuthorized) {
                organizationDataService.getData();
                return;
            }
            if (!$localStorage.eCatalogCart) setEmptyCart();

            $localStorage.eCatalogCart.productsQuantity += 1;
            $localStorage.eCatalogCart.productValue += offer.value.amount;

            if (!$localStorage.eCatalogCart.suppliers || $localStorage.eCatalogCart.suppliers.length === 0) {
                createNewDataObjInCart(offer, product);
            } else {
                addSupplierToCart(offer, product);
            }

            abp.notify.success('Додано в кошик');
        };


        function addSupplierToCart(offer, product) {
            var i = 0;
            var len = $localStorage.eCatalogCart.suppliers.length;
            for (i; i < len; i++) {
                if ($localStorage.eCatalogCart.suppliers[i].supplierId === offer.suppliers[0].identifier.apiId &&
                    equalClassifiIds($localStorage.eCatalogCart.suppliers[i].productClassifiId, product.classification.id)) {
                    putOfferToCurentSuplier($localStorage.eCatalogCart.suppliers[i], offer, product);
                    return;
                }
            }
            createNewDataObjInCart(offer, product);
        };

        function equalClassifiIds(classifi1, classifi2) {
            if (classifi1 === classifi2) return true;

            var classifi1_3 = classifi1.substring(0, 3);
            var classifi2_3 = classifi2.substring(0, 3);
            if (classifi1_3.indexOf('336') !== -1 && classifi2_3.indexOf('336') !== -1) return true;

            var classifi1_4 = classifi1.substring(0, 4);
            var classifi2_4 = classifi2.substring(0, 4);
            if (classifi1_4 === classifi2_4) return true;

            return false;
        }

        function putOfferToCurentSuplier(curentSuplier, offer, product) {
            var i = 0;
            var len = curentSuplier.products.length;
            for (i; i < len; i++) {
                if (curentSuplier.products[i].offerId === offer.id) {
                    curentSuplier.products[i].quantity += 1;
                    curentSuplier.products[i].value += offer.value.amount;
                    return;
                }
            }
            addNewOfferToCurentSuplier(curentSuplier, offer, product);
        };

        function addNewOfferToCurentSuplier(curentSuplier, offer, product) {
            curentSuplier.products.push(productObj(offer, product));
        };

        function createNewDataObjInCart(offer, product) {
            $localStorage.eCatalogCart.suppliers.push({
                supplierId: offer.suppliers[0].identifier.apiId,
                supplierData: offer.suppliers[0],
                productClassifiId: product.classification.id,
                products: [productObj(offer, product)]
            });
        };

        function setEmptyCart() {
            $localStorage.eCatalogCart = {
                productsQuantity: 0,
                productValue: 0,
                suppliers: []
            };
        };

        function productObj(offer, product) {
            return {
                offerData: offer,
                productData: product,
                offerId: offer.id,
                quantity: 1,
                value: offer.value.amount
            };
        };

        $scope.$on('canCreateOrUpdateConditions', function (evt, canCreate, canUpdate) {
            $scope.canCreate = canCreate;
            $scope.canUpdate = canUpdate;
        })

        // Delivtry Data To Display
        $scope.displayDelivtry = function (data) {
            return eCatalogService.displayDelivtry(data);
        };


        // Navigation
        $scope.initNavigation = function () {
            $scope.navigation = [
                {
                    title: 'Доступні пропозиції',
                    type: 'availablOffers',
                    active: true,
                    show: true,
                    openFunc: function () {
                        menuPress('availablOffers');
                    }
                }, {
                    title: 'Ваші пропозиції',
                    type: 'yourOffers',
                    active: false,
                    show: $scope.vm.product.canCreateOffer,
                    openFunc: function () {
                        menuPress('yourOffers');
                    }
                }
            ];
        };

        function menuPress(type) {
            var i = 0;
            var len = $scope.navigation.length;
            for (i; i < len; i++) {
                if ($scope.navigation[i].type === type) {
                    $scope.navigation[i].active = true;
                    $scope.vm.displayBlock = type;
                }
                else $scope.navigation[i].active = false;
            }
        };

        $scope.myOffersHere = function (offers) {
            var i = 0;
            var len = offers.length;
            for (i; i < len; i++) {
                if (offers[i].isOwn) return true;
            }
            return false;
        };

        $scope.changeOfferStatus = function (offer, status) {
            if (status === 'hidden' && !confirm("Ви впевнені, що хочете деактивувати пропозицію?")) return;
            offer.status = status;
            delete offer.suppliers;
            abp.ui.setBusy();
            eCatalog.updateOffer(offer).then(function (response) {
                console.log(response.data);
                abp.ui.clearBusy();
                getOffers();
                if (response.data) {
                    abp.notify.error(response.data)
                }
                else {
                    abp.notify.success('Пропозиція оновлена!');
                }
            }, function (errorResponse) {
                    console.log(errorResponse.data);
                    abp.ui.clearBusy();
                });
        };

        $scope.$watch(function () {
            return $scope.vm.product;
        }, function (product) {
            if (product && product.title) {
                $scope.breadcrumbs = 
                    '<a href="ProzorroMarket" class="mr5">Prozorro Market</a> >' +
                    "<a href=" + "eCatalogProfiles/" + $scope.groupCpvCode + '/' + $scope.categiryId + " class='ml5 pl0 mr5'>Категорія</a> <span class='breadcrumbs_symbol'> > </span>" +
                    "<a href=" + "eCatalogProducts/" + $scope.groupCpvCode + '/' + $scope.categiryId + '/' + $scope.profileId + " class='ml5 pl0 mr5'>Товари</a> <span class='breadcrumbs_symbol'> > </span>" +
                    "<span class='ml5 pl0 mr5'>" + product.title + "</span>"
            }
        });

        getOffers();
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('eCatalogProductsCtrl', eCatalogProducts);

    eCatalogProducts.$inject = [
        '$scope',
        '$location',
        '$rootScope',
        '$localStorage',
        'abp.services.etender.eCatalog',
        '$stateParams'];
    function eCatalogProducts(
        $scope,
        $location,
        $rootScope,
        $localStorage,
        eCatalog,
        $stateParams) {

        $scope.ng_localStorage = $localStorage;

        // Get IDs From URL
        $scope.gCpvCode = $stateParams.gCpvCode;
        $scope.categiryId = $stateParams.cId;
        $scope.profileId = $stateParams.pId;

        // Get Products From Server
        function getProducts() {
            abp.ui.setBusy();
            eCatalog.getProducts([$scope.profileId]).then(function (response) {
                console.log('eCatalog Products:', response.data);
                $scope.products = response.data;
                abp.ui.clearBusy();
            }, function (errorResponse) {
                console.log(errorResponse.data);
                    abp.ui.clearBusy();
                    if (
                        errorResponse.data.message.includes('Товар не знайдено') ||
                        errorResponse.data.message.includes('Профіль не активний') ||
                        errorResponse.data.message.includes('Профіль не знайдено') ||
                        errorResponse.data.message.includes('Профіль товару не активний')
                    ) {
                        $location.path('/ProzorroMarket');
                    }
            });
        }

        // Get Curent Profile
        function getProfile() {
            var obj = {
                CategoryIdOrSeoUrl: $scope.categiryId
            }
            eCatalog.getProfiles(obj).then(function (response) {
                $scope.profile = getContent(response.data.profiles, $scope.profileId);
                console.log('eCatalog Profiles:', $scope.profile);
            }, function (errorResponse) {
                console.log(errorResponse.data);
            });
        }

        // Get Data From Array
        function getContent(data, id) {
            var i = 0;
            var cLength = data.length;
            for (i; i < cLength; i++) {
                if (data[i].id === id)
                    return data[i];
            }
            return [];
        }

        // Search Result After Fill Search Input
        $scope.searchResult = function (row) {
            var title = row.title && row.title.toLowerCase() || '';
            var userSearch = $scope.userSearch && $scope.userSearch.toLowerCase() || '';
            return !!(title.indexOf(userSearch || '') !== -1);
        };

        $scope.$watch(function () {
            return $scope.profile;
        }, function (profile) {
            if (profile && profile.title) {
                $scope.breadcrumbs =
                    "<a href='ProzorroMarket' class='mr5'>Prozorro Market</a> >" +
                    "<a href=" + "eCatalogProfiles/" + $scope.gCpvCode + '/' + $scope.categiryId + " class='ml5 pl0 mr5'>Категорія</a> <span class='breadcrumbs_symbol'> > </span>" +
                    "<span class='ml5 pl0 mr5'>" + profile.title + "</span>"
            }
        });

        getProfile();
        getProducts();
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('eCatalogProfilesCtrl', eCatalogProfiles);

    eCatalogProfiles.$inject = [
        '$scope',
        '$rootScope',
        '$location',
        '$http',
        '$localStorage',
        '$sessionStorage',
        'abp.services.etender.eCatalog',
        '$stateParams',
        'paginationService'];
    function eCatalogProfiles(
        $scope,
        $rootScope,
        $location,
        $http,
        $localStorage,
        $sessionStorage,
        eCatalog,
        $stateParams,
        paginationService) {

        $scope.ng_localStorage = $localStorage;
        $scope.ng_sessionStorage = $sessionStorage;

        // get IDs from URL
        var groupCpvCode = $stateParams.gCpvCode;
        var categiryId = $stateParams.cId;

        $scope.vm = {
            isMarlet: true,
            checkedRegions: []
        }
        var filter = { //глобальный фильтр для эвентов с новыми полями
            // genericSearchField: $scope.userSearch,
            page: 1,
            pageSize: 12
        };

        $scope.filterItems = [];
        $scope.filterItemsByGroup = [];

        // Set Filter Obj To Display Filters in UI
        $scope.setFilterObj = function (title, boolean, ifTrueVlue) {
            if (boolean) {
                $scope.filterItems.push({
                    title: title,
                    boolean: boolean,
                    value: ifTrueVlue
                });
            } else {
                var i = 0;
                var len = $scope.filterItems.length;
                for (i; i < len; i++) {
                    if ($scope.filterItems[i].title === title &&
                        $scope.filterItems[i].value == ifTrueVlue) {
                         $scope.filterItems.splice(i, 1);
                        return;
                    }
                }
            }
        }

        // Get Groups From Server
        function getGroups() {
            var checked = false;
            abp.ui.setBusy();
            eCatalog.getGroups(checked).then(function (response) {
                setCatalogContent(response.data);
                // getProfiles();
            }, function (errorResponse) {
                console.log(errorResponse.data);
                abp.ui.clearBusy();
            });
        }

        // get Group and Category Data
        function setCatalogContent(data) {
            $scope.group = getGroupsContent(data, groupCpvCode);
            $scope.category = getContent($scope.group.categories, categiryId);
            console.log('eCatalog Group:', $scope.group);
            console.log('eCatalog Category:', $scope.category);
        };

        // get data from Array
        function getGroupsContent(data, cpv) {
            var i = 0;
            var cLength = data.length;
            for (i; i < cLength; i++) {
                if (data[i].cpvCode === cpv)
                    return data[i];
            }
            return [];
        }

        // get data from Array
        function getContent(data, id) {
            var i = 0;
            var cLength = data.length;
            for (i; i < cLength; i++) {
                if (data[i].id === id)
                    return data[i];
            }
            return [];
        }

        // Get Profiles and Filters From Server
        function getProfiles() {
            var obj = {
                CategoryIdOrSeoUrl: categiryId
            };
            eCatalog.getProfiles(obj).then(function (response) {
                $scope.profiles = response.data.profiles;
                $scope.filters = response.data.requirements;
                console.log('eCatalog Profiles:', response.data);
                abp.ui.clearBusy();
            }, function (errorResponse) {
                console.log(errorResponse.data);
                abp.ui.clearBusy();
            });
        }

        // Check In Filters
        function checkInFilter(row) {
            var samePropertyCount = 0;
            $scope.filterItemsByGroup = sortFilterItemsByGroups();

            $scope.filterItemsByGroup.forEach(function (filterGroup) {
                if (isRowCriteriaAndFilterGroupEqual(filterGroup, row.criteria)) {
                    samePropertyCount++;
                }
            });

            return samePropertyCount === $scope.filterItemsByGroup.length;
        }

        function isRowAndFilterItemEqual(filterItem, rowItem, isRowRequirementGroup) {
            if (isRowRequirementGroup) {
                if (rowItem.minValue) {
                    return filterItem.title === rowItem.title && filterItem.value === rowItem.minValue;
                } else {
                    return filterItem.title === rowItem.title && filterItem.value === rowItem.expectedValue;
                }
            } else {
                return filterItem.title === rowItem.title && filterItem.value === rowItem.value;
            }
        }

        function isRowCriteriaAndFilterGroupEqual(filterGroup, rowCriteria) {
            for (var groupIndex = 0; groupIndex < filterGroup.length; groupIndex++) {
                for (var criteriaIndex = 0; criteriaIndex < rowCriteria.length; criteriaIndex++) {
                    if (rowCriteria[criteriaIndex].requirementGroups && rowCriteria[criteriaIndex].requirementGroups.length) {
                        for (var i = 0; i < rowCriteria[criteriaIndex].requirementGroups.length; i++) {
                            if (isRowAndFilterItemEqual(filterGroup[groupIndex], rowCriteria[criteriaIndex].requirementGroups[i].requirements[0], true)) {
                                return true;
                            }
                        }
                    } else {
                        if (isRowAndFilterItemEqual(filterItem, rowCriteria.dataForFilter)) {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

        function sortFilterItemsByGroups() {
            var sortedGroupArray = [];
            var groupIndex = 0;
            var sortedFilterItems = $scope.filterItems.slice().sort(function (a, b) {
                if (a.title < b.title) {
                    return -1;
                }
                if (a.title > b.title) {
                    return 1;
                }
                return 0;
            });

            sortedFilterItems.forEach(function (item, index) {
                if (index === 0) {
                    sortedGroupArray.push([item]);
                } else {
                    if (item.title === sortedFilterItems[index - 1].title) {
                        sortedGroupArray[groupIndex].push(item)
                    } else {
                        sortedGroupArray.push([item]);
                        groupIndex ++;
                    }
                }
            });

            return sortedGroupArray;
        }

        // Search Result After Click Filters and Fill Search Input
        $scope.searchResult = function (row) {
            var title = row.title && row.title.toLowerCase() || '';
            var userSearch = $scope.userSearch && $scope.userSearch.toLowerCase() || '';
            if ($scope.filterItems.length > 0) {
                return !!(title.indexOf(userSearch || '') !== -1 && checkInFilter(row));
            } else {
                return !!(title.indexOf(userSearch || '') !== -1);
            }
        };

        // set Data For Search Filter
        $scope.setDataForFilter = function (criteria, req) {
            criteria.dataForFilter = {
                title: req.title,
                value: req.expectedValue || req.minValue
            }
        }
        
        $scope.$watch('userSearch', function (data) { //вотчер на ввод значения в поле поиска
            filter.genericSearchField = data;
        });

        $scope.searchByFilter = function (event) {
            if (event.which === 13 || event.keyCode === 13) {
                $scope.$broadcast('filterProfilesByKeyboard', filter);
                $scope.$broadcast('clearFilterButton', true);
                $scope.setPage(1, false);
            }
        }

        function filterByProductOffers () {
            var url = '/api/services/etender/offer/getProductOffersByFilter';
            abp.ui.setBusy();
            filter.categoryId = getProductIdFromUrl();
            $scope.categoryId = getProductIdFromUrl();

            $http({
                method: 'GET',
                url: url,
                params: filter
            }).then(function (response) {
                $scope.productOffers = response.data.result.result;
                $scope.productOffersCount = response.data.result.count;
                $scope.setPage(1, false);
            }).finally(function () { abp.ui.clearBusy(); });
        }
        function getProductIdFromUrl () {
            var url = $location.url();
            var productId = /[^/]*$/.exec(url)[0];

            return productId;
        }

        $scope.$on('clearedFilter', function () {
            $scope.userSearch = '';
            filter.genericSearchField = '';
            $rootScope.$broadcast('clearFilterButton');
            filterByProductOffers();
        });
        $scope.$on('onCatalogFilterChanged', function (evt, data, needToReloadPager) {
            $scope.productOffers = data.result.result;
            $scope.productOffersCount = data.result.count;
            if (needToReloadPager) {
                $scope.setPage(1, false);
            }
        });

        $scope.setPage = function (page, needToReload) {
            // get pager object from service
            $scope.pager = paginationService.getPager($scope.productOffersCount, page, 12);

            if (needToReload) {
                $scope.$broadcast('newProductPageChanged', page);
            }
        };

        $scope.$watch(function () {
            return $scope.category;
        }, function (category) {
            if (category && category.title) {
                $scope.breadcrumbs = "<a href='ProzorroMarket' class='mr5'>Prozorro Market</a> > <span class='ml5 pl0'>" + category.title + "</span>"
            }
        });

        filterByProductOffers();
        getGroups();
    }
})();;
angular.module('app')
    .controller('frameworkCtrl', [
        '$scope',
        '$rootScope',
        '$stateParams',
        '$http',
        '$timeout',
        '$localStorage',
        'ngTableParams',
        'abp.services.etender.submission',
        'submissionDataService',
        '$location',
    function ($scope, $rootScope, $stateParams, $http, $timeout, $localStorage, ngTableParams, submissionService, submissionDataService, $location) {
        var frameworkId = $stateParams.frameworkId;
        $scope.isDateValid = true;
        reloadFramework();
        $scope.isUserCustomer = $localStorage._isCustomer;
        $scope.orgName = $localStorage.organization && $localStorage.organization.name;
        $scope.documentTypesForDropDown = $localStorage.refs && 
                $localStorage.refs.documentTypes && 
                $localStorage.refs.documentTypes.submissionDocument;
        $scope.submissionFilter = {};
        $scope.fileUploadObj = { submissionId: '', documentId: '', documentType: '' };
        $scope.submissionFilterStatuses = [
            { name: 'draft', title: 'Чернетка', type: 'submissionStatus' },
            { name: 'active', title: 'Активна', type: 'submissionStatus' },
            { name: 'unsuccessful', title: 'Відхилено', type: 'qualificationStatus' },
            { name: 'active', title: 'Кваліфікований постачальник', type: 'contractStatus' },
            { name: 'suspended', title: 'Забанений постачальник', type: 'contractStatus' },
            { name: 'terminated', title: 'Дискваліфікований постачальник', type: 'contractStatus' }
        ];

        $scope.submissionContractStatusesTranslate = {
            'active': $rootScope.source('ActiveContractStatus'),
            'terminated': $rootScope.source('TerminatedContractStatus'),
            'suspended': $rootScope.source('SuspendedContractStatus')
        };


        $scope.frameworkStatuses = [
            { name: 'draft', title: 'Чернетка' },
            { name: 'active', title: 'Активний' },
            { name: 'unsuccessful', title: 'Не відбувся' },
            { name: 'complete', title: 'Завершений' }
        ];

        $scope.submissionMilestoneTypesTranslate = {
            'activation': 'Активація',
            'ban': 'Блокування',
        };

        $scope.submissionMilestoneStatusesTranslate = {
            'scheduled': 'Заплановано',
            'met': 'Було досягнуто',
            'notMet': 'Не було досягнуто',
        };

        $scope.portalProzorroUrl = abp.setting.values.ProzorroGovUrl;
        
        function reloadFramework() {
            var url = '/api/services/etender/Framework/GetFramework';
            abp.ui.setBusy();
            $http({
                method: 'GET',
                url: url,
                params: {
                    id: frameworkId
                }
            }).then(function (response) {
                abp.ui.clearBusy();
                if (!response.data.success) {
                    abp.notify.error(response.data.error.message, 'Помилка');
                    $location.path('/ProzorroMarket');
                    return;
                }
                var docsBlockOpen = false;
                $scope.framework = response.data.result;
                $scope.frameworkCount = response.data.result.countVisibleSubmissions;
                // @hack @todo костыль для работы компонента отображения документов (убрать когда будет переделанно на параметр!)
                $scope.documents = $scope.framework.documents;
                var status = $scope.frameworkStatuses.find(function (status) { return status.name === $scope.framework.status; });
                $scope.framework.statusTitle = status ? status.title : '';

                if ($scope.framework.mySubmissions && $scope.framework.mySubmissions.length) {
                    var draftIndex = $scope.framework.mySubmissions.findIndex(function (submission) {
                        return submission.status === 'draft';
                    });
                    if (draftIndex !== -1) {
                        var draft = $scope.framework.mySubmissions[draftIndex];
                        $scope.framework.mySubmissions.splice(draftIndex, 1);
                        $scope.createSubmissionDraftModel = draft;
                        docsBlockOpen = $scope.createSubmissionDraftModel.docsOpened;
                    }
                }
                $scope.isDateValid = checkIfDateValid();
                $scope.createSubmissionDraftModel.docsOpened = docsBlockOpen = true;
            }).catch(function (error) {
                abp.ui.clearBusy();
            });


        }
        $scope.reloadFramework = reloadFramework;
        $scope.documents = []; // @hack @todo костыль для работы компонента отображения документов (переделать на параметр!)
        var PAGE_SIZE = 10; // todo move to constatns
        $scope.reloadSubmissionsOnce = function () {
            if (!$scope.tableParams) {
                $scope.tableParams = new ngTableParams(
                    {
                        page: 1,
                        count: PAGE_SIZE
                    },
                    {
                        counts: [],
                        getData: function ($defer, params) {
                            abp.ui.setBusy();
                            var requestParameters = {
                                frameworkId: frameworkId,
                                page: params.page(),
                                pageSize: PAGE_SIZE,
                                tendererName: $scope.submissionFilter.tendererName,
                                tendererIdentifier: $scope.submissionFilter.tendererIdentifier
                            };

                            generateRequestParamsForStatus();


                            var url = '/api/services/etender/submission/GetFrameworkSubmissions';
                            abp.ui.setBusy();

                            $http({
                                method: 'GET',
                                url: url,
                                params: requestParameters
                            }).then(function (response) {
                                abp.ui.clearBusy();
                                params.total(response.data.result.count);
                                $defer.resolve(response.data.result);

                                $scope.allSubmissions = response.data.result.result;
                            }).catch(function (error) {
                                abp.ui.clearBusy();
                            });

                            function generateRequestParamsForStatus() {
                                if ($scope.submissionFilter.status) {
                                    requestParameters.filterOption = $scope.submissionFilter.status.type + "_" + $scope.submissionFilter.status.name;
                                }
                            }
                        }
                    });
                // @hack to pervent unwanted scroll (@todo research is there any other way?)
                $timeout(function () {
                    $scope.tableParams.settings().$scope.scrollToTop = $.noop;
                });                 
            }
        }

        $scope.canSetSubmissionActiveStatus = function () {
            return ($scope.framework &&
                $scope.framework.canAddSubmission &&
                $scope.createSubmissionDraftModel &&
                $scope.createSubmissionDraftModel.documents &&
                $scope.createSubmissionDraftModel.documents.length &&
                $scope.isAllDocsExported());
        }

        $scope.isAllDocsExported = function () {
            return $scope.createSubmissionDraftModel && $scope.createSubmissionDraftModel.documents && !$scope.createSubmissionDraftModel.documents.some(function (document) {
                return document.isExported !== true
            });
        }


        $scope.createSubmissionDraft = function () {
            abp.ui.setBusy();
            submissionService.createDraftSubmission({
                frameworkId: $scope.framework.id
            }).then(function (response) {
                abp.ui.clearBusy();
                $scope.createSubmissionDraftModel = response.data;
                $scope.reloadFramework();
            }).catch(function (error) {
                abp.ui.clearBusy();
            });
        };

        $scope.setSubmissionActiveStatus = function () {
            abp.ui.setBusy();
            submissionService.setSubmissionActiveStatus({
                submissionId: $scope.createSubmissionDraftModel.id
            })
                .then(function (response) {
                    abp.ui.clearBusy();
                    console.log('.setSubmissionActiveStatus success', response);
                    abp.notify.success('Активовано!');
                    $scope.createSubmissionDraftModel = null;
                    $scope.reloadFramework();
                })
                .catch(function (error) {
                    abp.ui.clearBusy();
                    $scope.reloadFramework();
                    console.log('.setSubmissionActiveStatus error', error);
                });
        }
        $scope.setSubmissionDeletedStatus = function () {
            abp.ui.setBusy();
            submissionService.setSubmissionDeletedStatus({
                submissionId: $scope.createSubmissionDraftModel.id
            })
                .then(function (response) {
                    abp.ui.clearBusy();
                    console.log('.setSubmissionDeletedStatus success', response);
                    abp.notify.success('Видалено!');
                    $scope.createSubmissionDraftModel = null;
                    $scope.reloadFramework();
                })
                .catch(function (error) {
                    abp.ui.clearBusy();
                    $scope.reloadFramework();
                    console.log('.setSubmissionDeletedStatus error', error);
                });
        }

        $scope.showSignModalSubmission = function () {
            $scope.entityType = 'submission';
            $scope.entityOutOfTender = true;
            $scope.signSubmission = $scope.createSubmissionDraftModel;
            $timeout(function () {
                $('#modalSignNew').modal('toggle');
            }, 1000);
        }

        $scope.reloadSubmissions = function () {
            if ($scope.tableParams) {
                if ($scope.tableParams.page() === 1) {
                    $scope.tableParams.reload();
                } else {
                    $scope.tableParams.page(1);
                }
            }
        };

        $scope.openCloseTree = function (togle) {
            // @todo refactor, DRY

            jQuery('#tree-00').collapse(togle);
            jQuery('#tree-01-01').collapse(togle);
            jQuery('#tree-01-02').collapse(togle);
            jQuery('#tree-01-03').collapse(togle);
            jQuery('#tree-01-04').collapse(togle);
            var a = 0;
            var length = 1;
            for (a; a < length; a++) {
                $scope.$broadcast('togle', a, togle);
                var name00 = '#treeLot-00-' + a;
                var name01 = '#treetree-01-01-' + a;
                var name02 = '#treetree-01-02-' + a;
                var name03 = '#treetree-01-03-' + a;
                var name04 = '#treetree-01-04-' + a;
                jQuery(name00).collapse(togle);
                jQuery(name01).collapse(togle);
                jQuery(name02).collapse(togle);
                jQuery(name03).collapse(togle);
                jQuery(name04).collapse(togle);
            }
        }

        function checkIfDateValid() {
            return new Date($scope.framework.period.endDate) >= new Date();
        }

        $scope.changeDoc = function (document) {
            $scope.validDocPeriod = true;
            $scope.fileUploadObj.documentId = document.id;
            $scope.fileUploadObj.submissionId = $scope.createSubmissionDraftModel.id;
            $scope.fileUploadObj.documentType = document.documentType && document.documentType.id ? document.documentType.id : null;
            $scope.documentChanged = document;
            _($scope.documents).each(function (doc) {
                doc.ch = false;
            });
            document.ch = true;
        };

        $scope.clearDoc = function () {
            $scope.fileUploadObj.documentId = '';
        };

        $scope.$on('onUploadFinished', function () {
            $scope.reloadFramework();
        });

        $scope.getOrganizationToolTipText = function (submission) {
            return submissionDataService.getSubmissionTendererToolTipText(submission.tenderer);
        };

        $scope.urlHasOperatorParametr = function () {
            if ($location.search().operator123) return true;
            return false;
        }

        $scope.forceSyncFramework = function () {
            var frameworkForceSyncUrl = '/api/services/etender/framework/ForceSynchronizeWithRelatedEntities';

            $http({
                method: 'GET',
                url: frameworkForceSyncUrl,
                params: {
                    frameworkApiId: frameworkId
                }
            }).then(function (response) {
                abp.notify.success("Відбір буде сiнхронiзовано позачергово! Це може зайняти декiлька хвилин.");
            });
        }
}]);
;
(function () {
    var controllerId = 'createOfferCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$localStorage',
        'abp.services.etender.eCatalog',
        '$stateParams',
        'organizationDataService',
        function (
            $scope,
            $localStorage,
            eCatalog,
            $stateParams,
            organizationDataService
        ) {
            $scope.ng_localStorage = $localStorage;

            organizationDataService.getData(); // check if need to sign agreement
            var productId = $stateParams.prodId;

            $scope.createOfferModel = {
                value: {
                    amount: null,
                    currency: 'UAH',
                    valueAddedTaxIncluded: true
                },
                deliveryAddresses: [{}],
                status: 'active',
                RelatedProductId: productId,
                minOrderValue: {
                    amount: null,
                    currency: 'UAH'
                }                
            };

            $scope.$on('canCreateOrUpdateConditions', function (evt, canCreate, canUpdate) {
                $scope.canCreate = canCreate;
                $scope.canUpdate = canUpdate;
            });

            $scope.createOffer = function () {
                abp.ui.setBusy();

                var createOfferModel = JSON.parse(JSON.stringify($scope.createOfferModel));
                if (!createOfferModel.minOrderValue.amount)
                    delete createOfferModel.minOrderValue;

                eCatalog.createOffer(createOfferModel).then(function (response) {
                    console.log(response.data);
                    abp.ui.clearBusy();
                    abp.notify.success('Пропозиція створена!');
                    parent.history.back();
                }, function (errorResponse) {
                    console.log(errorResponse.data);
                    abp.ui.clearBusy();
                });

            };
        }
    ]);

})();;
(function () {
    var controllerId = 'updateOfferCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$localStorage',
        'abp.services.etender.eCatalog',
        '$stateParams',
        'organizationDataService',
        '$location',
        function (
            $scope,
            $localStorage,
            eCatalog,
            $stateParams,
            organizationDataService,
            $location
        ) {
            $scope.ng_localStorage = $localStorage;

            organizationDataService.getData(); // check if need to sign agreement
            $scope.offerId = $stateParams.offerId;

            // go back button
            jQuery(document).ready(function () {
                jQuery('.go_back').click(function () {
                    parent.history.back();
                    return false;
                });
            });

            $scope.updateOffer = function () {
                abp.ui.setBusy();
                delete $scope.offerToUpdate.suppliers;
                angular.forEach($scope.offerToUpdate.deliveryAddresses, function (item) {
                    delete item.addressStr;
                    if (item.accordingToDocuments) {
                        if (!item.city || item.city.title === "Відповідно до документації") {
                            delete item.city;
                        }
                    }
                    if (!item.region || item.region.title === "Відповідно до документації") {
                        delete item.region;
                    }
                });

                if ($scope.offerToUpdate.minOrderValue &&
                    $scope.offerToUpdate.minOrderValue.amount &&
                    !$scope.offerToUpdate.minOrderValue.currency)
                    $scope.offerToUpdate.minOrderValue.currency = 'UAH';

                eCatalog.updateOffer($scope.offerToUpdate).then(function (response) {
                    console.log(response.data);
                    abp.ui.clearBusy();

                    if (response.data) {
                        abp.notify.error(response.data)
                    }
                    else {
                        abp.notify.success('Пропозиція оновлена!');
                    }

                    $location.url($scope.productUrl);
                }, function (errorResponse) {
                    console.log(errorResponse.data);
                    abp.ui.clearBusy();
                });
            };

            $scope.$on('canCreateOrUpdateConditions', function (evt, canCreate, canUpdate) {
                $scope.offerToUpdate.canCreate = canCreate;
                $scope.offerToUpdate.canUpdate = canUpdate;
            });

            $scope.$on('getProductUrl', function (evt, productUrl) {
                $scope.productUrl = productUrl;
            });

            // Get Offer From Server
            function getOffer() {
                abp.ui.setBusy();
                eCatalog.getOffer($scope.offerId).then(function (response) {
                    console.log('eCatalog Offer:', response.data);
                    $scope.offerToUpdate = response.data;
                    abp.ui.clearBusy();
                }, function (errorResponse) {
                    console.log(errorResponse.data);
                    abp.ui.clearBusy();
                });
            }

            getOffer();
        }
    ]);

})();;
(function () {
    var controllerId = 'googleCalendarCtrl';
    angular.module('app')
        .controller(controllerId, ['$scope', '$http', '$window',
            function ($scope, $http, $window) {

                $scope.calendarConnected = false;
                $http.post("GoogleCalendar/IsCalendarConnected").then(
                    function (response) {
                        $scope.calendarConnected = response.data.isCalendarConnected;
                    }
                );

                $scope.authenticate = function () {
                    $http.post("GoogleCalendar/GetAuthUrl").
                        then(
                            function (data) {
                                if (data && data.data && data.data.includes('https://accounts.google.com'))
                                    $window.location.href = data.data;
                            }
                        );
                };

                $scope.syncEvents = function () {
                    $http.post("GoogleCalendar/SyncEvents").then(
                        function (response) {
                            abp.notify.info('Порядок');
                            console.log(response.data);
                        },
                        function (error) {
                            abp.notify.error('Что-то пошло не так, в консоли подробности');
                            console.log(error);
                        }
                    );
                };

                $scope.getEvents = function () {
                    $http.post("GoogleCalendar/GetEvents").then(
                        function (response) {
                            abp.notify.info('Ништяк. Смотри консоль.');
                            console.log(response.data);
                        }, 
                        function (error) {
                            abp.notify.error('Не удалось получить события календаря');
                            console.log(error);
                            //$window.location.reload();
                        }
                    );
                };
        }
    ]);
})();;
(function () {
    var controllerId = 'callBackCtrl';
    angular.module('app')
        .controller(controllerId, ['$scope', 'abp.services.etender.pagesAndNews', '$location',
        function ($scope, pagesAndNewsService, $location) {

            $scope.location = $location;

            var url = $location.$$url;

            $scope.email = {};

            $scope.sendEmail = function () {
                $scope.email.type = emailType();
                var getMessage = pagesAndNewsService.sendEmail($scope.email);
                getMessage.then(function () {
                    abp.notify.success('Замовлення на дзвінок надіслано!');
                    if (url === '/callBack') {
                        goToMainPage();
                    } else {
                        hideModal();
                        clearForm();
                    }
                });
            };
            
            function emailType() {
                if (url === '/callBack') {
                    return 'callback';
                } else if (url === '/callBack?subscription-from-email') {
                    return 'subscriptionCallback';
                } else {
                    return 'callback';
                }
            }
            
            function clearForm() {
                $scope.email.number = '';
            }

            function goToMainPage() {
                $location.path('/');
            }

            function hideModal() {
                $('#call-back').modal('hide');
            }

        }
    ]);
})();;
(function() {
    var controllerId = 'homeCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', function ($scope) {

        }
    ]);
})();;
(function() {
    var controllerId = 'invoiceCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', function ($scope) {
            
            
        }
    ]);
})();;
(function () {
    var controllerId = 'footerCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', '$localStorage',
        function (
            $rootScope, $scope, $localStorage) {
            $scope.ng_localStorage = $localStorage;
            $scope.url = abp.setting.values;
            $scope.currentYear = moment().format('YYYY'); 
            // navigation 
            $scope.navigation = [
                {
                    name: 'PROZORRO - державні закупівлі',
                    url: $scope.url.MainSiteUrl + 'prozorro'
                }, {
                    name: 'PROZORRO.Продажі - аукціони з продажу та оренди',
                    url: $scope.url.MainSiteUrl + 'prozorro-prodagy'
                }, {
                    name: 'E-CONSULT',
                    url: $scope.url.MainSiteUrl + 'e-consult'
                }, {
                    name: 'НАВЧАННЯ',
                    url: $scope.url.MainSiteUrl + 'navchannya'
                }, {
                    name: 'Віджет тендерів',
                    url: abp.setting.values.CurrentSiteUrl + 'widget'
                }, {
                    name: 'БЛОГ',
                    url: $scope.url.MainSiteUrl + 'novini'
                }, {
                    name: 'КОНТАКТИ',
                    url: $scope.url.MainSiteUrl + 'kontakty'
                }, {
                    name: 'ПРО КОМПАНІЮ',
                    url: $scope.url.MainSiteUrl + 'pro-kompaniyu'
                }, {
                    name: 'Індивідуальні рішення',
                    url: $scope.url.MainSiteUrl + 'kommercheskie-tendery-individualnye-resheniya'
                }, {
                    name: 'ВЕБІНАРИ',
                    url: $scope.url.MainSiteUrl + 'vebinary'
                }, {
                    name: 'ПОРАДИ ЕКСПЕРТА',
                    url: $scope.url.MainSiteUrl + 'sovety-dnya'
                }, {
                    name: 'ПАРТНЕРИ',
                    url: $scope.url.MainSiteUrl + 'partnery'
                }, {
                    name: 'ТАРИФИ PROZORRO',
                    url: $scope.url.MainSiteUrl + 'rates-prozorro'
                }
            ];



        }
    ]);
})();;
(function () {
    var controllerId = 'headerCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', '$state', '$location', '$http', '$timeout',
        'abp.services.etender.settings', '$localStorage', '$sessionStorage',
        function ($rootScope, $scope, $state, $location, $http, $timeout, settings, $localStorage, $sessionStorage) {

            $scope.ng_localStorage = $localStorage;
            $scope.url = abp.setting.values;

            //$scope.go = function (url) {
            //    if (url === '/register')
            //        switch ($location.$$host) {
            //            case ('qa-prozorro.e-tender.ua'):
            //                $location.path('/register');
            //                return;
            //            case ('localhost'):
            //                $location.path('/register');
            //                return;
            //            default:
            //                window.location = $scope.url.ProzorroSiteUrl + 'register';
            //                return;
            //        }
            //    if (url === '/login')
            //        $location.path('/login');           
            //}

            var vm = this;
            //if ($localStorage.username)
            //    $localStorage.isAuthorized = true;
            //else
            //    $localStorage.isAuthorized = false;


            //abp.ajax({
            //    url: '/account/IsLoggedJsonReturn',
            //    data: JSON.stringify({})
            //}).done(function (data) {
            //    //abp.notify.success('created new person with id = ' + data);
            //    //console.log('done called' + data.isLogged);
            //    $localStorage.isAuthorized = data.isLogged;
            //});

            vm.languages = abp.localization.languages;
            vm.currentLanguage = abp.localization.currentLanguage;

            vm.menu = abp.nav.menus.MainMenu;
            vm.currentMenuName = $state.current.menu;

            var secureLinks = ['createProfile', 'profile', 'profiles'];
            //$rootScope.$on("$locationChangeStart", function (event, next, current) {
            //    //do your validations here
            //    //prevent the location change.
            //    //event.preventDefault();
            //    $rootScope.isOrganizationProductionMode = ($scope.ng_localStorage.isOrganizationProdMode === true) || false;
            //    $rootScope.isOrganizationReadyForApprovement = ($scope.ng_localStorage.isOrganizationReadyForApprovement === true) || false;
            //    $rootScope.isOrganizationReadyForApprovementTest = ($scope.ng_localStorage.isOrganizationReadyForApprovementTest === true) || false;
            //    $rootScope.isOrganizationApproved = ($scope.ng_localStorage.isOrganizationApproved === true) || false;
            //    $rootScope.isOrganizationApprovedTest = ($scope.ng_localStorage.isOrganizationApprovedTest === true) || false;
            //});
            $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {

                if (!(toState.name === 'home' &&
                    fromState.name.indexOf('tenderDetailes') !== -1)) {
                    //delete $localStorage.mySearchFilter;
                    delete $localStorage.searchFilter;
                    //delete $localStorage.mySearchPage;
                    delete $localStorage.searchPage;
                }
                if ((secureLinks.indexOf(toState.menu) >= 0 || secureLinks.indexOf(toState.name)) >= 0 && !$localStorage.isAuthorized) {
                    $sessionStorage.$reset();
                    $localStorage.$reset();
                    $scope.ng_localStorage = '';
                    localStorage.clear();
                    sessionStorage.clear();
                    $location.path('/login');
                } else
                    vm.currentMenuName = toState.menu;
            });



            //$scope.clock = "loading clock..."; // initialise the time variable
            //$scope.tickInterval = 1000; //ms
            //var synInterval = 20000; //ms
            //$scope.clock = Date.now();

            //// temporary
            //var synchronizeTime = function () {
            //    if (!$localStorage.diffTime) {
            //        var getDt = settings.getDateAndTime();
            //        getDt.then(function (response) {
            //            var serverTime = Date.parse(response.data);
            //            var difference = Date.now() - serverTime;
            //            $localStorage.diffTime = difference;
            //            $scope.clock -= $localStorage.diffTime;
            //        });
            //    } else {
            //        $scope.clock = Date.now() - $localStorage.diffTime;
            //    }

            //};
            //synchronizeTime();
            //setInterval(synchronizeTime, synInterval); //synchronize every 1 minute

            //var tick = function () {
            //    $scope.clock += $scope.tickInterval; // get the current time
            //    $timeout(tick, $scope.tickInterval); // reset the timer
            //};

            // Start the timer
            //$timeout(tick, $scope.tickInterval);

            //$scope.broadcastClearSearch = function () {
            //    $rootScope.$broadcast('clearSearch');
            //};

            //$scope.homePage = function () {
            //    window.location = $location.protocol() + '://' + location.host;
            //}

            // navigation if no Authorized
            //$scope.navHeader = [
            //    {
            //        name: 'PROZORRO',
            //        url: abp.setting.values.ProzorroSiteUrl,
            //        hint: $rootScope.source('TendersCenter'),
            //        classUrl: 'prozorro_url-cative'
            //    },
            //    {
            //        name: 'RIALTO',
            //        url: abp.setting.values.RialtoSiteUrl,
            //        hint: $rootScope.source('CommercialProcurement'),
            //        classUrl: 'rialto_url'
            //    },
            //    {
            //        name: $rootScope.source('ProzorroSales'),
            //        url: $scope.url.MainSiteUrl + 'prozorro-prodagy',
            //        hint: $rootScope.source('AuctionSaleRent'),
            //        classUrl: ''
            //    }, {
            //        name: 'E-CONSULT',
            //        url: $scope.url.MainSiteUrl + 'e-consult',
            //        hint: $rootScope.source('SupportLaw'),
            //        classUrl: ''
            //    }, {
            //        name: $rootScope.source('Teaching'),
            //        url: $scope.url.MainSiteUrl + 'navchannya',
            //        classUrl: ''
            //    }, {
            //        name: $rootScope.source('Blog'),
            //        url: $scope.url.MainSiteUrl + 'novini',
            //        classUrl: ''
            //    }, {
            //        name: $rootScope.source('Contacts'),
            //        url: $scope.url.MainSiteUrl + 'kontakty',
            //        classUrl: ''
            //    }, {
            //        name: $rootScope.source('About'),
            //        url: $scope.url.MainSiteUrl + 'pro-kompaniyu',
            //        classUrl: ''
            //    }
            //];


            $scope.switchSite = function () {
                $localStorage.readOnlyApiUri = '';
                $localStorage.apiUri = '';
            };

        }
    ]);
})();;
(function () {
    'use strict';
    var controllerId = 'layoutCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$rootScope',
        '$location',
        'abp.services.etender.organization',
        'abp.services.etender.settings',
        '$sce',
        '$localStorage',
        'abp.services.etender.notifications',
        'abp.services.etender.banner',
        '$timeout',
        'siteSettingsService',
        'abp.services.etender.log',
        'templateCacheService',
        'abp.services.etender.netPromoterScore',
        'abp.services.etender.user',
        function (
            $scope,
            $rootScope,
            $location,
            organization,
            settings,
            $sce,
            $localStorage,
            notificationsService,
            banner,
            $timeout,
            siteSettingsService,
            logService,
            templateCacheService,
            netPromoterScore,
            user) {
            $scope.ng_localStorage = $localStorage;

            templateCacheService.setTemplateCache();

            if ($localStorage.isAuthorized && $scope.ng_localStorage.theme === 'styleDarkShare') {
                $scope.siteSettingsCss = 'styleDarkShare';
                setCssSettings('styleDarkShare');
            } else {
                $scope.siteSettingsCss = 'styleLightShare';
                setCssSettings('styleLightShare');
            }

            $rootScope.meta = {};

            $scope.absUrl = $location.absUrl();
            $rootScope.$on('$stateChangeSuccess', function () {
                $scope.absUrl = $location.absUrl();
            });

            function setCssSettings(theme) {
                if (!$scope.ng_localStorage.siteSettings || !$scope.ng_localStorage.siteSettings.css) {
                    $scope.ng_localStorage.siteSettings = {
                        css: theme
                    }
                }
            }

            //banner section
            $scope.$watch(function () {
                return $localStorage.isAuthorized;
            }, function (isAuth) {
                if (isAuth && !$localStorage.isBannerDataReady) {
                    banner.getBanner().then(function (param) {
                        if (param.data) {
                            $localStorage.bannerInfo = param.data;
                            $localStorage.isBannerDataReady = true;
                        }
                    }, function (error) {
                        abp.notify.error(error);
                    });
                }
            });
            $scope.$watch('[ng_localStorage.bannerInfo, ng_localStorage._isCustomer, ng_localStorage.isContractor]', function (param) {
                if (param[0] && (param[1] || param[2])) {
                    $scope.hideAlert = (new Date() < new Date($localStorage.bannerInfo.startNotificationTime) || new Date() > new Date($localStorage.bannerInfo.endNotificationTime));
                    $scope.isEqualToGroup = $localStorage.bannerInfo.recipientGroup === 'all' ? true : (
                        $localStorage.bannerInfo.recipientGroup === 'customer' ? $localStorage._isCustomer : (
                            $localStorage.bannerInfo.recipientGroup === 'supplier' ? $localStorage.isContractor : false
                                        )
                    )
                }
            });
            $scope.$watch(function () {
                return $location.url();
            }, function (url) {
                if (url.indexOf('ProzorroMarket') !== -1
                    || url.indexOf('eCatalogOffers') !== -1
                    || url.indexOf('eCatalogProducts') !== -1
                    || url.indexOf('eCatalogProfiles') !== -1) {
                    $scope.addMarginToMarketIfBannerExist = true;
                } else {
                    $scope.addMarginToMarketIfBannerExist = false;
                }
            });

            $scope.bannerState = 'closed';
            $('document').ready(function () {
                if (angular.element('#banner')) {
                    collapseBanner();
                }
            });
            $scope.showOrHideBanner = function () {
                $scope.bannerState == 'closed' ? $scope.bannerState = 'open' : $scope.bannerState = 'closed';
                if ($scope.bannerState == 'open') {
                    showBanner();
                } else {
                    collapseBanner();
                }
            }

            function collapseBanner() {
                angular.element('#banner').css({
                    "display": "inline-block"
                });
                angular.element('#banner').find('p').css({
                    "text-overflow": "ellipsis",
                    "white-space": "nowrap",
                    "overflow": "hidden"
                });
                angular.element('#banner').find('b').css({
                    "height": "18px",
                    "overflow": "hidden",
                    "text-overflow": "ellipsis",
                    "white-space": "nowrap",
                    "display": "block"
                });
                angular.element('#banner_desc').css({
                    "overflow": "hidden",
                    "height": "18px"
                });
            }
            function showBanner() {
                angular.element('#banner').css({
                    "display": "block"
                });
                angular.element('#banner').find('p').css({
                    "display": "inherit",
                    "white-space": "normal"
                });
                angular.element('#banner').find('b').css({
                    "height": "auto",
                    "overflow": "visible",
                    "white-space": "normal"
                });
                angular.element('#banner_desc').css({
                    "margin-left": "0px",
                    "overflow": "visible",
                    "height": "auto"
                });
            }

            //end banner section

            // NPS pop up section

            var userData = $localStorage.userData;
            $scope.npsScoreArray = [
                {value: 1, active: false},
                {value: 2, active: false},
                {value: 3, active: false},
                {value: 4, active: false},
                {value: 5, active: false},
                {value: 6, active: false},
                {value: 7, active: false},
                {value: 8, active: false},
                {value: 9, active: false},
                {value: 10, active: false}
            ];

            $scope.$watch(function () {
                return $localStorage.userData && $localStorage.userData.netPromoterScore.status
            }, function (status) {
                setUiNpsPopUpVisibility(status);
            });

            $scope.changeScoreState = function (currentScore) {
                $scope.npsScoreArray.forEach(function (score) {
                    score.active = false;
                });
                currentScore.active = true;
                $scope.choosedScoreValue = currentScore.value;
            }

            $scope.toggleNpsPopUp = function () {
                $scope.showNpsPopup = !$scope.showNpsPopup;
            }

            $scope.changeNpsPopUpStatus = function (popupStatus) {
                netPromoterScore.updateStatus(popupStatus).then(function (response) {
                    $localStorage.userData.netPromoterScore.status = popupStatus;
                    $scope.npsScoreArray.forEach(function (score) {
                        score.active = false;
                    });
                    setUiNpsPopUpVisibility(popupStatus);
                });
            }

            function setUiNpsPopUpVisibility(status) {
                if (status === 'answered' || status === 'not want') {
                    $scope.hideNpsPopUp = true;
                    $scope.showNpsPopup = true;
                }
                if (status === 'hidden') {
                    $scope.showNpsPopup = false;
                    $scope.hideNpsPopUp = true;
                }
                if (status === 'not active') {
                    $scope.showNpsPopup = true;
                    $scope.hideNpsPopUp = false;
                }
            }

            $scope.buildUrlForGoogleForm = function () {
                var formUrl = 'https://docs.google.com/forms/d/e/1FAIpQLSfA5BwZBLQlHrEHAtZDeoNYmW4_bE9bsvRUPRH5FmDvFfVttA/viewform?usp=pp_url&' + 
                            'entry.2123255852=' + $localStorage.codeOfOrganization + '&' + 
                            'entry.454811630=' + $localStorage.organization.name + '&' + 
                            'entry.1376467675=' + $localStorage.userData.name + '&' +
                            'entry.756412095=' + $scope.choosedScoreValue;
                window.open(formUrl, '_blank').focus();
            }

            $scope.$on('userLoggedOut', function (evt) {
                $scope.showNpsPopup = true;
                $scope.hideNpsPopUp = true;
            });

            // end NPS pop up section

            // invalid fields modal

            $scope.$watch(function () {
                return $localStorage.isAuthorized && !$localStorage.modalValidateShown
            }, function (isAuth) {
                if (isAuth) {
                    user.validateUserContactData().then(function (response) {
                        if (response.data.hasValidationErrors) {
                            $scope.uiInvalidFields = response.data.invalidFields;
                            $timeout(function () {
                                $('#modalInvalidFields').modal('toggle')
                            }, 2000)
                        }
                        $localStorage.modalValidateShown = true;
                    })
                }
            })

            // end invalid fields modal

            //var vm = this;
            $scope.tooltip = { 'title': 'В режимі навчання Ви можете створювати нові тендери, приймати участь у закупівлях та користуватися іншими функціями у тестовому режимі. Це означає, що ці закупівлі не є справжніми і відображаються лише у режимі навчання.' };
            //Layout logic...

            $rootScope.startFunctionWhenLogin = function () {
                siteSettingsService.getSiteSettings();
                $scope.setWindowHeight();
                $scope.notificationsModal = true;
                $timeout(function () {
                    if ($localStorage.userTenantId) {
                        $scope.choosDocsNotification();
                    }
                }, 5000);
            }

            $scope.showECatalogAlert = new Date() < new Date('2020-02-01');

            $scope.choosDocsNotification = function () {
                var documentWayType = siteSettingsService.getDocumentWayType();
                if (!documentWayType) {
                    $('#choosDocsNotification').modal({
                        backdrop: 'static',
                        keyboard: false
                    });
                } else {
                    $scope.getNotification();
                }
            }

            $scope.trustAsHtml = function (string) {
                return $sce.trustAsHtml(string);
            };

            $scope.setDocumentWayType = function (docsType) {
                var changeDocsType = organization.setDocumentWayType(docsType);
                changeDocsType.then(function (data) {
                    abp.notify.success('Вибір зроблено');
                });
            }


            $scope.getNotification = function () {
                var getMessage = notificationsService.getUnreadNotificationList();
                getMessage.then(function (response) {
                    //console.log(data);
                    $scope.notifications = response.data;
                    var a = 0;
                    for (a; a < $scope.notifications.length; a++) {
                        $scope.notifications[a].show = true;
                    }
                    if ($scope.notifications.length !== 0)
                        $('#notifications').modal({ backdrop: 'static', keyboard: false });
                }
                );
            };

            // get main page class
            $scope.setMainPageClass = function () {
                if ($scope.getPageUrl() === '') {
                    return 'mainPageClass';
                }
            };

            //$scope.getDescription = function() {
            //    if ($scope.getPageUrl() === '') {
            //        return $rootScope.source("DescriptionHead");
            //    }
            //    return ''
            //}

            $scope.confirmedIsReadNotification = function (id) {
                var confirmedIsRead = notificationsService.confirmedIsReadNotification(
                    {
                        notificationId: id,
                        isRead: true
                    }
                );
                confirmedIsRead.then(function (data) {
                });
            }

            $scope.confirmedIsReadNotifications = function () {
                $('#notifications').modal('hide');
                var a = 0;
                var id;
                for (a; a < $scope.notifications.length; a++) {
                    id = $scope.notifications[a].id;
                    $scope.confirmedIsReadNotification(id);
                }
            }

            $scope.readyToChooseTheme = true;

            var winW = jQuery(window).width();
            $scope.winW = winW;

            $rootScope.isIframe = false;

            function parseUrlQuery() {

                var data = {};

                if (location.search) {



                    var pair = (location.search.substr(1)).split('&');

                    for (var i = 0; i < pair.length; i++) {

                        var param = pair[i].split('=');

                        data[param[0]] = param[1];

                    }

                    //if (param[0] !== '__ga')
                    //    $rootScope.isIframe = true;
                    if (window.location !== window.parent.location)
                        $rootScope.isIframe = true;
                }
                return data;
            }

            var protocol = document.location.protocol;
            var host = document.location.host;
            $rootScope.host = $sce.trustAsResourceUrl(protocol + '//' + host);
            $rootScope.aliasForSite = abp.appPath;


            var getQueryParams = parseUrlQuery();

            siteSettingsService.getSiteSettings();

            // this scrip fills abp object and others for current user
            $rootScope.reloadGetScripts = function () {
                var element = $('#scrGetScripts').clone();
                if (element) {
                    element.remove();
                    element.appendTo('head');
                }
            };


            if ($rootScope.isIframe) {
                $scope.iFrameSettingsCss = getQueryParams.theme;
                $localStorage.siteSettings.parentCodeEDRPOU = getQueryParams.parentEdrpou;
                $localStorage.siteSettings.codeEDRPOU = getQueryParams.edrpou ? getQueryParams.edrpou : null;
                $localStorage.siteSettings.codeCPVS = getQueryParams.cpvs ? getQueryParams.cpvs : null;
            }

            if (getQueryParams.th)
                $scope.iFrameSettingsCss = getQueryParams.th;

            $scope.changeTheme = function () {
                $localStorage.theme = $localStorage.siteSettings.css;
                $scope.readyToChooseTheme = false;
                settings.setUserSetting({ settingName: 'theme', settingValue: $localStorage.siteSettings.css })
                    .then(function () {
                        abp.notify.success("Тему змінено!");
                    });
            };

            $scope.autoChangeTheme = function (oldTheme) {
                $localStorage.theme = oldTheme;
                settings.setUserSetting({ settingName: 'theme', settingValue: oldTheme });
            };

            // create the list of bootswatches

            $scope.bootstraps = [
                { name: 'Темний', url: 'styleDarkShare', width: 1024 },
                { name: 'Світлий', url: 'styleLightShare', width: 1024 }
            ];

            $scope.showThemes = function () {
                $scope.readyToChooseTheme = true;
            };

            $rootScope.organization = {
                contactPoint: {},
                identifier: {}
            };

            $scope.submitMode = { moderationMessage: '' };
            $rootScope.openReadyForApprovementDialog = function (prodMode) {
                $('#modalSubmitMode').modal('toggle');
                $rootScope.pm = prodMode;
            };

            $rootScope.setReadyForAprovement = function (prodMode) {

                var input = {
                    forProductionMode: prodMode,
                    requestModerationMessage: $scope.submitMode.moderationMessage
                };

                var setReadyForAprovement = organization.setOrganizationReadyForApprovement(input);
                setReadyForAprovement.then(function () {
                    if (!prodMode) {
                        $localStorage.isOrganizationReadyForApprovementTest = true;
                        abp.notify.success('Дані профіля надіслано на модерацію оператору. Після модерації Ви зможете користуватися системою.');
                    } else {
                        abp.notify.success('Ви подали заявку на модерацію для переходу в режим реальних торгів');
                        $localStorage.isOrganizationReadyForApprovement = true;
                        $localStorage.organization.isAgreementSigned = true;
                    }
                    $scope.submitMode.moderationMessage = '';

                });
                return setReadyForAprovement;
            };

            //$scope.sendRequestForReal = function () {
            //    //TODO: sending moderation function for real tenders
            //    var input = { forProductionMode: true, requestModerationMessage: $rootScope.moderationMessage };

            //    var sendRequestForReal = organization.setOrganizationReadyForApprovement(input);
            //    sendRequestForReal.success(function () {
            //        abp.notify.success('Ви подали заявку на модерацію для переходу в режим реальних торгів');
            //        $rootScope.isOrganizationReadyForApprovement = true;
            //        $localStorage.isOrganizationReadyForApprovement = $rootScope.isOrganizationReadyForApprovement;
            //        $rootScope.moderationMessage = '';
            //    });
            //};

            $scope.changeMode = function (isProdMod) {

                if (isProdMod == true) {
                    var r = confirm("Ви впевнені що хочете перевести організацію в режим реальних торгів?");
                    if (r == false) {
                        return;
                    }
                } else {
                    var r = confirm("Ви впевнені що хочете перевести організацію в режим навчання?");
                    if (r == false) {
                        return;
                    }
                }

                var input = {
                    isProductionMode: isProdMod
                };

                var changeMode = organization.changeMode(input);

                changeMode.then(function (data) {
                    $localStorage.isOrganizationProductionMode = isProdMod;
                    if (isProdMod) {
                        abp.notify.success('Ви перейшли в режим реальних торгів!');
                    } else {
                        abp.notify.success('Ви перейшли в режим навчання!');
                        $rootScope.changeModeTrue = true;
                    }

                });
            };

            //scroll down header animation
            $(window).scroll(function () {
                var scroll = $(window).scrollTop();
                if (scroll <= 300) {
                    $("header").removeClass("resize");
                }
                if (scroll > 300) {
                    $("header").addClass("resize");
                }
            });

            // set windows height for footer
            siteSettingsService.setWindowHeight(); // if restart
            $scope.setWindowHeight = function () { // if login
                $('.mob_top').css('min-height', $(window).height() - 100);
                $timeout(siteSettingsService.setWindowHeight, 500);
            };

            //************* count and create tab ID *********************

            function createtabId() {
                if (sessionStorage.tabId) countTabsFunc();
                var tabId = sessionStorage.tabId && sessionStorage.closedLastTab !== '2' ? sessionStorage.tabId : setSessionStorageId();
                sessionStorage.closedLastTab = '2';
                $(window).on('unload beforeunload', function () {
                    if (sessionStorage.closedLastTab === '1') {
                        var value = Number(localStorage.tabsCount) - 1;
                        localStorage.tabsCount = value.toString();
                    }
                    sessionStorage.closedLastTab = '1';
                });
            }

            function setSessionStorageId() {
                var tabId = Math.random().toString().slice(4, -5);
                sessionStorage.tabId = tabId;
                countTabsFunc();
            }

            function countTabsFunc() {
                $timeout(function () {
                    if (!localStorage.tabsCount || localStorage.tabsCount === 'NaN') localStorage.tabsCount = '0';
                    if (localStorage.tabsCount === '0') {
                        localStorage.tabsCount = '1';
                        return;
                    }
                    var value = Number(localStorage.tabsCount) + 1;
                    localStorage.tabsCount = value.toString();
                }, getRandomMiliSeconds(0, 9));
            }

            function getRandomMiliSeconds(min, max) {
                var value = Math.random() * (max - min) + min;
                value = value + '000';
                return Number(value);
            }

            createtabId();


            //************* END count and create tab ID *******************




            // ************ Exceptions to SEQ *****************************
            window.onerror = function (exception, url, line) {
                treatmentError(exception, url, line);
                return false;
            };

            function treatmentError(exception, url, line) {
                // check if the same error
                if (itIsTheSameError(exception) || window._blockLogException) return;

                // post Exception
                var kindOfError = 'FrontException_layout.js: ';
                abp.postAngularLog(setMessage(exception, url, line), kindOfError);
            }

            // check if the same error
            function itIsTheSameError(exception) {
                if ($scope.exception && $scope.exception === exception) return true;
                $scope.exception = exception;
                return false;
            }

            // set message to SEQ
            function setMessage(exception, url, line) {
                var msg = {
                    exceptionMessage: exception,
                    url: '***URL: ' + window.location.href + ' ***',
                    exceptionStack: url + line
                };
                return msg;
            }

            // post Exception
            abp.postAngularLog = function(msg, kindOfError) {
                var errorData = {
                    exceptionMessage : msg.exceptionMessage,
                    exceptionStack : msg.exceptionStack,
                    url : msg.url
                };
                logService.logException(errorData);
                console.log(kindOfError + 'posted to SEQ', msg);
            };

            // ************ END exceptions to SEQ *********************

            $scope.getPageUrl = function () {
                return $location.$$path.replace('/', '');
            };


            // add remove class to active href prozorro_url in head (red color)
            $scope.$on('$locationChangeStart', function (event) {
                if (($scope.getPageUrl().indexOf('register') !== -1 ||
                    $scope.getPageUrl().indexOf('createProfile') !== -1 ||
                    $scope.getPageUrl().indexOf('accessionTreaty') !== -1 ||
                    $scope.getPageUrl().indexOf('applicationBlank') !== -1) &&
                    $(".prozorro_url-cative")) {
                    $(".prozorro_url").removeClass("prozorro_url-cative");
                } else if ($(".prozorro_url-cative").length === 0) {
                    $(".prozorro_url").addClass("prozorro_url-cative");
                }
            });


            $scope.resetTimeOutSession = function() {
                $scope.$broadcast('resetTimeOutSession');
            };

        }]);
}) ();
;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('sideBarCtrl', tenderDetailes);

    tenderDetailes.$inject = ['$scope', '$rootScope', 'userDataService', 'organizationDataService', '$controller','$filter', 'abp.services.etender.generalInfo'];
    function tenderDetailes($scope, $rootScope, userDataService, organizationDataService, $controller, $filter, generalInfo) {
        angular.extend(this, $controller('sidebarBaseCtrl', {
            $scope: $scope
        }));

        var vm = this;
        vm.menu = abp.nav.menus.MainMenu;
        // generait menus and sidebar function *******************************************
        $scope.generatMenus = function () {

            // Organization menu ****************************************
            $rootScope.organizationTabs = [];
            $scope.isAnalyticsAdded = false;

            if ($scope.ng_localStorage.userTenantId) {
                $rootScope.organizationTabs.push(
                    {
                        heading: $rootScope.source('MyOrganizationData'),
                        view: '/OrganizationData',
                        route: 'OrganizationData'
                    }
                );
            };
            if ($scope.ng_localStorage.isAdmin || $scope.ng_localStorage.isChiefAccountant)
                $rootScope.organizationTabs.push(
                    {
                        heading: $rootScope.source("AuthorizedBodies"),
                        view: '/AuthorizedBodies',
                        li_class: 'fa fa-thumbs-up',
                        includedToView: true
                    }
                );

                $rootScope.organizationTabs.push(
                    {
                        heading: 'Підрозділи',
                        view: '/divisions',
                        li_class: 'fa fa-thumbs-up',
                        includedToView: true
                    }
                );
                $rootScope.organizationTabs.push(
                    {
                        heading: 'Налаштування',
                        view: '/OrganizationSettings',
                        li_class: 'fa fa-thumbs-up',
                        includedToView: true
                    }
                );
            // Organization menu END ****************************************


            // User menu ****************************************
            $rootScope.userTabs = [
                {
                    heading: $rootScope.source('MyData'),
                    view: '/UserData',
                    route: 'UserData'
                }];
            if ($scope.ng_localStorage.isPreCustomer || $scope.ng_localStorage.isCustomer) {
                $rootScope.userTabs.push(
                    {
                        heading: $rootScope.source('MyEmailGroups'),
                        view: '/MyEmailGroups',
                        route: 'MyEmailGroups'
                    });
            };
            $rootScope.userTabs.push(
                {
                    heading: 'Мессенджери',
                    view: '/Messengers',
                    route: 'messengers'
                });
            $rootScope.userTabs.push(
                {
                    heading: 'Налаштування',
                    view: '/UserSettings',
                    route: 'UserSettings'
                });
            //$rootScope.userTabs.push(
            //    {
            //        heading: 'Test unsubscribe',
            //        view: '/unsubscribe',
            //        route: 'unsubscribeExternal'
            //    });
            // User menu END ****************************************


            vm.profileSetingsTabs = [];
            vm.profileTabs = [];
        };
        // generait menus and sidebar functions END **************************************

        $scope.start();

        $scope.sidebarCollapseChanged = function () {
            $rootScope.$broadcast('onSidebarCollapseChanged');
        };

        if (!$scope.ng_localStorage.sideBarMenu) {
            generalInfo.getGeneralInfo().then(function (response) {
                $scope.ng_localStorage.sideBarMenu = response.data.menuItems;
            });
        }
        
        $scope.newAngularView = function () { window.location.href = 'v2/#/relocation'; }

    }
})();

;
angular.module('app').directive('holdingFilterButtons', [
    '$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('holdingFilterButtons from cache'),
            scope: {
                reload: '=',
                found: '='
            },
            controller: [
                '$scope',
                function ($scope) {
                    var isFirstInteract = true;
                    $scope.filterByTenderCorporationStatus = function (status) {
                        if (isFirstInteract) {
                            isFirstInteract = false;
                            $scope.statuses = [];
                        }
                        if (status === 'all') {
                            $scope.statuses = [];
                            isFirstInteract = true;
                            $scope.reload($scope.statuses);
                            return;
                        }
                        if (_.contains($scope.statuses, status)) {
                            var excluded = _.without($scope.statuses, status);
                            $scope.statuses = excluded;
                        } else {
                            $scope.statuses.push(status)
                        }
                        $scope.reload($scope.statuses);
                    }
                }
            ]
        }
    }
]);
(function () {
    'use strict';

    angular
        .module('app')
        .controller('myTendersCtrl', myTenders);

    myTenders.$inject = [
        '$scope',
        '$rootScope',
        '$timeout',
        '$location',
        'ngTableParams',
        'abp.services.etender.tender',
        'lookupService',
        'tenderHelperService',
        'abp.services.etender.reference',
        '$localStorage',
        '$sessionStorage',
        'specialDataService',
        'siteSettingsService',
        'classificationSearchService',
        'datesHelperService',
        'filterSearchService',
        'abp.services.etender.readTender',
        'referenceService',
        'urlService',
        'abp.services.etender.tenderCorporation'];
    function myTenders(
        $scope,
        $rootScope,
        $timeout,
        $location,
        ngTableParams,
        tenderAppService,
        lookupService,
        tenderHelperService,
        abpReferenceService,
        $localStorage,
        $sessionStorage,
        specialDataService,
        siteSettingsService,
        classificationSearchService,
        datesHelperService,
        filterSearchService,
        readTenderAppService,
        referenceService,
        urlService,
        tenderCorporation) {

        $scope.ng_localStorage = $localStorage;
        $scope.ng_sessionStorage = $sessionStorage;
        // date today
        var s = new Date();
        $scope.dateToDay = Date.parse(s);
        $scope.detailes = {};
        $scope.openFilter = false;
        $scope.searchFilter = {};
        $scope.showClearFilterButton = false;
        $scope.filterForMyTenders = true;
        // hrefs to create tender whith template
	    /*var hrefs = {
	        belowThreshold: '/createTender/',
	        aboveThresholdUA: '/createTenderAbove/',
	        aboveThresholdEU: '/createTenderAboveEu/'
	    };*/

        $scope.localization = {
            searchById: $rootScope.source('SearchByTenderID'),
            title: $rootScope.source('TenderTitle')
        };

        $scope.vm = {
            clear: clear,
            getLabelClass: getLabelClass,
            getTenderDesc: getTenderDesc,
            getStatusDetails: getStatusDetails,
            //goToCreate: goToCreate,
            isPriceIntervalValid: isPriceIntervalValid,
            paramsToggle: paramsToggle,
            regex: {
                number: $rootScope.regex.number,
                cpv: /^\d{8}\-\d{1}$/
            },
            search: search,
            searchChange: searchChange,
            searchIdentifier: null,
            setSelected: setSelected,
            statuses: [],
            sProcedureType: null,
            selectedProcTypes: [],
            selectedStatuses: [],
            selectedCpvs: [],
            selectedCpvsCode: [],
            procurementMethod: getProcMethods(), // $sessionStorage.procTypeMyTenders || [$scope.ng_localStorage.selProcurMethod && $scope.ng_localStorage.selProcurMethod !== undefined ? $scope.ng_localStorage.selProcurMethod : 'open', 'selective'],
            isArchive: false,
            getProcTypes: getProcTypes,
            procTypesDictionary: null,
            changeSelProcTypes: changeSelProcTypes,
            changeSelCpvs: changeSelCpvs,
            getTenderProcedureType: getTenderProcedureType,
            checkedProcTypes: [],
            checkedStatuses: [],
            procTypeSearchText: null,
            statusSearchText: null,
            statusSearchLabel: null,
            checkCpvExists: checkCpvExists,
            customTendTitle: customTendTitle,
            cpvNotExists: null,
            procTypeClicked: procTypeClicked,
            archiveClicked: archiveClicked,
            closeProcTypDropDown: closeProcTypDropDown,
            closeStatDropDown: closeStatDropDown,
            loadTemplates: loadTemplates,
            tenderTemplSelected: tenderTemplSelected,
            removeTemplate: removeTemplate,
            forceCheckSignClick: forceCheckSignClick,
            validDateFromAndTo: validDateFromAndTo,
            showSignM: showSignM,
            pageNameForFilter: 'myTenders',
            mainProcurementCategory: null,
            milestoneCodeType: null
            /*,
            hrefs: hrefs*/
            //isShowOnlyTendersCreatedOnOurSite: true,
        };

        var vm = $scope.vm;
        var simpleProcType = { id: 15, procurementMethod: 'open', title: 'Спрощена закупівля', procurementMethodType: 'belowThresholdSimple', procurementMethodTypeDescription: 'Спрощена закупівля', procurementMethodTypeLocal: 'Спрощена закупівля', isSimpleProcurementMethodRationale: false };

        function getProcMethods() {
            if ($sessionStorage.procTypeMyTenders && !angular.equals($sessionStorage.procTypeMyTenders, ['archive']))
                return $sessionStorage.procTypeMyTenders;
            return [
                $scope.ng_localStorage.selProcurMethod && $scope.ng_localStorage.selProcurMethod !== undefined
                    ? $scope.ng_localStorage.selProcurMethod
                    : 'open', 'selective'
            ];
        }

        if ($sessionStorage.userFilterMyTender) {
            $scope.vm.filter = $sessionStorage.userFilterMyTender;
        } else {
            $scope.vm.filter = {
                description: null,
                classificationCpv: null,
                classificationDkpp: null,
                organisation: null,
                parentCodeEDRPOU: null,
                priceFrom: null,
                priceTo: null,
                tenderCreationTimeTo: '',
                tenderCreationTimeFrom: '',
                tenderPeriodStartFrom: '',
                tenderPeriodStartTo: '',
                tenderPeriodEndFrom: '',
                tenderPeriodEndTo: '',
                title: null,
                customerRegion: '',
                tendersKind: '',
                funderId: null,
                mainProcurementCategory: null,
                milestoneCodeType: null
            };
        };


        $scope.statuses = specialDataService.statuses;

        activate();

        $scope.$watch('ng_localStorage.organizationKindId', function () {
            // onchange of status in controller 1
            fillProcedureTypesEnabling();
        });



        function activate() {
            if (!vm.procTypesDictionary) vm.procTypesDictionary = [];
            var page = urlService.redirectToCorrectPage();
            vm.tableParams = new ngTableParams({
                page: page,
                count: 10,
                sorting: {
                    '': 'desc'
                },

            }, {
                    total: 0,
                    counts: [50, 100, 250],
                    getData: getData
                });
            setStatuses();
            vm.statuses = getStatusDetails();
            vm.procedureTypes = specialDataService.procedureTypes;
        };

        if ($sessionStorage.userSelectedStatusMyTender && $sessionStorage.userSelectedStatusMyTender) {
            vm.selectedStatuses = $sessionStorage.userSelectedStatusMyTender;
            makeSelectedStatusesChecked();
        }
        //} else {
        //    $scope.vm.selectedStatuses = [];
        //}

        $scope.filterProcTypes = function (procTypes) {
            return filterSearchService.filterProcTypes(procTypes, vm);
        }


        $scope.getClearFilterButton = function () {
            if (
                !$scope.searchFilter.priceFrom &&
                !$scope.searchFilter.priceTo &&
                !$scope.searchFilter.tendersKind &&
                $scope.searchFilter.procurementMethod === vm.procurementMethod &&
                $scope.searchFilter.procurementMethodTypes.length === 0 &&
                (angular.equals($scope.searchFilter.statuses, $scope.statuses) ||
                    $scope.searchFilter.statuses === specialDataService.statusesMyTendersLimited ||
                    $scope.searchFilter.statuses === specialDataService.statusesMyTendersArchive) &&
                !$scope.searchFilter.dkpp &&
                !$scope.searchFilter.title &&
                !$scope.searchFilter.organizationName &&
                !$scope.searchFilter.tenderPeriodEndFrom &&
                !$scope.searchFilter.tenderPeriodEndTo &&
                !$scope.searchFilter.tenderCreationTimeFrom &&
                !$scope.searchFilter.tenderCreationTimeTo &&
                !$scope.searchFilter.tenderPeriodStartFrom &&
                !$scope.searchFilter.tenderPeriodStartTo &&
                !$scope.searchFilter.customerRegion &&
                !$scope.searchFilter.parentCodesEDRPOU &&
                !$scope.searchFilter.funderId &&
                !$scope.searchFilter.mainProcurementCategory &&
                !$scope.searchFilter.milestoneCodeType &&
                vm.selectedCpvs.length === 0 &&
                !vm.searchIdentifier &&
                !$scope.searchFilter.isCovid19 &&
                !$scope.searchFilter.isDirectOrder) {
                $scope.showClearFilterButton = false;
                return;
            }
            $scope.showClearFilterButton = true;
        }

        $scope.setProcTypesChecked = function () {
            if ($sessionStorage.userSelectedProcTypesMyTender && $sessionStorage.userSelectedProcTypesMyTender) {
                vm.selectedProcTypes = $sessionStorage.userSelectedProcTypesMyTender;
                if (!vm.procTypesDictionary.length) getProcTypes();
            }
        }
        $scope.setProcTypesChecked();

        if ($sessionStorage.userSelectedCpvsMyTender && $sessionStorage.userSelectedCpvsMyTender) {
            vm.selectedCpvs = $sessionStorage.userSelectedCpvsMyTender;
        }

        if ($sessionStorage.userSelectedOrgCodesMyTender && $sessionStorage.userSelectedOrgCodesMyTender) {
            vm.selectedOrgCodes = $sessionStorage.userSelectedOrgCodesMyTender;
        }

        function getTenderProcedureType(tender) {
            if (!tender) return null;
            var isSimple = tender.isSimpleProcurementMethodRationale && tender.isSimpleProcurementMethodRationale !== undefined;
            if (isSimple) {
                tender.procurementMethodType = 'belowThresholdSimple';
            }
            return lookupService.getTenderProcedureType(tender.procurementMethodType, isSimple);
        };

        function getProcTypes() {
            //if (vm.procTypesDictionary.length > 0) return;

            abp.ui.setBusy("#procTypesFilter");
            referenceService
                .getAllProcTypes()
                .then(function (response) {
                    if (response.data) {
                        angular.forEach(response.data.procTypes, function (pType) {
                            pType.procurementMethodTypeLocal = lookupService.getTenderProcedureType(pType.procurementMethodType);
                        });
                        $scope.allProcTypes = response.data.procTypes;
                        $scope.allProcTypes.splice(4, 0, simpleProcType);
                        angular.forEach($scope.allProcTypes, function (type) {
                            if (type.procurementMethodTypeLocal == 'Спрощена/Допорогова закупівля') {
                                type.procurementMethodTypeLocal = 'Допорогова закупівля';
                            }
                        });
                        getProcTypes();
                        makeSelectedProcTypesChecked();
                    }
                    abp.ui.clearBusy("#procTypesFilter");
                }, function () {
                    abp.ui.clearBusy("#procTypesFilter");
                });

            function getProcTypes() {
                var arr = $scope.allProcTypes;
                vm.procTypesDictionary = $scope.filterProcTypes(arr);
                vm.checkedProcTypes.length = vm.procTypesDictionary.length;
                //vm.checkedProcTypes.fill(false);
            }
        };

        function makeProcTypeSearchText() {
            vm.procTypeSearchText = null;
            angular.forEach(vm.selectedProcTypes, function (pType) {
                angular.forEach(vm.procTypesDictionary, function (dict) {
                    if (dict.procurementMethodType === pType &&
                        (!vm.procTypeSearchText || vm.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                        vm.procTypeSearchText = vm.procTypeSearchText ? vm.procTypeSearchText + dict.procurementMethodTypeLocal + '; ' : dict.procurementMethodTypeLocal + '; ';
                });
            });
            angular.forEach($scope.selectedProcTypes, function (simpleProc) {
                if (simpleProc == 'simple') {
                    return simpleProcType.isSimpleProcurementMethodRationale = true;
                }
                return simpleProcType.isSimpleProcurementMethodRationale = false;
            });
        }

        function changeSelProcTypes(procType, checked) {
            if (procType) {
                if (checked) vm.selectedProcTypes.push(procType.procurementMethodType);
                else vm.selectedProcTypes.splice(vm.selectedProcTypes.indexOf(procType.procurementMethodType), 1);
                makeProcTypeSearchText();
            } else if (checked) {
                vm.selectedProcTypes = [];
                vm.checkedProcTypes = [];
                vm.procTypeSearchText = null;
            }
        };

        function changeSelCpvs(cpv, remove) {
            if (cpv) {
                if (!remove)
                    vm.selectedCpvs.push(cpv);
                else vm.selectedCpvs.splice(vm.selectedCpvs.indexOf(cpv), 1);
            }
        }

        //#region Model
        function clear() {
            vm.searchIdentifier = null;
            vm.filter = {
                description: null,
                classificationCpv: null,
                classificationDkpp: null,
                organisation: null,
                parentCodeEDRPOU: null,
                priceFrom: null,
                priceTo: null,
                tenderCreationTimeFrom: '',
                tenderCreationTimeTo: '',
                tenderPeriodStartFrom: '',
                tenderPeriodStartTo: '',
                tenderPeriodEndFrom: '',
                tenderPeriodEndTo: '',
                title: null,
                customerRegion: '',
                tendersKind: '',
                funderId: null,
                mainProcurementCategory: null,
                milestoneCodeType: null
            };
            $rootScope.$broadcast('clearFunder', true);
            vm.selectedStatuses = [];
            vm.checkedStatuses = [];
            vm.statusSearchText = null;
            vm.statusSearchLabel = null;
            vm.selectedProcTypes = [];
            vm.checkedProcTypes = [];
            vm.procTypeSearchText = null;
            vm.selectedOrgCodes = [];
            $scope.getClearFilterButton();
            clearSessionStorage();
            if (vm.selectedCpvs.length > 0) {
                vm.selectedCpvs = [];
                $rootScope.clearCheckbox();
            }
        }

        function clearSessionStorage() {
            $sessionStorage.userFilterMyTender = vm.filter;
            $sessionStorage.userSelectedStatusMyTender = null;
            $sessionStorage.userSelectedProcTypesMyTender = null;
            $sessionStorage.userSelectedCpvsMyTender = null;
            $sessionStorage.userSelectedOrgCodesMyTender = null;
        }

        function getLabelClass(s, c) {
            return lookupService.getTenderLabelClass(s, c);
        };
        function getTenderDesc(tender) {
            return lookupService.getTenderStatusDesc(tender.status, tender.procurementMethodType, tender.notExport, tender.tenderCorporationStatus); //4-ый параметр только для таблицы холдинга
        };

        function isPriceIntervalValid() {
            var from = parseInt(vm.filter.priceFrom);
            var to = parseInt(vm.filter.priceTo);
            if (isNaN(from) || isNaN(to)) {
                return true;
            }
            if (from <= to) {
                return true;
            }
            return false;
        };
        function paramsToggle() {
            $scope.openFilter = !$scope.openFilter;
            $('#searchParameters').collapse('toggle');
            $('#paramsCaret').toggleClass('fa-caret-up');
        };

        function makeStatusSearchText() {
            vm.statusSearchText = null;
            angular.forEach(vm.selectedStatuses, function (status) {
                angular.forEach(vm.statuses, function (dict) {
                    if (dict.name === status &&
                        (!vm.statusSearchText || vm.statusSearchText.indexOf(dict.desc) === -1))
                        vm.statusSearchText = vm.statusSearchText ? vm.statusSearchText + dict.desc + '; ' : dict.desc + '; ';
                });
            });
        }

        function makeStatusSearchLabel() {
            vm.statusSearchLabel = null;
            if (vm.selectedStatuses.length === 1)
                angular.forEach(vm.statuses, function (dict) {
                    if (dict.name === vm.selectedStatuses[0])
                        vm.statusSearchLabel = dict.labelClass;
                });
        }

        function makeSelectedStatusesChecked() {
            filterSearchService.makeStatusSearchText(vm);
            filterSearchService.makeSelectedStatusesChecked(vm);
        }

        function makeSelectedProcTypesChecked() {
            if (vm.selectedProcTypes.length > 0) {
                angular.forEach(vm.procTypesDictionary, function (procType) {
                    if (vm.selectedProcTypes.indexOf(procType.procurementMethodType) > -1)
                        vm.checkedProcTypes[vm.procTypesDictionary.indexOf(procType)] = true;
                });
                makeProcTypeSearchText();
            }
        }

        function reloadTable() {
            if (vm.tableParams.page() === 1) {
                vm.tableParams.reload();
            } else {
                vm.tableParams.page(1);
            }
        }

        function setSelected(s, checked) {
            filterSearchService.setSelected(s, checked, vm);
        }
        function search() {
            reloadTable();
        }
        var timer;
        function searchChange() {
            // try window.setTimeout
            $timeout.cancel(timer);
            timer = $timeout(function () {
                reloadTable();
            }, 1000);
        }
        //#endregion

        function removeNotActualProcedures(procedureTypes) {
            vm.procedureTypes = procedureTypes.filter(function (x) {
                return x.type !== "aboveThresholdUA.defense";
            });
        }

        //#region Internal
        function fillProcedureTypesEnabling() {
            removeNotActualProcedures(vm.procedureTypes);
            // доступность типов процедур в зависимости от Типа Заказчика
            angular.forEach(vm.procedureTypes, function (type) {

                var A = $scope.ng_localStorage.organizationKindId == 1; // general
                var B = $scope.ng_localStorage.organizationKindId == 3; // special
                var C = $scope.ng_localStorage.organizationKindId == 2; // defense
                var D = $scope.ng_localStorage.organizationKindId == 4; // other
                var E = $scope.ng_localStorage.organizationKindId == 5; // central
                var F = $scope.ng_localStorage.organizationKindId == 6; // authority 
                var G = $scope.ng_localStorage.organizationKindId == 7; // social 

                switch (type.href) {
                    case '/createTender':
                        type.isEnabled = A || B || C || D || E || F || G;
                        break;
                    case '/createTenderAbove':
                        type.isEnabled = A || B || C || E || F || G;
                        break;
                    case '/createTenderAboveEu':
                        type.isEnabled = A || B || C || E || F || G;
                        break;
                    case '/createTenderLimitedReporting':
                        type.isEnabled = A || B || C || D || E || F || G;
                        break;
                    case '/createTenderLimited':
                        type.isEnabled = A || B || C || E || F || G;
                        break;
                    case '/createTenderLimitedQuick':
                        type.isEnabled = A || B || C || E || F || G;
                        break;
                    case '/createTenderSimpleDefense':
                        type.isEnabled = C;
                        break;
                    case '/createTenderPriceQuotation':
                        type.isEnabled = A || B || C || D || F || G;
                        break;
                    default:
                        type.isEnabled = A || B || C || E || F || G;
                        break;
                }
            });
        }

        var end;
        $scope.end = [];

        $scope.tenderCorporationStatusesObj = {
            statuses: [],
            tendersKind: "notExport"
        };
        function getData($defer, params) {
            abp.ui.setBusy('.my-tenders');
            var orderBy = params.orderBy(); // add '-' on start str
            var sorting = params.sorting();
            var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'tenderStartDate';
            var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
            var page = params.page();
            
            $rootScope.lastPage = page;
            if ($scope.vm.procurementMethod[0] === 'holding') {
                var pager = setPagerForTendersSearch(page, orderColumn, orderDirection, params);
                pager.TenderCorporationStatuses = $scope.tenderCorporationStatusesObj.statuses;
                if ($scope.tenderCorporationStatusesObj.statuses.length) {
                    pager.SearchFilter = { tendersKind: $scope.tenderCorporationStatusesObj.tendersKind }
                }

                getTenderCorporation(pager, params, $defer);
            } else {
                var pager = setPagerForTendersSearch(page, orderColumn, orderDirection, params);
                pager.searchFilter = getSearchFilter();
                pager.searchIdentifier = vm.searchIdentifier;
                pager.fieldsForCustomer = $scope.ng_localStorage.isCustomer || $scope.ng_localStorage.isPreCustomer;

                getAllTendersApp(pager, params, $defer);
            }
        }

        function setPagerForTendersSearch(page, orderColumn, orderDirection, params) {
            var pager = {
                page: page,
                pageSize: params.count(),
                orderColumn: orderColumn,
                orderDirection: orderDirection
            }
            return pager;
        }
        function getTenderCorporation(pager, params, $defer) {
            tenderCorporation.getTendersOfCorporation(pager).then(function (response) {
                var data = response.data;
                $scope.tenders = data;
                params.total(data.countAllRecords);
                $defer.resolve(data.tender);
                abp.ui.clearBusy('.my-tenders');
            });
        }
        function getAllTendersApp(pager, params, $defer) {
            readTenderAppService.getTenders(pager).then(function (response) {
                abp.ui.clearBusy('.my-tenders');
                var data = response.data;
                if (data.tender.length === 0 &&
                    params.$params.page !== 0) params.page(1);
                console.log('myTenders:', data);
                $scope.tenders = data;
                if (data.tender)
                    for (var i = 0; i < data.tender.length; i++) {
                        end = data.tender[i].tenderEndDate;
                        $scope.end[i] = Date.parse(end);
                        data.tender[i].isSigned = undefined;
                        data.tender[i].forceCheckSign = undefined;
                        if ($scope.ng_localStorage.isCustomer || $scope.ng_localStorage.isPreCustomer)
                            data.tender[i].validDocPeriod = tenderHelperService.validDocPeriod(data.tender[i]);
                    }
                params.total(data.countAllRecords);
                $scope.vm.allRecords = data.countAllRecords;
                siteSettingsService.onScrollFilter();
                getSearchFilter();
                $scope.getClearFilterButton();
                $defer.resolve(data.tender);
            });
        }

        function getAllCpvs() {
            var allCpvs = [];
            if (!$scope.childCpvs) $scope.childCpvs = [];
            for (var i = 0; i < $scope.vm.selectedCpvs.length; i++) {
                allCpvs.push($scope.vm.selectedCpvs[i].code);
            }
            $scope.vm.selectedCpvs.concat($scope.childCpvs);
            return allCpvs;
        }

        function setStatuses() {
            if ($sessionStorage.userFilterMyTender && $sessionStorage.userFilterMyTender.tendersKind === 'activated') {
                $scope.statuses = specialDataService.statusesForActivated;
            } else {
                $scope.statuses = specialDataService.statuses;
            }
            if ($sessionStorage.procTypeMyTenders && angular.equals($sessionStorage.procTypeMyTenders, ['archive']))
                $scope.statuses = specialDataService.statusesMyTendersArchive;
            if ($sessionStorage.procTypeMyTenders && angular.equals($sessionStorage.procTypeMyTenders, ['limited']))
                $scope.statuses = specialDataService.statusesMyTendersLimited;
            return vm.selectedStatuses && vm.selectedStatuses.length > 0 ? vm.selectedStatuses : $scope.statuses;
        }

        function getSearchFilter() {
            $scope.searchFilter.userName = $scope.ng_localStorage.username;
            $scope.searchFilter.priceFrom = vm.filter.priceFrom;
            $scope.searchFilter.priceTo = vm.filter.priceTo;
            $scope.searchFilter.tendersKind = vm.filter.tendersKind;
            $scope.searchFilter.procurementMethod = vm.procurementMethod;
            $scope.searchFilter.procurementMethodTypes = vm.selectedProcTypes;
            $scope.searchFilter.statuses = setStatuses();
            $scope.searchFilter.isStasusesDefaulted = !vm.isArchive && vm.selectedStatuses && (vm.selectedStatuses.length > 0 ? false : true)/* used for cache on server */;
            $scope.searchFilter.cpvs = getAllCpvs();
            $scope.searchFilter.dkpp = vm.filter.classificationDkpp;
            $scope.searchFilter.title = vm.filter.title;
            $scope.searchFilter.organizationName = vm.filter.organisation;
            $scope.searchFilter.tenderPeriodEndFrom = vm.filter.tenderPeriodEndFrom;
            $scope.searchFilter.tenderPeriodEndTo = vm.filter.tenderPeriodEndTo;
            $scope.searchFilter.tenderCreationTimeFrom = vm.filter.tenderCreationTimeFrom;
            $scope.searchFilter.tenderCreationTimeTo = vm.filter.tenderCreationTimeTo;
            $scope.searchFilter.tenderPeriodStartFrom = vm.filter.tenderPeriodStartFrom;
            $scope.searchFilter.tenderPeriodStartTo = vm.filter.tenderPeriodStartTo;
            //searchFilter.isShowOnlyTendersCreatedOnOurSite = $scope.vm.isShowOnlyTendersCreatedOnOurSite;
            $scope.searchFilter.customerRegion = vm.filter.customerRegion;
            $scope.searchFilter.parentCodesEDRPOU = [vm.filter.parentCodeEDRPOU] == "" ? null : [vm.filter.parentCodeEDRPOU];
            $scope.searchFilter.funderId = vm.filter.funder ? vm.filter.funder.id : null;
            $scope.searchFilter.mainProcurementCategory = vm.filter.mainProcurementCategory && vm.filter.mainProcurementCategory.value || null;
            $scope.searchFilter.milestoneCodeType = vm.filter.milestoneCodeType && vm.filter.milestoneCodeType.value || null;
            $scope.searchFilter.isCovid19 = vm.filter.isCovid19;
            $scope.searchFilter.isDirectOrder = vm.filter.isDirectOrder;
            if (simpleProcType.isSimpleProcurementMethodRationale) {
                $scope.tenderTableFilter.userSelectedProcTypes.push(simpleProcType.procurementMethodType);
            }
            setSessionStorage();
            return $scope.searchFilter;
        }
        function setSessionStorage() {
            $sessionStorage.userFilterMyTender = $scope.vm.filter;
            $sessionStorage.userSelectedStatusMyTender = $scope.vm.selectedStatuses;
            $sessionStorage.userSelectedProcTypesMyTender = $scope.vm.selectedProcTypes;
            $sessionStorage.userSelectedCpvsMyTender = $scope.vm.selectedCpvs;
            $sessionStorage.userSelectedOrgCodesMyTender = $scope.vm.selectedOrgCodes;
        };

        function getStatusDetails() {
            var r = [];
            for (var i = 0; i < $scope.statuses.length; i += 1) {
                r.push({
                    name: $scope.statuses[i],
                    desc: lookupService.getTenderStatusDesc($scope.statuses[i]),
                    labelClass: getLabelClass($scope.statuses[i])
                });
            }
            return r;
        }
        //#endregion

        function checkCpvExists(cpv, isValidInput) {
            if (!isValidInput || !cpv) {
                vm.cpvNotExists = null;
                return;
            }
            abp.ui.setBusy("#cpvFilter");
            abpReferenceService
                .isCpvExists({ code: cpv })
                .then(function (response) {
                    if (response.data) vm.cpvNotExists = false;
                    else vm.cpvNotExists = true;
                    abp.ui.clearBusy("#cpvFilter");
                }, function (e) {
                    abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                    vm.cpvNotExists = true;
                    abp.ui.clearBusy("#cpvFilter");
                });
        }

        function customTendTitle(title) {
            return tenderHelperService.customTendTitle(title);
        };

        function procurementMethodChanged(val) {
            if (!vm.isArchive) {
                if (val.indexOf("limited") > -1) {
                    $scope.statuses = specialDataService.statusesMyTendersLimited;
                }
                else {
                    $scope.statuses = specialDataService.statuses;
                }
            } else {
                $scope.statuses = ['unsuccessful', 'complete', 'cancelled'];
            }
            vm.procTypeSearchText = null;
            vm.statusSearchText = null;
            vm.statusSearchLabel = null;
            vm.statuses = getStatusDetails();
            vm.procTypesDictionary = [];
            vm.selectedProcTypes = [];
            vm.selectedStatuses = [];
            vm.checkedProcTypes = [];
            vm.checkedStatuses = [];
            vm.filter.isCovid19 = false;
            vm.filter.isDirectOrder = false;
        }

        function isArchiveChanged() {
            $scope.showCovidAndDirectOrderChecboxes = false;
            $scope.statuses = specialDataService.statusesMyTendersArchive;
            vm.procTypeSearchText = null;
            vm.statusSearchText = null;
            vm.statusSearchLabel = null;
            vm.statuses = getStatusDetails();
            vm.procTypesDictionary = [];
            vm.selectedProcTypes = [];
            vm.selectedStatuses = [];
            vm.checkedProcTypes = [];
            vm.checkedStatuses = [];
        }

        $scope.showCovidAndDirectOrderChecboxes = angular.equals($sessionStorage.procTypeMyTenders, ['limited']);
        function procTypeClicked(procType) {
            $sessionStorage.procTypeMyTenders = procType;
            vm.procurementMethod = procType;
            vm.isArchive = false;
            $scope.showCovidAndDirectOrderChecboxes = angular.equals($sessionStorage.procTypeMyTenders, ['limited']);
            procurementMethodChanged(procType);
            reloadTable();
        };

        function archiveClicked() {
            $sessionStorage.procTypeMyTenders = ['archive'];
            vm.procurementMethod = ['open', 'selective'];
            vm.isArchive = true;
            isArchiveChanged(true);
            reloadTable();
        }

        // ******* navigation *******


        function closeProcTypDropDown() {
            vm.isProcTypOpen = false;
        }

        function closeStatDropDown() {
            vm.isStatOpen = false;
        };

        function loadTemplates() {
            abp.ui.setBusy();
            var getTemplates = tenderAppService.getTenderTemplates({ userName: $scope.ng_localStorage.username });
            getTemplates
                .then(function (response) {
                    vm.tenderTemplates = response.data;
                    abp.ui.clearBusy();
                }, function (err) {
                    console.log(err.data);
                    abp.ui.clearBusy();
                });
        }

        function getHrefByType(procType) {
            var i = 0;
            for (i; i < vm.procedureTypes.length; i++) {
                if (vm.procedureTypes[i].type === procType)
                    return vm.procedureTypes[i].href;
            }
            //return vm.procedureTypes.find(x => x.type === procType).href;
        }

        function tenderTemplSelected(templ) {
            //var u = hrefs[templ.procurementMethodType] + templ.id
            var u = getHrefByType(templ.procurementMethodType) + '/' + templ.id;
            if (templ.procurementMethodType === 'belowThresholdSimple' || templ.procurementMethodType === 'belowThreshold') {
                u += '/' + templ.procurementMethodType
            }
            tenderHelperService.selectedProcType = templ.procurementMethodType;
            $location.path(u);
        }

        function removeTemplate(templ) {
            if (confirm('Ви підтверджуєте видалення шаблону?')) {
                tenderAppService
                    .deleteTemplate(templ)
                    .then(function () {
                        abp.notify.success('Успішно видалено.');
                        vm.tenderTemplates.splice(vm.tenderTemplates.indexOf(templ), 1);
                    }, function (e) {
                        abp.notify.error(e.data);
                    });
            }
        }

        function forceCheckSignClick(tender) {
            tender.forceCheckSign = true;
        }

        function showSignM(tender) {
            var obj = {};
            obj.type = 'tender';
            $scope.detailes = tender;
            $scope.$emit('showModalSign', obj, tender);
        };

        $scope.reload = function (statuses) {
            if (statuses) {
                $scope.tenderCorporationStatusesObj.statuses = statuses;
            }
            reloadTable();
        };

        //#region Init Classification
        $scope.cleareChildCpv = function (cpvs) {
            vm.changeSelCpvs(cpvs.code, true);
        };

        $scope.initClassification = function () {
            classificationSearchService.initClassification($scope, $scope.vm.selectedCpvs);
        }

        function validDateFromAndTo(dateFrom, dateTo) {
            return datesHelperService.validDateFromAndTo(dateFrom, dateTo);
        }

    }
})();;
(function () {
    'use strict';
    
    angular
        .module('app')
        .controller('aboutCtrl', news);

    news.$inject = ['$scope', '$http'];

    function news($scope, $http) {
        $http.get('~/App/Main/base/data/about.txt')
            .then(function (response) {
                $scope.text = response.data;
            }, function () { $scope.text = "Файл не знайдено"; });
    }
})();;
(function () {
    var controllerId = 'editUserCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', 'abp.services.etender.user', 'abp.services.etender.organization',
        function ($rootscope, $scope, user, organization) {

            $scope.vm = {
                regexEmail: $rootscope.regex.email,
                users: {},
                usersForActivateOrBlocked: {},
                emailsForChange: {},
                searchUsersForActivateEmail: searchUsersForActivateEmail,
                activateUserEmail: activateUserEmail,
                activateOrBlockedUser: activateOrBlockedUser,
                searchOrgToChangeEmail: searchOrgToChangeEmail,
                searchUsersForActivateOrBlocked: searchUsersForActivateOrBlocked,
                findUserByEmail: findUserByEmail,
                setDefaultUserPassword: setDefaultUserPassword,
                changeEmail: changeEmail
            };

            var vm = $scope.vm;

            $scope.permissions = {
                canGrantCallCenterOperatorRole: abp.auth.hasPermission('SuperOperator.GrantCallCenterOperatorRole'),
            };

            function findUserByEmail() {
                abp.ui.setBusy(".panel-default:first");
                user.getUserByEmailOrThrow({ email: vm.userEmailForUpdatePassword }).then(function (response) {
                    vm.foundUser = response.data;
                    if(response.data)
                    {
                        vm.visibleBlockResetPassword = true;
                        vm.foundUser = response.data;
                    }
                }, function() {
                    if(response.message) abp.notify.error(response.message);
                });
                abp.ui.clearBusy(".panel-default");
            }
            
            function setDefaultUserPassword() {
                abp.ui.setBusy(".panel-default:first");
                user.setDefaultUserPassword({ email: vm.userEmailForUpdatePassword }).then(function (response) {
                    vm.visibleBlockResetPassword = false;
                    abp.notify.success($scope.$root.source('PasswordChangedSuccess'));
                }, function() {
                    if(response.message) abp.notify.error(response.message);
                });
                abp.ui.clearBusy(".panel-default");
            }
            
            function searchUsersForActivateEmail() {
                vm.users = {};
                abp.ui.setBusy(".panel-default:first");
                searchUsers(vm.emailForSearch).then(function (response) {
                        vm.users = response.data;
                        abp.ui.clearBusy(".panel-default");
                    }, function() {
                        abp.ui.clearBusy(".panel-default");
                    });
            }

            function searchUsers(emailForSearch) {
                return user.getUsersByEmail({ email: emailForSearch });
            }
            
            function searchUsersForActivateOrBlocked() {
                vm.usersForActivateOrBlocked = {};

                abp.ui.setBusy("#panelThird");
                searchUsers(vm.emailForSearchForActivateOrBlocked).then(function (response) {
                    vm.usersForActivateOrBlocked = response.data;
                    abp.ui.clearBusy("#panelThird");
                }, function() {
                        abp.ui.clearBusy("#panelThird");
                });
            }

            function activateUserEmail(userId, idx) {
                //var activateUserEmail = user.activateUserEmail({ id: userId });
                user.activateUserEmail({ id: userId }).then(function() {
                    abp.notify.success("Почту активировано!");
                    vm.users.splice(idx, 1);
                }, function() {
                    abp.notify.error("Помилка!");
                });
            }

            function activateOrBlockedUser(userId, idx) {
                //user.activateOrBlockedUser({ id: userId });
                user.activateOrBlockedUser({ id: userId }).then(function () {
                    abp.notify.success("Користувача активовано/заблоковано!");
                    vm.usersForActivateOrBlocked.splice(idx, 1);
                }, function () {
                    abp.notify.error("Помилка!");
                });
            }

            function searchOrgToChangeEmail() {
                vm.emailsForChange = {};
                abp.ui.setBusy("#panelSecond");

                organization.getOrganizationEmailsByInnOrEdrpou({ innOrEdrpou: vm.edrpouForSearch })
                    .then(function (response) {
                        vm.emailsForChange = response.data.organizationEmails;
                        abp.ui.clearBusy("#panelSecond");
                    }, function() {
                        abp.ui.clearBusy("#panelSecond");
                    });
            }

            function changeEmail(userId, newEmail) {
                user.changeUserEmail({ userId: userId, newEmail: newEmail })
                    .then(function() {
                        abp.notify.success("E-mail змінено!");
                    });
            }
        }
    ]);
})();;
(function () {
    var controllerId = 'notificationsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.etender.notifications', 'ngTableParams', '$localStorage', '$location', function ($scope, notificationsService, ngTableParams, $localStorage, $location) {

            $scope.ng_localStorage = $localStorage;
            $scope.showMessage = false;
            $scope.show = {};

            localStorage.removeItem('image');

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: 10
            }, {
                counts: [],
                getData: function ($defer, params) {
                    var pageInput = {
                        maxResultCount: params.count(),
                        skipCount: (params.page() - 1) * params.count(),
                        sorting: 'CreationTime DESC'
                        //type: $scope.filter

                    };
                    var messages = notificationsService.getNotificationList(pageInput);
                    abp.ui.setBusy("body:first");
                    messages.then(function (response) {
                        params.total(response.data.totalCount);
                        //console.log(data);
                        $scope.pages = response.data.items;
                        $defer.resolve(response.data.items);
                        abp.ui.clearBusy("body");
                    });
                }
            });

            $scope.showNotification = function (index) {
                $scope.showMessage = true;
                $scope.show.name = $scope.pages[index].name;
                $scope.show.content = $scope.pages[index].content;
            }

        }]);
})(window.angular);

function encodeImageFileAsURL() {
    var filesSelected = document.getElementById("inputFileToLoad").files;
    if (filesSelected.length > 0) {
        var fileToLoad = filesSelected[0];
        var fileReader = new FileReader();
        fileReader.onload = function (fileLoadedEvent) {
            var srcData = fileLoadedEvent.target.result; // <--- data: base64

            var newsImg = { 'image': srcData };
            // Put the object into storage
            localStorage.setItem('image', JSON.stringify(newsImg));
            var newImage = document.createElement('img');
            newImage.src = srcData;
            document.getElementById("imgTest").innerHTML = newImage.outerHTML;
        }
        fileReader.readAsDataURL(fileToLoad);
    }
};
(function () {
    var controllerId = 'notificationsAddCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        'abp.services.etender.notifications',
        'abp.services.etender.banner',
        '$localStorage',
        '$location',
        function (
            $scope,
            $location,
            notificationsService,
            banner,
            $localStorage) {

            $scope.ng_localStorage = $localStorage;

            if (!abp.auth.grantedPermissions.NewsAdministration || !abp.auth.grantedPermissions.BannerAdministration) {
                $location.path('/');
                return;
            }
            $scope.isNewsAdmin = abp.auth.grantedPermissions.NewsAdministration;
            $scope.isBannerAdmin = abp.auth.grantedPermissions.BannerAdministration;

            $scope.$watch('[ng_localStorage.bannerInfo, viewId]', function (param) {
                if (param[1] == 'banner' && param[0] != null) {
                    $scope.notification = {
                        content: param[0].content || '',
                        colour: param[0].colour || '#f89406',
                        startNotificationTime: param[0].startNotificationTime || moment().format('DD-MM-YYYY'),
                        endNotificationTime: param[0].endNotificationTime || moment().format('DD-MM-YYYY'),
                        name: param[0].name || '',
                        recipientGroup: param[0].recipientGroup || 'all',
                        id: param[0].id || 0
                    };
                }
            });

            localStorage.removeItem('image');
            $scope.notification = {
                content: ''
            };
            $scope.editor = {
                name: 'visual'
            }

            $scope.viewId = 'news'
            $scope.changeView = function (param) {
                $scope.notification = {
                    recipientGroup: 'all'
                };
                $scope.viewId = param;
            }

            $scope.notification.recipientGroup = 'all';
            $scope.setTransactionDebit = function (value) {
                $scope.notification.recipientGroup = value
            };

            function reloadBanner() {
                banner.getBanner().then(function (param) {
                    $localStorage.bannerInfo = param.data;
                }, function (error) {
                    abp.notify.error(error);
                });
            }

            $scope.create = function () {
                abp.ui.setBusy();
                if (!$scope.notification.name || !$scope.notification.content || !$scope.notification.endNotificationTime) {
                    abp.notify.error('Не все поля заполнены или не верно!');
                } else {
                    if (window.localStorage['image']) {
                        var imageJson = JSON.parse(localStorage["image"]);
                        $scope.notification.image = imageJson.image;
                    }
                    var method = $scope.viewId == 'news' ? notificationsService.createNotification : banner.createOrUpdateBanner;
                    method($scope.notification)
                        .then(function (response) {
                            if ($scope.viewId == 'news') {
                                abp.notify.success('Ви успішно створили новину!');
                            } else if (!$localStorage.bannerInfo.content && $scope.viewId == 'banner') {
                                abp.notify.success('Банер успішно створено');
                            } else {
                                abp.notify.success('Банер успішно оновлено');
                            }
                            
                            if (document.getElementById("imgTest")) {
                                document.getElementById("imgTest").innerHTML = '';
                                localStorage.removeItem('image');
                            }
                            reloadBanner();
                        });
                }
                abp.ui.clearBusy();
            };

            $scope.openDeleteModal = function () {
                $('#deleteBanner').modal('show')
            };
            $scope.deleteBanner = function () {
                abp.ui.setBusy();
                banner.clearBanner().then(function (param) {
                    $scope.notification = {
                        id: 0,
                        name: '',
                        content: '',
                        recipientGroup: 'all',
                        colour: '#f89406',
                        startNotificationTime: moment().format('DD-MM-YYYY'),
                        endNotificationTime: moment().format('DD-MM-YYYY')
                    };
                    abp.notify.success('Банер успішно видалено');
                    reloadBanner();
                }, function (error) {
                    abp.notify.error(error);
                });
                abp.ui.clearBusy();
            };

        }]);
})(window.angular);

function encodeImageFileAsURL() {
    var filesSelected = document.getElementById("inputFileToLoad").files;
    if (filesSelected.length > 0) {
        var fileToLoad = filesSelected[0];
        var fileReader = new FileReader();
        fileReader.onload = function (fileLoadedEvent) {
            var srcData = fileLoadedEvent.target.result; // <--- data: base64

            var newsImg = { 'image': srcData };
            // Put the object into storage
            localStorage.setItem('image', JSON.stringify(newsImg));
            var newImage = document.createElement('img');
            newImage.src = srcData;
            document.getElementById("imgTest").innerHTML = newImage.outerHTML;
        }
        fileReader.readAsDataURL(fileToLoad);
    }
};
(function () {
    var controllerId = 'notificationsEditCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.etender.pagesAndNews', 'ngTableParams', '$localStorage', '$location', function ($scope, pagesAndNewsService, ngTableParams, $localStorage, $location) {

            $scope.ng_localStorage = $localStorage;
            if (!$scope.ng_localStorage.isChiefAccountant) {
                $location.path('/');
                return;
            }

            $scope.pagesAndNewsId = {};
            $scope.page = {};
            $scope.pagesAndNews = {};
            localStorage.removeItem('image');
            $scope.showTextarea = false;

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: 10
            }, {
                counts: [],
                getData: function ($defer, params) {
                    var pageInput = {
                        maxResultCount: params.count(),
                        skipCount: (params.page() - 1) * params.count(),
                        sorting: 'CreationTime DESC',
                        //type: $scope.filter

                    };
                    var messages = pagesAndNewsService.getPagesAndNewsList(pageInput);
                    abp.ui.setBusy("body:first");
                    messages.then(function (response) {
                        params.total(response.data.totalCount);
                        //console.log(data);
                        $scope.pages = response.data.items;
                        $defer.resolve(response.data.items);
                        abp.ui.clearBusy("body");
                    });
                }
            });


            $scope.editPage = function (id) {
                $scope.showTextarea = true;
                clearTimeout($scope.pageId);
                $scope.pageId = setTimeout(function () {
                    var input = {
                        id: $scope.pages[id].id
                    };
                    var getMessage = pagesAndNewsService.getPagesAndNews(input);
                    getMessage.then(function (data) {
                        //$scope.messages[id].isRead = data.isRead;
                    });
                }, 2000);
                $scope.page = $scope.pages[id];
                //console.log("Страница:", $scope.page);
            };


            $scope.deletePage = function (id) {
                var confirmDelete = confirm("Вы точно хотите удалить страницу?");
                if (confirmDelete === true) {
                    var input = {
                        id: $scope.pages[id].id
                    };
                    var deletePage = pagesAndNewsService.deletePagesAndNews(input);
                    deletePage.then(function (data) {
                        abp.notify.success('Страница удалена!');
                    });
                    $scope.pages.splice(id, 1);
                    $scope.page = {};
                }
            };



            $scope.updateNews = function () {
                if (!$scope.page.name || !$scope.page.content || !$scope.page.url || !$scope.page.title) {
                    abp.notify.error('Не все поля заполнены или не верно!');
                } else {
                    if (window.localStorage['image']) {
                        var imageJson = JSON.parse(localStorage["image"]);
                        $scope.page.image = imageJson.image;
                    }
                    $scope.page.videoUrl = {};

                    pagesAndNewsService.updatePagesAndNews($scope.page)
                        .then(function (response) {
                            $scope.pagesAndNews = response.data.pagesAndNews.id;
                            abp.notify.success('Вы успешно обновили новость!');
                            $scope.showTextarea = false;
                            $scope.page = {};
                        });
                }
            };
        }]);
})(window.angular);

function encodeImageFileAsURL() {
    var filesSelected = document.getElementById("inputFileToLoad").files;
    if (filesSelected.length > 0) {
        var fileToLoad = filesSelected[0];
        var fileReader = new FileReader();
        fileReader.onload = function (fileLoadedEvent) {
            var srcData = fileLoadedEvent.target.result; // <--- data: base64

            var newsImg = { 'image': srcData };
            // Put the object into storage
            localStorage.setItem('image', JSON.stringify(newsImg));
            var newImage = document.createElement('img');
            newImage.src = srcData;
            document.getElementById("imgTest").innerHTML = newImage.outerHTML;
        }
        fileReader.readAsDataURL(fileToLoad);
    }
};
(function () {
    var controllerId = 'notSendedMessagesApiCtrl';
    angular.module('app')
        .controller(controllerId, [
        '$scope',
        '$rootScope',
        'abp.services.etender.systemInfo',
        'abp.services.etender.emailNotification',
        function ($scope, $rootScope, systemInfo, emailNotificationService) {

            
            $scope.getEmails= function () {
                abp.ui.setBusy();
                systemInfo.getErrorEmails()
                    .then(function (resposne) {
                        $scope.errorMails = resposne.data.items;
                        abp.ui.clearBusy();
                    },
                     function () {
                        abp.ui.clearBusy();
                    });
            };

            $scope.sendTest = function (usrId) {
                var textmess = ('Це тестове повідомлення. Відповідати на нього не потрібно.' + '<br>' +
                     'This is a test message. Please, do not answer it.');
                var prms = { 'userId': usrId, 'title': 'Тестове повідомлення', 'message': textmess };
                emailNotificationService.sendTestEmail(prms)
                .then(function () {
                    abp.notify.success('Тестового листа надіслано');
                    $scope.getEmails();
                }, function (e) {
                    abp.notify.error("Не вдалося відправити тестового листа: " + e.data.message);
                });
            }
        }])
        //делает перенос строки по заданому слову, для компактного отображения в таблице
        .filter('splitTd', function () {
            return function (input, splitString) {
                var index = input.search(splitString);
                if (index != -1)
                    return [input.slice(0, index), '\n', input.slice(index)].join(' ');
                else
                    return input;
            }
        });
})();;
(function () {
    var controllerId = 'setCreditLimitCtrl';
    angular.module('app').controller(controllerId, [
            '$rootScope',
            '$scope',
            'abp.services.etender.organization',
            'abp.services.etender.allBanking',
            function ($rootScope, $scope, organization, allbanking) {
            $scope.filter = {
                inputedEDRPOU: '',
                maxCreditSum: '175',
                maxCreditSumActual: ''
            };
            $scope.onlyNumbers = /^\d+$/;
            $scope.findedOrganization = null;
            


            $scope.getOperation = function (id) {
               
                $scope.filter.inputedEDRPOU = '';
                $scope.findedOrganization = null;
                $scope.operation = $scope.operations[id];

                //console.log("Выводим операцию:", $scope.operation);
            };

                $scope.getOrganizationByEDRPOU = function () {
                    //console.log("inputedEDRPOU:", $scope.filter.inputedEDRPOU);
                    abp.ui.setBusy("#findedOrganiz");
                    organization.getOrganizationExtWithMaxCreditAmountByCode({ innOrEdrpou: $scope.filter.inputedEDRPOU })
                        .then(function (response) {
                            if (response.data != null && response.data.organizationExt != null) {
                                $scope.findedOrganization = response.data.organizationExt;
                                $scope.filter.maxCreditSumActual = response.data.maxCreditAmount;
                                $scope.filter.maxCreditSum = response.data.maxCreditAmount;
                                //console.log("finded organization:", $scope);
                            } else {
                                abp.notify.error("Не знайдено!");
                                $scope.findedOrganization = null;
                            }

                            abp.ui.clearBusy("#findedOrganiz");
                        },
                            function () {
                                $scope.findedOrganization = null;
                                abp.ui.clearBusy("#findedOrganiz");
                            });
                };

            $scope.changeCreditLimit = function () {
                abp.ui.setBusy("#findedOrganiz");
                organization.updateMaxCreditAmmount({ TenantId: $scope.findedOrganization.tenantId, MaxCreditAmmount: $scope.filter.maxCreditSum })
                            .then(function (resposne) {
                                abp.notify.success("Суму кредитного ліміту змінено");
                                $scope.getOrganizationByEDRPOU();
                                abp.ui.clearBusy("#findedOrganiz");
                            },
                            function () {
                                abp.ui.clearBusy("#findedOrganiz");
                            });
            };

            $scope.resetEndDayBalanceForInnOrEdrpou = function () {
                abp.ui.setBusy("#findedOrganiz");
                allbanking.resetEndDayBalanceByCodes({ Codes: [$scope.findedOrganization.codeOfOrganization] })
                            .then(function (data) {
                                abp.notify.success("Баланс перераховано");
                                $scope.getOrganizationByEDRPOU();
                                abp.ui.clearBusy("#findedOrganiz");
                            },
                            function () {
                                abp.ui.clearBusy("#findedOrganiz");
                            });
            };
            

        }]);
})();;
(function () {
    var controllerId = 'systemStateCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', 'abp.services.etender.systemInfo', 'abp.services.etender.emailNotification', 'ngTableParams',
        'abp.services.etender.settings', 'abp.services.etender.notExportDocument', 'abp.services.etender.user', 'abp.services.etender.bid',
        function ($rootscope, $scope, systemInfo, emailNotificationService, ngTableParams, settings, documentService, userService, bidService) {
            var vm = $scope.vm;
            $scope.showBilling = false;
            $scope.emailNotifyError = false;
            $scope.eventLog = false;
            var tableParams = new ngTableParams(
                {
                    page: 1,
                    count: 10
                },
                {
                    counts: [],
                    getData: function ($defer, params) {
                        var input = {
                            maxResultCount: params.count(),
                            skipCount: (params.page() - 1) * params.count()
                        };
                        var tenders = systemInfo.getNoAuctionUrls(input);
                        abp.ui.setBusy("#noUrls");
                        tenders.then(function (response) {
                            var data = response.data;
                            params.total(data.totalCount);
                            //console.log(data);
                            vm.noUrls = data.items;
                            vm.isError = data.items !== null && data.items.length > 0;
                            vm.isOpened = vm.isError;
                            $defer.resolve(data.items);
                            abp.ui.clearBusy("#noUrls");
                        }, function () {
                            abp.ui.clearBusy("#noUrls");
                        });
                    }
                }
            );

            var filters = {
                successfullyInsertedTenders: true,
                successfullyUpdatedTenders: true,
                successfullyImportedContractings: true,
                unsuccessfullyImportedContractings: true,
                successfullyImportedPlans: true,
                unsuccessfullyImportedPlans: true,
                successfullyExportedDocs: true,
                successfullyCommitedBanking: true,
                unsuccessfullyCommitedBanking: true,
                cashOperations: true
            };

            vm.reload = function () {
                $scope.vm.tableParams.reload();
                $scope.vm.tableParams.page(1);

                getNonExpEntities();
                getNonExpBidDocs();
                getStuckExpTenders();
                getStuckImpTenders();
                getNonSentActivationEmail();
                getNonActivatedBids();
            };

            //vm.reloadNonExp = function() {
            //    vm.getNonExpEntities();
            //};

            vm.tableParams = tableParams;
            vm.getNonExpEntities = getNonExpEntities;
            vm.getStuckExpTenders = getStuckExpTenders;
            vm.getStuckImpTenders = getStuckImpTenders;
            vm.getErrorEmails = getErrorEmails;
            vm.isErrorEmail = false;
            vm.getEventLogs = getEventLogs;
            vm.isLogOpened = false;
            vm.filters = filters;
            vm.sendTestEmail = sendTest;
            vm.activationEmails = [];
            vm.activationEmailFilter = {
                fromDate: new Date(),
                toDate: new Date()
            };

            vm.resetTenders = function (tenderId) {
                abp.message.confirm(
                    'Зміни, внесені під час останнього редагування, буде відхилено!',
                    'Увага!',
                    function (isConfirmed) {
                        if (isConfirmed) {
                            //update tender
                            abp.ui.setBusy("#stuckExp");
                            systemInfo.resetTender({ tenderId: tenderId })
                                .then(function (response) {
                                    abp.notify.success('Успіх! Зміни скинуто.');
                                    abp.ui.clearBusy("#stuckExp");
                                    getStuckExpTenders();
                                },
                                function (e) {
                                    abp.notify.error("Ups... something went wrong: " + e.data.message);
                                    abp.ui.clearBusy("#stuckExp");
                                });
                        }
                    });
            };

            vm.reloadStuck = function () {
                vm.getStuckExpTenders();
            };

            vm.reloadNonExpBidDocs = function () {
                getNonExpBidDocs();
            };

            vm.reloadNonActivatedBids = function () {
                getNonActivatedBids();
            };

            vm.reloadNonSentActivationEmail = function () {
                getNonSentActivationEmail();
            };

            vm.resetAllImports = function () {
                abp.message.confirm(
                    'Буде перезапущено усі неімпортовані тендери!',
                    'Увага!',
                    function (isConfirmed) {
                        if (isConfirmed) {
                            //update tender
                            abp.ui.setBusy("#stuckImp");
                            systemInfo.resetAllImport()
                                .then(function (response) {
                                    abp.notify.success('Успіх! Тендери перезапущено.');
                                    abp.ui.clearBusy("#stuckImp");
                                    getStuckImpTenders();
                                },
                                function (e) {
                                    abp.notify.error("Ups... something went wrong: " + e.data.message);
                                    abp.ui.clearBusy("#stuckImp");
                                });
                        }
                    });
            };

            vm.resetImport = function (tid) {
                abp.ui.setBusy("#stuckImp");
                systemInfo.resetImpTender(tid)
                    .then(function (response) {
                        abp.notify.success('Успіх! Тендери перезапущено.');
                        abp.ui.clearBusy("#stuckImp");
                        getStuckImpTenders();
                    },
                    function (e) {
                        abp.notify.error("Ups... something went wrong: " + e.data.message);
                        abp.ui.clearBusy("#stuckImp");
                    });
            };

            vm.resetErrorForDocument = function (id, exportDocumentType) {
                documentService.resetErrorForNotExportedDocument({ 'id': id, 'exportDocumentType': exportDocumentType })
                    .then(function (reponse) {
                        abp.notify.success("Помилки документа '" + reponse.data + "' видалені.");
                        getNonExpBidDocs();
                    },
                    function () {
                        abp.notify.error(data);
                    });
            };

            vm.deleteDocument = function (id, exportDocumentType) {
                if (confirm("Удалить документ?")) {
                    documentService.deleteDocument({ 'id': id, 'exportDocumentType': exportDocumentType })
                        .then(function (reponse) {
                            abp.notify.success("Документ видалено.");
                            getNonExpBidDocs();
                        }, function () {
                            abp.notify.error(data);
                        });
                }
            };

            vm.checkAllNonSentActivationEmails = function () {
                vm.activationEmails.forEach(function (mail) {
                    mail.isChecked = vm.activationEmails.checkedAll;
                });
            };

            vm.submitNonSentActivationEmail = function (userId) {
                userService.activateUserEmail({ id: userId })
                    .then(function () {
                        abp.notify.success("User has been activated");
                        getNonSentActivationEmail();
                    }, function () {
                        abp.notify.error(data);
                    });
            };

            vm.submitCheckedNonSentActivationEmails = function () {
                var ids = [];
                vm.activationEmails.forEach(function (mail) {
                    if (mail.isChecked)
                        ids.push(mail.userId);
                });
                userService.activateUsersEmail({ ids: ids })
                    .then(function () {
                        abp.notify.success("User has been activated");
                        getNonSentActivationEmail();
                    }, function () {
                        abp.notify.error(data);
                    });
            };

            vm.confirmBid = function (bidId) {
                return bidService.confirmBid({ id: bidId })
                    .then(function () {
                        abp.notify.success("Пропозицію підтверджено!");
                        getNonActivatedBids();
                    }, function () {
                        abp.notify.error(data);
                    });
            }

            vm.reloadImp = function () {
                vm.getStuckImpTenders();
            };

            vm.reloadEmail = function () {
                vm.getErrorEmails();
            };

            vm.filterChanged = function (key, value) {
                var fltr = vm.filters;
                fltr[key] = value;
            }

            vm.refreshFilter = function () {
                //console.log(vm.filters);
                var temp = vm.isLogError;
                getEventLogs();
                vm.isLogError = temp;
            }

            function sendTest(usrId) {
                var textmess = ('Це тестове повідомлення. Відповідати на нього не потрібно.' + '<br>' +
                    'This is a test message. Please, do not answer it.');
                var prms = { 'userId': usrId, 'title': 'Тестове повідомлення', 'message': textmess };
                emailNotificationService.sendTestEmail(prms)
                    .then(function () {
                        abp.notify.success('Тестового листа надіслано');
                        getErrorEmails();
                    }, function (e) {
                        abp.notify.error("Не вдалося відправити тестового листа: " + e.data.message);
                    });
            }

            function getNonExpEntities() {
                abp.ui.setBusy("#nonExp");
                systemInfo.getNotExportedEntities()
                    .then(function (response) {
                        vm.nonExp = response.data.entities;
                        //vm.isErrorNonExp = false;//data.entities != null && data.entities.length > 0;
                        vm.isOpenedNonExp = false;//vm.isError;
                        abp.ui.clearBusy("#nonExp");
                    }, function () {
                        abp.ui.clearBusy("#nonExp");
                    });
            }

            function getNonExpBidDocs() {
                abp.ui.setBusy("#nonExpBidDocs");
                systemInfo.getNonExpBidDocs()
                    .then(function (response) {
                        var data = response.data;
                        vm.nonExpBidDocs = data.items;
                        vm.totalNonExpBidDocs = data.totalCount;
                        vm.isOpenedNonExpBidDocs = data.items !== null && data.totalCount > 0;
                        vm.isErrorNonExpBidDocs = vm.isOpenedNonExpBidDocs;
                        abp.ui.clearBusy("#nonExpBidDocs");
                    }, function () {
                        abp.ui.clearBusy("#nonExpBidDocs");
                    });
            }

            function getNonActivatedBids() {
                var elementId = "nonActivatedBids";
                abp.ui.setBusy(elementId);
                systemInfo.getNonActivatedBids()
                    .then(function (response) {
                        var data = response.data;
                        vm.nonActivatedBids = data.items;
                        vm.totalNonActivatedBids = data.totalCount;
                        vm.isOpenedNonActivatedBids = data.items !== null && data.totalCount > 0;
                        vm.isErrorNonActivatedBids = vm.isOpenedNonActivatedBids;
                        abp.ui.clearBusy(elementId);
                    }, function () {
                        abp.ui.clearBusy(elementId);
                    });
            }

            function getNonSentActivationEmail() {
                var elementId = "nonSentActivationEmail";
                vm.activationEmailFilter.toDate.setHours(23, 59, 59, 0);
                vm.activationEmailFilter.fromDate.setHours(0, 0, 0, 0);
                var input = {
                    toDate: vm.activationEmailFilter.toDate,
                    fromDate: vm.activationEmailFilter.fromDate
                };
                abp.ui.setBusy(elementId);
                systemInfo.getNonSentActivationEmails(input)
                    .then(function (response) {
                        var data = response.data;
                        vm.activationEmails = data.items;
                        vm.totalActivationEmails = data.totalCount;
                        vm.isOpenedNonSentActivationEmail = data.items !== null && data.totalCount > 0;
                        vm.isErrorNonSentActivationEmail = vm.isOpenedNonSentActivationEmail;
                        abp.ui.clearBusy(elementId);
                    }, function () {
                        abp.ui.clearBusy(elementId);
                    });
            }

            function getStuckExpTenders() {
                abp.ui.setBusy("#stuckExp");
                systemInfo.getStuckTenders()
                    .then(function (response) {
                        var data = response.data;
                        vm.stuckExp = data.items;
                        vm.totalStuck = data.totalCount;
                        vm.isOpenedStuck = data.items !== null && data.totalCount > 0;
                        vm.isErrorStuck = vm.isOpenedStuck;
                        abp.ui.clearBusy("#stuckExp");
                    }, function () {
                        abp.ui.clearBusy("#stuckExp");
                    });
            }

            function getStuckImpTenders() {
                abp.ui.setBusy("#stuckImp");
                systemInfo.getStuckOnImport()
                    .then(function (response) {
                        var data = response.data;
                        vm.stuckImp = data.items;
                        vm.totalImpStuck = data.totalCount;
                        vm.isOpenedImpStuck = data.items !== null && data.totalCount > 0;
                        vm.isErrorImpStuck = vm.isOpenedImpStuck;
                        abp.ui.clearBusy("#stuckImp");
                    }, function () {
                        abp.ui.clearBusy("#stuckImp");
                    });
            }

            function getErrorEmails() {
                abp.ui.setBusy("#errorMails");
                systemInfo.getErrorEmails()
                    .then(function (response) {
                        vm.errorMails = response.data.items;
                        vm.isOpenedEmail = response.data.items !== null && response.data.totalCount > 0;
                        //vm.isErrorEmail = vm.isOpenedEmail;
                        abp.ui.clearBusy("#errorMails");
                    }, function () {
                        abp.ui.clearBusy("#errorMails");
                    });
            }


            function getEventLogs() {
                abp.ui.setBusy("#events");
                $scope.eventLog = true;
                systemInfo.getTopEventLogs(vm.filters)
                    .then(function (response) {
                        //console.log(data);
                        vm.events = response.data;
                        //vm.isLogError = vm.isLogOpened;
                        abp.ui.clearBusy("#events");
                    }, function () {
                        abp.ui.clearBusy("#events");
                    });
            }

            vm.getEmailNotifycations = function () {
                abp.ui.setBusy("#emailNotify");
                $scope.emailNotifyError = true;
                systemInfo.getEmailNotifycations()
                    .then(function (response) {
                        var data = response.data;
                        vm.emailNotify = data.items;
                        vm.isEmailNotifyError = false;
                        vm.isEmailNotifyOpened = false;
                        abp.ui.clearBusy("#emailNotify");
                    }, function () {
                        vm.isEmailNotifyError = true;
                        abp.ui.clearBusy("#emailNotify");
                    });
            }
            
            vm.getFinishBilling = function () {
                $scope.showBilling = true;
                abp.ui.setBusy("#billing");
                systemInfo.getFinishBilling().then(function (response) {
                    abp.ui.clearBusy("#billing");
                    vm.finishBilling = response.data.outputList;
                    vm.isBillingError = false;
                    vm.isBillingOpened = false;
                }, function (error) {
                    vm.isBillingError = true;
                    abp.ui.clearBusy("#billing");
                });
            }

            getNonExpEntities();
            getNonExpBidDocs();
            getStuckExpTenders();
            getStuckImpTenders();
            getErrorEmails();
            getNonSentActivationEmail();
            getNonActivatedBids();
        }
    ]);
})();;
(function () {
    var controllerId = 'createPlanCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.plan',
        'datesHelperService',
        'planHelperService',
        'organizationDataService',
        '$localStorage',
        function (
            $scope,
            $location,
            $q,
            plan,
            datesHelperService,
            planHelperService,
            organizationDataService,
            $localStorage
        ) {
            function createPlanFinally(planInput) {
                var planCreateDto = planHelperService.setAdditionalClassifications(planInput);
                if (planCreateDto.procurementMethodType === 'belowThreshold' ||
                    (planCreateDto.procurementMethodType === 'reporting' && planCreateDto.procurementMethod === 'limited') ||
                    (planCreateDto.procurementMethodType === null && planCreateDto.procurementMethod === null)) {
                    if (planCreateDto.projectBudget.breakdown) {
                        planCreateDto.projectBudget.breakdown = planCreateDto.projectBudget.breakdown.filter(function (breakdown) {
                            if (breakdown.value.amount === undefined) {
                                return false;
                            } else {
                                return true;
                            }
                        });
                    }
                } 

                if (planCreateDto.procurementMethodType !== 'centralizedProcurement') {
                    var date = new Date(planCreateDto.tenderPeriodStartDate);
                    date.setDate(1);
                    planCreateDto.tenderPeriodStartDate = date;
                }

                var createPlan = plan.create(planCreateDto);
                createPlan
                    .then(function (response) {
                        abp.ui.clearBusy();
                        abp.notify.success("План створено!");
                        $location.url("/planDetails/" + response.data.id);
                    },
                    function (err) {
                        abp.ui.clearBusy();
                        console.log(err.data);
                        if ($scope.createPlanModel.projectBudget.period) {
                            $scope.createPlanModel.projectBudget.period.startDate = moment($scope.createPlanModel.projectBudget.period.startDate).year();
                            $scope.createPlanModel.projectBudget.period.endDate = moment($scope.createPlanModel.projectBudget.period.endDate).year();
                        }
                        
                    });

                return createPlan;
            }

            $scope.createPlanModel = {
                projectBudget: {
                    amount: null,
                    currencyId: 1,
                    description: '',
                    projectName: '',
                    breakdown: [
                        {
                            value: {}
                        }
                    ]
                   // year: 2018
                },

                classification: {
                    id: null,
                    scheme: null,
                    decription: null

                },
                additionalClassifications: [{
                    id: null,
                    scheme: null,
                    decription: null
                }],
                classificationId: null,
                classificationDescription: null,
                items: [],
                procurementMethod: 'open',
                procurementMethodType: undefined, //'belowThreshold',
                buyers: [{                    
                    identifier: {
                        apiId: ""
                    },
                    address: {
                        streetAddress: "",
                        locality: "",
                        countryName: "",
                        postalCode: "",
                        region: ""
                    },
                    kind: $localStorage.organizationKindId,
                    name: ""
                }],
                procuringEntity: {
                    identifier: {
                        apiId: ""
                    },
                    address: {
                        streetAddress: "",
                        locality: "",
                        countryName: "",
                        postalCode: "",
                        region: ""
                    },
                    kind: $localStorage.organizationKindId,
                    name: "",
                    nameEn: ""
                }
            };


            (function() {
                abp.ui.setBusy();
                organizationDataService.getData().then(
                    function (response) {
                        $scope.createPlanModel.buyers[0] = {
                            identifier: { apiId: response.data.codeOfOrganization },
                            name: response.data.name,
                            address: {
                                streetAddress: response.data.address.addressStr,
                                locality: response.data.address.city.title,
                                countryName: response.data.address.country.title,
                                postalCode: response.data.address.postIndex,
                                region: response.data.address.region.title
                            },
                            kind: response.data.kind
                        };
                        $scope.procuringEntity = {
                            identifier: {
                                apiId: response.data.codeOfOrganization
                            },
                            name: response.data.name,
                            nameEn: response.data.nameEN,
                            address: {
                                streetAddress: response.data.address.addressStr,
                                locality: response.data.address.city.title, 
                                countryName: response.data.address.country.title,
                                postalCode: response.data.address.postIndex, 
                                region: response.data.address.region.title 
                            },
                            kind: response.data.kind
                        };
                        $scope.createPlanModel.procuringEntity = JSON.parse(JSON.stringify($scope.procuringEntity));
                        abp.ui.clearBusy();
                    },
                    function (err) {
                        abp.ui.clearBusy();
                        console.log(err);
                    }
                );
            }) ();

            $scope.submit = function (isDraft) {
                abp.ui.setBusy();
                var createPlan;

                if ($scope.createPlanModel.projectBudget.period && $scope.createPlanModel.projectBudget.period.startDate) {
                    datesHelperService.setFirstAndLastDateOfYear($scope.createPlanModel.projectBudget.period);
                }

                if ($scope.createPlanModel.classification.code) {
                    $scope.createPlanModel.classification.id = $scope.createPlanModel.classification.code;
                }
                $scope.createPlanModel.classificationId = $scope.createPlanModel.classification.id;
                $scope.createPlanModel.classificationDescription = $scope.createPlanModel.classification.description;
                if (isDraft)
                    $scope.createPlanModel.isDraft = isDraft;

                for (var i = 0; i < $scope.createPlanModel.additionalClassifications.length; i++) {
                    if ($scope.createPlanModel.additionalClassifications[i].code) {
                        $scope.createPlanModel.additionalClassifications[i].id = $scope.createPlanModel.additionalClassifications[i].code;
                    }
                    $scope.createPlanModel.additionalClassifications[i].description = $scope.createPlanModel.additionalClassifications[i].description;
                }

                for (var j = 0; j < $scope.createPlanModel.items.length; j++) {
                    var currItem = $scope.createPlanModel.items[j];

                    currItem.classification.id = currItem.classification.code;
                    currItem.classificationId = currItem.classification.id;
                    currItem.classificationDescription = currItem.classification.description;

                    currItem.unitId = currItem.unit.id;
                    if (currItem.deliveryDate)
                        currItem.deliveryDate = currItem.deliveryDate.startDate;
                    currItem.classification.description = currItem.classification.description;

                    for (var ai = 0; ai < currItem.additionalClassifications.length; ai++) {
                        var aitem = currItem.additionalClassifications[ai];
                        aitem.id = aitem.code;
                        aitem.description = aitem.description;
                    }
                }

                if ($scope.createPlanModel.projectBudget.breakdown) {
                    $scope.createPlanModel.projectBudget.breakdown.forEach(function (breakdown) {
                        breakdown.value.currencyId = $scope.createPlanModel.projectBudget.currencyId;
                    });
                }

                var peResult = /pe=(\d+)/.exec(window.location.hash);
                if (peResult != null)
                    $scope.createPlanModel.testMode = peResult[1];

                if ($scope.createPlanModel.buyers[0].address.region.indexOf('м. Київ') !== -1
                    || $scope.createPlanModel.buyers[0].address.region.indexOf('м. Киев') !== -1 
                    || $scope.createPlanModel.buyers[0].address.region.indexOf('Севастополь') !== -1) {
                    delete $scope.createPlanModel.buyers[0].address.locality;
                    
                }
                if ($scope.createPlanModel.procuringEntity.address.region.indexOf('м. Київ') !== -1
                    || $scope.createPlanModel.procuringEntity.address.region.indexOf('м. Киев') !== -1 
                    || $scope.createPlanModel.procuringEntity.address.region.indexOf('Севастополь') !== -1) {
                    delete $scope.createPlanModel.procuringEntity.address.locality;
                }

                createPlan = createPlanFinally($scope.createPlanModel);
                return createPlan;
            };

            $scope.validateBreakdownAmount = function () {
                if ($scope.createPlanModel.procurementMethodType == 'esco')
                    return true;

                var breakDownAmountSum = $scope.createPlanModel.projectBudget.breakdown.reduce(function (acc, breakdown) {
                    return breakdown.value.amount !== undefined ? (+ acc + breakdown.value.amount).toFixed(2) : acc;
                }, 0);

                if (breakDownAmountSum > $scope.createPlanModel.projectBudget.amount) {
                    return false;
                } else {
                    return true;
                }
            };

            $scope.isAllDataGood = function (model) {
                if (!model.classification || !model.classification.code) return false;

                //if (model.classification.code == '99999999-9' && !model.additionalClassifications[0].code)
                //        return false;

                //if (!model.procurementMethod || !model.procurementMethodType) return false;

                if (model.items.length > 0) {
                    for (var i = 0; i < model.items.length; i += 1) {
                        if (!model.items[i].classification.code) return false;

                        //if (model.items[i].classification.code == '99999999-9' && !model.items[i].additionalClassifications[0].code)
                        //    return false;
                    }
                }

                if (model.projectBudget.period && model.projectBudget.period.startDate && model.projectBudget.period.startDate > model.projectBudget.period.endDate) {
                    return false;
                }

                if (!model.tenderPeriodStartDate) {
                    return false;
                }
                //var firstDateOfCurrentMonth = new Date(new Date().getFullYear(), new Date().getMonth(), 1);
                //if (model.startDate < firstDateOfCurrentMonth) return false;

                return true;

            };
        }]);
})();;
angular.module('app')
    .controller('kekvCtrl', ['$scope', 'ngTableParams', '$filter', 'abp.services.etender.reference', '$timeout',
        function ($scope, ngTableParams, $filter, reference, $timeout) {

            var timer;
            $scope.search = function (searchstring) {
                $scope.searchstring = searchstring;
                $timeout.cancel(timer);
                timer = $timeout(function () {
                    $scope.tableParams.reload();
                    $scope.tableParams.page(1);
                }, 1000);
            };

            $scope.changeSelection = function (item) {
                var d = $scope.tableParams.data;
                for (var i = 0; i < d.length; i += 1) {
                    d[i].$selected = false;
                }
                item.$selected = true;
                $scope.selectedData = item;
            };

            $scope.isKekvAlreadySelected = function (kekv) {
                
                if(!$scope.data)
                    return false;   
                if (!$scope.data.additionalClassifications || !$scope.data.additionalClassifications.length) {
                    return false;
                }
                return $scope.data.additionalClassifications.some(function (item) {
                    return item.description === kekv.description;
                });
            };

            $scope.choose = function () {
                if ($scope.data.additionalClassifications[$scope.kekvInd].disableKekvDelete)
                    $scope.selectedData.disableKekvDelete = true;
                $scope.data.additionalClassifications[$scope.kekvInd] = $scope.selectedData;
            };

            $scope.tableParams = new ngTableParams({
                page: 1,            // show first page
                count: 10          // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {

                    //pager Params
                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        SearchIdentifier: $scope.searchstring,
                        OrderColumn: '',
                        OrderDirection: ''
                    };

                    var classificationData = reference.getCurrentKekvRef(pager);
                    abp.ui.setBusy(".modal-body");
                    classificationData.then(function (resposne) {
                        abp.ui.clearBusy(".modal-body");
                        params.total(resposne.data.countAllRecords);
                        $defer.resolve(resposne.data.dk);
                    });
                }
            });

        }])
;
(function () {
    var controllerId = 'myPlansCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$timeout',
        'planHelperService',
        '$rootScope',
        'abp.services.etender.plan',
        'ngTableParams',
        'Upload',
        'lookupService',
        '$localStorage',
        '$http',
        '$sessionStorage',
        'abp.services.etender.reference',
        '$controller',
        '$location',
        'referenceService',
        'uploadFileService',
        'urlService',
        'documentsService',
        function ($scope,
                  $timeout,
                  planHelperService,
                  $rootScope,
                  plan,
                  ngTableParams,
                  Upload,
                  lookupService,
                  $localStorage,
                  $http,
                  $sessionStorage,
                  abpReferenceService,
                  $controller,
                  $location,
                  referenceService,
                  uploadFileService,
                  urlService,
                  documentsService) {

            $scope.ng_localStorage = $localStorage;
            $scope.isProductionMode = $scope.ng_localStorage.isProdMode;
            $scope.isMyPlans = true;
            $scope.projectOpen = window.projectOpen;
            $scope.showClearFilterButton = false;

            $scope.needToSign = true;
            $scope.urlForHtml = '/Special/views/plans/include/';
            $scope.urlPlansTable = '/Special/views/plans/';
            $scope.exempleData = '(наприклад UA-P-2016-09-14-000578-a), накладіть КЕП';

            $scope.checkedProcTypes = [];
            var selectedProcTypesPublicPlans = [];
            edrpouFromParams = [];
            $scope.selectedOrgCodes = [];
            $scope.selectedCpvs = [];
            
            $scope.statuses = {
                all: [],
                checked: [],
                checkedStatusesDescription: function () {
                    var description = "";
                    angular.forEach($scope.statuses.all, function (element) {
                        var isChecked = ($scope.statuses.checked.find(function (e) { return e == element.value }) !== undefined);
                        if (!isChecked)
                            return;
                        if (description != "")
                            description += ", ";
                        description += element.name;
                    });
                    return description;
                },
                dropDownIsOpen: false
            };

            planHelperService.getPlanStatuses($scope);

            var currentYear = new Date().getFullYear();

            //******* navigation *******
            $scope.showContent = {};
            $scope.showContent.plansMy = true;
            $scope.showContent.plansPublic = false;
            $scope.navigation = [
                {
                    title: $rootScope.source('MyPlans'),
                    type: 'MyPlans',
                    active: true,
                    show: true,
                    openFunc: function() {
                        $scope.showContent.plansMy = true;
                        $scope.showContent.plansPublic = false;
                    }

                }, {
                    title: 'Віджет моїх планів',
                    type: 'publicPlans',
                    active: false,
                    show: true,
                    openFunc: function() {
                        $scope.showContent.plansMy = false;
                        $scope.showContent.plansPublic = true;
                    }
                }
            ];

            var page = urlService.redirectToCorrectPage();

            //******* navigation END *******

            $scope.getClearFilterButton = function () {
                if (!$scope.filter.priceFrom &&
                    !$scope.filter.priceTo &&
                    !$scope.filter.searchString &&
                    !$scope.filter.title &&
                    $scope.filter.year.value === currentYear &&
                    !$scope.filter.isDraft &&
                    !$scope.filter.isNotSigned &&
                    $scope.filter.procuringEntityCodes.length === 0 &&
                    !$scope.filter.organizationName &&
                    selectedProcTypesPublicPlans.length === 0 &&
                    $scope.selectedOrgCodes.length === 0 &&
                    $scope.selectedCpvs.length === 0 &&
                    (!$scope.searchCpv || $scope.searchCpv.vm.tableParamsCpv.data.find(function (item) { return item.$selected; }) == undefined) &&
                    $scope.statuses.checked.length === 0

                ) {
                    $scope.showClearFilterButton = false;
                    return;
                }
                $scope.showClearFilterButton = true;
            }

            function reloadTable() {
                if ($scope.tableParams.page() === 1) {
                    $scope.tableParams.reload();
                } else {
                    $scope.tableParams.page(1);
                }
            }

            $scope.goToUpdatePlan = function (id) {
                $location.path('updatePlan/'+id);
            };
            $scope.plans = null;
            $scope.currentPlan = {};

            //////////// for documents
            $scope.files = null;
            $scope.fileUploadObj = { tenderId: "", documentId: "" };
            $scope.uploadFilesCounter = 0;
            $scope.selectedDocType = null;
            $scope.exportPlansFromFile = null;
            $scope.startDateMonths = moment.months();
            $scope.regexNumber = $rootScope.regex.number;
            $scope.regexFloatNumber = $rootScope.regex.floatNumber;
            $scope.checkbox = {
                draftsWithErrors: false,
                draftsNoErrors: false,
                allNotSignPlans: false
            };

            $scope.getProcedureType = function (plan) {
                if (!plan) return null;
                return lookupService.getTenderProcedureType(plan.procurementMethodType);
            };

            $scope.$watch('files2', function (files2) {
                $scope.formUpload = false;
                if (files2 != null) {
                    // check file size
                    for (var i = 0; i < files2.length; i++) {
                        $scope.errorMsg = null;
                        (function (file) {
                            generateThumbAndUpload(file, $scope.files);
                        })(files[i]);
                    }
                }
            });

            $scope.$watch('documentsToUpdate', function (files) {
                //$scope.formUpload = false;
                if (files != null) {
                    for (var i = 0; i < files.length; i++) {
                        $scope.errorMsg = null;
                        (function (file) {
                            $scope.update(file);
                        })(files[i], i);
                    }
                }
            });

            function uploadUsing$upload(file, listOfFiles) {
                abp.ui.setBusy("#myPlansDiv");
                file.upload = Upload.upload({
                    url: './api/services/etender/plan/exportPlansFromFile',
                    method: 'POST',
                    file: file
                });

                file.upload.then(function (response) {
                    $timeout(function () {
                        file.result = response.data.result;
                        $scope.exportPlansFromFile = response.data.result;
                    });
                }, function (response) {
                    if (response.status > 0)
                        $scope.errorMsg = response.status + ': ' + response.data;
                });

                file.upload.progress(function (evt) {
                    // Math.min is to fix IE which reports 200% sometimes
                    file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                });

                file.upload.success(function (data, status, headers, config) {

                    //console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                    if (!data.success && data.error) {
                        abp.notify.error("Помилка при завантаженні - " + data.error.message);
                    } else {
                        abp.notify.success("Плани завантажено!");
                    }

                    
                    $scope.uploadFilesCounter++;
                    if ($scope.uploadFilesCounter == listOfFiles.length) {
                        listOfFiles.splice(0, listOfFiles.length);
                        $scope.uploadFilesCounter = 0;
                        $("#modalDocNotification").modal('show');
                    }
                    reloadTable();

                }).error(function (data) {
                    abp.notify.error(data.exceptionMessage || data.message);
                });

              
            }

            $scope.$on('reloadPlanTable', function (event, params) {
                $scope.exportPlansFromFile = {};
                $scope.exportPlansFromFile.successCount = params.result.successCount;
                $scope.exportPlansFromFile.errorCount = params.result.errorCount;
                $scope.exportPlansFromFile.errorMesage = params.result.errorMesage;
            });

            $scope.$on('onPersonSignDataErrorModalOpen', function () {
                $timeout(function () {
                    $('#personSignDataErrorModal').modal('show');
                }, 1000);
            });

            function generateThumbAndUpload(file, listOfFiles) {
                $scope.errorMsg = null;
                $scope.fileUploadObj = { complaintId: $scope.complaint.id, documentId: "" };
                // uploadUsing$upload(file, listOfFiles);
                uploadFileService.upload(listOfFiles, $scope);
            }

            $scope.update = function (files, complaintId) {

                $scope.fileUploadObj.complaintId = complaintId;
                $scope.fileUploadObj.tenderId = $scope.tenderid;
                if (files != null) {
                    uploadFileService.upload(files, $scope);
                    // for (var i = 0; i < files.length; i++) {
                    //     $scope.errorMsg = null;
                    //     (function (file) {
                    //         uploadUsing$upload(file, files);
                    //     })(files[i]);
                    // }
                }
            };

            $scope.addDocumentUploaded = function () {
                reloadTable();
            };

            $scope.changeDoc = function (document) {
                $scope.fileUploadObj.documentId = document.id;
                //$scope.fileUploadObj.awardId = $scope.complaint.award && $scope.complaint.award.id;
                _($scope.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

            $scope.clearDoc = function () {
                $scope.fileUploadObj.documentId = "";
            };

            var deleteDocument = function (input) {
                if (confirm("Ви дійсно бажаєте видалити документ?")) {
                    var removeDocument = $http.post('./api/files/DeleteDocument', input);
                    removeDocument.then(function (response) {
                        //console.log(data);
                    });
                }
            };
            $scope.removeComplaintDocument = function (documentId) {
                var input = { 'ComplaintDocumentId': documentId };
                deleteDocument(input);
            };
            ////////////////////






           
            $scope.chooseAllNotSignPlans = function (checkbox) {
                var isChecked = checkbox;
                if (isChecked) {
                    var showMessage = false;
                    angular.forEach($scope.plans, function (plan) {
                        plan.selected = false;
                        if (!plan.isSigned && plan.apiId) {
                            if (plan.status) {
                                var notSelect = false;
                                if (plan.projectBudget && (!plan.projectBudget.breakdown || plan.projectBudget.breakdown.length === 0)) {
                                    if (!(plan.procurementMethodType === 'belowThreshold' ||
                                        (plan.procurementMethodType === 'reporting' && plan.procurementMethod === 'limited') ||
                                        (plan.procurementMethodType === null && plan.procurementMethod === null))) {
                                        notSelect = true;
                                        showMessage = true;
                                    }
                                }

                                if (!notSelect && plan.status.value !== 'cancelled' && plan.status.value !== 'complete') {
                                    plan.selected = true;
                                } else {
                                    showMessage = true;
                                }
                            } else {
                                plan.selected = true;
                            }
                        } else {
                            showMessage = true;
                        }
                    });
                    if (showMessage) {
                        abp.notify.warn('Неможливо підписати план без "Джерела фінансування" або в статусі "Оголошено тендер" / "Скасований"', 'Увага!', true);
                    }
                } else {
                    angular.forEach($scope.plans, function (plan) {
                        plan.selected = false;
                    });
                }
            }

            $scope.chooseAllDrafts = function (errors, checkbox) {
                var isChecked = checkbox;
                if (isChecked) {
                    angular.forEach($scope.plans, function (plan) {
                        //plan.selected = false;
                        if (plan.isDraft && ((!errors && !plan.isAddedWithError) || (errors && plan.isAddedWithError)))
                            plan.selected = true;
                    });
                } else {
                    angular.forEach($scope.plans, function (plan) {
                        if (plan.isDraft && ((!errors && !plan.isAddedWithError && !$scope.draftsNoErrors)
                            || (errors && plan.isAddedWithError && !$scope.draftsWithErrors)))
                        plan.selected = false;
                    });
                }
            }


            $scope.checkbox.allPlans = false;
            $scope.chooseAllDraft = function (checkbox) {
                var isChecked = checkbox.allPlans;
                angular.forEach($scope.plans, function (plan) {
                    if (plan.isDraft) plan.selected = isChecked;
                })
            }

            $scope.canSignPlanBatch = function () {
                if (!$scope.plans || $scope.plans.length < 1)
                    return false;
                var canSignPlanBatch = false;

                angular.forEach($scope.plans, function(plan) {
                    if (plan.selected)
                        canSignPlanBatch = true;
                });
                return canSignPlanBatch;
            }
            
            $scope.sendPlansToCreate = function () {
                $scope.blockCreatePlans = true;
                var selectedIds = [];
                angular.forEach($scope.plans, function (plan) {
                    if (plan.selected)
                        selectedIds.push(plan.id);
                });
                $scope.exportPlansFromFile = null;
                var plans = plan.sendCreateRequests(selectedIds);

                abp.ui.setBusy("#myPlansDiv");
                plans.then(function (response) {
                    var data = response.data;
                    var errorText = "";
                    if (data.errorCount != 0)
                        errorText = errorText.concat(";<br> НЕ опубліковано: ", data.errorCount);

                    var msg = "";
                    msg = msg.concat("Опубліковано: ",
                        data.successCount,
                        errorText,
                        ";<br> Відновіть сторінку через хвилину щоб перевірити їх статус");

                    $scope.tableParams.reload();
                    abp.ui.clearBusy("#myPlansDiv");

                    if (data.errorCount != 0)
                        abp.notify.warn(msg);
                    else
                        abp.notify.success(msg);
                    $scope.blockCreatePlans = false;
                    //abp.notify.success("Плани відправлено на ЦБД! Відновіть сторінку через хвилину щоб перевірити їх статус");
                }, function () {
                    $scope.blockCreatePlans = false;
                    abp.ui.clearBusy("#myPlansDiv");
                    $scope.tableParams.reload();
                });;
            };

            $scope.delete = function() {
                var selectedIds = [];
                var isContainsExportedPlan = false;
                angular.forEach($scope.plans, function (plan) {
                    if (plan.selected) {
                        selectedIds.push(plan.id);
                        if (plan.apiId)
                            isContainsExportedPlan = true;
                    }
                    
                });

                if (isContainsExportedPlan) {
                    alert('Серед обраних планів є експортовані до ЦБД! Виключіть їх зі списку і спробуйте ще!');
                    return;
                }

                $scope.exportPlansFromFile = null;
                var plans = plan.delete(selectedIds);

                abp.ui.setBusy("#myPlansDiv");
                plans.then(function (response) {
                    reloadTable();
                    abp.ui.clearBusy("#myPlansDiv");
                    abp.notify.success("План(и) видалено!");
                }, function () {
                    abp.ui.clearBusy("#myPlansDiv");
                });;
            }

            $scope.reload = function () {
                reloadTable();
                $scope.exportPlansFromFile = null;
            }
            $scope.notifyPeriod = function () {
                return toastr
                    .warning('Для підпису планів, створених до 13.12.18 потрібно спочатку заповнити Роки початку та кінця строку дії плану',
                        'Увага!',
                        {
                            closeButton: true,
                            timeOut: 0,
                            extendedTimeOut: 0
                        });
            }
            $scope.showSignModal = function (planObj) {

                if (planObj instanceof Array) {
                    planObj = [];
                    for (var i = 0; i < $scope.plans.length; i++) {
                        var plan = $scope.plans[i];
                        if (plan.selected) {
                            planObj.push(plan);
                            if (!plan.apiId) {
                                alert('Серед обраних планів є чернетки! Виключіть їх зі списку або відправте до ЦБД і спробуйте ще!');
                                return;
                            }
                            if (!plan.projectBudget.period) {
                                $scope.notifyPeriod();
                                return;
                            }
                        }
                    }
                }
                else if (!planObj.projectBudget.period && planObj.projectBudget.year) {
                    $scope.notifyPeriod();
                    return;
                }
                $scope.currentPlan = planObj;
                $scope.entityType = 'plan';
                $('#modalSignNew').modal('toggle');
            };

            $scope.years = [{
                value: null, title: 'Всі роки'
            }, {
                value: 2016, title: '2016'
            }, {
                value: 2017, title: '2017'
            }, {
                value: 2018, title: '2018'
            }, {
                value: 2019, title: '2019'
            }, {
                value: 2020, title: '2020'
            }, {
                value: 2021, title: '2021'
            }, {
                value: 2022, title: '2022'
            }];

            $scope.filter = {
                searchString: '',
                title: null,
                priceFrom: null,
                priceTo: null,
                year: $scope.years.find(
                    function (element) {
                        return element.value == currentYear
                    }
                ),
                procuringEntityCodes: []
            };

            if ($localStorage.myPlansFilter) {
                $scope.filter = $localStorage.myPlansFilter;
            }

            $scope.isProdMode = $scope.ng_localStorage.isOrganizationProductionMode;

            $scope.tableParams = new ngTableParams({
                page: page,
                count: 10
            }, {
                counts: [50,100,250],
                getData: function ($defer, params) {
                    var orderBy = params.orderBy(); // add '-' on start str
                    var sorting = params.sorting();
                    var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : '';
                    var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
                    var operationsInput = {
                        page: params.page(),
                        pageSize: params.count(),
                        orderColumn: orderColumn,
                        orderDirection: orderDirection,
                        searchFilter: getSearchFilter()
                    };

                    $rootScope.lastPage = params.page();

                    if (
                        $scope.filter.procuringEntityCode &&
                        $scope.filter.procuringEntityCodes.indexOf($scope.filter.procuringEntityCode) === -1
                    )
                        $scope.filter.procuringEntityCodes.push($scope.filter.procuringEntityCode);

                    var selectedCpvs = [];
                    for (var i = 0; i < $scope.selectedCpvs.length; i++) {
                        selectedCpvs.push($scope.selectedCpvs[i].code);
                    }
                    operationsInput.searchFilter.cpvs = selectedCpvs;

                    var search = $location.search();
                    var debugElastic = search.debugElastic;
                    if (debugElastic)
                        operationsInput.debugElastic = true;

                    var plans = plan.getPlans(operationsInput);

                    $localStorage.myPlansFilter = $scope.filter;

                    abp.ui.setBusy("#myPlansDiv");
                    plans.then(function (response) {
                        console.log('Планы с сервера:', response.data);
                        ifPlansSelected();
                        params.total(response.data.totalCount);
                        $scope.plans = response.data.items;
                        $defer.resolve(response.data.items);
                        $scope.allRecords = response.data.totalCount;
                        $scope.getClearFilterButton();
                        abp.ui.clearBusy("#myPlansDiv");
                    }, function () {
                        abp.ui.clearBusy("#myPlansDiv");
                    });;
                }
                });

            function ifPlansSelected() {
                $timeout(function () {
                    if ($scope.checkbox.draftsWithErrors) $scope.chooseAllDrafts(true, $scope.checkbox.draftsWithErrors);
                    if ($scope.checkbox.draftsNoErrors) $scope.chooseAllDrafts(false, $scope.checkbox.draftsNoErrors);
                    if ($scope.checkbox.allNotSignPlans) $scope.chooseAllNotSignPlans($scope.checkbox.allNotSignPlans);
                    if ($scope.checkbox.allPlans) $scope.chooseAllDraft($scope.checkbox.allPlans);
                }, 1000);
            }

            function getSearchFilter() {
                return {
                    isShowOnlyMyPlans: true,
                    planId: $scope.filter.searchString,
                    title: $scope.filter.title,
                    priceFrom: $scope.filter.priceFrom,
                    priceTo: $scope.filter.priceTo,
                    year: $scope.filter.year.value,
                    isDraft: $scope.filter.isDraft,
                    isNotSigned: $scope.filter.isNotSigned,
                    procurementMethodTypes: selectedProcTypesPublicPlans,
                    codeEDRPOUs: $scope.selectedOrgCodes,
                    procuringEntityCodes: $scope.filter.procuringEntityCodes,
                    organizationName: $scope.filter.organizationName,
                    statuses: $scope.statuses.checked
                };
            }

            $scope.getPlansExcel = function () {

                toastr.error('В Excel файл система завантажить не більше 300 планів за обраними Вами параметрами.',
                    'Зверніть увагу!', {
                        timeOut: 10000
                    });

               var orderBy = $scope.tableParams.orderBy(); // add '-' on start str
                var sorting = $scope.tableParams.sorting();
                    var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'dateModified';
                    var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
                    var operationsInput = {
                        page: $scope.tableParams.page(),
                        pageSize: $scope.tableParams.count(),
                        orderColumn: orderColumn,
                        orderDirection: orderDirection,
                        searchFilter: getSearchFilter()
                    };
                    
                    var plans = plan.getPlansExcel(operationsInput);

                    abp.ui.setBusy("#myPlansDiv");
                    plans.then(function (fileName) {
                        $http({
                            url: "api/files/DownloadAndDelete",
                            method: "POST",
                            params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                            responseType: 'arraybuffer'
                        }).then(function (response) {
                            var file = new Blob([response.data], { type: 'application/octet-stream' });
                            saveAs(file, fileName.data);
                            abp.ui.clearBusy("#myPlansDiv");
                        }, function (data, status, headers, config) {
                            abp.ui.clearBusy("#myPlansDiv");
                        });                        
                    }, function () {
                        abp.ui.clearBusy("#myPlansDiv");
                    });;
                };

            $scope.isIntervalGood = function (from, to) {
                var fromValue = 0;
                var toValue = 0;
                if (from && to) {
                    fromValue = parseInt(from);
                    toValue = parseInt(to);
                    if (toValue >= fromValue) return true;
                    else return false;
                } else return true;
            };

            $scope.search = function () {
                if ($scope.tableParams.page() === 1) {
                    $scope.tableParams.reload();
                } else {
                    $scope.tableParams.page(1);
                }
            }           

            $scope.searchChange = function () {
                $scope.tableParams.$params.page = 1;
                $scope.tableParams.reload();
            }

            $scope.clear = function() {
                $scope.filter = {
                    title: null,
                    priceFrom: null,
                    priceTo: null,
                    year: $scope.years.find(
                        function (element) {
                            return element.value == currentYear
                        }
                    ),
                    isDraft: false,
                    isNotSigned: false,
                    procuringEntityCodes: [],
                    OrganizationName: null,
                    procurementMethodTypes: null,
                    parentCodesEDRPOU: []
                }

                $scope.selectedOrgCodes = [];
                $scope.checkedProcTypes = [];
                $scope.procTypeSearchText = null;
                $scope.filter.searchString = '';
                selectedProcTypesPublicPlans = [];
                $scope.cpv = '';
                $scope.selectedCpvs = [];
                $scope.statuses.checked = [];

                if ($scope.searchCpv) {
                    $scope.searchCpv.vm.tableParamsCpv.data.forEach(function (item) {
                        item.$selected = false;
                    });
                }

                reloadTable();
            }

            if (screen.width < 500) {
                jQuery("body").addClass("nohover");
                jQuery("td, th")
                  .attr("tabindex", "1")
                  .on("touchstart", function () {
                      jQuery(this).focus();
                  });
            };

            if (!$scope.procTypesDictionaryPlans) $scope.procTypesDictionaryPlans = [];

            $scope.getProcTypes = function () {
                if ($scope.procTypesDictionaryPlans.length > 0) return;

                abp.ui.setBusy("#procTypesFilter");
                referenceService
                    .getAllProcTypesForPlans()
                    .then(function (procTypes) {
                        $scope.allProcTypesPlans = procTypes;
                        getProcTypes();                        
                        abp.ui.clearBusy("#procTypesFilter");
                    },
                    function () {
                        abp.ui.clearBusy("#procTypesFilter");
                    });

                function getProcTypes() {
                    var arr = $scope.allProcTypesPlans;
                    $scope.procTypesDictionaryPlans = $scope.filterProcTypes(arr);
                    $scope.checkedProcTypes.length = $scope.procTypesDictionaryPlans.length;
                    $scope.checkedProcTypes.fill(false);
                }
            }

            $scope.filterProcTypes = function (procTypes) {
                return procTypes.filter(function (pt) {
                    if (pt.procurementMethod === 'limited' || pt.procurementMethod === 'open' || pt.procurementMethod === '_')
                        return pt.procurementMethod;
                });
            }

            $scope.changeSelProcTypes = function (procType, checked) {

                if (procType) {
                    if (checked) selectedProcTypesPublicPlans.push(procType.procurementMethodType);
                    else selectedProcTypesPublicPlans.splice(selectedProcTypesPublicPlans.indexOf(procType.procurementMethodType), 1);
                    makeProcTypeSearchText();
                } else if (checked) {
                    selectedProcTypesPublicPlans = [];
                    $scope.checkedProcTypes = [];
                    $scope.procTypeSearchText = null;
                }
            }

            $scope.closeProcTypDropDown = function () {
                $scope.isProcTypOpen = false;
            };

            function makeProcTypeSearchText() {
                $scope.procTypeSearchText = null;
                angular.forEach(selectedProcTypesPublicPlans, function (pType) {
                    angular.forEach($scope.procTypesDictionaryPlans, function (dict) {
                        if (dict.procurementMethodType === pType &&
                            (!$scope.procTypeSearchText || $scope.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                            $scope.procTypeSearchText = $scope.procTypeSearchText ? $scope.procTypeSearchText + dict.procurementMethodTypeLocal + '; ' : dict.procurementMethodTypeLocal + '; ';
                    });
                });
            }

            if ($sessionStorage.userselectedProcTypesPublicPlans && $sessionStorage.userselectedProcTypesPublicPlans !== '') {
                selectedProcTypesPublicPlans = $sessionStorage.userselectedProcTypesPublicPlans;
                if (!$scope.procTypesDictionaryPlans) $scope.getProcTypes();
                makeselectedProcTypesPublicPlansChecked();
            }


            function makeselectedProcTypesPublicPlansChecked() {
                if (selectedProcTypesPublicPlans.length > 0) {
                    if ($scope.procTypesDictionaryPlans.length === 0) $scope.getProcTypes();
                    angular.forEach($scope.procTypesDictionaryPlans, function (procType) {
                        if (selectedProcTypesPublicPlans.indexOf(procType.procurementMethodType) > -1)
                            $scope.checkedProcTypes[$scope.procTypesDictionaryPlans.indexOf(procType)] = true;
                    });
                    makeProcTypeSearchText();
                }
            }

            $scope.checkCodeOrgExists = function (code, isValidInput) {

                if (!isValidInput || !code) {
                    $scope.orgCodeNotExists = null;
                    return;
                }
                abp.ui.setBusy("#codeFilter");
                edrpouFromParams.push(code);
                abpReferenceService
                    .isOrganizationExists({ innOrEdrpou: code })
                    .then(function (resposne) {
                        if (resposne.data) $scope.orgCodeNotExists = false;
                        else $scope.orgCodeNotExists = true;
                        abp.ui.clearBusy("#codeFilter");
                    },
                        function (e) {
                            abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                            $scope.orgCodeNotExists = true;
                            abp.ui.clearBusy("#codeFilter");
                        });
            }

            $scope.changeSelOrgCodes = function (code, remove) {
                if (code) {
                    if (!remove)
                        $scope.selectedOrgCodes.push(code);
                    else $scope.selectedOrgCodes.splice($scope.selectedOrgCodes.indexOf(code), 1);
                }
            }

            $scope.addProcuringEntityCode = function () {

                var procuringEntityCode = $scope.filter.procuringEntityCode;

                if (!procuringEntityCode)
                    return;

                if ($scope.filter.procuringEntityCodes.indexOf(procuringEntityCode) > -1)
                    return;

                $scope.filter.procuringEntityCodes.push(procuringEntityCode);
                $scope.filter.procuringEntityCode = null;
            }

            $scope.deleteProcuringEntityCode = function (procuringEntityCode) {
                $scope.filter.procuringEntityCodes.splice(
                    $scope.filter.procuringEntityCodes.indexOf(procuringEntityCode), 1
                );
            }

            $scope.initClassification = function () {
                $scope.searchCpv = angular.element($("#modalClassifications")).scope().$parent;
                $controller('modalClassificationsCtrl', { $scope: $scope.searchCpv });
                $scope.searchCpv.init(getDataCpv, updateDataCpv);
            }

            function getDataCpv($defer, params) {
                abp.ui.setBusy(".modal-body");
                var searchString = null;
                if ($scope.searchCpv && $scope.searchCpv.vm) searchString = $scope.searchCpv.vm.searchStringCpv;
                if (searchString && searchString.length > 0) {
                    var searchClassificationData = abpReferenceService.getSearchClassificationsRef(searchString);
                    searchClassificationData.then(function (response) {
                        response.data.forEach(function (cpv) { cpv.rank = 0; });
                        params.total(response.data.length);
                        var tableScope = $('#modalClassifications table').scope();
                        tableScope.$data = setSelected(response.data);
                        abp.ui.clearBusy(".modal-body");
                    });
                } else {
                    var classificationData = abpReferenceService
                        .getClassificationWithChildrensRef($scope.selectedCpvs);
                    classificationData.then(function (response) {
                        params.total(response.data.length);
                        var tableScope = $('#modalClassifications table').scope();
                        tableScope.$data = setSelected(response.data);
                        abp.ui.clearBusy(".modal-body");
                    });
                }

                function setSelected(items) {
                    var cpvs = $scope.selectedCpvs;
                    var cl = cpvs.length;
                    return items.map(function (item) {
                        for (var i = 0; i < cl; i += 1) {
                            if (cpvs[i].id == item.id || cpvs[i] == item.code) {
                                item.$selected = true;
                                return item;
                            }
                        }
                        return item;
                    });
                }
            }

            function updateDataCpv(data, item, isCheckbox) {
                $scope.searchCpv.vm.tableParamsCpv.data = data;
                if (!isCheckbox) {
                    item.$selected = !item.$selected;
                }
                setItem(item);
                updateChildItems(item);
            };

            function updateChildItems(item) {
                if ($scope.searchCpv.vm.tableParamsCpv.data.length == 1) return;
                var cursor = 0;
                $scope.searchCpv.vm.tableParamsCpv.data.some(function (cpvItem, i) {
                    if (cpvItem.id === item.id) {
                        cursor = i;
                        return true;
                    }
                });
                var item = $scope.searchCpv.vm.tableParamsCpv.data[cursor + 1];
                while (item && item.rank > item.rank) {
                    $scope.searchCpv.vm.tableParamsCpv.data[cursor + 1].$selected = item.$selected;
                    setItem($scope.searchCpv.vm.tableParamsCpv.data[cursor + 1]);
                    cursor++;
                }
            }

            function setItem(item) {
                var cpvs = $scope.selectedCpvs;
                var alreadySelectedItem = $scope.selectedCpvs.filter(function (cpv) {
                    return cpv.code == item.code;
                });
                if (item.$selected && alreadySelectedItem.length == 0) {
                    cpvs.push({
                        id: item.id,
                        code: item.code,
                        desc: item.description,
                        rank: item.rank,
                        hasChildren: item.hasChildren,
                        isOpen: item.isOpen
                    });
                } else if (!item.$selected) {
                    var index = $scope.selectedCpvs.indexOf(alreadySelectedItem[0]);
                    if (index > -1) {
                        if (cpvs[index].hasChildren && !cpvs[index].isOpen)
                            $scope.cleareChildCpv(cpvs[index]);
                        cpvs.splice(index, 1);
                    }
                }
            }

            $scope.cleareChildCpv = function (cpvs) {
                var code = cpvs.code;
                var index = code.indexOf(0, 1);
                var smallCod = code.slice(0, index);
                var i = 0;
                var tempChildCpvsArray = $scope.ng_sessionStorage.childCpvs;
                if (tempChildCpvsArray)
                    for (i; i < tempChildCpvsArray.length; i++) {
                        if (tempChildCpvsArray[i] && tempChildCpvsArray[i].code) {
                            var childCpvsCode = tempChildCpvsArray[i].code.slice(0, index);
                            if (childCpvsCode === smallCod) {
                                delete tempChildCpvsArray[i];
                            }
                        }
                    }
                $sessionStorage.childCpvs = tempChildCpvsArray;
            };
            $scope.disableSignPlanCheckbox = function (plan) {
                if (plan.status) {
                    if (plan.status.value === 'complete' || plan.status.value === 'cancelled') {
                        return true;
                    }
                }
                if (plan.projectBudget && (!plan.projectBudget.breakdown || plan.projectBudget.breakdown.length === 0)) {
                    if (!(plan.procurementMethodType === 'belowThreshold' ||
                        (plan.procurementMethodType === 'reporting' && plan.procurementMethod === 'limited') ||
                        (plan.procurementMethodType === null && plan.procurementMethod === null))) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }

            $scope.forceCheckSignClick = function (plan) {
                plan.forceCheckSign = true;
            }

            $scope.getExportedPlanDocs = function (plan) {
                return documentsService.checkDocumentsIsExported(plan.documents);
            }

            $scope.portalProzorroUrl = abp.setting.values.ProzorroGovUrl;

        }]);
})();
;
angular.module('app')
    .controller('planAdditionalClassificationCtrl', ['$scope', 'ngTableParams', '$filter', 'abp.services.etender.reference', '$timeout',
        function ($scope, ngTableParams, $filter, reference, $timeout) {

            $scope.dkScheme = {
                value: 'ДК003'
            };
            
            var timer;
            $scope.search = function (searchstring) {
                $scope.searchstring = searchstring;
                $timeout.cancel(timer);
                timer = $timeout(function () {
                    $scope.tableParams.reload();
                    $scope.tableParams.page(1);
                }, 1000);
            };
           
            $scope.changeSelection = function (item) {
                var d = $scope.tableParams.data;
                for (var i = 0; i < d.length; i += 1) {
                    d[i].$selected = false;
                }
                item.$selected = true;
                $scope.selectedData = item;
            };

            $scope.choose = function () {                
                var itemInd = $scope.itemInd;                
                if (itemInd !== null) {
                    var acInd = $scope.addClassificatorIndex;
                    var additionalClassification = $scope.data.additionalClassifications[0];
                    if (!compare()) return;
                    $scope.data.items[itemInd].additionalClassifications[acInd] = $scope.selectedData;
                } else {
                    $scope.data.additionalClassifications[0] = $scope.selectedData;
                }
                   
                function compare() {
                    if (!additionalClassification.id) {
                        abp.notify.error('Спочатку оберіть перший класифікатор ДКПП плану');
                        return false;
                    }

                    var c = additionalClassification.code ? additionalClassification.code.substring(0, 5) : additionalClassification.id.substring(0, 5);
                    var sc = $scope.selectedData.code.substring(0, c.length);
                    if (sc !== c) {
                        abp.notify.error('Код ДКПП має починатися з ' + c);
                        return false;
                    }
                    return true;
                }
            };

            $scope.changeDk = function () {
                if ($scope.dkScheme.value == 'Спеціальні норми та інше') {
                    $scope.changeSelection({
                        id: '-', // default value
                        code: '000',
                        description: 'Спеціальні норми та інше',
                        scheme: 'specialNorms'
                    });
                    return;
                }
                $scope.tableParams.reload();
            };

            $scope.ShowDKPP = function () {
                var showDKPP = false;
                if (!$scope.data || !$scope.data.items) return false;
                var items = $scope.data.items;
                if (items && items.length > 0) {
                    items.forEach(function (item) {
                        if (item.additionalClassifications && item.additionalClassifications.length > 0 && item.additionalClassifications[0].scheme && item.additionalClassifications[0].scheme == 'ДКПП') {
                            showDKPP = true;
                        }
                    });
                }
                if ($scope.data.additionalClassifications && $scope.data.additionalClassifications.length > 0 && $scope.data.additionalClassifications[0].scheme == 'ДКПП')
                    showDKPP = true;

                return showDKPP;
            }

            $scope.tableParams = new ngTableParams({
                page: 1,            // show first page
                count: 10          // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {

                    //pager Params
                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        SearchIdentifier: $scope.searchstring,
                        OrderColumn: '',
                        OrderDirection: ''
                    };

                    var classificationData;
                    switch ($scope.dkScheme.value) {
                        case "ДК015":
                            classificationData = reference.getCurrentDk015Ref(pager);
                            break;
                        case "ДК018":
                            classificationData = reference.getCurrentDk018Ref(pager);
                            break;
                        case "ДК003":
                            classificationData = reference.getCurrentDk003Ref(pager);
                            break;
                        case "ДКПП":
                            classificationData = reference.getCurrentDkRef(pager);
                            break;
                        default:
                            classificationData = reference.getCurrentDk015Ref(pager);
                            break;
                    }                    
                    abp.ui.setBusy(".modal-body");
                    classificationData.then(function (resposne) {
                        abp.ui.clearBusy(".modal-body");
                        params.total(resposne.data.countAllRecords);
                        $defer.resolve(resposne.data.dk);
                    });
                }
            });

        }]);
angular.module('app')
    .controller('planClassificationCtrl', ['$scope', 'ngTableParams', '$filter', 'abp.services.etender.reference', '$timeout',
        function ($scope, ngTableParams, $filter, reference, $timeout) {

            var timer;
            $scope.search = function (searchstring) {
                $scope.searchstring = searchstring;
                $timeout.cancel(timer);
                timer = $timeout(function () {
                    $scope.tableParams.reload();
                    $scope.tableParams.page(1);
                }, 1000);
            };

            $scope.changeSelection = function (item) {
                var d = $scope.tableParams.data;
                for (var i = 0; i < d.length; i += 1) {
                    d[i].$selected = false;
                }
                item.$selected = true;
                $scope.selectedData = item;
            };

            $scope.choose = function () {
                var classification = $scope.data.classification;
                var itemInd = $scope.itemInd;

                if (itemInd !== null) {
                    if (!classification.id) {
                        abp.notify.error('Спочатку оберіть класифікатор плану');
                        return;
                    }

                    var a = classification.code ? classification.code.substring(0, 4) : classification.id.substring(0, 4);
                    var c;
                    var sc;
                    if (a.indexOf('336') === 0) {
  
                            c = classification.code ? classification.code.substring(0, 3) : classification.id.substring(0, 3);
                            sc = $scope.selectedData.code.substring(0, 3);
                        if (sc !== c) {
                            abp.notify.error('Код CPV має починатися з ' + c);
                            return;
                        } else {
                            $scope.data.items[itemInd].classification = $scope.selectedData;
                            return;
                        }
                    } else {
                            c = classification.code ? classification.code.substring(0, 4) : classification.id.substring(0, 4);
                            sc = $scope.selectedData.code.substring(0, 4);
                        if (sc !== c) {
                            abp.notify.error('Код CPV має починатися з ' + c);
                            return;
                        } else {
                            $scope.data.items[itemInd].classification = $scope.selectedData;
                        }
                    }

                    $scope.data.items[itemInd].classification = $scope.selectedData;

                } else {
                    $scope.data.classification = $scope.selectedData;

                    for (var ii = 0; ii < $scope.data.items.length; ii += 1) {
                        $scope.data.items[ii].classification = {};
                    }
                }
            };

            $scope.tableParams = new ngTableParams({
                page: 1,            // show first page
                count: 10          // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {

                    //pager Params
                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        SearchIdentifier: $scope.searchstring,
                        OrderColumn: '',
                        OrderDirection: ''
                    };


                    var classificationData = reference.getCurrentCpvRef(pager);
                    abp.ui.setBusy(".modal-body");
                    classificationData.then(function (resposne) {
                        abp.ui.clearBusy(".modal-body");
                        params.total(resposne.data.countAllRecords);
                        $defer.resolve(resposne.data.cpv);
                    });
                }
            });
        }]);
(function () {
    var controllerId = 'planDetailsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$localStorage',
        'abp.services.etender.plan',
        '$stateParams',
        'lookupService',
        'requestService',
        'specialDataService',
        '$location',
        'Upload',
        'documentsService',
        '$timeout',
        'uploadFileService',
        'organizationDataService',
        function (
            $scope,
            $localStorage,
            plan,
            $stateParams,
            lookupService,
            requestService,
            specialDataService,
            $location,
            Upload,
            documentsService,
            $timeout,
            uploadFileService,
            organizationDataService
        ) {
            $scope.ng_localStorage = $localStorage;
            $scope.planId = $stateParams.pId;


            function getPlan() {
                var getDetails = plan.getPlan($scope.planId);
                getDetails.then(function (resposne) {
                    $scope.details = resposne.data;
                    
                    $scope.getProcedureType();
                    console.log('Plan data:', $scope.details);
                    
                    if ($localStorage.isAuthorized &&
                        $scope.details.isMyPlan &&
                        !$scope.details.isSigned &&
                        !$scope.details.isDraft)
                        abp.notify.warn($scope.$root.source('DontForgerSign'));
                    var docs = $scope.details.documents;
                    docs.forEach(function (doc) {
                        if (doc.title === 'sign.p7s')
                            $scope.details.isSignatureFileExist = true;
                    });

                    if (!$scope.details.isDraft && $scope.details.status && $scope.details.status.value === 'draft')
                        abp.notify.error('Увага!<br/>Виникла помилка при експортуванні плана. Натисніть "Опублікувати" для переведення плана в статус "Запланований"', 'Помилка', true);
                    if ($scope.details.milestones) {
                        $scope.details.milestones.forEach(function (milestone) {
                            milestone.documents = documentsService.sortListOfDocs(milestone.documents);
                        });
                    }
                    if ($scope.details.documents) {
                        $scope.details.documents = documentsService.sortListOfDocs($scope.details.documents);
                    }
                });
            };

            $scope.getPlan = getPlan;

            $scope.forceCheckSign = false;
            $scope.forceCheckSignClick = function () {
                $scope.forceCheckSign = true;
            }

            getPlan();

            $scope.$on('reloadTender', function () {
                $scope.getPlan();
            });

            $scope.$on('onPersonSignDataErrorModalOpen', function () {
                $timeout(function () {
                    $('#personSignDataErrorModal').modal('show');
                }, 1000);
            });

            $scope.isStatusMilistoneNotmetOrInvalid = function (milestones) {
                var status = false;
                if (milestones) {
                    for (var i = 0; i < milestones.length; i++) {
                        if (milestones[i].status.name === "notMet" ||
                            milestones[i].status.name === "invalid") {
                            status = true;
                        } else {
                            return false;
                        }
                    }
                }
                return status;
            };

            organizationDataService.getOrganizationKinds($localStorage.codeOfOrganization, true).then(function (kinds) {
                $scope.kinds = kinds;
            });

            $scope.typeOfOrganizationByName = function (name) {
                var typeName = null;
                angular.forEach($scope.kinds, function (param) {
                    if (name === param.name) {
                        typeName = param.title;
                    }
                });
                return typeName;
            }

            $scope.isStatusMilistonesHasScheduled = function(milestones) {
                if (milestones) {
                    for (var i = 0; i < milestones.length; i++) {
                        if (milestones[i].status.name === "scheduled") {
                            return true;
                        }
                    }
                }
                return false;
            };

            $scope.statusCorrespond = function (statuses) {
                return $scope.details.status && statuses.indexOf($scope.details.status.value) !== -1;
            };

            $scope.statusCorrespondOrAbsent = function (statuses) {
                if ($scope.statusCorrespond(statuses))
                    return true;

                if (!$scope.details.status && !$scope.details.tender)
                    return true;

                return false;
            };

            $scope.navigation = [
                {
                    title: 'Дeталі плана',
                    type: 'planDetails',
                    active: true,
                    show: true,
                    openFunc: function () {
                        return;
                    }
                }
            ];

            $scope.breakdownTitles = {
                'state': 'Державний бюджет України',
                'crimea': 'Бюджет Автономної Республіки Крим',
                'local': 'Місцевий бюджет',
                'own': 'Власний бюджет(кошти від господарської діяльності підприємства)',
                'fund': 'Бюджет цільових фондів(що не входять до складу Державного або місцевого бюджетів)',
                'loan': 'Кредити та позики міжнародних валютно - кредитних організацій',
                'other': 'Інше'  
            };

            $scope.getTenderProcedureType = function () {
                return lookupService.getTenderProcedureType($scope.details.procurementMethodType);
            };

            $scope.getProcedureType = function () {
                $scope.tenderProcedureType = specialDataService.getProcedureType($scope.details.procurementMethodType);
            };

            $scope.goToCreateTender = function (tenderProcedureType, tenderProcedureSubType) {
                if (!tenderProcedureType) return;
                tenderProcedureSubType = tenderProcedureSubType ? '/createTender/' + tenderProcedureSubType : null;
                var href = (tenderProcedureSubType || tenderProcedureType.href)  + '?planIdUa=' + $scope.details.planId;
                $location.url(href);
            };

            $scope.monthDictionary = function(mon) {
                return moment(mon, 'MM').format('MMMM');
            };

            $scope.postUserSubscriptionByConcreteCpvCode = function (id) {
                requestService.postUserSubscriptionByConcreteCpvCode(id);
            };
            
            $scope.showSignModal = function (planObj) {
                if (!$scope.isAllDocsExported(planObj)) {
                    abp.notify.error(
                        'Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                } else {
                    $scope.currentPlan = planObj;
                    $scope.entityType = 'plan';
                    planObj.type = $scope.entityType;
                    $('#modalSignNew').modal('toggle');
                }
            };

            $scope.createPlanCopy = function () {
                plan.createPlanCopy({
                    id: $scope.details.id
                }).then(function (resposne) {
                    $location.url('/updatePlan/' + resposne.data.id);  
                });
            };

            $scope.setCompleteStatus = function () {
                abp.ui.setBusy();
                plan.setPlanStatus({
                    planId: $scope.details.id,
                    status: 'complete'
                }).then(function (resposne) {
                    $scope.setCompleteStatusDialogToggle();
                    abp.ui.clearBusy();
                    abp.notify.success('Статус встановлено');

                    $scope.details.status = resposne.data.status;                    
                }, function (error) {                    
                    console.log(error);
                    $scope.setCompleteStatusDialogToggle();
                    abp.ui.clearBusy();
                });
            };

            $scope.isAllDocsExported = function (detailes) {
                if (detailes.documents && detailes.documents.length) {
                    return detailes.documents.every(function (document) {
                        return document.isExported || document.isDeleted;
                    });
                } else {
                    return true;
                }
            };

            $scope.setCompleteStatusDialogToggle = function () {
                $('#setCompleteStatusDialog').modal('toggle');
            };

            $scope.showSignButton = function (plan) {

                if (plan.apiId !== null) {
                    if (plan.projectBudget && (!plan.projectBudget.breakdown || plan.projectBudget.breakdown.length === 0)) {
                        if (!(plan.procurementMethodType === 'belowThreshold' ||
                            (plan.procurementMethodType === 'reporting' && plan.procurementMethod === 'limited') ||
                            (plan.procurementMethodType === null && plan.procurementMethod === null))) {
                            return false;
                        }
                    }
                }

                return !plan.isDraft;
            }

            $scope.isOperator = ($location.$$url.indexOf('operator123') !== -1);
            $scope.portalProzorroUrl = abp.setting.values.ProzorroGovUrl;

            $scope.setSheduleStatus = function () {
                abp.ui.setBusy();
                plan.setPlanStatus({
                    planId: $scope.details.id,
                    status: 'scheduled'
                }).then(function (resposne) {
                    abp.ui.clearBusy();
                    abp.notify.success('Опубліковано');
                    $scope.details.status = resposne.data.status;
                }, function (error) {
                    abp.notify.error(error.message, 'Помилка');
                    console.log(error);
                    abp.ui.clearBusy();
                });
            };

            $scope.getStatusName = function () {

                if (!this.details)
                    return "";

                if (this.details.status)
                    return this.details.status.name;

                if (this.details.isDraft)
                    return "Чернетка";

                return "";
            };

            $scope.showResponseToRequestForCpbProcedure = function() {
                $('#responseToRequestForCpbProcedure').modal('show');
            }

            $scope.getMilistonSheduledDescrip = function () {
                if ($scope.details.milestones) {
                    for (var i = 0; i < $scope.details.milestones.length; i++) {
                        if ($scope.details.milestones[i].status.name === 'scheduled' || $scope.details.milestones[i].status.name === 'met') {
                            return $scope.details.milestones[i];
                        }
                    }
                }
                return null;
            }

            $scope.showEditToRequestForCpbProcedure = function () {
                $scope.descrForMilistoneSheduled = $scope.getMilistonSheduledDescrip;
                requestService.getPlanMilestoneStatuses().then(function() {
                    $scope.milistoneStatusForDropDown = $localStorage.milistoneStatusForDropDown;
                });
                $localStorage.milistoneStatusForDropDown = null;
                $('#editToRequestForCpbProcedure').modal('show');
            }


            $scope.signMilestone = function (milestone) {
                milestone.planApiId = $scope.details.apiId;
                milestone.type = "milestone";
                $scope.currentPlanMilestone = milestone;
                $scope.currentPlan = $scope.details;
                $scope.entityType = 'planMilestone';
                $('#modalSignNew').modal('show');
            }
            $scope.previewDoc = function (document) {
                $scope.$emit('previewDoc', document);
            }

            $scope.plandDocumentsUploaded = function () {
                $scope.planDocuments = [];
            };
            $scope.addPlanDocuments = function () {
                var params = {
                    planId: $scope.details.id
                };
                $scope.addPlanDocumentsFields = { params: params };
            };


            $scope.addedPlanMilestoneDocumentsCount = 0;
            
            $scope.addPlanMilestoneDocuments = function (documents, milestone) {
                $scope.planMilestoneDocuments = documents;
                $scope.planMilestoneDocumentsId = milestone.id;
                angular.forEach(documents, function (file) {

                    var params = {
                        planMilestoneId: milestone.id
                    };

                    file.upload = Upload.upload({
                        url: abp.appPath + 'api/Files/Upload',
                        method: 'POST',
                        fields: { params: params },
                        file: file
                    });

                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                            $scope.addedPlanMilestoneDocumentsCount++;
                            if ($scope.addedPlanMilestoneDocumentsCount >= $scope.planMilestoneDocuments.length) {
                                getPlan();
                                $scope.planMilestoneDocuments = [];
                            }
                        });
                    }, function (response) {
                        if (response.status > 0) {
                            file.errorMessage = response.status + ', ' + (response.data || response.statusText);
                            $scope.planMilestoneDocuments = [];
                        }
                    }, function (evt) {
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });
                });

            }
            $scope.toggleShowDocsMilestone = function (milestone) {
                milestone.showDocs = !milestone.showDocs;
            };
            
            $scope.changeMilestoneDoc = function (milestone, document) {
                $scope.documentChangedId = document.id;
                _(milestone.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

            $scope.changePlanDoc = function (document) {
                $scope.documentChangedId = document.id;
                _($scope.details.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

            $scope.$on('previewDoc',
                function (evt, document) {
                    $scope.previewDoc(document);
                });

            $scope.previewDoc = function (doc) {
                documentsService.previewDoc(doc, $scope);
            }

            $scope.isDocumentChanged = function (document) {
                return documentsService.isDocumentChanged(document, $scope.details.documents, true);
            };

            $scope.trustSrc = function (src) {
                return documentsService.trustSrcForDocLoad(src);
            }

        }]);   
})();
;
(function () {
    var controllerId = 'plansWidgetCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$timeout',
        '$localStorage',
        '$controller',
        function (
            $scope,
            $timeout,
            $localStorage,
            $controller) {

            angular.extend(this, $controller('widgetCtrl', {
                $scope: $scope
            }));

            $scope.ng_localStorage = $localStorage;
            $scope.edrpou = {
                severalCodes: []
            };
            $scope.url = 'publicPlansForWidget';

            //$scope.setModuleCode = function () {
            //    $scope.moduleCode = '<script src="' + $scope.host + '/Scripts/jquery-1.11.3.min.js"></script><script src="' + $scope.host + '/Scripts/iframeResizer.min.js"></script><iframe src="' + $scope.host + '?theme=' + $scope.themes.value.url + parentEdrpou + edrpou + '" width="' + 1124 + '" scrolling="no" frameborder="0"></iframe><script>$("iframe").iFrameResize({log: false})</script>';
            //}

            if ($scope.ng_localStorage.codeOfOrganization) {
                $scope.edrpou.severalCodes.push($scope.ng_localStorage.codeOfOrganization);
            } else {
                $scope.edrpou.severalCodes.push('');
            }
         }
    ]);
})();;
(function () {
    var controllerId = 'publicPlansBaseCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$rootScope',
        'planHelperService',
        'abp.services.etender.plan',
        'ngTableParams',
        'lookupService',
        '$sce',
        '$localStorage',
        'abp.services.etender.reference',
        '$location',
        '$sessionStorage',
        '$controller',
        'siteSettingsService',
        'referenceService',
        '$timeout',
        function (
            $scope,
            $rootScope,
            planHelperService,
            plan,
            ngTableParams,
            lookupService,
            $sce,
            $localStorage,
            abpReferenceService,
            $location,
            $sessionStorage,
            $controller,
            siteSettingsService,
            referenceService,
            $timeout) {

            $scope.ng_localStorage = $localStorage;
            $scope.isProductionMode = $scope.ng_localStorage.isProdMode;
            $scope.ng_sessionStorage = $sessionStorage;
            $scope.plans = null;
            $scope.currentPlan = {};
            $scope.filter = {};
            $scope.showClearFilterButton = false;
            var selectedProcTypesPublicPlans = [];
            $scope.checkedProcTypes = [];
            $scope.procTypeSearchText = null;
            //var selectedRegions = [];
            //$scope.checkedRegions = [];
            //$scope.regionsSearchText = null;
            $scope.checkedStatuses = [];
            $scope.statusSearchText = null;
            $scope.statusSearchLabel = null;
            $scope.selectedCpvs = [];
            $scope.selectedOrgCodes = [];
            $scope.isArchive = false;
            var templateToLoad = null;
            var archiveChanged = false;
            $scope.startDateMonths = moment.months();
            $scope.regexNumber = $rootScope.regex.number;
            $scope.regexDate = $rootScope.regex.date;
            $scope.regexCpv = /^\d{8}\-\d{1}$/;
            var edrpouFromParams = [];
            $scope.pagerSearchFilter = {};
            $scope.isMy = $scope.mode === 'my';
            $scope.maxPageValue = 999999999;

            $scope.statuses = {
                all: [],
                checked: [],
                checkedStatusesDescription: function () {
                    var description = "";
                    angular.forEach($scope.statuses.all, function (element) {
                        var isChecked = ($scope.statuses.checked.find(function (e) { return e == element.value }) !== undefined);
                        if (!isChecked)
                            return;
                        if (description != "")
                            description += ", ";
                        description += element.name;
                    });
                    return description;
                },
                dropDownIsOpen: false
            };

            var url = $location.$$path;
            $scope.urlClass = 'url-' + url.slice(1);

            var currentYear = new Date().getFullYear();

            $scope.procurementMethod = 'open';

            $scope.isOperatorNow = function () {
                return $scope.ng_localStorage.isOperator || $location.search().operator123 ? true : false;
            };

            $scope.elasticPlansIndex = abp.setting.get('ElasticPlansIndex');

            $scope.isProdMode = $scope.ng_localStorage.isOrganizationProductionMode;

            $scope.goToUpdatePlan = function (id) {
                $location.path('updatePlan/' + id);
            };

            planHelperService.getPlanStatuses($scope);

            $scope.years = [{
                value: null, title: 'Всі роки'
            }, {
                value: 2016, title: '2016'
            }, {
                value: 2017, title: '2017'
            }, {
                value: 2018, title: '2018'
            }, {
                value: 2019, title: '2019'
            }, {
                value: 2020, title: '2020'
            }, {
                value: 2021, title: '2021'
            }, {
                value: 2022, title: '2022'
            }];

            $scope.filter = {
                title: null,
                priceFrom: null,
                priceTo: null,
                year: $scope.years.find(
                    function (element) {
                        return element.value == currentYear
                    }
                ),
                procuringEntityCodes: []
            };


            if ($sessionStorage.publicPlansSearchFilter) {
                selectedProcTypesPublicPlans = $sessionStorage.publicPlansSearchFilter.procurementMethodTypes;
                $scope.filter.dkpp = $sessionStorage.publicPlansSearchFilter.Dkpp;
                $scope.selectedOrgCodes = $sessionStorage.publicPlansSearchFilter.parentCodesEDRPOU; 
                edrpouFromParams = $sessionStorage.publicPlansSearchFilter.codeEDRPOUs;
                $scope.filter.organizationName = $sessionStorage.publicPlansSearchFilter.OrganizationName;
                $scope.filter.tenderPeriodStartFrom = $sessionStorage.publicPlansSearchFilter.tenderPeriodStartFrom;
                $scope.filter.tenderPeriodStartTo = $sessionStorage.publicPlansSearchFilter.tenderPeriodStartTo;
                $scope.isShowOnlyCreatedOnOurSite = $sessionStorage.publicPlansSearchFilter.isShowOnlyCreatedOnOurSite;
                $scope.searchString = $sessionStorage.publicPlansSearchFilter.planId;
                $scope.filter.title = $sessionStorage.publicPlansSearchFilter.title;
                $scope.filter.priceFrom = $sessionStorage.publicPlansSearchFilter.priceFrom;
                $scope.filter.priceTo = $sessionStorage.publicPlansSearchFilter.priceTo;
                $scope.filter.year.value = $sessionStorage.publicPlansSearchFilter.year;
                $scope.filter.tendersKind = $sessionStorage.publicPlansSearchFilter.tendersKind;
                $scope.filter.procuringEntityCodes = $sessionStorage.publicPlansSearchFilter.procuringEntityCodes;
                $scope.filter.isDraft = $sessionStorage.publicPlansSearchFilter.isDraft;
                $scope.filter.isNotSigned = $sessionStorage.publicPlansSearchFilter.isNotSigned;
                $scope.statuses.checked = $sessionStorage.publicPlansSearchFilter.statuses;
            }


            $scope.isAuthorized = function () {
                return ($scope.ng_localStorage.isAuthorized);
            };

            $scope.getClearFilterButton = function () {
                if ($scope.searchFilter.Cpvs.length === 0 &&
                    !$scope.searchFilter.Dkpp &&
                    !$scope.searchFilter.OrganizationName &&
                    !$scope.searchFilter.ProcurementMethod &&
                    $scope.searchFilter.codeEDRPOUs.length === 0 &&
                   // $scope.searchFilter.customerRegion.length === 0 &&
                    !$scope.searchFilter.isShowOnlyCreatedOnOurSite &&
                    !$scope.searchFilter.isShowOnlyMyPlans &&
                    $scope.searchFilter.parentCodesEDRPOU.length === 0  &&
                    !$scope.searchFilter.planId &&
                    !$scope.searchFilter.priceFrom &&
                    !$scope.searchFilter.priceTo &&
                    $scope.searchFilter.procurementMethodTypes.length === 0 &&
                    !$scope.searchFilter.tenderPeriodStartFrom &&
                    !$scope.searchFilter.tenderPeriodStartTo &&
                    !$scope.searchFilter.tendersKind &&
                    !$scope.searchFilter.title &&
                    $scope.searchFilter.year === currentYear &&
                    $scope.filter.procuringEntityCodes.length === 0 &&
                    $scope.statuses.checked.length === 0
                ) {
                    $scope.showClearFilterButton = false;
                    return;
                }
                $scope.showClearFilterButton = true;
            }

            $scope.isDateIntervalGood = function (from, to) {
                if (from && to) {
                    if (to >= from) return true;
                    else return false;
                } else return true;
            };

            $scope.getTenderProcedureType = function (tender) {
                if (!tender) return null;
                return lookupService.getTenderProcedureType(tender.procurementMethodType);
            };

            $scope.getProcedureType = function (plan) {
                if (!plan) return null;
                return lookupService.getTenderProcedureType(plan.procurementMethodType);
            };

            function getLocationPage () {
                var locationPage = null;
                for (var key in $location.search()) {
                    if (key === 'page') {
                        locationPage = $location.search()[key];
                    }
                }

                return locationPage;
            }

            var cleanArray = function (arr) {
                if (arr && arr instanceof Array) {
                    var result = [];
                    for (var i = 0; i < arr.length; i++)
                        if (arr[i])
                            result.push(arr[i]);
                    return result;
                } else
                    return [];
            };

            if ($rootScope.isIframe) {
                $scope.edrpouFromParams = ($localStorage.siteSettings.codeEDRPOU && $localStorage.siteSettings.codeEDRPOU.indexOf(',') > -1) ?
                    cleanArray($localStorage.siteSettings.codeEDRPOU.split(',')) :
                    ($localStorage.siteSettings.codeEDRPOU ?
                        [$localStorage.siteSettings.codeEDRPOU] :
                        null);
                $scope.isPM = true;
                $scope.pagerSearchFilter = {
                    codeEDRPOUs: $scope.edrpouFromParams,
                    parentCodesEDRPOU: $localStorage.siteSettings.parentCodeEDRPOU && [$localStorage.siteSettings.parentCodeEDRPOU]
                };
            }

            $scope.isIframe = $rootScope.isIframe;
            $scope.tableParamsPlanse = new ngTableParams({
                page: (function () {
                    var locationPage = Number(getLocationPage());
                    if (!!locationPage && Number.isInteger(locationPage) && locationPage > 0 && locationPage <= $scope.maxPageValue) {
                        return locationPage;
                    } else {
                        $location.search('page', 1);
                        return 1;
                    }
                })(),
                count: 10
            }, {
                    counts: [50, 100, 250],
                    getData: function ($defer, params) {
                        var orderBy = params.orderBy(); // add '-' on start str
                        var sorting = params.sorting();
                        var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'dateModified';
                        var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';

                        var selectedCpvs = [];
                        for (var i = 0; i < $scope.selectedCpvs.length; i++) {
                            selectedCpvs.push($scope.selectedCpvs[i].code);
                        }

                        if ($scope.selectedOrgCodes.length > 0)
                            edrpouFromParams = [];
                        var operationsInput;

                        if ($rootScope.isIframe) {
                            $scope.edrpouFromParams = ($localStorage.siteSettings.codeEDRPOU && $localStorage.siteSettings.codeEDRPOU.indexOf(',') > -1) ?
                                cleanArray($localStorage.siteSettings.codeEDRPOU.split(',')) :
                                ($localStorage.siteSettings.codeEDRPOU ?
                                    [$localStorage.siteSettings.codeEDRPOU] :
                                    null);
                            operationsInput = {
                                page: params.page(),
                                pageSize: params.count(),
                                orderColumn: orderColumn,
                                orderDirection: orderDirection,
                                searchFilter: {
                                    isShowOnlyMyPlans: false,
                                    ProcurementMethod: null,
                                    procurementMethodTypes: selectedProcTypesPublicPlans,
                                    Cpvs: $scope.selectedCpvs,
                                    Dkpp: $scope.filter.dkpp,
                                    parentCodesEDRPOU: $localStorage.siteSettings.parentCodeEDRPOU && [$localStorage.siteSettings.parentCodeEDRPOU],
                                    codeEDRPOUs: $scope.edrpouFromParams,
                                    OrganizationName: $scope.filter.organizationName,
                                    tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom,
                                    tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo,
                                    isShowOnlyCreatedOnOurSite: $scope.isShowOnlyCreatedOnOurSite,
                                   // customerRegion: selectedRegions,
                                    planId: $scope.searchString,
                                    title: $scope.filter.title,
                                    priceFrom: $scope.filter.priceFrom,
                                    priceTo: $scope.filter.priceTo,
                                    year: $scope.filter.year.value,
                                    tendersKind: $scope.filter.tendersKind,
                                    statuses: $scope.statuses.checked
                                }
                            };
                        } else {
                            operationsInput = {
                                page: params.page(),
                                pageSize: params.count(),
                                orderColumn: orderColumn,
                                orderDirection: orderDirection,
                                searchFilter: searchFilter()
                            };
                            $scope.getClearFilterButton();
                        }

                        function searchFilter() {
                            $scope.searchFilter = {
                                isShowOnlyMyPlans: false,
                                ProcurementMethod: null,
                                procurementMethodTypes: selectedProcTypesPublicPlans,
                                Cpvs: selectedCpvs,
                                Dkpp: $scope.filter.dkpp,
                                parentCodesEDRPOU: $scope.selectedOrgCodes,
                                codeEDRPOUs: edrpouFromParams,
                                OrganizationName: $scope.filter.organizationName,
                                tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom,
                                tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo,
                                isShowOnlyCreatedOnOurSite: $scope.isShowOnlyCreatedOnOurSite,
                                planId: $scope.searchString,
                                title: $scope.filter.title,
                                priceFrom: $scope.filter.priceFrom,
                                priceTo: $scope.filter.priceTo,
                                year: $scope.filter.year.value,
                                tendersKind: $scope.filter.tendersKind,
                                procuringEntityCodes: $scope.filter.procuringEntityCodes,
                                isDraft: $scope.filter.isDraft,
                                isNotSigned: $scope.filter.isNotSigned,
                                statuses: $scope.statuses.checked
                            };

                            if (
                                $scope.filter.procuringEntityCode &&
                                $scope.searchFilter.procuringEntityCodes.indexOf($scope.filter.procuringEntityCode) === -1
                            )
                                $scope.searchFilter.procuringEntityCodes.push($scope.filter.procuringEntityCode);
                            $sessionStorage.publicPlansSearchFilter = $scope.searchFilter;
                            return $scope.searchFilter;
                        }

                        function checkIfUserIsOnLastTablePage(currentPage, params) {
                            var reminder = params.total() % params.count();

                            if (reminder) {
                                return Math.floor(params.total() / params.count()) + 1 !== currentPage;
                            } else {
                                return (params.total() / params.count()) !== currentPage;
                            }
                        }

                        function setPagerToTable(tryNumbers) {
                            $timeout(function () {
                                var elements = document.getElementById("table-content");
                                if (elements) {
                                    var pagination = elements.getElementsByClassName("ng-table-pagination");
                                    var paginationArray = Array.from(pagination);
                                    var currentPage = getLocationPage();

                                    paginationArray.forEach(function (paginationItem) {
                                        if (paginationItem.children && paginationItem.children.length) {
                                            var linkList = Array.from(paginationItem.children);
                                            linkList.forEach(function (link, index) {
                                                if (index === 0) {
                                                    var pageToRedirect = Number(currentPage) - 1;
                                                    if (pageToRedirect) {
                                                        link.firstElementChild.setAttribute('href', '?page=' + pageToRedirect);
                                                    }
                                                } else if (index === linkList.length - 1) {
                                                    if (checkIfUserIsOnLastTablePage(Number(currentPage), params)) {
                                                        var pageToRedirect = Number(currentPage) + 1;
                                                        link.firstElementChild.setAttribute('href', '?page=' + pageToRedirect);
                                                    }
                                                } else {
                                                    var spanElement = link.getElementsByTagName('span')[0];
                                                    if (spanElement) {
                                                        var pageToRedirect = spanElement.textContent;
                                                        link.firstElementChild.setAttribute('href', '?page=' + pageToRedirect);
                                                    }
                                                }
                                            });
                                        }
                                    });
                                } else if (tryNumbers < 3) {
                                    setPagerToTable(tryNumbers + 1);
                                }
                            });
                        }

                        // этого поля на форме фильтрации НЕТ, но регионы прилетают из фильтра соседней вкладки
                        operationsInput.searchFilter.customerRegion = '';

                        var plans = plan.getPlans(operationsInput);

                        abp.ui.setBusy(".tablebox");
                        plans.then(function (resposne) {
                            var data = resposne.data;
                            if (data.items.length === 0 && params.$params.page !== 0) {
                                $location.search('page', 1);
                                params.page(1);
                            }
                            console.log('Получили с сервака:', data);
                            params.total(data.totalCount);
                            $scope.allRecords = data.totalCount;
                            $scope.plans = data.items;
                            $defer.resolve(data.items);
                            abp.ui.clearBusy(".tablebox");
                            siteSettingsService.onScrollFilter();
                            setPagerToTable(0);
                        },
                            function (error) {
                                abp.ui.clearBusy(".tablebox");
                            });

                    }
                });

            var allStatuses = [
                'active.enquiries', 'active.tendering',
                'active.pre-qualification', 'active.pre-qualification.stand-still',
                'active.stage2.pending',
                'active.stage2.waiting',
                'active.auction', 'active.qualification',
                'active.awarded'
            ];



            $scope.filterProcTypes = function (procTypes) {
                return procTypes.filter(function (pt) {
                    if (pt.procurementMethod === 'limited' || pt.procurementMethod === 'open' || pt.procurementMethod === '_')
                        return pt.procurementMethod;
                });
            }

            if (!$scope.procTypesDictionaryPlans) $scope.procTypesDictionaryPlans = [];

            $scope.getProcTypes = function () {
                if ($scope.procTypesDictionaryPlans.length > 0) return;

                abp.ui.setBusy("#procTypesFilter");
                referenceService
                    .getAllProcTypesForPlans()
                    .then(function (procTypes) {
                        $scope.allProcTypesPlans = procTypes;
                        getProcTypes();
                        
                        abp.ui.clearBusy("#procTypesFilter");
                    },
                    function () {
                        abp.ui.clearBusy("#procTypesFilter");
                    });

                function getProcTypes() {
                    var arr = $scope.allProcTypesPlans;
                    $scope.procTypesDictionaryPlans = $scope.filterProcTypes(arr);
                    $scope.checkedProcTypes.length = $scope.procTypesDictionaryPlans.length;
                    $scope.checkedProcTypes.fill(false);
                }
            }

            $scope.closeProcTypDropDown = function () {
                $scope.isProcTypOpen = false;
            };

            $scope.changeSelProcTypes = function (procType, checked) {

                if (procType) {
                    if (checked) selectedProcTypesPublicPlans.push(procType.procurementMethodType);
                    else selectedProcTypesPublicPlans.splice(selectedProcTypesPublicPlans.indexOf(procType.procurementMethodType), 1);
                    makeProcTypeSearchText();
                } else if (checked) {
                    selectedProcTypesPublicPlans = [];
                    $scope.checkedProcTypes = [];
                    $scope.procTypeSearchText = null;
                }
            }

            function makeProcTypeSearchText() {
                $scope.procTypeSearchText = null;
                angular.forEach(selectedProcTypesPublicPlans, function (pType) {
                    angular.forEach($scope.procTypesDictionaryPlans, function (dict) {
                        if (dict.procurementMethodType === pType &&
                            (!$scope.procTypeSearchText || $scope.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                            $scope.procTypeSearchText = $scope.procTypeSearchText ? $scope.procTypeSearchText + dict.procurementMethodTypeLocal + '; ' : dict.procurementMethodTypeLocal + '; ';
                    });
                });
            }


            $scope.isIntervalGood = function (from, to) {
                var fromValue = 0;
                var toValue = 0;
                if (from && to) {
                    fromValue = parseInt(from);
                    toValue = parseInt(to);
                    if (toValue >= fromValue) return true;
                    else return false;
                } else return true;
            };

            $scope.search = function () {
                $('#publicPlanSearchForm').modal('hide');
                $location.search('page', 1);
                if ($scope.tableParamsPlanse.page() === 1) {
                    $scope.tableParamsPlanse.reload();
                } else {
                    $scope.tableParamsPlanse.page(1);
                }
            }

            $scope.searchChange = function () {
                $scope.tableParamsPlanse.page(1);
            }

            $scope.clear = function () {
                $scope.filter = {
                    ProcurementMethod: null,
                    procurementMethodTypes: null,
                    Cpvs: null,
                    Dkpp: null,
                    parentCodesEDRPOU: null,
                    codeEDRPOUs: null,
                    OrganizationName: null,
                    tenderPeriodStartFrom: null,
                    tenderPeriodStartTo: null,
                    isShowOnlyCreatedOnOurSite: null,
                    customerRegion: null,
                    planId: null,
                    title: null,
                    priceFrom: null,
                    priceTo: null,
                    tendersKind: null,
                    year: $scope.years.find(
                        function (element) {
                            return element.value == currentYear
                        }
                    ),
                    procuringEntityCodes: []
                }
                $scope.selectedOrgCodes = [];
                $scope.searchString = '';
                $scope.parentCodeEDRPOU = '';
                $scope.procTypeSearchText = [];
                $scope.procurementMethod = [];
                $scope.checkedProcTypes = [];
                $scope.cpv = '';
                $scope.selectedCpvs = [];
                selectedProcTypesPublicPlans = [];
                edrpouFromParams = [];
                $scope.tableParamsPlanse.reload();
                $scope.filter.year.value = currentYear;
                $scope.statuses.checked = [];
                if ($scope.searchCpv) {
                    $scope.searchCpv.vm.tableParamsCpv.data.forEach(function (item) {
                        item.$selected = false;
                    });
                }
            }


            function procurementMethodChanged(val) {
                if (!$scope.isArchive) {
                    if (val === 'limited') allStatuses = ['active', 'unsuccessful', 'complete', 'cancelled'];
                    else
                        allStatuses = [
                            'active.enquiries', 'active.tendering',
                            'active.pre-qualification', 'active.pre-qualification.stand-still',
                            'active.stage2.pending',
                            'active.stage2.waiting',
                            'active.auction', 'active.qualification',
                            'active.awarded'
                        ];
                } else allStatuses = ['unsuccessful', 'complete', 'cancelled'];

                $scope.clear();
                $scope.statusDictionary = getStatusDictionary(allStatuses);
                $scope.procTypesDictionaryPlans = [];

                if (templateToLoad !== null && !archiveChanged) {
                    $scope.tableParams.page(1);
                    $scope.tableParams.reload();
                }
            };

            $scope.$watch('procurementMethod', function (n, o) {
                if (n !== o && templateToLoad !== null) procurementMethodChanged(n);
            });



            if ($sessionStorage.userselectedProcTypesPublicPlans && $sessionStorage.userselectedProcTypesPublicPlans !== '') {
                selectedProcTypesPublicPlans = $sessionStorage.userselectedProcTypesPublicPlans;
                if (!$scope.procTypesDictionaryPlans) $scope.getProcTypes();
                makeselectedProcTypesPublicPlansChecked();
            }


            function makeselectedProcTypesPublicPlansChecked() {
                if (selectedProcTypesPublicPlans.length > 0) {
                    if ($scope.procTypesDictionaryPlans.length === 0) $scope.getProcTypes();
                    angular.forEach($scope.procTypesDictionaryPlans, function (procType) {
                        if (selectedProcTypesPublicPlans.indexOf(procType.procurementMethodType) > -1)
                            $scope.checkedProcTypes[$scope.procTypesDictionaryPlans.indexOf(procType)] = true;
                    });
                    makeProcTypeSearchText();
                }
            }

            //} else {
            //    selectedProcTypesPublicPlans = [];
            //}

            if ($sessionStorage.userSelectedCpvsInPlans) {
                $scope.selectedCpvs = $sessionStorage.userSelectedCpvsInPlans;
            }
            //} else {
            //    $scope.selectedCpvs = [];
            //}
            if ($sessionStorage.userSelectedPlansOrgCodes) {
                $scope.selectedOrgCodes = $sessionStorage.userSelectedPlansOrgCodes;
            }


            if (screen.width < 500) {
                jQuery("body").addClass("nohover");
                jQuery("td, th")
                    .attr("tabindex", "1")
                    .on("touchstart", function () {
                        jQuery(this).focus();
                    });
            };

            $scope.checkCodeOrgExists = function (code, isValidInput) {

                if (!isValidInput || !code) {
                    $scope.orgCodeNotExists = null;
                    return;
                }
                abp.ui.setBusy("#codeFilter");
                edrpouFromParams.push(code);
                abpReferenceService
                    .isOrganizationExists({ innOrEdrpou: code })
                    .then(function (resposne) {
                        if (resposne.data) $scope.orgCodeNotExists = false;
                        else $scope.orgCodeNotExists = true;
                        abp.ui.clearBusy("#codeFilter");
                    },
                    function (e) {
                        abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                        $scope.orgCodeNotExists = true;
                        abp.ui.clearBusy("#codeFilter");
                    });
            }

            $scope.changeSelOrgCodes = function (code, remove) {
                if (code) {
                    if (!remove)
                        $scope.selectedOrgCodes.push(code);
                    else $scope.selectedOrgCodes.splice($scope.selectedOrgCodes.indexOf(code), 1);
                }
            }

            if ($sessionStorage.userSelectedCpvsInPlans) {
                $scope.selectedCpvs = $sessionStorage.userSelectedCpvsInPlans;
            }

            $scope.changeSelCpvs = function (cpv, remove) {
                if (cpv) {
                    if (!remove)
                        $scope.selectedCpvs.push(cpv);
                    else $scope.selectedCpvs.splice($scope.selectedCpvs.indexOf(cpv), 1);
                }
            }

            $scope.checkCpvExists = function (cpv, isValidInput) {
                if (!isValidInput || !cpv) {
                    $scope.cpvNotExists = null;
                    return;
                }
                abp.ui.setBusy("#cpvFilter");
                abpReferenceService
                    .isCpvExists({ code: cpv })
                    .then(function (resposne) {
                        if (resposne.data) $scope.cpvNotExists = false;
                        else $scope.cpvNotExists = true;
                        abp.ui.clearBusy("#cpvFilter");
                    },
                    function (e) {
                        abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                        $scope.cpvNotExists = true;
                        abp.ui.clearBusy("#cpvFilter");
                    });
            }

            //#region Init Classification
            function getDataCpv($defer, params) {
                abp.ui.setBusy(".modal-body");
                var searchString = null;
                if ($scope.searchCpv && $scope.searchCpv.vm) searchString = $scope.searchCpv.vm.searchStringCpv;
                if (searchString && searchString.length > 0) {
                    var searchClassificationData = abpReferenceService.getSearchClassificationsRef(searchString);
                    searchClassificationData.then(function (response) {
                        response.data.forEach(function (cpv) { cpv.rank = 0; });
                        params.total(response.data.length);
                        var tableScope = $('#modalClassifications table').scope();
                        tableScope.$data = setSelected(response.data);
                        abp.ui.clearBusy(".modal-body");
                    });
                } else {
                    var classificationData = abpReferenceService
                        .getClassificationWithChildrensRef($scope.selectedCpvs);
                    classificationData.then(function (response) {
                        params.total(response.data.length);
                        var tableScope = $('#modalClassifications table').scope();
                        tableScope.$data = setSelected(response.data);
                        abp.ui.clearBusy(".modal-body");
                    });
                }

                function setSelected(items) {
                    var cpvs = $scope.selectedCpvs;
                    var cl = cpvs.length;
                    return items.map(function (item) {
                        for (var i = 0; i < cl; i += 1) {
                            if (cpvs[i].id == item.id || cpvs[i] == item.code) {
                                item.$selected = true;
                                return item;
                            }
                        }
                        return item;
                    });
                }
            }

            function updateDataCpv(data, item, isCheckbox) {
                $scope.searchCpv.vm.tableParamsCpv.data = data;
                if (!isCheckbox) {
                    item.$selected = !item.$selected;
                }
                setItem(item);
                updateChildItems(item);
            };

            function updateChildItems(item) {
                if ($scope.searchCpv.vm.tableParamsCpv.data.length == 1) return;
                var cursor = 0;
                $scope.searchCpv.vm.tableParamsCpv.data.some(function (cpvItem, i) {
                    if (cpvItem.id === item.id) {
                        cursor = i;
                        return true;
                    }
                });
                var item = $scope.searchCpv.vm.tableParamsCpv.data[cursor + 1];
                while (item && item.rank > item.rank) {
                    $scope.searchCpv.vm.tableParamsCpv.data[cursor + 1].$selected = item.$selected;
                    setItem($scope.searchCpv.vm.tableParamsCpv.data[cursor + 1]);
                    cursor++;
                }
            }

            function setItem(item) {
                var cpvs = $scope.selectedCpvs;
                var alreadySelectedItem = $scope.selectedCpvs.filter(function (cpv) {
                    return cpv.code == item.code;
                });
                if (item.$selected && alreadySelectedItem.length == 0) {
                    cpvs.push({
                        id: item.id,
                        code: item.code,
                        desc: item.description,
                        rank: item.rank,
                        hasChildren: item.hasChildren,
                        isOpen: item.isOpen
                    });
                } else if (!item.$selected) {
                    var index = $scope.selectedCpvs.indexOf(alreadySelectedItem[0]);
                    if (index > -1) {
                        if (cpvs[index].hasChildren && !cpvs[index].isOpen)
                            $scope.cleareChildCpv(cpvs[index]);
                        cpvs.splice(index, 1);
                    }
                }
            }

            $scope.cleareChildCpv = function (cpvs) {
                var code = cpvs.code;
                var index = code.indexOf(0, 1);
                var smallCod = code.slice(0, index);
                var i = 0;
                var tempChildCpvsArray = $scope.ng_sessionStorage.childCpvs;
                if (tempChildCpvsArray)
                    for (i; i < tempChildCpvsArray.length; i++) {
                        if (tempChildCpvsArray[i] && tempChildCpvsArray[i].code) {
                            var childCpvsCode = tempChildCpvsArray[i].code.slice(0, index);
                            if (childCpvsCode === smallCod) {
                                delete tempChildCpvsArray[i];
                            }
                        }
                    }
                $sessionStorage.childCpvs = tempChildCpvsArray;
            };

            $scope.initClassification = function () {
                $scope.searchCpv = angular.element($("#modalClassifications")).scope().$parent;
                $controller('modalClassificationsCtrl', { $scope: $scope.searchCpv });
                $scope.searchCpv.init(getDataCpv, updateDataCpv);
            }

            $scope.addProcuringEntityCode = function () {

                var procuringEntityCode = $scope.filter.procuringEntityCode;

                if (!procuringEntityCode)
                    return;

                if ($scope.filter.procuringEntityCodes.indexOf(procuringEntityCode) > -1)
                    return;

                $scope.filter.procuringEntityCodes.push(procuringEntityCode);   
                $scope.filter.procuringEntityCode = null;
            }

            $scope.deleteProcuringEntityCode = function (procuringEntityCode) {
                $scope.filter.procuringEntityCodes.splice(
                    $scope.filter.procuringEntityCodes.indexOf(procuringEntityCode), 1
                );
            }
            $scope.portalProzorroUrl = abp.setting.values.ProzorroGovUrl;

        }]);
})();
;
(function () {
    var controllerId = 'updatePlanCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.plan',
        '$stateParams',
        '$localStorage',
        'datesHelperService',
        'planHelperService',
        function (
            $scope,
            $location,
            $q,
            plan,
            $stateParams,
            $localStorage,
            datesHelperService,
            planHelperService) {
            $scope.ng_localStorage = $localStorage;

            function updatePlanFinally(planInput) {

                $scope.updatePlanForm = true;
                $scope.procuringEntity = null;

                abp.ui.setBusy();
                var planUpdateDto = planHelperService.setAdditionalClassifications(planInput);

                if (planUpdateDto.projectBudget.breakdown) {
                    planUpdateDto.projectBudget.breakdown = planUpdateDto.projectBudget.breakdown.filter(function (breakdown) {
                        if (breakdown.value.amount === undefined) {
                            return false;
                        } else {
                            return true;
                        }
                    });
                }

                if (planUpdateDto.procurementMethodType !== 'centralizedProcurement') {
                    var date = new Date(planUpdateDto.tenderPeriodStartDate);
                    date.setDate(1);
                    planUpdateDto.tenderPeriodStartDate = date;
                }


                var peResult = /pe=(\d+)/.exec(window.location.hash);
                if (peResult != null) {
                    planUpdateDto.testMode = peResult[1];
                }

                if (planUpdateDto.buyers[0].address.region.indexOf('м. Київ') !== -1
                || planUpdateDto.buyers[0].address.region.indexOf('м. Киев') !== -1 
                || planUpdateDto.buyers[0].address.region.indexOf('Севастополь') !== -1) {
                    delete planUpdateDto.buyers[0].address.locality;
                    
                }
                if (planUpdateDto.procuringEntity.address.region.indexOf('м. Київ') !== -1
                    || planUpdateDto.procuringEntity.address.region.indexOf('м. Киев') !== -1 
                    || planUpdateDto.procuringEntity.address.region.indexOf('Севастополь') !== -1) {
                    delete planUpdateDto.procuringEntity.address.locality;
                }

                var updatePlan = plan.update(planUpdateDto);
                updatePlan
                    .then(function (data) {
                        abp.ui.clearBusy();
                        abp.notify.success("План оновлено!");
                    },
                    function (err) {
                        abp.ui.clearBusy();
                        console.log(err);
                        if ($scope.createPlanModel.projectBudget.period) {
                            $scope.createPlanModel.projectBudget.period.startDate = moment($scope.createPlanModel.projectBudget.period.startDate).year();
                            $scope.createPlanModel.projectBudget.period.endDate = moment($scope.createPlanModel.projectBudget.period.endDate).year();
                        }
                    });

                return updatePlan;
            }
            
            function getPlanDetailes() {
                var getDetailes = plan.getPlan($stateParams.tId);
                getDetailes.then(function (resposne) {
                    var data = resposne.data;
                    console.log('Plan data:', data);
                    if (!data.procuringEntity.kind) {
                        data.procuringEntity.kind = $localStorage.organization.kind;
                    }
                    if (!data.procuringEntity.address) {
                        var address = $localStorage.organization.address;
                        data.procuringEntity.address = {
                            countryName: address.country.title,
                            region: address.region.title,
                            locality: address.city.title,
                            streetAddress: address.addressStr,
                            postalCode: address.postIndex
                        }
                    }
                    if (data.buyers && data.buyers.length) {
                        if (!data.buyers[0].kind) {
                            data.buyers[0].kind = $localStorage.organization.kind;
                        }
                        if (!data.buyers[0].address) {
                            var address = $localStorage.organization.address;
                            data.buyers[0].address = {
                                countryName: address.country.title,
                                region: address.region.title,
                                locality: address.city.title,
                                streetAddress: address.addressStr,
                                postalCode: address.postIndex
                            }
                        }
                    }

                    $scope.procuringEntity = data.procuringEntity;

                    $scope.createPlanModel = data;
                    $scope.createPlanModel.startDateMonth = data.startDateMonth;
                    $scope.createPlanModel.startDateYear = data.startDateYear;

                    if (data.projectBudget.period) {
                        $scope.createPlanModel.projectBudget.period = {
                            startDate: moment(data.projectBudget.period.startDate, "YYYY").year(),
                            endDate: moment(data.projectBudget.period.endDate, "YYYY").year()
                        }
                    }
                    if (data.projectBudget.breakdown && data.projectBudget.breakdown.length == 0) {
                        data.projectBudget.breakdown.push({ value: {} });
                    }

                    $scope.createPlanModel.additionalClassifications.sort(compare);

                    // add empty SelectDKPP classification
                    setDKk003();

                    $scope.createPlanModel.additionalClassifications.forEach(function (additionalClasification) {
                        if (additionalClasification.scheme === 'КЕКВ') additionalClasification.disableKekvDelete = true;
                    });

                    // needed for ability to edit plans created when UTC was switched on at date control. Delete after some time pass...
                    var startDate = new Date($scope.createPlanModel.startDate);
                    if (startDate.getDate() !== 1)
                        $scope.createPlanModel.startDate = new Date(startDate.getFullYear(), startDate.getMonth(), 1, 0, 0, 0);
                    //

                    $scope.createPlanModel.items.forEach(function (item) {
                        var startDateVar = item.deliveryDate ? new Date(item.deliveryDate) : null;
                        item.deliveryDate = { "startDate": startDateVar };
                        if (item.additionalClassifications && item.additionalClassifications.length == 0)
                            item.additionalClassifications.push({});
                        else item.additionalClassifications.sort(compare);
                    });

                    function compare(a, b) {
                        if (a.scheme < b.scheme) return -1;
                        if (a.scheme > b.scheme) return 1;
                        return 0;
                    };
                    // Fix date-picker ET-16325 
                    if ($scope.createPlanModel.procurementMethodType !== 'centralizedProcurement' && $scope.createPlanModel.tenderPeriodStartDate) {
                        var date = new Date($scope.createPlanModel.tenderPeriodStartDate);
                        date.setDate(1);
                        $scope.createPlanModel.tenderPeriodStartDate = date;
                    }
                });
            }

            getPlanDetailes();

            function setDKk003() {
                var i = 0;
                var len = $scope.createPlanModel.additionalClassifications.length;
                for (i; i < len; i++) {
                    if ($scope.createPlanModel.additionalClassifications[i].scheme === 'ДК003') return;
                    if ($scope.createPlanModel.additionalClassifications[i].scheme === 'ДК015') return;
                    if ($scope.createPlanModel.additionalClassifications[i].scheme === 'ДК018') return;
                    if ($scope.createPlanModel.additionalClassifications[i].scheme === 'specialNorms') return;
                }
                $scope.createPlanModel.additionalClassifications.unshift({});
            }

            $scope.savePlan = function() {
                $scope.submit().then(function () {
                    abp.ui.clearBusy();
                    $location.path("/planDetails/" + $stateParams.tId);
                });
            }

            $scope.submit = function () {
                var deferred = $q.defer(); 

                if ($scope.createPlanModel.projectBudget.period && $scope.createPlanModel.projectBudget.period.startDate) {
                    datesHelperService.setFirstAndLastDateOfYear($scope.createPlanModel.projectBudget.period);
                }

                if ($scope.createPlanModel.classification.code) {
                    $scope.createPlanModel.classification.id = $scope.createPlanModel.classification.code;
                }
                $scope.createPlanModel.classificationId = $scope.createPlanModel.classification.id;
                $scope.createPlanModel.classificationDescription = $scope.createPlanModel.classification.description;

                for (var i = 0; i < $scope.createPlanModel.additionalClassifications.length; i++) {

                    if ($scope.createPlanModel.additionalClassifications[i].code) {
                        $scope.createPlanModel.additionalClassifications[i].id = $scope.createPlanModel.additionalClassifications[i].code;
                    }
                    $scope.createPlanModel.additionalClassifications[i].description = $scope.createPlanModel.additionalClassifications[i].description;
                }

                for (var j = 0; j < $scope.createPlanModel.items.length; j++) {
                    var currItem = $scope.createPlanModel.items[j];

                    if (currItem.classification.code) {
                        currItem.classification.id = currItem.classification.code;
                    }
                    currItem.classificationId = currItem.classification.id;
                    currItem.classificationDescription = currItem.classification.description;
                    currItem.unitId = currItem.unit.id;
                    if (currItem.deliveryDate)
                        currItem.deliveryDate = currItem.deliveryDate.startDate;
                    currItem.classification.description = currItem.classification.description;

                    for (var ai = 0; ai < currItem.additionalClassifications.length; ai++) {
                        var aitem = currItem.additionalClassifications[ai];
                        if (aitem.code) {
                            aitem.id = aitem.code;
                        }
                        aitem.description = aitem.description;
                    }
                }

                if ($scope.createPlanModel.projectBudget.breakdown) {
                    $scope.createPlanModel.projectBudget.breakdown.forEach(function (breakdown) {
                        breakdown.value.currencyId = $scope.createPlanModel.projectBudget.currencyId;
                    });
                }

                return updatePlanFinally($scope.createPlanModel);
            };

            $scope.isAllDataGood = function (model) {
                if (!model) return false;

                if (!model.classification || !model.classification.id) return false;

                //if (model.classification.code == '99999999-9' && (!model.additionalClassifications[0] || !model.additionalClassifications[0].code))
                //    return false;

                //if (!model.procurementMethod || !model.procurementMethodType) return false;                

                if (model.items.length) {
                    for (var i = 0; i < model.items.length; i += 1) {
                        if (!model.items[i].classification || !model.items[i].classification.id) return false;
                    }
                }           
                
                if (!model.tenderPeriodStartDate) {
                    return false;
                }

                //var firstDateOfCurrentMonth = new Date(new Date().getFullYear(), new Date().getMonth(), 1);
                //if (typeof (model.startDate) == 'object') model.startDate = model.startDate.toISOString();
                //if (model.startDate < firstDateOfCurrentMonth) return false;

                return true;

            };

            $scope.validateBreakdownAmount = function () {
                if ($scope.createPlanModel.procurementMethodType == 'esco')
                    return true;

                var breakDownAmountSum = $scope.createPlanModel.projectBudget.breakdown.reduce(function (acc, breakdown) {
                    return breakdown.value.amount !== undefined ? (+ acc + breakdown.value.amount).toFixed(2) : acc;
                }, 0);

                if (breakDownAmountSum > $scope.createPlanModel.projectBudget.amount) {
                    return false;
                } else {
                    return true;
                }
            };

            $scope.editAndSubmit = function() {
                $scope.createPlanModel.isDraft = false;
                $scope.submit().then(function () {
                    //$scope.sendPlansToCreate();
                    abp.notify.success("Опубліковано");
                    $location.path("/planDetails/" + $stateParams.tId);
                }); 
            }

            $scope.sendPlansToCreate = function () {
                abp.ui.setBusy();
                var selectedIds = [$scope.createPlanModel.id];
                var plans = plan.sendCreateRequests(selectedIds);
                plans.then(function (response) {
                    var data = response.data;
                    var errorText = "";
                    if (data.errorCount != 0)
                        errorText = errorText.concat(";<br> НЕ опубліковано: ", data.errorCount);

                    var msg = "";
                    msg = msg.concat("Опубліковано", errorText);

                    if (data.errorCount != 0)
                        abp.notify.warn(msg);
                    else
                        abp.notify.success(msg);
                    abp.ui.clearBusy();
                    $location.path("/planDetails/" + $stateParams.tId);
                });
            };       
        }]);

})();;
(function () {
    var controllerId = 'accessionTreatyCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        'documentsService',
        function (
            $scope,
            $location,
            documentsService) {

            $scope.vm = {};
            documentsService.displayDocFunction($scope.vm);

            $scope.next = function () {
                $location.path('/applicationBlank');
            };

            $scope.getDocUrl = function (docUrl) {
                return documentsService.getUrlForIframeOfficeaApps(docUrl);
            }

        }
    ]);
})();;
(function() {
    var controllerId = 'accountantDataCtrl';
    angular.module('app').controller(controllerId,
        ['$rootScope', '$scope', 'abp.services.etender.allBanking', 'abp.services.etender.report', '$http', 'abp.services.etender.act', 'abp.services.etender.organization',
        function ($rootscope, $scope, allBanking, report, $http, act, organization) {


            $scope.linkType = {
                'restOfFunds': false,
                'history': false,
                'bids': false,
                'invoices': false,
                'act': false,
                'operations': true
            };
            $scope.operMessage = '';
            $scope.operation = { typeId: '', summ: '', tenderId: '' };
            $scope.regexPattern = $rootscope.regex.number;
            $scope.regexFloatPattern = $rootscope.regex.floatNumber;
            $scope.itemsToPerform = [];
            $scope.organizationName = 'Повне найменування клієнта, в кабінеті якого працює наразі оператор';

            var getOperations = allBanking.getOperationsForAccountant();
            getOperations.then(function (resposne) {
                $scope.operationTypes = resposne.data.operationList;
            });

            $scope.performOperation = function() {
                $scope.operMessage = '';
                var input = {
                    codeOfOrganization: $scope.edrpou,
                    operationTypeId: $scope.operation.typeId,
                    amount: $scope.operation.summ,
                    itemIds: $scope.itemsToPerform
                }
                var performOp = allBanking.performOperation(input);
                performOp.then(function (resposne) {
                    if (resposne.data) {
                        $scope.operSuccess = true;
                        $scope.operMessage = 'Операцію виконано!';
                    }
                    else {$scope.operSuccess = false; $scope.operMessage = 'Виникла помилка!'}
                },
                function (e) {
                    $scope.operSuccess = false;
                    $scope.operMessage = e.data.message;
                });
            };

            $scope.isLockUnlock = function () {
                var description = '';
                angular.forEach($scope.operationTypes, function(oper) {
                    if (oper.id == $scope.operation.typeId) {
                        description = oper.description;
                        return;
                    }
                });
                if (description.indexOf('Розблокування') !== -1 || description.indexOf('Списання') !== -1) return true;
                else return false;
            };

            $scope.getMistakenLots = function() {
                var input = {
                    codeOfOrganization: $scope.edrpou,
                    operationTypeId: $scope.operation.typeId,
                    tenderId: $scope.operation.tenderId
                };
                var getLots = allBanking.getMistakenLots(input);
                getLots.then(function (resposne) {
                    $scope.mistakenLots = resposne.data.lots;
                });
            };

            $scope.changeSelLots = function(checked, itemId) {
                if (checked) $scope.itemsToPerform.push(itemId);
                else $scope.itemsToPerform.splice($scope.itemsToPerform.indexOf(itemId), 1);
            };

            $scope.changeEdrpou = function () {
                $scope.operation.typeId = '';
                $scope.operation.summ = '';
                $scope.operation.tenderId = '';
            };

            $scope.inputKeyPress = function (keyEvent) {
                if (keyEvent.which == 13)
                    $scope.setOrgname();
            };

            $scope.setOrgname = function () {
                organization.getOrganizationInfoByEdrpou({ innOrEdrpou: $scope.edrpou })
                .then(function (resposne) {
                    $scope.organizationName = resposne.data.orgName;
                },
                function () {
                    $scope.organizationName = 'Повне найменування клієнта, в кабінеті якого працює наразі оператор';
                });
            };

            //--------------------------------- транзакции организаций ---------------------------
            $scope.regexPatternTransact = /^(?:\d+[\,\s]?)*$/;

            $scope.getTransactionsExcel = function () {
                var reportEdrpouInput = {
                    edrpouCodes: $scope.edrpouTransact
                };

                var transactions = report.getTransactionsForOrgCode(reportEdrpouInput);

                abp.ui.setBusy("#ExcelDiv");
                transactions.then(function (fileName) {
                    //console.log('Excel Получили с сервака:', fileName);

                    $http({
                        url: "api/files/DownloadAndDelete",
                        method: "POST",
                        params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                        responseType: 'arraybuffer'
                    }).then(function (resposne) {
                        var file = new Blob([resposne.data], { type: 'application/octet-stream' });
                        saveAs(file, fileName.data);
                        abp.ui.clearBusy("#ExcelDiv");
                    },
                    function () {
                        abp.ui.clearBusy("#ExcelDiv");
                    });
                },
                function () {
                    abp.ui.clearBusy("#ExcelDiv");
                });
            };

            //--------------------------------- сума по актах за місяць ---------------------------
            $scope.actSumText = '';

            $scope.getAllActSum = function () {
                var monthAct = $scope.monthYear, month = monthAct.getMonth() + 1;
                act.getAllActSum({ numberOfMonth: month, numberOfYear: monthAct.getFullYear() })
                .then(function (resposne) {
                    $scope.actSumText = 'сума за ' + (month < 10 ? '0' + month : month) + '.' + monthAct.getFullYear() + ': ' + resposne.data + ' грн.';
                },
                function () {
                    $scope.actSumText = '';
                    abp.notify.error("Виникла непередбачена помилка");
                });
            };
        }
    ]);
})();;
(function () {
    var controllerId = 'applicationBlankCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        'abp.services.etender.user',
        'documentsService',
        '$localStorage',
        function (
            $scope,
            $location,
            user,
            documentsService,
            $localStorage) {

            $scope.vm = {};
            $scope.siteUrl = abp.setting.values.CurrentSiteUrl
            documentsService.displayDocFunction($scope.vm);

            $scope.signAgreement = function () {
                user.signAgreement().then(function () {
                    if ($localStorage.productionModeIsApproved === true) {
                        $location.path('/');
                        return;
                    }
                    $location.path('/registerStage3');
                    $scope.setReadyForAprovement(true);
                });
            };

            $scope.getDocUrl = function (docUrl) {
                return documentsService.getUrlForIframeOfficeaApps(docUrl);
            }
        }
    ]);
})();;
(function () {
	var controllerId = 'bankOperationsCtrl';
	angular.module('app').controller(controllerId, [
		'$rootScope',
        '$scope',
        'abp.services.etender.address',
		'abp.services.etender.internalAccount',
		'abp.services.etender.allBanking',
		'ngTableParams',
		'abp.services.etender.invoice',
		'abp.services.etender.organization',
		'abp.services.etender.act',
        '$filter',
		'abp.services.etender.settings',
		'abp.services.etender.numberConverter',
		'datesHelperService',
        '$localStorage',
		function (
            $rootScope,
            $scope,
            address,
            internalAccount,
            allbanking,
            ngTableParams,
			invoice,
            organization,
            act,
            $filter,
            settings,
            nConverter,
            datesHelperService,
            $localStorage)
        {

			$scope.ng_localStorage = $localStorage;
			$scope.invoiceInput = {};
			$scope.regexNumber = $rootScope.regex.number;
		    $scope.invoiceInput.amount = 1700;
			var reloadInfo = function () {
				'use strict';
                var getInternalAccountInput = { userId: $scope.ng_localStorage.userId };
                if (!getInternalAccountInput.userId) return;
				var getInternalAccount = internalAccount.getInternalAccountByUserId(getInternalAccountInput);
				getInternalAccount.then(function (resposne) {
				    console.log("Внутрішній рахунок: ", resposne.data);
				    $scope.internalAccount = resposne.data;
					var getEndDayFundsInput = {
						date: new Date()
					};
					var getEndDayFunds = allbanking.endDayBalance(getEndDayFundsInput);
					getEndDayFunds.then(function (resposne) {
					    console.log("Залишок на кінець дня:", resposne.data);
					    $scope.endDateFunds = resposne.data;
					});
				});
				$scope.fileVersion = Math.floor(Math.random() * (100000 - 1 + 1)) + 1;
			};

			$scope.print = function () {
				$.print('#toPrint');

			};
			$scope.linkType = {
				'restOfFunds': true,
				'history': false,
				'bids': false,
				'invoices': false,
				'act': false
			};

			$('body').on('click', '#bankingNavigation>li', function (event) {

				reloadInfo();
				var linkType = $(this).attr('data-type');
				$scope.linkType = {
					'restOfFunds': false,
					'history': false,
					'bids': false,
					'invoices': false,
					'act': false
				};
				$scope.linkType[linkType] = true;
				$('#bankingNavigation>li').removeClass('active');
				$(this).addClass('active');
			});

			reloadInfo();

			var createPDF = function (params) {
				var invoiceNumber = params.invoiceNumber;
				var d = new Date(params.d);
				var innOrEdrpou;
				if (params.buyerCode.length == 10)
					innOrEdrpou = "ІПН";
				else if (params.buyerCode.length == 8)
					innOrEdrpou = "ЄДРПОУ";
				else innOrEdrpou = "Код організації";

				var buyerName = params.buyerName;
				var buyerCode = params.buyerCode;
				var amount = params.amount;
				var quantity = params.quantity;
				var amountToStr = params.amountToStr;
				var vatToStr = params.vatToStr;
				var isVatPayer = params.isVatPayer;

				var curr_date = d.getDate(); var curr_month = d.getMonth() + 1; var curr_year = d.getFullYear();
                d = d.toLocaleDateString('uk'); //d = curr_date + '.' + curr_month + '.' + curr_year;
                
				amount = parseFloat(amount).toFixed(2);

				var docDefinition = {
					content:
					[
						{
							table: {
								// headers are automatically repeated if the table spans over multiple pages
								// you can declare how many rows should be treated as headers
								headerRows: 0,
								body: [
									[
										$scope.invoiceHeader
									]
								]
							},
						},
						{ text: 'Рахунок на оплату № ' + invoiceNumber + ' від ' + d + ' р.', alignment: 'center', margin: [0, 50, 0, 20], style: 'header' },
						{
							columns: [
								{
									text: 'Постачальник:',
									width: 100
								},
								{
								    text: $scope.howPayer(isVatPayer),
									width: '*'
								}
							]
						},
						{
							columns: [
								{
									text: 'Покупець:',
									width: 100
								},
								{
									text: buyerName + ', ' + innOrEdrpou + ': ' + buyerCode,
									width: '*'
								}
							],
							margin: [0, 10, 0, 0]
						},
						{
							columns: [
								{
									text: 'Платник:',
									width: 100
								},
								{
									text: 'той самий',
									width: '*'
								}
							],
							margin: [0, 10, 0, 20]
						},
						{
							table: {
								// headers are automatically repeated if the table spans over multiple pages
								// you can declare how many rows should be treated as headers
								widths: [20, '*', 'auto', 'auto', 'auto'],
								headerRows: 1,
								body: [
									[
										{
											text: "№",
											style: 'tableHeader'
										},
										{
											text: "Товари (роботи, послуги)",
											style: 'tableHeader'
										},
										{
											text: "Кількість",
											style: 'tableHeader'
										},
										{
											text: "Ціна без ПДВ",
											style: 'tableHeader'
										},
										{
											text: "Сума без ПДВ",
											style: 'tableHeader'
										},
									],
									[
                                        '1', 'Надання доступу до онлайн-сервісу E-tender.ua з правом користування програмною продукцією E-tender FE v.1.0, що своїм функціоналом забезпечує подання тендерної пропозиції з метою здійснення публічних та комерційних закупівель товарів, робіт та послуг',
									    '' + quantity + '', '' + amount + '', '' + (amount * quantity).toFixed(2) + ''
									]
								]
							},
						},
						{
							columns: [
								{
									text: 'Разом:',
									width: 105
								},
								{
									text: (amount * quantity).toFixed(2) + '',
									width: 100
								}
							],
							margin: [300, 10, 0, 0],
							alignment: 'right'
						},
						{
							columns: [
								{
									text: 'Сума ПДВ:',
									width: 105
								},
								{
									text: 'Без ПДВ*',
									width: 100
								}
							],
							margin: [300, 5, 0, 0],
							//width: 200,
							alignment: 'right'
						},
						{
							text: 'Всього найменувань ' + quantity + ', на суму ' + amountToStr,
							margin: [0, 15, 0, 0],
							bold: 'true'
                        },
					    {
					        text: '* Операції, звільнені від оподаткування ПДВ відповідно до пункту 26¹підрозділу 2 розділу ХХ Податкового кодексу України',
					        margin: [0, 15, 0, 0]
					    },
						{
                            image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACcCAYAAACQoXXqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAJAqSURBVHhe7b2Hg1RVtj38/Qe/N28cUSSZcxjDOMYxi4gSBMkZSSIgIIgKiEQBiZJBQHLOOTQ5dTehc47VoXLVrbqxwvrWvgUzL+i8cURRqI3X6q6uuvfcc89ee+199tnn/0NSkpKUG1aSAJCUpNzAkgSApCTlBpYkACQlKTewJAHgskSjUfs1FoshHo/bPyclKde7JAHgsojim6ZpK38SAJJyo0gSAC5LMBi0QeAKE0hKUm4ESQLAZRGrf4X+y2tSknIjSBIAkpKUG1iSAJCUpNzAkgSApCTlBpYkACQlKTewJAEgKUm5gSUJAElJyg0sSQBISlJuYEkCQFKScgNLEgCSkpQbWJIAkJSk3MCSBICkJOUGliQAJCUpN7AkASApv7qYMRNmPIKoHLEoYvbBn6N83zJhRS3+LL8nDpPvy2djUQPxuBw6P68hzvMk5edJEgCS8qtLlMprUZGNmAVRYTUGhONAJB6nwsuS7BgVPA7+Z79asZh9yN8NvqfxO3LoybINP1uSAJCUX10itOYalb/CbyCjVkdKuYbtBSq+Px/GikwTi86FsThVw+ocyz52l5pIKQ3hvEuHKxJBiAzBovWPxYzLZ0zKvytJAEjKz5JYnBY7HrUV0qbqpPN63IQeC0M3fNCorGEzAsXQcDA/iLmpIXTaHMZzk4O4/cMwbv84gAZ9vKjfNYiG/QO496MQ6rR14onhFu4dZKH+oDDu/TyCu77wosHIIO6eZOG+iQYarzLwZXoEqzODyFZ5fcOEwetYJpmDGeY1Q4hHdcTpUohbYVoWDCvBLn6OhEIhAo8wlOujZkQSAJLysyROABAfXvx6gwCgCwBQ8Y4VejExxUTPFX68OiuAuz8N4fZBBu7oFUDdztWo834t6ndScUc3C/Xa1OD+3n482suPv43V8eyoCjRb7sM7i8O4s4sTt7b04PbOBIyeftTrFEK99vxexwAe+iiMewYaBIgg/vaVCy2XBPDpNg2bcmPwahpUI8K2xKj8BtvHn+24w89T3CtFY66XsnFJAEjKzxMqvByKoeNchYYhGyrx8Dg/bv1YwZ2DFCqtB/d1opV/y4W7Onnx9AQDD/QKoscyHQvTTWzNCyKlKIhSsvnyOFlDNArqLWIqwYVW3RcLIbXAi41Hglh9WsGsIwY6zXDg1c/y8OoEF27rVoIGXcN4sBmBoKeFm1qXo95ADfcOCaHXLhNry0z4oQOWxvPx9Wda7ivKnwSApNxQIlZeovQx0nuLSmpG47T2Oo4XOjFyrwd/GamgYbcq3NLeg/rtPKj3di0eorX/cHUIG3O9WJ/uQ6YzhjLDwDlPEEccFpacVjFuTwS9VpjoskxDt3lhvD7Kg84LDbRdrOCD1Tp6LNTw8XoVw7YoGH9ExbJME/tKDOT5LfiIFIpp4WyZByn5UUw5EMCznxXhjkEa2UUNbm/rw50dPXiKrKLL+ihWFOgoj5DCs/1xg/cTi0MlIAh7iZIh/CtyPSm/SBIAkvIvScwktY8Z0OjbVwf9WHqmBm9+60PdnlVo2MGDhi3ceHZQDVpODGDGcQWnczQUeH1Yk1qDT1ab6L3Miyc/qcWD9Plv5+fv6erHHe1FScvwwqcu/LmPE6+M9qDNNyZafeXFB7NDGLI+gpYzQ3isfwleH6PhLx8H+b0w6rb20ZWoxdMjw3h5jIdswsDMswoyPQqcqgFPOExAUDF8iQOvf1GJ+h3KcW8/spF+fjw5RcfQEyZ2lAYQMMMwzRgsSycAkB3cgJIEgKT8SyLWslY3Mf64C49P9aBBzwAatlVQ950Quiy1qOheBBCCFjKw7qATfxnvx0tTgrijrwO3v1+MB3t48bc+IYy+aOESXQUn9S0gEX3DDzOuIKh6yCpUxE1aWFr1uMWfo0FETQNRsoa4EbOttEtzYtX+UkzbrOOjFZV4YEABbm3hRb2WATzZz4XnhoUwssiDg7UmHPEQr+PDxlOV6Dq7Gg1bl6JuGwV3dVNw73ALry2PYp83ilBUs1nAjShJAEjKf5NYPGLPuccsCzAVWv043PTF110qw9/GKqjfxU0LHsAjpNmjtmr47kg1KvwK5p0ibZ9Xg2f6ulG3VTZemahj0Rkd2zIsHC2Jw+K5FPr4VhgIU+EMk64EFduUyLwRoKJbtoJbdC0MOeIy7x/9ey6ASvcDlheaZkE3Q2xXDCFS8QhiyCpScaokjG/3hdBkdBlazrZQv20ADwz2oRldiFlnYsgIWDhcEMTw5bV4rF81bu8cRoMuITwygS7I9jB2lMXhifISMQVRS6O7Ixc27fNfz5IEgKT8NxGlM6NhKLTGftL9EwVevDLTiVv6enDn+17c9nolBm+LQjPicIY0zDtRhWdGVqN+d9LzLkG8+bUPu/MJICatNxVKjVcnZgh0DTqVSpUsPt0JF5Xaz/eJA/Dzf6O3nYNH/HAe8ahBZzsG8bRllwaJM0aJHFsuVqKUP+uSASTTfXGD6imfI1hBGEOIQKISvKJYuLsG708XwKpBvXdzcW8fDV336zjpC8ET0DBxXR4eHlBNsCrE7T1CqN9XQYe1Fny6zGKYPAdA7kFEkBZcv5IEgKT8N1FjIR46sukjd59fg0YDXWjUy41HP1TQe0UIuzJ05NS40WlDCH/+zIXbO6poNd2DI0UmMisM6AYVXQ/jeKmOhSdVNJ1TRWsdRI4rgD0lfsQ0FV2WOfH85HI4qGgS6V+wy4E/NC3FgYoYdFp1CTiCTIQabYOAzQpiKp78OBczzxjosrkM8bC4BCqRgS4DjTRhg58hoPA9M0rmQgBS6OPn1PjxzUY3Xv6kAvf0dODuATX46JCJPeUhuAJ0SeY58QSB4JaWuWj0gR8PkREsJWvxEFz8MuV3nccGkgBwIwoVJk4lC9v0VocV99PC8kda3kA0hk+X56M+ffxbunlx7zATjw5VcMoZQ6luou/qDNw3jMBAn/vDNQEUBOjHU2lNMgLVkvTeAKm+H2fyLTw8sBhPTFOpjCbGri3Cl5v98FG3p64sQJPhtfCSBZj08afu86Heez70WOiETr03CEIxKp4RJz0gCBhkDYvOVeLzeftQv5+CZ8e57dxhhUpqirsChYQgjiKvE9+eDqGGtyXz/kY0QEtOSh+jyxHXkOsPofm4KtzeKYxGvcNovjoKZ1hDwFAwciFZzDslqPtuIer3N/Ep3QbD9BGQdLIiST2Wk5IT8LwSD7FzmK8DSQLADSiSDCOpuFH64jKuo0aMfrmOVI8frec7Ube7Aw1aufHKqDDWFmqo5WfXnijBs6MduL+vH18sU5HtTgTPQnGLAOKxFdEbDiK9zMX3IzDJAuYfrsITAwsQUyPYcl5ByxmF2HrJjRZf+3HTO8XIjVDbQyY6Tz2KkXujeKhrBn+VFF/FzuDT+S9OAFCoeOM21eLlUflo1FdD0/F+1BIpDAKOZCHG+B0BgOUny9DhWxcatKnGe3MN7Mw0oJkaGY2btD5AkCMY6T4cyq3F259loH7HStzRX7GTh0oIbofSK/DK8BI82s2Nhp28eG6hiY28f4X3KTGKMO9VYg8SozAJKteDJAHgRhQqTZQKplH5wyTPUdNDBS9CvSER3NnKi7rNXHhnBq0rlSXbH8A7oypRp7UPvRdRGWMGlT6ImETlDfrgqgeapfP9OKYfDeL2MWXICJFd0EhKoO/FPpfgIlNPcxio1+o8vj4Uw7QjJu5qeRhHqmhXzRju65OPt75ScXvjHBzxWXZGoe3WXw4Eyn6NFn37/mNXoes8F1qMzEIOzXKU/jnvgoAhTCFMEAtj7+ETqN/Mh5eHO9B/pQp/nGBVEcSmHA3lZDgqP2qvOLTiuFBWjmc+S0fd5rVoOjWC6eckW7AKy1PKUbc9WQ774q6PNfQ8ZcIZqyJZqrXjESbbI/GN60GSAHADSiLSL9Fu0n8rhtEHFdzX24Fbuzjx7EdurE33oyZYi0nb3bh/UBkeGOjH1EMhWtEwrXvYBoGoZmJ3WQhDtnixrohswlRQTX5/T4dTeHpymEpP5eT5p25Ix+hzJvyaHy8PvUQ3wYRKtvFUuy2YcyyIffkluLtDDXIMEx9My0XrbwOoMWUFIDWVllZe4wQEna8HLhQgs5bsQgJztMQRAkTUFCZCy0zAidPafzDhPBovMuCkpue4dHScUor7Jyl47QsnHhvtw64KCypBQTe8sMImwkEnlqZ48OSA87itXQ3aL1FwLhjBabKEVwddQMM2dIN6B9DsOx1pujAn1QZPmz1dB5IEgBtQhDYHSGkvVXjw1qwy3NPNiccnqlh6KoKw5cWOfAVPDa3AnR292HDKgl+XeXJaeSpYgIroKK3ES9P9+Hx/EIuOKni4eyG84g5EYnig40HUp+V8f6YOZ8TCsQsX8GAHHek1CgEgB5+fiNAKK1h5PB97sg3kOnTMPeyDh/S8xKWhUhGaLev/NcTpAoiHn5gP+N8S5z/xzSX+IJ8MWRoebHcAOy7odv7/R8sr8OBHfuwvN1FBl6TnojI8Pt2DiBrE/D0XcJKKrku8QaYW+flVBwpRt2MV7uqpoP/GIDL9YYxZQZfo3RwyAg8e/ULH+mwTAV5HjZLWXAeSBIAbUOKxCPKrLLww2YHHvyjDc+NMZFHJ4z4fus4O45ZWTrSaZcIdciFK31gGezSqoJJWv+f3ecijFRy5ajMm7g4SEKrQdEweLnhprXUDj3Q+ii7rwnhpSAbarrLw9pRy3NLDiYUXQvAZIWgEH4MWXpcpPCNsJ/hYVohWld8nwBi8lkGebc8GiN6TBSR++CGRKD0BgOcEnJi8KQu3dXeijPxcpbV+ptcBPDtegRn0EyRiGDK3Au/MdsMdMfBYj624e3gEK/Jp1Y2g3S4fmUa5owqvjsjEbY0z8fg3OnJVA+foQjz2YS5doxDqtq3B9Az6Too/0YTfufzmAOB6y7W+piKB6zgptHSnzK9T6UL88WiRhkeGV6Lh4CBarA2hyBNFbkUAr8zKxX2DQxh/UIVbiSJOhQ6Q7ru1MFbkOrAzNYiOcz1wxnVUB5zosqAMI1OieHawm1ZRwcVwFI92O4daWu+1RyvRa56C3SUm8qtJu2NB28rKijwjpkE3dZ6fjINKpxkGSpQgMhQFF0jbjxepOFNl4pLXgiMasV2CAHU8KjciwCCBS/4odQVUsgWLDEASl0K6jtHrilHG9pqGhlk7qtFxtgNufv5MkRcN3j6J2by3lce9qPPuRbSfrqH+4ELMOkzQIQMxDLoG8SA8qoUhSwpwZ/McvDzRwA6HipOZpXhuaDoavOvBXQNUjDpDRsQ2SDxAQIj+B7tbAIkN/R2N398UACSV/yqLxT6lj69I8o0Evwwd5WUB3DuMg3uAgl5bowibMewtKMY9/arxQA8XjpZSKc0wLaKX/jUpNhVr9E4//jyGvv5ZFa3n1qBGKvqgGkNmX8KHqyIo56CP0bofLfFi4n63nbUXozLJ9KIVpXVlG8IRnitKBSH9vlhhYNEZDb23qnjwyxDqdK3CnX0VNGhfg7u6amjQUcPtH1qo10fD3f2CuJ3tun9IGA986cZL8/wYlxrFmVAILlJxMyZtddAFcFIZeb8Eg3jYz/u1CBpxtJlShie+8qD+AAee/tCDfFcQj44owc3vBdBynoZ7+xVj+C6Co+3m0KFgn0V5L1AVHD53EfcOLMPNHWow4XQUJvul1axs1Hmzlm6Tjq+OhQgcFu/LtIFVplHtuMTvaAj/pgBA1lpb7NAkCFwd0UlrJeIdlUFKEFh8shr3jqvBg4OofDvDKA+r2JxTjrt6ufDqFwoy3SaVX6ElDNnJPKfKHPg+Uyx3CB3GF+O+iUE8M0HB5gKZDdCwhL77fd1qsa/SZ/vhMSnKYfmoeKT6VHhRDgGds+U1mJXiRbPJATIMA/W6um2Ff3R4AK9OMtF4koLXx7rRcrIHXWd6MXSVHwNXe/DJZgXjtgcwarOObnOdeL5/De54vxZ39wrg9v5hNKJCN19o4rMdBtalRVAhvnyc7dd5XbbBpEtREfBgwREfFh1QUeRTMG3dOdwzOIAuBK67e5ah4/oAsn0EKrIGZ8iPmWfCOFCuQ6ebo2lAkdePxoNTcVc3B0bsM1ARiqPrpOOo85YHt3eqxsiTZEu8Z3FTpACJjF/C4eUn8NuXpAtwHYuwUS0imXQq1uZF8NAnQdRvF0TXLRa8NJeHcjNxR7saPEzavyNHhUqrbVL5VX5PWMPEbeUYsFISeQLwVVfjvhEqRu+O4r5Pi/D2hAgGrw9iwJowXLoHCjmBJuvteUGF9rg6YOKbI348M6oGN7VU0aCNB12+rcXkHSb25loo89D3FoCQuXw2NEoKLYFGi1on2YGy5FinRbWLjAig8B4UgorD64bHNDBheQ46TQ3itvezUK+pAze9Xob6Hbz4dKuJHNNLRYzyuzTnugI/W2RQOXWygr99mo2Hv/DjsXFughcBZLU34ZoYMQzfmo3/aOrHBjIMI+6xGZRpCYMxMHBBEeq8lIW+W53wqR789Ss3bm1diTs/DGDsWaEefrZfSp1x7P5+9D8ZBLyehbafVjiA70/WUskrUKdNOVqujKA2HMGBPAVP9UjDQwNMzD8iSkbKTkrtDun4ZFMtNhbrMDQVb39RQz+cwEBr2m7yeUw6aeB0aRV6fWthf4lKH55swRQfOsZDw8GyagzaFsTDA6rw+DBa+PEKBqzWsPx4GN4IPxMLXG7dzxcBifQ8JzaeDqD/nCq89EkNbmtRg7qk9y1m0eqnmXDQsgfDUq2ISk7WUujz4utNHrQj/W/UsxorMyI4k+/Cu7Mr8OqsCjR804MiIqBOup9XFYSXIBLlvbn4vRcGFqJh5yp8fcqA2+VB02mVuLltEZmAE1Mv8TsRuiG6TjAjIPxOJAkA17PQCrpcNWjwsRt/bOZDi3kGUUHBueoA7uhagAdHRXA+HKbfS58+KtV4DJSGLEw9reO+HqVov9KP+z93IouKG6b/PmdFPpp8byLLH0c45rKTeKKGRZcBOFBRhhfnF6DhQBN3tqvC5MMhlJNGS+qvocfsmIAEIiQ56KoJXUYpJ27KYgBa6ZgWwJECN9otKsQt71egQTs37v8khA25OvxqmABlIkYw0GTKMqqgoqYQ731nolFfJ25qXoM3x53Be9/KjISXn1Vw92dOzE6J2YE+ATiYDjSZXomG77nwbXUMjqCKezsfRb02EdzRU8P6cj/ZjAv2SsLfiSQB4DoWiwra9bs8NBqi4cUxGrICAZyrqsZLkxW8OTeAEw5JcY3aOfxSuDNOaq0aCmKqG8dzyvDRCg13dqvA1kJaTypNpT8Et/i5/EyU1FglYJyrVvHB0mI06BXC38aEMGGfiko9oeiSCCRTe3rUz2tIbr5BoLl6lXwloSlKV8Wu98drGbyWzAbodGP2F/nx4eIqPNa9AHWaleOdqX6suBiy1x9YZCExMhclFsSGw3kYuV1DSpGGB5tdxJwsAgXdmFXnclCvSy2e+DKIofsN1BAErEg1PKEo2n59DnXeLcHsc1FcKg+i15xcNGyp4PGRYZzR+LmfWXj015QkAFwHEqPFici/uEyH0RLGnaSuJnrPK8HtA/x4Y76K0kgUG9OcaPBBLfpuVqgIoBUnSFBx7Hk1Gi3JuzdiCsJxWQ8fwYyd2Xj9Ox/6rRT6HqHCa3aATde9OFKqoufSatzWtRrPjQziVBmVXnL3ZV2efa7I5dZdG5HpT8vQ4AupmH+0GI8PLUH9djV4/nM/trDtIUvcGqkIJMufdXyzvRr1WpQSFHw4W+hBgy7ZaLIyiuPlYdR5+ySOVCn8jsHPhuEsd+LNb8tRp5Ub008Y8JIFvTymELe1C+L+oQqOeAhGltQs8CLOvylsj8Q5fovTA0kAuA4kyCOOAOIyQI2YnR23PrUK9bpV4eHPDJwgD891RnH/B8V4aKKOgCEbcBiwl7rKoJQYlkxfcajSTvM8OkFFx4KMUrSYrSK1VlbmkcLb7yuYfawcN/WowJ2ddPRfa6CKYGHFwkI5eB5ZYyi79iTadq1E4gNxmRGgG0LXH5rpw4xDHtzfLxeNWgfQYZ2OWt5/SA+w2SbC7LtZ62uw6KwHz47Lwz0dVdz/qYqnxzjwp7fyUKL78O76CGp1KXcuiVEG3vriJOr1DWB0moaw4kRjMoPbegfwynL2F8GHXWhXOLJThqR/foOhgSQAXAcig0yKVxjCAEwV1SEdT42uwh0DDAw5YiKzJoi/japBow9cyPVK1R1hDfSfSZ9lTX1MvmfjgCx1lcQW2X5LVti57Ow+i3Rfct8rCCR9VpShAZW/xbQgxp414eH3ZQ1+TE+Ahl3Fh5QcPPe1FM3UyVjoHgjQ2bMNcboJCjxhH9pOLsfNTfLxxlQf0kIxuigSB5H7CGDJzmN4oKcfBREDc/cfxssDFCxLNbEnJ4gGfS9h0H4LKmm+YvmQctGBFyaV48FPPThbFcHBSyHUa3IKDV93YEaerFYkMMQtPh9ZtyDM6LfnGiQB4DqQOLykm0LnZS7eg0cnnEejHhb+ukBFSSCGx6fX4qYm5RjPwSsJLhLUkoDfsQInyiJUdNJgLR6SxAHbldA5UCUhBgQAWdUXpfWq8Pjw9FeluK1jNb45rSIgik9Q+Fer6f5WRKOL4zOi+HJlKeq3pov0QRm+OaWS+ovrQ7AgkKUW5hEsZLVkGCqBYXeFG3Xb5qDfnggcfgOnnH7EVZlZIMgQel/plYlGA0PID4fRc0o2GrWqwRMjPUgjUETJLHzCrgwpLvavUYBfc++BJABcBxKjzy474kgdvaXHS3BLuwj+PEJBumHiXG4Fld+J7vMV0tcQlDitOS1izNAxfEsB3l4WQb9FpdjplBVuCXdAltdqHNoSr5OU2h2FQTw9qgIPcpAvzwmT3sqGnbI6UKz+Lz9Ir6bEoib7SrcDgSfKnHiicwHqtcrDp2RKtRqpu0x5ymcMA85KJ6afVnBv/zz69z68Mz+IlVluPDXSgW/yCKSWl4zLwMKUDNR5z4Heq8NwxUJoP/sCGrT0oek0je6RfI7Xk7UPEgf4FyQsMzP2DMcvzxiSAHAdiBT4kMUzTsXEE8NKcG83L6ZmROBXgCc+PoPGozx2DT6fjCezBmS9WHi8CE9OdaN+xxBe+TKEMAEEcY89hy1FOOP063Vav+/O+dCgUxrup697zB2FRSWRKjnUfpsByJq935MYvHfJVpRpzVgoAg9dnCbD03FT00x0XCtBUN5axM1711BWVou7uhXgyd4GGnVXULdLAHe0UtBnrQW3hE8kYcmUeIOCj2ano2HnAJaXGDhbko/6TTJQr20Y487FYKIYUZky/Re7yrw8VZpkAP+HXKFJvxZd+q2KG2HouoYRq/NxzwA3np4TgTsSw9dry2ndirCqgFSdVkgi/HY9TSOMfbm16LGsCvcOCOGhIQHsK7USi1v4OZneszQLBzLKeT4X/vypgjXF1IyYToIgiS68KH+N8wfZG/B/PQN5ufzjb07o2iT8cQId2ytZkgUeDYPmXkKDthfRc6UKX1iAIETfPYijl5zovcrEfT1KcHOXCrSbLGXN2I8GyX9U2JAsPQ5D8brQdFIJGvUL4JJiYdiKHNzSMgePTfTjvN8io7DYb/9aDsSvOZ5/9wAgNEmn3/ZrddhvUWJaBPsLVNzVrwx1+9GH1UyUBSw0fGsNXptFhbY8koND+itFNgOQ/fss+u4j1ufiozMxXHTGUUFaIFN3UnzDDFH5c7NRv4OGRl0dWOPW7KzCHxZRIkndlcEtn7lyECF+45IIfkpeQBQaqXyzz8/j9pfLMWi9QoZA2k60jJHlpDpCuK3NQdzTxYNaM4I5p6rxxOcWnv9aw9qCkD09aJgK9heaaNA5Gy1Xk32pYTzSegvqv1+FJzex3wkWAqC/NbkuGIBQphsZAAzS2PbzMnD3iAh67LQQN5wYuKIEj41UcNLlsVf8yUKdGK2eVNoTV9TQVRS6gjgi1kkP2tl08biKMJHiVKkXTw6twl09AphwVIOX55dZgh8SAWBZyy/psrbPyvP8lgFAWvX3QwCAbZblvFJezOkPotOoM/Tfy/H9BQXeCPvJlDl9Hf2nlWBVURQ7j5MRDa/ChIMhzD4cxvNjXViWE4JFEJDEqwmbawmaZdhSbuBwrob7OhTj9q5+rKqI2Nf7rcnvPgZwBQRuBAAQC25vVSERelLUMO85GjNw4ORx1O0QwIMjdVz0R7EtOxsNB3ow61QMVRLwIp1XJRhFuhqSKTuZHrMHvUKaS+vOwS8rByU4uCUzTP/1Ah4YGMbkbJkN0GARGCJCX6WLeUiNPnuvQF5bqvfOnX4Ee7Zm87z8o/0cZBpQWvzDcuVZ/c9nZhFlwnRdFFpZG3CEkdj/rp7Yp/2vhw1aidiAZTnZpyY+mJGFRu87sa2QljwatBdJWaqUAlPw12FncNzJvgiH6dermHrAhedG5SNKQFXYJyb7q/k4BxqP8aGanx+8Ih83d/Wg6QQNtTy3xFgkUVD2WJScCxuK+N+1kmQQ8HcksagMGVlzLtRU/HFabL8bjSaUo2ELL6aeiyGjPAf1h7vReU0UjpACxeBBpS83fHCHJN9fsvxo8SEzBzEYHPwSoBINkCIdr32aifs6u7DcrvNnQRPfgdaNSHFZYwRsDbpdiv29ZfNz8O5r0xDw0a0gEyD94IeUf2lQ/88od5S/l9d6UOH2U1HkXFJkg/d6+e+/pEiFP5nZYLeiwGXguT4nyIB0bCyRGRMPpAS5l016ffARZLBfJY6gs/NOVRnYdrYap52SAsx+sUws2puBP7VyY0Emv+OqQd1mJur2dmFWWYwMSxKmCMrsKwFAexLVZk3XRpIA8DsSsVbxuPjjERlDpO0KFh4qxa3Na/DiJAMVBIix6wtQ53UnNmZLgYsAKWwEXywrxOuzvfjruBpcKHciyy9z3H4O7LC9dFcCYV6VlmtOLn1dFz6mD+wm7Q/FqRC09mL9Y5IJeBkArpTwWjDtHP58zxfIOO+n9aaFtK2pWH+6AP/CoP6fDEBKlZk0/QYPCS4KmPxaACBlxWT/AKlHqBtBnMkrwL09L+Dxj4M4FxLllv0KA5izuxLt5vux8LxsoCK034ddqZW4rY8fO8oIrmYYqqahUatiPDNGw3lXCA2GOdCgWTWazrFQJBF+y0Umxnsn80pUFrx66yN+qiQB4HckiSw9KpoomRmCYql4dXIZ7m6vYlw6Bx4V+rkhuXhmiY6AadCaRZDjq8V7k4PwaVG8NsCBe9t7cfsHCs76Ja/dQFAU2tAwY58Tdd4qQY/54lqQqpp+qRlOlqFx4Id4XaH7otwCQhFMHXMCD981BJnnSI9l1oCDOUGnedgaK37KP5RcXq/8bM+H22nIAiqJ8hkSNZDIvHxCrL9kzQkgyHd+Dd9Z2EhMk63LAgSAxEKmvWkX0eB9N54bV40SuTWCnsK2vDnkLFptjNKax+haiStQi4++TcMrk7zwUb9DehQfL6/GH971YNoJE+eKQnjx8+No0MXA9BypYei1C5hqZAsGZHl0EgCS8i+IzPdLzTnxIyV7L4PW5baO6Xi4j06Kr+NApY57hhShJCwLXRLFLvdlO/DitwH0Xavib6NrURtWMGJZPuakEgCkPDYV0R3U8ECfPDzWV0G2l+wg7iH7lk03ZGgqtm8fszhwIx572mvh7FQ80KgXVswvsJX2n8n/BIBQKIRMMhAfLaAEHuXbovaSemwzh8sinxX2IQHeQODq1RD4MbHz9ATACHSmZdmzJBL8HLzMgZvfcmBmikFy42d7yIwItIYm06UKdlwKounsctzRPoRbOpRia02E1j2EPKeGB/tdwJ+HlKNWt9B0VAZueduHl2fTdWCfSj1EicPo5HO/CsX5EUkCwO9IhDXKElixjJK4M2lXCW5p78SHmRy89N8HbipA400BWnad/n8QI9bmYWOpicoaJ17vl417P/LjkldD6wn5OBlMFLoAGcX0g0W4pU0NDtjb49IaiX9KAy4AEEOQ19N5fhN+fwSjvziMxx6cgGnjMmzLb7OCfyJXAMC2sKJgFCkuEpNtgnnIX6kCvI78lPisiHxPPm9vCkKF/KVFQMh2OwTs2NEa700qFLm0IJ7qth/3TrbssueySanBZ7Bz51a8NCuEW9+rxOMjdBTFFPQaX4RJ64L2NGvM8GHJSQMNmlxAh7QYUksV1Gt5BPV7WjgYZl+YFu/ZzWv8o4+uhfxiACA39V+PpPx8kU08xGKbpKigP/rn4aV44HMD7qiJbRkqHhzrwfaigOg01pwL4rbWBXh9ehBeU0UFffxRywvwl88y0WVniFaKNJeD1l9dgTv61qLn6hBZeZDjn5TWTluVGAGfIwFBduH1eoMY8uFhdG9/Fp/0z2A7JD6QcAn+mVx59vIqCi2vEu0X4BD28A8G8N/P9V8/f+UcV0OoeqLqcgH5RS7O60hyEBmOZEMaKt0iKroRwJnSdLRbFsaU9AjqNr+A5stNOz/AT+X1OHLRsF0NbuvmopX34pGvDAzY6cFJTwTrT+XDT9fAHzLw584X8cxYHR7DQM+ZZAGdXGh1gMyGv8vSY1mpKAHFayW/KAO48vCu5gO8kUU2pZS9+yX4lH2xBDe18KH5apnWC+HLzdl4bYWBqohobQRnij1U9nw06FSFR4f4sfKiiRCp/bosB4r8ISp/iMZeR+tZBbijQyHyNKqhTAnYGUMJWhqTqr5WEFXlKgb2Oo3Z0y/g6cdGwuMSNQpQX0WZrt3g/XdEhqJ98J8ldB9i0d2I0r2xqI1hPY53Ztbg+/wYpqxZgJua1aD7uiiafJuCx18MYbMvDJP0X5Yb57gD7ONzuLVZMe7ppOH91Toe/cSJv05R7ErBMZ63zbxq3PpmPg5WRlCpxHFH26O4p7eGXJWAw74VzLErGl0j+cUA4L+it2TqJeXnS5TWX5bxyhLeN0el22WoVnOgWrTWnff4sbyI/qW9zFdWqmmoNjR43S70nFeKu/u68M4YF4ZnSh4BKT0HcEpmIeq18WLYOoJBVJbMkmrblF6lekiKq4a9uwvQt+sRHDzgRJtW3yEvmy4GFUfAyA7a/c7A/QoDkJiDZPkJw7ELiLJPdDOC3KIT+FPzGjz5pYaCmiLc/3426rb14vsLBbi5iR/vTPPDzVs24kEYpoE2Y7Nwez8Lt/UM4bZeFeizwcKbE2uQGzB5PgPH8gpQp6eKvktkk1IFb40swj2dTUzKJogQcGSpsj3leY3k2rsA9p/4mcsPRvwwO0OL715+h79fDg7xs3KuK59J/Lv8Ob4Xt8mkJI9IIom8Xv4cTyZNSLTl8nvy++XEFRkMiSPx2QR4yflEGeTacoLE9X9U5ITyObk+rx2lBUgMMkmaodLyy1nZPtDo8nc550+3nBothqWHUFZRjD90C+CBvkEU0Fc9dukimu9VUUNKLoNagnajN5Sh0zYVWzI58OhzSxmvDiv8MMOk/1FZ+hpG46F5uKO3G4EQBz/bm9hzL5Hk43KpGDcyDdOn5KG6JoYObdcTBDyQPfglQBaLCwOQ+f5/1inXThKPQ56bJDGTcst44GFvOS51DKn4RyoVDNrMfphjovmSMI66eO9hC+9MInN6tQhLSecrqkJ4sMV2dFwRxvy1u/HHJg5sKeaz08jECBoHz2h4qE82nppv4KOJ5wjKCu7o5cT2sihZQBRSqqzvjNO4rYsTB4MWdhxKw83Nq9F8iolKtjFu8Jr/RyD1l5RrHgQUS2MrGZ+YDFzpC9EPSXoRZBZf0SKS2lVYIn7+XedB5ZSDD9j+u0W/Vd4X5bZ/50Pmz1GxllLySRSHiiHpmib9N/m7fD4a4/s8t1hV+7oczJIkE5UCEdIWsXL2IJLRdEXBf0xkKocDQ65rkV6S20mQzdQlT1zHsiXF6N1zD7y0DDGpmsNr/lSJkupLVHzGkSLUaR3EB1Nq7OSUAZtq0fuQ7JIjW2+xH6jw3xxx4ZaWJ1GvhRvvTNUw/5KOWTlBUlzSTt7/kVITd7ZPx4c72Me6SipMZWYfyPr18tIoBn94EieO+xDmufp0X4FJY84jqMomGFLxR/qXDbIH7k8Hsl9DZKsO2WJMSA0x0vbvTQnwUeEOlHvx1wk5aDjEwMMDVNRtzf5sVovnRxo4p5hwRSJ4eehptE3hs+PtNe55CFMPEPQIHG99nIp3l4n1jtoFRzSOp790TEezIype/8SDPzUuxZ29XNjnlpLmvDi/k+rhs+hYim/3mah2+fGfPSJ4YKDXLtNmA5PNuq6NXHsAYAeIgtnKbFtLKkhMFETWRAsN5aDT4sjN9SMzS8X5Cwq27yzHxo1VmD+/CLNnlGHLeh2TxjswbGgmxo114KsvC/Hd4jDGjinE119X8HPVGD7sEiaMc+Cz4YWYNq0M3y2pxarvazCf9PjcaZPn1lBVJTSY4ECKK8kxtgWXhyMAYA94+d+PSJyjTKwh9do0CVaSVcZz5RWWYe6McjR5eRvOnq3gA5cMOiqOUI2fKCr7wuTAe2diJeq8Voov9quoddXimaUmZmYJ0MnyVAtn88qgRH34cqMPTWd7MWuPA0+NrcJuB+9N1+zVbI0/PYXHPgnzcxLtZl/bQKjgwAH20eCTyLzkh2HEMHnCbvRsv4/PgN+1g4MyYC/3h638127w/jOJC9DzOWpxlaDFg9RL8ij6b3Tinj5O0vpaPNqjBg5nFEvSXWjQJgP13inDuwsshA0DLSeXoOl6seIqJqyowrpTOvwcoysO1uCOPlXsGyf7jeek8dl9thyNaPXrdXahXusy/PnLEFYV+hAikMjuSgr/vTcoBc994kRx2MBTnxajfucg1uXzmSFMHP0n4+oXlmsOADa7pjIIWnqCJvYdKsXCRaVY8p2CT4enYeb0Wkygn/XJx8fx3cJS7NpWiZR9ZcjPUeGo0OHxSiVbqUJLpeUDMsgadFpe2/oTXGRw23vhcwBItdb8/DKEggaqHTqKKwzMmX8M6zdUY/o3VWjf5ijatj6JgX1ScXBrDfSQKKoMcEkUvTLof0Rkjbz8nceGjSuwZcM+rJifg5EjUtGt01aUlEqhCYtKJn68BO5+OgCItSgL67irfSoavlmI7TVx7L1YgPu/iSBPfAtadyl2+eqSKnRdqSE7pKDFmlKE1Aiyq6gE/JtCJT9dEED9N1Pw0feJDTNk4wtTVzBuorQ3AzV0cqWvDh7Yh9aNVxNUhH3QekpsUKJWNhBK3/BFjt+gWKKc9LF3ZvrQfIGB9+d4UEuW5jcC+GxlEW5qnIe7OleTIST6ZeKqKjRsnIE/tnJgN8fFrJ0Z6LtfGKcYI4nY83lZhfCpMTR4+xD6ptCxYMeIyyXsUtMdmLbXiUcHu9GoQ8hmF6OOWuxv8qWYFx9PTMEfmlbjSHEUuw/uw02ta9FvA/swFrBH17WSnw0A/9W/j7HDxX+0683Rp7TECnLASSdL9VmPN4T0VDeOHvFgzuwcjBmVgenTqzDn21IsmFdhK/iOzUVIO+NHjYN0V3RK2IFNNQUp+HIVB5wUsBSq7nFJfrzBQ0NlcQgrVhSgR5/9GD60CGNHFuPIoSC8Pv6dDzwuDOWyEvN/iUOy5fi7HVUmZ0w/lo5X/9IYK+eexMK551BWRt+ZfWCzHdH7f5M667S85aEIHmp/ilYsjEqeYsSBAFrtJgCK+8LrG5ofi/NNjNnqQZv5ftSjZfp4XQjHKvlMTBf8vIdRa8vxn03LcbQgagfBPOEAps/IwOzZpbDo24prdOz4Jfz14W1kAgG2nfdrt/k3JhxnsoxXo7L7+fzE1QpoKg5XuG3f/pmJAdTpWIHb+4VRt2UOdpVLxR8LGVUG6jfehkav52FqpgRR+XxpyRu+uh0NXr6IT1JkezrJuOQl+MwSuRegU0FXkUyozdSLuKO9hnLZT1AnQzUjyMo6jbs6uVGvTQXu/MKFe3q7cOegEE4E+ZD0AA6zH//zhZ2YtM9A0OdDnTZOPDWJ7Y2HErMv10iuGgOwg3My9WH77jFE2GEltND79gXRq0cKxrBTBvXLw5SJmdi62YEKoqz4oxK8k2ioPATxjWUBivhpiRVnEkyTGIEoCzvpKgOAAJYd7OMhde/idu47lZwDS0pC6YaGtPNlmDIpG41fPottm6R+Hi2x3CepvE377eBBAvRC9Pc2bSlE7zancfEcfbyaGjuvRs4pkXuv38Vr8CsCav/GjVh0HZbkWbizeQnePSaBuzgGba3GwmL2W4xAy/bvKHDRV6AiUxlCmoWNF0082qsAR1UBCJ6Er88PPoMX+xFkpQ1qEEM+v4CjB9w2lkkKrEzavPnCSqSeraHCBPk8+Yer2O9XS2IEPHmGshJPiznJdHS0WF2GO7+M0Oeuxr0dqrH9QgTuuBu7znrxypQylJGWy4rITuNT0eClbDy9lsyQ49UXt3D/K9/hpmcKsLKYz19qLcvDkj7j7UuWIJ84AUHH1v1nUeeFcozLl3RrHSrH7DebpuKtpRoatDqBRz5ScEcHDxr2iWBPuWGDRsgM4+4XvsVLk/lcLB/u7FaG+3qH4VY4buw42LWRqwoA2Tk+rFxegMEfHsVXn2dhOpFyx84iFJWpUHXTZgA5WV5aKQnEkQZfpucJ1iDBvsTPthLSokn0/Mp04uWrXD6ujiTOfwXh5We5prRFri9ARotucYDFg8jJrcL40WcxbEAmMi6SOVCbJEZgT5vxO/kFCkZ/kYHF8wt5Typ0NUTXRFgDv08Fss9PoCE0cjzxOpfb8FNE9tLvv74cdTvWYJvbQnFIw18m5CCPLCbOASaR/OE7qtHvAvuXbEYlA7N0D9afK0cNB7jci7s6SPpZha8PqyjKc2P8onQc3kXg0xPrAsJUor7d12LSl2lQ+XmpdmOznd8gALB3kVmtYOweLx4a6sJXF0I4lB3AS18cxK2NHbiraz7KbAsdsusYGnqIFjexFXi+z8LdrdNxS6cq7C82Mft0DRq8mYqHBlcjOywMQDIV4/TRxR2SGBXHqyUsLIaAswL/8VoVun8rMypyPh2VFbV4a4yJ9TlhrEvNR8tpbtRtp+BiyMc+5PMgUHw8oxD3dXFBpUvQ7KtC1G3txeCLMt7/ndFwdeTfAgB62jY4yk+iMJJUMmncAXz2cRoOHy7G5HHHkXZKoumkjhKG/Q0Onn9HCA3IL/Ni1PCLOLJfkj00nDpTiPmzK7B1Y4AWXqK6UpX/SpT8p9P8fybVYQOPdT6OR8foUEixNmeG8JdlUYTIRDQ9TEZlINNTi6k7sjD5nIL28514dpwbXVbSxsggpLXcuOMA6rYoxbT9BmZ8XQxPdZgDmDSUQGzRvfls1GEMGXQcmtBS4b38jk0N/i3I+mmSmN6VSTtZgSiHJOtIbUKyRVr7MBVXip+cc9RgQoqHFNqL23s7Ub+VG/d0DKAmwjbrMTg8DtTtXoiGnTyYfUS+G8TC40GMOih7IBp2gU4B5mYzPHigYynu6+7G7R9Vov23LuTSIks/cGBzjEt7JBMysXJffpf05QD7o+tMugvsx0yBIbohbhqw5fsy8HAfJx4cEMCgdQFkByIcI7KKUBigiZE7/bjlzUwcrI1j5bkw3ZASvDCPo0qY5DWSfxMAFI5vGeF8VDLVRQRr3mQWvNWk7zE/30usFZd14/a2CNcO4K6qyIOKEvHXrTuOvh8cxcxJKoYPPYbySg5MDlCJkkvgKaH8cojiXD1JC8bRoPUpPDEmQKAxMPNIEK9sEEYRsOekCwMW3l5dikMXY3hqmgM7w7K/fwC5duYK2ZUVRI+d5/FIs1KM+9aNIAFLAqcWGU6MirX3RBreeX0vwYTnFHYjKE9Ak9jF30nYLykyhWkrnVBtYU0h/kBLrGoI0L2CUY2JKT7cNtDAbe8VoNeGKDYWRHFn62zc9pwDs88TfMmG/PzXfXwK6jQtR7OZZDohJzqMp/XtpqCEY9WeKiZbmropB7d2KMa9nZw4SfAwLjMpmQYWlmY/Q2F4bBd7IOGI0jWVdRdpF9Px/97y2CXBZIGQLJmOahF4+V0ngUoV1iCHKbEfumccH6VaFPc0T8dnJ2I4XRlE3Xcy8ehwC3625VrJVWEAFh/UnJmnMW9GKRFWCipaVAQJHBEohAD8KqPnlxe5jYAawKaN1Rg06CTefGUdqitlUQ0pPS1sTPIWCIiJmIX4zVf3vleeU3FT81w8NZn+KQdZ/435GHaCykoDoscCSK02sKFQw+ILATRd5EXLtVE8PboUl/wytRVBtbccddrmoO2APOgGn40h/mjAbv/51HN48OF19PurqRyqHYuBDd6i/AnF/KVFNiaxL8NLS6BVIficdqgYvyeAT0747M11akIBbDhajJvfDmGXR0eYCvvakFzc2aEG789MWGep7b8pS0Hdzum444MgGn3uRGvS9adHOLCrTOJKiW3UKkqLUW9ogO5CKTYUiFtKay0bmXIMS80FUXrJ0pNXuf8rbqJMJ9ZWl+GmNk50nx2ESuBQZG8GuhtxKZTCZyOxCZOuhx3Hst1ccQWDeGbwBTw5j38jw3qw3wk06qEiVTZfuEbys2MAEqwTBdc0DQP6H8G6DT54fbxhdor49FIoQnZlTaztJkpytLIbRT3s47codtkm+oAS8RfEl1fDCCGnIIgxX+VjzUo/Qqofnw3chc2rin+1xRxz9hbhj+9rGLk1CCnt/fayYqzJ/nHFFNr5/vwKDkxyNlqnaXMvoe7DZzA5m7RfZj2o+NGIk7TaxFuvzMO5U57L3/xlRazrlSxLmb0wOX7sGRayEK+ADa1lvqMEzy1249HRGv7Uz48NxVH4qDRS5EQzYmg6ejc+2UdDRCq/PiUfN7evxJ3dK1AR99Evp7sU0vD6lydRt2keWm+hwvIaZe4w3D6nXc6bCGdf88Plh3HbOzVoMd4Fh6CPT6ok8TOCqjFFdkdINPoH5Cmyv9t7aCgUtkTAIg9g+9hGjn3ZXtwQJsXriEch09Ry3benuXB/F8V2m1+bVoaHO6pY4RCwvTZyVQDgSrDO5w1gzvSz+Lj/eRw6HILCm7aDanxIUsnGVn52EJ8FBwAR9RpGP/+ZJKb6OLgIXmbUD0dVGCeOhbF4QQkKCyXP3m8HxrLOW/i4+1kOmF9nJveLZTm4ubUHKzI4SDlWX1vuxT7HPwEAdvQZtw8OumbjRx7BjIU5uKmrCyku3p/9POTZAbOmHqM7kwlNKPevITJeOAZEtRIzPdKnJlKKQhi+twZfHPSgoLwCPddH0bBPNf7YvgjrsiJ2OEI2IzHoh+dmZKLJRI0cJYxqlwsNRzhR7z03dtDC21PQBPA+q6pIs0vxyEAfXQheg+Aia/BTq3QsPS+JPFFUl1ShTusK1G1VjR6bI1iRy3EsiVH8nMxkieX+Meky9iBubuZElp4AMaH5koAk+wKqZFZaVKHiJ6bBE8FCFb1WVqNuswqUEJRbL/WhYRsvJmX8Ogbkh+RnA4BY/yuResMMChDi0oVafDXyGPr3TMd33+WigA9Wo/8jC05koYrN8QQFfnzsXlMRQyDWMaRrOHEihIG9TyHrkmpHkyVTUXw6WSMv6+F7dd2DKs+vQ+Haf52BWzr6sCpL5u6jeGCGgqP+H7+2xxvDM2MuYOKQS8jLjWPw5jTc+motihWp8CMJLHEcPpKDxi8tQShIv1hy+38FkbFiK78dLKUyuy30XJKHe7/0o373IPa4EsVBI5F8vDu9GLe858Qbs70y/wqV7EyjhY3yGTwzOBuX6I/HyGA+OXAejVoGMGgfAYXvSZAvtSKMh7rwvG1dWFZCVifRdoLe4kMK/jK8EuVkbu5qE3Xez0X9N4rxwiQFK6vJZg0v2SsS1v+fGOf+4w/gD2+UIyU/sSGr7Mzs4vifctCHAoW/08WafrCQgGbQz1fZ5zGMWJmHm1uUYktBFD2WVKBe8yIMS/lxlvFLy1UBgCuv9jQarbr4wlK5JhwysWt7KWbNyES/Xvsx/st0HNjtRuYlA6oqUelEp8ghflliOo6vPIRWCxWXyLD4XPYCIZl6E0p+5VUCRfycTHkJsMj3JYr894MPMOFs/LAkPn/5e7avJohv2OmZF7KcmDHZiT07VARDksEnjEBcGRlEcr+SQqvg6/FnsXdPzeUzJuQKIF4tuXKuFz8/g/rdXNgnS0sri3D7TAsnVTIqtkscK0lNrap0YWuVBYUKXkS20v7TM/CUJAJVbWc4cE8X2RcgZoPXpYvl+PO93yDjgkxVJb5/tUT6yZC4SDSMkPQxLYPkWkiE3clnvy+H7tQ+FUtKg6jVTEzeX4b7+xTjHlrURVkxeHjP8aCO7w65cPPrpbirnwK/pkCzpyVp4WnR+08+jW9OaDQ8srlHLeq2LMUDHznhoUUWt1PA4vVhubivYy26zpTtvTW7NsLQbwrxn+87ccwXxbzNp9FtgQsbz1oIiVtCxZdxJuXT7VjOPzFSX65Iwx/+mo3vD8p2KRWQhT2r0nQ8PSEDRe4QBi3MwimC7ZPD8rGfyCDJcN+sPo+bm9bgmzMGpqxNx20tyshUZPzRQEoQWa4pj5vH/1Vt6WrIzwaA/yZ/H/NUJg4mUU7pTIkFyA6yXr+OHdsKMH3KRXw+NBOfE8FHDM7H6E8vYP3qahw4oODMOfrauX5UkspVllmocZjwusVfk2Wb7EQOIJ2aKosxpCyWvWhHFFf8WR62deHDF3fD3uWWg+XHRNwSe5qHWG+7MRwCPq+OjavcGD0sG25apsS0nkzTCFhdeSji8tA+8LpLv9+FhbOK7fNdETnX1ZL/CrAPDii0g0Z7SuOoqKCyzFBRyH4gXrGdbE80iNScfPxpuI7nR9Sg7ks7MGS1Cy4qnhT4fGNMLR75WJaf0lflfbVvvg27NzgSA4+AasVd9rWuhhD+EY6ToLN9etxLQx+DK+rF5MN+vDyxEHU7l+FP7avxl8EcKzpps2Zg4Oos1GlSi5bTg3BQ/0KowXlPGI06HkP99kEMTeWbfOZSDl3AainHy9tzyYZ4LYkvvTfqNOq1dGB6boSUPwwzGMX8A7tQt3Ea7mnqxVeHNbw4swq3tanBm5/7kOWRZcA+MgaPzQx+qhwqJnt48yAGLndzdChQYxbGbAxh6k4v8uiW3PbGKhxx+9Fh1FEcqtTpEvhxLCMPf3gxB+PP6li97wT+1KQYHZbQIPKeJOwoBkkeuX38E+N1teTqAsDfEUAsYMI6J3w8UUYqEpVXBprsKCvzuzLVJPOk3pCBymoDp07V4NgRNzZuoM+3vhQrvi/CnDnZmEAr++WoVAz5mK8jivH5kExMJJtYsUTWBlTg5HEHMrO99AUN0kOCA69h74LDwRfntX9MRHds5OVnqmo82LjOicljy3HiqBca6b/s+SaBtMS9yJGYEhMkEBdAAGjFqiPYvsl9+YwJ+a9K+3NFziGHRKhv6e7BbT1MDqoQzlHR31oRgZftCwi9NGkJaWV9IQ9aDC3B6/0uYHi6gX0lTpj0N2UvvOf75+HxKRIAjGLB3Gz0aLeHYMp7tPshwL76+e29InIq0yD483AHavDZ4QAeG+7ErW9X4rXJYcw5GcZ3KWW4u18Qayukr6M4n5aJm96uRqM+QRx0GjhQ6kX3OR407FaCOi1q8PAXBpwEVwF6etY4V2Li5ubH7Sh6nAxm/mEn6vL8j40m+NCFiNPwpBbm021yoV4LL14eqWPQdyqKfDJNTTZCRiB1/WSdg13d6CeK7BR89zsr8dqMWsQ4FqQU2LGCCO7tnYrXxih4pJsDj/X2ofFcP0JkHpKHsecM7/FVNz7bqWDn0XMEJxWvjvcS6mDHddgRttrLqBX2+0vL/3c1Buk/RM51+XyXf5TT21MoRLeEEskb//h7Qpl4y5ct6xXg4I821bbPIREj+0fx/Wix+RlVoxUsV5Ge6sWRg06sX1OEpYsKMHtGBiaTgo345DRGjkjDhK/yMO2bHGzb4qZiO5GV4UZJsYIAfWhhEVlZQUybfB7LFlUjM9NFAyOWnZSVbMMGLQJKYr98t+3aRMXSUhllvl9YzZSxl8hsfhhk/mnfJjpGfuALGQUH4BWgSfRD4rjiTsiOsbe0V/DoZzpK6P/uPH0WbbdYiS2sNDpeRhB7j9Sibe/TeGuKgi57NPQ5oeKSIolaCgenjmcGSERcxYHtVWjy+npUOwWEhalJ//M6cumfKLbbxsFvsU1S608svivgxuK0IAZtdGHwbh3FioElGWE8PboMdd9zYNpOKqjlsdclhEwfwppmB/fC8SB6zC9Dg9Y1uG+AG699rWDSgSD25wfxxNBC1Hu9BlNyqbgGXRp7RsDA8+3WYXcBQZDK7lE1PNgzFQ+0c6LpUg1LL9CnT8vHsBUqzpXzmgRLqQcg44utZtvlDjSbrdrj7SdKlKzqiTbr8NSkABWXrIrGTMZnTlkYKYURSSa204d5RY4dGS8mqtxe3NK2Bh9vVHHs5HH8x998eGm4C+W8F1mnYBCMpE+lRJkUgf2l5SoDwK8v0n45bEst8QcyC0nZFOZv0hf0ujVcvEgfb0MalszLw6A+h/D+e8vx9OPL0aH5aTR+aRfmfpuDNWtzkF8o+fWX03+pDPRE+RAko1FYi+TEiy8tABBHVa0baSctvPvabvqm/yRS9KMioJFIGhL8kwGYWA4trClxT3JcAQC/34ebWwfw8CcGiiMRbDpKRV+rwkPgcGkhzPk6E6O/OIrdeVGcVCw7n73ZdwQKr/jfQQKZiefG5uLb3AAaN1+II4cICgJ0MvhF+W36aTfsJ0mE9Duq6VAMC1WhGHp+X4K7PqT70TaI+4cFyVj8GCMLbvQQBm5QCGLFaD9FduAxEAlE0Hg5fXtTll/zgdGHXnDMi5vfLcBtTUtwOhS1l/NKwG/Ujio0aFqAtks0Mh72Hd0enSDc/Ot8TD9NNqbGsL8giLqdCtCwqQ/1W5Tivs5+nPfG4JP9EPncZN0DeL6rJRIpeKbzFjz+ldRSkN+EHYqxSDy7/ykSkXJW+fCHtiXoPldF2vmz+OObfjz7sUJQFzCOkRELANAls41BEgD+qVzpaNt/Z4fJgC4qcePI4XLs2VWBndtLcf68CiNMK0krJQGkzFyFVN+LVSvzce50LQoLAzh1ohR7d5Rj+eJcsoFsjPr8LD4Zsg8zp2ahvJzfjdOf5ADVDBMHD5dgwZw8bFhLF2WRE2u/r7QH4k8W6Xe770XpxQcns2H7JbglIQQBhcTaBLnHGNuZj5s7e/G3aRGUECTWHtyPt9dHcPC0H1+NPovvluXQ/ZHAm2FXr5XpJ90IIEBqL9l+smLulbGFaDXfgT7dDttr/e3CJCbbICBD8Pw3CADPbdDtUPHuAi8e+KgW9VoVo9FrDvy5Ux4KaNW3pOWi89YInFoUR4udaNQ3hLs6BZBKQDpbVYU7++fgW7KDGFmKWOIcbwQP9buIm96oweh0spdomG2PI6e8CP9JhX7o/XKk0T2wK+9aKjpOTcd733nw8lQXXhplYWKKjm3pTkzZ7MbDHYvx0UaFMOskeEulX+nbf+cuf1gkYP1Mmw149NOQmHmq/z98+B8SqSbso/t2Wy8nus0Mo7SkEH9qpuKxjw1k8DtSZk0SrySrUMKBCSPxy8rvDgBsd4AKcsXay6IcGb4H9zrxcb9TmDj6IjasrsLGjdWYMfssGjf5BiMGZKEoP05LX4QJI0vgqBB0JfXlgJBDAogykD1+Hdm5cSxeVIzu3b5HizcP4/w5qSxj4sQRBz7pdwl7dntJJTWUVSno1m478jl4DUOWBguFloON5CEBwgS155/EIZb/2HYrRleC35efxW+VXANd1bFmaTbZxLdkJd/DoHtjt4nuh+0a8CR+UsebW1XjpW8iqIhQsY4dwFMDvej2wT4Evfws2YO9QSUVJh5x8nsSLKOPa9CyGGGyBAv3fHwRd94+HhdTZeWlWCrVDqDyAgkGwB/5abs/7VHMgUjzzj+Le0IF4igX9iP0VD4rBspkP3rJmBr2LEOnhSYWHMjGzW9V4J6+NdgXYrt0giOvYVoBmHRjGm8qQJ3mZXj0QxX399DwcAcvuqyS6DyHvICVGseoDZW45c2TeJjujoegIEVPBcCe+bIIt71QgP5rNNSiGGv4bG5+7wxuaUFmky61DvgsDQKp3f863AT8rjNOIyzkguCYoOjygH5IeL/2kfi/gKbc4z+t18c+fqbFGjw4wE86Ip9l3/E9uYSkjMtjN9hJ0qei2OI+1tZ6UbevG32n+1FZXoH/bK7hrg+8SOV1InafiztFd0A6V/r/F5arHAT85UU62JK1BvTDVSrO1s3n8e2kIrtIiGpbelpRK0g2EIDbSz/wu2K889Z2PP3nhbh0wUcLKUtn6dvTOtkKQAUUxTl90o99e0JIv+THhQwP8gpdZAwR5OW78MWIHZg0OgeFBSrcNQbCQR1fjz+EjSsqbOpq6mQI4h5EvBw4IVrrSpw55bAXsfhDPlRVGQiEfUhPr8G2TWXI4Pmz80JIy3Dis08PYkDfQ5g7Jx09es7A0I+OoMYlqwtVnsdAWZmOUIiWMTcHN7VwofEcMpyMGnTvfwyvfHAEnoAEV8WCcvCzb4TS2ynYBDSxdhoHU4zWPhCx8NQby/Bc6y2I0TX6MZFouj32eMhUmlgjG1zYr7LcOaZK6rNABGk9AU9Sv0Wx3pxajAtUdm/Qi9u6OdHwrWJ88L2FGjGNBDSZdRALvOFIKm7p5kW997Kwu5x+shrA0dJKKBEBMZ6TYLq7xkSjVnn4U+OLmJ2aiMmovK+Ju/fh1tYuuxbiJ2diGLetAP/xThEWnbMQkXUPbLRcRxRTpo4l0UeqKBlUKvknJF3a/X9JIv7CbwigCJr8iMgS4Sb9j+KJkR7bWMv2YjL9qRF8TDMIg88tarrs/pNyZMLyJFmu7oel6DVdQUFpEf7jvTCeHB5GNs8nYcgEoxUX4PJD+IXldwcAEngzaYUCgTCWzS/E+RMhPtQaGBx89t72HKQur4XdO/z4YqgDFy+RQtKK9e25EptJ28XS82NUFsVWGonMmvTz16++iC+HFWDYx/sxZuRprF3pw3Cp/9Z4M7ZuLYZbMeEOacgvDpIFFKFLyxPYuaUAG9enY80yqVqUjUH9z+CNl1bgvju/wntNN6F9q+14963NeO2l9XjsgUVoVG8C2rdfhc4dduLZpxfhzVe3Ys7cUkyaWITRn6fjift3Yv2GIuzbp2H9Og8WzathO2px4qhJNyWEW5uV4JHmRWjS+AR69tmHdye4cPJsBHpYhbfGQkmBieoK+sieCKrKolDo/0rKr5T7qnbqeKLRV2i9IUSl/vFBLfYqMf0kwTEvvx9CyIxgTY6OubSyXrFOQm/A/iMQiFWTPQayXV4qoA6Vvy/feRw3v+OgO1COc3RpJBoW4vuyoi/iC+Ge4aX4wytFWJfOAa56yVIk7z/O/lUQ0kzoPM8rIwpxy4sn0W6ejiJZDBS08MLiWjw1y48DZDxxtmtPdhD/r2Um8iO0wLwGcYbgl2A11Dl+hlacwMWHLTeWALYfxT75Q+KP4lLKrIDUX7R3C/oRkSnpl3vuwYtTqf3yn82qCJaGhm+P+dFto4FJh8jweNG49AONjs5x2vCTCnSfTne0IBd/aGPisY8UZPJ8xEC7fUkAsEU6INEhNpUWS8bOFauccsiLE8cqSb0Ta9wl+izJQLm5PiprGSZPPI9du5x2/rsE7zxkAutXZ+LTgVtRURlEXnYYqSdrcfykCwcOVWDzRjfmzcvDN1NSMW3KRYz8Ig0ffkiK/chSjPykAL277UO/rufx+YjT6NgxBU8/8R0GD9qLmTPz8OmIU2jR/DBef347urXfj62bKlBQWIPsbBWffJSCHl0Oom+vHWjxzhaMGnkEHdp+jwlfnUH6OQetqsL2u+H16Rg7Ig1V1V47Gm4XSSFKSb05oZJS3qrSUYvbXj+I257ZhrOlQVSUVaL3waC9F52AmT1g+T3Jl5BpVsmG02UgsY803UT3Xt/hgdcO4t1NsjKNAzLRw3YH2x4K+9b2rmxrr6Aq5MVsAtH7k4txV/ca1O9ejcc/CqA8EiUASG6EJ+FX24xKriX0mwzMiqLMV4M7e5fhpleLsfQsmVFI9iSQ7crouMXD+Hh+Jm5524n3v5cZBC8U2Vqbrsq8A+lYmstWhQx8SOvesKMfD3/qQt9DFip5b2E+R+kfWWZOTwFOgsVjfTejQOPf4OffxGJ7IAnNMv0r92RH0+3blJuzb1Tu+n8LP6cSKGTqUBR2S3oFztGQyNx+IlmMHxEtl1kP/izWWgzIY03m49lxfgKNgEZiGvrtsVl4aVQQHeeG8dCAEnT93oAiSVEmmSKfxZ86FaPvHA2pZy/gD01VPPWhHzk8p70mgrefAAB5Hj/S1qsov2EAkM6WAFgiwi8bWUpx0AM7fRz8Fmo9Gs6dsbBlgwOLZwfwYb8leOKh8Wj64lG8++ouvPrXtXjm4fU81uKx+ybgkXtmo+Gt3+Cxh77CEw9OwDOPTMBfn5qE556eieefXog/PzQXT1Lhu7a9hM9GONCYlnv1qhLS+DDCmpfMwwM/ncmhw3dj+JBjmDUjA+NHV2L/oQDGjc9ARbUJn6bhVKoDwwaewMd9DyAnz4PiGge+GF6OJq/swYgRO1FFSymViWX1oFQkDqkmFs7Nw/bNFTazkWCjsBzbn9dJWnn9ndsL8PyTq9Hg9eNo1L0WaUYcpfn5aLuLbg5HYkgGL60mItXIq6lCrkYlpaJpHKwGr3X6bBUevvtztF2ioONp+RsBlYNdDjtXQgCD15NXJxnR/PNBvDqqFvXeL8Wj3b1YlBbGRdVAh+lefHOeyicqxscj1pUOEa8tTIDUVUoJsf2SqNPp8z24rXEhXp/itfcBlNWLdr1GfnvVhWI0aF2BOzt74RRXTCNl5mvbGXSJDpr2jELj6fkYtMdAjo9MROod/oBQTVCp0LUQF4iMAARBNoLH5Q/8BBHWESUIadTAT1efR/0PXCjwKAhc7hchPQLKMoXI2+WVE7sDP9xkLt6fL0FJMUY6NqWbdNVO46AzTCZSg7Qsum5vO3CgViVJ4bitduNPLasxaGkIB1LO4I/vK3hmhI58opRUMZZcgIT7JsbrRgYAG/0ExfmYaZUK8ry4KIGegJMUK4gjKRVo2vh7vPXqZrR4MwVbN2fiaEo+0s46kJ9HkKhwo9bloaug0YeO4sA+B/p/sAoqxwh1gp0s4MLBbzMLUbgQggELuRlezJp+Et067cRLf1mIUYNPYuTwXRg+aDdp/QYMH7wN+3aX8Zxi+cIoc5Sjzbv78GGvg5g2ORW7d+bzPGJFZeAY9sDOyXYi6KfvTBCz6H/L36IxDiA1hNVLK7BuZT6VPpCY2yajkUUjFs9dUFyKoX2PYv7UArKEIOr3KsUtnRWcDcdQXJSBpls11HLAyAyHrIrzc2SezC9B09MWFqR6sThTtrt2ok3LVVj9vRMfHzLRhqApqcC28lsKfNLNZBnpLnGtaKk54GftzsEzkyrxp7cL8eYHOaii1ZeiF+WqikJPkHSWfcY+FKUR/1oSqeLSZmoJMct2EeZsKscf365Agza1qOKbspWYJtaUwFHqM3Dv29+h4Wsu9D5CEL8QxtufV6FRbxe+PCgLaAj2wuwMSf2VvrJHxP8SsZAyS5BYvkwAkpJufK70uC9/4l8XqdokpeetSA3OlSvYUhLAc+Oq0HedFAQlOEjNBL7KmW3LzHYVc7zUeW0xen2X2EBViytYfiKIRgS3i6FE0LG4zIFbe5ZjTTEZGvs9Lycf//FyDj5aa2Hz/mO4qZkPzw1XUBoh62PncAjwOnLPMqMg3OWXld8uANi8TShtFCePVMLjkUCKBMX82LaxBl99eQ7z5xWhsipBQcUftXP1OQgkgm77f/I7zyMU+ujhKgzutY0PUDqXfxPLYwOAQK5YQaGPicOm0LxWRZkTR/YXoHu7rXj9xQ2YNesiqt0cBER6KaElfqhM3ZmWx/6+ZL3Zy1rFD5UHyOtIhrmdoswBIgNIxo5k4pm00Js2FeL0ySoODA52tke+K2vK9+4pxJCB6zHpq5MoKavh9zSiFvD6F+dInV04VGih3FeNF9ZHURShDaYCxAwvdpcF8GWqipabDPSke5ATieD7tScwoOc+e6bi69RqvLZagmMyGOMIeB2YWcQ2c8B9tq8KWQQWUTiZilyako36jYO4vVs5Umn1TLoZ367Nw2n64uICxO38CHYdrXWlZmBMioFc3q8swpGkmGoi7TOfHMOtTfLRbUGIoMZzx2nN41J/QEXToWQIvRTc299As7kBzD4ZRUk4QiAmMyIoS9KMzmdvz1bwvD8kAuJSa9F+dhK8tA+hJgIG8sLvCXrE/ezvy7Sd79mzR/yeLA4yyUgM3oco58pz1VicH8P4FaV4cHQAd/aycG+3SzhDfyMUJfDRpZTksUTFILqiORH88eVdGLslYIOQBErDBPVO887gpfEqBi7T8crXVXhzTAg+nffN538pIxP/+ZdL+PJoBMv2HsMtjd14bWwIlXyO9nQzB0hibQrb/cO3fVXlNwsAsvhGCoXOnp6O7Vtq4Am7SfU9aPX2bkz/5iR8tLKyXNMmCrZHywf/IyL+cXFRGO2bLSQFVewgmFi7xJCQUSxRXwEQua5YAxmoKjxuE13eX44WTWZDpcLnFvjw7bc5WL7IiUBQouOS2ixWXdpxmVLLSUSkSXbb/iFXknqE0UhQrvP7azjgBaBoeVUfUlKcaPveakwafxgBWhCZRbDvzz6ljr7z0nBzsxBWnIra1WSfmBPGed6biyAje9sHOKjdajWeXBnFuGMKuq1T8MSzC+GpVOGFhm3pNXhzTS0uBagoVPqSynK8dELy4VVMOl6JsQIGVOZwjJaXVr7u0GLUebsEC8kaDILQR/PLMZb+uCzUCdC6GbTQa50O3N07Bbe96ceUfQFaMC+7VaxlDGP2KbjlXfryPbyoJFAgLBF5FcerTLwwuRDd1wZRTrcpTgWV8tt/77urIDITJJWOpEQ8OSOtewgR3UMWUmNvAaayPXG6dC6UYM7mbGystNB0jhOPjozgeJmCu1um4blPdbw34ig+20XCz/snvnDE8BkSzKXu0JIjbtzU2Il152N0w4LsR7osAQO1dMEWH3di0goH1lwMIEDWp3BsqDzHvpST+M8n0/BNahRjNuaiwRsOtP5W4/ORGAD/J2OIY1KucEMDgEwvnTxbQdq9F198ko0Rw/dg+eIsO2Amy1jFitvoT9pla4lA/o+IgKkM8jdeGYdqDj6DSCxTPLbGy3d5iJWxS5hJsIoavW1zAd5+ZQ6mTTqIUFDYB69Hiy8R3orKAFasqMa6tS4UF5JR8Nz2/K99DgEV29b8LwAQ5U9M88QwadRpDO97ARvWXcJntIafDkrB7GmnUVXjTwALFVTaYWeuyTmp6GNX56HOOwXov04jjOlovdqLw34JrInrkLBABeXFGJUehVMLomv3jZg4LtWOZhtsf2p2GZ6cF8JGh5SwiqC01ou/7ae1prKfzcxCswNRbODglxLbMVq75TtT8Z/vlKLxFBOdtoTRdouGv61yo9ikwrL7qkMKXplxBg16+/Fgi2p8tsMPV4SKLisA2f5j5QbuH3oJ9zZz4Y0Ffhzziv8cJrioUE0VIVJ9SVEW90t8aImCXy0R/9wwQzZrzC6qwmf7A1iQwetR+Ys8PrjIaOYfysPctCgmbSjDGxM8eHiIEw3fr8KWSh0vfZyLv03XsfOCE1NTVPgi7EMaDWEaRBaaGxMjvz2Fm1vqOO+je0ftlYImjfvvQtvFYUw9aGBFpoJTNQ7sziATlLUAvOby/adQ58UiLM7W0WqGC7cQAD74nvfPe7f3W5RxZkMAH/uNDAASCDt8qBATRh9BiSxoEWtImiUwaS8LlqCX8HvRbhk4tuL9sEhHynRY/17r8cF75XZgzy43bg84+Z5Qc4lIA2knqtDpvbV48ekZyM2RtQECNmLpNT5E+rxUpkT5L6K2V8XqNcWYPdcNV5XG9+RaclJ5fPYj5PEPucIA5PXAoVw0fWc63m+1AVvoL+umZBNmIaLK2gOx0Dx4n/Y9Cq0lVZ25w4GGfbx46msvLY6B0Qcqsbdcpqt4NVo8g/3jk3nwYBw7t2Tgmb8ugM9HmmtGQVsIn8eJJ2dE8HkhaSy/H/B48OxODYMvkJH4XWhzPIqmmxTk8LqyB4EaqECdLtW4vXMAc9M16KqJbQUEPQnBR9xQ+bktF/xYfNaCm43ws09Uvqq8lozoYyUx3PdFMf78kYGBeyPwkLJJPwprUglyss0YO5f0WiMzkOlcduBVkgCVf68jDC+77kRRJsYc0jDthBcnnRo+mZeH9bVxfL/nKB7rpfM9HY3eOYBHhgYxZdl6DKKbJPeZ7iar4/1YZEWkDmRGAlg8ufQPGVXbIdtxR3sXcjmGpLZ/NY3Dg+0WYex2Lx7r48ODvTXc3OoSmu+JQgvJoq0IPltzHHf+TUdOSMfbk9y4uXEIw+k+JRauJQCAj9M+OFR+cfntxgCuotgptjEPHI5adO+4Ht3bHyDdduHsyWqcOF6E3TsK8dWI02j/7gH06LAJm9ZcQJhUzk7D/bsyU+wnIiMgYcnlV/lMTbUT23bV8lyynJhgwcEsVs1mGVdRNmSbqNuhAk9OIBCG45jKtg85JUFMgpgNhBLDUFBeUYNXX1yCrAyZE4/Z9F2leZW56HZ7Qhh2RmYa+D0q3oC9fjy+XMNRgsb8Uy58maqggjcmrALxWrT8OAu3tXSjxYrEOghNfHRLNhSNYmup9NEP36NEs9OpbCvpdhyrlDiNtFFmDITs/jJiL2mmayLs8GypiudGFyCHoHXmQhEOlGnoOisXT30ZwEH2491dT6HbYhX3dDmPublRdBp5Bi+MdcET8CLfGbYDnALJ4ir9VxHwlkOu9UCnNPSaRtYjw4OgeMrhwRtjT6KElmDCyiKsKDUxdFEmRl7kcxG2Q7baeVolHv80wEcVx597paPuG06sLJcxdW3khgAA8c8lDiBLkDXdwqb1eejVZQtefWEj3n1zO3p03okF889wUNOacoCLxbcX5XAQ2EGlvwNA4kUkYckTQCDBJLEU/qCGhQtLsXVziNY4wL/Twl1FOVEVw20djuOpGWwfjeySTB/anSGrkCwYO/4g034RvPfubMyYnE+rKsEkKTHB++eg1UnZF18oQOftYfrFsOsKurPT8cicEPbLdELESQWnopKia+wznYAyd2MV6rxdhkcHK6A3a6fVin/t8Negd4qd/Z5o3P8QIUKy4QapDX+Qz9mGU/KLrqLIA/nHQ7kSg0kk8YTw/YlazDnvwbaDW9FvjoE3Bx1Gg66KHbR8uucOHKiKY8uJg/jmZBgBIwqXGrTrDUpRWxvWhGX+j2coyi+BSr/fjz/1KMC0A/w878mKFyJMZvNIm234y8gQXhlRhX1KBE8NK0BlSLIZFT4PE3/pkoPXpwcRpnvXoMVh3NfBwkWyg2slNwQAiOLbloGoLck1kjgjqZr2vgUyaGxET0T+JZorab1XfHr5+98Hmm0Vr/x4hQUkPpNwEejn8cFe5KDbuc2D8xkBufxVkwD9/Je+SsWfv7NQQAZwqCqElzdzgIrrQa/UIv3/dtZZNHlxLwKqTF1JHj+ptsQ22DaZjSisycfzK0wcVCVLMAoz4kS+zKWzL2QWQ3YXkki3LtqqqbjgMtHwvX1o2NaHlVWkuhz8wiTmZqWj4/4Q/nslhH+I9LkwD+njhEsjEf0IQeUqIoAdw2Gb+BwEYJxhna5IBEu2HsTMCzoOleh4avh5ePQwXvg8G3d95MSMw5kYnxnG8hM1OF1iwWfQm+ehsY2WaqASvH9VdlmSvpPQsqDWP+QKA9i4cSMakuKfi0hmg8wsGdh+tAipRMj5B/w46Q7gUmEQG9JpDHQ+CzIAiXvc8ep2DDgSQSHdi4YtT+KeDtXs+8snvwZyQwDAryIyWmSsiAWKue3U5I0rM7Fgth+KIcpIl8DgMKXfGyU7sGMYP1EkBjHogAN/+9aP+Y4YFTeIFxeXk4K6qbwRlJSG8dRTS5HvFpCTgJf4wFRurRYBXs+uqGR40WyrF7MuhO28Az+BT1iOzOfbRIf3YPFVPHnBANk7cNCaKjT8yokBawMoN/xYX6LglZ0qmqzTcDbRtF9UCMW28kiuQ4z3Y2/5TkDXhVabCpxUcCEwiw5VYkm6iYy883htjEZwohvQPws7nXH0nnkKr3+tIIvKfaiCDCoagiLAZHnt/f10nQpKgDUsFwzDAz+tNb0HMjuJyZA9JdCAoOYnKdDx8tQD6DTNBzWm2p9R4tV4fXgeunwXRmlEkoKqYOkEQbqf9vQn+/4oGdztLY8iS4ljXVoYf3w7H++tE6b1KxVj/QFJAsBVE4nWkxpwnCTyCahsdAtKKqsJBF6kn6aFlgVDUjyDA1ks4k8VGUyHKk28Na0C7TNoiSJudNnuwHdlEsTT0Jh+//z5ebACBnbkK/jqoorh5w3MT/PDZzMbi64DWcKZMjRZFUKh6DwVHDKIOcBtRkNbaudKcFDLxq5SSahEMfHKjHw02RzEy+sVTE6LkX24CTxSfenqBe5+TIRhVQWobAQxSTmOxgJwUflLSZ3bzM5Ak/GleGmqjsMFTjQen4vaiIEnP72EwZuj6LisBD33WJBCqCXUaI3KLCsTQ8Ly2B9KzGdnGkp2pFupwawdYfRdG0G+SjDQg3YMReNnZeaIyGBPgTrcxbipjQdDN/EZ65LrTxZAYDqUXYvx6514amg1ph/Q4LA8SGxeSvpP5vn5wkrc0aGSvwfwyZJLuO0tH0adlwVbP30sXC1JAsDVErEQYkLteEOCJtr7IJhx0kkFRcV+bN3owYU0KRNNy/NvMACDg88boR85LB1N9igI0erPTPWgU5qKzz89gA96p8Nn+rEgpRBL8qRcmKQb6zhWpWNDAVmJ0HFTwzFHGE1X+fFtDkGL1s9OjJL2SoovKbW9WxApraxik11y5qdVof/RMFYWeFERVu0aAxFSXVVmU2Sa8heWIwUq2i4sJlU2sPFsCIMPVOK9nRH4NR1L2J/tZpeiTvccrMwz8cbnuei/3MT7M0vxty/d6Ls7hHiITEGnk0SmI1uByy5IhpQEY184aj1YezFk7/0/87QTX+1T0XFKPj5aJzM9si6ArgGflayo9EsshUxkwsazqNfcizNuWRhlIByX5KgAvt5egy4rNLzztRO3tC/HG9MsXKKrJZmTYQLE4y3XY9jSxLLlJiMu4a5eKhwEGVnEdK0kCQC/tNgxA6HZktmmY/vmWqxdVQOdVkcyAC0qEbWInxHlIyj8E2Mgy1sl4/HpAZn4y6QITikxZJeV4KWtfjz1xFJ4abV0DvAOm6vh4XntLcM52E/6A5iVTmvEn8OxxBz9p7sy8Ol5UWK6JRzoskQ6Eaq7hkIyIQlGsuPuojzZuYjttySpSMHs0wr8BLyhCzNQr2cAA8+wT9UQWo3MxYI0C22n5KLPJgMXq504Wh2xmUt6WdBmLzLjYReKZR9LmrLMx5uGin1ZF3FT6wi6LAlCtlewTC/CtPZdp+bh431023ST/SXrUITZ0SViE2XbtFeHleCFb6TWAsFElSnNAJzxADakOHF7VzcadKzFsM0qqlVJOBPgcONYloU/PLsf2y5KIDqGRoMK8OQXYd4jHznPfa0kCQC/uCSsqgQLJXpsxiuRdq4Gy+a4kXXJQ0sk1lei11R+CZDREv2YCABIGKHZAhfqN3Nhbgnpo6qhUcv9mPzZRZg0JXrMhaMZXkzONVFDdyOjqhIfHtVwWpYz02JKroC4IityFHQ7HEAxrx+Sa2shmVm8piIlteyNNagQzWe68f6SarSbY+FopY4Ba0sw5oiJLWc8uLVTDh4dWYslWSp2lfjx0doAVhaZKGZfyNoAdoTtLonfLZY+QFYWsxS4bXZUhc/Wm6iKhjBkxVm8NT+K71J82JSjwU3gyc0rxQdbVVpnFwbtlbUNshCM7aL2y8xGvteDO1tdwP6gRTYhuQEB7D11DI0nWViRGsbScx7c0/4i5p+L0GURgOcz1VR8tTIHN71bhnTNQPalHDTo5UarNXJ+sgpxHa+RJAHgFxeaNdFpPmR7nYBE7OkSaFYNVi4pQ25G0PYvRe9lHMSl2N2PiCxtlaIZX+8rRL3Gpei8IYK086VocOfXmJwSsteae+hzmpEaLEzxYOCFKJ5f6kIFFeNSIIxFmRXw0ZrJDIfGgddlTQlanbE4uDXSUjbsKuct/FSxpw61GEbud+AvEyvQaLiB96c58eDgII5mF6FBYwXldFlem5+OaqeBESlBujkRuuZVNnZKWXS7+Ak7UwJvfppXsa4u9m2U531z1Ck0nu9DnXZObKBF/n5fGup/YeL29jWo07QUa9ItO/BnRFx4f3QuXploUcHpCkiwkP3Fv2DMmgo8+7lk7hFUIh5JWcXnOx14b66Bd2YbeGFpFPXbF+LBYS7kEWztJdns82bD9qDZl1678tHQLcWo08KFVTkJ14v+VqIDroEkAeCXFhvchVpLgC2RcWgHCjmeDFLRbZsdOLCL1FPlQOOglfyDHxPJEpPiJgUV1TbNbDpLQbOu67Dl+xK0OBxBrvjvMug4iEs9AZwNRTDvggczc8P4NkPH4jIqPumqodM9MANYddGF574nbZZFQFR+iQ9cLZHbllVzkoMh8RH5WaYXRZksWl+JnhukwlJR2EHL7Dai+GhlMfLY5nve3YztuQ7c8k4RJp/WcE+bPThSqeKt0Wk4XK3hYAn70ZCy3vTpeb8hghcdLLo2Mbv+gWX52QeWXQVpzPe5aL+Prg7vL+ViGTzs4+afpGDanihqy6tRp0c2xp40MGR+Md5Z5UZUjeOjAzoeH1KEHaVi5WWlnwRwFRh0pR7uk47pBwwyCqn6oyHLa2HxxTzQH6Cik0Xx/eqQDzMPeOFjW3R+z1GTi7pNCrGZ/V9ZVY56vQNo2NGBfFMmEMUFEHC5NpIEgGskdgIRH7wsVkk9V421y6pIW8UVuPyBHxCxFqLgMcPEW7MP4PZWFejZ9hR/j2PwSQ/2kl5aVHDZLSylKobBR4M44TXhkcQW3cdBHOag9ZCFkGbzWmGjFK3X0YKdVskIZIedf3Lxnypi2aKSTGWX0eD5peadFOigX0xrLIVEsuiS+OmO3DfCgybzoqjzRjZW5EbwUt+zeGdJGF2+2o0nPgnh9l55uOiLo5IKoxMA2VCeW9KfEkHOOH+Nwwsr4oaPfn5Y6DoVPkw2cE+HFDR8N4yMAFmWLDzitZ8YchjbK+O2P//5+q1o910Un23w4f2VfpIgDdsKIqgJyrSjzNgQtEyekyxt9cFdqPtOLS17gMoehRIL4YOxGbijnYK+a6Mo08JQeD9SJNY0QmyXYi8UG798Exq9XYJi3vuG89lo2DmAZ4Z54ZJl1qL7/0ZA+GpJEgCukVD9bVopy5IlNpCe7sCy+W74JT3vR0SqHsmccZR+u6O0ALc8vx2Ld9eCxg4bcosxT8qACYugNQ3oBir9LqgSyTaCNFAhWso4xh+tRZEMPAKPLLjallqMP8+i78vPSDLMVRMqvmRK2otc5F4jfqhkHg5S+J1ZlXh1VCleGOdFxKglNc5Cvb4BNP/Wic4LNBzJ9+FvH+fhEf79vl61OBySgiEyl04wIbCQ9FPDqTQEvjCV2C8LuMIWOsxx4oUv3ei/jpaV104pMPHEx+fw9Ae5GLUjiDD7rspXjXv6VeIYv3euxosqKu3IXZV46xsnTnr89myu0Ha5nixUkqQxKQpbWlqCBr0voOcSSemlb8/30ioNPDrsGA7mGKg7wIm7utZi6CoLC06F7ICrSpfEH3DT2ufjg/kCIho6Li7F7c29GH5YZiIk3sGu4vWulSQB4BqJZI7Z69fFSsbCVGoLHlLMhXMK4XEJlZeEIinuKSNEqsPEoGoRKniICh7CpZJy1L9nNV6ZI3sDKCjy+tBlYzmOhzh445J2GkctB+GyYq9Nl0N6CJ+c9qPNeg82lgWo/LRU4vfToP5tYQhTLikIaxLpFmgS/aXmytSmTd8TTkzidzG3EtQUM8ufhb4Ks+C3ZPpQ/FmxZ7LsN2yx3aKkUR8peQQT92Ti7WleFPoNtJxwEU+Or+LHdUzZmoU//bUC6/eb6Lw4DyW8mBRN8dLCdphdiNMS3JRIPOm0RteBXgOknkG1pmBtejkUspqK4iBeW65g1ZlDuKeJj32q4niRiQcHHcXStdvxUPdq7HUpuJhxAvX7W3jo6wjabo3Y8/TCqCKan5giORCSExDmbZJd8NXgc9J1LwbOykSd1ywcrA6zywI2UHyzNhvTzoRwMTMLf+gcQZfvo3j84wK0X+CzZxsUK4hlO8/gttdqsTWXgByOENAu4cG3TOwmeEjatlSBspOMrpEkAeCaidBtefDiJ4seSZBQ9vwLYdGCcuRlU4mpuJKenKjzJ8UihMJb8AZdeOaZJej8yUW8tkLFcodkxQWxMj+E0adlXYCkNYvSxDDiXC2W5FZjUoaOnSUGlUWzk1nE9YiRUsuWYDsq/PjbWhXlGtWfls8uZiLtYbvsUl8CC3EBrESNPU2+z0OsrMpD0n5JSmz3JE6rJ2FMqWWQT4XLIvWudXnRYqcP609dxF1UvjTFRIaHvn3bdFTSd871R9B+cioKAnRLqDgSj5AUYrn3WjIG2ehU5uTjpuwRQHotvJqKO2BZHhp9YuCMSnYTiaPtUhceGuRC/Ta1WJpnIaNEw70DM/HsxCAafeDGymILOVVlmLrDxHGn5P9LhqYU85BsP4G9hAj4JfI4eG/sw72lJqn/efTeFiT4sG2kNUHNickXwjhWaKCwthqvzyxEpU9DqyGHsD0/AEUAXKerNuQinu2vwWn6MWZ/BW4fEcBT4wm2BE9VIsJ0g6Sfr5UkAeBaCQeXfRAAEoNNDvEJeVChLqS7sWJxJVLTSjngTY53CZ7JnLSOL8ceRN8u++AMaXh6UgZacmBm6VGUh6VGQDG2ByXST/pK3/JYkRsLyi3SUVJQgzSc7+8t9GFbqRT24AA03FSwMKYdKcN7W2mlqEh21V8BHjaPas/zkKLyXEJU5fc4Lb58T7Ylk3r9AgBxQ4OPSl9qSrYdafDRMgzdr+PBfoXYWKGh8ddl+MtMA+98mYEB3yt2Ms7s0wG6HhEbjGTazl6vwVeZvhM2YU+RiaJYGvbmuNB7aQ3G8pxeCfyRHTQem4P6Pf0YcpjmmP2zLkvB7Z9U4sPvLbwww2tvtlHmCxM8LBy6WI5sP5WSACi1EqU4qexcrBC4JB9DgO+KXAEAeRa5tToeanUCTb8O2DESg/RfKkGN2ZqPxjMDqCAQSRAyrmn47owTn65zIkQ0lGI2a85paND4KLaXxbEvx8Qd757DnV2COO3j+Q1JtRa2Ju5MkgHcgCLKLw8+wQLs6SD5iYMiaslipDD8IRNvvjwRgwfNIx2VajYqvAEFzz+5ALUVBINIJRacdqHNfguTMjW7bNWCTC+eXqLQ0sftCrRhMoae63Kwo1QyAznYTS8cEQufHXJgQm4AMfrOUZk6CzjR6biKidkmApEYgYZKRVdCglSSJiz7A4hPT1XlGxy49OenHCnCOrZDJZU9Vu7Ge0vK0GyjE15S+OmHc9DpAAHgsxKMuBTDrI01eHeuG0WBCsw8SSXmvUrFZtm8hL6NrZBRUmtT8hIIQrrUA/SLxeefeb4XhuWiTjcF9TsGSZ8VWk4HHh+WhzFHI7h7YAGWlcdwtCSA+h9V4/ONIbw0I4Ic8nTZOlxKi9krPOluyayslC63k3vEV6HyC/EXcONt2a+muGYEIpml6D4pBbe2KsXxUrpU/JzMwhwprUKeGsffhqZhL8E1agbY96DiS6VkN+9BQYUaxWPvbMU7oz102/yYuCYPt7xbiddn+wleAkIEaDI+WQgkOzRdK0kCwG9NxLe+7GMLRBQV1aB393kY2vcU1m5yoUfXjZg27gwHqGFb3rIaB17ZHsUn+3wopiIWuKro00exwaFz4If5GRMu0kxHiEoXkphCCLKmP0Cr+nmG5LpLarL47wbOOX1os8GFtbVxBGRGgDRWCocIPZZdawQAolQRmaqU2MXS9Bp8fFqFz4ii1/aL2OWJoedeP/J1FQvP+tFui4b1xQF8kRNDepGCFeclgOmnZSfACJhcZkDyj/yH7ZAjjOOVboJWLZ7ocRId5oRQSzB8cUQW7u9Qg4adS/DyPNNOYb5nTAUeHqDg0V7laLqJ4EhLPOtwNT7YFbXX/wckiCelv9ilFqTsGDU+gbP/SyRyIXUIZemybZlNHUtOnUe992ox84RBd4r9TUB1qy40nVaFAQS3xz4rwrNTFIzcUYXe6wx8fVGn30/g4mcXbi/CH1/Mt1mArgTw7CQH/tS6HOsKyHSESfBaspEo0YZ9+iON+hUkCQC/OeFoFdNkAwHHo9BJUuSyEjf2H3CiqorWkRZHSmtJUQmZ7np0cjb+MiGCqQ6L1sWHhalV+OS0ZPiJSZPcfRMDtmTjiMET0jpJ9SFCAQamlFAhZaELByEPxFyYfawKrywzsIGMQSy/fEVAQ0qTkXPws+KqROxl/dnOKJ6dm4Hz9OmX54Xx+cUwVp3KRcdTUZQZBiYd9aHznjBK2IaImphqlM1b5N4Sy6h58DxyCAjIuoMg7z/DpaAwEMGp09tx82sO5PEDa7LzcduwCO7pXY3b2tcgEo5gyJZCHHepWHzqIt49LPEDmYsP8B41O0lHYhx24pV9Df5MILMx5wdEbj8klljcDwLk7gsX8P9e9KDfYrpNbFPcIJiQFOWHa+HzBzF43n7c+p4LXxyKIkcJY+nRKlSHwgiFCJiaikd6XcBfP/LCHfdi1v4c3PGJH00WRVFpuUhBZPrSIvOQWIZEWK6dJAHgtyaJ0XpZKyRAKNRbgnIyZSjBPfldElHkzyEOah3Fjko8NTWMt3dGsd2jwe/X0GaLgn47w6TjBBAq4OYyL1YU+6DR5y71hDDtUgiL84OkyAYOVZu0cDIWTXjDIYw8V4u3NwVJc2UZrOSzi2UUMCAEUFNkOzUbSziIxx6pwYxsA5sLNHTaQOA5VotvL4bwTT4HNj8Xjfhtam2ynWJF5TxSO8GUmQ0bBISa09UgJRZmErO8dpv8fi/6b8pEg3YeLMsQ98WF1EsWdlbquLPZKXvvA3uLdksofhgeYRQm3yPoSdtEiQVe7Bp+7EteigontlY69n+LsBEBENkXwB008Fjn43i4aw6Ol/F8vIasnygqz8Kf+5SjzUodLSYU4IXPNbz7nQsdNvpRStCR5KMQQWzrqRzUJd3flGOgvLYWDyz0ot771TjkoKslrgddH0nrtncAZnNkYvNaSRIArgMJcxQtTM3FGxtUDD0b5oBKw6cbivH8EhOnqPCxsCi4hRNFtVjlCmLBxRqc0OOk7rIJSBU67NGQL1FwUnmx8E5+dtheF+6ZFEC6h0zDVlIBI0EnAR6h7AmucsJh4M31Jfj+lAc9D5koJFCp/PveksRnf0hiuiTL6DZD0S772rJKTwJsAnJSSl0lSB1wxvDFZjduersUZaT8weownv3OQB+7PBlPZAUTJ7wKIrUcBXgM+usfzr6Eet39qHBK8JSMh7hVSAb28LBqrMn1IT+kIb0yjhGbslFIJjb+WBHbLbkHiUDmy70vocNCukYE0LFn3GjUtxDdvzd4Vz/eJ9dKkgBwHYikwJa5InhiQjqa7w1hF/3tQWtq0XyLia/yZMMLL3z0+cP0a1VSc9nCq5KUfPHZGnxVGENFRMPxWsUOvqm0YHHNRGUggM5rXWiyLoI0+r5XtqoSqy0AIENZDssMI6XKh7JAGHuzHQhRoU0qhdQb/DFRYxJ3EOtt4HxxBYbvCeG+7vlI9SRYhj3NyM9Ukh4vuaDijtEVuMQ2a4oPZ710YXSyHMlulAjlVZI42YTBNk05WoEHBgWxPlOW+YqbRaW2Qnh3/EXc8Z4bR4t8iOgKQS6AiavP48MtFmoJECqtumQALmGf3tExF0edOtJqdTw9sRKN2rtw1i1Tufzgb0ySAHAdiBYPQqVVPV2tosO+IJptCMNHa+TwKxiyvhrrZKciKo0VcXEwx7G2woV+x0M4QivLt+mb+9H3oAcf09mWeIPQ9bhJWquF0WNzEM/PVXBKip1S5SVY93c7xh+IGaTtkniUYApxWYjA36Vw8I/JkUIfLpDKk3BgZ1oaJhSoGLLai/GnhYXw2nSN/Vo5XtikYdBRE6mKLOHltS3Z51+AiPdiECzo2lwtkW3ON1xy4sGxESwqp3cuexayOTG6F58trUK/lTUYt9GJRl092F1L/ysELDuvYvwJYS8h+OMWSl1xPPVlFkbxPsJWAIM2FKBB3yDGZbDvorrtgvzWJAkA14HIltiyNbVExvttcaDlwSC+pd8coDVdc6kWvU/J5poyv+6mVbOQ5tFxgnRaKgSFtSpMvhTEfrf42Tq8tPyyJl/n32TpcL5LRf8DHjy7PGgvyBF/2KSCy3nsSr/i1/+AROnjSwkyUQ7JX3Apkh/gxoQT1Xj0axV3DVOwJp/XIyPpfiSMdJeFXltLkO0j/aclDtn34wOdD57r8kmvgtizK2ybnNeQgCTdCB+t/HeZNXhyQiUmnBO3RGdfSeUgFUHVwlN9duJoKASlxo2XvsrHs2P8+DolghLdYF8F6dKosAiWvdZVozsZQRn77/s0Bx6doBFQ3GQqsj+B5FZcbsRvSJIAcB2I2EHZF08CXz41guZry9B8lYF1lRYCNPHDD3vxdQEVnP6s7KEv/qqfVD293IEPU1WsKtZw0kdlI0iMSSnHmHOSHKRAqhn56BJoPMe0Y2V4b4uBzSUKAvSXJQAnc+sROxrwv0UyBnVa6azKauQaFprMqkQ1Xx+ZW4sRp3QcqIyg85Zy+A0f3lrpx+gsHatKNPTY77Pr84Vkyo7/STWef1COny/SXgEBCQ7K/ouSQt1pdS1eW61jWSmZBamLrJSUhKkluU6MzTZxtNQHF9ve6ZsUzE7XMH9nKrqlROlOxewYgWG40WlWFp74XEOWFkFOWRXuGOPFnT2rcbCMrIosS7YeE9D5rUkSAK4DkSks/XLuvclBuWdfCp6eZ6DJJgV7HRbySd9bfl+BRcUyx81BzkErwba1GeX0u+P021V8mubEoewgRl2MolizoBkmaql5lhGABYXgoFD5Nby+2oVFJVQi26pFOah/WKS6kGZqOJdXgjYHo+i4SGfb4thXUIRe+zSsLTMw8HQZXRdg0H4XiggmMiWZ5Y3aFliV33keSYi6qoaTjEUAU8DrfHkILy5R0GS9huwY3SRDSLqb7U4kIi0r8eOt2R4cDsmiHS9imoGNeZV4c5GH/eFgP7KdPN/i1Eo8+lUEm8rJqowwOq2vxe1dqzGvIGanBMN08/sJ0PmtSRIArgOJEwDEqgkZt9eWmwa+2luN9zYG8Np6P8LUsi0FHry13o1l1QkFk63CZG9+J5W81oxi6tlyLC2JktLqGLP5NLru19FFkosUzZ6+08kYdNL5dbkhvLfZj/FptHZhnZZalvkSUERh+Ur8YVvor8dIpQk2waCOdkciaLOVTIMWVqEVXH/RjZWlBBhDTKMXJ6vC8JphfvHqqbqUIBeqL69ifS1hLQQsybJ0aSYmHXei6cYgep2xkEsFt9dbCDPi/Wy4GESKQ0AI2JZVi1dWhLC+nIyBAHC6zIHSkErFT5SVP1+p4NFxWficwCkFQpel1qJR/xJ0XyQsS/pZtd0hqSlwLSv//JgkAeA6ENuuiI9PBZRCnuLX5nsjqPf+LjTebGBSRpTKFsHyvCo8TUt8XKEiiGUiN43QHi4/68KqSqHcAbjp1zeZfBhp4RiOHDqCZgcjyKOfLjUEJI9elKjUb2B+edQuFLrdJ5uSJs4lZbsloUgYiWzfJnPdVsSPJecKsMVnkPYHSZcTsQMpUCrTl4q0n68CItL+qyWi/IQAu28klwKyyIlK6Ayo6LTdj1dWaVjijCcShWQTUYKVbBgqzGdaajWGprrZTjfajkvDV6djuP/jS9h1USy6BZVugtQfqAwruHPAMbTZJqnDGk5VxPDXCZW4q6sTJ/0he9bF3hla8o8FmJMMICm/hNgTbvSVpdiGWK04abts4b31oh/vLHDh5YU+rKmlRdM8+PyABx1TTHv/elliKxF1b9hCVVBoKuy6AZ2WpGO908DRghIMP6XgrMdCtjdMBpCotSdWP2Z5cNqpYOgJHyZk0YoqUnVHlD7hY4t7IEk10YgXLipDrUGLSTAwCUT26kEqu0wVxmmRJUAmwcWrSZEl60+Ch5LNGDODcNCtmXchjGZbFHySoiNLJ81n+yy6GJLoFCIb2Vriw4E88f+jWJCaj3arFczOIisyIxi834eV+bKTso8uE0HAX4n3FlWh/VYLRWRYjoALby504eY2Pozew76gy2Bvta4bBCIpLkqAFaD8jUkSAK5joSuLnelFeGNtGE13OJEdlvJbUazMVNAvJYg0lVaJFFWy8qRyLjWRA9WCGQ6jxx4fptGiWRzIQp977qrAfoJAKB6AQrCRWvpqLAyXHsOyDC/6p+uYV2aigsosa+mlGq69foCH+Nv2Yhwqvqw5uFpC1bZjDXaCkjAPodtUNI0KKysS7S3H6Vrs9RHUdgbx/OogxhXRTRE2Y8cZFEhp8PJQFN1WXMCqkjBaTi+kUhvwqF68PbcIo09q8LHNkiBlZ2ISLFSCWa/1BXhjjooqMgdnMIBHFzhRv10QLb4J/+huSb9FSQLA9SxUOJnOW5tbjm47LPQ+EyZtTay5X5XlxCenQiiiZRQAkP3+hAF4Qhq2lXkxnr6+EuEpSIvX5asYlUYrStqeW+VGqaLDQ2IbI8U1owotpo4z1QrmFxjotcePb4tMnPHLOn5ZOyA1+sgETCl+QqvMNl01kZiBsIbLbodM68kh3k2+EsJKMqBee73oeNjE7DwpyGHai3x0fkaqIRl0baxINZZcMvD6tHI70m/Qv3/t2ypsrAohqkfwTaoXR8hu7M0/JNBKQBl/yos2Bwyc91ooNz3ovqwQdzevwYvjXKjgd36Dhv5HJQkA17EIBZZlvUK7U6rDaLGhGr3TLBREaCFJ57fl+NB4RwSH3AZJapT6xPfpJ2/IDSDNK/5rFY5VBzHwgBMlkRjOV4ewqELDgFNunAzSHxZLyvNbkhsgdJ9A4Aj7Mf1cCN0P62i/zcDY8xF8n62gVMBCmMDVTN/lIQwjUUvBRLmuYU2+D4P3VuHVDSr6H9expVKqKMkCnwCZgcQfwvbrebeOoeeC8BNENuUG8fZqFyrZL1K266I7jLH7SuwZENkR2WSfSMRf8h+mpwUw+hxZA0EzvVLDc9OcaPBBLZqN1VEheywK0Aka/U4kCQDXsdi++OUItCy0WV3gwrA8C+OzI8hS6ffSTz7lcKE/reQJj2rXz5fpRKHHJAm45HDgs7MuZJJWn6+owmklDhdRRaOLsOliNkZcNOwtx1T68bL9tV0cJC7LfQV0dBwudGHQsRA6H9TRZreFrmcFiFSU8G+ycYcE5ST4JhuTaqYULZWqyKpN5SXoaGclinvCz8laBIPKZdCvljLqsmOPlDbPcFv4+rgT76+20HxTFP3PRTGz2IeLUoyQ/rfU9DctqYLMX/kaMJxw8WfiG/oecNMtMlBFZtBh7iWsK9N4rRD2OCwcYTsloOIjeIR4nmBAQ6/D1Wi330QZiUcwXIrmS1y45f1aNB7pt+sbgN+VfvsdEYAkAFzPIpuNyDx6mIotdfINTUdKdhCDU8P46LQf5/1eO1K9udSPLifC2OWhBZTlwVQ8KcHlDjox5pKCFI+G9WVOUn3JDhQabZBe52FxFZU+qmFpjoITfgWHHFKSnO9JvCsiwTRZAkylC1k4VBXG5HM6+hwtQ9OtJrocMjAiTcfIUyZmZcTwfb6FrQUqzrpjSPdFkeo12T4TJx1R7CsIYk+Jip0VBtYVRTDjkon+x/yk4UF0OmBi8OkYJvO9E/RZQrS+sreAFZNSX2QHBBQpdio1F9dlOjHughfzswIYmRrE3sJyNNkbsJOiCmi9V2b6sLjcwH4X/X5hDbpChQ6jivfUc1MNOu7RkBvWke/x4ulvSlCvowcvDQqyvWG5YchORhYBNGZPyP4+JAkA17PQyuq2fyzpuFHE9LBdMvxklQdjsmP44EQQ532aXTn4bKUXLfdq+Krcz8/Qrxczplp2Vh51Amera3g6USRJO+Z39xVgyP4g+u4I4pDXwJEKH3od0rHXEwUhh/6/BP/IFsT6ijHmNcQaCyA5afFTqnUCh4XpBKTR2WG03htEmxQdr6+L4uW1Uby5y8C7R6J4a3cUTXZF0eZ4FJ1PmxiSGcGSGhN7ynWUEWmkuo6U9BJQkviiVNrVI0479hAzZVaC75FF5BFUOq4+j1Jab1lMtP4S3R8q9fNjqvBdsQmV70mdBPhcBMsI75+gyX+lHgNdt9Ri4KkYiI8oU0y8PK0EN79SgIf7e3DGx3vivUk+plxLtmSXnL/fiyQB4DoW2ek3DtJ5UWYOaFEEOw+eSiALgM57avHBnhB2emKk4DHkUckHUKk/PWcgw5CEITIEWvjEFN3lffUIAmEthJHnazH9ZADLSy362DGU+kMYurMQ3xY6MOSojsmZCj7aWYUiXle1ZLt0BV5+N6J77XiBuAwxKpzFxsgWWxIf8JDiF/tiKPDyCFBpFQsFoRjKySDc/FwsUsvv0q3hz7IiTyL99pbnVEAp+xWypBpvFIqhIldlm00v7MrHph+XPKT5W4pQTEWXMmRevtd9bT7yHZcwlMBSYtC1IPuRz0sylGzacqyiBn32K3ZQ02tGUOSvRp/dCm5teREvjTFxge6HFPOSfpGJCOltO5dBfvmdSBIAbkCxM+SocCHdjw3lHnx4xMSKKlpoDmSHHsWIg148tzKAQ0EOaMtvuxAGrawUBzVJcSuqHRiaEcZ2d5QMQ0pnm1h6qYb0OQiViv3B9mrsqrTsDUmG7CjHNBfPY4Qg23vDqOI5pNafFOCADShSIEQyGKXk2H+tOXBFJMAnii97F8qOQlEjjGBlOVJl8017FoJqaBQj3R/D1NM1aLLRh1PBKLz8fKKwaITMJUiAysV+XtQfDxJENHT4vhwBshwJePrYBtkjMaIHCEgGJh3Mw1NzTSzMCVH5Q0gt9OCNbzxo1KEaz4+tJODQ4vP8Jtsp+Gq3Vv4n7U4CQFJ+yyIKJQkwGjmzYvixqTSCoafCmJNnIGwF7dTg2ccdaEL6/XWmjipa1BjdAhnsEg33eGqwwB2HKmW+eC5Dj6D34QpcigWxLr8KSyt0ugA6vFE/Pt2fhzw9jn151ZhHVrCd3/uuREE2KbldgIOfE7ot05ViPSVdVl5j1CabuPBQCSR7K93QCFC6YcFrBDDicAmGk6lMTA1jhYPnqs5E5wMhu4bAuIPZ2FgTsZVf/ALZflvyA047Q+h3PIyU0gCmXHBiW4WffRAlC5Hlz2Q6ZAGukIJJJ73oecZAmo/tI9iszvThxblVuPWNSrzzdQB5IWFDJvtEVhb+A7QSAHD5+J1IEgBuROGAlZ1vJCNPimDKdtmL03zockhF5yMRZGsKArRwFY5KdDvgQzv65ge8KrUoQitMemyq/K7kDVgw6YenEQhm01IqPM+Hh/JsphAnRZd6+kPOumEqfvTelotzVOCYXoE+Z1VUsQ1S4XgA3YUvDznRZa+Gs6qOSsXA6iwPNjmlBoCORUUa0mqr8PmJSvTaa2B4uoEJx2sxIE+W82oYc8qFzQ4dbjKC905F4KCiH0grwadFUt+vlixDLHWMborEQmQ6L4yLZDleAkPcCNLvF1AL0QVx4lCtC623RDE41UKIQCNxk7GHa/C3rxXc1MqLVsuo9HQ5pDS7SVaAy3Q/sXmL9Ot/OX4nkgSAG1E4cK8sHpK0HKmJ7wzrOFQZRpttAQw8qmEJrWqcCllIi7gmT8egU36sJK136hJTkMAbKbsk3ZAdpHlDtJIB9D+u4btcKY2dWATz5aFarCr3IUYTvCzXjUOuINJrFEwhqxAA+prgsKpWttg2kOlU0X1/JUK0xJ/uyEIKqbjUzp9yohy76RoodCH+ujSIUyETs4+V0DpbdCmiOOUJYeKFMoR5IzvyXJhR7EZmtYWvznpRG7cIVjIlIe5FwmJLRWJxOWRT0bBMKWohtl/DF2d86HZQxYoSsiD+7UxtJb446MIjkxTc39eJ8QSoWjIP2RBFSobLLOP1IEkAuAGFQ1jSfngI5eZhp7lSQah8bkPHuP0VeHdfBNOzgthUplNBdWh8f8olDZ13S1AsgiqJpsu8PC2q7IBjRoNUUimbLXsahLCr0I831jhw3oojFHPj05N+5IQi2J6TizElEqHXyBYKiEUeXj/M78fQZacbsmnpwL0OHAmH4acV/vZILg6wfVJFd/qRInznjGNeWi3KqYCShCS1BEeeyINshXamKoLJGX44NTe+Pl6Cnd4owqaPd5oobiqfkUVQkoPgIbU/WOTEsENB9EwJk3HE4FPDqA4GMSYlgFdX+nDPeBXDVyso04QlqfZ9SiVmORfIdq4HSQLA71xkdd5PFfGrBQAkGCiptDYAyHsSmBNAiBpIKdLR/0AmWu7VMTIjhlz61pah4LzPxOhUE30OK1iR70cpFUN8ecm2ky3HpMqQmEdJKtqQG0KxInkIKsbvKcMpe+vtszjiC9ibhfbaXoMcKrrUypNdhtpuKwQxAj1WF+Ak2wIq8kwygGN0HVReOzU/E3MqVSzNCcBPkJF9BeV7/Q+VoSQu+x3GyAJqsUOJo4znkU1FomQAsk2apCVLBeU4Gcz+ijDeWFGNF3dZmJGrknXQNSBQZTv9aLLOhXsmhtBqdQRZPIFs3yWVmMWNkEV95BDss0RV5OtBkgDwO5XEdmK0bXy9miJ+sgTiZF2Agy7Aoswg2m3yovUuA0tLNCq2Dp1soIqU/Ot0D15Z4sJHRy1sylLglviAodm5AjL/H5MMQdJtAZvCgI4thQrmXAxhfYBqpGvYdSkbHVM0FLo1fHnMg201km4bRLdVZ5HKa0jK7leHynEwYpIBmNiVmoZB53R8w2NrlYoAQUm25TpZ5UWxZiBCpZRlufTuyUz4fboqYrllN6TKkIEVuQaGkep/dk7B+oIIKkKJWgeHqxWMPRLAW4u9eHyBhrHnNDIEugeWh+p+dfv3tyZJAPgdy3+LQF8lESspawhkPT8MD1T+fqQmhqbLqtHmQBRd9oSx3aUBYRUKVW3MNh/u/TyCW3sH8Mw3KpZXxuAWAKDFlSi8TPMJy5Cqu1IkRHb91TUvEAzY02vlbh/W5kRQxs/W8nMuvrfLYeDrHPr6OVF8dIhuAy12bSyCjRnZ2F+mopjoZJlBAgzpOEEgZrl5/gDbnNi8VLb7StQu1HCcjKHrARXvpZgYmWthD12IkKmQEXiQE/RiwF4Pnlpo4dE5KtrtNlBpryRMJBfZVt5KAkBSfoNyRfmvNgDYVWvErSCzkOW8MvUnu/moYVrQjBAGHlUxIDWKZ5aHsIgWdZ/TxFe7HHh2pBePDAmiwz4dTTdF8FWahq21ERxxRalsZCsyzSdr/23FCtNlkIi8XMdDxY3QjaDS2dtqEXcIBlIWnFBhzzTIFKFFZqHRrbCovLL4KMT3JW6hk2GItZcdhI1YGMXhEFLK/BiXqaHPCQO9j6hYnBdBviIWXfbt15ETYNuzVbzxfQB/XRfF4IMmzrmllkLcTiqSaVLCIO9fEqd+uov1e5IkACTlXxJJeqFthC+q4MutblLlKJ5fGkHvbVEsyqrC1HNRLEv1wSStvuDwYsolHYOPh/HuFlL6Uwam5BhYVxhEuhZHVA9fXuwTtTMApYiIrXxUZCkQIrsP2wfpe5zKLmnEYSEkBCNhFYbFz5ERyCYczoiGdKeKoy4Ds8+E8XFKGD2PR7CgwEAV2yxLf6NWNbxU/O3FKgYf86Lleh3tT5jof8ZEvipTojIjIvMhN54kASAp/5IIHbbr2smUYVAi6EF8vN2PJis0/PlrHx6ZoWNsehgr8yNIjXsRUy2ESfcvOBXsKA9hLtlDh01BvLvPRJ9TOj5L0zGLVnq/P4rdFYntybaXKDjF3094YjjijOAMfz7pjuB4rUY/PYT9ZBubKqKYTXBZyNcvzjqx3K3hq9MerHXHsKHURCEZgKqTNZg6HKYfU/Y5MZqK3uWgCy1267y2gUX5IXtFokxVCoOQJdOypPhGlCQAJOVfFEn+ESsds8t8ydZesvLPEybNL1PQcZ0f4/Oj+PiojgEZEUwrt7CsMEB/PU6fWqrqSrqv7J5r2LsUVZoWDhIY1lfGMSk7iiFnQ2i/J4yO+6P0xVV02a/hs6wYhl2K4JuSGOYWRzEuLYwZl0LY64za23O7dVkSrJFJkC1EXHQhDJQEPEhVQhhx1Im2Wy28tr4WL64Oo8chC2tKg1DIMsJkHeFoGFLRV/b9sgueXt9M/0clCQBJ+VkiPvKVpCIHrf7x8iAOVRk4pRAE0r3oetCPvmdj+CbTxOEKE2dcEXgIBGG6ADr9ekPqC8TDdAOkZLlpB/JkgZAs5ZX1AbLZp+wNoMf8fJ9Wmy6Cbsi+ugpqwwbOuTxYR8WefF7B0NMq2m7y46OzETTfGcaINANry02crpW9DKRmIs/PcyblH5IEgKT8LElU46FSySuVWBRMFt9Ipl9QV5Dt92HBhQjGn/Kh814TrfZH0P+4hS8uWRhw1MDneSYGHg9jaq6JFTUWlhSGsJouwbL8MOZnq5hXEMHiEh3TLwQw7kIYn14y8P7uMNrsi+DD1Bi67fGjy74QPks3sbQ0SvBRSP0Ne3chu+yXAIrEC9guKf4pRUKT8g9JAkBSfpbIpMHfD/5LKJtkBlIBScljsSAsw0KACinrC/xUTlk6fMHnx6YqFwYeNNH9gIrPLsXQ83AQ7Q9F0GRLGG9s1NHrTAwjsy0MOh1G2y0GvqiKod32ML4uimDSCR173FFk+EyEIhJEtKBZMkMgpb3JLMgUpB3yu12FWNYh2GyFDU3K3yUJAEn5zYgWi6FaNVEc0GjFY/BQV71mnO5BUml/KUkCQFJ+MyIJyTIdJ3Pwqkw6Spoy/yVp+y8nSQBIym9GJD5nzzLQb7cPMgIyd8lJSsovJP8yAIjvdCX/XA55QFd+TkpSkvL7lJ8EAP9T+a+8JiUpSfl9yk8GAGEBElmV1yuMIClJScrvU34SAIiI1fd4PEnFT0pSrgP5t4KAV5RfXpNAkJSk/H4lCQBJScoNLD8LAJKSlKT8vuXfAoCkJCUp14ckASApSbmBJQkASUnKDSxJAEhKUm5YAf5/kYYpSVPj45wAAAAASUVORK5CYII=',
							width: 100,
							alignment: 'right',
							margin: [0, 30, 0, 0]
						},
						{
							text: 'Виписав(ла): Діхтяр В.В.',
							alignment: 'right',
							margin: [0, -75, 50, 0],
							bold: 'true'
						},
						{
							text: 'Підпис __________',
							alignment: 'right',
							margin: [0, 30, 50, 0],
							bold: 'true'
						},
						{
							table: {
								// headers are automatically repeated if the table spans over multiple pages
								// you can declare how many rows should be treated as headers
								headerRows: 0,
								body: [
									[{
									    text: "Зверніть увагу! При здійсненні оплати в призначенні платежу необхідно вказати код ІПН або ЄДРПОУ платника. Якщо Ви не зазначите дану інформацію, кошти можуть бути повернені як нерозпізнані.",
										style: 'alert'
									}]
								]
							},
							margin: [0, 45, 0, 0]
						}
					],
					styles: {
						warning: {
							fontSize: 8,
							bold: true,
						},
						alert: {
							fontSize: 18,
							bold: true,
						},
						header: {
							fontSize: 14,
							bold: true
						},
						tableHeader: {
							fontSize: 10,
							bold: true
						}
					}
				};
				//pdfMake.createPdf(docDefinition).open();
				pdfMake.createPdf(docDefinition).download('invoice' + invoiceNumber + '.pdf');


			};

			var createActPDF = function (params) {
				var buyerName = params.buyerName;
				var actNum = vm.actNumber;
				var actDate = $filter('date')(vm.actDate, "dd.MM.yyyy");
				var totalAmountToStr = "";
				//var totalVatAmountToStr = "";
				var buyerEdrpouOrInn = params.buyerEdrpouOrInn;
				var buyerAddress = params.buyerAddress;
				//var vatAmount = vm.isActVatPayer ? vm.totalAmount / (1 + vm.vatValue / 100) * (vm.vatValue / 100) : 0;
				//var totalVatAmount = vm.isActVatPayer ? vm.totalAmount + vm.totalAmount / (1 + vm.vatValue / 100) * (vm.vatValue / 100) : vm.totalAmount;

				var body = [];

				var columns = [];
				columns.push({ text: '№ пп', style: 'tableHeader' });
				columns.push({ text: 'Найменування робіт, послуг', style: 'tableHeader' });
				columns.push({ text: 'Кількість', style: 'tableHeader' });

				var values = [];
				var total = 0;

				vm.actItems.forEach(function (value, key) {
					values.push({ Npp: key + 1, TenderId: value.tenderId });
					total++;
				});

				var rows = values.map(function (row) {
					return [row.Npp.toString(), 'Послуга з реєстрації пропозиції на участь у закупівлі \n' + row.TenderId, '1'];
				});

				var footer = [];
				footer.push({ text: '' });
				footer.push({ text: 'Всього' });
				footer.push({ text: total.toString() });

				body.push(columns);

				for (var i = 0; i < rows.length; i++) {
					body.push(rows[i]);
				}
				body.push(footer);

				formBodyAndCreate();

				//if (vm.isActVatPayer) {
				//    var getTotalVatAmountInWords = nConverter.getNumberInWords({ money: totalVatAmount });
				//    getTotalVatAmountInWords.success(function(data2) {
				//        totalVatAmountToStr = data2.numberInWords;

				//        formBodyAndCreate();
				//    });
				//} else {
				//    totalVatAmountToStr = totalAmountToStr;
				//    formBodyAndCreate();
				//}                     

				function formBodyAndCreate() {
					var docDefinition = {
						content:
						[
							{
								text: 'Звіт \n щодо послуги з реєстрації пропозиції на участь у закупівлі \n від ' + actDate,
								alignment: 'center',
								margin: [0, 20, 0, 0],
								width: '*',
								bold: 'true',
								style: 'title'
							},
							{
								columns: [
									{ width: '*', text: '' },
									{
										width: 'auto',
										'table': {
											'body': body
										},
										margin: [0, 20, 0, 0]
									},
									{ width: '*', text: '' },
								]
							},
							{
								columns: [
									{
                                        text: 'Від Виконавця: \n \n ___________________  Діхтяр В. В. \n \n ТОВАРИСТВО З ОБМЕЖЕНОЮ \n ВІДПОВІДАЛЬНІСТЮ "Е-ТЕНДЕР" \n П/р ' + $scope.bill + '\n ПАТ КБ "ПРИВАТБАНК", МФО 305299 \n 04119 м.Київ, вул. Дегтярівська, буд. 21, літ. "А" \n код ЄДРПОУ 39484263',
										width: 280,
									},
									{
										text: 'Від Замовника: \n \n ___________________ (_____________) \n \n ' + buyerName + ' \n код за ЄДРПОУ ' + buyerEdrpouOrInn + ' \n ' + buyerAddress,
										width: '*',
									}],
								margin: [10, 40, 0, 0],
								alignment: 'left',
								style: 'content'
							}
						],
						styles: {
							header: {
								fontSize: 11
							},
							title: {
								fontSize: 12,
								bold: true
							},
							tableHeader: {
								fontSize: 12,
								bold: true
							},
							content: {
								fontSize: 12
							}
						}
					};
					//pdfMake.createPdf(docDefinition).open();
					pdfMake.createPdf(docDefinition).download('act' + actNum + '.pdf');
				};
			};

            $scope.generateInvoice = function (createInvoiceAmount) {
                $scope.invoiceInput.amount = parseInt(createInvoiceAmount || $scope.invoiceInput.amount);
				var createInvoice = invoice.createInvoice($scope.invoiceInput.amount);
				createInvoice.then(function (resposne) {
				    var data = resposne.data;
					//console.log("Created invoice:", data);
					var invoiceParams = {
						amount: data.amount,
						invoiceNumber: data.number,
						amountToStr: data.numberInWords,
						vatToStr: data.vatInWords,
						isVatPayer: new Date(data.creationTime) >= vm.startVatDate,
						d: data.creationTime,
						quantity: 1
					};
					var getOrganization = organization.getOrganization({ tenantId: data.tenantId });
					getOrganization.then(function (resposne) {
						//console.log("Organ for invoice: ", data);
					    invoiceParams.buyerName = resposne.data.name;
					    invoiceParams.buyerCode = resposne.data.codeOfOrganization;

						createPDF(invoiceParams);
					});

				});
			};

		    $scope.sendRequestForPay = function() {
		        var sendReq = allbanking.sendRequestForPayWithLiqPay({ amount: $scope.invoiceInput.amount });
		        sendReq.then(function (response) {
                    if (response.data && response.data.length > 0)
		                window.location.replace(response.data);
		        });
		    };

			var getSiteSettings = function () {
				var getSettings = settings.getSetting();
				getSettings.then(function (resposne) {
				    var data = resposne.data;
					console.log("Settings: ", data);
					vm.startActGenerateDate = new Date(new Date(data.startActGenerateDate).getFullYear(), new Date(data.startActGenerateDate).getMonth(), 1, 0, 0, 0, 0);
					vm.startActGenerateYear = new Date(new Date(data.startActGenerateDate).getFullYear(), 0, 1, 0, 0, 0, 0);
					vm.startVatDate = new Date(data.startVatDate);
					vm.vatValue = data.vatValue;
					console.log('startActGenerateDate=' + vm.startActGenerateDate);
				});
			};

			getSiteSettings();

			$scope.vm = {
				invoiceToPdf: invoiceToPdf,
				actToPdf: actToPdf,
				actToHtml: actToHtml,
				selDate: null,
				startActGenerateDate: null,
				//endActGenerateDate: new Date(new Date().getUTCFullYear(), new Date().getUTCMonth()-1, 1, 0, 0, 0, 0),
				startActGenerateYear: null,
				startVatDate: null,
				isActVatPayer: null,
				vatValue: null,
				actItems: null,
				actNumber: null,
				actDate: null,
				totalAmount: 0,
				watchSingleAct: false
			}
			var vm = $scope.vm;
			activate();
			function activate() {
				vm.tableParams = new ngTableParams({
					page: 1,
					count: 10,
					sorting: {
						CreationTime: 'desc'
					},
				}, {
						total: 0,
						counts: [],
						getData: getData
					});
				vm.tableParamsTransact = new ngTableParams(
					{
						page: 1,
						count: 10
					},
					{
						total: 0,
						counts: [],
						getData: getDataTransactions
					});
				vm.tableParamsBids = new ngTableParams(
					{
						page: 1,
						count: 10
					},
					{
						total: 0,
						counts: [],
						getData: getDataBids
					});
			};

			function invoiceToPdf(invoice) {
				var invoiceParams = {
					amount: invoice.amount,
					invoiceNumber: invoice.number,
					amountToStr: invoice.numberInWords,
					vatToStr: invoice.vatInWords,
					isVatPayer: new Date(invoice.creationTime) >= vm.startVatDate,
					d: invoice.creationTime,
					quantity: 1
				};
				organization.getOrganization({ tenantId: invoice.tenantId })
					.then(function (resposne) {
					    invoiceParams.buyerName = resposne.data.name;
					    invoiceParams.buyerCode = resposne.data.codeOfOrganization;

						createPDF(invoiceParams);
					});
			}

			function actToPdf(month) {
				getActs(month, function () {
					getActNumber(month, function () {
						if (vm.actItems.length == 0) {
							return;
						};
						vm.actDate = new Date(vm.selDate.getFullYear(), month - 1, datesHelperService.daysInMonth(month, vm.selDate.getFullYear()), 0, 0, 0, 0);
						vm.isActVatPayer = new Date(new Date(vm.actDate).getFullYear(), new Date(vm.actDate).getMonth(), 1, 0, 0, 0, 0) >=
							new Date(new Date(vm.startVatDate).getFullYear(), new Date(vm.startVatDate).getMonth(), 1, 0, 0, 0, 0);
						var actParams = {
							//actNum: vm.actNumber,
							//actDate: vm.actDate,
							//items: vm.actItems,
							buyerName: "",
							buyerEdrpouOrInn: "",
							buyerAddress: ""
						};

						organization.getOrganization({ tenantId: $scope.ng_localStorage.userTenantId })
							.then(function (resposne) {
							    var data = resposne.data;
								actParams.buyerName = data.name;
								actParams.buyerEdrpouOrInn = data.codeOfOrganization;

								actParams.buyerAddress = data.address.postIndex + ', ' + data.address.country.title + ', ' + data.address.city.title + ', ' + data.address.addressStr;

								createActPDF(actParams);
							});
					});
				});
			}

			function actToHtml(month) {
				getActs(month, function () {
					if (vm.actItems.length == 0) {
						return;
					};
					vm.watchSingleAct = true;
					vm.actDate = new Date(vm.selDate.getFullYear(), month - 1, datesHelperService.daysInMonth(month, vm.selDate.getFullYear()), 0, 0, 0, 0);
					vm.isActVatPayer = new Date(new Date(vm.actDate).getFullYear(), new Date(vm.actDate).getMonth(), 1, 0, 0, 0, 0) >= vm.startVatDate;
				});
			}

			function getData($defer, params) {
				var sorting = params.sorting();
				var orderColumn = 'CreationTime';
				var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
				var pager = {
					page: params.page(),
					pageSize: params.count(),
					orderColumn: orderColumn,
					orderDirection: orderDirection
				};
				invoice.getInvoices(pager)
					.then(function (resposne) {
					    params.total(resposne.data.totalCount);
					    $defer.resolve(resposne.data.items);
					});
			};
			function getDataTransactions($defer, params) {
				var pager = {
					page: params.page(),
					pageSize: params.count(),
					date: new Date()
				};
				allbanking.getAccountTransactionsCurrentUserPager(pager)
					.then(function (resposne) {
					    $scope.transactions = resposne.data.items;
					    params.total(resposne.data.totalCount);
					    $defer.resolve(resposne.data.items);
					});
			};
			function getDataBids($defer, params) {
				var pager = {
					page: params.page(),
					pageSize: params.count(),
					date: new Date(),
					order: 0
				};
				allbanking.getApplicationsByUserIdPager(pager)
					.then(function (resposne) {
					    $scope.bids = resposne.data.items;
					    params.total(resposne.data.totalCount);
					    $defer.resolve(resposne.data.applications);
					});
			};

			$scope.getDataActs = function () {
				var input = {
					numberOfYear: vm.selDate.getFullYear()
				};

				abp.ui.setBusy(".panel-default");

				act.getMonthsActExists(input)
					.then(function (resposne) {
						$scope.actsMonths = [];
						var months = moment.months();
						for (var i = 0; i < months.length; i++) {
							if (new Date(input.numberOfYear, i, 1, 0, 0, 0, 0) >= vm.startActGenerateDate)
								$scope.actsMonths.push({
									mon: months[i],
									monNumber: i + 1,
									hasAct: resposne.data != null ? resposne.data.indexOf(i + 1) : -1
								});
						}
						abp.ui.clearBusy(".panel-default");
					});
			}

			function getActNumber(month, callback) {
				var input = {
					numberOfMonth: month,
					numberOfYear: vm.selDate.getFullYear()
				}

				act.getActNumber(input)
					.then(function (resposne) {
					    vm.actNumber = resposne.data.number;
						callback();
					});
			};

			function getActs(month, callback) {
				var input = {
					numberOfMonth: month,
					numberOfYear: vm.selDate.getFullYear()
				}
				abp.ui.setBusy(".panel-default");

				act.getActs(input)
					.then(function (resposne) {
					    vm.actItems = resposne.data;
					    vm.totalAmount = summ(resposne.data, 'amount');
						abp.ui.clearBusy(".panel-default");

						callback();
					});
			}

			var summ = function (items, prop) {
				return items.reduce(function (a, b) {
					return a + b[prop];
				}, 0);
			}

		}]);
})();;
(function () {
	var controllerId = 'bankOperationsTenderBidsCtrl';
	angular.module('app').controller(controllerId, [
		'$rootScope', '$scope', 'abp.services.etender.address',
		'abp.services.etender.internalAccount',
		'abp.services.etender.allBanking',
		'ngTableParams',
		'abp.services.etender.invoice',
		'abp.services.etender.organization',
		'abp.services.etender.act', '$filter',
		'abp.services.etender.settings',
		'abp.services.etender.numberConverter',
		'datesHelperService',
		'$localStorage',

		function ($rootScope, $scope, address, internalAccount, allbanking, ngTableParams,
			invoice, organization, act, $filter, settings, nConverter, datesHelperService, $localStorage) {
			$scope.ng_localStorage = $localStorage;
			$scope.invoiceInput = {};
			$scope.invoiceInput.amount = 510;
			$scope.regexNumber = $rootScope.regex.floatNumber;
			var reloadInfo = function () {
				'use strict';
				var getInternalAccountInput = { userId: $scope.ng_localStorage.userId };
				var getInternalAccount = internalAccount.getInternalAccountByUserId(getInternalAccountInput);
				getInternalAccount.then(function (resposne) {
				    console.log("Внутрішній рахунок: ", resposne.data);
				    $scope.internalAccount = resposne.data;
					var getEndDayFundsInput = {
						date: new Date()
					};
					var getEndDayFunds = allbanking.endDayBalance(getEndDayFundsInput);
					getEndDayFunds.then(function (resposne) {
					    console.log("Залишок на кінець дня:", resposne.data);
					    $scope.endDateFunds = resposne.data;
					});
				});
				$scope.fileVersion = Math.floor(Math.random() * (100000 - 1 + 1)) + 1;
			};

			$scope.print = function () {
				$.print('#toPrint');

			};
			$scope.linkType = {
				'restOfFunds': true,
				'history': false,
				'bids': false,
				'invoices': false,
				'act': false
			};

			$scope.bill = '26007212003867';

			$('body').on('click', '#bankingNavigation>li', function (event) {

				reloadInfo();
				var linkType = $(this).attr('data-type');
				$scope.linkType = {
					'restOfFunds': false,
					'history': false,
					'bids': false,
					'invoices': false,
					'act': false
				};
				$scope.linkType[linkType] = true;
				$('#bankingNavigation>li').removeClass('active');
				$(this).addClass('active');
			});

			//reloadInfo();


			var createPDF = function (params) {
				var invoiceNumber = params.invoiceNumber;
				var d = new Date(params.d);
				var innOrEdrpou;
				if (params.buyerCode.length == 10)
					innOrEdrpou = "ІПН";
				else if (params.buyerCode.length == 8)
					innOrEdrpou = "ЄДРПОУ";
				else innOrEdrpou = "Код організації";

				var buyerName = params.buyerName;
				var buyerCode = params.buyerCode;
				var amount = params.amount;
				var quantity = params.quantity;
				var amountToStr = params.amountToStr;
				var vatToStr = params.vatToStr;
				var isVatPayer = params.isVatPayer;

                var curr_date = d.getDate(); var curr_month = d.getMonth() + 1; var curr_year = d.getFullYear();
                d = d.toLocaleDateString('uk'); //curr_date + '.' + curr_month + '.' + curr_year;

				amount = parseFloat(amount).toFixed(2);

				var docDefinition = {
					content:
					[
						{
							table: {
								// headers are automatically repeated if the table spans over multiple pages
								// you can declare how many rows should be treated as headers
								headerRows: 0,
								body: [
									[
										{
											text: "Увага! Оплата цього рахунку означає погодження з умовами поставки товарів. Повідомлення про оплату є обов'язковим, в іншому випадку не гарантується наявність товарів на складі. Товар відпускається за фактом надходження коштів на р/р Постачальника, самовивозом, за наявності довіреності та паспорта.",
											style: 'warning'
										}
									]
								]
							},
						},
						{ text: 'Рахунок на оплату № ' + invoiceNumber + ' від ' + d + ' р.', alignment: 'center', margin: [0, 50, 0, 20], style: 'header' },
						{
							columns: [
								{
									text: 'Постачальник:',
									width: 100
								},
								{
                                    text: isVatPayer ? 'Товариство з обмеженою відповідальністю  "Е-Тендер" \n п/р ' + $scope.bill + ', ПАТ КБ «ПРИВАТБАНК»,  МФО 305299 \n 04119 м. Київ, вул. Дегтярівська, буд. 21 літ. «А», \n код ЄДРПОУ 39484263'
                                        : 'Товариство з обмеженою відповідальністю  "Е-Тендер" \n п/р ' + $scope.bill + ', ПАТ КБ «ПРИВАТБАНК»,  МФО 305299 \n 04119 м. Київ, вул. Дегтярівська, буд. 21 літ. «А», \n код ЄДРПОУ 39484263, Платник єдиного податку',
									width: '*'
								}
							]
						},
						{
							columns: [
								{
									text: 'Покупець:',
									width: 100
								},
								{
									text: buyerName + ', ' + innOrEdrpou + ': ' + buyerCode,
									width: '*'
								}
							],
							margin: [0, 10, 0, 0]
						},
						{
							columns: [
								{
									text: 'Платник:',
									width: 100
								},
								{
									text: 'той самий',
									width: '*'
								}
							],
							margin: [0, 10, 0, 20]
						},
						{
							table: {
								// headers are automatically repeated if the table spans over multiple pages
								// you can declare how many rows should be treated as headers
								widths: [20, '*', 'auto', 'auto', 'auto'],
								headerRows: 1,
								body: [
									[
										{
											text: "№",
											style: 'tableHeader'
										},
										{
											text: "Товари (роботи, послуги)",
											style: 'tableHeader'
										},
										{
											text: "Кількість",
											style: 'tableHeader'
										},
										{
											text: "Ціна без ПДВ",
											style: 'tableHeader'
										},
										{
											text: "Сума без ПДВ",
											style: 'tableHeader'
										},
									],
									[
                                        '1', 'Надання доступу до онлайн-сервісу E-tender.ua з правом користування програмною продукцією E-tender FE v.1.0, що своїм функціоналом забезпечує подання тендерної пропозиції з метою здійснення публічних та комерційних закупівель товарів, робіт та послуг',
									    '' + quantity + '', '' + amount + '', '' + (amount * quantity).toFixed(2) + ''
									]
								]
							},
						},
						{
							columns: [
								{
									text: 'Разом:',
									width: 105
								},
								{
									text: (amount * quantity).toFixed(2) + '',
									width: 100
								}
							],
							margin: [300, 10, 0, 0],
							alignment: 'right'
						},
						{
							columns: [
								{
									text: 'Сума ПДВ:',
									width: 105
								},
								{
									text: 'Без ПДВ*',
									width: 100
								}
							],
							margin: [300, 5, 0, 0],
							//width: 200,
							alignment: 'right'
						},
						
						{
							text: 'Всього найменувань ' + quantity + ', на суму ' + amountToStr,
							margin: [0, 15, 0, 0],
							bold: 'true'
                        },
					    {
					        text: '* Операції, звільнені від оподаткування ПДВ відповідно до пункту 26¹підрозділу 2 розділу ХХ Податкового кодексу України',
					        margin: [0, 15, 0, 0]
					    },

                        {
                            image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACcCAYAAACQoXXqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAJAqSURBVHhe7b2Hg1RVtj38/Qe/N28cUSSZcxjDOMYxi4gSBMkZSSIgIIgKiEQBiZJBQHLOOTQ5dTehc47VoXLVrbqxwvrWvgUzL+i8cURRqI3X6q6uuvfcc89ee+199tnn/0NSkpKUG1aSAJCUpNzAkgSApCTlBpYkACQlKTewJAHgskSjUfs1FoshHo/bPyclKde7JAHgsojim6ZpK38SAJJyo0gSAC5LMBi0QeAKE0hKUm4ESQLAZRGrf4X+y2tSknIjSBIAkpKUG1iSAJCUpNzAkgSApCTlBpYkACQlKTewJAEgKUm5gSUJAElJyg0sSQBISlJuYEkCQFKScgNLEgCSkpQbWJIAkJSk3MCSBICkJOUGliQAJCUpN7AkASApv7qYMRNmPIKoHLEoYvbBn6N83zJhRS3+LL8nDpPvy2djUQPxuBw6P68hzvMk5edJEgCS8qtLlMprUZGNmAVRYTUGhONAJB6nwsuS7BgVPA7+Z79asZh9yN8NvqfxO3LoybINP1uSAJCUX10itOYalb/CbyCjVkdKuYbtBSq+Px/GikwTi86FsThVw+ocyz52l5pIKQ3hvEuHKxJBiAzBovWPxYzLZ0zKvytJAEjKz5JYnBY7HrUV0qbqpPN63IQeC0M3fNCorGEzAsXQcDA/iLmpIXTaHMZzk4O4/cMwbv84gAZ9vKjfNYiG/QO496MQ6rR14onhFu4dZKH+oDDu/TyCu77wosHIIO6eZOG+iQYarzLwZXoEqzODyFZ5fcOEwetYJpmDGeY1Q4hHdcTpUohbYVoWDCvBLn6OhEIhAo8wlOujZkQSAJLysyROABAfXvx6gwCgCwBQ8Y4VejExxUTPFX68OiuAuz8N4fZBBu7oFUDdztWo834t6ndScUc3C/Xa1OD+3n482suPv43V8eyoCjRb7sM7i8O4s4sTt7b04PbOBIyeftTrFEK99vxexwAe+iiMewYaBIgg/vaVCy2XBPDpNg2bcmPwahpUI8K2xKj8BtvHn+24w89T3CtFY66XsnFJAEjKzxMqvByKoeNchYYhGyrx8Dg/bv1YwZ2DFCqtB/d1opV/y4W7Onnx9AQDD/QKoscyHQvTTWzNCyKlKIhSsvnyOFlDNArqLWIqwYVW3RcLIbXAi41Hglh9WsGsIwY6zXDg1c/y8OoEF27rVoIGXcN4sBmBoKeFm1qXo95ADfcOCaHXLhNry0z4oQOWxvPx9Wda7ivKnwSApNxQIlZeovQx0nuLSmpG47T2Oo4XOjFyrwd/GamgYbcq3NLeg/rtPKj3di0eorX/cHUIG3O9WJ/uQ6YzhjLDwDlPEEccFpacVjFuTwS9VpjoskxDt3lhvD7Kg84LDbRdrOCD1Tp6LNTw8XoVw7YoGH9ExbJME/tKDOT5LfiIFIpp4WyZByn5UUw5EMCznxXhjkEa2UUNbm/rw50dPXiKrKLL+ihWFOgoj5DCs/1xg/cTi0MlIAh7iZIh/CtyPSm/SBIAkvIvScwktY8Z0OjbVwf9WHqmBm9+60PdnlVo2MGDhi3ceHZQDVpODGDGcQWnczQUeH1Yk1qDT1ab6L3Miyc/qcWD9Plv5+fv6erHHe1FScvwwqcu/LmPE6+M9qDNNyZafeXFB7NDGLI+gpYzQ3isfwleH6PhLx8H+b0w6rb20ZWoxdMjw3h5jIdswsDMswoyPQqcqgFPOExAUDF8iQOvf1GJ+h3KcW8/spF+fjw5RcfQEyZ2lAYQMMMwzRgsSycAkB3cgJIEgKT8SyLWslY3Mf64C49P9aBBzwAatlVQ950Quiy1qOheBBCCFjKw7qATfxnvx0tTgrijrwO3v1+MB3t48bc+IYy+aOESXQUn9S0gEX3DDzOuIKh6yCpUxE1aWFr1uMWfo0FETQNRsoa4EbOttEtzYtX+UkzbrOOjFZV4YEABbm3hRb2WATzZz4XnhoUwssiDg7UmHPEQr+PDxlOV6Dq7Gg1bl6JuGwV3dVNw73ALry2PYp83ilBUs1nAjShJAEjKf5NYPGLPuccsCzAVWv043PTF110qw9/GKqjfxU0LHsAjpNmjtmr47kg1KvwK5p0ibZ9Xg2f6ulG3VTZemahj0Rkd2zIsHC2Jw+K5FPr4VhgIU+EMk64EFduUyLwRoKJbtoJbdC0MOeIy7x/9ey6ASvcDlheaZkE3Q2xXDCFS8QhiyCpScaokjG/3hdBkdBlazrZQv20ADwz2oRldiFlnYsgIWDhcEMTw5bV4rF81bu8cRoMuITwygS7I9jB2lMXhifISMQVRS6O7Ixc27fNfz5IEgKT8NxGlM6NhKLTGftL9EwVevDLTiVv6enDn+17c9nolBm+LQjPicIY0zDtRhWdGVqN+d9LzLkG8+bUPu/MJICatNxVKjVcnZgh0DTqVSpUsPt0JF5Xaz/eJA/Dzf6O3nYNH/HAe8ahBZzsG8bRllwaJM0aJHFsuVqKUP+uSASTTfXGD6imfI1hBGEOIQKISvKJYuLsG708XwKpBvXdzcW8fDV336zjpC8ET0DBxXR4eHlBNsCrE7T1CqN9XQYe1Fny6zGKYPAdA7kFEkBZcv5IEgKT8N1FjIR46sukjd59fg0YDXWjUy41HP1TQe0UIuzJ05NS40WlDCH/+zIXbO6poNd2DI0UmMisM6AYVXQ/jeKmOhSdVNJ1TRWsdRI4rgD0lfsQ0FV2WOfH85HI4qGgS6V+wy4E/NC3FgYoYdFp1CTiCTIQabYOAzQpiKp78OBczzxjosrkM8bC4BCqRgS4DjTRhg58hoPA9M0rmQgBS6OPn1PjxzUY3Xv6kAvf0dODuATX46JCJPeUhuAJ0SeY58QSB4JaWuWj0gR8PkREsJWvxEFz8MuV3nccGkgBwIwoVJk4lC9v0VocV99PC8kda3kA0hk+X56M+ffxbunlx7zATjw5VcMoZQ6luou/qDNw3jMBAn/vDNQEUBOjHU2lNMgLVkvTeAKm+H2fyLTw8sBhPTFOpjCbGri3Cl5v98FG3p64sQJPhtfCSBZj08afu86Heez70WOiETr03CEIxKp4RJz0gCBhkDYvOVeLzeftQv5+CZ8e57dxhhUpqirsChYQgjiKvE9+eDqGGtyXz/kY0QEtOSh+jyxHXkOsPofm4KtzeKYxGvcNovjoKZ1hDwFAwciFZzDslqPtuIer3N/Ep3QbD9BGQdLIiST2Wk5IT8LwSD7FzmK8DSQLADSiSDCOpuFH64jKuo0aMfrmOVI8frec7Ube7Aw1aufHKqDDWFmqo5WfXnijBs6MduL+vH18sU5HtTgTPQnGLAOKxFdEbDiK9zMX3IzDJAuYfrsITAwsQUyPYcl5ByxmF2HrJjRZf+3HTO8XIjVDbQyY6Tz2KkXujeKhrBn+VFF/FzuDT+S9OAFCoeOM21eLlUflo1FdD0/F+1BIpDAKOZCHG+B0BgOUny9DhWxcatKnGe3MN7Mw0oJkaGY2btD5AkCMY6T4cyq3F259loH7HStzRX7GTh0oIbofSK/DK8BI82s2Nhp28eG6hiY28f4X3KTGKMO9VYg8SozAJKteDJAHgRhQqTZQKplH5wyTPUdNDBS9CvSER3NnKi7rNXHhnBq0rlSXbH8A7oypRp7UPvRdRGWMGlT6ImETlDfrgqgeapfP9OKYfDeL2MWXICJFd0EhKoO/FPpfgIlNPcxio1+o8vj4Uw7QjJu5qeRhHqmhXzRju65OPt75ScXvjHBzxWXZGoe3WXw4Eyn6NFn37/mNXoes8F1qMzEIOzXKU/jnvgoAhTCFMEAtj7+ETqN/Mh5eHO9B/pQp/nGBVEcSmHA3lZDgqP2qvOLTiuFBWjmc+S0fd5rVoOjWC6eckW7AKy1PKUbc9WQ774q6PNfQ8ZcIZqyJZqrXjESbbI/GN60GSAHADSiLSL9Fu0n8rhtEHFdzX24Fbuzjx7EdurE33oyZYi0nb3bh/UBkeGOjH1EMhWtEwrXvYBoGoZmJ3WQhDtnixrohswlRQTX5/T4dTeHpymEpP5eT5p25Ix+hzJvyaHy8PvUQ3wYRKtvFUuy2YcyyIffkluLtDDXIMEx9My0XrbwOoMWUFIDWVllZe4wQEna8HLhQgs5bsQgJztMQRAkTUFCZCy0zAidPafzDhPBovMuCkpue4dHScUor7Jyl47QsnHhvtw64KCypBQTe8sMImwkEnlqZ48OSA87itXQ3aL1FwLhjBabKEVwddQMM2dIN6B9DsOx1pujAn1QZPmz1dB5IEgBtQhDYHSGkvVXjw1qwy3NPNiccnqlh6KoKw5cWOfAVPDa3AnR292HDKgl+XeXJaeSpYgIroKK3ES9P9+Hx/EIuOKni4eyG84g5EYnig40HUp+V8f6YOZ8TCsQsX8GAHHek1CgEgB5+fiNAKK1h5PB97sg3kOnTMPeyDh/S8xKWhUhGaLev/NcTpAoiHn5gP+N8S5z/xzSX+IJ8MWRoebHcAOy7odv7/R8sr8OBHfuwvN1FBl6TnojI8Pt2DiBrE/D0XcJKKrku8QaYW+flVBwpRt2MV7uqpoP/GIDL9YYxZQZfo3RwyAg8e/ULH+mwTAV5HjZLWXAeSBIAbUOKxCPKrLLww2YHHvyjDc+NMZFHJ4z4fus4O45ZWTrSaZcIdciFK31gGezSqoJJWv+f3ecijFRy5ajMm7g4SEKrQdEweLnhprXUDj3Q+ii7rwnhpSAbarrLw9pRy3NLDiYUXQvAZIWgEH4MWXpcpPCNsJ/hYVohWld8nwBi8lkGebc8GiN6TBSR++CGRKD0BgOcEnJi8KQu3dXeijPxcpbV+ptcBPDtegRn0EyRiGDK3Au/MdsMdMfBYj624e3gEK/Jp1Y2g3S4fmUa5owqvjsjEbY0z8fg3OnJVA+foQjz2YS5doxDqtq3B9Az6Too/0YTfufzmAOB6y7W+piKB6zgptHSnzK9T6UL88WiRhkeGV6Lh4CBarA2hyBNFbkUAr8zKxX2DQxh/UIVbiSJOhQ6Q7ru1MFbkOrAzNYiOcz1wxnVUB5zosqAMI1OieHawm1ZRwcVwFI92O4daWu+1RyvRa56C3SUm8qtJu2NB28rKijwjpkE3dZ6fjINKpxkGSpQgMhQFF0jbjxepOFNl4pLXgiMasV2CAHU8KjciwCCBS/4odQVUsgWLDEASl0K6jtHrilHG9pqGhlk7qtFxtgNufv5MkRcN3j6J2by3lce9qPPuRbSfrqH+4ELMOkzQIQMxDLoG8SA8qoUhSwpwZ/McvDzRwA6HipOZpXhuaDoavOvBXQNUjDpDRsQ2SDxAQIj+B7tbAIkN/R2N398UACSV/yqLxT6lj69I8o0Evwwd5WUB3DuMg3uAgl5bowibMewtKMY9/arxQA8XjpZSKc0wLaKX/jUpNhVr9E4//jyGvv5ZFa3n1qBGKvqgGkNmX8KHqyIo56CP0bofLfFi4n63nbUXozLJ9KIVpXVlG8IRnitKBSH9vlhhYNEZDb23qnjwyxDqdK3CnX0VNGhfg7u6amjQUcPtH1qo10fD3f2CuJ3tun9IGA986cZL8/wYlxrFmVAILlJxMyZtddAFcFIZeb8Eg3jYz/u1CBpxtJlShie+8qD+AAee/tCDfFcQj44owc3vBdBynoZ7+xVj+C6Co+3m0KFgn0V5L1AVHD53EfcOLMPNHWow4XQUJvul1axs1Hmzlm6Tjq+OhQgcFu/LtIFVplHtuMTvaAj/pgBA1lpb7NAkCFwd0UlrJeIdlUFKEFh8shr3jqvBg4OofDvDKA+r2JxTjrt6ufDqFwoy3SaVX6ElDNnJPKfKHPg+Uyx3CB3GF+O+iUE8M0HB5gKZDdCwhL77fd1qsa/SZ/vhMSnKYfmoeKT6VHhRDgGds+U1mJXiRbPJATIMA/W6um2Ff3R4AK9OMtF4koLXx7rRcrIHXWd6MXSVHwNXe/DJZgXjtgcwarOObnOdeL5/De54vxZ39wrg9v5hNKJCN19o4rMdBtalRVAhvnyc7dd5XbbBpEtREfBgwREfFh1QUeRTMG3dOdwzOIAuBK67e5ah4/oAsn0EKrIGZ8iPmWfCOFCuQ6ebo2lAkdePxoNTcVc3B0bsM1ARiqPrpOOo85YHt3eqxsiTZEu8Z3FTpACJjF/C4eUn8NuXpAtwHYuwUS0imXQq1uZF8NAnQdRvF0TXLRa8NJeHcjNxR7saPEzavyNHhUqrbVL5VX5PWMPEbeUYsFISeQLwVVfjvhEqRu+O4r5Pi/D2hAgGrw9iwJowXLoHCjmBJuvteUGF9rg6YOKbI348M6oGN7VU0aCNB12+rcXkHSb25loo89D3FoCQuXw2NEoKLYFGi1on2YGy5FinRbWLjAig8B4UgorD64bHNDBheQ46TQ3itvezUK+pAze9Xob6Hbz4dKuJHNNLRYzyuzTnugI/W2RQOXWygr99mo2Hv/DjsXFughcBZLU34ZoYMQzfmo3/aOrHBjIMI+6xGZRpCYMxMHBBEeq8lIW+W53wqR789Ss3bm1diTs/DGDsWaEefrZfSp1x7P5+9D8ZBLyehbafVjiA70/WUskrUKdNOVqujKA2HMGBPAVP9UjDQwNMzD8iSkbKTkrtDun4ZFMtNhbrMDQVb39RQz+cwEBr2m7yeUw6aeB0aRV6fWthf4lKH55swRQfOsZDw8GyagzaFsTDA6rw+DBa+PEKBqzWsPx4GN4IPxMLXG7dzxcBifQ8JzaeDqD/nCq89EkNbmtRg7qk9y1m0eqnmXDQsgfDUq2ISk7WUujz4utNHrQj/W/UsxorMyI4k+/Cu7Mr8OqsCjR804MiIqBOup9XFYSXIBLlvbn4vRcGFqJh5yp8fcqA2+VB02mVuLltEZmAE1Mv8TsRuiG6TjAjIPxOJAkA17PQCrpcNWjwsRt/bOZDi3kGUUHBueoA7uhagAdHRXA+HKbfS58+KtV4DJSGLEw9reO+HqVov9KP+z93IouKG6b/PmdFPpp8byLLH0c45rKTeKKGRZcBOFBRhhfnF6DhQBN3tqvC5MMhlJNGS+qvocfsmIAEIiQ56KoJXUYpJ27KYgBa6ZgWwJECN9otKsQt71egQTs37v8khA25OvxqmABlIkYw0GTKMqqgoqYQ731nolFfJ25qXoM3x53Be9/KjISXn1Vw92dOzE6J2YE+ATiYDjSZXomG77nwbXUMjqCKezsfRb02EdzRU8P6cj/ZjAv2SsLfiSQB4DoWiwra9bs8NBqi4cUxGrICAZyrqsZLkxW8OTeAEw5JcY3aOfxSuDNOaq0aCmKqG8dzyvDRCg13dqvA1kJaTypNpT8Et/i5/EyU1FglYJyrVvHB0mI06BXC38aEMGGfiko9oeiSCCRTe3rUz2tIbr5BoLl6lXwloSlKV8Wu98drGbyWzAbodGP2F/nx4eIqPNa9AHWaleOdqX6suBiy1x9YZCExMhclFsSGw3kYuV1DSpGGB5tdxJwsAgXdmFXnclCvSy2e+DKIofsN1BAErEg1PKEo2n59DnXeLcHsc1FcKg+i15xcNGyp4PGRYZzR+LmfWXj015QkAFwHEqPFici/uEyH0RLGnaSuJnrPK8HtA/x4Y76K0kgUG9OcaPBBLfpuVqgIoBUnSFBx7Hk1Gi3JuzdiCsJxWQ8fwYyd2Xj9Ox/6rRT6HqHCa3aATde9OFKqoufSatzWtRrPjQziVBmVXnL3ZV2efa7I5dZdG5HpT8vQ4AupmH+0GI8PLUH9djV4/nM/trDtIUvcGqkIJMufdXyzvRr1WpQSFHw4W+hBgy7ZaLIyiuPlYdR5+ySOVCn8jsHPhuEsd+LNb8tRp5Ub008Y8JIFvTymELe1C+L+oQqOeAhGltQs8CLOvylsj8Q5fovTA0kAuA4kyCOOAOIyQI2YnR23PrUK9bpV4eHPDJwgD891RnH/B8V4aKKOgCEbcBiwl7rKoJQYlkxfcajSTvM8OkFFx4KMUrSYrSK1VlbmkcLb7yuYfawcN/WowJ2ddPRfa6CKYGHFwkI5eB5ZYyi79iTadq1E4gNxmRGgG0LXH5rpw4xDHtzfLxeNWgfQYZ2OWt5/SA+w2SbC7LtZ62uw6KwHz47Lwz0dVdz/qYqnxzjwp7fyUKL78O76CGp1KXcuiVEG3vriJOr1DWB0moaw4kRjMoPbegfwynL2F8GHXWhXOLJThqR/foOhgSQAXAcig0yKVxjCAEwV1SEdT42uwh0DDAw5YiKzJoi/japBow9cyPVK1R1hDfSfSZ9lTX1MvmfjgCx1lcQW2X5LVti57Ow+i3Rfct8rCCR9VpShAZW/xbQgxp414eH3ZQ1+TE+Ahl3Fh5QcPPe1FM3UyVjoHgjQ2bMNcboJCjxhH9pOLsfNTfLxxlQf0kIxuigSB5H7CGDJzmN4oKcfBREDc/cfxssDFCxLNbEnJ4gGfS9h0H4LKmm+YvmQctGBFyaV48FPPThbFcHBSyHUa3IKDV93YEaerFYkMMQtPh9ZtyDM6LfnGiQB4DqQOLykm0LnZS7eg0cnnEejHhb+ukBFSSCGx6fX4qYm5RjPwSsJLhLUkoDfsQInyiJUdNJgLR6SxAHbldA5UCUhBgQAWdUXpfWq8Pjw9FeluK1jNb45rSIgik9Q+Fer6f5WRKOL4zOi+HJlKeq3pov0QRm+OaWS+ovrQ7AgkKUW5hEsZLVkGCqBYXeFG3Xb5qDfnggcfgOnnH7EVZlZIMgQel/plYlGA0PID4fRc0o2GrWqwRMjPUgjUETJLHzCrgwpLvavUYBfc++BJABcBxKjzy474kgdvaXHS3BLuwj+PEJBumHiXG4Fld+J7vMV0tcQlDitOS1izNAxfEsB3l4WQb9FpdjplBVuCXdAltdqHNoSr5OU2h2FQTw9qgIPcpAvzwmT3sqGnbI6UKz+Lz9Ir6bEoib7SrcDgSfKnHiicwHqtcrDp2RKtRqpu0x5ymcMA85KJ6afVnBv/zz69z68Mz+IlVluPDXSgW/yCKSWl4zLwMKUDNR5z4Heq8NwxUJoP/sCGrT0oek0je6RfI7Xk7UPEgf4FyQsMzP2DMcvzxiSAHAdiBT4kMUzTsXEE8NKcG83L6ZmROBXgCc+PoPGozx2DT6fjCezBmS9WHi8CE9OdaN+xxBe+TKEMAEEcY89hy1FOOP063Vav+/O+dCgUxrup697zB2FRSWRKjnUfpsByJq935MYvHfJVpRpzVgoAg9dnCbD03FT00x0XCtBUN5axM1711BWVou7uhXgyd4GGnVXULdLAHe0UtBnrQW3hE8kYcmUeIOCj2ano2HnAJaXGDhbko/6TTJQr20Y487FYKIYUZky/Re7yrw8VZpkAP+HXKFJvxZd+q2KG2HouoYRq/NxzwA3np4TgTsSw9dry2ndirCqgFSdVkgi/HY9TSOMfbm16LGsCvcOCOGhIQHsK7USi1v4OZneszQLBzLKeT4X/vypgjXF1IyYToIgiS68KH+N8wfZG/B/PQN5ufzjb07o2iT8cQId2ytZkgUeDYPmXkKDthfRc6UKX1iAIETfPYijl5zovcrEfT1KcHOXCrSbLGXN2I8GyX9U2JAsPQ5D8brQdFIJGvUL4JJiYdiKHNzSMgePTfTjvN8io7DYb/9aDsSvOZ5/9wAgNEmn3/ZrddhvUWJaBPsLVNzVrwx1+9GH1UyUBSw0fGsNXptFhbY8koND+itFNgOQ/fss+u4j1ufiozMxXHTGUUFaIFN3UnzDDFH5c7NRv4OGRl0dWOPW7KzCHxZRIkndlcEtn7lyECF+45IIfkpeQBQaqXyzz8/j9pfLMWi9QoZA2k60jJHlpDpCuK3NQdzTxYNaM4I5p6rxxOcWnv9aw9qCkD09aJgK9heaaNA5Gy1Xk32pYTzSegvqv1+FJzex3wkWAqC/NbkuGIBQphsZAAzS2PbzMnD3iAh67LQQN5wYuKIEj41UcNLlsVf8yUKdGK2eVNoTV9TQVRS6gjgi1kkP2tl08biKMJHiVKkXTw6twl09AphwVIOX55dZgh8SAWBZyy/psrbPyvP8lgFAWvX3QwCAbZblvFJezOkPotOoM/Tfy/H9BQXeCPvJlDl9Hf2nlWBVURQ7j5MRDa/ChIMhzD4cxvNjXViWE4JFEJDEqwmbawmaZdhSbuBwrob7OhTj9q5+rKqI2Nf7rcnvPgZwBQRuBAAQC25vVSERelLUMO85GjNw4ORx1O0QwIMjdVz0R7EtOxsNB3ow61QMVRLwIp1XJRhFuhqSKTuZHrMHvUKaS+vOwS8rByU4uCUzTP/1Ah4YGMbkbJkN0GARGCJCX6WLeUiNPnuvQF5bqvfOnX4Ee7Zm87z8o/0cZBpQWvzDcuVZ/c9nZhFlwnRdFFpZG3CEkdj/rp7Yp/2vhw1aidiAZTnZpyY+mJGFRu87sa2QljwatBdJWaqUAlPw12FncNzJvgiH6dermHrAhedG5SNKQFXYJyb7q/k4BxqP8aGanx+8Ih83d/Wg6QQNtTy3xFgkUVD2WJScCxuK+N+1kmQQ8HcksagMGVlzLtRU/HFabL8bjSaUo2ELL6aeiyGjPAf1h7vReU0UjpACxeBBpS83fHCHJN9fsvxo8SEzBzEYHPwSoBINkCIdr32aifs6u7DcrvNnQRPfgdaNSHFZYwRsDbpdiv29ZfNz8O5r0xDw0a0gEyD94IeUf2lQ/88od5S/l9d6UOH2U1HkXFJkg/d6+e+/pEiFP5nZYLeiwGXguT4nyIB0bCyRGRMPpAS5l016ffARZLBfJY6gs/NOVRnYdrYap52SAsx+sUws2puBP7VyY0Emv+OqQd1mJur2dmFWWYwMSxKmCMrsKwFAexLVZk3XRpIA8DsSsVbxuPjjERlDpO0KFh4qxa3Na/DiJAMVBIix6wtQ53UnNmZLgYsAKWwEXywrxOuzvfjruBpcKHciyy9z3H4O7LC9dFcCYV6VlmtOLn1dFz6mD+wm7Q/FqRC09mL9Y5IJeBkArpTwWjDtHP58zxfIOO+n9aaFtK2pWH+6AP/CoP6fDEBKlZk0/QYPCS4KmPxaACBlxWT/AKlHqBtBnMkrwL09L+Dxj4M4FxLllv0KA5izuxLt5vux8LxsoCK034ddqZW4rY8fO8oIrmYYqqahUatiPDNGw3lXCA2GOdCgWTWazrFQJBF+y0Umxnsn80pUFrx66yN+qiQB4HckiSw9KpoomRmCYql4dXIZ7m6vYlw6Bx4V+rkhuXhmiY6AadCaRZDjq8V7k4PwaVG8NsCBe9t7cfsHCs76Ja/dQFAU2tAwY58Tdd4qQY/54lqQqpp+qRlOlqFx4Id4XaH7otwCQhFMHXMCD981BJnnSI9l1oCDOUGnedgaK37KP5RcXq/8bM+H22nIAiqJ8hkSNZDIvHxCrL9kzQkgyHd+Dd9Z2EhMk63LAgSAxEKmvWkX0eB9N54bV40SuTWCnsK2vDnkLFptjNKax+haiStQi4++TcMrk7zwUb9DehQfL6/GH971YNoJE+eKQnjx8+No0MXA9BypYei1C5hqZAsGZHl0EgCS8i+IzPdLzTnxIyV7L4PW5baO6Xi4j06Kr+NApY57hhShJCwLXRLFLvdlO/DitwH0Xavib6NrURtWMGJZPuakEgCkPDYV0R3U8ECfPDzWV0G2l+wg7iH7lk03ZGgqtm8fszhwIx572mvh7FQ80KgXVswvsJX2n8n/BIBQKIRMMhAfLaAEHuXbovaSemwzh8sinxX2IQHeQODq1RD4MbHz9ATACHSmZdmzJBL8HLzMgZvfcmBmikFy42d7yIwItIYm06UKdlwKounsctzRPoRbOpRia02E1j2EPKeGB/tdwJ+HlKNWt9B0VAZueduHl2fTdWCfSj1EicPo5HO/CsX5EUkCwO9IhDXKElixjJK4M2lXCW5p78SHmRy89N8HbipA400BWnad/n8QI9bmYWOpicoaJ17vl417P/LjkldD6wn5OBlMFLoAGcX0g0W4pU0NDtjb49IaiX9KAy4AEEOQ19N5fhN+fwSjvziMxx6cgGnjMmzLb7OCfyJXAMC2sKJgFCkuEpNtgnnIX6kCvI78lPisiHxPPm9vCkKF/KVFQMh2OwTs2NEa700qFLm0IJ7qth/3TrbssueySanBZ7Bz51a8NCuEW9+rxOMjdBTFFPQaX4RJ64L2NGvM8GHJSQMNmlxAh7QYUksV1Gt5BPV7WjgYZl+YFu/ZzWv8o4+uhfxiACA39V+PpPx8kU08xGKbpKigP/rn4aV44HMD7qiJbRkqHhzrwfaigOg01pwL4rbWBXh9ehBeU0UFffxRywvwl88y0WVniFaKNJeD1l9dgTv61qLn6hBZeZDjn5TWTluVGAGfIwFBduH1eoMY8uFhdG9/Fp/0z2A7JD6QcAn+mVx59vIqCi2vEu0X4BD28A8G8N/P9V8/f+UcV0OoeqLqcgH5RS7O60hyEBmOZEMaKt0iKroRwJnSdLRbFsaU9AjqNr+A5stNOz/AT+X1OHLRsF0NbuvmopX34pGvDAzY6cFJTwTrT+XDT9fAHzLw584X8cxYHR7DQM+ZZAGdXGh1gMyGv8vSY1mpKAHFayW/KAO48vCu5gO8kUU2pZS9+yX4lH2xBDe18KH5apnWC+HLzdl4bYWBqohobQRnij1U9nw06FSFR4f4sfKiiRCp/bosB4r8ISp/iMZeR+tZBbijQyHyNKqhTAnYGUMJWhqTqr5WEFXlKgb2Oo3Z0y/g6cdGwuMSNQpQX0WZrt3g/XdEhqJ98J8ldB9i0d2I0r2xqI1hPY53Ztbg+/wYpqxZgJua1aD7uiiafJuCx18MYbMvDJP0X5Yb57gD7ONzuLVZMe7ppOH91Toe/cSJv05R7ErBMZ63zbxq3PpmPg5WRlCpxHFH26O4p7eGXJWAw74VzLErGl0j+cUA4L+it2TqJeXnS5TWX5bxyhLeN0el22WoVnOgWrTWnff4sbyI/qW9zFdWqmmoNjR43S70nFeKu/u68M4YF4ZnSh4BKT0HcEpmIeq18WLYOoJBVJbMkmrblF6lekiKq4a9uwvQt+sRHDzgRJtW3yEvmy4GFUfAyA7a/c7A/QoDkJiDZPkJw7ELiLJPdDOC3KIT+FPzGjz5pYaCmiLc/3426rb14vsLBbi5iR/vTPPDzVs24kEYpoE2Y7Nwez8Lt/UM4bZeFeizwcKbE2uQGzB5PgPH8gpQp6eKvktkk1IFb40swj2dTUzKJogQcGSpsj3leY3k2rsA9p/4mcsPRvwwO0OL715+h79fDg7xs3KuK59J/Lv8Ob4Xt8mkJI9IIom8Xv4cTyZNSLTl8nvy++XEFRkMiSPx2QR4yflEGeTacoLE9X9U5ITyObk+rx2lBUgMMkmaodLyy1nZPtDo8nc550+3nBothqWHUFZRjD90C+CBvkEU0Fc9dukimu9VUUNKLoNagnajN5Sh0zYVWzI58OhzSxmvDiv8MMOk/1FZ+hpG46F5uKO3G4EQBz/bm9hzL5Hk43KpGDcyDdOn5KG6JoYObdcTBDyQPfglQBaLCwOQ+f5/1inXThKPQ56bJDGTcst44GFvOS51DKn4RyoVDNrMfphjovmSMI66eO9hC+9MInN6tQhLSecrqkJ4sMV2dFwRxvy1u/HHJg5sKeaz08jECBoHz2h4qE82nppv4KOJ5wjKCu7o5cT2sihZQBRSqqzvjNO4rYsTB4MWdhxKw83Nq9F8iolKtjFu8Jr/RyD1l5RrHgQUS2MrGZ+YDFzpC9EPSXoRZBZf0SKS2lVYIn7+XedB5ZSDD9j+u0W/Vd4X5bZ/50Pmz1GxllLySRSHiiHpmib9N/m7fD4a4/s8t1hV+7oczJIkE5UCEdIWsXL2IJLRdEXBf0xkKocDQ65rkV6S20mQzdQlT1zHsiXF6N1zD7y0DDGpmsNr/lSJkupLVHzGkSLUaR3EB1Nq7OSUAZtq0fuQ7JIjW2+xH6jw3xxx4ZaWJ1GvhRvvTNUw/5KOWTlBUlzSTt7/kVITd7ZPx4c72Me6SipMZWYfyPr18tIoBn94EieO+xDmufp0X4FJY84jqMomGFLxR/qXDbIH7k8Hsl9DZKsO2WJMSA0x0vbvTQnwUeEOlHvx1wk5aDjEwMMDVNRtzf5sVovnRxo4p5hwRSJ4eehptE3hs+PtNe55CFMPEPQIHG99nIp3l4n1jtoFRzSOp790TEezIype/8SDPzUuxZ29XNjnlpLmvDi/k+rhs+hYim/3mah2+fGfPSJ4YKDXLtNmA5PNuq6NXHsAYAeIgtnKbFtLKkhMFETWRAsN5aDT4sjN9SMzS8X5Cwq27yzHxo1VmD+/CLNnlGHLeh2TxjswbGgmxo114KsvC/Hd4jDGjinE119X8HPVGD7sEiaMc+Cz4YWYNq0M3y2pxarvazCf9PjcaZPn1lBVJTSY4ECKK8kxtgWXhyMAYA94+d+PSJyjTKwh9do0CVaSVcZz5RWWYe6McjR5eRvOnq3gA5cMOiqOUI2fKCr7wuTAe2diJeq8Voov9quoddXimaUmZmYJ0MnyVAtn88qgRH34cqMPTWd7MWuPA0+NrcJuB+9N1+zVbI0/PYXHPgnzcxLtZl/bQKjgwAH20eCTyLzkh2HEMHnCbvRsv4/PgN+1g4MyYC/3h638127w/jOJC9DzOWpxlaDFg9RL8ij6b3Tinj5O0vpaPNqjBg5nFEvSXWjQJgP13inDuwsshA0DLSeXoOl6seIqJqyowrpTOvwcoysO1uCOPlXsGyf7jeek8dl9thyNaPXrdXahXusy/PnLEFYV+hAikMjuSgr/vTcoBc994kRx2MBTnxajfucg1uXzmSFMHP0n4+oXlmsOADa7pjIIWnqCJvYdKsXCRaVY8p2CT4enYeb0Wkygn/XJx8fx3cJS7NpWiZR9ZcjPUeGo0OHxSiVbqUJLpeUDMsgadFpe2/oTXGRw23vhcwBItdb8/DKEggaqHTqKKwzMmX8M6zdUY/o3VWjf5ijatj6JgX1ScXBrDfSQKKoMcEkUvTLof0Rkjbz8nceGjSuwZcM+rJifg5EjUtGt01aUlEqhCYtKJn68BO5+OgCItSgL67irfSoavlmI7TVx7L1YgPu/iSBPfAtadyl2+eqSKnRdqSE7pKDFmlKE1Aiyq6gE/JtCJT9dEED9N1Pw0feJDTNk4wtTVzBuorQ3AzV0cqWvDh7Yh9aNVxNUhH3QekpsUKJWNhBK3/BFjt+gWKKc9LF3ZvrQfIGB9+d4UEuW5jcC+GxlEW5qnIe7OleTIST6ZeKqKjRsnIE/tnJgN8fFrJ0Z6LtfGKcYI4nY83lZhfCpMTR4+xD6ptCxYMeIyyXsUtMdmLbXiUcHu9GoQ8hmF6OOWuxv8qWYFx9PTMEfmlbjSHEUuw/uw02ta9FvA/swFrBH17WSnw0A/9W/j7HDxX+0683Rp7TECnLASSdL9VmPN4T0VDeOHvFgzuwcjBmVgenTqzDn21IsmFdhK/iOzUVIO+NHjYN0V3RK2IFNNQUp+HIVB5wUsBSq7nFJfrzBQ0NlcQgrVhSgR5/9GD60CGNHFuPIoSC8Pv6dDzwuDOWyEvN/iUOy5fi7HVUmZ0w/lo5X/9IYK+eexMK551BWRt+ZfWCzHdH7f5M667S85aEIHmp/ilYsjEqeYsSBAFrtJgCK+8LrG5ofi/NNjNnqQZv5ftSjZfp4XQjHKvlMTBf8vIdRa8vxn03LcbQgagfBPOEAps/IwOzZpbDo24prdOz4Jfz14W1kAgG2nfdrt/k3JhxnsoxXo7L7+fzE1QpoKg5XuG3f/pmJAdTpWIHb+4VRt2UOdpVLxR8LGVUG6jfehkav52FqpgRR+XxpyRu+uh0NXr6IT1JkezrJuOQl+MwSuRegU0FXkUyozdSLuKO9hnLZT1AnQzUjyMo6jbs6uVGvTQXu/MKFe3q7cOegEE4E+ZD0AA6zH//zhZ2YtM9A0OdDnTZOPDWJ7Y2HErMv10iuGgOwg3My9WH77jFE2GEltND79gXRq0cKxrBTBvXLw5SJmdi62YEKoqz4oxK8k2ioPATxjWUBivhpiRVnEkyTGIEoCzvpKgOAAJYd7OMhde/idu47lZwDS0pC6YaGtPNlmDIpG41fPottm6R+Hi2x3CepvE377eBBAvRC9Pc2bSlE7zancfEcfbyaGjuvRs4pkXuv38Vr8CsCav/GjVh0HZbkWbizeQnePSaBuzgGba3GwmL2W4xAy/bvKHDRV6AiUxlCmoWNF0082qsAR1UBCJ6Er88PPoMX+xFkpQ1qEEM+v4CjB9w2lkkKrEzavPnCSqSeraHCBPk8+Yer2O9XS2IEPHmGshJPiznJdHS0WF2GO7+M0Oeuxr0dqrH9QgTuuBu7znrxypQylJGWy4rITuNT0eClbDy9lsyQ49UXt3D/K9/hpmcKsLKYz19qLcvDkj7j7UuWIJ84AUHH1v1nUeeFcozLl3RrHSrH7DebpuKtpRoatDqBRz5ScEcHDxr2iWBPuWGDRsgM4+4XvsVLk/lcLB/u7FaG+3qH4VY4buw42LWRqwoA2Tk+rFxegMEfHsVXn2dhOpFyx84iFJWpUHXTZgA5WV5aKQnEkQZfpucJ1iDBvsTPthLSokn0/Mp04uWrXD6ujiTOfwXh5We5prRFri9ARotucYDFg8jJrcL40WcxbEAmMi6SOVCbJEZgT5vxO/kFCkZ/kYHF8wt5Typ0NUTXRFgDv08Fss9PoCE0cjzxOpfb8FNE9tLvv74cdTvWYJvbQnFIw18m5CCPLCbOASaR/OE7qtHvAvuXbEYlA7N0D9afK0cNB7jci7s6SPpZha8PqyjKc2P8onQc3kXg0xPrAsJUor7d12LSl2lQ+XmpdmOznd8gALB3kVmtYOweLx4a6sJXF0I4lB3AS18cxK2NHbiraz7KbAsdsusYGnqIFjexFXi+z8LdrdNxS6cq7C82Mft0DRq8mYqHBlcjOywMQDIV4/TRxR2SGBXHqyUsLIaAswL/8VoVun8rMypyPh2VFbV4a4yJ9TlhrEvNR8tpbtRtp+BiyMc+5PMgUHw8oxD3dXFBpUvQ7KtC1G3txeCLMt7/ndFwdeTfAgB62jY4yk+iMJJUMmncAXz2cRoOHy7G5HHHkXZKoumkjhKG/Q0Onn9HCA3IL/Ni1PCLOLJfkj00nDpTiPmzK7B1Y4AWXqK6UpX/SpT8p9P8fybVYQOPdT6OR8foUEixNmeG8JdlUYTIRDQ9TEZlINNTi6k7sjD5nIL28514dpwbXVbSxsggpLXcuOMA6rYoxbT9BmZ8XQxPdZgDmDSUQGzRvfls1GEMGXQcmtBS4b38jk0N/i3I+mmSmN6VSTtZgSiHJOtIbUKyRVr7MBVXip+cc9RgQoqHFNqL23s7Ub+VG/d0DKAmwjbrMTg8DtTtXoiGnTyYfUS+G8TC40GMOih7IBp2gU4B5mYzPHigYynu6+7G7R9Vov23LuTSIks/cGBzjEt7JBMysXJffpf05QD7o+tMugvsx0yBIbohbhqw5fsy8HAfJx4cEMCgdQFkByIcI7KKUBigiZE7/bjlzUwcrI1j5bkw3ZASvDCPo0qY5DWSfxMAFI5vGeF8VDLVRQRr3mQWvNWk7zE/30usFZd14/a2CNcO4K6qyIOKEvHXrTuOvh8cxcxJKoYPPYbySg5MDlCJkkvgKaH8cojiXD1JC8bRoPUpPDEmQKAxMPNIEK9sEEYRsOekCwMW3l5dikMXY3hqmgM7w7K/fwC5duYK2ZUVRI+d5/FIs1KM+9aNIAFLAqcWGU6MirX3RBreeX0vwYTnFHYjKE9Ak9jF30nYLykyhWkrnVBtYU0h/kBLrGoI0L2CUY2JKT7cNtDAbe8VoNeGKDYWRHFn62zc9pwDs88TfMmG/PzXfXwK6jQtR7OZZDohJzqMp/XtpqCEY9WeKiZbmropB7d2KMa9nZw4SfAwLjMpmQYWlmY/Q2F4bBd7IOGI0jWVdRdpF9Px/97y2CXBZIGQLJmOahF4+V0ngUoV1iCHKbEfumccH6VaFPc0T8dnJ2I4XRlE3Xcy8ehwC3625VrJVWEAFh/UnJmnMW9GKRFWCipaVAQJHBEohAD8KqPnlxe5jYAawKaN1Rg06CTefGUdqitlUQ0pPS1sTPIWCIiJmIX4zVf3vleeU3FT81w8NZn+KQdZ/435GHaCykoDoscCSK02sKFQw+ILATRd5EXLtVE8PboUl/wytRVBtbccddrmoO2APOgGn40h/mjAbv/51HN48OF19PurqRyqHYuBDd6i/AnF/KVFNiaxL8NLS6BVIficdqgYvyeAT0747M11akIBbDhajJvfDmGXR0eYCvvakFzc2aEG789MWGep7b8pS0Hdzum444MgGn3uRGvS9adHOLCrTOJKiW3UKkqLUW9ogO5CKTYUiFtKay0bmXIMS80FUXrJ0pNXuf8rbqJMJ9ZWl+GmNk50nx2ESuBQZG8GuhtxKZTCZyOxCZOuhx3Hst1ccQWDeGbwBTw5j38jw3qw3wk06qEiVTZfuEbys2MAEqwTBdc0DQP6H8G6DT54fbxhdor49FIoQnZlTaztJkpytLIbRT3s47codtkm+oAS8RfEl1fDCCGnIIgxX+VjzUo/Qqofnw3chc2rin+1xRxz9hbhj+9rGLk1CCnt/fayYqzJ/nHFFNr5/vwKDkxyNlqnaXMvoe7DZzA5m7RfZj2o+NGIk7TaxFuvzMO5U57L3/xlRazrlSxLmb0wOX7sGRayEK+ADa1lvqMEzy1249HRGv7Uz48NxVH4qDRS5EQzYmg6ejc+2UdDRCq/PiUfN7evxJ3dK1AR99Evp7sU0vD6lydRt2keWm+hwvIaZe4w3D6nXc6bCGdf88Plh3HbOzVoMd4Fh6CPT6ok8TOCqjFFdkdINPoH5Cmyv9t7aCgUtkTAIg9g+9hGjn3ZXtwQJsXriEch09Ry3benuXB/F8V2m1+bVoaHO6pY4RCwvTZyVQDgSrDO5w1gzvSz+Lj/eRw6HILCm7aDanxIUsnGVn52EJ8FBwAR9RpGP/+ZJKb6OLgIXmbUD0dVGCeOhbF4QQkKCyXP3m8HxrLOW/i4+1kOmF9nJveLZTm4ubUHKzI4SDlWX1vuxT7HPwEAdvQZtw8OumbjRx7BjIU5uKmrCyku3p/9POTZAbOmHqM7kwlNKPevITJeOAZEtRIzPdKnJlKKQhi+twZfHPSgoLwCPddH0bBPNf7YvgjrsiJ2OEI2IzHoh+dmZKLJRI0cJYxqlwsNRzhR7z03dtDC21PQBPA+q6pIs0vxyEAfXQheg+Aia/BTq3QsPS+JPFFUl1ShTusK1G1VjR6bI1iRy3EsiVH8nMxkieX+Meky9iBubuZElp4AMaH5koAk+wKqZFZaVKHiJ6bBE8FCFb1WVqNuswqUEJRbL/WhYRsvJmX8Ogbkh+RnA4BY/yuResMMChDi0oVafDXyGPr3TMd33+WigA9Wo/8jC05koYrN8QQFfnzsXlMRQyDWMaRrOHEihIG9TyHrkmpHkyVTUXw6WSMv6+F7dd2DKs+vQ+Haf52BWzr6sCpL5u6jeGCGgqP+H7+2xxvDM2MuYOKQS8jLjWPw5jTc+motihWp8CMJLHEcPpKDxi8tQShIv1hy+38FkbFiK78dLKUyuy30XJKHe7/0o373IPa4EsVBI5F8vDu9GLe858Qbs70y/wqV7EyjhY3yGTwzOBuX6I/HyGA+OXAejVoGMGgfAYXvSZAvtSKMh7rwvG1dWFZCVifRdoLe4kMK/jK8EuVkbu5qE3Xez0X9N4rxwiQFK6vJZg0v2SsS1v+fGOf+4w/gD2+UIyU/sSGr7Mzs4vifctCHAoW/08WafrCQgGbQz1fZ5zGMWJmHm1uUYktBFD2WVKBe8yIMS/lxlvFLy1UBgCuv9jQarbr4wlK5JhwysWt7KWbNyES/Xvsx/st0HNjtRuYlA6oqUelEp8ghflliOo6vPIRWCxWXyLD4XPYCIZl6E0p+5VUCRfycTHkJsMj3JYr894MPMOFs/LAkPn/5e7avJohv2OmZF7KcmDHZiT07VARDksEnjEBcGRlEcr+SQqvg6/FnsXdPzeUzJuQKIF4tuXKuFz8/g/rdXNgnS0sri3D7TAsnVTIqtkscK0lNrap0YWuVBYUKXkS20v7TM/CUJAJVbWc4cE8X2RcgZoPXpYvl+PO93yDjgkxVJb5/tUT6yZC4SDSMkPQxLYPkWkiE3clnvy+H7tQ+FUtKg6jVTEzeX4b7+xTjHlrURVkxeHjP8aCO7w65cPPrpbirnwK/pkCzpyVp4WnR+08+jW9OaDQ8srlHLeq2LMUDHznhoUUWt1PA4vVhubivYy26zpTtvTW7NsLQbwrxn+87ccwXxbzNp9FtgQsbz1oIiVtCxZdxJuXT7VjOPzFSX65Iwx/+mo3vD8p2KRWQhT2r0nQ8PSEDRe4QBi3MwimC7ZPD8rGfyCDJcN+sPo+bm9bgmzMGpqxNx20tyshUZPzRQEoQWa4pj5vH/1Vt6WrIzwaA/yZ/H/NUJg4mUU7pTIkFyA6yXr+OHdsKMH3KRXw+NBOfE8FHDM7H6E8vYP3qahw4oODMOfrauX5UkspVllmocZjwusVfk2Wb7EQOIJ2aKosxpCyWvWhHFFf8WR62deHDF3fD3uWWg+XHRNwSe5qHWG+7MRwCPq+OjavcGD0sG25apsS0nkzTCFhdeSji8tA+8LpLv9+FhbOK7fNdETnX1ZL/CrAPDii0g0Z7SuOoqKCyzFBRyH4gXrGdbE80iNScfPxpuI7nR9Sg7ks7MGS1Cy4qnhT4fGNMLR75WJaf0lflfbVvvg27NzgSA4+AasVd9rWuhhD+EY6ToLN9etxLQx+DK+rF5MN+vDyxEHU7l+FP7avxl8EcKzpps2Zg4Oos1GlSi5bTg3BQ/0KowXlPGI06HkP99kEMTeWbfOZSDl3AainHy9tzyYZ4LYkvvTfqNOq1dGB6boSUPwwzGMX8A7tQt3Ea7mnqxVeHNbw4swq3tanBm5/7kOWRZcA+MgaPzQx+qhwqJnt48yAGLndzdChQYxbGbAxh6k4v8uiW3PbGKhxx+9Fh1FEcqtTpEvhxLCMPf3gxB+PP6li97wT+1KQYHZbQIPKeJOwoBkkeuX38E+N1teTqAsDfEUAsYMI6J3w8UUYqEpVXBprsKCvzuzLVJPOk3pCBymoDp07V4NgRNzZuoM+3vhQrvi/CnDnZmEAr++WoVAz5mK8jivH5kExMJJtYsUTWBlTg5HEHMrO99AUN0kOCA69h74LDwRfntX9MRHds5OVnqmo82LjOicljy3HiqBca6b/s+SaBtMS9yJGYEhMkEBdAAGjFqiPYvsl9+YwJ+a9K+3NFziGHRKhv6e7BbT1MDqoQzlHR31oRgZftCwi9NGkJaWV9IQ9aDC3B6/0uYHi6gX0lTpj0N2UvvOf75+HxKRIAjGLB3Gz0aLeHYMp7tPshwL76+e29InIq0yD483AHavDZ4QAeG+7ErW9X4rXJYcw5GcZ3KWW4u18Qayukr6M4n5aJm96uRqM+QRx0GjhQ6kX3OR407FaCOi1q8PAXBpwEVwF6etY4V2Li5ubH7Sh6nAxm/mEn6vL8j40m+NCFiNPwpBbm021yoV4LL14eqWPQdyqKfDJNTTZCRiB1/WSdg13d6CeK7BR89zsr8dqMWsQ4FqQU2LGCCO7tnYrXxih4pJsDj/X2ofFcP0JkHpKHsecM7/FVNz7bqWDn0XMEJxWvjvcS6mDHddgRttrLqBX2+0vL/3c1Buk/RM51+XyXf5TT21MoRLeEEskb//h7Qpl4y5ct6xXg4I821bbPIREj+0fx/Wix+RlVoxUsV5Ge6sWRg06sX1OEpYsKMHtGBiaTgo345DRGjkjDhK/yMO2bHGzb4qZiO5GV4UZJsYIAfWhhEVlZQUybfB7LFlUjM9NFAyOWnZSVbMMGLQJKYr98t+3aRMXSUhllvl9YzZSxl8hsfhhk/mnfJjpGfuALGQUH4BWgSfRD4rjiTsiOsbe0V/DoZzpK6P/uPH0WbbdYiS2sNDpeRhB7j9Sibe/TeGuKgi57NPQ5oeKSIolaCgenjmcGSERcxYHtVWjy+npUOwWEhalJ//M6cumfKLbbxsFvsU1S608svivgxuK0IAZtdGHwbh3FioElGWE8PboMdd9zYNpOKqjlsdclhEwfwppmB/fC8SB6zC9Dg9Y1uG+AG699rWDSgSD25wfxxNBC1Hu9BlNyqbgGXRp7RsDA8+3WYXcBQZDK7lE1PNgzFQ+0c6LpUg1LL9CnT8vHsBUqzpXzmgRLqQcg44utZtvlDjSbrdrj7SdKlKzqiTbr8NSkABWXrIrGTMZnTlkYKYURSSa204d5RY4dGS8mqtxe3NK2Bh9vVHHs5HH8x998eGm4C+W8F1mnYBCMpE+lRJkUgf2l5SoDwK8v0n45bEst8QcyC0nZFOZv0hf0ujVcvEgfb0MalszLw6A+h/D+e8vx9OPL0aH5aTR+aRfmfpuDNWtzkF8o+fWX03+pDPRE+RAko1FYi+TEiy8tABBHVa0baSctvPvabvqm/yRS9KMioJFIGhL8kwGYWA4trClxT3JcAQC/34ebWwfw8CcGiiMRbDpKRV+rwkPgcGkhzPk6E6O/OIrdeVGcVCw7n73ZdwQKr/jfQQKZiefG5uLb3AAaN1+II4cICgJ0MvhF+W36aTfsJ0mE9Duq6VAMC1WhGHp+X4K7PqT70TaI+4cFyVj8GCMLbvQQBm5QCGLFaD9FduAxEAlE0Hg5fXtTll/zgdGHXnDMi5vfLcBtTUtwOhS1l/NKwG/Ujio0aFqAtks0Mh72Hd0enSDc/Ot8TD9NNqbGsL8giLqdCtCwqQ/1W5Tivs5+nPfG4JP9EPncZN0DeL6rJRIpeKbzFjz+ldRSkN+EHYqxSDy7/ykSkXJW+fCHtiXoPldF2vmz+OObfjz7sUJQFzCOkRELANAls41BEgD+qVzpaNt/Z4fJgC4qcePI4XLs2VWBndtLcf68CiNMK0krJQGkzFyFVN+LVSvzce50LQoLAzh1ohR7d5Rj+eJcsoFsjPr8LD4Zsg8zp2ahvJzfjdOf5ADVDBMHD5dgwZw8bFhLF2WRE2u/r7QH4k8W6Xe770XpxQcns2H7JbglIQQBhcTaBLnHGNuZj5s7e/G3aRGUECTWHtyPt9dHcPC0H1+NPovvluXQ/ZHAm2FXr5XpJ90IIEBqL9l+smLulbGFaDXfgT7dDttr/e3CJCbbICBD8Pw3CADPbdDtUPHuAi8e+KgW9VoVo9FrDvy5Ux4KaNW3pOWi89YInFoUR4udaNQ3hLs6BZBKQDpbVYU7++fgW7KDGFmKWOIcbwQP9buIm96oweh0spdomG2PI6e8CP9JhX7o/XKk0T2wK+9aKjpOTcd733nw8lQXXhplYWKKjm3pTkzZ7MbDHYvx0UaFMOskeEulX+nbf+cuf1gkYP1Mmw149NOQmHmq/z98+B8SqSbso/t2Wy8nus0Mo7SkEH9qpuKxjw1k8DtSZk0SrySrUMKBCSPxy8rvDgBsd4AKcsXay6IcGb4H9zrxcb9TmDj6IjasrsLGjdWYMfssGjf5BiMGZKEoP05LX4QJI0vgqBB0JfXlgJBDAogykD1+Hdm5cSxeVIzu3b5HizcP4/w5qSxj4sQRBz7pdwl7dntJJTWUVSno1m478jl4DUOWBguFloON5CEBwgS155/EIZb/2HYrRleC35efxW+VXANd1bFmaTbZxLdkJd/DoHtjt4nuh+0a8CR+UsebW1XjpW8iqIhQsY4dwFMDvej2wT4Evfws2YO9QSUVJh5x8nsSLKOPa9CyGGGyBAv3fHwRd94+HhdTZeWlWCrVDqDyAgkGwB/5abs/7VHMgUjzzj+Le0IF4igX9iP0VD4rBspkP3rJmBr2LEOnhSYWHMjGzW9V4J6+NdgXYrt0giOvYVoBmHRjGm8qQJ3mZXj0QxX399DwcAcvuqyS6DyHvICVGseoDZW45c2TeJjujoegIEVPBcCe+bIIt71QgP5rNNSiGGv4bG5+7wxuaUFmky61DvgsDQKp3f863AT8rjNOIyzkguCYoOjygH5IeL/2kfi/gKbc4z+t18c+fqbFGjw4wE86Ip9l3/E9uYSkjMtjN9hJ0qei2OI+1tZ6UbevG32n+1FZXoH/bK7hrg+8SOV1InafiztFd0A6V/r/F5arHAT85UU62JK1BvTDVSrO1s3n8e2kIrtIiGpbelpRK0g2EIDbSz/wu2K889Z2PP3nhbh0wUcLKUtn6dvTOtkKQAUUxTl90o99e0JIv+THhQwP8gpdZAwR5OW78MWIHZg0OgeFBSrcNQbCQR1fjz+EjSsqbOpq6mQI4h5EvBw4IVrrSpw55bAXsfhDPlRVGQiEfUhPr8G2TWXI4Pmz80JIy3Dis08PYkDfQ5g7Jx09es7A0I+OoMYlqwtVnsdAWZmOUIiWMTcHN7VwofEcMpyMGnTvfwyvfHAEnoAEV8WCcvCzb4TS2ynYBDSxdhoHU4zWPhCx8NQby/Bc6y2I0TX6MZFouj32eMhUmlgjG1zYr7LcOaZK6rNABGk9AU9Sv0Wx3pxajAtUdm/Qi9u6OdHwrWJ88L2FGjGNBDSZdRALvOFIKm7p5kW997Kwu5x+shrA0dJKKBEBMZ6TYLq7xkSjVnn4U+OLmJ2aiMmovK+Ju/fh1tYuuxbiJ2diGLetAP/xThEWnbMQkXUPbLRcRxRTpo4l0UeqKBlUKvknJF3a/X9JIv7CbwigCJr8iMgS4Sb9j+KJkR7bWMv2YjL9qRF8TDMIg88tarrs/pNyZMLyJFmu7oel6DVdQUFpEf7jvTCeHB5GNs8nYcgEoxUX4PJD+IXldwcAEngzaYUCgTCWzS/E+RMhPtQaGBx89t72HKQur4XdO/z4YqgDFy+RQtKK9e25EptJ28XS82NUFsVWGonMmvTz16++iC+HFWDYx/sxZuRprF3pw3Cp/9Z4M7ZuLYZbMeEOacgvDpIFFKFLyxPYuaUAG9enY80yqVqUjUH9z+CNl1bgvju/wntNN6F9q+14963NeO2l9XjsgUVoVG8C2rdfhc4dduLZpxfhzVe3Ys7cUkyaWITRn6fjift3Yv2GIuzbp2H9Og8WzathO2px4qhJNyWEW5uV4JHmRWjS+AR69tmHdye4cPJsBHpYhbfGQkmBieoK+sieCKrKolDo/0rKr5T7qnbqeKLRV2i9IUSl/vFBLfYqMf0kwTEvvx9CyIxgTY6OubSyXrFOQm/A/iMQiFWTPQayXV4qoA6Vvy/feRw3v+OgO1COc3RpJBoW4vuyoi/iC+Ge4aX4wytFWJfOAa56yVIk7z/O/lUQ0kzoPM8rIwpxy4sn0W6ejiJZDBS08MLiWjw1y48DZDxxtmtPdhD/r2Um8iO0wLwGcYbgl2A11Dl+hlacwMWHLTeWALYfxT75Q+KP4lLKrIDUX7R3C/oRkSnpl3vuwYtTqf3yn82qCJaGhm+P+dFto4FJh8jweNG49AONjs5x2vCTCnSfTne0IBd/aGPisY8UZPJ8xEC7fUkAsEU6INEhNpUWS8bOFauccsiLE8cqSb0Ta9wl+izJQLm5PiprGSZPPI9du5x2/rsE7zxkAutXZ+LTgVtRURlEXnYYqSdrcfykCwcOVWDzRjfmzcvDN1NSMW3KRYz8Ig0ffkiK/chSjPykAL277UO/rufx+YjT6NgxBU8/8R0GD9qLmTPz8OmIU2jR/DBef347urXfj62bKlBQWIPsbBWffJSCHl0Oom+vHWjxzhaMGnkEHdp+jwlfnUH6OQetqsL2u+H16Rg7Ig1V1V47Gm4XSSFKSb05oZJS3qrSUYvbXj+I257ZhrOlQVSUVaL3waC9F52AmT1g+T3Jl5BpVsmG02UgsY803UT3Xt/hgdcO4t1NsjKNAzLRw3YH2x4K+9b2rmxrr6Aq5MVsAtH7k4txV/ca1O9ejcc/CqA8EiUASG6EJ+FX24xKriX0mwzMiqLMV4M7e5fhpleLsfQsmVFI9iSQ7crouMXD+Hh+Jm5524n3v5cZBC8U2Vqbrsq8A+lYmstWhQx8SOvesKMfD3/qQt9DFip5b2E+R+kfWWZOTwFOgsVjfTejQOPf4OffxGJ7IAnNMv0r92RH0+3blJuzb1Tu+n8LP6cSKGTqUBR2S3oFztGQyNx+IlmMHxEtl1kP/izWWgzIY03m49lxfgKNgEZiGvrtsVl4aVQQHeeG8dCAEnT93oAiSVEmmSKfxZ86FaPvHA2pZy/gD01VPPWhHzk8p70mgrefAAB5Hj/S1qsov2EAkM6WAFgiwi8bWUpx0AM7fRz8Fmo9Gs6dsbBlgwOLZwfwYb8leOKh8Wj64lG8++ouvPrXtXjm4fU81uKx+ybgkXtmo+Gt3+Cxh77CEw9OwDOPTMBfn5qE556eieefXog/PzQXT1Lhu7a9hM9GONCYlnv1qhLS+DDCmpfMwwM/ncmhw3dj+JBjmDUjA+NHV2L/oQDGjc9ARbUJn6bhVKoDwwaewMd9DyAnz4PiGge+GF6OJq/swYgRO1FFSymViWX1oFQkDqkmFs7Nw/bNFTazkWCjsBzbn9dJWnn9ndsL8PyTq9Hg9eNo1L0WaUYcpfn5aLuLbg5HYkgGL60mItXIq6lCrkYlpaJpHKwGr3X6bBUevvtztF2ioONp+RsBlYNdDjtXQgCD15NXJxnR/PNBvDqqFvXeL8Wj3b1YlBbGRdVAh+lefHOeyicqxscj1pUOEa8tTIDUVUoJsf2SqNPp8z24rXEhXp/itfcBlNWLdr1GfnvVhWI0aF2BOzt74RRXTCNl5mvbGXSJDpr2jELj6fkYtMdAjo9MROod/oBQTVCp0LUQF4iMAARBNoLH5Q/8BBHWESUIadTAT1efR/0PXCjwKAhc7hchPQLKMoXI2+WVE7sDP9xkLt6fL0FJMUY6NqWbdNVO46AzTCZSg7Qsum5vO3CgViVJ4bitduNPLasxaGkIB1LO4I/vK3hmhI58opRUMZZcgIT7JsbrRgYAG/0ExfmYaZUK8ry4KIGegJMUK4gjKRVo2vh7vPXqZrR4MwVbN2fiaEo+0s46kJ9HkKhwo9bloaug0YeO4sA+B/p/sAoqxwh1gp0s4MLBbzMLUbgQggELuRlezJp+Et067cRLf1mIUYNPYuTwXRg+aDdp/QYMH7wN+3aX8Zxi+cIoc5Sjzbv78GGvg5g2ORW7d+bzPGJFZeAY9sDOyXYi6KfvTBCz6H/L36IxDiA1hNVLK7BuZT6VPpCY2yajkUUjFs9dUFyKoX2PYv7UArKEIOr3KsUtnRWcDcdQXJSBpls11HLAyAyHrIrzc2SezC9B09MWFqR6sThTtrt2ok3LVVj9vRMfHzLRhqApqcC28lsKfNLNZBnpLnGtaKk54GftzsEzkyrxp7cL8eYHOaii1ZeiF+WqikJPkHSWfcY+FKUR/1oSqeLSZmoJMct2EeZsKscf365Agza1qOKbspWYJtaUwFHqM3Dv29+h4Wsu9D5CEL8QxtufV6FRbxe+PCgLaAj2wuwMSf2VvrJHxP8SsZAyS5BYvkwAkpJufK70uC9/4l8XqdokpeetSA3OlSvYUhLAc+Oq0HedFAQlOEjNBL7KmW3LzHYVc7zUeW0xen2X2EBViytYfiKIRgS3i6FE0LG4zIFbe5ZjTTEZGvs9Lycf//FyDj5aa2Hz/mO4qZkPzw1XUBoh62PncAjwOnLPMqMg3OWXld8uANi8TShtFCePVMLjkUCKBMX82LaxBl99eQ7z5xWhsipBQcUftXP1OQgkgm77f/I7zyMU+ujhKgzutY0PUDqXfxPLYwOAQK5YQaGPicOm0LxWRZkTR/YXoHu7rXj9xQ2YNesiqt0cBER6KaElfqhM3ZmWx/6+ZL3Zy1rFD5UHyOtIhrmdoswBIgNIxo5k4pm00Js2FeL0ySoODA52tke+K2vK9+4pxJCB6zHpq5MoKavh9zSiFvD6F+dInV04VGih3FeNF9ZHURShDaYCxAwvdpcF8GWqipabDPSke5ATieD7tScwoOc+e6bi69RqvLZagmMyGOMIeB2YWcQ2c8B9tq8KWQQWUTiZilyako36jYO4vVs5Umn1TLoZ367Nw2n64uICxO38CHYdrXWlZmBMioFc3q8swpGkmGoi7TOfHMOtTfLRbUGIoMZzx2nN41J/QEXToWQIvRTc299As7kBzD4ZRUk4QiAmMyIoS9KMzmdvz1bwvD8kAuJSa9F+dhK8tA+hJgIG8sLvCXrE/ezvy7Sd79mzR/yeLA4yyUgM3oco58pz1VicH8P4FaV4cHQAd/aycG+3SzhDfyMUJfDRpZTksUTFILqiORH88eVdGLslYIOQBErDBPVO887gpfEqBi7T8crXVXhzTAg+nffN538pIxP/+ZdL+PJoBMv2HsMtjd14bWwIlXyO9nQzB0hibQrb/cO3fVXlNwsAsvhGCoXOnp6O7Vtq4Am7SfU9aPX2bkz/5iR8tLKyXNMmCrZHywf/IyL+cXFRGO2bLSQFVewgmFi7xJCQUSxRXwEQua5YAxmoKjxuE13eX44WTWZDpcLnFvjw7bc5WL7IiUBQouOS2ixWXdpxmVLLSUSkSXbb/iFXknqE0UhQrvP7azjgBaBoeVUfUlKcaPveakwafxgBWhCZRbDvzz6ljr7z0nBzsxBWnIra1WSfmBPGed6biyAje9sHOKjdajWeXBnFuGMKuq1T8MSzC+GpVOGFhm3pNXhzTS0uBagoVPqSynK8dELy4VVMOl6JsQIGVOZwjJaXVr7u0GLUebsEC8kaDILQR/PLMZb+uCzUCdC6GbTQa50O3N07Bbe96ceUfQFaMC+7VaxlDGP2KbjlXfryPbyoJFAgLBF5FcerTLwwuRDd1wZRTrcpTgWV8tt/77urIDITJJWOpEQ8OSOtewgR3UMWUmNvAaayPXG6dC6UYM7mbGystNB0jhOPjozgeJmCu1um4blPdbw34ig+20XCz/snvnDE8BkSzKXu0JIjbtzU2Il152N0w4LsR7osAQO1dMEWH3di0goH1lwMIEDWp3BsqDzHvpST+M8n0/BNahRjNuaiwRsOtP5W4/ORGAD/J2OIY1KucEMDgEwvnTxbQdq9F198ko0Rw/dg+eIsO2Amy1jFitvoT9pla4lA/o+IgKkM8jdeGYdqDj6DSCxTPLbGy3d5iJWxS5hJsIoavW1zAd5+ZQ6mTTqIUFDYB69Hiy8R3orKAFasqMa6tS4UF5JR8Nz2/K99DgEV29b8LwAQ5U9M88QwadRpDO97ARvWXcJntIafDkrB7GmnUVXjTwALFVTaYWeuyTmp6GNX56HOOwXov04jjOlovdqLw34JrInrkLBABeXFGJUehVMLomv3jZg4LtWOZhtsf2p2GZ6cF8JGh5SwiqC01ou/7ae1prKfzcxCswNRbODglxLbMVq75TtT8Z/vlKLxFBOdtoTRdouGv61yo9ikwrL7qkMKXplxBg16+/Fgi2p8tsMPV4SKLisA2f5j5QbuH3oJ9zZz4Y0Ffhzziv8cJrioUE0VIVJ9SVEW90t8aImCXy0R/9wwQzZrzC6qwmf7A1iQwetR+Ys8PrjIaOYfysPctCgmbSjDGxM8eHiIEw3fr8KWSh0vfZyLv03XsfOCE1NTVPgi7EMaDWEaRBaaGxMjvz2Fm1vqOO+je0ftlYImjfvvQtvFYUw9aGBFpoJTNQ7sziATlLUAvOby/adQ58UiLM7W0WqGC7cQAD74nvfPe7f3W5RxZkMAH/uNDAASCDt8qBATRh9BiSxoEWtImiUwaS8LlqCX8HvRbhk4tuL9sEhHynRY/17r8cF75XZgzy43bg84+Z5Qc4lIA2knqtDpvbV48ekZyM2RtQECNmLpNT5E+rxUpkT5L6K2V8XqNcWYPdcNV5XG9+RaclJ5fPYj5PEPucIA5PXAoVw0fWc63m+1AVvoL+umZBNmIaLK2gOx0Dx4n/Y9Cq0lVZ25w4GGfbx46msvLY6B0Qcqsbdcpqt4NVo8g/3jk3nwYBw7t2Tgmb8ugM9HmmtGQVsIn8eJJ2dE8HkhaSy/H/B48OxODYMvkJH4XWhzPIqmmxTk8LqyB4EaqECdLtW4vXMAc9M16KqJbQUEPQnBR9xQ+bktF/xYfNaCm43ws09Uvqq8lozoYyUx3PdFMf78kYGBeyPwkLJJPwprUglyss0YO5f0WiMzkOlcduBVkgCVf68jDC+77kRRJsYc0jDthBcnnRo+mZeH9bVxfL/nKB7rpfM9HY3eOYBHhgYxZdl6DKKbJPeZ7iar4/1YZEWkDmRGAlg8ufQPGVXbIdtxR3sXcjmGpLZ/NY3Dg+0WYex2Lx7r48ODvTXc3OoSmu+JQgvJoq0IPltzHHf+TUdOSMfbk9y4uXEIw+k+JRauJQCAj9M+OFR+cfntxgCuotgptjEPHI5adO+4Ht3bHyDdduHsyWqcOF6E3TsK8dWI02j/7gH06LAJm9ZcQJhUzk7D/bsyU+wnIiMgYcnlV/lMTbUT23bV8lyynJhgwcEsVs1mGVdRNmSbqNuhAk9OIBCG45jKtg85JUFMgpgNhBLDUFBeUYNXX1yCrAyZE4/Z9F2leZW56HZ7Qhh2RmYa+D0q3oC9fjy+XMNRgsb8Uy58maqggjcmrALxWrT8OAu3tXSjxYrEOghNfHRLNhSNYmup9NEP36NEs9OpbCvpdhyrlDiNtFFmDITs/jJiL2mmayLs8GypiudGFyCHoHXmQhEOlGnoOisXT30ZwEH2491dT6HbYhX3dDmPublRdBp5Bi+MdcET8CLfGbYDnALJ4ir9VxHwlkOu9UCnNPSaRtYjw4OgeMrhwRtjT6KElmDCyiKsKDUxdFEmRl7kcxG2Q7baeVolHv80wEcVx597paPuG06sLJcxdW3khgAA8c8lDiBLkDXdwqb1eejVZQtefWEj3n1zO3p03okF889wUNOacoCLxbcX5XAQ2EGlvwNA4kUkYckTQCDBJLEU/qCGhQtLsXVziNY4wL/Twl1FOVEVw20djuOpGWwfjeySTB/anSGrkCwYO/4g034RvPfubMyYnE+rKsEkKTHB++eg1UnZF18oQOftYfrFsOsKurPT8cicEPbLdELESQWnopKia+wznYAyd2MV6rxdhkcHK6A3a6fVin/t8Negd4qd/Z5o3P8QIUKy4QapDX+Qz9mGU/KLrqLIA/nHQ7kSg0kk8YTw/YlazDnvwbaDW9FvjoE3Bx1Gg66KHbR8uucOHKiKY8uJg/jmZBgBIwqXGrTrDUpRWxvWhGX+j2coyi+BSr/fjz/1KMC0A/w878mKFyJMZvNIm234y8gQXhlRhX1KBE8NK0BlSLIZFT4PE3/pkoPXpwcRpnvXoMVh3NfBwkWyg2slNwQAiOLbloGoLck1kjgjqZr2vgUyaGxET0T+JZorab1XfHr5+98Hmm0Vr/x4hQUkPpNwEejn8cFe5KDbuc2D8xkBufxVkwD9/Je+SsWfv7NQQAZwqCqElzdzgIrrQa/UIv3/dtZZNHlxLwKqTF1JHj+ptsQ22DaZjSisycfzK0wcVCVLMAoz4kS+zKWzL2QWQ3YXkki3LtqqqbjgMtHwvX1o2NaHlVWkuhz8wiTmZqWj4/4Q/nslhH+I9LkwD+njhEsjEf0IQeUqIoAdw2Gb+BwEYJxhna5IBEu2HsTMCzoOleh4avh5ePQwXvg8G3d95MSMw5kYnxnG8hM1OF1iwWfQm+ehsY2WaqASvH9VdlmSvpPQsqDWP+QKA9i4cSMakuKfi0hmg8wsGdh+tAipRMj5B/w46Q7gUmEQG9JpDHQ+CzIAiXvc8ep2DDgSQSHdi4YtT+KeDtXs+8snvwZyQwDAryIyWmSsiAWKue3U5I0rM7Fgth+KIcpIl8DgMKXfGyU7sGMYP1EkBjHogAN/+9aP+Y4YFTeIFxeXk4K6qbwRlJSG8dRTS5HvFpCTgJf4wFRurRYBXs+uqGR40WyrF7MuhO28Az+BT1iOzOfbRIf3YPFVPHnBANk7cNCaKjT8yokBawMoN/xYX6LglZ0qmqzTcDbRtF9UCMW28kiuQ4z3Y2/5TkDXhVabCpxUcCEwiw5VYkm6iYy883htjEZwohvQPws7nXH0nnkKr3+tIIvKfaiCDCoagiLAZHnt/f10nQpKgDUsFwzDAz+tNb0HMjuJyZA9JdCAoOYnKdDx8tQD6DTNBzWm2p9R4tV4fXgeunwXRmlEkoKqYOkEQbqf9vQn+/4oGdztLY8iS4ljXVoYf3w7H++tE6b1KxVj/QFJAsBVE4nWkxpwnCTyCahsdAtKKqsJBF6kn6aFlgVDUjyDA1ks4k8VGUyHKk28Na0C7TNoiSJudNnuwHdlEsTT0Jh+//z5ebACBnbkK/jqoorh5w3MT/PDZzMbi64DWcKZMjRZFUKh6DwVHDKIOcBtRkNbaudKcFDLxq5SSahEMfHKjHw02RzEy+sVTE6LkX24CTxSfenqBe5+TIRhVQWobAQxSTmOxgJwUflLSZ3bzM5Ak/GleGmqjsMFTjQen4vaiIEnP72EwZuj6LisBD33WJBCqCXUaI3KLCsTQ8Ly2B9KzGdnGkp2pFupwawdYfRdG0G+SjDQg3YMReNnZeaIyGBPgTrcxbipjQdDN/EZ65LrTxZAYDqUXYvx6514amg1ph/Q4LA8SGxeSvpP5vn5wkrc0aGSvwfwyZJLuO0tH0adlwVbP30sXC1JAsDVErEQYkLteEOCJtr7IJhx0kkFRcV+bN3owYU0KRNNy/NvMACDg88boR85LB1N9igI0erPTPWgU5qKzz89gA96p8Nn+rEgpRBL8qRcmKQb6zhWpWNDAVmJ0HFTwzFHGE1X+fFtDkGL1s9OjJL2SoovKbW9WxApraxik11y5qdVof/RMFYWeFERVu0aAxFSXVVmU2Sa8heWIwUq2i4sJlU2sPFsCIMPVOK9nRH4NR1L2J/tZpeiTvccrMwz8cbnuei/3MT7M0vxty/d6Ls7hHiITEGnk0SmI1uByy5IhpQEY184aj1YezFk7/0/87QTX+1T0XFKPj5aJzM9si6ArgGflayo9EsshUxkwsazqNfcizNuWRhlIByX5KgAvt5egy4rNLzztRO3tC/HG9MsXKKrJZmTYQLE4y3XY9jSxLLlJiMu4a5eKhwEGVnEdK0kCQC/tNgxA6HZktmmY/vmWqxdVQOdVkcyAC0qEbWInxHlIyj8E2Mgy1sl4/HpAZn4y6QITikxZJeV4KWtfjz1xFJ4abV0DvAOm6vh4XntLcM52E/6A5iVTmvEn8OxxBz9p7sy8Ol5UWK6JRzoskQ6Eaq7hkIyIQlGsuPuojzZuYjttySpSMHs0wr8BLyhCzNQr2cAA8+wT9UQWo3MxYI0C22n5KLPJgMXq504Wh2xmUt6WdBmLzLjYReKZR9LmrLMx5uGin1ZF3FT6wi6LAlCtlewTC/CtPZdp+bh431023ST/SXrUITZ0SViE2XbtFeHleCFb6TWAsFElSnNAJzxADakOHF7VzcadKzFsM0qqlVJOBPgcONYloU/PLsf2y5KIDqGRoMK8OQXYd4jHznPfa0kCQC/uCSsqgQLJXpsxiuRdq4Gy+a4kXXJQ0sk1lei11R+CZDREv2YCABIGKHZAhfqN3Nhbgnpo6qhUcv9mPzZRZg0JXrMhaMZXkzONVFDdyOjqhIfHtVwWpYz02JKroC4IityFHQ7HEAxrx+Sa2shmVm8piIlteyNNagQzWe68f6SarSbY+FopY4Ba0sw5oiJLWc8uLVTDh4dWYslWSp2lfjx0doAVhaZKGZfyNoAdoTtLonfLZY+QFYWsxS4bXZUhc/Wm6iKhjBkxVm8NT+K71J82JSjwU3gyc0rxQdbVVpnFwbtlbUNshCM7aL2y8xGvteDO1tdwP6gRTYhuQEB7D11DI0nWViRGsbScx7c0/4i5p+L0GURgOcz1VR8tTIHN71bhnTNQPalHDTo5UarNXJ+sgpxHa+RJAHgFxeaNdFpPmR7nYBE7OkSaFYNVi4pQ25G0PYvRe9lHMSl2N2PiCxtlaIZX+8rRL3Gpei8IYK086VocOfXmJwSsteae+hzmpEaLEzxYOCFKJ5f6kIFFeNSIIxFmRXw0ZrJDIfGgddlTQlanbE4uDXSUjbsKuct/FSxpw61GEbud+AvEyvQaLiB96c58eDgII5mF6FBYwXldFlem5+OaqeBESlBujkRuuZVNnZKWXS7+Ak7UwJvfppXsa4u9m2U531z1Ck0nu9DnXZObKBF/n5fGup/YeL29jWo07QUa9ItO/BnRFx4f3QuXploUcHpCkiwkP3Fv2DMmgo8+7lk7hFUIh5JWcXnOx14b66Bd2YbeGFpFPXbF+LBYS7kEWztJdns82bD9qDZl1678tHQLcWo08KFVTkJ14v+VqIDroEkAeCXFhvchVpLgC2RcWgHCjmeDFLRbZsdOLCL1FPlQOOglfyDHxPJEpPiJgUV1TbNbDpLQbOu67Dl+xK0OBxBrvjvMug4iEs9AZwNRTDvggczc8P4NkPH4jIqPumqodM9MANYddGF574nbZZFQFR+iQ9cLZHbllVzkoMh8RH5WaYXRZksWl+JnhukwlJR2EHL7Dai+GhlMfLY5nve3YztuQ7c8k4RJp/WcE+bPThSqeKt0Wk4XK3hYAn70ZCy3vTpeb8hghcdLLo2Mbv+gWX52QeWXQVpzPe5aL+Prg7vL+ViGTzs4+afpGDanihqy6tRp0c2xp40MGR+Md5Z5UZUjeOjAzoeH1KEHaVi5WWlnwRwFRh0pR7uk47pBwwyCqn6oyHLa2HxxTzQH6Cik0Xx/eqQDzMPeOFjW3R+z1GTi7pNCrGZ/V9ZVY56vQNo2NGBfFMmEMUFEHC5NpIEgGskdgIRH7wsVkk9V421y6pIW8UVuPyBHxCxFqLgMcPEW7MP4PZWFejZ9hR/j2PwSQ/2kl5aVHDZLSylKobBR4M44TXhkcQW3cdBHOag9ZCFkGbzWmGjFK3X0YKdVskIZIedf3Lxnypi2aKSTGWX0eD5peadFOigX0xrLIVEsuiS+OmO3DfCgybzoqjzRjZW5EbwUt+zeGdJGF2+2o0nPgnh9l55uOiLo5IKoxMA2VCeW9KfEkHOOH+Nwwsr4oaPfn5Y6DoVPkw2cE+HFDR8N4yMAFmWLDzitZ8YchjbK+O2P//5+q1o910Un23w4f2VfpIgDdsKIqgJyrSjzNgQtEyekyxt9cFdqPtOLS17gMoehRIL4YOxGbijnYK+a6Mo08JQeD9SJNY0QmyXYi8UG798Exq9XYJi3vuG89lo2DmAZ4Z54ZJl1qL7/0ZA+GpJEgCukVD9bVopy5IlNpCe7sCy+W74JT3vR0SqHsmccZR+u6O0ALc8vx2Ld9eCxg4bcosxT8qACYugNQ3oBir9LqgSyTaCNFAhWso4xh+tRZEMPAKPLLjallqMP8+i78vPSDLMVRMqvmRK2otc5F4jfqhkHg5S+J1ZlXh1VCleGOdFxKglNc5Cvb4BNP/Wic4LNBzJ9+FvH+fhEf79vl61OBySgiEyl04wIbCQ9FPDqTQEvjCV2C8LuMIWOsxx4oUv3ei/jpaV104pMPHEx+fw9Ae5GLUjiDD7rspXjXv6VeIYv3euxosqKu3IXZV46xsnTnr89myu0Ha5nixUkqQxKQpbWlqCBr0voOcSSemlb8/30ioNPDrsGA7mGKg7wIm7utZi6CoLC06F7ICrSpfEH3DT2ufjg/kCIho6Li7F7c29GH5YZiIk3sGu4vWulSQB4BqJZI7Z69fFSsbCVGoLHlLMhXMK4XEJlZeEIinuKSNEqsPEoGoRKniICh7CpZJy1L9nNV6ZI3sDKCjy+tBlYzmOhzh445J2GkctB+GyYq9Nl0N6CJ+c9qPNeg82lgWo/LRU4vfToP5tYQhTLikIaxLpFmgS/aXmytSmTd8TTkzidzG3EtQUM8ufhb4Ks+C3ZPpQ/FmxZ7LsN2yx3aKkUR8peQQT92Ti7WleFPoNtJxwEU+Or+LHdUzZmoU//bUC6/eb6Lw4DyW8mBRN8dLCdphdiNMS3JRIPOm0RteBXgOknkG1pmBtejkUspqK4iBeW65g1ZlDuKeJj32q4niRiQcHHcXStdvxUPdq7HUpuJhxAvX7W3jo6wjabo3Y8/TCqCKan5giORCSExDmbZJd8NXgc9J1LwbOykSd1ywcrA6zywI2UHyzNhvTzoRwMTMLf+gcQZfvo3j84wK0X+CzZxsUK4hlO8/gttdqsTWXgByOENAu4cG3TOwmeEjatlSBspOMrpEkAeCaidBtefDiJ4seSZBQ9vwLYdGCcuRlU4mpuJKenKjzJ8UihMJb8AZdeOaZJej8yUW8tkLFcodkxQWxMj+E0adlXYCkNYvSxDDiXC2W5FZjUoaOnSUGlUWzk1nE9YiRUsuWYDsq/PjbWhXlGtWfls8uZiLtYbvsUl8CC3EBrESNPU2+z0OsrMpD0n5JSmz3JE6rJ2FMqWWQT4XLIvWudXnRYqcP609dxF1UvjTFRIaHvn3bdFTSd871R9B+cioKAnRLqDgSj5AUYrn3WjIG2ehU5uTjpuwRQHotvJqKO2BZHhp9YuCMSnYTiaPtUhceGuRC/Ta1WJpnIaNEw70DM/HsxCAafeDGymILOVVlmLrDxHGn5P9LhqYU85BsP4G9hAj4JfI4eG/sw72lJqn/efTeFiT4sG2kNUHNickXwjhWaKCwthqvzyxEpU9DqyGHsD0/AEUAXKerNuQinu2vwWn6MWZ/BW4fEcBT4wm2BE9VIsJ0g6Sfr5UkAeBaCQeXfRAAEoNNDvEJeVChLqS7sWJxJVLTSjngTY53CZ7JnLSOL8ceRN8u++AMaXh6UgZacmBm6VGUh6VGQDG2ByXST/pK3/JYkRsLyi3SUVJQgzSc7+8t9GFbqRT24AA03FSwMKYdKcN7W2mlqEh21V8BHjaPas/zkKLyXEJU5fc4Lb58T7Ylk3r9AgBxQ4OPSl9qSrYdafDRMgzdr+PBfoXYWKGh8ddl+MtMA+98mYEB3yt2Ms7s0wG6HhEbjGTazl6vwVeZvhM2YU+RiaJYGvbmuNB7aQ3G8pxeCfyRHTQem4P6Pf0YcpjmmP2zLkvB7Z9U4sPvLbwww2tvtlHmCxM8LBy6WI5sP5WSACi1EqU4qexcrBC4JB9DgO+KXAEAeRa5tToeanUCTb8O2DESg/RfKkGN2ZqPxjMDqCAQSRAyrmn47owTn65zIkQ0lGI2a85paND4KLaXxbEvx8Qd757DnV2COO3j+Q1JtRa2Ju5MkgHcgCLKLw8+wQLs6SD5iYMiaslipDD8IRNvvjwRgwfNIx2VajYqvAEFzz+5ALUVBINIJRacdqHNfguTMjW7bNWCTC+eXqLQ0sftCrRhMoae63Kwo1QyAznYTS8cEQufHXJgQm4AMfrOUZk6CzjR6biKidkmApEYgYZKRVdCglSSJiz7A4hPT1XlGxy49OenHCnCOrZDJZU9Vu7Ge0vK0GyjE15S+OmHc9DpAAHgsxKMuBTDrI01eHeuG0WBCsw8SSXmvUrFZtm8hL6NrZBRUmtT8hIIQrrUA/SLxeefeb4XhuWiTjcF9TsGSZ8VWk4HHh+WhzFHI7h7YAGWlcdwtCSA+h9V4/ONIbw0I4Ic8nTZOlxKi9krPOluyayslC63k3vEV6HyC/EXcONt2a+muGYEIpml6D4pBbe2KsXxUrpU/JzMwhwprUKeGsffhqZhL8E1agbY96DiS6VkN+9BQYUaxWPvbMU7oz102/yYuCYPt7xbiddn+wleAkIEaDI+WQgkOzRdK0kCwG9NxLe+7GMLRBQV1aB393kY2vcU1m5yoUfXjZg27gwHqGFb3rIaB17ZHsUn+3wopiIWuKro00exwaFz4If5GRMu0kxHiEoXkphCCLKmP0Cr+nmG5LpLarL47wbOOX1os8GFtbVxBGRGgDRWCocIPZZdawQAolQRmaqU2MXS9Bp8fFqFz4ii1/aL2OWJoedeP/J1FQvP+tFui4b1xQF8kRNDepGCFeclgOmnZSfACJhcZkDyj/yH7ZAjjOOVboJWLZ7ocRId5oRQSzB8cUQW7u9Qg4adS/DyPNNOYb5nTAUeHqDg0V7laLqJ4EhLPOtwNT7YFbXX/wckiCelv9ilFqTsGDU+gbP/SyRyIXUIZemybZlNHUtOnUe992ox84RBd4r9TUB1qy40nVaFAQS3xz4rwrNTFIzcUYXe6wx8fVGn30/g4mcXbi/CH1/Mt1mArgTw7CQH/tS6HOsKyHSESfBaspEo0YZ9+iON+hUkCQC/OeFoFdNkAwHHo9BJUuSyEjf2H3CiqorWkRZHSmtJUQmZ7np0cjb+MiGCqQ6L1sWHhalV+OS0ZPiJSZPcfRMDtmTjiMET0jpJ9SFCAQamlFAhZaELByEPxFyYfawKrywzsIGMQSy/fEVAQ0qTkXPws+KqROxl/dnOKJ6dm4Hz9OmX54Xx+cUwVp3KRcdTUZQZBiYd9aHznjBK2IaImphqlM1b5N4Sy6h58DxyCAjIuoMg7z/DpaAwEMGp09tx82sO5PEDa7LzcduwCO7pXY3b2tcgEo5gyJZCHHepWHzqIt49LPEDmYsP8B41O0lHYhx24pV9Df5MILMx5wdEbj8klljcDwLk7gsX8P9e9KDfYrpNbFPcIJiQFOWHa+HzBzF43n7c+p4LXxyKIkcJY+nRKlSHwgiFCJiaikd6XcBfP/LCHfdi1v4c3PGJH00WRVFpuUhBZPrSIvOQWIZEWK6dJAHgtyaJ0XpZKyRAKNRbgnIyZSjBPfldElHkzyEOah3Fjko8NTWMt3dGsd2jwe/X0GaLgn47w6TjBBAq4OYyL1YU+6DR5y71hDDtUgiL84OkyAYOVZu0cDIWTXjDIYw8V4u3NwVJc2UZrOSzi2UUMCAEUFNkOzUbSziIxx6pwYxsA5sLNHTaQOA5VotvL4bwTT4HNj8Xjfhtam2ynWJF5TxSO8GUmQ0bBISa09UgJRZmErO8dpv8fi/6b8pEg3YeLMsQ98WF1EsWdlbquLPZKXvvA3uLdksofhgeYRQm3yPoSdtEiQVe7Bp+7EteigontlY69n+LsBEBENkXwB008Fjn43i4aw6Ol/F8vIasnygqz8Kf+5SjzUodLSYU4IXPNbz7nQsdNvpRStCR5KMQQWzrqRzUJd3flGOgvLYWDyz0ot771TjkoKslrgddH0nrtncAZnNkYvNaSRIArgMJcxQtTM3FGxtUDD0b5oBKw6cbivH8EhOnqPCxsCi4hRNFtVjlCmLBxRqc0OOk7rIJSBU67NGQL1FwUnmx8E5+dtheF+6ZFEC6h0zDVlIBI0EnAR6h7AmucsJh4M31Jfj+lAc9D5koJFCp/PveksRnf0hiuiTL6DZD0S772rJKTwJsAnJSSl0lSB1wxvDFZjduersUZaT8weownv3OQB+7PBlPZAUTJ7wKIrUcBXgM+usfzr6Eet39qHBK8JSMh7hVSAb28LBqrMn1IT+kIb0yjhGbslFIJjb+WBHbLbkHiUDmy70vocNCukYE0LFn3GjUtxDdvzd4Vz/eJ9dKkgBwHYikwJa5InhiQjqa7w1hF/3tQWtq0XyLia/yZMMLL3z0+cP0a1VSc9nCq5KUfPHZGnxVGENFRMPxWsUOvqm0YHHNRGUggM5rXWiyLoI0+r5XtqoSqy0AIENZDssMI6XKh7JAGHuzHQhRoU0qhdQb/DFRYxJ3EOtt4HxxBYbvCeG+7vlI9SRYhj3NyM9Ukh4vuaDijtEVuMQ2a4oPZ710YXSyHMlulAjlVZI42YTBNk05WoEHBgWxPlOW+YqbRaW2Qnh3/EXc8Z4bR4t8iOgKQS6AiavP48MtFmoJECqtumQALmGf3tExF0edOtJqdTw9sRKN2rtw1i1Tufzgb0ySAHAdiBYPQqVVPV2tosO+IJptCMNHa+TwKxiyvhrrZKciKo0VcXEwx7G2woV+x0M4QivLt+mb+9H3oAcf09mWeIPQ9bhJWquF0WNzEM/PVXBKip1S5SVY93c7xh+IGaTtkniUYApxWYjA36Vw8I/JkUIfLpDKk3BgZ1oaJhSoGLLai/GnhYXw2nSN/Vo5XtikYdBRE6mKLOHltS3Z51+AiPdiECzo2lwtkW3ON1xy4sGxESwqp3cuexayOTG6F58trUK/lTUYt9GJRl092F1L/ysELDuvYvwJYS8h+OMWSl1xPPVlFkbxPsJWAIM2FKBB3yDGZbDvorrtgvzWJAkA14HIltiyNbVExvttcaDlwSC+pd8coDVdc6kWvU/J5poyv+6mVbOQ5tFxgnRaKgSFtSpMvhTEfrf42Tq8tPyyJl/n32TpcL5LRf8DHjy7PGgvyBF/2KSCy3nsSr/i1/+AROnjSwkyUQ7JX3Apkh/gxoQT1Xj0axV3DVOwJp/XIyPpfiSMdJeFXltLkO0j/aclDtn34wOdD57r8kmvgtizK2ybnNeQgCTdCB+t/HeZNXhyQiUmnBO3RGdfSeUgFUHVwlN9duJoKASlxo2XvsrHs2P8+DolghLdYF8F6dKosAiWvdZVozsZQRn77/s0Bx6doBFQ3GQqsj+B5FZcbsRvSJIAcB2I2EHZF08CXz41guZry9B8lYF1lRYCNPHDD3vxdQEVnP6s7KEv/qqfVD293IEPU1WsKtZw0kdlI0iMSSnHmHOSHKRAqhn56BJoPMe0Y2V4b4uBzSUKAvSXJQAnc+sROxrwv0UyBnVa6azKauQaFprMqkQ1Xx+ZW4sRp3QcqIyg85Zy+A0f3lrpx+gsHatKNPTY77Pr84Vkyo7/STWef1COny/SXgEBCQ7K/ouSQt1pdS1eW61jWSmZBamLrJSUhKkluU6MzTZxtNQHF9ve6ZsUzE7XMH9nKrqlROlOxewYgWG40WlWFp74XEOWFkFOWRXuGOPFnT2rcbCMrIosS7YeE9D5rUkSAK4DkSks/XLuvclBuWdfCp6eZ6DJJgV7HRbySd9bfl+BRcUyx81BzkErwba1GeX0u+P021V8mubEoewgRl2MolizoBkmaql5lhGABYXgoFD5Nby+2oVFJVQi26pFOah/WKS6kGZqOJdXgjYHo+i4SGfb4thXUIRe+zSsLTMw8HQZXRdg0H4XiggmMiWZ5Y3aFliV33keSYi6qoaTjEUAU8DrfHkILy5R0GS9huwY3SRDSLqb7U4kIi0r8eOt2R4cDsmiHS9imoGNeZV4c5GH/eFgP7KdPN/i1Eo8+lUEm8rJqowwOq2vxe1dqzGvIGanBMN08/sJ0PmtSRIArgOJEwDEqgkZt9eWmwa+2luN9zYG8Np6P8LUsi0FHry13o1l1QkFk63CZG9+J5W81oxi6tlyLC2JktLqGLP5NLru19FFkosUzZ6+08kYdNL5dbkhvLfZj/FptHZhnZZalvkSUERh+Ur8YVvor8dIpQk2waCOdkciaLOVTIMWVqEVXH/RjZWlBBhDTKMXJ6vC8JphfvHqqbqUIBeqL69ifS1hLQQsybJ0aSYmHXei6cYgep2xkEsFt9dbCDPi/Wy4GESKQ0AI2JZVi1dWhLC+nIyBAHC6zIHSkErFT5SVP1+p4NFxWficwCkFQpel1qJR/xJ0XyQsS/pZtd0hqSlwLSv//JgkAeA6ENuuiI9PBZRCnuLX5nsjqPf+LjTebGBSRpTKFsHyvCo8TUt8XKEiiGUiN43QHi4/68KqSqHcAbjp1zeZfBhp4RiOHDqCZgcjyKOfLjUEJI9elKjUb2B+edQuFLrdJ5uSJs4lZbsloUgYiWzfJnPdVsSPJecKsMVnkPYHSZcTsQMpUCrTl4q0n68CItL+qyWi/IQAu28klwKyyIlK6Ayo6LTdj1dWaVjijCcShWQTUYKVbBgqzGdaajWGprrZTjfajkvDV6djuP/jS9h1USy6BZVugtQfqAwruHPAMbTZJqnDGk5VxPDXCZW4q6sTJ/0he9bF3hla8o8FmJMMICm/hNgTbvSVpdiGWK04abts4b31oh/vLHDh5YU+rKmlRdM8+PyABx1TTHv/elliKxF1b9hCVVBoKuy6AZ2WpGO908DRghIMP6XgrMdCtjdMBpCotSdWP2Z5cNqpYOgJHyZk0YoqUnVHlD7hY4t7IEk10YgXLipDrUGLSTAwCUT26kEqu0wVxmmRJUAmwcWrSZEl60+Ch5LNGDODcNCtmXchjGZbFHySoiNLJ81n+yy6GJLoFCIb2Vriw4E88f+jWJCaj3arFczOIisyIxi834eV+bKTso8uE0HAX4n3FlWh/VYLRWRYjoALby504eY2Pozew76gy2Bvta4bBCIpLkqAFaD8jUkSAK5joSuLnelFeGNtGE13OJEdlvJbUazMVNAvJYg0lVaJFFWy8qRyLjWRA9WCGQ6jxx4fptGiWRzIQp977qrAfoJAKB6AQrCRWvpqLAyXHsOyDC/6p+uYV2aigsosa+mlGq69foCH+Nv2Yhwqvqw5uFpC1bZjDXaCkjAPodtUNI0KKysS7S3H6Vrs9RHUdgbx/OogxhXRTRE2Y8cZFEhp8PJQFN1WXMCqkjBaTi+kUhvwqF68PbcIo09q8LHNkiBlZ2ISLFSCWa/1BXhjjooqMgdnMIBHFzhRv10QLb4J/+huSb9FSQLA9SxUOJnOW5tbjm47LPQ+EyZtTay5X5XlxCenQiiiZRQAkP3+hAF4Qhq2lXkxnr6+EuEpSIvX5asYlUYrStqeW+VGqaLDQ2IbI8U1owotpo4z1QrmFxjotcePb4tMnPHLOn5ZOyA1+sgETCl+QqvMNl01kZiBsIbLbodM68kh3k2+EsJKMqBee73oeNjE7DwpyGHai3x0fkaqIRl0baxINZZcMvD6tHI70m/Qv3/t2ypsrAohqkfwTaoXR8hu7M0/JNBKQBl/yos2Bwyc91ooNz3ovqwQdzevwYvjXKjgd36Dhv5HJQkA17EIBZZlvUK7U6rDaLGhGr3TLBREaCFJ57fl+NB4RwSH3AZJapT6xPfpJ2/IDSDNK/5rFY5VBzHwgBMlkRjOV4ewqELDgFNunAzSHxZLyvNbkhsgdJ9A4Aj7Mf1cCN0P62i/zcDY8xF8n62gVMBCmMDVTN/lIQwjUUvBRLmuYU2+D4P3VuHVDSr6H9expVKqKMkCnwCZgcQfwvbrebeOoeeC8BNENuUG8fZqFyrZL1K266I7jLH7SuwZENkR2WSfSMRf8h+mpwUw+hxZA0EzvVLDc9OcaPBBLZqN1VEheywK0Aka/U4kCQDXsdi++OUItCy0WV3gwrA8C+OzI8hS6ffSTz7lcKE/reQJj2rXz5fpRKHHJAm45HDgs7MuZJJWn6+owmklDhdRRaOLsOliNkZcNOwtx1T68bL9tV0cJC7LfQV0dBwudGHQsRA6H9TRZreFrmcFiFSU8G+ycYcE5ST4JhuTaqYULZWqyKpN5SXoaGclinvCz8laBIPKZdCvljLqsmOPlDbPcFv4+rgT76+20HxTFP3PRTGz2IeLUoyQ/rfU9DctqYLMX/kaMJxw8WfiG/oecNMtMlBFZtBh7iWsK9N4rRD2OCwcYTsloOIjeIR4nmBAQ6/D1Wi330QZiUcwXIrmS1y45f1aNB7pt+sbgN+VfvsdEYAkAFzPIpuNyDx6mIotdfINTUdKdhCDU8P46LQf5/1eO1K9udSPLifC2OWhBZTlwVQ8KcHlDjox5pKCFI+G9WVOUn3JDhQabZBe52FxFZU+qmFpjoITfgWHHFKSnO9JvCsiwTRZAkylC1k4VBXG5HM6+hwtQ9OtJrocMjAiTcfIUyZmZcTwfb6FrQUqzrpjSPdFkeo12T4TJx1R7CsIYk+Jip0VBtYVRTDjkon+x/yk4UF0OmBi8OkYJvO9E/RZQrS+sreAFZNSX2QHBBQpdio1F9dlOjHughfzswIYmRrE3sJyNNkbsJOiCmi9V2b6sLjcwH4X/X5hDbpChQ6jivfUc1MNOu7RkBvWke/x4ulvSlCvowcvDQqyvWG5YchORhYBNGZPyP4+JAkA17PQyuq2fyzpuFHE9LBdMvxklQdjsmP44EQQ532aXTn4bKUXLfdq+Krcz8/Qrxczplp2Vh51Amera3g6USRJO+Z39xVgyP4g+u4I4pDXwJEKH3od0rHXEwUhh/6/BP/IFsT6ijHmNcQaCyA5afFTqnUCh4XpBKTR2WG03htEmxQdr6+L4uW1Uby5y8C7R6J4a3cUTXZF0eZ4FJ1PmxiSGcGSGhN7ynWUEWmkuo6U9BJQkviiVNrVI0479hAzZVaC75FF5BFUOq4+j1Jab1lMtP4S3R8q9fNjqvBdsQmV70mdBPhcBMsI75+gyX+lHgNdt9Ri4KkYiI8oU0y8PK0EN79SgIf7e3DGx3vivUk+plxLtmSXnL/fiyQB4DoW2ek3DtJ5UWYOaFEEOw+eSiALgM57avHBnhB2emKk4DHkUckHUKk/PWcgw5CEITIEWvjEFN3lffUIAmEthJHnazH9ZADLSy362DGU+kMYurMQ3xY6MOSojsmZCj7aWYUiXle1ZLt0BV5+N6J77XiBuAwxKpzFxsgWWxIf8JDiF/tiKPDyCFBpFQsFoRjKySDc/FwsUsvv0q3hz7IiTyL99pbnVEAp+xWypBpvFIqhIldlm00v7MrHph+XPKT5W4pQTEWXMmRevtd9bT7yHZcwlMBSYtC1IPuRz0sylGzacqyiBn32K3ZQ02tGUOSvRp/dCm5teREvjTFxge6HFPOSfpGJCOltO5dBfvmdSBIAbkCxM+SocCHdjw3lHnx4xMSKKlpoDmSHHsWIg148tzKAQ0EOaMtvuxAGrawUBzVJcSuqHRiaEcZ2d5QMQ0pnm1h6qYb0OQiViv3B9mrsqrTsDUmG7CjHNBfPY4Qg23vDqOI5pNafFOCADShSIEQyGKXk2H+tOXBFJMAnii97F8qOQlEjjGBlOVJl8017FoJqaBQj3R/D1NM1aLLRh1PBKLz8fKKwaITMJUiAysV+XtQfDxJENHT4vhwBshwJePrYBtkjMaIHCEgGJh3Mw1NzTSzMCVH5Q0gt9OCNbzxo1KEaz4+tJODQ4vP8Jtsp+Gq3Vv4n7U4CQFJ+yyIKJQkwGjmzYvixqTSCoafCmJNnIGwF7dTg2ccdaEL6/XWmjipa1BjdAhnsEg33eGqwwB2HKmW+eC5Dj6D34QpcigWxLr8KSyt0ugA6vFE/Pt2fhzw9jn151ZhHVrCd3/uuREE2KbldgIOfE7ot05ViPSVdVl5j1CabuPBQCSR7K93QCFC6YcFrBDDicAmGk6lMTA1jhYPnqs5E5wMhu4bAuIPZ2FgTsZVf/ALZflvyA047Q+h3PIyU0gCmXHBiW4WffRAlC5Hlz2Q6ZAGukIJJJ73oecZAmo/tI9iszvThxblVuPWNSrzzdQB5IWFDJvtEVhb+A7QSAHD5+J1IEgBuROGAlZ1vJCNPimDKdtmL03zockhF5yMRZGsKArRwFY5KdDvgQzv65ge8KrUoQitMemyq/K7kDVgw6YenEQhm01IqPM+Hh/JsphAnRZd6+kPOumEqfvTelotzVOCYXoE+Z1VUsQ1S4XgA3YUvDznRZa+Gs6qOSsXA6iwPNjmlBoCORUUa0mqr8PmJSvTaa2B4uoEJx2sxIE+W82oYc8qFzQ4dbjKC905F4KCiH0grwadFUt+vlixDLHWMborEQmQ6L4yLZDleAkPcCNLvF1AL0QVx4lCtC623RDE41UKIQCNxk7GHa/C3rxXc1MqLVsuo9HQ5pDS7SVaAy3Q/sXmL9Ot/OX4nkgSAG1E4cK8sHpK0HKmJ7wzrOFQZRpttAQw8qmEJrWqcCllIi7gmT8egU36sJK136hJTkMAbKbsk3ZAdpHlDtJIB9D+u4btcKY2dWATz5aFarCr3IUYTvCzXjUOuINJrFEwhqxAA+prgsKpWttg2kOlU0X1/JUK0xJ/uyEIKqbjUzp9yohy76RoodCH+ujSIUyETs4+V0DpbdCmiOOUJYeKFMoR5IzvyXJhR7EZmtYWvznpRG7cIVjIlIe5FwmJLRWJxOWRT0bBMKWohtl/DF2d86HZQxYoSsiD+7UxtJb446MIjkxTc39eJ8QSoWjIP2RBFSobLLOP1IEkAuAGFQ1jSfngI5eZhp7lSQah8bkPHuP0VeHdfBNOzgthUplNBdWh8f8olDZ13S1AsgiqJpsu8PC2q7IBjRoNUUimbLXsahLCr0I831jhw3oojFHPj05N+5IQi2J6TizElEqHXyBYKiEUeXj/M78fQZacbsmnpwL0OHAmH4acV/vZILg6wfVJFd/qRInznjGNeWi3KqYCShCS1BEeeyINshXamKoLJGX44NTe+Pl6Cnd4owqaPd5oobiqfkUVQkoPgIbU/WOTEsENB9EwJk3HE4FPDqA4GMSYlgFdX+nDPeBXDVyso04QlqfZ9SiVmORfIdq4HSQLA71xkdd5PFfGrBQAkGCiptDYAyHsSmBNAiBpIKdLR/0AmWu7VMTIjhlz61pah4LzPxOhUE30OK1iR70cpFUN8ecm2ky3HpMqQmEdJKtqQG0KxInkIKsbvKcMpe+vtszjiC9ibhfbaXoMcKrrUypNdhtpuKwQxAj1WF+Ak2wIq8kwygGN0HVReOzU/E3MqVSzNCcBPkJF9BeV7/Q+VoSQu+x3GyAJqsUOJo4znkU1FomQAsk2apCVLBeU4Gcz+ijDeWFGNF3dZmJGrknXQNSBQZTv9aLLOhXsmhtBqdQRZPIFs3yWVmMWNkEV95BDss0RV5OtBkgDwO5XEdmK0bXy9miJ+sgTiZF2Agy7Aoswg2m3yovUuA0tLNCq2Dp1soIqU/Ot0D15Z4sJHRy1sylLglviAodm5AjL/H5MMQdJtAZvCgI4thQrmXAxhfYBqpGvYdSkbHVM0FLo1fHnMg201km4bRLdVZ5HKa0jK7leHynEwYpIBmNiVmoZB53R8w2NrlYoAQUm25TpZ5UWxZiBCpZRlufTuyUz4fboqYrllN6TKkIEVuQaGkep/dk7B+oIIKkKJWgeHqxWMPRLAW4u9eHyBhrHnNDIEugeWh+p+dfv3tyZJAPgdy3+LQF8lESspawhkPT8MD1T+fqQmhqbLqtHmQBRd9oSx3aUBYRUKVW3MNh/u/TyCW3sH8Mw3KpZXxuAWAKDFlSi8TPMJy5Cqu1IkRHb91TUvEAzY02vlbh/W5kRQxs/W8nMuvrfLYeDrHPr6OVF8dIhuAy12bSyCjRnZ2F+mopjoZJlBAgzpOEEgZrl5/gDbnNi8VLb7StQu1HCcjKHrARXvpZgYmWthD12IkKmQEXiQE/RiwF4Pnlpo4dE5KtrtNlBpryRMJBfZVt5KAkBSfoNyRfmvNgDYVWvErSCzkOW8MvUnu/moYVrQjBAGHlUxIDWKZ5aHsIgWdZ/TxFe7HHh2pBePDAmiwz4dTTdF8FWahq21ERxxRalsZCsyzSdr/23FCtNlkIi8XMdDxY3QjaDS2dtqEXcIBlIWnFBhzzTIFKFFZqHRrbCovLL4KMT3JW6hk2GItZcdhI1YGMXhEFLK/BiXqaHPCQO9j6hYnBdBviIWXfbt15ETYNuzVbzxfQB/XRfF4IMmzrmllkLcTiqSaVLCIO9fEqd+uov1e5IkACTlXxJJeqFthC+q4MutblLlKJ5fGkHvbVEsyqrC1HNRLEv1wSStvuDwYsolHYOPh/HuFlL6Uwam5BhYVxhEuhZHVA9fXuwTtTMApYiIrXxUZCkQIrsP2wfpe5zKLmnEYSEkBCNhFYbFz5ERyCYczoiGdKeKoy4Ds8+E8XFKGD2PR7CgwEAV2yxLf6NWNbxU/O3FKgYf86Lleh3tT5jof8ZEvipTojIjIvMhN54kASAp/5IIHbbr2smUYVAi6EF8vN2PJis0/PlrHx6ZoWNsehgr8yNIjXsRUy2ESfcvOBXsKA9hLtlDh01BvLvPRJ9TOj5L0zGLVnq/P4rdFYntybaXKDjF3094YjjijOAMfz7pjuB4rUY/PYT9ZBubKqKYTXBZyNcvzjqx3K3hq9MerHXHsKHURCEZgKqTNZg6HKYfU/Y5MZqK3uWgCy1267y2gUX5IXtFokxVCoOQJdOypPhGlCQAJOVfFEn+ESsds8t8ydZesvLPEybNL1PQcZ0f4/Oj+PiojgEZEUwrt7CsMEB/PU6fWqrqSrqv7J5r2LsUVZoWDhIY1lfGMSk7iiFnQ2i/J4yO+6P0xVV02a/hs6wYhl2K4JuSGOYWRzEuLYwZl0LY64za23O7dVkSrJFJkC1EXHQhDJQEPEhVQhhx1Im2Wy28tr4WL64Oo8chC2tKg1DIMsJkHeFoGFLRV/b9sgueXt9M/0clCQBJ+VkiPvKVpCIHrf7x8iAOVRk4pRAE0r3oetCPvmdj+CbTxOEKE2dcEXgIBGG6ADr9ekPqC8TDdAOkZLlpB/JkgZAs5ZX1AbLZp+wNoMf8fJ9Wmy6Cbsi+ugpqwwbOuTxYR8WefF7B0NMq2m7y46OzETTfGcaINANry02crpW9DKRmIs/PcyblH5IEgKT8LElU46FSySuVWBRMFt9Ipl9QV5Dt92HBhQjGn/Kh814TrfZH0P+4hS8uWRhw1MDneSYGHg9jaq6JFTUWlhSGsJouwbL8MOZnq5hXEMHiEh3TLwQw7kIYn14y8P7uMNrsi+DD1Bi67fGjy74QPks3sbQ0SvBRSP0Ne3chu+yXAIrEC9guKf4pRUKT8g9JAkBSfpbIpMHfD/5LKJtkBlIBScljsSAsw0KACinrC/xUTlk6fMHnx6YqFwYeNNH9gIrPLsXQ83AQ7Q9F0GRLGG9s1NHrTAwjsy0MOh1G2y0GvqiKod32ML4uimDSCR173FFk+EyEIhJEtKBZMkMgpb3JLMgUpB3yu12FWNYh2GyFDU3K3yUJAEn5zYgWi6FaNVEc0GjFY/BQV71mnO5BUml/KUkCQFJ+MyIJyTIdJ3Pwqkw6Spoy/yVp+y8nSQBIym9GJD5nzzLQb7cPMgIyd8lJSsovJP8yAIjvdCX/XA55QFd+TkpSkvL7lJ8EAP9T+a+8JiUpSfl9yk8GAGEBElmV1yuMIClJScrvU34SAIiI1fd4PEnFT0pSrgP5t4KAV5RfXpNAkJSk/H4lCQBJScoNLD8LAJKSlKT8vuXfAoCkJCUp14ckASApSbmBJQkASUnKDSxJAEhKUm5YAf5/kYYpSVPj45wAAAAASUVORK5CYII=',
                            width: 100,
                            alignment: 'right',
                            margin: [0, 30, 0, 0]
                        },
                        {
                            text: 'Виписав(ла): Діхтяр В.В.',
                            alignment: 'right',
                            margin: [0, -75, 50, 0],
                            bold: 'true'
                        },
                        {
                            text: 'Підпис __________',
                            alignment: 'right',
                            margin: [0, 30, 50, 0],
                            bold: 'true'
                        },
						{
							table: {
								// headers are automatically repeated if the table spans over multiple pages
								// you can declare how many rows should be treated as headers
								headerRows: 0,
								body: [
									[{
									    text: "Зверніть увагу! При здійсненні оплати в призначенні платежу необхідно вказати код ІПН або ЄДРПОУ платника. Якщо Ви не зазначите дану інформацію, кошти можуть бути повернені як нерозпізнані.",
										style: 'alert'
									}]
								]
							},
							margin: [0, 65, 0, 0]
						}
					],
					styles: {
						warning: {
							fontSize: 8,
							bold: true,
						},
						alert: {
							fontSize: 18,
							bold: true,
						},
						header: {
							fontSize: 14,
							bold: true
						},
						tableHeader: {
							fontSize: 10,
							bold: true
						}
					}
				};
				//pdfMake.createPdf(docDefinition).open();
				pdfMake.createPdf(docDefinition).download('invoice' + invoiceNumber + '.pdf');


			};

			var createActPDF = function (params) {
				var buyerName = params.buyerName;
				var actNum = vm.actNumber;
				var actDate = $filter('date')(vm.actDate, "dd.MM.yyyy");
				var totalAmountToStr = "";
				//var totalVatAmountToStr = "";
				var buyerEdrpouOrInn = params.buyerEdrpouOrInn;
				var buyerAddress = params.buyerAddress;
				var vatAmount = vm.isActVatPayer ? vm.totalAmount / (1 + vm.vatValue / 100) * (vm.vatValue / 100) : 0;
				//var totalVatAmount = vm.isActVatPayer ? vm.totalAmount + vm.totalAmount / (1 + vm.vatValue / 100) * (vm.vatValue / 100) : vm.totalAmount;

				var body = [];

				var columns = [];
				columns.push({ text: '№', style: 'tableHeader' });
				columns.push({ text: 'Послуга', style: 'tableHeader' });
				columns.push({ text: 'Кількість', style: 'tableHeader' });
				columns.push({ text: 'Од.', style: 'tableHeader' });
				columns.push({ text: 'Ціна з ПДВ', style: 'tableHeader' });
				columns.push({ text: 'Сума з ПДВ', style: 'tableHeader' });

				var values = [];

				vm.actItems.forEach(function (value, key) {
					values.push({ Npp: key + 1, TenderId: value.tenderId, CreationTime: $filter('date')(value.creationTime, "dd-MM-yyyy HH:mm"), Amount: value.amount });
				});

				var rows = values.map(function (row) {
					return [row.Npp.toString(), 'Послуга з реєстрації пропозиції на участь у закупівлі ' + row.TenderId, '1', 'посл.', row.Amount.toFixed(2), row.Amount.toFixed(2)];
				});

				body.push(columns);

				for (var i = 0; i < rows.length; i++) {
					body.push(rows[i]);
				}

				var getTotalAmountInWords = nConverter.getNumberInWords({ money: vm.totalAmount });
				getTotalAmountInWords.then(function (resposne) {
				    totalAmountToStr = resposne.data.numberInWords;
					formBodyAndCreate();

					//if (vm.isActVatPayer) {
					//    var getTotalVatAmountInWords = nConverter.getNumberInWords({ money: totalVatAmount });
					//    getTotalVatAmountInWords.success(function(data2) {
					//        totalVatAmountToStr = data2.numberInWords;

					//        formBodyAndCreate();
					//    });
					//} else {
					//    totalVatAmountToStr = totalAmountToStr;
					//    formBodyAndCreate();
					//}                     
				});

				function formBodyAndCreate() {
					var docDefinition = {
						content:
						[
							{
								columns: [
									{
										text: 'ЗАТВЕРДЖУЮ \n \n Директор \n ТОВАРИСТВО З ОБМЕЖЕНОЮ \n ВІДПОВІДАЛЬНІСТЮ "Е-ТЕНДЕР" \n \n _________________________________ \n \n Мельник І. І.',
										width: 280,
									},
									{
										text: 'ЗАТВЕРДЖУЮ \n \n _________________________________ \n ' + buyerName + ' \n \n _________________________________ \n \n _________________________________',
										width: '*',
									}],
								margin: [0, 5, 0, 0],
								alignment: 'left',
								style: 'header'
							},
							{
								text: 'АКТ \n здачі-прийняття робіт (надання послуг) \n від ' + actDate,
								alignment: 'center',
								margin: [0, 40, 0, 0],
								width: '*',
								bold: 'true',
								style: 'title'
							},
							{
								text: '\t\t\t\t\t Ми, представники Замовника ' + buyerName + ' _________________________________ , \n з одного боку, та представник Виконавця ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ "Е-ТЕНДЕР" Мельник І. І., з іншого боку, склали цей акт про те, що на підставі наведених документів :',
								alignment: 'left',
								margin: [0, 20, 0, 0],
								width: '*',
								style: 'content'
							},
							{
								text: '_________________________________',
								alignment: 'center',
								margin: [0, 20, 0, 0],
								width: '*',
								style: 'content'
							},
							{
								text: '\t\t\t\t\t Виконавцем були виконані наступні роботи (надані такі послуги):',
								alignment: 'left',
								margin: [0, 10, 0, 0],
								width: '*',
								style: 'content'
							},
							{
								'table': {
									'body': body,
								},
								margin: [0, 10, 0, 0],
								fontSize: 10.5
							},
							{
								columns: [
									{
										text: 'Разом з ПДВ:',
										width: 100
									},
									{
										text: vm.totalAmount.toFixed(2) + '',
										width: 100
									}
								],
								margin: [300, 10, 0, 0],
								alignment: 'right',
								bold: 'true',
								style: 'content'
							},
							{
								columns: [
									{
										text: 'У тому числі ПДВ:',
										width: 100
									},
									{
										text: vatAmount.toFixed(2),
										width: 100
									}
								],
								margin: [300, 10, 0, 0],
								alignment: 'right',
								bold: 'true',
								style: 'content'
							},
							{
								text: 'Загальна вартість робіт (послуг) з ПДВ ' + vm.totalAmount.toFixed(2) + ' грн (' + totalAmountToStr + '), у т.ч. ПДВ ' + vatAmount.toFixed(2) + ' грн \n Замовник претензій по об`єму, якості та строкам виконання робіт (надання послуг) не має.',
								alignment: 'left',
								margin: [0, 10, 0, 0],
								width: '*',
								style: 'content'
							},
							{
								text: 'Місце складання: м.Київ',
								alignment: 'left',
								margin: [0, 30, 0, 0],
								width: '*',
								style: 'content'
							},
							{
								columns: [
									{
                                        text: 'Від Виконавця: \n \n _________________________________  Діхтяр В. В. \n \n ТОВАРИСТВО З ОБМЕЖЕНОЮ \n ВІДПОВІДАЛЬНІСТЮ "Е-ТЕНДЕР" \n П/р ' + $scope.bill + '\n ПАТ КБ "ПРИВАТБАНК", МФО 305299 \n 04119 м.Київ, вул. Дегтярівська, буд. 21, літ. "А" \n код ЄДРПОУ 39484263',
										width: 280,
									},
									{
										text: 'Від Замовника: \n \n _________________________________ \n \n \n \n \n _________________________________ \n ' + buyerName + ' \n код за ЄДРПОУ ' + buyerEdrpouOrInn + ' \n ' + buyerAddress,
										width: '*',
									}],
								margin: [0, 30, 0, 0],
								alignment: 'left',
								style: 'content'
							}
						],
						styles: {
							header: {
								fontSize: 11
							},
							title: {
								fontSize: 12,
								bold: true
							},
							tableHeader: {
								fontSize: 10,
								bold: true
							},
							content: {
								fontSize: 10
							}
						}
					};
					//pdfMake.createPdf(docDefinition).open();
					pdfMake.createPdf(docDefinition).download('act' + actNum + '.pdf');
				};
			};

			$scope.generateInvoice = function () {
				$scope.invoiceInput.amount = parseInt($scope.invoiceInput.amount);
				var createInvoice = invoice.createInvoice($scope.invoiceInput.amount);
				createInvoice.then(function (resposne) {
				    var data = resposne.data;
					//console.log("Created invoice:", data);
					var invoiceParams = {
						amount: data.amount,
						invoiceNumber: data.number,
						amountToStr: data.numberInWords,
						vatToStr: data.vatInWords,
						isVatPayer: new Date(data.creationTime) >= vm.startVatDate,
						d: data.creationTime,
						quantity: 1
					};
					var getOrganization = organization.getOrganization({ tenantId: data.tenantId });
					getOrganization.then(function (resposne) {
						//console.log("Organ for invoice: ", data);
					    invoiceParams.buyerName = resposne.data.name;
					    invoiceParams.buyerCode = resposne.data.codeOfOrganization;

						createPDF(invoiceParams);
					});

				});
			};

			var getSiteSettings = function () {
				var getSettings = settings.getSetting();
				getSettings.then(function (resposne) {
				    var data = resposne.data;
					console.log("Settings: ", data);
					vm.startActGenerateDate = new Date(new Date(data.startActGenerateDate).getFullYear(), new Date(data.startActGenerateDate).getMonth(), 1, 0, 0, 0, 0);
					vm.startActGenerateYear = new Date(new Date(data.startActGenerateDate).getFullYear(), 0, 1, 0, 0, 0, 0);
					vm.startVatDate = new Date(data.startVatDate);
					vm.vatValue = data.vatValue;
					console.log('startActGenerateDate=' + vm.startActGenerateDate);
				});
			};

			//getSiteSettings();

			$scope.vm = {
				invoiceToPdf: invoiceToPdf,
				actToPdf: actToPdf,
				actToHtml: actToHtml,
				selDate: null,
				startActGenerateDate: null,
				//endActGenerateDate: new Date(new Date().getUTCFullYear(), new Date().getUTCMonth()-1, 1, 0, 0, 0, 0),
				startActGenerateYear: null,
				startVatDate: null,
				isActVatPayer: null,
				vatValue: null,
				actItems: null,
				actNumber: null,
				actDate: null,
				totalAmount: 0,
				watchSingleAct: false
			}
			var vm = $scope.vm;
			activate();
			function activate() {
				vm.tableParams = new ngTableParams({
					page: 1,
					count: 10,
					sorting: {
						CreationTime: 'desc'
					},
				}, {
						total: 0,
						counts: [],
						getData: getData
					});
				vm.tableParamsTransact = new ngTableParams(
					{
						page: 1,
						count: 10
					},
					{
						total: 0,
						counts: [],
						getData: getDataTransactions
					});
				vm.tableParamsBids = new ngTableParams(
					{
						page: 1,
						count: 10
					},
					{
						total: 0,
						counts: [],
						getData: getDataBids
					});
			};

			function invoiceToPdf(invoice) {
				var invoiceParams = {
					amount: invoice.amount,
					invoiceNumber: invoice.number,
					amountToStr: invoice.numberInWords,
					vatToStr: invoice.vatInWords,
					isVatPayer: new Date(invoice.creationTime) >= vm.startVatDate,
					d: invoice.creationTime,
					quantity: 1
				};
				organization.getOrganization({ tenantId: invoice.tenantId })
					.then(function (resposne) {
					    invoiceParams.buyerName = resposne.data.name;
					    invoiceParams.buyerCode = resposne.data.codeOfOrganization;

						createPDF(invoiceParams);
					});
			}

			function actToPdf(month) {
				getActs(month, function () {
					getActNumber(month, function () {
						if (vm.actItems.length == 0) {
							return;
						};
						vm.actDate = new Date(vm.selDate.getFullYear(), month - 1, datesHelperService.daysInMonth(month, vm.selDate.getFullYear()), 0, 0, 0, 0);
						vm.isActVatPayer = new Date(new Date(vm.actDate).getFullYear(), new Date(vm.actDate).getMonth(), 1, 0, 0, 0, 0) >=
							new Date(new Date(vm.startVatDate).getFullYear(), new Date(vm.startVatDate).getMonth(), 1, 0, 0, 0, 0);
						var actParams = {
							//actNum: vm.actNumber,
							//actDate: vm.actDate,
							//items: vm.actItems,
							buyerName: "",
							buyerEdrpouOrInn: "",
							buyerAddress: ""
						};

						organization.getOrganization({ tenantId: $scope.ng_localStorage.userTenantId })
							.then(function (resposne) {
							    var data = resposne.data;
								actParams.buyerName = data.name;
								actParams.buyerEdrpouOrInn = data.codeOfOrganization;

								actParams.buyerAddress = data.address.postIndex + ', ' + data.address.country.title + ', ' + data.address.city.title + ', ' + data.address.addressStr;

								createActPDF(actParams);
							});
					});
				});
			}

			function actToHtml(month) {
				getActs(month, function () {
					if (vm.actItems.length == 0) {
						return;
					};
					vm.watchSingleAct = true;
					vm.actDate = new Date(vm.selDate.getFullYear(), month - 1, datesHelperService.daysInMonth(month, vm.selDate.getFullYear()), 0, 0, 0, 0);
					vm.isActVatPayer = new Date(new Date(vm.actDate).getFullYear(), new Date(vm.actDate).getMonth(), 1, 0, 0, 0, 0) >= vm.startVatDate;
				});
			}

			function getData($defer, params) {
				var sorting = params.sorting();
				var orderColumn = 'CreationTime';
				var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
				var pager = {
					page: params.page(),
					pageSize: params.count(),
					orderColumn: orderColumn,
					orderDirection: orderDirection
				};
				invoice.getInvoices(pager)
					.then(function (resposne) {
					    params.total(resposne.data.totalCount);
					    $defer.resolve(resposne.data.items);
					});
			};
			function getDataTransactions($defer, params) {
				var pager = {
					page: params.page(),
					pageSize: params.count(),
					userId: $scope.ng_localStorage.userId,
					date: new Date()
				};
				allbanking.getAccountTransactionsCurrentUserPager(pager)
					.then(function (resposne) {
					    $scope.transactions = resposne.data.items;
					    params.total(resposne.data.totalCount);
					    $defer.resolve(resposne.data.items);
					});
			};
			function getDataBids($defer, params) {
				var pager = {
					page: params.page(),
					pageSize: params.count(),
					date: new Date(),
					order: 0
				};
				allbanking.getApplicationsByUserIdPager(pager)
					.then(function (resposne) {
					    $scope.bids = resposne.data.items;
					    params.total(resposne.data.totalCount);
					    $defer.resolve(resposne.data.applications);
					});
			};

			$scope.getDataActs = function () {
				var input = {
					numberOfYear: vm.selDate.getFullYear()
				};

				abp.ui.setBusy(".panel-default");

				act.getMonthsActExists(input)
					.then(function (resposne) {
						$scope.actsMonths = [];
						var months = moment.months();
						for (var i = 0; i < months.length; i++) {
							if (new Date(input.numberOfYear, i, 1, 0, 0, 0, 0) >= vm.startActGenerateDate)
								$scope.actsMonths.push({
									mon: months[i],
									monNumber: i + 1,
									hasAct: resposne.data != null ? resposne.data.indexOf(i + 1) : -1
								});
						}
						abp.ui.clearBusy(".panel-default");
					});
			}

			function getActNumber(month, callback) {
				var input = {
					numberOfMonth: month,
					numberOfYear: vm.selDate.getFullYear()
				}

				act.getActNumber(input)
					.then(function (resposne) {
					    vm.actNumber = resposne.data.number;

						callback();
					});
			};

			function getActs(month, callback) {
				var input = {
					numberOfMonth: month,
					numberOfYear: vm.selDate.getFullYear()
				}
				abp.ui.setBusy(".panel-default");

				act.getActs(input)
					.then(function (resposne) {
					    vm.actItems = resposne.data;
					    vm.totalAmount = summ(resposne.data, 'amount');
						abp.ui.clearBusy(".panel-default");

						callback();
					});
			}

			var summ = function (items, prop) {
				return items.reduce(function (a, b) {
					return a + b[prop];
				}, 0);
			}

		}]);
})();;
(function () {
    var controllerId = 'changePasswordCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$state', '$http', '$location', '$localStorage', function ($scope, $state, $http, $location, $localStorage) {

            var username = $localStorage.username;
            $scope.isChangedPassword = false;


            var changePassword = function (changeData) {
                return abp.ajax({
                    url: abp.appPath + "Account/ChangePassword",
                    type: 'POST',
                    data: JSON.stringify(changeData),
                    beforeSend: abp.ui.setBusy('#changePasswordBtn')
                });
            };
            $scope.submit = function () {
                var changeData = {
                    UserName: username,
                    OldPassword: $scope.oldPassword,
                    NewPassword: $scope.newPassword
                };

                var req = changePassword(changeData);
                req.then(
                    function (status) {
                        $('#ChangePassword').modal('hide');
                        abp.notify.success('Ви успішно змінили пароль!');
                        $scope.$apply(function () { $location.path("/"); });
                        $state.reload();
                    });
                abp.ui.clearBusy('#changePasswordBtn');
                return req;
            };
        }
    ]);
})();;
// TODO: separate logic of controller and directive
(function () {
    var controllerId = 'childOrganizationsCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', 'abp.services.etender.organization', 'ngTableParams', '$localStorage',
        function ($rootScope, $scope, organization, ngTableParams, $localStorage) {
            $scope.orgInput = {
                page: 1,
                pageSize: 10,
                parentId: $localStorage.organizationId,
                codeEdrpou: null
            };
            $scope.tableChildOrgs = new ngTableParams(
                {
                    page: 1,
                    count: 10
                },
                {
                    counts: [],
                    getData: function ($defer, params) {
                        $scope.orgInput.codeEdrpou = $scope.codeEdrpou;
                        $scope.orgInput.maxResultCount = params.count();
                        $scope.orgInput.skipCount = (params.page() - 1) * params.count();
                        $scope.orgInput.sorting = 'NameCPV ASC';
                        $scope.orgInput.page = params.page();
                        var childOrganizations = organization.getChildOrganizations($scope.orgInput);
                        abp.ui.setBusy(".panel-default:first");
                        childOrganizations.then(function (response) {
                            params.total(response.data.totalCount);
                            $defer.resolve(response.data.items);
                            $scope.isChildOrgExist = response.data.items.length > 0;
                            abp.ui.clearBusy(".panel-default");
                        },
                        function () {
                            abp.ui.clearBusy(".panel-default");
                        });;
                    }
                });
            $scope.search = function () {
                $scope.tableChildOrgs.reload();
                $scope.tableChildOrgs.page(1);
            };
        }])
      .directive('backButton', function () {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                element.bind('click', goBack);
                function goBack() {
                    history.back();
                    scope.$apply();
                }
            }
        }
    });
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('choosedTendersCtrl', choosedTenders);
    choosedTenders.$inject = [
        '$scope',
        '$rootScope',
        '$timeout',
        'ngTableParams',
        'abp.services.etender.tender',
        'lookupService',
        '$localStorage',
        '$http',
        '$controller',
        '$location',
        '$sessionStorage',
        'abp.services.etender.readTender'];
    function choosedTenders($scope,
        $rootScope,
        $timeout,
        ngTableParams,
        tenderAppService,
        lookupService,
        $localStorage,
        $http,
        $controller,
        $location,
        $sessionStorage,
        readTenderAppService) {

        $scope.ng_localStorage = $localStorage;
        $scope.ng_sessionStorage = $sessionStorage;

        $scope.defaultSorting = { 'tenderEndDate': 'desc' };

        angular.extend(this, $controller('tenderTableCtrl', {
            $scope: $scope
        }));

        // date today
        var s = new Date();
        $scope.dateToDay = Date.parse(s);
        $scope.vm = {
            toggleFavourite: toggleFavourite,
            checkedChange: checkedChange,
            isChangesOnPage: isChangesOnPage,
            orderColumn: '',
            orderDirection: ''
        };
        var vm = $scope.vm;
        $scope.hasFavorites = false;
        var favorites = [];
        var end;
        $scope.end = [];

        $scope.getTendersFunc = function (pager, params, defer) {
            pager.SearchFilter.isFavourite = true;
            var getListOfTenders = readTenderAppService.getTenders(pager);
            getListOfTenders.then(function (response) {
                $scope.showTendersFunc(response, params, defer);
                if (response.data.countAllRecords > 0) $scope.hasFavorites = true;
                favorites = response.data.tender.map(function (i) {
                    return { tenderId: i.id };
                });
                for (var i = 0; i < response.data.tender.length; i++) {
                    end = response.data.tender[i].tenderEndDate;
                    $scope.end[i] = Date.parse(end);
                }
            },
                function (errorResponse) {
                    console.log(errorResponse.data);
                });
        }


        var searchFilter = {
            isProductionMode: $scope.ng_localStorage.isProdMode,
            ProcurementMethod: ['open', 'selective'],
            isFavourite: true
        };

        $scope.getTenderProcedureType = function (tender) {
            if (!tender) return null;
            return lookupService.getTenderProcedureType(tender.procurementMethodType);
        };

        function toggleFavourite(event) {
            var i = $(event.target);
            i.toggleClass('opacity1');
            var tenderId = i.attr('data-tenderId');
            var p = isDelete();
            if (p === 0) {
                tenderAppService
                    .createFavorite({ tenderId: tenderId })
                    .then(function (response) {
                        if (response.data) {
                            favorites.push({
                                tenderId: tenderId
                            });
                            abp.notify.success('Додано до обраного');
                        }
                    });
            } else {
                tenderAppService
                    .deleteFavorite({ tenderId: tenderId })
                    .then(function (response) {
                        if (response.data) {
                            favorites.splice(p.ind, 1);
                            abp.notify.info('Видалено з обраного');
                        }
                    });
            }

            function isDelete() {
                for (var k = 0; k < favorites.length; k += 1) {
                    if (favorites[k].tenderId == tenderId) {
                        return { ind: k };
                    }
                }
                return 0;
            }
        };

        function checkedChange(data) {
            if (data && data.id) {
                tenderAppService
                    .setIknowFavoriteTender({ tenderId: data.id })
                    .then(function (respons) {
                        abp.notify.success('Ознайомився');
                        data.isFavoriteTenderChanged = false;
                    });
            } else {
                var tendersToCheck = [];
                data.forEach(function (tender) {
                    if (tender.isFavoriteTenderChanged) {
                        tendersToCheck.push(tender.id);
                        tender.isFavoriteTenderChanged = false;
                    }
                });
                tenderAppService
                    .setIknowFavoriteTenders({ tenderIds: tendersToCheck })
                    .then(function () {
                        abp.notify.success('Ознайомився з усіма на сторінці');
                    });
            }
        }

        function isChangesOnPage(data) {
            var i = 0;
            for (i; i < data.length; i++) {
                if (data[i].isFavoriteTenderChanged)
                    return true;
            }
            return false;
        }

        $scope.getFavoriteTendersToExcel = function () {
            var pager = {
                page: 1,
                pageSize: 1, //переопределяется на сервере до intMax
                orderColumn: vm.orderColumn,
                orderDirection: vm.orderDirection,
                SearchFilter: searchFilter,
                includeFavorite: true
            };
            pager.SearchFilter.isFavourite = true;
            abp.ui.setBusy();
            tenderAppService.getTendersExcel(pager)
                .then(function (fileName) {
                    //console.log('Excel Получили с сервака:', fileName);
                    $http({
                        url: "api/files/DownloadAndDelete",
                        method: "POST",
                        params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                        responseType: 'arraybuffer'
                    }).then(function (response) {
                        var file = new Blob([response.data], { type: 'application/octet-stream' });
                        saveAs(file, fileName.data);
                        abp.ui.clearBusy();
                    },
                        function () {
                            abp.ui.clearBusy();
                        });
                },
                function () {
                    abp.ui.clearBusy();
                });
        };

        $scope.reload = function () {
            $scope.tableParams.reload();
        }

        $scope.navigation = [
            {
                title: $rootScope.source('CompetitiveProcedures'),
                type: 'open',
                active: true,
                show: true,
                openFunc: function () {
                    navigationClicked(['open', 'selective']);
                },
                imgClass: 'ico_konk-g'

            }, {
                title: $rootScope.source('NoncompetitiveProcedures'),
                type: 'limited',
                active: false,
                show: true,
                openFunc: function () {
                    navigationClicked(['limited']);
                },
                imgClass: 'ico_nokonk-g'
            }
        ];
        function navigationClicked(procType) {
            $scope.procurementMethod = procType;
            $scope.isArchive = false;
            $location.search('page', 1);
            $scope.generateTableTenders();
        };
        $scope.putDataToSessionStorage = function () {
            $sessionStorage.choosedTendersSearchString = $scope.vModel.searchString;
        }

        $scope.setSearchStringFromSessionStorage = function (pager) {
            if ($sessionStorage.choosedTendersSearchString) {
                $scope.vModel.searchString = $sessionStorage.choosedTendersSearchString;
                pager.searchIdentifier = $sessionStorage.choosedTendersSearchString;
            }
        }

    }
})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('classificationCpvCtrl', classificationCpv);

    classificationCpv.$inject = ['$scope', '$filter', '$timeout', 'ngTableParams', 'abp.services.etender.reference'];

    function classificationCpv($scope, $filter, $timeout, ngTableParams, referenceService) {
        $scope.init = function (getData, updateData) {
            vm.tableParamsCpv = new ngTableParams({
                page: 1, // start page
                count: 10 // items per page
            }, {
                total: 0,
                counts: [], // page size buttons
                getData: getData
            });
            vm.updateDataCpv = updateData;
        };

        if (!$scope.vm) $scope.vm = {};
        var vm = $scope.vm; // subscription       
       
        var timer;
        vm.searchCpv = function() {
            $timeout.cancel(timer);
            timer = $timeout(function() {
                vm.tableParamsCpv.reload();
                vm.tableParamsCpv.page(1);
            }, 1000);
        };
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('classificationDkCtrl', classificationDk);

    classificationDk.$inject = ['$scope', '$filter', '$timeout', 'ngTableParams', 'abp.services.etender.reference'];

    function classificationDk($scope, $filter, $timeout, ngTableParams, referenceService) {
        var vm = $scope.vm; // subscription       

        var timer;
        vm.searchDk = function () {
            $timeout.cancel(timer);
            timer = $timeout(function () {
                vm.tableParamsDk.reload();
                vm.tableParamsDk.page(1);
            }, 1000);
        };

        $scope.init = function (getData, updateData) {
            vm.tableParamsDk = new ngTableParams({
                page: 1, // start page
                count: 10 // items per page
            }, {
                total: 0,
                counts: [], // page size buttons
                getData: getData
            });
            vm.updateDataDk = updateData;
        };
    }
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('invationListCtrl', invationList);

    invationList.$inject = ['$scope', 'ngTableParams', 'abp.services.etender.emails'];

    function invationList($scope, ngTableParams, emailsService) {
        $scope.vm = {
            deleteMessage: deleteMessage,
            setMessage: setMessage,
            selectedMessage: null,
            messages: []
        };
        var vm = $scope.vm;

        activate();

        function activate() {
            vm.tableParams = new ngTableParams({
                page: 1,
                count: 10
            }, {
                total: 0,
                counts: [], // page size buttons
                getData: getData
            });            
        }

        function getData($defer, params) {
            abp.ui.setBusy('.main-container');
            var getMessagesInput = {
                maxResultCount: params.count(),
                messageType: 1,
                showToUserOrFromUserOrAll: 2,
                skipCount: (params.page() - 1) * params.count(),
                sorting: 'CreationTime DESC'
            };
            emailsService
                .getMessages(getMessagesInput)
                .then(function (response) {
                    abp.ui.clearBusy('.main-container');
                    vm.messages = response.data.items;
                    params.total(response.data.totalCount);
                    $defer.resolve(response.data.items);
                });
        }

        //#region Model
        function deleteMessage(ind) {
            var input = {
                id: vm.messages[ind].id
            };
            emailsService
                .deleteMessage(input)
                .then(function() {
                    abp.notify.success('Повідомлення видалено!');
                });
                vm.messages.splice(ind, 1);
                vm.selectedMessage = null;
        }
        function setMessage(ind) {
            for (var i = 0; i < vm.messages.length; i += 1) {
                vm.messages[i].$selected = false;
            }
            var c = vm.messages[ind];
            c.$selected = true;
            vm.selectedMessage = c;
        }
        //#endregion
    }
})();;
(function () {
    var controllerId = 'messagesCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', '$timeout', '$localStorage',
        'abp.services.etender.emails', 'ngTableParams', '$sce',
        function ($rootScope, $scope, $timeout, $localStorage, emails, ngTableParams, $sce) {

            $scope.body = '';
            $scope.checkedMessages = {};
            $scope.vm = {
                isAllMessagesSelected: false
            };

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: 10,
            }, {
                counts: [],
                getData: function ($defer, params) {

                    var messagesInput = {
                        maxResultCount: params.count(),
                        skipCount: (params.page() - 1) * params.count(),
                        sorting: 'CreationTime DESC'
                    };

                    var isLastPage = params.page() * params.count() >= params.total();

                    if (isLastPage && $scope.checkIfAllMessagesSelectedOnPage() && params.page() !== 1) {
                        messagesInput.skipCount -= params.count();
                        params.page(params.page() - 1);
                    }

                    var messages = emails.getMessages(messagesInput);

                    abp.ui.setBusy(".panel-default:first");
                    messages.then(function (response) {
                        params.total(response.data.totalCount);
                        $scope.messages = response.data.items;
                        $scope.checkedMessages = {};
                        $scope.vm.isAllMessagesSelected = false;
                        if ($localStorage.counters &&
                            $localStorage.counters.messages) {

                            $localStorage.counters.messages.unread = response.data.unreadCount;
                        }
                        $defer.resolve(response.data.items);
                        abp.ui.clearBusy(".panel-default");
                    });
                }
            });

            $scope.getMessage = function (id) {

                clearTimeout($scope.timerId);

                $scope.timerId = setTimeout(function () {
                    var input = {
                        id: $scope.messages[id].id
                    };
                    var isReadBefore = $scope.messages[id].isRead;
                    var getMessage = emails.getMessage(input);
                    getMessage.then(function (response) {
                        $scope.messages[id].isRead = response.data.isRead;
                        if (!isReadBefore &&
                            $localStorage.counters &&
                            $localStorage.counters.messages &&
                            $localStorage.counters.messages.unread &&
                            $scope.messages[id].isRead) {

                            $localStorage.counters.messages.unread -= 1;
                        }
                    });
                }, 2000);
                $scope.message = $scope.messages[id];
                $scope.messageBody = $sce.trustAsHtml($scope.message.body);
            };

            $scope.deleteMessage = function (id) {
                abp.ui.setBusy('#deleteMessageTable');
                $timeout(function () {
                    abp.ui.clearBusy('#deleteMessageTable');
                }, 3000);

                $scope.message = null;

                var deleteMessage = emails.hideMessagesForUser([$scope.messages[id].id]);
                deleteMessage.then(function (response) {
                    abp.notify.success('Повідомлення видалено!');
                    if ($scope.checkedMessages[$scope.messages[id].id]) {
                       delete  $scope.checkedMessages[$scope.messages[id].id];
                    }
                    $scope.tableParams.reload();
                });
            };

            $scope.checkAllMessages = function () {
                $scope.tableParams.data.forEach(function(message) {
                    $scope.checkedMessages[message.id] = $scope.vm.isAllMessagesSelected;
                });
            };

            $scope.markAllMessagesAsRead = function () {
                abp.notify.info('Це може зайняти до декількох хвилин');
                abp.ui.setBusy();
                var markAllMessagesAsRead = emails.markAllMessagesAsRead();
                markAllMessagesAsRead.then(function () {
                    abp.notify.success('Повідомлення позначені як прочитані!');
                    abp.ui.clearBusy();
                    $scope.tableParams.reload();
                });
            };

            $scope.isMessagesSelected = function () {
                var values = [];
                for(var key in $scope.checkedMessages) {
                    values.push($scope.checkedMessages[key]);
                }

                if (values && values.length) {
                    return values.some(Boolean);
                } else {
                    return false;
                }
            };

            $scope.deleteAllMessages = function () {
                emails.hideAllMessagesForCurrentUser().then(function (resposne) {
                    abp.notify.success('Повідомлення видалені!');
                    $scope.vm.isAllMessagesSelected = false;
                    $scope.tableParams.reload();
                });
                $scope.message = null;
            };

            $scope.deleteSelectedMessages = function () {
                var ids = [];
                for (var key in $scope.checkedMessages) {
                    if ($scope.checkedMessages[key]) {
                        ids.push(key);
                    }
                }

                var deleteMessage = emails.hideMessagesForUser(ids);
                deleteMessage.then(function (response) {
                    abp.notify.success('Повідомлення видалені!');
                    $scope.vm.isAllMessagesSelected = false;
                    $scope.tableParams.reload();
                    $scope.message = null;
                    $scope.checkedMessages = {};
                });
            };

            $scope.checkIfAllMessagesSelectedOnPage = function () {
                if ($scope.messages && $scope.messages.length) {
                    var isSelectedAllMessages = true;
                    var checkedMessagesArr = [];

                    for (var key in $scope.checkedMessages) {
                        checkedMessagesArr.push({id: key, value: $scope.checkedMessages[key]});
                    }

                    $scope.messages.forEach(function (message) {
                        var isMessageSelected = checkedMessagesArr.find(function (checkedMessage) {
                            return message.id.toString() === checkedMessage.id && checkedMessage.value;
                        });

                        if (!isMessageSelected) {
                            isSelectedAllMessages = false;
                        }
                    });

                    return isSelectedAllMessages;
                } else {
                    return false;
                }
            };
        }]);
})();
;
(function () {
    var controllerId = 'messengersCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$rootScope',
        'abp.services.etender.messengerSubscription',
        'abp.services.etender.telegram',
        'abp.services.etender.viber',
        '$location',
        '$window',
        function (
            $scope,
            $rootScope,
            messengerSubscriptionService,
            telegramService,
            viberService,
            $location,
            $window
        ) {
            $scope.url = $location.path();
            
            $scope.getMessangerSubscription = function() {
                messengerSubscriptionService.getMessangerSubscription()
                    .then(function (response) {
                        console.log(response.data);
                        $scope.messengerSubscriptions = response.data;
                    });
            }

            $scope.getSubscriptionLink = function () {
                telegramService.getSubscriptionLink()
                    .then(function (response) {
                        $scope.subscriptionLink = response.data;
                    });
            }

            $scope.getSubscriptionLinkViber = function () {
                viberService.getSubscriptionLink()
                    .then(function (response) {
                        $scope.subscriptionLinkViber = response.data;
                    });
            }

            $scope.updateMessangerSubscription = function () {
                messengerSubscriptionService.updateMessangerSubscription($scope.messengerSubscriptions)
                    .then(function () {
                        abp.notify.success(abp.localization.localize('MessengerSubscribesChangedSuccess', 'Shared'));
                    });
            };

            $scope.redirectViberSubscrpLink = function() {
                $window.open($scope.subscriptionLinkViber, '_blank');
            }

            $scope.getMessangerSubscription();
            $scope.getSubscriptionLink();
            $scope.getSubscriptionLinkViber();
        }]);
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('modalClassificationsCtrl', modalClassifications);
    modalClassifications.$inject = [
        '$scope',
        '$filter',
        '$timeout',
        'ngTableParams',
        'abp.services.etender.reference',
        '$rootScope'
    ];
    function modalClassifications(
        $scope,
        $filter,
        $timeout,
        ngTableParams,
        referenceService,
        $rootScope
    ) {
        $scope.init = function (getData, updateData) {
            vm.tableParamsCpv = new ngTableParams({
                page: 1,   // show first page
                count: 999  // count per page
            }, {
                counts: [], // page size buttons
                getData: getData
            });
            vm.updateDataCpv = updateData;
        };

        if (!$scope.vm) $scope.vm = {};
        var vm = $scope.vm; // subscription       

        $scope.loadOrDeleteChildItems = function (data, item) {
            var tableScope = vm;
            tableScope.tableParamsCpv.data = data;
            var childItems = referenceService.getClassificationRef(item.id);
            var currIndex = 0;

            tableScope.tableParamsCpv.data.some(function (cpvItem, i) {
                if (cpvItem.id === item.id) {
                    currIndex = i;
                    return true;
                }
            });

            if (item.isOpen) {
                if (!$scope.vm.searchStringCpv) {
                    while (tableScope.tableParamsCpv.data[currIndex + 1].rank > item.rank) {
                        tableScope.tableParamsCpv.data.splice(currIndex + 1, 1);
                    }
                    item.isOpen = false;
                } else {
                    tableScope.tableParamsCpv.data.splice(currIndex + 1, item.childsCount)
                    item.isOpen = false;
                }
                return;
            }
  
            abp.ui.setBusy(".modal-body");
            childItems.then(function (response) {
                item.isOpen = true;
                if (response.data) {
                    item.childsCount = response.data.length;
                    for (var i = response.data.length; i--; i >= 0) {
                        tableScope.tableParamsCpv.data.splice(currIndex + 1, 0, response.data[i]);
                    }
                    if (item.$selected) {
                        response.data.forEach(function (childItem) { childItem.$selected = true; });
                    }
                }
                vm.updateDataCpv(tableScope.tableParamsCpv.data, item, true);
                abp.ui.clearBusy(".modal-body");
            });
        };

        $rootScope.clearCheckbox = function () {
            if (vm.tableParamsCpv)
                vm.tableParamsCpv.data.forEach(function (child) { child.$selected = false; })
        };

        var timer;
        vm.searchCpv = function (searchstring) {
            $scope.searchstring = searchstring;
            $timeout.cancel(timer);
            timer = $timeout(function () {
                vm.tableParamsCpv && vm.tableParamsCpv.reload();
            }, 1000);
        };

        $scope.hideModal = function (id) {
            $(id).modal('hide');
        }
    }
})();;
angular.module('app')
    .controller('modalSubscriptionHelpCtrl', ['$rootScope', '$scope',
        function ($rootScope, $scope) {
            $scope.localization = {
                tenderiv: 'тендерів',
                zakupivli: 'закупівлі',
                tenderi: 'тендери',
                zakupivel: 'закупівель',
                zakupivlyam: 'закупівлям'
            }
        }]);;
(function () {
    var controllerId = 'myBidsCtrl';
    angular.module('app').controller(controllerId, [

        '$rootScope',
        '$scope',
        'ngTableParams',
        'abp.services.etender.getBids',
        'tenderHelperService',
        '$http',
        'lookupService',
        'abp.services.etender.reference',
        'specialDataService',
        'abp.services.etender.log',
        '$localStorage',
        '$sessionStorage',
        '$timeout',
        'referenceService',
        'urlService',

        function (
            $rootScope,
            $scope,
            ngTableParams,
            getBids,
            tenderHelperService,
            $http,
            lookupService,
            abpReferenceService,
            specialDataService,
            logAppService,
            $localStorage,
            $sessionStorage,
            $timeout,
            referenceService,
            urlService
    ) {
            $scope.WriteAddress = function(tender){
                logAppService.logIpAddress("BidParticipationUrl", tender.tenderLotName);
            };
            var vm = {};
            var simpleProcType = { id: 15, procurementMethod: 'open', procurementMethodType: 'belowThresholdSimple', procurementMethodTypeDescription: 'Спрощена закупівля', procurementMethodTypeLocal: 'Спрощена закупівля', isSimpleProcurementMethodRationale: false };
            $scope.vm = vm;
            if (!$scope.procTypesDictionary) $scope.procTypesDictionary = [];
            $scope.regexNumber = $rootScope.regex.number;
            $scope.draftStr = $rootScope.source('Draft');
            $scope.showClearFilterButton = false;
            $scope.id = 'myPropositions';
            vm.checkedRegions = [];
            vm.regionsSearchText = null;

            $scope.localization = {
                tenderNumber: $rootScope.source('TenderNumber'),
                tenderLotName: $rootScope.source('TenderLotName'),
                tenderStatus: $rootScope.source('TenderStatus'),
                searchById: $rootScope.source('SearchByTenderID')
            }

            $scope.bidsNeedLoadDocumentsCount = 0;

            $scope.checkedProcTypes = [];
            $scope.procTypeSearchText = null;

            //****** get procurement Method
            if (!$sessionStorage.procTypeMyPropositions) {
                $sessionStorage.procTypeMyPropositions = ['open', 'selective'];
                $scope.procurementMethod = $sessionStorage.procTypeMyPropositions;
            } else {
                $scope.procurementMethod = $sessionStorage.procTypeMyPropositions;
            };

            $scope.getClearFilterButton = function () {
                if (
                    //$scope.filterForm.checkedBidStatuses.length === 0 &&
                    //$scope.filterForm.checkedLotStatuses.length === 0 &&
                    //$scope.filterForm.checkedStatuses.length === 0 &&

                    !$scope.filterForm.statusBidSearchText &&
                    !$scope.filterForm.statusLotSearchLabel &&
                    !$scope.filterForm.statusLotSearchText &&
                    !$scope.filterForm.statusSearchLabel && 
                    !$scope.filterForm.statusSearchText &&
                    !$scope.tbPr.searchByTenderIdAndName &&
                    !$scope.filter.priceFrom &&
                    !$scope.filter.priceTo && 
                    !$scope.filter.startAuctionDate &&
                    !$scope.filter.endAuctionDate &&
                    (!$scope.filterForm.selectedStatuses || $scope.filterForm.selectedStatuses && $scope.filterForm.selectedStatuses.length === 0) &&
                    !$scope.filter.tenderLotName &&
                    ($scope.filter.procurementMethodTypes && $scope.filter.procurementMethodTypes.length === 0) &&
                    (!$scope.filter.bidStatuses || $scope.filter.bidStatuses && $scope.filter.bidStatuses.length === 0) &&
                    (!$scope.filter.lotStatuses || $scope.filter.lotStatuses && $scope.filter.lotStatuses.length === 0) &&
                    (!$scope.filter.statuses || $scope.filter.statuses && $scope.filter.statuses.length === 0) &&
                    (!$scope.filterForm.parentCodeEDRPOU || $scope.filterForm.parentCodeEDRPOU.length === 0) &&
                    $scope.filterForm.selectedOrgCodes.length === 0 &&
                    !$scope.filter.organizationName &&
                    ($scope.filter.regions && $scope.filter.regions.length === 0 || !$scope.filter.regions) &&
                    !$scope.filter.actualBids
                ) {
                    $scope.showClearFilterButton = false;
                    return;
                }
                $scope.showClearFilterButton = true;
            }

            if ($localStorage.myPropositionsFilters) {

                $scope.filter = $localStorage.myPropositionsFilters.filterData;
                $scope.filterForm = $localStorage.myPropositionsFilters.filterForm;
                $scope.tbPr = $localStorage.myPropositionsFilters.tbPr;

            } else {
                $scope.tbPr = {
                    searchByTenderIdAndName: '',
                    orderColumn: '',
                    orderDirection: ''
                };
                $scope.filter = {
                    statuses: null,
                    lotStatuses: null,
                    bidStatuses: null,
                    tenderLotName: null,
                    organizationName: null,
                    priceFrom: null,
                    priceTo: null,
                    parentCodesEDRPOU: [],
                    startAuctionDate: null,
                    endAuctionDate: null,
                    regions: [],
                    procurementMethodTypes: null
                };
                $scope.filterForm = {
                    allStatuses: null,
                    statusDictionary: [],
                    statusSearchLabel: null,
                    statusSearchText: null,
                    checkedStatuses: [],
                    procurementMethod: 'open',

                    allLotStatuses: null,
                    statusLotDictionary: [],
                    statusLotSearchLabel: null,
                    statusLotSearchText: null,
                    checkedLotStatuses: [],

                    allBidStatuses: null,
                    statusBidDictionary: [],
                    statusBidSearchLabel: null,
                    statusBidSearchText: null,
                    checkedBidStatuses: [],

                    isStatOpen1: false,
                    isStatOpen2: false,
                    isStatOpen3: false,

                    orgCodeNotExists: null,
                    parentCodeEDRPOU: null,
                    selectedOrgCodes: []
                };
            }

            var page = urlService.redirectToCorrectPage();
            var tbPr = $scope.tbPr,
                filter = $scope.filter,
                filterForm = $scope.filterForm,
                selectedStatuses = [],
                selectedLotStatuses = [],
                selectedBidStatuses = [];

            tbPr.tableParams = new ngTableParams({
                page: page,
                count: 10
            },
            {
                counts: [],
                getData: function ($defer, params) {
                    var orderBy = params.orderBy();
                    var sorting = params.sorting();
                    tbPr.orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : '';
                    tbPr.orderDirection = sorting[tbPr.orderColumn] ? sorting[tbPr.orderColumn] : 'desc';
                    
                    var pager = {
                        page: params.page(),
                        pageSize: params.count(),
                        orderColumn: tbPr.orderColumn,
                        orderDirection: tbPr.orderDirection,
                        filter: filter
                    };

                    $rootScope.lastPage = params.page();

                    var getBidRegistry = getBids.getBidRegistry(pager);
                    abp.ui.setBusy('.myBidsCtrl');

                    getBidRegistry.then(function (response) {
                        console.log(response);
                        response.data.registry.forEach(function (item) {
                            item.lotStatusDesc = lookupService.getLotStatusDesc(item.lotStatus);
                            item.tenderStatusDesc = lookupService.getTenderStatusDesc(item.tenderStatus);
                            item.entityStatusDesc = lookupService.getDynamicStatusDesc(item.dynamicStatusName, true);
                            item.entityName = lookupService.getEntityDesc(item.entityName);
                        });
                        $scope.bidsNeedLoadDocumentsCount = response.data.bidsNeedLoadDocumentsCount;
                        abp.ui.clearBusy('.myBidsCtrl');
                        $scope.getClearFilterButton();
                        if (params.page() > 0) params.total(response.data.countAllRecords);
                        $scope.allRecords = response.data.countAllRecords;
                        $defer.resolve(response.data.registry);
                    },
                    function (error) {
                        abp.ui.clearBusy();
                    });
                }
            });

            $scope.reload = function () {
                tbPr.tableParams.reload();
            }

            $scope.customTendTitle = function (title) {
                return tenderHelperService.customTendTitle(title);
            };

            $scope.search = function () {
                createFilter();
                if (tbPr.tableParams.page() == 1) {
                    tbPr.tableParams.reload();
                } else {
                    tbPr.tableParams.page(1);
                }
            };

            $scope.changeView = function (id) {
                $scope.clear(true);

                $scope.id = id;
                if ($scope.id === 'settings') {
                    location.assign('/v2/#/myPropositions/settings');
                }
            };

            function createFilter() {
                //filter.statuses = selectedStatuses.length > 0 ? selectedStatuses : filterForm.allStatuses;
                filter.statuses = filterForm.selectedStatuses;
                filter.lotStatuses = filterForm.selectedLotStatuses;
                filter.bidStatuses = filterForm.selectedBidStatuses;
                filter.regions = vm.selectedRegions;
                filter.parentCodesEDRPOU = filterForm.selectedOrgCodes.length > 0 ? filterForm.selectedOrgCodes
                    : (Array.isArray(filterForm.parentCodeEDRPOU) ? filterForm.parentCodeEDRPOU
                        : (filterForm.parentCodeEDRPOU !== null && filterForm.parentCodeEDRPOU.length > 0 ? [filterForm.parentCodeEDRPOU] : []));
                if (simpleProcType.isSimpleProcurementMethodRationale) {
                    filter.statuses.push(simpleProcType.procurementMethodType);
                }
                putFilterDataTolocalStorage();
                $scope.getClearFilterButton();
            }

            function putFilterDataTolocalStorage() {
                $localStorage.myPropositionsFilters = {
                    filterData: filter,
                    filterForm: filterForm,
                    tbPr: {
                        orderColumn: tbPr.orderColumn,
                        orderDirection: tbPr.orderDirection,
                        searchByTenderIdAndName: tbPr.searchByTenderIdAndName
                    }
                };
            }

            $scope.getBidRegistryToExcel = function () {
                createFilter();
                var pager = {
                    Page: 1,
                    PageSize: 1, //переопределяется на сервере до intMax
                    OrderColumn: tbPr.orderColumn,
                    OrderDirection: tbPr.orderDirection,
                    Filter: filter
                };

                abp.ui.setBusy('.myBidsCtrl');
                var bidRegistry = getBids.getBidRegistryToExcel(pager);

                bidRegistry.then(function (fileName) {
                    //console.log('Excel Получили с сервака:', fileName);

                    $http({
                        url: "api/files/DownloadAndDelete",
                        method: "POST",
                        params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName.data },
                        responseType: 'arraybuffer'
                    }).then(function (response) {
                        var file = new Blob([response.data], { type: 'application/octet-stream' });
                        saveAs(file, fileName.data);
                        abp.ui.clearBusy('.myBidsCtrl');
                    },
                    function () {
                        abp.ui.clearBusy('.myBidsCtrl');
                    });
                },
                function () {
                    abp.ui.clearBusy('.myBidsCtrl');
                });
            };

            $scope.archiveStatuses = ['unsuccessful', 'complete', 'cancelled'];
            $scope.defaultStatuses = specialDataService.statusesMyBids;
            filterForm.allLotStatuses = ['active', 'unsuccessful', 'cancelled', 'complete'];
            filterForm.allBidStatuses = [
                'award.pending', 'award.active', 'award.active.notLoadedDocuments', 'award.unsuccessful', 'award.cancelled', 'award.absent',
                'qualification.active', 'qualification.unsuccessful', 'qualification.pending', 'qualification.cancelled',
                'bid.active.active_tendering', 'bid.invalid', 'bid.draft', /*'bid.prequalification', 'bid.deleted', 'bid.pending', 'bid.active', */'bid.unsuccessful',
                'contract.active', 'contract.pending', 'award.24h', 'award.alp', 'qualification.24h', 'award.24hAlp'/*, 'contract.cancelled'*/
                
            ];

            filterForm.allStatuses = $scope.defaultStatuses.concat($scope.archiveStatuses);
            filterForm.statusDictionary = getStatusDictionary(filterForm.allStatuses, 1);
            filterForm.statusLotDictionary = getStatusDictionary(filterForm.allLotStatuses, 2);
            filterForm.statusBidDictionary = getStatusDictionary(filterForm.allBidStatuses, 3);

            function getStatusDictionary(statuses, tp) {
                var statusDict = [], funcGetStatusDesc;
                switch (tp) {
                    case 1:
                        funcGetStatusDesc = lookupService.getTenderStatusDesc;
                        break;
                    case 2:
                        funcGetStatusDesc = lookupService.getLotStatusDesc;
                        break;
                    case 3:
                        funcGetStatusDesc = lookupService.getDynamicStatusDesc;
                        break;
                    default:
                        funcGetStatusDesc = lookupService.getTenderStatusDesc;
                }
                angular.forEach(statuses,
                    function (st) {
                        var description = funcGetStatusDesc(st);
                        var label = lookupService.getTenderLabelClass(st);
                        statusDict.push({
                            name: st,
                            description: description,
                            label: label
                        });
                    });
                    if (tp === 3) {
                        statusDict.push({
                            name: 'bid.another_winner',
                            description: 'Переможцем обрано іншого учасника'
                        });
                    }
                return statusDict;
            }
            
            $scope.changeSelection = function (tp, st, checked) {
                switch (tp) {
                    case 1:
                        if (!st) {
                            selectedStatuses = [];
                            filterForm.checkedStatuses = [];
                            filterForm.statusSearchText = null;
                            filterForm.statusSearchLabel = null;
                        }
                        else {
                            if (checked) {
                                selectedStatuses.push(st.name);
                            } else {
                                selectedStatuses.splice(selectedStatuses.indexOf(st.name), 1);
                            }
                            makeStatusSearchText(tp);
                            makeStatusSearchLabel(tp);
                        }
                        filterForm.selectedStatuses = selectedStatuses;
                        break;
                    case 2:
                        if (!st) {
                            selectedLotStatuses = [];
                            filterForm.checkedLotStatuses = [];
                            filterForm.statusLotSearchText = null;
                            filterForm.statusLotSearchLabel = null;
                        }
                        else {
                            if (checked)
                                selectedLotStatuses.push(st.name);
                            else
                                selectedLotStatuses.splice(selectedLotStatuses.indexOf(st.name), 1);
                            makeStatusSearchText(tp);
                            makeStatusSearchLabel(tp);
                        }
                        filterForm.selectedLotStatuses = selectedLotStatuses;
                        break;
                    case 3:
                        if (!st) {
                            selectedBidStatuses = [];
                            filterForm.checkedBidStatuses = [];
                            filterForm.statusBidSearchText = null;
                            filterForm.statusBidSearchLabel = null;
                        }
                        else {
                            if (checked)
                                selectedBidStatuses.push(st.name);
                            else
                                selectedBidStatuses.splice(selectedBidStatuses.indexOf(st.name), 1);
                            makeStatusSearchText(tp);
                            makeStatusSearchLabel(tp);
                        }
                        filterForm.selectedBidStatuses = selectedBidStatuses;
                        break;
                }
            };

            function makeStatusSearchText(tp) {
                var slStatuses, stDictionary, searchText = null;
                switch (tp) {
                    case 1:
                        slStatuses = selectedStatuses;
                        stDictionary = filterForm.statusDictionary;
                        break;
                    case 2:
                        slStatuses = selectedLotStatuses;
                        stDictionary = filterForm.statusLotDictionary;
                        break;
                    case 3:
                        slStatuses = selectedBidStatuses;
                        stDictionary = filterForm.statusBidDictionary;
                        break;
                }
                angular.forEach(slStatuses,
                    function (status) {
                        angular.forEach(stDictionary,
                            function (dict) {
                                if (dict.name === status)
                                    searchText = searchText ? searchText + dict.description + '; ' : dict.description + '; ';
                            });
                    });
                switch (tp) {
                    case 1:
                        filterForm.statusSearchText = searchText;
                        break;
                    case 2:
                        filterForm.statusLotSearchText = searchText;
                        break;
                    case 3:
                        filterForm.statusBidSearchText = searchText;
                        break;
                }
            }

            function makeStatusSearchLabel(tp) {
                var slStatuses, stDictionary, searchLabel = null;
                switch (tp) {
                    case 1:
                        slStatuses = selectedStatuses;
                        stDictionary = filterForm.statusDictionary;
                        break;
                    case 2:
                        slStatuses = selectedLotStatuses;
                        stDictionary = filterForm.statusLotDictionary;
                        break;
                    case 3:
                        slStatuses = selectedBidStatuses;
                        stDictionary = filterForm.statusBidDictionary;
                        break;
                }
                if (slStatuses.length === 1)
                    angular.forEach(stDictionary,
                        function (dict) {
                            if (dict.name === slStatuses[0])
                                searchLabel = dict.label;
                        });
                switch (tp) {
                    case 1:
                        filterForm.statusSearchLabel = searchLabel;
                        break;
                    case 2:
                        filterForm.statusLotSearchLabel = searchLabel;
                        break;
                    case 3:
                        filterForm.statusBidSearchLabel = searchLabel;
                        break;
                }
            }

            $scope.selectNotArchived = function () {
                $scope.isArchive = false;
                selectedStatuses = $scope.defaultStatuses;
                filterForm.selectedStatuses = selectedStatuses;
                makeSelectedStatusesChecked();
            };

            function makeSelectedStatusesChecked() {
                if (selectedStatuses.length > 0) {
                    angular.forEach(filterForm.statusDictionary,
                        function (stat) {
                            if (selectedStatuses
                                .indexOf(stat.name) >
                                -1) filterForm.checkedStatuses[filterForm.statusDictionary.indexOf(stat)] = true;
                        });
                    makeStatusSearchText(1);
                    makeStatusSearchLabel(1);
                }
            }

            $scope.closeStatDropDown = function (tp) {
                filterForm.isStatOpen1 = false;
                filterForm.isStatOpen2 = false;
                filterForm.isStatOpen3 = false;
            };

            $scope.checkCodeOrgExists = function (code, isValidInput) {
                if (!isValidInput || !code) {
                    filterForm.orgCodeNotExists = null;
                    return;
                }
                abp.ui.setBusy();
                abpReferenceService.isOrganizationExists({ innOrEdrpou: code })
                    .then(function (response) {
                        if (response.data) filterForm.orgCodeNotExists = false;
                        else filterForm.orgCodeNotExists = true;
                        abp.ui.clearBusy();
                    },
                    function (e) {
                        abp.notify.error("Не вдається отримати інформацію по коду CPV: " + e.data.message);
                        filterForm.orgCodeNotExists = true;
                        abp.ui.clearBusy();
                    });
            };

            $scope.changeSelOrgCodes = function (code, remove) {
                if (code && code.length !== 0) {
                    if (!remove)
                        filterForm.selectedOrgCodes.push(code);
                    else filterForm.selectedOrgCodes.splice(filterForm.selectedOrgCodes.indexOf(code), 1);
                }
            };

            $scope.isIntervalGood = function (from, to) {
                var fromValue = 0;
                var toValue = 0;
                if (from && to) {
                    fromValue = parseInt(from);
                    toValue = parseInt(to);
                    if (toValue >= fromValue) return true;
                    else return false;
                } else return true;
            };

            $scope.clear = function (reload) {
                reload = reload === undefined ? true : reload;
                filter.regions = [];
                filter.statuses = [];
                selectedStatuses = [];
                filter.actualBids = false;
                filterForm.selectedStatuses = [];
                filterForm.allStatuses = [];
                filter.lotStatuses = [];
                filter.procurementMethodTypes = [];
                selectedLotStatuses = [];
                filterForm.selectedLotStatuses = [];
                filter.bidStatuses = [];
                selectedBidStatuses = [];
                filterForm.selectedBidStatuses = [];
                filter.parentCodesEDRPOU = [];
                filterForm.selectedOrgCodes = [];
                filterForm.parentCodeEDRPOU = [];
                filterForm.statusLotSearchText = null;
                filterForm.statusLotSearchLabel = null;
                filterForm.statusSearchText = null;
                filterForm.statusSearchLabel = null;
                filterForm.statusBidSearchText = null;
                filterForm.statusBidSearchLabel = null;
                
                filterForm.checkedStatuses = [];
                filterForm.checkedLotStatuses = [];
                filterForm.checkedBidStatuses = [];
                filter.priceFrom = null;
                filter.priceTo = null;
                filter.tenderLotName = null;
                filter.organizationName = null;
                filter.startAuctionDate = null;

                vm.selectedRegions = [];
                vm.checkedRegions = [];
                vm.regionsSearchText = null;

                $scope.filter.startAuctionDate = null;
                $scope.filter.endAuctionDate = null;
                $scope.tbPr.searchByTenderIdAndName = '';
                delete $localStorage.myPropositionsFilters;
                $scope.checkedProcTypes.fill(false);
                $scope.procTypeSearchText = null;
                if (reload)
                    $scope.search();
            }


            
            if ($scope.filter && $scope.filter.regions) {
                vm.selectedRegions = $scope.filter.regions;
                   $timeout(function () {
                       if (!vm.regionsDictionary)
                       vm.getRegions && vm.getRegions();
                       vm.makeSelectedRegionsChecked();
                   }, 2000);
            }


            $scope.getProcTypes = function () {
                if ($scope.procTypesDictionary.length > 0) return;

                abp.ui.setBusy("#procTypesFilter");
                referenceService
                    .getAllProcTypes()
                    .then(function (response) {
                        if (response.data) {
                            angular.forEach(response.data.procTypes,
                                function (pType) {
                                    pType.procurementMethodTypeLocal = lookupService
                                        .getTenderProcedureType(pType.procurementMethodType);
                                });
                            $scope.allProcTypes = response.data.procTypes;
                            $scope.allProcTypes.splice(4, 0, simpleProcType);
                            angular.forEach($scope.allProcTypes, function (type) {
                                if (type.procurementMethodTypeLocal == 'Спрощена/Допорогова закупівля') {
                                    type.procurementMethodTypeLocal = 'Допорогова закупівля';
                                }
                            });
                            getProcTypes();
                        }
                        abp.ui.clearBusy("#procTypesFilter");
                    }, function () {
                        abp.ui.clearBusy("#procTypesFilter");
                    });

                function getProcTypes() {
                    var arr = $scope.allProcTypes;
                    $scope.procTypesDictionary = $scope.filterProcTypes(arr);
                    $scope.checkedProcTypes.length = $scope.procTypesDictionary.length;
                    $scope.checkedProcTypes.fill(false);
                    makeSelectedProcTypesChecked();
                }
            }

            function makeSelectedProcTypesChecked() {
                if (!$scope.filter.procurementMethodTypes) $scope.filter.procurementMethodTypes = [];
                if ($scope.filter.procurementMethodTypes.length > 0) {
                    if ($scope.procTypesDictionary.length === 0) $scope.getProcTypes();
                    angular.forEach($scope.procTypesDictionary,
                        function (procType) {
                            if ($scope.filter.procurementMethodTypes.indexOf(procType.procurementMethodType) > -1)
                                $scope.checkedProcTypes[$scope.procTypesDictionary.indexOf(procType)] = true;
                        });
                    makeProcTypeSearchText();
                }
            }

            function makeProcTypeSearchText() {
                $scope.procTypeSearchText = null;
                angular.forEach($scope.filter.procurementMethodTypes,
                    function (pType) {
                        angular.forEach($scope.procTypesDictionary,
                            function (dict) {
                                if (dict.procurementMethodType === pType &&
                                (!$scope.procTypeSearchText ||
                                    $scope.procTypeSearchText.indexOf(dict.procurementMethodTypeLocal) === -1))
                                    $scope
                                        .procTypeSearchText =
                                        $scope.procTypeSearchText
                                        ? $scope.procTypeSearchText + dict.procurementMethodTypeLocal + '; '
                                        : dict.procurementMethodTypeLocal + '; ';
                            });
                    });
                angular.forEach($scope.selectedProcTypes, function (simpleProc) {
                    if (simpleProc == 'simple') {
                        return simpleProcType.isSimpleProcurementMethodRationale = true;
                    }
                    return simpleProcType.isSimpleProcurementMethodRationale = false;
                });
            }

            $scope.changeSelProcTypes = function(procType, checked) {
                if (procType) {
                    if (checked) {
                        $scope.filter.procurementMethodTypes.push(procType.procurementMethodType);
                    } else {
                        $scope.filter.procurementMethodTypes.splice(
                            $scope.filter.procurementMethodTypes.indexOf(procType.procurementMethodType),
                            1);
                    }
                    makeProcTypeSearchText();
                } else if (checked) {
                    $scope.filter.procurementMethodTypes = [];
                    $scope.checkedProcTypes = [];
                    $scope.procTypeSearchText = null;
                }
            };

            $scope.closeProcTypDropDown = function () {
                $scope.isProcTypOpen = false;
            }

            $scope.filterProcTypes = function (procTypes) {
                return procTypes.filter(function (pt) {
                    //return pt.procurementMethod === $scope.procurementMethod;
                    return $scope.procurementMethod.indexOf(pt.procurementMethod) > -1;
                });
            }

            makeSelectedProcTypesChecked();

            $scope.showBidsNeedLoadDocumentsCount = function () {
                $scope.clear(false);

                var statusName = 'award.active.notLoadedDocuments';
                var index = filterForm.allBidStatuses.indexOf(statusName);

                filterForm.selectedBidStatuses.push(statusName);                
                filterForm.checkedBidStatuses[index] = true;

                $scope.changeSelection(3, filterForm.statusBidDictionary[index], filterForm.checkedBidStatuses[index]);

                $scope.search();
            };

        }]);
})();
;
(function () {
    var controllerId = 'myContractsCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', 'abp.services.etender.contract', 'ngTableParams', '$timeout', 'urlService',
        function ($rootScope, $scope, contractsService, ngTableParams, $timeout, urlService) {
            $scope.prozorroSite = abp.setting.get('ProzorroSiteUrl');
            $scope.operationsInput = {
                sorting: 'Id DESC',
                tenderIdUa: null,
                contractId: null,
                number: null,
                dateSignedFrom: null,
                dateSignedTo: null
            };

            $scope.localization = {
                tenderIdText: $rootScope.source('TenderIdText')
            }
            var page = urlService.redirectToCorrectPage();

            $scope.tableParams = new ngTableParams({
                page: page,
                count: 10
            }, {
                counts: [],
                getData: function ($defer, params) {
                    $scope.operationsInput.maxResultCount = params.count();
                    $scope.operationsInput.skipCount = (params.page() - 1) * params.count();
                    $scope.operationsInput.sorting = 'Id DESC';

                    var contracts = contractsService.getContracts($scope.operationsInput);
                    $rootScope.lastPage = params.page();

                    abp.ui.setBusy(".panel-default:first");
                    contracts.then(function (response) {
                        var data = response.data;
                        params.total(data.totalCount);
                        console.log(data);
                        $scope.contracts = data.items;
                        $defer.resolve(data.items);
                        abp.ui.clearBusy(".panel-default");
                    },
                    function () {
                        abp.ui.clearBusy(".panel-default");
                    });;
                }
            });
            
            $scope.search = function() {
                $scope.tableParams.reload();
                $scope.tableParams.page(1);
            }

            var timer;
            $scope.searchChange = function () {
                $timeout.cancel(timer);
                timer = $timeout(function () {
                    $scope.search();
                }, 1000);
            };

            $scope.isDateIntervalGood = function (from, to) {
                if (from && to) {
                    if (to >= from) return true;
                    else return false;
                } else return true;
            };

            $scope.clear = function () {
                $scope.operationsInput.tenderIdUa = null;
                $scope.operationsInput.contractId = null;
                $scope.operationsInput.number = null;
                $scope.operationsInput.dateSignedFrom = null;
                $scope.operationsInput.dateSignedTo = null;
                $scope.search();
            };
         


            

        }]);
})();;
(function () {
    'use strict';
    angular.module('app').controller('mySubscribesCtrl', mysubscribes);
    mysubscribes.$inject = [
        '$scope',
        '$rootScope',
        '$location',
        'abp.services.etender.pagesAndNews',
        '$localStorage',
        '$sessionStorage',
        'abp.services.etender.dailyTenderSubscription',
        'abp.services.etender.search',
        '$http',
        'lookupService',
        'referenceService',
        'classificationSearchService',
        'abp.services.etender.search',
        '$timeout',
        'abp.services.etender.reference'
    ];
    function mysubscribes(
        $scope,
        $rootScope,
        $location,
        pagesAndNewsService,
        $localStorage,
        $sessionStorage,
        dailyTenderSubscription,
        search,
        $http,
        lookupService,
        referenceService,
        classificationSearchService,
        searchService,
        $timeout,
        reference
    ) {
        $scope.ng_localStorage = $localStorage;
        $scope.url = $location.path();
        $scope.uiSubscriptions = [];
        $scope.availibleSubscriptions = {};
        $scope.choosedSubscriptions = {};
        $scope.copiedchoosedSubscriptions = {};
        $scope.formValid = {};
        $scope.checkboxes = [];
        $scope.regexNumber = $rootScope.regex.number;
        var gotUserTemplates = false;

        var updateUrl = "/api/services/etender/dailyTenderSubscription/updateDailyTenderSubscription";
        var createUrl = "/api/services/etender/dailyTenderSubscription/createDailyTenderSubscription";

        if (!$sessionStorage.procType) {
            $sessionStorage.procType = ['open', 'selective'];
            $scope.procurementMethod = $sessionStorage.procType;
        } else {
            $scope.procurementMethod = $sessionStorage.procType;
        };

        var simpleProcType = { id: 15, procurementMethod: 'open', procurementMethodType: 'belowThresholdSimple', procurementMethodTypeDescription: 'Спрощена закупівля', procurementMethodTypeLocal: 'Спрощена закупівля', isSimpleProcurementMethodRationale: false };

        $scope.lookupService = lookupService;

        var LOCALE_VALUE = {
            'belowThreshold': 'Допорогова закупівля',
            'belowThresholdSimple': 'Спрощена закупівля',
            'priceQuotation': 'Запит ціни пропозиції',
            'aboveThresholdUA': $rootScope.source('OpenMarket'),
            'aboveThresholdEU': $rootScope.source('OpenMarketEU'),
            'reporting': $rootScope.source('Reporting'),
            'negotiation': $rootScope.source('Negotiation'),
            'negotiation.quick': $rootScope.source('NegotiationQuick'),
            'aboveThresholdUA.defense': $rootScope.source('Defense'),
            'simple.defense': $rootScope.source('SimpleDefense'),
            'competitiveDialogueUA': $rootScope.source('Dialogue'),
            'competitiveDialogueUA.stage2': $rootScope.source('DialogueStage2'),
            'competitiveDialogueEU': $rootScope.source('DialogueEU'),
            'competitiveDialogueEU.stage2': $rootScope.source('DialogueEUStage2'),
            'esco': $rootScope.source('Esco'),
            'closeFrameworkAgreementUA': $rootScope.source('closeFrameworkAgreementUA'),
            'closeFrameworkAgreementSelectionUA': $rootScope.source('AgreementSelectionTender'),
            'centralizedProcurement': $rootScope.source('ProcurementThroughCentralizedPurchasingOrganization'),
            'active.enquiries' : $rootScope.getSpecificOrDefault('InvitationPeriod'),
            'active.tendering' : $rootScope.getSpecificOrDefault('TenderingPeriod'),
            'active.pre-qualification' : $rootScope.getSpecificOrDefault('EvaluationOfProposals'),
            'active.pre-qualification.stand-still' : $rootScope.getSpecificOrDefault('Negotiations'),
            'active.stage2.pending' : $rootScope.getSpecificOrDefault('TheFirstIntermediateStage'),
            'active.stage2.waiting' : $rootScope.getSpecificOrDefault('2ndInterimStatus'),
            'active.auction' : $rootScope.getSpecificOrDefault('AuctionPeriod'),
            'active.qualification' : $rootScope.getSpecificOrDefault('WinnerQualification'),
            'active.qualification.stand-still' : $rootScope.getSpecificOrDefault('WinnerQualificationStandStill'),
            'active': $rootScope.getSpecificOrDefault('ActivePurchase'),
            'active.awarded': $rootScope.getSpecificOrDefault('ProposalsConsidered'),
            'unsuccessful': $rootScope.getSpecificOrDefault('UnsuccessfulTender'),
            'complete': $rootScope.getSpecificOrDefault('TheFirstPhaseCompleted'),
            'cancelled': $rootScope.getSpecificOrDefault('CancelledTender'),
            'draft': $rootScope.getSpecificOrDefault('NotActivatedAds'),
            'draft.publishing': $rootScope.getSpecificOrDefault('DraftPublish'),
            'goods': 'Товари',
            'services': 'Послуги',
            'works': 'Роботи',
            'True': 'Так'
        };
        var LOCALE_NAME = {
            'MainProcurementCategory': 'Вид предмету закупівлі',
            'MilestoneCodeType': 'Тип оплати',
            'PriceFrom': 'від',
            'PriceTo': 'до',
            'Statuses': 'Статус',
            'Cpvs': $rootScope.source('ClassificationCode') + ' ' + $rootScope.source('CPV'),
            'Regions': 'Регіон замовника',
            'ParentCodesEDRPOU': $rootScope.source('EdrpouOfCustomer'),
            'Title': $rootScope.source('TenderTitle'),
            'OrganizationName': $rootScope.source('OrganizationName'),
            'FunderId': $rootScope.source('Funder'),
            'ProcurementMethodTypes': 'Тип процедури',
            'IsDirectOrder': 'Пряме замовлення через Prozorro.Market',
            'IsCovid19': 'Закупівля для запобігання пандемії COVID-19'
        };

        $scope.translateProperty = function (propertyValue) {
            if (propertyValue.indexOf(',') !== -1) {
                var translatedString = '';
                var arrayToTranslate = propertyValue.split(',');
                arrayToTranslate.forEach(function (value, index) {
                    translatedString += LOCALE_VALUE[value] ? LOCALE_VALUE[value] : value;
                    if (index !== arrayToTranslate.length - 1) {
                        translatedString += ', ';
                    }
                });
                return translatedString;
            } else {
                return LOCALE_VALUE[propertyValue] ? LOCALE_VALUE[propertyValue] : propertyValue;
            }
        };
        $scope.translateName = function name(propertyName) {
            return LOCALE_NAME[propertyName] ? LOCALE_NAME[propertyName] : propertyName;
        }

        function getSubscriptionsAfterPageLoad(needToRevalidate) {
            abp.ui.setBusy();
            dailyTenderSubscription.getMyDailyTenderSubscriptions()
                .then(function (response) {
                    if (response.data && response.data.length) {
                        getUserTemplatesWithFilter(response.data, needToRevalidate);
                    }
                }).finally(function () {
                    abp.ui.clearBusy();
                });
        }

        function findRelatedTemplate(template) {
            return $scope.subscriptions.find(function (sub) {
                return template.userFilterTemplateId === sub.id;
            });
        }

        $scope.addSubscription = function () {
            if ($scope.uiSubscriptions.length >= 5) {
                abp.notify.error('Можливо обрати лише 5 шаблонів для підписки!');
                return;
            }
            $scope.uiSubscriptions.push({});
            if (!gotUserTemplates) {
                getUserTemplatesWithFilter();
            }
        };

        $scope.subscribe = function (subscription, subscriptionIndex) {
            var url = null;
            
            var paramsData = {
                UserFilterTemplateId: subscription.id,
                isToExcel: $scope.choosedSubscriptions[subscriptionIndex].isToExcel
            };

            if (!$scope.uiSubscriptions[subscriptionIndex].isSaved) {
                url = createUrl;
            } else {
                url = updateUrl;
                paramsData.id = $scope.templates[subscriptionIndex].id;
            }

            createOrUpdateSubscriptions(url, paramsData);
        }

        function getUserTemplatesWithFilter (templates, needToRevalidate) {
            search.getTemplatesForDailyTenderSubscription().then(function(response) {
                gotUserTemplates = true;
                $scope.subscriptions = response.data;
                getDailySubscriptionTemplates(templates, needToRevalidate);
            }).finally(function() {
                abp.ui.clearBusy();
            });
        }
        function getDailySubscriptionTemplates(templatesData, needToRevalidate) {
            $scope.templates = templatesData;
            if (templatesData && templatesData.length) {
                for (var index = 0; index < templatesData.length; index++) {
                    $scope.choosedSubscriptions[index] = findRelatedTemplate(templatesData[index]);
                    if (needToRevalidate) {
                        $scope.uiSubscriptions.push({
                            isSaved: true
                        });
                        $scope.formValid[index] = !checkIfSubscriptionsAlreadyExist($scope.choosedSubscriptions, $scope.choosedSubscriptions[index], index);
                    }
                    if (!$scope.uiSubscriptions[index].isSaved) {
                        $scope.uiSubscriptions[index].isSaved = true;
                        $scope.formValid[index] = true;
                    }
                    if ($scope.choosedSubscriptions[index]) {
                        $scope.choosedSubscriptions[index].isToExcel = templatesData[index].isToExcel;
                    }
                }
            }
        }

        var needBulkDelete = false;
        var subscription = null;
        var index = null;
        $scope.showModalForDeleteSubscriptions = function (bulkDelete, singleSubscription, singleIndex) {
            needBulkDelete = bulkDelete;
            subscription = singleSubscription;
            index = singleIndex;
            $('#modalDeleteSubscriptions').modal('toggle');
        };

        $scope.subscriptionDelete = function () {
            if (needBulkDelete) {
                removeAllSubscriptions();
            } else {
                removeSubscriptionFromUi(subscription, index);
            }
        };

        function removeSubscriptionFromUi (subscription, subscriptionIndex) {
            var url = "/api/services/etender/dailyTenderSubscription/deleteDailyTenderSubscription";

            if (!$scope.templates || !$scope.formValid[index] || !$scope.uiSubscriptions[subscriptionIndex].isSaved) return deleteItemFromUi(subscriptionIndex);

            var subscriptionId = findSubscriptionIdInTemplates($scope.templates, subscription, true);
            var templateId = findSubscriptionIdInTemplates($scope.templates, $scope.templates[subscriptionIndex], true);

            if (!subscriptionId && !templateId) return deleteItemFromUi(subscriptionIndex);

            var whichIdTOUse = subscriptionId ? subscriptionId.id : templateId.id;

            $http({
                url: url,
                method: 'GET',
                params: {
                    id: whichIdTOUse
                }
            }).then(function (response) {
                if (response.data.error) {
                    abp.notify.error(response.data.error.message);
                } else {
                    deleteItemFromUi(subscriptionIndex);
                    getSubscriptionsAfterPageLoad(false);
                }
            });
        }

        function findSubscriptionIdInTemplates (templates, subscription, searchInTemplates) {
            if (!subscription) {
                return;
            }
            if (searchInTemplates) {
                return templates.find(function (templ) {
                    if (subscription.userFilterTemplateId) {
                        return templ.userFilterTemplateId === subscription.userFilterTemplateId;
                    } else {
                        return templ.userFilterTemplateId === subscription.id;
                    }
                })
            } else {
                return $scope.subscriptions.find(function (sub) {
                    return sub.id === subscription.id;
                })
            }
        }

        function deleteItemFromUi (subscriptionIndex) {
            $scope.uiSubscriptions.splice(subscriptionIndex, 1);
            $scope.formValid[subscriptionIndex] = false;
            for (var key in $scope.choosedSubscriptions) {
                if (Number(key) >= Number(subscriptionIndex)) {
                    $scope.choosedSubscriptions[key] = $scope.choosedSubscriptions[(Number(key) + 1).toString()];
                }
                if (Number(key) >= $scope.uiSubscriptions.length) {
                    delete $scope.choosedSubscriptions[key];
                }
            }
            $scope.formValid[subscriptionIndex] = !checkIfSubscriptionsAlreadyExist($scope.choosedSubscriptions, $scope.choosedSubscriptions[subscriptionIndex], subscriptionIndex);
        }

        function removeAllSubscriptions () {
            abp.ui.setBusy();
            dailyTenderSubscription.deleteMyAllDailyTenderSubscriptions().then(function (response) {
                $scope.choosedSubscriptions = [];
                $scope.uiSubscriptions = [];
            }, function (error) {
                abp.notify.error(error.data.error.message);
            }).finally(function () {
                abp.ui.clearBusy();
            })
        }

        $scope.createOrUpdateSubscription = function (choosedSubscription, subscriptionIndex) {
            if (choosedSubscription) {
                $scope.formValid[subscriptionIndex] = !checkIfSubscriptionsAlreadyExist($scope.choosedSubscriptions, choosedSubscription, subscriptionIndex);
                choosedSubscription.isToExcel = false;
            }
        }

        $scope.showErrorByCondition = function (currentSubscription, index) {
            if (!currentSubscription) {
                return 'Для налаштування підписки оберіть шаблон пошуку'
            } else if (currentSubscription && !$scope.formValid[index]) {
                return 'Помилка! Потрібно обрати інший шаблон пошуку.'
            }
        }

        function checkIfSubscriptionsAlreadyExist (subscriptions, subscription, index) {
            if (!subscription) {
                return true;
            }
            for (var key in subscriptions) {
                if (key.toString() !== index.toString()) {
                    if (subscriptions[key] && (subscription.id === subscriptions[key].id)) {
                        return true;
                    }
                }
            }
            return false;
        }

        $scope.sendSubscriptionEmail = function () {
            var email = {};
            email.type = 'subscriptionCallback';
            email.number = this.emailNumber;
            var getMessage = pagesAndNewsService.sendEmail(email);
            getMessage.then(function (response) {
                abp.notify.success('Замовлення на дзвінок надіслано!');
            });
        };

        getSubscriptionsAfterPageLoad(true);

        //FILTER METHODS AND VARIABLES
        $scope.filter = {};

        $scope.selectedProcedureTypes = [];
        $scope.checkedProcedureTypes = [];
        $scope.procedureTypeInputText = '';
        $scope.filter.regionsSearchText = '';
        $scope.filter.selectedRegions = [];
        $scope.filter.checkedRegions = [];
        $scope.selectedCpvs = [];
        $scope.childCpvs = [];
        $scope.selectedOrgCodes = [];

        $scope.showFilterSettingsModal = function (subscription, index, isChoosedSubscription) {
            $scope.currentChoosedSubscription = findSubscriptionIdInTemplates($scope.templates, subscription, false);
            $scope.currentChoosedSubscriptionIndex = index;
            $scope.isChoosedSubscription = isChoosedSubscription;
            if (subscription && subscription.name) {
                $scope.templateName = subscription.name;
            }
            $('#modalFilter').modal('toggle')
        };

        function makeSelectedProcTypesChecked() {
            if ($scope.selectedProcedureTypes.length > 0) {
                if ($scope.proceduresDictionary.length === 0) $scope.getProcTypes();
                angular.forEach($scope.proceduresDictionary,
                    function (procType) {
                        if ($scope.selectedProcedureTypes.indexOf(procType.procurementMethodType) > -1)
                            $scope.checkedProcedureTypes[$scope.proceduresDictionary.indexOf(procType)] = true;
                    });
                makeProcTypeSearchText();
            }
        }
        function makeProcTypeSearchText() {
            $scope.procedureTypeInputText = '';
            angular.forEach($scope.selectedProcedureTypes,
                function (pType) {
                    angular.forEach($scope.proceduresDictionary,
                        function (dict) {
                            if (dict.procurementMethodType === pType &&
                                (!$scope.procedureTypeInputText ||
                                    $scope.procedureTypeInputText.indexOf(dict.procurementMethodTypeLocal) === -1))
                                $scope.procedureTypeInputText =
                                    $scope.procedureTypeInputText
                                        ? $scope.procedureTypeInputText + dict.procurementMethodTypeLocal + '; '
                                        : dict.procurementMethodTypeLocal + '; ';
                        });
                });
            angular.forEach($scope.selectedProcedureTypes, function (simpleProc) {
                if (simpleProc == 'simple') {
                    simpleProcType.isSimpleProcurementMethodRationale = true;
                } else {
                    simpleProcType.isSimpleProcurementMethodRationale = false;
                }
            });
        }

        $scope.getAllProcedureTypes = function () {
            var allProcedureTypes = angular.copy($localStorage.refs.procedureTypes);
            allProcedureTypes.forEach(function (procType) {
                procType.procurementMethodTypeLocal = lookupService.getTenderProcedureType(procType.procurementMethodType);
            });
            $scope.allProcedureTypes = allProcedureTypes;
            $scope.allProcedureTypes.splice(4, 0, simpleProcType);
            $scope.allProcedureTypes.find(function (procType) {
                if (procType.procurementMethodTypeLocal == 'Спрощена/Допорогова закупівля') {
                    return procType.procurementMethodTypeLocal = 'Допорогова закупівля';
                }
            });
            getProcTypes();

            function getProcTypes() {
                var arr = $scope.allProcedureTypes;
                $scope.proceduresDictionary = arr.filter(function (type) { return type.procurementMethodTypeLocal });
                $scope.checkedProcedureTypes.length = $scope.proceduresDictionary.length;
                $scope.checkedProcedureTypes.fill(false);
                makeSelectedProcTypesChecked();
            }
        };

        $scope.changeSelectedProcedureTypes = function (procType, checked) {
            if (procType) {
                if (checked) {
                    $scope.selectedProcedureTypes.push(procType.procurementMethodType);
                } else {
                    $scope.selectedProcedureTypes.splice($scope.selectedProcedureTypes.indexOf(procType.procurementMethodType), 1);
                }
                makeProcTypeSearchText();
            } else if (checked) {
                $scope.selectedProcedureTypes = [];
                $scope.checkedProcedureTypes = [];
                $scope.procedureTypeInputText = null;
            }
        };

        $scope.isIntervalGood = function (startPrice, endPrice) {
            if (startPrice && endPrice) {
                return startPrice < endPrice;
            } else return true;
        };

        $scope.initClassification = function () {
            $scope.needBindForSubscribesCpvs = true;
            classificationSearchService.initClassification($scope, $scope.selectedCpvs);
        };
        $scope.cleareChildCpv = function (cpvs) {
            classificationSearchService.cleareChildCpv(cpvs, $scope.selectedCpvs);
        };

        $scope.$on('broadcastChangedCpvs', function (evt, changedCpvs) {
            $scope.selectedCpvs = changedCpvs;
        });
        $scope.$on('responseCpvs', function (evt, cpvs) {
            $scope.tableCpvs = cpvs;
        });
        $scope.$on('unselectCpvCode', function (evt, cpv) {
            $scope.selectedCpvs.find(function (selectedCpv, index) {
                if (selectedCpv === cpv.code) {
                    $scope.selectedCpvs.splice(index, 1);
                }
            })
        })

        function changeSelectedCpvs() {
            var cpvs = $scope.selectedCpvs;
            var cl = cpvs.length;
            return $scope.tableCpvs && $scope.tableCpvs.map(function(item) {
                for (var i = 0; i < cl; i += 1) {
                    if (cpvs[i].id == item.id || cpvs[i] == item.code) {
                        item.$selected = true; 
                        return item;
                    }
                }
                return item;
            });
        }

        $scope.changeSelOrgCodes = function (code, remove) {
            if (code) {
                if (!remove)
                    $scope.selectedOrgCodes.push(code);
                else $scope.selectedOrgCodes.splice($scope.selectedOrgCodes.indexOf(code), 1);
            }
        }

        $scope.saveTemplate = function () {
            if ($scope.isChoosedSubscription) {
                updateTemplateFields();
            } else {
                createTemplate();
            }
            $('#enterTemplName').modal('toggle');
            $('#modalFilter').modal('toggle');
        }

        function createTemplate() {
            searchService.createTemplate({
                name: $scope.templateName,
                filter: getFilter(),
                forWholeOrganization: null
            }).then(function (response) {

                createOrUpdateSubscriptions(createUrl, fillDataForRequest(response.data, false));

                $scope.formValid[$scope.currentChoosedSubscriptionIndex] = true;
            })
        }
        function updateTemplateFields() {
            searchService.updateSearchFilterFromTemplate({
                templateId: $scope.currentChoosedSubscription.id,
                templateName: $scope.templateName,
                filter: getFilter()
            }).then(function (response) {

                var whichUrlToUse = $scope.uiSubscriptions[$scope.currentChoosedSubscriptionIndex].isSaved ? updateUrl : createUrl;

                createOrUpdateSubscriptions(whichUrlToUse, fillDataForRequest($scope.currentChoosedSubscription.id, whichUrlToUse.indexOf('updateDailyTenderSubscription') !== -1));
            });
        }

        function fillDataForRequest (userTemplateId, hasUpdateInUrlString) {
            var data =  {
                UserFilterTemplateId: userTemplateId,
                isToExcel: $scope.choosedSubscriptions[$scope.currentChoosedSubscriptionIndex] ? $scope.choosedSubscriptions[$scope.currentChoosedSubscriptionIndex].isToExcel : false
            };

            if (hasUpdateInUrlString) {
                data.id = $scope.templates[$scope.currentChoosedSubscriptionIndex].id;
            }

            return data;
        }

        function createOrUpdateSubscriptions(url, data) {
            $http({
                url: url,
                method: 'POST',
                data: data
            }).then(function (response) {
                if (response.data.error) {
                    abp.notify.error(response.data.error.message);
                } else {
                    abp.notify.success('Збережено');
                    getSubscriptionsAfterPageLoad(false);
                }
            });
        }
        function getFilter() {
            var filter = {
                Regions: $scope.filter.regionsSearchText.split('; ').filter(function(item) { return item }),
                ProcurementMethodTypes: $scope.selectedProcedureTypes || [],
                PriceFrom: $scope.filter.priceFrom || null,
                PriceTo: $scope.filter.priceTo || null,
                MilestoneCodeType: $scope.filter.milestoneCodeType || null,
                ParentCodesEDRPOU: $scope.selectedOrgCodes || [],
                Title: $scope.filter.title || null,
                OrganizationName: $scope.filter.organizationName || null,
                Cpvs: getAllCpvCodes(),
                MainProcurementCategory: $scope.filter.mainProcurementCategory ? $scope.filter.mainProcurementCategory.value : null,
                IsCovid19: $scope.filter.isCovid19 || null,
                IsDirectOrder: $scope.filter.isDirectOrder || null,
                FunderId: $scope.filter.funder ? $scope.filter.funder.id : null
            };

            return filter;
        }

        function getAllCpvCodes() {
            var allCpvCodes = [];

            $scope.selectedCpvs.forEach(function (cpv) {
                if (cpv.id) {
                    allCpvCodes.push(cpv.code);
                } else {
                    allCpvCodes.push(cpv)
                }
            });

            return allCpvCodes;
        }

        $scope.clearFilterFields = function () {
            $scope.filter.regionsSearchText = '';
            $scope.procedureTypeInputText = '';
            $scope.selectedProcedureTypes = [];
            $scope.filter.selectedRegions = [];
            $scope.filter.checkedRegions = [];
            $scope.filter.priceFrom = null;
            $scope.filter.priceTo = null;
            $scope.filter.milestoneCodeType = null;
            $scope.selectedOrgCodes = [];
            $scope.filter.title = null;
            $scope.filter.organizationName = null;
            clearSelectedCpvs();
            $scope.filter.mainProcurementCategory = null;
            $scope.filter.isCovid19 = null;
            $scope.filter.isDirectOrder = null;
            $rootScope.$broadcast('clearFunder', true);
        }

        function clearSelectedCpvs() {
            $scope.selectedCpvs = [];
            $rootScope.clearCheckbox();
        }

        //AUTOFILL FILTER IF DROPDOWN HAS VALUE
        $('#modalFilter').on('show.bs.modal', function () {
            if ($scope.currentChoosedSubscription && $scope.currentChoosedSubscription.id) {
                abp.ui.setBusy('#modalFilter');
                searchService.getSearchFilterFromTemplate({id: $scope.currentChoosedSubscription.id})
                    .then(function (response) {
                        fillFieldsWithDataFromResponse(response.data);
                    }, function (error) {})
                    .finally(function (response) {
                        abp.ui.clearBusy('#modalFilter');
                    });
            }
        });

        function fillFieldsWithDataFromResponse (responseData) {
            if (responseData.procurementMethodTypes) {
                fillProcurementMethodTypes(responseData.procurementMethodTypes);
            }
            if (responseData.regions) {
                fillRegions(responseData.regions);
            }
            if (responseData.priceFrom || responseData.priceTo) {
                fillPriceRange(responseData.priceFrom, responseData.priceTo);
            }
            if (responseData.milestoneCodeType) {
                fillPaymentTypeDropdown(responseData.milestoneCodeType);
            }
            if (responseData.parentCodesEDRPOU) {
                fillOrgCodes(responseData.parentCodesEDRPOU);
            }
            if (responseData.funderId) {
                fillFunder(responseData.funderId);
            }
            if (responseData.title) {
                fillTenderTitle(responseData.title);
            }
            if (responseData.organizationName) {
                fillOrganizationName(responseData.organizationName);
            }
            if (responseData.cpvs) {
                fillCpvCodes(responseData.cpvs);
            }
            if (responseData.mainProcurementCategory) {
                fillMainProcurementCategory(responseData.mainProcurementCategory);
            }
            if (responseData.isDirectOrder) {
                fillDirectOrderCheckbox(responseData.isDirectOrder);
            }
            if (responseData.isCovid19) {
                fillCovidCheckbox(responseData.isCovid19);
            }
        }

        function fillProcurementMethodTypes(procMethodTypes) {
            var allProcedureTypes = angular.copy($localStorage.refs.procedureTypes);
            allProcedureTypes.splice(4, 0, simpleProcType);
            allProcedureTypes.filter(function(type) {
                return procMethodTypes.find(function (proc) {
                    if (type.procurementMethodTypeDescription == 'Спрощена/Допорогова закупівля') {
                        type.procurementMethodTypeDescription = 'Допорогова закупівля';
                    }
                    if ($scope.selectedProcedureTypes.indexOf(proc) === -1) {
                        $scope.selectedProcedureTypes.push(proc);
                    }
                    return proc === type.procurementMethodType;
                })
            }).forEach(function (value) {
                if (value.procurementMethodTypeDescription) {
                    $scope.procedureTypeInputText += value.procurementMethodTypeDescription + '; '
                }
            });
        }
        function fillRegions(regions) {
            if (!$scope.filter.regionsDictionary.length) {
                $scope.filter.getRegions();
            }
            regions.forEach(function (region) {
                $scope.filter.regionsSearchText += region + '; ';
                $scope.filter.selectedRegions.push(region);
                $scope.filter.checkedRegions.push(region);
            });
            $timeout(function () {
                $scope.filter.regionsDictionary.forEach(function (region, index) {
                    if (regions.indexOf(region.title) !== -1) {
                        $scope.filter.checkedRegions[index] = true;
                    }
                });
            }, 300);
        }
        function fillPriceRange(from, to) {
            $scope.filter.priceFrom = from;
            $scope.filter.priceTo = to;
        }
        function fillPaymentTypeDropdown(type) {
            $scope.filter.milestoneCodeType = type;
        }
        function fillOrgCodes(codes) {
            $scope.selectedOrgCodes = codes;
        }
        function fillFunder(id) {
            getFundersDictionary(id);
        }
        function getFundersDictionary(funderId) {
            reference.getFunders().then(function (res) {
                $scope.funders = res.data.funders;
                if (funderId) setFunderFromTemplate(funderId);
            }, function (error) {
                console.log(error);
            });
        }
        function setFunderFromTemplate(funderId) {
            var i = 0;
            for (i; i < $scope.funders.length; i++) {
                if ($scope.funders[i].id === funderId)
                    $scope.filter.funder = $scope.funders[i];
            }
        }
        function fillTenderTitle(title) {
            $scope.filter.title = title;
        }
        function fillOrganizationName(name) {
            $scope.filter.organizationName = name;
        }
        function fillCpvCodes(cpvs) {
            $scope.selectedCpvs = cpvs;
            changeSelectedCpvs();
        }
        function fillMainProcurementCategory(type) {
            $scope.filter.mainProcurementCategory = { value: type };
        }
        function fillDirectOrderCheckbox(state) {
            $scope.filter.isDirectOrder = state;
        }
        function fillCovidCheckbox(state) {
            $scope.filter.isCovid19 = state;
        }

        //CLEAR FIELDS IF MODAL IS CLOSED
        $('#enterTemplName').on('hidden.bs.modal', function () {
            $scope.templateName = '';
        });
        $('#modalFilter').on('hidden.bs.modal', function () {
            $scope.templateName = '';
            $scope.filter.priceFrom = '';
            $scope.filter.priceTo = '';
            $scope.filter.milestoneCodeType = null;
            $scope.selectedOrgCodes = [];
            $scope.filter.funder = null;
            $scope.filter.funderId = null;
            $scope.filter.title = '';
            $scope.filter.organizationName = '';
            $scope.selectedCpvs = [];
            $scope.filter.mainProcurementCategory = null;
            $scope.filter.regionsSearchText = '';
            $scope.filter.selectedRegions = [];
            $scope.filter.checkedRegions = [];
            $scope.selectedProcedureTypes = [];
            $scope.procedureTypeInputText = '';
            $scope.filter.isCovid19 = null;
            $scope.filter.isDirectOrder = null;
            clearSelectedCpvs();
            $scope.tableCpvs && $scope.tableCpvs.forEach(function (child) { child.$selected = false; });
            $scope.needBindForSubscribesCpvs = false;
        })
    }
})();;
(function () {
    var controllerId = 'detailesForApproveCtrl';
    angular.module('app').controller(controllerId, ['$rootScope', '$scope', 'abp.services.etender.organization', 'abp.services.etender.address', 'abp.services.etender.reference', '$stateParams', '$location', '$localStorage', function ($rootScope, $scope, organization, addressService, reference, $stateParams, $location, $localStorage) {
        $scope.ng_localStorage = $localStorage;
        $scope.profileDetailes = {};
        $scope.isProductionMode = $scope.ng_localStorage.isProdMode;
        //if (!($scope.ng_localStorage.username) {
        //    $location.path('/login');
        //    return;
        //};

        $scope.permissions = {
            setOrganizationApprovement: abp.auth.hasPermission('Operator.SetOrganizationApprovement'),
        };

        var reload = function () {
            var organizationInput = { tenantId: $stateParams.tenantId };

            var getOrganization = organization.getOrganization(organizationInput);
            getOrganization.then(function (response) {
                var data = response.data;
                if (!data) {
                    $location.path('/profiles');
                    //$localStorage.isProdMode = false;

                    //return null;
                }
                //else {
                //    $localStorage.isProdMode = data.isProductionMode;
                //}

                //console.log('Організація:');
                //console.log(data);

                $scope.isCustomer = data.isCustomer;
                

                $scope.firstModeration = data.testModeIsReadyForApprovement;
                $scope.secondModeration = data.productionModeIsReadyForApprovement;
                //$scope.isCheckedForCustomer = data.isCustomer;
                    
                $scope.approveInput = {
                    id: data.id,
                    forProductionMode:data.productionModeIsReadyForApprovement,
                    approvementMessage: ''
                };

                //delete data.address;

                $scope.profileDetailes = data;
                $scope.profileDetailes.isCommercialCustomerApprovedDate = new Date($scope.profileDetailes.isCommercialCustomerApprovedDate).toLocaleString();
                $scope.address = data.address;

                function getDocementType()
                {   
                    var way = data.documentWay
                    if (way === undefined || way === null) return
                    return way > 1 ? "В електронному вигляді через M.E.Doc" : "У паперовому вигляді"
                }

                $scope.docementType = getDocementType();
                //$scope.profileData = data;

                //$scope.user = { surname: $scope.profileData.surname, name: $scope.profileData.name, patronymic: $scope.profileData.patronymic };
                //$scope.director = { firstName: $scope.profileData.directorFirstName, lastName: $scope.profileData.directorLastName, patronymic: $scope.profileData.directorPatronymic };

                //$scope.profileData.isCustomer = $scope.profileDetailes.isCustomer = $scope.ng_localStorage.isCustomer = true;

                (function setPerson() {
                    if ($scope.profileDetailes.typeOfPerson) {
                        var type = $scope.profileDetailes.typeOfPerson;
                        switch (type) {
                            case (1):
                                $scope.person = { value: type, typeName: "Фізична особа" };
                                break;
                            case (2):
                                $scope.person = { value: type, typeName: "Юридична особа" };
                                break;
                        }
                        return true;
                    } else {
                        return false;
                    }
                })();
            }, function (data) {

                $location.path('/profiles');
            });
        };

        reload();

        $scope.cancel = function () {
            reload();
        };

        $scope.formAddressUiString = function (address) {
            var addressString = '';

            if (address) {
                addressString += (address.postIndex + ' ' || '-');
                addressString += (address.country.title + ', ' || '-');
    
                if (address.region.title.indexOf('Київ') >= 1 || 
                    address.region.title.indexOf('Севастополь') >= 1 ||
                    address.region.title.indexOf('Киев') >= 1) {
                        addressString += (address.region.title + ', ' || '-')
                } else {
                    addressString += (address.region.title + ' область, ' || '-');
                    addressString += (' місто '+ address.city.title+ ', ' || '-')
                }
    
                addressString += (address.addressStr + ' ' || '-');
            }


            return addressString;
        }
        
        $scope.setApprove = function (isApproved) {
            $scope.approveInput.isApproved = isApproved;
            var setApprove = organization.setOrganizationApprovement($scope.approveInput);
            setApprove.then(function (response) {
                abp.notify.success('Рішення прийнято');
                $location.path('profiles');
            });
        };

        $scope.setIsCommercialCustomerApproved = function (isApproved) {            
            var setApprove = organization.approveIsComercialCustomerProperty({ organizationId: $scope.approveInput.id, isApproved: isApproved});
            setApprove.then(function (response) {
                $scope.profileDetailes.isCommercialCustomerApproved = isApproved;                
                $scope.profileDetailes.isCommercialCustomerApprovedDate = isApproved ? (new Date()).toLocaleString() : null;
                abp.notify.success('Виконано');                
            });
        };
    }
    ]);
})();;
(function () {
    var controllerId = 'redirectCtrl';
    angular.module('app').controller(controllerId, [
        '$location', 'organizationDataService', 'userDataService', function ($location, organizationDataService, userDataService) {
            
            userDataService.getData().then(function () {
                organizationDataService.getData();
                $location.path('/');
            });

        }]);
})(window.angular);;
(function () {
    var controllerId = 'registerStage3Ctrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$location', '$window', '$localStorage',
        function ($scope, $location, $window, $localStorage) {
            $scope.submit = function () {
                $location.path('/');
                if (!$localStorage.userTenantId)
                    $window.location.reload();
            };

            $scope.howPayer = function (isVatPayer) {
                return isVatPayer ? 'Товариство з обмеженою відповідальністю  "Е-Тендер" \n п/р ' + $scope.bill + ', ПАТ КБ «ПРИВАТБАНК»,  МФО 305299 \n 04119 м. Київ, вул. Дегтярівська, буд. 21 літ. «А», \n код ЄДРПОУ 39484263'
                                         : 'Товариство з обмеженою відповідальністю  "Е-Тендер" \n п/р ' + $scope.bill + ', ПАТ КБ «ПРИВАТБАНК»,  МФО 305299 \n 04119 м. Київ, вул. Дегтярівська, буд. 21 літ. «А», \n код ЄДРПОУ 39484263, Платник єдиного податку';
            };

            $scope.bill = 'UA133052990000026003046204945';

            $scope.invoiceHeader = {
                text: "Шановний Користувачу! В цьому рахунку вказано нові реквізити банка отримувача ТОВ \"Е-Тендер\". Будьте уважні при здійсненні платежу!",
                style: 'warning',
                fontSize: 21
            };
        }
    ]);
})();;
(function () {
    var controllerId = 'supportLawCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.etender.organization', 'abp.services.etender.user', 'abp.services.etender.emailNotification', '$localStorage',
        function ($scope, organization, user, emailNotification, $localStorage) {
            $scope.ng_localStorage = $localStorage;
            $scope.services = {};
            $scope.order = {};
            $scope.order.servicesToOrder = [];
            $scope.order.contacts = {};
            $scope.ordered = {};
            $scope.services.openTender = [
                {
                    name: 'Торги на газ',
                    price: '2800',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Торги на товари, послуги від:',
                    price: '3500',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Торги на роботи  від:',
                    price: '7000',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                }
            ];

            $scope.services.doporohoviPurchase = [
                {
                    name: 'Закупівлі на товари, послуги',
                    price: '350',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівлі на роботи, від:',
                    price: '1000',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                }
            ];

            $scope.services.negotiatingPurchase = [
                {
                    name: 'Закупівля електричної енергії, одна процедура:',
                    price: '1800',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівля теплової енергії, одна процедура:',
                    price: '1800',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівля водопостачання, одна процедура:',
                    price: '1800',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівля послуг каналізаційних, одна процедура:',
                    price: '1800',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівля згідно п.4 ч.2 ст.35, одна процедура:',
                    price: '1500',
                    info: 'якщо замовником було двічі відмінено тендер через відсутність достатньої кількості учасників, при цьому предмет закупівлі, його технічні та якісні характеристики, а також вимоги до учасника не повинні відрізнятися від вимог, що були визначені замовником у тендерній документації',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівля згідно п.5 ч.2 ст.35',
                    price: '4000',
                    info: 'потреби здійснити додаткову закупівлю в того самого постачальника з метою уніфікації, стандартизації або забезпечення сумісності з наявними товарами, технологіями, роботами чи послугами, якщо заміна попереднього постачальника (виконавця робіт, надавача послуг) може призвести до несумісності або виникнення проблем технічного характеру, пов’язаних з експлуатацією та обслуговуванням',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                },
                {
                    name: 'Закупівля згідно п.6 ч.2 ст.35',
                    price: '4000',
                    info: 'необхідності проведення додаткових будівельних робіт, не зазначених у початковому проекті, але які стали через непередбачувані обставини необхідними для виконання проекту за сукупності таких умов: договір буде укладено з попереднім виконавцем цих робіт, такі роботи технічно чи економічно пов’язані з головним (первинним) договором; загальна вартість додаткових робіт не перевищує 50 відсотків вартості головного (первинного) договору',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                }
            ];

            $scope.services.procurementPlan = [
                {
                    name: 'Підготовка проекту плану закупівлі до оприлюднення, рядок:',
                    price: '20',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                }
            ];

            $scope.services.reportOfTreaty = [
                {
                    name: 'Закупівля без використання електронної системи',
                    price: '250',
                    nomber: 1,
                    nombers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                }
            ];


                $scope.order.contacts.organizationName = $localStorage.organizationName;
                $scope.order.contacts.organizationContactName = $localStorage.organizationContactName;
                $scope.order.contacts.organizationContactTelephone = $localStorage.organizationContactTelephone;
                $scope.order.contacts.organizationContactEmail = $localStorage.organizationContactEmail;


            $scope.order.totalCount = 0;

            $scope.totalCounter = function () {
                var scopeLength = $scope.order.servicesToOrder.length;
                var total = 0;
                for (var i = 0; i < scopeLength; i++) {
                    var price = $scope.order.servicesToOrder[i].price * $scope.order.servicesToOrder[i].nomber;
                    total = total + parseInt(price);
                }
                $scope.order.totalCount = total;
                return total;
            };

            function getServicesString() {
                var servicesStr = '<ol> ';
                angular.forEach($scope.order.servicesToOrder, function (serv) {
                    servicesStr = servicesStr + '<li>' + serv.name + ' - ' + serv.nomber + 'x' + serv.price + ' UAH </li>';
                });
                servicesStr = servicesStr + '</ol>';
                return servicesStr;
            };

            $scope.sendFunction = function () {
                var email = {};
                email.title = 'ЗАМОВЛЕННЯ ПОСЛУГ';
                email.message = (
                    'Назва організації: ' + $scope.order.contacts.organizationName + '<br>' +
                        'Контактна особа: ' + $scope.order.contacts.organizationContactName + '<br>' +
                        'Контактний телефон: ' + $scope.order.contacts.organizationContactTelephone + '<br>' +
                        'E-mail: ' + $scope.order.contacts.organizationContactEmail + '<br>' +
                        ($scope.order.contacts.comment && $scope.order.contacts.comment !== '' ? 'Коментар: ' + $scope.order.contacts.comment + '<br>' : '') + '<br>' +
                        'Замовлення: ' + getServicesString() + '<br>' +
                        'На суму: ' + $scope.order.totalCount + ' UAH'
                    );

                $localStorage.servicesToOrder = $scope.order;

                var getMessage = emailNotification.sendOrderedServices(email);
                getMessage.then(function (reponse) {
                    abp.notify.success('Ви успішно відправили заявку!');
                    if ($scope.ng_localStorage.servicesToOrder) {
                        $scope.ordered = angular.copy($scope.ng_localStorage.servicesToOrder);
                    }
                    $scope.order.servicesToOrder = [];
                    $scope.order.contacts.comment = '';
                });
            };
        }]);
})(window.angular);;
(function () {
    var controllerId = 'operationsCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', 'abp.services.etender.bankOperationLogAdmin', 'abp.services.etender.organization', 'ngTableParams',
        function ($rootScope, $scope, items, organization, ngTableParams) {

            $scope.filter = {
                inputedEDRPOU : ''
            };
            $scope.findedOrganization = null;
            

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: 10,
                sorting: {
                    'postDate': 'desc'
                }
            }, {
                counts: [],
                getData: function ($defer, params) {

                    var operationsInput = {
                        Page: params.page(),
                        PageSize: params.count(),
                        OrderColumn: (params.orderBy())[0].slice(1),
                        OrderDirection: (params.sorting())[(params.orderBy())[0].slice(1)]
                    };

                    var operations = items.getBankOperationLogs(operationsInput);

                    abp.ui.setBusy(".panel-default:first");
                    operations.then(function (reponse) {
                        params.total(reponse.data.countAllRecords);
                        console.log(reponse.data);
                        $scope.operations = reponse.data.items;
                        $defer.resolve(reponse.data.items);
                        abp.ui.clearBusy(".panel-default");
                    },
                    function () {
                        abp.ui.clearBusy(".panel-default");
                    });;
                }
            });

            $scope.getOperation = function (id) {
               
                $scope.filter.inputedEDRPOU = '';
                $scope.findedOrganization = null;
                $scope.operation = $scope.operations[id];

                console.log("Выводим операцию:", $scope.operation);
            };

            $scope.getOrganizationByEDRPOU = function () {
                console.log("inputedEDRPOU:", $scope.filter.inputedEDRPOU);
                organization.getOrganizationExtWithAddressByCode({ innOrEdrpou: $scope.filter.inputedEDRPOU })
                    .then(function (response) {

                        if (response.data != null && response.data.organizationExt != null) {
                            $scope.findedOrganization = response.data.organizationExt;
                            console.log("finded organization:", $scope.findedOrganization);
                        } else {
                            abp.notify.error("Не знайдено!");
                            $scope.findedOrganization = null;
                        }
                    });
            };

            $scope.submitPayment = function () {
                var code = $scope.findedOrganization.codeOfOrganization;
                //code = parseInt(code);
                if (!code) {
                    abp.notify.error("ЄДРПОУ та IНН не мають значень");
                    return;
                }
                items.putUnmappedOpereationToSystemByEDRPOU({ OrganizationEDRPOU: code, BankOperationLogId: $scope.operation.id })
                            .then(function (reponse) {
                                abp.notify.success("Платіж проведено");
                                console.log("Платіж проведено:",reponse.data);

                                $scope.filter.inputedEDRPOU = '';
                                $scope.findedOrganization = null;
                                $scope.operation = null;
                                $scope.tableParams.reload();
                            });
            };

            $scope.deletePayment = function (id) {
                if (confirm("Ви дійсно бажаєте видалити платіж?")) {
                    var curOperation = $scope.operations[id];
                    items.deleteBankOperationLog({ OrganizationEDRPOU: '', BankOperationLogId: curOperation.id })
                    .then(function(data) {
                        abp.notify.success("Платіж видалено.");
                        $scope.tableParams.reload();
                    },
                    function () {
                        abp.notify.error(data);
                    });
                }
            };
        }]);
})();;
(function () {
    var controllerId = 'unsubscribeCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$rootScope',
        '$stateParams',
        'abp.services.etender.notifications',
        '$location',
        '$window',
        function (
            $scope,
            $rootScope,
            $stateParams,
            notificationsService,
            $location,
            $window
        ) {
            $scope.url = $location.path();

            $scope.ReadUnsubscribeData = function () {
                $scope.crypto = $stateParams.crypto;
                $scope.key = $stateParams.key;
            }

            $scope.verifyUnsubscribe = function () {
                alert('Verify ' + $scope.key);
                var unsubscribeRequest = { crypto: $scope.crypto, key: $scope.key };
                notificationsService.validateSubscription(unsubscribeRequest).then(function (data) {
                    console.log(data);
                });
                //messengerSubscriptionService.getMessangerSubscription()
                //    .then(function (response) {
                //        $scope.messengerSubscriptions = response.data;
                //    });
            }

            $scope.confirmUnsubscribe = function () {
                alert('Confirm ' + $scope.crypto);
                var unsubscribeRequest = { crypto: $scope.crypto, key: $scope.key };
                notificationsService.deleteSubscriptionExternal(unsubscribeRequest);
                //messengerSubscriptionService.updateMessangerSubscription($scope.messengerSubscriptions)
                //    .then(function () {
                //        abp.notify.success(abp.localization.localize('MessengerSubscribesChangedSuccess', 'Shared'));
                //    });
            };

            angular.element(document).ready(function () {
                $scope.ReadUnsubscribeData();
                $scope.verifyUnsubscribe();
            });            
        }]);
})();;
(function () {
    var controllerId = 'webinarsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.etender.organization', 'abp.services.etender.user', 'abp.services.etender.emailNotification', '$localStorage',
        function ($scope, organization, user, emailNotification, $localStorage) {
            $scope.ng_localStorage = $localStorage;
            $scope.services = {};
            $scope.order = {};
            $scope.order.servicesToOrder = [];
            $scope.order.contacts = {};
            $scope.ordered = {};
            $scope.services.openTender = {};

            $scope.services.doporohoviPurchase = {};

            $scope.services.negotiatingPurchase = {};

            $scope.services.procurementPlan = {};

            $scope.services.reportOfTreaty = {};


            $scope.order.contacts.organizationName = $localStorage.organizationName;
            $scope.order.contacts.organizationContactName = $localStorage.organizationContactName;
            $scope.order.contacts.organizationContactTelephone = $localStorage.organizationContactTelephone;
            $scope.order.contacts.organizationContactEmail = $localStorage.organizationContactEmail;


            $scope.order.totalCount = 0;

            $scope.totalCounter = function () {};
                

        }]);
})(window.angular);;
(function () {
    angular
        .module("app")
        .controller("relocationCtrl", [
            "$scope", "abp.services.etender.relocation", "$timeout",
            function ($scope, relocation, $timeout) {
                $scope.vm = {
                    tab: 'relocation',
                    transferTokenRegExpr: /^[0-9a-f]{32}$/,
                    showRelocationSendDataMsg: false,
                    reloactionSendDataTransferToken: null,
                    reloactionSendDataObjectIdUa: null
                };
                $scope.types = [
                    {
                        title: "річний план закупівлі",
                        value: "plan"
                    },
                    {
                        title: "оголошення про проведення процедури закупівлі",
                        value: "tender"
                    },
                    {
                        title: "договір про закупівлю",
                        value: "contract"
                    },
                    {
                        title: "рамкова угода",
                        value: "agreement"
                    }
                ];
                $scope.relocation = {
                    type: null,
                    objectIdUA: null,
                    transferToken: null
                };
                $scope.submit = function () {
                    if (!$scope.relocation.type) {
                        return;
                    }
                    if ($scope.relocation.type.value) {
                        $scope.relocation.type = $scope.relocation.type.value;
                    }
                    var classificationData = relocation.relocationObjectToOurSite($scope.relocation);
                    classificationData.then(function (response) {
                        abp.notify.success('Тип: ' + getTypeTitle($scope.relocation.type) + '<br/>' + "Номер об'єкту: " + $scope.relocation.objectIdUA, "Даний об'єкт перенесено:", true);
                        clearFields();
                    }, function (error) {
                        abp.ui.clearBusy(".panel-default");
                    });
                };

                $scope.relocationSend = {
                    type: null,
                    objectIdUA: null,
                };
                $scope.submitSend = function () {
                    if (!$scope.relocationSend.type) {
                        return;
                    }
                    if ($scope.relocationSend.type.value) {
                        $scope.relocationSend.type = $scope.relocationSend.type.value;
                    }
                    var classificationData = relocation.getRelocationData($scope.relocationSend);
                    classificationData.then(function (response) {
                        if (response.data) {
                            $scope.vm.showRelocationSendDataMsg = true;
                            $scope.vm.reloactionSendDataTransferToken = response.data.transferToken;
                            $scope.vm.reloactionSendDataObjectIdUa = $scope.relocationSend.objectIdUA;
                        } 
                        $scope.relocationSend.type = null;
                        $scope.relocationSend.objectIdUA = null;

                    }, function (error) {
                        abp.ui.clearBusy(".panel-default");
                    });

                }

                function getTypeTitle(typeValue) {
                    var typeObject = $scope.types.find(function (type) {
                        return type.value === typeValue;
                    });
                    if (typeObject) {
                        return typeObject.title;
                    }
                }

                function clearFields() {
                    $scope.relocation.type = null;
                    $scope.relocation.objectIdUA = null;
                    $scope.relocation.transferToken = null;
                }
            }
        ]);
})();;
(function () {
    var controllerId = "reportCtrl";
    angular.module("app")
        .controller(controllerId, [
            "$rootScope", "$scope", "abp.services.etender.report", "$localStorage",
            function ($rootScope, $scope, report, $localStorage) {
                $scope.ng_localStorage = $localStorage;
                $scope.regexDate = $rootScope.regex.date;
                $scope.accordion = {
                    isUsersAndBillings: false,
                    isSubProposals: false,
                    isDeclaredProcedures: false,
                    isCompletedProcedureItems: false,
                    isDetailProcedureByOrgs: false,
                    isAccTransactBidsQtyItems: false,
                    isPerformedProcEkoPercent: !$scope.ng_localStorage.isChiefAccountant
                };

                var reportInputStartEndDay = function ($scope) {
                    return {
                        startDay: $scope.filter.startDay,
                        endDay: $scope.filter.endDay
                    }
                };

                // 1 and 2 Users And Billings
                var loadUsersAndBillings = function () {
                    if ($scope.accordion.isUsersAndBillings) {
                        abp.ui.setBusy(".panel-default:first");
                        // 1 Users Info
                        var serviceHeaderUsersInfoItems = report.getReportHeaderUsersInfoItems(reportInputStartEndDay($scope));
                        serviceHeaderUsersInfoItems.then(function (response) {
                            $scope.headerUsersInfoItemsResult = response.data.items;
                        }, function (error) {
                            console.log(error);
                            abp.ui.clearBusy(".panel-default");
                        });
                        // 2 Billings vs receipts  
                        var serviceBillingsReceiptsItems = report.getBillingsReceiptsItems(reportInputStartEndDay($scope));
                        serviceBillingsReceiptsItems.then(function (response) {
                            $scope.billingsReceiptsItemsResult = response.data.items;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error);
                            abp.ui.clearBusy(".panel-default");
                        });
                    }
                };
                // 3 Sub Proposals Result 
                var loadSubProposals = function () {
                    if ($scope.accordion.isSubProposals) {
                        abp.ui.setBusy(".panel-default:first");
                        var serviceSubProposalsItems = report.getSubProposalsItems(reportInputStartEndDay($scope));
                        serviceSubProposalsItems.then(function (response) {
                            $scope.subProposalsItemsResult = response.data.proposalItems;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error);
                            abp.ui.clearBusy(".panel-default");
                        });
                    }
                };
                // 4 Declared Procedures
                var loadDeclaredProcedures = function () {
                    if ($scope.accordion.isDeclaredProcedures) {
                        abp.ui.setBusy(".panel-default:first");
                        var serviceDeclaredProcedures = report.getDeclaredProcedureItems(reportInputStartEndDay($scope));
                        serviceDeclaredProcedures.then(function (response) {
                            $scope.declaredProcedures = response.data.itemsByGroup;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error);
                            abp.ui.clearBusy(".panel-default");
                        });
                    }
                };
                // 5 Performed Procedures 
                //var loadPerformedProcedures = function(state) {
                //    if ($scope.performedProceduresItems === undefined || state === 'reload') {
                //        isPerformedProcedures = true;
                //        var servicePerformedProcedures = report.getPerformedProcedureItems(reportInputStartEndDay($scope));
                //        servicePerformedProcedures.then(function(response) {
                //            $scope.performedProceduresItems = response.data.itemsByGroup;
                //        });
                //    }
                //};
                // 6 Completed Procedures
                var loadCompletedProcedures = function () {
                    if ($scope.accordion.isCompletedProcedureItems) {
                        abp.ui.setBusy(".panel-default:first");
                        var serviceComletedProcedures = report.getComletedProcedureItems(reportInputStartEndDay($scope));
                        serviceComletedProcedures.then(function (response) {
                            $scope.completedProcedureItems = response.data.itemsByGroup;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error)
                        });
                    }
                };
                // 7 Detail Procedures By Organizations
                var loadDetailProcedureByOrgs = function () {
                    if ($scope.accordion.isDetailProcedureByOrgs) {
                        abp.ui.setBusy(".panel-default:first");
                        var serviceDetailProcedureByOrgs = report.getDetailProcedureByOrgsItems(reportInputStartEndDay($scope));
                        serviceDetailProcedureByOrgs.then(function (response) {
                            $scope.detailProcedureByOrgs = response.data.items;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error)
                        });
                    }
                };
                // 8 Detail Procedures By Organizations
                var loadAccTransactBidsQtyItems = function () {
                    if ($scope.accordion.isAccTransactBidsQtyItems) {
                        abp.ui.setBusy(".panel-default:first");
                        var serviceAccTransactBidsQtyItems = report.getAccTransactBidsQtyItems(reportInputStartEndDay($scope));
                        serviceAccTransactBidsQtyItems.then(function (response) {
                            $scope.accTransactBidsQtyItems = response.data.accTransactBidsQtyItems;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error);
                            abp.ui.clearBusy(".panel-default");
                        });
                    }
                };
                // 9  Performed Procedures Ekonom Percent
                var loadPerformedProcEkoPercent = function (reload) {
                    if (!$scope.ng_localStorage.isChiefAccountant)
                        $scope.accordion.isPerformedProcEkoPercent = true;
                    if (reload == 1 || ($scope.ng_localStorage.isChiefAccountant && $scope.accordion.isPerformedProcEkoPercent)) {
                        abp.ui.setBusy(".panel-default:first");
                        var reportInput = {
                            startDay: $scope.filter.startDay,
                            endDay: $scope.filter.endDay,
                            tenantId: -1
                        };
                        var servicePerformedProcEkoPercentItems = report.getPerformedProcEkoPercentItems(reportInput);
                        servicePerformedProcEkoPercentItems.then(function (response) {
                            $scope.servicePerformedProcEkoPercentItems = response.data.items;
                            abp.ui.clearBusy(".panel-default");
                        }, function (error) {
                            console.log(error);
                            abp.ui.clearBusy(".panel-default");
                        });
                    }
                };

                var loadReport = function () {
                    if ($scope.ng_localStorage.isChiefAccountant) {
                        if (!$scope.accordion.isUsersAndBillings && !$scope.accordion.isSubProposals && !$scope.accordion.isDeclaredProcedures && !$scope.accordion.isCompletedProcedureItems
                            && !$scope.accordion.isDetailProcedureByOrgs && !$scope.accordion.isAccTransactBidsQtyItems && !$scope.accordion.isPerformedProcEkoPercent)
                            $scope.accordion.isUsersAndBillings = true;

                        if ($scope.accordion.isUsersAndBillings) {
                            loadUsersAndBillings();
                        }
                        if ($scope.accordion.isSubProposals) {
                            loadSubProposals();
                        }
                        if ($scope.accordion.isDeclaredProcedures) {
                            loadDeclaredProcedures();
                        }
                        //if (isPerformedProcedures) {
                        //    loadPerformedProcedures("reload");
                        //}
                        if ($scope.accordion.isCompletedProcedureItems) {
                            loadCompletedProcedures();
                        }
                        if ($scope.accordion.isDetailProcedureByOrgs) {
                            loadDetailProcedureByOrgs();
                        }
                        if ($scope.accordion.isAccTransactBidsQtyItems) {
                            loadAccTransactBidsQtyItems();
                        }
                    }
                    if ($scope.accordion.isPerformedProcEkoPercent) {
                        loadPerformedProcEkoPercent(1);
                    }
                };

                $scope.loadReport = loadReport;
                $scope.loadUsersAndBillings = loadUsersAndBillings;
                $scope.loadSubProposals = loadSubProposals;
                $scope.loadDeclaredProcedures = loadDeclaredProcedures;
                //$scope.loadPerformedProcedures = loadPerformedProcedures;
                $scope.loadCompletedProcedures = loadCompletedProcedures;
                $scope.loadDetailProcedureByOrgs = loadDetailProcedureByOrgs;
                $scope.loadPerformedProcEkoPercent = loadPerformedProcEkoPercent;
                $scope.loadAccTransactBidsQtyItems = loadAccTransactBidsQtyItems;
            }
        ]);
})();;
(function () {
    var controllerId = 'seoPageCtrl';
    angular.module('app')
        .controller(controllerId, [
            "$scope", 'abp.services.etender.tender',
            function ($scope, tenderAppService) {
                
                $scope.syncTendersSeo = function () {
                    var numOfTenders = $scope.numOfTenders;
                    tenderAppService.synhronizeSeoTenders(numOfTenders)
                        .then(function (response) {
                            abp.notify.success("Синхронизировано тендеров: "+response.data);
                        });

                    };
            }
        ]);
})();;
(function() {
    var controllerId = 'tarifsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', function($scope) {
        }
    ]);
})();;
angular.module('app')
    .controller('additionalClassificationCtrl', [
        '$scope', 'ngTableParams', '$filter', 'abp.services.etender.reference', '$timeout',

        function ($scope, ngTableParams, $filter, reference, $timeout) {

            var timer;
            
            $scope.dkScheme = {
                value: "ДК003"
            };
            
            $scope.search = function (searchstring) {
                $scope.searchstring = searchstring;
                $timeout.cancel(timer);
                timer = $timeout(function () {
                    $scope.tableParams.reload();
                    $scope.tableParams.page(1);
                }, 1000);
            };

            $scope.changeSelection = function (item) {
                var d = $scope.tableParams.data;
                for (var i = 0; i < d.length; i += 1) {
                    d[i].$selected = false;
                }
                item.$selected = true;
                $scope.selectedData = item;
            };

            $scope.choose = function () {
                var lotCompare = $scope.data.lots[0];
                if (!lotCompare.items[0]) {
                    abp.notify.error('Спочатку додайте позицію закупівля до першого лоту');
                    return;
                }
                var additionalClassification = lotCompare.items[0].additionalClassifications[0];
                var firstAdditionalClassification = $scope.lotInd === 0 && $scope.itemInd === 0 && $scope.addClassificatorInd === 0;
                if (additionalClassification.id && !firstAdditionalClassification && $scope.selectedData) {
                    // check 5 symb (digits only)
                    var c = additionalClassification.code ? additionalClassification.code.substring(0, 7) : additionalClassification.id.substring(0, 7);
                    var sc = $scope.selectedData.code.substring(0, c.length);
                    if (sc !== c) {
                        abp.notify.error('Код ДКПП має починатися з ' + c);
                        return;
                    }
                }
                if (firstAdditionalClassification) {
                    for (var li = 0; li < $scope.data.lots.length; li += 1) {
                        var l = $scope.data.lots[li];
                        for (var ii = 0; ii < l.items.length; ii += 1) {
                            l.items[ii].additionalClassifications = [{}];
                        }
                    }
                }

                if (!$scope.selectedData) return;
                var lotInd = Number($scope.lotInd); // @hack @todo figure-out why $scope.lotInd could be an empty string.
                $scope.data.lots[lotInd].items[$scope.itemInd].additionalClassifications[$scope.addClassificatorInd] = $scope.selectedData;
                $scope.$parent.cansave = true;
            };
            
            $scope.changeDk = function () {
                if ($scope.dkScheme.value == 'Спеціальні норми та інше') {
                    $scope.changeSelection({
                        id: '-', // default value
                        code: '000',
                        description: 'Спеціальні норми та інше',
                        scheme: 'specialNorms'
                    });
                    return;
                }
                $scope.tableParams.reload();                
            };
            
            $scope.ShowDKPP = function () {
                var showDKPP = false;
                if (!$scope.data || !$scope.data.lots) return false;
                var lots = $scope.data.lots;                
                if (lots && lots.length > 0) {
                    lots.forEach(function (lot) {
                        var items = lot.items;
                        if (items && items.length > 0) {
                            items.forEach(function (item) {
                                if (item.additionalClassifications && item.additionalClassifications.length > 0 && item.additionalClassifications[0].scheme && item.additionalClassifications[0].scheme == 'ДКПП') {
                                    showDKPP = true;
                                }});}});}
                return showDKPP;
            }

            $scope.tableParams = new ngTableParams({
                page: 1, // show first page
                count: 10 // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {
                    if (params.settings().$scope == null) {
                        params.settings().$scope = $scope;
                    }
                    //pager Params
                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        SearchIdentifier: $scope.searchstring,
                        OrderColumn: '',
                        OrderDirection: ''
                    };

                    switch($scope.dkScheme.value) {
                        case "ДК015":
                            var classificationData = reference.getCurrentDk015Ref(pager);
                            break;
                        case "ДК018":
                            classificationData = reference.getCurrentDk018Ref(pager);
                            break;
                        case "ДК003":
                            classificationData = reference.getCurrentDk003Ref(pager);
                            break;
                        case "ДКПП":
                            classificationData = reference.getCurrentDkRef(pager);
                            break;
                        default:
                            classificationData = reference.getCurrentDk015Ref(pager);
                            break;
                    }
                    //var classificationData = reference.getCurrentDkRef(pager);
                    abp.ui.setBusy(".modal-body");
                    classificationData.then(function (reponse) {
                        abp.ui.clearBusy(".modal-body");
                        //data.dk.forEach(function(item) {
                        //    item.scheme = 'ДКПП';
                        //});
                        params.total(reponse.data.countAllRecords);
                        $defer.resolve(reponse.data.dk);
                    });
                }
            });
        }
    ]);;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('addQuestionTenderCtrl', addQuestion);

    addQuestion.$inject = ['$scope', '$stateParams', 'abp.services.etender.tender', 'goToTenderService'];

    function addQuestion($scope, $stateParams, tenderService, goToTenderService) {
        $scope.vm = {
            lots: [],
            lotsVisible: false,
            onselect: onselect,
            questionTo: { id: 1 },
            questionsTo: [],
            question: {
                description: '',
                title: '',
                lot: {
                    id: null
                },
                ItemId: {
                    id: null
                }
            },
            submit: submit
        };
        var vm = $scope.vm;

        activate();

        function activate() {
            tenderService.getTenderLots({ tenderId: $stateParams.tId })
                .then(function(response) {

                    vm.lots = response.data;
                    vm.items = [];

                    for (var i = 0; i < vm.lots.length; i++) {

                        for (var j = 0; j < vm.lots[i].itemDtos.length; j++) {
                            vm.items.push(vm.lots[i].itemDtos[j]);
                        }
                    }

                    if (response.data[0].isFake) {
                        vm.questionsTo = [
                            {
                                id: 1,
                                title: 'Тендеру'
                            }, {
                                id: 3,
                                title: 'Предмету закупки'
                            }
                        ];
                    } else {
                        vm.questionsTo = [
                            {
                                id: 1,
                                title: 'Тендеру'
                            }, {
                                id: 2,
                                title: 'Лоту'
                            }, {
                                id: 3,
                                title: 'Предмету закупки'
                            }
                        ];
                    }
                });
        }


        function submit() {
            tenderService.addQuestion({
                description: vm.question.description,
                lotId: vm.question.lot.id,
                tenderId: $stateParams.tId,
                title: vm.question.title,
                ItemId: vm.question.ItemId.id
        }).then(function (response) {
                    abp.notify.success('Запитання відправлено!');
                    goToTenderService.redirect(response.data, $stateParams.tId);
                }, function (errorResponse) {
                    console.log(errorResponse);
                });
        };

        function onselect() {
            var questionTo = vm.questionTo;
            if (!questionTo) {
                return;
            }
            if (questionTo.id === 2) {
                vm.lotsVisible = true;
                vm.ItemsVisible = false;
            }
            else if(questionTo.id === 3) {
                vm.ItemsVisible = true;
                vm.lotsVisible = false;
            }
            else {
                vm.lotsVisible = false;
                vm.ItemsVisible = false;
                vm.question.lot = { id: null };
            }
        }

    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('awardCreateCtrl', awardCreate);
    awardCreate.$inject = [
        '$scope',
        '$rootScope',
        'lookupService',
        'awardValidationService',
        'abp.services.etender.award',
        'abp.services.etender.address',
        'organizationDataService',
        '$localStorage',
        '$window'];
    function awardCreate(
        $scope,
        $rootScope,
        lookupService,
        awardValidation,
        awardService,
        addressService,
        organizationDataService,
        $localStorage,
        $window) {

        $scope.activate = function () {

            var award = $scope.detailes.awardWinnerInfo;
            var awardOrg = $scope.detailes.awardWinnerInfo && $scope.detailes.awardWinnerInfo.organizationInfo;

            $scope.ng_localStorage = $localStorage;

            $scope.getOrganozation = function () {
                    organizationDataService.getData();
            }

            $scope.getScaleList = function () {
               organizationDataService.getOrganizationScaleList();
            }

            for (var i = 0; i < $scope.detailes.lots.length; i++) {
                $scope.detailes.lots[i].ac = {
                    value: award && award.value && award.value.amount || null,
                    code: awardOrg && awardOrg.codeEDRPOU || null,
                    sCurrency: {
                        code: award && award.value && award.value.currencyCode || "UAH",
                        title: award && award.dealCurrency && award.dealCurrency.title || "грн",
                        value: award && award.value && award.value.currencyId || 1
                    },
                    name: awardOrg && awardOrg.organizationName || null,
                    cp: {
                        name: awardOrg && awardOrg.contactPointName || null,
                        email: awardOrg && awardOrg.email || null,
                        url: awardOrg && awardOrg.contactPointUrl || null,
                        telephone: awardOrg && awardOrg.contactPointTelephone || null,
                        faxNumber: awardOrg && awardOrg.contactPointFaxNumber || null
                    },
                    qualified: true,
                    subcontractingDetails: null,
                    address: {
                        country: {
                            id: awardOrg && awardOrg.countryId || null
                        },
                        region: {
                            countryId: awardOrg && awardOrg.countryId || null,
                            id: awardOrg && awardOrg.regionId || null,
                            title: awardOrg && awardOrg.regionTitle || null
                        },
                        city: {
                            id: awardOrg && awardOrg.cityId || null,
                            regionId: awardOrg && awardOrg.regionId || null,
                            title: awardOrg && awardOrg.cityTitle || null
                        },
                        postIndex: awardOrg && awardOrg.postIndex || null,
                        addressStr: awardOrg && awardOrg.addressStr || null
                    }
                };
            }
        }

        var isValidAmount = function (l) {
            if (!l.ac || !l.ac.value || !l.ac.qualified) return true;
            if ($scope.detailes.procurementMethodType == 'reporting' && l.ac.value > 0) {
                if (awardValidation.priceValidation(l, $scope.detailes.procurementMethodType)) {
                    return true;
                }
                return false;
            } else if ($scope.detailes.procurementMethodType == 'negotiation.quick' || $scope.detailes.procurementMethodType == 'negotiation') {
                return true;
            }
            return awardValidation.priceValidation(l, $scope.detailes.procurementMethodType);
        };

        $scope.checkEnteredValue = function (lot) {
            var selectedCountry = lot.ac.address.country.title;
            var enteredValue = lot.ac.code;
            var isUkrainePassport = false;

            var regexAgainstUkraine = /^\d{8,10}$/;
            var regexAgainstUkrainePassport = /^[a-zA-Z]{2}[0-9]{6}$/;
            var regeexAgainstOtherCountry = /^[0-9-a-zA-Z]{1,50}$/;

            if (enteredValue) {
                isUkrainePassport = /^[a-zA-Z]{2}$/.test(enteredValue.substring(0,2));
                if (selectedCountry === 'Україна') {
                    if (isUkrainePassport) {
                        return regexAgainstUkrainePassport.test(enteredValue);
                    } else {
                        return regexAgainstUkraine.test(enteredValue);
                    }
                } else {
                    return regeexAgainstOtherCountry.test(enteredValue);
                }
            }

            return false;
        };

        var create = function (l) {
            abp.ui.setBusy();
            addressService.getOrCreateAddress(l.ac.address)
                .then(function (response) {
                    var schemeId;
                    if (l.ac.address.scheme) {
                        schemeId = l.ac.address.scheme;
                    } else {
                        schemeId = 36;//l.ac.address && l.ac.address.country && l.ac.address.country.id;
                    };
                    var createAwardDto = {
                        addressId: response.data.address.id,
                        contactPoint: {
                            name: l.ac.cp.name,
                            email: l.ac.cp.email,
                            faxNumber: l.ac.cp.faxNumber,
                            telephone: l.ac.cp.telephone.indexOf('+') === -1 ? '+' + l.ac.cp.telephone : l.ac.cp.telephone,
                            url: l.ac.cp.url
                        },
                        organizationCode: l.ac.code,
                        organizationName: l.ac.name,
                        lotId: l.id,
                        qualified: l.ac.qualified,
                        subcontractingDetails: l.ac.subcontractingDetails,
                        value: {
                            amount: l.ac.value,
                            currencyId: $scope.detailes.value.currencyId,
                            valueAddedTaxIncluded: $scope.detailes.value.valueAddedTaxIncluded
                        },
                        schemeId: schemeId,
                        scale: l.ac.scale
                    };

                    awardService
                        .createAward(createAwardDto)
                        .then(function () {
                            abp.ui.clearBusy();
                            $window.location.reload();                            
                        },
                            function (e) {
                                abp.ui.clearBusy();
                                abp.notify.error(e.data.message);
                            });

                },
                    function () {
                        abp.ui.clearBusy();
                        abp.notify.error('Неможливо створити адресу');
                    });
        };

        $scope.isDataGoodForNeogaionMethodType = function (lot) {
            return parseFloat(lot.ac.value) === lot.value.amount || parseFloat(lot.ac.value) < lot.value.amount;
        }

        var isAllDataGood = function (l) {

            if (!l.ac.address.region || l.ac.address.region.title === '' || (!l.ac.address.city)) return false;

            if ($scope.detailes.procurementMethodType == 'reporting') return true;
            if ($scope.detailes.procurementMethodType == 'negotiation.quick' || $scope.detailes.procurementMethodType == 'negotiation') {
                return $scope.isDataGoodForNeogaionMethodType(l);
            }
            return true;
        };

        $scope.vm.ac = {
            create: create,
            isValidAmount: isValidAmount,
            isAllDataGood: isAllDataGood,
            regexFloatNumber: $rootScope.regex.floatNumber
        };
        var vm = $scope.vm;
    }

})();;
(function () {
    var controllerId = 'createTenderCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$q',
        '$stateParams',
        '$state',
        '$localStorage',
        'addFeaturesService',
        'siteSettingsService',
        'tenderFormBelowThresholdService',
        'tenderFormService',
        'abp.services.etender.workingDays',
        'tenderHelperService',
        function (
            $scope,
            $q,
            $stateParams,
            $state,
            $localStorage,
            addFeaturesService,
            siteSettingsService,
            tenderFormBelowThresholdService,
            tenderFormService,
            workingDays,
            tenderHelperService) {

            $scope.ng_localStorage = $localStorage;

            // create from template
            if ($stateParams.tId) { 

                // get tendet data
                tenderFormService.getTender($scope);

                $scope.getTenderThen = function (data) {

                    // set tender data
                    tenderFormBelowThresholdService.setTenderData($scope, data);

                    $scope.createTenderModel.isCreatedFromTemplate = 'true';
                    $scope.createTenderModel.lots.forEach(function (l) {
                        l.hasGuarantee = '0';
                        if (l.guarantee && l.guarantee.amount > 0) {
                            l.hasGuarantee = '1';
                        }
                    });
                    clearBusy();
                }

            } else {
                $scope.createTenderModel = tenderHelperService.getCreateTenderModel('belowThreshold', 'open', $scope.ng_localStorage.isProdMode, $state);
            }

            //получаем данные об организации из tenderContactPoint
            $scope.$on('userDataFields', function (param, data) {
                tenderFormService.updateTenderModelWithOrganization($scope, data);
            });

            var createAddressPromises = [];

            $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
                $scope.blockCreateTender = true;
                abp.ui.setBusy();

                var model = $scope.createTenderModel;

				if (!model.isMultilots) {
					model.lots[0].isFake = true;
					model.lots = model.lots.splice(0, 1);
				}

                if (isNotExport) model.templateType = 'tenderDraft';
                if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
                model.notExport = isNotExport;
                for (var k = 0; k < model.lots.length; k += 1) {
                    var lot = model.lots[k];                    

                    for (var j = 0; j < lot.items.length; j++) {                                                
                        var curItem = lot.items[j];

                        if (curItem.classification.code) { 
                            curItem.classification.id = curItem.classification.code;
							curItem.classification.description = curItem.classification.description;
							if (curItem.additionalClassifications) {
								for (var i = 0; i < curItem.additionalClassifications.length; i++) {
									curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
									curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
								}
							}
                        }

                        if (curItem.deliveryLocation && typeof curItem.deliveryLocation !== 'undefined'
                            && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                            delete curItem.deliveryLocation;
                        }

                        if (curItem.deliveryAddress.region != null) {
                            tenderFormService.createAddressInput(curItem, createAddressPromises);
                        }
                    }
                }
                if (createAddressPromises.length > 0) {
                    $q.all(createAddressPromises).then(function () {
                        return $scope.createTenderFinally(isNotExport);
                    });

                } else {
                    return $scope.createTenderFinally(isNotExport);
                }
                
            };

            $scope.ifModelHasGuarantee = function (model) {
                var hasGuarantee = false;
                if (model && model.lots && model.lots.length) {
                    model.lots.forEach(function(lot) {
                        if (lot.hasGuarantee && lot.hasGuarantee !== '0') {
                            hasGuarantee = true;
                        }
                    });
                }
                $scope.hasGuarantee = hasGuarantee;
                return hasGuarantee;
            };

            $scope.$on('hasGuaranteeChanged', function () {
                $scope.ifModelHasGuarantee($scope.createTenderModel);
            });
            
            $scope.isAllDataGood = function (model) {
                if (!tenderFormBelowThresholdService.isAllDataGood(model)) return false;

                for (var i = 0; i < model.lots.length; i += 1) {
                    var lot = model.lots[i];
                    if (!tenderFormBelowThresholdService.isAllDataGoodInLot(model, lot)) return false;

                    for (var j = 0; j < lot.items.length; j += 1) {
                        var item = lot.items[j];
                        if (!tenderFormBelowThresholdService.isAllDataGoodinItem(item)) return false;
                        

                        if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                             ((item.deliveryDate.endDate < item.deliveryDate.startDate) || (item.deliveryDate.startDate && item.deliveryDate.startDate < model.tenderPeriod.endDate))) {
                            return false;
                        }

                        if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                    }
                }                

                if (!checkFeatureSum(model)) return false;
                if (!checkMilestonesPercentageSumm(model)) return false;

                return true;
            };

            function checkFeatureSum(model) {
                return addFeaturesService.checkFeatureSumCreateUpdate(model);
            }
            function checkMilestonesPercentageSumm(model) {
                return tenderFormService.checkMilestonesPercentageSumm(model);
            }
            function clearBusy() {
                siteSettingsService.clearBusy();
            }

            clearBusy();
        }
    ]);

})();
;
angular.module('app').directive('createTenderCriteria', ['$templateCache',
    function ($templateCache) {
        return {
            restrict: 'AE',
            template: $templateCache.get('createTenderCriteria from cache'),
            scope: {
                tenderId: '=',
                needButtons: '=',
                updateTenderModel: '=',
                tenderDetailes: '='
            },
            controller: [
                '$scope',
                '$rootScope',
                '$location',
                '$timeout', 
                'tenderHelperService',
                '$localStorage',
                'getTenderService',
                'abp.services.etender.tender',
                'abp.services.etender.getTender',
                'criteriasDictionaryService',
                'goToTenderService',
                'tenderCriteriasService',
                function ($scope, $rootScope, $location, $timeout, tenderHelperService, $localStorage, getTenderService, tender, getTender, criteriasDictionaryService, goToTenderService, tenderCriteriasService) {

                    if (!abp.session || !abp.session.userId) {
                        abp.ng.http.handleUnAuthorizedRequest(null, '/');
                    }
                    $scope.sortedCriterias = [];
                    $scope.guaranteeCriteria = null;

                    var queryParams = $location.search();
                    var excludedCriterias = [];
                    var criteriasOther = [];
                    var tenderCriteriasDto = [];
                    var excludedStringExclusion = "CRITERION.EXCLUSION";
                    var excludedStringOther = "CRITERION.OTHER";

                    $scope.skipSign = queryParams && queryParams.noSign;
                    $scope.getTenderCounter = 0;
                    $scope.detailes = null;
                    $scope.isUpdateExportButtonDisabled = false;
                    $scope.ableToSafeRequirementsIfHasApiId = false;
                    $scope.optionalRequirementTitle = "Юридична особа, яка є учасником процедури закупівлі (крім нерезидентів), має антикорупційну програму чи уповноваженого з реалізації антикорупційної програми, якщо вартість закупівлі товару (товарів), послуги (послуг) або робіт дорівнює чи перевищує 20 мільйонів гривень (у тому числі за лотом)";
                    $scope.statuses = ['active', 'cancelled'];
                    $scope.lifeCycleCriterias = [
                        'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                        'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                    ];

                    $scope.guaranteeCriteria = [
                        'CRITERION.OTHER.BID.GUARANTEE',
                        'CRITERION.OTHER.CONTRACT.GUARANTEE'
                    ];

                    $scope.onlyDocumentsEvidenceCriterias = $scope.lifeCycleCriterias.concat($scope.guaranteeCriteria);

                    if ($location.url().indexOf('CreateTenderCriteria') !== -1 && $scope.tenderId) {
                        getTenderInfoRequest($scope.tenderId);
                    }

                    $scope.$watch('[tenderId, vm.selectedDocType]', function (data) {
                        $scope.vm.docsFields.myObj.tenderId = data[0];
                        if (data[1]) {
                            $scope.vm.docsFields.DocumentType = data[1].id
                        }
                    });

                    $scope.$watch('updateTenderModel', function () {
                        if ($scope.tenderId && $scope.updateTenderModel && $scope.updateTenderModel.id) {
                            getTenderInfo($scope.updateTenderModel);
                        }
                    }); 

                    $scope.vm = {
                        files: [],
                        docsFields: {
                            myObj: { "tenderId": "", "documentId": "" },
                            DocumentType: ''
                        },
                        isEdit: true,
                        validDocPeriod: true,
                        documentTypesForDropDown: tenderHelperService.getDocTypes()
                    };

                    $scope.addConfirmOption = function (placeToAdd, criteria) {
                        if (!placeToAdd.eligibleEvidences) placeToAdd.eligibleEvidences = [];
                        var objToAdd = $scope.checkIfCriteriaClassificationMatches(criteria, $scope.onlyDocumentsEvidenceCriterias)
                            ? {type: 'document'} : {};
                        placeToAdd.eligibleEvidences.push(objToAdd);
                        $timeout(function () {
                            $scope.$emit('onCriteriaEvidenceChanged', $scope.criteriasForm.$valid);
                        });
                    };

                    $scope.removeConfirmOption = function (index, from) {
                        from.eligibleEvidences.splice(index, 1);
                        $timeout(function () {
                            $scope.$emit('onCriteriaEvidenceChanged', $scope.criteriasForm.$valid);
                        });
                    };

                    $scope.onEvidenceTypeChange = function (evidence) {
                        if (evidence.type === 'statement') {
                            delete evidence.tenderDocumentId;
                            delete evidence.tenderDocument;
                        }
                        $timeout(function () {
                            $scope.$emit('onCriteriaEvidenceChanged', $scope.criteriasForm.$valid);
                        });
                    };

                    $scope.canModifyDocuments = function () {
                        return true;
                    };

                    $scope.getDetailesLocalizationText = function (type) {
                        return criteriasDictionaryService.getDetailesLocalizationText(type);
                    };

                    $scope.setTitle = function (index) {
                        switch (index) {
                            case 0:
                                return excludedCriterias && excludedCriterias.length
                                    ? $rootScope.source('ReasonToRefuse') : '';
                            case 1:
                                return criteriasOther && criteriasOther.length
                                    ? 'Інформація про інші технічні, якісні та кількісні характеристики та вимоги до учасника' : '';
                            default:
                                break;
                        }
                    };

                    $scope.updateTenderStatus = function () {
                        abp.ui.setBusy('#update-export-status');
                        $scope.isUpdateExportButtonDisabled = true;
                        getTenderInfoRequest($scope.tenderId);
                        $timeout(function () {
                            abp.ui.clearBusy('#update-export-status');
                            $scope.isUpdateExportButtonDisabled = false;
                        }, 5000);
                    };

                    $scope.getTenderBefore = function () {
                        $scope.documentsToAdd = null;
                        abp.ui.setBusy();
                        $(".hide-move-efect").fadeOut();
                    };

                    $scope.getRealatedEviedenceDocument = function (evidence) {
                        return $scope.detailes.documents.find(function (document) {
                            return document.originId === evidence.tenderDocumentId;
                        });
                    };

                    function getTenderInfoRequest(tenderId, needToSign) {
                        abp.ui.setBusy();
                        getTender.getTender({ "Id": tenderId }).then(function (response) {
                            $scope.detailes = response.data;
                            getTenderService.getTenderThen(response.data, $scope, true);
                            $scope.$emit('needToSignTenderFromCriterias', $scope.detailes);
                            if (!$scope.detailes.apiId && needToSign) {
                                $scope.getTenderCounter++;
                                getTenderInfoRequestWithSign(tenderId, needToSign);
                            } else {
                                if (needToSign) {
                                    $scope.getTenderCounter = 0;
                                }
                                $scope.$emit('updatedCriteriasArray', response.data.tenderCriteria, response.data.lots);
                                getTenderInfo(response.data, needToSign);
                            }
                        }, function (error) {
                            console.log(error);
                        }).finally(function () {
                            abp.ui.clearBusy();
                        });
                    };

                    function getTenderInfoRequestWithSign(tenderId) {
                        if ($scope.getTenderCounter <= 5) {
                            $timeout(function () {
                                getTenderInfoRequest(tenderId, true);
                            }, 1000);
                        } else {
                            $scope.getTenderCounter = 0;
                            abp.notify.error('Сталася помилка при публікації закупівлі.');
                        }
                    }

                    function getTenderInfo(updateTenderModel, needToSign) {
                        $scope.vm.files = updateTenderModel.documents;
                            $scope.optionalCriteriaExist = updateTenderModel.tenderCriteria && updateTenderModel.tenderCriteria.length > 8
                            ? updateTenderModel.tenderCriteria[8].requirementGroups[0].requirements.length > 2
                            : false;
                        setTimeout(function () {
                            setCriterias(updateTenderModel.tenderCriteria);
                            if (updateTenderModel.tenderCriteria.length) {
                                $scope.ableToSafeRequirementsIfHasApiId = updateTenderModel.tenderCriteria.every(everyRequirementHasApiId);
                            } else {
                                $scope.ableToSafeRequirementsIfHasApiId = !checkIfRequiredCriteriasPresented();
                            }

                            if (needToSign) {
                                $scope.showSignModal($scope.detailes.isAllDocumentsExported)
                            }
                        }, 0);
                    }
                    
                    function everyRequirementHasApiId(element, index, array) {
                        return element.apiId;
                    }

                    function checkIfRequiredCriteriasPresented () {
                        var requiredCriterias = tenderCriteriasDto.filter(function (criteria) {
                            return !criteria.isOptional;
                        });

                        return !!requiredCriterias.length;
                    }

                    function setCriterias (criteriasInTender) {
                        criteriasOther = [];
                        var criteriaArticles = [];

                        if (criteriasInTender.length > 0) {
                            criteriaArticles = criteriasInTender;

                            excludedCriterias = criteriaArticles.filter(function (e) {
                                return e.classification.apiId.contains(excludedStringExclusion);
                            });

                            if (excludedCriterias && excludedCriterias.length) {
                                if ($scope.detailes.status === 'draft') {
                                    var nationalCriteria = excludedCriterias.find(function (criteria) {
                                        return criteria.classification.apiId === 'CRITERION.EXCLUSION.NATIONAL.OTHER';
                                    });
                                    if (nationalCriteria.requirementGroups[0].requirements.length !== 3) {
                                        var optionalRequirement =
                                            $localStorage.refs.criterion.exclusion[8].requirementGroups[0].requirements[1];
                                        nationalCriteria.requirementGroups[0].requirements.splice(1, 0, optionalRequirement);
                                    }
                                }

                                excludedCriterias.forEach(function (criteria) {
                                    sortСriteriaRequirementsByApiId(criteria);
                                });
                            }

                            criteriasOther = criteriaArticles.filter(function (e) {
                                return e.classification.apiId.contains(excludedStringOther);
                            });
                            addOtherBidGuaranteeCriterias();
                            addOtherContractGuaranteeCriterias();
                            addLifeCycleCriterias();

                            criteriasOther.forEach(function (criteria) {
                                sortСriteriaRequirementsByApiId(criteria);
                            });

                        } else {
                            criteriaArticles = angular.copy($localStorage.refs.criterion);
                            if ($scope.detailes && $scope.detailes.procurementMethodType !== 'belowThreshold'
                                && $scope.detailes.procurementMethodType !== 'simple.defense') {
                                excludedCriterias = criteriaArticles.exclusion;
                                excludedCriterias.forEach(function (criteria) {
                                    if (criteria.classification.id === 'CRITERION.EXCLUSION.NATIONAL.OTHER') {
                                        criteria.requirementGroups.forEach(function (group) {
                                            group.requirements.forEach(function (requirement) {
                                                if (requirement.title === $scope.optionalRequirementTitle) {
                                                    requirement.requirementStatus = 'active';
                                                }
                                            });
                                        });
                                    }

                                });

                                criteriasOther = [criteriaArticles.other[0]];
                            }

                            addOtherBidGuaranteeCriterias();
                            addOtherContractGuaranteeCriterias();
                            addLifeCycleCriterias();
                        }

                        criteriasOther.forEach(function(elem) {
                            if (elem.classification.id === 'CRITERION.OTHER.BID.LANGUAGE' || elem.classification.apiId === 'CRITERION.OTHER.BID.LANGUAGE') {
                                elem.showEligibleEvidencesIfNotOther = true;
                            } else {
                                elem.showEligibleEvidencesIfNotOther = false;
                            }
                        });

                        tenderCriteriasDto = excludedCriterias.concat(criteriasOther);

                        //TODO: отрефакторить эту дикую вложеность для радио кнопок в критериях
                        tenderCriteriasDto.forEach(function (criterias) {
                            criterias.requirementGroups.forEach(function (groups) {
                                groups.requirements.forEach(function (requirements) {
                                    requirements.isOptionalChecked = true;
                                    if ($scope.optionalRequirementTitle == requirements.title && !$scope.optionalCriteriaExist) {
                                        requirements.isOptionalChecked = false;
                                    }
                                    if (requirements.eligibleEvidences && requirements.eligibleEvidences.length) {
                                        requirements.eligibleEvidences.forEach(function (evidences) {
                                            var preservedType = evidences.type;
                                            evidences.type = "crazy_monkey"
                                            evidences.type = preservedType;

                                            filterDocById(evidences);
                                        });
                                    }
                                });
                            });
                        });

                        $scope.sortedCriterias = [
                            excludedCriterias, criteriasOther
                        ];

                        $scope.checkIfCriteriaFormFilledDescription(criteriasOther);
                    }

                    function filterDocById(evidence) {
                        var filteredDoc = $scope.vm.files.find(function (param) {
                            return evidence.tenderDocumentId === param.originId
                        });
                        if (filteredDoc) {
                            evidence.tenderDocument = {
                                'id': filteredDoc.id,
                                'title': filteredDoc.title
                            }
                        }
                    }

                    function sortСriteriaRequirementsByApiId(criteria) {
                        var isChanged = false;
                        criteria.requirementGroups.forEach(function (groups) {
                            var sameIdRequirements = [];
                            var indexToPlace;
                            groups.requirements.forEach(function (requirement, requirementIndex) {
                                if ($scope.canRequirementChangeStatus(requirement, criteria)) {
                                    if (!isChanged) {
                                        var sameIdRequirementsArr = groups.requirements.filter(function (requirementSearch) {
                                            return requirementSearch.apiId === requirement.apiId;
                                        });

                                        sameIdRequirements = angular.copy(sameIdRequirementsArr);
                                        if (sameIdRequirements.length > 1) {
                                            indexToPlace = requirementIndex;
                                            sameIdRequirements.sort(function (a, b) {
                                                return new Date(b.datePublished) - new Date(a.datePublished);
                                            });
                                            sameIdRequirements.forEach(function (sameIdRequirement, index) {
                                                sameIdRequirement.isPositionChanged = true;
                                                if (index !== 0) {
                                                    sameIdRequirement.notChangeStatus = true;
                                                }
                                            });
                                            isChanged = true;
                                        }

                                    } else {
                                        if (!requirement.isPositionChanged) {
                                            groups.requirements.splice(requirementIndex, 1);
                                        }
                                    }
                                }
                            });
                            if (sameIdRequirements.length > 1) {
                                sameIdRequirements.forEach(function (sameIdRequirement, index) {
                                    sameIdRequirement.isPositionChanged = true;
                                    if (index !== 0) {
                                        sameIdRequirement.notChangeStatus = true;
                                        groups.requirements.splice(indexToPlace + index, 1, sameIdRequirement);
                                    } else {
                                        var spliceCount = sameIdRequirements.length <= 3 ? 1 : sameIdRequirements.length - 2;
                                        groups.requirements.splice(indexToPlace, 1, sameIdRequirement);
                                    }
                                });
                            }
                        });
                    }

                    function addOtherBidGuaranteeCriterias() {
                        if ($scope.detailes.criteriaFlags.isNeededOtherBidGuarantee) {
                            $scope.detailes.lots.forEach(function (lot) {
                                var criteriaLotBody = angular.copy($localStorage.refs.criterion.other[1]);
                                if (!criteriaLotBody.legislation[0].article) {
                                    criteriaLotBody.legislation[0].article = chooseLegislationArticle(criteriaLotBody);
                                }

                                if (criteriaLotBody.relatesTo === 'lot' && !(lot.guarantee && lot.guarantee.amount > 0)) {
                                    return;
                                }
                                
                                if (lot.isFake) {
                                    criteriaLotBody.relatesTo = 'tender';
                                    if (!isBidGuaranteeCriteriaAdded(criteriaLotBody)) {
                                        criteriasOther.push(criteriaLotBody);
                                    }
                                } else if (lot.guarantee && lot.guarantee.amount > 0) {
                                    criteriaLotBody.relatesTo = 'lot';
                                    criteriaLotBody.relatedItem = lot.apiId;
                                    if (!isBidGuaranteeCriteriaAdded(criteriaLotBody)) {
                                        criteriaLotBody.relatedItem = lot.id;
                                        criteriasOther.push(criteriaLotBody);
                                    }
                                }
                            });
                        }
                    }

                    function addOtherContractGuaranteeCriterias () {
                        if ($scope.detailes.criteriaFlags.canBeUsedOtherContractGuarantee) {
                            $scope.detailes.lots.forEach(function (lot) {
                                var criteriaLotBody = angular.copy($localStorage.refs.criterion.other[2]);
                                if (!criteriaLotBody.legislation[0].article) {
                                    criteriaLotBody.legislation[0].article = chooseLegislationArticle(criteriaLotBody);
                                }

                                if (lot.isFake) {
                                    criteriaLotBody.relatesTo = 'tender';
                                } else {
                                    criteriaLotBody.relatesTo = 'lot';
                                    criteriaLotBody.relatedItem = lot.apiId;
                                }

                                if (!$scope.detailes.criteriaFlags.isNeededOtherContractGuarantee) {
                                    criteriaLotBody.isOptional = true;
                                }
                                if (!isContractGuaranteeCriteriaAdded(criteriaLotBody)) {
                                    if (criteriaLotBody.relatesTo === 'lot') {
                                        criteriaLotBody.relatedItem = lot.id;
                                    }
                                    criteriaLotBody.requirementGroups.forEach(function (group) {
                                        group.requirements.forEach(function (requirement) {
                                            requirement.requirementStatus = 'active';
                                        });
                                    });
                                    criteriasOther.push(criteriaLotBody);
                                }
                            });
                        }
                    }

                    function addLifeCycleCriterias () {
                        if ($scope.detailes.criteriaFlags.isNeededLifeCycleCost) {
                            var cirteriasToAdd =  $localStorage.refs.criterion.other.slice(3, 7);
                            cirteriasToAdd.forEach(function (criteriaAddBody) {
                                $scope.detailes.lots.forEach(function (lot) {
                                    var criteriaBody = angular.copy(criteriaAddBody);

                                    if (lot.isFake) {
                                        criteriaBody.relatesTo = 'tender';
                                    } else {
                                        criteriaBody.relatesTo = 'lot';
                                        criteriaBody.relatedItem = lot.apiId;
                                    }

                                    criteriaBody.isOptional = true;
                                    if (!isLifeCycleCriteriaAdded(criteriaBody)) {
                                        if (criteriaBody.relatesTo === 'lot') {
                                            criteriaBody.relatedItem = lot.id;
                                        }
                                        criteriaBody.requirementGroups.forEach(function (group) {
                                            group.requirements.forEach(function (requirement) {
                                                requirement.requirementStatus = 'active';
                                            });
                                        });
                                        criteriasOther.push(criteriaBody);
                                    }
                                });
                            });
                        }
                    }

                    function isContractGuaranteeCriteriaAdded (criteriaBody) {
                        return !!$scope.detailes.tenderCriteria.find(function (addedCriteria) {
                            if (criteriaBody.relatesTo === 'tender') {
                                return addedCriteria.classification.apiId === 'CRITERION.OTHER.CONTRACT.GUARANTEE';
                            } else {
                                return addedCriteria.classification.apiId === 'CRITERION.OTHER.CONTRACT.GUARANTEE' && 
                                        criteriaBody.relatedItem === addedCriteria.relatedItem;
                            }
                        });
                    }
                    function isBidGuaranteeCriteriaAdded(criteriaBody) {
                        return !!$scope.detailes.tenderCriteria.find(function (addedCriteria) {
                            if (criteriaBody.relatesTo === 'tender') {
                                return addedCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE';
                            } else {
                                return addedCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE' && 
                                        criteriaBody.relatedItem === addedCriteria.relatedItem;
                            }
                        });
                    }

                    function isLifeCycleCriteriaAdded (criteriaBody) {
                        return !!$scope.detailes.tenderCriteria.find(function (addedCriteria) {
                            if (criteriaBody.relatesTo === 'tender') {
                                return addedCriteria.classification.apiId === criteriaBody.classification.id;
                            } else {
                                return addedCriteria.classification.apiId === criteriaBody.classification.id &&
                                    criteriaBody.relatedItem === addedCriteria.relatedItem;
                            }
                        });
                    }
                    
                    function chooseLegislationArticle(criteria) {
                        if (criteria.classification.id === 'CRITERION.OTHER.BID.GUARANTEE') {
                            if ($scope.detailes.procurementMethodType === 'aboveThresholdUA'
                                || $scope.detailes.procurementMethodType === 'aboveThresholdEU'
                                || $scope.detailes.procurementMethodType === 'esco') {
                                return '21.2.9';
                            } else if ($scope.detailes.procurementMethodType === 'belowThreshold') {
                                return  '14.3.11';
                            }
                        } else if (criteria.classification.id === 'CRITERION.OTHER.CONTRACT.GUARANTEE') {
                            if ($scope.detailes.procurementMethodType === 'belowThreshold') {
                                return '14.3.12';
                            }
                        }

                        return null;
                    }

                    $scope.tenderDocumentIdChanged = function (evidence) {
                        var filteredDoc = $scope.vm.files.find(function (param) {
                            return evidence.tenderDocumentId === param.originId
                        });
                        if (filteredDoc) {
                            evidence.tenderDocument = {
                                'id': filteredDoc.id,
                                'title': filteredDoc.title
                            }
                        }
                    }

                    $scope.getLotName = function (apiId) {
                        var lot = $scope.detailes.lots.find(function(lot) {
                           return lot.apiId === apiId || lot.id === apiId;
                        });
                        return lot ? lot.title : '';
                    };

                    $scope.canRequirementChangeStatus = function (requirement, criteria) {
                        if ($location.url().indexOf('CreateTenderCriteria') === -1) {
                            if ($scope.guaranteeCriteria.indexOf(criteria.classification.id) !== -1
                                || $scope.guaranteeCriteria.indexOf(criteria.classification.apiId) !== -1
                                || $scope.lifeCycleCriterias.indexOf(criteria.classification.id) !== -1
                                || $scope.lifeCycleCriterias.indexOf(criteria.classification.apiId) !== -1) {
                                return !requirement.notChangeStatus && requirement.apiId;
                            } else if (criteria.classification.id === 'CRITERION.EXCLUSION.NATIONAL.OTHER'
                                || criteria.classification.apiId === 'CRITERION.EXCLUSION.NATIONAL.OTHER') {
                                return requirement.title === $scope.optionalRequirementTitle
                                    && !requirement.notChangeStatus && requirement.apiId;
                            }
                        }

                        return false;
                    };

                    $scope.onDescriptionChanged = function () {
                        $timeout(function () {
                            if ($scope.criteriasForm) {
                                $scope.$emit('onCriteriaFormChanged', $scope.criteriasForm.$valid);
                            }
                        });
                    };

                    $scope.checkIfCriteriaFormFilledDescription = function (criterias) {
                        criterias.forEach(function (criteria) {
                            if (criteria.classification.id === 'CRITERION.OTHER.BID.GUARANTEE'
                                || criteria.classification.id === 'CRITERION.OTHER.CONTRACT.GUARANTEE'
                                || criteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE'
                                || criteria.classification.apiId === 'CRITERION.OTHER.CONTRACT.GUARANTEE') {

                                if (!criteria.isOptional || (criteria.isOptional && criteria.isOptionalChecked)) {
                                    criteria.requirementGroups.forEach(function (group) {
                                        group.requirements.forEach(function (requirement) {
                                            if (!requirement.description && requirement.requirementStatus === 'active') {
                                                $scope.$emit('onCriteriaFormChanged', false);
                                            }
                                        });
                                    });
                                }
                            }
                        });
                    }

                    $scope.getRequirementStatusTranslation = function (status) {
                        return status === 'active'
                            ? $rootScope.source('ActiveStatus')
                            : $rootScope.source('CancelledStatus');
                    };

                    $scope.saveTenderWithCriterias = function () {
                        tenderCriteriasService.saveTenderWithCriterias(tenderCriteriasDto, $scope.tenderId, $scope.updateTenderStatus);
                    }

                    function checkForOtherBidGuarenteeExist(criteria) {
                        var exist = false;
        
                        criteria.find(function (singleCriteria) {
                            return exist = singleCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE';
                        });
        
                        return exist;
                    }
                    
                    $scope.$on('saveCriterias', function (evt, needToCheckCriterias, activeTabName, tenderCriterias) {
                        if (needToCheckCriterias && activeTabName == 'editTender') {
                            if (!checkForOtherBidGuarenteeExist(tenderCriterias)) {
                                return abp.notify.error('Для публікації змін необхідно додати критерій забезпечення тендерної пропозиції!');
                            }
                        }
                        tenderCriteriasService.saveTenderWithCriterias(tenderCriteriasDto, $scope.tenderId, $scope.updateTenderStatus);
                    })
                    $scope.isReadyToExport = function (model) {
                        return model.IsExported !== false || model.IsExportError !== false || model.status.trim() === '';
                    };
                    $scope.activateTenderWithCriteria = function () {
                        if (!tenderCriteriasService.isLifeCycleCriteriasValid(criteriasOther, $scope.detailes)) {
                            abp.notify.error('Для публікації необхідно застосувати хоча б один критерій вартості життєвого циклу!');
                            return;
                        }
                        if ($scope.detailes.procurementMethodType === 'belowThreshold'
                            || $scope.detailes.procurementMethodType === 'simple.defense'
                            || ($scope.detailes.status && $scope.detailes.status !== 'draft')) {
                            if (($scope.detailes.procurementMethodType === 'belowThreshold' && !$scope.detailes.isSimpleProcurementMethodRationale) || $scope.skipSign) {
                                goToTenderService.redirect($scope.dataToRedirect, $scope.tenderId);
                            } else {
                                if (!$scope.detailes.apiId) {
                                    getTenderInfoRequestWithSign($scope.detailes.id);
                                } else {
                                    $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                                }
                            }
                        } else {
                            abp.ui.setBusy();

                            tender.activateTenderDraft($scope.tenderId).then(function (response) {
                                $scope.dataToRedirect = response.data;
                                if ($scope.skipSign) {
                                    goToTenderService.redirect($scope.dataToRedirect, $scope.tenderId);
                                } else {
                                    $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                                }
                            }, function (error) {
                                console.log(error)
                            }).finally(function () {
                                abp.ui.clearBusy();
                            });
                        }

                    };

                    $scope.$watch('tenderDetailes', function () {
                       $scope.detailes = $scope.tenderDetailes;
                    });

                    $scope.showSignModal = function (isAllDocumentsExported) {
                        $scope.$emit('needToSignTenderFromCriterias', $scope.detailes);

                        if (!isAllDocumentsExported) {
                            abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                            return;
                        }
                        $timeout(function () {
                            $('#modalSignNewTender').modal('toggle');
                        }, 1000);
                    };

                    $scope.$on('tenderSigned', function () {
                        $('#modalSignNewTender').modal('hide');
                        $('body').removeClass('modal-open');
                        $('.modal-backdrop').remove();
                        goToTenderService.redirect($scope.dataToRedirect, $scope.tenderId);
                    });

                    $scope.checkIfCriteriaClassificationMatches = function (criteria, arrayToMatch) {
                        return arrayToMatch.indexOf(criteria.classification.id) !== -1 ||
                            arrayToMatch.indexOf(criteria.classification.apiId) !== -1;
                    };
                }
            ]
        }
    }
])
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('invitationCtrl', invitation);

    invitation.$inject = ['$scope', 'abp.services.etender.emailNotification'];

    function invitation($scope, emailNotificationService) {
        $scope.vm = {
            code: '',
            email: '',
            invite: invite
        };
        var vm = $scope.vm;

        function invite() {
            abp.ui.setBusy('#btnInvite');

            var invitationMessageInput = {
                codeEdrpouOrINN: vm.code,
                emailAddress: vm.email,
                tenderId: $scope.tId
            };
            emailNotificationService
                .notifyInvitationForTender(invitationMessageInput)
                .then(function () {
                    vm.code = '';
                    vm.email = '';
                    abp.ui.clearBusy('#btnInvite');
                    abp.notify.success('Запрошення надіслано');
                }, function (e) {
                        abp.ui.clearBusy('#btnInvite');
                        if (e.data.validationErrors) {
                            var error = e.data.validationErrors.map(function (i) {
                                return i.message;
                            }).join(';');
                            abp.notify.error(error);
                        }
                });
        }
    }
})();;
angular.module('app')
    .controller('modalCancelAwardCtrl',
       ['$rootScope',
        '$scope',
        'abp.services.etender.award',
        'Upload',
        'documentsService',
        '$localStorage',
        'uploadFileService',
        'reloadService',
        function (
            $rootScope,
            $scope,
            award,
            Upload,
            documentsService,
            $localStorage,
            uploadFileService,
            reloadService) {

            $scope.fileUploadObj = { tenderId: "", documentId: "", awardId: "" };
            var procTypes = ['aboveThresholdEU',
                'aboveThresholdUA',
                'competitiveDialogueEU.stage2',
                'competitiveDialogueUA.stage2',
                'esco',
                'closeFrameworkAgreementUA',
                'closeFrameworkAgreementSelectionUA',
                'priceQuotation'];
            
            $scope.cancelAwardModel = {
                description: null
            };
            
            var lotForAward;
            $('body').on('show.bs.modal', '#modalCancelAward', function (e) {
                var lotId = e.relatedTarget.attributes['data-lotid'].nodeValue;
                $scope.awardId = e.relatedTarget.attributes['data-awardid'].nodeValue;
                lotForAward = null;
                vm.ca.currentAward = {};
                vm.ca.readyForAnulledAward = {};
                for (var i = 0; i < $scope.detailes.lots.length; i += 1) {
                    var lot = $scope.detailes.lots[i];
                    if (lot.id == lotId) {
                        lotForAward = lot;
                        for (var q = 0; q < lot.awards.length; q++) {
                            if (lot.awards[q].id === $scope.awardId) {
                                vm.ca.currentAward = lot.awards[q];
                            }
                        }
                        if ($scope.detailes.procurementMethodType === 'closeFrameworkAgreementUA') {
                            vm.ca.readyForAnulledAward = vm.ca.currentAward;
                        } else {
                            vm.ca.readyForAnulledAward = lotForAward.readyForAnulledAward;
                        }
                        vm.ca.isExportedDocs = lotForAward.isExportedAwardDocs;
                        break;
                    }
                }                
            });

            $('body').on('hide.bs.modal', '#modalCancelAward', function () {
                $scope.cancelAwardModel.description = ""
            })

            $scope.cancelAward = function () {
                var cancelAwardInput = {
                    awardId: $scope.awardId || lotForAward.awardId,
                    tenderId: $scope.tId,
                    description: $scope.cancelAwardModel.description
                };

                if ($scope.detailes.procurementMethodType !== 'closeFrameworkAgreementUA' && $scope.vm && $scope.vm.ca && $scope.vm.ca.currentAward && $scope.vm.ca.currentAward.status == "active") {
                    cancelAwardInput.isReturnToQualification = true;
                }
                
                var cancelAward = award.cancelAward(cancelAwardInput);
                cancelAward.then(function (data) {
                    //console.log("CancelAwardData:", data);
                    $scope.$emit('reloadTender');
                });

                return cancelAward;
            };

            $scope.downloadCancelDocs = function (files) {
                add(files, lotForAward.readyForAnulledAward.id).then(function () {
                    abp.notify.success("Документи завантажено!");
                    reloadService.reloadDetailes($scope);
                });
            };

            $scope.disqualifyAward = function () {

                $('#disqualifyAward').replaceWith('<p class="text-danger">Зачекайте синхронізації з ЦБД. Натисніть F5 через 30 секунд</p>');
                var disqualifyAwardInput = {
                    awardId: lotForAward.readyForAnulledAward.cancelAwardId,
                    tenderId: $scope.tId
                };
                if (vm.ca.causeTitles) {
                    disqualifyAwardInput.title = vm.ca.causeTitles.join(', ');
                }
                var disqualifyAward = award.disqualifyAward(disqualifyAwardInput);
                disqualifyAward.then(function () {
                    abp.notify.success("Відмінено!");

                    (function () {
                        var countReload = 0;
                        var intervalId = setInterval(function () {
                            countReload++;
                            reloadService.reloadDetailes($scope);
                            //console.log("Перезагрузка " + countReload);
                            if (countReload > 5) {
                                clearInterval(intervalId);
                                //console.log("Таймер с ID: " + intervalId + " остановлен!");
                            }
                        }, 2000);
                    }
                    )();
                });

                return disqualifyAward;
            };

            $scope.vm.ca = {
                currentAward: {},
                readyForAnulledAward: {},
                isExportedDocs: false,
                causes: getListOfDisqualifyCauses()
            };

            function getListOfDisqualifyCauses(params) {
                var disqualifyList = [];

                if ($scope.detailes) {
                    if (procTypes.indexOf($scope.detailes.procurementMethodType) !== -1) {
                        disqualifyList.push(
                            'Переможець процедури закупівлі відмовився від підписання договору про закупівлю відповідно до вимог тендерної документації або укладення договору про закупівлю',
                            'Переможець процедури закупівлі не надав у спосіб, зазначений в тендерній документації, документи, що підтверджують відсутність підстав, установлених статтею 17 Закону',
                            'Переможець процедури закупівлі не надав копію ліцензії або документа дозвільного характеру (у разі їх наявності) відповідно до частини другої статті 41 Закону',
                            'Переможець процедури закупівлі не надав забезпечення виконання договору про закупівлю, якщо таке забезпечення вимагалося замовником'
                        );
                    }
                    if ($scope.detailes.procurementMethodType === 'belowThreshold') {
                        disqualifyList.push(
                            'Пропозиція учасника не відповідає умовам, визначеним в оголошенні про проведення спрощеної закупівлі, та вимогам до предмета закупівлі',
                            'Учасник не надав забезпечення пропозиції, якщо таке забезпечення вимагалося замовником',
                            'Учасник, який визначений переможцем спрощеної закупівлі, відмовився від укладення договору про закупівлю',
                            'Якщо учасник протягом одного року до дати оприлюднення оголошення про проведення спрощеної закупівлі відмовився від підписання договору про закупівлю (у тому числі через неукладення договору з боку учасника) більше двох разів із замовником, який проводить таку спрощену закупівлю'
                        );
                    }
                    if ($scope.detailes.procurementMethodType === 'simple.defense') {
                        disqualifyList.push(
                            'Не підписав або відмовився від підписання договору про закупівлю за поданою ним ціною/приведеною ціною за результатами проведеного аукціону',
                            'Не підписав або відмовився від підписання договору про закупівлю у визначений державним замовником строк',
                            'Не надав документів, що підтверджують відсутність підстав, передбачених статтею 17 Закону України "Про публічні закупівлі"'
                        );
                    }
                }

                return disqualifyList;
            }

            var vm = $scope.vm;

            var add = function (files, newAwardId) {
                files.forEach(function (file) {
                    $scope.fileUploadObj = { tenderId: $scope.tId, documentId: "", awardId: newAwardId };

                    if (documentsService.validateDocName(file.name) == 0) return;

                    $scope.upload = Upload.upload({
						url: abp.appPath + 'api/Files/Upload',
                        fields: { myObj: $scope.fileUploadObj },
                        file: file
                    });
                    $scope.upload
                        .progress(function (evt) {
                            //console.log('progress: ' + parseInt(100.0 * evt.loaded / evt.total) + '% file :' + evt.config.file.name);
                        })
                        .then(function (data, status, headers, config) {
                            //console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                            abp.notify.success("Файл додано!");
                        });
                });
                return $scope.upload;
            };

        }]);;
angular.module('app')
    .controller('modalClassificationCtrl', [
        '$scope',
        '$timeout',
        'ngTableParams',
        'abp.services.etender.reference',
        'classificationSearchService',
        function (
            $scope,
            $timeout,
            ngTableParams,
            reference,
            classificationSearchService) {

            $scope.oldPlanId = null;

            $scope.search = function (searchstring) {
                classificationSearchService.search(searchstring, $scope);
            };

            $scope.setFormValid = function (id, inputName) {
                if (!$scope.$parent.formname[inputName]) return; // @hack @todo figure-out why $scope.$parent.formname[inputName] could be undefined
                if (!id) $scope.$parent.formname[inputName].$setValidity('include', false); 
                if (id) $scope.$parent.formname[inputName].$setValidity('include', true);
            }

            $scope.loadOrDeleteChildItems = function(item) {
                var tableScope = $scope;
                var childItems = reference.getClassificationRef(item.id);
                var currIndex = 0;
                tableScope.tableParams.data.some(function (cpvItem, i) {
                    if (cpvItem.id === item.id) {
                        currIndex = i;
                        return true;
                    }
                });

                if (item.isOpen) {
                    if (!$scope.searchstring) {
                        while (tableScope.tableParams.data[currIndex + 1].rank > item.rank) {
                            tableScope.tableParams.data.splice(currIndex + 1, 1);
                        }
                    } else {
                        tableScope.tableParams.data.splice(currIndex + 1, item.childsCount);
                    }

                    item.isOpen = false;
                    return;
                }

                abp.ui.setBusy(".modal-body");
                childItems.then(function (childrens) {
                    item.isOpen = true;
                    item.childsCount = childrens.data.length;
                    for (var i = childrens.data.length; i--; i >= 0) {
                        tableScope.tableParams.data.splice(currIndex + 1, 0, childrens.data[i]);
                    }
                    abp.ui.clearBusy(".modal-body");
                });
            };

            $scope.changeSelection = function (item) {
                classificationSearchService.changeSelection(item, $scope);
            };

            $scope.choose = function () {
                if (!$scope.selectedData) return;
                var itemCompare = $scope.data.lots[0].items[0];
                var selectedClassification = {
                    id: $scope.selectedData.id,
                    code: $scope.selectedData.code,
                    description: $scope.selectedData.description
                };
                if ($scope.lotInd == 0 && $scope.itemInd == 0) {
                    $scope.data.lots[0].items[0].classification = selectedClassification;
                    // check 4 or 3 symb
                    var classificationCompareLen = $scope.getCompareLength(selectedClassification);
                    for (var li = 0; li < $scope.data.lots.length; li += 1) {
                        var l = $scope.data.lots[li];
                        for (var ii = 0; ii < l.items.length; ii += 1) {
                            if ((l.items[ii].classification.code &&
                                    l.items[ii].classification.code.substring(0, classificationCompareLen) ||
                                    l.items[ii].classification.id &&
                                    l.items[ii].classification.id.substring(0, classificationCompareLen)) !==
                                selectedClassification.code.substring(0, classificationCompareLen)) {
                                l.items[ii].classification = {};
                                $scope.setFormValid(null, 'classification' + li + ii);
                            } else {
                                var code = l.items[ii].classification.code || l.items[ii].classification.id;
                                $scope.setFormValid(code, 'classification' + li + ii);
                            }
                        }
                    }
                } else {
                    // using classification.code on createTender and classification.id on updateTender
                    if (!itemCompare || !(itemCompare.classification.code || itemCompare.classification.id)) {
                        abp.notify.error('Спочатку заповніть класифікатор першої позиції першого лоту');
                        return;
                    }
                    var classification = itemCompare.classification;

                    // check 4 or 3 symb
                    var classificationCompareLen = $scope.getCompareLength(classification);

                    var c = classification.code ? classification.code.substring(0, classificationCompareLen) : classification.id.substring(0, classificationCompareLen);

                    var sc = selectedClassification.code.substring(0, classificationCompareLen);
                    if (sc !== c) {
                        abp.notify.error('Код CPV має починатися з ' + c);
                        return;
                    }
                    var lotInd = Number($scope.lotInd); // @hack @todo figure-out why $scope.lotInd could be an empty string.
                    $scope.data.lots[lotInd].items[$scope.itemInd].classification = selectedClassification;
                    $scope.setFormValid(selectedClassification.id, 'classification' + $scope.lotInd + $scope.itemInd);
                }
            };

            $scope.tableParams = new ngTableParams({
                page: 1,   // show first page
                count: 999  // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {
                    $timeout(function () {
                        var pager = {
                            Page: params.page(),
                            PageSize: params.count(),
                            SearchIdentifier: $scope.searchstring,
                            OrderColumn: '',
                            OrderDirection: ''
                        };
                        var classificationData;
                        if ($scope.planId && !$scope.searchstring) {
                            if ($scope.planId !== $scope.oldPlanId) {
                                classificationData = reference.getClassificationFiltredByPlan({ planId: $scope.planId });
                                $scope.oldPlanId = $scope.planId;
                            }
                        } else if ($scope.planId && $scope.searchstring) {
                            classificationData = reference.getClassificationFiltredByPlan({ planId: $scope.planId, searchRequest: $scope.searchstring });

                        } else if ($scope.searchstring && $scope.searchstring.length > 0)
                            classificationData = reference.getSearchClassificationsRef($scope.searchstring);
                        else
                            classificationData = reference.getClassificationRef(pager);
                        if (classificationData) {
                            abp.ui.setBusy(".modal-body");
                            classificationData.then(function (response) {
                                abp.ui.clearBusy(".modal-body");
                                params.total(response.data.length);
                                $defer.resolve(response.data);
                            });
                        }
                    });
                }
            });

            $scope.getCompareLength = function (classification) {
                return classification.code ? (classification.code.substring(0, 3) === '336' ? 3 : 4) : (classification.id.substring(0, 3) === '336' ? 3 : 4);
            };
            
            $scope.$on('fillItemCpvByPlanId', function (event, planId) {
                if ($scope.planId === planId)
                    return;

                $scope.planId = planId;
                $scope.tableParams.reload();
            });

            $scope.cpvShowedByPlanId = function () {
                return $scope.planId;
            }
        }
    ]);
;
(function () {
    var controllerId = 'modalCreateMilestoneCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        'abp.services.etender.qualificationMilestone',
        'abp.services.etender.awardMilestone',
        function ($scope, qualificationMilestone, awardMilestone) {
            var awardId = null;
            var qualificationId = null;
            $scope.vm = {
                description: null
            };
            $('body').on('shown.bs.modal', '#modalCreateMilestone', function (e) {
                var $target = $(e.relatedTarget);
                awardId = $target.data('award-id');
                qualificationId = $target.data('qualification-id');
                $('#createMilestoneSuccess').prop('disabled', true);
            });
            $('body').on('hidden.bs.modal', '#modalCreateMilestone', function (e) {
                $scope.vm.description = '';
            });
            $scope.createMilestone = function () {
                var data = {
                    tenderId: $scope.detailes.id,
                    description: $scope.vm.description
                };
                if (awardId) {
                    data.awardId = awardId;
                    awardMilestone.createAward24HMilestone(data).then(close);
                }
                if (qualificationId) {
                    data.qualificationId = qualificationId;
                    qualificationMilestone.createQualification24HMilestone(data).then(close);
                }
                function close() {
                    qualificationId = null;
                    awardId = null;
                    $scope.$emit('reloadTender');
                    $('#modalCreateMilestone').modal('hide');
                }
            }
    }]);
})();;
(function () {
    var controllerId = 'modalDocNotificationCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', '$location', 'abp.services.etender.award', '$stateParams', 'Upload', '$timeout',
          function ($rootScope, $scope, $location, award, $stateParams, Upload, $timeout) {

              var vm = $scope;

              vm.dismissModal = function() {
                  $('#modalDocNotification').modal('hide');
              };

          }]);

})();;
(function () {
    var controllerId = 'modalDocNotificationBidCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', '$location', 'abp.services.etender.award', '$stateParams', 'Upload', '$timeout',
          function ($rootScope, $scope, $location, award, $stateParams, Upload, $timeout) {

              var vm = $scope;

              vm.dismissModal = function () {
                  $('#modalDocNotificationBid').modal('hide');
              };

          }]);

})();;
(function () {
    var controllerId = 'modalGetAwardsCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        'goToTenderService',
        'abp.services.etender.award',
        '$stateParams',
        'Upload',
        '$timeout',
        'lookupService',
        'documentsService',
        '$localStorage',
        '$ocLazyLoad',
        '$window',
        'reloadService',
        'uploadFileService',
        'tenderCriteriasService',
        function (
            $scope,
            goToTenderService,
            award,
            $stateParams,
            Upload,
            $timeout,
            lookupService,
            documentsService,
            $localStorage,
            $ocLazyLoad,
            $window,
            reloadService,
            uploadFileService,
            tenderCriteriasService)
        {
            $scope.ng_localStorage = $localStorage;
            $scope.doctype = 'AwardDocument';
            $scope.data = { selectedDocTypeAward: null };
            $scope.needToSkipComplaints = true;
            $scope.disqualifyCriterias = [];
            $scope.lotId = null;
            $scope.isErrorInCriteria = false;
            $scope.requirementResponse = [];
            $scope.criteriaDocuments = [];
            $scope.isCriteriasVisible = true;
            //var getDocumentTypesForAward = documentTypes.getDocumentTypes({ "ExportDocumentType": $scope.doctype });
            //getDocumentTypesForAward.success(function (data) {
            //    $scope.documentTypes = data;
            //    console.log('getDocumentTypes awardDoc');
            //});

            // get tender id
            $scope.tId = $scope.detailes.id;

            var simpleDefenseAwardPendingDisqualifyCauses = [
                {
                    title: 'не усунув недоліки у поданих ним документах протягом 24 годин з моменту його ознайомлення з такими недоліками в електронній системі закупівель',
                    description: ''
                }, 
                {
                    title: 'не відповідає кваліфікаційним (кваліфікаційному) критеріям, визначеним державним замовником відповідно до статті 22 цього Закону',
                    description: ''
                }, 
                {
                    title: 'не надав забезпечення цінової пропозиції (якщо надання забезпечення вимагалося державним замовником в оголошенні про проведення відбору)',
                    description: ''
                }, 
                {
                    title: 'протягом одного року до дати оприлюднення оголошення про проведення спрощеної закупівлі більше двох разів не підписав або відмовився від підписання договору про закупівлю (у тому числі через неукладення договору учасником) із державним замовником, який проводить таку спрощену закупівлю',
                    description: ''
                }, 
                {
                    title: 'не виконав умови (умов) договору щодо якості та/або строку поставки товарів, виконання робіт, надання послуг - більше одного разу',
                    description: ''
                }, 
                {
                    title: 'учасник процедури закупівлі не виконав свої зобов’язання за раніше укладеним договором про закупівлю з цим самим замовником, що призвело до його дострокового розірвання, і було застосовано санкції у вигляді штрафів та/або відшкодування збитків - протягом трьох років з дати дострокового розірвання такого договору',
                    description: ''
                }
            ];


            $scope.lists = {};

            var needConfirmAccept = $scope.detailes &&
            ($scope.detailes.isOpenUA ||
                $scope.detailes.isOpenEU ||
                $scope.detailes.isDialogueStage2 ||
                $scope.detailes.isDialogueEUStage2 ||
                $scope.detailes.isCloseFrameworkAgreementUA ||
                $scope.detailes.procurementMethodType === 'esco');

            $scope.vm.ga = {
                eligible: false,
                qualified: false,
                disqualify: disqualify,
                needConfirmAccept: needConfirmAccept,
                canAccept: canAccept,
                reject: reject,
                pendingAward: {},
                causes: []
            };
            var vm = $scope.vm;


            // docs pagination
            $scope.settings = {
                currentPage: 0,
                offset: 0,
                pageLimit: 10,
                pageLimits: ['10', '50', '100']
            };
            $scope.countDocsOnLastPagePagin = function (value) {
                var summ = value.toString();
                if (summ.slice(-1) === '0') return '10';
                return summ.slice(-1);
            };
            // docs pagination END

            $scope.lotForAward;

            $scope.$on('award', function (event, data) {
                $scope.getAwardsStep = 1;
                $scope.lotId = data.lotId;
                $scope.lotForAward = null;
                vm.ga.pendingAward = {};
                vm.ga.causes.title = {};
                for (var i = 0; i < $scope.detailes.lots.length; i += 1) {
                    var lot = $scope.detailes.lots[i];
                    if (lot.id == $scope.lotId) {
                        $scope.lotForAward = lot;
                        vm.ga.pendingAward = $scope.lotForAward.pendingAward;
                        break;
                    }
                }
                $scope.foundMyBid = $scope.lotForAward.bids.find(function (bid) {
                    return bid.isMyBid;
                })

                $scope.award = data.award;
                $scope.award.awardDocuments = documentsService.sortListOfDocs($scope.award.awardDocuments);
                $scope.vm.ga.isExportedAwardDocs = isExportedAwardDocsFunc();
                $scope.vm.ga.hasAwardDocs = hasAwardDocsFunc();
                $scope.displayButtonDisqualify = displayButtonDisqualifyFunc($scope.detailes, $scope.award, $scope.lotForAward);
                $scope.getCauses();
                $scope.getCriteriaDocuments();
            });

            $('body').on('hide.bs.modal', '#modalDisqualifyAward', function () {
                $scope.vm.ga.causeDesc = "";
                $scope.vm.ga.causeTitles = [];
                $scope.isCriteriasVisible = true;
            })

            $scope.$on('onCriteriaClosed', function () {
                $scope.isCriteriasVisible = false;
                $scope.isErrorInCriteria = false;
                $scope.requirementResponse = [];
            });

            $scope.getCauses = function () {
                if ($scope.detailes.isDefense || $scope.detailes.isSimpleDefense) {
                    if ($scope.award.status === 'pending') {
                        return vm.ga.causes = simpleDefenseAwardPendingDisqualifyCauses;
                    }
                    vm.ga.causes = lookupService.getDisqualifyDefenseCauses();
                }
                else if ($scope.detailes.isSimpleProcurementMethodRationale) {
                    vm.ga.causes = lookupService.getDisqualifyBelowCauses();
                }
                else if ($scope.detailes.procurementMethodType === 'priceQuotation') {
                    vm.ga.causes = lookupService.getDisqualifyPQCauses();
                }
                else {
                    vm.ga.causes = lookupService.getDisqualifyCauses();
                }
            };

            $scope.getCriteriaDocuments = function () {
                $scope.criteriaDocuments = $scope.award.awardDocuments.filter(function (d) {
                    return d.title.indexOf('.yaml') === -1 && d.title.indexOf('.p7s') === -1;
                });
            };


            $scope.$on('onTenderCriteriaChanged', function (event, isAllValid, isSingleCriteriaError, requirementResponse) {
                $scope.isErrorInCriteria = isSingleCriteriaError;
                $scope.requirementResponse = requirementResponse;
            });

            $scope.setDisqualifyCriterias = function (tenderCriteria) {
                $scope.disqualifyCriterias = tenderCriteriasService.getDisqualifyCriterias(tenderCriteria);
            };

            $scope.setDisqualifyCriterias($scope.detailes.tenderCriteria);

            $scope.checkDocumentsIsExported = function (docs) {
                return documentsService.checkDocumentsIsExported(docs);
            };

            $scope.updateAwardDocUploaded = function () {
                $('#modalGetAwards').modal('hide');
            };

            $scope.showSignModalAward = function (awardObj) {
                awardObj.type = 'award';
                $scope.$emit('showModalSignAward', awardObj);
            };

            $scope.getAwardsNextStep = function () {
                $scope.getAwardsStep++;
            };
            $scope.getAwardsPrevStep = function () {
                $scope.getAwardsStep--;
            };

            var hideDwnldFiles = function () {
                if ($scope.lists.documentsToAdd[0])
                    $scope.lists.documentsToAdd[0] = null;
            };

            $scope.uploadDocsGetAward = function (files, docType, docIdForEditing) {
                if (!files || files.length === 0) return;

                $scope.uploadToAward = true;
                $scope.selectedDocType = docType != null ? docType.id : null;
                $scope.docIdForEditing = docIdForEditing;

                uploadFileService.upload(files, $scope);
            };

            $scope.setDecision = function (decision) {
                var setDecisionAwardModel = {
                    awardId: $scope.award.id,
                    tenderId: $scope.tId
                };

                var promise;
                if (decision) {
                    promise = award.acceptAward(setDecisionAwardModel);
                } else {
                    if (vm.ga.causeTitles) {
                        setDecisionAwardModel.title = vm.ga.causeTitles.join(', ');
                        setDecisionAwardModel.desc = vm.ga.causeDesc;
                    }

                    if ($scope.requirementResponse.length) {
                        setDecisionAwardModel.tenderCriteriaRequirementResponses = $scope.requirementResponse;
                    }

                    promise = award.disqualifyAward(setDecisionAwardModel);
                }

                promise.then(function () {
                    decision ? abp.notify.success("Кандидата ухвалено!") : abp.notify.success("Кандидата відмінено!");

                    $localStorage.getAwards = true;
                    $scope.detailes.hasPendingAwards = false;

                    //goToTenderService.redirect(tenderItem, $scope.tId)

                    //(function () {
                    //    var countReload = 0;
                    //    var intervalId = setInterval(function () {
                    //        countReload++;
                    //        $scope.reloadDetailes();
                    //        //console.log("Перезагрузка " + countReload);
                    //        if (countReload > 3) {
                    //            clearInterval(intervalId);
                    //            //console.log("Таймер с ID: " + intervalId + " остановлен!");
                    //        }
                    //    }, 1000);
                    //}
                    //)();

                    $('#modalGetAwards').modal('toggle');
                    $scope.getAwardsUrl = '';
                    $scope.$emit('reloadTender');
                    return promise;
                }, function (errorResponse) {
                    console.log(errorResponse);
                    return;
                });
            };

            $scope.notYaml = function(docTitle) {
                if (docTitle.indexOf('.yaml') !== -1) {
                   return false
                }
                return true;
            }

            function canAccept() {
                if ($scope.detailes.procurementMethodType == 'reporting')
                    return true;

                if (needConfirmAccept) {
                    return $scope.vm.ga.eligible && $scope.vm.ga.qualified;
                }
                if ($scope.detailes.procurementMethodType === 'aboveThresholdUA.defense'
                    || $scope.detailes.procurementMethodType === 'simple.defense') {
                    return $scope.vm.ga.eligible && $scope.vm.ga.conferm;
                }
                if ($scope.detailes && $scope.detailes.isLimited) {                    
                    return vm.ga.pendingAward.qualified;
                }
                return true;
            }


            function disqualify() {
                if ($scope.detailes.isOpenUA
                    || $scope.detailes.isDefense
                    || $scope.detailes.isSimpleDefense
                    || $scope.detailes.isOpenEU
                    || $scope.detailes.isDialogueStage2
                    || $scope.detailes.isSimpleProcurementMethodRationale
                    || $scope.detailes.isDialogueEUStage2
                    || $scope.detailes.isCloseFrameworkAgreementUA
                    || $scope.detailes.procurementMethodType === 'esco'
                    || $scope.detailes.procurementMethodType === 'priceQuotation') {

                    showModalDisqualifyAward();
                } else {
                    $scope.setDecision(0);
                }
            }

            function reject() {
                showModalDisqualifyAward();
                $scope.setDecision(0);
            }

            function showModalDisqualifyAward() {
                $scope.showModalDisqualifyAward = true;
                $timeout(function () {
                    $("#modalDisqualifyAward").modal('toggle');
                }, 1000);
            }

            function isExportedAwardDocsFunc() {
                if (!$scope.award)
                    return false;

                var docs = $scope.award.awardDocuments.filter(function (d) {
                    return d.isExported === false;
                });
                return docs.length === 0;
            };

            function hasAwardDocsFunc() {
                if (!$scope.award || $scope.award.status != 'pending')
                    return false;

                var docs = $scope.award.awardDocuments.filter(function (d) {
                    return d.title.indexOf('.yaml') === -1 && d.title.indexOf('.p7s') === -1;
                });
                return docs.length > 0;
            };

            function displayButtonDisqualifyFunc (detailes, award, lot) {
                if (detailes.procurementMethodType !== 'closeFrameworkAgreementSelectionUA') return true;
                if (detailes.procurementMethodType === 'closeFrameworkAgreementSelectionUA' && award && award.status !== 'pending') return false;
                   
                var i = 0;
                var lAwards = lot.awards.length;
                for (i; i < lAwards; i++) {
                    var curentAward1 = lot.awards[i];
                    if (curentAward1.id === award.id)
                        award.bidId = curentAward1.bidId;
                }
                var i2 = 0;
                for (i2; i2 < lAwards; i2++) {
                    var curentAward2 = lot.awards[i2];
                    if (curentAward2.status === 'cancelled' &&
                        curentAward2.bidId === award.bidId)
                        return true;
                }
                return false;
            }

            $scope.changeDoc = function (document) {
                $scope.fileUploadObj = {
                    documentId: document.id
                }
                _($scope.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

        }
    ]);

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('qualificationsCtrl', qualifications);

    qualifications.$inject = [
        '$scope',
        '$stateParams',
        'abp.services.etender.qualification',
        'Upload',
        'documentsService',
        '$localStorage',
        '$timeout',
        '$ocLazyLoad',
        '$http',
        'organizationDataService',
    ];
    function qualifications(
        $scope,
        $stateParams,
        qualificationService,
        Upload,
        documentsService,
        $localStorage,
        $timeout,
        $ocLazyLoad,
        $http,
        organizationDataService
    ) {

        $scope.ng_localStorage = $localStorage;
        $scope.userTenantId = $scope.ng_localStorage.userTenantId;
        $scope.isUserLoggedIn = $localStorage.isAuthorized;
        $scope.vm.q = {
            active: active,
            cancelled: cancelled,
            unsuccessful: unsuccessful,
            canStandStill: canStandStill,
            hasPendingComplaints: hasPendingComplaints,
            standStill: standStill,
            causes: [
                'учасник не відповідає кваліфікаційним (кваліфікаційному) критеріям, установленим статтею 16 Закону та/або наявні підстави, встановлені частиною першою статті 17 Закону', 
                'учасник не відповідає встановленим абзацом першим частини третьої статті 22 Закону вимогам до учасника відповідно до законодавства', 
                'учасник зазначив у тендерній пропозиції недостовірну інформацію, що є суттєвою при визначенні результатів процедури закупівлі, яку замовником виявлено згідно з частиною п’ятнадцятою статті 29 Закону',
                'учасник не надав забезпечення тендерної пропозиції, якщо таке забезпечення вимагалося замовником, та/або забезпечення тендерної пропозиції не відповідає умовам, що визначені замовником у тендерній документації до такого забезпечення тендерної пропозиції',
                'учасник не виправив виявлені замовником після розкриття тендерних пропозицій невідповідності в інформації та/або документах, що подані ним у своїй тендерній пропозиції, протягом 24 годин з моменту розміщення замовником в електронній системі закупівель повідомлення з вимогою про усунення таких невідповідностей',
                'учасник не надав обґрунтування аномально низької ціни тендерної пропозиції протягом строку, визначеного в частині чотирнадцятій статті 29 Закону',
                'учасник визначив конфіденційною інформацію, що не може бути визначена як конфіденційна відповідно до вимог частини другої статті 28 Закону',
                'учасник не надав належного обґрунтування ціни або вартості тендерної пропозиції, що була визначена електронною системою закупівель як аномально низька (відповідно до частини 14 статті 29 Закону)',
                'учасник процедури закупівлі не виконав свої зобов’язання за раніше укладеним договором про закупівлю з цим самим замовником, що призвело до його дострокового розірвання, і було застосовано санкції у вигляді штрафів та/або відшкодування збитків протягом трьох років з дати дострокового розірвання такого договору.',
                'тендерна пропозиція учасника не відповідає умовам технічної специфікації та іншим вимогам щодо предмета закупівлі тендерної документації',
                'тендерна пропозиція учасника викладена іншою мовою (мовами), аніж мова (мови), що вимагається тендерною документацією',
                'тендерна пропозиція учасника є такою, строк дії якої закінчився'
            ],
            causesTooltips: [
                'Учасник не відповідає кваліфікаційним (кваліфікаційному) критеріям, установленим в тендерній документації',
                'Наявні підстави для відхилення тендерної пропозиції, зазначені у статті 17 і частині сьомій статті 28 Закону Про публічні закупівлі',
                'Тендерна пропозиція не відповідає вимогам тендерної документації'
            ],
            selectFile: selectFile,
            getOrganizationToolTipText: getOrganizationToolTipText
        };
        var vm = $scope.vm;
        $scope.visiblePreQualCriterias = {};
        $scope.lot.qualifications.forEach(function (element) {
            $scope.visiblePreQualCriterias[element.id] = true;
        });

        //show documents .yaml format in modal window
        $scope.formatDetect = function (doc, id) {
            var title = doc.title;
            if (title.indexOf('.yaml') !== -1) {
                modalYamlOpen(doc, id);
            } else {
                previewDoc(doc);
            }
        };

        function modalYamlOpen(doc, id) {
            var url = doc.url;
            $ocLazyLoad.load('Scripts/yaml.js').then(function () {
                $http.get(url).then(function (data) {
                    var modalName = '#modalYamil' + '-' + id;
                    $scope.yamlInfo = YAML.parse(data.data);
                    delete $scope.yamlInfo.meta;
                    jQuery(modalName).modal('show');
                    //console.log($scope.yamlInfo);
                });
            });
        }

        // print .yaml
        $scope.printDiv = function (index, parentIndex, lotIndex) {
            var divNamePrint = 'printDiv' + '-' + index + '-' + parentIndex + '-' + lotIndex;
            var printContents = document.getElementById(divNamePrint).innerHTML;
            var popupWin = window.open('', '_blank', 'width=600,height=300');
            popupWin.document.open();
            popupWin.document.write('<html><head><link rel="stylesheet" type="text/css" href="' + abp.setting.get('ProzorroSiteUrl') + 'Content/bootstrap-cerulean.min.css" /></head><body onload="window.print()">' + printContents + '</body></html>');
            popupWin.document.close();
        };

        // change .yaml name to 'Виписка з ЄДР'
        $scope.detectYamlName = function (title) {
            if (title.indexOf('.yaml') !== -1)
                return 'Виписка з ЄДР';
            return title;

        };

        // Documents Prev START

        function previewDoc(doc) {
            documentsService.previewDoc(doc, $scope);
        }

        $scope.trustSrc = function (src) {
            return documentsService.trustSrcForDocLoad(src);
        };

        $scope.goToUrl = function (url) {
            window.location = url;
        };

        // Documents Prev END
 
        $scope.showSignModalQualification = function (qualifObj) {
            qualifObj.type = 'qualification';
            $scope.$emit('showModalSign', qualifObj);
        };

        $scope.checkSignClick = function () {
            alert('реализовать на бэкенд');
            jQuery(".fa-refresh-sign").addClass("fa-spin");
            $scope.removeMove = function () {
                jQuery(".fa-refresh-sign").removeClass("fa-spin");
            };
            $timeout($scope.removeMove, 5000);
        };

        $scope.getQualificationDocuments = function (qualification) {
            return qualification.documents;
        };

        $scope.getTenderBefore = function () {
            $scope.documentsToAdd = null;
            abp.ui.setBusy();
            $(".hide-move-efect").fadeOut();
        };

        function getOrganizationToolTipText(organization) {
            return organizationDataService.getOrganizationToolTipText(organization);
        }

        function active(q) {
            qualificationService.active(q.id)
                        .then(function (data) {
                            abp.notify.success("Пропозицію кваліфіковано!");
                            $scope.$emit('reloadTender');
                            //reloadService.reloadDetailes($scope);
                        });
        }

        function cancelled(q) {
            qualificationService.cancelled(q.id)
                        .then(function (data) {
                            abp.notify.success("Кваліфікацію відмінено!");
                            $scope.$emit('reloadTender');
                            //reloadService.reloadDetailes($scope);
                        });
        }

        $scope.$on('onTenderCriteriaChanged', function (event, isValid, isErrorInSingleCriteria, criteriaResponses) {
            $scope.isCriteriasValid = isValid;
            $scope.isCriteriaValid = !isErrorInSingleCriteria;
            $scope.criteriaResponses = criteriaResponses;
        });
        $scope.$on('onCriteriaClosed', function (event, lotId) {
            $scope.isCriteriaValid = true;
            $scope.isCriteriasValid = true;
            $scope.visiblePreQualCriterias[lotId] = false;
            $scope.requirementResponse = [];
        });

        function unsuccessful(q) {
            var dto = {
                id: q.id,
                title: q.causeTitles ? q.causeTitles.join(', ') : '',
                desc: q.causeDesc
            };
            if ($scope.visiblePreQualCriterias[q.id] && $scope.criteriaResponses.length) {
                dto.tenderCriteriaRequirementResponses = $scope.criteriaResponses;
            }
            qualificationService.unsuccessful(dto)
                        .then(function (data) {
                            abp.notify.success("Пропозицію скасовано!");
                            $scope.$emit('reloadTender');
                            //reloadService.reloadDetailes($scope);
                        });
        }

        function canStandStill() {
            for (var i = 0; i < $scope.detailes.lots.length; i += 1) {
                for (var j = 0; j < $scope.detailes.lots[i].qualifications.length; j += 1) {
                    if ($scope.detailes.lots[i].qualifications[j].status === 'pending') {
                        return false;
                    }
                }
            }
            return true;
        }

        function hasPendingComplaints() {
            var res;
            angular.forEach($scope.complaints, function (complaint) {
                if (['declined', 'mistaken', 'invalid', 'stopped', 'resolved', 'cancelled'].indexOf(complaint.status) === -1)
                    res = true;
            });
            return res;
        }

        function standStill() {
            qualificationService.tenderStandStill($scope.detailes.id)
                        .then(function (data) {
                            $scope.$emit('reloadTender');
                            //reloadService.reloadDetailes($scope);
                        });
        }

        function selectFile(files, qualificationId) {
            if (files.length === 0) return;
            $scope.filesSumm = files.length;

            var tenderId = $scope.detailes.id;
            files.forEach(function(file) {
                uploadDocument(file, { tenderId: tenderId, qualificationId: qualificationId, documentId: null });
            });
            
        }


        // internal
        function uploadDocument(file, obj) {
            if (!file) return;
            if (documentsService.validateDocName(file.name) == 0) return;

            file.upload = Upload.upload({
				url: abp.appPath + 'api/Files/Upload',
                method: 'POST',
                fields: { myObj: obj },
                file: file
            });

            file.upload.progress(function (evt) {
                // Math.min is to fix IE which reports 200% sometimes
                file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
            file.upload.success(function (data, status, headers, config) {
                $scope.filesSumm -= 1;
                if ($scope.filesSumm === 0) {
                    abp.notify.success("Файл(и) додано!");
                    $scope.$emit('showModalDocNotification', '#modalDocNotificationThreshold');
                    $scope.$emit('reloadTender');
                    //reloadService.reloadDetailes($scope);
                }
            }).error(function (data) {
                abp.notify.error(data.exceptionMessage || data.message);
            });
        }

        $scope.dowloadZip = function (qualification) {
            abp.ui.setBusy('.hidden-print dowloadZipBtn');
            var zipFilename = 'Документи пропозиції';
            var bid = $scope.getBidForDocOrDefault($scope.lot, qualification.bidDocuments[0].id);
            documentsService.downloadZipFile(qualification.bidDocuments, zipFilename, $scope, $scope.detailes.apiId, bid);
            var listener = $scope.$on('clearBusy',
                function () {
                    abp.ui.clearBusy('.hidden-print dowloadZipBtn');
                    listener();
                });
        };

        $scope.getBidForDocOrDefault = function (lot, docId) {
            lot = lot || $scope.lot;
            var indexOfBid = 0;
            lot.bids.forEach(function (singleBid, index) {
                singleBid.documents.forEach(function (singleDoc) {
                    if (singleDoc.id === docId || singleDoc.apiId === docId) {
                        indexOfBid = index;
                    }
                });
            });

            return lot.bids[indexOfBid];
        };

        $scope.saveState = function(name) {
            $localStorage.saveState = name;
        };

        $scope.getSaveState = function () {
            if ($localStorage.saveState) {
                var name = $scope.ng_localStorage.saveState;
                jQuery(name).collapse("show");
            }
        };

        $timeout($scope.getSaveState, 500);

        $scope.hasDocumentsToConfirm = function (docs) {
            var a = docs.filter(function (d) {
                return d.title.indexOf('.yaml') === -1 && d.title.indexOf('.p7s') === -1;
            });
            return a.length > 0;
        };

        showTitleQualificationDiffRows();

        function showTitleQualificationDiffRows()
        {
            var titleNotQualificCriteria = "Не відповідає кваліфікаційним критеріям";
            var titleArticle17 = "Наявні підстави, зазначені у статті 17";
            var titleNotRequirements = "Не відповідає вимогам тендерної документації";

            for (var i = 0; i < $scope.detailes.lots.length; i += 1) {
                for (var j = 0; j < $scope.detailes.lots[i].qualifications.length; j += 1) {
                    if ($scope.detailes.lots[i].qualifications[j].title && $scope.detailes.lots[i].qualifications[j].title.includes(titleNotQualificCriteria)) {

                        $scope.detailes.lots[i].qualifications[j].title = $scope.detailes.lots[i].qualifications[j].title.replace(titleNotQualificCriteria, titleNotQualificCriteria + "</br>");
                        $scope.detailes.lots[i].qualifications[j].title = $scope.detailes.lots[i].qualifications[j].title.replace(", " + titleNotQualificCriteria, titleNotQualificCriteria);
                    }
                    if ($scope.detailes.lots[i].qualifications[j].title && $scope.detailes.lots[i].qualifications[j].title.includes(titleArticle17)) {

                        $scope.detailes.lots[i].qualifications[j].title = $scope.detailes.lots[i].qualifications[j].title.replace(titleArticle17, titleArticle17 + "</br>");
                        $scope.detailes.lots[i].qualifications[j].title = $scope.detailes.lots[i].qualifications[j].title.replace(", " + titleArticle17, titleArticle17);
                    }
                    if ($scope.detailes.lots[i].qualifications[j].title && $scope.detailes.lots[i].qualifications[j].title.includes(titleNotRequirements)) {

                        $scope.detailes.lots[i].qualifications[j].title = $scope.detailes.lots[i].qualifications[j].title.replace(titleNotRequirements, titleNotRequirements + "</br>");
                        $scope.detailes.lots[i].qualifications[j].title = $scope.detailes.lots[i].qualifications[j].title.replace(", " + titleNotRequirements, titleNotRequirements);
                    }
                }
            }
        }
    }
})();;
(function () {
    var controllerId = 'tenderDetailesCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope',
        '$scope',
        '$window',
        'abp.services.etender.tender',
        'abp.services.etender.tenderCorporation',
        '$location',
        '$timeout',
        'documentsService',
        'ngTableParams',
        'abp.services.etender.emails',
        'abp.services.etender.emailNotification',
        'lookupService',
        '$localStorage',
        'abp.services.etender.report',
        '$ocLazyLoad',
        '$http',
        'tenderDetailesData',
        'setModalPositionService',
        'reloadService',
        'getTenderService',
        'tenderReasonTypeService',
        'uploadFileService',
        'goToTenderService',
        'abp.services.etender.workingDays',
        function (
            $rootScope,
            $scope,
            $window,
            tenderAppService,
            tenderCorporationAppService,
            $location,
            $timeout,
            documentsService,
            ngTableParams,
            emails,
            emailNotificationAppService,
            lookupService,
            $localStorage,
            report,
            $ocLazyLoad,
            $http,
            tenderDetailesData,
            setModalPositionService,
            reloadService,
            getTenderService,
            tenderReasonTypeService,
            uploadFileService,
            goToTenderService,
            workingDays
        ) {


            $scope.ng_localStorage = $localStorage;
            $scope.complaints = 0;
            $scope.enableAddDocument = true;
            $scope.data = {};
            $scope.statusDescription = {};
            $scope.upload = [];
            $scope.letGetEmailGroups = false;
            $scope.canDownlAuctReport = false;
            $scope.nameBidsReport = '';
            var enquiryPeriodEnd;
            var tenderPeriodEnd;
            $scope.createInvoice = {};

            $rootScope.lotEvidenceDocuments = {};

            $scope.pdfmakeAlreadyLoaded = false;

            // menu block active
            $scope.naviBlock = 'menuAboutBlock';

            $scope.tenderHasBids = false;

            $scope.treePanels = [];
            var blockHeight;
            var scroll;

            $scope.hasPendingInCancel = false; //флаг для 2+ отмен на странице
            $scope.$watch('detailes', function (data) {
                if (!data) return;
                $scope.fillEvidenceDocumentsWithLot();
                $scope.updatedDetailes = data;
                angular.forEach(data.cancellations, function (item) {
                    if (item.status == "pending") {
                        $scope.hasPendingInCancel = true;
                        return;
                    }
                });

                if (data.apiId && data.isShowEditButton && data.procurementMethodType == 'aboveThresholdUA') {
                    // $scope.showSignModal(data.isAllDocumentsExported);
                }
            });
            $scope.fillEvidenceDocumentsWithLot = function () {
                $scope.detailes.lots.forEach(function (lot) {
                    if (!$rootScope.lotEvidenceDocuments[lot.id]) {
                        $rootScope.lotEvidenceDocuments[lot.id] = {};
                    }
                });
            }

            $scope.awardsExist = function () {
                return $scope.updatedDetailes &&
                    $scope.updatedDetailes.lots && $scope.updatedDetailes.lots.length > 0 &&
                    $scope.updatedDetailes.lots[0].awards && $scope.updatedDetailes.lots[0].awards.length > 0;
            }


            $scope.openTestLink = function () {
                $window.open('https://exam.prozorro.gov.ua/entry', '_blank').focus();
            };

            $scope.checkDocumentsIsExported = function (documents) {
                return documentsService.checkDocumentsIsExported(documents);
            };


            $scope.getAuctionDates = function () {
                $scope.updatedDetailes.lotsStartAuction = [];
                $scope.updatedDetailes.lotsEndAuction = [];
                var a = 0;
                var lotsLength = $scope.updatedDetailes.lots.length - 1;
                for (a; a <= lotsLength; a++) {
                    if ($scope.updatedDetailes.lots[a].auctionPeriod !== null) {
                        if ($scope.updatedDetailes.lots[a].auctionPeriod.startDate !== null)
                            $scope.updatedDetailes.lotsStartAuction.push(Date.parse($scope.updatedDetailes.lots[a].auctionPeriod.startDate));
                        if ($scope.updatedDetailes.lots[a].auctionPeriod.endDate !== null)
                            $scope.updatedDetailes.lotsEndAuction.push(Date.parse($scope.updatedDetailes.lots[a].auctionPeriod.endDate));
                    }
                }

                if ($scope.updatedDetailes.lotsStartAuction.length > 0) {
                    $scope.updatedDetailes.auctionFirstStartDate = Math.min.apply(null, $scope.updatedDetailes.lotsStartAuction);
                    $scope.updatedDetailes.auctionLastStartDate = Math.max.apply(null, $scope.updatedDetailes.lotsStartAuction);
                }
                if ($scope.updatedDetailes.lotsEndAuction.length > 0) {
                    $scope.updatedDetailes.auctionFirstEndDate = Math.min.apply(null, $scope.updatedDetailes.lotsEndAuction);
                    $scope.updatedDetailes.auctionLastEndDate = Math.max.apply(null, $scope.updatedDetailes.lotsEndAuction);
                }
            }


            // date today
            var s = new Date();
            $scope.dateToDay = Date.parse(s);

            $scope.lessThenToday = function (date) {
                return $scope.dateToDay > Date.parse(date);
            }

            $scope.userTenantId = $localStorage.userTenantId;
            $scope.userId = abp.session.userId;

            var tenderItem = {
                id: $scope.tId,
                userName: $localStorage.username,
                display: true
            };

            $scope.getTenderProcedureType = function () {
                if (!$scope.updatedDetailes) return null;
                return lookupService.getTenderProcedureType($scope.updatedDetailes.procurementMethodType);
            };

            // todo remove to common service
            $scope.isBelowThreshold = function () {
                if (!$scope.updatedDetailes)
                    return false;
                return $scope.updatedDetailes.isBelowThreshold;
            };

            //			$scope.showQualifications
            //                      || $scope.tendDetailes.isLimited
            //                      || $scope.tendDetailes.procurementMethodType == 'esco')

            setTimeout(function () {
                var detailes = $scope.updatedDetailes || $scope.detailes;
                if (!detailes) return;
                $scope.reasonTypes = tenderReasonTypeService.getReasonTypes(detailes.isNewCancellationFlow2020, detailes.procurementMethodType)
            }, 0)

            // reload deteiles if add bid
            $scope.reloadBid = function (skipReloadComplaints) {
                //$localStorage.openBlockInTender = null;
                reloadService.reloadDetailes($scope, skipReloadComplaints);
            }

            $scope.reloadDetailes = function () {
                reloadService.reloadDetailes($scope);
            }

            function goToAnotherBlock(url) {
                if (url.indexOf('?monitoringid') !== -1) {
                    $scope.naviBlock = 'menuDasuBlock';
                    var monitoringid = $location.$$url.slice(-22);
                    goToMonitoring(monitoringid);
                }
            }

            $scope.getTenderBefore = function () {
                $scope.documentsToAdd = null;
                abp.ui.setBusy();
                $(".hide-move-efect").fadeOut();
            };

            if ($localStorage.getAwards) {
                $localStorage.getAwards = false;
                if ($scope.updatedDetailes)
                    $scope.updatedDetailes.hasPendingAwards = false;
            } else {                
                $localStorage.getAwards = false;
            }
            getTenderService.getTenderThen(tenderDetailesData, $scope);

            $scope.cancelTender = function () {
                var cancelTender = tenderAppService.cancelTender(tenderItem);
                cancelTender.then(function (response) {
                    //console.log(data);
                    abp.notify.success("Тендер с id " + tenderItem.id + " видалено!");
                    $location.path("/");
                });
            };

            

            function setAwards(awards) {
                awards.forEach(function (award, i, arr) {
                    award.awardDocuments = documentsService.sortListOfDocs(award.awardDocuments);
                });
            }

            $scope.abortUpload = function (index) {
                $scope.upload[index].abort();
            };

            $scope.loadGetAwards = function () {
                $scope.getAwardsUrl = '/App/Main/base/views/tenders/modalGetAwards.html';

            };

            $scope.$watch('cancelTenderDocumentToAdd', function (files) {
                $scope.formUpload = false;
                if (files != null) {
                    for (var i = 0; i < files.length; i++) {
                        $scope.errorMsg = null;
                        (function (file) {
                            generateThumbAndUpload(file, $scope.files);
                        })(files[i]);
                    }
                }
            });

            $scope.$watch('documentsToUpdate', function (files) {
                //$scope.formUpload = false;
                if (files != null) {
                    for (var i = 0; i < files.length; i++) {
                        $scope.errorMsg = null;
                        (function (file) {
                            $scope.update(file);
                        })(files[i], i);
                    }
                }
            });

            function generateThumbAndUpload(file, listOfFiles, cancellation) {
                $scope.errorMsg = null;
                $scope.fileUploadObj = {
                    tenderId: $scope.tId, cancellationId: cancellation.id
                };

                uploadFileService.upload(listOfFiles, $scope);
            }

            $scope.update = function (files) {
                $scope.fileUploadObj.tenderId = $scope.tenderid;
                if (files != null) {
                    uploadFileService.upload(files, $scope);
                    // for (var i = 0; i < files.length; i++) {
                    //     $scope.errorMsg = null;
                    //     (function (file) {
                    //         uploadFileService.uploadUsing$upload(file, files, $scope.upload, $scope);
                    //     })(files[i]);
                    // }
                }

            };

            $scope.changeDoc = function (document) {
                $scope.fileUploadObj.documentId = document.id;
                _($scope.updatedDetailes.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

            $scope.clearDoc = function () {
                $scope.fileUploadObj.documentId = "";
            };

            $scope.getReasonTypeNameById = function (id) {
                var title = null;
                if (id) {
                    angular.forEach($scope.reasonTypes, function (el) {
                        if (el.value == id) {
                            title = el.name;
                        }
                    });
                }
                return title;
            };

            var deleteDocument = function (input) {
                if (confirm("Ви дійсно бажаєте видалити документ?")) {
                    var removeDocument = $http.post('./api/files/DeleteDocument', input);
                    removeDocument.then(function (response) {
                        // console.log(data);
                        reloadService.reloadDetailes($scope);
                    });
                }
            };

            $scope.removeTenderDocument = function (documentId) {
                var input = { 'TenderDocumentId': documentId };
                deleteDocument(input);
            };

            // TODO: move to reloadDetailes and less cycles (lots)
            // заполняем коллекцию для комбика с лотами, awards - для какого элемента создаём жалобу
            $scope.$watch('detailes', function (data) {
                if (data != null) {
                    var space = String.fromCharCode(160);
                    $scope.vm.complaintForList = [{ id: null, title: 'тендер', type: 'tender' }];

                    for (var i = 0; i < data.lots.length; i += 1) {
                        var lot = data.lots[i];

                        if (!lot.isFake) {
                            $scope.vm.complaintForList.push({ id: lot.id, title: space + space + 'лот ' + lot.title, type: 'lot' });
                        }

                        if (!data.lots[i].qualifications) continue;

                        data.lots[i].qualifications.forEach(function (q) {
                            q.eligible = false;
                            q.qualified = false;
                            switch (q.status) {
                                case 'active':
                                    q.statusDesc = 'допущено до аукціону';
                                    break;
                                case 'unsuccessful':
                                    q.statusDesc = 'пропозицію відхилено';
                                    break;
                                case 'cancelled':
                                    q.statusDesc = 'кваліфікація відмінена';
                                    break;
                                case 'pending':
                                    q.statusDesc = 'на розгляді';
                                    break;
                                default:
                                    q.statusDesc = 'на розгляді';
                            }

                            if (q.documents) {
                                q.isExportedDocs = !q.documents.some(function (d) {
                                    return d.url == null || (d.title === 'sign.p7s' && d.isExported == null);
                                });
                            }
                        });
                    }
                }
            });

            $scope.includeInvitation = function () {
                if (!$localStorage.isAuthorized) {
                    return false;
                }
                if (!$scope.updatedDetailes || !$scope.updatedDetailes.isEdit) {
                    return false;
                }
                if ($scope.updatedDetailes.status == 'active.enquiries' ||
                    $scope.updatedDetailes.status == 'active.tendering') {
                    return true;
                }
                return false;
            };

            $scope.switchInvitation = function () {

                $("#invitation").modal("toggle");
                $("#modalGroupsInvitation").modal("toggle");
            };

            $scope.redirectToCreatingCriteriasForTender = function() {
                goToTenderService.criteriaRedirect($scope.updatedDetailes.id);
            }

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: 10,
                sorting: {
                    tenderStartDate: 'desc'
                },
            }, {
                    counts: [],
                    getData: function ($defer, params) {
                        var input = {
                            maxResultCount: 900,
                            skipCount: (params.page() - 1) * params.count(),
                            sorting: "CreationTime DESC"
                        };

                        var getGroups = emails.getEmailGroups(input);
                        abp.ui.setBusy(".panel-default:first");

                        getGroups.then(function (response) {
                            abp.ui.clearBusy(".panel-default");
                            params.total(response.data.countAllRecords);
                            response.data.items.forEach(function (item) {
                                item.checked = false;
                            });
                            $scope.groups = response.data.items;
                            $defer.resolve(response.data.items);

                        },
                            function () {
                                console.log("ERROR!!! Can't get groups!");
                            });

                    }
                });

            $scope.inviteGroups = function () {
                var groupIds = [];
                if (!$scope.groups) return;
                $scope.groups.forEach(function (item) {
                    if (item.checked)
                        groupIds.push(item.id);
                });

                var inviteGroups = emailNotificationAppService.notifyInvitationForTender({ groupIds: groupIds, tenderId: $scope.tId });

                inviteGroups.then(function () {
                    abp.notify.success('Повідомлення группам надіслано!');
                    $("#modalGroupsInvitation").modal("toggle");
                });
            };

            $scope.isGroupCheked = function () {
                if (!$scope.groups) return false;
                var res = false;
                $scope.groups.forEach(function (item) {
                    if (item.checked)
                        res = true;
                });

                return res;
            };

            $scope.showSignModal = function (isAllDocumentsExported) {
                $scope.entityType = 'tender';
                if (!isAllDocumentsExported) {
                    abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                    return;
                }
                $timeout(function () {
                    $('#modalSignNew').modal('toggle');
                }, 1000);
            };

            $scope.$on('onCancelTenderSign', function (event, cancellationData, entityType) {
                $scope.entityType = entityType;
                $scope.cancellationData = cancellationData;
                $('#modalSignNew').modal('toggle');
            });

            $scope.$on('onPersonSignDataErrorModalOpen', function () {
                $timeout(function () {
                    $('#personSignDataErrorModal').modal('show');
                }, 1000);
            });

            $scope.unsuccAwardsCount = function () {
                if (!$scope.updatedDetailes) return false;
                var unsuccCount = 0;
                $scope.updatedDetailes.lots.forEach(function (lot) {
                    lot.awards.forEach(function (award) {
                        if (award.status === "unsuccessful" || award.status === "cancelled")
                            unsuccCount++;
                    });
                });
                return unsuccCount;
            }

            $scope.isLotWithGoingComplPeriod = function () {
                if (!$scope.updatedDetailes) return false;
                var res = false;
                $scope.updatedDetailes.lots.forEach(function (lot) {
                    lot.awards.forEach(function (award) {
                        if (award.complaintPeriod && (new Date(award.complaintPeriod.endDate) > new Date())) {
                            res = true;
                            return;
                        }
                    });
                });
                return res;
            }

            $scope.tendAwardsCount = function () {
                if (!$scope.updatedDetailes) return false;
                var cnt = 0;
                $scope.updatedDetailes.lots.forEach(function (lot) {
                    lot.awards.forEach(function (award) {
                        cnt++;
                    });
                });
                return cnt;
            }

            $scope.createBidsReport = function () {
                report.auctionResultToExcel({ tenderId: $scope.updatedDetailes.id })
                    .then(function (response) {
                        if (response.data) {
                            $scope.canDownlAuctReport = true;
                            $scope.nameBidsReport = response.data;
                        }
                    });
            }

            $scope.createReport = function () {
                if ($scope.pdfmakeAlreadyLoaded)
                    createReportWhenSciptsLoaded();
                else
                    $ocLazyLoad.load('/Scripts/pdfmake.min.js');
            }

            function createReportWhenSciptsLoaded() {
                var repParams = {
                    repLots: null,
                    repBids: null
                };

                report.getComplTenderResults({ tenderId: $scope.updatedDetailes.id })
                    .then(function (response) {
                        repParams.repLots = response.data.lots;
                        repParams.repBids = response.data.bids;

                        createRepPDF(repParams);
                    });

                function createRepPDF(params) {

                    var repLots = params.repLots;
                    var repBids = params.repBids;

                    // first table
                    var body = [];

                    var columns = [];
                    columns.push({ text: '', style: 'tableHeader' });

                    repBids.forEach(function (item, i) {
                        columns.push({ text: item.bidOrg != null ? item.bidOrg : '', style: 'tableHeader' });
                    });

                    var rows = [];
                    repLots.forEach(function (itemL, i) {
                        var row = [];
                        row.push(itemL.lotName != null ? itemL.lotName : '');

                        repBids.forEach(function (itemB) {
                            var hasValue = false;
                            itemB.bidLots.forEach(function (itemBl) {
                                if (itemBl.bidLotId != null && itemBl.bidLotId === itemL.bidLotId) {
                                    if (itemBl.bidLotAmount === itemL.contrAmount) {
                                        row.push({
                                            text: itemBl.bidLotAmount != null ? itemBl.bidLotAmount.toFixed(2) + ' ' + itemL.lotCurrency : '',
                                            style: 'award'
                                        });
                                    } else {
                                        row.push({
                                            text: itemBl.bidLotAmount != null ? itemBl.bidLotAmount.toFixed(2) + ' ' + itemL.lotCurrency : '',
                                            style: ''
                                        });
                                    }
                                    hasValue = true;
                                }
                            });
                            if (hasValue === false) row.push('');
                        });

                        rows.push(row);
                    });

                    body.push(columns);

                    for (var i = 0; i < rows.length; i++) {
                        if (columns.length < rows.length) {
                            body.push(rows[i]);
                        }
                    }

                    // second table
                    var body2 = [];
                    var columns2 = [];
                    columns2.push({ text: '', style: 'tableHeader' });
                    columns2.push({ text: 'Переможець', style: 'tableHeader' });
                    columns2.push({ text: 'Очікувана сума', style: 'tableHeader' });
                    columns2.push({ text: 'Сума за договором', style: 'tableHeader' });
                    columns2.push({ text: 'Економія', style: 'tableHeader' });

                    var values2 = [];
                    repLots.forEach(function (lot) {
                        values2.push({
                            LotName: lot.lotName,
                            AwardOrg: lot.awardOrg,
                            LotAmount: lot.lotAmount,
                            LotCurrency: lot.lotCurrency,
                            ContrAmount: lot.contrAmount,
                            Economy: lot.lotAmount - lot.contrAmount,
                            EconomyPerc: Math.round(100 - lot.contrAmount * 100 / lot.lotAmount)
                        });
                    });
                    var rows2 = values2.map(function (row) {
                        return [row.LotName != null ? row.LotName : '', row.AwardOrg != null ? row.AwardOrg : '',
                        row.LotAmount != null ? row.LotAmount.toFixed(2) + ' ' + row.LotCurrency : '',
                        row.ContrAmount != null ? row.ContrAmount.toFixed(2) + ' ' + row.LotCurrency : '',
                        row.EconomyPerc != 100 ? row.Economy.toFixed(2) + ' ' + row.LotCurrency + ' / ' + row.EconomyPerc + '%' :
                            row.Economy.toFixed(2) + ' ' + row.LotCurrency + ' / ' + '99%'];
                    });

                    body2.push(columns2);

                    for (var i = 0; i < rows2.length; i++) {
                        body2.push(rows2[i]);
                    }

                    var docDefinition = {
                        content:
                            [
                                {
                                    text: 'Звіт за результатами проведеної закупівлі ',
                                    alignment: 'center',
                                    margin: [0, 40, 0, 0],
                                    width: '*',
                                    bold: 'true',
                                    style: 'title'
                                },
                                {
                                    text: $scope.updatedDetailes.tenderId,
                                    alignment: 'left',
                                    margin: [0, 20, 0, 0],
                                    width: '*',
                                    style: 'content'
                                },
                                {
                                    text: $scope.updatedDetailes.organization.name + ': ' + $scope.updatedDetailes.title,
                                    alignment: 'left',
                                    margin: [0, 10, 0, 0],
                                    width: '*',
                                    style: 'content'
                                },
                                {
                                    'table': {
                                        'body': body
                                    },
                                    margin: [0, 10, 0, 0],
                                    width: '*',
                                    fontSize: 10.5
                                },
                                {
                                    'table': {
                                        'body': body2
                                    },
                                    margin: [0, 20, 0, 0],
                                    width: '*',
                                    fontSize: 10.5
                                }
                            ],
                        styles: {
                            header: {
                                fontSize: 11
                            },
                            title: {
                                fontSize: 12,
                                bold: true
                            },
                            tableHeader: {
                                fontSize: 10,
                                bold: true
                            },
                            content: {
                                fontSize: 10
                            },
                            award: {
                                background: '#BCB0B0'
                            }
                        },
                        pageOrientation: 'landscape'
                    };
                    //pdfMake.createPdf(docDefinition).open();
                    pdfMake.createPdf(docDefinition).download('report_' + $scope.updatedDetailes.tenderId + '.pdf');
                }
            }

            $scope.$on('ocLazyLoad.fileLoaded', function (e, file) {
                //console.log('file loaded', file);
                if (file === '/Scripts/pdfmake.min.js') {
                    $ocLazyLoad.load('/Scripts/vfs_fonts.js');
                }
                if (file === '/Scripts/vfs_fonts.js') {
                    createReportWhenSciptsLoaded();
                    $scope.pdfmakeAlreadyLoaded = true;
                }
            });

            var hrefs = {
                belowThreshold: '/updateTender/',
                aboveThresholdUA: '/updateTenderAbove/',
                aboveThresholdEU: '/updateTenderAboveEu/',
                reporting: '/updateTenderLimitedReporting/',
                negotiation: '/updateTenderLimited/',
                'negotiation.quick': '/updateTenderLimited/',
                'aboveThresholdUA.defense': '/updateTenderDefense/',
                'simple.defense': '/updateTenderSimpleDefense/',
                competitiveDialogueUA: '/updateTenderDialogue/',
                'competitiveDialogueUA.stage2': '/updateTenderDialogueStage2/',
                competitiveDialogueEU: '/updateTenderDialogueEu/',
                'competitiveDialogueEU.stage2': '/updateTenderDialogueEuStage2/',
                esco: '/updateTenderEsco/',
                closeFrameworkAgreementUA: '/updateTenderFramework/',
                closeFrameworkAgreementSelectionUA: '/updateCloseFrameworkAgreementSelectionUA/',
                priceQuotation: '/updateTenderPriceQuotation/'
            };

            $scope.vm = {
                activeTendering: activeTendering,
                canAsk: canAsk,
                getCancellationStatusDesc: getCancellationStatusDesc,
                goToUpdate: goToUpdate,
                hasRight: hasRight,
                hrefs: hrefs,
                showAwardCreate: showAwardCreate,
                stage2Waiting: stage2Waiting,
                deleteDraft: deleteDraft
            };

            function deleteDraft() {
                abp.ui.setBusy();
                tenderAppService.deleteDraft({ id: $scope.updatedDetailes.id })
                    .then(function (response) {
                        abp.ui.clearBusy();
                        abp.notify.success('Чернетку видалено успішно.');

                        var u = '/MyTenders';
                        $location.path(u);
                    },
                        function () {
                            abp.ui.clearBusy();
                        });
            };

            function goToUpdate() {
                var isNeedEn = $scope.updatedDetailes.isOpenEU || $scope.updatedDetailes.isDialogueEU;
                if (isNeedEn) {
                    var o = $localStorage.organization;
                    if (!o.nameEN || (!o.contactPoint.nameEN && !$localStorage.usernameEN) || !o.identifier.legalNameEN) {
                        abp.notify.error('Для оголошення закупівлі даного типу, заповніть поля "Повна назва (англ)", "ПІБ (англ.)", "Мова спілкування", в налаштуваннях організації / моїх даних.');
                        return;
                    }
                }
                var u = $scope.vm.hrefs[$scope.updatedDetailes.procurementMethodType] + $scope.tId;
                // ET-15236  call .search({}) to clear ?planIdUa=... in url which cause a bug in updateTender > aadPlanId derective.
                $location.path(u).search({});
            };

            function activeTendering() {
                tenderAppService.activeTendering($scope.tId)
                    .then(function (response) {
                        abp.notify.success("Статус змінено");
                        reloadService.reloadDetailes($scope);
                    });
            }

            function stage2Waiting() {
                tenderAppService.stage2Waiting($scope.tId)
                    .then(function (response) {
                        abp.notify.success("Статус змінено");
                        reloadService.reloadDetailes($scope);
                    });
            }

            function getCancellationStatusDesc(s) {
                switch (s) {
                    case 'pending':
                        return 'Запит оформляється';
                    case 'active':
                        return 'Скасування активоване';
                    default:
                        return '-';
                }
            };

            function hasRight() {
                if ($scope.updatedDetailes.isDialogueStage2 || $scope.updatedDetailes.isDialogueEUStage2) {
                    return $scope.updatedDetailes.lots.some(function (o) {
                        return o.canUserAddBid;
                    });
                }
                return true;
            }

            function canAsk() {
                if (!$scope.updatedDetailes || $scope.updatedDetailes.isEdit) return false;

                if ($scope.updatedDetailes.status == 'active.enquiries' && $scope.updatedDetailes.isEnquiryPeriod) return true;

                if (!$scope.updatedDetailes.isAbove) return false;

                return $scope.updatedDetailes.status == 'active.tendering' && new Date() < new Date($scope.updatedDetailes.enquiryPeriod.endDate);
            }

            function showAwardCreate() {
                if (!documentsService.checkDocumentsIsExported($scope.updatedDetailes.documents)) return false;
                for (var i = 0; i < $scope.updatedDetailes.lots.length; i++) {
                    if (!$scope.updatedDetailes.lots[i].pendingAward && !$scope.updatedDetailes.lots[i].hasActiveAward)
                        return true;
                }
                return false;
            }

            $scope.saveTemplate = function (name) {
                if (new Date($scope.updatedDetailes.creationTime) <= new Date(2016, 3, 1)) {
                    abp.notify.error("Неможливо створити шаблон з обраного тендеру!");
                    return;
                }
                abp.ui.setBusy();
                var createTemplateModel = {};
                angular.copy($scope.updatedDetailes, createTemplateModel);
                createTemplateModel.features = $scope.updatedDetailes.features;
                createTemplateModel.lots = $scope.updatedDetailes.lots;
                // lotBids updates lot.features(add item.features)
                createTemplateModel.lots.forEach(function (l) {
                    l.features = l.features.filter(function (f) {
                        return !f.itemId;
                    });
                    l.auctionPeriod = null;
                });
                createTemplateModel.templateName = name;
                createTemplateModel.templateType = 'userTemplate';
                createTemplateModel.notExport = true;
                createTemplateModel.tenderPeriod = null;
                createTemplateModel.enquiryPeriod = null;

                // $scope.createTenderTemplate(createTemplateModel);
                for (var dataLot = 0; dataLot < createTemplateModel.lots.length; dataLot++) {
                    for (var dataItem = 0; dataItem < createTemplateModel.lots[dataLot].items.length; dataItem++) {
                        if (createTemplateModel.lots[dataLot].items[dataItem].unitPrice) {
                            delete createTemplateModel.lots[dataLot].items[dataItem].unitPrice;
                        }
                    }
                }

                createTemplateModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                var createTemplate = tenderAppService.createTenderProzorro(createTemplateModel);


                console.log(createTemplateModel);
                createTemplate
                    .then(function (id) {
                        abp.notify.success("Шаблон створено!");
                        abp.ui.clearBusy();
                    },
                        function (err) {
                            console.log(err.data);
                            abp.ui.clearBusy();
                        });
            }




            $scope.$watch("detailes", function (n, o) {
                if (!n) return;
                $scope.updatedDetailes.cause = lookupService.getCause(n.cause);
            });

            $scope.includePoints = function (title) {
                $scope.title = title;
                if ($scope.title.length > 40) {
                    return '...';
                }
            };

            $scope.questionsLength = function () {
                if (!$scope.updatedDetailes.questions) return [];
                var length = $scope.updatedDetailes.questions.length;
                var questions = 0;
                for (i = 0; i < length; i++) {
                    if ($scope.updatedDetailes.questions[i].isExported && $scope.updatedDetailes.questions[i].isOwn || !$scope.updatedDetailes.questions[i].isOwn)
                        questions = questions + 1;
                };
                return questions;
            }

            // ******* navigation *******
            setTimeout(function () {
                $scope.navigation = [
                    {
                        title: $rootScope.source('DescriptionPurchases'),
                        type: 'menuAboutBlock',
                        active: true,
                        show: true,
                        openFunc: function () {
                            menuPress('menuAboutBlock');
                        }
                    }, {
                        title: $rootScope.source('Question'),
                        type: 'menuQuestionsBlock',
                        active: false,
                        show: !$scope.updatedDetailes.isLimitedReporting && $scope.updatedDetailes.procurementMethodType !== 'closeFrameworkAgreementSelectionUA' && $scope.updatedDetailes.procurementMethodType !== 'priceQuotation',
                        count: $scope.questionsLength(),
                        openFunc: function () {
                            menuPress('menuQuestionsBlock');
                        }
                    }, {
                        title: $rootScope.source('ClaimsComplaints'),
                        type: 'menuComplainBlock',
                        active: false,
                        show: !$scope.updatedDetailes.isLimitedReporting && $scope.updatedDetailes.procurementMethodType !== 'closeFrameworkAgreementSelectionUA' && $scope.updatedDetailes.procurementMethodType !== 'priceQuotation',
                        count: $scope.detailes.countOfComplaints || 0,
                        openFunc: function () {
                            menuPress('menuComplainBlock');
                        }
                    },
                    {
                        title: 'Dozorro',
                        type: 'menuDozorroBlock',
                        active: false,
                        show: $scope.updatedDetailes.procurementMethodType !== 'priceQuotation',
                        openFunc: function () {
                            menuPress('menuDozorroBlock');
                        }
                    },
                    {
                        title: 'Держаудитслужба України',
                        type: 'menuDasuBlock',
                        active: false,
                        show: $scope.updatedDetailes.procurementMethodType !== 'priceQuotation',
                        openFunc: function () {
                            menuPress('menuDasuBlock');
                        }
                    }
                ];
            }, 500);

            function menuPress(a) {
                $timeout(function () {
                    function moveToMenu() {
                        if (!$scope.navigation) {
                            $timeout(moveToMenu, 500);
                            return
                        }
                        $scope.navigation.forEach(function (item, i, arr) {
                            if (item.type === a) {
                                item.active = true;
                                $scope.naviBlock = a
                                $localStorage.openBlockInTender = [$scope.updatedDetailes.id, a];
                            } else {
                                item.active = false;
                            }
                        });
                    }
                    function scrollTop() { $("html").scrollTop(scroll); }
                    function rightHeight() { $(".heightBlock").css("height", "auto"); abp.ui.clearBusy(); }
                    function fadeOut() { $(".fadeBlock").fadeOut(100); }
                    function hideBlock() { $(".hideBlock").css("display", "none"); }
                    function showBlock() { $(".hideBlock").css("display", "inherit"); }
                    function fadeIn() { $(".fadeBlock").fadeIn(400); }
                    blockHeight = $(".block").height();
                    scroll = $(window).scrollTop();
                    $(".heightBlock").css("height", blockHeight);
                    if (blockHeight) { $(".heightBlock").css("height", blockHeight); }
                    fadeOut();
                    $timeout(hideBlock, 100);
                    $timeout(moveToMenu, 500);
                    $timeout($scope.setTreeState, 100);
                    $timeout(showBlock, 400);
                    $timeout(scrollTop, 800);
                    $timeout(fadeIn, 400);
                    $timeout(rightHeight, 1000);
                }, 1100);
            };

            // save tree state
            $scope.setTreeState = function () {
                $(".panel-collapse").on('hidden.bs.collapse', function () {
                    var active = $(this).attr('id');
                    var panels = $scope.treePanels === [] ? new Array() : $scope.treePanels;
                    if ($.inArray(active, panels) == -1) //check that the element is not in the array
                        panels.push(active);
                    $scope.treePanels = panels;
                });

                $(".panel-collapse").on('shown.bs.collapse', function () {
                    var active = $(this).attr('id');
                    var panels = $scope.treePanels === [] ? new Array() : $scope.treePanels;
                    var elementIndex = $.inArray(active, panels);
                    if (elementIndex !== -1) //check the array
                    {
                        panels.splice(elementIndex, 1); //remove item from array
                    }
                    $scope.treePanels = panels; //save array on localStorage
                });

                var panels = $scope.treePanels === [] ? new Array() : $scope.treePanels; //get all panels
                for (var i in panels) { //<-- panel is the name of the cookie
                    if ($("#" + panels[i]).hasClass('panel-collapse')) // check if this is a panel
                    {
                        $("#" + panels[i]).collapse("hide");
                    }
                }

                // award.bidDocuments pagination
                $scope.settings = {
                    currentPage: 0,
                    offset: 0,
                    pageLimit: 10,
                    pageLimits: ['10', '50', '100']
                };
                $scope.totalOnLast = function (summ) {
                    summ = summ.toString();
                    if (summ.slice(-1) === '0') return '10';
                    return summ.slice(-1);
                }
                // award.bidDocuments pagination end
            }

            // date whith 99999 miliseconds to normal date
            $scope.getDate = function (date) {
                return Date.parse(date);
            }
            function showButton() {
                setModalPositionService.setPositionSecond();
                $('.bidButton-fixed').css("display", "block");
            }


            $(document).scroll(function () {
                setModalPositionService.setPositionSecond();
            });

            $scope.go = function (url) {
                if (url === '/register')
                    switch ($location.$$host) {
                        case ('qa-prozorro.e-tender.ua'):
                            $location.path('/register');
                            $window.scrollTo(0, 0);
                            return;
                        case ('localhost'):
                            $location.path('/register');
                            $window.scrollTo(0, 0);
                            return;
                        default:
                            window.location = abp.setting.values.ProzorroSiteUrl + 'register';
                            //$location.path('/register');
                            $window.scrollTo(0, 0);
                            return;
                    }
            }

            $scope.$on('reloadTender', function (event, skipReloadComplaints) {
                $scope.reloadBid(skipReloadComplaints);
            });

            $scope.$on('showDozorroForm',
                function (evt, data, apiId) {
                    menuPress('menuDozorroBlock');
                    $timeout(function () {
                        $scope.$broadcast('goToDozorroForm', data, apiId);
                    }, 2000);
                });

            $scope.$on('createInvoice',
                function (evt, data) {
                    $scope.showCreateInvoiceModal = true;
                    $timeout(function () {
                        $("#createInvoiceModal").modal('toggle');
                    }, 1000);
                    $scope.createInvoice = {
                        amount: data
                    };
                });

            function getLocationUrl() {
                return $location.$$url;
            }

            $scope.ifOperatorDirectiveActive = function () {
                if (getLocationUrl().indexOf('operator123') !== -1) return true;
                return false;
            }

            $scope.openCreateTenderTemplate = function () {
                $scope.showCreateTenderTemplate = true;
                $timeout(function () {
                    $("#enterTemplName").modal('toggle');
                }, 1000);
            }

            $scope.changeStatusToDraftPublishingForProcedurePriceQuotation = function () {
                abp.ui.setBusy();
                tenderAppService.changeStatusToDraftPublishingForProcedurePriceQuotation($scope.detailes.id).then(function () {
                    abp.notify.success('Переведено в статус Чернетка(публікація)');
                }, function (error) {
                    console.log(error)
                }).finally(function () {
                    abp.ui.clearBusy();
                    $scope.reloadDetailes();
                });

            };
            
            $scope.openInvitationMidal = function () {
                $scope.showInvitationModal = true;
                $timeout(function () {
                    $("#invitation").modal('toggle');
                }, 1000);
            }

            $scope.$on('showModalSign',
                function (evt, data, data2, numberOfSign) {
                    $scope.showModalSign = true;
                    $timeout(function () {
                        $('#modalSign').modal('toggle');
                        $('#modalSign').trigger('show.bs.modal', [data, data2]);
                         if (data2 && numberOfSign) {
                             $('#modalSign').trigger('show.bs.modal', [data, data2, numberOfSign]);
                         } else if (data2 && !numberOfSign) {
                             $('#modalSign').trigger('show.bs.modal', [data, data2]);
                         } else if (!data2 && numberOfSign) {
                             $('#modalSign').trigger('show.bs.modal', [data, null, numberOfSign]);
                         } else {
                             $('#modalSign').trigger('show.bs.modal', [data]);
                         }
                    }, 100);
                });

            $scope.$on('showModalSignBid',
                function (evt, data, data2, numberOfSign) {
                    $scope.entityType = 'bid';
                    $scope.myBid = data;
                    if (numberOfSign || numberOfSign === 0) {
                        $scope.signCount = numberOfSign - 1;
                    } else {
                        $scope.signCount = numberOfSign;
                    }
                    $timeout(function () {
                        $('#modalSignNew').modal('toggle');
                    }, 100);
                });

            $scope.$on('showModalSignAward',
                function (evt, award) {
                    $scope.myAward = award;
                    $scope.entityType = 'award';
                    $timeout(function () {
                        $('#modalSignNew').modal('toggle');
                    }, 100);
                });


            $scope.$on('onSignDocsEvent', function (event, bid) {
                $scope.entityType = 'documentHash';
                $scope.myBid = bid;
                $timeout(function () {
                    $('#modalSignNew').modal({backdrop: 'static'});
                    $('#modalSignNew').data('bs.modal').options.backdrop = 'static';
                }, 1000);
            });

            $scope.$on('onDocsSignSelectEvent', function (event, docs) {
                $scope.myDocs = docs;
            });

            $scope.$on('showModalSignMonitoring', function (evt, monitoring) {
                $scope.myMonitoring = monitoring;
                $scope.entityType = monitoring.type;
                $scope.entityOutOfTender = monitoring.entityOutOfTender;
                $timeout(function () {
                    $('#modalSignNew').modal('toggle');
                }, 100);
            })

            $scope.$on('showModalDocNotification',
                function (evt, id) {
                    showModalDocNotification(id);
                });

            function showModalDocNotification(id) {
                $scope.showModalDocNotification = true;
                $timeout(function () {
                    $(id).modal('toggle');
                }, 1000);
            }

            function goToMonitoring(goTo) {
                $scope.updatedDetailes.showDasu = goTo;
                menuPress('menuDasuBlock');
            }


            // Documents Prev START

            $scope.$on('tenderSigned',
                function () {
                    reloadService.reloadDetailes($scope);
                });

            $scope.$on('previewDoc',
                function (evt, document) {
                    $scope.previewDoc(document);
                });

            $scope.previewDoc = function (doc) {
                documentsService.previewDoc(doc, $scope);
            }

            $scope.trustSrc = function (src) {
                return documentsService.trustSrcForDocLoad(src);
            }

            $scope.goToUrl = function (url) {
                window.location = url;
            }

            $scope.canUpdateTenderLimited = function() {
                return $scope.updatedDetailes.isEdit &&
                    $scope.updatedDetailes.procurementMethod == 'limited' &&
                    (
                        ($scope.updatedDetailes.status == 'active' && !$scope.awardsExist()) ||
                        $scope.updatedDetailes.notExport == true
                    );
            }

            // Documents Prev END

            $scope.vm.addComplaintMode = null;

            $scope.setApprovedStatus = function () {
               
                tenderCorporationAppService.setApprovedStatus($scope.updatedDetailes.id).then(function () {
                    abp.notify.success("Тендер затверджено!");
                    reloadService.reloadDetailes($scope);
                });
            }
            $scope.setCancelledApprovedStatus = function () {
               
                tenderCorporationAppService.setCancelledApprovedStatus($scope.updatedDetailes.id).then(function () {
                    abp.notify.success("Тендер відправлено на доопрацювання!");
                    reloadService.reloadDetailes($scope);
                });
            }
            $scope.publishApprovedTender = function () {
               
                tenderCorporationAppService.publishApprovedTender($scope.updatedDetailes.id).then(function () {
                    abp.notify.success("Закупівлю опубліковано");
                    reloadService.reloadDetailes($scope);
                });
            }

        }]);

})();

;
(function () {
    var controllerId = 'tendersCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.etender.tender', '$q', 'ngTableParams', function ($scope, tender, $q, ngTableParams) {
        }]);
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('tendersArchiveCtrl', tendersArchive);
    tendersArchive.$inject = ['$scope', '$rootScope', '$timeout', 'ngTableParams', 'abp.services.etender.tender', 'lookupService', '$localStorage', '$sessionStorage', 'abp.services.etender.readTender'];
    function tendersArchive($scope, $rootScope, $timeout, ngTableParams, tenderAppService, lookupService, $localStorage, $sessionStorage, readTenderAppService) {
        $scope.ng_localStorage = $localStorage;
        $scope.vm = {
            clear: clear,
            getLabelClass: getLabelClass,
            getTenderDesc: getTenderDesc,
            isDateEndIntervalValid: isDateEndIntervalValid,
            isDateStartIntervalValid: isDateStartIntervalValid,
            isPriceIntervalValid: isPriceIntervalValid,
            paramsToggle: paramsToggle,
            regex: {
                number: $rootScope.regex.number
            },
            search: search,
            searchChange: searchChange,
            searchIdentifier: null,            
            setSelected: setSelected,
            statuses: [],
            isShowOnlyTendersCreatedOnOurSite: false,
            isOperator: isOperator,
            selProcurMethod: null
        };
        var vm = $scope.vm;

        if ($sessionStorage.userSelectedStatusArchive) {
            $scope.vm.selectedStatus = $sessionStorage.userSelectedStatusArchive;
        } else {
            $scope.vm.selectedStatus = null;
        }

        if ($sessionStorage.userFilterArchive) {
            $scope.vm.filter = $sessionStorage.userFilterArchive;
        } else {
            $scope.vm.filter = {
                description: null,
                classificationCpv: null,
                classificationDkpp: null,
                organisation: null,
                parentCodeEDRPOU: null,
                priceFrom: null,
                priceTo: null,
                tenderPeriodStartFrom: '',
                tenderPeriodStartTo: '',
                tenderPeriodEndFrom: '',
                tenderPeriodEndTo: '',
                title: null
            };
        }

        var statuses = ['unsuccessful', 'complete', 'cancelled'];
        var searchFilter = {
            isProductionMode: true,
            statuses: statuses,
            procurementMethod: 'open'
        };
        
        $scope.getTenderProcedureType = function (tender) {
            if (!tender) return null;
            return lookupService.getTenderProcedureType(tender.procurementMethodType);
        };

        $scope.$watch('selProcurMethod', function(n) {
            $localStorage.selProcurMethod = n;
        });

        activate();

        function activate() {
            if ($scope.ng_localStorage.isAuthorized) {
                searchFilter.isProductionMode = $scope.ng_localStorage.isProdMode;
            }            
            vm.tableParams = new ngTableParams({
                page: 1,
                count: 10,
                sorting: {
                    tenderStartDate: 'desc'
                },
            }, {
                total: 0,
                counts: [],
                getData: getData
            });
            vm.statuses = getStatusDetails();
        };

        function isOperator() {
            return ($scope.ng_localStorage.isOperator !== undefined) && $scope.ng_localStorage.isOperator === 'true';
        };

        //#region Model
        function clear() {
            vm.searchIdentifier = null;
            vm.filter = {
                description: null,
                classificationCpv: null,
                classificationDkpp: null,
                organisation: null,
                parentCodeEDRPOU: null,
                priceFrom: null,
                priceTo: null,
                tenderPeriodStartFrom: '',
                tenderPeriodStartTo: '',
                tenderPeriodEndFrom: '',
                tenderPeriodEndTo: '',
                title: null
            };
            $sessionStorage.userFilterArchive = $scope.vm.filter;
            $sessionStorage.userSelectedStatusArchive = null;
            setSelected();
        }

        function getLabelClass(s) {
            return lookupService.getTenderLabelClass(s);            
        };
        function getTenderDesc(tender) {
            return lookupService.getTenderStatusDesc(tender.status, tender.procurementMethodType, tender.notExport);
        };

        function isDateEndIntervalValid() {
            var from = vm.filter.tenderPeriodEndFrom;
            var to = vm.filter.tenderPeriodEndTo;
            if (!from || !to) {
                return true;
            }
            if (from <= to) {
                return true;
            }
            return false;
        };
        function isDateStartIntervalValid() {
            var from = vm.filter.tenderPeriodStartFrom;
            var to = vm.filter.tenderPeriodStartTo;
            if (!from || !to) {
                return true;
            }
            if (from <= to) {
                return true;
            }
            return false;
        };
        function isPriceIntervalValid() {
            var from = parseInt(vm.filter.priceFrom);
            var to = parseInt(vm.filter.priceTo);
            if (isNaN(from) || isNaN(to)) {
                return true;
            }
            if (from <= to) {
                return true;
            }
            return false;
        };
        function paramsToggle() {
            $('#searchParameters').collapse('toggle');
            $('#paramsCaret').toggleClass('fa-caret-up');
        };
        function setSelected(s) {
            if (s) {
                searchFilter.statuses = [s.name];
            } else {
                searchFilter.statuses = statuses;
            }
            vm.selectedStatus = s;
        }
        function search() {
            vm.tableParams.reload();
            vm.tableParams.page(1);
        }
        var timer;
        function searchChange() {
            $timeout.cancel(timer);
            timer = $timeout(function () {
                vm.tableParams.reload();
                vm.tableParams.page(1);
            }, 1000);
        }
        //#endregion

        //#region Internal
        function getData($defer, params) {
            abp.ui.setBusy(".panel-default");
            var orderBy = params.orderBy(); // add '-' on start str
            var sorting = params.sorting();
            var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'tenderStartDate';            
            var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';
            var pager = {
                page: params.page(),
                pageSize: params.count(),
                orderColumn: orderColumn,
                orderDirection: orderDirection,
                searchFilter: getSearchFilter(),
                searchIdentifier: vm.searchIdentifier
            };
            readTenderAppService.getTenders(pager)
                .then(function (response) {
                    abp.ui.clearBusy(".panel-default");
                    //if (data.serverCacheKey)
                    //    abp.notify.success('Отримано з кешу:' + data.serverCacheKey);
                    params.total(response.data.countAllRecords);
                    $defer.resolve(response.data.tender);
                },
                function (errorResponse) {
                    console.log(errorResponse.data);
                });
        }
        function getSearchFilter() {
            searchFilter.cpv = vm.filter.classificationCpv;
            searchFilter.dkpp = vm.filter.classificationDkpp;
            searchFilter.priceFrom = vm.filter.priceFrom;
            searchFilter.priceTo = vm.filter.priceTo;
            searchFilter.columnFilters = [
                { Name: 'Title', Filter: vm.filter.title },
                { Name: 'OrganizationName', Filter: vm.filter.organisation },
                { Name: 'tenderPeriodEndFrom', Filter: vm.filter.tenderPeriodEndFrom },
                { Name: 'tenderPeriodEndTo', Filter: vm.filter.tenderPeriodEndTo },
                { Name: 'tenderPeriodStartFrom', Filter: vm.filter.tenderPeriodStartFrom },
                { Name: 'tenderPeriodStartTo', Filter: vm.filter.tenderPeriodStartTo }
            ];
            searchFilter.isShowOnlyTendersCreatedOnOurSite = vm.isShowOnlyTendersCreatedOnOurSite;
            $sessionStorage.userFilterArchive = $scope.vm.filter;
            $sessionStorage.userSelectedStatusArchive = $scope.vm.selectedStatus;
            return searchFilter;
        }
        function getStatusDetails() {
            var r = [];
            for (var i = 0; i < statuses.length; i += 1) {
                r.push({
                    name: statuses[i],
                    desc: lookupService.getTenderStatusDesc(statuses[i]),
                    labelClass: getLabelClass(statuses[i])
                });
            }
            return r;
        }
        //#endregion
    }
})();;
(function () {
    var controllerId = 'updateTenderCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$location',
        '$q',
        '$stateParams',
        '$timeout',
        'tenderHelperService',
        '$localStorage',
        'addFeaturesService',
        'tenderFormService',
        'tenderFormBelowThresholdService',
        'goToTenderService',
        '$rootScope',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        function (
            $scope,
            $location,
            $q,
            $stateParams,
            $timeout,
            tenderHelperService,
            $localStorage,
            addFeaturesService,
            tenderFormService,
            tenderFormBelowThresholdService,
            goToTenderService,
            $rootScope,
            tender,
            getTender) {

            $scope.ng_localStorage = $localStorage;
            $scope.activeTab = 'editTender';
            $scope.isCriteriaFormValid = true;
            var date = new Date();
            $scope.dateToday = Date.parse(date);

            // get tendet data
            if (!abp.session || !abp.session.userId) {
                abp.ng.http.handleUnAuthorizedRequest(null, '/');
            } else {
                tenderFormService.getTender($scope);
            }

            $scope.getTenderThen = function (data) {
                // TODO: hack for submit tender from draft from 'ET-21638'
                data.isEdit = true;
                if (!data.isEdit) {
                    abp.notify.error('Ви не можете редагувати цей тендер');
                    $location.path('/');
                    return;
                }
                if (data.plan) {
                    $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
                }
                // set tender data
                tenderFormBelowThresholdService.setTenderData($scope, data);
                $scope.tenderDetailes = data;

                $scope.createTenderModel.lots.forEach(function (l) {
                    l.hasGuarantee = '0';
                    if (l.guarantee && l.guarantee.amount > 0) {
                        l.hasGuarantee = '1';
                    }
                    if ($scope.createTenderModel.budgetNotDeterm || l.value.amount === 999999999) {
                        tenderFormService.changeMinimalStepPer(l);
                        l.value.budgetNotDeterm = true;
                        $scope.createTenderModel.budgetNotDeterm = true;
                    }
                    tenderHelperService.addEmptyDk(l);
                    if (l.minimalStep.amount && l.value.amount) {
                        l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                    }
                });
                tenderHelperService.setDefaultItems(data);
                $scope.detailes = data;
                $scope.ifModelHasGuarantee($scope.createTenderModel);
                abp.ui.clearBusy();
            }

            $scope.switchActiveTab = function (tabName) {
                if (tabName !== 'editTender') {
                    abp.ui.setBusy();
                    $scope.createTenderModel.lots.forEach(function (lot) {
                        lot.items.forEach(function (item) {
                            changeItemClassifications(item);
                        });
                    });

                    $scope.createTenderModel.lots.forEach(function (lot) {
                        lot.items.forEach(function (item) {
                            if (item.deliveryAddress.city &&
                                (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                                item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                                item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                    delete item.deliveryAddress.city;
                            }
                        });
                    });

                    tender.updateTenderProzorro($scope.createTenderModel).then(function (response) {
                        getTender.getTender({ "Id": response.data.id }).then(function (response) {
                            $scope.$broadcast('onUpdateTenderFinished');
                            $scope.activeTab = tabName;
                            $scope.detailes = response.data;
                            $scope.getTenderThen(response.data);
                        }, function (error) {
                            console.log(error);
                        }).finally(function () {
                            abp.ui.clearBusy();
                        });
                    });
                } else {
                    $scope.activeTab = tabName;
                }
            };

            $scope.$on('onCriteriaFormChanged', function (event, isCriteriaFormValid) {
                $scope.isCriteriaFormValid = isCriteriaFormValid;
            });

            $scope.$on('userDataFields', function (param, data) {
                tenderFormService.updateTenderModelWithOrganization($scope, data);
            });

            $scope.$on('onPersonSignDataErrorModalOpen', function () {
                $timeout(function () {
                    $('#personSignDataErrorModal').modal('show');
                }, 1000);
            });

            $scope.goBack = function () {
                goToTenderService.redirect($scope.createTenderModel, $scope.createTenderModel.id);
            };

            function getRequirementByLotId(lotId, criterias) {
                var requirementStatus = null;
                var foundCriteriaByLotId = false;
    
                var classificationApiIds = [
                    'CRITERION.OTHER.BID.GUARANTEE',
                    'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                    'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                    'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                    'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
                ]
    
                foundCriteriaByLotId = criterias.find(function (singleCriteria) {
                    if (singleCriteria.relatesTo === 'tender') {
                        return classificationApiIds.indexOf(singleCriteria.classification.apiId) !== -1;
                    } else if (singleCriteria.relatesTo === 'lot') {
                        return singleCriteria.relatedItem === lotId && classificationApiIds.indexOf(singleCriteria.classification.apiId) !== -1;
                    }
                });
                
                if (foundCriteriaByLotId) {
                    foundCriteriaByLotId.requirementGroups.find(function (requirementGroup) {
                        requirementGroup.requirements.find(function name(requirement) {
                            return requirementStatus = requirement.requirementStatus !== 'cancelled';
                        });
                    });
                } else {
                    return false;
                }
                
                return requirementStatus;
            }

            var createAddressPromises = [];

            $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
                abp.ui.setBusy();

                var model = angular.copy($scope.createTenderModel);
                var needBreak = false;

                if (model.status && model.criteriaFlags.canBeUsedOtherBidGuarantee) {
                    model.lots.forEach(function (lot) {
                        var requirementByLotIdHasActiveStatus = getRequirementByLotId(lot.apiId, model.tenderCriteria);
                        
                        if ((lot.hasGuarantee === '1' || lot.hasGuarantee === '0') && requirementByLotIdHasActiveStatus) {
                           if (!lot.guarantee || lot.guarantee.amount === 0) {
                                needBreak = true;
                                abp.ui.clearBusy();
                                return abp.notify.error('Для публікації змін необхідно архівувати критерій забезпечення тендерної пропозиції!');
                           }
                        }
                        if (model.tenderCriteria && model.tenderCriteria.length) {
                            if (lot.hasGuarantee === '1' && !requirementByLotIdHasActiveStatus) {
                                if (lot.guarantee.amount > 0) {
                                    needBreak = true;
                                    abp.ui.clearBusy();
                                    return abp.notify.error('Для публікації змін необхідно вимкнути "Забезпечення тендерних пропозицій" або додати відповідний критерій!');
                                }
                            }
                        }
                        if ((lot.hasGuarantee === '0' && !requirementByLotIdHasActiveStatus) || !model.tenderCriteria.length) {
                           if (lot.guarantee && lot.guarantee.amount > 0) {
                                needBreak = true;
                                abp.ui.clearBusy();
                                return abp.notify.error('Для публікації змін необхідно додати критерій забезпечення тендерної пропозиції');
                           }
                        }
                    });
                }
                
                if (needBreak) return;

                model.notExport = isNotExport;
                model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
                for (var k = 0; k < model.lots.length; k += 1) {
                    var lot = model.lots[k];

                    for (var j = 0; j < lot.items.length; j += 1) {

                        var curItem = lot.items[j];

                        if (/*!curItem.classification.id ||
                        (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                            curItem.classification.id = curItem.classification.code;
                            curItem.classification.description = curItem.classification.description;
                        }

                        if (curItem.additionalClassifications)
                        for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                            if (/*!curItem.additionalClassifications[i].id ||
                            (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                                curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                                curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                            }
                        }

                        if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                            delete curItem.deliveryLocation;
                        }

                        /*if (curItem.deliveryAddressId && curItem.deliveryAddressId > 0) {

                            var updateAddressInput = curItem.deliveryAddress;
                            createAddressPromises.push(
                                addressService.updateAddress*(updateAddressInput)
                                    .then(function (response) {
                                    })
                            );

                        } else*/
                        if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                            tenderFormService.createAddressInput(curItem, createAddressPromises);
                        }
                    }
                }

                if (createAddressPromises.length > 0) {
                    $q.all(createAddressPromises).then(function () {
                        return $scope.updateTenderFinally(model);
                    });

                } else {
                    return $scope.updateTenderFinally(model);
                }
                
            };            

            $scope.isReadyToExport = function (model) {
                return model.IsExported !== false || model.IsExportError !== false || model.status.trim() === '';
            };
            $scope.isAllDataGood = function (model) {
                if (!tenderFormBelowThresholdService.isAllDataGood(model)) return false;

                for (var i = 0; i < model.lots.length; i += 1) {
                    var lot = model.lots[i];
                    if (!tenderFormBelowThresholdService.isAllDataGoodInLot(model, lot)) return false;

                    for (var j = 0; j < lot.items.length; j += 1) {
                        var item = lot.items[j];
                        if (!tenderFormBelowThresholdService.isAllDataGoodinItem(item)) return false;


                        if (model.tenderPeriod && tenderHelperService.isBefore2017(model.tenderPeriod.endDate)) {
                            for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                                if (!item.additionalClassifications[a].id) {
                                    return false;
                                }
                            }
                        }

                        if (item.deliveryDate && (item.deliveryDate.endDate && !tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod)))
                            return false;

                        if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                    }
                }

                if (!checkFeatureSum(model)) return false;
                if (!checkMilestonesPercentageSumm(model)) return false;

                return true;
            };

            $scope.ifModelHasGuarantee = function (model) {
                $scope.hasGuarantee = false;
                if (model && model.lots && model.lots.length) {
                    model.lots.forEach(function(lot) {
                        if (lot.hasGuarantee && lot.hasGuarantee !== '0') {
                            $scope.hasGuarantee = true;
                        }
                    });
                }
            };

            $scope.$on('hasGuaranteeChanged', function () {
                $scope.ifModelHasGuarantee($scope.createTenderModel);
            });

            $scope.saveTenderWithCriterias = function () {
                $scope.$broadcast('saveCriterias', true, $scope.activeTab, $scope.createTenderModel.tenderCriteria);
            };
            $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias, updatedLots) {
                $scope.createTenderModel.tenderCriteria = updatedCriterias;
                $scope.createTenderModel.lots = updatedLots;
            });

            $scope.isEnquiryPeriodEnded = function () {
                return Date.parse($scope.createTenderModel.enquiryPeriod.endDate) < $scope.dateToday;
            };

            function checkMilestonesPercentageSumm(model) {
                return tenderFormService.checkMilestonesPercentageSumm(model);
            }

            function checkFeatureSum(model) {
                return addFeaturesService.checkFeatureSumCreateUpdate(model);
            }

            function changeItemClassifications(item) {
                if (item.classification && item.classification.code) {
                    item.classification.id = item.classification.code;
                }
            };

            $scope.showSignModal = function (isAllDocumentsExported) {
                $scope.tId = $scope.tenderDetailes.apiId;
                $scope.entityType = 'tender';
                if (!isAllDocumentsExported) {
                    abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                    return;
                }
                $timeout(function () {
                    $('#modalSignNewTender').modal('toggle');
                }, 1000);
            };

            $scope.$on('tenderSigned', function () {
                $('#modalSignNew').modal('hide');
                $('body').removeClass('modal-open');
                $('.modal-backdrop').remove();
                goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
            });
        }
    ]);
})();
;
angular.module('app').controller('updateTenderSignModalCtrl', [
    'goToTenderService',
    '$sessionStorage',
    function (goToTenderService, $sessionStorage) {
        
        $(document).on('hidden.bs.modal', '#SignModal', function (e) {
            var tenderId = $sessionStorage.updateTenderIdForRedirectModal;
            goToTenderService.redirect(undefined, tenderId);
        });
    }
]);;
(function () {
    var controllerId = 'widgetCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope',
        '$scope',
        '$compile',
        '$sce',
        '$timeout',
        'classificationSearchService', function (
            $rootScope,
            $scope,
            $compile,
            $sce,
            $timeout,
            classificationSearchService) {

            $scope.regexPattern = $rootScope.regex.number;
            $scope.edrpou = {
                parentCode: '',
                severalCodes: [""]
            };
            $scope.selectedCpvs = [];

            $scope.themes = {
                value: { name: 'Cerulean', url: 'styleLightShare', width: 1124 },
                bootstraps: [
                    { name: 'Slate', url: 'styleDarkShare', width: 1124 },
                    { name: 'Cyborg', url: 'bootstrap-cyborg.min', width: 1124 },
                    { name: 'United', url: 'bootstrap-united.min', width: 1124 },
                    { name: 'Darkly', url: 'bootstrap-darkly.min', width: 1150 },
                    { name: 'Flatly', url: 'bootstrap-flatly.min', width: 1150 },
                    { name: 'Lumen', url: 'bootstrap-lumen.min', width: 1124 },
                    { name: 'Simplex', url: 'bootstrap-simplex.min', width: 1124 },
                    { name: 'Spacelab', url: 'bootstrap-spacelab.min', width: 1124 },
                    { name: 'Yeti', url: 'bootstrap-yeti.min', width: 1124 },
                    { name: 'Superhero', url: 'bootstrap-superhero.min', width: 1124 },
                    { name: 'Cerulean', url: 'styleLightShare', width: 1124 }
                ]
            };

            $scope.resizerUrl = $scope.host + '/Scripts/iframeResizer.min.js';
            
            var protocol = document.location.protocol;
            var host = document.location.host;
            $scope.host = $sce.trustAsResourceUrl(protocol + '//' + host);
            $scope.url = '';

            //$scope.moduleCode = '<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script><script src="http://localhost:6234/Scripts/iframeResizer.min.js"></script><iframe src="http://localhost:6234?theme='+$scope.themes.value.url+'" width="1024" scrolling="no" frameborder="0"></iframe><script>$("iframe").iFrameResize({log: false})</script>';

            $scope.refreshModule = function () {
                $scope.themes.iFrame = angular.copy($scope.themes.value);
                $scope.parentCodeEDRPOU = angular.copy($scope.edrpou.parentCode);
                $scope.codeEDRPOUs = angular.copy($scope.edrpou.severalCodes);
                $scope.codeCPVS = getCpvsArra();

                var edrpou = ($scope.codeEDRPOUs && $scope.codeEDRPOUs instanceof Array && $scope.codeEDRPOUs.length > 0) ? '&edrpou=' + $scope.codeEDRPOUs.join(',') : '';
                var cpvs = ($scope.codeCPVS && $scope.codeCPVS instanceof Array && $scope.codeCPVS.length > 0) ? '&cpvs=' + $scope.codeCPVS.join(',') : '';

                var parentEdrpou = $scope.parentCodeEDRPOU ? '&parentEdrpou=' + $scope.parentCodeEDRPOU : '';

                    setTimeout(
                        function () {
                            abp.ui.clearBusy();
                            $scope.moduleCode = '<script src="' + $scope.host + '/Scripts/jquery-1.11.3.min.js"></script><script src="' + $scope.host + '/Scripts/iframeResizer.min.js"></script><iframe src="' + $scope.host + '?theme=' + $scope.themes.value.url + parentEdrpou + edrpou + cpvs + $scope.url +'" width="' + 1124 + '" scrolling="no" frameborder="0"></iframe><script>$("iframe").iFrameResize({log: false})</script>';
                        }, 1000
                    );
                
            };

            $scope.addAdditionalCodeEDRPOU = function () {
                $scope.edrpou.severalCodes.push('');
            };

            $scope.removeCodeEDRPOU = function (index) {
                $scope.edrpou.severalCodes.splice(index, 1);
            };

            $timeout(function () {
                $scope.refreshModule();
            }, 2000);

            //#region Init Classification
            $scope.cleareChildCpv = function (cpvs) {
                classificationSearchService.cleareChildCpv(cpvs, $scope.selectedCpvs);
            };

            $scope.initClassification = function () {
                classificationSearchService.initClassification($scope, $scope.selectedCpvs);
            }

            function getCpvsArra() {
                var codeCPVS = [];
                var i = 0;
                for (i; i < $scope.selectedCpvs.length; i++) {
                    codeCPVS.push($scope.selectedCpvs[i].code)
                }
                return codeCPVS;
            }
        }
    ]);
})();;
(function () {
    var controllerId = 'sidebarBaseCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope',
        '$scope',
        'abp.services.etender.user',
        'abp.services.etender.settings',
        'organizationDataService',
        '$location',
        '$window',
        'userDataService',
        '$localStorage',
        '$http',
        '$sessionStorage',
        'signalRService',
        'Idle',
        'siteSettingsService',
        function (
            $rootScope,
            $scope,
            user,
            settings,
            organizationDataService,
            $location,
            $window,
            userDataService,
            $localStorage,
            $http,
            $sessionStorage,
            signalRService,
            Idle,
            siteSettingsService)
        {
            $scope.ng_localStorage = $localStorage;
            $scope.ng_sessionStorage = $sessionStorage;
            $scope.counters = {};
            $scope.events = [];

            //scroll down animation
            $(window).scroll(function () {
                var scroll = $(window).scrollTop();
                if (scroll <= 1) {
                    $("#sidebar").removeClass("resize");
                }
                if (scroll > 1) {
                    $("#sidebar").addClass("resize");
                }
            });

            var vm = this;

            // color settings choose *******************************************
            if ($scope.ng_localStorage.isAuthorized && !$scope.ng_localStorage.theme) {
                settings.getUserSetting({ settingName: 'theme' })
                    .then(function (response) {
                        var data = response.data;
                        if (data.value === 'styleDarkShare') {
                            $localStorage.siteSettings = { css: 'styleDarkShare' };
                            $localStorage.theme = 'styleDarkShare';
                        } else {
                            $localStorage.siteSettings = { css: 'styleLightShare' };
                            $localStorage.theme = 'styleLightShare';
                        }
                    },
                        function () {
                            $localStorage.siteSettings = { css: 'styleLightShare' };
                            $localStorage.theme = 'styleLightShare';
                        });
            } else if ($scope.ng_localStorage.isAuthorized && $scope.ng_localStorage.theme) {
                $localStorage.theme = $scope.ng_localStorage.theme;
            } else {
                $localStorage.siteSettings = { css: 'styleLightShare' };
                $localStorage.theme = 'styleLightShare';
            }
            // color settings choose END ******************************************

            // curent sidebar menu distinguish ************************************
            $scope.url = $location.path();
            $rootScope.$on('$locationChangeSuccess', function (event) {
                $scope.url = $location.path();
            });
            // curent sidebar menu distinguish END ********************************
            $rootScope.logout = function () {
                if ($location.hash()) {
                    $location.hash('');
                }
                var response = $http.post('/Account/Logout');
                response.then(function (response) {
                    if (response) {
                        // signalRService.needToActivate(false);
                        var tabId = sessionStorage.tabId;
                        var tabsCount = localStorage.tabsCount;
                        $localStorage.$reset();
                        localStorage.clear();
                        $sessionStorage.$reset();
                        sessionStorage.clear();

                        sessionStorage.tabId = tabId;
                        localStorage.tabsCount = tabsCount;
                        $localStorage.isAuthorized = false;
                        $localStorage.siteSettings = { css: 'styleLightShare', currentSiteUrl: window.location.origin };
                        $rootScope.reloadGetScripts();
                        $location.path('/');
                        $rootScope.$broadcast('userLoggedOut')
                        //$window.location.reload();
                    }
                });
            };

            $rootScope.getNonAnsweredQuestionsCount = function () {
                var count = $scope.ng_localStorage.orgNonAnsweredQuestionsCount;
                if (isNaN(count))
                    return 0;
                return count;
            };
            $rootScope.getNonAnsweredComplaintsCount = function () {
                var count = $scope.ng_localStorage.orgNonAnsweredComplaintsCount;
                if (isNaN(count))
                    return 0;
                return count;
            };

            $scope.checkIfLogin = function () {
                jQuery(".mobile-header").removeClass("open");
                if (!$localStorage.username) {
                    $localStorage.siteSettings = {
                        css: 'styleLightShare'
                    };
                    $location.path('/login');
                    $window.location.reload();
                }
            };

            vm.changeMode = function (isProdMod) {
                if ($scope.ng_localStorage.isOrganizationProductionMode) {
                    var r;
                    if (isProdMod === true) {
                        r = confirm("Ви впевнені що хочете перейти в режим реальних торгів?");
                        if (!r) {
                            return;
                        }
                    } else {
                        r = confirm("Ви впевнені що хочете перейти в режим навчання?");
                        if (!r) {
                            return;
                        }
                    }
                    var input = {
                        isProductionMode: isProdMod
                    };
                    var changeMode = user.changeMode(input);
                    changeMode.then(function (response) {
                        vm.isProductionMode = response.data.isProductionMode;
                        $localStorage.isProdMode = isProdMod;
                        $scope.isProductionMode = isProdMod;
                        if (isProdMod) {
                            if (abp.setting.values.isProductionSite === 'True') {
                                if ($localStorage.isProductionMode && !$localStorage.isCustomer) {
                                    dataLayer.push({
                                        'event': 'virtualPageView',
                                        'virtualPageURL': '/toproductionmode',
                                        'virtualPageTitle': 'Move_to_production_mode'
                                    });
                                }
                            }

                            abp.notify.success('Ви перейшли в режим реальних торгів!');
                        } else {
                            abp.notify.success('Ви перейшли в режим навчання!');
                        }
                    });
                } else if (!$localStorage.isProductionMode) {
                    abp.notify.error('Ви не можете перейти у режим реальних торгів!');
                    $('#banChang').modal('show');
                }
                else {
                    organization.getOrganization({ tenantId: $scope.ng_localStorage.userTenantId })
                        .then(function (response) {
                            $localStorage.isProductionMode = response.data.isProductionMode;
                            $localStorage.organization = response.data;
                            return;
                        },
                            function () {
                                abp.notify.error('Немає організації за tenantId = ' + $scope.ng_localStorage.userTenantId);
                            });
                }
            };

            $rootScope.$watch('changeModeTrue', function (n, o) {
                if (n === o) return;
                if ($scope.ng_localStorage.isOrganizationProductionMode === false && $scope.isProductionMode === true) {
                    var input = {
                        isProductionMode: false
                    };
                    var changeMode = user.changeMode(input);
                    changeMode.then(function (response) {
                        vm.isProductionMode = response.data.isProductionMode;
                        $localStorage.isProdMode = false;
                        $scope.isProductionMode = false;
                    });
                }
                $rootScope.changeModeTrue = false;
            });

            $scope.redirect = function () {
                $location.path('/createProfile');

            }

            $scope.start = function () {
                // signalRService.needToActivate(true);
                if ($scope.ng_localStorage.userTenantId) {
                    if ($scope.ng_localStorage.userTenantId === null) {
                        $scope.redirect();
                        return;
                    };
                    getUserCounters(true);
                    $scope.generatMenus();

                } else {
                    userDataService.getData().then(function () {
                        if ($scope.ng_localStorage.userTenantId === null) {
                            $scope.redirect();
                            return;
                        }
                        getUserCounters(true);
                        $scope.generatMenus();
                        organizationDataService.getData();
                    });
                }
            };

            function isUserCountersFilled() {
                return !jQuery.isEmptyObject($localStorage.counters);
            }

            function getUserCounters(active) {
                if (isUserCountersFilled())
                    return;

                if (active) {
                    user.getUserCounters()
                        .then(function (response) {
                            if (!angular.equals($scope.counters, response.data)) {
                                console.log('User Counters:', response.data);
                                $localStorage.counters = response.data;
                            }
                            $scope.resetTimeOutSession();
                        }, function (response) {
                            console.log(response);
                        });


                } else if ($localStorage.counters) {
                    delete $localStorage.counters;
                }
            };

            $scope.goTo = function (url, active) {
                if (active) return;
                window.location = url;
            };

            // session time out funcs


            $scope.$on('IdleEnd', function () {
                console.log('Start signalR');
                // signalRService.needToActivate(true);
            });

            $scope.$on('IdleTimeout', function () {
                // signalRService.needToActivate(false);
                console.log('Stop signalR');
            });

            $scope.$on('resetTimeOutSession', function () {
                Idle.watch();
            });

            $scope.resetTimeOutSession = function () {
                Idle.watch();
            };

            $rootScope.profileUrls = { tempUrl: '/App/Main/base/views/profile/organizationDetailes.html' };
        }


    ]).config(['IdleProvider', 'KeepaliveProvider', function (IdleProvider, KeepaliveProvider) {
        // configure Idle settings
        IdleProvider.idle(300); // in seconds
        IdleProvider.timeout(5); // in seconds
        KeepaliveProvider.interval(2); // in seconds
    }])
})();
;
(function () {
    'use strict';
    angular
        .module('app')
        .service('appExt', appExt);
    function appExt() {
        var viewFolder = "/Special/views";
        var baseViewFolder = '/App/Main/Base/views';
        var jsonForm = [
            '/Bundles/App/jsonform.js'
        ];
        this.stateProviderExtStates =
            [
                //{
                //    state: 'tenderDetailes',
                //    url: '/tenderDetailes/{tId}',
                //    templateUrl: viewFolder + '/tenders/tenderDetailes.html',
                //},
            {
                    state: 'addComplaint',
                    url: '/addComplaint/{tId}',
                    templateUrl: viewFolder + '/tenders/addComplaint.html'
                }, {
                    state: 'ClaimsComplaints',
                    url: '/ClaimsComplaints',
                    templateUrl: viewFolder + '/complaint/complaintTable.html'
                }, {
                    state: 'UserData',
                    url: '/UserData',
                    templateUrl: viewFolder + '/profile/userDetailes.html'
                }, {
                    state: 'UserSettings',
                    url: '/UserSettings',
                    templateUrl: viewFolder + '/profile/userSettings.html'
                }, {
                    state: 'AuthorizedBodies',
                    url: '/AuthorizedBodies',
                    templateUrl: viewFolder + '/profile/authorizedPersons.html'
                }, {
                    state: 'MyEmailGroups',
                    url: '/MyEmailGroups',
                    templateUrl: viewFolder + '/profile/emailGroups.html'
                }, {
                    state: 'updateTenderAbove',
                    url: '/updateTenderAbove/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderAbove.html'
                }, {
                    state: 'updateTenderAboveEu',
                    url: '/updateTenderAboveEu/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderAboveEu.html'
                }, {
                    state: 'updateTenderLimited',
                    url: '/updateTenderLimited/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderLimited.html'
                }, {
                    state: 'updateTenderLimitedReporting',
                    url: '/updateTenderLimitedReporting/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderLimitedReporting.html'
                }, {
                    state: 'updateTenderDefense',
                    url: '/updateTenderDefense/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderDefense.html'
                }, {
                    state: 'updateTenderSimpleDefense',
                    url: '/updateTenderSimpleDefense/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderSimpleDefense.html'
                }, {
                    state: 'updateTenderDialogue',
                    url: '/updateTenderDialogue/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderDialogue.html'
                }, {
                    state: 'updateTenderDialogueStage2',
                    url: '/updateTenderDialogueStage2/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderDialogueStage2.html'
                }, {
                    state: 'updateTenderDialogueEu',
                    url: '/updateTenderDialogueEu/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderDialogueEu.html'
                }, {
                    state: 'updateTenderDialogueEuStage2',
                    url: '/updateTenderDialogueEuStage2/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderDialogueEuStage2.html'
                }, {
                    state: 'updateTenderEsco',
                    url: '/updateTenderEsco/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderEsco.html'
                }, {
                    state: 'updateTenderFramework',
                    url: '/updateTenderFramework/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderFramework.html'
                },{
                    state: 'updateTenderPriceQuotation',
                    url: '/updateTenderPriceQuotation/{tId}',
                    templateUrl: viewFolder + '/tenders/updateTenderPriceQuotation.html'
                },{
                    state: 'createTenderAbove',
                    url: '/createTenderAbove',
                    templateUrl: viewFolder + '/tenders/createTenderAbove.html'
                }, {
                    state: 'createTenderAboveFromTemplate',
                    url: '/createTenderAbove/{tId}',
                    templateUrl: viewFolder + '/tenders/createTenderAbove.html'
                }, {
                    state: 'createTenderAboveEu',
                    url: '/createTenderAboveEu',
                    templateUrl: viewFolder + '/tenders/createTenderAboveEu.html'
                }, {
                    state: 'createTenderPriceQuotation',
                    url: '/createTenderPriceQuotation',
                    templateUrl: viewFolder + '/tenders/createTenderPriceQuotation.html'
                }, {
                    state: 'createTenderAboveEuFromTemplate',
                    url: '/createTenderAboveEu/{tId}',
                    templateUrl: viewFolder + '/tenders/createTenderAboveEu.html'
                }, {
                    state: 'createTenderLimited',
                    url: '/createTenderLimited',
                    templateUrl: viewFolder + '/tenders/createTenderLimited.html'
                }, {
                    state: 'createTenderLimitedQuick',
                    url: '/createTenderLimitedQuick',
                    templateUrl: viewFolder + '/tenders/createTenderLimitedQuick.html'
                }, {
                    state: 'createTenderLimitedReporting',
                    url: '/createTenderLimitedReporting',
                    templateUrl: viewFolder + '/tenders/createTenderLimitedReporting.html'
                }, {
                    state: 'createTenderDefense',
                    url: '/createTenderDefense',
                    templateUrl: viewFolder + '/tenders/createTenderDefense.html'
                }, {
                    state: 'createTenderSimpleDefense',
                    url: '/createTenderSimpleDefense',
                    templateUrl: viewFolder + '/tenders/createTenderSimpleDefense.html'
                }, {
                    state: 'createTenderDialogue',
                    url: '/createTenderDialogue',
                    templateUrl: viewFolder + '/tenders/createTenderDialogue.html'
                }, {
                    state: 'createTenderDialogueEu',
                    url: '/createTenderDialogueEu',
                    templateUrl: viewFolder + '/tenders/createTenderDialogueEu.html'
                }, {
                    state: 'createTenderEsco',
                    url: '/createTenderEsco',
                    templateUrl: viewFolder + '/tenders/createTenderEsco.html'
                }, {
                    state: 'register',
                    url: '/register',
                    templateUrl: viewFolder + '/auth/registerNew.html'
                }, {
                    state: 'activate',
                    url: '/activate/{userId}/{code:.*}',
                    templateUrl: viewFolder + '/auth/activate.html'
                }, {
                    state: 'createProfile',
                    url: '/createProfile',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/profile/createProfileNew.html');
                    }]
                    //templateUrl: viewFolder + '/profile/createProfileNew.html'
                }, {
                    state: 'OrganizationData',
                    url: '/OrganizationData',
                    templateUrl: viewFolder + '/profile/organizationDetailes.html'
                }, {
                    state: 'closeFrameworkAgreementUA',
                    url: '/createTenderFramework',
                    templateUrl: viewFolder + '/tenders/createTenderFramework.html'
                }, {
                    state: 'createCloseFrameworkAgreementSelectionUA',
                    url: '/createCloseFrameworkAgreementSelectionUA/{tId}/{aId}',
                    templateUrl: viewFolder + '/tenders/createAgreementSelectionUa.html'

                }, {
                    state: 'updateCloseFrameworkAgreementSelectionUA',
                    url: '/updateCloseFrameworkAgreementSelectionUA/{tId}',
                    templateUrl: viewFolder + '/tenders/updateAgreementSelectionUa.html'

                },{
                    state: 'MyTenders',
                    url: '/MyTenders',
                    //templateUrl: baseViewFolder + '/myTenders/myTenders.html',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/App/Main/Base/views/myTenders/myTenders.html');
                    }],
                    controller: 'myTendersProzorroCtrl'
                }, {
                    state: 'BankOperations',
                    url: '/BankOperations',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/profile/bankOperations.html');
                    }],
                    //templateUrl: viewFolder + '/profile/bankOperations.html'
                }, {
                    state: 'dozorroReview',
                    url: '/dozorroReview/{tId}/{fId}',
                    templateUrl: viewFolder + '/dozorro/dozorroReview.html',
                    lazyLoadResources: jsonForm
                }, {
                    state: 'ChoosedTenders',
                    url: '/ChoosedTenders',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/Special/views/profile/choosedTenders.html');
                    }]
                }, {
                    state: 'contracting',
                    url: '/contracting/{id}',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~/App/Main/Base/views/contracting/contracting.html');
                    }],
                    //templateUrl: baseViewFolder + '/contracting/contracting.html'
                }, {
                    state: 'invoice',
                    url: '/invoice',
                    templateUrl: baseViewFolder + '/invoice/invoice.html'
                }, {
                    state: 'bankOperationsTenderBids',
                    url: '/bankOperationsTenderBids',
                    templateUrl: viewFolder + '/profile/bankOperationsTenderBids.html'
                }, {
                    state: 'toDoTenders',
                    url: '/toDoTenders',
                    templateProvider: ['$templateCache', function ($templateCache) {
                        return $templateCache.get('~' + viewFolder + '/toDoTenders/toDoTenders.html');
                    }],

                }, {
                    state: 'divisions',
                    url: '/divisions',
                    templateUrl: viewFolder + '/profile/divisions.html'
                }, {
                    state: 'OrganizationSettings',
                    url: '/OrganizationSettings',
                    templateUrl: viewFolder + '/profile/organizationSettings.html'
                }, {
                    state: 'agreementEdit',
                    url: '/agreementEdit/{aId}',
                    templateUrl: viewFolder + '/agreement/agreementEdit.html'
                }, {
                   state: 'agreementDetailes',
                   url: '/agreementDetailes/{aId}',
                   templateUrl: viewFolder + '/agreement/agreementDetailes.html'
                }, {
                state: 'agreementChangePreview',
                url: '/agreementChangePreview/{aId}',
                templateUrl: viewFolder + '/agreement/agreementChangePreview.html'
                }

            ];
    }
})();;
angular.module('app').directive('additionalContactPoints', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        //templateUrl: '/Special/directives/contactPoint/additionalContactPoints.html',
        template: $templateCache.get('~/Special/directives/contactPoint/additionalContactPoints.html'),
        scope: {
            formname: '=',
            data: '=',
            condition: '=',
            showOnCreateOnly: '=',
        },
        controller: [
            '$scope',
            'tenderFormService',
            'lookupService',
            function (
                $scope,
                tenderFormService,
                lookupService) {

                $scope.vm = {
                    addContactPoint: addContactPoint,
                    removeContactPoint: removeContactPoint,
                    changeLang: changeLang,
                    languages: lookupService.languages,
                    isHide: isHide
                }
                var vm = $scope.vm;

                function addContactPoint() {
                    tenderFormService.addContactPoint(vm, $scope.data);
                }

                function removeContactPoint(ind) {
                    tenderFormService.removeContactPoint(ind, $scope.data);
                }

                function changeLang(cp) {
                    cp.language = cp.sLang.code;
                }

                function isHide() {
                    return $scope.condition === 'update' && $scope.showOnCreateOnly === true;
                }
            }]
    };
}]);
;
angular.module('app').directive('agreementChange', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/agreements/agreementChange.html',
        scope: {
            data: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            'agreementService',
            function (
                $scope,
                $localStorage,
                agreementService) {

                $scope.ng_localStorage = $localStorage;
                $scope.vm = $scope;

                $scope.setRightDataFormat = function (data) {
                    return agreementService.setRightDataFormat(data);
                }

            }]
    };
});;
angular.module('app').directive('agreementChangeForm', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/agreements/agreementChangeForm.html',
            scope: {
                agreement: '=',
                changeForm: '=',
                changingData: '=',
                ifAnyFeel: '&'
    },
        controller: [
            '$scope',
            '$localStorage',
            '$timeout',
            'agreementService',
            function (
                $scope,
                $localStorage,
                $timeout,
                agreementService) {

                $scope.ng_localStorage = $localStorage;
                $scope.vm = $scope;

                if ($scope.changingData.modifications &&
                    $scope.changingData.modifications.length > 0) {
                    importDataFromModifications();
                } else {
                    $scope.changingData.modifications = [];
                    $scope.showForm = true;
                }

                function importDataFromModifications() {
                    if ($scope.changingData.modifications[0].contractId) {
                        setIfContractId();
                        return;
                    }
                    var modifiCopy = angular.copy($scope.changingData.modifications);
                    $scope.changingData.modifications = [];
                    var iI = 0;
                    var iLength = $scope.agreement.items.length;
                    for (iI; iI < iLength; iI++) {
                        var item = $scope.agreement.items[iI];
                        var i = 0;
                        var mLength = modifiCopy.length;

                        for (i; i < mLength; i++) {
                            var modifi = modifiCopy[i];
                            if (modifi.itemId === item.id) {
                                setModifi(modifi, iI);
                            }
                        }
                    }
                    $scope.hideEmptyItem = true;
                    $scope.showForm = true;
                }

                function setIfContractId() {
                    $scope.agreement.provider = $scope.changingData.modifications[0].contract;
                    $scope.showForm = true;
                }

                function setModifi(modifi, iI) {
                    if (modifi.factor) modifi.factorP = setRightDataFormat(modifi.factor);
                    $scope.changingData.modifications[iI] = modifi;
                }


                function setRightDataFormat(data) {
                    return agreementService.setRightDataFormat(data);
                }

                $scope.excludUnsuccessful = function (contracts) {
                    var data = [];
                    var i = 0;
                    var lContracts = contracts.length;
                    for (i; i < lContracts; i++) {
                        var contract = contracts[i];
                        if (contract.status.value !== 'unsuccessful' && contract.status.value !== 'unsuccessfulMode')
                            data.push(contract);
                    }
                    return data;
                }

            }]
    };
});;
angular.module('app').directive('agreementContractData', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/agreements/agreementContractData.html',
        scope: {
            data: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            function (
                $scope,
                $localStorage) {
                $scope.ng_localStorage = $localStorage;
            }]
    };
});;
angular.module('app').directive('agreementData', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/agreements/agreementData.html',
        scope: {
            data: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            function (
                $scope,
                $localStorage) {
                $scope.ng_localStorage = $localStorage;
            }]
    };
});;
angular.module('app').directive('agreementUpdateForm', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/agreements/agreementUpdateForm.html',
        scope: {
            data: '=',
            vm: '=',
            descrInputName: '='
        },
        controller: [
            '$scope',
            '$localStorage',
            function (
                $scope,
                $localStorage) {

                $scope.ng_localStorage = $localStorage;

                $scope.fileUploadObj = {
                    agreementId: $scope.vm.agreement.id
                };
                $scope.documentsToAddFields = { data: $scope.fileUploadObj};   
            }]
    };
});;
angular.module('app')
    .directive('formAgreementSelectionUa', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/formAgreementSelectionUa.html',
            scope: {
                formname: '=',
                data: '=',
                condition: '='
            },
            controller: [
                '$localStorage',
                '$scope',
                'datesHelperService',
                'tenderHelperService',
                'tenderFormMinStepService',
                function (
                    $localStorage,
                    $scope,
                    datesHelperService,
                    tenderHelperService,
                    tenderFormService) {

                    $scope.ng_localStorage = $localStorage;

                    if ($localStorage.isProdMode) {
                        if ($scope.condition === 'create') {
                            var startDate = new Date();
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 4);
                            $scope.calendarMinDate = minDate;
                        } else {
                            $scope.$watch('data.enquiryPeriod.endDate', function (endDate) {
                                var startDate = new Date(endDate);
                                var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 4);
                                $scope.calendarMinDate = minDate;
                            });
                        }
                    }

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };

                    $scope.checkTenderPeriod = function () {
                        if ($scope.condition == 'update') return true;
                        if (!$scope.data.tenderPeriod) return false;

                        var tenderPeriod = $scope.data.tenderPeriod;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                tenderPeriod === null ? null : tenderPeriod.endDate);
                    }
                    $scope.checkTenderPeriodForUpdate = function () {
                        var validationDays = 4; //http://services.e-tender.biz/jira/browse/ET-16707 только для вот этого таска, вместо этой переменной было - $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit
                        if ($scope.condition == 'create') return true;
                        if (!$scope.data.tenderPeriod) return false;
                        if (tenderHelperService.diffBetweenDates(validationDays, $scope.data.tenderPeriod.endDate)) {
                            $scope.formname.$valid = true;
                            return true;
                        } else {
                            $scope.formname.$valid = false;
                            return false;
                        }
                    }
                    $scope.changeMinimalStep = function(lot) {
                        tenderFormService.changeMinimalStep(lot);
                    }
                    $scope.changeMinimalStepPer = function(lot) {
                        tenderFormService.changeMinimalStepPer(lot);
                    }

                    $scope.changeGuarantee = function(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    $scope.isStepValid = function (lot) {
                        var isValid = false;
                        if (lot && lot.minimalStep && typeof lot.minimalStep.amount === "string") {
                            lot.minimalStep.amount = Number(lot.minimalStep.amount);
                        }
                        if (lot && lot.minimalStep && lot.minimalStep.amount && lot.value.amount) {
                            var amount = parseFloat(lot.value.amount);
                            var step = parseFloat(lot.minimalStep.amount);
                            if (step <= amount) {
                                if (step != 0) {
                                    isValid = true;
                                }
                            } else return false;
                        };
                        return isValid;
                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };



                    //$scope.setFeatureValue = function(f) {
                    //    return addFeaturesService.setFeatureValue(f);
                    //}

                    //$scope.checkFeatureSum = function (f) {
                    //    return addFeaturesService.checkFeatureSum(f);
                    //}

                    //$scope.checkLotFeatureSum = function (lot, data) {
                    //    return addFeaturesService.checkLotFeatureSum(lot, data);
                    //}

                    //$scope.checkFeaturesValue = function (f, data) {
                    //    return addFeaturesService.checkFeaturesValue(f, data);
                    //}
                    
                }]
        };
    });
;
angular.module('app').directive('funder', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        // templateUrl: '/Special/directives/tender/createTender/funder.html',
        template: $templateCache.get('~/Special/directives/tender/createTender/funder.html'),
        scope: {
            data: '=',
            isRequired: '=',
            formName: '=',
            vm: '='
        },
        controller: [
            '$scope',
            'abp.services.etender.reference',
            function (
                $scope,
                reference) {
                $scope.funders = [];
                $scope.funder = {};

                if (!$scope.vm) $scope.vm = {};

                $scope.vm.getFunders = function (funderId) {
                    $scope.getFunders(funderId);
                }

                $scope.getFunders = function (funderId) {
                    if ($scope.funders.length > 0) return;
                    var getAppFunders = reference.getFunders();
                    getAppFunders.then(function (res) {
                        $scope.funders = res.data.funders;
                        if (funderId) setFunderFromTemplate(funderId);
                    }, function (error) {
                        console.log(error);
                    });
                }

                function setFunderFromTemplate(funderId) {
                    var i = 0;
                    for (i; i < $scope.funders.length; i++) {
                        if ($scope.funders[i].id === funderId)
                            $scope.funder.selected = $scope.funders[i];
                    }
                }

                $scope.funder.selected = $scope.data;
                $scope.$watch('funder.selected', function () {
                    $scope.data = $scope.funder.selected;
                });
                $scope.$watch('data', function () {
                    $scope.funder.selected = $scope.data;
                });

                $scope.$on('clearFunder', function (events, args) {
                    if (args)
                        $scope.funder.selected = 'undefined';
                });
            }]
    };
}]);;
angular.module('app').directive('itemAdditionalClassification', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('itemAdditionalClassification from cache'),
        scope: {
            formName: '=',
            data: '=',
            item: '=',
            iIndex: '=',
            lIndex: '=',
            openClassificationModal: '&',
            checkDate: '&',
            classification: '=',
            required: '=',
            isDisabled: '='
        }, controller: ['$scope', function ($scope) {
            $scope.date2017 = new Date('2017/01/01');
        }]
    };
}]);;
angular.module('app').directive('itemClassification', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('itemClassification from cache'),
        scope: {
            formName: '=',
            data: '=',
            item: '=',
            index: '=',
            lIndex: '=',
            isEditMode: '=',
            notExport: '=',
            openClassificationModal: '&',
            classification: '=',
            isDisabled: '='
        },
        controller: ['$scope', '$modal', '$timeout',
            function ($scope, $modal, $timeout) {

                var idsToOpenEditCpv = [
                    'cf5d54610a14495f8a8642446ac1c5b7',
                    'dda4552585024ac19edaf1c97e942013',
                    '13b6b97dd5404b3fa045ecb0b2e762ba',
                    '1d4fae1b71b8496e81496b4565eeea18',
                    '248dd67d1aad455a9fcb0a3480e58297',
                    '33ba28a0af4746db93ce60e72e1c0ca8',
                    '6801e4beb1b14b6aa66cb1f9623a12bd',
                    '6cf6511a02e943baa8fa0ef718c02777',
                    '7e608c1d20124a66bc3ab47dbd769f2c',
                    '7780ea9d9e3644a89038c8f6b3c58f84',
                    '9a585b6e920b4c14802c9997e1eae5a7',
                    'c9783a7eed5240ce8dea95ae5340cd20',
                    'c9e987dedff440cb917d98864e60dea4',
                    'dfdd7c260e554a2b8c6a09f5354f93d6',
                    'ff6708c2a83f45939382fc86a9e65c54',
                    '9ba294a1b3a749328abeeb7c5f3816ce',
                    'c8d5e3680811472f90fbd8075e2d8054',
                    'd32de91e65b345b49bf66eba768c7244',
                    'd908dd1383fe4aa0b9423073162e8ae2',
                    'f8a7545926874f8aaff0f70893df2aa0',
                    'fbfd709a770647e383384069453560ce',
                    'fd69c1fbec03453ebd186cd48d1c50b5',
                    '9f0e6f6a8cbe40d58939be08a05508be',
                    'a09a8322fa584341b528b0354b0e5083',
                    'a2ba8999c74045d280e9ce6b8b5c28c8',
                    'b29295de7fef4bdca692ff9cd2814f37',
                    'cd18f452493d42c89e247e1709e925e9',
                    '8e56b952da44409cb3ac29d9cd0d19dc',
                    'cbf64210281845689942a9174a40f8ae',
                    'e2fc246970e043d6887e068d895021ef',
                    'fa4894d4b41b4cddb34f3c121674467a',
                    '0b0c788773744a57ac63267f0cc25ece',
                    '0c07782f03464df29399282f024d1d30',
                    '1ae8e7215045434ea980b52ce4b84f3a',
                    '1bf2ddb1f117443fa62e5590fb397861',
                    '2598304c41024264a23ed7035f7c08c1',
                    '324e6ba0c55a463fada1d54afb513204',
                    '11ce509ac8a84d0da63c882595e9b8d6',
                    '22f6f70ad0d645798ef71ec4126b7e23',
                    '2f6a0ba84b0647f3b0a96d2ff31f45d0',
                    '304c6a1e175940b0b787cefd04fb41e6',
                    '3a08dedb1d1145fa828df4c0a4a2cf88',
                    '66ee9e1791c94e2c8b736bc6b69f831d',
                    '82e2043210fe435b9672be1dd81f3a19',
                    '88152629490f454495389acf2b45bf1a',
                    'ccbad9cae7a348faac0689babc0b5e3d',
                    '079187eed7bc45d98630daec14f2fc45',
                    '5d3aa466eaa34c42a03f71a05a076fd5',
                    '7d595043a1d14411b86fd3ea7582a88d',
                    '9435320211c442149cd389871815160b',
                    'bfda2768cd9f4278a03a2209408ecb99',
                    'aac042fa66f64f04a00fec2c2cb80f9b',
                    'c312684c7913444781a2e0ed6c6c6435',
                    'c515ed8f1c734823b6e235d5a6207bd4',
                    'daf9762af0c840d8b0a0af1d45bf3abe',
                    'e86cc97a448541388192a57bf9cf7f0e',
                    'cc8bf8f08a73427a8be89c6fada57448',
                    '27c9f51c8e6c4083a0c75abef9b7e87c',
                    '3a5771dc97914ab08b301a19587202c0',
                    '44025383723446ca9ec39661ea568314',
                    '5018099a69204ee287208d0b9f4836a7',
                    '60789fc333ef4e1187c679e811a0017c',
                    '91571ae7dad04fb383892e2827c3f415',
                    'd8d924469dae44b8b932cd274a00239a',
                    'f937e35ae494493d80f76013e21703b7',
                    '03513b59e13044ada7b68685fefb9003',
                    '18c0b805aac2499996ca4a5ef9a022ef',
                    '19854c82b72c47459fc15998a1fa3b87',
                    '1abcfb62779544ccab5d482348c973a0',
                    '2a6285746a6149c7af5ac112427ae2f5',
                    '33d35bae6030415fbfe0adbce7671b18',
                    '4cd98190db9c4a94aee5ccd609d6b660',
                    '6f30a3c278194d2c8f81bd238b56f9f0',
                    '8492c0a6d71945fd841e03302853f59f',
                    'b3ccc1f2227d4e8bab317d5942cfa0da',
                    'ecca2863b6c54d9ab66110a80766ce28',
                    'ff49f5d392b6404b942e8a6f64f94e62',
                    '1568b9e6b8ad4665a52eed8f6cf026e6',
                    '17fe9f92d4ae4b7e8cc136dde1a264f3',
                    '3ac911789d134ede96825bcb65e2ce92',
                    '6bddff1a750243a193c686bc0f50dac5',
                    '7a4c76bf24be448fb3fa6bb0ac7c5545',
                    '86e5f878b92a47e187c586294aa4c41f',
                    '59b031a85a644f9aa1c2a62eaee4b2f4',
                    'ca09562566764b03b3b5385853079467',
                    'dded1bad77b44edcb68577e8457e64a5',
                    'a7ac79830be4476c934cac7eb8f73ac6',
                    'c711867bd6a3477bbc16c137935781e4',
                    'cb65f57a4eb942688fe5229d4605e7af',
                    'fcce9d8e76c94bda9e5b392d34c67ddb',
                    '0c9150ed12634a00ab934e8a94b10aad',
                    '4bf9380830b24ff294b721fdb9a49488',
                    '5b3f614150f94a72b4f9351c0050b22b',
                    '681ad12dbcbe48d1826f27ee80ecd91d',
                    '85fe5e1d71094702b7137996e4700f9a',
                    'ca97573bf01242258526b4c53c415209',
                    'f1106dd715ca4fa1a5ebe07deb5b67cf',

                    'e50bbd8d803844d9b2e776add18ed31b', // QA
                    '025fc23f385d4ba2853cac558635582a', // QA
                    '87c7a4a0e2d44b1bafd63d4fff7ebd31', // QA
                    'c3aa7f219aa541a5814a63ba52f95c4b', // QA
                    '34579d97efe143ac98275f415bdb78fc'  // QA
                ];

                var roadsListFromCpv = [
                    '3492', '3499', '4500', '4521',
                    '4522', '4523', '4531', '4534',
                    '4545', '5023', '5070', '6371',
                    '7124', '7130', '7132', '7133',
                    '7135', '7151', '7152', '7153',
                    '7163', '7311'
                ];

                var gmdnsListFromCpv = [
                    '3311', '3312', '3313', '3315',
                    '3316', '3317', '3318', '3319',
                    '3369', '3371', '3372', '3373',
                    '3374', '3375', '3377', '3379',
                    '3391', '3392', '3393', '3394',
                    '3395', '3397', '3841', '3842',
                    '3843', '3851', '3852', '3894',
                    '3895'
                ];

                $scope.showAddClassificationGmdns = function (lotInd, itemInd) {
                    $scope.lotInd = lotInd;
                    $scope.itemInd = itemInd;
                    $modal({
                        show: true,
                        controller: 'additionalClassificationGmdnsCtrl',
                        templateUrl: '/Special/views/tenders/additionalClassification.html',
                        title: 'Класифікатор медичних виробів НК 024:2019',
                        scope: $scope
                    });
                };

                $scope.showAddClassificationRoads = function (lotInd, itemInd) {
                    $scope.lotInd = lotInd;
                    $scope.itemInd = itemInd;
                    $modal({
                        show: true,
                        controller: 'additionalClassificationRoadsCtrl',
                        templateUrl: '/Special/views/tenders/additionalClassification.html',
                        title: 'Індекс автомобільних доріг',
                        scope: $scope
                    });
                };

                $scope.showAddClassificationInn = function (lotInd, itemInd) {
                    $scope.lotInd = lotInd;
                    $scope.itemInd = itemInd;
                    $modal({
                        show: true,
                        controller: 'additionalClassificationInnCtrl',
                        templateUrl: '/Special/views/tenders/additionalClassification.html',
                        title: 'МНН',
                        scope: $scope
                    });
                };

                $scope.showAddClassificationAtc = function (lotInd, itemInd) {
                    $scope.lotInd = lotInd;
                    $scope.itemInd = itemInd;
                    $modal({
                        show: true,
                        controller: 'additionalClassificationAtcCtrl',
                        templateUrl: '/Special/views/tenders/additionalClassification.html',
                        title: 'АТХ',
                        scope: $scope
                    });
                };

                function getFirstNumbersOfCode(classifi, value) {
                    if (classifi.code) {
                        return classifi.code.substring(0, value);
                    }
                    else if (classifi.id && typeof classifi.id === 'string') {
                        return classifi.id.substring(0, value);
                    }
                    else { return false; }
                };

                $scope.notCorrectClassification = function (classifi, inputName) {
                    var code = Number(getFirstNumbersOfCode(classifi, 3));
                    if (!code ||
                        !$scope.data.mainProcurementCategory ||
                        !$scope.data.mainProcurementCategory.value ||
                        $scope.data.mainProcurementCategory.value === "") {
                        // $scope.formName.$setValidity(inputName, true);
                        return false;
                    }

                    if (30 <= code && code <= 449) {
                        if ($scope.data.mainProcurementCategory.value === 'goods') {
                            // $scope.formName.$setValidity(inputName, true);
                            return false;
                        }
                        return true;
                    } else if (450 <= code && code <= 454) {
                        if ($scope.data.mainProcurementCategory.value === 'works') {
                            // $scope.formName.$setValidity(inputName, true);
                            return false;
                        }
                        return true;
                    } else {
                        if ($scope.data.mainProcurementCategory.value === 'services') {
                            // $scope.formName.$setValidity(inputName, true);
                            return false;
                        }
                        // $scope.formName.$setValidity(inputName, false);
                        return true;
                    }

                }

                $scope.showGmdnsClassifications = function (classifi) {
                    var code = getFirstNumbersOfCode(classifi, 4);
                    if (!code || $scope.item.additionalClassificationInn) return false;

                    var i = 0;
                    var len = gmdnsListFromCpv.length;
                    for (i; i < len; i++) {
                        if (gmdnsListFromCpv[i] === code) {
                            $scope.setAdditionalclassification();
                            return true;
                        }
                    }
                    if ($scope.item.additionalClassificationGmdns)
                        delete $scope.item.additionalClassificationGmdns;
                    return false;
                };

                $scope.showRoadsClassifications = function (classifi) {
                    var code = getFirstNumbersOfCode(classifi, 4);
                    if (!code) return false;

                    var i = 0;
                    var len = roadsListFromCpv.length;
                    for (i; i < len; i++) {
                        if (roadsListFromCpv[i] === code) {
                            $scope.setAdditionalclassification();
                            return true;
                        } 
                    }
                    if ($scope.item.additionalClassificationRoads)
                        delete $scope.item.additionalClassificationRoads;
                    return false;
                };

                $scope.showInnClassifications = function (classifi) {
                    var code = getFirstNumbersOfCode(classifi, 3);
                    if (!code || $scope.item.additionalClassificationGmdns) return false;

                    if (code === '336') {
                        $scope.setAdditionalclassification();
                        return true;
                    } else {
                        if ($scope.item.additionalClassificationInn)
                            delete $scope.item.additionalClassificationInn;
                        if ($scope.item.additionalClassificationAtc)
                            delete $scope.item.additionalClassificationAtc;
                    }
                    return false;
                };

                $scope.setAdditionalclassification = function () {
                    var i = 0;
                    for (i; i < $scope.item.additionalClassifications.length; i++) {
                        if ($scope.item.additionalClassifications[i].scheme &&
                            $scope.item.additionalClassifications[i].scheme === 'INN') {
                            $scope.item.additionalClassificationInn = angular.copy($scope.item.additionalClassifications[i]);
                            $scope.item.additionalClassifications.splice(i, 1);
                        } else if (
                            $scope.item.additionalClassifications[i].scheme &&
                            $scope.item.additionalClassifications[i].scheme === 'ATC') {
                            $scope.item.additionalClassificationAtc = $scope.item.additionalClassifications[i];
                            $scope.item.additionalClassifications.splice(i, 1);
                        } else if (
                            $scope.item.additionalClassifications[i].scheme &&
                            $scope.item.additionalClassifications[i].scheme === 'UA-ROAD') {
                            $scope.item.additionalClassificationRoads = $scope.item.additionalClassifications[i];
                            $scope.item.additionalClassifications.splice(i, 1);
                        } else if (
                            $scope.item.additionalClassifications[i].scheme &&
                            $scope.item.additionalClassifications[i].scheme === 'GMDN') {
                            $scope.item.additionalClassificationGmdns = $scope.item.additionalClassifications[i];
                            $scope.item.additionalClassifications.splice(i, 1);
                        }
                    }
                }

                $scope.ifNeedRequiredInn = function (classifi) {
                    var code;
                    if (classifi.code) { code = classifi.code; }
                    else if (classifi.id) { code = classifi.id; }
                    else { return false; }
                    if (code == '33600000-6') return true;
                    return false;
                }

                $scope.isSpecialTender = function (id) {
                    for (var i = 0; i <= idsToOpenEditCpv.length; i++) {
                        if (idsToOpenEditCpv[i] === id) return true;
                    };
                    return false;
                }

                $scope.setFormValid = function (id, inputName) {
                    $timeout(function () {
                        if (!$scope.formName[inputName]) return; // @hack @todo figure-out why $scope.formName[inputName] could be undefined

                        if (!id) $scope.formName[inputName].$setValidity('include', false);
                        if (id) $scope.formName[inputName].$setValidity('include', true);
                    }, 2000);
                }


            }]
    };
}]);;
angular.module('app').directive('itemDelivery', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/createTender/itemDelivery.html',
        scope: {
            formName: '=',
            data: '=',
            item: '=',
            index: '=',
            lIndex: '=',
            checkDate: '&',
            isDisabled: '='
        }, controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
            $scope.dateRegex = $rootScope.regex.date;
            $scope.now = new Date();
        }]
    };
});;
angular.module('app').directive('milestoneCodeType', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('~/Special/directives/tender/createTender/milestoneCodeType.html'),
        scope: {
            formName: '=',
            data: '=',
            isEditMode: '=',
            isRequired: '=',
            searchFormLocation: '=',
            tenderFormLocation: '='
        }, controller: [
            '$scope',
            '$localStorage',
            'requestService', function (
                $scope,
                $localStorage,
                requestService) {

                $scope.ng_localStorage = $localStorage;
                requestService.getMilestoneCodeType().then(function (response) {
                    $scope.milestoneCodeType = response.data.codeType;
                });
                
                if ($scope.searchFormLocation) {
                    $(".leftBlockProc").addClass("col-sm-4");
                    $(".rightBlockProc").addClass("col-sm-8");
                }
                if ($scope.tenderFormLocation) {
                    $(".leftBlockProc").addClass("col-sm-3");
                    $(".rightBlockProc").addClass("col-sm-9");
                    $(".leftBlockProc .titleProc").addClass("fwb");
                    $(".rightBlockProc .controls").addClass("w170");
                }
            }]
    };
}]);;
angular.module('app').directive('milestoneSet', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('milestoneSet from cache'),
        scope: {
            formName: '=',
            data: '=',
            milestoneSector: '='
        }, controller: [
            '$scope',
            'abp.services.etender.reference',
            '$localStorage',
            'referenceService',
            function (
                $scope,
                reference,
                $localStorage,
                referenceService) {
                $scope.ng_localStorage = $localStorage;
                if (!$scope.data.milestones) $scope.data.milestones = [];
                getMilestoneDataTypes();

                $scope.addMilestone = function () {
                    $scope.data.milestones.push({});
                };

                if ((!$scope.data.milestones || $scope.data.milestones.length === 0) && $scope.data.procurementMethodType !== 'reporting') {
                    $scope.addMilestone();
                }

                $scope.removeMilestone = function (index) {
                  //  $scope.formName.$setValidity('milestonePercentage' + index + $scope.milestoneSector, true);
                    $scope.data.milestones.splice(index, 1);
                    if ($scope.data.milestones.length === 0) $scope.summMilestones = 0;
                    if ($scope.data.milestones.length > 0) $scope.countSummMilestones();
                }

                setTimeout(function () {
                    if (document.querySelector('.custom__form-controlP')) {
                        document.querySelector('.custom__form-controlP').addEventListener('keypress', function (e) {
                            e = e || window.event;
                            var charCode = (typeof e.which == 'undefined') ? e.keyCode : e.which;
                            var charString = String.fromCharCode(charCode);
                            if (!/\d/.test(charString)) {
                                e.preventDefault();
                                return false;
                            }
                        });
                    }
                }, 1000);
                
                $scope.countSummMilestones = function () {
                    $scope.summMilestones = 0;
                    var i = 0;
                    var mLength = $scope.data.milestones.length;
                    for (i; i < mLength; i++) {
                        var milestone = $scope.data.milestones[i];
                        if (milestone.percentage)
                            $scope.summMilestones = $scope.summMilestones + parseInt(milestone.percentage);
                    }
                   // setFormValodity($scope.summMilestones === 100);
                }

                //function setFormValodity(formValid) {
                //    var mLength = $scope.data.milestones.length;
                //    var i = 0;
                //    for (i; i < mLength; i++) {
                //        $scope.formName.$setValidity('milestonePercentage' + i + $scope.milestoneSector, formValid);
                //    }
                //}

                function getMilestoneDataTypes() {                 
                    referenceService.getMilestoneDirectory().then(function (response) {
                        $scope.milestoneDataTypes = {
                            dayType: response.data.dayType,
                            codeType: response.data.codeType,
                            titleType: response.data.titleType,
                            milestoneType: response.data.type
                        };
                    });
                }

                //$scope.setValidity = function(data, inputName) {
                //    $scope.formName.$setValidity(inputName, !(!data || data <= 0));
                //}
                
            }]
    };
}]);;
angular.module('app').directive('procurementCategories', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('~/Special/directives/tender/createTender/procurementCategories.html'),
        scope: {
            formName: '=',
            data: '=',
            isEditMode: '=',
            isRequired: '=',
            isModalSearch: '=',
            searchFormLocation: '=',
            tenderFormLocation: '=',
            disabled: '='
        }, controller: [
            '$scope',
            '$localStorage',
            'requestService', function (
                $scope,
                $localStorage,
                requestService) {

                $scope.ng_localStorage = $localStorage;
                requestService.getProcurementCategories().then(function (data) {
                    if ($scope.disabled) {
                        $scope.mainProcurementCategories = [data[0]];
                        $scope.data.mainProcurementCategory = {
                            value: data[0].value
                        }
                    } else {
                        $scope.mainProcurementCategories = data;
                    }
                });

                if ($scope.searchFormLocation) {
                    $(".leftBlockProc").addClass("col-sm-4");
                    $(".rightBlockProc").addClass("col-sm-8");
                }
                if ($scope.tenderFormLocation) {
                    $(".leftBlockProc").addClass("col-sm-3");
                    $(".rightBlockProc").addClass("col-sm-9");
                    $(".leftBlockProc .titleProc").addClass("fwb");
                    $(".rightBlockProc .controls").addClass("w170");
                }
            }]
    };
}]);;
angular.module('app')
    .directive('tenderFormAbove', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormAbove.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                condition: '=',
                checkTenderPeriod: '&',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                '$location',
                'tenderHelperService',
                '$localStorage',
                'datesHelperService',
                'addFeaturesService',
                'tenderFormService',
                'tenderFormMinStepService',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    $location,
                    tenderHelperService,
                    $localStorage,
                    datesHelperService,
                    addFeaturesService,
                    tenderFormService,
                    tenderFormMinStepService,
                    tenderValidationService) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addLotAndItem: addLotAndItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,

                        changeGuarantee: changeGuarantee
                    };
                    var vm = $scope.vm;
                    
                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        if ($scope.condition === 'create') {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 16);
                            $scope.calendarMinDate = minDate;
                        } else {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 8);
                            $scope.calendarMinDate = minDate;
                        }

                        $scope.$watch(function () {
                            return tenderValidationService.isValidDateToUpdateTender($scope.data.creationTime, $scope.data.tenderPeriod.endDate,
                                $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenUaCreate,
                                $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenUaEdit, $localStorage.isProdMode)
                        }, function (data) {
                            $scope.isDateError = data;
                        });
                    }

                    // если мы в создании тендера (не из шаблона) - сразу по умолчанию добавляем лот и айтем
					// TODO: move to createTenderModel (createTenderAbove.js)
                    // del $location if not used
                    if ($location.url().indexOf("create") > -1 && ($location.url().indexOf("createTenderAbove/") === -1)) {
                        $scope.vm.addLot();
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    function addLotAndItem() {
                        tenderFormService.addLotAndItem($scope.data);
                    }

                    $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
                    $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
                    $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;
                    $scope.date2017 = new Date('2017/01/01');

                    $scope.nowDate = function () {
                        return datesHelperService.getMinimalTenderDateForUpdate($scope.data.creationTime,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenUaCreate,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenUaEdit);
                    }
                        

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;


                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    $scope.isValidAmount = function (a) {
                        return !(parseFloat(a) < 0.01)
                    };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                        //if (!firstDate) firstDate = (new Date()).toISOString();
                        //else if (typeof (firstDate) === "object") firstDate = firstDate.toISOString();

                        //if (!lastDate) lastDate = (new Date()).toISOString();
                        //else if (typeof (lastDate) === "object") lastDate = lastDate.toISOString();

                        //return (lastDate >= firstDate);
                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };

                    $scope.$watch('data.awardCriteria', function () {
                        if ($scope.data.awardCriteria === 'lifeCycleCost') {
                            $scope.data.features = [];
                            $scope.data.lots.forEach(function (lot) {
                                lot.features = [];
                                if (lot.items && lot.items.length) {
                                    lot.items.forEach(function (item) {
                                        item.features = [];
                                    });
                                }
                            });
                        }
                    });

                    $scope.$watch("data.value.valueAddedTaxIncluded",
                        function (n) {
                            angular.forEach($scope.data.lots, function (lot) {
                                lot.value.valueAddedTaxIncluded = n;
                                lot.minimalStep.valueAddedTaxIncluded = n;
                            });
                        });

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;
                        if (!$scope.data.tenderPeriod) return false;
                        var tenderPeriod = $scope.data.tenderPeriod;
                        return tenderHelperService
                            .diffBetweenDates($localStorage.controlDatesOfProcedures.controlDateOpenUaCreate,
                                                  tenderPeriod === null ? null : (tenderPeriod.endDate));
                    }
                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;                        
                        return tenderHelperService
                            .diffBetweenDates($localStorage.controlDatesOfProcedures.controlDateOpenUaEdit,
                                                $scope.data.tenderPeriod.endDate);
                    }

                    $scope.checkTenderPeriod = function() {
                        switch ($scope.condition) {
                            case ('create'):
                                return checkTenderPeriod();
                            case ('update'):
                                return checkTenderPeriodForUpdate();
                        }
                    }

                    function addLot() {
                        tenderFormService.addLot($scope.data);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }
                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }

                    $scope.openTree = function(items) {
                        tenderFormService.openTree(items);
                    };

                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormAboveEu', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormAboveEu.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                '$location',
                'tenderHelperService',
                '$localStorage',
                'addFeaturesService',
                'tenderFormService',
                'datesHelperService',
                'tenderFormMinStepService',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    $location,
                    tenderHelperService,
                    $localStorage,
                    addFeaturesService,
                    tenderFormService,
                    datesHelperService,
                    tenderFormMinStepService,
                    tenderValidationService) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addLotAndItem: addLotAndItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,

                        changeGuarantee: changeGuarantee,
                        regexEN: $rootScope.regex.english
                    };
                    var vm = $scope.vm;

                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        if ($scope.condition === 'create') {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 31);
                            $scope.calendarMinDate = minDate;
                        } else {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 8);
                            $scope.calendarMinDate = minDate;

                            $scope.$watch(function () {
                                return tenderValidationService.isValidDateToUpdateTender($scope.data.creationTime, $scope.data.tenderPeriod.endDate,
                                    $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                    $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit, $localStorage.isProdMode)
                            }, function (data) {
                                $scope.isDateError = data;
                            });
                        }
                    }

                    // если мы в создании тендера (не из шаблона) - сразу по умолчанию добавляем лот и айтем
                    // TODO: move to createTenderModel (createTenderAboveEu.js)
                    // del $location if not used
                    if ($location.url().indexOf("create") > -1 && ($location.url().indexOf("createTenderAboveEu/") === -1)) {
                        $scope.vm.addLot();
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    function addLotAndItem() {
                        addLot();
                        var lot = $scope.data.lots[$scope.data.lots.length - 1];
                        addLotItem(lot);
                    }

                    $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
                    $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
                    $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;
                    $scope.word = $rootScope.regex.word;
                    $scope.date2017 = new Date('2017/01/01');


                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    $scope.isValidAmount = function (a) {
                        var amount = parseFloat(a);

                        return !(amount < 0.01);
                    };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };

                    $scope.$watch('data.awardCriteria', function () {
                        if ($scope.data.awardCriteria === 'lifeCycleCost') {
                            $scope.data.features = [];
                            $scope.data.lots.forEach(function (lot) {
                                lot.features = [];
                                if (lot.items && lot.items.length) {
                                    lot.items.forEach(function (item) {
                                        item.features = [];
                                    });
                                }
                            });
                        }
                    });

                    $scope.$watch("data.value.valueAddedTaxIncluded",
                        function (n) {
                            angular.forEach($scope.data.lots, function (lot) {
                                lot.value.valueAddedTaxIncluded = n;
                                lot.minimalStep.valueAddedTaxIncluded = n;
                            });
                        });

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;
                        if (!$scope.data.tenderPeriod) return false;

                        var tenderPeriod = $scope.data.tenderPeriod;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                tenderPeriod === null ? null : tenderPeriod.endDate);
                    }
                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit, $scope.data.tenderPeriod.endDate);
                    }

                    $scope.checkTenderPeriod = function () {
                        switch ($scope.condition) {
                            case ('create'):
                                return checkTenderPeriod();
                            case ('update'):
                                return checkTenderPeriodForUpdate();
                        }
                    }

                    function addLot() {
                        tenderFormService.addLot($scope.data);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }

                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };

                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormAgreement', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormAgreement.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                '$location',
                'tenderHelperService',
                '$localStorage',
                'addFeaturesService',
                'tenderFormService',
                'datesHelperService',
                'tenderFormMinStepService',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    $location,
                    tenderHelperService,
                    $localStorage,
                    addFeaturesService,
                    tenderFormService,
                    datesHelperService,
                    tenderFormMinStepService,
                    tenderValidationService) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addLotAndItem: addLotAndItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,

                        changeGuarantee: changeGuarantee,
                        regexEN: $rootScope.regex.english
                    };
                    var vm = $scope.vm;

                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        if ($scope.condition === 'create') {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 31);
                            $scope.calendarMinDate = minDate;
                        } else {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 8);
                            $scope.calendarMinDate = minDate;

                            $scope.$watch(function () {
                                return tenderValidationService.isValidDateToUpdateTender($scope.data.creationTime, $scope.data.tenderPeriod.endDate,
                                    $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                    $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit, $localStorage.isProdMode)
                            }, function (data) {
                                $scope.isDateError = data;
                            });
                        }
                    }

                    // если мы в создании тендера (не из шаблона) - сразу по умолчанию добавляем лот и айтем
                    // TODO: move to createTenderModel (createTenderAboveEu.js)
                    // del $location if not used
                    if ($location.url().indexOf("create") > -1 && ($location.url().indexOf("createTenderFramework/") === -1)) {
                        $scope.vm.addLot();
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    function addLotAndItem() {
                        addLot();
                        var lot = $scope.data.lots[$scope.data.lots.length - 1];
                        addLotItem(lot);
                    }
                    $scope.data.agreementDuration = {};
                    $scope.isOneAgreementDurationRequired = function () {                 
                        return !($scope.data.agreementDuration.years >= 0 || $scope.data.agreementDuration.months >= 0 || $scope.data.agreementDuration.days >= 0)
                    }

                    $scope.watchChangeYears = function (years) {
                        if (years == 4) {
                            $scope.data.agreementDuration.months = 0;
                            $scope.data.agreementDuration.days = 0;
                        }
                    }

                    $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
                    $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
                    $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;
                    $scope.word = $rootScope.regex.word;
                    $scope.date2017 = new Date('2017/01/01');

                    $scope.agreementDuration = [{ years: "", months: "", days: ""}];
                    $scope.agreementDuration.selected = $scope.data;
                    //$scope.$watch('agreementDuration.selected', function () {
                    //    $scope.data = $scope.agreementDuration.selected;
                    //});


                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    $scope.isValidAmount = function (a) {
                        var amount = parseFloat(a);

                        return !(amount < 0.01);
                    };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };
                    $scope.$watch("data.value.valueAddedTaxIncluded",
                        function (n) {
                            angular.forEach($scope.data.lots, function (lot) {
                                lot.value.valueAddedTaxIncluded = n;
                                lot.minimalStep.valueAddedTaxIncluded = n;
                            });
                        });

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;
                        if (!$scope.data.tenderPeriod) return false;

                        var tenderPeriod = $scope.data.tenderPeriod;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                tenderPeriod === null ? null : tenderPeriod.endDate);
                    }
                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit, $scope.data.tenderPeriod.endDate);
                    }

                    $scope.checkTenderPeriod = function () {
                        switch ($scope.condition) {
                            case ('create'):
                                return checkTenderPeriod();
                            case ('update'):
                                return checkTenderPeriodForUpdate();
                        }
                    }

                    function addLot() {
                        tenderFormService.addLot($scope.data);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }

                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };

                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormDefense', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormDefense.html',
            scope: {
                formname: '=',
                data: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                '$location',
                'tenderHelperService',
                'datesHelperService',
                '$localStorage',
                'addFeaturesService',
                'tenderFormService',
                'tenderFormMinStepService',
                'abp.services.etender.workingDays',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    $location,
                    tenderHelperService,
                    datesHelperService,
                    $localStorage,
                    addFeaturesService,
                    tenderFormService,
                    tenderFormMinStepService,
                    workingDays,
                    tenderValidationService) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addLotAndItem: addLotAndItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        regexEN: $rootScope.regex.english,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,

                        changeGuarantee: changeGuarantee
                    };
                    var vm = $scope.vm;

                    // если мы в создании тендера - сразу по умолчанию добавляем лот и айтем
					// TODO: move to createTenderModel (createTenderDefense.js)
                    // del $location if not used
                    if ($location.url().indexOf("create") > -1) {
                        $scope.vm.addLot();
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
                    $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
                    $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;
                    
                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 1);
                        if ($scope.condition == 'create') {
                            workingDays.getLastWorkingDayByCount(minDate.toDateString(), 6).then(function (request) {
                                $scope.calendarMinDate = new Date(request.data);
                            });
                        } else {
                            workingDays.getLastWorkingDayByCount(minDate.toDateString(), 3).then(function (request) {
                                $scope.calendarMinDate = new Date(request.data);
                            });

                            $scope.$watch(function () {
                                return tenderValidationService.isValidDateToUpdateDefenseTender($scope.data.tenderPeriod.endDate, $scope.data.creationTime)
                            }, function (data) {
                                $scope.isDateError = data;
                            })
                        }
                    }

                    $scope.nowDate = function () {
                        return datesHelperService.getMinimalTenderDateForUpdate($scope.data.creationTime,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateDefenseCreate,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateDefenseEdit);
                    }

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;

                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    $scope.isValidAmount = function (a) {
                        var amount = parseFloat(a);

                        if (amount < 0.01) {
                            return false;
                        } else {
                            return true;
                        }
                    };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };
                   
                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };

                    $scope.$watch('data.awardCriteria', function () {
                        if ($scope.data.awardCriteria === 'lifeCycleCost') {
                            $scope.data.features = [];
                            $scope.data.lots.forEach(function (lot) {
                                lot.features = [];
                                if (lot.items && lot.items.length) {
                                    lot.items.forEach(function (item) {
                                        item.features = [];
                                    });
                                }
                            });
                        }
                    });

                    $scope.$watch("data.value.valueAddedTaxIncluded",
                        function (n) {
                            angular.forEach($scope.data.lots, function (lot) {
                                lot.value.valueAddedTaxIncluded = n;
                                lot.minimalStep.valueAddedTaxIncluded = n;
                            });
                        });

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;

                        var startDate = new Date();
                        var endDate = new Date($scope.data.tenderPeriod.endDate);

                        //var st = startDate.getTime();
                        //var et = endDate.getTime();
                        //var diff = (et - st) / (1000 * 3600 * 24);

                        var diff = datesHelperService.howManyDaysLeftBetweenDates(startDate, endDate, true);

                        if ($localStorage.isProductionSite) {
                            return diff >= $localStorage.controlDatesOfProcedures.controlDateDefenseCreate;
                        }
                        // для тестовых закупок валидация отключена
                        if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                            return true;
                        return diff >= $scope.ng_localStorage.controlDatesOfProcedures.controlDateDefenseCreate;
                    }
                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;
                        return tenderHelperService
                                   .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateDefenseEdit,
                                                     $scope.data.tenderPeriod.endDate);
                    }

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }
                    function addLot() {
                        tenderFormService.addLot($scope.data);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }
                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                     }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }
                    function addLotAndItem() {
                        tenderFormService.addLotAndItem($scope.data);
                    }
                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };


                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormDialogue', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormDialogue.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                'tenderHelperService',
                '$localStorage',
                'addFeaturesService',
                'datesHelperService',
                'tenderFormService',
                'tenderFormMinStepService',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    tenderHelperService,
                    $localStorage,
                    addFeaturesService,
                    datesHelperService,
                    tenderFormService,
                    tenderFormMinStepService,
                    tenderValidationService
                ) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,

                        changeGuarantee: changeGuarantee,
                        regexEN: $rootScope.regex.english
                    };
                    var vm = $scope.vm;

                    $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
                    $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
                    $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;
                    $scope.date2017 = new Date('2017/01/01');
                    $scope.maxFeatureValue = 99;

                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        if ($scope.condition === 'create') {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 31);
                            $scope.calendarMinDate = minDate;
                        } else {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 8);
                            $scope.calendarMinDate = minDate;
                        }

                        $scope.$watch(function () {
                            return tenderValidationService.isValidDateToUpdateTender($scope.data.creationTime, $scope.data.tenderPeriod.endDate,
                                $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueUaCreate,
                                $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueUaEdit, $localStorage.isProdMode, $scope.errorDate)
                        }, function (data) {
                                $scope.isDateError = data;
                        });
                    }

                    $scope.nowDate = function () {
                        return datesHelperService.getMinimalTenderDateForUpdate($scope.data.creationTime,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueUaCreate,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueUaEdit);
                    }

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;


                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    $scope.isValidAmount = function (a) {
                        return !(parseFloat(a) < 0.01)
                    };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };
                   
                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;
                        return tenderHelperService
                                  .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueUaCreate,
                                                    $scope.data.tenderPeriod.endDate);
                    }
                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;
                        return tenderHelperService
                                   .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueUaEdit,
                                                     $scope.data.tenderPeriod.endDate);
                                                    }
                    function addLot() {
                        var l = {
                            auctionPeriod: {
                                startDate: null,
                                endDate: null
                            },
                            awardPeriod: {
                                startDate: null,
                                endDate: null
                            },
                            items: [],
                            minimalStep: {
                                amount: '',
                            },
                            value: {
                                amount: '',
                                valueAddedTaxIncluded: false
                            },
                            features: [],
                            hasGuarantee: '0'
                        };
                        addLotItem(l);
                        $scope.data.lots.push(l);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }
                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };
                 
                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormDialogueEu', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormDialogueEu.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                'tenderHelperService',
                '$localStorage',
                'datesHelperService',
                'addFeaturesService',
                'tenderFormService',
                'tenderFormMinStepService',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    tenderHelperService,
                    $localStorage,
                    datesHelperService,
                    addFeaturesService,
                    tenderFormService,
                    tenderFormMinStepService,
                    tenderValidationService
                ) {
                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,

                        changeGuarantee: changeGuarantee,
                        regexEN: $rootScope.regex.english
                    };
                    var vm = $scope.vm;

                    $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
                    $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
                    $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;
                    $scope.date2017 = new Date('2017/01/01');
                    $scope.maxFeatureValue = 99;

                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        if ($scope.condition === 'create') {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 31);
                            $scope.calendarMinDate = minDate;
                        } else {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 8);
                            $scope.calendarMinDate = minDate;
                        }

                        $scope.$watch(function () {
                            return tenderValidationService.isValidDateToUpdateTender($scope.data.creationTime, $scope.data.tenderPeriod.endDate,
                                $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate,
                                $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueEuEdit, $localStorage.isProdMode, $scope.errorDate)
                        }, function (data) {
                                $scope.isDateError = data;
                        });
                    }

                    $scope.nowDate = function () {
                        return datesHelperService.getMinimalTenderDateForUpdate($scope.data.creationTime,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate,
                            $scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueEuEdit);
                    }

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;
                    $scope.word = $rootScope.regex.word;

                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    $scope.isValidAmount = function (a) {
                        return !(parseFloat(a) < 0.01)
                    };

                    $scope.checkDate = function (lastDate, firstDate) {
                        return datesHelperService.checkDate(lastDate, firstDate);
                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };

                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueEuCreate,
                                $scope.data.tenderPeriod.endDate);
                    }

                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateDialogueEuEdit,
                                $scope.data.tenderPeriod.endDate);
                    }

                    function addLot() {
                        var l = {
                            auctionPeriod: {
                                startDate: null,
                                endDate: null
                            },
                            awardPeriod: {
                                startDate: null,
                                endDate: null
                            },
                            items: [],
                            minimalStep: {
                                amount: ''
                            },
                            value: {
                                amount: '',
                                valueAddedTaxIncluded: false
                            },
                            features: [],
                            hasGuarantee: '0'
                        };
                        addLotItem(l);
                        $scope.data.lots.push(l);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }
                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };

                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormEsco', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormEsco.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                getclassification: '=',
                getaddclassification: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                '$location',
                'tenderHelperService',
                '$localStorage',
                'addFeaturesService',
                'tenderFormService',
                'datesHelperService',
                'tenderValidationService',
                function (
                    $rootScope,
                    $scope,
                    $location,
                    tenderHelperService,
                    $localStorage,
                    addFeaturesService,
                    tenderFormService,
                    datesHelperService,
                    tenderValidationService) {

                    $scope.ng_localStorage = $localStorage;
                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addLotAndItem: addLotAndItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,

                        setFeatureValue: addFeaturesService.setFeatureValue,
                        checkFeatureSum: addFeaturesService.checkFeatureSum,
                        checkLotFeatureSum: addFeaturesService.checkLotFeatureSum,
                        checkFeaturesValue: addFeaturesService.checkFeaturesValue,

                        checkTenderPeriod: checkTenderPeriod,
                        checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,
                        fundingKindChanged: fundingKindChanged,

                        changeGuarantee: changeGuarantee,
                        regexEN: $rootScope.regex.english
                    };
                    var vm = $scope.vm;
                    $scope.NBUdiscountRateRegex = /^0*([0-8]?\d(\.\d{1,3})?|9([0-8](\.\d{1,3})?|9(\.0{1,3})?))$/; // 0.0 - 99.0
                    $scope.minimalStepPercentageRegex = /^0*(0\.[5-9]\d{0,2}|[1-2](\.\d{1,3})?|3(\.0{1,3})?)$/; // 0.5 - 3.0
                    //$scope.yearlyBudgetRegex = /^0*([0-7]?\d(\.\d{1,3})?|100(\.0{1,3})?)$/; // 0.0 - 80.0
                    $scope.yearlyOtherRegex = /^(0\.[8-9]\d{0,2}|1(\.0{1,3})?)$/; // not used

                    if ($localStorage.isProdMode) {
                        var startDate = new Date();
                        if ($scope.condition === 'create') {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 31);
                            $scope.calendarMinDate = minDate;
                        } else {
                            var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 8);
                            $scope.calendarMinDate = minDate;

                            $scope.$watch(function () {
                                return tenderValidationService.isValidDateToUpdateTender($scope.data.creationTime, $scope.data.tenderPeriod.endDate,
                                    $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                    $scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit, $localStorage.isProdMode)
                            }, function (data) {
                                $scope.isDateError = data;
                            });
                        }
                    }

                    // если мы в создании тендера (не из шаблона) - сразу по умолчанию добавляем лот и айтем
                    // TODO: move to createTenderModel (createTenderAboveEu.js)
                    // del $location if not used
                    if ($location.url().indexOf("create") > -1 && ($location.url().indexOf("createTenderEsco/") === -1)) {
                        $scope.vm.addLot();
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    function addLotAndItem() {
                        addLot();
                        var lot = $scope.data.lots[$scope.data.lots.length - 1];
                        addLotItem(lot);
                    }

                    $scope.numberRegex = $rootScope.regex.number;
                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };
                    
                    function changeGuarantee(o) {
                        tenderFormService.changeGuarantee(o);
                    }

                    function fundingKindChanged(k) {
                        angular.forEach($scope.data.lots, function (l) {
                            l.escoLotExt.fundingKind = k;
                            if (k === 'other') l.escoLotExt.yearlyPaymentsPercentageRange = 80;
                            if (k === 'budget') l.escoLotExt.yearlyPaymentsPercentageRange = null;
                        });
                    }

                    function checkTenderPeriod() {
                        if ($scope.condition == 'update') return true;
                        if (!$scope.data.tenderPeriod) return false;

                        var tenderPeriod = $scope.data.tenderPeriod;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuCreate,
                                tenderPeriod === null ? null : tenderPeriod.endDate);
                    }
                    function checkTenderPeriodForUpdate() {
                        if ($scope.condition == 'create') return true;
                        return tenderHelperService
                            .diffBetweenDates($scope.ng_localStorage.controlDatesOfProcedures.controlDateOpenEuEdit, $scope.data.tenderPeriod.endDate);
                    }

                    $scope.checkTenderPeriod = function () {
                        switch ($scope.condition) {
                            case ('create'):
                                return checkTenderPeriod();
                            case ('update'):
                                return checkTenderPeriodForUpdate();
                        }
                    }

                    function addLot() {
                        $scope.data.lots.push({
                            auctionPeriod: {
                                startDate: null,
                                endDate: null
                            },
                            awardPeriod: {
                                startDate: null,
                                endDate: null
                            },
                            items: [],
                            //minimalStep: {
                            //    amount: '',
                            //    valueAddedTaxIncluded: $scope.data.value.valueAddedTaxIncluded
                            //},
                            //value: {
                            //    amount: '',
                            //    valueAddedTaxIncluded: $scope.data.value.valueAddedTaxIncluded
                            //},
                            features: [],
                            hasGuarantee: '0',
                            escoLotExt: {
                                fundingKind: $scope.data.escoTenderExt.fundingKind,
                                yearlyPaymentsPercentageRange: 80,
                                minimalStepPercentage: null
                            }
                        });
                    }
                    function addLotItem(lot) {
                        lot.items.push({
                            additionalClassificationInn: null,
                            additionalClassificationAtc: null,
                            additionalClassifications: [
                                {
                                    code: '',
                                    description: ''
                                }],
                            classification: {},
                            //deliveryDate: {
                            //    startDate: null,
                            //    endDate: null
                            //},
                            description: null,
                            features: [],
                            quantity: null
                        });
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }
                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };

                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormLimited', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormLimited.html',
            scope: {
                formname: '=',
                data: '=',
                deliveryAddress: '=',
                type: '=',
                condition: '=',
                isEditMode: '='
            },
            controller: [
                '$rootScope',
                '$scope',
                'referenceService',
                '$location',
                'lookupService',
                '$localStorage',
                'tenderFormService',
                function (
                    $rootScope,
                    $scope,
                    referenceService,
                    $location,
                    lookupService,
                    $localStorage,
                    tenderFormService) {

                    $scope.ng_localStorage = $localStorage;
                    var negotiation = 'negotiation';
                    var negotiationq = 'negotiation.quick';
                    $scope.typeForm = 'tenderFormLimited';

                    var negotiationCauses = [
                        {
                            title: 'Закупівля товарів за процедурою відновлення платоспроможності боржника згідно із законодавством',
                            value: 'resolvingInsolvency'
                        }, {
                            title: 'Двічі відмінено процедуру відкритих торгів, у тому числі частково (за лотом), через відсутність достатньої кількості тендерних пропозицій, визначеної цим Законом',
                            value: 'twiceUnsuccessful'
                        }, {
                            title: 'Виникла необхідність у постачанні додаткового обсягу товару у того самого постачальника, що здійснюється протягом трьох років після укладення договору про закупівлю і загальна вартість такого постачання не перевищує 50 відсотків ціни договору про закупівлю',
                            value: 'additionalPurchase'
                        }, {
                            title: 'Виникла необхідність у закупівлі додаткових аналогічних робіт чи послуг у того самого учасника, що передбачені в основному договорі про закупівлю, який укладений за результатами проведення тендера та/або здійснюється протягом трьох років після укладення договору про закупівлю і загальна вартість таких робіт чи послуг не перевищує 50 відсотків ціни основного договору про закупівлю',
                            value: 'additionalConstruction'
                        }, {
                            title: 'Закупівля юридичних послуг, пов’язаних із захистом прав та інтересів України, захисту національної безпеки і оборони, а також закупівлі товарів, робіт і послуг у разі участі замовника на підставі рішення Кабінету Міністрів України в міжнародних виставкових заходах',
                            value: 'stateLegalServices'
                        }
                    ];
                    var negotiationqCauses = [
                        {
                            title: 'Закупівля товарів за процедурою відновлення платоспроможності боржника згідно із законодавством',
                            value: 'resolvingInsolvency'
                        }, {
                            title: 'Двічі відмінено процедуру відкритих торгів, у тому числі частково (за лотом), через відсутність достатньої кількості тендерних пропозицій, визначеної цим Законом',
                            value: 'twiceUnsuccessful'
                        }, {
                            title: 'Виникла необхідність у постачанні додаткового обсягу товару у того самого постачальника, що здійснюється протягом трьох років після укладення договору про закупівлю і загальна вартість такого постачання не перевищує 50 відсотків ціни договору про закупівлю',
                            value: 'additionalPurchase'
                        }, {
                            title: 'Виникла необхідність у закупівлі додаткових аналогічних робіт чи послуг у того самого учасника, що передбачені в основному договорі про закупівлю, який укладений за результатами проведення тендера та/або здійснюється протягом трьох років після укладення договору про закупівлю і загальна вартість таких робіт чи послуг не перевищує 50 відсотків ціни основного договору про закупівлю',
                            value: 'additionalConstruction'
                        }, {
                            title: 'Закупівля юридичних послуг, пов’язаних із захистом прав та інтересів України, захисту національної безпеки і оборони, а також закупівлі товарів, робіт і послуг у разі участі замовника на підставі рішення Кабінету Міністрів України в міжнародних виставкових заходах',
                            value: 'stateLegalServices'
                        }
                    ];

                    $scope.$watch('data', function (data) {
                        if (data) {
                            if (($scope.data.procurementMethodType == 'negotiation' || $scope.data.procurementMethodType == 'negotiation.quick') && !$scope.data.isNewCancellationFlow2020 && $scope.data.isNewCancellationFlow2020 !== undefined) {
                                negotiationCauses.push({
                                    title: 'Закупівля творів мистецтва або закупівля, пов’язана із захистом прав інтелектуальної власності, або укладення договору про закупівлю з переможцем архітектурного чи мистецького конкурсу',
                                    value: 'artContestIP'
                                }, {
                                    title: 'Виникла нагальна потреба здійснити закупівлю у разі настання підстав, що перераховані в абзацах 2-6 пункту 3 частини 2 статті 40 Закон',
                                    value: 'quick'
                                }, {
                                    title: 'Роботи, товари чи послуги можуть бути виконані, поставлені чи надані виключно певним суб’єктом господарювання',
                                    value: 'noCompetition'
                                });
                            }
                            if ($scope.data.procurementMethodType == 'negotiation' || ($scope.data.procurementMethodType == 'negotiation' && $scope.data.isNewCancellationFlow2020)) {
                                negotiationCauses.push({
                                    title: "Предмет закупівлі полягає у створенні або придбанні витвору мистецтва",
                                    value: 'artPurchase'
                                }, {
                                    title: 'Укладення договору з переможцем архітектурного або мистецького конкурсу',
                                    value: 'contestWinner'
                                }, {
                                    title: 'Відсутність конкуренції з технічних причин',
                                    value: 'technicalReasons'
                                }, {
                                    title: 'Необхідність захисту прав інтелектуальної власності',
                                    value: 'intProperty'
                                }, {
                                    title: 'Укладення договору з постачальником останньої надії',
                                    value: 'lastHope'
                                })
                            }
                            if ($scope.data.procurementMethodType == 'negotiation.quick' || ($scope.data.procurementMethodType == 'negotiation.quick' && $scope.data.isNewCancellationFlow2020)) {
                                negotiationqCauses.push({
                                    title: "Предмет закупівлі полягає у створенні або придбанні витвору мистецтва",
                                    value: 'artPurchase'
                                }, {
                                    title: 'Укладення договору з переможцем архітектурного або мистецького конкурсу',
                                    value: 'contestWinner'
                                }, {
                                    title: 'Відсутність конкуренції з технічних причин',
                                    value: 'technicalReasons'
                                }, {
                                    title: 'Необхідність захисту прав інтелектуальної власності',
                                    value: 'intProperty'
                                }, {
                                    title: 'Укладення договору з постачальником останньої надії',
                                    value: 'lastHope'
                                }, {
                                    title: 'Виникнення особливих економічних обставин з негайною ліквідацією наслідків надзвичайних ситуацій',
                                    value: 'emergency'
                                }, {
                                    title: 'Надання Україною гуманітарної допомоги іншим державам',
                                    value: 'humanitarianAid'
                                }, {
                                    title: 'Розірвання договору про закупівлю з вини учасника',
                                    value: 'contractCancelled'
                                }, {
                                    title: 'Оскарження прийнятих рішень, дій чи бездіяльності замовника щодо триваючого тендера',
                                    value: 'activeComplaint'
                                })
                            }
                        }
                    });
                    

                    $scope.vm = {
                        addLot: addLot,
                        addLotItem: addLotItem,
                        cloneLotItem: cloneLotItem,
                        addLotAndItem: addLotAndItem,
                        addItemAdditionalClassification: addItemAdditionalClassification,
                        removeLot: removeLot,
                        removeLotItem: removeLotItem,
                        removeItemAdditionalClassification: removeItemAdditionalClassification,
                        changeCause: changeCause,
                        causes: []
                    };
                    var vm = $scope.vm;

                    // если мы в создании тендера - сразу по умолчанию добавляем  айтем
                    // TODO: move to createTenderModel (createTenderLimited.js). del $location if not used
                    if ($location.url().indexOf("create") > -1) {
                        if ($scope.data.lots && $scope.data.lots.length > 0)
                            $scope.vm.addLotItem($scope.data.lots[0]);
                    }

                    function addLotAndItem() {
                        addLot();
                        var lot = $scope.data.lots[$scope.data.lots.length - 1];
                        addLotItem(lot);
                    }

                    $scope.floatNumberRegex = $rootScope.regex.floatNumber;
                    $scope.dateRegex = $rootScope.regex.date;
                    $scope.units = [];
                    activate();

                    function activate() {
                        referenceService.getAllUnits()
                            .then(function (res) {
                                $scope.units = res.data.units;
                            });

                        $scope.$watch("data",
                            function (n, o) {
                                if (!n.procurementMethodType) return;

                                changeCauses(n.procurementMethodType);
                                vm.sCause = lookupService.getCause(n.cause);
                            });
                    }

                    $scope.isValidAmount = function (a) {
                        var amount = parseFloat(a);

                        if (amount < 0.01) {
                            return false;
                        } else {
                            return true;
                        }
                    };

                    $scope.checkDate = function (lastDate, firstDate, element) {
                        var isValid = false;
                        if (firstDate === undefined || !firstDate) {
                            if ($scope.vm.sCause && $scope.vm.sCause.title === 'Укладення договору з постачальником останньої надії') {
                                return true;
                            } else {
                                firstDate = moment(new Date()).add(1, 'days').hour(00).minute(00).second(00).format();
                            }
                        }
                        else if (typeof (firstDate) === "object")
                            firstDate = moment(firstDate).format();
                        //firstDate = firstDate.toISOString();


                        if (lastDate === undefined || !lastDate)
                            lastDate = moment(new Date()).add(1, 'days').hour(00).minute(00).second(00).format();
                        else if (typeof (lastDate) === "object")
                            lastDate = moment(lastDate).format();
                        //lastDate = lastDate.toISOString();

                        var last = Date.parse(lastDate);
                        var first = Date.parse(firstDate);

                        (last >= first) ?
                            (isValid = true) :
                            (isValid = false);

                        if ($scope.data.procurementMethodType == 'reporting' && last == first)
                            isValid = true;

                        if (element) {
                            element.$setValidity(element.$name, isValid);
                            //console.log('elementname=' + element.$name);
                        }

                        return isValid;
                    };

                    $scope.checkFirstDate = function (firstDate) {
                        if (firstDate === undefined || !firstDate)
                            return true;
                        else if (typeof (firstDate) === "object")
                            firstDate = moment(firstDate).format();

                        var first = Date.parse(firstDate);
                        var tomorrowDate = moment(new Date()).add(1, 'days');
                        var tomorrow = Date.parse(tomorrowDate._d.toDateString());

                        if ($scope.vm.sCause && $scope.vm.sCause.title === 'Укладення договору з постачальником останньої надії') {
                            return true;
                        } else {
                            if (first < tomorrow)
                                return false;
                            else return true;
                        }

                    };

                    $scope.openClassificationModal = function (lotInd, itemInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $('#modalClassification').modal('toggle');
                    };
                    $scope.openAddClassificationModal = function (lotInd, itemInd, addClassificatorInd) {
                        $scope.lotInd = lotInd;
                        $scope.itemInd = itemInd;
                        $scope.addClassificatorInd = addClassificatorInd;
                        $('#addClassification').modal('toggle');
                    };
                    $scope.$watch("data.value.valueAddedTaxIncluded",
                        function (n) {
                            angular.forEach($scope.data.lots, function (lot) {
                                lot.value.valueAddedTaxIncluded = n;
                            });
                        });

                    function addLot() {
                        var l = {
                            items: [],
                            value: {
                                amount: '',
                                valueAddedTaxIncluded: false
                            }
                        };
                        //addLotItem(l); //like in all other procedures
                        $scope.data.lots.push(l);
                    }
                    function addLotItem(lot) {
                        tenderFormService.addLotItem(lot);
                    }
                    function cloneLotItem(lot, item) {
                        tenderFormService.cloneLotItem(lot, item);
                    }
                    function addItemAdditionalClassification(item) {
                        tenderFormService.additionalClassifications(item);
                    }

                    function removeLot(ind) {
                        tenderFormService.removeLot(ind, $scope.data);
                    }
                    function removeLotItem(lot, ind) {
                        tenderFormService.removeLotItem(lot, ind);
                    }
                    function removeItemAdditionalClassification(item, ind) {
                        tenderFormService.removeItemAdditionalClassification(item, ind);
                    }

                    function changeCause() {
                        if (vm.sCause) {
                            $scope.data.cause = vm.sCause.value;
                        } else {
                            $scope.data.cause = null;
                        }
                    }



                    // internal
                    function changeCauses(procurementMethodType) {
                        switch (procurementMethodType) {
                            case negotiation:
                                vm.reqCauseDescription = true;
                                vm.causes = negotiationCauses;
                                break;
                            case negotiationq:
                                vm.reqCauseDescription = true;
                                vm.causes = negotiationqCauses;
                                break;
                            default:
                                vm.reqCauseDescription = false;
                                vm.causes = [];
                        }
                    }

                    // start delivery date from tomorrow
                    $scope.tomorrow = new Date();
                    $scope.tomorrow.setDate($scope.tomorrow.getDate());
                    $scope.tomorrow.setHours(23);
                    $scope.tomorrow.setMinutes(59);

                    $scope.getDescriptionTitle = function (data) {
                        if (!data) {
                            return $rootScope.source("TenderDescription");
                        } else {
                            return $rootScope.source("createTenderLimitedReportingDescription");
                        }
                    }
                    $scope.openTree = function (items) {
                        tenderFormService.openTree(items);
                    };

                }]
        };
    });
;
angular.module('app')
    .directive('tenderFormMinStepDirective', function () {
        return {
            restrict: 'AE',
            templateUrl: '/Special/directives/tender/createTender/tenderFormMinStepDirective.html',
            scope: {
                formname: '=',
                lot: '=',
                index: '='
            },
            controller: [
                '$scope',
                'tenderFormMinStepService',
                function (
                    $scope,
                    tenderFormMinStepService
                    ) {

                    $scope.vm = {
                        changeMinimalStep: changeMinimalStep,
                        changeMinimalStepPer: changeMinimalStepPer,
                    };

                    $scope.isStepValid = function (lot) {
                        return tenderFormMinStepService.isStepValidWithThresholds(lot);
                    };

                    function changeMinimalStep(lot) {
                        tenderFormMinStepService.changeMinimalStep(lot);
                    }

                    function changeMinimalStepPer(lot) {
                        tenderFormMinStepService.changeMinimalStepPer(lot);
                    }

                    tenderFormMinStepService.changeMinimalStepPer($scope.lot);
                }]
        };
    });
;
angular.module('app').directive('tenderFormPriceQuotation', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/createTender/tenderFormPriceQuotation.html',
        scope: {
            formname: '=',
            data: '=',
            deliveryAddress: '=',
            getclassification: '=',
            getaddclassification: '=',
            condition: '=',
            checkTenderPeriod: '&',
            isEditMode: '=',
            minimalDate: '='
        },
        controller: [
            '$rootScope',
            '$scope',
            '$location',
            'tenderHelperService',
            '$localStorage',
            'datesHelperService',
            'addFeaturesService',
            'tenderFormService',
            'abp.services.etender.workingDays',

            function (
                $rootScope,
                $scope,
                $location,
                tenderHelperService,
                $localStorage,
                datesHelperService,
                addFeaturesService,
                tenderFormService,
                workingDays) {

                $scope.vm = {
                    addLot: addLot,
                    addLotItem: addLotItem,
                    removeLotItem: removeLotItem
                }

                if ($localStorage.isProdMode && !$scope.isEditMode) {
                    var todayCalendarDate = new Date();
                    var minCalendarDate = new Date(todayCalendarDate.getFullYear(), todayCalendarDate.getMonth(), todayCalendarDate.getDate());
                    workingDays.getLastWorkingDayByCount(minCalendarDate.toDateString(), 3).then(function (request) {
                        $scope.calendarMinDate = new Date(request.data);
                    });
                }
                if ($localStorage.pqBucketDate) {
                    $scope.data.pqDate = new Date() >= new Date($localStorage.pqBucketDate);
                }

                if ($location.url().indexOf("create") > -1 && ($location.url().indexOf("createTenderPriceQuotation/") === -1)) {
                    $scope.data.value.valueAddedTaxIncluded = true;
                    $scope.vm.addLot();
                    if ($scope.data.lots && $scope.data.lots.length > 0)
                        $scope.vm.addLotItem($scope.data.lots[0]);
                }

                $scope.checkDate = function (lastDate, firstDate) {
                    return datesHelperService.checkDate(lastDate, firstDate);
                };

                function addLot() {
                    tenderFormService.addLot($scope.data);
                }

                function addLotItem(lot) {
                    tenderFormService.addLotItem(lot);
                }

                function removeLotItem(lot, ind) {
                    tenderFormService.removeLotItem(lot, ind);
                }
            }
        ]
    }
});
angular.module('app').directive('dozorroBlock', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dozorroBlock.html',
        scope: {
            detailes: '='
        },
        controller: [
            '$scope',
            '$stateParams',
            '$timeout',
            '$location',
            'abp.services.etender.dozorro',
            '$ocLazyLoad',
            '$localStorage',
            function (
                $scope,
                $stateParams,
                $timeout,
                $location,
                dozorro,
                $ocLazyLoad,
                $localStorage) {
                var lang = 'uk';
                var tenderApiId = $scope.detailes.apiId;
                $scope.ng_localStorage = $localStorage;

                function submitReview(data) {
                    abp.ui.setBusy();
                    var submitReview = dozorro.sendFeedback(data);
                    submitReview
                        .then(function () {
                            abp.notify.success("Запис створено!");
                            abp.ui.clearBusy();
                            getForm({
                                tenderApiId: tenderApiId
                            });
                        }, function (err) {
                            abp.ui.clearBusy();
                            console.log(err.data);
                        });
                };

                function submit(review, index) {
                    var formId = parseInt($scope.forms[index].model.slice(11));
                    var customId = $scope.forms[index].idToEstimate;
                    var isAnonym = $scope.forms[index].anonymous;
                     var data = {
                        review: review,
                        tenderApiId: tenderApiId,
                        formId: formId,
                        anonymous: isAnonym,
                        CustomId: customId
                    };
                    submitReview(data);
                }

                // ФОРМА ОТПРАВКИ КОММЕНТАРИЯ К ОТВЕТУ
                $scope.replyFirstLevel = function (parentData, data) {
                    var obj = {
                        tenderApiId: tenderApiId,
                        formId: 'comment',
                        parentForm: data.id,
                        comment: data.envelope.comment,
                        anonymous: data.anonymous
                        
                    }
                    submitReview(obj);
                }

                $scope.getMessageReplyTo = function (data, answerKid) {
                    if (!answerKid.envelope.payload.replayTo) return null;
                    var replayTo = answerKid.envelope.payload.replayTo;
                    var i = 0;
                    for (i; i < data.length; i++) {
                        if (data[i].id === replayTo) {
                            return $scope.getPreview(data[i].envelope.payload.comment);
                        }
                    };
                    return null;
                }

                $scope.replySecondLevel = function (parentData, data) {
                    var obj = {
                        tenderApiId: tenderApiId,
                        formId: 'comment',
                        parentForm: parentData.id,
                        comment: data.envelope.comment,
                        replyTo: data.id,
                        anonymous: data.anonymous
                    }
                    submitReview(obj);
                }

                $scope.getPreview = function (text) {
                    if (text.length > 100) return text.substring(0, 99) + '... \n';
                    else return text;
                };

                var generateForm = function (jsonStr, index) {
                    var myForm = JSON.parse(jsonStr.schema);
                    var createdForm = JSON.parse(myForm.schema);

                    // Reset result pane
                    $('#result-' + index).html('');

                    // Parse entered content as JavaScript
                    // (mostly JSON but functions are possible)

                    // Most examples should be written in pure JSON,
                    // but playground is helpful to check behaviors too!

                    //if ('envelope' in createdForm)
                    //    createdForm = createdForm['envelope']['payload']['schema'];
                    // handle monitoring forms
                    if ('properties' in createdForm) {
                        var findFormShema = function (top) {
                            if ('form' in top && 'properties' in top) {
                                top['schema'] = top['properties'];
                                delete top['properties'];
                                return top;
                            }
                            if (top && typeof top == 'object') {
                                for (var key in top) {
                                    var res = null;
                                    if (typeof top[key] == 'object')
                                        if (res = findFormShema(top[key]))
                                            return res;
                                }
                            }
                            return null;
                        }
                        var patchByLang = function (items) {
                            var title_lang = 'title_' + lang,
                                helpvalue_lang = 'helpvalue_' + lang,
                                titleMap_lang = 'titleMap_' + lang;

                            for (var key in items) {
                                var val = items[key];
                                if (title_lang in val)
                                    val['title'] = val[title_lang];
                                if (helpvalue_lang in val)
                                    val['helpvalue'] = val[helpvalue_lang];
                                if (titleMap_lang in val)
                                    val['titleMap'] = val[titleMap_lang];
                                if ('items' in val)
                                    patchByLang(val['items']);
                            }
                        }
                        var patchFormSchema = function (schema) {
                            if ('required' in schema) {
                                for (var key in schema['required']) {
                                    var val = schema['required'][key];
                                    schema['schema'][val]['required'] = true;
                                }
                            }
                            // patch by current language
                            if (lang.length && 'form' in schema) {
                                patchByLang(schema['form']);
                            }
                            if ('form' in schema && 'type' in schema['form'][0]) {
                                if (schema['form'][0]['type'] == 'title') {
                                    schema['title'] = schema['form'][0]['title'];
                                    schema['form'].splice(0, 1);
                                }
                            }
                            return schema;
                        }
                        createdForm = findFormShema(createdForm);
                        if (!createdForm)
                            throw "form shema not found in object tree";
                        createdForm = patchFormSchema(createdForm);
                    }

                    // Render the resulting form, binding to onSubmitValid
                    createdForm.onSubmitValid = function (values) {
                        if (console && console.log) {
                            console.log('Values extracted from submitted form', values);
                        }
                        submit(values, index);
                    };
                    createdForm.onSubmit = function (errors, values) {
                        if (errors) {
                            if (errors.mass)
                                console.log('Validation errors', errors);
                            return false;
                        }
                        return true;
                    };
                    $('#form-title-' + index).html(createdForm['title'] || 'Generated form');
                    $('#result-' + index).html('<form id="result-form-' + index + '" class="form-vertical"></form>');
                    $('#result-form-' + index).html('<input id="submit" type="submit" class="btn btn-primary mt25" value="Отправить">');
                    try {
                        $('#result-form-' + index).jsonForm(createdForm);
                    } catch (err) {
                        getAllData();
                        return;
                    };
                    if ($('textarea')) $('textarea').addClass('form-control');
                };

                function getForm(tenderForm) {
                    var getJsonForm = dozorro.getJsonForms(tenderForm);
                    getJsonForm
                        .then(function (response) {
                            abp.ui.setBusy();
                            $scope.forms = response.data;
                            console.log($scope.forms);
                            $timeout(function () {
                                $scope.forms.forEach(function (form, i) {
                                    generateForm(form, i);
                                    if ($scope.forms.length - 1 === i)
                                        abp.ui.clearBusy();
                                });
                            }, 3000);
                        }, function (err) {
                            abp.ui.clearBusy();
                            console.log(err.data);
                        });
                }

                function getAllData() {
                    $ocLazyLoad.load('/Bundles/App/jsonform.js').then(function () {
                        var obj = { tenderApiId: tenderApiId };
                        getForm(obj);
                    });
                }

                getAllData();

                $scope.$on('goToDozorroForm',
                    function (evt, data, apiId) {
                        var unregister = $scope.$watch('forms', function () {
                            if ($scope.forms) {
                                putToFormCustomId(data, apiId);
                                scrollToForm(data);
                                unregister();
                            }
                        });
                    });

                function putToFormCustomId(data, apiId) {
                    var idForm = 'form/tender' + data;
                    for (var i = 0; i < $scope.forms.length; i++) {
                        if ($scope.forms[i].model === idForm) {
                            $scope.forms[i].idToEstimate = apiId;
                            break;
                        }
                    }
                }

                function scrollToForm(data) {
                    var id = '#tree-' + data;
                    var idTitle = '#treeTitle-' + data;
                    $timeout(function () {
                        jQuery(id).collapse('show');
                        jQuery("html, body").delay(1000).animate({
                            scrollTop: jQuery(idTitle).offset().top - 70
                        }, 1000);
                    }, 2000);
                }

                $scope.getEstimate = function (answers) {
                    var i = 0;
                    var totalEstimate = 0;
                    var quantityEstimate = 0;
                    for (i; i < answers.length; i++) {
                        if (answers[i].envelope &&
                            answers[i].envelope.payload &&
                            answers[i].envelope.payload.formData &&
                            answers[i].envelope.payload.formData.overallScore) {
                            var score = answers[i].envelope.payload.formData.overallScore;
                            totalEstimate += score;
                            if (score && score > 0) quantityEstimate += 1;
                        }
                    }
                    return Math.round(totalEstimate / quantityEstimate);
                }


                //$scope.wrightMassage = function (fId) {
                //    $('#leaveReviewDozorro').modal('hide');
                //    var tId = $scope.detailes.apiId;
                //    $location.path('/dozorroReview/' + tId + '/' + fId);
                //}
            }]
    };
});
;
(function () {
    'use strict';
    angular
        .module('app')
        .directive('massFeedDocumentsProzorro', massFeedDocumentsProzorro);
    massFeedDocumentsProzorro.$inject = ['massFeedDocumentsDirective', 'abp.services.etender.bid'];
    function massFeedDocumentsProzorro(massFeedDocumentsDirective, bidService) {
        return angular.extend({}, massFeedDocumentsDirective[0], {
            require: '^?lotBids',
            templateUrl: '/App/Main/base/directives/tender/tenderDetailes/documents/massFeedDocuments.html',
            link: function ($scope) {

                var createBidInput = function (lots) {
                    var createBidsInput = [];
                    var a = 0;
                    for (a; a < lots.length; a++) {
                        var createBidInput = $scope.createBidInputObj(lots[a]);

                        if (lots[a].bid !== undefined && lots[a].bid.id)
                            createBidInput.id = lots[a].bid.id;
                        else if (lots[a].bids.length > 0)
                            createBidInput.id = lots[a].bids[0].id;

                        createBidInput.lotValues.push({
                            lotId: lots[a].id,
                            subcontractingDetails: lots[a].bid && lots[a].bid.subcontractingDetails || null,
                            value: {
                                amount: lots[a].bid && lots[a].bid.value && lots[a].bid.value.amount || null,
                                currencyId: lots[a].value.currencyId,
                                valueAddedTaxIncluded: lots[a].value.valueAddedTaxIncluded
                            }
                        });

                        createBidsInput.push(createBidInput);
                    }
                    return createBidsInput;
                };

                $scope.getCreateBidMethod = function () {
                    if ($scope.tender.isEsco === false) {
                        return bidService.createOrUpdateBidDraft;
                    }
                    else {
                        return bidService.createOrUpdateBidDraftEsco;
                    }
                };

                $scope.createOrUpdateBidDraft = function (lots) {
                    var bidMethod = $scope.getCreateBidMethod();
                    return bidMethod(createBidInput(lots)).then(
                        function(reponse) {
                            return reponse.data;
                        });
                };

                $scope.createBidInputObj = function (lot) {
                    var inputObj = {
                        tenderId: $scope.tender.id,
                        lotValues: [],
                        featureOptionIds: $scope.getFeatureOptionsForCreate(lot),
                        userId: abp.session.userId,
                        selfEligible: (lot.bid && lot.bid.selfEligible) || ($scope.vm && $scope.vm.selfEligible) || null,
                        selfQualified: lot.bid && lot.bid.selfQualified || ($scope.vm && $scope.vm.selfQualified) || null
                    };

                    if ($scope.tender.isEsco) {
                        inputObj.contractDurationYears = $scope.vm.esco.contractDurationYears;
                        inputObj.contractDurationDays = $scope.vm.esco.contractDurationDays;
                        inputObj.yearlyPaymentsPercentage = $scope.vm.esco.yearlyPaymentsPercentage;
                        inputObj.annualCostsReduction = $scope.vm.esco.annualCostsReduction;
                    }

                    return inputObj;
                };


                
            }
        });
    };

})();;
angular.module('app').directive('dasu', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasu.html',
        scope: {
            detailes: '='
        },
        controller: [
            '$scope',
            'abp.services.etender.monitoring',
            '$localStorage',
            'documentsService',
            '$timeout',
            'Upload',
            function (
                $scope,
                monitorings,
                $localStorage,
                documentsService,
                $timeout,
                Upload) {

                $scope.ng_localStorage = $localStorage;
                $scope.filesCounter = 0;
                $scope.postAnswerDocs = null;
                $scope.isAppeal = false;
                $scope.showProceedingForm = {};

                $scope.getStatusName = function (s) {
                    switch (s) {
                    case 'cancelled':
                        return 'Архів';
                    case 'draft':
                        return 'Проект';
                    case 'active':
                        return 'Здійснення моніторингу';
                    case 'declined':
                        return 'Порушення не виявлені';
                    case 'closed':
                        return 'Завершено (Порушення не виявлені)';
                    case 'stopped':
                         return 'Рішення зупинено';
                    case 'addressed':
                        return 'Порушення виявлені';
                    case 'completed':
                        return 'Вирішено';
                    default:
                        return '-';
                    }
                };


                // submit for Post (button)
                $scope.submitPost = function (monitoring) {
                    if (!monitoring.comment) {
                        monitoring.comment = {}
                        return;
                    }
                    submit(
                        createPostObj(monitoring.id, monitoring),
                        monitoring.comment.docs
                    );
                }

                // submit for Post Answer (button)
                $scope.submitPostAnswer = function (post, monitoring) {
                    if (!post.comment) {
                        post.comment = {};
                        return;
                    }
                    submit(
                        createPostAnswerObj(post, monitoring),
                        post.comment.docs
                    );
                }

                // submit for Conclusion (button)
                $scope.submitConclusion = function (monitoring) {
                    submit(
                        createPostObj(monitoring.id, monitoring.conclusion),
                        monitoring.conclusion.comment.docs
                    );
                }

                // submit for Appeal
                $scope.submitAppeal = function (monitoring) {
                    submitAppeal(
                        createObj(monitoring.id, monitoring.appeal),
                        monitoring.appeal.comment.docs
                    );
                }

                // submit for Elimination Report
                $scope.submitEliminationReport = function (monitoring) {
                    submitEliminationReport(
                        createObj(monitoring.id, monitoring.eliminationReport),
                        monitoring.eliminationReport.comment.docs
                    );
                }

                // create Object to add Post or Conclusion
                function createPostObj(id, data) {
                    return {
                        "monitoringId": id,
                        "description": data.comment.description,
                        "title": data.comment.title
                    }
                }

                // create Object to add Post Anser
                function createPostAnswerObj(post, monitoring) {
                    return {
                        "monitoringId": monitoring.id,
                        "description": post.comment.description,
                        "title": post.comment.title,
                        "relatedPostId": post.id
                    }
                }

                // create Object to add Appeal add elimination Report
                function createObj(id, data) {
                    return {
                        "monitoringId": id,
                        "description": data.comment.description
                    }
                }

                // submit for Post or Conclusion
                function submit(obj, docs) {
                    abp.ui.setBusy();
                    monitorings.createPost(obj)
                        .then(function (response) {
                            suxessResponseAddPost(response, docs, $scope.addPostDocs);
                            abp.notify.success("Пояснення додано");
                        }, function (errore) {
                            erroreResponse(errore);
                        });
                }

                // submit for Appeal
                function submitAppeal(obj, docs) {
                    abp.ui.setBusy();
                    monitorings.createAppeal(obj)
                        .then(function (response) {
                            suxessResponseAddPost(response, docs, $scope.addAppealDocs, true);
                            abp.notify.success("Висновок оскаржено в суді додано");
                        }, function (errore) {
                            erroreResponse(errore);
                        });
                }

                // submit for EliminationReport
                function submitEliminationReport(obj, docs) {
                    abp.ui.setBusy();
                    monitorings.createEliminationReport(obj)
                        .then(function (response) {
                            suxessResponseAddPost(response, docs, $scope.addEliminationReportDocs);
                            abp.notify.success("Додано");
                        }, function (errore) {
                            erroreResponse(errore);
                        });
                }

                // suxess response after adding Post or Conclusion or Appeal
                function suxessResponseAddPost(response, docs, addDocs, needToSign) {
                    $scope.currentAppealId = response.data.id;
                    console.log(response);
                    if (docs && docs.length > 0) {
                        addDocs(docs, { id: $scope.currentAppealId });
                    } else {
                        if (needToSign) {
                            getMonitoringWithExportDocs();
                        } else {
                            getMonitoring();
                        }
                        abp.ui.clearBusy();
                    }
                }

                // errore response after adding Post or Conclusion or Appeal
                function erroreResponse(errore) {
                    console.log(errore);
                    getMonitoring();
                    abp.ui.clearBusy();
                }

                // get monitoring data
                function getMonitoring() {
                    abp.ui.setBusy();
                    monitorings.getMonitorings($scope.detailes.id)
                        .then(function (response) {
                            $scope.monitorings = response.data.items;
                            $scope.inspections = response.data.inspections;
                            console.log('dasu', response.data);
                            abp.ui.clearBusy();
                            if ($scope.detailes.showDasu) $scope.scrollToDasu($scope.detailes.showDasu);
                        },
                        function () {
                            abp.ui.clearBusy();
                        });
                }

                function getMonitoringWithExportDocs() {
                    abp.ui.setBusy();
                    monitorings.getMonitorings($scope.detailes.id)
                        .then(function (response) {
                                $scope.monitorings = response.data.items;
                                $scope.inspections = response.data.inspections;
                                var currentMonitoringWithAppeal = $scope.monitorings.find(function (monitoring) {
                                    return monitoring.appeal && monitoring.appeal.id === $scope.currentAppealId;
                                });
                                if (documentsService.checkDocumentsIsExported(currentMonitoringWithAppeal.appeal.documents)) {
                                    abp.ui.clearBusy();
                                    $scope.showModalSignAppeal(currentMonitoringWithAppeal.appeal);
                                    if ($scope.detailes.showDasu) $scope.scrollToDasu($scope.detailes.showDasu);

                                } else {
                                    $timeout(function () {
                                        getMonitoringWithExportDocs();
                                    }, 5000);
                                }
                            },
                            function () {
                                abp.ui.clearBusy();
                            });
                }

                $scope.$on('reloadDasu', function () {
                    getMonitoring();
                });

                // scroll to dasu
                $scope.scrollToDasu = function (monitoringId) {
                    var index = indexMonitoringToScroll(monitoringId);
                    if (!index && index !== 0) {
                        abp.notify.error("Такого моніторингу немає.");
                        return;
                    }
                    var idToScroll = '#treeMonitor-' + index;
                    var idToCollapse = '#monitor-' + index;
                    delete $scope.detailes.showDasu;
                    $timeout(function () {
                        $(idToCollapse).collapse();
                        $timeout(function () {
                            $('html, body').animate({
                                scrollTop: $(idToScroll).offset().top - 65
                            }, 500, 'linear');
                        }, 500);
                    }, 500);
                }

                $scope.toggleProceedingForm = function (monitoringId) {
                    $scope.showProceedingForm[monitoringId] = !$scope.showProceedingForm[monitoringId];
                }

                $scope.$on('closeProceedingForm', function (event, monitoringId) {
                    $scope.showProceedingForm[monitoringId] = false;
                })

                // get index monitoring to scroll
                function indexMonitoringToScroll(id) {
                    var i = 0;
                    for (i; i < $scope.monitorings.length; i++) {
                        if ($scope.monitorings[i].monitoringId === id)
                            return i;
                    }
                }

                // upload docs to Post or Conclusion 
                $scope.addPostDocs = function (files, post) {
                    addDocs(
                        files,
                        post,
                        getPostFileUploadObj(post.id)
                    );
                };

                $scope.addPostDocsUploaded = function () {
                    getMonitoring();
                };

                // upload docs to Appeal
                $scope.addAppealDocs = function (files, post) {
                    addDocs(
                        files,
                        post,
                        getAppealFileUploadObj(post.id)
                    );
                };

                // upload docs to EliminationReport
                $scope.addEliminationReportDocs = function (files, post) {
                    addDocs(
                        files,
                        post,
                        getEliminationReportFileUploadObj(post.id)
                    );
                };

                // create Object to add Docs to Post or Conclusion
                function getPostFileUploadObj(id) {
                    return {
                        "tenderId": $scope.detailes.id,
                        "monitoringPostId": id
                    };
                }

                // create Object to add Docs to add Appeal
                function getAppealFileUploadObj(id) {
                    return {
                        "tenderId": $scope.detailes.id,
                        "monitoringAppealId": id
                    };
                }

                // create Object to add Docs to add Elimination Report
                function getEliminationReportFileUploadObj(id) {
                    return {
                        "tenderId": $scope.detailes.id,
                        "eliminationReportId": id
                    };
                }

                // add docs for all
                function addDocs(files, post, fileUploadObj) {
                    if (files && files.length > 0) {
                        abp.ui.setBusy();
                        $scope.filesCounter = files.length;
                        // check file size
                        for (var i = 0; i < files.length; i++) {
                            $scope.errorMsg = null;
                            (function (file) {
                                generateThumbAndUpload(file, files, post, fileUploadObj);
                            })(files[i]);
                        }
                    }
                };

                function generateThumbAndUpload(file, listOfFiles, post, fileUploadObj) {
                    $scope.errorMsg = null;
                    uploadUsing$upload(file, listOfFiles, fileUploadObj);
                }

                function uploadUsing$upload(file, listOfFiles, fileUploadObj) {
                    $scope.isAppeal = !!fileUploadObj.monitoringAppealId;
                    if (documentsService.validateDocName(file.name) == 0) return;

                    file.upload = Upload.upload({
                        url: abp.appPath + 'api/Files/Upload',
                        method: 'POST',
                        fields: { myObj: fileUploadObj },
                        file: file
                    });

                    file.upload.then(function (response) {
                        $timeout(function () {
                            file.result = response.data;
                        });
                    }, function (response) {
                        if (response.status > 0)
                            $scope.errorMsg = response.status + ': ' + response.data;
                        console.log(response.data);
                    });

                    file.upload.progress(function (evt) {
                        // Math.min is to fix IE which reports 200% sometimes
                        file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    });

                    file.upload.success(function () {

                        //console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                        $scope.filesCounter = $scope.filesCounter - 1;
                        if ($scope.filesCounter === 0) {
                            abp.notify.success("Файл (файли) додано!");
                            abp.ui.clearBusy();
                            if ($scope.isAppeal) {
                                getMonitoringWithExportDocs();
                            } else {
                                getMonitoring();
                            }
                        }
                        $scope.uploadFilesCounter++;
                        if ($scope.uploadFilesCounter == listOfFiles.length) {
                            listOfFiles.splice(0, listOfFiles.length);
                            $scope.uploadFilesCounter = 0;
                        }
                    }).error(function (data) {
                        abp.notify.error(data.exceptionMessage || data.message);
                        abp.ui.clearBusy();
                        console.log(data);
                    });

                    file.upload.xhr(function (xhr) {
                        // xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
                    });
                }
                // documents to upload END


                // SIGN decision or conclusion
                $scope.showModalSignPost = function (data) {
                    var obj = { "monitoringPostId": data.id };
                    var method = 'getMonitoringPostForSign';
                    var type = 'monitoringPostId';
                    showSignModal(obj, data, method, type);
                }

                // SIGN appeal
                $scope.showModalSignAppeal = function (data) {
                    var obj = { "monitoringAppealId": data.id };
                    var method = 'getMonitoringAppealForSign';
                    var type = 'monitoringAppealId';
                    showSignModal(obj, data, method, type);
                }

                // SIGN eliminationReport
                $scope.showModalSignElimReport = function (data) {
                    var obj = { "eliminationReportId": data.id };
                    var method = 'getEliminationReportForSign';
                    var type = 'eliminationReportId';
                    showSignModal(obj, data, method, type);
                }

                // SIGN method
                function showSignModal(obj, data, method, type) {
                    monitorings[method](obj)
                        .then(function (reponse) {
                            var dataForSign = reponse.data.data;
                            dataForSign.type = type;
                            dataForSign.entityOutOfTender = true;
                            $scope.$emit('showModalSignMonitoring', dataForSign);
                        }, function (e) {
                            console.log(e.data);
                        });
                };


                // hide buttons if signed 
                $scope.notSigned = function (docs) {
                    if (!docs) return true;
                    var i = 0;
                    for (i; i < docs.length; i++) {
                        if (docs[i].title === 'sign.p7s') return false;
                    }
                    return true;
                };

                getMonitoring();

            }]
    };
});
;
angular.module('app').directive('dasuAppeal', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuAppeal.html',
        scope: false
    };
});
;
angular.module('app').directive('dasuConclusion', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuConclusion.html',
        scope: false
    };
});
;
angular.module('app').directive('dasuDecisionPosts', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuDecisionPosts.html',
        scope: false
    };
});
;
angular.module('app').directive('dasuDocsAdd', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuDocsAdd.html',
        scope: {
            data: '='
        },
        controller: ['$scope',function($scope) {
        }]
    };
});
;
angular.module('app').directive('dasuDocsShow', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuDocsShow.html',
        scope: {
            documents: '=',
            blockId: '='
        },
        controller: [
            '$scope',
            'documentsService',
            function (
                $scope,
                documentsService)
            {

            $scope.dowloadZip = function () {
                abp.ui.setBusy('.hidden-print dowloadZipBtn');
                var zipFilename = 'Документи';
                var docs = $scope.documents;
                documentsService.downloadZipFile(docs, zipFilename, $scope);
                var listener = $scope.$on('clearBusy',
                    function () {
                        abp.ui.clearBusy('.hidden-print dowloadZipBtn');
                        listener();
                    });
                }

                $scope.previewDoc = function (document) {
                    $scope.$emit('previewDoc', document);
                }

        }]
    };
});
;
angular.module('app').directive('dasuEliminationReport', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuEliminationReport.html',
        scope: false
    };
});
;
angular.module('app').directive('dasuEliminationResolution', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuEliminationResolution.html',
        scope: false
    };
});
;
angular.module('app').directive('dasuForm', function () {
    return {
        restrict: 'AE',
        templateUrl: '/Special/directives/tender/tenderDetailes/dasu/dasuForm.html',
        scope: {
            data: '=',
            showTitle: '='
        },
        controller: ['$scope',function($scope) {
            //
        }]
    };
});
;
angular.module('app').directive('dasuLiabilities', ['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('dasuLiabilities from cache'),
        scope: {
            monitoring: '=',
            liability: '='
        },
        controller: [
            '$scope',
            function (
                $scope
            ) {
            }]
    };
}]);
;
angular.module('app').directive('dasuProceedingForm',['$templateCache', function ($templateCache) {
    return {
        restrict: 'AE',
        template: $templateCache.get('dasuProceedingForm from cache'),
        scope: {
            monitoring: '='
        },
        controller: [
            '$scope',
            '$rootScope',
            '$http',
            function (
                $scope,
                $rootScope,
                $http
            ) {
                $scope.dateRegex = $rootScope.regex.dateOrEmpty;
                $scope.proceedingForm = {
                    dateProceedings: '',
                    proceedingNumber: ''
                };

                $scope.closeProceedingForm = function () {
                    $scope.proceedingForm = {
                        dateProceedings: '',
                        proceedingNumber: ''
                    };
                    $scope.$emit('closeProceedingForm', $scope.monitoring.id);
                };

                $scope.submitProceedingForm = function () {
                    abp.ui.setBusy();
                    var params = {
                        monitoringId: $scope.monitoring.id
                    }
                    if ($scope.proceedingForm.dateProceedings) {
                        params.dateProceedings = $scope.proceedingForm.dateProceedings;
                    }
                    if ($scope.proceedingForm.proceedingNumber) {
                        params.proceedingNumber = $scope.proceedingForm.proceedingNumber;
                    }
                    $http({
                        url: "/api/services/etender/proceeding/CreateProceeding",
                        method: "POST",
                        data: params,
                    }).then(function (response) {
                        $scope.closeProceedingForm();
                        if (!response.data.error) {
                            $scope.$emit('reloadDasu');
                        } else {
                            abp.notify.error(response.data.error.message);
                        }
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                };


            }]
    };
}]);
;
angular.module('app').
    service('agreementService', [
        'abp.services.etender.agreement',
        '$stateParams',
        '$q',
        'datesHelperService',
        function (
            agreement,
            $stateParams,
            $q,
            datesHelperService) {
            return new function () {

                this.getAgreement = function() {
                    var deferred = $q.defer();
                    var getAgreement = agreement.getAgreement($stateParams.aId);
                    getAgreement.then(function(response) {
                            console.log('agreement:', response.data);
                            deferred.resolve(response.data);
                        },
                        function(response) {
                            deferred.reject(response.data);
                        });
                    return deferred.promise;
                }

                this.errore = function(response) {
                    console.log('erroreAgreement', response);
                    abp.ui.clearBusy();
                }

                this.rightDateCreateAgreementSelectionUA = function (agreement) {
                    var today = new Date();
                    if (datesHelperService.howManyDaysLeftBetweenDates(today, agreement.period.endDate, false) < 7) return false;
                    return true;
                }

                this.setRightDataFormat = function (data) {
                    if (!data || data == 0) {
                        return null;
                    } else if  (data && data >= 1) {
                        return parseFloat((data * 100 - 100).toFixed(2));
                    } else if (data && data < 1) {
                        var number = (100 - data * 100).toFixed(2);
                        return -parseFloat(number);
                    }
                }

            };
    }]);;
angular.module('app').
    service('specialDataService', ['$rootScope', '$localStorage', function ($rootScope, $localStorage) {
        return new function () {

            this.ableFeatureSum = 30;

            this.statuses = [
                'active.enquiries',
                'active.tendering',
                'active.pre-qualification',
                'active.pre-qualification.stand-still',
                'active.stage2.pending',
                'active.stage2.waiting',
                'active.auction',
                'active.qualification',
                'active.qualification.stand-still',
                'active.awarded',
                'draft',
                'draft.publishing'
            ];

            this.statusesForActivated = [
                'active.enquiries',
                'active.tendering',
                'active.pre-qualification',
                'active.pre-qualification.stand-still',
                'active.stage2.pending',
                'active.stage2.waiting',
                'active.auction',
                'active.qualification',
                'active.qualification.stand-still',
                'active.awarded'
            ];

            this.statusesMyTendersLimited = [
                'active',
                'unsuccessful',
                'complete',
                'cancelled'
            ];

            this.statusesMyTendersArchive = [
                'unsuccessful',
                'complete',
                'cancelled',
                'draft.unsuccessful'
            ];

            this.statusesMyBids = [
                'active.enquiries',
                'active.tendering',
                'active.pre-qualification',
                'active.pre-qualification.stand-still',
                'active.stage2.pending',
                'active.stage2.waiting',
                'active.auction',
                'active.qualification',
                'active.awarded'
            ];

            this.procedureTypes = [
                {
                    title: 'Допорогова закупівля',
                    type: 'belowThreshold',
                    href: '/createTender',
                    id: 1
                }, {
                    title: 'Спрощена закупівля',
                    type: 'belowThresholdSimple',
                    href: '/createTender',
                    id: 2
                }, {
                    title: $rootScope.source('OpenMarket'),
                    type: 'aboveThresholdUA',
                    href: '/createTenderAbove',
                    id: 3
                }, {
                    title: $rootScope.source('OpenMarketEU'),
                    type: 'aboveThresholdEU',
                    href: '/createTenderAboveEu',
                    id: 4
                }, {
                    title: $rootScope.source('Reporting'),
                    type: 'reporting',
                    href: '/createTenderLimitedReporting',
                    id: 5
                }, {
                    title: $rootScope.source('Negotiation'),
                    type: 'negotiation',
                    href: '/createTenderLimited',
                    id: 6
                }, {
                    title: 'Переговорна процедура (скорочена)',
                    type: 'negotiation.quick',
                    href: '/createTenderLimitedQuick',
                    id: 7
                }, {
                    title: $rootScope.source('Defense'),
                    type: 'aboveThresholdUA.defense',
                    href: '/createTenderDefense',
                    id: 8
                }, {
                    title: $rootScope.source('SimpleDefense'),
                    type: 'simple.defense',
                    href: '/createTenderSimpleDefense',
                    id: 16
                }, {
                    title: $rootScope.source('Dialogue'),
                    type: 'competitiveDialogueUA',
                    href: '/createTenderDialogue',
                    id: 9
                }, {
                    title: $rootScope.source('DialogueEU'),
                    href: '/createTenderDialogueEu',
                    type: 'competitiveDialogueEU',
                    id: 10
                }, {
                    title: $rootScope.source('Esco'),
                    href: '/createTenderEsco',
                    type: 'esco',
                    id: 11
                }, {
                    title: $rootScope.source('closeFrameworkAgreementUA'),
                    href: '/createTenderFramework',
                    type: 'closeFrameworkAgreementUA',
                    id: 12
                }
            ];

            this.procedureTypes.push({
                title: $rootScope.source('priceQuotation'),
                href: '/createTenderPriceQuotation',
                type: 'priceQuotation',
                id: 15
            });


            this.getProcedureType = function (typeProcedure) {
                var procedureTypes = this.procedureTypes;
                return procedureTypes.find(function(x) {
                    return x.type === typeProcedure;
                });
            }
        };
    }]);;
(function () {
    var controllerId = 'agreementChangePreviewCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$localStorage',
        'agreementService',
        'abp.services.etender.agreement',
       '$stateParams',
        function (
            $scope,
            $localStorage,
            agreementService,
            agreement,
            $stateParams
        ) {
            $scope.ng_localStorage = $localStorage;
            $scope.vm = $scope;
            $scope.agreementUrl = $stateParams.aId;
         
            function previewPendingChange () {
                agreement.getPreviewAgreementChange($scope.agreementUrl)
                    .then(function (response) {
                        console.log('Agreement Change Preview:', response.data);
                        $scope.agreement = response.data;
                    }, function (data) {
                        agreementService.errore(data);
                    });
            }

            previewPendingChange();
        }]);
})();
(function () {
    var controllerId = 'agreementDetailesCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        'documentsService',
        '$localStorage',
        'agreementService',
        'abp.services.etender.reference',
        '$location',
        '$anchorScroll',
        'abp.services.etender.agreement',
        '$timeout',
        'Upload',
        'loadTypesAndConfident',
        '$sessionStorage',
        '$q',
        '$state',
        'uploadFileService',
        function (
            $scope,
            documentsService,
            $localStorage,
            agreementService,
            referenceService,
            $location,
            $anchorScroll,
            agreement,
            $timeout,
            Upload,
            loadTypesAndConfident,
            $sessionStorage,
            $q,
            $state,
            uploadFileService
        ) {
            $scope.ng_localStorage = $localStorage;
            $scope.ng_sessionStorage = $sessionStorage;

            $scope.changingData = {};
            $scope.pendingChangingData = {};
            var partyWithdrawalIndex = null;
            $scope.vm = $scope;

            $scope.$on('reloadTender', function () {
                $scope.reload();
            });

            $scope.reload = function (needToSign) {
                abp.ui.setBusy();
                $scope.displayAgreementChangeForm = false;
                agreementService.getAgreement($scope).then(function (data) {
                    getAgreementThen(data);
                    if (needToSign) {
                        $scope.signAgreement();
                    }
                }, function (data) {
                    agreementService.errore(data);
                });
            }

            $scope.reloadDocuments = function () {
                agreementService.getAgreement($scope).then(function (data) {
                    $scope.agreement.documents = angular.copy(data.documents);
                }, function (data) {
                    agreementService.errore(data);
                });
            }

            $scope.dayToday = new Date();;
            $scope.yesterday = new Date($scope.dayToday);
            $scope.yesterday.setDate($scope.dayToday.getDate() - 1);

            function getAgreementThen(data) {
                $scope.agreement = data;
                $scope.agreement.showChangeForm = false;
                $scope.agreement.entityOutOfTender = true; //в API подпись ложится не в тендер - а напрямую - https://lb-api-sandbox.prozorro.gov.ua/api/2.3/agreements/d18ab36c358a447ab2f135ef2ad2ea31
                getAgreementChangeTypes();
                getDockType();
                $scope.displayAgreementChangeForm = true;
                $scope.agreement.documents = documentsService.sortListOfDocs($scope.agreement.documents);
                
                abp.ui.clearBusy();
            }

            $scope.fileUploadObj = { documentOf: "change", relatedItem: "" };
            $scope.addDocument = function (data) {
                $scope.agreement.isSigned = false;
                var changeId = null, docTypeId = null;
                if (data) {
                    changeId = data.changeId;
                    docTypeId = data.docTypeId;
                }
                $scope.fileUploadObj = {
                    agreementChangeId: changeId,
                    tenderId: $scope.agreement.tenderNewID,
                    agreementId: $scope.agreement.id
                };
                $scope.documentsToAddFields = { data: $scope.fileUploadObj, documentType: docTypeId || null };                
            };
            $scope.addDocumentUploaded = function () {
                $timeout(function () {
                    $scope.reload();
                }, 2000);
            };

            $scope.updateDoc = function () {
                var docTypeId = null;
                $scope.fileUploadObj = {
                    agreementChangeId: null,
                    tenderId: $scope.agreement.tenderNewID,
                    agreementId: $scope.agreement.id
                };
                $scope.updateDocFields = { data: $scope.fileUploadObj, documentType: docTypeId && docTypeId.id || null };
            };

            $scope.removeDoc = function (index) {
                $scope.documentsToAdd.splice(index, 1);

            };

            $scope.getSameFormatData = function (date) {
                return Date.parse(date);
            }


            function getAgreementChangeTypes() {
                if (!$localStorage.agreementChangeTypes) {
                    referenceService.getAgreementChangeRationaleTypes().then(function (data) {
                        $localStorage.agreementChangeTypes = data.data;
                        partyWithdrawalIndex = getPartyWithdrawalCouse();
                    },
                        function (data) {
                            agreementService.errore(data);
                        });
                } else {
                    partyWithdrawalIndex = getPartyWithdrawalCouse();
                }
            }

            function getDockType() {
                loadTypesAndConfident.getDocumentTypesForAll().then(function (documentTypes) {
                    $scope.documentTypes = documentTypes.agreementDocument;
                });
            }

            function getPartyWithdrawalCouse() {
                var i = 0;
                var lengthC = $localStorage.agreementChangeTypes.length;
                for (i; i < lengthC; i++) {
                    if ($localStorage.agreementChangeTypes[i].value === "partyWithdrawal") return i;
                }
                return false;
            }


            $scope.goToChange = function (contract, change) {

                $timeout(function () {
                    $location.hash('changeForm');
                    $anchorScroll();
                }, 1000);

                setChengesPartyWithdrawal(contract, change);
            }

            function setChengesPartyWithdrawal(contract, change) {
                $timeout(function () {
                    $scope.agreement.provider = contract;
                }, 500);
                change.rationaleType = $localStorage.agreementChangeTypes[partyWithdrawalIndex];
                delete change.modifications;
                change.modifications = [];
                change.modifications[0] = {
                    contractId: contract.id
                }
            }

            $scope.changeAgreementApply = function (obj) {
                var objClone = angular.copy(obj); 
                setCorrectPercent(objClone);
                if ($scope.agreement.provider)
                    objClone.modifications[0].contractId = $scope.agreement.provider.id;
                objClone.agreementId = $scope.agreement.id;
                console.log(objClone);
                agreement.createAgreementChange(objClone)
                    .then(function (data) {
                        console.log(data);
                        clearChangeForm(obj);
                        $state.reload();
                    }, function (data) {
                        agreementService.errore(data);
                        clearChangeForm(obj);
                    });
            }

            function clearChangeForm(obj) {
                delete obj;
                $scope.changingData = {};
                $scope.agreement.showChangeForm = false;
            }

            function setCorrectPercent(obj) {
                if (obj.modifications && obj.modifications.length > 0) {
                    var i = 0;
                    var mlength = obj.modifications.length;
                    for (i; i < mlength; i++) {
                        if (!obj.modifications[i]) continue;
                        if (!obj.modifications[i].contractId && !obj.modifications[i].factorP && !obj.modifications[i].addend && !obj.modifications[i].factor ||
                            obj.modifications[i].itemId && !obj.modifications[i].factorP && !obj.modifications[i].addend && !obj.modifications[i].factor) {
                            obj.modifications.splice(i, 1);
                            setCorrectPercent(obj);
                            return;
                        }
                        if (obj.modifications[i].factorP && obj.modifications[i].factorP > 0) {
                            obj.modifications[i].factor = obj.modifications[i].factorP / 100 + 1;
                            //delete obj.modifications[i].factorP;
                        } else if (obj.modifications[i].factorP && obj.modifications[i].factorP < 0) {
                            obj.modifications[i].factor = 1 + obj.modifications[i].factorP / 100;
                            //delete obj.modifications[i].factorP;
                        }
                    }
                }
            }

            $scope.activePendingChange = function (change, form) {
                change.dateSigned = $scope.ng_sessionStorage.dateSignedAgreementInput;
                delete $scope.ng_sessionStorage.dateSignedAgreementInput;

                if (change.rationaleType.value === 'partyWithdrawal' &&
                    activeContracts() === 3 &&
                    !confirm("Якщо ви підтвердите цю зміну, учасників рамкової угоди стане менше трьох, що стане підставою припинення її дії.")) return;
                if (!form.$dirty) {
                    var obj = {
                        dateSigned: change.dateSigned,
                        id: change.id
                    }
                    agreement.activateAgreementChange(obj)
                        .then(function (data) {
                            console.log(data);
                            $scope.reload(true);
                        }, function (data) {
                            agreementService.errore(data);
                        });
                } else {
                    change.status.value = "active";
                    $scope.updateAgreementChange(change)
                        .then(function () {
                            $scope.reload(true);
                        }, function () {
                            return;
                        });
                }
            }

            $scope.cancelAgreementFunc = function (cancelData) {
                var obj = {
                    terminationDetails: cancelData.terminationDetails,
                    id: $scope.agreement.id
                }
                terminateAgreement(obj, 'Припинено').then(function () {
                    $scope.reload();
                });
            }

            $scope.executAgreementFunc = function () {
                var obj = {
                    terminationDetails: null,
                    id: $scope.agreement.id
                }
                terminateAgreement(obj, 'Виконано').then(function () {
                    $scope.reload();
                });
            }

            $scope.updateAgreementChange = function (change) {
                var changeClone = angular.copy(change);
                setCorrectPercent(changeClone);
                var deferred = $q.defer();
                agreement.updateAgreementChange(changeClone)
                    .then(function (data) {
                        deferred.resolve(data);
                        $scope.reload();
                        abp.notify.success('Змінено');
                    },
                    function (data) {
                        deferred.reject();
                        agreementService.errore(data);
                    });
                return deferred.promise;
            }

            function terminateAgreement(obj, notice) {
                var deferred = $q.defer();
                agreement.terminateAgreement(obj)
                    .then(function (data) {
                        deferred.resolve(data);
                        abp.notify.success(notice);
                    },
                    function (data) {
                        agreementService.errore(data);
                    });
                return deferred.promise;
            }

            $scope.saveAndSeePrev = function (change, form) {
                if (!form.$dirty) {
                    goToAgreementPrev();
                } else {
                    $scope.updateAgreementChange(change).then(function () {
                        goToAgreementPrev();
                    }, function () {
                        return;
                    });
                }
            }

            function goToAgreementPrev() {
                $location.path('/agreementChangePreview/' + $scope.agreement.id);
            }

            function activeContracts() {
                var contracts = 0;
                var i = 0;
                var cLength = $scope.agreement.contracts.length;
                for (i; i < cLength; i++) {
                    if ($scope.agreement.contracts[i].status.value === 'active')
                        contracts++;
                }
                return contracts;
            }

            $scope.cancellePendingChange = function (id) {
                agreement.cancelledAgreementChange(id)
                    .then(function (data) {
                        $scope.reload();
                    },
                    function (data) {
                        agreementService.errore(data);
                    });
            }

            $scope.$on('onPersonSignDataErrorModalOpen', function () {
                $timeout(function () {
                    $('#personSignDataErrorModal').modal('show');
                }, 1000);
            });

            $scope.hideBlocks = function () {
                $scope.agreement.showChangeForm = false;
            }

            $scope.clearModifications = function () {
                if ($scope.changingData.modifications && $scope.changingData.modifications.length > 0)
                    $scope.changingData.modifications.length = 0;
            }

            $scope.ifAnyFeel = function (data) {
                var i = 0;
                var dLength = data.length;
                for (i; i < dLength; i++) {
                    if (data[i]) {
                        if (data[i].factorP) return true;
                        if (data[i].addend) return true;
                    } else {
                        return true;
                    }
                }
                return false;
            }

            $scope.reload();

            $scope.signAgreement = function () {
                $timeout(function () {
                    $scope.entityType = 'agreementModule';
                    $scope.entityOutOfTender = true;
                    $('#modalSignNew').modal('toggle');
                }, 1000);
            };

            $scope.erroreInFormChange = function (change) {
                var i = 0;
                var mLength = change.modifications.length;

                for (i; i < mLength; i++) {
                    var modifi = change.modifications[i];
                    if (modifi.addend === 0 || modifi.factorP === 0)
                        return true;
                }
            }

        }]);
})();
(function () {
    var controllerId = 'agreementEditCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope',
        '$scope',
        'abp.services.etender.agreement',
        'Upload',
        '$stateParams',
        'documentsService',
        '$localStorage',
        'agreementService',
        'loadTypesAndConfident',
        'urlService',
        'uploadFileService',
        function (
            $rootScope,
            $scope,
            agreement,
            Upload,
            $stateParams,
            documentsService,
            $localStorage,
            agreementService,
            loadTypesAndConfident,
            urlService,
            uploadFileService
        ) {
            $scope.dateRegex = $rootScope.regex.date;
            $scope.ng_localStorage = $localStorage;
            $scope.dateRegex = $rootScope.regex.date;
            $scope.unitForms = {};
            var agreementFromServer;
            $scope.vm.dateSignedDate = null;
            $scope.vm.dateSignedTime = null;

            var maxDateSigned = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), 23, 59, 59, 59);
            //maxDateSigned.setDate(maxDateSigned.getDate() - 1);
            $scope.maxDateSigned = maxDateSigned;
            $scope.vm = $scope;



            $scope.doctype = 'ContractDocument';
            $scope.selectedDocType = null;

            $scope.$on('reloadTender', function () {
                $scope.reload();
            });

            $scope.reload = function (mod) {
                agreementService.getAgreement($scope).then(function (data) {
                    if (mod === 'documents') {
                        updateDocuments(data);
                        return;
                    }
                    getAgreementThen(data);

                }, function(data) {
                    errore(data);
                }); 
            };

            function updateDocuments(data) {
                $scope.agreement.documents = documentsService.sortListOfDocs(data.documents);
            }

            function getAgreementThen(data) {
                data = canActivateContract(data);
                $scope.agreement = data;
                if ($scope.agreement.dateSigned) {
                    $scope.vm.dateSignedDate = new Date($scope.agreement.dateSigned);
                    $scope.vm.dateSignedTime = new Date($scope.agreement.dateSigned);
                }
                $scope.minDateSigned = new Date($scope.agreement.complaintEndDate);               
                $scope.minDateSigned.setDate($scope.minDateSigned.getDate() - 1);
                agreementFromServer = angular.copy(data);
                $scope.canEdetAgreement = canEdetAgreement(data);
                getDocTypes();
                $scope.agreement.documents = documentsService.sortListOfDocs($scope.agreement.documents);
                abp.ui.clearBusy(); 
            }

            function canEdetAgreement(data) {
                if (data.status.value === 'active' || data.status.value === 'unsuccessful')
                    return false;
                return true;
            }
            
            $scope.$watch('vm.dateSignedDate', function () {
                if ($scope.dateSignedDate) {
                    var Y = $scope.vm.dateSignedDate.getFullYear();
                    var M = $scope.vm.dateSignedDate.getMonth();
                    var D = $scope.vm.dateSignedDate.getDate();
                    var h = 0, m = 0;
                    if ($scope.dateSignedTime) {
                        h = $scope.vm.dateSignedTime.getHours();
                        m = $scope.vm.dateSignedTime.getMinutes();
                    }
                    var nowDate = new Date(Date.now());
                    if ($scope.vm.dateSignedDate.getDate() == nowDate.getDate()
                        && $scope.vm.dateSignedDate.getMonth() == nowDate.getMonth()
                        && $scope.vm.dateSignedDate.getFullYear() == nowDate.getFullYear()) {
                        $scope.maxTimeSigned = moment().add(1, 'minutes').format('HH:mm');
                    } else {
                        $scope.maxTimeSigned = null;
                    }
                    var complaintEndDate = new Date($scope.agreement.complaintEndDate);
                    if ($scope.vm.dateSignedDate.getDate() == complaintEndDate.getDate()
                        && $scope.vm.dateSignedDate.getMonth() == complaintEndDate.getMonth()
                        && $scope.vm.dateSignedDate.getFullYear() == complaintEndDate.getFullYear()) {
                        $scope.minTimeSigned = new Date($scope.agreement.complaintEndDate);
                    } else {
                        $scope.minTimeSigned = null;
                    }
                    $scope.agreement.dateSigned = new Date(Y, M, D, h, m);
                }
            });

            $scope.$watch('vm.dateSignedTime', function () {
                if ($scope.vm.dateSignedTime) {
                    var h = $scope.vm.dateSignedTime.getHours();
                    var m = $scope.vm.dateSignedTime.getMinutes();
                    var Y = 0, M = 0, D = 0;
                    if ($scope.dateSignedDate) {
                        Y = $scope.vm.dateSignedDate.getFullYear();
                        M = $scope.vm.dateSignedDate.getMonth();
                        D = $scope.vm.dateSignedDate.getDate();
                    }

                    $scope.agreement.dateSigned = new Date(Y, M, D, h, m);
                }
            });



            $scope.triggerContractStatus = function (id) {
                abp.ui.setBusy();
                var trigger = agreement.triggerContractStatus(id);
                trigger.then(function (response) {
                    console.log(response);
                    $scope.reload();
                    abp.ui.clearBusy();
                },function (response) {
                        errore(response);
                    });
            };

            $scope.saveAgreement = function () {
                abp.ui.setBusy();
                var agr = agreement.updateAgreement($scope.agreement);
                agr.then(function (response) {
                    switch ($scope.agreement.status.value) {
                        case 'active':
                            abp.notify.success("Рамкова угода активована!");
                            urlService.redirectToAgreementDetailes($scope.agreement.id);
                            break;
                        case 'unsuccessful':
                            abp.notify.success("Рамкова угода скасована!");
                            break;
                        default:
                            abp.notify.success("Рамкова угода змінена!");
                            break;
                    }
                    $scope.reload();
                    abp.ui.clearBusy();
                }, function (response) {
                    errore(response);
                });
            }

            $scope.updateAndActivateAgreement = function () {
                $scope.agreement.status.value = 'active';
                $scope.saveAgreement();
            }

            $scope.updateAndUnsuccessfulAgreement = function () {
                $scope.agreement.status.value = 'unsuccessful';
                $scope.saveAgreement();
            }

            $scope.updateUnitPrice = function (obj, form) {
                abp.ui.setBusy();
                var update = agreement.updateUnitPrice(obj);
                update.then(function (response) {
                    abp.notify.success("Ціна змінена.");
                    form.$setPristine();
                    console.log(response);
                    $scope.reload();
                    abp.ui.clearBusy();
                }, function (response) {
                    errore(response);
                });
            }

            $scope.reload();

            function getDocTypes() {
                loadTypesAndConfident.getDocumentTypesForAll().then(function(data) {
                    $scope.documentTypes = data.contractingDocument;
                });
            }

            function canActivateContract(data) {
                data.contracts.forEach(function (contract) {
                    //contract.isCanActivate = contract.unitPrices.every(elem => elem.value.amount > 0)
                    for (var i = 0; i < contract.unitPrices.length; i++) {
                        if (contract.unitPrices[i].value.amount > 0) {
                            contract.isCanActivate = true;
                        } else {
                            contract.isCanActivate = false;
                        }
                    }
                });
                return data;
            }

            $scope.removeDoc = function (index) {
                $scope.documentsToAdd.splice(index, 1);

            };

            $scope.getSameFormatData = function (date) {
                return Date.parse(date);
            }

            $scope.periodDateValid = function (startDate, endDate) {
                if (!startDate || !endDate) return;

                var dt1 = new Date(startDate);
                var dt2 = new Date(endDate);
                var mdt1 = moment(dt1);
                var mdt2 = moment(dt2);
                var diff = mdt2.diff(mdt1, 'years', true);
                return diff <= 4;
            }

            $scope.previewDoc = function (doc) {
                documentsService.previewDoc(doc, $scope);
            }


            $scope.trustSrc = function (src) {
                return documentsService.trustSrcForDocLoad(src);
            }

            $scope.changeDoc = function (document) {
                $scope.documentChanged = document;
                _($scope.documents).each(function (doc) {
                    doc.ch = false;
                });
                document.ch = true;
            };

            $scope.setTheSameValue = function (unitPrices, unitPrice, index) {
                for (var i = 0; i < unitPrices.length; i++) {
                    if (i !== index) {
                        unitPrices[i].value.amount = unitPrice.value.amount;
                        unitPrices[i].value.valueAddedTaxIncluded = unitPrice.value.valueAddedTaxIncluded;
                    }
                }
            };

            function errore(response) {
                agreementService.errore(response);
            };

            $scope.signAgreement = function () {
                $scope.entityType = 'agreement';
                $('#modalSignNew').modal('toggle');
            };

            $scope.agreementFormEdited = function () {
                return !angular.equals($scope.agreement, agreementFromServer);
            }

        }]);
})();
(function () {
    var controllerId = 'activateCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', '$rootScope', '$http', '$stateParams', function ($scope, $rootScope, $http, $stateParams) {
            var activateData = {
                UserId: $stateParams.userId,
                Code: $stateParams.code
            };

            var response = $http.post('/Account/ConfirmEmail', activateData);
            response.then(function (reponse) {
                var data = reponse.data;
                if (!!data && !!data.result && !!data.result.res) {
                    $scope.isConfirmed = data.result.res;
                } else if (!!data && !!data.result && !!data.result.err) {
                    abp.notify.error(data.result.err);
                }
                else {
                    abp.notify.error('Помилка', 'Не вдалося автивувати обліковий запис');
                }
                ;
            });
        }
    ]);
})();;
angular.module('app')
    .controller('registerNewCtrl',
        ['$scope',
            '$rootScope',
            'qa',
            '$location',
            '$localStorage',
            '$sessionStorage',
            '$cookies',
            'abp.services.etender.settings',
            function (
                $scope,
                $rootScope,
                qa,
                $location,
                $localStorage,
                $sessionStorage,
                $cookies,
                settings) {
                $scope.ng_localStorage = $localStorage;
                $scope.isAuthorized = $localStorage.isAuthorized;
                $scope.regexPatternPass = $rootScope.regex.password;
                $scope.regexPatternName = $rootScope.regex.wordAnyLanguage;

                if ($localStorage.isAuthorized && $localStorage.username) {
                    console.log('isAuthorized', $localStorage.isAuthorized);
                    $location.path('/');
                }

                $scope.curentUrl = $location.$$path;
                $scope.registerFormData = {
                    showSubmitButton: false,
                };

                //ga('send', 'pageview', '/register');
                dataLayer.push({
                    'event': 'virtualPageView',
                    'virtualPageURL': '/register',
                    'virtualPageTitle': 'First_Form_registration'
                });


                var host = document.location.host;

                if (qa == host)
                    $scope.isQA = true;
                else
                    $scope.isQA = false;

                $scope.profileForm = {
                    login: null,
                    emailAddress: null,
                    phone: null,
                    fax: null,

                    //internal fields:
                    name: null,
                };

                var changeSendState = function (state) {
                    if (state) {
                        dataLayer.push({
                            'event': 'virtualPageView',
                            'virtualPageURL': '/thankYouPage1',
                            'virtualPageTitle': 'First_Step_Registration'
                        });
                    }
                    //if (state) {
                    //    ga('send', 'pageview', '/thankYouPage1');
                    //}
                    $scope.isSendMessage = state;
                };

                var registerNewUser = function (regData) {
                    return abp.ajax({
                        url: abp.appPath + "Account/Register",
                        type: 'POST',
                        data: JSON.stringify(regData),
                        beforeSend: abp.ui.setBusy('body')
                    });
                };
                
                $scope.submit = function (regformValid) {
                    if (!regformValid.$valid) {
                        regformValid.$setDirty();
                        regformValid.email_.$setDirty();
                        regformValid.name.$setDirty();
                        regformValid.password.$setDirty();
                        regformValid.phone_.$setDirty();
                        regformValid.surname.$setDirty();
                        return;
                    }

                    $scope.isRegisterButtonDisabled = true;
                    if (!$localStorage.googleReCaptchaSiteKeyV3 || !$localStorage.googleReCaptchaSiteKeyV2) {
                        var getSettings = settings.getSetting();
                        getSettings.then(function (response) {
                            $localStorage.googleReCaptchaSiteKeyV3 = response.data.googleReCaptchaSiteKeyV3;
                            $localStorage.googleReCaptchaSiteKeyV2 = response.data.googleReCaptchaSiteKeyV2;
                            $scope.registerUser('v3');
                        });
                    } else {
                        $scope.registerUser('v3');
                    }
                };
                
                $scope.registerUser = function (captchaVersion) {
                    if (captchaVersion === 'v3') {
                        var captchaSiteKey = $localStorage.googleReCaptchaSiteKeyV3;
                        grecaptcha.execute(captchaSiteKey, {action: 'Register'}).then(function (token) {
                            $scope.sendRegisterRequest(token, 'v3');
                        });
                    } else {
                        abp.ui.clearBusy('body');
                        var captchaSiteKey = $localStorage.googleReCaptchaSiteKeyV2;
                        grecaptcha.render('recaptcha_v2', { 'sitekey': captchaSiteKey, 'callback': $scope.onCaptchaV2Success});
                    }
                }

                $scope.onCaptchaV2Success = function (token) {
                    $scope.sendRegisterRequest(token, 'v2');
                }

                $scope.sendRegisterRequest = function (token, captchaVersion) {
                    var formData = {
                        //UserName: $scope.profileForm.login,
                        EmailAddress: $scope.profileForm.emailAddress,
                        Password: $scope.password,
                        FirstName: $scope.profileForm.name,
                        //Patronymic: $scope.profileForm.name.patronymic,
                        LastName: $scope.profileForm.surname,
                        //NameEN: $scope.profileForm.name.nameEN,
                        Phone: $scope.profileForm.phone,
                        RegistrationGATag: $cookies.get("_ga"),
                        //Fax: $scope.profileForm.fax
                    };
                    if (captchaVersion === 'v3') {
                        formData.captchaTokenV3 = token;
                    } else {
                        formData.captchaTokenV2 = token;
                    }
                    var register = registerNewUser(formData);
                    register
                        .then(
                            function () {
                                $sessionStorage.countAttempts = 0;
                                abp.notify.success('Ви успішно зареєструвалися!');
                                abp.ui.clearBusy('body');
                                $scope.$apply(changeSendState(true));
                                $scope.isRegisterButtonDisabled = false;
                            },
                            function (error) {
                                if (error && ((error.responseText && error.responseText.contains('Captcha не валідна'))
                                    || (error.message && error.message.contains('Captcha не валідна'))) && captchaVersion !== 'v2') {
                                    $scope.registerUser('v2');
                                } else {
                                    abp.ui.clearBusy('body');
                                    $scope.$apply(changeSendState(false));
                                    $scope.isRegisterButtonDisabled = false;
                                }
                            });
                    return register;
                }
            }
        ]
    );
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('addComplaintCtrl', addComplaint);

    addComplaint.$inject = [
        '$scope',
        'abp.services.etender.tenderComplaint',
        'abp.services.etender.awardComplaint',
        'abp.services.etender.qualificationComplaint',
        'abp.services.etender.cancellationComplaint',
        '$localStorage',
        '$rootScope'
    ];

    function addComplaint(
        $scope,
        tenderComplaintService,
        awardComplaintService,
        qualificationComplaintService,
        cancellationComplaintService,
        $localStorage,
        $rootScope
    ) {
        

        $scope.showAddComplaintModal = function (mode, modeOn) {
            $scope.addComplaintMode = mode;
            $scope.detailes.addModeOn = modeOn;
            // Запретить пользователям из тестового режима подавать вимоги/скарги на реальные тендера
            if ($scope.detailes.mode !== "test" && !$localStorage.isProdMode) {
                abp.notify.error($rootScope.source("CantAddComplaintToRealTenderFromTestMode"));
            } else {
                $('#addComplaint').modal('show');

                $scope.vm = {
                    title: '',
                    description: '',
                    sendComplaint: sendComplaint,
                    sendClaim: sendClaim,
                    send: send,
                    complaintFor: null,
                    complaintForList: []
                };
                var vm = $scope.vm;

                // заполняем коллекцию для комбика с лотами, awards - для какого элемента создаём жалобу
                $scope.$watch('detailes', function (data) {
                    //$scope.formUpload = false;
                    if (data != null) {
                        var space = String.fromCharCode(160);
                        $scope.vm.complaintForList = [];
                        if (data.addModeOn == 'claimOnTender' || data.addModeOn == 'complaintOnTender')
                            $scope.vm.complaintForList.push({ id: null, title: 'тендер', type: 'tender' });
                        if (data.addModeOn == 'complaintOnCancel') {
                            angular.forEach(data.cancellations,
                                function (cancelation) {
                                    if (cancelation.status == 'pending') {
                                        var cancelationTitle = cancelation.reason.substr(0, 60) + '...';
                                        $scope.vm.complaintForList.push({
                                            id: cancelation.id,
                                            title: space.repeat(2) + '' + cancelationTitle,
                                            type: 'cancelation'
                                        });
                                    }
                                });
                        }
                        angular.forEach(data.lots, function (lot) {
                            if (data.addModeOn == 'complaintOnCancel') {
                                angular.forEach(lot.cancellations, function (cancelation) {
                                    if (cancelation.status == 'pending') {
                                        var cancelationTitle = cancelation.reason.substr(0, 60) + '...';
                                        $scope.vm.complaintForList.push({ id: cancelation.id, title: space.repeat(2) + '' + cancelationTitle, type: 'cancelation' });
                                    }
                                });
                            }

                            if (!lot.isFake && (data.addModeOn == 'claimOnTender' || data.addModeOn == 'complaintOnTender') && lot.status == "active") {
                                var lotTitle = lot.title.substr(0, 60) + '...';
                                $scope.vm.complaintForList.push({ id: lot.id, title: space.repeat(2) + 'лот ' + lotTitle, type: 'lot' });
                            }
                            var lotTitle = lot.title.substring(0, 20) + (lot.title.length > 20 ? '...' : '');
                            // и для всех awards
                            if (data.addModeOn == 'claimOnAward' || data.addModeOn == 'complaintOnAward') {
                                angular.forEach(lot.awards, function (award) {
                                    if (data.addModeOn == 'claimOnAward' && award.canClaim || data.addModeOn == 'complaintOnAward' && award.canComplaint) {
                                        if (award.status === 'unsuccessful' || award.status === 'active') {
                                            if ((award.complaintPeriod && new Date(award.complaintPeriod.endDate) > new Date() && data.procurementMethodRationale !== 'simple') || (data.procurementMethodRationale === 'simple')) {
                                                var suppliersInfo = '';
                                                if (award.suppliers && award.suppliers.length > 0 && award.suppliers[0].name) {
                                                    suppliersInfo = award.suppliers[0].name + ' ,';
                                                }
                                                var priceInfo = ' (' + suppliersInfo + award.value.amount + '  ' + award.value.currencyCode + ')';
                                                $scope.vm.complaintForList.push({ id: award.id, title: 'рішення замовника для лота ' + lotTitle + priceInfo, type: 'award' });
                                            }
                                        }
                                    }
                                });
                            }
                            // и для всех qualifications
                            //if ($scope.detailes.canUserCreateClaimOnQualification || $scope.detailes.canUserCreateComplaintOnQualification) {
                            angular.forEach(lot.qualifications, function (qualificat) {
                                if (qualificat.canComplaint && data.status === 'active.pre-qualification.stand-still') {
                                    $scope.vm.complaintForList.push({
                                        id: qualificat.id, title: 'кваліфікацію ' + qualificat.organization.name
                                            + ' для лота "' + lotTitle + '"(' + lot.value.amount + ' ' + lot.value.currencyCode + ')', type: 'qualification'
                                    });
                                }
                            });
                            //}
                        });
                    }
                });
            }
        };

        

        function addComplaintInput() {
            return {
                title: $scope.vm.title,
                description: $scope.vm.description,
                tenderId: $scope.tId,
                relatedCancellation: $scope.vm.complaintFor.type == 'cancelation' ? $scope.vm.complaintFor.id : null, 
                relatedLot: $scope.vm.complaintFor.type == 'lot' ? $scope.vm.complaintFor.id : null, // жалоба на lot
                relatedAward: $scope.vm.complaintFor.type == 'award' ? $scope.vm.complaintFor.id : null, // жалоба на award, иначе - жалоба на сам тендер
                relatedQualification: $scope.vm.complaintFor.type == 'qualification' ? $scope.vm.complaintFor.id : null // жалоба на award, иначе - жалоба на сам тендер
            };
        }

        function sendComplaint() {
            abp.ui.setBusy('#btnAddComplaint');

            var complaintInput = addComplaintInput();
            var complaintPromise = null;
            switch ($scope.vm.complaintFor.type) {
                case 'tender':
                    complaintPromise = tenderComplaintService.createComplaint(complaintInput);
                    break;
                case 'award':
                    complaintPromise = awardComplaintService.createComplaint(complaintInput);
                    break;
                case 'qualification':
                    complaintPromise = qualificationComplaintService.createComplaint(complaintInput);
                    break;
                case 'cancelation':
                    complaintPromise = cancellationComplaintService.createComplaint(complaintInput);
                    break;
                default:
                    complaintPromise = tenderComplaintService.createComplaint(complaintInput);
                    break;
            }

            complaintPromise.then(function () {
                    $scope.vm.title = '';
                    $scope.vm.description = '';
                    $scope.$emit('reloadTender');
                    abp.ui.clearBusy('#btnAddComplaint');
                    abp.notify.success('Чернетка скарги створена');
                    $('#addComplaint').modal('hide');
                    $('body').removeClass('modal-open');
                    $('.modal-backdrop').remove();
                },
                    function (e) {
                        abp.ui.clearBusy('#btnAddComplaint');
                    });
        }

        function sendClaim() {
            abp.ui.setBusy('#btnAddComplaint');

            var complaintInput = addComplaintInput();
            var complaintPromise = null;
            switch ($scope.vm.complaintFor.type) {
                case 'tender':
                    complaintPromise = tenderComplaintService.createClaim(complaintInput);
                    break;
                case 'award':
                    complaintPromise = awardComplaintService.createClaim(complaintInput);
                    break;
                case 'qualification':
                    complaintPromise = qualificationComplaintService.createClaim(complaintInput);
                    break;
                default:
                    complaintPromise = tenderComplaintService.createClaim(complaintInput);
                    break;
            }

            complaintPromise.then(function () {
                    $scope.vm.title = '';
                    $scope.vm.description = '';
                    $scope.$emit('reloadTender')
                    abp.ui.clearBusy('#btnAddComplaint');
                    abp.notify.success('Чернетка вимоги створена');
                    $('#addComplaint').modal('hide');
                    $('body').removeClass('modal-open');
                    $('.modal-backdrop').remove();

                },
                    function (e) {
                        abp.ui.clearBusy('#btnAddComplaint');
                    });
        }

        function send() {
            if ($scope.addComplaintMode === 'claim') {
                $scope.vm.sendClaim();
            } else {
                $scope.vm.sendComplaint();
            }
        }
    }
})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('answerComplaintCtrl', answerComplaint);

    answerComplaint.$inject = [
        '$scope',
        '$rootScope',
        'abp.services.etender.tenderComplaint',
        'abp.services.etender.awardComplaint',
        'abp.services.etender.qualificationComplaint',
    ];

    function answerComplaint(
        $scope,
        $rootScope,
        tenderComplaintService,
        awardComplaintService,
        qualificationComplaintService
    ) {
        $scope.vm = getEmptyVmModel();
        $scope.placeholder = {
            description: $rootScope.source('AnswerComplaintDescription'),
            complaintEliminate: $rootScope.source('ComplintEliminateMessage')
        }

        $(document).on('show.bs.modal', '#answerComplaint', function () {
            $scope.complaintType = $scope.$root.complaintType;
        });

        function getEmptyVmModel() {
            return {
                description: '',
                resolutionType: null,
                tenderAction: '',
                sendAnswerComplaint: sendAnswerComplaint
            };
        }

        function sendAnswerComplaint() {
            //console.log('cancel Complaint' + complaintid);
            var complaintIdModal = $scope.$root.complaintIdModal;

            var modelToSend = {
                "Id": complaintIdModal,
                "resolution": $scope.vm.description,
                "resolutionType": $scope.vm.resolutionType,
                "tenderAction": $scope.vm.tenderAction
            };
            if (!modelToSend.tenderAction) {
                delete modelToSend.tenderAction;
            }

            var complaintPromise = null;
            switch ($scope.$root.complaintFor) {
                case 'tender':
                    complaintPromise = tenderComplaintService.setAnsweredClaim(modelToSend);
                    break;
                case 'award':
                    complaintPromise = awardComplaintService.setAnsweredClaim(modelToSend);
                    break;
                case 'qualification':
                    complaintPromise = qualificationComplaintService.setAnsweredClaim(modelToSend);
                    break;
            }
            
            abp.ui.setBusy('#' + complaintIdModal);
            complaintPromise.then(function (data) {
                $scope.vm = getEmptyVmModel();
                abp.notify.success("Вашу відповідь надіслано!");
                $('#answerComplaint').modal('toggle');
                $('body').removeClass('modal-open');
                $('.modal-backdrop').remove();
                $scope.$emit('reloadTender');
                abp.ui.clearBusy('#' + complaintIdModal);
            }, function (data) {
                abp.ui.clearBusy('#' + complaintIdModal);
            });
        }

        function isTenderActionNeeded() {
            return $scope.complaintType !== 'claim';
        }
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('cancelComplaintCtrl', cancelComplaint);

    cancelComplaint.$inject = [
        '$scope',
        '$rootScope',
        'abp.services.etender.tenderComplaint',
        'abp.services.etender.awardComplaint',
        'abp.services.etender.qualificationComplaint',
    ];

    function cancelComplaint(
        $scope,
        $rootScope,
        tenderComplaintService,
        awardComplaintService,
        qualificationComplaintService
    ) {
        $scope.vm = {
            description: '',
            sendCancelComplaint: sendCancelComplaint
    };
        var vm = $scope.vm;
        $scope.placeholder = $rootScope.source('CancelComplaintDescription');

        function sendCancelComplaint() {
            //console.log('cancel Complaint' + complaintid);
            var complaintIdModal = $scope.$root.complaintIdModal;
            var complaintPromise = null;
            switch ($scope.$root.complaintFor) {
                case 'tender':
                    complaintPromise = tenderComplaintService.setCancelledStatusClaim({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
                case 'award':
                    complaintPromise = awardComplaintService.setCancelledStatusClaim({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
                case 'qualification':
                    complaintPromise = qualificationComplaintService.setCancelledStatusClaim({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
            }
            abp.ui.setBusy('#' + complaintIdModal);
            complaintPromise.then(function (data) {
                abp.notify.success("відкликано!");
                $('#cancelComplaint').modal('toggle');
                $('body').removeClass('modal-open');
                $('.modal-backdrop').remove();
                $scope.$emit('reloadTender');
                abp.ui.clearBusy('#' + complaintIdModal);
            }, function (data) {
                abp.ui.clearBusy('#' + complaintIdModal);
            });
        }
    }
})();;
(function () {
    var controllerId = 'complaintTableCtrl';
    angular.module('app')
        .controller(controllerId, [
            '$scope',
            'abp.services.etender.complaintCommon',
            'complaintsService',
            'ngTableParams',
            '$rootScope',
            '$http',
            '$sessionStorage',
            'urlService',
            function (
                $scope,
                complaintCommon,
                complaintsService,
                ngTableParams,
                $rootScope,
                $http,
                $sessionStorage,
                urlService
            ) {

                var vm = {
                    filter: {},
                    operation: null
                };
                $scope.vm = vm;


                // set filter for request
                vm.setFilter = function() {
                    return {
                        unifiedField: vm.filter.title || null,
                        titleOrDescription: vm.filter.titleOrDescription || null,
                        relatedEntityTypes: vm.filter.selectedRelatedEntityTypes || [],
                        procurementMethodTypes: vm.selectedProcTypes || [],
                        cpvs: vm.getAllCpvs && vm.getAllCpvs() || [],
                        statuses: vm.selectedStatuses || [],
                        dateSubmitted: {
                            from: vm.filter.tenderCreationTimeFrom || null,
                            to: vm.filter.tenderCreationTimeTo || null
                        },
                        lastModificationTime: {
                            from: vm.filter.lastModificationTimeFrom || null,
                            to: vm.filter.lastModificationTimeTo || null
                        },
                        dateDecision: {
                            from: vm.filter.dateDecisionFrom || null,
                            to: vm.filter.dateDecisionTo || null
                        },
                        amount: {
                            from: vm.filter.priceFrom || null,
                            to: vm.filter.priceTo || null
                        },
                        complaintStatuses: vm.filter.selectedComplaintStatuses || [],
                        customerEdrpou: vm.filter.parentCodeEDRPOU || null,
                        iAmCreatorUser: vm.filter.iAmCreatorUserCheckbox || false,
                        externalId: vm.filter.externalId || null,
                        organizationEdrpou: vm.filter.authorCodeEDRPOU || null,
                        types: getCheckedTypes()
                    };
                }

                function getCheckedTypes() {
                    types = [];
                    angular.forEach(vm.types,
                        function (complaintType) {
                            if (complaintType.checked)
                                types.push(complaintType.type);
                        });
                    return types;
                }

                // save clean filter request obj
                vm.requestCleanData = angular.copy(vm.setFilter());

                // restore saved data from storage (if exists)
                var saveFilter = 'saveFilterComplaint';
                if ($sessionStorage[saveFilter]) {
                    var savedFilter = $sessionStorage[saveFilter];
                    vm.filter = savedFilter.filter;

                    vm.statusSearchText = savedFilter.fields.statusSearchText;
                    vm.checkedStatuses = savedFilter.fields.checkedStatuses;
                    vm.selectedStatuses = savedFilter.fields.selectedStatuses;
                    vm.procTypeSearchText = savedFilter.fields.procTypeSearchText;
                    vm.checkedProcTypes = savedFilter.fields.checkedProcTypes;
                    vm.selectedProcTypes = savedFilter.fields.selectedProcTypes;
                    vm.types = savedFilter.fields.types;
                    vm.typesText = savedFilter.fields.typesText;
                    vm.relatedEntityTypes = savedFilter.fields.relatedEntityTypes;
                    vm.typeComplTextInput = savedFilter.fields.typeComplTextInput;
                    vm.selectedRelatedEntityTypes = savedFilter.fields.selectedRelatedEntityTypes;

                    vm.selectedComplaintStatuses = savedFilter.fields.selectedComplaintStatuses;
                    vm.statusComplTextInput = savedFilter.fields.statusComplTextInput;
                    vm.complaintStatuses = savedFilter.fields.complaintStatuses;
                    vm.selectedCpvs = savedFilter.fields.selectedCpvs;

                    vm.getClearFilterButton && vm.getClearFilterButton();
                }


                function getSearcInput(ngTableParams) {

                    var orderBy = ngTableParams.orderBy(); // add '-' on start str
                    var sorting = ngTableParams.sorting();
                    var orderColumn = orderBy.length > 0 ? orderBy[0].substring(1) : 'Date';
                    var orderDirection = sorting[orderColumn] ? sorting[orderColumn] : 'desc';

                    var operationsInput = {
                        page: {
                            number: ngTableParams.page(),
                            size: ngTableParams.count()
                        },
                        sort:
                        {
                            column: orderColumn,
                            direction: orderDirection
                        },
                        filter: vm.setFilter()
                    };
                    $sessionStorage[saveFilter] = {
                        filter: vm.filter,
                        operationsInputFilter: operationsInput.filter,
                        fields: {
                            statusSearchText: vm.statusSearchText,
                            checkedStatuses: vm.checkedStatuses,
                            selectedStatuses: vm.selectedStatuses,
                            procTypeSearchText: vm.procTypeSearchText,
                            checkedProcTypes: vm.checkedProcTypes,
                            selectedProcTypes: vm.selectedProcTypes,
                            types: vm.types,
                            typesText: vm.typesText,
                            relatedEntityTypes: vm.relatedEntityTypes,
                            typeComplTextInput: vm.typeComplTextInput,
                            selectedRelatedEntityTypes: vm.selectedRelatedEntityTypes,
                            complaintStatuses: vm.complaintStatuses,
                            statusComplTextInput: vm.statusComplTextInput,
                            selectedComplaintStatuses: vm.selectedComplaintStatuses,
                            selectedCpvs: vm.selectedCpvs
                        }
                    };
                    return operationsInput;

                };

                var page = urlService.redirectToCorrectPage();

                vm.tableParams = new ngTableParams({
                    page: page,
                    count: 10
                }, {
                        counts: [],
                        getData: function ($defer, params) {

                            var operationsInput = getSearcInput(params);

                            var operations = complaintCommon.getComplaintsElastic(operationsInput);
                            abp.ui.setBusy('.main-container');
                            operations.then(function (reponse) {
                                var data = reponse.data;
                                params.total(data.totalCount);
                                console.log(data);
                                vm.operations = data.items;
                                vm.totalCount = data.totalCount;
                                vm.operation = null;
                                $rootScope.lastPage = params.page();
                                vm.getClearFilterButton && vm.getClearFilterButton();
                                $defer.resolve(data.items);
                                abp.ui.clearBusy('.main-container');
                            }, function () {
                                abp.ui.clearBusy('.main-container');
                            })
                        }
                    });

                vm.search = function () {
                    if (vm.tableParams.page() === 1) {
                        vm.tableParams.reload();
                    } else {
                        vm.tableParams.page(1);
                    }
                }

                vm.searchByAuthorEDRPOU = function(edrpo) {
                    vm.filter.authorCodeEDRPOU = edrpo;
                    vm.search();
                }
                vm.searchByParentEDRPOU = function (edrpo) {
                    vm.filter.parentCodeEDRPOU = edrpo;
                    vm.search();
                }

                vm.getStatusLabelClass = function (s) {return complaintsService.getStatusLabelClass(s);}
                vm.getComplaintFor = function (complaint) {return complaintsService.getComplaintFor(complaint);}
                vm.getTypeLabelClass = function (s) {return complaintsService.getTypeLabelClass(s);}
                vm.getTypeUkr = function (s) {return complaintsService.getTypeUkr(s);}
                vm.getComplaintStatusUkr = function (s, type, newFlow) {return complaintsService.getComplaintStatusUkr(s, type, newFlow);}
                vm.getOperation = function (id) {return vm.operation = vm.operations[id];}
                vm.clear = function() {
                    vm.filter = {
                        title: null,
                        titleOrDescription: null,
                        tenderCreationTimeFrom: null,
                        tenderCreationTimeTo: null,
                        lastModificationTimeFrom: null,
                        lastModificationTimeTo: null,
                        dateDecisionFrom: null,
                        dateDecisionTo: null,
                        priceFrom: null,
                        priceTo: null,
                        parentCodeEDRPOU: null,
                        iAmCreatorUser: false,
                        externalId: null,
                        authorCodeEDRPOU: null,
                        selectedRelatedEntityTypes: [],
                        selectedComplaintStatuses: []
                    };
                    angular.forEach(vm.types,
                        function (type) {
                            type.checked = false;
                        }
                    );
                    vm.filter.iAmCreatorUserCheckbox = false;
                    vm.procurementMethod = [];
                    vm.selectedStatuses = [];
                    vm.checkedStatuses = [];
                    vm.statusSearchText = null;
                    vm.statusSearchLabel = null;
                    vm.selectedProcTypes = [];
                    vm.checkedProcTypes = [];
                    vm.procTypeSearchText = null;
                    vm.selectedOrgCodes = [];
                    if (vm.selectedCpvs.length > 0) {
                        vm.selectedCpvs = [];
                        $rootScope.clearCheckbox();
                    }
                    vm.setTypeComplTextInput();
                    vm.setStatusComplTextInput();
                    vm.getClearFilterButton();
                };

                $scope.getExcel = function () {
                    $scope.blockDownloadExcel = true;
                    abp.notify.error('В Excel файл система завантажить не більше 10000 вимог/скарг за обраними Вами параметрами', 'Зверніть увагу!');

                    var input = getSearcInput(vm.tableParams);
                    input.page = {
                        number: 1,
                        size: 10000
                    };

                    complaintCommon.getComplaintsExcel(input)
                        .then(function (reponse) {
                            var fileName = reponse.data;
                            $http({
                                url: "api/files/DownloadAndDelete",
                                method: "POST",
                                params: { downloadFileKind: 'ExcelsOutputFile', fileName: fileName },
                                responseType: 'arraybuffer'
                            })
                                .then(
                                    function (response) {
                                        var file = new Blob([response.data], { type: 'application/octet-stream' });
                                        saveAs(file, fileName);                                    
                                        $scope.blockDownloadExcel = false;
                                    },
                                    function () {
                                        $scope.blockDownloadExcel = false;
                                    }
                                );
                        }, function () {
                            $scope.blockDownloadExcel = false;
                        });
                };

            }]);
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('setStoppingComplaintCtrl', setStoppingComplaint);

    setStoppingComplaint.$inject = [
        '$scope',
        'abp.services.etender.tenderComplaint',
        'abp.services.etender.awardComplaint',
        'abp.services.etender.qualificationComplaint',
        'abp.services.etender.cancellationComplaint',
    ];

    function setStoppingComplaint(
        $scope,
        tenderComplaintService,
        awardComplaintService,
        qualificationComplaintService,
        cancellationComplaintService
    ) {
        $scope.vm = {
            description: '',
            sendStoppingComplaint: sendStoppingComplaint
    };
        var vm = $scope.vm;

        function sendStoppingComplaint() {
            var complaintIdModal = $scope.$root.complaintIdModal;
            var complaintPromise = null;
            switch ($scope.$root.complaintFor) {
                case 'tender':
                    complaintPromise = tenderComplaintService.setStoppingStatus({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
                case 'award':
                    complaintPromise = awardComplaintService.setStoppingStatus({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
                case 'qualification':
                    complaintPromise = qualificationComplaintService.setStoppingStatus({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
                case 'cancellation':
                    complaintPromise = cancellationComplaintService.setStoppingStatus({ "Id": complaintIdModal, "cancellationReason": vm.description });
                    break;
            }
            abp.ui.setBusy('#' + complaintIdModal);
            complaintPromise.then(function (data) {
                abp.notify.success("скасовано!");
                $('#setStoppingComplaint').modal('toggle');
                $('body').removeClass('modal-open');
                $('.modal-backdrop').remove();
                $scope.$emit('reloadTender');
                abp.ui.clearBusy('#' + complaintIdModal);
            }, function (data) {
                abp.ui.clearBusy('#' + complaintIdModal);
            });
        }
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('tendererActionComplaintCtrl', tendererActionComplaint);

    tendererActionComplaint.$inject = [
        '$scope',
        'abp.services.etender.tenderComplaint',
        'abp.services.etender.awardComplaint',
        'abp.services.etender.qualificationComplaint',
        'abp.services.etender.cancellationComplaint',
    ];

    function tendererActionComplaint(
        $scope,
        tenderComplaintService,
        awardComplaintService,
        qualificationComplaintService,
        cancellationComplaintService
    ) {
        $scope.vm = {
            description: '',
            sendTendererActionComplaint: sendTendererActionComplaint
        };
        var vm = $scope.vm;

        function sendTendererActionComplaint() {
            var complaintIdModal = $scope.$root.complaintIdModal;
            var complaintPromise = null;
            switch ($scope.$root.complaintFor) {
                case 'tender':
                    complaintPromise = tenderComplaintService.setResolvedStatus({ "Id": complaintIdModal, "tendererAction": vm.description });
                    break;
                case 'award':
                    complaintPromise = awardComplaintService.setResolvedStatus({ "Id": complaintIdModal, "tendererAction": vm.description });
                    break;
                case 'qualification':
                    complaintPromise = qualificationComplaintService.setResolvedStatus({ "Id": complaintIdModal, "tendererAction": vm.description });

                    break;
                case 'cancellation':
                    complaintPromise = cancellationComplaintService.setResolvedStatus({ "Id": complaintIdModal, "tendererAction": vm.description });
                    break;
            }
            abp.ui.setBusy('#' + complaintIdModal);
            complaintPromise.then(function (data) {
                abp.notify.success("Повідомлення про усунення порушення відправлено!");
                $('#tendererActionComplaint').modal('toggle');
                $('body').removeClass('modal-open');
                $('.modal-backdrop').remove();
                $scope.$emit('reloadTender');

                abp.ui.clearBusy('#' + complaintIdModal);
            }, function (data) {
                abp.ui.clearBusy('#' + complaintIdModal);
            });
        }
    }
})();;
(function () {
    'use strict';
    var controllerId = 'dozorroReviewCtrl';
    angular.module('app').controller(controllerId, [
        '$scope',
        '$stateParams',
        '$timeout',
        '$location',
        'abp.services.etender.dozorro',
        function (
            $scope,
            $stateParams,
            $timeout,
            $location,
            dozorro) {

            var lang = 'uk';
            var tenderApiId = $stateParams.tId;
            var formId = $stateParams.fId;
            var schema = {};
            $scope.anonymous = false;

           

            function submit(review) {
                var data = dataSubmit(review);

                //window.alert('Form submitted. Values object:\n' + JSON.stringify(data, null, 2));
                
                abp.ui.setBusy();
                var submitReview = dozorro.sendFeedback(data);
                submitReview
                    .then(function () {
                        abp.notify.success("Запис створено!");
                        abp.ui.clearBusy();
                        history.back();
                    }, function (err) {
                        abp.ui.clearBusy();
                        console.log(err.data);
                    });
            }

            function dataSubmit(review) {
                var data = {
                    review: review,
                    tenderApiId: tenderApiId,
                    formId: formId,
                    anonymous: $scope.anonymous
                };
                return data;
            }
            /*
            schema = {
                "envelope": {
                    "date": "2016-11-01T08:00:00.112315+03:00",
                    "model": "admin/schema",
                    "owner": "root",
                    "payload": {
                        "model": "form/tender112",
                        "schema": {
                            "$schema": "http://json-schema.org/schema#",
                            "additionalProperties": false,
                            "properties": {
                                "author": {
                                    "$ref": "#/definitions/author",
                                    "description": "author schema described in comment model"
                                },
                                "formData": {
                                    "additionalProperties": false,
                                    "form": [
                                      {
                                          "title": "Evaluation of how was the contract executed by the procuring entity",
                                          "title_ru": "Оценка исполнения заказчиком условий договора о закупке ( для поставщика)",
                                          "title_uk": "Оцінка виконання замовником умов договору про закупівлю (для постачальника)",
                                          "type": "title"
                                      },
                                      {
                                          "items": [
                                            {
                                                "inline": true,
                                                "key": "purchaserDutiesExecution",
                                                "title": "Evaluate the perfomance of it’s duties by the procuring entity",
                                                "title_ru": "Оцените качество исполнения заказчиком своих обязательств",
                                                "title_uk": "Оцініть якість виконання замовником своїх обов’язків",
                                                "type": "radios"
                                            },
                                            {
                                                "key": "purchaserDutiesExecutionComment",
                                                "title": "Your commentary",
                                                "title_ru": "Ваш комментарий",
                                                "title_uk": "Ваш коментар",
                                                "type": "textarea"
                                            }
                                          ],
                                          "type": "fieldset"
                                      },
                                      {
                                          "items": [
                                            {
                                                "key": "purchaserInteractionProblems",
                                                "title": "Which problems occurred during the cooperation with the procuring entity",
                                                "titleMap": {
                                                    "dontSigning": "Refusal to sign the documents",
                                                    "goodsReceipt": "Creating difficulties while receiving the goods",
                                                    "latePayment": "Delays with payment",
                                                    "other": "Other",
                                                    "priceChange": "Change of the price",
                                                    "termsFailure": "Messing the deadlines"
                                                },
                                                "titleMap_ru": {
                                                    "dontSigning": "Неподписание документов",
                                                    "goodsReceipt": "Создание препятствий при приемке товара",
                                                    "latePayment": "Несвоевременная оплата",
                                                    "other": "Другое",
                                                    "priceChange": "Изменение цены",
                                                    "termsFailure": "Несоблюдение сроков"
                                                },
                                                "titleMap_uk": {
                                                    "dontSigning": "Непідписання документів",
                                                    "goodsReceipt": "Створення перешкод при прийомці товару",
                                                    "latePayment": "Несвоєчасна оплата",
                                                    "other": "Інше",
                                                    "priceChange": "Зміна ціни",
                                                    "termsFailure": "Недотримання строків"
                                                },
                                                "title_ru": "Какие проблемы возникли при взаимодействии с заказчиком (выберите один или несколько вариантов)",
                                                "title_uk": "Які саме проблеми виникли у взаємодії із замовником (оберіть один або декілька варіантів):",
                                                "type": "checkboxes"
                                            },
                                            {
                                                "key": "purchaserInteractionProblemsComment",
                                                "title": "Your commentary",
                                                "title_ru": "Ваш комментарий",
                                                "title_uk": "Ваш коментар",
                                                "type": "textarea"
                                            }
                                          ],
                                          "type": "fieldset"
                                      }
                                    ],
                                    "properties": {
                                        "purchaserDutiesExecution": {
                                            "enum": [
                                              "1",
                                              "2",
                                              "3",
                                              "4",
                                              "5"
                                            ],
                                            "type": "string"
                                        },
                                        "purchaserDutiesExecutionComment": {
                                            "maxLength": 10000,
                                            "minLength": 1,
                                            "type": "string"
                                        },
                                        "purchaserInteractionProblems": {
                                            "items": {
                                                "enum": [
                                                  "termsFailure",
                                                  "latePayment",
                                                  "goodsReceipt",
                                                  "priceChange",
                                                  "dontSigning",
                                                  "other"
                                                ],
                                                "type": "string"
                                            },
                                            "minItems": 1,
                                            "type": "array",
                                            "uniqueItems": true
                                        },
                                        "purchaserInteractionProblemsComment": {
                                            "maxLength": 10000,
                                            "minLength": 1,
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                      "purchaserDutiesExecution"
                                    ],
                                    "type": "object"
                                },
                                "tender": {
                                    "pattern": "^[0-9a-f]{32}$",
                                    "reference": "tenders",
                                    "type": "string"
                                }
                            },
                            "required": [
                              "author",
                              "tender",
                              "formData"
                            ],
                            "title": "Purchaser contract execution tender112",
                            "type": "object"
                        }
                    }
                },
                "id": "00e1e0e4fa06c6e2ccb456d093986388",
                "sign": "AVb+bcdeZg4foEUiqkSW5W0DAwg+zVO5pYpVQA/yS6JO2kfLkX8ebs1wM13T1oKf6aAw1Q1nUYUHXHZVEdD3DQ"
            };
            */

            var generateForm = function (jsonStr) {
                var createdForm = JSON.parse(jsonStr);

                // Reset result pane
                $('#result').html('');

                // Parse entered content as JavaScript
                // (mostly JSON but functions are possible)

                // Most examples should be written in pure JSON,
                // but playground is helpful to check behaviors too!

                //if ('envelope' in createdForm)
                //    createdForm = createdForm['envelope']['payload']['schema'];
                // handle monitoring forms
                if ('properties' in createdForm) {
                    var findFormShema = function (top) {
                        if ('form' in top && 'properties' in top) {
                            top['schema'] = top['properties'];
                            delete top['properties'];
                            return top;
                        }
                        if (top && typeof top == 'object') {
                            for (var key in top) {
                                var res = null;
                                if (typeof top[key] == 'object')
                                    if (res = findFormShema(top[key]))
                                        return res;
                            }
                        }
                        return null;
                    }
                    var patchByLang = function (items) {
                        var title_lang = 'title_' + lang,
                            helpvalue_lang = 'helpvalue_' + lang,
                            titleMap_lang = 'titleMap_' + lang;

                        for (var key in items) {
                            var val = items[key];
                            if (title_lang in val)
                                val['title'] = val[title_lang];
                            if (helpvalue_lang in val)
                                val['helpvalue'] = val[helpvalue_lang];
                            if (titleMap_lang in val)
                                val['titleMap'] = val[titleMap_lang];
                            if ('items' in val)
                                patchByLang(val['items']);
                        }
                    }
                    var patchFormSchema = function (schema) {
                        if ('required' in schema) {
                            for (var key in schema['required']) {
                                var val = schema['required'][key];
                                schema['schema'][val]['required'] = true;
                            }
                        }
                        // patch by current language
                        if (lang.length && 'form' in schema) {
                            patchByLang(schema['form']);
                        }
                        if ('form' in schema && 'type' in schema['form'][0]) {
                            if (schema['form'][0]['type'] == 'title') {
                                schema['title'] = schema['form'][0]['title'];
                                schema['form'].splice(0, 1);
                            }
                        }
                        return schema;
                    }
                    createdForm = findFormShema(createdForm);
                    console.log(createdForm);
                    if (!createdForm)
                        throw "form shema not found in object tree";
                    createdForm = patchFormSchema(createdForm);
                }

                // Render the resulting form, binding to onSubmitValid
                createdForm.onSubmitValid = function (values) {
                  if (console && console.log) {
                        console.log('Values extracted from submitted form', values);
                    }
                    submit(values);
                };
                createdForm.onSubmit = function (errors, values) {
                    if (errors) {
                        if (errors.mass)
                            console.log('Validation errors', errors);
                        return false;
                    }
                    return true;
                };
                abp.ui.clearBusy();
                $('#form-title').html(createdForm['title'] || 'Generated form');
                $('#result').html('<form id="result-form" class="form-vertical"></form>');
                $('#result-form').html('<input id="submit" type="submit" class="btn btn-primary mt25" value="Отправить">');
                try {
                    $('#result-form').jsonForm(createdForm);
                } catch (err) {
                    generateForm();
                    return;
                }
                if ($('textarea')) $('textarea').addClass('form-control');
                
                abp.ui.clearBusy();
            };

            function getForm(tenderForm) {
                abp.ui.setBusy();
                var getFrorm = dozorro.getJsonForm(tenderForm);
                getFrorm
                    .then(function (response) {
                        schema = response.data.schema;
                        generateForm(schema);
                        //$timeout(generateForm, 3000);
                        abp.ui.clearBusy();
                    }, function (err) {
                        abp.ui.clearBusy();
                        console.log(err.data);
                    });
            }

            abp.ui.setBusy();
            getForm(formId);
        }]);
})();;
(function() {
    var controllerId = 'homeCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', function ($scope) {

        }
    ]);
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('layoutProzorroCtrl', accessionTreaty);
    accessionTreaty.$inject = ['$scope', '$location', '$http', '$controller', '$ocLazyLoad', '$timeout'];
    function accessionTreaty($scope, $location, $http, $controller, $ocLazyLoad, $timeout) {
        angular.extend(this, $controller('layoutCtrl', {
            $scope: $scope
        }));

        //angular.element(document).ready(function () {
        //    $timeout(function () {
        //        $ocLazyLoad.load('Scripts/analytics/fbevents.js');
        //        $ocLazyLoad.load('Scripts/analytics/linkid.js');
        //    }, 2000);

        //});

        // get prozorro sign scripts
    }
})();
;
(function () {
	'use strict';
	angular
		.module('app')
		.controller('myTendersProzorroCtrl', myTenders);
    myTenders.$inject = [
        '$scope',
        '$rootScope',
        '$location',
        'tenderHelperService',
        '$controller',
        '$sessionStorage'
    ];
    function myTenders(
        $scope,
        $rootScope,
        $location,
        tenderHelperService,
        $controller,
        $sessionStorage
    ) {
        angular.extend(this, $controller('myTendersCtrl', {
            $scope: $scope
        }));
        var vm = $scope.vm;

        $scope.vm.goToCreate = goToCreate;
        updateNavigation();

       // ******* navigation *******
        if (!$sessionStorage.procTypeMyTenders) $sessionStorage.procTypeMyTenders = ['open', 'selective'];
        $rootScope.$on('organiztionDataLoaded', updateNavigation);

        function updateNavigation() {
            $scope.navigation = [
                {
                    title: $rootScope.source('CompetitiveProcedures'),
                    type: 'open',
                    active: $sessionStorage.procTypeMyTenders && angular.equals($sessionStorage.procTypeMyTenders, ['open', 'selective']) || false,
                    show: true,
                    openFunc: function () {
                        $scope.vm.procTypeClicked(['open', 'selective']);
                    }

                }, {
                    title: $rootScope.source('NoncompetitiveProcedures'),
                    type: 'limited',
                    active: $sessionStorage.procTypeMyTenders && angular.equals($sessionStorage.procTypeMyTenders, ['limited']) || false,
                    show: true,
                    openFunc: function () {
                        $scope.vm.procTypeClicked(['limited']);
                    }

                }, {
                    title: $rootScope.source('TendersArchive'),
                    type: 'archive',
                    active: $sessionStorage.procTypeMyTenders && angular.equals($sessionStorage.procTypeMyTenders, ['archive']) || false,
                    show: true,
                    openFunc: function () {
                        $scope.vm.archiveClicked();
                    }
                }, {
                    title: "Холдинг",
                    type: 'holding',
                    active: $sessionStorage.procTypeMyTenders && angular.equals($sessionStorage.procTypeMyTenders, ['holding']) || false,
                    show: $scope.ng_localStorage.organization && $scope.ng_localStorage.organization.isMemberOfCorporation,
                    openFunc: function () {
                        $scope.vm.procTypeClicked(['holding']);
                    }
                }];
        }
        
             function goToCreate() {
                 if (!vm.sProcedureType) return;
                 $('#procedureType').modal('hide');
                 tenderHelperService.selectedProcType = vm.sProcedureType.type;
                 if (vm.sProcedureType.type === "belowThreshold") {
                     vm.sProcedureType.href = '/createTender/belowThreshold';
                 }
                 if (vm.sProcedureType.type === "belowThresholdSimple") {
                     vm.sProcedureType.href = '/createTender/simple';
                 }
                 $location.path(vm.sProcedureType.href);
             };

    }
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('publicPlansCtrl', myTenders);
    myTenders.$inject = ['$scope', '$controller'];

    function myTenders($scope, $controller) {
        angular.extend(this, $controller('publicPlansBaseCtrl', {
            $scope: $scope
        }));
    }
})();;
(function () {
    var controllerId = 'authorizedPersonsCtrl';
    angular.module('app').controller
        (controllerId, [
            '$rootScope',
            '$scope',
            'ngTableParams',
            'abp.services.etender.user',
            'abp.services.etender.organization',
            '$location',
            '$localStorage',
            'abp.services.etender.subscriptionToSubmittedUser',
            'abp.services.etender.role',
            function (
                $rootScope,
                $scope,
                ngTableParams,
                user,
                organization,
                $location,
                $localStorage,
                subscriptionToSubmittedUsers,
                roleService
            ) {
                $scope.permissions = {
                    canGrantCallCenterOperatorRole: abp.auth.hasPermission('SuperOperator.GrantCallCenterOperatorRole'),
                };

                var hasRole = function (allRoles, roleToFind) {
                    return allRoles.includes(roleToFind);
                };

                $scope.hasCallCenterOperatorRole = function (allRoles) {
                    return hasRole(allRoles, 'CallCenterOperator');
                };

                $scope.hasSuperCallCenterOperatorRole = function (allRoles) {
                    return hasRole(allRoles, 'SuperCallCenterOperator');
                };

                $scope.ng_localStorage = $localStorage;
                $rootScope.$watch('organizationTabs', function () {
                    $scope.organizationMenu = $rootScope.organizationTabs;
                });
                $scope.url = $location.path();

                $scope.reloadTenders = function () { };
                $scope.currentUserName = '';
                $scope.subscriptionToSubmittedUsers = null;

                $scope.roles = {
                    admin: {
                        roleName: "Admin",
                        isInRole: false
                    },
                    subscriber: {
                        roleName: "Subscriber",
                        isInRole: false
                    },
                    customer: {
                        roleName: "Customer",
                        isInRole: false
                    }
                };
                $scope.approveUserInput = {
                    tenantApprovementMessage: ''
                };

                $scope.getSubscrToSubmittedUserData = function () {
                    subscriptionToSubmittedUsers.getSubscriptionToSubmittedUsers({})
                        .then(function (response) {
                            console.log(response);
                            $scope.subscriptionToSubmittedUsers = response.data && response.data.id ? true : false;
                        }, function (error) {
                            console.log(error);
                        });
                }

                $scope.setSubscrToSubmittedUserData = function () {
                    abp.ui.setBusy();
                    subscriptionToSubmittedUsers.triggerSubscriptionToSubmittedUsers({})
                        .then(function (response) {
                            console.log(response);
                            $scope.subscriptionToSubmittedUsers = response.data && response.data.id ? true : false;
                            abp.ui.clearBusy();
                        }, function (error) {
                            console.log(error);
                            $scope.subscriptionToSubmittedUsers = false;
                            abp.ui.clearBusy();
                        });
                }


                $scope.setApproveUser = function (isApproved, userId) {

                    if (!$scope.approveUserInput.tenantApprovementMessage)
                        $scope.approveUserInput.tenantApprovementMessage = '';

                    var approveUserInput = $scope.approveUserInput;
                    approveUserInput.roles = [];

                    var roles = $scope.roles;
                    for (var prop in roles) {
                        if (roles[prop].isInRole) {
                            approveUserInput.roles.push(roles[prop].roleName);
                        }
                    }
                    approveUserInput.tenantId = $scope.ng_localStorage.userTenantId;
                    approveUserInput.userId = userId;
                    approveUserInput.isApproved = isApproved;

                    organization.setUserTenantApprovement(approveUserInput)
                        .then(function (data) {
                            abp.notify.success("Користувача успішно затверджено");
                            $scope.tableUsersParams.reload();
                        });
                };

                $scope.tableUsersParams = new ngTableParams(
                    {
                        page: 1,
                        count: 10,
                        sorting: { tenderStartDate: 'desc' }
                    },
                    {
                        counts: [],
                        getData: function ($defer, params) {
                            var input = {
                                maxResultCount: 900,
                                skipCount: (params.page() - 1) * params.count(),
                                sorting: "CreationTime DESC"
                            };
                            var getUsersToTenant = organization.getUsersWantJoinToTenantAsync(input);
                            abp.ui.setBusy(".panel-default:first");
                            getUsersToTenant.then(function (resposne) {
                                abp.ui.clearBusy(".panel-default");
                                //params.total(data.countAllRecords);
                                console.log(resposne.data);
                                $defer.resolve(resposne.data.items);
                            });

                        }
                    });

                $scope.setUserRole = function (item, roleState) {
                    var input = {
                        admin: roleState['admin'],
                        subscriber: roleState['subscriber'],
                        customer: roleState['customer'],
                        userId: item.userId,
                        tenantId: item.tenantId
                    };
                    var serviceSetUserRole = organization.setUserRoleByUserId(input);
                    serviceSetUserRole.then(function (data) {
                        abp.notify.success('Роль встановлена.');
                        $scope.tableUsersParams.reload();
                    },
                        function () {
                            abp.notify.error('Роль не встановлена.');
                        });
                }

                $scope.showUserInfo = function (item) {
                    $scope.item = item;
                    $scope.approveUserInput.tenantApprovementMessage = item.tenantApprovementMessage;
                    var userRoles = item.user.roles;
                    if (typeof userRoles == 'object' && userRoles instanceof Array)
                        for (var roleItem in $scope.roles) {
                            var roleName = $scope.roles[roleItem].roleName;
                            $scope.roles[roleItem].isInRole = userRoles.indexOf(roleName) > -1;
                        }
                    // console.dir($scope.roles);
                    $("#modalAuthorizedUser").modal('show');
                };

                $scope.showUserTenders = function (username) {
                    $scope.currentUserName = username;
                    $rootScope.$broadcast('userNameChange', username);
                    $("#modalUserTenders").modal('show');
                };

                $scope.setUserBlockStatus = function (isBlocked, userName) {
                    var notifyMessage = isBlocked ? "Користувача заблоковано" : "Користувача розблоковано";
                    var setBlock = user.blockOrUnblockUser({ userName: userName, isBlock: isBlocked });
                    setBlock
                        .then(function (data) {
                            abp.notify.success(notifyMessage);
                            $scope.tableUsersParams.reload();
                        },
                            function () {
                                abp.notify.error('Не вдалося виконати операцію по блокуванню/розблокуванню користувача!');
                            });
                };

                $scope.triggerCallCenterOperatorRoleToUser = function (userId) {
                    roleService.triggerCallCenterOperatorRoleToUser({ userId: userId })
                        .then(function (data) {
                            abp.notify.success('Операцію виеонано успішно');
                            $scope.tableUsersParams.reload();
                        },
                            function () {
                                abp.notify.error('Не вдалося виконати операцію!');
                            });
                };

                $scope.triggerSuperCallCenterOperatorRoleToUser = function (userId) {
                    roleService.triggerSuperCallCenterOperatorRoleToUser({ userId: userId })
                        .then(function (data) {
                                abp.notify.success('Операцію виеонано успішно');
                                $scope.tableUsersParams.reload();
                            },
                            function () {
                                abp.notify.error('Не вдалося виконати операцію!');
                            });
                };

            }
        ]);
})();;
(function () {
	'use strict';
	angular
		.module('app')
		.controller('bankOperationsSpecCtrl', bankOperations);
	bankOperations.$inject = ['$rootScope', '$scope', 'abp.services.etender.address',
		'abp.services.etender.internalAccount',
		'abp.services.etender.allBanking',
		'ngTableParams',
		'abp.services.etender.invoice',
		'abp.services.etender.organization',
		'abp.services.etender.act', '$filter',
		'abp.services.etender.settings',
		'abp.services.etender.numberConverter',
		'datesHelperService', '$controller'];

	function bankOperations($rootScope, $scope, addressAppService, internalAccountAppService, allbankingAppService, ngTableParams,
		invoiceAppService, organizationAppService, actAppService, $filter, settingsAppService, nConverterAppService, datesHelperService, $controller) {
		angular.extend(this, $controller('bankOperationsCtrl', { 
			$scope: $scope
		}));

		$scope.bill = 'UA133052990000026003046204945';
         $scope.vm.sendToRialto = sendToRialto;

         $scope.tarifsUrl = 'https://e-tender.ua/rates-prozorro';

		$scope.invoiceHeader = {
		    text: "Шановний Користувачу! В цьому рахунку вказано нові реквізити банка отримувача ТОВ \"Е-Тендер\". Будьте уважні при здійсненні платежу!",
		    style: 'warning',
		    fontSize: 21
		};

		$scope.howPayer = function (isVatPayer) {
		    return isVatPayer ? 'Товариство з обмеженою відповідальністю  "Е-Тендер" \n п/р ' + $scope.bill + ', ПАТ КБ «ПРИВАТБАНК»,  МФО 305299 \n 04119 м. Київ, вул. Дегтярівська, буд. 21 літ. «А», \n код ЄДРПОУ 39484263'
                                     : 'Товариство з обмеженою відповідальністю  "Е-Тендер" \n п/р ' + $scope.bill + ', ПАТ КБ «ПРИВАТБАНК»,  МФО 305299 \n 04119 м. Київ, вул. Дегтярівська, буд. 21 літ. «А», \n код ЄДРПОУ 39484263, Платник єдиного податку';
		};
		function sendToRialto() {
            abp.ui.setBusy("#sendForm");
            var sendMoney = {
                summ: $scope.vm.summ,
                systemFrom: 'etender',
                systemTo: 'rialto'
            };
            allbankingAppService.sendMoneyToOtherSystem(sendMoney)
                .then(function () {
                    $scope.endDateFunds.free = $scope.endDateFunds.free - $scope.vm.summ;
                    abp.notify.success('Операцію виконано успішно!');
                    abp.ui.clearBusy("#sendForm");
                },
                function (e) {
                    abp.ui.clearBusy("#sendForm");
                });
		}

	}
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('choosedTendersProzorroCtrl', choosedTenders);

    choosedTenders.$inject = ['$scope', '$controller', 'tenderHelperService'];

    function choosedTenders($scope, $controller, tenderHelperService) {
        angular.extend(this, $controller('choosedTendersCtrl', {
            $scope: $scope
        }));
    }
})();;
(function () {
    angular.module('app') 
        .controller('createProfileCtrl', [
            '$rootScope',
            '$scope',
            'abp.services.etender.reference',
            'abp.services.etender.address',
            'abp.services.etender.organization',
            '$location',
            '$window',
            '$timeout',
            '$localStorage',
            'organizationDataService',
            '$cookies',
            function (
                $rootScope,
                $scope,
                reference,
                address,
                organization,
                $location,
                $window,
                $timeout,
                $localStorage,
                organizationDataService,
                $cookies) {
                $scope.request = {};
                $scope.ng_localStorage = $localStorage;

                $scope.docTypes = [{
                    typeName: 'В електронному вигляді через M.E.Doc',
                    type: 'electronic'
                }, {
                    typeName: 'У паперовому вигляді',
                    type: 'paper'
                    }];
                $scope.selectedDocType = $scope.docTypes[0];
                organizationDataService.getOrganizationScaleList();

                $scope.scaleInfo = function () {
                    return organizationDataService.scaleInfo();
                };
                // todo переделать на SignalR - чтобы если юзера подтвердили - он об этом узнал без нажатия F5
                $timeout(function () {
                    //if ($scope.ng_localStorage.userTenantId !== null && $scope.ng_localStorage.isAgreementSigned) { $location.path('/'); }
                    organization.isCanOrganizationCreate()
                        .then(function (response) {
                            if (response.data === false)
                                $location.path('/');
                        },
                        function (error) {
                            $location.path('/');
                        });
                }, 2);

                var joinName = function (nameObj) {
                    return nameObj.lastName + ' ' + nameObj.firstName + ' ' + (nameObj.patronymic ? nameObj.patronymic : '');
                };

                $scope.request = {
                    reason: 'Прошу зареєструвати мене як Працівника організації...'
                };

                $scope.profileData = {
                    addressId: null,
                    codeOfOrganization: null,
                    organizationKindId: null,
                    name: null,
                    nameEN: null,
                    isCustomer: false,
                    shortName: null,
                    typeOfOrganization: null,
                    userName: $scope.ng_localStorage.username,
                    phone: null,
                    fax: null,
                    url: null,
                    contactEmail: null,
                    userId: abp.session.userId,
                    isVatPayer: false,
                    vatNumber: null,
                    schemeId: 36,
                    kinds: null,
                    changeKind: changeKind,
                    sKind: null,
                    isCommercialCustomer: false,
                    documentWayType: $scope.selectedDocType.type,
                    CompanyCreationGATag : $cookies.get("_ga")
                };

                var directorData, contactPointData, addressData;
                var countCallFunction = 0;
                $scope.director = { firstName: null, lastName: null, patronymic: null };
                $scope.address = {};
                $scope.person = {};
                $scope.schemeWrapper = { scheme: { id: 36 }};
                $scope.showMessage = false;
                $scope.isRegistered = false;  //temporary
                $scope.isParentRegistered = true;
                $scope.isPostAddressDiff = false;
                $scope.step = 1;
                $scope.contactPoint = {};
                $scope.contactPoint.fio = {};
                $scope.contactPoint.fio.firstName = $localStorage.userData.name;
                $scope.contactPoint.fio.lastName = $localStorage.userData.surname;
                $scope.contactPoint.email = $localStorage.userData.emailAddress;
                $scope.contactPoint.telephone = $localStorage.userData.phone;
                $scope.regexPatternForPhysicalPerson = $rootScope.regex.numberForOrgTypePhysicalPerson;
                $scope.regexPattern = $rootScope.regex.numberForOtherOrgTypes;

                // get organization data from EGR
                $scope.getOrgFromEGR = function () {
                    $scope.step++;
                    return;

                    abp.ui.setBusy();
                    var getDetailes = organization.getOrganizationFromEGR($scope.profileData.codeOfOrganization);
                    getDetailes.then(function (data) {
                        console.log(data);
                        $scope.profileData = data.data;
                        $scope.step++;
                        abp.ui.clearBusy();
                    });
                    
                }

                $scope.isRetryAutoFillButtonDisabled = true;
                $scope.showRetryAutoFillButton = false;
                var retryAutoFillButtonDisableTimeout = 0;
                $scope.autofill = function (showWrnIfNoInfo) {
                    $scope.isRetryAutoFillButtonDisabled = true;
                    var getOrganizationAutofillResult = null;
                    if ($scope.person.value === 1) {
                        getOrganizationAutofillResult = organization.getOrganizationFromImportByItn($scope.profileData.codeOfOrganization);
                    } else {
                        getOrganizationAutofillResult = organization.getOrganizationFromImportByEdrpou($scope.profileData.codeOfOrganization);
                    }
                    getOrganizationAutofillResult.then(function (response) {
                        if (!response.data) return;
                        if (response.data.statusCode === 'OK') {
                            $scope.isRetryAutoFillButtonDisabled = true;
                            $scope.showRetryAutoFillButton = false;
                            toastr.warning("Перевірте актуальність автоматично заповнених даних системою!",
                                "Увага!",
                                {
                                    closeButton: true,
                                    timeOut: 0,
                                    extendedTimeOut: 0
                                });

                            var autofillProfileData = response.data;
                            $scope.autofillProfileData = autofillProfileData;
                            if ($scope.person.value === 1) {
                                $scope.profileData.name = autofillProfileData.name ? 'ФОП ' + autofillProfileData.name : $scope.profileData.name;
                            } else {
                                $scope.profileData.name = autofillProfileData.name ? autofillProfileData.name.fullName : $scope.profileData.name;
                            }
                            if (autofillProfileData.signers && autofillProfileData.signers.length) {
                                var signerName = autofillProfileData.signers[0].name.split(' ');
                                $scope.director.fio = {
                                    lastName: signerName[0],
                                    firstName: signerName[1],
                                    patronymic: signerName[2]
                                };
                                if (autofillProfileData.contacts && autofillProfileData.contacts.webSite)
                                    $scope.contactPoint.url = autofillProfileData.contacts.webSite;
                            }

                            //Індекс, Область, Місто, Вулиця, будинок, квартира
                            if (autofillProfileData.address && autofillProfileData.address.length) {
                                var address = autofillProfileData.address.split(', ');
                                var kiyv = 'Київ';
                                var sevastopol = 'Севастополь';
                                var ukraine = 'Україна';

                                for (var index = 0; index < address.length; index++) {
                                    if (address[index].match(ukraine)) {
                                        address.splice(index, 1);
                                    }
                                }

                                var zip = address[0];
                                var region = address[1];
                                var trimedRegion = region.trim();

                                if (trimedRegion === 'м.Київ' || trimedRegion === 'місто Київ' || trimedRegion === 'м.Севастополь' || trimedRegion.match(kiyv) || trimedRegion.match(sevastopol)) {
                                    //region = (region.slice(0, region.indexOf('.') + 1) + ' ' + region.slice(region.indexOf('.') + 1)).trim();
                                    region = (trimedRegion === 'м.Київ' || trimedRegion === 'місто Київ') ? 'м. Київ' : 'м. Севастополь';
                                    var street = address[2];
                                    var house = address[3];
                                } else {
                                    var city = address[2];
                                    var street = address[3];
                                    var house = address[4];
                                }
                                if (address[address.length - 1].indexOf('квартира') !== -1 || address[address.length - 1].indexOf('кв') !== -1 || address[address.length - 1].indexOf('поверх') !== -1) {
                                    var appartment = address[address.length - 1];
                                }

                                if (city && (city.indexOf('р-н') === -1 || city.indexOf('район') === -1)) {
                                    $scope.address.otherCity = city;
                                    if (street) {
                                        $scope.address.addressStr = street;
                                    }
                                } else {
                                    $scope.address.otherCity = street;
                                    if (street) {
                                        $scope.address.addressStr = city ? city : street;
                                    }
                                }

                                if (house) $scope.address.addressStr += ', ' + house;
                                if (appartment) $scope.address.addressStr += ', ' + appartment;
                                $scope.address.postIndex = zip;
                                if (region && $localStorage.refs && $localStorage.refs.ukraineRegions) {
                                    var regionSearchStr = region.trim().toLowerCase().replace('обл.', 'область');
                                    var regionObj = $localStorage.refs.ukraineRegions.find(function (r) {
                                        return r.title.toLowerCase() === regionSearchStr;
                                    });
                                    if (regionObj) {
                                        $scope.address.region = regionObj;
                                    }
                                }
                            }
                        } else {
                            if (showWrnIfNoInfo) {
                                toastr.warning("За цим кодом не знайдено інформації!", "Увага!");
                            }
                            setTimeout(function () {
                                $scope.isRetryAutoFillButtonDisabled = false;
                            }, retryAutoFillButtonDisableTimeout);
                            retryAutoFillButtonDisableTimeout = 5000;
                            $scope.showRetryAutoFillButton = true;
                        }

                    });

                };


                $scope.next = function () {
                    $scope.step++;

                    if ($scope.step === 2) {
                        abp.ui.setBusy();
                        organizationDataService.getOrganizationKinds($scope.profileData.codeOfOrganization).then(
                            function (kinds) {
                                $scope.profileData.kinds = kinds;
                                $scope.profileData.organizationKindId = $scope.profileData.kinds[0].code;
                                $scope.profileData.sKind = $scope.profileData.kinds[0];
                                abp.ui.clearBusy();
                            }, function (error) {
                                console.log(error);
                                abp.ui.clearBusy();
                            }
                        );
                        if ($scope.person && $scope.person.value !== 3) {
                            $scope.autofill();
                        }
                    }
                };

                $scope.back = function () {
                    $scope.step--;
                };
                
                //$scope.hasMainOrganization = function() {
                //    if (!$scope.hasMainOrganization) {
                //        $scope.profileData.parentCodeEDRPOU = null;
                //        $scope.isParentRegistered = true;
                //        $scope.profileData.parentId = 0;
                //    }
                //    if ($scope.hasMainOrganization && (!$scope.profileData.parentCodeEDRPOU || $scope.profileData.parentCodeEDRPOU == "")) {
                //        $scope.profileData.parentId = 0;
                //    }
                //}
                $scope.$watch('profileData.hasMainOrganization', function () {
                    if (!$scope.profileData.hasMainOrganization) {
                        $scope.profileData.parentCodeEDRPOU = null;
                        $scope.isParentRegistered = true;
                        $scope.profileData.parentId = 0;
                    }
                    if ($scope.profileData.hasMainOrganization && (!$scope.profileData.parentCodeEDRPOU || $scope.profileData.parentCodeEDRPOU == "")) {
                        $scope.profileData.parentId = 0;
                    }
                });
                
                $scope.$watch('profileData.parentCodeEDRPOU', function () {
                    $scope.isParentRegistered = true;
                    if (!$scope.profileData.parentCodeEDRPOU || $scope.profileData.parentCodeEDRPOU == "") {
                        $scope.profileData.parentId = 0;
                        return;
                    }
                    var isOrganizationRegistered = organization.isOrganizationRegistered({ tenantName: $scope.profileData.parentCodeEDRPOU });
                    if (isOrganizationRegistered)
                        isOrganizationRegistered.then(function (response) {
                            $scope.isParentRegistered = response.data;
                            if ($scope.isParentRegistered)
                                organization.getOrganizationInfoByEdrpou({ innOrEdrpou: $scope.organizationDetailes.parentCodeEDRPOU })
                                .then(function (res) {
                                    $scope.organizationDetailes.parentId = res.data.id;
                                });
                        });
                });
                $scope.$watch('profileData.codeOfOrganization', function () {
                    if ($scope.profileData.codeOfOrganization == null) return;
                    if ($scope.person.value == 1 && $scope.profileData.codeOfOrganization.length == 10) {
                        $scope.showMessage = true;
                    }
                    else if ($scope.person.value == 2 && $scope.profileData.codeOfOrganization.length == 8) {
                        $scope.showMessage = true;
                    }
                    else if ($scope.person.value == 3) {
                        $scope.showMessage = true;
                    }
                    else {
                        $scope.showMessage = false;
                        return;
                        //$scope.isRegistered = false;
                    }
                    var isOrganizationRegistered = organization.isOrganizationRegistered({ tenantName: $scope.profileData.codeOfOrganization });
                    isOrganizationRegistered.then(function (response) {
                        $scope.isRegistered = response.data;
                    });
                });

                $scope.$watch(function () { return $scope.person; }, function () {
                    switch ($scope.person.value) {
                        case (1):
                            //$scope.profileData.codeOfOrganization = null;
                            $scope.profileData.directorFirstName = null;
                            $scope.profileData.directorLastName = null;
                            $scope.profileData.directorPatronymic = null;
                            $scope.isCustomer = false;
                            $scope.showMessage = false;
                            break;
                        //case (2):
                        //    $scope.profileData.codeOfOrganization = null;
                        //    $scope.showMessage = false;
                        //    break;
                    }
                });

                $scope.$on('citiesLoaded', function (e, cities) {
                    var autofillProfileData = $scope.autofillProfileData;
                    if (autofillProfileData && autofillProfileData.address) {
                        var address = autofillProfileData.address.split(',');

                        for (var index = 0; index < address.length; index++) {
                            if (address[index].match('Україна')) {
                                address.splice(index, 1);
                            }
                        }

                        var city = address[2];
                        var citySearchStr = city.replace('місто ', '').trim().toLowerCase();
                        var cityObj = cities.find(function (c) {
                            return c.title.toLowerCase() === citySearchStr;
                        });
                        if (cityObj) {
                            $scope.address.city = cityObj;
                        } else {
                            $scope.address.city = { id: null, title: city.trim()};
                        }
                    }
                });

                var _updateOrCreateOrganization = function (profileData) {
                    profileData.documentWayType = $scope.selectedDocType.type;
                    profileData.schemeId = $scope.schemeWrapper.scheme ? $scope.schemeWrapper.scheme.id : $scope.schemeWrapper;

                    return abp.ajax({
                        url: abp.appPath + "Account/UpdateOrCreateOrganization",
                        type: 'POST',
                        data: JSON.stringify(profileData),
                        beforeSend: abp.ui.setBusy()
                    });
                };

                var createOrganization = function () {
                    if (addressData && directorData && contactPointData) {

                        countCallFunction++;
                        if (countCallFunction < 2) {
                            if ($scope.profileData.typeOfOrganization !== 2)//если не юрик - явно false (значение сохраняется в директиве isCustomer.html)
                                $scope.profileData.isCustomer = false;
                            _updateOrCreateOrganization($scope.profileData)
                                .then(function (response) {
                                    abp.ui.clearBusy();
                                    $localStorage.organizationIsCustomer = $scope.profileData.isCustomer;
                                    abp.notify.success('Організацію успішно створено!');
                                        //userTransferToRialto();
                                    if ($scope.profileData.isCustomer) {
                                        $location.path('/registerStage3');
                                    } else {
                                        $window.location.reload();
                                    }
                                },
                                function (data) {
                                    abp.ui.clearBusy();
                                    if (data.responseText.toLowerCase().indexOf('ЦЗО с таким ідентифікатором не знайдено'.toLowerCase()) > -1)
                                        abp.notify.error('ЦЗО с таким ідентифікатором не знайдено!');
                                    else
                                        abp.notify.error('Неможливо створити організацію!');
                                });
                        }
                    }
                };
                $scope.submit = function () {
                    // user with organization can't create organization
                    if ($scope.ng_localStorage.userTenantId !== null) {
                        //abp.notify.error('Ви вже авторизовані в системі.');
                        $location.path('/');
                        return;
                    }
                    if (!$scope.profileData.parentId)
                        $scope.profileData.parentId = 0;
                    $scope.profileData.typeOfOrganization = $scope.person.value;
                    $scope.contactPoint.name = $scope.contactPoint.fio.lastName + ' ' + $scope.contactPoint.fio.firstName + ' ' + ($scope.contactPoint.fio.patronymic ? $scope.contactPoint.fio.patronymic : '');
                    //delete $scope.contactPoint.fio;
                    $scope.director.name = $scope.director.lastName + ' ' + $scope.director.firstName + ' ' + ($scope.director.patronymic ? $scope.director.patronymic : '');

                    var whichNameToUse = $scope.profileData.name ? $scope.profileData.name : $scope.profileData.shortName;
                    $scope.profileData.shortName = organizationDataService.getShortOrganizationName(whichNameToUse);
                    
                    if ($scope.address.city.title == 'м. Київ' || $scope.address.city.title == 'м. Севастополь') {
                        $scope.address.city = undefined;
                        $scope.address.otherCity = undefined;
                    }
                    
                    address.getOrCreateAddress($scope.address)
                        .then(function (response) {
                            addressData = response.data;
                            $scope.profileData.addressId = response.data.address.id;
                            if ($scope.isPostAddressDiff && $scope.postAddress) {
                                address.getOrCreateAddress($scope.postAddress)
                                    .then(function (response) {
                                        $scope.profileData.postAddressId = response.data.address.id;
                                        createOrganization();
                                    }, function () {
                                        abp.notify.error('Неможливо створити адресу');
                                    });
                            }
                            else createOrganization();
                        },
                        function () {
                            abp.notify.error('Неможливо створити адресу');
                        });

                    //create DIRECTOR
                    if ($scope.person.value != 1) {
                        $scope.director.name = joinName($scope.director.fio);
                        delete $scope.director.fio;
                        var directorContactPointInput = {
                            name: $scope.director.name,
                            email: $scope.contactPoint.email,
                            telephone: $scope.contactPoint.telephone
                        };
                        organization.createOrUpdateContactPoint(directorContactPointInput)
                            .then(function (response) {
                                directorData = response.data;
                                $scope.profileData.directorId = response.data.id;
                                createOrganization();
                            },
                            function () {
                                abp.notify.error('Неможливо створити керівника');
                            });
                    } else {
                        $scope.profileData.directorId = null;
                        directorData = 1;
                    }
                    //create Contact Point
                    var contactPointInput = $scope.contactPoint;
                    organization.createOrUpdateContactPoint(contactPointInput)
                        .then(function (response) {
                            contactPointData = response.data;
                            $scope.profileData.contactPointId = response.data.id;
                            createOrganization();
                        },
                        function () {
                            abp.notify.error('Неможливо створити контактну особу');
                        });
                    dataLayer.push ({
                        'event' : 'virtualPageView',
                    'virtualPageURL':'/thankYouPage2/',
                    'virtualPageTitle' : 'Second_Step_Registration'
                });

                    //console.log('profile', $scope.profileData);
                
                };

                $scope.setRequest = function () {
                    var setRequestInput = {};
                    setRequestInput.edrpoyOrInn = $scope.profileData.codeOfOrganization;
                    setRequestInput.userId = $scope.ng_localStorage.userId;
                    setRequestInput.tenantRequestMessage = $scope.request.reason;

                    var userSetRequest = organization.createUserToTenantRequest(setRequestInput);

                    userSetRequest
                        .then(function (data) {
                            abp.notify.success('Ви успішно подали запит на вступ до організації!');
                            $location.path("/");
                        },
                        function () {
                            abp.notify.error('Ви не змогли подати запит на вступ до організації!');
                        });
                };
                function changeKind() {
                    $scope.profileData.organizationKindId = $scope.profileData.sKind.code;
                }

                
            }]);
})();;
(function () {
    var divisions = 'divisionsCtrl';
    angular.module('app').controller(divisions, [
        '$rootScope',
        '$scope',
        '$location',
        '$localStorage',
        'abp.services.etender.division',
        'ngTableParams',
        'numberOfRecords',
        '$timeout',
        'abp.services.etender.organization',
        function (
            $rootScope,
            $scope,
            $location,
            $localStorage,
            divisions,
            ngTableParams,
            numberOfRecords,
            $timeout,
            organization
        ) {
            $scope.ng_localStorage = $localStorage;
            $scope.isProductionMode = $scope.ng_localStorage.isProdMode;

            $rootScope.$watch('organizationTabs', function () {
                $scope.organizationMenu = $rootScope.organizationTabs;
            });

            $scope.url = $location.path();

            $scope.createDivision = function (name) {
                abp.ui.setBusy();
                var data = { 'Title': name };
                var create = divisions.createDivision(data);
                create.then(function () {
                    successResponse('Підрозділ додано');
                    $scope.newDivisions = '';
                }, function (reqError) {
                    errorResponse(reqError);
                });
            }

            $scope.updateDivision = function (id, index) {
                $timeout(function () {
                    var data = {
                        'id': id,
                        'title': $scope.divisions[index].title
                    };
                    var update = divisions.updateDivision(data);
                    update.then(function () {
                        abp.notify.success('Підрозділ перейменовано');
                    }, function (reqError) {
                        errorResponse(reqError);
                    });
                }, 1000);
            }

            $scope.deleteDivision = function (id, divisionsOnpage) {
                if (confirm("Вилучити підрозділ?")) {
                    abp.ui.setBusy();
                    var data = {
                        'id': id
                    };
                    var deleteD = divisions.deleteDivision(data);
                    deleteD.then(function () {
                        successResponse('Підрозділи видалено');
                        if (divisionsOnpage.length === 1)
                                $scope.tableParams.page(1);
                        },
                        function (reqError) {
                            errorResponse(reqError);
                        });
                } else {
                    return;
                }
            }

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: numberOfRecords,
                sorting: {
                    '': 'desc'
                }
            }, {
                    counts: [],
                    getData: function ($defer, params) {
                        abp.ui.setBusy('.main-container');
                        var data = {
                            "Page": params.page(),
                            "PageSize": params.count(),
                            "OrderColumn": "id",
                            "OrderDirection": "asc"
                        };
                        var getDivisions = divisions.getDivisionsWithUsers(data);
                        getDivisions.then(function (answer) {
                            console.log(answer.data.items);
                            $scope.divisions = getDivisionsAndFreeUsers(answer.data.items);
                            params.total(answer.data.totalCount);
                            $defer.resolve(answer.data.items);
                            abp.ui.clearBusy('.main-container');
                        }, function (reqError) {
                            console.log(reqError);
                            abp.ui.clearBusy('.main-container');
                        });
                    }
                });

            function getDivisionsAndFreeUsers(divisions){
                var i = 0;
                for (i; i < divisions.length; i++) {
                    if (!divisions[i].id) {
                        $scope.freeUsers = divisions[i].users.slice();
                        divisions.splice(i, 1);
                     }
                }
                return divisions;
            }

            $scope.trigAllowRemoveResponsFromOtherDivision = function () {
                organization.triggerAllowRemoveResponsiblesFromOtherDivision()
                    .then(function () {
                        abp.notify.success('Змінено');
                    }, function (error) {
                        errorResponse(error);
                    });
            }

            // responses from the server
            function successResponse(notify) {
                abp.ui.clearBusy();
                abp.notify.success(notify);
                $scope.tableParams.reload();
            }
            function errorResponse(error) {
                abp.ui.clearBusy();
                console.log(error);
            }

        }]);
})();;
(function () {
    var controllerId = 'emailGroupsCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope', '$scope', 'ngTableParams', 'abp.services.etender.emails', '$location',
        function ($rootScope, $scope, ngTableParams, emails, $location) {

            function Group() {
                this.name = '';
                this.isPrivate = false;
            };

            $rootScope.$watch('userTabs', function () {
                $scope.userMenu = $rootScope.userTabs;
            });
            $scope.url = $location.path();

            $scope.tableParams = new ngTableParams({
                page: 1,
                count: 10,
                sorting: {
                    tenderStartDate: 'desc'
                },
            }, {
                counts: [],
                getData: function ($defer, params) {
   
                    var input = {
                        maxResultCount: 900,
                        skipCount: (params.page() - 1) * params.count(),
                        sorting: "CreationTime DESC"
                    };



                    var getGroups = emails.getEmailGroups(input);
                    abp.ui.setBusy(".panel-default:first");

                    getGroups.then(function (response) {
                        abp.ui.clearBusy(".panel-default");
                        params.total(response.data.countAllRecords);
                        //console.log("Email Groups: ", data);
                        $defer.resolve(response.data.items);
                    },
                    function () {
                        console.log("ERROR!!! Can't get groups!");
                    });

                }
            });

            $scope.showModalAddGroup = function () {
                $scope.groupDetailes = new Group();
                $scope.isEditGroup = false;
                $("#modalEmailGroupDetailes").modal("show");
            };

            $scope.showModalEditGroup = function (id) {
                $("#modalEmailGroupDetailes").modal("show");
                $scope.isEditGroup = true;
                abp.ui.setBusy("#modalEmailGroupDetailes");
                var getGroup = emails.getEmailGroup({ id: id });
                getGroup.then(function (response) {
                    $scope.groupDetailes = response.data;
                    abp.ui.clearBusy("#modalEmailGroupDetailes");
                });
            };
            
            $scope.showModalEmailGroupUsers = function (id, groupName) {
                $scope.groupName = groupName;
                $scope.groupId = id;
                $("#modalEmailGroupUsers").modal("show");
                abp.ui.setBusy("#modalEmailGroupUsers");
                var getGroup = emails.getGroupOrganization({ id: id });
                getGroup.then(function (response) {
                    $scope.users = response.data;
                    
                    abp.ui.clearBusy("#modalEmailGroupUsers");
                });
            };
            


            $scope.createOrUpdateGroup = function (groupDetailes) {
                //console.log(groupDetailes);
                if (groupDetailes.id)
                    var isEdit = true;
                var createOrUpdateGroup = emails.createOrUpdateEmailGroup(groupDetailes);

                createOrUpdateGroup.then(function () {
                    if (!isEdit)
                        abp.notify.success("Групу створено!");
                    else
                        abp.notify.success("Групу змінено!");
                    $scope.tableParams.reload();
                });
            };

           
            $scope.deleteGroup = function (id) {
                var confirmDelete = confirm("Ви точно хочете видалити групу?");
                if (confirmDelete === true) {
                    var deleteGroup = emails.deleteEmailGroup({ id: id });
                    deleteGroup.then(function () {
                        abp.notify.success("Групу видалено!");
                        $scope.tableParams.reload();
                    });
                }
            };

            $scope.addUser = function(id) {
                var addUser = emails.addOrganizationExtToGroup({ groupId: $scope.groupId, codeEdrpouOrINN: id });
                addUser.then(function () {
                    abp.notify.success("Користувача додано!");
                    $scope.showModalEmailGroupUsers($scope.groupId, $scope.groupName);
                });
            };
            
            $scope.deleteUser = function (id, index) {
                var deleteUser = emails.deleteOrganizationExtFromGroup({ groupId: $scope.groupId, organizationExtId: id });
                deleteUser.then(function () {
                    abp.notify.success("Користувача видалено!");
                    $scope.users.splice(index,1);
                });
            };

        }]);
})();;
(function () {
    var controllerId = 'organizationDetailesCtrl';
    angular.module('app').controller(controllerId, [
        '$rootScope',
        '$scope',
        'organizationDataService',
        'abp.services.etender.organization',
        'userDataService',
        'abp.services.etender.address',
        '$location',
        'ngTableParams',
        '$localStorage',
        '$sessionStorage',
        'lookupService',
        function (
            $rootScope,
            $scope,
            organizationDataService,
            organization,
            userDataService,
            addressService,
            $location,
            ngTableParams,
            $localStorage,
            $sessionStorage,
            lookupService
        ) {
            $scope.ng_localStorage = $localStorage;
            $scope.profileData = {};
            $scope.director = {};
            $scope.oldOrganizationData = {};
            $scope.hasMainOrganization = {
                organizationExist: false
            }
            $scope.isProfileEdit = false;
            $scope.isParentRegistered = true;
            $scope.regexEN = $rootScope.regex.english;
            $scope.isPostAddressDiff = false;
            $scope.regexPattern = $rootScope.regex.numberForOtherOrgTypes;
            $scope.regexNumPattern = $rootScope.regex.number;
            $scope.localLang = abp.localization.currentLanguage;
            $scope.organizationMenu = [];
            $scope.isProductionMode = $scope.ng_localStorage.isProdMode;

            $scope.docTypes = [{
                typeName: 'В електронному вигляді через M.E.Doc',
                type: 'electronic'
            }, {
                typeName: 'У паперовому вигляді',
                type: 'paper'
                }];

            organizationDataService.getOrganizationScaleList();

            $scope.getDocType = function (documentWayType) {
                if (!documentWayType) return 'Не вибрано';
                for (var i = 0; i < $scope.docTypes.length; i++) {
                    if ($scope.docTypes[i].type === documentWayType)
                        return $scope.docTypes[i].typeName;
                }
            };

            if (!$scope.ng_localStorage.username) {
                $location.path('/login');
                return;
            };

            $scope.translateScale = function(data) {
                if (!data) return '-';
                return lookupService.getOrganizationScales(data.value);
            }

            $rootScope.$watch('organizationTabs', function () {
                $scope.organizationMenu = $rootScope.organizationTabs;
            });
            $scope.url = $location.path();

            $scope.onHasOrganizationChanged = function () {
                if (!$scope.hasMainOrganization.organizationExist) {
                    if ($scope.organizationDetailes)
                        $scope.organizationDetailes.parentCodeEDRPOU = null;
                    $scope.isParentRegistered = true;
                    if ($scope.organizationDetailes)
                        $scope.organizationDetailes.parentId = 0;
                }
                if ($scope.hasMainOrganization.organizationExist && (!$scope.organizationDetailes.parentCodeEDRPOU || $scope.organizationDetailes.parentCodeEDRPOU == "")) {
                    $scope.organizationDetailes.parentId = 0;
                }
            }

            $scope.$watch('organizationDetailes.parentCodeEDRPOU', function () {
                $scope.isParentRegistered = true;
                if (($scope.organizationDetailes) && (!$scope.organizationDetailes.parentCodeEDRPOU || $scope.organizationDetailes.parentCodeEDRPOU == "")) {
                    $scope.organizationDetailes.parentId = 0;
                    return;
                }
                var isOrganizationRegistered = false;
                if ($scope.organizationDetailes)
                    isOrganizationRegistered = organization.isOrganizationRegistered({ tenantName: $scope.organizationDetailes.parentCodeEDRPOU });
                if (isOrganizationRegistered)
                    isOrganizationRegistered.then(function (response) {
                        $scope.isParentRegistered = response.data;
                        if ($scope.isParentRegistered)
                            organization.getOrganizationInfoByEdrpou({ innOrEdrpou: $scope.organizationDetailes.parentCodeEDRPOU })
                                .then(function (res) {
                                    $scope.organizationDetailes.parentId = res.data.id;
                                });
                    });
            });

            $scope.$watch('organizationDetailes.isVatPayer', function () {
                if ($scope.organizationDetailes && !$scope.organizationDetailes.isVatPayer) $scope.organizationDetailes.vatNumber = "";
            });

            if (!$scope.ng_localStorage.username) {
                $localStorage.$reset();
                $sessionStorage.$reset();
                $scope.ng_localStorage = '';
                localStorage.clear();
                sessionStorage.clear();
                $location.path('/login');
                return;
            };

            var parseName = function (name) {
                var parsedName = name.split(' ');
                switch (parsedName.length) {
                    case 1:
                        var parsedNameObject = { lastName: parsedName[0] }; //{ lastName: parsedName[0], firstName: parsedName[1], patronymic: parsedName[2] };
                        break;
                    case 2:
                        parsedNameObject = { lastName: parsedName[0], firstName: parsedName[1] };
                        break;
                    case 3:
                        parsedNameObject = { lastName: parsedName[0], firstName: parsedName[1], patronymic: parsedName[2] };
                        break;
                    default:
                        parsedNameObject = {};
                        break;
                }

                return parsedNameObject;

            };

            var joinName = function (nameObj) {
                return nameObj.lastName + ' ' + nameObj.firstName + ' ' + (nameObj.patronymic ? nameObj.patronymic : '');
            };

            var updateOrganization = function (input) {
                //if (!$scope.hasMainOrganization) {
                //    input.parentCodeEDRPOU = null;
                //    input.parentId = null;
                //}

                if (input.address.city.title.indexOf('Київ') >= 1 || input.address.city.title.indexOf('Севастополь') >= 1) {
                    delete input.address.city;
                }

                var whichNameToUse = input.name ? input.name : input.shortName;
                input.shortName = organizationDataService.getShortOrganizationName(whichNameToUse);
                if (input.typeOfOrganization === 1 && input.shortName.indexOf('ФОП') === -1) {
                    input.shortName = 'ФОП' + input.shortName;
                }
                var update = organizationDataService.updateOrCreateOrganization(input);
                
                abp.ui.setBusy();
                update.then(function (response) {
                        abp.ui.clearBusy();
                        abp.notify.success("Організацію успішно оновлено!");
                        reload();
                        $scope.isProfileEdit = false;
                    }, function () {
                        abp.ui.clearBusy();
                        abp.notify.error("Не вдалося оновити організацію!");
                    });
            };

            $scope.setPostAddressDiff = function (isPostAddressDiff) {
                $scope.isPostAddressDiff = isPostAddressDiff;
            }

            $scope.reloadOrganizationKinds = function() {
                organizationDataService.getOrganizationKinds($scope.organizationDetailes.codeOfOrganization).then(
                    function (_kinds) {
                        $scope.organizationDetailes.kinds = _kinds;
                        setKind($scope.organizationDetailes.organizationKindId);
                    }, function (error) {
                        console.log(error);
                    }
                );
            }

            $scope.$watch('vm.typeOfOrganization.value', function () {
                $scope.regexPattern = $scope.vm.typeOfOrganization && $scope.vm.typeOfOrganization.value === 1
                    ? $rootScope.regex.numberForOrgTypePhysicalPerson
                    : $rootScope.regex.numberForOtherOrgTypes;
            });

            function reload() {
                userDataService.getData().then(function (data) {
                    data = data.data;
                    $scope.user = data;
                    organizationDataService.getData().then(function (getOrganization) {
                        var organizationOutputDto = getOrganization.data;
                        $scope.isCustomer = organizationOutputDto.isCustomer;
                        // check if Child Organization Exist:
                        organization.getChildOrganizations({
                            page: 1, pageSize: 1, parentId: organizationOutputDto.id
                        }).then(function (response) {
                            $rootScope.isChildOrgExist = response.data.items.length > 0;
                        });
                        $scope.organizationDetailes = organizationOutputDto;
                        $scope.oldOrganizationData = angular.copy(organizationOutputDto);
                        $scope.reloadOrganizationKinds();

                        $scope.tableChildOrgs = new ngTableParams({
                            page: 1,
                            count: 10,
                        }, {
                                counts: [],
                                getData: function ($defer, params) {
                                    var getChildOrganizations = organization.getChildOrganizations({ parentId: organizationOutputDto.id });
                                    getChildOrganizations.then(function (response) {
                                        $scope.childOrganizationsOutput = response.data;
                                        //console.log('childs: ', $scope.childOrganizationsOutput);
                                        params.total(response.data.countAllRecords);
                                        $defer.resolve(response.data.organizations);
                                    });
                                }
                            });
                        if ($scope.organizationDetailes.parentCodeEDRPOU)
                            $scope.hasMainOrganization.organizationExist = true;
                        $scope.address = organizationOutputDto.address;
                        $scope.postAddress = organizationOutputDto.postAddress;
                        $scope.isPostAddressDiff = organizationOutputDto.postAddress != null;

                        if (organizationOutputDto.address.region.title.indexOf('Київ') >= 1 || organizationOutputDto.address.region.title.indexOf('Севастополь') >= 1) {
                            $scope.organizationAddress =
                                organizationOutputDto.address.addressStr +
                                ', ' + organizationOutputDto.address.region.title + ', ' +
                                ($scope.localLang.name == 'en' ? organizationOutputDto.address.country.titleEN : organizationOutputDto.address.country.title)
                                + ', ' + organizationOutputDto.address.postIndex;
                        } else {
                            $scope.organizationAddress =
                                organizationOutputDto.address.addressStr +
                                ($scope.localLang.name == 'en' ? ', city ' : ', місто ') + organizationOutputDto.address.city.title + ', ' +
                                organizationOutputDto.address.region.title + ', ' +
                                ($scope.localLang.name == 'en' ? organizationOutputDto.address.country.titleEN : organizationOutputDto.address.country.title)
                                + ', ' + organizationOutputDto.address.postIndex;
                        }

                        if (organizationOutputDto.postAddress != null) {
                            if (organizationOutputDto.address.region.title.indexOf('Київ') >= 1 || organizationOutputDto.address.region.title.indexOf('Севастополь') >= 1) {
                                $scope.organizationPostAddress =
                                    organizationOutputDto.postAddress.addressStr +
                                    ', ' + organizationOutputDto.address.region.title + ', ' +
                                    ($scope.localLang.name == 'en' ? organizationOutputDto.postAddress.country.titleEN : organizationOutputDto.postAddress.country.title)
                                    + ', ' + organizationOutputDto.postAddress.postIndex;
                            } else {
                                $scope.organizationPostAddress =
                                    organizationOutputDto.postAddress.addressStr +
                                    ($scope.localLang.name == 'en' ? ', city ' : ', місто ') + organizationOutputDto.postAddress.city.title + ', ' +
                                    organizationOutputDto.postAddress.region.title + ', ' +
                                    ($scope.localLang.name == 'en' ? organizationOutputDto.postAddress.country.titleEN : organizationOutputDto.postAddress.country.title)
                                    + ', ' + organizationOutputDto.postAddress.postIndex;
                            }
                        } else $scope.organizationPostAddress = null;

                        $scope.contactPoint = organizationOutputDto.contactPoint;
                        if ($scope.contactPoint && $scope.contactPoint.name) {
                            $scope.contactPoint.fio = parseName($scope.contactPoint.name);
                        } else {
                            $scope.contactPoint = {};
                        }
                        if (organizationOutputDto.director) {
                            $scope.director = organizationOutputDto.director;
                            if ($scope.director.name) {
                                $scope.director.fio = parseName($scope.director.name);
                            }
                        }
                        $scope.profileData = organizationOutputDto;
                        $scope.vm.typeOfOrganization = $scope.profileData.typeOfOrganization;
                        //$scope.ng_localStorage.isCustomer = $scope.ng_localStorage.isCustomer || $scope.ng_localStorage.isPreCustomer;
                        (function setTypeOfOrganization() {
                            if ($scope.organizationDetailes.typeOfOrganization) {
                                var type = $scope.organizationDetailes.typeOfOrganization;
                                switch (type) {
                                    case (1):
                                        $scope.typeOfOrganization = { value: type, typeName: abp.localization.localize("IndividualPerson", "Shared") };
                                        break;
                                    case (2):
                                        $scope.typeOfOrganization = { value: type, typeName: abp.localization.localize("LegalEntity", "Shared") };
                                        break;
                                    case (3):
                                        $scope.typeOfOrganization = { value: type, typeName: abp.localization.localize("NonResident", "Shared") };
                                        break;
                                }
                                return true;
                            } else {
                                return false;
                            }
                        })();
                        $scope.$watch(function () { return $scope.typeOfOrganization; }, function () {
                            switch ($scope.typeOfOrganization.value) {
                                case (1):
                                    //$scope.organizationDetailes.codeEDRPOU = null;
                                    if (organizationOutputDto.director) {
                                        $scope.director.firstName = null;
                                        $scope.director.lastName = null;
                                        $scope.director.patronymic = null;
                                    }
                                    $scope.organizationDetailes.isCustomer = false;
                                    break;
                                //case (2):
                                //    $scope.organizationDetailes.inn = null;
                                //    break;
                            }
                        });
                        $scope.isDisabledCuctomerCheck = false;
                        if ($scope.ng_localStorage.isOrganizationReadyForApprovementTest || $scope.ng_localStorage.isOrganizationReadyForApprovement)
                            $scope.isDisabledCuctomerCheck = true;

                        //$localStorage.isProdMode = data.isProductionMode;

                        //var addressModel = { Id: data.addressId };
                        //var getAdress = addressService.getAddress(addressModel);

                        //getAdress.success(function (data) {
                        //    $scope.address = data.address;
                        //    //TODO: получить имя региона и города по ID(СЕЙЧАС НЕТ СЕРВИСОВ)
                        //    //var getRegion=getRegion
                        //});
                        //}
                    });
                });
            };

            reload();

            var updatePostAddressAndOrganization = function (updateOrganizationInput) {
                if ($scope.isPostAddressDiff) {
                    var updateOrCreatePostAddress = addressService.getOrCreateAddress($scope.postAddress);
                    updateOrCreatePostAddress
                        .then(function (response) {
                            updateOrganizationInput.postAddressId = response.data.address.id;
                            updateOrganization(updateOrganizationInput);
                        }, function () {
                            abp.notify.error('Не вдалося поновити адресу');
                        });
                } else {
                    if ($scope.organizationDetailes.postAddress != null) {
                        updateOrganizationInput.postAddressId = null;
                        updateOrganization(updateOrganizationInput);
                    }
                }
                //} else {
                //    updateOrganizationInput.postAddressId = null;
                //    updateOrganization(updateOrganizationInput);
                //}
            };

            $scope.updateProfile = function (data) {
                //console.log($scope.organizationDetailes);
                if (!$scope.organizationDetailes.parentId)
                    $scope.organizationDetailes.parentId = 0;
                var updateOrganizationInput = angular.copy($scope.organizationDetailes);
                updateOrganizationInput.contactPoint = $scope.contactPoint;
                $scope.postAddress = data.postAddress;
                updateOrganizationInput.userId = $scope.user.id;
                updateOrganizationInput.tenantId = $scope.user.tenantId;
                updateOrganizationInput.typeOfOrganization = $scope.vm.typeOfOrganization.value;
                updateOrganizationInput.identifierId = $scope.organizationDetailes.identifier.id;
                updateOrganizationInput.schemeId = $scope.organizationDetailes.identifier.schemeId;
                if (updateOrganizationInput.typeOfOrganization === 1) updateOrganizationInput.directorId = undefined;

                if ($scope.address.city && $scope.address.city.title.indexOf('м. Київ') !== -1 ||
                    $scope.address.city && $scope.address.city.title.indexOf('м. Киев') !== -1 ||
                    $scope.address.city && $scope.address.city.title.indexOf('Севастополь') !== -1) {
                    delete $scope.address.city;
                }

                var updateAddress = addressService.getOrCreateAddress($scope.address);
                updateAddress
                    .then(function (respAddress) {
                        updateOrganizationInput.addressId = respAddress.data.address.id;

                        if (updateOrganizationInput.contactPoint.url != null && updateOrganizationInput.contactPoint.url.length > 5 && updateOrganizationInput.contactPoint.url.substring(0, 5) == 'https')
                            updateOrganizationInput.contactPoint.url = updateOrganizationInput.contactPoint.url.replace("https", "http");

                        $scope.contactPoint.name = joinName($scope.contactPoint.fio);
                        var compareContactPoint = angular.copy($scope.contactPoint);
                        delete compareContactPoint.fio;

                        if ($scope.director.fio) {
                            $scope.director.name = joinName($scope.director.fio);
                            updateOrganizationInput.director.name = joinName($scope.director.fio);
                        }

                        var compareDirector = angular.copy($scope.director);
                        delete compareDirector.fio;

                        if (!angular.equals(compareContactPoint, $scope.oldOrganizationData.contactPoint)) {
                            updateOrganizationInput.contactPoint = $scope.contactPoint;
                            updateContactPoint(updateOrganizationInput);
                        } else {
                            updateOrganizationInput.contactPointId = $scope.contactPoint.id;
                            if ($scope.oldOrganizationData.typeOfOrganization !== 1 && !angular.equals(compareDirector, $scope.oldOrganizationData.director)) {
                                updateOrganizationInput.director = $scope.director;
                                updateDirector(updateOrganizationInput);
                            } else {
                                // updateOrganizationInput.directorId = $scope.director.id;
                                if ($scope.postAddress != null)
                                    updatePostAddressAndOrganization(updateOrganizationInput);
                                else updateOrganization(updateOrganizationInput);
                            }
                        }

                    }, function () {
                        abp.notify.error("Не вдалося поновити адресу");
                    });

                return updateAddress;
            };
            $scope.cancel = function () {
                $scope.isProfileEdit = false;
                reload();
            };

            //$scope.setReadyForAprovement = function (prodMode) {

            //    var input = {
            //        forProductionMode: prodMode,
            //        requestModerationMessage: $rootScope.moderationMessage
            //    };
            //    var setReadyForAprovement = organization.setOrganizationReadyForApprovement(input);
            //    setReadyForAprovement.success(function () {
            //        $localStorage.isOrganizationReadyForApprovementTest = true;
            //        $rootScope.moderationMessage = '';
            //        abp.notify.success('Дані профіля надіслано на модерацію оператору. Після модерації Ви зможете користуватися системою.');
            //    });
            //    return setReadyForAprovement;
            //};



            var languages = [
                {
                    title: 'українська',
                    titleEn: 'ukrainian',
                    code: 'uk'
                }, {
                    title: 'англійська',
                    titleEn: 'english',
                    code: 'en'
                }, {
                    title: 'російська',
                    titleEn: 'russian',
                    code: 'ru'
                }
            ];

            $scope.vm = {
                changeLang: changeLang,
                languages: languages,
                languageTitle: null,
                sLang: null
            };
            var vm = $scope.vm;

            activate();

            function activate() {
                $scope.$watch("organizationDetailes",
                    function (n, o) {
                        if (!n) return;
                        setKind(n.organizationKindId);
                        if (n.contactPoint) {
                            setLang(n.contactPoint.language);
                        }
                        n.changeKind = changeKind;
                    });
            }


            function changeLang() {
                $scope.contactPoint.language = vm.sLang.code;
            }

            function changeKind() {
                $scope.organizationDetailes.organizationKindId = $scope.organizationDetailes.sKind.code;
            }

            function setLang(code) {
                switch (code) {
                    case 'uk':
                        vm.sLang = languages[0];
                        vm.languageTitle = $scope.localLang.name == 'en' ? languages[0].titleEn : languages[0].title;
                        break;
                    case 'en':
                        vm.sLang = languages[1];
                        vm.languageTitle = $scope.localLang.name == 'en' ? languages[1].titleEn : languages[1].title;
                        break;
                    case 'ru':
                        vm.sLang = languages[2];
                        vm.languageTitle = $scope.localLang.name == 'en' ? languages[2].titleEn : languages[2].title;
                        break;
                    default:
                        vm.sLang = null;
                        vm.languageTitle = null;
                }
            }

            function setKind(code) {
                if ($scope.organizationDetailes.kinds === undefined)
                    return;

                var kind = $scope.organizationDetailes.kinds.find(function(e) {
                    return e.code === code;
                });

                if (kind === undefined) {
                    $scope.organizationDetailes.organizationKindId = null;
                    $scope.organizationDetailes.sKind = null;
                    $scope.organizationDetailes.kindTitle = null;
                } else {
                    $scope.organizationDetailes.organizationKindId = kind.code;
                    $scope.organizationDetailes.sKind = kind;
                    $scope.organizationDetailes.kindTitle = kind.title;
                }
            }

            function updateContactPoint (updateOrganizationInput) {
                var updateContactPoint = organization.createOrUpdateContactPoint($scope.contactPoint);
                updateContactPoint
                    .then(function (response) {
                        updateOrganizationInput.contactPointId = response.data.id;

                        if ($scope.director.fio) {
                            $scope.director.name = joinName($scope.director.fio);
                        }
                        var compareDirector = angular.copy($scope.director);
                        delete compareDirector.fio;

                        if ($scope.organizationDetailes.typeOfOrganization != 1 &&
                            !angular.equals(compareDirector, $scope.oldOrganizationData.director)) {
                            updateOrganizationInput.director = $scope.director;
                            updateDirector(updateOrganizationInput);
                        } else {
                            updateOrganizationInput.directorId = $scope.director.id;
                            if ($scope.postAddress != null)
                                updatePostAddressAndOrganization(updateOrganizationInput);
                            else updateOrganization(updateOrganizationInput);
                        }
                    }, function () {
                        abp.notify.error("Не вдалося оновити контактну особу!");
                    });
            }

            function updateDirector (updateOrganizationInput) {
                var directorNameInput = angular.copy($scope.director);
                delete directorNameInput.telephone;
                delete directorNameInput.email;

                var updateDirector = organization.createOrUpdateContactPoint(directorNameInput);
                updateDirector
                    .then(function (resp) {
                        //console.log("Update director: ", data);
                        updateOrganizationInput.directorId = resp.data.id;
                        if ($scope.postAddress != null)
                            updatePostAddressAndOrganization(updateOrganizationInput);
                        else updateOrganization(updateOrganizationInput);

                    }, function () {
                        abp.notify.error("Не вдалося оновити директора!");
                    });
            }

            $scope.scaleInfo = function() {
                return organizationDataService.scaleInfo();
            };

        }
    ]);
})();
;
(function () {
    var organizationSettings = 'organizationSettingsCtrl';
    angular.module('app').controller(organizationSettings, [
        '$rootScope',
        '$scope',
        '$location',
        '$localStorage',
        'abp.services.etender.organization',
        'abp.services.etender.subscriptionToSubmittedUser',
        function (
            $rootScope,
            $scope,
            $location,
            $localStorage,
            organization,
            subscriptionToSubmittedUsers
        ) {
            $scope.ng_localStorage = $localStorage;
            $scope.isProductionMode = $scope.ng_localStorage.isProdMode;

            $rootScope.$watch('organizationTabs', function () {
                $scope.organizationMenu = $rootScope.organizationTabs;
            });

            $scope.url = $location.path();

            $scope.trigAllowRemoveResponsFromOtherDivision = function () {
                organization.triggerAllowRemoveResponsiblesFromOtherDivision()
                    .then(function () {
                        abp.notify.success('Змінено');
                    }, function (error) {
                        errorResponse(error);
                    });
            }

            $scope.subscriptionToSubmittedUsers = null;

            $scope.getSubscrToSubmittedUserData = function () {
                subscriptionToSubmittedUsers.getSubscriptionToSubmittedUsers({})
                    .then(function (response) {
                        console.log(response);
                        $scope.subscriptionToSubmittedUsers = response.data && response.data.id ? true : false;
                    }, function (error) {
                        console.log(error);
                    });
            }

            $scope.setSubscrToSubmittedUserData = function () {
                abp.ui.setBusy();
                subscriptionToSubmittedUsers.triggerSubscriptionToSubmittedUsers({})
                    .then(function (response) {
                        console.log(response);
                        $scope.subscriptionToSubmittedUsers = response.data && response.data.id ? true : false;
                        abp.ui.clearBusy();
                    }, function (error) {
                        console.log(error);
                        $scope.subscriptionToSubmittedUsers = false;
                        abp.ui.clearBusy();
                    });
            }
        }]);
})();;
(function () {
    var controllerId = 'userDetailesCtrl';
    angular.module('app').controller(controllerId, ['$rootScope', '$scope', 'abp.services.etender.user', 'abp.services.etender.address', 'abp.services.etender.reference', '$location', 'userDataService', '$localStorage', '$sessionStorage',
        function ($rootScope, $scope, user, addressService, reference, $location, userDataService, $localStorage, $sessionStorage) {
        $scope.ng_localStorage = $localStorage;
        $scope.profileDetailes = {};
        $scope.profileData = {};
        $scope.fio = {};
        $scope.isProfileEdit = false;
        $scope.userDetailes = {};
        // TODO: ADD VALIDATION

        $scope.choices = [
            { id: 'choice1', name: '', valid: true }
        ];

        $rootScope.$watch('userTabs', function () {
            $scope.userMenu = $rootScope.userTabs;
        });
        $scope.url = $location.path();

        var getPhoneStrFromScopeArr = function (arr) {
            var result = "";
            if (arr && Object.prototype.toString.call(arr) === '[object Array]') {
                arr.forEach(function (item) {
                    result += item.name + ',';
                });
            }
            result = result.slice(0, -1);
            return result;
        };

        var setPhoneList = function (data) {
            if (data) {
                $scope.choices = [];
                    var arr2 = data.split(',');
                    arr2.forEach(function (item, i) {
                        $scope.choices.push({
                            'id': 'choice' + i,'name': item,valid: true
                        });
                    });
                }
            }

        if (!$scope.ng_localStorage.username) {
            $localStorage.$reset();
            $sessionStorage.$reset();
            $scope.ng_localStorage = '';
            localStorage.clear();
            sessionStorage.clear();
            $location.path('/login');
            return;
        };
            var reload = function () {
                userDataService.getData().then(function (data) {
                        data = data.data;
                        $scope.isPreCustomer = false;
                        $scope.userDetailes = data;
                        $scope.isProductionMode = data.isProductionMode;
                        //  split elements to array if ',' split exist
                        setPhoneList(data.phone);
                        var isOnlyPresubscriber = $scope.userDetailes.roles && $scope.userDetailes.roles.length == 1 && ($scope.userDetailes.roles.indexOf('PreSubscriber') > -1); // check if user has ONLY presubscriber role
                        if (!$scope.userDetailes.tenantId) {
                            if (!$scope.ng_localStorage.isPreSubscriber ||
                            (!$scope.userDetailes.isAwaitingForJoin && isOnlyPresubscriber && !$scope.userDetailes.tenantId))
                                $location.path('/createProfile');
                            else if (!$scope.ng_localStorage.isPreSubscriber && !$scope.profileData.isCustomer && !$scope.userDetailes.isAgreementSigned)
                                $location.path('/accessionTreaty');
                        }
                        $scope.fio.surname = data.surname;
                        $scope.fio.name = data.name;
                        $scope.fio.patronymic = data.patronymic;
                        $scope.fio.nameEN = data.nameEN;
                });
            };

        reload();

        $scope.updateUser = function () {
            //$scope.updateProfileForm = $scope.profileData;
            var updateUserInput = {};
            updateUserInput.name = $scope.fio.name;
            updateUserInput.surname = $scope.fio.surname;
            updateUserInput.patronymic = $scope.fio.patronymic;
            updateUserInput.nameEN = $scope.fio.nameEN;
            updateUserInput.emailAddress = $scope.userDetailes.emailAddress;

            updateUserInput.phone = getPhoneStrFromScopeArr($scope.choices);
            updateUserInput.fax = $scope.userDetailes.fax;

            updateUserInput.userName = $scope.ng_localStorage.username;

            var updateUser = user.updateUser(updateUserInput);
            abp.ui.setBusy();

            updateUser.then(function (data) {
                abp.ui.clearBusy();
                //$localStorage.roles = data.roles;
                //$localStorage.isCustomer = ($scope.ng_localStorage.roles.indexOf("Customer") + 1) > 0;
                abp.notify.success("Дані користувача змінено!");
                reload();
                $scope.isProfileEdit = false;
            }, function (data) {
                abp.ui.clearBusy();
            });
            return updateUser;
        };

        $scope.arePhonesValid = function () {
            var isValid = true;
            $scope.choices.forEach(function (phone) {
                if (!phone.name || phone.name.length <= 2) {
                    isValid = false;
                }
            });

            return isValid;
        };

        $scope.cancel = function () {
            reload();
        };

        $scope.changeMode = function (isProdMod) {

            var input = {
                isProductionMode: isProdMod
            };

            var changeMode = user.changeMode(input);

            changeMode.then(function (reponse) {
                reload();
                $scope.ng_localStorage.isProdMode = isProdMod;
  
                if (isProdMod) {
                    abp.notify.success('Ви перейшли в режим реальних торгів!');
                } else {
                    abp.notify.success('Ви перейшли в режим навчання!');
                }

            });
        };

        //$scope.setReadyForAprovement = function (prodMode) {

        //    var input = {
        //        forProductionMode: prodMode
        //    };
        //    var setReadyForAprovement = profile.setReadyForApprovement(input);
        //    setReadyForAprovement.success(function () {
        //        $localStorage.isOrganizationReadyForApprovementTest = true;
        //        abp.notify.success('Дані профіля відправлені на модерацію оператору. Після модерації Ви зможете користуватися системою.');
        //    });
        //    return setReadyForAprovement;
        //};
    }
    ]);
})();;
(function () {
    var controllerId = 'userSettingsCtrl';
    angular.module('app').controller(controllerId, ['$rootScope', '$scope', '$location', 'abp.services.etender.user',
        function ($rootScope, $scope, $location, userService) {

            $rootScope.$watch('userTabs', function () {
                $scope.userMenu = $rootScope.userTabs;
            });
            $scope.url = $location.path();

            $scope.uploadDraftByDefault = abp.setting.get("UploadBidDocumentDraftByDefault") === 'True';

            $scope.trigUploadDraftByDefault = function () {
                userService.triggerUploadBidDocumentDraftByDefault();
            }

        }
    ]);
})();;
(function() {
    var controllerId = 'addComplaintTenderCtrl';
    angular.module('app').controller(controllerId, [
        '$scope', 'goToTenderService', 'abp.services.etender.tender', 'abp.services.etender.reference', '$stateParams', '$localStorage',
        function ($scope, goToTenderService, tender, reference, $stateParams, $localStorage) {
            var vm = this;
            $scope.tId = $stateParams.tId;
            var tenderItem = {
                id: $stateParams.tId
            };
            $scope.addQuestionModel = {};
            
            $scope.submit = function() {

                $scope.addQuestionModel.userName = $localStorage.username;
                $scope.addQuestionModel.tenderId = tenderItem.id;
                
                var addQuestion = tender.addQuestion($scope.addQuestionModel);
                
                addQuestion.then(function (response) {
                    abp.notify.success("Запитання відправлено!");
                    goToTenderService.redirect(response.data, tenderItem.id);
                });

            };
        }]);

})();;
angular.module('app')
    .controller('additionalClassificationAtcCtrl',
       ['$scope',
        'ngTableParams',
        'abp.services.etender.reference',
        'classificationSearchService',
        function (
            $scope,
            ngTableParams,
            reference,
            classificationSearchService) {

            $scope.dkScheme = {
                value: "Атс",
                id: "addClassificationAtc"
            };


            $scope.search = function (searchstring) {
                classificationSearchService.search(searchstring, $scope);
            };

            $scope.changeSelection = function (item) {
                classificationSearchService.changeSelection(item, $scope);
            };

            $scope.choose = function () {
                classificationSearchService.choose($scope, 'additionalClassificationAtc');
            };
                 
            $scope.$on('reloadClassificators',
                function () {
                    $scope.tableParams.reload();
                    $scope.selectedData = {};
                });
            
            $scope.tableParams = new ngTableParams({
                page: 1, // show first page
                count: 10 // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {

                    var entity = null;
                    if ($scope.item != null) {
                        entity = $scope.item; // for tender item
                    } else if ($scope.data != null) {
                        if ($scope.itemInd != null) {// for plan item
                            entity = $scope.data.items[$scope.itemInd];
                        } else {
                            entity = $scope.data;// for plan
                        }                        
                    }

                    //pager Params
                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        SearchIdentifier: $scope.searchstring,
                        OrderColumn: '',
                        OrderDirection: '',
                        Inn: entity.additionalClassificationInn.id
                };

                    var classificationData = reference.getAtc(pager);
                    abp.ui.setBusy(".modal-body");
                    classificationData.then(function (reponse) {
                        abp.ui.clearBusy(".modal-body");
                        params.total(reponse.data.countAllRecords);
                        $defer.resolve(reponse.data.atc);
                    }, function (error) {
                        console.log(error.data);
                    });
                }
            });
        }
       ]);;
angular.module('app')
    .controller('additionalClassificationGmdnsCtrl',
        ['$scope',
            'ngTableParams',
            'abp.services.etender.reference',
            'classificationSearchService',
            function (
                $scope,
                ngTableParams,
                reference,
                classificationSearchService) {

                $scope.dkScheme = {
                    value: "Класифікатор медичних виробів НК 024:2019",
                    id: "addClassificationGmdns"
                };

                $scope.search = function (searchstring) {
                    classificationSearchService.search(searchstring, $scope);
                };

                $scope.changeSelection = function (item) {
                    classificationSearchService.changeSelection(item, $scope)
                };

                $scope.choose = function () {
                    classificationSearchService.choose($scope, 'additionalClassificationGmdns');
                };

                $scope.tableParams = new ngTableParams({
                    page: 1,  // show first page
                    count: 10 // count per page
                }, {
                        counts: [],
                        getData: function ($defer, params) {

                            //pager Params
                            var pager = {
                                Page: params.page(),
                                PageSize: params.count(),
                                SearchIdentifier: $scope.searchstring,
                                OrderColumn: '',
                                OrderDirection: ''
                            };
                            var classificationData = reference.getGmdns(pager);
                            abp.ui.setBusy(".modal-body");
                            classificationData.then(function (reponse) {
                                console.log(reponse)
                                abp.ui.clearBusy(".modal-body");
                                params.total(reponse.data.totalAmount);
                                $defer.resolve(reponse.data.items);
                            }, function (error) {
                                console.log(error.data);
                            });
                        }
                    });
            }
        ]);;
angular.module('app')
    .controller('additionalClassificationInnCtrl',
       ['$scope',
        'ngTableParams',
        'abp.services.etender.reference',
        'classificationSearchService',
        function (
            $scope,
            ngTableParams,
            reference,
            classificationSearchService) {

            $scope.dkScheme = {
                value: "МНН",
                id: "addClassificationInn"
            };

            $scope.search = function (searchstring) {
                classificationSearchService.search(searchstring, $scope);
            };

            $scope.changeSelection = function (item) {
                classificationSearchService.changeSelection(item, $scope);
            };

            $scope.choose = function () {
                classificationSearchService.choose($scope, 'additionalClassificationInn');
            };

            $scope.tableParams = new ngTableParams({
                page: 1,  // show first page
                count: 10 // count per page
            }, {
                counts: [],
                getData: function ($defer, params) {

                    //pager Params
                    var pager = {
                        Page: params.page(),
                        PageSize: params.count(),
                        SearchIdentifier: $scope.searchstring,
                        OrderColumn: '',
                        OrderDirection: ''
                    };
                    var classificationData = reference.getInn(pager);
                    abp.ui.setBusy(".modal-body");
                    classificationData.then(function (reponse) {
                        abp.ui.clearBusy(".modal-body");
                        params.total(reponse.data.countAllRecords);
                        $defer.resolve(reponse.data.inn);
                    },function(error){
                        console.log(error.data);
                    });
                }
            });
        }
       ]);;
angular.module('app')
    .controller('additionalClassificationRoadsCtrl',
        ['$scope',
            'ngTableParams',
            'abp.services.etender.reference',
            'classificationSearchService',
            function (
                $scope,
                ngTableParams,
                reference,
                classificationSearchService) {

                $scope.dkScheme = {
                    value: "Індекс автомобільних доріг",
                    id: "addClassificationRoads"
                };

                $scope.search = function (searchstring) {
                    classificationSearchService.search(searchstring, $scope);
                };

                $scope.changeSelection = function (item) {
                    classificationSearchService.changeSelection(item, $scope)
                };

                $scope.choose = function () {
                    classificationSearchService.choose($scope, 'additionalClassificationRoads');
                };

                $scope.tableParams = new ngTableParams({
                    page: 1,  // show first page
                    count: 10 // count per page
                }, {
                        counts: [],
                        getData: function ($defer, params) {

                            //pager Params
                            var pager = {
                                Page: params.page(),
                                PageSize: params.count(),
                                SearchIdentifier: $scope.searchstring,
                                OrderColumn: '',
                                OrderDirection: ''
                            };
                            var classificationData = reference.getUaRoads(pager);
                            abp.ui.setBusy(".modal-body");
                            classificationData.then(function (reponse) {
                                console.log(reponse)
                                abp.ui.clearBusy(".modal-body");
                                params.total(reponse.data.totalAmount);
                                $defer.resolve(reponse.data.items);
                            }, function (error) {
                                console.log(error.data);
                            });
                        }
                    });
            }
        ]);;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('createAgreementSelectionUaCtrl', createAgreementSelectionUa);
    createAgreementSelectionUa.$inject = [
        '$scope',
        '$localStorage',
        '$timeout',
        '$location',
        'tenderFormService',
        'agreementService',
        'tenderHelperService',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        'goToTenderService',
        'getTenderService'
    ];
    function createAgreementSelectionUa(
        $scope,
        $localStorage,
        $timeout,
        $location,
        tenderFormService,
        agreementService,
        tenderHelperService,
        tender,
        getTender,
        goToTenderService,
        getTenderService) {

        $scope.ng_localStorage = $localStorage; 
        var createAddressPromises = [];
        var queryParams = $location.search();

        $scope.createTenderModel = {
            description: null,
            features: [],
            procurementMethod: 'selective',
            procurementMethodType: 'closeFrameworkAgreementSelectionUA',
            tenderPeriod: {
                startDate: null,
                endDate: null
            },
            title: null,
            lots: [],
            agreementDuration: null
        };

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.tId = null;

        tenderFormService.getTender($scope);

        $scope.getTenderThen = function (data) {
            $scope.createTenderModel = data;
            $scope.createTenderModel.procurementMethod = 'selective';
            $scope.createTenderModel.procurementMethodType = 'closeFrameworkAgreementSelectionUA';
            console.log('Tender data:', data);
            abp.ui.clearBusy();
        };

        agreementService.getAgreement($scope).then(function (data) {
            $scope.agreement = data;
            console.log('Agreement data:', $scope.agreement);
        }, function (data) {
            agreementService.errore(data);
        }); 

        //получаем данные об организации из tenderContactPoint
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });


        $scope.submit = function() {
            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;
            model.procuringEntity = model.organization;
            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];
                    
                    if (!curItem.includeThisItem) {
                        lot.items.splice(j, 1);
                        j--;
                        continue;
                    }

                    if (curItem.classification.code) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                        for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            var data = tenderHelperService.setAdditionalClassifications($scope.createTenderModel);
            tenderHelperService.addAdditionalInfo(data);

            data.lots.forEach(function (lot) {
                lot.items.forEach(function (item) {
                    if (item.deliveryAddress.city &&
                        (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                        item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                        item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                            delete item.deliveryAddress.city;
                    }
                });
            });

            tender.createTenderProzorro(data)
                .then(function (response) {
                    abp.ui.clearBusy(".panel-default:first");
                    $scope.dataToRedirect = response.data;
                    if (!$scope.skipSign) {
                        getTenderInfoRequest(response.data.id);
                    } else {
                        $scope.tId = response.data.id;
                        goToTenderService.redirect($scope.dataToRedirect, $scope.tId);
                    }
                }, function (err) {
                    abp.ui.clearBusy(".panel-default:first");
                });
        };
        
        $scope.disableSubmit = function() {
            if (!$scope.agreement ||
                $scope.agreement && (
                $scope.agreement.status.value !== 'active' ||
                !agreementService.rightDateCreateAgreementSelectionUA($scope.agreement))) return true;
                return false;
        }

        $scope.noItemsSelected = function () {
            if (!$scope.createTenderModel || !$scope.createTenderModel.lots) return true;
            for (var k = 0; k < $scope.createTenderModel.lots.length; k += 1) {
                var lot = $scope.createTenderModel.lots[k];
                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];
                    if (curItem.includeThisItem)
                        return false;
                }
            }
            return true;
        }

        $scope.showSignModal = function () {
            $scope.tId = $scope.detailes.id;
            $scope.entityType = 'tender';
            if (!$scope.detailes.isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignNewTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $scope.tId);
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.getTenderBefore = function () {
            abp.ui.setBusy();
            $(".hide-move-efect").fadeOut();
        };

        function getTenderInfoRequest(tenderId) {
            abp.ui.setBusy();
            getTender.getTender({ "Id": tenderId }).then(function (response) {
                $scope.dataToRedirect = response.data;
                $scope.detailes = response.data;
                getTenderService.getTenderThen(response.data, $scope, true);
                $scope.tId = response.data.id;
                if (response.data.apiId) {
                    $scope.showSignModal();
                } else {
                    getTenderInfoRequest($scope.tId);
                }
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        };
    }
})(); 
;
(function () {
    'use strict';

    angular
		.module('app')
		.controller('createTenderProzorroCtrl', createTender);

    createTender.$inject = ['$scope', '$controller', '$localStorage', '$location', 'tenderHelperService', 'abp.services.etender.tender', 'abp.services.etender.workingDays', 'goToTenderService'];

    function 
    createTender($scope, $controller, $localStorage, $location, tenderHelperService, tender, workingDays, goToTenderService) {
        angular.extend(this, $controller('createTenderCtrl', {
            $scope: $scope
        }));

        $scope.isFirstLoading = true;
        $scope.needToShowDocumensTab = false;
        $scope.activeTab = 'createTender';

        $scope.$watch('createTenderModel', function () {
            if ($scope.createTenderModel && $scope.isFirstLoading
                && ($scope.createTenderModel.tenderPeriod || $scope.createTenderModel.tenderPeriod === null)) {
                if ($scope.createTenderModel.tenderPeriod === null) {
                    $scope.createTenderModel.tenderPeriod = {};
                }
                if ($scope.createTenderModel.enquiryPeriod === null) {
                    $scope.createTenderModel.enquiryPeriod = {};
                }
                $scope.isFirstLoading = false;
                
                if ($localStorage.isProdMode) {
                    workingDays.getLastWorkingDayByCount(new Date().toDateString(), 4).then(function (request) {
                        $scope.createTenderModel.enquiryPeriod.endDate = new Date(request.data);
                        $scope.createTenderModel.tenderPeriod.startDate = new Date(request.data);
                    });

                    workingDays.getLastWorkingDayByCount(new Date().toDateString(), 7).then(function (request) {
                        $scope.createTenderModel.tenderPeriod.endDate = new Date(request.data);
                    });
                } else {
                    $scope.createTenderModel.tenderPeriod.endDate = new Date();
                    $scope.createTenderModel.enquiryPeriod.endDate = new Date();
                    $scope.createTenderModel.tenderPeriod.startDate = new Date();
                }
            }
        });

        $scope.switchActiveTab = function (tab) {
            $scope.activeTab = tab;
        };

        $scope.createTenderFinally = function (isNotExport) {
            var data = tenderHelperService.setAdditionalClassifications($scope.createTenderModel);
            tenderHelperService.addAdditionalInfo(data);

            data.lots.forEach(function (lot) {
                lot.items.forEach(function (item) {
                    if (item.deliveryAddress.city &&
                        (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                        item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                        item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                            delete item.deliveryAddress.city;
                    }
                });
            });

            var createTender = tender.createTenderProzorro(data);
            createTender
                .then(function (response) {
                    abp.notify.success($scope.$root.source('CreatePurchase'));
                    abp.ui.clearBusy();
                    if (isNotExport) {
                        goToTenderService.redirect(response.data, response.data.id);
                    } else {
                        goToTenderService.criteriaRedirect(response.data.id);
                    }
                },
                function(err) {
                    console.log(err.data.message);
                    $scope.blockCreateTender = false;
                    abp.ui.clearBusy();
                });
            return createTender;
        };
    }
})();
;
(function () {
    'use strict';

    angular
        .module('app').
        controller('createTenderAboveCtrl', createTenderAbove);
    createTenderAbove.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        'tenderHelperService',
        '$stateParams',
        '$localStorage',
        'addFeaturesService',
        'tenderFormService',
        'tenderFormAboveService',
        'DEFAULT_ACCELERATOR_VALUE'
    ];
    function createTenderAbove(
        $scope,
        $location,
        $q,
        tenderService,
        tenderHelperService,
        $stateParams,
        $localStorage,
        addFeaturesService,
        tenderFormService,
        tenderFormAboveService,
        DEFAULT_ACCELERATOR_VALUE) {

        $scope.ng_localStorage = $localStorage;
        $scope.activeTab = 'createTender';

        if ($stateParams.tId) { // якщо створення з шаблону
            $scope.createTenderModel = tenderFormAboveService.getTenderModel('aboveThresholdUA');
            // get tendet data
            tenderFormService.getTender($scope);

            $scope.getTenderThen = function (data) {
                $scope.createTenderModel = data;
                $scope.createTenderModel.currency = data.lots[0].value.currency;
                $scope.createTenderModel.accelerator = {
                    procurementMethodDetails: DEFAULT_ACCELERATOR_VALUE
                }
                $scope.createTenderModel.isMultilots = !data.lots[0].isFake;
                $scope.createTenderModel.isCreatedFromTemplate = 'true';
                $scope.createTenderModel.lots.forEach(function (l) {
                    l.hasGuarantee = '0';
                    if (l.guarantee && l.guarantee.amount > 0) {
                        l.hasGuarantee = '1';
                    }
                });
                abp.ui.clearBusy(); 
            }

        } else {
            $scope.createTenderModel = tenderHelperService.getCreateTenderModel('aboveThresholdUA', 'open', $scope.ng_localStorage.isProdMode);
        }

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            
            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

			if (!model.isMultilots) {
				model.lots[0].isFake = true;
				model.lots = model.lots.splice(0, 1);
            }

            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];
                
                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];

                    if (curItem.classification.code) { 
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                        for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }
            // create Tender Finally
            tenderFormService.createTenderFinally($scope ,createAddressPromises);
            
        };

        //получаем данные об организации из tenderContactPoint
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.changeActiveTab = function (tabName, selector) {
            $(selector).addClass('activeTab')
            $scope.activeTab = tabName;
        }

        $scope.isAllDataGood = function (model) {

            if (!checkTenderPeriod() ||
                !tenderFormAboveService.isAllDataGood(model)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (!tenderFormAboveService.isAllDataGoodInLot(model, lot)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormAboveService.isAllDataGoodinItem(item))
                        return false;
                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        $scope.navigateToTender = function () {
            goToTenderService.redirect(null, $scope.tenderId);
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }


        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }


        function checkTenderPeriod() {
            if (!$scope.createTenderModel.tenderPeriod) return false;
            var startDate = new Date();
            var endDate = new Date($scope.createTenderModel.tenderPeriod.endDate);

            var st = startDate.getTime();
            var et = endDate.getTime();

            var diff = (et - st) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;
            if (diff >= 15) return true;

            return false;
        }
    }
})();
;
(function () {
    'use strict';

    angular
        .module('app').
        controller('createTenderAboveEuCtrl', createTenderAboveEu);
    createTenderAboveEu.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        'tenderHelperService',
        '$stateParams',
        '$localStorage',
        'addFeaturesService',
        'tenderFormAboveService',
        'tenderFormService',
        'DEFAULT_ACCELERATOR_VALUE'
    ];
    function createTenderAboveEu(
        $scope,
        $location,
        $q,
        tenderService,
        tenderHelperService,
        $stateParams,
        $localStorage,
        addFeaturesService,
        tenderFormAboveService,
        tenderFormService,
        DEFAULT_ACCELERATOR_VALUE) {

        $scope.ng_localStorage = $localStorage;
        if ($stateParams.tId) { // якщо створення з шаблону
            $scope.createTenderModel = tenderFormAboveService.getTenderModel('aboveThresholdEU');

            // get tendet data
            tenderFormService.getTender($scope);

            $scope.getTenderThen = function(data) {
                $scope.createTenderModel = data;
                $scope.createTenderModel.currency = data.lots[0].value.currency;
                $scope.createTenderModel.isMultilots = !data.lots[0].isFake;
                $scope.createTenderModel.accelerator = {
                    procurementMethodDetails: DEFAULT_ACCELERATOR_VALUE
                }
                $scope.createTenderModel.isCreatedFromTemplate = 'true';
                $scope.createTenderModel.lots.forEach(function (l) {
                    l.hasGuarantee = '0';
                    if (l.guarantee && l.guarantee.amount > 0) {
                        l.hasGuarantee = '1';
                    }
                });
                abp.ui.clearBusy();
            };

        } else {
            $scope.createTenderModel = tenderHelperService.getCreateTenderModel('aboveThresholdEU', 'open', $scope.ng_localStorage.isProdMode);
        }

        //получаем данные об организации из tenderContactPoint
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.activeTab = 'createTender';
        $scope.changeActiveTab = function (tabName, selector) {
            $(selector).addClass('activeTab')
            $scope.activeTab = tabName;
        }

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            
            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

			if (!model.isMultilots) {
				model.lots[0].isFake = true;
				model.lots = model.lots.splice(0, 1);
			}

            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];                

                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];

                    if (curItem.classification.code) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                        for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }
            // create Tender Finally
            tenderFormService.createTenderFinally($scope, createAddressPromises);
            
        };

        $scope.isAllDataGood = function (model) {
            if (!checkTenderPeriod() ||
                !tenderFormAboveService.isAllDataGood(model)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (!tenderFormAboveService.isAllDataGoodInLot(model, lot)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormAboveService.isAllDataGoodinItem(item, model))
                        return false;
                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        // internal
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }

        function checkTenderPeriod() {
            var startDate = new Date();
            var endDate = null;
            if ($scope.createTenderModel.tenderPeriod) {
                endDate = new Date($scope.createTenderModel.tenderPeriod.endDate);
            } else {
                endDate = new Date();
            }

            var st = startDate.getTime();
            var et = endDate.getTime();

            var diff = (et - st) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;
            if (diff >= 30) return true;

            return false;
        }
    }
})();;
angular.module('app').controller('createTenderCriteriaWrapperCtrl', [
    '$scope',
    '$stateParams',
    '$timeout',
    function ($scope, $stateParams, $timeout) {
        $scope.tenderId = $stateParams.tId;
        $scope.entityType = 'tender';
        $scope.isFirstLoading = true;
        $scope.detailes = null;

        $scope.$on('needToSignTenderFromCriterias', function (event, detailes) {
            $scope.detailes = detailes;
        });
        
        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $('body').on('hide.bs.modal', '#personSignDataErrorModal', function () {
            if (!$scope.isFirstLoading) {
                $timeout(function () {
                    if ($scope.detailes.procurementMethodType === 'belowThreshold' && !$scope.detailes.procurementMethodRationale) {
                        return;
                    } else {
                        $('#modalSignNewTender').modal('toggle');
                    }
                }, 1000);
            }
            $scope.isFirstLoading = false;
        });
    }
]);
(function () {
    'use strict';

    angular
        .module('app')
        .controller('createTenderDefenseCtrl', createTenderDefense);

    createTenderDefense.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        'tenderHelperService',
        '$localStorage',
        'addFeaturesService',
        'tenderFormService'
    ];
    function createTenderDefense(
        $scope,
        $location,
        $q,
        tenderService,
        tenderHelperService,
        $localStorage,
        addFeaturesService,
        tenderFormService)
    {
        abp.notify.warn('Неможливо створити тендер з типом "Переговорна процедура для потреб оборони"');
        location.href = '/MyTenders';

        $scope.ng_localStorage = $localStorage;
        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('aboveThresholdUA.defense', 'open', $scope.ng_localStorage.isProdMode);

        //получаем данные об организации из tenderContactPoint
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

			if (!model.isMultilots) {
				model.lots[0].isFake = true;
				model.lots = model.lots.splice(0, 1);
			}

            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];                

                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];

                    curItem.classification.id = curItem.classification.code;
                    curItem.classification.description = curItem.classification.description;
                    for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                        curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                        curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                    }

                    if (typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // create Tender Finally
            tenderFormService.createTenderFinally($scope, createAddressPromises);
            
        };

        $scope.isAllDataGood = function (model) {

            if (!checkTenderPeriod()) return false;
            if (!tenderFormService.isAllDataGood(model, $scope)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {

                var lot = model.lots[i];

                if (!tenderFormService.isAllDataGoodInLot(lot, $scope)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }


            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        // internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }

        function checkTenderPeriod() {
            return tenderHelperService
                     .diffBetweenDates(6,
                      $scope.createTenderModel.tenderPeriod.endDate);
        }
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('createTenderDialogueCtrl', createTenderDialogue);
    createTenderDialogue.$inject = [
        '$scope',
        'tenderHelperService',
        '$localStorage',
        'createTenderDialogueService',
        'tenderFormService',
    ];
    function createTenderDialogue(
        $scope,
        tenderHelperService,
        $localStorage,
        createTenderDialogueService,
        tenderFormService)
    {
        $scope.ng_localStorage = $localStorage;
        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('competitiveDialogueUA', 'open', $scope.ng_localStorage.isProdMode);

        //получаем данные об организации из tenderContactPoint
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.activeTab = 'createTender';
        $scope.changeActiveTab = function (tabName, selector) {
            $(selector).addClass('activeTab')
            $scope.activeTab = tabName;
        }

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            createTenderDialogueService.submit($scope, isNotExport, setPendingApprovalStatusForTenderCorporation);
        };

        $scope.isAllDataGood = function (model) {
            return createTenderDialogueService.isAllDataGood($scope, model);
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };
    }
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('createTenderDialogueEuCtrl', createTenderDialogueEu);
    createTenderDialogueEu.$inject = [
        '$scope',
        'tenderHelperService',
        '$localStorage',
        'createTenderDialogueService',
        'tenderFormService'
    ];
    function createTenderDialogueEu(
        $scope,
        tenderHelperService,
        $localStorage,
        createTenderDialogueService,
        tenderFormService)
    {
        $scope.ng_localStorage = $localStorage;
    
        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('competitiveDialogueEU', 'open', $scope.ng_localStorage.isProdMode);

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.activeTab = 'createTender';
        $scope.changeActiveTab = function (tabName, selector) {
            $(selector).addClass('activeTab')
            $scope.activeTab = tabName;
        }

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;
            createTenderDialogueService.submit($scope, isNotExport, setPendingApprovalStatusForTenderCorporation);
        };

        $scope.isAllDataGood = function (model) {
            return createTenderDialogueService.isAllDataGood($scope, model);
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };
    }
})();;
(function () {
    'use strict';

    angular
        .module('app').
        controller('createTenderEscoCtrl', createTenderEsco);
    createTenderEsco.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        'tenderHelperService',
        '$stateParams',
        '$localStorage',
        'addFeaturesService',
        'tenderFormService',
        'DEFAULT_ACCELERATOR_VALUE'
    ];
    function createTenderEsco(
        $scope,
        $location,
        $q,
        tenderService,
        tenderHelperService,
        $stateParams,
        $localStorage,
        addFeaturesService,
        tenderFormService,
        DEFAULT_ACCELERATOR_VALUE)
    {
        $scope.ng_localStorage = $localStorage;
        if ($stateParams.tId) { // якщо створення з шаблону
            $scope.createTenderModel = {
                description: null,
                features: [],
                procurementMethod: 'open',
                procurementMethodType: 'esco',
                tenderPeriod: {
                    startDate: null,
                    endDate: null
                },
                escoTenderExt: {
                    nbuDiscountRate: null,
                    fundingKind: 'other'
                },
                title: null,
                lots: []
            };

            tenderFormService.getTender($scope);

            $scope.getTenderThen = function(data) {
                $scope.createTenderModel = data;
                $scope.createTenderModel.currency = data.lots[0].value.currency;
                $scope.createTenderModel.isMultilots = !data.lots[0].isFake;
                $scope.createTenderModel.accelerator = {
                    procurementMethodDetails: DEFAULT_ACCELERATOR_VALUE
                }
                $scope.createTenderModel.isCreatedFromTemplate = 'true';
                $scope.createTenderModel.lots.forEach(function (l) {
                    l.hasGuarantee = '0';
                    if (l.guarantee && l.guarantee.amount > 0) {
                        l.hasGuarantee = '1';
                    }
                });
                abp.ui.clearBusy();
            };

        } else {
            $scope.createTenderModel = tenderHelperService.getCreateTenderModel('esco', 'open', $scope.ng_localStorage.isProdMode);
        }

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.activeTab = 'createTender';
        $scope.changeActiveTab = function (tabName, selector) {
            $(selector).addClass('activeTab')
            $scope.activeTab = tabName;
        }

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            
            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

            if (model.procurementMethodType === "esco") { // TODO: move to BACKEND
                model.escoTenderExt.nbuDiscountRate /= 100;
                for (var i = 0; i < model.lots.length; i += 1) {
                    model.lots[i].escoLotExt.minimalStepPercentage /= 100;
                    model.lots[i].escoLotExt.yearlyPaymentsPercentageRange /= 100;
                }
            }

            if (!model.isMultilots) {
                model.lots[0].isFake = true;
                model.lots = model.lots.splice(0, 1);
            }

            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];

                    if (curItem.classification.code) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                        for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // create Tender Finally
            tenderFormService.createTenderFinally($scope, createAddressPromises);
            
        };

        $scope.isAllDataGood = function (model) {
            if (!checkTenderPeriod()) return false;

            if (model.lots.length === 0) {
                return false;
            }

            if (model.features.length > 0) {
                for (var f = 0; f < model.features.length; f += 1) {
                    if (!$scope.checkFeature(model.features[f])) return false;
                }
            }

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];

                // check minimalStep
                // var amount = parseFloat(lot.value.amount);
                // var step = parseFloat(lot.minimalStep.amount);
                // if (step > amount) {
                //    return false;
                // }

                if (lot.features.length > 0) {
                    for (var fl = 0; fl < lot.features.length; fl += 1) {
                        if (!$scope.checkFeature(lot.features[fl])) return false;
                    }
                }

                if (lot.items.length === 0) {
                    return false;
                }

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (item.features.length > 0) {
                        for (var fi = 0; fi < item.features.length; fi += 1) {
                            if (!$scope.checkFeature(item.features[fi])) return false;
                        }
                    }

                    if (!item.classification.id) {
                        return false;
                    }

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }


            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        // internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        function checkFeatureSum(model) {
            var sum = 25;
            return addFeaturesService.checkFeatureSumCreateUpdate(model, sum);
        }

        function checkTenderPeriod() {
            var startDate = new Date();
            var endDate = new Date($scope.createTenderModel.tenderPeriod.endDate);

            var st = startDate.getTime();
            var et = endDate.getTime();

            var diff = (et - st) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;
            if (diff >= 30) return true;

            return false;
        }
    }
})();;
(function () {
    'use strict';

    angular
        .module('app').
        controller('createTenderFrameworkCtrl', createFrameworkTender);

    createFrameworkTender.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        'tenderHelperService',
        '$stateParams',
        '$localStorage',
        'addFeaturesService',
        'tenderFormService',
        'tenderFormFrameworkService',
        'DEFAULT_ACCELERATOR_VALUE'
    ];
    function createFrameworkTender(
        $scope,
        $location,
        $q,
        tenderService,
        tenderHelperService,
        $stateParams,
        $localStorage,
        addFeaturesService,
        tenderFormService,
        tenderFormFrameworkService,
        DEFAULT_ACCELERATOR_VALUE) {

        $scope.ng_localStorage = $localStorage;
        if ($stateParams.tId) { // якщо створення з шаблону
            $scope.createTenderModel = tenderFormFrameworkService.getTendetObj();

            tenderFormService.getTender($scope);

            $scope.getTenderThen = function(data) {
                $scope.createTenderModel = data;
                $scope.createTenderModel.currency = data.lots[0].value.currency;
                $scope.createTenderModel.isMultilots = !data.lots[0].isFake;
                $scope.createTenderModel.accelerator = {
                    procurementMethodDetails: DEFAULT_ACCELERATOR_VALUE
                };
                $scope.createTenderModel.isCreatedFromTemplate = 'true';
                $scope.createTenderModel.lots.forEach(function (l) {
                    l.hasGuarantee = '0';
                    if (l.guarantee && l.guarantee.amount > 0) {
                        l.hasGuarantee = '1';
                    }
                });
                abp.ui.clearBusy();
            }

        } else {
            $scope.createTenderModel = tenderHelperService.getCreateTenderModel('closeFrameworkAgreementUA', 'open', $scope.ng_localStorage.isProdMode);
        }

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.activeTab = 'createTender';
        $scope.changeActiveTab = function (tabName, selector) {
            $(selector).addClass('activeTab')
            $scope.activeTab = tabName;
        }

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            
            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;


            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];

                    if (curItem.classification.code) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                        for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }
            // create Tender Finally
            tenderFormService.createTenderFinally($scope, createAddressPromises);

        };

        $scope.isAllDataGood = function (model) {
            if (!checkTenderPeriod()) return false;

            if (!tenderFormService.isAllDataGood(model, $scope)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];

                if (!tenderFormService.isAllDataGoodInLot(lot, $scope)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }


            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };
        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        // internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }

        function checkTenderPeriod() {
            var startDate = new Date();
            var endDate = new Date($scope.createTenderModel.tenderPeriod.endDate);

            var st = startDate.getTime();
            var et = endDate.getTime();

            var diff = (et - st) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;
            if (diff >= 30) return true;

            return false;
        }
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('createTenderLimitedCtrl', createTenderLimited);

    createTenderLimited.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        '$localStorage',
        'tenderHelperService',
        'tenderFormService',
    'tenderFormLimitedService'];
    function createTenderLimited(
        $scope,
        $location,
        $q,
        tenderService,
        $localStorage,
        tenderHelperService,
        tenderFormService,
        tenderFormLimitedService) {

        $scope.ng_localStorage = $localStorage;
        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('negotiation', 'limited', $scope.ng_localStorage.isProdMode);

        $scope.createAddressPromises = [];

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

            if (!model.isMultilots) {
                model.lots[0].isFake = true;
                model.lots = model.lots.splice(0, 1);
            }

            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];                

                for (var j = 0; j < lot.items.length; j++) {

                    var curItem = lot.items[j];
                    curItem.classification.id = curItem.classification.code;
                    curItem.classification.description = curItem.classification.description;
                    for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                        curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                        curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                    }

                    if (typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, $scope.createAddressPromises);
                    }
                }
            }

            // create Tender Finally
            tenderFormService.createTenderFinally($scope, $scope.createAddressPromises);
            
        };

        $scope.isAllDataGood = function (model) {
            if (model.lots.length === 0) {
                return false;
            }
            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (lot.items.length === 0) {
                    return false;
                }
                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!item.classification.id) {
                        return false;
                    }
                    if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                            (item.deliveryDate.endDate < item.deliveryDate.startDate)) {
                        return false;
                    }
                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkMilestonesPercentageSumm(model)) return false;
            return true;
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }
    }
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('createTenderLimitedQuickCtrl', createTenderLimitedQuick);
    createTenderLimitedQuick.$inject = [
        '$scope',
        '$localStorage',
        'tenderHelperService',
        '$controller'];
    function createTenderLimitedQuick(
        $scope,
        $localStorage,
        tenderHelperService,
        $controller) {

        $scope.ng_localStorage = $localStorage;

        $controller('createTenderLimitedCtrl', { $scope: $scope });

        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('negotiation.quick', 'limited', $scope.ng_localStorage.isProdMode);

    }
})();;
(function () {
    'use strict';
    angular
        .module('app')
        .controller('createTenderLimitedReportingCtrl', createTenderLimitedReporting);
    createTenderLimitedReporting.$inject = [
        '$scope',
        '$localStorage',
        'tenderHelperService',
        '$controller'];
    function createTenderLimitedReporting(
        $scope,
        $localStorage,
        tenderHelperService,
        $controller) {

        $scope.ng_localStorage = $localStorage;
        $controller('createTenderLimitedCtrl', { $scope: $scope });
        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('reporting', 'limited', $scope.ng_localStorage.isProdMode);

    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('createTenderPriceQuotationCtrl', createTender);

    createTender.$inject = [
        '$scope',
        '$controller',
        'tenderHelperService',
        'abp.services.etender.tender',
        'goToTenderService',
        'tenderFormAboveService',
        'addFeaturesService',
        'tenderFormService',
        'getTenderService',
        'abp.services.etender.getTender',
        '$timeout',
        '$location'
    ];
    function createTender($scope,
                          $controller,
                          tenderHelperService,
                          tender,
                          goToTenderService,
                          tenderFormAboveService,
                          addFeaturesService,
                          tenderFormService,
                          getTenderService,
                          getTender,
                          $timeout,
                          $location) {
        
        angular.extend(this, $controller('createTenderCtrl', {
            $scope: $scope
        }));
        var queryParams = $location.search();

        $scope.createTenderModel.procurementMethodType = 'priceQuotation';
        $scope.tId = null;
        $scope.getTenderCounter = 0;
        $scope.skipSign = queryParams && queryParams.noSign;

        $scope.isAllDataGood = function (model) {

            if (!checkTenderPeriod() ||
                !tenderFormAboveService.isAllDataGood(model)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (!tenderFormAboveService.isAllDataGoodInLot(model, lot)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            return true;
        };

        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }
        function checkTenderPeriod() {
            if (!$scope.createTenderModel.tenderPeriod) return false;
            var startDate = new Date();
            var endDate = new Date($scope.createTenderModel.tenderPeriod.endDate);

            var st = startDate.getTime();
            var et = endDate.getTime();

            var diff = (et - st) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;
            if (diff >= 3) return true;

            return false;
        };

        $scope.createTenderFinally = function () {
            var data = tenderHelperService.setAdditionalClassifications($scope.createTenderModel);
            tenderHelperService.addAdditionalInfo(data);
            data.mainProcurementCategory = {
                value: 'goods'
            };
            data.procurementMethod = 'selective';
            data.enquiryPeriod.endDate = null;
            data.enquiryPeriod.startDate = null;
            data.tenderPeriod.startDate = new Date();
            data.profileId = data.selectedProfile.id;
            //console.log(data);
            //return;

            data.lots.forEach(function (lot) {
                lot.items.forEach(function (item) {
                    if (item.deliveryAddress.city &&
                        (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                        item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                        item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                            delete item.deliveryAddress.city;
                    }
                });
            });

            var createTender = tender.createTenderProzorro(data);
            createTender
                .then(function (response) {
                        $scope.dataToRedirect = response.data;
                        abp.notify.success($scope.$root.source('CreatePurchase'));
                        abp.ui.clearBusy(".panel-default:first");
                        if (response.data.notExport || $scope.skipSign) {
                            goToTenderService.redirect($scope.dataToRedirect, response.data.id);
                        } else {
                            getTenderInfoRequest(response.data.id);
                        }
                    },
                    function(err) {
                        console.log(err.data.message);
                        $scope.blockCreateTender = false;
                        abp.ui.clearBusy();
                    });
            return createTender;
        }

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $(document).on('hidden.bs.modal','#personSignDataErrorModal', function () {
            $('#modalSignNewTender').modal('show');
        });

        $scope.showSignModal = function () {
            $scope.entityType = 'tender';
            if (!$scope.detailes.isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignNewTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $scope.tId);
        });

        $scope.getTenderBefore = function () {
            abp.ui.setBusy();
            $(".hide-move-efect").fadeOut();
        };

        function getTenderInfoRequest(tenderId) {
            if ($scope.getTenderCounter <= 5) {
                abp.ui.setBusy();
                $timeout(function () {
                    getTender.getTender({"Id": tenderId}).then(function (response) {
                    $scope.detailes = response.data;
                    getTenderService.getTenderThen(response.data, $scope, true);
                    $scope.tId = response.data.id;
                    if (response.data.apiId) {
                        $scope.getTenderCounter = 0;
                        $scope.showSignModal();
                    } else {
                        $scope.getTenderCounter++;
                        getTenderInfoRequest($scope.tId);
                    }
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                }, 1000);
            } else {
                $scope.getTenderCounter = 0;
                abp.notify.error('Сталася помилка при публікації закупівлі.');
            }
        };
    }
})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('createTenderSimpleDefenseCtrl', createTenderSimpleDefense);

    createTenderSimpleDefense.$inject = [
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        'tenderHelperService',
        '$localStorage',
        'addFeaturesService',
        'tenderFormService'
    ];
    function createTenderSimpleDefense(
        $scope,
        $location,
        $q,
        tenderService,
        tenderHelperService,
        $localStorage,
        addFeaturesService,
        tenderFormService)
    {
        $scope.ng_localStorage = $localStorage;
        $scope.createTenderModel = tenderHelperService.getCreateTenderModel('simple.defense', 'open', $scope.ng_localStorage.isProdMode);

        //получаем данные об организации из tenderContactPoint
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            abp.ui.setBusy(".panel-default:first");
            var model = $scope.createTenderModel;

			if (!model.isMultilots) {
				model.lots[0].isFake = true;
				model.lots = model.lots.splice(0, 1);
			}

            if (isNotExport) model.templateType = 'tenderDraft';
            model.notExport = isNotExport;
            if (setPendingApprovalStatusForTenderCorporation) model.setPendingApprovalStatusForTenderCorporation = true;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];                

                for (var j = 0; j < lot.items.length; j++) {
                    var curItem = lot.items[j];

                    curItem.classification.id = curItem.classification.code;
                    curItem.classification.description = curItem.classification.description;
                    for (var i = 0; i < curItem.additionalClassifications.length; i++) {
                        curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                        curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                    }

                    if (typeof curItem.deliveryLocation != 'undefined'
                        && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if (curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // create Tender Finally
            tenderFormService.createTenderFinally($scope, createAddressPromises);
            
        };

        $scope.isAllDataGood = function (model) {

            if (!checkTenderPeriod()) return false;
            if (!tenderFormService.isAllDataGood(model, $scope)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {

                var lot = model.lots[i];

                if (!tenderFormService.isAllDataGoodInLot(lot, $scope)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }


            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.isSaveAsDraftButtonDisabled = function (form) {
            if (form.$error && form.$error.required && form.$error.required.length === 1 && form.$error.required[0].$name === 'planExternalId') {
                return false;
            } else {
                return !form.$valid;
            }
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        // internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }

        function checkTenderPeriod() {
            return tenderHelperService
                     .diffBetweenDates(6,
                      $scope.createTenderModel.tenderPeriod.endDate);
        }
    }
})();;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateAgreementSelectionUaCtrl', updateAgreementSelectionUa);
    updateAgreementSelectionUa.$inject = [
        '$rootScope',
        '$scope',
        '$localStorage',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderFormFrameworkService',
        'tenderFormService',
        'goToTenderService',
        'tenderHelperService',
        '$location',
        '$q',
        '$timeout'
    ];
    function updateAgreementSelectionUa(
        $rootScope,
        $scope,
        $localStorage,
        tenderAppService,
        getTenderAppService,
        $stateParams,
        tenderFormFrameworkService,
        tenderFormService,
        goToTenderService,
        tenderHelperService,
        $location,
        $q,
        $timeout) {
        $scope.ng_localStorage = $localStorage;
        $scope.updateTenderModel = tenderFormFrameworkService.getTendetObj();

        tenderFormService.getTender($scope);

        $scope.getTenderThen = function (data) {
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            console.log('UpdateTenderModel:', data);
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep && l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });

            abp.ui.clearBusy();
        };

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            var model = $scope.updateTenderModel;

            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            if (createAddressPromises.length > 0) {
                $q.all(createAddressPromises).then(function () {
                    return updateTenderFinally();
                });

            } else {
                return updateTenderFinally();
            }

            function updateTenderFinally() {
                var data = tenderHelperService.setAdditionalClassifications($scope.updateTenderModel);

                data.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderAppService.updateTenderProzorro(data)
                    .then(function (response) {
                        $scope.datatToRedirect = response.data;
                        abp.notify.success($scope.$root.source('PurchaseChanged'));
                        getTenderAppService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                            $scope.detailes = response.data;
                            $scope.dataToRedirect = response.data;
                            $scope.getTenderThen(response.data);
                            $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                        }, function (error) {
                            console.log(error);
                        }).finally(function () {
                            abp.ui.clearBusy();
                        });
                    },
                    function (err, data) {
                        console.log(arguments);
                    }).then(function () {

                    });
            }
        };

        $scope.showSignModal = function () {
            $scope.tId = $scope.detailes.id;
            $scope.entityType = 'tender';
            if (!$scope.detailes.isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignNewTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $scope.tId);
        });
    }
})(); 
;
(function () {
    'use strict';

    angular
		.module('app')
		.controller('updateTenderProzorroCtrl', createTender);

    createTender.$inject = ['$scope', '$controller', '$timeout', '$location', 'tenderHelperService', 'abp.services.etender.tender',
        'goToTenderService', '$stateParams', 'abp.services.etender.getTender'];

    function createTender($scope, $controller, $timeout, $location, tenderHelperService, tender, goToTenderService, $stateParams, getTender) {
        angular.extend(this, $controller('updateTenderCtrl', {
            $scope: $scope
        }));

        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;

        $scope.updateTenderFinally = function (createTenderModel) {
                var data = tenderHelperService.setAdditionalClassifications(createTenderModel);
                var wasInDraftState = $scope.createTenderModel.notExport;
                /*
                // Вот так данные должны передаваться для процедуры CloseFrame
                data.maxAwardsCount = 3;
                data.agreementDuration = {
                    years: 1,
                    months: 2,
                    days: 3
                };
                */

                data.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                var updateTender = tender.updateTenderProzorro(data);

                data.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                updateTender.then(function (response) {
                    if (wasInDraftState && !response.data.notExport && data.documents && data.documents.length) {
                        $scope.getTenderForExportDocs(data, true);
                    } else {
                        if (!response.data.notExport ||
                            ($scope.detailes.procurementMethodType === 'belowThreshold' && !$scope.detailes.isSimpleProcurementMethodRationale)) {
                            getTender.getTender({ "Id": response.data.id }).then(function (response) {
                                $scope.getTenderThen(response.data);
                                $scope.doActionsAfterTenderUpdate(response);
                            }, function (error) {
                                console.log(error);
                            }).finally(function () {
                                abp.ui.clearBusy();
                            });
                        } else {
                            $scope.doActionsAfterTenderUpdate(response);
                        }
                    }
                },
                function (err, data) {
                    console.log(arguments);
                    abp.ui.clearBusy();
                });

                return updateTender;
        }

        $scope.doActionsAfterTenderUpdate = function (response) {
            abp.notify.success($scope.$root.source('PurchaseChanged'));
            abp.ui.clearBusy();
            $scope.dataToRedirect = response.data;
            if (!$scope.dataToRedirect.status || $scope.dataToRedirect.status === 'draft'
                || $scope.tenderDetailes.procurementMethod === 'open'
                || $scope.skipSign) {
                    var needToRedirectToCreateCriteria = ($scope.dataToRedirect.procurementMethodType === 'belowThreshold' || $scope.dataToRedirect.procurementMethodType === 'simple.defense') && !$scope.dataToRedirect.status;
                    if (needToRedirectToCreateCriteria) {
                        goToTenderService.criteriaRedirect($scope.dataToRedirect.id);
                    } else {
                        goToTenderService.redirect($scope.dataToRedirect, $scope.dataToRedirect.id);
                    }
            } else {
                $scope.showSignModal($scope.tenderDetailes.isAllDocumentsExported);
            }
        };

        $scope.getTenderForExportDocs = function (data, firstTry) {
            var timeoutCount = firstTry ? 5000 : getTimeoutCount(data.documents);
            $timeout(function () {
                getTender.getTender({ "Id": data.id }).then(function (response) {
                    if (getTimeoutCount(response.data.documents)) {
                        $scope.getTenderForExportDocs(response.data, false);
                    } else {
                        $scope.getTenderThen(response.data);
                        $scope.doActionsAfterTenderUpdate(response);
                    }
                }, function (error) {
                    console.log(error);
                }).finally(function () {
                    abp.ui.clearBusy();
                });
            }, timeoutCount)
        };

        function getTimeoutCount(documents) {
            var notExportedDocuments = documents.filter(function (document) {
                return !document.isExported;
            });

            if (notExportedDocuments.length) {
                if (notExportedDocuments.length < 5) {
                    return notExportedDocuments.length * 1000;
                } else {
                    return 5000;
                }
            } else {
                return 0;
            }
        }
    }
})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderAboveCtrl', updateTenderAbove);
    updateTenderAbove.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderHelperService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'addFeaturesService',
        'tenderFormAboveService',
        'tenderFormService',
        'goToTenderService',
        'tenderValidationService',
        'tenderCriteriasService'
    ];
    function updateTenderAbove(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        getTender,
        $stateParams,
        tenderHelperService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        addFeaturesService,
        tenderFormAboveService,
        tenderFormService,
        goToTenderService,
        tenderValidationService,
        tenderCriteriasService
    ) {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;
        $scope.updateTenderModel = tenderFormAboveService.getTenderModel('aboveThresholdUA');
        $scope.isCriteriaFormValid = true;

        // get tendet data
        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            //console.log(data);
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            tenderHelperService.setDefaultItems(data);
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
            abp.ui.clearBusy();
        };

        $scope.goBack = function () {
            console.log($scope.updateTenderModel);
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onCriteriaFormChanged', function (event, isCriteriaFormValid) {
            $scope.isCriteriaFormValid = isCriteriaFormValid;
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTender.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias', true, $scope.activeTab, $scope.updateTenderModel.tenderCriteria);
        };
        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias, updatedLots) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
            $scope.updateTenderModel.lots = updatedLots;
        });

        function getRequirementByLotId(lotId, criterias) {
            var requirementStatus = null;
            var foundCriteriaByLotId = false;

            var classificationApiIds = [
                'CRITERION.OTHER.BID.GUARANTEE',
                'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
            ]

            foundCriteriaByLotId = criterias.find(function (singleCriteria) {
                if (singleCriteria.relatesTo === 'tender') {
                    return singleCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE';
                } else if (singleCriteria.relatesTo === 'lot') {
                    return singleCriteria.relatedItem === lotId && singleCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE';
                }
            });

            if (foundCriteriaByLotId) {
                foundCriteriaByLotId.requirementGroups.find(function (requirementGroup) {
                    requirementGroup.requirements.find(function name(requirement) {
                        return requirementStatus = requirement.requirementStatus !== 'cancelled';
                    });
                });
            } else {
                return false;
            }
            
            return requirementStatus;
        }

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            if ($scope.updateTenderModel && $scope.updateTenderModel.tenderCriteria && $scope.updateTenderModel.tenderCriteria.length) {
                if (!tenderCriteriasService.isLifeCycleCriteriasValid($scope.updateTenderModel.tenderCriteria, $scope.updateTenderModel)) {
                    abp.notify.error('Для публікації необхідно застосувати хоча б один критерій вартості життєвого циклу!');
                    return;
                }
            }

            var model = angular.copy($scope.updateTenderModel);
            var needBreak = false;

            if (model.status && model.criteriaFlags.canBeUsedOtherBidGuarantee) {
                model.lots.forEach(function (lot) {
                    var requirementByLotIdHasActiveStatus = getRequirementByLotId(lot.apiId, model.tenderCriteria);
                    
                    if ((lot.hasGuarantee === '1' || lot.hasGuarantee === '0') && requirementByLotIdHasActiveStatus) {
                       if (!lot.guarantee || lot.guarantee.amount === 0) {
                            needBreak = true;
                            abp.ui.clearBusy();
                            return abp.notify.error('Для публікації змін необхідно архівувати критерій забезпечення тендерної пропозиції!');
                       }
                    }
                    if (model.tenderCriteria && model.tenderCriteria.length) {
                        if (lot.hasGuarantee === '1' && !requirementByLotIdHasActiveStatus) {
                            if (lot.guarantee.amount > 0) {
                                needBreak = true;
                                abp.ui.clearBusy();
                                return abp.notify.error('Для публікації змін необхідно вимкнути "Забезпечення тендерних пропозицій" або додати відповідний критерій!');
                            }
                        }
                    }
                    if ((lot.hasGuarantee === '0' && !requirementByLotIdHasActiveStatus) || !model.tenderCriteria.length) {
                       if (lot.guarantee && lot.guarantee.amount > 0) {
                            needBreak = true;
                            abp.ui.clearBusy();
                            return abp.notify.error('Для публікації змін необхідно додати критерій забезпечення тендерної пропозиції');
                       }
                    }
                });
            }

            if (needBreak) return;
            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;

            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // update Tender Finally
            tenderFormService.updateTenderFinally($scope, model, createAddressPromises);

        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!tenderValidationService.checkTenderAbovePeriodForUpdate($scope.updateTenderModel.tenderPeriod.endDate, $scope.updateTenderModel.creationTime)
                || !tenderFormAboveService.isAllDataGood(model)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (!tenderFormAboveService.isAllDataGoodInLot(model, lot)) return false;

                if (lot.guarantee == null && lot.hasGuarantee && lot.hasGuarantee !== '0') return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormAboveService.isAllDataGoodinItem(item))
                        return false;
                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }

                    //if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                    //         ((item.deliveryDate.endDate < item.deliveryDate.startDate) || (item.deliveryDate.startDate < model.tenderPeriod.endDate))) {
                    //    return false;
                    //}
                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTender.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        });
        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }


        //#region internal
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }
        //#endregion

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderAboveEuCtrl', updateTenderAboveEu);
    updateTenderAboveEu.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderHelperService',
        'lookupService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'addFeaturesService',
        'tenderFormAboveService',
        'tenderFormService',
        'tenderValidationService',
        'goToTenderService',
        'tenderCriteriasService'
    ];
    function updateTenderAboveEu(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        getTender,
        $stateParams,
        tenderHelperService,
        lookupService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        addFeaturesService,
        tenderFormAboveService,
        tenderFormService,
        tenderValidationService,
        goToTenderService,
        tenderCriteriasService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;
        $scope.updateTenderModel = tenderFormAboveService.getTenderModel('aboveThresholdEU');
        $scope.isCriteriaFormValid = true;

        // get tendet data
        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });

            $scope.updateTenderModel.contactPoints.forEach(function (cp) {
                var language = lookupService.getLanguage(cp.language);
                cp.sLang = language;
            });
            tenderHelperService.setDefaultItems(data);
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
            abp.ui.clearBusy();
        }

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onCriteriaFormChanged', function (event, isCriteriaFormValid) {
            $scope.isCriteriaFormValid = isCriteriaFormValid;
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        var createAddressPromises = [];

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTender.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias', true, $scope.activeTab, $scope.updateTenderModel.tenderCriteria);
        };
        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias, updatedLots) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
            $scope.updateTenderModel.lots = updatedLots;
        });

        function getRequirementByLotId(lotId, criterias) {
            var requirementStatus = null;
            var foundCriteriaByLotId = false;

            var classificationApiIds = [
                'CRITERION.OTHER.BID.GUARANTEE',
                'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
            ]

            foundCriteriaByLotId = criterias.find(function (singleCriteria) {
                if (singleCriteria.relatesTo === 'tender') {
                    return singleCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE';
                } else if (singleCriteria.relatesTo === 'lot') {
                    return singleCriteria.relatedItem === lotId && singleCriteria.classification.apiId === 'CRITERION.OTHER.BID.GUARANTEE';
                }
            });
            
            if (foundCriteriaByLotId) {
                foundCriteriaByLotId.requirementGroups.find(function (requirementGroup) {
                    requirementGroup.requirements.find(function name(requirement) {
                        return requirementStatus = requirement.requirementStatus !== 'cancelled';
                    });
                });
            } else {
                return false;
            }
            
            return requirementStatus;
        }

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTender.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        });

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            if ($scope.updateTenderModel && $scope.updateTenderModel.tenderCriteria && $scope.updateTenderModel.tenderCriteria.length) {
                if (!tenderCriteriasService.isLifeCycleCriteriasValid($scope.updateTenderModel.tenderCriteria, $scope.updateTenderModel)) {
                    abp.notify.error('Для публікації необхідно застосувати хоча б один критерій вартості життєвого циклу!');
                    return;
                }
            }

            var model = angular.copy($scope.updateTenderModel);
            var needBreak = false;

            if (model.status && model.criteriaFlags.canBeUsedOtherBidGuarantee) {
                model.lots.forEach(function (lot) {
                    var requirementByLotIdHasActiveStatus = getRequirementByLotId(lot.apiId, model.tenderCriteria);
                    
                    if ((lot.hasGuarantee === '1' || lot.hasGuarantee === '0') && requirementByLotIdHasActiveStatus) {
                       if (!lot.guarantee || lot.guarantee.amount === 0) {
                            needBreak = true;
                            abp.ui.clearBusy();
                            return abp.notify.error('Для публікації змін необхідно архівувати критерій забезпечення тендерної пропозиції!');
                       }
                    }
                    if (model.tenderCriteria && model.tenderCriteria.length) {
                        if (lot.hasGuarantee === '1' && !requirementByLotIdHasActiveStatus) {
                            if (lot.guarantee.amount > 0) {
                                needBreak = true;
                                abp.ui.clearBusy();
                                return abp.notify.error('Для публікації змін необхідно вимкнути "Забезпечення тендерних пропозицій" або додати відповідний критерій!');
                            }
                        }
                    }
                    if ((lot.hasGuarantee === '0' && !requirementByLotIdHasActiveStatus) || !model.tenderCriteria.length) {
                       if (lot.guarantee && lot.guarantee.amount > 0) {
                            needBreak = true;
                            abp.ui.clearBusy();
                            return abp.notify.error('Для публікації змін необхідно додати критерій забезпечення тендерної пропозиції');
                       }
                    }
                });
            }

            if (needBreak) return;
            
            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // update Tender Finally
            tenderFormService.updateTenderFinally($scope, model, createAddressPromises);
            
        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!tenderValidationService.checkTenderAboveEuPeriodForUpdate($scope.updateTenderModel.tenderPeriod.endDate, $scope.updateTenderModel.creationTime)
                || !tenderFormAboveService.isAllDataGood(model)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (!tenderFormAboveService.isAllDataGoodInLot(model, lot)) return false;

                if (lot.guarantee == null && lot.hasGuarantee && lot.hasGuarantee !== '0') return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormAboveService.isAllDataGoodinItem(item))
                        return false;

                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }

                    //if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                    //         ((item.deliveryDate.endDate < item.deliveryDate.startDate) || (item.deliveryDate.startDate < model.tenderPeriod.endDate))) {
                    //    return false;
                    //}
                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        //#region internal
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }
        //#endregion
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderDefenseCtrl', updateTenderDefense);
    updateTenderDefense.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderHelperService',
        'lookupService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'tenderFormService',
        'tenderValidationService',
        'goToTenderService',
        'tenderCriteriasService'
    ];

    function updateTenderDefense(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        getTender,
        $stateParams,
        tenderHelperService,
        lookupService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        tenderFormService,
        tenderValidationService,
        goToTenderService,
        tenderCriteriasService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;

        $scope.updateTenderModel = {
            description: null,
            features: [],            
            procurementMethod: 'open',
            procurementMethodType: 'aboveThresholdUA.defense',
            tenderPeriod: {
                startDate: null,
                endDate: null
            },
            title: null,
            lots: []
        };
        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            console.log($scope.updateTenderModel);
            $scope.updateTenderModel.contactPoints.forEach(function (cp) {
                var language = lookupService.getLanguage(cp.language);
                cp.sLang = language;
            });
            tenderHelperService.setDefaultItems(data);
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
            $scope.detailes = data;
            abp.ui.clearBusy();
        };

        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTender.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };
        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            $('#modalSignTender').modal('hide');
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTender.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        });

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            if ($scope.updateTenderModel && $scope.updateTenderModel.tenderCriteria && $scope.updateTenderModel.tenderCriteria.length) {
                if (!tenderCriteriasService.isLifeCycleCriteriasValid($scope.updateTenderModel.tenderCriteria, $scope.updateTenderModel)) {
                    abp.notify.error('Для публікації необхідно застосувати хоча б один критерій вартості життєвого циклу!');
                    return;
                }
            }

            var model = angular.copy($scope.updateTenderModel);

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];
                
                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // update Tender Finally
            tenderFormService.updateTenderFinally($scope, model, createAddressPromises);
            
        };

   
        $scope.isAllDataGood = function (model) {

            if (!tenderValidationService.checkTenderDefensePeriodForUpdate($scope.updateTenderModel.tenderPeriod.endDate, $scope.updateTenderModel.creationTime)
                || !tenderFormService.isAllDataGood(model, $scope)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {

                var lot = model.lots[i];

                if (!tenderFormService.isAllDataGoodInLot(lot, $scope)) return false;

                if (lot.guarantee == null && lot.hasGuarantee && lot.hasGuarantee !== '0') return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }

                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;

                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        //#region internal
        $scope.checkFeature = function (feature) {
            if (feature.options.length === 0) return false;

            var ov = feature.options.map(function (o) {
                return parseInt(o.value);
            });
            if (Math.max.apply(null, ov) > feature.value) return false;

            return true;
        }

        function checkFeatureSum(model) {
            var tFeatures = model.features.map(function (f) {
                return f;
            });

            if (getFeatureSum(tFeatures) > 30) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                var features = tFeatures.concat(lot.features);

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    features = features.concat(item.features);
                }

                if (getFeatureSum(features) > 30) return false;
            }

            return true;
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        function getFeatureSum(features) {
            var fSum = features.reduce(function (sum, f) {
                return sum + parseInt(f.value);
            }, 0);

            return fSum;
        }
        //#endregion
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderDialogueCtrl', updateTenderDialogue);
    updateTenderDialogue.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$localStorage',
        '$sessionStorage',
        '$timeout',
        'tenderFormService',
        'updateTenderDialogueService',
        'addFeaturesService',
        '$stateParams',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        'goToTenderService'];
    function updateTenderDialogue(
        $rootScope,
        $scope,
        $location,
        $localStorage,
        $sessionStorage,
        $timeout,
        tenderFormService,
        updateTenderDialogueService,
        addFeaturesService,
        $stateParams,
        tender,
        getTender,
        goToTenderService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;

        $scope.updateTenderModel = updateTenderDialogueService.getTenderModel('competitiveDialogueUA');
        $scope.isCriteriaFormValid = true;

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function (data) {
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.tenderDetailes = data;
            updateTenderDialogueService.getTenderThen(data, $scope);

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
        }
        $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });
        
        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            updateTenderDialogueService.submit($scope, isNotExport, setPendingApprovalStatusForTenderCorporation);
        };

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTender.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        });

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!checkMilestonesPercentageSumm(model)) return false;
            return updateTenderDialogueService.isAllDataGood($scope, model);
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
        });

        $scope.tenderId = $stateParams.tId;
        $scope.activeTab = 'editTender';
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tender.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTender.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.tenderDetailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias');
        };

        //#region internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderDialogueEuCtrl', updateTenderDialogueEu);
    updateTenderDialogueEu.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$localStorage',
        '$sessionStorage',
        '$timeout',
        'tenderFormService',
        'updateTenderDialogueService',
        'addFeaturesService',
        'tenderHelperService',
        '$stateParams',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        'goToTenderService'
    ];
    function updateTenderDialogueEu(
        $rootScope,
        $scope,
        $location,
        $localStorage,
        $sessionStorage,
        $timeout,
        tenderFormService,
        updateTenderDialogueService,
        addFeaturesService,
        tenderHelperService,
        $stateParams,
        tenderService,
        getTender,
        goToTenderService
    ) {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        $scope.ng_localStorage = $localStorage;
        $scope.updateTenderModel = updateTenderDialogueService.getTenderModel('competitiveDialogueEU');
        $scope.isCriteriaFormValid = true;

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function (data) {
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.tenderDetailes = data;
            updateTenderDialogueService.getTenderThen(data, $scope);

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
        }
        $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.$on('needToSignTender', function () {
            getTender.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        });

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;
            updateTenderDialogueService.submit($scope, isNotExport, setPendingApprovalStatusForTenderCorporation);      
        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!checkMilestonesPercentageSumm(model)) return false;
            return updateTenderDialogueService.isAllDataGood($scope, model);
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTender.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.tenderDetailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias');
        };

        //#region internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderDialogueEuStage2Ctrl', updateTenderDialogueEuStage2);

    updateTenderDialogueEuStage2.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$timeout',
        'abp.services.etender.tender',
        'referenceService',
        '$stateParams',
        'tenderHelperService',
        '$localStorage',
        '$sessionStorage',
        'tenderFormService',
        'goToTenderService',
        'updateTenderDialogueService',
        'abp.services.etender.getTender'];
    function updateTenderDialogueEuStage2(
        $rootScope,
        $scope,
        $location,
        $timeout,
        tenderAppService,
        referenceAppService,
        $stateParams,
        tenderHelperService,
        $localStorage,
        $sessionStorage,
        tenderFormService,
        goToTenderService,
        updateTenderDialogueService,
        getTenderAppService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.ng_localStorage = $localStorage;
        $scope.isCriteriaFormValid = true;
        $scope.skipSign = queryParams && queryParams.noSign;

        function activate() {
            abp.ui.setBusy();

            getTenderAppService.getTender({ id: $stateParams.tId, display: true, seoUrl: $stateParams.seoUrl })
                .then(function (response) {
                    var data = response.data;
                    console.log('Tender data:', response.data);

                    if (!data.isEdit) {
                        abp.notify.error('Ви не можете редагувати цей тендер');
                        $location.path('/');
                        return;
                    }
                    if (data.plan) {
                        $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
                    }
                    $scope.updateTenderModel = data;
					$scope.updateTenderModel.currency = data.lots[0].value.currency;
					$scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
                    $scope.updateTenderModel.valueAddedTaxIncluded = data.lots[0].value.valueAddedTaxIncluded;
                    tenderHelperService.setDefaultItems(data);
                    $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
                    $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel && $scope.updateTenderModel.isECriteriaArticle17;
                    $scope.detailes = data;
                    abp.ui.clearBusy();
                });

            referenceAppService.getAllUnits()
                .then(function (res) {
                    $scope.units = res.data.units;
                });

            $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
            $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
            $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;

            $scope.nowDate = new Date();
            $scope.nowDate = $scope.nowDate.setDate($scope.nowDate.getDate() + 30);
            $scope.nowDate = new Date($scope.nowDate);

            if ($localStorage.isProdMode) {
                var startDate = new Date();
                var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 31);
                $scope.calendarMinDate = minDate;
            }

        }

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            activate();
        }

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderAppService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderAppService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        var data = response.data;
                        console.log('Tender data:', response.data);

                        if (!data.isEdit) {
                            abp.notify.error('Ви не можете редагувати цей тендер');
                            $location.path('/');
                            return;
                        }
                        if (data.plan) {
                            $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
                        }
                        $scope.updateTenderModel = data;
                        $scope.updateTenderModel.currency = data.lots[0].value.currency;
                        $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
                        $scope.updateTenderModel.valueAddedTaxIncluded = data.lots[0].value.valueAddedTaxIncluded;
                        tenderHelperService.setDefaultItems(data);
                        $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
                        $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel && $scope.updateTenderModel.isECriteriaArticle17;
                        abp.ui.clearBusy();
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias');
        };

        $scope.getTenderThen = function (data) {
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.tenderDetailes = data;
            updateTenderDialogueService.getTenderThen(data, $scope);

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
        }

        $scope.submit = function () {
            tenderAppService.updateTender($scope.updateTenderModel)
                .then(function (response) {
                    $scope.dataToRedirect = response.data;
                    abp.notify.success($scope.$root.source('PurchaseChanged'));
                    if (!$scope.skipSign) {
                        getTenderAppService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                            $scope.detailes = response.data;
                            $scope.getTenderThen(response.data);
                            $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                        }, function (error) {
                            console.log(error);
                        }).finally(function () {
                            abp.ui.clearBusy();
                        });
                    } else {
                        goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
                    }

                },
                function (err, data) {
                    console.log(arguments);
                });
        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!checkMilestonesPercentageSumm(model)) return false;
            return checkTenderPeriodForUpdate();
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        function checkTenderPeriodForUpdate() {
            if (!$scope.updateTenderModel) return false;

            var nowDate = new Date();
            var endDate = new Date($scope.updateTenderModel.tenderPeriod.endDate);
            var startDate = new Date($scope.updateTenderModel.tenderPeriod.startDate);

            var nt = nowDate.getTime();
            var et = endDate.getTime();
            var st = startDate.getTime();

            var diff = (et - nt) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;

            //if ((et - nt) >= 7 && (et - st) >= 30) {
            //    return diff >= 7;
            //}

            //return diff >= 30;

            if ($scope.updateTenderModel.status === 'active.tendering') {
                $scope.needDiff = 7;
                return diff >= 7;
            } else if ($scope.updateTenderModel.status === 'draft.stage2') {
                $scope.needDiff = 30;
                return diff >= 30;
            } else {
                $scope.needDiff = 30;
                return diff >= 30;
            }
        }

        $scope.vm = {
            checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,
        };
        var vm = $scope.vm;
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderDialogueStage2Ctrl', updateTenderDialogueStage2);

    updateTenderDialogueStage2.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'referenceService',
        'goToTenderService',
        '$stateParams',
        'tenderHelperService',
        '$localStorage',
        '$sessionStorage',
        'tenderFormService',
        'abp.services.etender.getTender'];

    function updateTenderDialogueStage2(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderAppService,
        referenceAppService,
        goToTenderService,
        $stateParams,
        tenderHelperService,
        $localStorage,
        $sessionStorage,
        tenderFormService,
        getTenderAppService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.ng_localStorage = $localStorage;
        $scope.isCriteriaFormValid = true;
        $scope.skipSign = queryParams && queryParams.noSign;

        function activate() {
            abp.ui.setBusy();

            getTenderAppService.getTender({ id: $stateParams.tId, display: true, seoUrl: $stateParams.seoUrl })
                .then(function (response) {
                    var data = response.data;
                    if (!data.isEdit) {
                        abp.notify.error('Ви не можете редагувати цей тендер');
                        $location.path('/');
                        return;
                    }
                    if (data.plan) {
                        $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
                    }
                    $scope.updateTenderModel = data;
					$scope.updateTenderModel.currency = data.lots[0].value.currency;
					$scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
                    $scope.updateTenderModel.valueAddedTaxIncluded = data.lots[0].value.valueAddedTaxIncluded;
                    tenderHelperService.setDefaultItems(data);
                    $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
                    $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel && $scope.updateTenderModel.isECriteriaArticle17;
                    $scope.detailes = data;
                    abp.ui.clearBusy();
                });
                
                referenceAppService.getAllUnits()
                    .then(function (res) {
                        $scope.units = res.data.units;
                     });

            $scope.isDeliveryStartDateGoodForAbove = tenderHelperService.isDeliveryStartDateGoodForAbove;
            $scope.isDeliveryEndDateGoodForAbove = tenderHelperService.isDeliveryEndDateGoodForAbove;
            $scope.isDeliveryDateGoodForAbove = tenderHelperService.isDeliveryDateGoodForAbove;

            $scope.nowDate = new Date();
            $scope.nowDate = $scope.nowDate.setDate($scope.nowDate.getDate() + 15);
            $scope.nowDate = new Date($scope.nowDate);

            if ($localStorage.isProdMode) {
                var additionalCalendarDaysToSetMinimalTenderCreationDate = 16;
                var startDate = new Date();
                var minDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + additionalCalendarDaysToSetMinimalTenderCreationDate);
                $scope.calendarMinDate = minDate;
            }
        }

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            activate();
        }

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.detailes, $stateParams.tId)
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderAppService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderAppService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        var data = response.data;
                        if (!data.isEdit) {
                            abp.notify.error('Ви не можете редагувати цей тендер');
                            $location.path('/');
                            return;
                        }
                        if (data.plan) {
                            $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
                        }
                        $scope.updateTenderModel = data;
                        $scope.updateTenderModel.currency = data.lots[0].value.currency;
                        $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
                        $scope.updateTenderModel.valueAddedTaxIncluded = data.lots[0].value.valueAddedTaxIncluded;
                        tenderHelperService.setDefaultItems(data);
                        $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
                        $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel && $scope.updateTenderModel.isECriteriaArticle17;
                        abp.ui.clearBusy();
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias');
        };

        $scope.submit = function () {
            tenderAppService.updateTender($scope.updateTenderModel)
                .then(function (response) {
                    abp.notify.success($scope.$root.source('PurchaseChanged'));
                    if (!$scope.skipSign) {
                        getTenderAppService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                            $scope.detailes = response.data;
                            $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                        }, function (error) {
                            console.log(error);
                        }).finally(function () {
                            abp.ui.clearBusy();
                        });
                    } else {
                        goToTenderService.redirect($scope.detailes, $stateParams.tId);
                    }
                },
                function (err, data) {
                    console.log(arguments);
                });
        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!checkMilestonesPercentageSumm(model)) return false;
            return checkTenderPeriodForUpdate();
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function checkTenderPeriodForUpdate() {
            if (!$scope.updateTenderModel) return false;

            var nowDate = new Date();
            var endDate = new Date($scope.updateTenderModel.tenderPeriod.endDate);

            var nt = nowDate.getTime();
            var et = endDate.getTime();

            var diff = (et - nt) / (1000 * 3600 * 24);

            // для тестовых закупок валидация отключена
            if (!$scope.ng_localStorage.isProdMode && (diff > 0))
                return true;

            return diff >= 15;
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        $scope.vm = {
            checkTenderPeriodForUpdate: checkTenderPeriodForUpdate,
        };
        var vm = $scope.vm;
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderEscoCtrl', updateTenderEsco);

    updateTenderEsco.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        '$stateParams',
        'tenderHelperService',
        'lookupService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'addFeaturesService',
        'tenderFormService',
        'tenderFormEscoService',
        'goToTenderService',
        'abp.services.etender.getTender',
        'tenderValidationService'
    ];
    function updateTenderEsco(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        $stateParams,
        tenderHelperService,
        lookupService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        addFeaturesService,
        tenderFormService,
        tenderFormEscoService,
        goToTenderService,
        getTenderAppService,
        tenderValidationService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;
        $scope.isCriteriaFormValid = true;
        $scope.updateTenderModel = {
            description: null,
            features: [],
            procurementMethod: 'open',
            procurementMethodType: 'esco',
            tenderPeriod: {
                startDate: null,
                endDate: null
            },
            title: null,
            lots: []
        };

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            if (data.procurementMethodType === "esco") { // TODO: move to BACKEND
                $scope.updateTenderModel.escoTenderExt.nbuDiscountRate = Math.round($scope.updateTenderModel.escoTenderExt.nbuDiscountRate * 100 * 1000000) / 1000000;
                $scope.updateTenderModel.escoTenderExt.fundingKind = data.lots[0].escoLotExt.fundingKind;
                for (var i = 0; i < $scope.updateTenderModel.lots.length; i += 1) {
                    $scope.updateTenderModel.lots[i].escoLotExt.minimalStepPercentage = Math.round($scope.updateTenderModel.lots[i].escoLotExt.minimalStepPercentage * 100 * 1000000) / 1000000;
                    $scope.updateTenderModel.lots[i].escoLotExt.yearlyPaymentsPercentageRange = Math.round($scope.updateTenderModel.lots[i].escoLotExt.yearlyPaymentsPercentageRange * 100 * 1000000) / 1000000;
                }
            }
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep && l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;

            $scope.updateTenderModel.contactPoints.forEach(function (cp) {
                var language = lookupService.getLanguage(cp.language);
                cp.sLang = language;
            });
            tenderHelperService.setDefaultItems(data);

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
            abp.ui.clearBusy();
        };

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onCriteriaFormChanged', function (event, isCriteriaFormValid) {
            $scope.isCriteriaFormValid = isCriteriaFormValid;
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        var createAddressPromises = [];

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    changeToPercents(lot);

                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });
                updateNbuDiscount();

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderAppService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias', true, $scope.activeTab, $scope.updateTenderModel.tenderCriteria);
        };
        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias, updatedLots) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
            $scope.updateTenderModel.lots = updatedLots;
        });

        function getRequirementByLotId(lotId, criterias) {
            var requirementStatus = null;
            var foundCriteriaByLotId = false;

            var classificationApiIds = [
                'CRITERION.OTHER.BID.GUARANTEE',
                'CRITERION.OTHER.LIFE_CYCLE_COST.COST_OF_USE',
                'CRITERION.OTHER.LIFE_CYCLE_COST.MAINTENANCE_COST',
                'CRITERION.OTHER.LIFE_CYCLE_COST.END_OF_LIFE_COST',
                'CRITERION.OTHER.LIFE_CYCLE_COST.ECOLOGICAL_COST'
            ]

            foundCriteriaByLotId = criterias.find(function (singleCriteria) {
                if (singleCriteria.relatesTo === 'tender') {
                    return classificationApiIds.indexOf(singleCriteria.classification.apiId) !== -1;
                } else if (singleCriteria.relatesTo === 'lot') {
                    return singleCriteria.relatedItem === lotId && classificationApiIds.indexOf(singleCriteria.classification.apiId) !== -1;
                }
            });
            
            if (foundCriteriaByLotId) {
                foundCriteriaByLotId.requirementGroups.find(function (requirementGroup) {
                    requirementGroup.requirements.find(function name(requirement) {
                        return requirementStatus = requirement.requirementStatus !== 'cancelled';
                    });
                });
            } else {
                return false;
            }
            
            return requirementStatus;
        }

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            
            var model = angular.copy($scope.updateTenderModel);
            var needBreak = false;

            if (model.status && model.criteriaFlags.canBeUsedOtherBidGuarantee) {
                model.lots.forEach(function (lot) {
                    var requirementByLotIdHasActiveStatus = getRequirementByLotId(lot.apiId, model.tenderCriteria);
                    
                    if ((lot.hasGuarantee === '1' || lot.hasGuarantee === '0') && requirementByLotIdHasActiveStatus) {
                       if (!lot.guarantee || lot.guarantee.amount === 0) {
                            needBreak = true;
                            abp.ui.clearBusy();
                            return abp.notify.error('Для публікації змін необхідно архівувати критерій забезпечення тендерної пропозиції!');
                       }
                    }
                    if (model.tenderCriteria && model.tenderCriteria.length) {
                        if (lot.hasGuarantee === '1' && !requirementByLotIdHasActiveStatus) {
                            if (lot.guarantee.amount > 0) {
                                needBreak = true;
                                abp.ui.clearBusy();
                                return abp.notify.error('Для публікації змін необхідно вимкнути "Забезпечення тендерних пропозицій" або додати відповідний критерій!');
                            }
                        }
                    }
                    if ((lot.hasGuarantee === '0' && !requirementByLotIdHasActiveStatus) || !model.tenderCriteria.length) {
                       if (lot.guarantee && lot.guarantee.amount > 0) {
                            needBreak = true;
                            abp.ui.clearBusy();
                            return abp.notify.error('Для публікації змін необхідно додати критерій забезпечення тендерної пропозиції');
                       }
                    }
                });
            }

            if (needBreak) return; 
            
            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

            if (model.procurementMethodType === "esco") {
                model.escoTenderExt.nbuDiscountRate /= 100;
                for (var i = 0; i < model.lots.length; i += 1) {
                    changeToPercents(model.lots[i]);
                }
            }

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    /*if (curItem.deliveryAddressId && curItem.deliveryAddressId > 0) {

                        var updateAddressInput = curItem.deliveryAddress;
                        createAddressPromises.push(
                            addressService.updateAddress*(updateAddressInput)
                                .then(function (data) {
                                })
                            );

                    } else*/
                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            if (createAddressPromises.length > 0) {
                $q.all(createAddressPromises).then(function () {
                    return updateTenderFinally(model);
                });

            } else {
                return updateTenderFinally(model);
            }

            function updateTenderFinally(updateTenderModel) {
                var data = tenderHelperService.setAdditionalClassifications(updateTenderModel);

                data.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro(data)
                    .then(function (updateResponse) {
                        abp.notify.success($scope.$root.source('PurchaseChanged'));
                        $scope.dataToRedirect = updateResponse.data;
                        if ($scope.dataToRedirect.notExport || $scope.skipSign || ((!data.status || data.status === 'draft') && !$scope.dataToRedirect.notExport)) {
                            goToTenderService.redirect($scope.dataToRedirect, $scope.dataToRedirect.id);
                        } else {
                            getTenderAppService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                                $scope.detailes = response.data;
                                $scope.getTenderThen(response.data);
                                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                            }, function (error) {
                                console.log(error);
                            }).finally(function () {
                                abp.ui.clearBusy();
                            });
                        }
                    });
            }
            
        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        $scope.isAllDataGood = function (model) {

            if (!tenderValidationService.checkTenderEscoPeriodForUpdate($scope.updateTenderModel.tenderPeriod.endDate, $scope.updateTenderModel.creationTime)) return false;

            if (!$scope.isCriteriaFormValid) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];

                // check minimalStep
                // var amount = parseFloat(lot.value.amount);
                // var step = parseFloat(lot.minimalStep.amount);
                // if (step > amount) {
                //    return false;
                // }

                if (!tenderFormEscoService.isAllDataGoodInLot(lot, $scope)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }


                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;


                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function changeToPercents(lot) {
            lot.escoLotExt.minimalStepPercentage /= 100;
            lot.escoLotExt.yearlyPaymentsPercentageRange /= 100;
        };

        function updateNbuDiscount() {
            $scope.updateTenderModel.escoTenderExt.nbuDiscountRate = Math.round($scope.updateTenderModel.escoTenderExt.nbuDiscountRate * 1000000) / 100000000;
        };


        //#region internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }
        function checkFeatureSum(model) {
            var sum = 25;
            return addFeaturesService.checkFeatureSumCreateUpdate(model, sum);
        }
        //#endregion
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderFrameworkCtrl', updateTenderFramework);
    updateTenderFramework.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderHelperService',
        'lookupService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'addFeaturesService',
        'tenderFormService',
        'tenderFormFrameworkService',
        'goToTenderService',
        'tenderValidationService'
    ];
    function updateTenderFramework(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        getTenderService,
        $stateParams,
        tenderHelperService,
        lookupService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        addFeaturesService,
        tenderFormService,
        tenderFormFrameworkService,
        goToTenderService,
        tenderValidationService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;
        $scope.updateTenderModel = tenderFormFrameworkService.getTendetObj();
        $scope.isCriteriaFormValid = true;
        $scope.dataToRedirect = null;

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;

            $scope.updateTenderModel.contactPoints.forEach(function (cp) {
                var language = lookupService.getLanguage(cp.language);
                cp.sLang = language;
            });
            tenderHelperService.setDefaultItems(data);

            $scope.needToShowCriteriaTab = new Date().getTime() >= new Date($localStorage.refs.eCriteriaArticle17ReleaseDate).getTime() && $scope.updateTenderModel.isECriteriaArticle17;
            $scope.detailes = data;
            abp.ui.clearBusy();
        };
        
        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        var createAddressPromises = [];

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };
        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias');
        };

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            var model = angular.copy($scope.updateTenderModel);

            if (!tenderHelperService.isFilledEnName($scope.ng_localStorage.organization, $scope.ng_localStorage.usernameEN)) return null;

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            if (createAddressPromises.length > 0) {
                $q.all(createAddressPromises).then(function () {
                    return updateTenderFinally(model);
                });

            } else {
                return updateTenderFinally(model);
            }

            function updateTenderFinally(updateTenderModel) {
                var data = tenderHelperService.setAdditionalClassifications(updateTenderModel);

                data.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro(data)
                    .then(function (updateResponse) {
                        abp.notify.success($scope.$root.source('PurchaseChanged'));
                        $scope.dataToRedirect = updateResponse.data;
                        if ($scope.dataToRedirect.notExport || $scope.skipSign || ((!data.status || data.status === 'draft') && !$scope.dataToRedirect.notExport)) {
                            goToTenderService.redirect($scope.dataToRedirect, $scope.dataToRedirect.id);
                        } else {
                            getTenderService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                                $scope.detailes = response.data;
                                $scope.getTenderThen(response.data);
                                $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                            }, function (error) {
                                console.log(error);
                            }).finally(function () {
                                abp.ui.clearBusy();
                            });
                        }
                    },
                        function (err, data) {
                            console.log(arguments);
                        }).then(function () {
                    });
            }

        };

        $scope.$on('onCriteriaEvidenceChanged', function (event, isValid) {
            $scope.isCriteriaFormValid = isValid;
        });

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.isAllDataGood = function (model) {
            if (!$scope.isCriteriaFormValid) return false;

            if (!tenderValidationService.checkTenderFrameworkPeriodForUpdate($scope.updateTenderModel.tenderPeriod.endDate, $scope.updateTenderModel.creationTime)
                || !tenderFormService.isAllDataGood(model, $scope)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];

                if (!tenderFormService.isAllDataGoodInLot(lot, $scope)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }

                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        //#region internal
        $scope.checkFeature = function (feature) {
            return addFeaturesService.checkFeatureCreateUpdate(feature);
        }
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }
        //#endregion
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderLimitedCtrl', updateTenderLimited);

    updateTenderLimited.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderHelperService',
        'datesHelperService',
        '$localStorage',
        '$sessionStorage',
        'tenderFormService',
        'tenderFormLimitedService',
        'goToTenderService'];

    function updateTenderLimited(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        getTenderService,
        $stateParams,
        tenderHelperService,
        datesHelperService,
        $localStorage,
        $sessionStorage,
        tenderFormService,
        tenderFormLimitedService,
        goToTenderService) {

        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;
        $scope.getTenderCounter = 0;

        $scope.updateTenderModel = {
            description: null,
            procurementMethod: 'limited',
            title: null,
            lots: []
        };
        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });
                
                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };

        // get tendet data
        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope, { id: $stateParams.tId, seoUrl: $stateParams.seoUrl });
        }

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            $scope.updateTenderModel = data;
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            data.isEcatalog = data.tenderOffers && data.tenderOffers.length > 0;
            console.log('Tender data for update:', data);
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.enquiryPeriod = null;
            $scope.updateTenderModel.tenderPeriod = null;

            $scope.updateTenderModel.lots.forEach(function (l) {
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep && l.minimalStep.amount && l.value && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            tenderHelperService.setDefaultItems(data);
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
            $scope.detailes = data;
            abp.ui.clearBusy();
        }

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            var model = angular.copy($scope.updateTenderModel);

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];                

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    if (curItem.deliveryDate) {
                        if(curItem.deliveryDate.endDate && curItem.deliveryDate.endDate.getDay == undefined)
                            curItem.deliveryDate.endDate = datesHelperService.jsonStringToDate(curItem.deliveryDate.endDate);

                        if (curItem.deliveryDate.startDate && curItem.deliveryDate.startDate.getDay == undefined)
                            curItem.deliveryDate.startDate = datesHelperService.jsonStringToDate(curItem.deliveryDate.startDate);
                    }
                    
                    if (curItem.classification.code) {
                        curItem.classification.id = curItem.classification.code;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, $scope.createAddressPromises);
                    }
                }
            }

            // update Tender Finally
            tenderFormService.updateTenderFinally($scope, model, $scope.createAddressPromises);
            
        };

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTenderInfoRequestWithCount();
        });

        function getTenderInfoRequest() {
            getTenderService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                if ($scope.detailes.apiId) {
                    $scope.getTenderCounter = 0;
                    $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                } else {
                    $scope.getTenderCounter++;
                    getTenderInfoRequestWithCount();
                }
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        }

        function getTenderInfoRequestWithCount() {
            if ($scope.getTenderCounter <= 5) {
                $timeout(function () {
                    getTenderInfoRequest();
                }, 1000);
            } else {
                $scope.getTenderCounter = 0;
                abp.notify.error('Сталася помилка при публікації закупівлі.');
            }
        }

        $scope.isAllDataGood = function (model) {
            if (model.lots.length === 0) {
                return false;
            }
            var tomorrowDate = moment(new Date()).add(1, 'days').format();

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];

                if (lot.items.length === 0) {
                    return false;
                }

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormLimitedService.isAllDataGoodInItem(item, model)) return false;

                    if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                        (item.deliveryDate.endDate < item.deliveryDate.startDate || item.deliveryDate.startDate < tomorrowDate)) {
                        return false;
                    }

                }
            }

            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };
    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderLimitedReportingCtrl', updateTenderLimitedReporting);

    updateTenderLimitedReporting.$inject = [
        '$scope',
        '$stateParams',
        '$localStorage',
        'tenderFormService',
        'tenderFormLimitedService',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$controller',
        '$location'];

    // TODO: use only updateTenderLimited.js
    function updateTenderLimitedReporting(
        $scope,
        $stateParams,
        $localStorage,
        tenderFormService,
        tenderFormLimitedService,
        tenderService,
        getTenderService,
        $controller,
        $location) {

        $scope.ng_localStorage = $localStorage;
        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;

        $controller('updateTenderLimitedCtrl', { $scope: $scope });


        $scope.isAllDataGood = function (model) {

            if (model.lots.length === 0) {
                return false;
            }

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];

                if (lot.items.length === 0) {
                    return false;
                }

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormLimitedService.isAllDataGoodInItem(item, model)) return false;

                    if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                        (item.deliveryDate.endDate < item.deliveryDate.startDate)) {
                        return false;
                    }
                }
            }

            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });
                
                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.updateTenderModel = response.data;
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        };

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderPriceQuotationCtrl', updateTenderPriceQuotationCtrl);
    updateTenderPriceQuotationCtrl.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        'abp.services.etender.tender',
        '$stateParams',
        'tenderHelperService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'addFeaturesService',
        'tenderFormAboveService',
        'tenderFormService',
        'goToTenderService',
        'tenderValidationService',
        'abp.services.etender.workingDays',
        'abp.services.etender.getTender',
        '$timeout'
    ];
    function updateTenderPriceQuotationCtrl(
        $rootScope,
        $scope,
        $location,
        $q,
        tenderService,
        $stateParams,
        tenderHelperService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        addFeaturesService,
        tenderFormAboveService,
        tenderFormService,
        goToTenderService,
        tenderValidationService,
        workingDays,
        getTender,
        $timeout
    ) {
        var queryParams = $location.search();

        $scope.skipSign = queryParams && queryParams.noSign;
        $scope.ng_localStorage = $localStorage;
        $scope.updateTenderModel = tenderFormAboveService.getTenderModel('priceQuotation');
        $scope.isFirstLoading = true;
        $scope.minimalEndDate = null;
        $scope.validEndDate = true;
        $scope.getTenderCounter = 0;

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            $scope.activeTab = tabName;
        };

        $scope.getTenderThen = function (data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            //console.log(data);
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            tenderHelperService.setDefaultItems(data);
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
            abp.ui.clearBusy();
        };

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        var createAddressPromises = [];

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {

            var model = angular.copy($scope.updateTenderModel);

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];

                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    if (curItem.additionalClassifications && curItem.additionalClassifications.length) {
                        for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                            if (/*!curItem.additionalClassifications[i].id ||
                            (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                                curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                                curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                            }
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // update Tender Finally
            tenderFormService.updateTenderFinally($scope, model, createAddressPromises);

        };

        $scope.isAllDataGood = function (model) {

            if (!tenderFormAboveService.isAllDataGood(model)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                if (!tenderFormAboveService.isAllDataGoodInLot(model, lot)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    if (!tenderFormAboveService.isAllDataGoodinItem(item))
                        return false;
                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }

                    //if (item.deliveryDate && (item.deliveryDate.startDate || item.deliveryDate.endDate) &&
                    //         ((item.deliveryDate.endDate < item.deliveryDate.startDate) || (item.deliveryDate.startDate < model.tenderPeriod.endDate))) {
                    //    return false;
                    //}
                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;
                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        $scope.$watch('updateTenderModel', function (data) {
            if (data && data.tenderPeriod && data.tenderPeriod.endDate && $localStorage.isProdMode) {
                if ($scope.isFirstLoading) {
                    $scope.isFirstLoading = false;

                    workingDays.getLastWorkingDayByCount(new Date().toDateString(), 3).then(function (response) {
                        $scope.minimalEndDate = new Date(response.data);
                        $scope.validEndDate = $scope.minimalEndDate <= data.tenderPeriod.endDate;
                    });
                } else if ($scope.minimalEndDate) {
                    $scope.validEndDate = $scope.minimalEndDate <= data.tenderPeriod.endDate;
                }
            }
        }, true);

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTenderInfoRequestWithCount();
        });

        function getTenderInfoRequest() {
            getTender.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                if ($scope.detailes.apiId) {
                    $scope.getTenderCounter = 0;
                    $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                } else {
                    $scope.getTenderCounter++;
                    getTenderInfoRequestWithCount();
                }
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        }

        function getTenderInfoRequestWithCount() {
            if ($scope.getTenderCounter <= 5) {
                $timeout(function () {
                    getTenderInfoRequest();
                }, 1000);
            } else {
                $scope.getTenderCounter = 0;
                abp.notify.error('Сталася помилка при публікації закупівлі.');
            }
        }

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }


        //#region internal
        function checkFeatureSum(model) {
            return addFeaturesService.checkFeatureSumCreateUpdate(model);
        }
        //#endregion

    }

})();
;
(function () {
    'use strict';

    angular
        .module('app')
        .controller('updateTenderSimpleDefenseCtrl', updateTenderSimpleDefense);
    updateTenderSimpleDefense.$inject = [
        '$rootScope',
        '$scope',
        '$location',
        '$q',
        '$timeout',
        'abp.services.etender.tender',
        'abp.services.etender.getTender',
        '$stateParams',
        'tenderHelperService',
        'lookupService',
        '$localStorage',
        '$sessionStorage',
        'datesHelperService',
        'tenderFormService',
        'tenderValidationService',
        'goToTenderService',
        'tenderCriteriasService'
    ];

    function updateTenderSimpleDefense(
        $rootScope,
        $scope,
        $location,
        $q,
        $timeout,
        tenderService,
        getTenderService,
        $stateParams,
        tenderHelperService,
        lookupService,
        $localStorage,
        $sessionStorage,
        datesHelperService,
        tenderFormService,
        tenderValidationService,
        goToTenderService,
        tenderCriteriasService)
    {
        var isNotExport;
        var setPendingApprovalStatusForTenderCorporation;
        $scope.ng_localStorage = $localStorage;
        $scope.getTenderCounter = 0;

        $scope.updateTenderModel = {
            description: null,
            features: [],            
            procurementMethod: 'open',
            procurementMethodType: 'simple.defense',
            tenderPeriod: {
                startDate: null,
                endDate: null
            },
            title: null,
            lots: []
        };

        if (!abp.session || !abp.session.userId) {
            abp.ng.http.handleUnAuthorizedRequest(null, '/');
        } else {
            tenderFormService.getTender($scope);
        }

        $scope.activeTab = 'editTender';
        $scope.tenderId = $stateParams.tId;
        $scope.switchActiveTab = function (tabName) {
            if (tabName !== 'editTender') {
                abp.ui.setBusy();
                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        changeItemClassifications(item);
                    });
                });

                $scope.updateTenderModel.lots.forEach(function (lot) {
                    lot.items.forEach(function (item) {
                        if (item.deliveryAddress.city &&
                            (item.deliveryAddress.city.title.indexOf('м. Київ') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('м. Киев') !== -1 ||
                            item.deliveryAddress.city.title.indexOf('Севастополь') !== -1)) {
                                delete item.deliveryAddress.city;
                        }
                    });
                });

                tenderService.updateTenderProzorro($scope.updateTenderModel).then(function (response) {
                    getTenderService.getTender({ "Id": response.data.id }).then(function (response) {
                        $scope.$broadcast('onUpdateTenderFinished');
                        $scope.activeTab = tabName;
                        $scope.detailes = response.data;
                        $scope.getTenderThen(response.data);
                    }, function (error) {
                        console.log(error);
                    }).finally(function () {
                        abp.ui.clearBusy();
                    });
                });
            } else {
                $scope.activeTab = tabName;
            }
        };

        $scope.getTenderThen = function(data) {
            // TODO: hack for submit tender from draft from 'ET-21638'
            data.isEdit = true;
            if (!data.isEdit) {
                abp.notify.error('Ви не можете редагувати цей тендер');
                $location.path('/');
                return;
            }
            if (data.plan) {
                $rootScope.$broadcast('fillItemCpvByPlanId', data.plan.id);
            }
            $scope.updateTenderModel = data;
            $scope.updateTenderModel.currency = data.lots[0].value.currency;
            $scope.updateTenderModel.isMultilots = !data.lots[0].isFake;
            $scope.updateTenderModel.lots.forEach(function (l) {
                l.hasGuarantee = '0';
                if (l.guarantee && l.guarantee.amount > 0) {
                    l.hasGuarantee = '1';
                }
                tenderHelperService.addEmptyDk(l);
                if (l.minimalStep.amount && l.value.amount) {
                    l.minimalStep.amountPer = (l.minimalStep.amount * 100 / l.value.amount);
                }
            });
            console.log($scope.updateTenderModel);
            $scope.updateTenderModel.contactPoints.forEach(function (cp) {
                var language = lookupService.getLanguage(cp.language);
                cp.sLang = language;
            });
            tenderHelperService.setDefaultItems(data);
            $sessionStorage.updateTenderIdForRedirectModal = $scope.updateTenderModel.id;
            $scope.detailes = data;
            abp.ui.clearBusy();
        };

        $scope.$on('userDataFields', function (param, data) {
            tenderFormService.updateTenderModelWithOrganization($scope, data);
        });

        $scope.goBack = function () {
            goToTenderService.redirect($scope.updateTenderModel, $scope.updateTenderModel.id);
        };

        $scope.showSignModal = function (isAllDocumentsExported) {
            $scope.entityType = 'tender';
            if (!isAllDocumentsExported) {
                abp.notify.error('Не всі документи експортовано до Центральної бази. Будь ласка оновіть сторінку, та перевірте, що в документах немає напису \"[Очікує публікації в ЦБД]\".');
                return;
            }
            $timeout(function () {
                $('#modalSignNewTender').modal('toggle');
            }, 1000);
        };

        $scope.$on('tenderSigned', function () {
            $('#modalSignTender').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
            goToTenderService.redirect($scope.dataToRedirect, $stateParams.tId)
        });

        $scope.$on('needToSignTender', function () {
            getTenderInfoRequestWithSign();
        });

        $scope.$on('onPersonSignDataErrorModalOpen', function () {
            $timeout(function () {
                $('#personSignDataErrorModal').modal('show');
            }, 1000);
        });

        function getTenderInfoRequest() {
            getTenderService.getTender({ "Id": $stateParams.tId }).then(function (response) {
                $scope.detailes = response.data;
                $scope.getTenderThen(response.data);
                if ($scope.detailes.apiId) {
                    $scope.getTenderCounter = 0;
                    $scope.showSignModal($scope.detailes.isAllDocumentsExported);
                } else {
                    $scope.getTenderCounter++;
                    getTenderInfoRequestWithSign();
                }
            }, function (error) {
                console.log(error);
            }).finally(function () {
                abp.ui.clearBusy();
            });
        }

        function getTenderInfoRequestWithSign() {
            if ($scope.getTenderCounter <= 5) {
                $timeout(function () {
                    getTenderInfoRequest();
                }, 1000)
            } else {
                $scope.getTenderCounter = 0;
                abp.notify.error('Сталася помилка при публікації закупівлі.');
            }
        }

        $scope.saveTenderWithCriterias = function () {
            $scope.$broadcast('saveCriterias', true, $scope.activeTab, $scope.updateTenderModel.tenderCriteria);
        };

        var createAddressPromises = [];

        $scope.$on('updatedCriteriasArray', function (evt, updatedCriterias, updatedLots) {
            $scope.updateTenderModel.tenderCriteria = updatedCriterias;
            $scope.updateTenderModel.lots = updatedLots;
        });

        $scope.submit = function (isNotExport, setPendingApprovalStatusForTenderCorporation) {
            if ($scope.updateTenderModel && $scope.updateTenderModel.tenderCriteria && $scope.updateTenderModel.tenderCriteria.length) {
                if (!tenderCriteriasService.isLifeCycleCriteriasValid($scope.updateTenderModel.tenderCriteria, $scope.updateTenderModel)) {
                    abp.notify.error('Для публікації необхідно застосувати хоча б один критерій вартості життєвого циклу!');
                    return;
                }
            }
            
            var model = angular.copy($scope.updateTenderModel);

            model.notExport = isNotExport;
            model.setPendingApprovalStatusForTenderCorporation = setPendingApprovalStatusForTenderCorporation;
            for (var k = 0; k < model.lots.length; k += 1) {
                var lot = model.lots[k];
                
                for (var j = 0; j < lot.items.length; j += 1) {

                    var curItem = lot.items[j];

                    // ???
                    if (/*!curItem.classification.id ||
                    (curItem.classification.id != curItem.classification.code && */curItem.classification.code/*)*/) {
                        curItem.classification.id = curItem.classification.code;
                        curItem.classification.description = curItem.classification.description;
                    }

                    for (var i = 0; i < curItem.additionalClassifications.length; i += 1) {
                        if (/*!curItem.additionalClassifications[i].id ||
                        (curItem.additionalClassifications[i].id != curItem.additionalClassifications[i].code && */curItem.additionalClassifications[i].code/*)*/) {
                            curItem.additionalClassifications[i].id = curItem.additionalClassifications[i].code;
                            curItem.additionalClassifications[i].description = curItem.additionalClassifications[i].description;
                        }
                    }

                    if (curItem.deliveryLocation && (curItem.deliveryLocation.latitude == "" || curItem.deliveryLocation.longitude == "")) {
                        delete curItem.deliveryLocation;
                    }

                    if ((curItem.deliveryAddressId && curItem.deliveryAddressId > 0) || curItem.deliveryAddress.region != null) {
                        tenderFormService.createAddressInput(curItem, createAddressPromises);
                    }
                }
            }

            // update Tender Finally
            tenderFormService.updateTenderFinally($scope, model, createAddressPromises);
            
        };

   
        $scope.isAllDataGood = function (model) {

            if (!tenderValidationService.checkTenderDefensePeriodForUpdate($scope.updateTenderModel.tenderPeriod.endDate, $scope.updateTenderModel.creationTime)
                || !tenderFormService.isAllDataGood(model, $scope)) return false;

            for (var i = 0; i < model.lots.length; i += 1) {

                var lot = model.lots[i];

                if (!tenderFormService.isAllDataGoodInLot(lot, $scope)) return false;

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];

                    if (!tenderFormService.isAllDataGoodinItem(item, $scope)) return false;

                    if (tenderHelperService.isBefore2017(model.creationTime)) {
                        for (var a = 0; a < item.additionalClassifications.length; a += 1) {
                            if (!item.additionalClassifications[a].id) {
                                return false;
                            }
                        }
                    }

                    if (!tenderHelperService.isDeliveryDateGoodForAbove(item.deliveryDate, model.tenderPeriod))
                        return false;

                    if (item.deliveryAddress && item.deliveryAddress.region && (!item.deliveryAddress.city)) return false;

                }
            }

            if (!checkFeatureSum(model)) return false;
            if (!checkMilestonesPercentageSumm(model)) return false;

            return true;
        };

        function checkMilestonesPercentageSumm(model) {
            return tenderFormService.checkMilestonesPercentageSumm(model);
        }

        function changeItemClassifications(item) {
            if (item.classification && item.classification.code) {
                item.classification.id = item.classification.code;
            }
        };

        //#region internal
        $scope.checkFeature = function (feature) {
            if (feature.options.length === 0) return false;

            var ov = feature.options.map(function (o) {
                return parseInt(o.value);
            });
            if (Math.max.apply(null, ov) > feature.value) return false;

            return true;
        }

        function checkFeatureSum(model) {
            var tFeatures = model.features.map(function (f) {
                return f;
            });

            if (getFeatureSum(tFeatures) > 30) return false;

            for (var i = 0; i < model.lots.length; i += 1) {
                var lot = model.lots[i];
                var features = tFeatures.concat(lot.features);

                for (var j = 0; j < lot.items.length; j += 1) {
                    var item = lot.items[j];
                    features = features.concat(item.features);
                }

                if (getFeatureSum(features) > 30) return false;
            }

            return true;
        }

        function getFeatureSum(features) {
            var fSum = features.reduce(function (sum, f) {
                return sum + parseInt(f.value);
            }, 0);

            return fSum;
        }
        //#endregion
    }

})();
;
(function () {
    'use strict';
    angular.module('app').controller('toDoTendersCtrl', toDoTenders);
    toDoTenders.$inject = [
        '$scope',
        '$rootScope',
        '$controller',
        '$localStorage',
        'abp.services.etender.tender',
        'lookupService',
        '$sessionStorage',
        'abp.services.etender.search',
        '$q',
        '$ocLazyLoad'
    ];
    function toDoTenders(
        $scope,
        $rootScope,
        $controller,
        $localStorage,
        tenderAppService,
        lookupService,
        $sessionStorage,
        searchService,
        $q,
        $ocLazyLoad
    ) {
        angular.extend(this, $controller('tenderTableCtrl', {
            $scope: $scope
        }));

        $scope.showGetExcelWithArchive = true;

        $scope.tendersSetResponsUsers = {
            ids: []
        };

        if ($sessionStorage.tenderTableFilter) $sessionStorage.tenderTableFilter = {};

        $scope.setResponsUsersToAll = function (setToAll, tenders) {
            $scope.tendersSetResponsUsers.ids = [];
            if (setToAll) {
                var i = 0;
                for (i; i < tenders.length; i++) {
                    $scope.tendersSetResponsUsers.ids.push(tenders[i].id);
                }
            } 
        }

        var isUseDefaultFilter = null;
        var toMeAsHead = true;
        var toMeAsManager = true;
        var allUsersFromMyOrg = null;

        var defaultStatuses = [
            'active.enquiries',
            'active.tendering',
            'active.pre-qualification',
            'active.pre-qualification.stand-still',
            'active.stage2.pending',
            'active.stage2.waiting',
            'active.auction',
            'active.qualification',
            'active.awarded'
        ];;
        var archiveStatuses = [
            'unsuccessful',
            'complete',
            'cancelled'
        ];
        var newStatuses = [
            'active.enquiries',
            'active.tendering'
        ];

        $scope.statuses = defaultStatuses;
        $scope.doNotNeedToSetPage = true;
        $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);

        $scope.reload = function () {
            if ($scope.tableParams.page() !== 1) {
                $scope.tableParams.page(1);
            } else {
                $scope.tableParams.reload();
            }
        }

        $scope.navigationNew = [
            {
                title: $rootScope.source('InTheWork'),
                type: 'InTheWork',
                active: true,
                show: true,
                openFunc: function () {
                    //$scope.tableParams.$params.page = 1;
                    isUseDefaultFilter = null;
                    toMeAsHead = true;
                    toMeAsManager = true;
                    allUsersFromMyOrg = null;
                    $scope.statuses = defaultStatuses;
                    menuPress('InTheWork');
                    $scope.reload();
                }
            }, {
                title: $rootScope.source('NewTenders'),
                type: 'NewTenders',
                active: false,
                show: true,
                openFunc: function () {
                    //$scope.tableParams.$params.page = 1;
                    isUseDefaultFilter = true;
                    toMeAsHead = false;
                    toMeAsManager = false;
                    allUsersFromMyOrg = false;
                    $scope.statuses = newStatuses;
                    menuPress('NewTenders');
                    $scope.reload();
                }

            }, {
                title: $rootScope.source('Archive'),
                type: 'Archive',
                active: false,
                show: true,
                openFunc: function () {
                    //$scope.tableParams.$params.page = 1;
                    $scope.isArchiveChanged(true);
                    $scope.statuses = archiveStatuses;
                    isUseDefaultFilter = null;
                    toMeAsHead = true;
                    toMeAsManager = true;
                    allUsersFromMyOrg = null;
                    menuPress('Archive');
                    $scope.reload();
                }
            }];

        function menuPress(navi) {
            $scope.naviPress = navi;
            $scope.isArchive = navi === 'Archive';
            $scope.moveToMenu = function () {
                $scope.navigation.forEach(function (item, i, arr) {
                    if (item.type === a) {
                        item.active = true;
                    } else {
                        item.active = false;
                    }
                });
            }
            $scope.statusDictionary = $scope.getStatusDictionary($scope.statuses);
        }

        $scope.getTendersFunc = function (pager, params, defer) {
            var getListOfTenders = tenderAppService.getTendersWithResponsibles(pager);
            getListOfTenders.then(function (response) {
                    $scope.tendersData = response.data;
                $scope.showTendersFunc(response, params, defer);
            },
                function (errorResponse) {
                    console.log(errorResponse.data);
                });
        }

        $scope.generatePagerSearchFilter = function (cpvList) {
            $scope.pagerSearchFilter = {
                PriceFrom: $scope.filter.priceFrom,
                PriceTo: $scope.filter.priceTo,
                ProcurementMethod: $scope.procurementMethod,
                procurementMethodTypes: $scope.selectedProcTypes,
                regions: $scope.vModel.selectedRegions,
                statuses: $scope.selectedStatuses.length > 0 ? $scope.selectedStatuses : $scope.statuses,
                IsStasusesDefaulted: $scope.selectedStatuses.length > 0 ? false : true, // used for cache on server
                Cpvs: cpvList,
                Dkpp: $scope.filter.dkpp,
                isProductionMode: $scope.isPM,
                parentCodesEDRPOU: $scope.findByEdrpou && [$scope.findByEdrpou] || $scope.selectedOrgCodes || $localStorage.siteSettings.parentCodeEDRPOU,
                codeEDRPOUs: $scope.edrpouFromParams,
                Title: $scope.filter.title,
                OrganizationName: $scope.filter.organizationName,
                FunderId: $scope.filter.funder ? $scope.filter.funder.id : null,
                searchTimeType: $scope.filter.searchTimeType,
                tenderPeriodEndFrom: $scope.filter.tenderPeriodEndFrom,
                tenderPeriodEndTo: $scope.filter.tenderPeriodEndTo,
                tenderCreationTimeFrom: $scope.filter.tenderCreationTimeFrom,
                tenderCreationTimeTo: $scope.filter.tenderCreationTimeTo,
                tenderPeriodStartFrom: $scope.filter.tenderPeriodStartFrom,
                tenderPeriodStartTo: $scope.filter.tenderPeriodStartTo,
                isShowOnlyTendersCreatedOnOurSite: $scope.isShowOnlyTendersCreatedOnOurSite,
                CustomerRegion: $scope.filter.customerRegion,
                mainProcurementCategory: $scope.filter.mainProcurementCategory && $scope.filter.mainProcurementCategory.value || null,
                milestoneCodeType: $scope.filter.milestoneCodeType && $scope.filter.milestoneCodeType.value || null,
            ResponsibleUsersFilter: {
                    ToMeAsHead: toMeAsHead,
                    ToMeAsManager: toMeAsManager,
                    AllUsersFromMyOrg: allUsersFromMyOrg
                },
                IsUseDefaultFilter: isUseDefaultFilter,
                myBidsOnly: $scope.filter.myBidsOnly || false,
                bidsFilter: $scope.filter.bidsFilter || null,
                lotsFilter: $scope.filter.lotsFilter || null
            };
        }

        $scope.getSearchTmpltsQuickFltr = function () {
                searchService.getUserFilterTemplates()
                    .then(function (response) {
                        if (response.data) {
                            $scope.searchTmpltsQuickFltr = response.data.userFilterTemplates;
                            $scope.ifAnyIsDefultTmpltsFltr = checkIfAnyIsDefultFltr($scope.searchTmpltsQuickFltr);
                        }
                    }, function (errore) {
                        console.log(errore);
                    });
        }

        function checkIfAnyIsDefultFltr(data) {
            for (var i = 0; i < data.length; i++) {
                if (data[i].isDefault) return true;
            };
            return false;
        }

        $scope.clearAllFiltersAndTmpl = function () {
            $scope.clear();
            $scope.search();
            $scope.resetSearchTmpltsQuickFltr().then(function (data) {
                $scope.getSearchTmpltsQuickFltr();
            }); 

        }

        $scope.resetSearchTmpltsQuickFltr = function () {
            var deferred = $q.defer();
            var data = { "FilterPurpose": "ResponsibleTenders" }
            searchService.removeDefaultFiltersOfUser(data)
                .then(function (response) {
                    console.log(response);
                    deferred.resolve();
                }, function (errore) {
                    console.log(errore);
                    deferred.resolve();
                });
            return deferred.promise;
        }

        $scope.getSearchTmpltQuickFltr = function (templ) {
            if (templ.isDefault) {
                $scope.clearAllFiltersAndTmpl();
                return;
            }
            abp.ui.block();
            var obj = {
                FilterPurpose: "ResponsibleTenders",
                UserFilterTemplateId: templ.id
            };
            searchService.triggerDefaultFilter(obj)
                .then(function (response) {
                    $scope.getSearchFilter(templ.id);
                    $scope.getSearchTmpltsQuickFltr();
                });
        }

        $scope.getBidStatusDesc = function (status) {
            return lookupService.getBidStatusDesc(status);
        };

        $scope.getBidStatusClass = function (status) {
            return lookupService.getBidStatusClass(status);
        };

        $scope.getSearchTmpltsQuickFltr();

        $scope.isShowAssignToMeButton = function() {
            return true;
        }

        $scope.setCheckBox = function (event, tender) {
            tender.wantSetResponsUsers = !tender.wantSetResponsUsers;
        }

        $scope.removeTemplate = function (templ) {
            if (templ.isDefault) $scope.clearAllFiltersAndTmpl();
            if (confirm('Ви підтверджуєте видалення шаблону?')) {
                searchService
                    .removeTemplate(templ)
                    .then(function () {
                        $scope.afterRemoveTemplate(templ);
                        $scope.getSearchTmpltsQuickFltr();
                    }, function (e) {
                        abp.notify.error(e.message);
                    });
            }
        }

        $scope.putDataToSessionStorage = function () {
            $sessionStorage.toDoTendersSearchString = $scope.vModel.searchString;
        }

        $scope.setSearchStringFromSessionStorage = function (pager) {
            if ($sessionStorage.toDoTendersSearchString) {
                $scope.vModel.searchString = $sessionStorage.toDoTendersSearchString;
                pager.searchIdentifier = $sessionStorage.toDoTendersSearchString;
            }
        }

        $scope.getTendersExcel = function (includeData) {
            $scope.getToDoTendersExcel(includeData);
        }

    }
})();
;
