Fehler bereinigt läuft jetzt

This commit is contained in:
Eduard Wisch 2026-02-03 15:12:00 +01:00
parent 562c69ef46
commit 206aeacbc5
10 changed files with 524 additions and 978 deletions

116
README.md
View file

@ -95,6 +95,122 @@ Das Modul liest automatisch aus:
- Kz 66 → Vorsteuer - Kz 66 → Vorsteuer
- Kz 83 → Zahllast/Erstattung - Kz 83 → Zahllast/Erstattung
## Zusammensetzung der Buchungskonten in der EÜR
### Datenfluss und Tabellen
Das Modul verwendet das Zufluss-/Abflussprinzip (Ist-Versteuerung). Einnahmen und Ausgaben werden erst zum Zeitpunkt der Zahlung erfasst, nicht bei Rechnungsstellung.
#### Einnahmen (Kundenrechnungen)
```
llx_paiement (Zahlungsdatum: datep)
llx_paiement_facture (Verknüpfung: fk_paiement → fk_facture, Zahlungsbetrag: amount)
llx_facture (Rechnung: total_ht, total_tva, total_ttc, localtax1, tva_tx)
```
- **datep** aus `llx_paiement` = tatsächliches Zahlungsdatum
- **amount** aus `llx_paiement_facture` = gezahlter Betrag (kann Teilzahlung sein)
- Netto-Anteil wird berechnet: `zahlung * (total_ht / total_ttc)`
- USt-Anteil wird berechnet: `zahlung * (total_tva / total_ttc)`
#### Ausgaben (Lieferantenrechnungen)
```
llx_paiementfourn (Zahlungsdatum: datep)
llx_paiementfourn_facturefourn (Verknüpfung: fk_paiementfourn → fk_facturefourn, Zahlungsbetrag: amount)
llx_facture_fourn (Rechnung: total_ht, total_tva, total_ttc, localtax1, tva_tx)
```
- **datep** aus `llx_paiementfourn` = tatsächliches Zahlungsdatum
- **amount** aus `llx_paiementfourn_facturefourn` = gezahlter Betrag
- Netto-Anteil wird berechnet: `zahlung * (total_ht / total_ttc)`
- VSt-Anteil wird berechnet: `zahlung * (total_tva / total_ttc)`
#### Manuelle Buchungen
```
llx_steuer_buchung (datum, betrag_netto, betrag_ust, kategorie, fk_konto)
llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen)
```
### SKR03 Kontenzuordnung
Alle Konten sind dem SKR03-Kontenrahmen zugeordnet:
#### Einnahmen-Konten (8xxx)
| Konto | Bezeichnung | EÜR-Zeile | USt-Kz |
|-------|-------------|-----------|--------|
| 8400 | Erlöse 19% USt | 14 | 81 |
| 8300 | Erlöse 7% USt | 14 | 86 |
| 8100 | Steuerfreie Umsätze Inland | 10 | - |
| 8120 | Steuerfreie igL | 11 | 41 |
| 8150 | Steuerfreie Ausfuhrlieferungen | 12 | 44 |
| 8910 | Private Kfz-Nutzung | 19 | 81 |
#### Ausgaben-Konten (3xxx/4xxx)
| Konto | Bezeichnung | EÜR-Zeile | USt-Kz |
|-------|-------------|-----------|--------|
| 3400 | Wareneingang 19% VSt | 26 | 66 |
| 4100 | Löhne und Gehälter | 31 | - |
| 4200 | Raumkosten/Miete | 34 | 66 |
| 4500 | Fahrzeugkosten | 51 | 66 |
| 4820 | AfA Sachanlagen | 36 | - |
| 4900 | Rechts- und Beratungskosten | 50 | 66 |
### USt-Kennzahlen für UStVA/ELSTER
| Kennzahl | Bedeutung | Konten |
|----------|-----------|--------|
| 81 | Umsätze 19% | 8400, 8500, 8600, 8900, 8910, 8920 |
| 86 | Umsätze 7% | 8300 |
| 41 | Innergemeinschaftliche Lieferungen | 8120 |
| 44 | Ausfuhrlieferungen | 8150 |
| 66 | Vorsteuer | Alle Ausgaben mit VSt |
### Berechnung in der EÜR-Klasse
Die Klasse `EUeR` (class/euer.class.php) berechnet:
1. **Einnahmen** aus bezahlten Kundenrechnungen
- Filtert nach Zahlungsdatum im gewählten Zeitraum
- Berücksichtigt Teilzahlungen anteilig
- Gutschriften werden als negative Einnahmen erfasst
2. **Ausgaben** aus bezahlten Lieferantenrechnungen
- Filtert nach Zahlungsdatum im gewählten Zeitraum
- Berücksichtigt Teilzahlungen anteilig
3. **Manuelle Buchungen** aus llx_steuer_buchung
- Werden zusätzlich zu den automatischen Buchungen erfasst
- Für Belege außerhalb von Dolibarr (z.B. Barbelege)
4. **Gewinn/Verlust**
- Gewinn = Summe Einnahmen (netto) - Summe Ausgaben (netto)
### Beispiel-SQL für Einnahmen
```sql
SELECT
pf.amount as zahlung,
p.datep as zahlungsdatum,
f.total_ht as netto,
f.total_tva as ust,
f.total_ttc as brutto,
(pf.amount * f.total_ht / f.total_ttc) as zahlung_netto,
(pf.amount * f.total_tva / f.total_ttc) as zahlung_ust
FROM llx_paiement as p
INNER JOIN llx_paiement_facture as pf ON p.rowid = pf.fk_paiement
INNER JOIN llx_facture as f ON pf.fk_facture = f.rowid
WHERE p.datep >= '2025-01-01' AND p.datep <= '2025-12-31'
AND f.entity = 1
```
## Datenbanktabellen ## Datenbanktabellen
Das Modul erstellt folgende Tabellen: Das Modul erstellt folgende Tabellen:

View file

@ -1,35 +1,15 @@
<?php <?php
/* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/** /**
* \file steuer/admin/setup.php * EÜR Modul - Einstellungen
* \ingroup steuer *
* \brief Steuer setup page. * @package steuer
*/ */
// Load Dolibarr environment // Load Dolibarr environment
$res = 0; $res = 0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
$res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
} }
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME'];
$tmp2 = realpath(__FILE__); $tmp2 = realpath(__FILE__);
$i = strlen($tmp) - 1; $i = strlen($tmp) - 1;
@ -44,586 +24,227 @@ if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
if (!$res && $i > 0 && file_exists(dirname(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"; $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
} }
// Try main.inc.php using relative path
if (!$res && file_exists("../../main.inc.php")) { if (!$res && file_exists("../../main.inc.php")) {
$res = @include "../../main.inc.php"; $res = @include "../../main.inc.php";
} }
if (!$res && file_exists("../../../main.inc.php")) { if (!$res && file_exists("../../../main.inc.php")) {
$res = @include "../../../main.inc.php"; $res = @include "../../../main.inc.php";
} }
if (!$res && file_exists("../../../../main.inc.php")) {
$res = @include "../../../../main.inc.php";
}
if (!$res) { if (!$res) {
die("Include of main fails"); die("Include of main fails");
} }
// Libraries require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php"; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
require_once '../lib/steuer.lib.php';
//require_once "../class/myclass.class.php";
/** $langs->loadLangs(array("steuer@steuer", "admin"));
* @var Conf $conf
* @var DoliDB $db
* @var HookManager $hookmanager
* @var Translate $langs
* @var User $user
*/
// Translations // Security check
$langs->loadLangs(array("admin", "steuer@steuer")); if (!$user->admin) {
accessforbidden();
}
// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
/** @var HookManager $hookmanager */
$hookmanager->initHooks(array('steuersetup', 'globalsetup'));
// Parameters
$action = GETPOST('action', 'aZ09'); $action = GETPOST('action', 'aZ09');
$backtopage = GETPOST('backtopage', 'alpha');
$modulepart = GETPOST('modulepart', 'aZ09'); // Used by actions_setmoduleoptions.inc.php
$value = GETPOST('value', 'alpha');
$label = GETPOST('label', 'alpha');
$scandir = GETPOST('scan_dir', 'alpha');
$type = 'myobject';
$error = 0;
$setupnotempty = 0;
// Access control
if (!$user->admin) {
accessforbidden();
}
// Set this to 1 to use the factory to manage constants. Warning, the generated module will be compatible with version v15+ only
$useFormSetup = 1;
if (!class_exists('FormSetup')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsetup.class.php';
}
$formSetup = new FormSetup($db);
// Access control
if (!$user->admin) {
accessforbidden();
}
// Enter here all parameters in your setup page
// Setup conf for selection of an URL
$item = $formSetup->newItem('STEUER_MYPARAM1');
$item->fieldParams['isMandatory'] = 1;
$item->fieldAttr['placeholder'] = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$item->cssClass = 'minwidth500';
// Setup conf for selection of a simple string input
$item = $formSetup->newItem('STEUER_MYPARAM2');
$item->defaultFieldValue = 'default value';
$item->fieldAttr['placeholder'] = 'A placeholder here';
$item->helpText = 'Tooltip text';
// Setup conf for selection of a simple textarea input but we replace the text of field title
$item = $formSetup->newItem('STEUER_MYPARAM3');
$item->nameText = $item->getNameText().' more html text ';
// Setup conf for a selection of a Thirdparty
$item = $formSetup->newItem('STEUER_MYPARAM4');
$item->setAsThirdpartyType();
// Setup conf for a selection of a boolean
$formSetup->newItem('STEUER_MYPARAM5')->setAsYesNo();
// Setup conf for a selection of an Email template of type thirdparty
$formSetup->newItem('STEUER_MYPARAM6')->setAsEmailTemplate('thirdparty');
// Setup conf for a selection of a secured key
//$formSetup->newItem('STEUER_MYPARAM7')->setAsSecureKey();
// Setup conf for a selection of a Product
$formSetup->newItem('STEUER_MYPARAM8')->setAsProduct();
// Add a title for a new section
$formSetup->newItem('NewSection')->setAsTitle();
$TField = array(
'test01' => $langs->trans('test01'),
'test02' => $langs->trans('test02'),
'test03' => $langs->trans('test03'),
'test04' => $langs->trans('test04'),
'test05' => $langs->trans('test05'),
'test06' => $langs->trans('test06'),
);
// Setup conf for a simple combo list
$formSetup->newItem('STEUER_MYPARAM9')->setAsSelect($TField);
// Setup conf for a multiselect combo list
$item = $formSetup->newItem('STEUER_MYPARAM10');
$item->setAsMultiSelect($TField);
$item->helpText = $langs->transnoentities('STEUER_MYPARAM10');
// Setup conf for a category selection
$formSetup->newItem('STEUER_CATEGORY_ID_XXX')->setAsCategory('product');
// Setup conf STEUER_MYPARAM10
$item = $formSetup->newItem('STEUER_MYPARAM10');
$item->setAsColor();
$item->defaultFieldValue = '#FF0000';
//$item->fieldValue = '';
//$item->fieldAttr = array() ; // fields attribute only for compatible fields like input text
//$item->fieldOverride = false; // set this var to override field output will override $fieldInputOverride and $fieldOutputOverride too
//$item->fieldInputOverride = false; // set this var to override field input
//$item->fieldOutputOverride = false; // set this var to override field output
$item = $formSetup->newItem('STEUER_MYPARAM11')->setAsHtml();
$item->nameText = $item->getNameText().' more html text ';
$item->fieldInputOverride = '';
$item->helpText = $langs->transnoentities('HelpMessage');
$item->cssClass = 'minwidth500';
$item = $formSetup->newItem('STEUER_MYPARAM12');
$item->fieldOverride = "Value forced, can't be modified";
$item->cssClass = 'minwidth500';
//$item = $formSetup->newItem('STEUER_MYPARAM13')->setAsDate(); // Not yet implemented
// End of definition of parameters
$setupnotempty += count($formSetup->items);
$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
$moduledir = 'steuer';
$myTmpObjects = array();
// TODO Scan list of objects to fill this array
$myTmpObjects['myobject'] = array('label' => 'MyObject', 'includerefgeneration' => 0, 'includedocgeneration' => 0, 'class' => 'MyObject');
$tmpobjectkey = GETPOST('object', 'aZ09');
if ($tmpobjectkey && !array_key_exists($tmpobjectkey, $myTmpObjects)) {
accessforbidden('Bad value for object. Hack attempt ?');
}
/* /*
* Actions * Actions
*/ */
// For retrocompatibility Dolibarr < 15.0 if ($action == 'update') {
if (versioncompare(explode('.', DOL_VERSION), array(15)) < 0 && $action == 'update' && !empty($user->admin)) { $error = 0;
$formSetup->saveConfFromPost();
}
include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; // Gewerbesteuer Hebesatz
$hebesatz = GETPOSTINT('STEUER_GEWERBE_HEBESATZ');
if ($action == 'updateMask') { if ($hebesatz >= 200 && $hebesatz <= 900) {
$maskconst = GETPOST('maskconst', 'aZ09'); dolibarr_set_const($db, 'STEUER_GEWERBE_HEBESATZ', $hebesatz, 'chaine', 0, '', $conf->entity);
$maskvalue = GETPOST('maskvalue', 'alpha');
if ($maskconst && preg_match('/_MASK$/', $maskconst)) {
$res = dolibarr_set_const($db, $maskconst, $maskvalue, 'chaine', 0, '', $conf->entity);
if (!($res > 0)) {
$error++;
}
} }
// Gewerbesteuer Freibetrag
$freibetrag = GETPOSTINT('STEUER_GEWERBE_FREIBETRAG');
if ($freibetrag >= 0) {
dolibarr_set_const($db, 'STEUER_GEWERBE_FREIBETRAG', $freibetrag, 'chaine', 0, '', $conf->entity);
}
// Steuernummer
$steuernummer = GETPOST('STEUER_STEUERNUMMER', 'alpha');
dolibarr_set_const($db, 'STEUER_STEUERNUMMER', $steuernummer, 'chaine', 0, '', $conf->entity);
// USt-ID
$ustid = GETPOST('STEUER_UST_ID', 'alpha');
dolibarr_set_const($db, 'STEUER_UST_ID', $ustid, 'chaine', 0, '', $conf->entity);
// Finanzamt
$finanzamt = GETPOST('STEUER_FINANZAMT', 'alpha');
dolibarr_set_const($db, 'STEUER_FINANZAMT', $finanzamt, 'chaine', 0, '', $conf->entity);
// UStVA Zeitraum
$ustva_zeitraum = GETPOST('STEUER_USTVA_ZEITRAUM', 'alpha');
dolibarr_set_const($db, 'STEUER_USTVA_ZEITRAUM', $ustva_zeitraum, 'chaine', 0, '', $conf->entity);
// Ist-Versteuerung
$ist_versteuerung = GETPOSTINT('STEUER_IST_VERSTEUERUNG');
dolibarr_set_const($db, 'STEUER_IST_VERSTEUERUNG', $ist_versteuerung, 'chaine', 0, '', $conf->entity);
if (!$error) { if (!$error) {
setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
} else { } else {
setEventMessages($langs->trans("Error"), null, 'errors'); setEventMessages($langs->trans("Error"), null, 'errors');
} }
} elseif ($action == 'specimen' && $tmpobjectkey) {
$modele = GETPOST('module', 'alpha');
$className = $myTmpObjects[$tmpobjectkey]['class'];
$tmpobject = new $className($db);
'@phan-var-force MyObject $tmpobject';
$tmpobject->initAsSpecimen();
// Search template files
$file = '';
$className = '';
$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
foreach ($dirmodels as $reldir) {
$file = dol_buildpath($reldir."core/modules/steuer/doc/pdf_".$modele."_".strtolower($tmpobjectkey).".modules.php", 0);
if (file_exists($file)) {
$className = "pdf_".$modele."_".strtolower($tmpobjectkey);
break;
}
}
if ($className !== '') {
require_once $file;
$module = new $className($db);
'@phan-var-force ModelePDFMyObject $module';
'@phan-var-force ModelePDFMyObject $module';
if ($module->write_file($tmpobject, $langs) > 0) {
header("Location: ".DOL_URL_ROOT."/document.php?modulepart=steuer-".strtolower($tmpobjectkey)."&file=SPECIMEN.pdf");
return;
} else {
setEventMessages($module->error, null, 'errors');
dol_syslog($module->error, LOG_ERR);
}
} else {
setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors');
dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR);
}
} elseif ($action == 'setmod') {
// TODO Check if numbering module chosen can be activated by calling method canBeActivated
if (!empty($tmpobjectkey)) {
$constforval = 'STEUER_'.strtoupper($tmpobjectkey)."_ADDON";
dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity);
}
} elseif ($action == 'set') {
// Activate a model
$ret = addDocumentModel($value, $type, $label, $scandir);
} elseif ($action == 'del') {
$ret = delDocumentModel($value, $type);
if ($ret > 0) {
if (!empty($tmpobjectkey)) {
$constforval = 'STEUER_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
if (getDolGlobalString($constforval) == "$value") {
dolibarr_del_const($db, $constforval, $conf->entity);
}
}
}
} elseif ($action == 'setdoc') {
// Set or unset default model
if (!empty($tmpobjectkey)) {
$constforval = 'STEUER_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
if (dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity)) {
// The constant that was read before the new set
// We therefore requires a variable to have a coherent view
$conf->global->{$constforval} = $value;
}
// We disable/enable the document template (into llx_document_model table)
$ret = delDocumentModel($value, $type);
if ($ret > 0) {
$ret = addDocumentModel($value, $type, $label, $scandir);
}
}
} elseif ($action == 'unsetdoc') {
if (!empty($tmpobjectkey)) {
$constforval = 'STEUER_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
dolibarr_del_const($db, $constforval, $conf->entity);
}
} }
$action = 'edit';
/* /*
* View * View
*/ */
$form = new Form($db); $form = new Form($db);
$help_url = ''; $page_name = "SteuerSetup";
$title = "SteuerSetup"; llxHeader('', $langs->trans($page_name), '', '', 0, 0, '', '', '', 'mod-steuer page-admin-setup');
llxHeader('', $langs->trans($title), $help_url, '', 0, 0, '', '', '', 'mod-steuer page-admin'); $linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
print load_fiche_titre($langs->trans($page_name), $linkback, 'fa-calculator');
// Subheader print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
$linkback = '<a href="'.($backtopage ? $backtopage : DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1').'">'.$langs->trans("BackToModuleList").'</a>'; print '<input type="hidden" name="token" value="'.newToken().'">';
print '<input type="hidden" name="action" value="update">';
print load_fiche_titre($langs->trans($title), $linkback, 'title_setup'); // Firmendaten für Steuern
print '<div class="div-table-responsive-no-min">';
print '<table class="noborder centpercent">';
// Configuration header print '<tr class="liste_titre">';
$head = steuerAdminPrepareHead(); print '<td colspan="2">'.$langs->trans("CompanyTaxInfo").'</td>';
print dol_get_fiche_head($head, 'settings', $langs->trans($title), -1, "steuer@steuer"); print '</tr>';
// Setup page goes here // Steuernummer
echo '<span class="opacitymedium">'.$langs->trans("SteuerSetupPage").'</span><br><br>'; print '<tr class="oddeven">';
print '<td class="titlefield">'.$langs->trans("TaxNumber").'</td>';
print '<td>';
print '<input type="text" name="STEUER_STEUERNUMMER" value="'.getDolGlobalString('STEUER_STEUERNUMMER').'" size="30">';
print '</td>';
print '</tr>';
// USt-ID
print '<tr class="oddeven">';
print '<td>'.$langs->trans("VATIntra").'</td>';
print '<td>';
print '<input type="text" name="STEUER_UST_ID" value="'.getDolGlobalString('STEUER_UST_ID').'" size="30" placeholder="DE123456789">';
print '</td>';
print '</tr>';
/*if ($action == 'edit') { // Finanzamt
print $formSetup->generateOutput(true); print '<tr class="oddeven">';
print '<br>'; print '<td>'.$langs->trans("TaxOffice").'</td>';
} elseif (!empty($formSetup->items)) { print '<td>';
print $formSetup->generateOutput(); print '<input type="text" name="STEUER_FINANZAMT" value="'.getDolGlobalString('STEUER_FINANZAMT').'" size="50">';
print '<div class="tabsAction">'; print '</td>';
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a>'; print '</tr>';
print '</div>';
}
*/
if (!empty($formSetup->items)) {
print $formSetup->generateOutput(true);
print '<br>';
}
print '</table>';
print '</div>';
foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) { print '<br>';
if (!empty($myTmpObjectArray['includerefgeneration'])) {
// Numbering models
$setupnotempty++; // USt-Einstellungen
print '<div class="div-table-responsive-no-min">';
print '<table class="noborder centpercent">';
print load_fiche_titre($langs->trans("NumberingModules", $myTmpObjectArray['label']), '', ''); print '<tr class="liste_titre">';
print '<td colspan="2">'.$langs->trans("VATSettings").'</td>';
print '</tr>';
print '<table class="noborder centpercent">'; // Ist-Versteuerung
print '<tr class="liste_titre">'; print '<tr class="oddeven">';
print '<td>'.$langs->trans("Name").'</td>'; print '<td class="titlefield">'.$langs->trans("IstVersteuerung").'</td>';
print '<td>'.$langs->trans("Description").'</td>'; print '<td>';
print '<td class="nowrap">'.$langs->trans("Example").'</td>'; $ist_versteuerung = getDolGlobalInt('STEUER_IST_VERSTEUERUNG', 1);
print '<td class="center" width="60">'.$langs->trans("Status").'</td>'; print '<select name="STEUER_IST_VERSTEUERUNG" class="flat">';
print '<td class="center" width="16">'.$langs->trans("ShortInfo").'</td>'; print '<option value="1"'.($ist_versteuerung == 1 ? ' selected' : '').'>'.$langs->trans("Yes").' - Ist-Versteuerung (nach Zahlungseingang)</option>';
print '</tr>'."\n"; print '<option value="0"'.($ist_versteuerung == 0 ? ' selected' : '').'>'.$langs->trans("No").' - Soll-Versteuerung (nach Rechnungsdatum)</option>';
print '</select>';
print '</td>';
print '</tr>';
clearstatcache(); // UStVA Zeitraum
print '<tr class="oddeven">';
print '<td>'.$langs->trans("UStVAZeitraum").'</td>';
print '<td>';
$ustva_zeitraum = getDolGlobalString('STEUER_USTVA_ZEITRAUM', 'monat');
print '<select name="STEUER_USTVA_ZEITRAUM" class="flat">';
print '<option value="monat"'.($ustva_zeitraum == 'monat' ? ' selected' : '').'>'.$langs->trans("Monthly").'</option>';
print '<option value="quartal"'.($ustva_zeitraum == 'quartal' ? ' selected' : '').'>'.$langs->trans("Quarterly").'</option>';
print '</select>';
print '</td>';
print '</tr>';
foreach ($dirmodels as $reldir) { print '</table>';
$dir = dol_buildpath($reldir."core/modules/".$moduledir); print '</div>';
if (is_dir($dir)) { print '<br>';
$handle = opendir($dir);
if (is_resource($handle)) {
while (($file = readdir($handle)) !== false) {
if (strpos($file, 'mod_'.strtolower($myTmpObjectKey).'_') === 0 && substr($file, dol_strlen($file) - 3, 3) == 'php') {
$file = substr($file, 0, dol_strlen($file) - 4);
require_once $dir.'/'.$file.'.php'; // Gewerbesteuer-Einstellungen
print '<div class="div-table-responsive-no-min">';
print '<table class="noborder centpercent">';
$module = new $file($db); print '<tr class="liste_titre">';
'@phan-var-force ModeleNumRefMyObject $module'; print '<td colspan="2">'.$langs->trans("GewerbesteuerSettings").'</td>';
print '</tr>';
// Show modules according to features level // Hebesatz
if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) { print '<tr class="oddeven">';
continue; print '<td class="titlefield">'.$langs->trans("Hebesatz").'</td>';
} print '<td>';
if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) { $hebesatz = getDolGlobalInt('STEUER_GEWERBE_HEBESATZ', 400);
continue; print '<input type="number" name="STEUER_GEWERBE_HEBESATZ" value="'.$hebesatz.'" min="200" max="900" step="1" class="flat width100"> %';
} print '<br><span class="opacitymedium small">Hebesatz Ihrer Gemeinde (z.B. 400% = 400)</span>';
print '</td>';
print '</tr>';
if ($module->isEnabled()) { // Freibetrag
dol_include_once('/'.$moduledir.'/class/'.strtolower($myTmpObjectKey).'.class.php'); print '<tr class="oddeven">';
print '<td>'.$langs->trans("Freibetrag").'</td>';
print '<td>';
$freibetrag = getDolGlobalInt('STEUER_GEWERBE_FREIBETRAG', 24500);
print '<input type="number" name="STEUER_GEWERBE_FREIBETRAG" value="'.$freibetrag.'" min="0" step="100" class="flat width100"> EUR';
print '<br><span class="opacitymedium small">Freibetrag (24.500 EUR für natürliche Personen und Personengesellschaften)</span>';
print '</td>';
print '</tr>';
print '<tr class="oddeven"><td>'.$module->getName($langs)."</td><td>\n"; print '</table>';
print $module->info($langs); print '</div>';
print '</td>';
// Show example of numbering model print '<br>';
print '<td class="nowrap">';
$tmp = $module->getExample();
if (preg_match('/^Error/', $tmp)) {
$langs->load("errors");
print '<div class="error">'.$langs->trans($tmp).'</div>';
} elseif ($tmp == 'NotConfigured') {
print $langs->trans($tmp);
} else {
print $tmp;
}
print '</td>'."\n";
print '<td class="center">'; print '<div class="center">';
$constforvar = 'STEUER_'.strtoupper($myTmpObjectKey).'_ADDON'; print '<input type="submit" class="button" value="'.$langs->trans("Save").'">';
$defaultifnotset = 'thevaluetousebydefault'; print '</div>';
$activenumberingmodel = getDolGlobalString($constforvar, $defaultifnotset);
if ($activenumberingmodel == $file) {
print img_picto($langs->trans("Activated"), 'switch_on');
} else {
print '<a href="'.$_SERVER["PHP_SELF"].'?action=setmod&token='.newToken().'&object='.strtolower($myTmpObjectKey).'&value='.urlencode($file).'">';
print img_picto($langs->trans("Disabled"), 'switch_off');
print '</a>';
}
print '</td>';
$className = $myTmpObjectArray['class']; print '</form>';
$mytmpinstance = new $className($db);
'@phan-var-force MyObject $mytmpinstance';
$mytmpinstance->initAsSpecimen();
// Info // Modul-Info
$htmltooltip = ''; print '<br>';
$htmltooltip .= ''.$langs->trans("Version").': <b>'.$module->getVersion().'</b><br>'; print '<div class="div-table-responsive-no-min">';
print '<table class="noborder centpercent">';
$nextval = $module->getNextValue($mytmpinstance); print '<tr class="liste_titre">';
if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval print '<td colspan="2">'.$langs->trans("ModuleInfo").'</td>';
$htmltooltip .= ''.$langs->trans("NextValue").': '; print '</tr>';
if ($nextval) { print '<tr class="oddeven">';
if (preg_match('/^Error/', $nextval) || $nextval == 'NotConfigured') { print '<td class="titlefield">'.$langs->trans("Version").'</td>';
$nextval = $langs->trans($nextval); print '<td>1.0</td>';
} print '</tr>';
$htmltooltip .= $nextval.'<br>'; print '<tr class="oddeven">';
} else { print '<td>'.$langs->trans("Author").'</td>';
$htmltooltip .= $langs->trans($module->error).'<br>'; print '<td>Eduard Wisch - Data IT Solution</td>';
} print '</tr>';
} print '<tr class="oddeven">';
print '<td>'.$langs->trans("Description").'</td>';
print '<td class="center">'; print '<td>'.$langs->trans("ModuleSteuerDesc").'</td>';
print $form->textwithpicto('', $htmltooltip, 1, 'info'); print '</tr>';
print '</td>'; print '</table>';
print '</div>';
print "</tr>\n";
}
}
}
closedir($handle);
}
}
}
print "</table><br>\n";
}
if (!empty($myTmpObjectArray['includedocgeneration'])) {
/*
* Document templates generators
*/
$setupnotempty++;
$type = strtolower($myTmpObjectKey);
print load_fiche_titre($langs->trans("DocumentModules", $myTmpObjectKey), '', '');
// Load array def with activated templates
$def = array();
$sql = "SELECT nom";
$sql .= " FROM ".$db->prefix()."document_model";
$sql .= " WHERE type = '".$db->escape($type)."'";
$sql .= " AND entity = ".$conf->entity;
$resql = $db->query($sql);
if ($resql) {
$i = 0;
$num_rows = $db->num_rows($resql);
while ($i < $num_rows) {
$array = $db->fetch_array($resql);
array_push($def, $array[0]);
$i++;
}
} else {
dol_print_error($db);
}
print '<table class="noborder centpercent">'."\n";
print '<tr class="liste_titre">'."\n";
print '<td>'.$langs->trans("Name").'</td>';
print '<td>'.$langs->trans("Description").'</td>';
print '<td class="center" width="60">'.$langs->trans("Status")."</td>\n";
print '<td class="center" width="60">'.$langs->trans("Default")."</td>\n";
print '<td class="center" width="38">'.$langs->trans("ShortInfo").'</td>';
print '<td class="center" width="38">'.$langs->trans("Preview").'</td>';
print "</tr>\n";
clearstatcache();
foreach ($dirmodels as $reldir) {
foreach (array('', '/doc') as $valdir) {
$realpath = $reldir."core/modules/".$moduledir.$valdir;
$dir = dol_buildpath($realpath);
if (is_dir($dir)) {
$handle = opendir($dir);
if (is_resource($handle)) {
$filelist = array();
while (($file = readdir($handle)) !== false) {
$filelist[] = $file;
}
closedir($handle);
arsort($filelist);
foreach ($filelist as $file) {
if (preg_match('/\.modules\.php$/i', $file) && preg_match('/^(pdf_|doc_)/', $file)) {
if (file_exists($dir.'/'.$file)) {
$name = substr($file, 4, dol_strlen($file) - 16);
$className = substr($file, 0, dol_strlen($file) - 12);
require_once $dir.'/'.$file;
$module = new $className($db);
'@phan-var-force ModelePDFMyObject $module';
$modulequalified = 1;
if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) {
$modulequalified = 0;
}
if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) {
$modulequalified = 0;
}
if ($modulequalified) {
print '<tr class="oddeven"><td width="100">';
print(empty($module->name) ? $name : $module->name);
print "</td><td>\n";
if (method_exists($module, 'info')) {
print $module->info($langs); // @phan-suppress-current-line PhanUndeclaredMethod
} else {
print $module->description;
}
print '</td>';
// Active
if (in_array($name, $def)) {
print '<td class="center">'."\n";
print '<a href="'.$_SERVER["PHP_SELF"].'?action=del&token='.newToken().'&value='.urlencode($name).'">';
print img_picto($langs->trans("Enabled"), 'switch_on');
print '</a>';
print '</td>';
} else {
print '<td class="center">'."\n";
print '<a href="'.$_SERVER["PHP_SELF"].'?action=set&token='.newToken().'&value='.urlencode($name).'&scan_dir='.urlencode($module->scandir).'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"), 'switch_off').'</a>';
print "</td>";
}
// Default
print '<td class="center">';
$constforvar = 'STEUER_'.strtoupper($myTmpObjectKey).'_ADDON_PDF';
if (getDolGlobalString($constforvar) == $name) {
//print img_picto($langs->trans("Default"), 'on');
// Even if choice is the default value, we allow to disable it. Replace this with previous line if you need to disable unset
print '<a href="'.$_SERVER["PHP_SELF"].'?action=unsetdoc&token='.newToken().'&object='.urlencode(strtolower($myTmpObjectKey)).'&value='.urlencode($name).'&scan_dir='.urlencode($module->scandir).'&label='.urlencode($module->name).'&amp;type='.urlencode($type).'" alt="'.$langs->trans("Disable").'">'.img_picto($langs->trans("Enabled"), 'on').'</a>';
} else {
print '<a href="'.$_SERVER["PHP_SELF"].'?action=setdoc&token='.newToken().'&object='.urlencode(strtolower($myTmpObjectKey)).'&value='.urlencode($name).'&scan_dir='.urlencode($module->scandir).'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').'</a>';
}
print '</td>';
// Info
$htmltooltip = ''.$langs->trans("Name").': '.$module->name;
$htmltooltip .= '<br>'.$langs->trans("Type").': '.($module->type ? $module->type : $langs->trans("Unknown"));
if ($module->type == 'pdf') {
$htmltooltip .= '<br>'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur;
}
$htmltooltip .= '<br>'.$langs->trans("Path").': '.preg_replace('/^\//', '', $realpath).'/'.$file;
$htmltooltip .= '<br><br><u>'.$langs->trans("FeaturesSupported").':</u>';
$htmltooltip .= '<br>'.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1);
$htmltooltip .= '<br>'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang, 1, 1);
print '<td class="center">';
print $form->textwithpicto('', $htmltooltip, 1, 'info');
print '</td>';
// Preview
print '<td class="center">';
if ($module->type == 'pdf') {
$newname = preg_replace('/_'.preg_quote(strtolower($myTmpObjectKey), '/').'/', '', $name);
print '<a href="'.$_SERVER["PHP_SELF"].'?action=specimen&module='.urlencode($newname).'&object='.urlencode($myTmpObjectKey).'">'.img_object($langs->trans("Preview"), 'pdf').'</a>';
} else {
print img_object($langs->transnoentitiesnoconv("PreviewNotAvailable"), 'generic');
}
print '</td>';
print "</tr>\n";
}
}
}
}
}
}
}
}
print '</table>';
}
}
if (empty($setupnotempty)) {
print '<br>'.$langs->trans("NothingToSetup");
}
// Page end
print dol_get_fiche_end();
llxFooter(); llxFooter();
$db->close(); $db->close();

View file

@ -118,47 +118,51 @@ if ($search_beschreibung) {
$sql .= " AND b.beschreibung LIKE '%".$db->escape($search_beschreibung)."%'"; $sql .= " AND b.beschreibung LIKE '%".$db->escape($search_beschreibung)."%'";
} }
// UNION mit Rechnungen (Einnahmen) // UNION mit Kundenzahlungen (Einnahmen) - Ist-Versteuerung/Zufluss-Prinzip
$sql .= " UNION ALL "; // Zahlungsdatum liegt in llx_paiement, nicht in llx_paiement_facture!
$sql .= "SELECT f.rowid, f.ref, COALESCE(pf.datep, f.datef) as datum, f.ref as belegnummer,"; if ($typ != 'ausgabe') {
$sql .= " CONCAT('Rechnung: ', s.nom) as beschreibung,"; $sql .= " UNION ALL ";
$sql .= " f.total_ht as betrag_netto, f.total_tva as betrag_ust, f.total_ttc as betrag_brutto,"; $sql .= "SELECT f.rowid, f.ref, p.datep as datum,";
$sql .= " 'einnahme' as typ, '' as kontonummer, '' as konto_bezeichnung,"; $sql .= " f.ref as belegnummer,";
$sql .= " 'facture' as quelle"; $sql .= " CONCAT('Zahlung: ', s.nom) as beschreibung,";
$sql .= " FROM ".MAIN_DB_PREFIX."facture as f"; $sql .= " (pf.amount * f.total_ht / f.total_ttc) as betrag_netto,";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid"; $sql .= " (pf.amount * f.total_tva / f.total_ttc) as betrag_ust,";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON pf.fk_facture = f.rowid"; $sql .= " pf.amount as betrag_brutto,";
$sql .= " WHERE f.entity = ".((int) $conf->entity); $sql .= " 'einnahme' as typ, '' as kontonummer, '' as konto_bezeichnung,";
$sql .= " AND f.fk_statut IN (2, 3)"; $sql .= " 'facture' as quelle";
$sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'"; $sql .= " FROM ".MAIN_DB_PREFIX."paiement as p";
if ($typ == 'ausgabe') { $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON p.rowid = pf.fk_paiement";
$sql .= " AND 1=0"; // Keine Einnahmen bei Ausgaben-Filter $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture as f ON pf.fk_facture = f.rowid";
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql .= " WHERE f.entity = ".((int) $conf->entity);
$sql .= " AND p.datep BETWEEN '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'";
if ($search_beschreibung) {
$sql .= " AND s.nom LIKE '%".$db->escape($search_beschreibung)."%'";
}
} }
if ($search_beschreibung) {
$sql .= " AND s.nom LIKE '%".$db->escape($search_beschreibung)."%'";
}
$sql .= " GROUP BY f.rowid";
// UNION mit Lieferantenrechnungen (Ausgaben) // UNION mit Lieferantenzahlungen (Ausgaben) - Ist-Versteuerung/Abfluss-Prinzip
$sql .= " UNION ALL "; // Zahlungsdatum liegt in llx_paiementfourn, nicht in llx_paiementfourn_facturefourn!
$sql .= "SELECT f.rowid, f.ref, COALESCE(pf.datep, f.datef) as datum, COALESCE(f.ref_supplier, f.ref) as belegnummer,"; if ($typ != 'einnahme') {
$sql .= " CONCAT('Lieferant: ', s.nom) as beschreibung,"; $sql .= " UNION ALL ";
$sql .= " f.total_ht as betrag_netto, f.total_tva as betrag_ust, f.total_ttc as betrag_brutto,"; $sql .= "SELECT f.rowid, f.ref, p.datep as datum,";
$sql .= " 'ausgabe' as typ, '' as kontonummer, '' as konto_bezeichnung,"; $sql .= " COALESCE(f.ref_supplier, f.ref) as belegnummer,";
$sql .= " 'facture_fourn' as quelle"; $sql .= " CONCAT('Zahlung: ', s.nom) as beschreibung,";
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f"; $sql .= " (pf.amount * f.total_ht / f.total_ttc) as betrag_netto,";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid"; $sql .= " (pf.amount * f.total_tva / f.total_ttc) as betrag_ust,";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid"; $sql .= " pf.amount as betrag_brutto,";
$sql .= " WHERE f.entity = ".((int) $conf->entity); $sql .= " 'ausgabe' as typ, '' as kontonummer, '' as konto_bezeichnung,";
$sql .= " AND f.fk_statut IN (2)"; $sql .= " 'facture_fourn' as quelle";
$sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'"; $sql .= " FROM ".MAIN_DB_PREFIX."paiementfourn as p";
if ($typ == 'einnahme') { $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON p.rowid = pf.fk_paiementfourn";
$sql .= " AND 1=0"; // Keine Ausgaben bei Einnahmen-Filter $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON pf.fk_facturefourn = f.rowid";
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql .= " WHERE f.entity = ".((int) $conf->entity);
$sql .= " AND p.datep BETWEEN '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'";
if ($search_beschreibung) {
$sql .= " AND s.nom LIKE '%".$db->escape($search_beschreibung)."%'";
}
} }
if ($search_beschreibung) {
$sql .= " AND s.nom LIKE '%".$db->escape($search_beschreibung)."%'";
}
$sql .= " GROUP BY f.rowid";
// Sortierung und Limit // Sortierung und Limit
$sql_count = "SELECT COUNT(*) as total FROM (".$sql.") as combined"; $sql_count = "SELECT COUNT(*) as total FROM (".$sql.") as combined";

View file

@ -93,174 +93,109 @@ class EUeR extends CommonObject
} }
/** /**
* Einnahmen aus bezahlten Kundenrechnungen * Einnahmen aus Kundenzahlungen (Ist-Versteuerung / Zufluss-Prinzip)
*/ */
private function berechneEinnahmenAusRechnungen($datum_von, $datum_bis) private function berechneEinnahmenAusRechnungen($datum_von, $datum_bis)
{ {
global $conf; global $conf;
// Bezahlte Rechnungen nach Zahlungsdatum (Zufluss-Prinzip!) // Zahlungsdatum liegt in llx_paiement, nicht in llx_paiement_facture!
$sql = "SELECT f.rowid, f.ref, f.datef as rechnungsdatum,"; $sql = "SELECT pf.amount as zahlung, p.datep as zahlungsdatum,";
$sql .= " pf.datep as zahlungsdatum, pf.amount as zahlung,"; $sql .= " f.total_ht as netto, f.total_tva as ust, f.total_ttc as brutto";
$sql .= " f.total_ht as netto, f.total_tva as ust, f.total_ttc as brutto,"; $sql .= " FROM ".MAIN_DB_PREFIX."paiement as p";
$sql .= " s.nom as kunde,"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON p.rowid = pf.fk_paiement";
$sql .= " fd.tva_tx as ust_satz, fd.total_ht as zeile_netto, fd.total_tva as zeile_ust"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture as f ON pf.fk_facture = f.rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON pf.fk_facture = f.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facturedet as fd ON fd.fk_facture = f.rowid";
$sql .= " WHERE f.entity = ".((int) $conf->entity); $sql .= " WHERE f.entity = ".((int) $conf->entity);
$sql .= " AND f.fk_statut IN (2, 3)"; // Bezahlt oder teilbezahlt $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql .= " AND pf.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql .= " ORDER BY pf.datep";
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) { if ($resql) {
$einnahmen_details = array(); $summe_brutto = 0;
$summe_netto = 0;
$summe_ust = 0;
$anzahl = 0;
while ($obj = $this->db->fetch_object($resql)) { while ($obj = $this->db->fetch_object($resql)) {
$key = 'ust_'.(int)$obj->ust_satz; // USt-Anteil aus der Rechnung berechnen (netto/brutto Verhältnis)
if (!isset($einnahmen_details[$key])) { if ($obj->brutto != 0) {
$einnahmen_details[$key] = array( $zahlung_netto = $obj->zahlung * ($obj->netto / $obj->brutto);
'bezeichnung' => 'Erlöse '.(int)$obj->ust_satz.'% USt', $zahlung_ust = $obj->zahlung * ($obj->ust / $obj->brutto);
'netto' => 0, } else {
'ust' => 0, $zahlung_netto = $obj->zahlung / 1.19;
'brutto' => 0, $zahlung_ust = $obj->zahlung - $zahlung_netto;
'ust_satz' => (int)$obj->ust_satz,
'anzahl' => 0
);
} }
$einnahmen_details[$key]['netto'] += $obj->zahlung / (1 + $obj->ust_satz/100);
$einnahmen_details[$key]['ust'] += $obj->zahlung - ($obj->zahlung / (1 + $obj->ust_satz/100)); $summe_brutto += $obj->zahlung;
$einnahmen_details[$key]['brutto'] += $obj->zahlung; $summe_netto += $zahlung_netto;
$einnahmen_details[$key]['anzahl']++; $summe_ust += $zahlung_ust;
$anzahl++;
} }
foreach ($einnahmen_details as $key => $detail) { if ($anzahl > 0) {
$this->einnahmen[$key] = $detail; $this->einnahmen['zahlungseingaenge'] = array(
$this->summe_einnahmen += $detail['netto']; 'bezeichnung' => 'Betriebseinnahmen (Zahlungseingang)',
$this->ust_summe += $detail['ust']; 'netto' => $summe_netto,
} 'ust' => $summe_ust,
} 'brutto' => $summe_brutto,
'ust_satz' => 19,
// Alternative: Wenn keine Zahlungen verknüpft, nimm Rechnungsdatum 'anzahl' => $anzahl
$sql2 = "SELECT f.rowid, f.ref, f.datef as datum,"; );
$sql2 .= " f.total_ht as netto, f.total_tva as ust, f.total_ttc as brutto,"; $this->summe_einnahmen += $summe_netto;
$sql2 .= " s.nom as kunde"; $this->ust_summe += $summe_ust;
$sql2 .= " FROM ".MAIN_DB_PREFIX."facture as f";
$sql2 .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql2 .= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON pf.fk_facture = f.rowid";
$sql2 .= " WHERE f.entity = ".((int) $conf->entity);
$sql2 .= " AND f.fk_statut IN (2, 3)";
$sql2 .= " AND f.datef BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql2 .= " AND pf.rowid IS NULL"; // Keine Zahlungsverknüpfung
$sql2 .= " ORDER BY f.datef";
$resql2 = $this->db->query($sql2);
if ($resql2) {
while ($obj = $this->db->fetch_object($resql2)) {
$key = 'einnahmen_ohne_zahlung';
if (!isset($this->einnahmen[$key])) {
$this->einnahmen[$key] = array(
'bezeichnung' => 'Erlöse (Rechnungsdatum)',
'netto' => 0,
'ust' => 0,
'brutto' => 0,
'anzahl' => 0
);
}
$this->einnahmen[$key]['netto'] += $obj->netto;
$this->einnahmen[$key]['ust'] += $obj->ust;
$this->einnahmen[$key]['brutto'] += $obj->brutto;
$this->einnahmen[$key]['anzahl']++;
$this->summe_einnahmen += $obj->netto;
$this->ust_summe += $obj->ust;
} }
} }
} }
/** /**
* Ausgaben aus bezahlten Lieferantenrechnungen * Ausgaben aus Lieferantenzahlungen (Ist-Versteuerung / Abfluss-Prinzip)
*/ */
private function berechneAusgabenAusLieferantenrechnungen($datum_von, $datum_bis) private function berechneAusgabenAusLieferantenrechnungen($datum_von, $datum_bis)
{ {
global $conf; global $conf;
// Bezahlte Lieferantenrechnungen nach Zahlungsdatum (Abfluss-Prinzip!) // Zahlungsdatum liegt in llx_paiementfourn, nicht in llx_paiementfourn_facturefourn!
$sql = "SELECT f.rowid, f.ref, f.ref_supplier, f.datef as rechnungsdatum,"; $sql = "SELECT pf.amount as zahlung, p.datep as zahlungsdatum,";
$sql .= " pf.datep as zahlungsdatum, pf.amount as zahlung,"; $sql .= " f.total_ht as netto, f.total_tva as vst, f.total_ttc as brutto";
$sql .= " f.total_ht as netto, f.total_tva as vst, f.total_ttc as brutto,"; $sql .= " FROM ".MAIN_DB_PREFIX."paiementfourn as p";
$sql .= " s.nom as lieferant,"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON p.rowid = pf.fk_paiementfourn";
$sql .= " fd.tva_tx as vst_satz"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON pf.fk_facturefourn = f.rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn_det as fd ON fd.fk_facture_fourn = f.rowid";
$sql .= " WHERE f.entity = ".((int) $conf->entity); $sql .= " WHERE f.entity = ".((int) $conf->entity);
$sql .= " AND f.fk_statut IN (2)"; // Bezahlt $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql .= " AND pf.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql .= " ORDER BY pf.datep";
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) { if ($resql) {
$ausgaben_details = array(); $summe_brutto = 0;
$summe_netto = 0;
$summe_vst = 0;
$anzahl = 0;
while ($obj = $this->db->fetch_object($resql)) { while ($obj = $this->db->fetch_object($resql)) {
$vst_satz = isset($obj->vst_satz) ? (int)$obj->vst_satz : 19; // VSt-Anteil aus der Rechnung berechnen (netto/brutto Verhältnis)
$key = 'vst_'.$vst_satz; if ($obj->brutto != 0) {
if (!isset($ausgaben_details[$key])) { $zahlung_netto = $obj->zahlung * ($obj->netto / $obj->brutto);
$ausgaben_details[$key] = array( $zahlung_vst = $obj->zahlung * ($obj->vst / $obj->brutto);
'bezeichnung' => 'Betriebsausgaben '.$vst_satz.'% VSt', } else {
'netto' => 0, $zahlung_netto = $obj->zahlung / 1.19;
'vst' => 0, $zahlung_vst = $obj->zahlung - $zahlung_netto;
'brutto' => 0,
'vst_satz' => $vst_satz,
'anzahl' => 0
);
} }
$ausgaben_details[$key]['brutto'] += $obj->zahlung;
$ausgaben_details[$key]['netto'] += $obj->zahlung / (1 + $vst_satz/100); $summe_brutto += $obj->zahlung;
$ausgaben_details[$key]['vst'] += $obj->zahlung - ($obj->zahlung / (1 + $vst_satz/100)); $summe_netto += $zahlung_netto;
$ausgaben_details[$key]['anzahl']++; $summe_vst += $zahlung_vst;
$anzahl++;
} }
foreach ($ausgaben_details as $key => $detail) { if ($anzahl > 0) {
$this->ausgaben[$key] = $detail; $this->ausgaben['zahlungsausgaenge'] = array(
$this->summe_ausgaben += $detail['netto']; 'bezeichnung' => 'Betriebsausgaben (Zahlungsausgang)',
$this->vst_summe += $detail['vst']; 'netto' => $summe_netto,
} 'vst' => $summe_vst,
} 'brutto' => $summe_brutto,
'vst_satz' => 19,
// Alternative: Ohne Zahlungsverknüpfung 'anzahl' => $anzahl
$sql2 = "SELECT f.rowid, f.ref, f.datef as datum,"; );
$sql2 .= " f.total_ht as netto, f.total_tva as vst, f.total_ttc as brutto,"; $this->summe_ausgaben += $summe_netto;
$sql2 .= " s.nom as lieferant"; $this->vst_summe += $summe_vst;
$sql2 .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
$sql2 .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql2 .= " LEFT JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid";
$sql2 .= " WHERE f.entity = ".((int) $conf->entity);
$sql2 .= " AND f.fk_statut IN (2)";
$sql2 .= " AND f.datef BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql2 .= " AND pf.rowid IS NULL";
$sql2 .= " ORDER BY f.datef";
$resql2 = $this->db->query($sql2);
if ($resql2) {
while ($obj = $this->db->fetch_object($resql2)) {
$key = 'ausgaben_ohne_zahlung';
if (!isset($this->ausgaben[$key])) {
$this->ausgaben[$key] = array(
'bezeichnung' => 'Betriebsausgaben (Rechnungsdatum)',
'netto' => 0,
'vst' => 0,
'brutto' => 0,
'anzahl' => 0
);
}
$this->ausgaben[$key]['netto'] += $obj->netto;
$this->ausgaben[$key]['vst'] += $obj->vst;
$this->ausgaben[$key]['brutto'] += $obj->brutto;
$this->ausgaben[$key]['anzahl']++;
$this->summe_ausgaben += $obj->netto;
$this->vst_summe += $obj->vst;
} }
} }
} }
@ -339,21 +274,23 @@ class EUeR extends CommonObject
global $conf; global $conf;
$buchungen = array(); $buchungen = array();
// Kundenrechnungen (Einnahmen) // Kundenrechnungen (Einnahmen) - nach Zahlungsdatum
// Zahlungsdatum liegt in llx_paiement!
if ($typ == 'alle' || $typ == 'einnahme') { if ($typ == 'alle' || $typ == 'einnahme') {
$sql = "SELECT 'einnahme' as buchungstyp, f.rowid, f.ref,"; $sql = "SELECT 'einnahme' as buchungstyp, f.rowid, f.ref,";
$sql .= " COALESCE(pf.datep, f.datef) as datum,"; $sql .= " p.datep as datum,";
$sql .= " CONCAT('Rechnung ', f.ref, ' - ', s.nom) as beschreibung,"; $sql .= " CONCAT('Rechnung ', f.ref, ' - ', s.nom) as beschreibung,";
$sql .= " f.total_ht as netto, f.total_tva as steuer, f.total_ttc as brutto,"; $sql .= " pf.amount as brutto,";
$sql .= " (pf.amount * f.total_ht / f.total_ttc) as netto,";
$sql .= " (pf.amount * f.total_tva / f.total_ttc) as steuer,";
$sql .= " s.nom as partner, 'facture' as quelle"; $sql .= " s.nom as partner, 'facture' as quelle";
$sql .= " FROM ".MAIN_DB_PREFIX."facture as f"; $sql .= " FROM ".MAIN_DB_PREFIX."paiement as p";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON p.rowid = pf.fk_paiement";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON pf.fk_facture = f.rowid"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture as f ON pf.fk_facture = f.rowid";
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql .= " WHERE f.entity = ".((int) $conf->entity); $sql .= " WHERE f.entity = ".((int) $conf->entity);
$sql .= " AND f.fk_statut IN (2, 3)"; $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; $sql .= " ORDER BY p.datep";
$sql .= " GROUP BY f.rowid";
$sql .= " ORDER BY datum";
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) { if ($resql) {
@ -363,21 +300,23 @@ class EUeR extends CommonObject
} }
} }
// Lieferantenrechnungen (Ausgaben) // Lieferantenrechnungen (Ausgaben) - nach Zahlungsdatum
// Zahlungsdatum liegt in llx_paiementfourn!
if ($typ == 'alle' || $typ == 'ausgabe') { if ($typ == 'alle' || $typ == 'ausgabe') {
$sql = "SELECT 'ausgabe' as buchungstyp, f.rowid, f.ref,"; $sql = "SELECT 'ausgabe' as buchungstyp, f.rowid, f.ref,";
$sql .= " COALESCE(pf.datep, f.datef) as datum,"; $sql .= " p.datep as datum,";
$sql .= " CONCAT('Lieferantenrechnung ', COALESCE(f.ref_supplier, f.ref), ' - ', s.nom) as beschreibung,"; $sql .= " CONCAT('Lieferantenrechnung ', COALESCE(f.ref_supplier, f.ref), ' - ', s.nom) as beschreibung,";
$sql .= " f.total_ht as netto, f.total_tva as steuer, f.total_ttc as brutto,"; $sql .= " pf.amount as brutto,";
$sql .= " (pf.amount * f.total_ht / f.total_ttc) as netto,";
$sql .= " (pf.amount * f.total_tva / f.total_ttc) as steuer,";
$sql .= " s.nom as partner, 'facture_fourn' as quelle"; $sql .= " s.nom as partner, 'facture_fourn' as quelle";
$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f"; $sql .= " FROM ".MAIN_DB_PREFIX."paiementfourn as p";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON p.rowid = pf.fk_paiementfourn";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid"; $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON pf.fk_facturefourn = f.rowid";
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
$sql .= " WHERE f.entity = ".((int) $conf->entity); $sql .= " WHERE f.entity = ".((int) $conf->entity);
$sql .= " AND f.fk_statut IN (2)"; $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'";
$sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; $sql .= " ORDER BY p.datep";
$sql .= " GROUP BY f.rowid";
$sql .= " ORDER BY datum";
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) { if ($resql) {

View file

@ -76,7 +76,7 @@ class modSteuer extends DolibarrModules
$this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@steuer' $this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@steuer'
// Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z'
$this->version = '1.0'; $this->version = '1.1';
// Url to the file with your last numberversion of this module // Url to the file with your last numberversion of this module
//$this->url_last_version = 'http://www.example.com/versionmodule.txt'; //$this->url_last_version = 'http://www.example.com/versionmodule.txt';
@ -158,7 +158,7 @@ class modSteuer extends DolibarrModules
// Prerequisites // Prerequisites
$this->phpmin = array(7, 1); // Minimum version of PHP required by module $this->phpmin = array(7, 1); // Minimum version of PHP required by module
// $this->phpmax = array(8, 0); // Maximum version of PHP required by module // $this->phpmax = array(8, 0); // Maximum version of PHP required by module
$this->need_dolibarr_version = array(19, -3); // Minimum version of Dolibarr required by module $this->need_dolibarr_version = array(14, 0); // Minimum version of Dolibarr required by module
// $this->max_dolibarr_version = array(19, -3); // Maximum version of Dolibarr required by module // $this->max_dolibarr_version = array(19, -3); // Maximum version of Dolibarr required by module
$this->need_javascript_ajax = 0; $this->need_javascript_ajax = 0;
@ -318,37 +318,21 @@ class modSteuer extends DolibarrModules
// Main menu entries to add // Main menu entries to add
$this->menu = array(); $this->menu = array();
$r = 0; $r = 0;
// Add here entries to declare new menus
/* BEGIN MODULEBUILDER TOPMENU */
$this->menu[$r++] = array(
'fk_menu' => '', // Will be stored into mainmenu + leftmenu. Use '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
'type' => 'top', // This is a Top menu entry
'titre' => 'ModuleSteuerName',
'prefix' => img_picto('', $this->picto, 'class="pictofixedwidth valignmiddle"'),
'mainmenu' => 'steuer',
'leftmenu' => '',
'url' => '/steuer/steuerindex.php',
'langs' => 'steuer@steuer', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
'position' => 1000 + $r,
'enabled' => 'isModEnabled("steuer")', // Define condition to show or hide menu entry. Use 'isModEnabled("steuer")' if entry must be visible if module is enabled.
'perms' => '1', // Use 'perms'=>'$user->hasRight("steuer", "myobject", "read")' if you want your menu with a permission rules
'target' => '',
'user' => 2, // 0=Menu for internal users, 1=external users, 2=both
);
/* END MODULEBUILDER TOPMENU */
// Kein Top-Menü - stattdessen Eintrag unter Buchhaltung (accountancy)
/* BEGIN MODULEBUILDER LEFTMENU */ /* BEGIN MODULEBUILDER LEFTMENU */
// EÜR Übersicht
// Haupteintrag unter Buchhaltung
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy',
'type' => 'left', 'type' => 'left',
'titre' => 'EUeRUebersicht', 'titre' => 'EUeR',
'prefix' => img_picto('', 'fa-chart-pie', 'class="pictofixedwidth"'), 'prefix' => img_picto('', 'fa-calculator', 'class="pictofixedwidth"'),
'mainmenu' => 'steuer', 'mainmenu' => 'accountancy',
'leftmenu' => 'euer_uebersicht', 'leftmenu' => 'steuer_euer',
'url' => '/steuer/steuerindex.php', 'url' => '/steuer/steuerindex.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',
@ -356,30 +340,14 @@ class modSteuer extends DolibarrModules
); );
// Buchungen // Buchungen
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer',
'type' => 'left', 'type' => 'left',
'titre' => 'Buchungen', 'titre' => 'Buchungen',
'prefix' => img_picto('', 'fa-list', 'class="pictofixedwidth"'), 'mainmenu' => 'accountancy',
'mainmenu' => 'steuer', 'leftmenu' => 'steuer_buchungen',
'leftmenu' => 'buchungen',
'url' => '/steuer/buchung_list.php', 'url' => '/steuer/buchung_list.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")',
'perms' => '1',
'target' => '',
'user' => 2,
);
// Neue Buchung
$this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer,fk_leftmenu=buchungen',
'type' => 'left',
'titre' => 'NeueBuchung',
'mainmenu' => 'steuer',
'leftmenu' => 'neue_buchung',
'url' => '/steuer/buchung_card.php?action=create',
'langs' => 'steuer@steuer',
'position' => 1000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',
@ -387,15 +355,14 @@ class modSteuer extends DolibarrModules
); );
// Anlage EÜR // Anlage EÜR
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer',
'type' => 'left', 'type' => 'left',
'titre' => 'AnlageEUeR', 'titre' => 'AnlageEUeR',
'prefix' => img_picto('', 'fa-file-alt', 'class="pictofixedwidth"'), 'mainmenu' => 'accountancy',
'mainmenu' => 'steuer', 'leftmenu' => 'steuer_anlage',
'leftmenu' => 'anlage_euer',
'url' => '/steuer/euer_bericht.php', 'url' => '/steuer/euer_bericht.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',
@ -403,15 +370,14 @@ class modSteuer extends DolibarrModules
); );
// UStVA // UStVA
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer',
'type' => 'left', 'type' => 'left',
'titre' => 'UStVA', 'titre' => 'UStVA',
'prefix' => img_picto('', 'fa-percent', 'class="pictofixedwidth"'), 'mainmenu' => 'accountancy',
'mainmenu' => 'steuer', 'leftmenu' => 'steuer_ustva',
'leftmenu' => 'ustva',
'url' => '/steuer/ustva.php', 'url' => '/steuer/ustva.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',
@ -419,15 +385,14 @@ class modSteuer extends DolibarrModules
); );
// Gewerbesteuer // Gewerbesteuer
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer',
'type' => 'left', 'type' => 'left',
'titre' => 'Gewerbesteuer', 'titre' => 'Gewerbesteuer',
'prefix' => img_picto('', 'fa-building', 'class="pictofixedwidth"'), 'mainmenu' => 'accountancy',
'mainmenu' => 'steuer', 'leftmenu' => 'steuer_gewerbe',
'leftmenu' => 'gewerbesteuer',
'url' => '/steuer/gewerbesteuer.php', 'url' => '/steuer/gewerbesteuer.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',
@ -435,15 +400,14 @@ class modSteuer extends DolibarrModules
); );
// WISO Export // WISO Export
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer',
'type' => 'left', 'type' => 'left',
'titre' => 'WISOExport', 'titre' => 'WISOExport',
'prefix' => img_picto('', 'fa-download', 'class="pictofixedwidth"'), 'mainmenu' => 'accountancy',
'mainmenu' => 'steuer', 'leftmenu' => 'steuer_wiso',
'leftmenu' => 'wiso_export',
'url' => '/steuer/export_wiso.php', 'url' => '/steuer/export_wiso.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',
@ -451,15 +415,14 @@ class modSteuer extends DolibarrModules
); );
// Kontenplan // Kontenplan
$this->menu[$r++] = array( $this->menu[$r++] = array(
'fk_menu' => 'fk_mainmenu=steuer', 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer',
'type' => 'left', 'type' => 'left',
'titre' => 'Kontenplan', 'titre' => 'Kontenplan',
'prefix' => img_picto('', 'fa-sitemap', 'class="pictofixedwidth"'), 'mainmenu' => 'accountancy',
'mainmenu' => 'steuer', 'leftmenu' => 'steuer_konten',
'leftmenu' => 'kontenplan',
'url' => '/steuer/konten.php', 'url' => '/steuer/konten.php',
'langs' => 'steuer@steuer', 'langs' => 'steuer@steuer',
'position' => 1000 + $r, 'position' => 2000 + $r,
'enabled' => 'isModEnabled("steuer")', 'enabled' => 'isModEnabled("steuer")',
'perms' => '1', 'perms' => '1',
'target' => '', 'target' => '',

View file

@ -10,9 +10,9 @@ CREATE TABLE IF NOT EXISTS llx_steuer_konto (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
kontonummer VARCHAR(10) NOT NULL, kontonummer VARCHAR(10) NOT NULL,
bezeichnung VARCHAR(255) NOT NULL, bezeichnung VARCHAR(255) NOT NULL,
kategorie VARCHAR(50) NOT NULL, -- 'einnahme', 'ausgabe', 'ust', 'vorsteuer' kategorie VARCHAR(50) NOT NULL,
euer_zeile INTEGER DEFAULT NULL, -- Zeile in Anlage EÜR euer_zeile INTEGER DEFAULT NULL,
ust_kennzeichen VARCHAR(10) DEFAULT NULL, -- USt-Kennzeichen für UStVA ust_kennzeichen VARCHAR(10) DEFAULT NULL,
aktiv TINYINT(1) DEFAULT 1, aktiv TINYINT(1) DEFAULT 1,
entity INTEGER DEFAULT 1, entity INTEGER DEFAULT 1,
UNIQUE KEY uk_konto_nummer (kontonummer, entity) UNIQUE KEY uk_konto_nummer (kontonummer, entity)
@ -23,26 +23,26 @@ CREATE TABLE IF NOT EXISTS llx_steuer_konto (
-- ============================================================================ -- ============================================================================
CREATE TABLE IF NOT EXISTS llx_steuer_buchung ( CREATE TABLE IF NOT EXISTS llx_steuer_buchung (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
ref VARCHAR(30) NOT NULL, -- Buchungsnummer ref VARCHAR(30) NOT NULL,
datum DATE NOT NULL, -- Belegdatum datum DATE NOT NULL,
belegnummer VARCHAR(50) DEFAULT NULL, -- Externe Belegnummer belegnummer VARCHAR(50) DEFAULT NULL,
beschreibung VARCHAR(255) NOT NULL, beschreibung VARCHAR(255) NOT NULL,
fk_konto INTEGER NOT NULL, -- Verweis auf llx_steuer_konto fk_konto INTEGER NOT NULL,
betrag_netto DOUBLE(24,8) DEFAULT 0, betrag_netto DECIMAL(24,8) DEFAULT 0,
betrag_ust DOUBLE(24,8) DEFAULT 0, -- USt/VSt Betrag betrag_ust DECIMAL(24,8) DEFAULT 0,
betrag_brutto DOUBLE(24,8) DEFAULT 0, betrag_brutto DECIMAL(24,8) DEFAULT 0,
ust_satz DOUBLE(5,2) DEFAULT 0, -- 0, 7, 19 ust_satz DECIMAL(5,2) DEFAULT 0,
typ VARCHAR(20) NOT NULL, -- 'einnahme', 'ausgabe' typ VARCHAR(20) NOT NULL,
zahlungsart VARCHAR(30) DEFAULT NULL, -- 'bar', 'bank', 'paypal', etc. zahlungsart VARCHAR(30) DEFAULT NULL,
fk_soc INTEGER DEFAULT NULL, -- Verknüpfung zu Kunde/Lieferant fk_soc INTEGER DEFAULT NULL,
fk_facture INTEGER DEFAULT NULL, -- Verknüpfung zu Rechnung fk_facture INTEGER DEFAULT NULL,
fk_facture_fourn INTEGER DEFAULT NULL, -- Verknüpfung zu Lieferantenrechnung fk_facture_fourn INTEGER DEFAULT NULL,
note_private TEXT, note_private TEXT,
date_creation DATETIME, date_creation DATETIME,
tms TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, tms TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
fk_user_creat INTEGER, fk_user_creat INTEGER,
fk_user_modif INTEGER, fk_user_modif INTEGER,
status TINYINT(4) DEFAULT 1, -- 0=Entwurf, 1=Gebucht status TINYINT(4) DEFAULT 1,
entity INTEGER DEFAULT 1, entity INTEGER DEFAULT 1,
INDEX idx_buchung_datum (datum), INDEX idx_buchung_datum (datum),
INDEX idx_buchung_konto (fk_konto), INDEX idx_buchung_konto (fk_konto),
@ -56,30 +56,21 @@ CREATE TABLE IF NOT EXISTS llx_steuer_buchung (
CREATE TABLE IF NOT EXISTS llx_steuer_ustva ( CREATE TABLE IF NOT EXISTS llx_steuer_ustva (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
jahr INTEGER NOT NULL, jahr INTEGER NOT NULL,
periode VARCHAR(10) NOT NULL, -- '01'-'12' für Monat, 'Q1'-'Q4' für Quartal periode VARCHAR(10) NOT NULL,
periode_typ VARCHAR(10) NOT NULL, -- 'monat' oder 'quartal' periode_typ VARCHAR(10) NOT NULL,
kz81 DECIMAL(24,8) DEFAULT 0,
-- Lieferungen und Leistungen kz86 DECIMAL(24,8) DEFAULT 0,
kz81 DOUBLE(24,8) DEFAULT 0, -- Steuerpfl. Umsätze 19% kz35 DECIMAL(24,8) DEFAULT 0,
kz86 DOUBLE(24,8) DEFAULT 0, -- Steuerpfl. Umsätze 7% kz36 DECIMAL(24,8) DEFAULT 0,
kz35 DOUBLE(24,8) DEFAULT 0, -- Steuerpfl. Umsätze andere Sätze kz41 DECIMAL(24,8) DEFAULT 0,
kz36 DOUBLE(24,8) DEFAULT 0, -- USt auf Kz35 kz44 DECIMAL(24,8) DEFAULT 0,
kz66 DECIMAL(24,8) DEFAULT 0,
-- Steuerfreie Umsätze kz61 DECIMAL(24,8) DEFAULT 0,
kz41 DOUBLE(24,8) DEFAULT 0, -- Innergemeinschaftl. Lieferungen kz67 DECIMAL(24,8) DEFAULT 0,
kz44 DOUBLE(24,8) DEFAULT 0, -- Steuerfreie Ausfuhrlieferungen ust_summe DECIMAL(24,8) DEFAULT 0,
vst_summe DECIMAL(24,8) DEFAULT 0,
-- Vorsteuer zahllast DECIMAL(24,8) DEFAULT 0,
kz66 DOUBLE(24,8) DEFAULT 0, -- Vorsteuer aus Rechnungen status TINYINT(4) DEFAULT 0,
kz61 DOUBLE(24,8) DEFAULT 0, -- Vorsteuer aus igE
kz67 DOUBLE(24,8) DEFAULT 0, -- Vorsteuer nach § 13b
-- Berechnung
ust_summe DOUBLE(24,8) DEFAULT 0, -- Summe USt
vst_summe DOUBLE(24,8) DEFAULT 0, -- Summe VSt
zahllast DOUBLE(24,8) DEFAULT 0, -- USt - VSt (positiv = Zahllast)
status TINYINT(4) DEFAULT 0, -- 0=Entwurf, 1=Berechnet, 2=Übermittelt
uebermittelt_am DATE DEFAULT NULL, uebermittelt_am DATE DEFAULT NULL,
note_private TEXT, note_private TEXT,
date_creation DATETIME, date_creation DATETIME,
@ -95,15 +86,15 @@ CREATE TABLE IF NOT EXISTS llx_steuer_ustva (
CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe ( CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
jahr INTEGER NOT NULL, jahr INTEGER NOT NULL,
gewinn_euer DOUBLE(24,8) DEFAULT 0, -- Gewinn aus EÜR gewinn_euer DECIMAL(24,8) DEFAULT 0,
hinzurechnungen DOUBLE(24,8) DEFAULT 0, -- § 8 GewStG hinzurechnungen DECIMAL(24,8) DEFAULT 0,
kuerzungen DOUBLE(24,8) DEFAULT 0, -- § 9 GewStG kuerzungen DECIMAL(24,8) DEFAULT 0,
gewerbeertrag DOUBLE(24,8) DEFAULT 0, -- Nach Freibetrag gewerbeertrag DECIMAL(24,8) DEFAULT 0,
freibetrag DOUBLE(24,8) DEFAULT 24500, -- Freibetrag Einzelunternehmen freibetrag DECIMAL(24,8) DEFAULT 24500,
hebesatz DOUBLE(5,2) DEFAULT 400, -- Gemeinde-Hebesatz in % hebesatz DECIMAL(5,2) DEFAULT 400,
steuermessbetrag DOUBLE(24,8) DEFAULT 0, steuermessbetrag DECIMAL(24,8) DEFAULT 0,
gewerbesteuer DOUBLE(24,8) DEFAULT 0, gewerbesteuer DECIMAL(24,8) DEFAULT 0,
anrechnung_est DOUBLE(24,8) DEFAULT 0, -- Anrechnung auf ESt anrechnung_est DECIMAL(24,8) DEFAULT 0,
status TINYINT(4) DEFAULT 0, status TINYINT(4) DEFAULT 0,
note_private TEXT, note_private TEXT,
date_creation DATETIME, date_creation DATETIME,
@ -112,91 +103,3 @@ CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe (
entity INTEGER DEFAULT 1, entity INTEGER DEFAULT 1,
UNIQUE KEY uk_jahr (jahr, entity) UNIQUE KEY uk_jahr (jahr, entity)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
-- ============================================================================
-- Standard EÜR-Konten nach SKR03 einfügen
-- ============================================================================
-- EINNAHMEN
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('8400', 'Erlöse 19% USt', 'einnahme', 14, '81'),
('8300', 'Erlöse 7% USt', 'einnahme', 14, '86'),
('8100', 'Steuerfreie Umsätze Inland', 'einnahme', 10, NULL),
('8120', 'Steuerfreie igL', 'einnahme', 11, '41'),
('8150', 'Steuerfreie Ausfuhrlieferungen', 'einnahme', 12, '44'),
('8200', 'Erlöse ohne USt §19', 'einnahme', 14, NULL),
('8500', 'Provisionserlöse', 'einnahme', 14, '81'),
('8600', 'Sonstige Erlöse', 'einnahme', 16, '81'),
('8700', 'Erlöse aus VuV', 'einnahme', 17, NULL),
('8800', 'Zinserträge', 'einnahme', 18, NULL),
('8900', 'Privatentnahmen Sachen', 'einnahme', 19, '81'),
('8910', 'Private Kfz-Nutzung', 'einnahme', 19, '81'),
('8920', 'Private Telefonnutzung', 'einnahme', 19, '81');
-- AUSGABEN - Wareneinkauf
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('3400', 'Wareneingang 19% VSt', 'ausgabe', 26, '66'),
('3300', 'Wareneingang 7% VSt', 'ausgabe', 26, '66'),
('3100', 'Wareneingang steuerfrei', 'ausgabe', 26, NULL);
-- AUSGABEN - Personal
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('4100', 'Löhne und Gehälter', 'ausgabe', 31, NULL),
('4130', 'Gesetzliche Sozialaufwendungen', 'ausgabe', 32, NULL),
('4140', 'Freiwillige Sozialaufwendungen', 'ausgabe', 33, NULL);
-- AUSGABEN - Raumkosten
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('4200', 'Raumkosten/Miete', 'ausgabe', 34, '66'),
('4210', 'Miete Geschäftsräume', 'ausgabe', 34, '66'),
('4230', 'Heizung', 'ausgabe', 34, '66'),
('4240', 'Gas, Strom, Wasser', 'ausgabe', 34, '66'),
('4250', 'Reinigung', 'ausgabe', 34, '66'),
('4260', 'Instandhaltung Räume', 'ausgabe', 34, '66');
-- AUSGABEN - Sonstige Betriebsausgaben
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('4500', 'Fahrzeugkosten', 'ausgabe', 51, '66'),
('4510', 'Kfz-Steuer', 'ausgabe', 51, NULL),
('4520', 'Kfz-Versicherung', 'ausgabe', 51, NULL),
('4530', 'Kraftstoff', 'ausgabe', 51, '66'),
('4540', 'Kfz-Reparaturen', 'ausgabe', 51, '66'),
('4580', 'Sonstige Kfz-Kosten', 'ausgabe', 51, '66'),
('4600', 'Werbekosten', 'ausgabe', 53, '66'),
('4610', 'Geschenke abzugsfähig', 'ausgabe', 54, '66'),
('4630', 'Geschenke nicht abzugsfähig', 'ausgabe', 55, '66'),
('4650', 'Bewirtungskosten 70%', 'ausgabe', 56, '66'),
('4660', 'Reisekosten Unternehmer', 'ausgabe', 57, NULL),
('4670', 'Reisekosten Arbeitnehmer', 'ausgabe', 58, '66'),
('4700', 'Porto', 'ausgabe', 49, '66'),
('4710', 'Telefon', 'ausgabe', 49, '66'),
('4750', 'Bürobedarf', 'ausgabe', 49, '66'),
('4780', 'Fremdleistungen', 'ausgabe', 49, '66'),
('4790', 'Sonstige Betriebsausgaben', 'ausgabe', 49, '66'),
('4800', 'Reparatur/Instandhaltung', 'ausgabe', 39, '66'),
('4830', 'Versicherungen', 'ausgabe', 46, NULL),
('4840', 'Beiträge IHK/Verbände', 'ausgabe', 47, NULL),
('4850', 'Fortbildungskosten', 'ausgabe', 48, '66'),
('4900', 'Rechts- und Beratungskosten', 'ausgabe', 50, '66'),
('4910', 'Buchführungskosten', 'ausgabe', 50, '66'),
('4920', 'Jahresabschlusskosten', 'ausgabe', 50, '66'),
('4940', 'Bankgebühren', 'ausgabe', 48, NULL),
('4950', 'Nebenkosten Geldverkehr', 'ausgabe', 48, NULL),
('4960', 'Miete für Einrichtungen', 'ausgabe', 38, '66'),
('4970', 'Leasing', 'ausgabe', 38, '66'),
('4980', 'Software/Lizenzen', 'ausgabe', 39, '66');
-- AUSGABEN - AfA
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('4820', 'AfA Sachanlagen', 'ausgabe', 36, NULL),
('4822', 'AfA immaterielle WG', 'ausgabe', 37, NULL),
('4824', 'AfA GWG', 'ausgabe', 38, NULL),
('4826', 'Sonderabschreibungen', 'ausgabe', 38, NULL);
-- AUSGABEN - Zinsen
INSERT IGNORE INTO llx_steuer_konto (kontonummer, bezeichnung, kategorie, euer_zeile, ust_kennzeichen) VALUES
('2100', 'Zinsaufwendungen', 'ausgabe', 45, NULL),
('2110', 'Zinsen langfristige Darlehen', 'ausgabe', 45, NULL);

View file

@ -1,17 +1,17 @@
-- Copyright (C) 2026 Eduard Wisch -- Copyright (C) 2026 Eduard Wisch
-- Table for EÜR Buchungen -- Table for EÜR Buchungen
CREATE TABLE IF NOT EXISTS llx_steuer_buchung ( CREATE TABLE llx_steuer_buchung (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
ref VARCHAR(30) NOT NULL, ref VARCHAR(30) NOT NULL,
datum DATE NOT NULL, datum DATE NOT NULL,
belegnummer VARCHAR(50) DEFAULT NULL, belegnummer VARCHAR(50) DEFAULT NULL,
beschreibung VARCHAR(255) NOT NULL, beschreibung VARCHAR(255) NOT NULL,
fk_konto INTEGER NOT NULL, fk_konto INTEGER NOT NULL,
betrag_netto DOUBLE(24,8) DEFAULT 0, betrag_netto DECIMAL(24,8) DEFAULT 0,
betrag_ust DOUBLE(24,8) DEFAULT 0, betrag_ust DECIMAL(24,8) DEFAULT 0,
betrag_brutto DOUBLE(24,8) DEFAULT 0, betrag_brutto DECIMAL(24,8) DEFAULT 0,
ust_satz DOUBLE(5,2) DEFAULT 0, ust_satz DECIMAL(5,2) DEFAULT 0,
typ VARCHAR(20) NOT NULL, typ VARCHAR(20) NOT NULL,
zahlungsart VARCHAR(30) DEFAULT NULL, zahlungsart VARCHAR(30) DEFAULT NULL,
fk_soc INTEGER DEFAULT NULL, fk_soc INTEGER DEFAULT NULL,

View file

@ -1,18 +1,18 @@
-- Copyright (C) 2026 Eduard Wisch -- Copyright (C) 2026 Eduard Wisch
-- Table for Gewerbesteuer -- Table for Gewerbesteuer
CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe ( CREATE TABLE llx_steuer_gewerbe (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
jahr INTEGER NOT NULL, jahr INTEGER NOT NULL,
gewinn_euer DOUBLE(24,8) DEFAULT 0, gewinn_euer DECIMAL(24,8) DEFAULT 0,
hinzurechnungen DOUBLE(24,8) DEFAULT 0, hinzurechnungen DECIMAL(24,8) DEFAULT 0,
kuerzungen DOUBLE(24,8) DEFAULT 0, kuerzungen DECIMAL(24,8) DEFAULT 0,
gewerbeertrag DOUBLE(24,8) DEFAULT 0, gewerbeertrag DECIMAL(24,8) DEFAULT 0,
freibetrag DOUBLE(24,8) DEFAULT 24500, freibetrag DECIMAL(24,8) DEFAULT 24500,
hebesatz DOUBLE(5,2) DEFAULT 400, hebesatz DECIMAL(5,2) DEFAULT 400,
steuermessbetrag DOUBLE(24,8) DEFAULT 0, steuermessbetrag DECIMAL(24,8) DEFAULT 0,
gewerbesteuer DOUBLE(24,8) DEFAULT 0, gewerbesteuer DECIMAL(24,8) DEFAULT 0,
anrechnung_est DOUBLE(24,8) DEFAULT 0, anrechnung_est DECIMAL(24,8) DEFAULT 0,
status TINYINT(4) DEFAULT 0, status TINYINT(4) DEFAULT 0,
note_private TEXT, note_private TEXT,
date_creation DATETIME, date_creation DATETIME,

View file

@ -1,7 +1,7 @@
-- Copyright (C) 2026 Eduard Wisch -- Copyright (C) 2026 Eduard Wisch
-- Table for EÜR Kontenrahmen (SKR03) -- Table for EÜR Kontenrahmen (SKR03)
CREATE TABLE IF NOT EXISTS llx_steuer_konto ( CREATE TABLE llx_steuer_konto (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
kontonummer VARCHAR(10) NOT NULL, kontonummer VARCHAR(10) NOT NULL,
bezeichnung VARCHAR(255) NOT NULL, bezeichnung VARCHAR(255) NOT NULL,

View file

@ -1,23 +1,23 @@
-- Copyright (C) 2026 Eduard Wisch -- Copyright (C) 2026 Eduard Wisch
-- Table for USt-Voranmeldung Perioden -- Table for USt-Voranmeldung Perioden
CREATE TABLE IF NOT EXISTS llx_steuer_ustva ( CREATE TABLE llx_steuer_ustva (
rowid INTEGER AUTO_INCREMENT PRIMARY KEY, rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
jahr INTEGER NOT NULL, jahr INTEGER NOT NULL,
periode VARCHAR(10) NOT NULL, periode VARCHAR(10) NOT NULL,
periode_typ VARCHAR(10) NOT NULL, periode_typ VARCHAR(10) NOT NULL,
kz81 DOUBLE(24,8) DEFAULT 0, kz81 DECIMAL(24,8) DEFAULT 0,
kz86 DOUBLE(24,8) DEFAULT 0, kz86 DECIMAL(24,8) DEFAULT 0,
kz35 DOUBLE(24,8) DEFAULT 0, kz35 DECIMAL(24,8) DEFAULT 0,
kz36 DOUBLE(24,8) DEFAULT 0, kz36 DECIMAL(24,8) DEFAULT 0,
kz41 DOUBLE(24,8) DEFAULT 0, kz41 DECIMAL(24,8) DEFAULT 0,
kz44 DOUBLE(24,8) DEFAULT 0, kz44 DECIMAL(24,8) DEFAULT 0,
kz66 DOUBLE(24,8) DEFAULT 0, kz66 DECIMAL(24,8) DEFAULT 0,
kz61 DOUBLE(24,8) DEFAULT 0, kz61 DECIMAL(24,8) DEFAULT 0,
kz67 DOUBLE(24,8) DEFAULT 0, kz67 DECIMAL(24,8) DEFAULT 0,
ust_summe DOUBLE(24,8) DEFAULT 0, ust_summe DECIMAL(24,8) DEFAULT 0,
vst_summe DOUBLE(24,8) DEFAULT 0, vst_summe DECIMAL(24,8) DEFAULT 0,
zahllast DOUBLE(24,8) DEFAULT 0, zahllast DECIMAL(24,8) DEFAULT 0,
status TINYINT(4) DEFAULT 0, status TINYINT(4) DEFAULT 0,
uebermittelt_am DATE DEFAULT NULL, uebermittelt_am DATE DEFAULT NULL,
note_private TEXT, note_private TEXT,