mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-27 07:00:29 +01:00
502 lines
16 KiB
PHP
502 lines
16 KiB
PHP
<?php
|
|
/*
|
|
* SPDX-FileCopyrightText: 2022 Andreas Palm
|
|
* SPDX-FileCopyrightText: 2019 Xentral (c) Xentral ERP Software GmbH, Fuggerstrasse 11, D-86150 Augsburg, Germany
|
|
*
|
|
* SPDX-License-Identifier: LicenseRef-EGPL-3.1
|
|
*/
|
|
|
|
/*
|
|
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
*
|
|
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
|
|
*
|
|
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
|
|
*
|
|
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
|
|
* to obtain the text of the corresponding license version.
|
|
*
|
|
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
*/
|
|
?>
|
|
<?php
|
|
|
|
use Xentral\Components\Http\JsonResponse;
|
|
|
|
class Steuersaetze {
|
|
/** @var Application $app */
|
|
protected $app;
|
|
|
|
/**
|
|
* @param Application $app
|
|
* @param string $name
|
|
* @param array $erlaubtevars
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function TableSearch($app, $name, $erlaubtevars)
|
|
{
|
|
// in dieses switch alle lokalen Tabellen (diese Live Tabellen mit Suche etc.) für dieses Modul
|
|
switch($name)
|
|
{
|
|
case 'steuersaetze_list':
|
|
$allowed['steuersaetze'] = ['list'];
|
|
|
|
$heading = [
|
|
'Steuersatz', 'Bezeichnung','Land', 'Projekt', 'Typ','gültig von', 'gültig bis', 'Aktiv', 'festsetzen', 'Menü'
|
|
];
|
|
$width = ['10%', '20%','10%', '10%', '10%','10%','10%','1%','1%','1%'];
|
|
|
|
$findcols = [
|
|
's.satz',
|
|
's.bezeichnung',
|
|
's.country_code',
|
|
"IF(s.project_id = 0,'-',IFNULL(p.abkuerzung,''))",
|
|
"IF(s.type = '','manuell', s.type)",
|
|
's.valid_from',
|
|
's.valid_to',
|
|
"if(s.aktiv=1,'ja','nein')",
|
|
"if(s.set_data=1,'ja','nein')",
|
|
's.id'
|
|
];
|
|
$searchsql = ['s.satz', 's.bezeichnung', 's.country_code', 's.aktiv'];
|
|
|
|
$numbercols = [0];
|
|
$alignright = [1];
|
|
$datecols = [5, 6];
|
|
|
|
$defaultorder = 1;
|
|
$defaultorderdesc = 0;
|
|
|
|
$menu = '<table cellpadding="0" cellspacing="0">';
|
|
$menu .= '<tr>';
|
|
$menu .= '<td nowrap>';
|
|
$menu .= '<a href="javascript:;" onclick="SteuersaetzeEdit(%value%);">';
|
|
$menu .= '<img src="themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/edit.svg" border="0">';
|
|
$menu .= '</a> ';
|
|
$menu .= '<a href="javascript:;" onclick="SteuersaetzeDelete(%value%);">';
|
|
$menu .= '<img src="themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/delete.svg" border="0">';
|
|
$menu .= '</a>';
|
|
$menu .= '</td>';
|
|
$menu .= '</tr>';
|
|
$menu .= '</table>';
|
|
|
|
$where = " s.id > 0 ";
|
|
|
|
$sql = "SELECT SQL_CALC_FOUND_ROWS s.id,
|
|
s.satz, s.bezeichnung, s.country_code, IF(s.project_id = 0,'-',IFNULL(p.abkuerzung,'')),
|
|
IF(s.type = '','manuell', s.type),
|
|
IFNULL(DATE_FORMAT(s.valid_from,'%d.%m.%Y'),'-'), IFNULL(DATE_FORMAT(s.valid_to,'%d.%m.%Y'),'-'),
|
|
if(s.aktiv=1,'ja','nein'),
|
|
if(s.set_data=1,'ja','nein'),
|
|
s.id
|
|
FROM `steuersaetze` AS `s`
|
|
LEFT JOIN `projekt` AS `p` ON s.project_id = p.id ";
|
|
|
|
$count = "SELECT count(s.id)
|
|
FROM `steuersaetze` AS `s`
|
|
LEFT JOIN `projekt` AS `p` ON s.project_id = p.id
|
|
WHERE $where";
|
|
break;
|
|
|
|
}
|
|
|
|
$erg = [];
|
|
|
|
foreach($erlaubtevars as $k => $v) {
|
|
if(isset($$v)) {
|
|
$erg[$v] = $$v;
|
|
}
|
|
}
|
|
|
|
return $erg;
|
|
}
|
|
|
|
/**
|
|
* Steuersaetze constructor.
|
|
*
|
|
* @param Application $app
|
|
* @param bool $intern
|
|
*/
|
|
public function __construct($app, $intern = false) {
|
|
$this->app=$app;
|
|
if($intern) {
|
|
return;
|
|
}
|
|
$this->app->ActionHandlerInit($this);
|
|
|
|
// ab hier alle Action Handler definieren die das Modul hat
|
|
$this->app->ActionHandler('list', 'SteuersaetzeList');
|
|
$this->app->ActionHandler('edit', 'SteuersaetzeEdit');
|
|
$this->app->ActionHandler('save', 'SteuersaetzeSave');
|
|
$this->app->ActionHandler('delete', 'SteuersaetzeDelete');
|
|
|
|
$this->app->ActionHandlerListen($app);
|
|
}
|
|
|
|
public function Install()
|
|
{
|
|
$this->app->erp->RegisterHook('getTaxRatesFromShopOrder','steuersaetze','HookGetTaxRatesFromShopOrder');
|
|
}
|
|
|
|
/**
|
|
* @param string $country
|
|
* @param array $taxes
|
|
*/
|
|
public function HookGetTaxRatesFromShopOrder($country, &$taxes)
|
|
{
|
|
$taxesbycountry = $this->getTaxesByCountry($country);
|
|
if(!empty($taxesbycountry)) {
|
|
$taxes = array_merge($taxes, $taxesbycountry);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $country
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getTaxesByCountry($country)
|
|
{
|
|
$ret = [];
|
|
$taxes = $this->app->DB->SelectArr(
|
|
sprintf(
|
|
"SELECT DISTINCT `type`, `satz`
|
|
FROM `steuersaetze`
|
|
WHERE `aktiv` = 1
|
|
AND (`country_code` = '%s' OR (`bezeichnung` = '%s' AND `country_code` = ''))",
|
|
$country, $country
|
|
)
|
|
);
|
|
if(!empty($taxes)) {
|
|
foreach($taxes as $rates) {
|
|
$ret[$rates['type']] = $rates['satz'];
|
|
}
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
public function SteuersaetzeMenu()
|
|
{
|
|
$this->app->erp->MenuEintrag('index.php?module=steuersaetze&action=list','Zurück zur Übersicht');
|
|
}
|
|
|
|
public function SteuersaetzeList()
|
|
{
|
|
/** @var Vatreduction2020 $obj */
|
|
$obj = $this->app->loadModule('vatreduction2020');
|
|
if($obj !== null) {
|
|
$createTaxes = !empty($this->app->Secure->GetPOST('createtaxes'));
|
|
$hasTaxes = $obj->hasSpecialTaxes();
|
|
if($createTaxes){
|
|
$obj->createTaxes($hasTaxes);
|
|
$this->app->Location->execute('index.php?module=steuersaetze&action=list');
|
|
}
|
|
$obj->displayTaxMessageIfNeeded($hasTaxes);
|
|
}
|
|
$this->app->erp->MenuEintrag('index.php?module=steuersaetze&action=list','Übersicht');
|
|
$this->app->erp->Headlines('Steuersätze');
|
|
$this->app->YUI->AutoComplete('project_neu', 'projektname');
|
|
$this->app->YUI->AutoComplete('project', 'projektname');
|
|
$this->app->YUI->DatePicker('valid_from');
|
|
$this->app->YUI->DatePicker('valid_from_neu');
|
|
$this->app->YUI->DatePicker('valid_to');
|
|
$this->app->YUI->DatePicker('valid_to_neu');
|
|
$this->app->YUI->TableSearch('TAB1','steuersaetze_list', 'show','','',basename(__FILE__), __CLASS__);
|
|
$this->app->erp->MenuEintrag('javascript:SteuersaetzeEdit(0);', 'Neu');
|
|
$this->app->Tpl->Set('SELCOUNTRYCODE', $this->app->erp->SelectLaenderliste());
|
|
$this->app->Tpl->Parse('PAGE','steuersaetze_list.tpl');
|
|
}
|
|
|
|
public function checkTaxesToSet()
|
|
{
|
|
$taxes = $this->app->DB->SelectArr(
|
|
"SELECT s.satz, s.`set_data`, s.project_id, s.type, p.steuersatz_ermaessigt, p.steuersatz_normal
|
|
FROM `steuersaetze` AS `s`
|
|
LEFT JOIN `projekt` AS `p` ON s.project_id = p.id
|
|
WHERE s.aktiv = 1 AND s.set_data = 1 AND (s.type = 'normal' OR s.type = 'ermaessigt')
|
|
AND (s.valid_from IS NULL OR s.valid_from = '0000-00-00' OR s.valid_from <= CURDATE())
|
|
AND (s.valid_to IS NULL OR s.valid_to = '0000-00-00' OR s.valid_to >= CURDATE())
|
|
ORDER BY s.`project_id` DESC,
|
|
(s.`valid_to` IS NULL OR s.valid_to = '0000-00-00')
|
|
AND (s.`valid_from` IS NULL OR s.valid_from = '0000-00-00') DESC,
|
|
s.`valid_to` IS NULL OR s.valid_to = '0000-00-00' DESC,
|
|
s.`valid_from` IS NULL OR s.valid_from = '0000-00-00' DESC,
|
|
s.id DESC"
|
|
);
|
|
if(empty($taxes)) {
|
|
return;
|
|
}
|
|
foreach($taxes as $tax) {
|
|
$type = $tax['type'];
|
|
if(!empty($tax['project_id'])) {
|
|
if($type === 'ermaessigt' && $tax['satz'] != $tax['steuersatz_ermaessigt']) {
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
'UPDATE `projekt` SET `steuersatz_ermaessigt` = %f WHERE `id` = %d',
|
|
$tax['satz'], $tax['project_id']
|
|
)
|
|
);
|
|
}
|
|
elseif($type === 'normal' && $tax['satz'] != $tax['steuersatz_normal']) {
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
'UPDATE `projekt` SET `steuersatz_normal` = %f WHERE `id` = %d',
|
|
$tax['satz'], $tax['project_id']
|
|
)
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
if($type === 'ermaessigt' && $tax['satz'] != $this->app->erp->Firmendaten('steuersatz_ermaessigt')) {
|
|
$this->app->erp->FirmendatenSet('steuersatz_ermaessigt', $tax['satz']);
|
|
}
|
|
elseif($type === 'normal' && $tax['satz'] != $this->app->erp->Firmendaten('steuersatz_normal')) {
|
|
$this->app->erp->FirmendatenSet('steuersatz_normal', $tax['satz']);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int $id
|
|
* @param float $satz
|
|
* @param string $bezeichnung
|
|
* @param int $projectId
|
|
* @param string|null $validFrom
|
|
* @param string|null $validTo
|
|
* @param string $countryCode
|
|
*
|
|
* @return string
|
|
*/
|
|
public function checkInputForError(
|
|
$id, $satz, $bezeichnung, $type = '', $projectId = 0, $validFrom = null, $validTo = null, $countryCode = ''
|
|
)
|
|
{
|
|
$error = [];
|
|
if($satz === ''){
|
|
$error[] = 'Bitte einen gültigen Steuersatz eingeben';
|
|
}
|
|
if($satz < 0) {
|
|
$error[] = 'Bitte einen positiven Steuersatz eingeben';
|
|
}
|
|
if(trim($bezeichnung) === ''){
|
|
$error[] = 'Bitte Bezeichnung eingeben';
|
|
}
|
|
|
|
$validFromTime = $validFrom === null?null:strtotime($validFrom);
|
|
$validToTime = $validTo === null?null:strtotime($validTo);
|
|
|
|
if($validFrom !== null && $validTo !== null && $validFromTime > $validToTime) {
|
|
$error[] = 'Datumsbereich ist ungültig';
|
|
}
|
|
|
|
if(!empty($error)) {
|
|
return implode("\n", $error);
|
|
}
|
|
|
|
$dbEntries = $this->app->DB->Select(
|
|
sprintf(
|
|
"SELECT *
|
|
FROM `steuersaetze`
|
|
WHERE `aktiv` = 1 AND `type` = '%s' AND `project_id` = %d AND `country_code` = '%s'",
|
|
$type, $projectId, $countryCode
|
|
)
|
|
);
|
|
if(!empty($dbEntries)) {
|
|
foreach($dbEntries as $dbEntry) {
|
|
if((int)$dbEntry['id'] === (int)$id) {
|
|
continue;
|
|
}
|
|
$dbFrom = $this->dateToDb($dbEntry['valid_from']);
|
|
$dbTo = $this->dateToDb($dbEntry['valid_to']);
|
|
if($dbFrom === null && $dbTo === null) {
|
|
if($validFrom === null && $validTo === null){
|
|
$error[] = 'Es existiert bereits ein Eintrag';
|
|
return implode("\n", $error);
|
|
}
|
|
continue;
|
|
}
|
|
if($dbFrom !== null && $dbTo !== null) {
|
|
if($validFrom === null && $validTo === null){
|
|
continue;
|
|
}
|
|
$dbFromTime = strtotime($dbFrom);
|
|
$dbToTime = strtotime($dbTo);
|
|
if($validFrom !== null && $validTo !== null) {
|
|
if($validFromTime === $dbFromTime && $validToTime === $dbToTime) {
|
|
$error[] = 'Es existiert bereits ein Eintrag mit diesem Zeitbereich';
|
|
return implode("\n", $error);
|
|
}
|
|
if($validFromTime > $dbToTime || $validToTime < $dbFromTime) {
|
|
continue;
|
|
}
|
|
if($validFromTime < $dbToTime && $validToTime > $dbToTime) {
|
|
$error[] = 'Es überschneiden sich Einträge';
|
|
return implode("\n", $error);
|
|
}
|
|
if($validFromTime < $dbFromTime && $validToTime > $dbFromTime) {
|
|
$error[] = 'Es überschneiden sich Einträge';
|
|
return implode("\n", $error);
|
|
}
|
|
if($validFromTime >= $dbFromTime && $validToTime <= $dbToTime) {
|
|
$error[] = 'Es überschneiden sich Einträge';
|
|
return implode("\n", $error);
|
|
}
|
|
if($validFromTime <= $dbFromTime && $validToTime >= $dbToTime) {
|
|
$error[] = 'Es überschneiden sich Einträge';
|
|
return implode("\n", $error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return implode("\n", $error);
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse|void
|
|
*/
|
|
public function SteuersaetzeEdit()
|
|
{
|
|
if($this->app->Secure->GetGET('cmd')==='get'){
|
|
//$this->app->erp->MenuEintrag("index.php?module=zeiterfassung_kosten&action=edit&id=".$adresse,"Details");
|
|
$id = (int)$this->app->Secure->GetPOST('id');
|
|
$data = null;
|
|
if($id > 0){
|
|
$data = $this->app->DB->SelectRow(
|
|
sprintf(
|
|
"SELECT s.`id`, s.`satz`, s.`bezeichnung`, s.`aktiv`, s.`set_data`, s.type,
|
|
IFNULL(p.abkuerzung,'') AS `project`,
|
|
IF(
|
|
s.valid_from IS NULL OR s.valid_from = '0000-00-00',
|
|
'',
|
|
DATE_FORMAT(s.valid_from,'%%d.%%m.%%Y')
|
|
) AS `valid_from`,
|
|
IF(
|
|
s.valid_to IS NULL OR s.valid_to = '0000-00-00',
|
|
'',
|
|
DATE_FORMAT(s.valid_to,'%%d.%%m.%%Y')
|
|
) AS `valid_to`, s.country_code
|
|
FROM `steuersaetze` AS `s`
|
|
LEFT JOIN `projekt` AS `p` ON s.project_id = p.id
|
|
WHERE s.`id` = %d LIMIT 1",
|
|
$id
|
|
)
|
|
);
|
|
}
|
|
|
|
return new JsonResponse($data);
|
|
}
|
|
|
|
$this->app->Tpl->Parse('PAGE', 'steuersaetze_list.tpl');
|
|
}
|
|
|
|
/**
|
|
* @param string $date
|
|
*
|
|
* @return string|null
|
|
*/
|
|
public function dateToDb($date)
|
|
{
|
|
if($date === '..' || $date === '') {
|
|
return null;
|
|
}
|
|
if(strpos($date,'.') !== false) {
|
|
return $this->app->String->Convert($date,'%1.%2.%3','%3-%2-%1');
|
|
}
|
|
|
|
return $date;
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
public function SteuersaetzeSave()
|
|
{
|
|
$id = (int)$this->app->Secure->GetPOST('id');
|
|
$satz = $this->app->Secure->GetPOST('satz');
|
|
$bezeichnung = $this->app->Secure->GetPOST('bezeichnung');
|
|
$aktiv = $this->app->Secure->GetPOST('aktiv');
|
|
$set_data = $this->app->Secure->GetPOST('set_data');
|
|
$type = $this->app->Secure->GetPOST('type');
|
|
$project = explode(' ', $this->app->Secure->GetPOST('project'));
|
|
$project = reset($project);
|
|
$project = empty($project)?0:(int)$this->app->erp->ReplaceProjekt(1, $project, 1);
|
|
$countryCode = $this->app->Secure->GetPOST('country_code');
|
|
$valid_from = $this->dateToDb($this->app->Secure->GetPOST('valid_from'));
|
|
$valid_to = $this->dateToDb($this->app->Secure->GetPOST('valid_to'));
|
|
$bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName());
|
|
$satz = (float)str_replace(',','.',$satz);
|
|
$error = $this->checkInputForError(
|
|
$id, $satz, $bezeichnung, $type, $project, $valid_from, $valid_to, $countryCode
|
|
);
|
|
if($error !== '') {
|
|
return new JsonResponse(['status'=>0,'statusText'=>$error]);
|
|
}
|
|
if($id <= 0) {
|
|
$this->app->DB->Insert(
|
|
sprintf(
|
|
"INSERT INTO `steuersaetze`
|
|
(`satz`, `bezeichnung`, `aktiv`, `bearbeiter`, `project_id`,
|
|
`type`, `valid_from`, `valid_to`,`set_data`, `country_code`)
|
|
VALUES (%f, '%s', '%d','%s', %d, '%s', %s, %s, %d, '%s')",
|
|
$satz, $bezeichnung, (int)$aktiv, $bearbeiter, $project, $type,
|
|
$valid_from === null?'NULL':"'".$valid_from."'",
|
|
$valid_to === null?'NULL':"'".$valid_to."'",
|
|
(int)$set_data, $countryCode
|
|
)
|
|
);
|
|
|
|
return new JsonResponse(['status' => 1]);
|
|
}
|
|
|
|
$id = (int)$this->app->DB->Select(
|
|
sprintf(
|
|
'SELECT `id` FROM `steuersaetze` WHERE `id` = %d LIMIT 1',
|
|
$id
|
|
)
|
|
);
|
|
if($id <= 0) {
|
|
$error = 'Datensatz nicht gefunden';
|
|
return new JsonResponse(['status'=>0,'statusText'=>$error]);
|
|
}
|
|
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
"UPDATE `steuersaetze`
|
|
SET `satz` = %f, `bezeichnung` = '%s', `aktiv` = %d, `bearbeiter` = '%s', `project_id` = %d, `type` = '%s',
|
|
`valid_from` = %s, `valid_to` = %s, `set_data` = %d, `country_code` = '%s'
|
|
WHERE `id` = %d
|
|
LIMIT 1",
|
|
$satz, $bezeichnung, (int)$aktiv, $bearbeiter, $project, $type,
|
|
$valid_from === null?'NULL':"'".$valid_from."'",
|
|
$valid_to === null?'NULL':"'".$valid_to."'",
|
|
(int)$set_data, $countryCode,
|
|
$id
|
|
)
|
|
);
|
|
|
|
return new JsonResponse(['status' => 1]);
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
public function SteuersaetzeDelete()
|
|
{
|
|
$id = (int) $this->app->Secure->GetPOST('id');
|
|
$this->app->DB->Delete(
|
|
sprintf(
|
|
'DELETE FROM `steuersaetze` WHERE `id` = %d LIMIT 1',
|
|
$id
|
|
)
|
|
);
|
|
|
|
return new JsonResponse(['status' => 1]);
|
|
}
|
|
|
|
}
|