OpenXE/www/lib/zahlungsweisen/rechnung.php
2021-05-21 08:49:41 +02:00

306 lines
9.1 KiB
PHP

<?php
require_once dirname(__DIR__).'/class.zahlungsweise.php';
class Zahlungsweise_rechnung extends Zahlungsweisenmodul
{
/** @var Application */
var $app;
/** @var array */
protected $data;
/**
* Zahlungsweise_rechnung constructor.
*
* @param Application $app
* @param int $id
*/
public function __construct($app, $id)
{
$this->app= $app;
$this->id = $id;
$this->data = $this->app->DB->SelectRow(
sprintf(
'SELECT * FROM zahlungsweisen WHERE id = %d',
$id
)
);
$einstellungen_json = $this->data['einstellungen_json'];
if(!empty($einstellungen_json)) {
$einstellungen_json = json_decode($einstellungen_json,true);
}
if(!empty($einstellungen_json)) {
$this->einstellungen = $einstellungen_json;
}
else{
$this->einstellungen = array();
}
}
/**
* @param string $doctype
* @param int $doctypeId
* @param string $text
* @param string $language
* @param string|null $zahlungszielskonto
* @param string|null $zahlungszieltageskonto
* @param int|null $zahlungszieltage
*
* @return string
*/
public function getSkontoText(
$doctype,
$doctypeId,
$text,
$language = '',
$zahlungszielskonto = null,
$zahlungszieltageskonto = null,
$zahlungszieltage = null
) {
if($zahlungszielskonto === null || $zahlungszieltageskonto === null) {
$doctypeRow = $this->app->DB->SelectRow(
sprintf(
"SELECT *
FROM `%s`
WHERE id = %d",
$doctype, $doctypeId
)
);
if(isset($doctypeRow['zahlungszieltage']) && isset($doctypeRow['zahlungszieltageskonto'])) {
$zahlungszielskonto = $doctypeRow['zahlungszielskonto'];
$zahlungszieltageskonto = $doctypeRow['zahlungszieltageskonto'];
$zahlungszieltage = $doctypeRow['zahlungszieltage'];
}
else {
$doctypeRow = $this->app->DB->SelectRow(
sprintf(
"SELECT zahlungszieltage, zahlungszieltageskonto
FROM `adresse`
WHERE id = %d",
$doctypeRow['adresse']
)
);
$zahlungszielskonto = $doctypeRow['zahlungszielskonto'];
$zahlungszieltageskonto = $doctypeRow['zahlungszieltageskonto'];
$zahlungszieltage = $doctypeRow['zahlungszieltage'];
}
if($zahlungszielskonto == 0) {
return $text;
}
}
$zahlungszielskontototal=$zahlungszielskonto;
if(empty($language)) {
$doctypeRow = $this->app->DB->SelectRow(
sprintf(
"SELECT sprache, adresse, datum, DATE_FORMAT(datum, '%%d.%%m.%%Y') AS datum_de,
DATE_FORMAT(DATE_ADD(datum, INTERVAL zahlungszieltage DAY),'%%d.%%m.%%Y') AS zahlungdatum,
zahlungszieltage
FROM `%s`
WHERE id = %d",
$doctype, $doctypeId
)
);
$language = !empty($doctypeRow['sprache'])?(String)$doctypeRow['sprache']:(String)$this->app->DB->Select(
sprintf(
'SELECT sprache FROM adresse WHERE id = %d',
$doctypeRow['adresse']
)
);
}
$zahlungszielskontodatum = $this->app->DB->Select(
sprintf(
"SELECT DATE_FORMAT(DATE_ADD(`datum`, INTERVAL %d DAY),'%%d.%%m.%%Y')
FROM `%s`
WHERE `id` = %d
LIMIT 1",
$zahlungszieltageskonto, $doctype, $doctypeId
)
);
if($this->einstellungen['own_discount_text']) {
if($doctype === 'rechnung') {
$ownText = $this->app->erp->Beschriftung('own_discount_text_invoice', $language);
if(empty($ownText)) {
$ownText = $this->einstellungen['own_discount_text_invoice'];
}
$text .= "\n".$ownText;
}
else{
$ownText = $this->app->erp->Beschriftung('own_discount_text_order', $language);
if(empty($ownText)) {
$ownText = $this->einstellungen['own_discount_text_order'];
}
$text .= "\n".$ownText;
}
if($zahlungszieltageskonto<=0){
$zahlungdatum = $this->app->DB->Select(
sprintf(
"SELECT DATE_FORMAT(DATE_ADD(`datum`, INTERVAL %d DAY),'%%d.%%m.%%Y')
FROM `%s`
WHERE `id` = %d
LIMIT 1",
$zahlungszieltageskonto, $doctype, $doctypeId
)
);
$zahlungszielskontodatum = $zahlungdatum;
}
}
else {
$text .= "\n".$this->app->erp->Beschriftung('dokument_skonto', $language)
." $zahlungszielskonto% "
.$this->app->erp->Beschriftung('dokument_innerhalb', $language)
." $zahlungszieltageskonto "
.$this->app->erp->Beschriftung('dokument_tagen', $language);
}
return str_replace(
[
'{ZAHLUNGSZIELSKONTO}',
'{ZAHLUNGSZIELTAGE}',
'{ZAHLUNGSZIELTAGESKONTO}',
'{ZAHLUNGSZIELSKONTOTOTAL}',
'{ZAHLUNGSZIELSKONTODATUM}',
],
[
number_format($zahlungszielskonto,2,',','.'),
$zahlungszieltage,
$zahlungszieltageskonto,
number_format($zahlungszielskontototal,2,',','.'),
$zahlungszielskontodatum,
],
$text
);
}
/**
* @return string
*/
public function GetBezeichnung()
{
return 'Rechnung';
}
/**
* @return array
*/
public function EinstellungenStruktur()
{
return [
'invoice_immediately' => [
'typ'=>'textarea',
'bezeichnung'=>'Satz in Rechnung: (sofort) (DE)',
'default' => $this->app->erp->Beschriftung('zahlung_rechnung_sofort_de'),
'lang' => 'zahlungsweisen_rechnung_invoice_immediately',
],
'invoice_next' => [
'typ'=>'textarea',
'bezeichnung'=>'Satz in Rechnung: (>= 1 Tag) (DE)',
'default' => $this->app->erp->Beschriftung('zahlung_rechnung_de'),
'lang' => 'zahlungsweisen_rechnung_invoice_next',
],
'order_immediately' => [
'typ'=>'textarea',
'bezeichnung'=>'Satz in Angebot/Auftrag: (sofort) (DE)',
'default' => $this->app->erp->Beschriftung('zahlung_auftrag_sofort_de'),
'lang' => 'zahlungsweisen_rechnung_order_immediately',
],
'order_next' => [
'typ'=>'textarea',
'bezeichnung'=>'Satz in Angebot/Auftrag: (>= 1 Tag) (DE)',
'default' => $this->app->erp->Beschriftung('zahlung_auftrag_de'),
'lang' => 'zahlungsweisen_rechnung_order_next',
],
'own_discount_text' => [
'typ' => 'checkbox',
'bezeichnung' => 'Eigener Skontotext',
],
'own_discount_text_order' => [
'typ'=>'textarea',
'bezeichnung'=>'Satz in Angebot/Auftrag (DE)',
'default' => $this->app->erp->Beschriftung('eigener_skontotext_anab'),
'lang' => 'own_discount_text_order',
],
'own_discount_text_invoice' => [
'typ' => 'textarea',
'bezeichnung'=>'Satz in Rechnung (DE)',
'default' => $this->app->erp->Beschriftung('eigener_skontotext_re'),
'lang' => 'own_discount_text_invoice',
],
];
}
/**
* @param string $doctype
* @param int $doctypeid
*
* @return string
*/
public function GetZahlungsweiseText($doctype, $doctypeid)
{
$doctypeRow = $this->app->DB->SelectRow(
sprintf(
"SELECT sprache, adresse, datum, DATE_FORMAT(datum, '%%d.%%m.%%Y') AS datum_de,
DATE_FORMAT(DATE_ADD(datum, INTERVAL zahlungszieltage DAY),'%%d.%%m.%%Y') AS zahlungdatum,
zahlungszieltage
FROM `%s`
WHERE id = %d",
$doctype, $doctypeid
)
);
$zahlungszieltage = $doctypeRow['zahlungszieltage'];
$zahlungdatum= $doctypeRow['zahlungdatum'];
$language = !empty($doctypeRow['sprache'])?$doctypeRow['sprache']:
$this->app->DB->Select(
sprintf(
'SELECT sprache FROM adresse WHERE id = %d',
$doctypeRow['adresse']
)
);
if($zahlungszieltage == 0) {
$name = $doctype==='rechnung'?'invoice_immediately':'order_immediately';
}
else {
$name = $doctype==='rechnung'?'invoice_next':'order_next';
}
$zahlungsweisetext = (String)$this->app->erp->Beschriftung('zahlungsweisen_rechnung_'.$name, $language);
if(empty($zahlungsweisetext)) {
$zahlungsweisetext = (String)$this->einstellungen[$name];
}
if(empty($zahlungsweisetext)) {
}
if(empty($zahlungsweisetext)) {
switch($name) {
case 'invoice_immediately':
$zahlungsweisetext = 'Rechnung zahlbar sofort. ';
break;
case 'invoice_next':
$zahlungsweisetext = 'Rechnung zahlbar innerhalb von {ZAHLUNGSZIELTAGE} Tagen bis zum {ZAHLUNGBISDATUM}. ';
break;
}
}
$zahlungsweisetext = str_replace(
['{ZAHLUNGSZIELTAGE}','{ZAHLUNGBISDATUM}'],
[$zahlungszieltage,$zahlungdatum],
$zahlungsweisetext
);
if(in_array($doctype, ['rechnung','auftrag','angebot'])) {
$zahlungsweisetext = $this->getSkontoText($doctype, $doctypeid, $zahlungsweisetext);
}
return $zahlungsweisetext;
}
/**
* @param $postData
*/
public function updatePostDataForAssistent($postData)
{
$postData['verhalten'] = 'rechnung';
return $postData;
}
}