Загрузка данных


<!DOCTYPE html>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<html lang="ru">

    <jsp:include page="head.jsp"/>
    <style>
    .seagreen-button {
        /* background: #000;
        color: #fff;*/
            background: #336666;
        color: white;
    }
    
    </style>

    <body>

        <script type="text/javascript" src="<c:url value='/js/${version}/queryAction.js'/>"></script>
        <script type="text/javascript" src="<c:url value='/js/${version}/queryTable.js'/>"></script>

        <script type="text/javascript">
			// Добавляем к классу String метод форматирования сообщений об ошибках, пришедших их хранимых процедур
			String.prototype.npf360FormatErrorMessage = function() {
                let startText = ["ERROR:", "PSQLException: ОШИБКА:", "PSQLException: ERROR:"];
                let i1 = -1;
                let i;
                let len = 0;
                for (i = 0; i < startText.length; i++) {
                    i1 = this.indexOf(startText[i]);
                    if (i1 >= 0) {
                        len = startText[i].length;
                        break;
                    }
                }

                let i2 = this.indexOf("Where:"); 
				if (!(i1 < 0 || i2 < 0) && i2 > i1) {
					return this.slice(i1 + len, i2).trim();
				} else {
					return this;
				}   
			};		
		</script>		
		

        <script type="text/javascript">
            function QueryTableWithSelection(code, queryTableCallback, queryTableParam, queryTableOptions) {
                let _queryTableCode = code;
                let _queryTableParam = queryTableParam;
                let _queryTableCallback = queryTableCallback;

                let _getQueryTableParams = function() {
                    let param = (typeof _queryTableParam === "function") ? _queryTableParam() : _queryTableParam;
    				param = param || {};
                    return param;
                }

                let _viewCode = $.urlParam('viewCode');

                let _getCode = function() {
                    return _code;
                };

                let _replacementActionButtons= function () {

                    $("#queryTableActionButton_" +  _queryTableCode + "_hSSjeilm").remove(); // Удаляем шатную кнопку Выбрать/снять

                    $("#queryTableActionButton_" +  _queryTableCode + "_RTc5NSBh").off("click").on("click", _selectAllRows); // Выбрать все
                    $("#queryTableActionButton_" +  _queryTableCode + "_WEdQ5Bfd").off("click").on("click", _clearRowSelection); // Очистить
                    $("#queryTableActionButton_" +  _queryTableCode + "_L5Cn9m3b").off("click").on("click", _invertRowSelection); // Инвертировать

                };

                if (_queryTableCallback) {
                    if (typeof _queryTableCallback.initComplete === "function") {
                        let initComplete = _queryTableCallback.initComplete;
                        _queryTableCallback.initComplete = function(settings, json) {
                            _replacementActionButtons();
                            initComplete(settings, json);
                        }
                    } else {
                        _queryTableCallback.initComplete = function(settings, json) {
                            _replacementActionButtons();
                        }
                    }
                } else {
                    _queryTableCallback = {
                        initComplete: function(settings, json) {
                            _replacementActionButtons();
                        }
                    }
                }

                // Выбрать все
                let _selectAllRows = function() {
                    let parameters = {
                        queryTableFilter: _queryTable.filter(),
                        queryTableCode: _queryTableCode,
                        queryActionCode: "RTc5NSBh"
                    };

                    parameters = $.extend(
                        _getQueryTableParams(),
                        parameters
                    );

                    console.log(parameters);
                    showProcessing();
                    $.ajax({
                        url: "queryTable/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if (data.result) {
                                    $("#queryTable_" + _queryTableCode + "_wrapper input[type='checkbox'][name='selected']").each((i, v) => {
                                        $(v).prop("checked", true);
                                    });
                                    if (!(data.data === null)) {
                                        let counterText = ($("#queryTable_" + _queryTableCode + "_info").text().split("|")[0]).trim();
                                        counterText = counterText + " | всего выбрано: " + data.data;
                                        $("#queryTable_" + _queryTableCode + "_info").text(counterText);
                                    }
                                } else {
                                    if(data.messages){
										data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                        showMessages(data.messages);
                                    }
                                }
                            }
                        }
                    });
                };

                // Инвертировать
                let _invertRowSelection = function() {
                    let parameters = {
                        queryTableFilter: _queryTable.filter(),
                        queryTableCode: _queryTableCode,
                        queryActionCode: "L5Cn9m3b"
                    };

                    parameters = $.extend(
                        _getQueryTableParams(),
                        parameters
                    );

                    console.log(parameters);
                    showProcessing();
                    $.ajax({
                        url: "queryTable/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if (data.result) {
                                    $("#queryTable_" + _queryTableCode + "_wrapper input[type='checkbox'][name='selected']").each((i, v) => {
                                        let chk = !$(v).prop("checked");
                                        $(v).prop("checked", chk);
                                    });
                                    if (!(data.data === null)) {
                                        let counterText = ($("#queryTable_" + _queryTableCode + "_info").text().split("|")[0]).trim();
                                        counterText = counterText + " | всего выбрано: " + data.data;
                                        $("#queryTable_" + _queryTableCode + "_info").text(counterText);
                                    }
                                } else {
                                    if(data.messages){
										data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                        showMessages(data.messages);
                                    }
                                }
                            }
                        }
                    });
                };

                // Очистить выбор
                let _clearRowSelection = function() {

                    let parameters = {
                        query_table_code: _queryTableCode,
                        viewCode: _viewCode,
                        queryActionCode: "WEdQ5Bfd"
                    };
                    console.log(parameters);
                    
                    showProcessing();
                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if (data.result) {
                                    $("#queryTable_" + _queryTableCode + "_wrapper input[type='checkbox'][name='selected']").each((i, v) => {
                                        $(v).prop("checked", false);
                                    });
                                    if (!(data.data === null)) {
                                        let counterText = ($("#queryTable_" + _queryTableCode + "_info").text().split("|")[0]).trim();
                                        counterText = counterText + " | всего выбрано: " + data.data;
                                        $("#queryTable_" + _queryTableCode + "_info").text(counterText);
                                    }
                                } else {
                                    if(data.messages){
										data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                        showMessages(data.messages);
                                    }
                                }
                            }
                        }
                    });
                }

                let _queryTable = new QueryTable(_queryTableCode, _queryTableCallback, _queryTableParam, queryTableOptions);

                $(document).delegate("#queryTable_" + _queryTableCode + "_wrapper input[type='checkbox'][name='selected']", "change", function (e) {
                    let target = $(e.currentTarget);
                    checked = target.prop("checked");
                    let parameters = {
                        id: target.val(),
                        checked: checked,
                        query_table_code: _queryTableCode,
                        viewCode: _viewCode,
                        queryActionCode: "VsJ1PazG"
                    };
                    console.log(parameters);

                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            if(data){
                                if (data.result) {
                                    if (!(data.data === null)) {
                                        let counterText = ($("#queryTable_" + _queryTableCode + "_info").text().split("|")[0]).trim();
                                        counterText = counterText + " | всего выбрано: " + data.data;
                                        $("#queryTable_" + _queryTableCode + "_info").text(counterText);
                                    }

                                    return;
                                }
                                
                                target.prop("checked", !checked); // если ошибка, вернем галку в исходное
                                if(data.messages){
									data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                    showMessages(data.messages);
                                }
                            }
                        }
                    });

                    return true;
                });

                let _selectAll = function() {
                    $("#queryTableActionButton_" + _queryTableCode + "_RTc5NSBh").trigger("click");
                };

                let _clearAll = function() {
                    $("#queryTableActionButton_" + _queryTableCode + "_WEdQ5Bfd").trigger("click");
                };

                let _invertSelected = function() {
                    $("#queryTableActionButton_" + _queryTableCode + "_L5Cn9m3b").trigger("click");
                };

                return {
                    reload: _queryTable.reload,
                    data: _queryTable.data,
                    dataArray: _queryTable.dataArray,
                    filter: _queryTable.filter,
                    addActionButton: _queryTable.addActionButton,
                    insertActionButton: _queryTable.insertActionButton,
                    getCode: _getCode,
                    selectAll: _selectAll,
                    clearAll: _clearAll,
                    invertSelected: _invertSelected
                };
            }
        </script>

        <script type="text/javascript">
            function QueryValidatorExtend(code, queryValidatorCallback, queryValidatorParam) {
                let _queryValidatorCode = code;
                let _queryValidatorCallback = queryValidatorCallback;
                let _queryValidatorParam = queryValidatorParam;
                let _queryValidatorCheck = $("#queryValidatorCheck_" + _queryValidatorCode);

                let _getCode = function() {
                    return _queryValidatorCode;
                };

                let _currentStatRow = undefined;

                let _reloadQueryValidatorCheck = function() {
                    _queryValidatorCheck.dataTable().api().ajax.reload();
                };

                let _getCurrentStatRow = function() {
                    return _currentStatRow;
                };

                let _statRowClickHandler = function(e) {
                    let target = $(e.currentTarget);
                    let type;
                    let value;
                    let description;
                    let active = target.hasClass("active");

                    if (target.hasClass("text-danger")) {
                        type = "danger";
                    } else if (target.hasClass("text-info")) {
                        type = "info";
                    } else if (target.hasClass("text-info")) {
                        type = "info";
                    } else if (target.hasClass("text-success")) {
                        type = "success";
                    } else if (target.hasClass("text-warning")) {
                        type = "warning";
                    } else {
                        type = "";
                    }

                    target.find("td").each(function(i, e) {
                        if (i === 0) {
                            description = $(e).text();
                        }
                        if (i === 1) {
                            value = $(e).text();
                        }
                    });

                    let row = {
                        "value": value,
                        "type": type,
                        "description": description,
                        "target": target
                    }

                    if (active) {
                        _currentStatRow = row;
                        if (_queryValidatorCallback) {
                            if (typeof _queryValidatorCallback.onStatRowSelect === "function") {
                                _queryValidatorCallback.onStatRowSelect(row);
                            }
                        }
                    } else {
                        _currentStatRow = undefined;
                        if (_queryValidatorCallback) {
                            if (typeof _queryValidatorCallback.onStatRowDeselect === "function") {
                                _queryValidatorCallback.onStatRowDeselect(row);
                            }
                        }
                    }
                };

                let _validate = function() {
                    $("#queryValidatorCheckButton_" + _queryValidatorCode).trigger("click");
                };

                let _queryValidator = new QueryValidator(_queryValidatorCode, _queryValidatorCallback, _queryValidatorParam);
                $(document).on("click", "#queryValidatorCheck_" + _queryValidatorCode + " tbody tr[role='row']", _statRowClickHandler);

                return {
                    reload: _queryValidator.reload,
                    enable: _queryValidator.enable,
                    disable: _queryValidator.disable,
                    data: _queryValidator.data,
                    getCode: _getCode,
                    getCurrentStatRow: _getCurrentStatRow,
                    validate: _validate,
                    reloadQueryValidatorCheck: _reloadQueryValidatorCheck          
                };
            }
        </script>

        <script type="text/javascript">



            $(function() {
                const STATUS_CREATED = 10; // Создан
                const STATUS_ACCEPTED = 20; // Принят
                const STATUS_DELETED = 40; // Удален

                $("#filter_type_of_activity, #param_type_of_activity").select2({
                    placeholder: "Вид деятельности",
                    allowClear: true,
                    minimumInputLength: 0,
                    id: function (e) {
                        return e.id;
                    },
                    ajax: {
                        url: "queryModel?queryModelCode=m_service_type",
                        dataType: "json",
                        results: function (data, page) {
                            let results = [];
                            data.list.forEach(function(v) {
                                if (v.id !== 'OPS') {
                                    results.push({
                                        id: v.id,
                                        text: v.name
                                    });
                                }
                            });
                            return {results: results};
                        }
                    }
                });

                $("#filter_type_of_accrual").select2({
                    placeholder:  "Вид начисления",
                    allowClear: true,
                    minimumInputLength: 0,
                    id: function (e) {
                        return e.id;
                    },
                    multiple: true,
                    ajax: {
                        url: "queryModel?queryModelCode=1p96noOK",
                        dataType: "json",
                        data: function (params) {
                            var query = {
                                search: params,
                                hb_pens_product_kind_code: $("#filter_type_of_activity").select2('val')
                            }

                            return query;
                        },
                        results: function (data, page) {
                            return {
                                results: data.list.map(function(v) {return {
                                    // id: v.id,
                                    id: v.code,
                                    text: v.name
                                }})
                            };
                        }
                    }
                });

                $("#param_type_of_accrual").select2({
                    placeholder:  "Вид начисления",
                    allowClear: true,
                    minimumInputLength: 0,
                    id: function (e) {
                        return e.id;
                    },
                    ajax: {
                        url: "queryModel?queryModelCode=1p96noOK",
                        dataType: "json",
                        data: function (params) {
                            var query = {
                                search: params,
                                hb_pens_product_kind_code: $("#param_type_of_activity").select2('val')
                            }

                            return query;
                        },
                        results: function (data, page) {
                            return {
                                results: data.list.map(function(v) {return {
                                    // id: v.id,
                                    id: v.code,
                                    text: v.name
                                }})
                            };
                        }
                    }
                });


                $("#filter_status").select2({
                    placeholder:  "Статус",
                    allowClear: true,
                    minimumInputLength: 0,
                    id: function (e) {
                        return e.id;
                    },
                    ajax: {
                        url: "queryModel?queryModelCode=4eqIk7o0",
                        dataType: "json",
                        results: function (data, page) {
                            return {
                                results: data.list.map(function(v) {return {
                                    id: v.id,
                                    text: v.name
                                }})
                            };
                        }
                    }
                });


                let periodSelectionTypeSwitch = function() {
                    let periodSelectionType = +$("input[name=filter_type_of_period_selection]:checked").val();
                    if(periodSelectionType === 1) {
                        $("div.type_of_period_selection_1").removeClass("hidden");
                        $("div.type_of_period_selection_2").addClass("hidden");
                    } else {
                        $("div.type_of_period_selection_1").addClass("hidden");
                        $("div.type_of_period_selection_2").removeClass("hidden");
                    }

                    $("#filter_date_of_period_from").val(null);
                    $("#filter_date_of_period_to").val(null);
                    $("#filter_date_of_period").val(null);
                    paymentsTable.reload();
                };

                let filterTypeOfActivityChangeEvent = function(e) {
                    $("#filter_type_of_accrual").select2('val', null);
                };

                let getfilterParameters = function () {
                    let data = {}; 
                    $("#searchFilter").serializeArray().forEach(function(v) {
                        if (!v.value) return;
                        data[v.name] = v.value;
                    });
                    // console.log(data);
                    return data;
                };

                let geSsupplementAccrualFilterParameters = function () {
                    let data = {}; 
                    $("#supplement_accrual_filter_form").serializeArray().forEach(function(v) {
                        if (!v.value) return;
                        data[v.name] = v.value;
                    });
                    return data;
                };

                let getAccrualListParameters = function () {
                    let data = {}; 
                    $("#accrual_list_parameters_form").serializeArray().forEach(function(v) {
                        data[v.name] = v.value;
                    });
                    return data;
                };

                let lastDocumentId = null;

                // Создать список для начисления - функционал
                let accrualListParametersSave = function() {
                    let parameters = getAccrualListParameters();
                    parameters.viewCode = "fCwI2nmi";
                    parameters.queryActionCode = "TUK1GFn5";
                    console.log(parameters);

                    showProcessing("Создаем список для начисления...")
                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if(data.messages){
									data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                    showMessages(data.messages);
                                }
                                if (data.data && isNumber(data.data)) {
                                    lastDocumentId = +data.data;
                                }
                            }
                            paymentsTable.reload();
                        }
                    });

                    return true;
                };

                let filterClean = function() {
                    $("#filter_type_of_activity").select2("val", null);
                    $("#filter_type_of_accrual").select2("val", null);
                    $("#filter_date_of_period_from").val(null);
                    $("#filter_date_of_period_to").val(null);
                    $("#filter_date_of_period").val(null);
                    $("#filter_status").select2("val", null);  
                    paymentsTable.reload();                  
                };

                let filterSearch = function() {
                    paymentsTable.reload();
                };

                let getPaymentDetailsIds = function() {
                    let data = {
                        checked: [], 
                        unchecked: []
                    };
                    $("#queryTableForm_J1sbsDHH").serializeArray().forEach(v => {
                        if (v.name === "check_J1sbsDHH") {
                            data.checked.push(v.value);
                        }

                        if (v.name === "id_J1sbsDHH") {
                            if (!data.checked.includes(v.value)) {
                                data.unchecked.push(v.value);
                            }
                        }
                    });
                    return data;                    
                };
                

                // Создать список для начисления
                let createAccrualList = function() {
                    $("#accrual_list_parameters").modal("show");
                };

                // Установить статус документу
                let setDocumentStatus = function(statusId) {
                    let parameters = {
                        viewCode: "fCwI2nmi",
                        status_id: statusId,
                        queryActionCode: "ZcFwmeEp"
                    };

                    parameters = $.extend(paymentDetailsTableData(), parameters);
                    console.log(parameters);
                    
                    showProcessing();
                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if (data.result) {
                                    paymentsTable.reload();
                                } else {
                                    if(data.messages){
										data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                        showMessages(data.messages);
                                    }
                                }
                            }
                        }
                    });

                };

                // Принять начисление
                let acceptAccrual = function() {
                    setDocumentStatus(STATUS_ACCEPTED);
                };

                // Удалить начисление
                let deleteAccrual = function() {
                    let i = confirm("Документ будет помечен как удаленный!");
                    if (i) {
                        setDocumentStatus(STATUS_DELETED);
                    }
                };

                // Дополнить начисление
							let supplementAccrual = function() {
								let appData = paymentsTable.data();
								if (appData && appData.date_of_period) {
									let dateStr = appData.date_of_period;
									let parts = dateStr.split(".");

									let formattedDate;
									if (parts.length === 2) {
										// Формат MM.YYYY → делаем 01.MM.YYYY
										formattedDate = "01." + parts[0] + "." + parts[1];
									} else if (parts.length === 3) {
										// Формат уже DD.MM.YYYY → просто ставим день 01
										parts[0] = '01';
										formattedDate = parts.join(".");
									} else {
										formattedDate = dateStr;
									}

									$("#supplement_accrual_filter_pay_date_from").val(formattedDate);
									$("#supplement_accrual_filter_pay_date_to").val(formattedDate);
								}
								$("#supplement_accrual_modal").modal("show");
							};

              /* let supplementAccrual = function() {
                    let appData = paymentsTable.data();
                    if (appData && appData.date_of_period) {
                        let dateElementsFrom = appData.date_of_period.split(".");
                        dateElementsFrom[0] = '01';
                        $("#supplement_accrual_filter_pay_date_from").val(dateElementsFrom.join("."));
                        $("#supplement_accrual_filter_pay_date_to").val(dateElementsFrom.join("."));
                    }
                    $("#supplement_accrual_modal").modal("show");
                }; */

                // Дополнить выбранные начисления
                let supplementAccrualSave = function() {
                    let parameters = {
                        accrual_repurchase_amount_payments_id: paymentDetailsTableData().accrual_repurchase_amount_payments_id,
                        operation_type: "ADD_SELECTED",
                        viewCode: "fCwI2nmi",
                        queryActionCode: "SFezM9xh"
                    };

                    showProcessing();
                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if(data.messages){
									data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                    showMessages(data.messages);
                                }
                            }
                            paymentDetailsTable.reload();
                            sulpplementAccrualTable.reload();
                        }
                    });

                };

                let deleteRowsAction = function (all) {
                    all = (all === undefined) ? false : all;

                    let parameters = {
                        accrual_repurchase_amount_payments_id: paymentDetailsTableData().accrual_repurchase_amount_payments_id,
                        operation_type: (all) ? "DELETE_ALL" : "DELETE_SELECTED",
                        viewCode: "fCwI2nmi",
                        queryActionCode: "SFezM9xh"
                    };

                    showProcessing();
                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            hideProcessing();
                            if(data){
                                if(data.messages){
									data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                    showMessages(data.messages);
                                }
                            }
                            paymentDetailsTable.reload();
                        }
                    });
                };

                // Удалить все
                let deleteAllRows = function() {
                    let i = confirm("Будут удалены все записи!");
                    if (i) {
                        deleteRowsAction(true);
                    }
                };

                // Удалить выбранное
                let deleteSelectedRows = function() {
                    $.ajax({
                        url: "queryModel?queryModelCode=iz3AM0Kb",
                        dataType: 'json',
                        data: {
                            accrual_repurchase_amount_payments_id: 7,
                            stat_id: "NUMBER_OF_SELECTED_RECORDS"
                        },
                        success: function (data) {
                            if ("result" in data && !data.result) {
                                showMessages(data.mesages)
                            } else {
                                let n = data.number_of_selected_records;
                                if (n > 0) {
                                    let i = confirm("Будет удалено записей: " + n + ".\nПродолжить?");
                                    if (i) {
                                        deleteRowsAction(false);
                                    }
                                }

                            }
                        }
                    });
                };

                // Общая процедура подтверждения или исключения не прошедших проврку
                let confirmOrExcludeAction = function(operationType) {
                    let data = validator.data();
                    if (!data) {
                        return;
                    }
                    
                    let parameters = {
                        accrual_repurchase_amount_payments_details_id: data.id,
                        operation_type: operationType,
                        viewCode: "fCwI2nmi",
                        queryActionCode: "mVp4fEKY"
                    };

                    $.ajax({
                        url: "queryAction/action",
                        type: "POST",
                        data: parameters,
                        dataType: "json",
                        success: function (data) {
                            if(data){
                                if(data.messages){
									data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                    showMessages(data.messages);
                                }
                            }
                            validator.validate();
                            paymentDetailsTable.reload();
                        }
                    });

                };

                // Подтвердить включение не прошедших проверку ПС в документ
                let confirmFailedVerification = function(e) {
                    confirmOrExcludeAction("CONFIRM");
                };

                // Исключить не прошедшие проверку ПС из документа
                let excludeFailedVerification = function(e) {
                    confirmOrExcludeAction("EXCLUDE");
                };

                // Переключить активность кнопок, зависящих от выбора документа и его состояния
                let toggleButtons = function() {
                    let buttonIds = [
                        "supplement_accrual",
                        "supplement_accrual_2",
                        "delete_selected_rows",
                        "delete_all_rows",
                        "accept_accrual",
                        "delete_accrual"
                    ];

                    let disabled = !(paymentsTable.data() && +paymentsTable.data().status_id === STATUS_CREATED);
                    
                    buttonIds.forEach(function(v) {
                        $("#" + v).prop("disabled", disabled);
                    });
                };

                let paymentsTableEventsHandler = function() {
                    paymentDetailsTable.reload();
                    sulpplementAccrualTable.reload();
                    if (lastDocumentId) {
                        // Проверяем, не выбран ли только что созданный документ
                        let appData = paymentsTable.data();
                        if (appData && +appData.id === lastDocumentId) {
                            // Если да, то запускаем валидатор на этом документе
                            lastDocumentId = null;
                            validator.validate();
                        } else {
                            // Если нет, то обновляем валидатор
                            validator.reload();    
                        }
                    } else {
                        validator.reload();
                    }
                    toggleButtons();
                };

                let paymentsTable = new QueryTable("YM9bCW3m", 
                    {
                        initComplete: function (settings, json) {
                            paymentsTable.addActionButton("create_accrual_list", "Создать список для начисления", createAccrualList, "btn-primary", false);
                            paymentsTable.addActionButton("supplement_accrual", "Дополнить начисление", supplementAccrual, "btn-primary", true);
                            paymentsTable.addActionButton("accept_accrual", "Принять", acceptAccrual, "btn-success", true);
                            paymentsTable.addActionButton("delete_accrual", "Удалить", deleteAccrual, "btn-danger", true);
                        },
                        onRowSelect: function (data, index) {
                            paymentsTableEventsHandler();
                        },
                        onRowDeselect: function (data, index) {
                            paymentsTableEventsHandler();
                        },
                        drawCallback: function (settings) {
                            paymentsTableEventsHandler();
                        }
                    }, 
                    function() {
                        let docId = $.urlParam('id');
                        let params = getfilterParameters();

                        if (docId) {
                            params = $.extend(params, {id: docId});
                        }

                        return params;
                    },
                    {
                        selectFirstRow: true,
                        lengthChange: true,
                        showFilter: false,
                        showExportToExcelButton: true,
                        paginate: true
                    }
                );

                let paymentDetailsTableData = function() {
                    let appData = paymentsTable.data();
                        let data = {
                            accrual_repurchase_amount_payments_id: -1
                        };
                        if (appData) {
                            data.accrual_repurchase_amount_payments_id = appData.id;
                        }
                        return data;
                };

                let sulpplementAccrualTableData = function() {
                    let appData = paymentsTable.data();
                    let data = {
                    };
                    if (appData) {
                        data.accrual_repurchase_amount_payments_id = appData.id;
                        data.is_primary = $("#supplement_accrual_form input[type='radio'][name='is_primary']:checked").val() === 'true';
                    } 

                    data = $.extend(data, geSsupplementAccrualFilterParameters());
                    return data;
                };

                let paymentDetailsTable = new QueryTableWithSelection("J1sbsDHH", 
                    {
                        initComplete: function (settings, json) {
                            paymentDetailsTable.addActionButton("supplement_accrual_2", "Дополнить начисление", supplementAccrual, "btn-primary", false);
                            paymentDetailsTable.addActionButton("delete_selected_rows", "Удалить выбранное", deleteSelectedRows, "btn-danger", false);
                            paymentDetailsTable.addActionButton("delete_all_rows", "Удалить все", deleteAllRows, "btn-danger", false);
                            toggleButtons();
                        },

                        drawCallback: function (settings) {
                        }
                    },  
                    paymentDetailsTableData,
                    {
                        selectFirstRow: true,
                        lengthChange: true,
                        showFilter: true,
                        showExportToExcelButton: true,
                        paginate: true
                    }
                );

                let sulpplementAccrualTable = new QueryTableWithSelection("APZrLARf", 
                    {},  
                    sulpplementAccrualTableData,
                    {
                        selectFirstRow: true,
                        lengthChange: true,
                        showFilter: true,
                        showExportToExcelButton: false,
                        paginate: true
                    }
                );

                let validatorActionsVisibility = function(visible) {
                    if (visible) {
                        $("#validator_U9ZusZdz_actions").show();
                    } else {
                        $("#validator_U9ZusZdz_actions").hide();
                    }
                }; 

                // Проверки данных
                let validator = new QueryValidatorExtend("U9ZusZdz", {
                    initComplete: function (queryAction) {
                        $("#queryValidatorExportToExcelButton_U9ZusZdz").closest("div.btn-group").before($("#validator_U9ZusZdz_actions"));
                        validator.enable();
                    },
                    onStatRowSelect: function(row) {
                        validatorActionsVisibility(row.value > 0 && (row.type === "danger" || row.type === "warning"));
                    },
                    onStatRowDeselect: function(row) {
                        validatorActionsVisibility(false);                        
                    },
                    onRowSelect: function(data, rowIndex) {
                        $("#confirm_failed_verification").prop("disabled", false);
                        $("#exclude_failed_verification").prop("disabled", false);
                    },
                    onRowDeselect:function(data, rowIndex) {
                        $("#confirm_failed_verification").prop("disabled", true);
                        $("#exclude_failed_verification").prop("disabled", true);
                    },

                    checkComplete: function (data) {
                        let parameters = {
                            viewCode: "fCwI2nmi",
                            queryActionCode: "RS9Vv4uY"
                        };

                        // showProcessing()
                        $.ajax({
                            url: "queryAction/action",
                            type: "POST",
                            data: parameters,
                            dataType: "json",
                            success: function (data) {
                                // hideProcessing();
                                if(data){
                                    if(data.messages){
										data.messages.forEach(v => v.message = v.message.npf360FormatErrorMessage());
                                        setTimeout(() => {showMessages(data.messages);}, 500);
                                    }
                                }
                                // paymentsTable.reload();
                            }
                        });
                    }
                }, paymentDetailsTableData);

                $("input[name=filter_type_of_period_selection]").on("change", e => periodSelectionTypeSwitch());
                $("#filter_type_of_activity").on("change", filterTypeOfActivityChangeEvent);
                $("#supplement_accrual_filter_search").on("click", function() {
                    sulpplementAccrualTable.reload();
                });
                $("#supplement_accrual_modal_save").on("click", supplementAccrualSave);

                $("#filter_search").on("click", filterSearch);
                $("#filter_clean").on("click", filterClean);

                $("#accrual_list_parameters_save").on("click", accrualListParametersSave);

                $("#exclude_failed_verification").on("click", excludeFailedVerification);
                $("#confirm_failed_verification").on("click", confirmFailedVerification);
            });

        </script>

        <jsp:include page="header.jsp"/>
        <jsp:include page="navbar.jsp"/>


        <div class="container" id="mainContainer">

            <div class="page-header">
            <h1>${view.name}</h1>
            </div>

            <div class="container-fluid">
                <div class="row row-main">
                    <jsp:include page="sidebar.jsp"/>
                    <div class="col-sm-10">
                        <tags:breadcrumbs path="https://portal.futurenpf.ru/knowledgebase/category/29226/"/>

						<h3>${view.name}</h3>
                        <div class="row">
                            <div class="col-sm-12">
                                <form id="searchFilter" class="form-vertical">
                                    <div class="row">
                                        <div class="col-sm-2">
                                            <br/>
                                            <label class="control-label">Вид деятельности</label>
                                            <input type="text" class="form-control" id="filter_type_of_activity" name="filter_type_of_activity"/>
                                        </div>
                                        <div class="col-sm-3">
                                            <br/>
                                            <label class="control-label">Вид начисления</label>
                                            <input type="text" class="form-control" id="filter_type_of_accrual" name="filter_type_of_accrual"/>
                                        </div>
    
                                        <div class="col-sm-4">
                                            <div class="row">
                                                <div class="col-sm-12" style="font-weight: 700">
                                                    <input type="radio" id="filter_type_of_period_selection_1" checked name="filter_type_of_period_selection" value="1">
                                                    За период&nbsp;&nbsp;&nbsp; 
                                                    <input type="radio" id="filter_type_of_period_selection_2" name="filter_type_of_period_selection" value="2">    
                                                    Дата периода    
                                                </div>
                                            </div>
                                            <div class="row">
                                                <div class="col-sm-6 type_of_period_selection_1">
                                                    <label for="filter_date_from" class="control-label">Дата периода с</label>
                                                    <input type="text" class="form-control date-picker-on" id="filter_date_of_period_from" name="filter_date_of_period_from" value="<fmt:formatDate value='' pattern='dd.MM.yyyy' />" placeholder="Дата периода с">
                                                </div>
            
                                                <div class="col-sm-6 type_of_period_selection_1">
                                                    <label for="filter_date_to" class="control-label">Дата периода по</label>
                                                    <input type="text" class="form-control date-picker-on" id="filter_date_of_period_to" name="filter_date_of_period_to" value="<fmt:formatDate value='' pattern='dd.MM.yyyy' />" placeholder="Дата периода по">
                                                </div>
            
                                                <div class="col-sm-6 type_of_period_selection_2 hidden">
                                                    <label for="filter_sent_from" class="control-label">Дата периода</label>
                                                    <input type="text" class="form-control date-picker-on" id="filter_date_of_period" name="filter_date_of_period" value="<fmt:formatDate value='' pattern='dd.MM.yyyy' />" placeholder="Дата периода">
                                                </div>
    
                                            </div>
                                        </div>
    
                                        <div class="col-sm-3">
                                            <br/>
                                            <label class="control-label">Статус</label>
                                            <input type="text" class="form-control" id="filter_status" name="filter_status"/>
                                        </div>
                                    </div>
                                    
                                    <div class="row">
                                        <div class="col-sm-12">
                                            <div class="btn-group">
                                                <button id="filter_search" name="filter_search" type="button" class="btn btn-success" data-loading-text="Отбор...">
                                                    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                                                    Найти
                                                </button>
                                                <button id="filter_clean" name="filter_clean" type="button" class="btn btn-warning" data-loading-text="Очистка...">
                                                    <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
                                                    Сбросить
                                                </button>
                                            </div>
                                        </div>
                                    </div>
                                </form>
                            </div>
                        </div>




                        <hr/>

                        <div class="row">
                            <div class="col-sm-12">
                                <jsp:include page="queryTable.jsp">
                                    <jsp:param name="queryTableCode" value="YM9bCW3m"/>
                                </jsp:include>        
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-sm-12">
                                <form id="queryTableForm_J1sbsDHH">
                                    <jsp:include page="queryTable.jsp">
                                        <jsp:param name="queryTableCode" value="J1sbsDHH"/>
                                    </jsp:include>            
                                </form>
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-sm-12">
                                <jsp:include page="queryValidator.jsp">
                                    <jsp:param name="queryValidatorCode" value="U9ZusZdz"/>
                                    <jsp:param name="queryValidatorStyle" value="white-space: nowrap;"/>	
                                </jsp:include>
                            </div>
                        </div>

                        <div class="btn-group" id = "validator_U9ZusZdz_actions" style="display: none">
                            <button id="confirm_failed_verification" type="button" disabled class="btn btn-success on-selected-row">Подтвердить</button>
                            <button id="exclude_failed_verification" type="button" disabled class="btn btn-danger on-selected-row">Исключить</button>
                        </div>
    
                    </div>
                </div>
            </div>
        </div>

        <jsp:include page="footer.jsp"/>

        <!-- Модальное окно формы отбора счетов по кнопки "Дополнить начисления" -->
        <div class="modal fade" id="supplement_accrual_modal" tabindex="-1" role="dialog" aria-labelledby="accrual_list_parameters_label">
            <div class="modal-dialog" style="width: 80%" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h4 class="modal-title">Дополнить начисления</h4>
                    </div>
                    <div class="modal-body">

                        <form class="form-horizontal" id="supplement_accrual_filter_form">
                            <div class="row">
                                <div class="col-sm-12" style="font-weight: 700">

                                    <div class="row">
                                        <div class="col-sm-12">
                                            <input type="radio" checked name="is_primary" value="true"/>
                                            Решение о выплате&nbsp;&nbsp;&nbsp;
                                            <input type="radio" name="is_primary" value="false"/>    
                                            Решение о доплате    
                                        </div>
                                    </div>


                                    <div class="row">
                                        <div class="col-sm-2">
                                            <label for="supplement_accrual_filter_pay_date_from" class="control-label">Дата оплаты с</label>
                                            <input type="text" class="form-control date-picker-on" id="supplement_accrual_filter_pay_date_from" name="supplement_accrual_filter_pay_date_from" value="<fmt:formatDate value='' pattern='dd.MM.yyyy' />" placeholder="Дата оплаты с">
                                        </div>
                                        <div class="col-sm-2">
                                            <label for="supplement_accrual_filter_pay_date_to" class="control-label">Дата оплаты по</label>
                                            <input type="text" class="form-control date-picker-on" id="supplement_accrual_filter_pay_date_to" name="supplement_accrual_filter_pay_date_to" value="<fmt:formatDate value='' pattern='dd.MM.yyyy' />" placeholder="Дата оплаты по">
                                        </div>
                                        <div class="col-sm-5">
                                            <div class="btn-group">
                                                <br/>
                                                <button id="supplement_accrual_filter_search" name="fsupplement_accrual_filter_search" type="button" class="btn btn-success" data-loading-text="Отбор...">
                                                    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                                                    Найти
                                                </button>
                                                <button id="supplement_accrual_filter_clean" name="supplement_accrual_filter_clean" type="button" class="btn btn-warning" data-loading-text="Очистка...">
                                                    <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
                                                    Сбросить
                                                </button>
                                            </div>
                                        </div>
                                    </div>
                                </div>

                            </div>
                        </form>    
                        <div class="row">
                            <div class="col-sm-12">
                                <jsp:include page="queryTable.jsp">
                                    <jsp:param name="queryTableCode" value="APZrLARf"/>
                                </jsp:include>
                            </div>
                        </div>
                    </div>
                    <div class="modal-footer">
                        <button id="supplement_accrual_modal_save" type="button" class="btn btn-primary pull-left" data-dismiss="modal">Сохранить</button>
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Отмена</button>
                    </div>
                </div>
            </div>
        </div>




        <!-- Модальное окно формы определения параметров отбора счетов для ручного формирования документов -->
        <div class="modal fade" id="accrual_list_parameters" tabindex="-1" role="dialog" aria-labelledby="accrual_list_parameters_label">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h4 class="modal-title">Определение параметров начисления</h4>
                    </div>
                    <div class="modal-body">
                        <form class="form-horizontal" id="accrual_list_parameters_form">
                            <div class="row">
                                <div class="col-sm-4">
                                    <label class="control-label">Вид деятельности</label>
                                    <input type="text" class="form-control" id="param_type_of_activity" name="param_type_of_activity"/>
                                </div>

                                <div class="col-sm-5">
                                    <label class="control-label">Вид начисления</label>
                                    <input type="text" class="form-control" id="param_type_of_accrual" name="param_type_of_accrual"/>
                                </div>

                                <div class="col-sm-3">
                                    <label for="param_sent_from" class="control-label">Дата периода</label>
                                    <input type="text" class="form-control date-picker-on" id="param_date_of_period" name="param_date_of_period" value="<fmt:formatDate value='' pattern='dd.MM.yyyy' />" placeholder="Дата периода">
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-sm-12">
                                    <label for="param_comment" class="control-label">Комментарий</label>
                                    <input type="text" class="form-control" id="param_comment" name="param_comment" placeholder="Комментарий">
                                </div>    
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button id="accrual_list_parameters_save" type="button" class="btn btn-primary pull-left" data-dismiss="modal">Сохранить</button>
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Отмена</button>
                    </div>
                </div>
            </div>
        </div>

    </body>
</html>






SELECT
  o.id as id,
  '<a target="_blank" href="view?viewCode=9CNmoQeC&id=' || o.id || '" target="_blank">' || ot.name || '</a>' as name,
  o.comment as comment,
  to_char(o.operation_date, 'dd.MM.yyyy') as operationDate,
  trim(to_char((select sum(t.value) as sumoper from back_office.transaction t where t.operation_id = o.id), '99 999 999 999 999 990D99')) as sumoper,
  to_char(o.effective_date, 'dd.MM.yyyy') as effectiveDate,
  to_char(o.period_date, 'dd.MM.yyyy') as periodDate,
  to_char(o.created, 'DD.MM.YYYY HH24:MI:SS') as created,
  c.last_name || ' ' ||substr(c.first_name,1,1) ||'.'||coalesce(substr(c.middle_name,1,1)||'.', '') as author,
  to_char(o.approved, 'DD.MM.YYYY HH24:MI:SS') as approved,
  a.last_name || ' ' || coalesce(substr(a.first_name,1,1)||'.', '') ||coalesce(substr(a.middle_name,1,1)||'.', '') as approver,
  to_char(o.deleted, 'DD.MM.YYYY HH24:MI:SS') as deleted,
  r.last_name || ' ' ||substr(r.first_name,1,1) ||'.'|| coalesce(substr(r.middle_name,1,1)||'.', '') as remover,
  '<a href="queryDataSource/queryDataSourceFile/download?id='||f.id||'">'||f.name||'</a>' as file,
  case
    when o.pension_calculation_id is not null then '<a target="_blank" href="view?viewCode=fgcx21i8&id='||pc.id||'"target="_blank">'||'Расчет пенсии от '||to_char(pc.calculation_date, 'dd.MM.yyyy')||'</a>'
    when o.termination_contract_calculation_id is not null then '<a target="_blank" href="'||'view?viewCode=Js7E4zaZ&id='||tc.id||'">'||'Расчет выкупной суммы от '||to_char(tc.version,'dd.MM.yyyy')||'</a>'
    when o.inheritance_calculation_id is not null then '<a target="_blank" href="'||'view?viewCode=DZg6CX4G&id='||ic.id||'">'||'Расчет наследуемой суммы от '||to_char(ic.version,'dd.MM.yyyy')||'</a>'
end as calculation,
  case 
when o.payment_register_id is not null then
'<a target="_blank" href="view?viewCode=QoQTOUeG&id='||pr.id||'">'||pr.register_number||'</a>'
when o.ops_payment_register_id is not  null then
'<a target="_blank" href="view?viewCode=xT40mPRG&id='||opr.id||'">'||opr.number||'</a>'
end as paymentRegister,
  od.number as operationDocumentNumber,
  to_char(od.date, 'dd.MM.yyyy') as operationDocumentDate,
  to_char(o.version, 'DD.MM.YYYY HH24:MI:SS') as version 
FROM back_office.operation o
	join back_office.operation_type ot on o.operation_type_id = ot.id
	join ourpension.agent c on o.author_agent_id = c.id
	left join ourpension.agent r on o.remover_agent_id = r.id
	left join ourpension.agent a on o.approver_agent_id = a.id
left join dev.query_datasource_file f on o.query_datasource_file_id = f.id
left join back_office.ops_payment_decision pd on o.ops_payment_decision_id = pd.id
left join back_office.payment_register pr on pr.id =o.payment_register_id
left join back_office.ops_payment_register opr on opr.id =o.ops_payment_register_id
left join back_office.pension_calculation pc on pc.id =o.pension_calculation_id
left join back_office.termination_contract_calculation tc on tc.id =o.termination_contract_calculation_id
left join back_office.inheritance_calculation ic on ic.id =o.inheritance_calculation_id
left join back_office.operation_document od on od.id = o.operation_document_id
WHERE   #if ($show_date)
  true
#else
  false
#end

#if ( $operationId != -1 ) 
	and o.id = :operationId
#else
  and 1=1
#end

#if ($filterStartDate && !$filterStartDate.isEmpty())
	and o.effective_date >= :filterStartDate
#end

#if ($filterEndDate && !$filterEndDate.isEmpty())
	and o.effective_date <= :filterEndDate
#end

#if ($filterServiceType && !$filterServiceType.isEmpty())
	and ot.service_type = :filterServiceType
#end

#if ($filterOperation && !$filterOperation.isEmpty())
    and o.operation_type_id = :filterOperation
#end





call back_office.proc__change_status_accrual_repurchase_amount_payment(
	:accrual_repurchase_amount_payments_id,
	:status_id,
	:user_id
)