| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- @extends('layouts.app')
- @section('content')
- <div class="row mb-3">
- <div class="col-12">
- <h3>Экспорт и импорт данных за год</h3>
- </div>
- </div>
- <div class="row">
- <!-- Экспорт -->
- <div class="col-md-6 mb-4">
- <div class="card">
- <div class="card-header bg-primary text-white">
- <i class="bi bi-download me-2"></i>Экспорт данных
- </div>
- <div class="card-body">
- @if(count($years) > 0)
- <p class="text-muted">Экспортирует все данные за выбранный год в ZIP-архив, включая файлы (фото, документы, сертификаты, паспорта).</p>
- <div class="mb-3">
- <label for="exportYear" class="form-label">Год для экспорта</label>
- <select class="form-select" id="exportYear" name="year">
- <option value="">-- Выберите год --</option>
- @foreach($years as $year)
- <option value="{{ $year }}">{{ $year }}</option>
- @endforeach
- </select>
- </div>
- <button type="button" class="btn btn-outline-primary" id="btnGetExportStats" disabled>
- Показать статистику
- </button>
- <div id="exportStatsBlock" class="mt-3" style="display: none;">
- <h6>Данные для экспорта за <span id="exportStatsYear"></span> год:</h6>
- <table class="table table-sm table-striped" id="exportStatsTable">
- <thead>
- <tr>
- <th>Сущность</th>
- <th class="text-end">Количество</th>
- </tr>
- </thead>
- <tbody></tbody>
- <tfoot>
- <tr class="table-dark">
- <th>Итого</th>
- <th class="text-end" id="exportStatsTotal"></th>
- </tr>
- </tfoot>
- </table>
- <form action="{{ route('year-data.export') }}" method="post">
- @csrf
- <input type="hidden" name="year" id="exportYearInput">
- <button type="submit" class="btn btn-primary">
- <i class="bi bi-download me-2"></i>Начать экспорт
- </button>
- </form>
- </div>
- @else
- <div class="alert alert-info mb-0">
- Нет данных для экспорта
- </div>
- @endif
- </div>
- </div>
- </div>
- <!-- Импорт -->
- <div class="col-md-6 mb-4">
- <div class="card">
- <div class="card-header bg-success text-white">
- <i class="bi bi-upload me-2"></i>Импорт данных
- </div>
- <div class="card-body">
- <p class="text-muted">Импортирует данные из ранее созданного ZIP-архива экспорта.</p>
- <form action="{{ route('year-data.import') }}" method="post" enctype="multipart/form-data">
- @csrf
- <div class="mb-3">
- <label for="importYear" class="form-label">Год для импорта</label>
- <input type="number" class="form-control" id="importYear" name="year"
- min="2020" max="2100" value="{{ date('Y') }}" required>
- <div class="form-text">Год, в который будут импортированы данные</div>
- </div>
- <div class="mb-3">
- <label for="importFile" class="form-label">ZIP-архив с данными</label>
- <input type="file" class="form-control" id="importFile" name="import_file"
- accept=".zip" required>
- </div>
- <div class="mb-3 form-check">
- <input type="checkbox" class="form-check-input" id="clearExisting" name="clear_existing" value="1">
- <label class="form-check-label text-danger" for="clearExisting">
- <strong>Очистить существующие данные</strong> за этот год перед импортом
- </label>
- </div>
- <div class="alert alert-warning">
- <i class="bi bi-exclamation-triangle me-2"></i>
- <strong>Внимание!</strong> При включенной опции очистки все существующие данные за указанный год будут удалены перед импортом.
- </div>
- <button type="submit" class="btn btn-success" id="btnImport">
- <i class="bi bi-upload me-2"></i>Начать импорт
- </button>
- </form>
- </div>
- </div>
- </div>
- </div>
- <!-- Недавние экспорты -->
- @if($exports->count() > 0)
- <div class="row">
- <div class="col-12">
- <div class="card">
- <div class="card-header">
- <i class="bi bi-clock-history me-2"></i>Недавние экспорты
- </div>
- <div class="card-body">
- <table class="table table-striped table-hover">
- <thead>
- <tr>
- <th>Файл</th>
- <th>Дата создания</th>
- <th>Действия</th>
- </tr>
- </thead>
- <tbody>
- @foreach($exports as $export)
- <tr>
- <td>{{ $export->original_name }}</td>
- <td>{{ $export->created_at->format('d.m.Y H:i') }}</td>
- <td>
- <a href="{{ $export->link }}" class="btn btn-sm btn-outline-primary" target="_blank">
- <i class="bi bi-download"></i> Скачать
- </a>
- </td>
- </tr>
- @endforeach
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- @endif
- @endsection
- @push('scripts')
- <script type="module">
- $(document).ready(function() {
- let selectedExportYear = null;
- $('#exportYear').on('change', function() {
- selectedExportYear = $(this).val();
- $('#btnGetExportStats').prop('disabled', !selectedExportYear);
- $('#exportStatsBlock').hide();
- });
- $('#btnGetExportStats').on('click', function() {
- if (!selectedExportYear) return;
- const btn = $(this);
- btn.prop('disabled', true).text('Загрузка...');
- $.ajax({
- url: '{{ route('year-data.stats') }}',
- method: 'GET',
- data: { year: selectedExportYear },
- success: function(response) {
- $('#exportStatsYear').text(response.year);
- $('#exportStatsTotal').text(response.total);
- $('#exportYearInput').val(response.year);
- const tbody = $('#exportStatsTable tbody');
- tbody.empty();
- for (const [entity, count] of Object.entries(response.stats)) {
- tbody.append(`<tr><td>${entity}</td><td class="text-end">${count}</td></tr>`);
- }
- $('#exportStatsBlock').show();
- },
- error: function(xhr) {
- alert('Ошибка получения статистики: ' + (xhr.responseJSON?.error || 'Неизвестная ошибка'));
- },
- complete: function() {
- btn.prop('disabled', false).text('Показать статистику');
- }
- });
- });
- // Валидация формы импорта
- $('form[action="{{ route('year-data.import') }}"]').on('submit', function(e) {
- const file = $('#importFile').val();
- const clearExisting = $('#clearExisting').is(':checked');
- if (!file) {
- e.preventDefault();
- alert('Пожалуйста, выберите ZIP-архив для импорта');
- return false;
- }
- if (clearExisting) {
- if (!confirm('Вы уверены, что хотите очистить существующие данные за этот год? Это действие необратимо!')) {
- e.preventDefault();
- return false;
- }
- }
- $('#btnImport').prop('disabled', true).html('<span class="spinner-border spinner-border-sm me-2"></span>Загрузка...');
- });
- });
- </script>
- @endpush
|