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


<!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 session="true" language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

							<html lang="ru">
								<head>
									<jsp:include page="head.jsp"/>
									<style>
										th {
											text-align: center;
										}
										.filter-input {
											width: 100%;
										}
										#deleteFnsRequestModal .modal-body p {
    font-size: 16px;
}
										#sendFnsConfirmModal .modal-body p {
    font-size: 16px;
}

									</style>
								</head>
								<body>

									<script type="text/javascript" src="<c:url value='/js/latest/queryAction.js'/>"></script>
									<script type="text/javascript" src="<c:url value='/js/latest/queryTable.js'/>"></script>

									<script type="text/javascript">
										
										let Search_All = false;
										let sr_number = null;
let fns_journal = null;
										
										
										
										$(document).ready(function() {
											$("#filter_activity_type").select2({
												placeholder: "Вид деятельности",
												allowClear: true,
												minimumResultsForSearch: Infinity
											});

											$("#filter_response_received").select2({
    placeholder: "Ответ получен/не получен",
    allowClear: true,
    minimumResultsForSearch: Infinity,
    width: "100%"
});

$("#filter_is_sent_to_fns").select2({
    placeholder: "Отправлено/не отправлено в ФНС",
    allowClear: true,
    minimumResultsForSearch: Infinity,
    width: "100%"
});
											
											clearFilters();
										});

										function clearFilters() {
											$("#filter_insuranceNumber").val('');
											$("#filter_activity_type").val(null).trigger('change');
											$("#filter_response_received").val('').trigger('change');
											$("#filter_is_sent_to_fns").val('').trigger('change');
											$("#filter_lastName").val('');
											$("#filter_firstName").val('');
											$("#filter_middleName").val('');
											$("#filter_contractNumber").val('');
											$('#filter_startDate').val('');
											$('#filter_endDate').val('');
											$('#filter_Number').val('');
										}

										function getSelectedFnsRows() {
    var result = null;

    $.ajax({
        type: "GET",
        url: "queryModel?queryModelCode=uw93zB4F",
        async: false,
        data: {
            query_table_code: 'VxvzLyks'
        },
        dataType: "json",
        success: function(data) {
            result = data;
        }
    });

    return result;
}
										
									
function updateSelectedRowsState() {
    const modelData = getSelectedFnsRows();
    const rows = modelData && modelData.list ? modelData.list : [];

    const hasSelection = rows.length > 0;
    const singleSelection = rows.length === 1;

    // Эти кнопки работают с одной или несколькими строками
    $('#downloadSelectedFiles').prop('disabled', !hasSelection);
    $('#sendToFnsBtn').prop('disabled', !hasSelection);

    // Редактирование — только одной строки
    $('#openModalBtn').prop('disabled', !singleSelection);

    if (singleSelection) {
        sr_number = rows[0].request_number;
    } else {
        sr_number = null;
    }
}
										
						
										
										
										$(function() {
											
											$("#downloadSelectedFiles").click(function() {
    const modelData = getSelectedFnsRows();
    const rows = modelData && modelData.list ? modelData.list : [];

    if (!rows.length) {
        return;
    }

    rows.forEach(function(row, index) {
        if (!row.model_file_id) {
            return;
        }

        setTimeout(function() {
            const link = document.createElement('a');

            link.href =
                'modelFileToVerification/modelFileToVerification/downloadSource?id='
                + encodeURIComponent(row.model_file_id);

            link.style.display = 'none';

            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }, index * 300);
    });
});
											
											 fns_journal = new QueryTable("VxvzLyks", {
												initComplete: function(queryAction) {
												//	fns_journal.addActionButton("AddButtonMain", "Отправить в ФНС", uploadRegister, "btn-primary", true);
												},
												onRowSelect: function(data, index) {
													//updateSelectedRowsState();
},
												onRowDeselect: function(data, index) {
													//updateSelectedRowsState();
} ,
							drawCallback: function(data, index) {
    updateSelectedRowsState();
    updateDeleteFnsRequestState();
}
											}, function() {      
												return {
													filterInsuranceNumber: $("#filter_insuranceNumber").val(),
													flk_id: getQueryParam('flk_id'),
													id: getQueryParam('id'),
													startDate: $("#filter_startDate").val(),
													endDate: $("#filter_endDate").val(),
													Number: $("#filter_Number").val(),
													filterActivityType: $("#filter_activity_type").val(),
													filterLastName: $("#filter_lastName").val(),
													filterFirstName: $("#filter_firstName").val(),
													filterMiddleName: $("#filter_middleName").val(),
													filterContractNumber: $("#filter_contractNumber").val(),
													filterResponseReceived: $("#filter_response_received").val(),
													filterIsSentToFns: $("#filter_is_sent_to_fns").val(),
													filterShowList: Search_All
												};
											},
          { multiselect: true });

											$("#filter_search_top").click(() => {
												const hasFilters = $('#filter_startDate').val().trim() || 
															$('#filter_endDate').val().trim() || 
															$('#filter_Number').val().trim() ||
															$("#filter_activity_type").val() ||
													    $("#filter_lastName").val() ||
														  $("#filter_firstName").val() ||
													    $("#filter_middleName").val() ||
													    $("#filter_contractNumber").val() ||
															$("#filter_response_received").val() ||
															$("#filter_is_sent_to_fns").val() ||
															$("#filter_insuranceNumber").val();

												if (!hasFilters) {
													return;
												}

												Search_All = true;
												fns_journal.reload();
											});

											$('#filter_clean_top').click(() => {
												Search_All = false;
												clearFilters();
												sr_number = null; 
												fns_journal.reload();
												
											});//

								function uploadRegister() {
    const validationResult = [];
    let sentCount = 0;

    const modelData = getSelectedFnsRows();
    const rows = modelData && modelData.list ? modelData.list : [];

    if (!rows.length) {
        return;
    }

    rows.forEach(function(appData) {
        const requestLabel = 'Запрос № ' + appData.request_number;
        let uploadSucceeded = false;

        function addMessage(message) {
            validationResult.push({
                messageType: 'info',
                message: requestLabel + ': ' + message
            });
        }

        if (!appData.model_file_id) {
            addMessage('отсутствует файл запроса.');
            return;
        }

        // Сначала выгружаем файл.
        $.ajax({
            url: "queryAction/action",
            type: "POST",
            async: false,
            data: {
                viewCode: '7K6FKG8e',
                queryActionCode: 'DaizGytc',
                record_id: appData.model_file_id,
                unload_mode: 1
            },
            dataType: "json",

            success: function(response) {
                if (!response || response.result !== true) {
                    if (
                        response
                        && response.messages
                        && response.messages.length
                    ) {
                        validationResult.push(...response.messages);
                    } else {
                        addMessage('операция выгрузки не подтверждена.');
                    }
                    return;
                }

                if (response.data === 0 || response.data === '0') {
                    uploadSucceeded = true;
                } else if (
                    response.data === 1
                    || response.data === '1'
                ) {
                    addMessage(
                        'файл с таким именем уже существует во внешнем хранилище. Новая отправка не подтверждена.'
                    );
                } else {
                    addMessage(
                        'выгрузка не подтверждена. Код результата: '
                        + response.data
                    );
                }
            },

            error: function() {
                addMessage(
                    'не удалось получить результат выгрузки. Проверьте состояние запроса перед повторной отправкой.'
                );
            }
        });

        if (!uploadSucceeded) {
            return;
        }

        // После успешной выгрузки сохраняем статус.
        $.ajax({
            url: "queryAction/action",
            type: "POST",
            async: false,
            data: {
                viewCode: '7K6FKG8e',
                queryActionCode: 'sr8LySCh',
                model_file_to_verification_id: appData.model_file_id
            },
            dataType: "json",

            success: function(response) {
                if (response && response.result === true) {
                    sentCount++;
                    return;
                }

                addMessage(
                    'файл выгружен, но сохранение статуса «Отправлено в ФНС» не подтверждено.'
                );

                if (
                    response
                    && response.messages
                    && response.messages.length
                ) {
                    validationResult.push(...response.messages);
                }
            },

            error: function() {
                addMessage(
                    'файл выгружен, но не удалось получить результат сохранения статуса. Обновите журнал перед повторными действиями.'
                );
            }
        });
    });

    if (sentCount > 0) {
        validationResult.unshift({
            messageType: 'info',
            message: 'Отправлено в ФНС. Количество запросов: '
                + sentCount + '.'
        });
    }

    fns_journal.reload();
    showMessages(validationResult);
}

											$("#sendToFnsBtn").on("click", function() {
    const modelData = getSelectedFnsRows();
    const rows = modelData && modelData.list ? modelData.list : [];

    if (!rows.length) {
        return;
    }

    $('#sendFnsConfirmDetails').text(
        'Количество выбранных запросов: ' + rows.length
    );

    $('#sendFnsConfirmModal').modal('show');
});

$("#confirmSendFnsBtn").on("click", function() {
    const button = $(this);

    if (button.prop('disabled')) {
        return;
    }

    button.prop('disabled', true);
    $('#sendFnsConfirmModal').modal('hide');

    try {
        uploadRegister();
    } finally {
        button.prop('disabled', false);
    }
});
											
											
											function editNumber() {
    const validationResult = [];
    const message_level = 'info';

    const modelData = getSelectedFnsRows();
    const rows = modelData && modelData.list ? modelData.list : [];

    if (rows.length !== 1) {
        return;
    }

    const appData = rows[0];

    if (!appData.smevRegisterId) {
        validationResult.push({
            messageType: message_level,
            message: 'Отсутствует ИД Реестра'
        });
        showMessages(validationResult);
        return;
    }

    const newNumber = $('#modalInput').val();


												$.ajax({
													url: "queryAction/action",
													type: "POST",
													async: false,
													data: {
														viewCode: '7K6FKG8e',
														queryActionCode: '4eEKszab',
														smevRegisterId: appData.smevRegisterId,
														new_number: newNumber,
														model_file_id: appData.model_file_id
													},
													dataType: "json",
													//	success: response => handleUploadResponse(response, validationResult)
													success: function(response){
														if(response.result) {
															return
														}
														showMessages(response.messages)
													}
												});

												$('#editModal').modal('hide');
												showMessages(validationResult);
												fns_journal.reload();
												$('#openModalBtn').prop('disabled', true);
											}

											$('#editForm').on('submit', function (e) {
												console.log('ВВВ')
												e.preventDefault();
												editNumber();
											});

											function handleUploadResponse(response, validationResult) {
												if (response.data === 0) {
													validationResult.push({ messageType: message_level, message: 'Файл выгружен.' });
												} else if (response.data === 1) {
													validationResult.push({ messageType: message_level, message: 'Файл с таким именем уже существует во внешнем хранилище.' });
												} else {
													validationResult.push({ messageType: message_level, message: `Ошибка: код процесса выгрузки ${response.data}` });
												}
											}
									
function updateDeleteFnsRequestState() {
    const modelData = getSelectedFnsRows();
    const rows = modelData && modelData.list ? modelData.list : [];

    let canDelete = false;

    if (rows.length === 1) {
        const row = rows[0];

        // Разрешаем удаление только при явно неотправленном статусе.
        const notSent = row.is_sent_to_fns === false
            || row.is_sent_to_fns === 'false';

        canDelete = notSent && !!row.model_file_id;
    }

    $('#deleteFnsRequestBtn').prop('disabled', !canDelete);
}
											
										}); //

										function getQueryParam(key) {
											const url = new URL(window.location.href);
											return url.searchParams.get(key);
										}

										$(document).ready(function(){
    $('#openModalBtn').on('click', function(){

        const modelData = getSelectedFnsRows();
        const rows = modelData && modelData.list ? modelData.list : [];

        if (rows.length !== 1) {
            return;
        }

        const appData = rows[0];

        if (appData.is_sent_to_fns === 'true' || appData.is_sent_to_fns === true) {
            showWarningMessage('Редактирование невозможно: запрос уже отправлен в ФНС');
            return;
        }

        $('#modalInput').val(appData.request_number);
        $('#editModal').modal('show');
    });
											
											
											 let pendingDeleteFileId = null;
    let deleteInProgress = false;

    function isDeletionAllowed(row) {
        return row
            && !!row.model_file_id
            && (
                row.is_sent_to_fns === false
                || row.is_sent_to_fns === 'false'
            );
    }

    $('#deleteFnsRequestBtn').on('click', function() {
        if (deleteInProgress) {
            return;
        }

        pendingDeleteFileId = null;

        const modelData = getSelectedFnsRows();
        const rows = modelData && modelData.list
            ? modelData.list
            : [];

        if (rows.length !== 1) {
            updateDeleteFnsRequestState();
            return;
        }

        const row = rows[0];

        if (!isDeletionAllowed(row)) {
            showWarningMessage(
                'Удаление недоступно: запрос должен быть не отправлен в ФНС и иметь файл.'
            );
            updateDeleteFnsRequestState();
            return;
        }

        pendingDeleteFileId = row.model_file_id;

        $('#deleteFnsRequestDetails').text(
            'Запрос № ' + row.request_number
        );

        $('#deleteFnsRequestModal').modal('show');
    });

    $('#confirmDeleteFnsRequestBtn').on('click', function() {
        if (deleteInProgress || !pendingDeleteFileId) {
            return;
        }

        // Повторно проверяем выбранную строку перед вызовом.
        const modelData = getSelectedFnsRows();
        const rows = modelData && modelData.list
            ? modelData.list
            : [];

        if (
            rows.length !== 1
            || String(rows[0].model_file_id)
                !== String(pendingDeleteFileId)
            || !isDeletionAllowed(rows[0])
        ) {
            $('#deleteFnsRequestModal').modal('hide');
            updateDeleteFnsRequestState();

            showWarningMessage(
                'Выбор или статус запроса изменился. Выберите запрос заново.'
            );
            return;
        }

        const fileId = pendingDeleteFileId;

        deleteInProgress = true;

        $('#confirmDeleteFnsRequestBtn, #cancelDeleteFnsRequestBtn')
            .prop('disabled', true);

        $.ajax({
            url: 'queryAction/action',
            type: 'POST',
            dataType: 'json',
            data: {
                viewCode: '7K6FKG8e',
                queryActionCode: 'FCbnmhY1',
                model_file_id: fileId
            },

            success: function(response) {
                if (response && response.result === true) {
                    deleteInProgress = false;
                    pendingDeleteFileId = null;

                    $('#deleteFnsRequestModal').modal('hide');
                    $('#deleteFnsRequestBtn').prop('disabled', true);

                    fns_journal.reload();

                    showMessages([{
                        messageType: 'info',
                        message: 'Запрос удалён'
                    }]);

                    return;
                }

                if (
                    response
                    && response.messages
                    && response.messages.length
                ) {
                    showMessages(response.messages);
                } else {
                    showWarningMessage(
                        'Удаление не подтверждено. Обновите журнал и проверьте запрос.'
                    );
                }
            },

            error: function(xhr) {
                const response = xhr.responseJSON;

                if (
                    response
                    && response.messages
                    && response.messages.length
                ) {
                    showMessages(response.messages);
                } else {
                    showWarningMessage(
                        'Не удалось получить результат удаления. Обновите журнал перед повторной попыткой.'
                    );
                }
            },

            complete: function() {
                deleteInProgress = false;

                $('#confirmDeleteFnsRequestBtn, #cancelDeleteFnsRequestBtn')
                    .prop('disabled', false);
            }
        });
    });

    $('#deleteFnsRequestModal').on('hide.bs.modal', function(e) {
        if (deleteInProgress) {
            e.preventDefault();
        }
    });

    $('#deleteFnsRequestModal').on('hidden.bs.modal', function() {
        pendingDeleteFileId = null;
    });
											
});
									</script>

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

									<div class="container" id="mainContainer">
										<div class="page-header">
											<h1>Журнал запросов в ФНС</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/31164/"/>

													<form class="form-horizontal" local-storage id="searchContractFilter"
      style="background-color: #d4edda; margin: -21px -15px 0px; padding: 20px 20px 10px;">

    <div class="row">
        <div class="col-sm-2">
            <input type="text" class="form-control date-picker-on filter-input"
                   id="filter_startDate" name="filter_startDate"
                   placeholder="Дата запроса с.."/>
        </div>

        <div class="col-sm-2">
            <input type="text" class="form-control date-picker-on filter-input"
                   id="filter_endDate" name="filter_endDate"
                   placeholder="Дата запроса по.."/>
        </div>

        <div class="col-sm-2">
            <input type="text" class="form-control filter-input"
                   maxlength="20"
                   id="filter_Number" name="filter_Number"
                   placeholder="Номер запроса"/>
        </div>

        <div class="col-sm-2">
            <input type="text" class="form-control filter-input"
                   maxlength="20"
                   id="filter_contractNumber" name="filter_contractNumber"
                   placeholder="Номер договора"/>
        </div>
    </div>

    <div class="row" style="margin-top: 15px;">
        <div class="col-sm-2">
            <input type="text"
                   class="text-uppercase text-en-to-ru text-only-ru form-control filter-input"
                   maxlength="50"
                   id="filter_insuranceNumber"
                   name="filter_insuranceNumber"
                   data-mask="999-999-999 99"
                   placeholder="СНИЛС"/>
        </div>

        <div class="col-sm-2">
            <input type="text"
                   class="text-uppercase text-en-to-ru text-only-ru form-control filter-input"
                   maxlength="50"
                   id="filter_lastName"
                   name="filter_lastName"
                   placeholder="Фамилия"/>
        </div>

        <div class="col-sm-2">
            <input type="text"
                   class="text-uppercase text-en-to-ru text-only-ru form-control filter-input"
                   maxlength="50"
                   id="filter_firstName"
                   name="filter_firstName"
                   placeholder="Имя"/>
        </div>

        <div class="col-sm-2">
            <input type="text"
                   class="text-uppercase text-en-to-ru text-only-ru form-control filter-input"
                   maxlength="50"
                   id="filter_middleName"
                   name="filter_middleName"
                   placeholder="Отчество"/>
        </div>
    </div>

   <div class="row" style="margin-top: 15px;">
    <div class="col-sm-2">
        <select id="filter_activity_type"
                name="filter_activity_type"
                class="form-control filter-input">
            <option value=""></option>
            <option value="NPO">НПО</option>
            <option value="PDS">ПДС</option>
        </select>
    </div>

    <div class="col-sm-2">
        <select id="filter_response_received"
                name="filter_response_received"
                class="form-control filter-input">
            <option value=""></option>
            <option value="true">Ответ получен</option>
            <option value="false">Ответ не получен</option>
        </select>
    </div>

    <div class="col-sm-2">
        <select id="filter_is_sent_to_fns"
                name="filter_is_sent_to_fns"
                class="form-control filter-input">
            <option value=""></option>
            <option value="true">Отправлено в ФНС</option>
            <option value="false">Не отправлено в ФНС</option>
        </select>
    </div>
</div>
														
    <div class="row" style="margin-top: 20px;">
        <div class="col-sm-12">
            <div class="btn-group">
                <button id="filter_search_top" name="filter_search_top" type="button" class="btn btn-success"
                        data-loading-text="Отбор...">
                    <span class="glyphicon glyphicon-search"></span> Найти
                </button>
                <button id="filter_clean_top" name="filter_clean_top" type="button" class="btn btn-warning"
                        data-loading-text="Очистка...">
                    <span class="glyphicon glyphicon-trash"></span> Сбросить
                </button>
            </div>
        </div>
    </div>
</form>

													<div class="row">
														<h3 class="col-sm-12">Журнал запросов в ФНС</h3>
														<div class="col-sm-12">
															<jsp:include page="queryTable.jsp">
																<jsp:param name="queryTableCode" value="VxvzLyks"/>
															</jsp:include>
														</div>

													<div class="mb-2" style="margin-top: 15px; margin-left: 15px;">

    <button type="button"
            class="btn btn-warning"
            id="openModalBtn"
            disabled>
        Редактировать
    </button>

    <button type="button"
            class="btn btn-primary"
            id="sendToFnsBtn"
            style="margin-left: 10px;"
            disabled>
        Отправить в ФНС
    </button>

    <button type="button"
            class="btn btn-primary"
            id="downloadSelectedFiles"
            style="margin-left: 10px;"
            disabled>
        <span class="glyphicon glyphicon-download-alt"></span>
        Скачать выбранные
    </button>

														<button type="button"
        class="btn btn-danger"
        id="deleteFnsRequestBtn"
        disabled>
    <span class="glyphicon glyphicon-trash"></span>
    Удалить
</button>
														
</div>

													</div>

													<div class="row">
													

														
													</div>
												</div>
											</div>
										</div>
									</div>

									<div class="modal fade" id="editModal" tabindex="-1" aria-labelledby="editModalLabel" aria-hidden="true">
										<div class="modal-dialog">
											<div class="modal-content">
												<div class="modal-header">
													<h5 class="modal-title" id="editModalLabel">Редактирование данных</h5>

												</div>
												<div class="modal-body">
													<form id="editForm">
														<div class="mb-3">
															<label for="modalInput" class="form-label">Введите новое значение:</label>
															<input type="text" class="form-control" id="modalInput" placeholder="Заполните поле...">
														</div>
													</form>
												</div>
												<div class="modal-footer">
													<button type="button" class="btn btn-secondary" data-dismiss="modal">Отмена</button>
													<button type="submit" form="editForm" class="btn btn-primary">Сохранить</button>
												</div>
											</div>
										</div>
									</div>

									<div class="modal fade"
     id="deleteFnsRequestModal"
     tabindex="-1"
     role="dialog"
     aria-labelledby="deleteFnsRequestModalLabel"
     data-backdrop="static"
     data-keyboard="false">

    <div class="modal-dialog">
        <div class="modal-content">

            <div class="modal-header">
                <h4 class="modal-title"
                    id="deleteFnsRequestModalLabel">
                    Подтверждение удаления
                </h4>
            </div>

            <div class="modal-body">
                <p>
                    Необходимо подтвердить удаление
                    сформированного Запроса о вычете в ФНС.
                </p>
                <p id="deleteFnsRequestDetails"></p>
            </div>

            <div class="modal-footer">
                <button type="button"
                        class="btn btn-default"
                        id="cancelDeleteFnsRequestBtn"
                        data-dismiss="modal">
                    Отмена
                </button>

                <button type="button"
                        class="btn btn-danger"
                        id="confirmDeleteFnsRequestBtn">
                    Удалить
                </button>
            </div>

        </div>
    </div>
</div>
								
									
									<div class="modal fade"
     id="sendFnsConfirmModal"
     tabindex="-1"
     role="dialog"
     aria-labelledby="sendFnsConfirmModalLabel">

    <div class="modal-dialog">
        <div class="modal-content">

            <div class="modal-header">
                <h4 class="modal-title"
                    id="sendFnsConfirmModalLabel">
                    Подтверждение отправки
                </h4>
            </div>

            <div class="modal-body">
                <p>
                    Подтвердите отправку выбранных запросов в ФНС.
                </p>
                <p id="sendFnsConfirmDetails"></p>
            </div>

            <div class="modal-footer">
                <button type="button"
                        class="btn btn-default"
                        data-dismiss="modal">
                    Отмена
                </button>

                <button type="button"
                        class="btn btn-primary"
                        id="confirmSendFnsBtn">
                    Отправить в ФНС
                </button>
            </div>

        </div>
    </div>
</div>
									
									
									<jsp:include page="footer.jsp"/>
								</body>
							</html>