Fehler bereinigt läuft jetzt
This commit is contained in:
parent
562c69ef46
commit
206aeacbc5
10 changed files with 524 additions and 978 deletions
116
README.md
116
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:
|
||||
|
|
|
|||
725
admin/setup.php
725
admin/setup.php
|
|
@ -1,35 +1,15 @@
|
|||
<?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
|
||||
* \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,278 +24,76 @@ 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;
|
||||
|
||||
// Gewerbesteuer Hebesatz
|
||||
$hebesatz = GETPOSTINT('STEUER_GEWERBE_HEBESATZ');
|
||||
if ($hebesatz >= 200 && $hebesatz <= 900) {
|
||||
dolibarr_set_const($db, 'STEUER_GEWERBE_HEBESATZ', $hebesatz, 'chaine', 0, '', $conf->entity);
|
||||
}
|
||||
|
||||
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 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
|
||||
|
|
@ -323,307 +101,150 @@ $action = 'edit';
|
|||
|
||||
$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 = '<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
|
||||
$linkback = '<a href="'.($backtopage ? $backtopage : DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1').'">'.$langs->trans("BackToModuleList").'</a>';
|
||||
|
||||
print load_fiche_titre($langs->trans($title), $linkback, 'title_setup');
|
||||
|
||||
// Configuration header
|
||||
$head = steuerAdminPrepareHead();
|
||||
print dol_get_fiche_head($head, 'settings', $langs->trans($title), -1, "steuer@steuer");
|
||||
|
||||
// Setup page goes here
|
||||
echo '<span class="opacitymedium">'.$langs->trans("SteuerSetupPage").'</span><br><br>';
|
||||
|
||||
|
||||
/*if ($action == 'edit') {
|
||||
print $formSetup->generateOutput(true);
|
||||
print '<br>';
|
||||
} elseif (!empty($formSetup->items)) {
|
||||
print $formSetup->generateOutput();
|
||||
print '<div class="tabsAction">';
|
||||
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a>';
|
||||
print '</div>';
|
||||
}
|
||||
*/
|
||||
if (!empty($formSetup->items)) {
|
||||
print $formSetup->generateOutput(true);
|
||||
print '<br>';
|
||||
}
|
||||
|
||||
|
||||
foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) {
|
||||
if (!empty($myTmpObjectArray['includerefgeneration'])) {
|
||||
// Numbering models
|
||||
|
||||
$setupnotempty++;
|
||||
|
||||
print load_fiche_titre($langs->trans("NumberingModules", $myTmpObjectArray['label']), '', '');
|
||||
print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
|
||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||
print '<input type="hidden" name="action" value="update">';
|
||||
|
||||
// Firmendaten für Steuern
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent">';
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td>'.$langs->trans("Name").'</td>';
|
||||
print '<td>'.$langs->trans("Description").'</td>';
|
||||
print '<td class="nowrap">'.$langs->trans("Example").'</td>';
|
||||
print '<td class="center" width="60">'.$langs->trans("Status").'</td>';
|
||||
print '<td class="center" width="16">'.$langs->trans("ShortInfo").'</td>';
|
||||
print '</tr>'."\n";
|
||||
print '<td colspan="2">'.$langs->trans("CompanyTaxInfo").'</td>';
|
||||
print '</tr>';
|
||||
|
||||
clearstatcache();
|
||||
|
||||
foreach ($dirmodels as $reldir) {
|
||||
$dir = dol_buildpath($reldir."core/modules/".$moduledir);
|
||||
|
||||
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);
|
||||
|
||||
require_once $dir.'/'.$file.'.php';
|
||||
|
||||
$module = new $file($db);
|
||||
'@phan-var-force ModeleNumRefMyObject $module';
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
if ($module->isEnabled()) {
|
||||
dol_include_once('/'.$moduledir.'/class/'.strtolower($myTmpObjectKey).'.class.php');
|
||||
|
||||
print '<tr class="oddeven"><td>'.$module->getName($langs)."</td><td>\n";
|
||||
print $module->info($langs);
|
||||
// Steuernummer
|
||||
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>';
|
||||
|
||||
// Show example of numbering model
|
||||
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">';
|
||||
$constforvar = 'STEUER_'.strtoupper($myTmpObjectKey).'_ADDON';
|
||||
$defaultifnotset = 'thevaluetousebydefault';
|
||||
$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>';
|
||||
}
|
||||
// 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>';
|
||||
|
||||
$className = $myTmpObjectArray['class'];
|
||||
$mytmpinstance = new $className($db);
|
||||
'@phan-var-force MyObject $mytmpinstance';
|
||||
$mytmpinstance->initAsSpecimen();
|
||||
|
||||
// Info
|
||||
$htmltooltip = '';
|
||||
$htmltooltip .= ''.$langs->trans("Version").': <b>'.$module->getVersion().'</b><br>';
|
||||
|
||||
$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.'<br>';
|
||||
} else {
|
||||
$htmltooltip .= $langs->trans($module->error).'<br>';
|
||||
}
|
||||
}
|
||||
|
||||
print '<td class="center">';
|
||||
print $form->textwithpicto('', $htmltooltip, 1, 'info');
|
||||
// Finanzamt
|
||||
print '<tr class="oddeven">';
|
||||
print '<td>'.$langs->trans("TaxOffice").'</td>';
|
||||
print '<td>';
|
||||
print '<input type="text" name="STEUER_FINANZAMT" value="'.getDolGlobalString('STEUER_FINANZAMT').'" size="50">';
|
||||
print '</td>';
|
||||
|
||||
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).'&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 '</tr>';
|
||||
|
||||
print '</table>';
|
||||
}
|
||||
}
|
||||
print '</div>';
|
||||
|
||||
if (empty($setupnotempty)) {
|
||||
print '<br>'.$langs->trans("NothingToSetup");
|
||||
}
|
||||
print '<br>';
|
||||
|
||||
// Page end
|
||||
print dol_get_fiche_end();
|
||||
// USt-Einstellungen
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent">';
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="2">'.$langs->trans("VATSettings").'</td>';
|
||||
print '</tr>';
|
||||
|
||||
// Ist-Versteuerung
|
||||
print '<tr class="oddeven">';
|
||||
print '<td class="titlefield">'.$langs->trans("IstVersteuerung").'</td>';
|
||||
print '<td>';
|
||||
$ist_versteuerung = getDolGlobalInt('STEUER_IST_VERSTEUERUNG', 1);
|
||||
print '<select name="STEUER_IST_VERSTEUERUNG" class="flat">';
|
||||
print '<option value="1"'.($ist_versteuerung == 1 ? ' selected' : '').'>'.$langs->trans("Yes").' - Ist-Versteuerung (nach Zahlungseingang)</option>';
|
||||
print '<option value="0"'.($ist_versteuerung == 0 ? ' selected' : '').'>'.$langs->trans("No").' - Soll-Versteuerung (nach Rechnungsdatum)</option>';
|
||||
print '</select>';
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
|
||||
// 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>';
|
||||
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
|
||||
print '<br>';
|
||||
|
||||
// Gewerbesteuer-Einstellungen
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent">';
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="2">'.$langs->trans("GewerbesteuerSettings").'</td>';
|
||||
print '</tr>';
|
||||
|
||||
// Hebesatz
|
||||
print '<tr class="oddeven">';
|
||||
print '<td class="titlefield">'.$langs->trans("Hebesatz").'</td>';
|
||||
print '<td>';
|
||||
$hebesatz = getDolGlobalInt('STEUER_GEWERBE_HEBESATZ', 400);
|
||||
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>';
|
||||
|
||||
// Freibetrag
|
||||
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 '</table>';
|
||||
print '</div>';
|
||||
|
||||
print '<br>';
|
||||
|
||||
print '<div class="center">';
|
||||
print '<input type="submit" class="button" value="'.$langs->trans("Save").'">';
|
||||
print '</div>';
|
||||
|
||||
print '</form>';
|
||||
|
||||
// Modul-Info
|
||||
print '<br>';
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent">';
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="2">'.$langs->trans("ModuleInfo").'</td>';
|
||||
print '</tr>';
|
||||
print '<tr class="oddeven">';
|
||||
print '<td class="titlefield">'.$langs->trans("Version").'</td>';
|
||||
print '<td>1.0</td>';
|
||||
print '</tr>';
|
||||
print '<tr class="oddeven">';
|
||||
print '<td>'.$langs->trans("Author").'</td>';
|
||||
print '<td>Eduard Wisch - Data IT Solution</td>';
|
||||
print '</tr>';
|
||||
print '<tr class="oddeven">';
|
||||
print '<td>'.$langs->trans("Description").'</td>';
|
||||
print '<td>'.$langs->trans("ModuleSteuerDesc").'</td>';
|
||||
print '</tr>';
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
|
||||
llxFooter();
|
||||
$db->close();
|
||||
|
|
|
|||
|
|
@ -118,47 +118,51 @@ if ($search_beschreibung) {
|
|||
$sql .= " AND b.beschreibung LIKE '%".$db->escape($search_beschreibung)."%'";
|
||||
}
|
||||
|
||||
// UNION mit Rechnungen (Einnahmen)
|
||||
// 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, 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 .= "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."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 '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'";
|
||||
if ($typ == 'ausgabe') {
|
||||
$sql .= " AND 1=0"; // Keine Einnahmen bei Ausgaben-Filter
|
||||
}
|
||||
$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)."%'";
|
||||
}
|
||||
$sql .= " GROUP BY f.rowid";
|
||||
}
|
||||
|
||||
// UNION mit Lieferantenrechnungen (Ausgaben)
|
||||
// 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, 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 .= "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."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 '".$db->escape($datum_von)."' AND '".$db->escape($datum_bis)."'";
|
||||
if ($typ == 'einnahme') {
|
||||
$sql .= " AND 1=0"; // Keine Ausgaben bei Einnahmen-Filter
|
||||
}
|
||||
$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)."%'";
|
||||
}
|
||||
$sql .= " GROUP BY f.rowid";
|
||||
}
|
||||
|
||||
// Sortierung und Limit
|
||||
$sql_count = "SELECT COUNT(*) as total FROM (".$sql.") as combined";
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
$summe_brutto += $obj->zahlung;
|
||||
$summe_netto += $zahlung_netto;
|
||||
$summe_ust += $zahlung_ust;
|
||||
$anzahl++;
|
||||
}
|
||||
|
||||
if ($anzahl > 0) {
|
||||
$this->einnahmen['zahlungseingaenge'] = array(
|
||||
'bezeichnung' => 'Betriebseinnahmen (Zahlungseingang)',
|
||||
'netto' => $summe_netto,
|
||||
'ust' => $summe_ust,
|
||||
'brutto' => $summe_brutto,
|
||||
'ust_satz' => 19,
|
||||
'anzahl' => $anzahl
|
||||
);
|
||||
}
|
||||
$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']++;
|
||||
}
|
||||
|
||||
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;
|
||||
$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;
|
||||
}
|
||||
|
||||
$summe_brutto += $obj->zahlung;
|
||||
$summe_netto += $zahlung_netto;
|
||||
$summe_vst += $zahlung_vst;
|
||||
$anzahl++;
|
||||
}
|
||||
|
||||
if ($anzahl > 0) {
|
||||
$this->ausgaben['zahlungsausgaenge'] = array(
|
||||
'bezeichnung' => 'Betriebsausgaben (Zahlungsausgang)',
|
||||
'netto' => $summe_netto,
|
||||
'vst' => $summe_vst,
|
||||
'brutto' => $summe_brutto,
|
||||
'vst_satz' => 19,
|
||||
'anzahl' => $anzahl
|
||||
);
|
||||
}
|
||||
$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']++;
|
||||
}
|
||||
|
||||
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;
|
||||
$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) {
|
||||
|
|
|
|||
|
|
@ -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' => '',
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue