summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Rehnelt <noreply@maennchen1.de>2026-09-27 20:28:31 +0200
committerRoger Rehnelt <noreply@maennchen1.de>2026-09-27 20:28:31 +0200
commitec8c871360f7c7cd3e62f7ab0c2d90d6fde15f00 (patch)
treed0c7034b8a491c4c7714bef9ce2c870e48ddabd7
parentf3628aa464cc9cf9fd8bfed900fc9f7092b1e53d (diff)
Rechnungen: Archiv mit ZIP-Download und Löschen je Jahr/Monat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
-rw-r--r--views/mods/mod_rechnungen/settings_edit.phtml83
1 files changed, 83 insertions, 0 deletions
diff --git a/views/mods/mod_rechnungen/settings_edit.phtml b/views/mods/mod_rechnungen/settings_edit.phtml
index d0a9629..315d4a1 100644
--- a/views/mods/mod_rechnungen/settings_edit.phtml
+++ b/views/mods/mod_rechnungen/settings_edit.phtml
@@ -34,6 +34,7 @@
<li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Vordefinierte Textfelder', 'wpsg'); ?></a></li>
<li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Fußzeile', 'wpsg'); ?></a></li>
<li role="presentation"><a href="#tab3" aria-controls="messages" role="tab" data-toggle="tab"><?php echo __('Sonstiges', 'wpsg'); ?></a></li>
+ <li role="presentation"><a href="#tab4" aria-controls="archive" role="tab" data-toggle="tab"><?php echo __('Archiv', 'wpsg'); ?></a></li>
</ul>
<div class="tab-content">
<div id="tab1" role="tabpanel" class="tab-pane active" >
@@ -278,6 +279,86 @@
<?php echo wpsg_drawForm_TextEnd('Funktionen'); ?>
</div>
+ <div id="tab4" role="tabpanel" class="tab-pane" >
+
+ <?php if (sizeof($this->view['arArchive']) === 0) { ?>
+ <p><?php echo __('Es sind noch keine Rechnungen vorhanden.', 'wpsg'); ?></p>
+ <?php } else { ?>
+
+ <?php
+
+ $archive_url = function($do, $period) {
+
+ return wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&noheader=1&do='.$do.'&period='.rawurlencode($period), 'wpsg-mod_rechnungen-archive');
+
+ };
+
+ $archive_actions = function($period, $year, $files) use ($archive_url) {
+
+ if ($files <= 0) return '';
+
+ $keep_until = $this->callMod('wpsg_mod_rechnungen', 'getArchiveKeepUntil', [$year]);
+ $confirm = wpsg_translate(__('Alle Rechnungsdateien aus #1# endgültig löschen? Die Einträge in den Bestellungen bleiben, die PDFs lassen sich danach nicht mehr herunterladen. Vorher das ZIP sichern!', 'wpsg'), $period);
+
+ if (date('Y-m-d') <= $keep_until) $confirm = wpsg_translate(__('Achtung: Die Aufbewahrungsfrist für #1# läuft noch bis #2#.', 'wpsg'), $period, wpsg_formatTimestamp(strtotime($keep_until), true))."\n\n".$confirm;
+
+ return '<a href="'.esc_url($archive_url('archiveZip', $period)).'" class="button">'.__('ZIP', 'wpsg').'</a> '.
+ '<a href="'.esc_url($archive_url('archiveDelete', $period)).'" class="button" onclick="return confirm(\''.esc_js($confirm).'\');">'.__('Löschen', 'wpsg').'</a>';
+
+ };
+
+ ?>
+
+ <style>.wpsg_mod_rechnungen_archive td, .wpsg_mod_rechnungen_archive th { white-space:nowrap; }</style>
+ <table class="table wpsg_mod_rechnungen_archive">
+ <thead>
+ <tr>
+ <th><?php echo __('Zeitraum', 'wpsg'); ?></th>
+ <th class="col_number"><?php echo __('Rechnungen', 'wpsg'); ?></th>
+ <th class="col_number"><?php echo __('Rechnungskorrekturen', 'wpsg'); ?></th>
+ <th class="col_number"><?php echo __('Dateien', 'wpsg'); ?></th>
+ <th class="col_number"><?php echo __('Größe', 'wpsg'); ?></th>
+ <th><?php echo __('Aufbewahrung bis', 'wpsg'); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($this->view['arArchive'] as $year => $arMonth) { ?>
+ <?php $files = array_sum(array_column($arMonth, 'files')); ?>
+ <tr class="wpsg_archive_year">
+ <td><strong><?php echo $year; ?></strong></td>
+ <td class="col_number"><strong><?php echo array_sum(array_column($arMonth, 'rnr')); ?></strong></td>
+ <td class="col_number"><strong><?php echo array_sum(array_column($arMonth, 'gnr')); ?></strong></td>
+ <td class="col_number"><strong><?php echo $files; ?></strong></td>
+ <td class="col_number"><strong><?php echo size_format(array_sum(array_column($arMonth, 'size')), 1); ?></strong></td>
+ <td><?php echo wpsg_formatTimestamp(strtotime($this->callMod('wpsg_mod_rechnungen', 'getArchiveKeepUntil', [$year])), true); ?></td>
+ <td class="col_actions"><?php echo $archive_actions(strval($year), $year, $files); ?></td>
+ </tr>
+ <?php foreach ($arMonth as $month => $m) { ?>
+ <tr>
+ <td>&nbsp;&nbsp;&nbsp;<?php echo $year.'/'.$month; ?></td>
+ <td class="col_number"><?php echo $m['rnr']; ?></td>
+ <td class="col_number"><?php echo $m['gnr']; ?></td>
+ <td class="col_number"><?php echo $m['files']; ?></td>
+ <td class="col_number"><?php echo ($m['files'] > 0)?size_format($m['size'], 1):''; ?></td>
+ <td></td>
+ <td class="col_actions">
+ <?php if ($m['files'] > 0) echo $archive_actions($year.'/'.$month, $year, $m['files']); ?>
+ <?php if ($m['deleted'] !== false) echo wpsg_translate(__('Dateien gelöscht am #1#', 'wpsg'), wpsg_formatTimestamp(strtotime($m['deleted']), true)); ?>
+ </td>
+ </tr>
+ <?php } ?>
+ <?php } ?>
+ </tbody>
+ </table>
+
+ <?php } ?>
+
+ <?php echo wpsg_drawForm_TextStart(); ?>
+ <p style="line-height:normal;"><?php echo __('Rechnungen und Rechnungskorrekturen sind acht Jahre ab Ende des Rechnungsjahres aufzubewahren (§ 147 AO). Gelöscht werden nur die Dateien; Rechnungsnummern und Einträge in den Bestellungen bleiben. „Fehlende Rechnungen nachbauen“ erzeugt gelöschte Zeiträume nicht neu.', 'wpsg'); ?></p>
+ <?php echo wpsg_drawForm_TextEnd(__('Hinweis', 'wpsg'), ['noP' => true]); ?>
+
+ </div>
</div>
</div>
@@ -285,6 +366,8 @@
<script>
jQuery(document).ready(function() {
+
+ if (location.hash === '#tab4') jQuery('[href="#tab4"]').tab('show');
jQuery('#wpsg_mod_rechnungen_customermail').on('change', function() {