dolibarr.steuer/ustva.php
2026-02-03 14:47:27 +01:00

398 lines
16 KiB
PHP

<?php
/**
* Umsatzsteuer-Voranmeldung (UStVA)
* Mit ELSTER/WISO Kennzahlen
*
* @package steuer
*/
// Load Dolibarr environment
$res = 0;
if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
$res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
}
$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME'];
$tmp2 = realpath(__FILE__);
$i = strlen($tmp) - 1;
$j = strlen($tmp2) - 1;
while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
$i--;
$j--;
}
if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
$res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
}
if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
$res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
}
if (!$res && file_exists("../main.inc.php")) {
$res = @include "../main.inc.php";
}
if (!$res && file_exists("../../main.inc.php")) {
$res = @include "../../main.inc.php";
}
if (!$res && file_exists("../../../main.inc.php")) {
$res = @include "../../../main.inc.php";
}
if (!$res) {
die("Include of main fails");
}
require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
dol_include_once('/steuer/class/euer.class.php');
$langs->loadLangs(array("steuer@steuer", "bills", "compta"));
$jahr = GETPOSTINT('jahr');
if (empty($jahr)) {
$jahr = date('Y');
}
$ansicht = GETPOST('ansicht', 'alpha');
if (empty($ansicht)) {
$ansicht = 'monat';
}
$monat = GETPOSTINT('monat');
if (empty($monat)) {
$monat = date('n');
}
/*
* View
*/
$form = new Form($db);
$euer = new EUeR($db);
llxHeader('', $langs->trans("UStVA"), '', '', 0, 0, '', '', '', 'mod-steuer page-ustva');
print load_fiche_titre($langs->trans("UStVA")." ".$jahr, '', 'fa-percent');
// Filter
print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
print '<input type="hidden" name="token" value="'.newToken().'">';
print '<div class="inline-block marginrightonly">';
print '<select name="jahr" class="flat">';
for ($y = date('Y'); $y >= date('Y') - 5; $y--) {
print '<option value="'.$y.'"'.($y == $jahr ? ' selected' : '').'>'.$y.'</option>';
}
print '</select>';
print ' ';
print '<select name="ansicht" class="flat">';
print '<option value="monat"'.($ansicht == 'monat' ? ' selected' : '').'>'.$langs->trans("Monthly").'</option>';
print '<option value="quartal"'.($ansicht == 'quartal' ? ' selected' : '').'>'.$langs->trans("Quarterly").'</option>';
print '</select>';
print ' ';
print '<select name="monat" class="flat">';
for ($m = 1; $m <= 12; $m++) {
print '<option value="'.$m.'"'.($m == $monat ? ' selected' : '').'>'.dol_print_date(mktime(0, 0, 0, $m, 1, 2000), '%B').'</option>';
}
print '</select>';
print ' <input type="submit" class="button" value="'.$langs->trans("Refresh").'">';
print '</div>';
print '</form>';
print '<br>';
// ============================================================================
// ELSTER FORMULAR - Für manuellen Übertrag
// ============================================================================
print '<h2>ELSTER/WISO Formular - '.dol_print_date(mktime(0, 0, 0, $monat, 1, $jahr), '%B %Y').'</h2>';
// Daten für gewählten Monat berechnen
$euer->berechneAusDolibarr($jahr, $monat, $monat);
// Berechne Werte für UStVA
$kz81 = 0; // Bemessungsgrundlage 19%
$kz81_steuer = 0; // Steuer darauf
$kz86 = 0; // Bemessungsgrundlage 7%
$kz86_steuer = 0; // Steuer darauf
$kz66 = $euer->vst_summe; // Vorsteuer
// Einnahmen nach USt-Satz aufteilen
foreach ($euer->einnahmen as $einnahme) {
$ust_satz = isset($einnahme['ust_satz']) ? $einnahme['ust_satz'] : 19;
if ($ust_satz == 19) {
$kz81 += $einnahme['netto'];
$kz81_steuer += isset($einnahme['ust']) ? $einnahme['ust'] : ($einnahme['netto'] * 0.19);
} elseif ($ust_satz == 7) {
$kz86 += $einnahme['netto'];
$kz86_steuer += isset($einnahme['ust']) ? $einnahme['ust'] : ($einnahme['netto'] * 0.07);
}
}
// Zahllast berechnen
$ust_gesamt = $kz81_steuer + $kz86_steuer;
$zahllast = $ust_gesamt - $kz66;
print '<div class="div-table-responsive">';
print '<table class="noborder centpercent">';
// Header
print '<tr class="liste_titre">';
print '<th style="width:100px;">ELSTER Kz</th>';
print '<th style="width:100px;">WISO Feld</th>';
print '<th>Bezeichnung</th>';
print '<th class="right" style="width:150px;">Bemessungsgrundl.</th>';
print '<th class="right" style="width:150px;">Steuer</th>';
print '</tr>';
// Abschnitt: Lieferungen und sonstige Leistungen
print '<tr class="liste_titre"><td colspan="5"><strong>Lieferungen und sonstige Leistungen (steuerpflichtige Umsätze)</strong></td></tr>';
// Kz 81 - 19% Umsätze
print '<tr class="oddeven">';
print '<td><span class="badge badge-status4" style="font-size:14px;"><strong>Kz 81</strong></span></td>';
print '<td><span class="badge badge-status1">Zeile 28</span></td>';
print '<td>Steuerpflichtige Umsätze zum Steuersatz von <strong>19%</strong></td>';
print '<td class="right amount"><strong>'.price(round($kz81), 0, $langs, 1, 0, 0).'</strong> EUR</td>';
print '<td class="right amount">'.price($kz81_steuer, 0, $langs, 1, 2, 2).' EUR</td>';
print '</tr>';
// Kz 86 - 7% Umsätze
print '<tr class="oddeven">';
print '<td><span class="badge badge-status4" style="font-size:14px;"><strong>Kz 86</strong></span></td>';
print '<td><span class="badge badge-status1">Zeile 29</span></td>';
print '<td>Steuerpflichtige Umsätze zum Steuersatz von <strong>7%</strong></td>';
print '<td class="right amount"><strong>'.price(round($kz86), 0, $langs, 1, 0, 0).'</strong> EUR</td>';
print '<td class="right amount">'.price($kz86_steuer, 0, $langs, 1, 2, 2).' EUR</td>';
print '</tr>';
// Weitere wichtige Kennzahlen (leer, aber für Vollständigkeit)
print '<tr class="oddeven opacitymedium">';
print '<td><span class="badge badge-secondary">Kz 35</span></td>';
print '<td><span class="badge badge-secondary">Zeile 30</span></td>';
print '<td>Umsätze zu anderen Steuersätzen</td>';
print '<td class="right">0 EUR</td>';
print '<td class="right">-</td>';
print '</tr>';
// Steuerfreie Umsätze
print '<tr class="liste_titre"><td colspan="5"><strong>Steuerfreie Umsätze</strong></td></tr>';
print '<tr class="oddeven opacitymedium">';
print '<td><span class="badge badge-secondary">Kz 41</span></td>';
print '<td><span class="badge badge-secondary">Zeile 20</span></td>';
print '<td>Innergemeinschaftliche Lieferungen (§ 4 Nr. 1b UStG)</td>';
print '<td class="right">0 EUR</td>';
print '<td class="right">-</td>';
print '</tr>';
print '<tr class="oddeven opacitymedium">';
print '<td><span class="badge badge-secondary">Kz 44</span></td>';
print '<td><span class="badge badge-secondary">Zeile 21</span></td>';
print '<td>Steuerfreie Ausfuhrlieferungen (§ 4 Nr. 1a UStG)</td>';
print '<td class="right">0 EUR</td>';
print '<td class="right">-</td>';
print '</tr>';
// Abziehbare Vorsteuerbeträge
print '<tr class="liste_titre"><td colspan="5"><strong>Abziehbare Vorsteuerbeträge</strong></td></tr>';
// Kz 66 - Vorsteuer
print '<tr class="oddeven">';
print '<td><span class="badge badge-status4" style="font-size:14px;"><strong>Kz 66</strong></span></td>';
print '<td><span class="badge badge-status1">Zeile 55</span></td>';
print '<td>Vorsteuerbeträge aus Rechnungen von anderen Unternehmern</td>';
print '<td class="right">-</td>';
print '<td class="right amount"><strong>'.price($kz66, 0, $langs, 1, 2, 2).'</strong> EUR</td>';
print '</tr>';
print '<tr class="oddeven opacitymedium">';
print '<td><span class="badge badge-secondary">Kz 61</span></td>';
print '<td><span class="badge badge-secondary">Zeile 56</span></td>';
print '<td>Vorsteuerbeträge aus innergemeinschaftlichem Erwerb</td>';
print '<td class="right">-</td>';
print '<td class="right">0,00 EUR</td>';
print '</tr>';
print '<tr class="oddeven opacitymedium">';
print '<td><span class="badge badge-secondary">Kz 67</span></td>';
print '<td><span class="badge badge-secondary">Zeile 57</span></td>';
print '<td>Vorsteuerbeträge nach § 13b UStG (Reverse Charge)</td>';
print '<td class="right">-</td>';
print '<td class="right">0,00 EUR</td>';
print '</tr>';
// Berechnung
print '<tr class="liste_titre"><td colspan="5"><strong>Berechnung der Umsatzsteuer</strong></td></tr>';
print '<tr class="oddeven">';
print '<td colspan="2"></td>';
print '<td>Summe Umsatzsteuer (Kz 81 + Kz 86)</td>';
print '<td class="right">-</td>';
print '<td class="right amount">'.price($ust_gesamt, 0, $langs, 1, 2, 2).' EUR</td>';
print '</tr>';
print '<tr class="oddeven">';
print '<td colspan="2"></td>';
print '<td>./. Vorsteuer (Kz 66)</td>';
print '<td class="right">-</td>';
print '<td class="right amount">- '.price($kz66, 0, $langs, 1, 2, 2).' EUR</td>';
print '</tr>';
// Zahllast / Erstattung
print '<tr class="liste_total">';
print '<td><span class="badge badge-status'.($zahllast >= 0 ? '1' : '4').'" style="font-size:14px;"><strong>Kz 83</strong></span></td>';
print '<td><span class="badge badge-status1">Zeile 65</span></td>';
print '<td><strong>'.($zahllast >= 0 ? 'Verbleibende Umsatzsteuer-Vorauszahlung' : 'Verbleibender Überschuss (Erstattung)').'</strong></td>';
print '<td class="right">-</td>';
$color = $zahllast >= 0 ? '' : 'amountremaintopay';
print '<td class="right amount '.$color.'"><strong>'.price(abs($zahllast), 0, $langs, 1, 2, 2).' EUR</strong></td>';
print '</tr>';
print '</table>';
print '</div>';
// ============================================================================
// Jahresübersicht
// ============================================================================
print '<br><h2>Jahresübersicht '.$jahr.'</h2>';
print '<div class="div-table-responsive">';
print '<table class="noborder centpercent">';
// Header
print '<tr class="liste_titre">';
print '<th>'.$langs->trans("Period").'</th>';
print '<th class="center">Kz 81<br><small>Umsätze 19%</small></th>';
print '<th class="center">Kz 86<br><small>Umsätze 7%</small></th>';
print '<th class="center">USt<br><small>Steuer</small></th>';
print '<th class="center">Kz 66<br><small>Vorsteuer</small></th>';
print '<th class="center">Kz 83<br><small>Zahllast</small></th>';
print '</tr>';
$total_kz81 = 0;
$total_kz86 = 0;
$total_ust = 0;
$total_vst = 0;
$total_zahllast = 0;
if ($ansicht == 'quartal') {
$perioden = array(
'Q1' => array(1, 3),
'Q2' => array(4, 6),
'Q3' => array(7, 9),
'Q4' => array(10, 12)
);
} else {
$perioden = array();
for ($m = 1; $m <= 12; $m++) {
$perioden[sprintf('%02d', $m)] = array($m, $m);
}
}
foreach ($perioden as $key => $range) {
$euer->berechneAusDolibarr($jahr, $range[0], $range[1]);
$p_kz81 = 0;
$p_kz86 = 0;
$p_ust = 0;
$p_vst = $euer->vst_summe;
foreach ($euer->einnahmen as $einnahme) {
$ust_satz = isset($einnahme['ust_satz']) ? $einnahme['ust_satz'] : 19;
if ($ust_satz == 19) {
$p_kz81 += $einnahme['netto'];
$p_ust += isset($einnahme['ust']) ? $einnahme['ust'] : ($einnahme['netto'] * 0.19);
} elseif ($ust_satz == 7) {
$p_kz86 += $einnahme['netto'];
$p_ust += isset($einnahme['ust']) ? $einnahme['ust'] : ($einnahme['netto'] * 0.07);
}
}
$p_zahllast = $p_ust - $p_vst;
$total_kz81 += $p_kz81;
$total_kz86 += $p_kz86;
$total_ust += $p_ust;
$total_vst += $p_vst;
$total_zahllast += $p_zahllast;
if ($ansicht == 'quartal') {
$periode_name = $key.' '.$jahr;
} else {
$periode_name = dol_print_date(mktime(0, 0, 0, (int)$key, 1, $jahr), '%B');
}
$is_current = ($ansicht != 'quartal' && (int)$key == $monat);
$row_class = $is_current ? 'liste_titre' : 'oddeven';
print '<tr class="'.$row_class.'">';
print '<td>'.($is_current ? '<strong>' : '').$periode_name.($is_current ? ' (oben)</strong>' : '').'</td>';
print '<td class="right">'.price(round($p_kz81), 0, $langs, 1, 0, 0).'</td>';
print '<td class="right">'.price(round($p_kz86), 0, $langs, 1, 0, 0).'</td>';
print '<td class="right">'.price($p_ust, 0, $langs, 1, 2, 2).'</td>';
print '<td class="right">'.price($p_vst, 0, $langs, 1, 2, 2).'</td>';
$color = $p_zahllast >= 0 ? '' : 'amountremaintopay';
print '<td class="right amount '.$color.'"><strong>'.price($p_zahllast, 0, $langs, 1, 2, 2).'</strong></td>';
print '</tr>';
}
// Summenzeile
print '<tr class="liste_total">';
print '<td><strong>Gesamt '.$jahr.'</strong></td>';
print '<td class="right"><strong>'.price(round($total_kz81), 0, $langs, 1, 0, 0).'</strong></td>';
print '<td class="right"><strong>'.price(round($total_kz86), 0, $langs, 1, 0, 0).'</strong></td>';
print '<td class="right"><strong>'.price($total_ust, 0, $langs, 1, 2, 2).'</strong></td>';
print '<td class="right"><strong>'.price($total_vst, 0, $langs, 1, 2, 2).'</strong></td>';
$color = $total_zahllast >= 0 ? 'amountpaymentcomplete' : 'amountremaintopay';
print '<td class="right amount '.$color.'"><strong>'.price($total_zahllast, 0, $langs, 1, 2, 2).'</strong></td>';
print '</tr>';
print '</table>';
print '</div>';
// ============================================================================
// Legende
// ============================================================================
print '<br>';
print '<div class="fichecenter">';
print '<div class="fichethirdleft">';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre"><th colspan="2">ELSTER Kennzahlen</th></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status4">Kz 81</span></td><td>Bemessungsgrundlage für Umsätze zum Steuersatz von 19%</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status4">Kz 86</span></td><td>Bemessungsgrundlage für Umsätze zum Steuersatz von 7%</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status4">Kz 66</span></td><td>Vorsteuerbeträge aus Rechnungen von anderen Unternehmern</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status4">Kz 83</span></td><td>Verbleibende Umsatzsteuer-Vorauszahlung / Überschuss</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-secondary">Kz 35</span></td><td>Umsätze zu anderen Steuersätzen (z.B. 16%, 5%)</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-secondary">Kz 41</span></td><td>Innergemeinschaftliche Lieferungen</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-secondary">Kz 44</span></td><td>Steuerfreie Ausfuhrlieferungen</td></tr>';
print '</table>';
print '</div>';
print '<div class="fichetwothirdright">';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre"><th colspan="2">WISO Steuer Zuordnung</th></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status1">Zeile 28</span></td><td>= ELSTER Kz 81 (19% Umsätze)</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status1">Zeile 29</span></td><td>= ELSTER Kz 86 (7% Umsätze)</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status1">Zeile 55</span></td><td>= ELSTER Kz 66 (Vorsteuer)</td></tr>';
print '<tr class="oddeven"><td><span class="badge badge-status1">Zeile 65</span></td><td>= ELSTER Kz 83 (Zahllast)</td></tr>';
print '<tr class="oddeven"><td colspan="2" class="opacitymedium"><small>Die WISO Zeilennummern können je nach Version abweichen. Orientieren Sie sich an den ELSTER-Kennzahlen.</small></td></tr>';
print '</table>';
print '</div>';
print '</div>';
print '<div class="clearboth"></div>';
// Hinweis
print '<br>';
print '<div class="warning">';
print '<strong>Hinweis zur Übertragung:</strong><br>';
print '1. In ELSTER/WISO tragen Sie die <strong>Bemessungsgrundlagen</strong> (Netto-Beträge) in die Felder Kz 81 und Kz 86 ein<br>';
print '2. Die Steuer wird automatisch berechnet<br>';
print '3. Die <strong>Vorsteuer</strong> (Kz 66) ist der Gesamtbetrag der abziehbaren Vorsteuer<br>';
print '4. Die Kennzahlen sind identisch für ELSTER und WISO Steuer<br>';
print '</div>';
// Zurück-Button
print '<br>';
print '<div class="tabsAction">';
print '<a class="butAction" href="'.dol_buildpath('/steuer/steuerindex.php', 1).'"><i class="fa fa-arrow-left paddingright"></i>'.$langs->trans("Back").'</a>';
print '</div>';
llxFooter();
$db->close();