Загрузка данных
<!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")
+ "®istry_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))