diff --git a/README.md b/README.md index 561ce73..6c6b714 100755 --- a/README.md +++ b/README.md @@ -95,6 +95,122 @@ Das Modul liest automatisch aus: - Kz 66 → Vorsteuer - 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 Das Modul erstellt folgende Tabellen: diff --git a/admin/setup.php b/admin/setup.php index 0d9fc81..0357c56 100755 --- a/admin/setup.php +++ b/admin/setup.php @@ -1,35 +1,15 @@ - * Copyright (C) 2024 Frédéric France - * Copyright (C) 2026 Eduard Wisch - * - * 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 . - */ - /** - * \file steuer/admin/setup.php - * \ingroup steuer - * \brief Steuer setup page. + * EÜR Modul - Einstellungen + * + * @package steuer */ // Load Dolibarr environment $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"])) { $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']; $tmp2 = realpath(__FILE__); $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")) { $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")) { $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"); } -// Libraries -require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php"; -require_once '../lib/steuer.lib.php'; -//require_once "../class/myclass.class.php"; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; -/** - * @var Conf $conf - * @var DoliDB $db - * @var HookManager $hookmanager - * @var Translate $langs - * @var User $user - */ +$langs->loadLangs(array("steuer@steuer", "admin")); -// Translations -$langs->loadLangs(array("admin", "steuer@steuer")); +// Security check +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'); -$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 */ -// For retrocompatibility Dolibarr < 15.0 -if (versioncompare(explode('.', DOL_VERSION), array(15)) < 0 && $action == 'update' && !empty($user->admin)) { - $formSetup->saveConfFromPost(); -} +if ($action == 'update') { + $error = 0; -include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; - -if ($action == 'updateMask') { - $maskconst = GETPOST('maskconst', 'aZ09'); - $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 Hebesatz + $hebesatz = GETPOSTINT('STEUER_GEWERBE_HEBESATZ'); + if ($hebesatz >= 200 && $hebesatz <= 900) { + dolibarr_set_const($db, 'STEUER_GEWERBE_HEBESATZ', $hebesatz, 'chaine', 0, '', $conf->entity); } + // 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) { setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { 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 */ $form = new Form($db); -$help_url = ''; -$title = "SteuerSetup"; +$page_name = "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 = ''.$langs->trans("BackToModuleList").''; +print load_fiche_titre($langs->trans($page_name), $linkback, 'fa-calculator'); -// Subheader -$linkback = ''.$langs->trans("BackToModuleList").''; +print '
'; +print ''; +print ''; -print load_fiche_titre($langs->trans($title), $linkback, 'title_setup'); +// Firmendaten für Steuern +print '
'; +print ''; -// Configuration header -$head = steuerAdminPrepareHead(); -print dol_get_fiche_head($head, 'settings', $langs->trans($title), -1, "steuer@steuer"); +print ''; +print ''; +print ''; -// Setup page goes here -echo ''.$langs->trans("SteuerSetupPage").'

'; +// Steuernummer +print ''; +print ''; +print ''; +print ''; +// USt-ID +print ''; +print ''; +print ''; +print ''; -/*if ($action == 'edit') { - print $formSetup->generateOutput(true); - print '
'; - } elseif (!empty($formSetup->items)) { - print $formSetup->generateOutput(); - print '
'; - print ''.$langs->trans("Modify").''; - print '
'; - } - */ -if (!empty($formSetup->items)) { - print $formSetup->generateOutput(true); - print '
'; -} +// Finanzamt +print ''; +print ''; +print ''; +print ''; +print '
'.$langs->trans("CompanyTaxInfo").'
'.$langs->trans("TaxNumber").''; +print ''; +print '
'.$langs->trans("VATIntra").''; +print ''; +print '
'.$langs->trans("TaxOffice").''; +print ''; +print '
'; +print '
'; -foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) { - if (!empty($myTmpObjectArray['includerefgeneration'])) { - // Numbering models +print '
'; - $setupnotempty++; +// USt-Einstellungen +print '
'; +print ''; - print load_fiche_titre($langs->trans("NumberingModules", $myTmpObjectArray['label']), '', ''); +print ''; +print ''; +print ''; - print '
'.$langs->trans("VATSettings").'
'; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''."\n"; +// Ist-Versteuerung +print ''; +print ''; +print ''; +print ''; - clearstatcache(); +// UStVA Zeitraum +print ''; +print ''; +print ''; +print ''; - foreach ($dirmodels as $reldir) { - $dir = dol_buildpath($reldir."core/modules/".$moduledir); +print '
'.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Example").''.$langs->trans("Status").''.$langs->trans("ShortInfo").'
'.$langs->trans("IstVersteuerung").''; +$ist_versteuerung = getDolGlobalInt('STEUER_IST_VERSTEUERUNG', 1); +print ''; +print '
'.$langs->trans("UStVAZeitraum").''; +$ustva_zeitraum = getDolGlobalString('STEUER_USTVA_ZEITRAUM', 'monat'); +print ''; +print '
'; +print '
'; - if (is_dir($dir)) { - $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); +print '
'; - require_once $dir.'/'.$file.'.php'; +// Gewerbesteuer-Einstellungen +print '
'; +print ''; - $module = new $file($db); - '@phan-var-force ModeleNumRefMyObject $module'; +print ''; +print ''; +print ''; - // Show modules according to features level - if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) { - continue; - } - if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) { - continue; - } +// Hebesatz +print ''; +print ''; +print ''; +print ''; - if ($module->isEnabled()) { - dol_include_once('/'.$moduledir.'/class/'.strtolower($myTmpObjectKey).'.class.php'); +// Freibetrag +print ''; +print ''; +print ''; +print ''; - print ''; +print '
'.$langs->trans("GewerbesteuerSettings").'
'.$langs->trans("Hebesatz").''; +$hebesatz = getDolGlobalInt('STEUER_GEWERBE_HEBESATZ', 400); +print ' %'; +print '
Hebesatz Ihrer Gemeinde (z.B. 400% = 400)'; +print '
'.$langs->trans("Freibetrag").''; +$freibetrag = getDolGlobalInt('STEUER_GEWERBE_FREIBETRAG', 24500); +print ' EUR'; +print '
Freibetrag (24.500 EUR für natürliche Personen und Personengesellschaften)'; +print '
'.$module->getName($langs)."\n"; - print $module->info($langs); - print '
'; +print '
'; - // Show example of numbering model - print ''; - $tmp = $module->getExample(); - if (preg_match('/^Error/', $tmp)) { - $langs->load("errors"); - print '
'.$langs->trans($tmp).'
'; - } elseif ($tmp == 'NotConfigured') { - print $langs->trans($tmp); - } else { - print $tmp; - } - print ''."\n"; +print '
'; - print ''; - $constforvar = 'STEUER_'.strtoupper($myTmpObjectKey).'_ADDON'; - $defaultifnotset = 'thevaluetousebydefault'; - $activenumberingmodel = getDolGlobalString($constforvar, $defaultifnotset); - if ($activenumberingmodel == $file) { - print img_picto($langs->trans("Activated"), 'switch_on'); - } else { - print ''; - print img_picto($langs->trans("Disabled"), 'switch_off'); - print ''; - } - print ''; +print '
'; +print ''; +print '
'; - $className = $myTmpObjectArray['class']; - $mytmpinstance = new $className($db); - '@phan-var-force MyObject $mytmpinstance'; - $mytmpinstance->initAsSpecimen(); +print '
'; - // Info - $htmltooltip = ''; - $htmltooltip .= ''.$langs->trans("Version").': '.$module->getVersion().'
'; - - $nextval = $module->getNextValue($mytmpinstance); - if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval - $htmltooltip .= ''.$langs->trans("NextValue").': '; - if ($nextval) { - if (preg_match('/^Error/', $nextval) || $nextval == 'NotConfigured') { - $nextval = $langs->trans($nextval); - } - $htmltooltip .= $nextval.'
'; - } else { - $htmltooltip .= $langs->trans($module->error).'
'; - } - } - - print ''; - print $form->textwithpicto('', $htmltooltip, 1, 'info'); - print ''; - - print "\n"; - } - } - } - closedir($handle); - } - } - } - print "
\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 ''."\n"; - print ''."\n"; - print ''; - print ''; - print '\n"; - print '\n"; - print ''; - print ''; - print "\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 ''; - - // Active - if (in_array($name, $def)) { - print ''; - } else { - print '"; - } - - // Default - print ''; - - // Info - $htmltooltip = ''.$langs->trans("Name").': '.$module->name; - $htmltooltip .= '
'.$langs->trans("Type").': '.($module->type ? $module->type : $langs->trans("Unknown")); - if ($module->type == 'pdf') { - $htmltooltip .= '
'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur; - } - $htmltooltip .= '
'.$langs->trans("Path").': '.preg_replace('/^\//', '', $realpath).'/'.$file; - - $htmltooltip .= '

'.$langs->trans("FeaturesSupported").':'; - $htmltooltip .= '
'.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1); - $htmltooltip .= '
'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang, 1, 1); - - print ''; - - // Preview - print ''; - - print "\n"; - } - } - } - } - } - } - } - } - - print '
'.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Status")."'.$langs->trans("Default")."'.$langs->trans("ShortInfo").''.$langs->trans("Preview").'
'; - print(empty($module->name) ? $name : $module->name); - print "\n"; - if (method_exists($module, 'info')) { - print $module->info($langs); // @phan-suppress-current-line PhanUndeclaredMethod - } else { - print $module->description; - } - print ''."\n"; - print ''; - print img_picto($langs->trans("Enabled"), 'switch_on'); - print ''; - print ''."\n"; - print 'scandir).'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"), 'switch_off').''; - print "'; - $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 'scandir).'&label='.urlencode($module->name).'&type='.urlencode($type).'" alt="'.$langs->trans("Disable").'">'.img_picto($langs->trans("Enabled"), 'on').''; - } else { - print 'scandir).'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').''; - } - print ''; - print $form->textwithpicto('', $htmltooltip, 1, 'info'); - print ''; - if ($module->type == 'pdf') { - $newname = preg_replace('/_'.preg_quote(strtolower($myTmpObjectKey), '/').'/', '', $name); - print ''.img_object($langs->trans("Preview"), 'pdf').''; - } else { - print img_object($langs->transnoentitiesnoconv("PreviewNotAvailable"), 'generic'); - } - print '
'; - } -} - -if (empty($setupnotempty)) { - print '
'.$langs->trans("NothingToSetup"); -} - -// Page end -print dol_get_fiche_end(); +// Modul-Info +print '
'; +print '
'; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print '
'.$langs->trans("ModuleInfo").'
'.$langs->trans("Version").'1.0
'.$langs->trans("Author").'Eduard Wisch - Data IT Solution
'.$langs->trans("Description").''.$langs->trans("ModuleSteuerDesc").'
'; +print '
'; llxFooter(); $db->close(); diff --git a/buchung_list.php b/buchung_list.php index 66245c2..85057ec 100644 --- a/buchung_list.php +++ b/buchung_list.php @@ -118,47 +118,51 @@ if ($search_beschreibung) { $sql .= " AND b.beschreibung LIKE '%".$db->escape($search_beschreibung)."%'"; } -// UNION mit Rechnungen (Einnahmen) -$sql .= " UNION ALL "; -$sql .= "SELECT f.rowid, f.ref, COALESCE(pf.datep, f.datef) as datum, f.ref as belegnummer,"; -$sql .= " CONCAT('Rechnung: ', s.nom) as beschreibung,"; -$sql .= " f.total_ht as betrag_netto, f.total_tva as betrag_ust, f.total_ttc as betrag_brutto,"; -$sql .= " 'einnahme' as typ, '' as kontonummer, '' as konto_bezeichnung,"; -$sql .= " 'facture' as quelle"; -$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 .= " WHERE f.entity = ".((int) $conf->entity); -$sql .= " AND f.fk_statut IN (2, 3)"; -$sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'"; -if ($typ == 'ausgabe') { - $sql .= " AND 1=0"; // Keine Einnahmen bei Ausgaben-Filter +// UNION mit Kundenzahlungen (Einnahmen) - Ist-Versteuerung/Zufluss-Prinzip +// Zahlungsdatum liegt in llx_paiement, nicht in llx_paiement_facture! +if ($typ != 'ausgabe') { + $sql .= " UNION ALL "; + $sql .= "SELECT f.rowid, f.ref, p.datep as datum,"; + $sql .= " f.ref as belegnummer,"; + $sql .= " CONCAT('Zahlung: ', s.nom) as beschreibung,"; + $sql .= " (pf.amount * f.total_ht / f.total_ttc) as betrag_netto,"; + $sql .= " (pf.amount * f.total_tva / f.total_ttc) as betrag_ust,"; + $sql .= " pf.amount as betrag_brutto,"; + $sql .= " 'einnahme' as typ, '' as kontonummer, '' as konto_bezeichnung,"; + $sql .= " 'facture' as quelle"; + $sql .= " FROM ".MAIN_DB_PREFIX."paiement as p"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON p.rowid = pf.fk_paiement"; + $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) -$sql .= " UNION ALL "; -$sql .= "SELECT f.rowid, f.ref, COALESCE(pf.datep, f.datef) as datum, COALESCE(f.ref_supplier, f.ref) as belegnummer,"; -$sql .= " CONCAT('Lieferant: ', s.nom) as beschreibung,"; -$sql .= " f.total_ht as betrag_netto, f.total_tva as betrag_ust, f.total_ttc as betrag_brutto,"; -$sql .= " 'ausgabe' as typ, '' as kontonummer, '' as konto_bezeichnung,"; -$sql .= " 'facture_fourn' as quelle"; -$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 .= " WHERE f.entity = ".((int) $conf->entity); -$sql .= " AND f.fk_statut IN (2)"; -$sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'"; -if ($typ == 'einnahme') { - $sql .= " AND 1=0"; // Keine Ausgaben bei Einnahmen-Filter +// UNION mit Lieferantenzahlungen (Ausgaben) - Ist-Versteuerung/Abfluss-Prinzip +// Zahlungsdatum liegt in llx_paiementfourn, nicht in llx_paiementfourn_facturefourn! +if ($typ != 'einnahme') { + $sql .= " UNION ALL "; + $sql .= "SELECT f.rowid, f.ref, p.datep as datum,"; + $sql .= " COALESCE(f.ref_supplier, f.ref) as belegnummer,"; + $sql .= " CONCAT('Zahlung: ', s.nom) as beschreibung,"; + $sql .= " (pf.amount * f.total_ht / f.total_ttc) as betrag_netto,"; + $sql .= " (pf.amount * f.total_tva / f.total_ttc) as betrag_ust,"; + $sql .= " pf.amount as betrag_brutto,"; + $sql .= " 'ausgabe' as typ, '' as kontonummer, '' as konto_bezeichnung,"; + $sql .= " 'facture_fourn' as quelle"; + $sql .= " FROM ".MAIN_DB_PREFIX."paiementfourn as p"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON p.rowid = pf.fk_paiementfourn"; + $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 $sql_count = "SELECT COUNT(*) as total FROM (".$sql.") as combined"; diff --git a/class/euer.class.php b/class/euer.class.php index d9deba6..547304d 100644 --- a/class/euer.class.php +++ b/class/euer.class.php @@ -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) { global $conf; - // Bezahlte Rechnungen nach Zahlungsdatum (Zufluss-Prinzip!) - $sql = "SELECT f.rowid, f.ref, f.datef as rechnungsdatum,"; - $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 .= " s.nom as kunde,"; - $sql .= " fd.tva_tx as ust_satz, fd.total_ht as zeile_netto, fd.total_tva as zeile_ust"; - $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"; + // Zahlungsdatum liegt in llx_paiement, nicht in llx_paiement_facture! + $sql = "SELECT pf.amount as zahlung, p.datep as zahlungsdatum,"; + $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 .= " INNER JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON p.rowid = pf.fk_paiement"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture as f ON pf.fk_facture = f.rowid"; $sql .= " WHERE f.entity = ".((int) $conf->entity); - $sql .= " AND f.fk_statut IN (2, 3)"; // Bezahlt oder teilbezahlt - $sql .= " AND pf.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; - $sql .= " ORDER BY pf.datep"; + $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; $resql = $this->db->query($sql); if ($resql) { - $einnahmen_details = array(); + $summe_brutto = 0; + $summe_netto = 0; + $summe_ust = 0; + $anzahl = 0; + while ($obj = $this->db->fetch_object($resql)) { - $key = 'ust_'.(int)$obj->ust_satz; - if (!isset($einnahmen_details[$key])) { - $einnahmen_details[$key] = array( - 'bezeichnung' => 'Erlöse '.(int)$obj->ust_satz.'% USt', - 'netto' => 0, - 'ust' => 0, - 'brutto' => 0, - 'ust_satz' => (int)$obj->ust_satz, - 'anzahl' => 0 - ); + // USt-Anteil aus der Rechnung berechnen (netto/brutto Verhältnis) + if ($obj->brutto != 0) { + $zahlung_netto = $obj->zahlung * ($obj->netto / $obj->brutto); + $zahlung_ust = $obj->zahlung * ($obj->ust / $obj->brutto); + } else { + $zahlung_netto = $obj->zahlung / 1.19; + $zahlung_ust = $obj->zahlung - $zahlung_netto; } - $einnahmen_details[$key]['netto'] += $obj->zahlung / (1 + $obj->ust_satz/100); - $einnahmen_details[$key]['ust'] += $obj->zahlung - ($obj->zahlung / (1 + $obj->ust_satz/100)); - $einnahmen_details[$key]['brutto'] += $obj->zahlung; - $einnahmen_details[$key]['anzahl']++; + + $summe_brutto += $obj->zahlung; + $summe_netto += $zahlung_netto; + $summe_ust += $zahlung_ust; + $anzahl++; } - foreach ($einnahmen_details as $key => $detail) { - $this->einnahmen[$key] = $detail; - $this->summe_einnahmen += $detail['netto']; - $this->ust_summe += $detail['ust']; - } - } - - // Alternative: Wenn keine Zahlungen verknüpft, nimm Rechnungsdatum - $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,"; - $sql2 .= " s.nom as kunde"; - $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; + if ($anzahl > 0) { + $this->einnahmen['zahlungseingaenge'] = array( + 'bezeichnung' => 'Betriebseinnahmen (Zahlungseingang)', + 'netto' => $summe_netto, + 'ust' => $summe_ust, + 'brutto' => $summe_brutto, + 'ust_satz' => 19, + 'anzahl' => $anzahl + ); + $this->summe_einnahmen += $summe_netto; + $this->ust_summe += $summe_ust; } } } /** - * Ausgaben aus bezahlten Lieferantenrechnungen + * Ausgaben aus Lieferantenzahlungen (Ist-Versteuerung / Abfluss-Prinzip) */ private function berechneAusgabenAusLieferantenrechnungen($datum_von, $datum_bis) { global $conf; - // Bezahlte Lieferantenrechnungen nach Zahlungsdatum (Abfluss-Prinzip!) - $sql = "SELECT f.rowid, f.ref, f.ref_supplier, f.datef as rechnungsdatum,"; - $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 .= " s.nom as lieferant,"; - $sql .= " fd.tva_tx as vst_satz"; - $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"; + // Zahlungsdatum liegt in llx_paiementfourn, nicht in llx_paiementfourn_facturefourn! + $sql = "SELECT pf.amount as zahlung, p.datep as zahlungsdatum,"; + $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 .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON p.rowid = pf.fk_paiementfourn"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON pf.fk_facturefourn = f.rowid"; $sql .= " WHERE f.entity = ".((int) $conf->entity); - $sql .= " AND f.fk_statut IN (2)"; // Bezahlt - $sql .= " AND pf.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; - $sql .= " ORDER BY pf.datep"; + $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; $resql = $this->db->query($sql); if ($resql) { - $ausgaben_details = array(); + $summe_brutto = 0; + $summe_netto = 0; + $summe_vst = 0; + $anzahl = 0; + while ($obj = $this->db->fetch_object($resql)) { - $vst_satz = isset($obj->vst_satz) ? (int)$obj->vst_satz : 19; - $key = 'vst_'.$vst_satz; - if (!isset($ausgaben_details[$key])) { - $ausgaben_details[$key] = array( - 'bezeichnung' => 'Betriebsausgaben '.$vst_satz.'% VSt', - 'netto' => 0, - 'vst' => 0, - 'brutto' => 0, - 'vst_satz' => $vst_satz, - 'anzahl' => 0 - ); + // VSt-Anteil aus der Rechnung berechnen (netto/brutto Verhältnis) + if ($obj->brutto != 0) { + $zahlung_netto = $obj->zahlung * ($obj->netto / $obj->brutto); + $zahlung_vst = $obj->zahlung * ($obj->vst / $obj->brutto); + } else { + $zahlung_netto = $obj->zahlung / 1.19; + $zahlung_vst = $obj->zahlung - $zahlung_netto; } - $ausgaben_details[$key]['brutto'] += $obj->zahlung; - $ausgaben_details[$key]['netto'] += $obj->zahlung / (1 + $vst_satz/100); - $ausgaben_details[$key]['vst'] += $obj->zahlung - ($obj->zahlung / (1 + $vst_satz/100)); - $ausgaben_details[$key]['anzahl']++; + + $summe_brutto += $obj->zahlung; + $summe_netto += $zahlung_netto; + $summe_vst += $zahlung_vst; + $anzahl++; } - foreach ($ausgaben_details as $key => $detail) { - $this->ausgaben[$key] = $detail; - $this->summe_ausgaben += $detail['netto']; - $this->vst_summe += $detail['vst']; - } - } - - // Alternative: Ohne Zahlungsverknüpfung - $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,"; - $sql2 .= " s.nom as lieferant"; - $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; + if ($anzahl > 0) { + $this->ausgaben['zahlungsausgaenge'] = array( + 'bezeichnung' => 'Betriebsausgaben (Zahlungsausgang)', + 'netto' => $summe_netto, + 'vst' => $summe_vst, + 'brutto' => $summe_brutto, + 'vst_satz' => 19, + 'anzahl' => $anzahl + ); + $this->summe_ausgaben += $summe_netto; + $this->vst_summe += $summe_vst; } } } @@ -339,21 +274,23 @@ class EUeR extends CommonObject global $conf; $buchungen = array(); - // Kundenrechnungen (Einnahmen) + // Kundenrechnungen (Einnahmen) - nach Zahlungsdatum + // Zahlungsdatum liegt in llx_paiement! if ($typ == 'alle' || $typ == 'einnahme') { $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 .= " 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 .= " 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 .= " FROM ".MAIN_DB_PREFIX."paiement as p"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON p.rowid = pf.fk_paiement"; + $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 f.fk_statut IN (2, 3)"; - $sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; - $sql .= " GROUP BY f.rowid"; - $sql .= " ORDER BY datum"; + $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; + $sql .= " ORDER BY p.datep"; $resql = $this->db->query($sql); 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') { $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 .= " 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 .= " 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 .= " FROM ".MAIN_DB_PREFIX."paiementfourn as p"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn_facturefourn as pf ON p.rowid = pf.fk_paiementfourn"; + $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 f.fk_statut IN (2)"; - $sql .= " AND COALESCE(pf.datep, f.datef) BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; - $sql .= " GROUP BY f.rowid"; - $sql .= " ORDER BY datum"; + $sql .= " AND p.datep BETWEEN '".$this->db->escape($datum_von)."' AND '".$this->db->escape($datum_bis)."'"; + $sql .= " ORDER BY p.datep"; $resql = $this->db->query($sql); if ($resql) { diff --git a/core/modules/modSteuer.class.php b/core/modules/modSteuer.class.php index 899a4ec..3b9a9cc 100755 --- a/core/modules/modSteuer.class.php +++ b/core/modules/modSteuer.class.php @@ -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' // 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 //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; @@ -158,7 +158,7 @@ class modSteuer extends DolibarrModules // Prerequisites $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->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->need_javascript_ajax = 0; @@ -318,37 +318,21 @@ class modSteuer extends DolibarrModules // Main menu entries to add $this->menu = array(); $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 */ - // EÜR Übersicht + + // Haupteintrag unter Buchhaltung $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy', 'type' => 'left', - 'titre' => 'EUeRUebersicht', - 'prefix' => img_picto('', 'fa-chart-pie', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'euer_uebersicht', + 'titre' => 'EUeR', + 'prefix' => img_picto('', 'fa-calculator', 'class="pictofixedwidth"'), + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_euer', 'url' => '/steuer/steuerindex.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $r, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', @@ -356,30 +340,14 @@ class modSteuer extends DolibarrModules ); // Buchungen $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer', 'type' => 'left', 'titre' => 'Buchungen', - 'prefix' => img_picto('', 'fa-list', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'buchungen', + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_buchungen', 'url' => '/steuer/buchung_list.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $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, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', @@ -387,15 +355,14 @@ class modSteuer extends DolibarrModules ); // Anlage EÜR $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer', 'type' => 'left', 'titre' => 'AnlageEUeR', - 'prefix' => img_picto('', 'fa-file-alt', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'anlage_euer', + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_anlage', 'url' => '/steuer/euer_bericht.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $r, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', @@ -403,15 +370,14 @@ class modSteuer extends DolibarrModules ); // UStVA $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer', 'type' => 'left', 'titre' => 'UStVA', - 'prefix' => img_picto('', 'fa-percent', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'ustva', + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_ustva', 'url' => '/steuer/ustva.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $r, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', @@ -419,15 +385,14 @@ class modSteuer extends DolibarrModules ); // Gewerbesteuer $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer', 'type' => 'left', 'titre' => 'Gewerbesteuer', - 'prefix' => img_picto('', 'fa-building', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'gewerbesteuer', + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_gewerbe', 'url' => '/steuer/gewerbesteuer.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $r, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', @@ -435,15 +400,14 @@ class modSteuer extends DolibarrModules ); // WISO Export $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer', 'type' => 'left', 'titre' => 'WISOExport', - 'prefix' => img_picto('', 'fa-download', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'wiso_export', + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_wiso', 'url' => '/steuer/export_wiso.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $r, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', @@ -451,15 +415,14 @@ class modSteuer extends DolibarrModules ); // Kontenplan $this->menu[$r++] = array( - 'fk_menu' => 'fk_mainmenu=steuer', + 'fk_menu' => 'fk_mainmenu=accountancy,fk_leftmenu=steuer_euer', 'type' => 'left', 'titre' => 'Kontenplan', - 'prefix' => img_picto('', 'fa-sitemap', 'class="pictofixedwidth"'), - 'mainmenu' => 'steuer', - 'leftmenu' => 'kontenplan', + 'mainmenu' => 'accountancy', + 'leftmenu' => 'steuer_konten', 'url' => '/steuer/konten.php', 'langs' => 'steuer@steuer', - 'position' => 1000 + $r, + 'position' => 2000 + $r, 'enabled' => 'isModEnabled("steuer")', 'perms' => '1', 'target' => '', diff --git a/sql/dolibarr_allversions.sql b/sql/dolibarr_allversions.sql index 6e680f2..6c6a2e0 100755 --- a/sql/dolibarr_allversions.sql +++ b/sql/dolibarr_allversions.sql @@ -10,9 +10,9 @@ CREATE TABLE IF NOT EXISTS llx_steuer_konto ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, kontonummer VARCHAR(10) NOT NULL, bezeichnung VARCHAR(255) NOT NULL, - kategorie VARCHAR(50) NOT NULL, -- 'einnahme', 'ausgabe', 'ust', 'vorsteuer' - euer_zeile INTEGER DEFAULT NULL, -- Zeile in Anlage EÜR - ust_kennzeichen VARCHAR(10) DEFAULT NULL, -- USt-Kennzeichen für UStVA + kategorie VARCHAR(50) NOT NULL, + euer_zeile INTEGER DEFAULT NULL, + ust_kennzeichen VARCHAR(10) DEFAULT NULL, aktiv TINYINT(1) DEFAULT 1, entity INTEGER DEFAULT 1, 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 ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, - ref VARCHAR(30) NOT NULL, -- Buchungsnummer - datum DATE NOT NULL, -- Belegdatum - belegnummer VARCHAR(50) DEFAULT NULL, -- Externe Belegnummer + ref VARCHAR(30) NOT NULL, + datum DATE NOT NULL, + belegnummer VARCHAR(50) DEFAULT NULL, beschreibung VARCHAR(255) NOT NULL, - fk_konto INTEGER NOT NULL, -- Verweis auf llx_steuer_konto - betrag_netto DOUBLE(24,8) DEFAULT 0, - betrag_ust DOUBLE(24,8) DEFAULT 0, -- USt/VSt Betrag - betrag_brutto DOUBLE(24,8) DEFAULT 0, - ust_satz DOUBLE(5,2) DEFAULT 0, -- 0, 7, 19 - typ VARCHAR(20) NOT NULL, -- 'einnahme', 'ausgabe' - zahlungsart VARCHAR(30) DEFAULT NULL, -- 'bar', 'bank', 'paypal', etc. - fk_soc INTEGER DEFAULT NULL, -- Verknüpfung zu Kunde/Lieferant - fk_facture INTEGER DEFAULT NULL, -- Verknüpfung zu Rechnung - fk_facture_fourn INTEGER DEFAULT NULL, -- Verknüpfung zu Lieferantenrechnung + fk_konto INTEGER NOT NULL, + betrag_netto DECIMAL(24,8) DEFAULT 0, + betrag_ust DECIMAL(24,8) DEFAULT 0, + betrag_brutto DECIMAL(24,8) DEFAULT 0, + ust_satz DECIMAL(5,2) DEFAULT 0, + typ VARCHAR(20) NOT NULL, + zahlungsart VARCHAR(30) DEFAULT NULL, + fk_soc INTEGER DEFAULT NULL, + fk_facture INTEGER DEFAULT NULL, + fk_facture_fourn INTEGER DEFAULT NULL, note_private TEXT, date_creation DATETIME, tms TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, fk_user_creat INTEGER, fk_user_modif INTEGER, - status TINYINT(4) DEFAULT 1, -- 0=Entwurf, 1=Gebucht + status TINYINT(4) DEFAULT 1, entity INTEGER DEFAULT 1, INDEX idx_buchung_datum (datum), 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 ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, jahr INTEGER NOT NULL, - periode VARCHAR(10) NOT NULL, -- '01'-'12' für Monat, 'Q1'-'Q4' für Quartal - periode_typ VARCHAR(10) NOT NULL, -- 'monat' oder 'quartal' - - -- Lieferungen und Leistungen - kz81 DOUBLE(24,8) DEFAULT 0, -- Steuerpfl. Umsätze 19% - kz86 DOUBLE(24,8) DEFAULT 0, -- Steuerpfl. Umsätze 7% - kz35 DOUBLE(24,8) DEFAULT 0, -- Steuerpfl. Umsätze andere Sätze - kz36 DOUBLE(24,8) DEFAULT 0, -- USt auf Kz35 - - -- Steuerfreie Umsätze - kz41 DOUBLE(24,8) DEFAULT 0, -- Innergemeinschaftl. Lieferungen - kz44 DOUBLE(24,8) DEFAULT 0, -- Steuerfreie Ausfuhrlieferungen - - -- Vorsteuer - kz66 DOUBLE(24,8) DEFAULT 0, -- Vorsteuer aus Rechnungen - 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 + periode VARCHAR(10) NOT NULL, + periode_typ VARCHAR(10) NOT NULL, + kz81 DECIMAL(24,8) DEFAULT 0, + kz86 DECIMAL(24,8) DEFAULT 0, + kz35 DECIMAL(24,8) DEFAULT 0, + kz36 DECIMAL(24,8) DEFAULT 0, + kz41 DECIMAL(24,8) DEFAULT 0, + kz44 DECIMAL(24,8) DEFAULT 0, + kz66 DECIMAL(24,8) DEFAULT 0, + kz61 DECIMAL(24,8) DEFAULT 0, + kz67 DECIMAL(24,8) DEFAULT 0, + ust_summe DECIMAL(24,8) DEFAULT 0, + vst_summe DECIMAL(24,8) DEFAULT 0, + zahllast DECIMAL(24,8) DEFAULT 0, + status TINYINT(4) DEFAULT 0, uebermittelt_am DATE DEFAULT NULL, note_private TEXT, date_creation DATETIME, @@ -95,15 +86,15 @@ CREATE TABLE IF NOT EXISTS llx_steuer_ustva ( CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, jahr INTEGER NOT NULL, - gewinn_euer DOUBLE(24,8) DEFAULT 0, -- Gewinn aus EÜR - hinzurechnungen DOUBLE(24,8) DEFAULT 0, -- § 8 GewStG - kuerzungen DOUBLE(24,8) DEFAULT 0, -- § 9 GewStG - gewerbeertrag DOUBLE(24,8) DEFAULT 0, -- Nach Freibetrag - freibetrag DOUBLE(24,8) DEFAULT 24500, -- Freibetrag Einzelunternehmen - hebesatz DOUBLE(5,2) DEFAULT 400, -- Gemeinde-Hebesatz in % - steuermessbetrag DOUBLE(24,8) DEFAULT 0, - gewerbesteuer DOUBLE(24,8) DEFAULT 0, - anrechnung_est DOUBLE(24,8) DEFAULT 0, -- Anrechnung auf ESt + gewinn_euer DECIMAL(24,8) DEFAULT 0, + hinzurechnungen DECIMAL(24,8) DEFAULT 0, + kuerzungen DECIMAL(24,8) DEFAULT 0, + gewerbeertrag DECIMAL(24,8) DEFAULT 0, + freibetrag DECIMAL(24,8) DEFAULT 24500, + hebesatz DECIMAL(5,2) DEFAULT 400, + steuermessbetrag DECIMAL(24,8) DEFAULT 0, + gewerbesteuer DECIMAL(24,8) DEFAULT 0, + anrechnung_est DECIMAL(24,8) DEFAULT 0, status TINYINT(4) DEFAULT 0, note_private TEXT, date_creation DATETIME, @@ -112,91 +103,3 @@ CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe ( entity INTEGER DEFAULT 1, UNIQUE KEY uk_jahr (jahr, entity) ) 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); diff --git a/sql/llx_steuer_buchung.sql b/sql/llx_steuer_buchung.sql index f345ed0..afe39be 100644 --- a/sql/llx_steuer_buchung.sql +++ b/sql/llx_steuer_buchung.sql @@ -1,17 +1,17 @@ -- Copyright (C) 2026 Eduard Wisch -- Table for EÜR Buchungen -CREATE TABLE IF NOT EXISTS llx_steuer_buchung ( +CREATE TABLE llx_steuer_buchung ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, ref VARCHAR(30) NOT NULL, datum DATE NOT NULL, belegnummer VARCHAR(50) DEFAULT NULL, beschreibung VARCHAR(255) NOT NULL, fk_konto INTEGER NOT NULL, - betrag_netto DOUBLE(24,8) DEFAULT 0, - betrag_ust DOUBLE(24,8) DEFAULT 0, - betrag_brutto DOUBLE(24,8) DEFAULT 0, - ust_satz DOUBLE(5,2) DEFAULT 0, + betrag_netto DECIMAL(24,8) DEFAULT 0, + betrag_ust DECIMAL(24,8) DEFAULT 0, + betrag_brutto DECIMAL(24,8) DEFAULT 0, + ust_satz DECIMAL(5,2) DEFAULT 0, typ VARCHAR(20) NOT NULL, zahlungsart VARCHAR(30) DEFAULT NULL, fk_soc INTEGER DEFAULT NULL, diff --git a/sql/llx_steuer_gewerbe.sql b/sql/llx_steuer_gewerbe.sql index 9372413..1e3e175 100644 --- a/sql/llx_steuer_gewerbe.sql +++ b/sql/llx_steuer_gewerbe.sql @@ -1,18 +1,18 @@ -- Copyright (C) 2026 Eduard Wisch -- Table for Gewerbesteuer -CREATE TABLE IF NOT EXISTS llx_steuer_gewerbe ( +CREATE TABLE llx_steuer_gewerbe ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, jahr INTEGER NOT NULL, - gewinn_euer DOUBLE(24,8) DEFAULT 0, - hinzurechnungen DOUBLE(24,8) DEFAULT 0, - kuerzungen DOUBLE(24,8) DEFAULT 0, - gewerbeertrag DOUBLE(24,8) DEFAULT 0, - freibetrag DOUBLE(24,8) DEFAULT 24500, - hebesatz DOUBLE(5,2) DEFAULT 400, - steuermessbetrag DOUBLE(24,8) DEFAULT 0, - gewerbesteuer DOUBLE(24,8) DEFAULT 0, - anrechnung_est DOUBLE(24,8) DEFAULT 0, + gewinn_euer DECIMAL(24,8) DEFAULT 0, + hinzurechnungen DECIMAL(24,8) DEFAULT 0, + kuerzungen DECIMAL(24,8) DEFAULT 0, + gewerbeertrag DECIMAL(24,8) DEFAULT 0, + freibetrag DECIMAL(24,8) DEFAULT 24500, + hebesatz DECIMAL(5,2) DEFAULT 400, + steuermessbetrag DECIMAL(24,8) DEFAULT 0, + gewerbesteuer DECIMAL(24,8) DEFAULT 0, + anrechnung_est DECIMAL(24,8) DEFAULT 0, status TINYINT(4) DEFAULT 0, note_private TEXT, date_creation DATETIME, diff --git a/sql/llx_steuer_konto.sql b/sql/llx_steuer_konto.sql index 78528df..51e817c 100644 --- a/sql/llx_steuer_konto.sql +++ b/sql/llx_steuer_konto.sql @@ -1,7 +1,7 @@ -- Copyright (C) 2026 Eduard Wisch -- 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, kontonummer VARCHAR(10) NOT NULL, bezeichnung VARCHAR(255) NOT NULL, diff --git a/sql/llx_steuer_ustva.sql b/sql/llx_steuer_ustva.sql index 0edfa12..3647c62 100644 --- a/sql/llx_steuer_ustva.sql +++ b/sql/llx_steuer_ustva.sql @@ -1,23 +1,23 @@ -- Copyright (C) 2026 Eduard Wisch -- Table for USt-Voranmeldung Perioden -CREATE TABLE IF NOT EXISTS llx_steuer_ustva ( +CREATE TABLE llx_steuer_ustva ( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, jahr INTEGER NOT NULL, periode VARCHAR(10) NOT NULL, periode_typ VARCHAR(10) NOT NULL, - kz81 DOUBLE(24,8) DEFAULT 0, - kz86 DOUBLE(24,8) DEFAULT 0, - kz35 DOUBLE(24,8) DEFAULT 0, - kz36 DOUBLE(24,8) DEFAULT 0, - kz41 DOUBLE(24,8) DEFAULT 0, - kz44 DOUBLE(24,8) DEFAULT 0, - kz66 DOUBLE(24,8) DEFAULT 0, - kz61 DOUBLE(24,8) DEFAULT 0, - kz67 DOUBLE(24,8) DEFAULT 0, - ust_summe DOUBLE(24,8) DEFAULT 0, - vst_summe DOUBLE(24,8) DEFAULT 0, - zahllast DOUBLE(24,8) DEFAULT 0, + kz81 DECIMAL(24,8) DEFAULT 0, + kz86 DECIMAL(24,8) DEFAULT 0, + kz35 DECIMAL(24,8) DEFAULT 0, + kz36 DECIMAL(24,8) DEFAULT 0, + kz41 DECIMAL(24,8) DEFAULT 0, + kz44 DECIMAL(24,8) DEFAULT 0, + kz66 DECIMAL(24,8) DEFAULT 0, + kz61 DECIMAL(24,8) DEFAULT 0, + kz67 DECIMAL(24,8) DEFAULT 0, + ust_summe DECIMAL(24,8) DEFAULT 0, + vst_summe DECIMAL(24,8) DEFAULT 0, + zahllast DECIMAL(24,8) DEFAULT 0, status TINYINT(4) DEFAULT 0, uebermittelt_am DATE DEFAULT NULL, note_private TEXT,