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


<!DOCTYPE html>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/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">

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

<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>

<style>
    #searchUnvFilter .filter-wrapper {
        padding-left: 0;
        padding-right: 0;
        margin-bottom: 10px;
    }
    #searchUnvFilter .main-filter-buttons {
        margin-top: 12px;
        margin-bottom: 12px;
        white-space: nowrap;
    }
    #searchUnvFilter .main-filter-buttons .btn {
        margin-right: 8px;
    }
    #unvItemBlock {
        margin-top: 15px;
        display: none;
    }
</style>

<script type="text/javascript">
$(function () {

    var rowRegistry = null;

    // ==================== ЖУРНАЛ РЕЕСТРОВ (верхняя таблица) ====================
    var registryJournal = new QueryTable("UNV_REGISTRY_TABLE", {
        initComplete: function (queryAction) {
            registryJournal.queryAction = queryAction;

            registryJournal.addActionButton("CreateRegistry", "Создать", createRegistry, "btn-success", false);

            <sec:authorize access="hasAnyAuthority('ROLE_ADMIN')">
            registryJournal.addActionButton("DeleteRegistry", "Аннулировать", deleteRegistry, "btn-danger", true);
            </sec:authorize>

            registryJournal.addActionButton("SendToLkk", "Отправить в ЛКК", sendToLkk, "btn-primary", true);
            registryJournal.addActionButton("SendToFns", "Отправить в ФНС", sendToFns, "btn-primary", true);
        },

        onRowSelect: function (data, index) {
            rowRegistry = data;
            // Показываем нижнюю таблицу и перезагружаем её
            $('#unvItemBlock').stop(true, true).slideDown(150);
            registryItems.reload();
        },

        onRowDeselect: function (data, index) {
            rowRegistry = null;
            $('#unvItemBlock').stop(true, true).slideUp(150);
        }

    }, function () {
        var data = {};

        if ($("#filter\\.registry_date_from").val()) {
            data.registry_date_from = $("#filter\\.registry_date_from").val();
        }
        if ($("#filter\\.registry_date_to").val()) {
            data.registry_date_to = $("#filter\\.registry_date_to").val();
        }
        if ($("#filter\\.registry_number").val()) {
            data.registry_number = $("#filter\\.registry_number").val();
        }
        if ($("#filter\\.sent_date_from").val()) {
            data.sent_date_from = $("#filter\\.sent_date_from").val();
        }
        if ($("#filter\\.sent_date_to").val()) {
            data.sent_date_to = $("#filter\\.sent_date_to").val();
        }
        if ($("#filter\\.tax_period_year").val()) {
            data.tax_period_year = $("#filter\\.tax_period_year").val();
        }
        if ($("#filter\\.status").val()) {
            data.status = $("#filter\\.status").val();
        }
        if ($("#filter\\.error_code").val()) {
            data.error_code = $("#filter\\.error_code").val();
        }
        if ($("#filter\\.error_status").val()) {
            data.error_status = $("#filter\\.error_status").val();
        }

        return data;
    });

    // ==================== ДЕТАЛИЗАЦИЯ ПО КЛИЕНТАМ (нижняя таблица) ====================
    var registryItems = new QueryTable("UNV_REGISTRY_ITEM_TABLE", {
        initComplete: function (queryAction) {
        },
        onRowSelect: function (data, index) {
        },
        onRowDeselect: function (data, index) {
        }
    }, function () {
        var data = {};
        if (rowRegistry) {
            data.registry_id = rowRegistry.id;
        }
        return data;
    });

    // ==================== КНОПКИ ====================
    function uuid() {
    function randomDigit() {
        if (crypto && crypto.getRandomValues) {
            var rands = new Uint8Array(1);
            crypto.getRandomValues(rands);
            return (rands[0] % 16).toString(16);
        } else {
            return ((Math.random() * 16) | 0).toString(16);
        }
    }
    var crypto = window.crypto || window.msCrypto;
    return 'xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx'.replace(/x/g, randomDigit);
}

async function createRegistry() {
    try {
        let seq1 = await getSeqSmevRegister();
        let seq2 = await getSeqSmevRegister();
        let seq3 = await getSeqSmevRegister();

        QueryAction.action("UNV_CREATE_REGISTRY", {
            actionComplete: function (data) {
                registryJournal.reload();
            }
        }, function () {
            return {
                guid1: uuid(),
                guid2: uuid(),
                guid3: uuid(),
                registry_id_1: seq1.id,
                registry_id_2: seq2.id,
                registry_id_3: seq3.id
            };
        });

    } catch (error) {
        console.error("Ошибка при создании реестра УНВ:", error);
    }
}

async function getSeqSmevRegister() {
    return $.ajax({
        type: "GET",
        url: "queryModel?queryModelCode=qJmlPzPm",
        async: false,
        data: { seq_name: "'report.smev_register_id_sequence'" },
        dataType: "json",
        success: function (data) {},
    })
}

	
    function deleteRegistry() {
        if (!confirm("Вы уверены, что хотите аннулировать реестр?")) return;

        QueryAction.action("UNV_DELETE_REGISTRY", {
            actionComplete: function (data) {
                registryJournal.reload();
                $('#unvItemBlock').stop(true, true).slideUp(150);
            }
        }, function () {
            return { registry_id: rowRegistry.id };
        });
    }

    function sendToLkk() {
        QueryAction.action("UNV_SEND_TO_LKK", {
            actionComplete: function (data) {
                registryJournal.reload();
            }
        }, function () {
            return { registry_id: rowRegistry.id };
        });
    }

	/*
    function sendToFns() {
        QueryAction.action("UNV_SEND_TO_FNS", {
            actionComplete: function (data) {
                registryJournal.reload();
            }
        }, function () {
            return { registry_id: rowRegistry.id };
        });
    }*/
	
	// ==================== ОТПРАВИТЬ В ФНС ====================
async function sendToFns() {
    try {
        // Получаем список id строк реестра
        var result = await $.ajax({
            type: "GET",
            url: "queryModel?queryModelCode=qi6zY4LB",
            data: { registry_id: rowRegistry.id },
            dataType: "json"
        });

        var items = result.list;

        if (!items || items.length === 0) {
            alert('Нет строк в реестре для отправки');
            return;
        }

        // Для каждой строки формируем XML
        for (var i = 0; i < items.length; i++) {
            await exportUnvXml(items[i].id);
        }

        registryJournal.reload();
        alert('Успешно сформировано XML файлов: ' + items.length);

    } catch (error) {
        console.error('Ошибка при отправке в ФНС:', error);
        alert('Ошибка при отправке в ФНС');
    }
}

async function exportUnvXml(registryItemId) {
    await $.ajax({
        type: "GET",
        url: "queryModel/file?queryModelCode=hcw0UFYw&queryModelCharset=UTF-8&viewCode=" 
             + $.urlParam("viewCode") 
             + "&registry_item_id=" + registryItemId,
        async: false,
        data: {},
        dataType: "text",
        success: function (data) {}
    });
}




    // ==================== ФИЛЬТР ====================
    $('#filter\\.search').click(function () {
        registryJournal.reload();
        $('#unvItemBlock').stop(true, true).slideUp(150);
    });

    $('#filter\\.cleanFilter').click(function () {
        $('#searchUnvFilter')[0].reset();
        registryJournal.reload();
        $('#unvItemBlock').stop(true, true).slideUp(150);
    });

});
</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="Персонифицированный учет / Отчетность / ФНС / Реестр на УНВ"/>

                <!-- ==================== ФИЛЬТР ==================== -->
                <form id="searchUnvFilter" class="form-horizontal">
                    <div class="col-sm-12 filter-wrapper">

                        <div class="col-sm-3">
                            <label for="filter.registry_date_from">Дата реестра с</label>
                            <input type="date" id="filter.registry_date_from"
                                   name="filter.registry_date_from" class="form-control">
                        </div>

                        <div class="col-sm-3">
                            <label for="filter.registry_date_to">Дата реестра по</label>
                            <input type="date" id="filter.registry_date_to"
                                   name="filter.registry_date_to" class="form-control">
                        </div>

                        <div class="col-sm-3">
                            <label for="filter.registry_number">№ реестра</label>
                            <input type="text" id="filter.registry_number"
                                   name="filter.registry_number" class="form-control"
                                   placeholder="№ реестра">
                        </div>

                        <div class="col-sm-3">
                            <label for="filter.tax_period_year">Налоговый период (год)</label>
                            <input type="text" id="filter.tax_period_year"
                                   name="filter.tax_period_year" class="form-control"
                                   placeholder="ГГГГ">
                        </div>

                        <div class="clearfix"></div>

                        <div class="col-sm-3" style="margin-top:10px;">
                            <label for="filter.sent_date_from">Дата отправки в ФНС с</label>
                            <input type="date" id="filter.sent_date_from"
                                   name="filter.sent_date_from" class="form-control">
                        </div>

                        <div class="col-sm-3" style="margin-top:10px;">
                            <label for="filter.sent_date_to">Дата отправки в ФНС по</label>
                            <input type="date" id="filter.sent_date_to"
                                   name="filter.sent_date_to" class="form-control">
                        </div>

                        <div class="col-sm-3" style="margin-top:10px;">
                            <label for="filter.status">Статус</label>
                            <select id="filter.status" name="filter.status" class="form-control">
                                <option value=""></option>
                                <option value="FORMED">Сформирован</option>
                                <option value="SENT_FNS">Отправлен в ФНС</option>
                                <option value="ACCEPTED_FNS">Принят в ФНС</option>
                                <option value="FNS_RESPONSE">Успешно</option>
															  <option value="FNS_RESPONSE">Ошибка</option>
                            </select>
                        </div>

                        <div class="col-sm-3" style="margin-top:10px;">
                            <label for="filter.error_code">Значение ошибки</label>
                            <input type="text" id="filter.error_code"
                                   name="filter.error_code" class="form-control"
                                   placeholder="Например: 01">
                        </div>

                        <div class="clearfix"></div>

                        <div class="col-sm-3" style="margin-top:10px;">
                            <label for="filter.error_status">Статус ошибки</label>
                            <select id="filter.error_status" name="filter.error_status" 
                                    class="form-control">
                                <option value=""></option>
                                <option value="NOT_FIXED">Не исправлено</option>
                                <option value="FIXED">Исправлено</option>
                            </select>
                        </div>

                        <div class="clearfix"></div>

                        <div class="col-sm-12 main-filter-buttons">
                            <button id="filter.search" type="button" class="btn btn-success">
                                <span class="glyphicon glyphicon-search"></span> Найти
                            </button>
                            <button id="filter.cleanFilter" type="button" class="btn btn-warning">
                                <span class="glyphicon glyphicon-trash"></span> Сбросить
                            </button>
                        </div>

                        <div class="clearfix"></div>
                    </div>
                </form>

                <!-- ==================== ВЕРХНЯЯ ТАБЛИЦА: РЕЕСТРЫ ==================== -->
                <jsp:include page="queryTable.jsp">
                    <jsp:param name="queryTableCode" value="UNV_REGISTRY_TABLE"/>
                </jsp:include>

                <!-- ==================== НИЖНЯЯ ТАБЛИЦА: КЛИЕНТЫ РЕЕСТРА ==================== -->
                <div id="unvItemBlock" class="panel panel-info">
                    <div class="panel-heading">Клиенты реестра</div>
                    <div class="panel-body">
                        <jsp:include page="queryTable.jsp">
                            <jsp:param name="queryTableCode" value="UNV_REGISTRY_ITEM_TABLE"/>
                        </jsp:include>
                    </div>
                </div>

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

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

</body>
</html>















UNV_REGISTRY_TABLE

SELECT
  r.id as id,
  r.number as number,
  to_char(r.date, 'DD.MM.YYYY') as date,
  r.sent as sent,
  r.year as year,
  r.sample_status as sample_status,
  r.guid as guid 
FROM report.smev_register r
WHERE r.smev_register_type_code = 'УНВ'
AND (
    cast(:registry_date_from as date) IS NOT NULL
    OR cast(:registry_date_to as date) IS NOT NULL
    OR cast(:registry_number as varchar) IS NOT NULL
    OR cast(:sent_date_from as date) IS NOT NULL
    OR cast(:sent_date_to as date) IS NOT NULL
    OR cast(:tax_period_year as integer) IS NOT NULL
    OR cast(:status as varchar) IS NOT NULL
)
AND r.sample_status <> 'Удалён'
AND (cast(:registry_date_from as date) IS NULL
     OR r."date" >= cast(:registry_date_from as date))
AND (cast(:registry_date_to as date) IS NULL
     OR r."date" <= cast(:registry_date_to as date))
AND (cast(:registry_number as varchar) IS NULL
     OR r."number" = cast(:registry_number as varchar))
AND (cast(:sent_date_from as date) IS NULL
     OR r.sent >= cast(:sent_date_from as date))
AND (cast(:sent_date_to as date) IS NULL
     OR r.sent <= cast(:sent_date_to as date))
AND (cast(:tax_period_year as integer) IS NULL
     OR r."year" = cast(:tax_period_year as integer))
AND (cast(:status as varchar) IS NULL
     OR r.sample_status = cast(:status as varchar))