2021-05-21 08:49:41 +02:00
< ? php
2022-05-23 21:03:20 +02:00
/*
**** 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 ****
2021-05-21 08:49:41 +02:00
*/
?>
2022-05-23 21:03:20 +02:00
< ? php
use Xentral\Components\Pdf\Exception\PdfComponentExceptionInterface ;
use Xentral\Components\Pdf\PdfMerger ;
include_once __DIR__ . '/_gen/rechnung.php' ;
//require_once("Payment/DTA.php"); //PEAR
class Rechnung extends GenRechnung
{
/**
* Rechnung constructor .
*
* @ param Application $app
* @ param bool $intern
*/
public function __construct ( $app , $intern = false )
{
/** @var Application app */
$this -> app = $app ;
if ( $intern )
{
return ;
}
$this -> app -> ActionHandlerInit ( $this );
$this -> app -> ActionHandler ( " list " , " RechnungList " );
$this -> app -> ActionHandler ( " create " , " RechnungCreate " );
$this -> app -> ActionHandler ( " positionen " , " RechnungPositionen " );
$this -> app -> ActionHandler ( " uprechnungposition " , " UpRechnungPosition " );
$this -> app -> ActionHandler ( " delrechnungposition " , " DelRechnungPosition " );
$this -> app -> ActionHandler ( " copyrechnungposition " , " CopyRechnungPosition " );
$this -> app -> ActionHandler ( " downrechnungposition " , " DownRechnungPosition " );
$this -> app -> ActionHandler ( " positioneneditpopup " , " RechnungPositionenEditPopup " );
$this -> app -> ActionHandler ( " search " , " RechnungSuche " );
$this -> app -> ActionHandler ( " mahnwesen " , " RechnungMahnwesen " );
$this -> app -> ActionHandler ( " edit " , " RechnungEdit " );
$this -> app -> ActionHandler ( " delete " , " RechnungDelete " );
$this -> app -> ActionHandler ( " gutschrift " , " RechnungGutschrift " );
$this -> app -> ActionHandler ( " copy " , " RechnungCopy " );
$this -> app -> ActionHandler ( " zertifikate " , " RechnungZertifikate " );
$this -> app -> ActionHandler ( " freigabe " , " RechnungFreigabe " );
$this -> app -> ActionHandler ( " abschicken " , " RechnungAbschicken " );
$this -> app -> ActionHandler ( " pdf " , " RechnungPDF " );
2024-10-31 21:43:05 +01:00
$this -> app -> ActionHandler ( " xml " , " RechnungSmarty " );
$this -> app -> ActionHandler ( " json " , " RechnungJSON " );
2022-05-23 21:03:20 +02:00
$this -> app -> ActionHandler ( " alternativpdf " , " RechnungAlternativPDF " );
$this -> app -> ActionHandler ( " inlinepdf " , " RechnungInlinePDF " );
$this -> app -> ActionHandler ( " lastschrift " , " RechnungLastschrift " );
$this -> app -> ActionHandler ( " protokoll " , " RechnungProtokoll " );
$this -> app -> ActionHandler ( " zahlungseingang " , " RechnungZahlungseingang " );
$this -> app -> ActionHandler ( " minidetail " , " RechnungMiniDetail " );
$this -> app -> ActionHandler ( " editable " , " RechnungEditable " );
$this -> app -> ActionHandler ( " livetabelle " , " RechnungLiveTabelle " );
$this -> app -> ActionHandler ( " schreibschutz " , " RechnungSchreibschutz " );
$this -> app -> ActionHandler ( " undostorno " , " RechnungUndostorno " );
$this -> app -> ActionHandler ( " manuellbezahltmarkiert " , " RechnungManuellBezahltMarkiert " );
$this -> app -> ActionHandler ( " manuellbezahltentfernen " , " RechnungManuellBezahltEntfernen " );
$this -> app -> ActionHandler ( " zahlungsmahnungswesen " , " RechnungZahlungMahnungswesen " );
$this -> app -> ActionHandler ( " deleterabatte " , " RechnungDeleteRabatte " );
$this -> app -> ActionHandler ( " updateverband " , " RechnungUpdateVerband " );
$this -> app -> ActionHandler ( " lastschriftwdh " , " RechnungLastschriftWdh " );
$this -> app -> ActionHandler ( " dateien " , " RechnungDateien " );
$this -> app -> ActionHandler ( " pdffromarchive " , " RechnungPDFfromArchiv " );
$this -> app -> ActionHandler ( " archivierepdf " , " RechnungArchivierePDF " );
$this -> app -> ActionHandler ( " summe " , " RechnungSumme " ); // nur fuer rechte
2024-11-19 18:05:09 +01:00
$this -> app -> ActionHandler ( " belegnredit " , " belegnredit " ); // nur fuer rechte
2022-05-23 21:03:20 +02:00
$this -> app -> ActionHandler ( " einkaufspreise " , " RechnungEinkaufspreise " );
$this -> app -> ActionHandler ( " steuer " , " RechnungSteuer " );
$this -> app -> ActionHandler ( " formeln " , " RechnungFormeln " );
$this -> app -> DefaultActionHandler ( " list " );
$id = $this -> app -> Secure -> GetGET ( " id " );
$nummer = $this -> app -> Secure -> GetPOST ( " adresse " );
if ( $nummer == '' ){
if ( $id > 0 ){
$adresse = $this -> app -> DB -> Select ( " SELECT a.name FROM rechnung b INNER JOIN adresse a ON a.id=b.adresse WHERE b.id=' $id ' LIMIT 1 " );
} else {
$adresse = '' ;
}
}
else {
$adresse = $nummer ;
}
if ( $id > 0 ){
$nummer = $this -> app -> DB -> Select ( " SELECT b.belegnr FROM rechnung b WHERE b.id=' $id ' LIMIT 1 " );
} else {
$nummer = '' ;
}
if ( $nummer == " " || $nummer == 0 ) $nummer = " ohne Nummer " ;
$this -> app -> Tpl -> Set ( 'UEBERSCHRIFT' , " Rechnung: " . $adresse . " ( " . $nummer . " ) " );
$this -> app -> Tpl -> Set ( 'FARBE' , " [FARBE4] " );
$this -> app -> erp -> Headlines ( 'Rechnung' );
$this -> app -> ActionHandlerListen ( $app );
}
public function Install ()
{
$this -> app -> erp -> RegisterHook ( 'supersearch_detail' , 'rechnung' , 'RechnungSupersearchDetail' );
}
/**
* @ param \Xentral\Widgets\SuperSearch\Query\DetailQuery $detailQuery
* @ param \Xentral\Widgets\SuperSearch\Result\ResultDetail $detailResult
*
* @ return void
*/
public function RechnungSupersearchDetail ( $detailQuery , $detailResult )
{
if ( $detailQuery -> getGroupKey () !== 'invoices' ) {
return ;
}
$rechnungId = $detailQuery -> getItemIdentifier ();
$sql = sprintf (
" SELECT r.id, r.belegnr, r.datum, r.soll FROM `rechnung` AS `r` WHERE r.id = '%s' LIMIT 1 " ,
$this -> app -> DB -> real_escape_string ( $rechnungId )
);
$rechnung = $this -> app -> DB -> SelectRow ( $sql );
if ( empty ( $rechnung )) {
return ;
}
$datum = date ( 'd.m.Y' , strtotime ( $rechnung [ 'datum' ]));
$detailResult -> setTitle ( sprintf ( 'Rechnung %s' , $rechnung [ 'belegnr' ]));
$detailResult -> addButton ( 'Rechnung Details' , sprintf ( 'index.php?module=rechnung&action=edit&id=%s' , $rechnung [ 'id' ]));
$detailResult -> setMiniDetailUrl ( sprintf ( 'index.php?module=rechnung&action=minidetail&id=%s' , $rechnung [ 'id' ]));
}
/** @var Application app */
function RechnungFormeln ()
{
}
/**
* @ param string $typ
*
* @ return string
*/
function Custom ( $typ )
{
return '' ;
}
function RechnungSteuer ()
{
}
function RechnungEinkaufspreise ()
{
}
function RechnungSumme ()
{
}
function RechnungAlternativPDF ()
{
$id = ( int ) $this -> app -> Secure -> GetGET ( 'id' );
$abweichendebezeichnung = $this -> app -> DB -> Select ( " SELECT abweichendebezeichnung FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$projekt = $this -> app -> DB -> Select ( " SELECT projekt FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$this -> app -> DB -> Update ( " UPDATE rechnung SET abweichendebezeichnung=1 WHERE id=' $id ' LIMIT 1 " );
// Rechnungen
if ( class_exists ( 'RechnungPDFCustom' ))
{
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
} else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $id );
if ( $abweichendebezeichnung != " 1 " )
$this -> app -> DB -> Update ( " UPDATE rechnung SET abweichendebezeichnung=0 WHERE id=' $id ' LIMIT 1 " );
$Brief -> displayDocument ();
$this -> app -> ExitXentral ();
}
function RechnungArchivierePDF ()
{
$id = ( int ) $this -> app -> Secure -> GetGET ( 'id' );
$projekt = $this -> app -> DB -> Select ( " SELECT projekt FROM rechnung WHERE id = ' $id ' LIMIT 1 " );
$this -> app -> erp -> BriefpapierHintergrunddisable = ! $this -> app -> erp -> BriefpapierHintergrunddisable ;
if ( class_exists ( 'RechnungPDFCustom' ))
{
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
} else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $id );
$tmpfile = $Brief -> displayTMP ();
$Brief -> ArchiviereDocument ( 1 );
unlink ( $tmpfile );
$this -> app -> erp -> BriefpapierHintergrunddisable = ! $this -> app -> erp -> BriefpapierHintergrunddisable ;
if ( class_exists ( 'RechnungPDFCustom' ))
{
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
} else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $id );
$tmpfile = $Brief -> displayTMP ();
$Brief -> ArchiviereDocument ( 1 );
$this -> app -> DB -> Update ( " UPDATE rechnung SET schreibschutz='1' WHERE id=' $id ' " );
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=edit&id=' . $id );
}
function RechnungUpdateVerband ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$adresse = $this -> app -> DB -> Select ( " SELECT adresse FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" info \" >Die Verbandsinformation wurde neu geladen!</div> " );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id &msg= $msg " );
}
function RechnungLastschriftWdh ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> app -> DB -> Update ( " UPDATE rechnung SET zahlungsstatus='offen',dta_datei=0 WHERE id=' $id ' LIMIT 1 " );
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" info \" >Die Rechnung kann nochmal eingezogen werden!</div> " );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id &msg= $msg " );
}
function RechnungDateien ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> RechnungMenu ();
$this -> app -> Tpl -> Add ( 'UEBERSCHRIFT' , ' (Dateien)' );
$this -> app -> YUI -> DateiUpload ( 'PAGE' , 'Rechnung' , $id );
}
function RechnungDeleteRabatte ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> app -> DB -> Update ( " UPDATE rechnung SET rabatt='',rabatt1='',rabatt2='',rabatt3='',rabatt4='',rabatt5='',realrabatt='' WHERE id=' $id ' LIMIT 1 " );
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" info \" >Die Rabatte wurden entfernt!</div> " );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id &msg= $msg " );
}
/**
* @ param int $invoiceId
*
* @ return bool
*/
public function removeManualPayed ( $invoiceId )
{
2023-04-11 15:40:23 +02:00
if ( empty ( $invoiceId ) || ! $this -> app -> DB -> Select ( sprintf ( 'SELECT id FROM rechnung WHERE id = %d' , $invoiceId ))) {
2022-05-23 21:03:20 +02:00
return false ;
}
$this -> app -> erp -> RechnungProtokoll ( $invoiceId , 'Rechnung manuell als bezahlt entfernt' );
$this -> app -> DB -> Update (
" UPDATE rechnung
2023-04-11 15:40:23 +02:00
SET zahlungsstatus = 'offen' , bezahlt_am = NULL ,
2022-05-23 21:03:20 +02:00
mahnwesen_internebemerkung = CONCAT ( mahnwesen_internebemerkung , '\r\n' , 'Manuell als bezahlt entfernt am ".date(' d . m . Y ')."' )
WHERE id = '$invoiceId' "
);
2023-04-11 15:40:23 +02:00
return true ;
2022-05-23 21:03:20 +02:00
}
public function RechnungManuellBezahltEntfernen ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> removeManualPayed ( $id );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id " );
}
public function RechnungUndostorno ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> app -> erp -> RechnungProtokoll ( $id , 'Rechnung Stornierung rückgängig gemacht' );
2023-04-11 15:40:23 +02:00
$this -> app -> DB -> Update ( " UPDATE rechnung SET status='freigegeben',zahlungsstatus='offen',schreibschutz=0,bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,' \r \n ','Rechnung Stornierung rückgängig gemacht " . date ( 'd.m.Y' ) . " ') WHERE id=' $id ' " );
2022-05-23 21:03:20 +02:00
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id " );
}
/**
* @ param int $innoiceId
*
* @ return bool
*/
public function setManualPayed ( $invoiceId )
{
if ( empty ( $invoiceId ) || ! $this -> app -> DB -> Select ( sprintf ( 'SELECT id FROM rechnung WHERE id = %d' , $invoiceId ))) {
return false ;
}
$this -> app -> erp -> RechnungProtokoll ( $invoiceId , 'Rechnung manuell als bezahlt markiert' );
$this -> app -> DB -> Update (
" UPDATE rechnung
2023-04-11 15:40:23 +02:00
SET zahlungsstatus = 'bezahlt' , bezahlt_am = now (), mahnwesenfestsetzen = '1' ,
2022-05-23 21:03:20 +02:00
mahnwesen_internebemerkung = CONCAT ( mahnwesen_internebemerkung , '\r\n' , 'Manuell als bezahlt markiert am ".date(' d . m . Y ')."' )
WHERE id = '$invoiceId' "
);
return true ;
}
public function RechnungManuellBezahltMarkiert ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> setManualPayed ( $id );
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=edit&id=' . $id );
}
/**
* @ param int $invoiceId
*/
public function removeWriteProtection ( $invoiceId ) {
if ( $invoiceId <= 0 ) {
return ;
}
$this -> app -> DB -> Update (
sprintf (
'UPDATE rechnung SET zuarchivieren=1, schreibschutz = 0 WHERE id=%d' ,
$invoiceId
)
);
$this -> app -> erp -> RechnungProtokoll ( $invoiceId , 'Schreibschutz entfernt' );
}
public function RechnungSchreibschutz ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> removeWriteProtection ( $id );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id " );
}
function RechnungCopy ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$newid = $this -> CopyRechnung ( $id );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $newid " );
}
/**
* @ param int $invoiceId
*/
public function addZertificates ( $invoiceId )
{
if ( $invoiceId <= 0 ) {
return ;
}
$addressId = $this -> app -> DB -> Select (
sprintf (
'SELECT adresse FROM rechnung WHERE id = %d' ,
$invoiceId
)
);
if ( $addressId <= 0 ) {
return ;
}
$zertificates = $this -> app -> DB -> SelectArr (
sprintf (
" SELECT ds.datei
FROM datei_stichwoerter ds
INNER JOIN datei_stichwoerter ds2 ON ds . datei = ds2 . datei AND ds2 . objekt = 'Artikel'
INNER JOIN rechnung_position ap ON ap . artikel = ds2 . parameter AND ap . rechnung = % d
WHERE ds . objekt = 'Adressen' AND ds . parameter = % d
GROUP BY ds . datei " ,
$invoiceId , $addressId
)
);
if ( empty ( $zertificates )) {
return ;
}
foreach ( $zertificates as $zertificate ) {
$this -> app -> erp -> AddDateiStichwort ( $zertificate [ 'datei' ], 'Sonstige' , 'Rechnung' , $invoiceId );
}
}
function RechnungZertifikate ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> addZertificates ( $id );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=dateien&id= $id " );
}
public function RechnungIconMenu ( $id , $prefix = '' )
{
if ( $id > 0 ){
$rechnungarr = $this -> app -> DB -> SelectRow (
2024-12-01 19:46:25 +01:00
" SELECT status,zahlungsstatus,erechnung,belegnr FROM rechnung WHERE id=' $id ' LIMIT 1 "
2022-05-23 21:03:20 +02:00
);
}
$status = '' ;
$zahlungsstatus = '' ;
if ( ! empty ( $rechnungarr )){
$status = $rechnungarr [ 'status' ]; //$this->app->DB->Select("SELECT status FROM rechnung WHERE id='$id' LIMIT 1");
$zahlungsstatus = $rechnungarr [ 'zahlungsstatus' ]; //$this->app->DB->Select("SELECT zahlungsstatus FROM rechnung WHERE id='$id' LIMIT 1");
}
$freigabe = " " ;
$storno = " " ;
$bezahlt = " " ;
$weiterfuehren = " " ;
$optionteilstorno = " " ;
$checkifgsexists = $this -> app -> DB -> Select ( " SELECT id FROM gutschrift WHERE rechnungid=' $id ' LIMIT 1 " );
if ( $status === " angelegt " || $status == " " )
{
$freigabe = " <option value= \" freigabe \" >Rechnung freigeben</option> " ;
$storno = " <option value= \" storno \" >Rechnung (ENTWURF) löschen</option> " ;
} else {
$weiterfuehren = " <option value= \" gutschrift \" >als Gutschrift / " . $this -> app -> erp -> Firmendaten ( " bezeichnungstornorechnung " ) . " </option> " ;
}
$casehook = '' ;
$optionhook = '' ;
$this -> app -> erp -> RunHook ( 'rechnungiconmenu_option' , 5 , $id , $casehook , $optionhook , $status , $prefix );
if ( $this -> app -> erp -> RechteVorhanden ( " rechnung " , " undostorno " ) && ! $checkifgsexists )
$undostorno = " <option value= \" undostorno \" >Rechnung Storno rückgängig</option> " ;
if ( $this -> app -> erp -> RechteVorhanden ( " rechnung " , " manuellbezahltmarkiert " ) && $zahlungsstatus == " offen " )
$bezahlt = " <option value= \" manuellbezahltmarkiert \" >manuell als bezahlt markieren</option> " ;
if ( $this -> app -> erp -> RechteVorhanden ( " rechnung " , " manuellbezahltentfernen " ) && $zahlungsstatus == " bezahlt " )
$bezahlt = " <option value= \" manuellbezahltentfernen \" >manuell bezahlt entfernen</option> " ;
$zertifikatoption = '' ;
$zertifikatcase = '' ;
$optioncustom = $this -> Custom ( 'option' );
$casecustom = $this -> Custom ( 'case' );
$hookoption = '' ;
$hookcase = '' ;
$this -> app -> erp -> RunHook ( 'Rechnung_Aktion_option' , 3 , $id , $status , $hookoption );
$this -> app -> erp -> RunHook ( 'Rechnung_Aktion_case' , 3 , $id , $status , $hookcase );
2024-03-13 10:45:11 +01:00
/*
2022-05-23 21:03:20 +02:00
//TODO das muss dann später in den Hook
$RechnungzuVerbindlichkeitOption = " <option value= \" rechnungzuverbindlichkeit \" >Rechnung zu Verbindlichkeit</option> " ;
$RechnungzuVerbindlichkeitCase = " case 'rechnungzuverbindlichkeit': if(!confirm('Wirklich Verbindlichkeit anlegen?')) return document.getElementById('aktion $prefix ').selectedIndex = 0; else window.location.href='index.php?module=rechnungzuverbindlichkeit&action=create&id=%value%'; break; " ;
2024-03-13 10:45:11 +01:00
*/
2022-05-23 21:03:20 +02:00
if ( $this -> app -> erp -> RechteVorhanden ( 'zertifikatgenerator' , 'list' ))
{
$adresse = $this -> app -> DB -> Select ( " SELECT adresse FROM rechnung WHERE id = ' $id ' LIMIT 1 " );
if ( $adresse )
{
$zertifikate = $this -> app -> DB -> Select ( " SELECT ds.datei
FROM datei_stichwoerter ds
INNER JOIN datei_stichwoerter ds2 ON ds . datei = ds2 . datei AND ds2 . objekt = 'Artikel'
INNER JOIN rechnung_position ap ON ap . artikel = ds2 . parameter AND ap . rechnung = '$id'
WHERE ds . objekt = 'Adressen' AND ds . parameter = '$adresse'
GROUP BY ds . datei LIMIT 1 " );
if ( $zertifikate )
{
$zertifikatoption = '<option value="zertifikate">Zertifikate anhängen</option>' ;
$zertifikatcase = " case 'zertifikate': if(!confirm('Zertifikate wirklich laden?')) return document.getElementById('aktion $prefix ').selectedIndex = 0; else window.location.href='index.php?module=rechnung&action=zertifikate&id=%value%'; break; " ;
}
}
}
if ( $this -> app -> erp -> RechteVorhanden ( 'belegeimport' , 'belegcsvexport' ))
{
$casebelegeimport = " case 'belegeimport': window.location.href='index.php?module=belegeimport&action=belegcsvexport&cmd=rechnung&id=%value%'; break; " ;
$optionbelegeimport = " <option value= \" belegeimport \" >Export als CSV</option> " ;
}
if ( $checkifgsexists > 0 ) $extendtext = " HINWEIS: Es existiert bereits eine Gutschrift zu dieser Rechnung! " ; else $extendtext = " " ;
$menu = "
< script type = \ " text/javascript \" >
function onchangerechnung ( cmd )
{
switch ( cmd )
{
case 'storno' : if ( ! confirm ( 'Wirklich stornieren?' )) return document . getElementById ( 'aktion$prefix' ) . selectedIndex = 0 ; else window . location . href = 'index.php?module=rechnung&action=delete&id=%value%' ; break ;
case 'undostorno' : if ( ! confirm ( 'Wirklich die Stornierung rückgängig machen?' )) return document . getElementById ( 'aktion$prefix' ) . selectedIndex = 0 ; else window . location . href = 'index.php?module=rechnung&action=undostorno&id=%value%' ; break ;
case 'copy' : if ( ! confirm ( 'Wirklich kopieren?' )) return document . getElementById ( 'aktion$prefix' ) . selectedIndex = 0 ; else window . location . href = 'index.php?module=rechnung&action=copy&id=%value%' ; break ;
case 'gutschrift' : if ( ! confirm ( '".$extendtext."Wirklich als Gutschrift / ".$this->app->erp->Firmendaten("bezeichnungstornorechnung")." weiterführen?' )) return document . getElementById ( 'aktion$prefix' ) . selectedIndex = 0 ; else window . location . href = 'index.php?module=rechnung&action=gutschrift&id=%value%' ; break ;
$optionteilstorno
$RechnungzuVerbindlichkeitCase
case 'pdf' : window . location . href = 'index.php?module=rechnung&action=pdf&id=%value%' ; document . getElementById ( 'aktion$prefix' ) . selectedIndex = 0 ; break ;
case 'abschicken' : " . $this->app ->erp->DokumentAbschickenPopup(). " break ;
case 'manuellbezahltmarkiert' : window . location . href = 'index.php?module=rechnung&action=manuellbezahltmarkiert&id=%value%' ; break ;
case 'manuellbezahltentfernen' : window . location . href = 'index.php?module=rechnung&action=manuellbezahltentfernen&id=%value%' ; break ;
case 'freigabe' : window . location . href = 'index.php?module=rechnung&action=freigabe&id=%value%' ; break ;
$zertifikatcase
$casebelegeimport
$casecustom
$hookcase
$casehook
}
}
</ script >
& nbsp ; Aktion :& nbsp ; < select id = \ " aktion $prefix\ " onchange = \ " onchangerechnung(this.value) \" >
< option > bitte w & auml ; hlen ...</ option >
< option value = \ " copy \" >Rechnung kopieren</option>
$freigabe
< option value = \ " abschicken \" >Rechnung abschicken</option>
$RechnungzuVerbindlichkeitOption
$storno
$weiterfuehren
$undostorno
$optionbelegeimport
< option value = \ " pdf \" >PDF öffnen</option>
$bezahlt
$zertifikatoption
$optioncustom
$optionhook
$hookoption
</ select >& nbsp ;
" ;
2024-12-01 19:46:25 +01:00
if ( ! empty ( $rechnungarr [ 'belegnr' ])) {
if ( $rechnungarr [ 'erechnung' ]) {
$downloadicon = " <a href= \" index.php?module=rechnung&action=xml&id=%value% \" ><img border= \" 0 \" src= \" ./themes/new/images/xml.svg \" title= \" XML \" ></a> " ;
} else {
$downloadicon = " <a href= \" index.php?module=rechnung&action=pdf&id=%value% \" ><img border= \" 0 \" src= \" ./themes/new/images/pdf.svg \" title= \" PDF \" ></a> " ;
}
} else {
$downloadicon = '' ;
}
$menu .= $downloadicon ;
$menu .=
" <!-- <a href= \" index.php?module=rechnung&action=edit&id=%value% \" title= \" Bearbeiten \" ><img border= \" 0 \" src= \" ./themes/new/images/edit.svg \" ></a>
2022-05-23 21:03:20 +02:00
< a onclick = \ " if(!confirm('Wirklich stornieren?')) return false; else window.location.href='index.php?module=rechnung&action=delete&id=%value%'; \" title= \" Stornieren \" >
< img src = \ " ./themes/new/images/delete.svg \" border= \" 0 \" ></a>
< a onclick = \ " if(!confirm('Wirklich kopieren?')) return false; else window.location.href='index.php?module=rechnung&action=copy&id=%value%'; \" title= \" Kopieren \" >
< img src = \ " ./themes/new/images/copy.svg \" border= \" 0 \" ></a>
< a onclick = \ " if(!confirm('Wirklich als Gutschrift weiterführen?')) return false; else window.location.href='index.php?module=rechnung&action=gutschrift&id=%value%'; \" title= \" als Gutschrift weiterführen \" >
< img src = \ " ./themes/new/images/lieferung.png \" border= \" 0 \" alt= \" weiterführen als Gutschrift \" ></a>--> " ;
//$tracking = $this->AuftragTrackingTabelle($id);
$menu = str_replace ( '%value%' , $id , $menu );
return $menu ;
}
function RechnungLiveTabelle ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$table = new EasyTable ( $this -> app );
$table -> Query (
" SELECT ap.bezeichnung as artikel, ap.nummer as Nummer, ap.menge as Menge
FROM rechnung_position ap , artikel a
WHERE ap . rechnung = '$id' AND a . id = ap . artikel "
);
$artikel = $table -> DisplayNew ( 'return' , 'Menge' , 'noAction' );
echo $artikel ;
$this -> app -> ExitXentral ();
}
public function RechnungEditable ()
{
$this -> app -> YUI -> AARLGEditable ();
}
public function RechnungPDFfromArchiv ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$archiv = $this -> app -> DB -> Select ( " SELECT table_id from pdfarchiv where id = ' $id ' LIMIT 1 " );
if ( $archiv ) {
$projekt = $this -> app -> DB -> Select ( " SELECT projekt from rechnung where id = ' " . ( int ) $archiv . " ' " );
}
if ( class_exists ( 'RechnungPDFCustom' )) {
if ( $archiv ) {
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
}
}
else {
if ( $archiv ) {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
}
if ( $archiv && $content = $Brief -> getArchivByID ( $id )) {
header ( 'Content-type: application/pdf' );
header ( 'Content-Disposition: attachment; filename="' . $content [ 'belegnr' ] . '.pdf"' );
echo $content [ 'file' ];
$this -> app -> ExitXentral ();
}
header ( 'Content-type: application/pdf' );
header ( 'Content-Disposition: attachment; filename="Fehler.pdf"' );
$this -> app -> ExitXentral ();
}
public function RechnungMiniDetail ( $parsetarget = '' , $menu = true )
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
if ( ! $this -> app -> DB -> Select ( " SELECT deckungsbeitragcalc FROM rechnung WHERE id=' $id ' LIMIT 1 " )) {
$this -> app -> erp -> BerechneDeckungsbeitrag ( $id , 'rechnung' );
}
$auftragArr = $this -> app -> DB -> SelectArr ( " SELECT * FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$kundennummer = $this -> app -> DB -> Select ( " SELECT kundennummer FROM adresse WHERE id=' { $auftragArr [ 0 ][ 'adresse' ] } ' LIMIT 1 " );
$projekt = $this -> app -> DB -> Select ( " SELECT abkuerzung FROM projekt WHERE id=' { $auftragArr [ 0 ][ 'projekt' ] } ' LIMIT 1 " );
$kundenname = $this -> app -> DB -> Select ( " SELECT name FROM adresse WHERE id=' { $auftragArr [ 0 ][ 'adresse' ] } ' LIMIT 1 " );
$this -> app -> Tpl -> Set ( 'DECKUNGSBEITRAG' , 0 );
$this -> app -> Tpl -> Set ( 'DBPROZENT' , 0 );
$this -> app -> Tpl -> Set ( 'KUNDE' , " <a href= \" index.php?module=adresse&action=edit&id= " . $auftragArr [ 0 ][ 'adresse' ] . " \" > " . $kundennummer . " </a> " . $kundenname );
if ( $this -> app -> erp -> RechteVorhanden ( 'projekt' , 'dashboard' )){
$this -> app -> Tpl -> Set ( 'PROJEKT' , " <a href= \" index.php?module=projekt&action=dashboard&id= " . $auftragArr [ 0 ][ 'projekt' ] . " \" target= \" _blank \" > $projekt </a> " );
}
else {
$this -> app -> Tpl -> Set ( 'PROJEKT' , $projekt );
}
2023-06-24 10:57:59 +02:00
$this -> app -> Tpl -> Set ( 'ZAHLWEISE' , ucfirst ( $auftragArr [ 0 ][ 'zahlungsweise' ]));
2022-05-23 21:03:20 +02:00
$this -> app -> Tpl -> Set ( 'STATUS' ,( $auftragArr [ 0 ][ 'status' ] === 'storniert' && $auftragArr [ 0 ][ 'teilstorno' ] == 1 ? 'teilstorniert' : $auftragArr [ 0 ][ 'status' ]));
$this -> app -> Tpl -> Set ( 'IHREBESTELLNUMMER' , $auftragArr [ 0 ][ 'ihrebestellnummer' ]);
$this -> app -> Tpl -> Set ( 'DEBITORENNUMMER' , $auftragArr [ 0 ][ 'kundennummer_buchhaltung' ]);
if ( $auftragArr [ 0 ][ 'mahnwesen' ] == '' ) {
$auftragArr [ 0 ][ 'mahnwesen' ] = '-' ;
}
2023-06-13 18:30:48 +02:00
2023-06-24 10:57:59 +02:00
$mahnwesen_name = $this -> app -> DB -> SelectArr ( " SELECT name FROM mahnwesen WHERE id=' " . $auftragArr [ 0 ][ 'mahnwesen' ] . " ' LIMIT 1 " )[ 0 ][ 'name' ];
$this -> app -> Tpl -> Set ( 'MAHNWESEN' , $mahnwesen_name );
2023-06-13 18:30:48 +02:00
2022-05-23 21:03:20 +02:00
if ( $auftragArr [ 0 ][ 'mahnwesen_datum' ] == '0000-00-00' ) {
$auftragArr [ 0 ][ 'mahnwesen_datum' ] = '-' ;
}
if ( ! empty ( $auftragArr [ 0 ][ 'kundennummer_buchhaltung' ])) {
$this -> app -> Tpl -> Set ( 'DEBITORENNUMMER' , $auftragArr [ 0 ][ 'kundennummer_buchhaltung' ]);
}
$internet = $this -> app -> DB -> Select ( " SELECT a.internet FROM rechnung r LEFT JOIN auftrag a ON a.id=r.auftragid WHERE r.id=' $id ' AND r.id > 0 LIMIT 1 " );
$this -> app -> Tpl -> Set ( 'INTERNET' , $internet );
$this -> app -> Tpl -> Set ( 'MAHNWESENDATUM' , $this -> app -> String -> Convert ( $auftragArr [ 0 ][ 'mahnwesen_datum' ], " %1-%2-%3 " , " %3.%2.%1 " ));
$ab_datum = $this -> app -> String -> Convert ( $auftragArr [ 0 ][ 'datum' ], " %1-%2-%3 " , " %3.%2.%1 " );
if ( $auftragArr [ 0 ][ 'auftragid' ] == 0 ) $auftragArr [ 0 ][ 'auftrag' ] = " kein Auftrag " ;
$auftragArr [ 0 ][ 'auftrag' ] = $this -> app -> DB -> Select ( " SELECT belegnr FROM auftrag WHERE id=' " . $auftragArr [ 0 ][ 'auftragid' ] . " ' LIMIT 1 " );
if ( $auftragArr [ 0 ][ 'auftragid' ] > 0 )
{
$this -> app -> Tpl -> Set ( 'AUFTRAG' , " <a href= \" index.php?module=auftrag&action=edit&id= " . $auftragArr [ 0 ][ 'auftragid' ] . " \" target= \" _blank \" title= \" $ab_datum\ " > " . $auftragArr[0] ['auftrag']. " </ a >& nbsp ;
< a href = \ " index.php?module=auftrag&action=pdf&id= " . $auftragArr [ 0 ][ 'auftragid' ] . " \" target= \" _blank \" ><img src= \" ./themes/new/images/pdf.svg \" title= \" Auftrag PDF \" border= \" 0 \" ></a>
< a href = \ " index.php?module=auftrag&action=edit&id= " . $auftragArr [ 0 ][ 'auftragid' ] . " \" target= \" _blank \" ><img src= \" ./themes/new/images/edit.svg \" title= \" Auftrag bearbeiten \" border= \" 0 \" ></a> " );
} else {
$this -> app -> Tpl -> Set ( 'AUFTRAG' , '-' );
}
$auftraege = $this -> app -> DB -> SelectArr ( " (SELECT a.belegnr, a.id FROM sammelrechnung_position s
INNER JOIN auftrag_position ap on ap . id = s . auftrag_position_id INNER JOIN auftrag a on a . id = ap . auftrag
WHERE s . rechnung = '".$id."' GROUP BY a . id ORDER BY a . belegnr )
union ( SELECT
a . belegnr , a . id FROM sammelrechnung_position s INNER JOIN lieferschein_position lp ON lp . id = s . lieferschein_position_id
INNER JOIN auftrag_position ap on ap . id = lp . auftrag_position_id INNER JOIN
auftrag a on a . id = ap . auftrag
WHERE s . rechnung = '".$id."' GROUP BY a . id ORDER BY a . belegnr )
" );
if ( $auftraege )
{
$this -> app -> Tpl -> Set ( 'AUFTRAG' , '' );
$first = true ;
foreach ( $auftraege as $k => $v )
{
if ( ! $first ) $this -> app -> Tpl -> Add ( 'AUFTRAG' , '<br />' );
if ( $v [ 'id' ] > 0 )
{
if ( empty ( $v [ 'belegnr' ])) {
$v [ 'belegnr' ] = 'ENTWURF' ;
}
$this -> app -> Tpl -> Add ( 'AUFTRAG' , " <a href= \" index.php?module=auftrag&action=edit&id= " . $v [ 'id' ] . " \" target= \" _blank \" > " . $v [ 'belegnr' ] . " </a>
< a href = \ " index.php?module=auftrag&action=pdf&id= " . $v [ 'id' ] . " \" target= \" _blank \" ><img src= \" ./themes/new/images/pdf.svg \" title= \" Auftrag PDF \" border= \" 0 \" ></a>
< a href = \ " index.php?module=auftrag&action=edit&id= " . $v [ 'id' ] . " \" target= \" _blank \" ><img src= \" ./themes/new/images/edit.svg \" title= \" Auftrag bearbeiten \" border= \" 0 \" ></a> " );
}
$first = false ;
}
}
$gutschrift = $this -> app -> DB -> SelectArr ( " SELECT
CONCAT ( '<a href=\"index.php?module=gutschrift&action=edit&id=' , g . id , '\" target=\"_blank\">' , if ( g . belegnr = '0' OR g . belegnr = '' , 'ENTWURF' , g . belegnr ), ' <a href=\"index.php?module=gutschrift&action=pdf&id=' , g . id , ' \ " ><img src= \" ./themes/new/images/pdf.svg \" title= \" Gutschrift PDF \" border= \" 0 \" ></a>
< a href = \ " index.php?module=gutschrift&action=edit&id=',g.id,' \" target= \" _blank \" ><img src= \" ./themes/new/images/edit.svg \" title= \" Gutschrift bearbeiten \" border= \" 0 \" ></a>') as gutschrift
FROM gutschrift g WHERE g . rechnungid = '$id' " );
if ( ! empty ( $gutschrift ))
{
2022-06-10 11:28:28 +02:00
$cgutschrift = ! empty (( ! empty ( $gutschrift ) ? count ( $gutschrift ) : 0 )) ? : 0 ;
2022-05-23 21:03:20 +02:00
for ( $li = 0 ; $li < $cgutschrift ; $li ++ )
{
$this -> app -> Tpl -> Add ( 'GUTSCHRIFT' , $gutschrift [ $li ][ 'gutschrift' ]);
2022-06-10 11:28:28 +02:00
if ( $li < ( ! empty ( $gutschrift ) ? count ( $gutschrift ) : 0 )){
2022-05-23 21:03:20 +02:00
$this -> app -> Tpl -> Add ( 'GUTSCHRIFT' , " <br> " );
}
}
}
else {
$this -> app -> Tpl -> Set ( 'GUTSCHRIFT' , " - " );
}
$returnOrders = ( array ) $this -> app -> DB -> SelectArr (
sprintf (
' SELECT ro . id , ro . belegnr , ro . status
FROM `rechnung` AS `i`
INNER JOIN `auftrag` AS `o` ON i . auftragid = o . id OR i . id = o . rechnungid
LEFT JOIN `lieferschein` AS `dn` ON o . id = dn . auftragid
INNER JOIN `retoure` AS `ro` ON o . id = ro . auftragid OR dn . id = ro . lieferscheinid
WHERE i . id = % d
ORDER BY ro . id ' ,
$id
)
);
$returnOrderHtml = [];
foreach ( $returnOrders as $returnOrderKey => $returnOrder ) {
$returnOrderId = $returnOrder [ 'id' ];
$returnOrderNumber = $returnOrder [ 'belegnr' ];
if ( empty ( $returnOrderNumber )) {
$returnOrderNumber = 'ENTWURF' ;
}
$isReturnOrderCanceled = $returnOrder [ 'status' ] === 'storniert' ;
$returnOrderHtml [] = '<a href="index.php?module=retoure&action=edit&id='
. $returnOrderId . '" target="_blank">'
. ( $isReturnOrderCanceled ? '<s>' : '' ) . $returnOrderNumber . ( $isReturnOrderCanceled ? '</s>' : '' )
. ' </ a >
< a href = " index.php?module=retoure&action=pdf&id='
. $returnOrderId
. ' " target= " _blank " ><img src= " ./ themes / new / images / pdf . svg " alt= " Retoure PDF " title= " Retoure PDF " border= " 0 " ></a>
< a href = " index.php?module=retoure&action=edit&id='
. $returnOrderId
. '" target="_blank"><img src="./themes/new/images/edit.svg" alt="Retoure bearbeiten" title="Retoure bearbeiten" border="0"></a>' ;
}
$this -> app -> Tpl -> Set ( 'RETOURE' , implode ( '<br />' , $returnOrderHtml ));
$sammelrechnung = false ;
if ( $this -> app -> DB -> Select ( " SELECT id FROM sammelrechnung_position LIMIT 1 " )) $sammelrechnung = true ;
$gruppenrechnung = false ;
// if($this->app->DB->Select("SELECT id FROM gruppenrechnung_position LIMIT 1"))$gruppenrechnung = true;
$rechnungid = false ;
$this -> app -> DB -> Select ( " SELECT rechnungid FROM lieferschein LIMIT 1 " );
if ( ! $this -> app -> DB -> error ()) $rechnungid = true ;
$lieferscheinsql = "
SELECT CONCAT ( '<a href=\"index.php?module=lieferschein&action=edit&id=' , l . id , '\" target=\"_blank\">' , if ( l . status != 'angelegt' , l . belegnr , 'ENTWURF' ), '</a> <a href=\"index.php?module=lieferschein&action=pdf&id=' , l . id , ' \ " >
< img src = \ " ./themes/new/images/pdf.svg \" title= \" Lieferschein PDF \" border= \" 0 \" ></a>
< a href = \ " index.php?module=lieferschein&action=edit&id=',l.id,' \" target= \" _blank \" ><img src= \" ./themes/new/images/edit.svg \" title= \" Lieferschein bearbeiten \" border= \" 0 \" ></a>') as LS
FROM lieferschein l
INNER JOIN (
( SELECT id FROM lieferschein WHERE id = '{$auftragArr[0][' lieferschein ']}' )
" ;
if ( $rechnungid )
{
$lieferscheinsql .= "
UNION ALL
( SELECT id FROM lieferschein WHERE rechnungid = '$id' ) " ;
}
if ( $sammelrechnung )
{
$lieferscheinsql .= " UNION ALL
( SELECT l2 . id FROM lieferschein l2 INNER JOIN lieferschein_position lp2 ON lp2 . lieferschein = l2 . id
INNER JOIN sammelrechnung_position s ON lp2 . id = s . lieferschein_position_id WHERE s . rechnung = '$id' )
UNION ALL
( SELECT l3 . id FROM lieferschein l3 INNER JOIN lieferschein_position lp3 ON lp3 . lieferschein = l3 . id
INNER JOIN auftrag_position ap3 ON ap3 . id = lp3 . auftrag_position_id
INNER JOIN sammelrechnung_position s3 ON ap3 . id = s3 . auftrag_position_id WHERE s3 . rechnung = '$id' )
" ;
}
if ( $gruppenrechnung )
{
$lieferscheinsql .= "
UNION ALL
( SELECT l4 . id FROM lieferschein l4 INNER JOIN lieferschein_position lp4 ON lp4 . lieferschein = l4 . id
INNER JOIN gruppenrechnung_position s4 ON lp4 . id = s4 . lieferschein_position_id WHERE s4 . rechnung = '$id' )
UNION ALL
( SELECT l5 . id FROM lieferschein l5 INNER JOIN lieferschein_position lp5 ON lp5 . lieferschein = l5 . id
INNER JOIN auftrag_position ap5 ON ap5 . id = lp5 . auftrag_position_id
INNER JOIN gruppenrechnung_position s5 ON ap5 . id = s5 . auftrag_position_id WHERE s5 . rechnung = '$id' )
" ;
}
$lieferscheinsql .= "
) ls ON l . id = ls . id
LEFT JOIN projekt p ON l . projekt = p . id
WHERE 1 " . $this->app ->erp->ProjektRechte('p.id'). " GROUP BY l . id " ;
$lieferschein = $this -> app -> DB -> SelectArr ( $lieferscheinsql );
if ( $lieferschein == " " ) $this -> app -> Tpl -> Set ( 'LIEFERSCHEIN' , '-' );
else {
$first = true ;
$this -> app -> Tpl -> Set ( 'LIEFERSCHEIN' , '' );
foreach ( $lieferschein as $ls )
{
if ( ! $first ) $this -> app -> Tpl -> Add ( 'LIEFERSCHEIN' , '<br>' );
$this -> app -> Tpl -> Add ( 'LIEFERSCHEIN' , $ls [ 'LS' ]);
$first = false ;
}
}
if ( $auftragArr [ 0 ][ 'ust_befreit' ] == 0 )
$this -> app -> Tpl -> Set ( 'STEUER' , " Inland " );
else if ( $auftragArr [ 0 ][ 'ust_befreit' ] == 1 )
$this -> app -> Tpl -> Set ( 'STEUER' , " EU-Lieferung " );
else
$this -> app -> Tpl -> Set ( 'STEUER' , " Export " );
$this -> app -> Tpl -> Set ( 'DELIVERYTHRESHOLDVATID' , ! empty ( $auftragArr [ 0 ][ 'deliverythresholdvatid' ]) ? $auftragArr [ 0 ][ 'deliverythresholdvatid' ] : '' );
if ( $menu )
{
$menu = $this -> RechnungIconMenu ( $id );
$this -> app -> Tpl -> Set ( 'MENU' , $menu );
}
// ARTIKEL
$status = $this -> app -> DB -> Select ( " SELECT status FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$table = new EasyTable ( $this -> app );
$table -> Query ( " SELECT if(CHAR_LENGTH(ap.beschreibung) > 0,CONCAT(ap.bezeichnung,' *'),ap.bezeichnung) as artikel, CONCAT('<a href= \" index.php?module=artikel&action=edit&id=',ap.artikel,' \" target= \" _blank \" >', ap.nummer,'</a>') as Nummer, " . $this -> app -> erp -> FormatMenge ( " ap.menge " ) . " as Menge, " . $this -> app -> erp -> FormatPreis ( " ap.preis*(100-ap.rabatt)/100 " , 2 ) . " as Preis
FROM rechnung_position ap , artikel a WHERE ap . rechnung = '$id' AND a . id = ap . artikel ORDER by ap . sort " ,0, " " );
$table -> align = array ( 'left' , 'left' , 'right' , 'right' );
$artikel = $table -> DisplayNew ( " return " , " Preis " , " noAction " , " false " , 0 , 0 , false );
$this -> app -> Tpl -> Set ( 'ARTIKEL' , '<div id="artikeltabellelive' . $id . '">' . $artikel . '</div>' );
if ( $auftragArr [ 0 ][ 'belegnr' ] == " 0 " || $auftragArr [ 0 ][ 'belegnr' ] == " " ) $auftragArr [ 0 ][ 'belegnr' ] = " ENTWURF " ;
$this -> app -> Tpl -> Set ( 'BELEGNR' , " <a href= \" index.php?module=rechnung&action=edit&id= " . $auftragArr [ 0 ][ 'id' ] . " \" > " . $auftragArr [ 0 ][ 'belegnr' ] . " </a> " );
$this -> app -> Tpl -> Set ( 'RECHNUNGID' , $auftragArr [ 0 ][ 'id' ]);
if ( $auftragArr [ 0 ][ 'status' ] == " freigegeben " )
{
$this -> app -> Tpl -> Set ( 'ANGEBOTFARBE' , " orange " );
$this -> app -> Tpl -> Set ( 'ANGEBOTTEXT' , " Das Angebot wurde noch nicht als Auftrag weitergeführt! " );
}
else if ( $auftragArr [ 0 ][ 'status' ] == " versendet " )
{
$this -> app -> Tpl -> Set ( 'ANGEBOTFARBE' , " red " );
$this -> app -> Tpl -> Set ( 'ANGEBOTTEXT' , " Das Angebot versendet aber noch kein Auftrag vom Kunden erhalten! " );
}
else if ( $auftragArr [ 0 ][ 'status' ] == " beauftragt " )
{
$this -> app -> Tpl -> Set ( 'ANGEBOTFARBE' , " green " );
$this -> app -> Tpl -> Set ( 'ANGEBOTTEXT' , " Das Angebot wurde beauftragt und abgeschlossen! " );
}
else if ( $auftragArr [ 0 ][ 'status' ] == " angelegt " )
{
$this -> app -> Tpl -> Set ( 'ANGEBOTFARBE' , " grey " );
$this -> app -> Tpl -> Set ( 'ANGEBOTTEXT' , " Das Angebot wird bearbeitet und wurde noch nicht freigegeben und abgesendet! " );
}
2023-03-25 17:50:04 +01:00
2022-11-22 12:39:07 +01:00
$this -> app -> Tpl -> Set ( 'ZAHLUNGEN' , $this -> RechnungZahlung ( true ));
2022-05-23 21:03:20 +02:00
$this -> app -> Tpl -> Set ( 'RECHNUNGADRESSE' , $this -> Rechnungsadresse ( $auftragArr [ 0 ][ 'id' ]));
$tmp = new EasyTable ( $this -> app );
$tmp -> Query ( " SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung=' $id ' ORDER by zeit DESC " , 0 , " " );
$tmp -> DisplayNew ( 'PROTOKOLL' , " Protokoll " , " noAction " );
2023-06-13 18:30:48 +02:00
/*
2022-05-23 21:03:20 +02:00
$query = $this -> app -> DB -> SelectArr ( " SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung=' $id ' ORDER by zeit " );
if ( $query )
{
$zeit = 0 ;
foreach ( $query as $k => $row )
{
if ( strpos ( $row [ 'grund' ], 'Zahlungserinnerung' ) === 0 || strpos ( $row [ 'grund' ], 'Mahnung' ) === 0 )
{
if ( ! $zeit ) $zeit = $row [ 'zeit' ];
}
}
if ( $zeit )
{
$tmp2 = new EasyTable ( $this -> app );
2023-06-13 18:30:48 +02:00
$tmp2 -> Query ( " SELECT concat('<a href= \" index.php?module=mahnwesen&action=mahnpdf&id=',rechnung,'&datum=',DATE_FORMAT(zeit,'%d.%m.%Y'),'&mahnwesen=',LOWER(LEFT(grund,LOCATE(' ',grund))),' \" ><img src= \" themes/ { $this -> app -> Conf -> WFconf [ 'defaulttheme' ] } /images/pdf.svg \" border= \" 0 \" ></a>') as PDF, Date(zeit) as Datum, bearbeiter,grund FROM rechnung_protokoll WHERE rechnung=' $id ' AND zeit >= ' " . $zeit . " ' ORDER by zeit DESC " );
2022-05-23 21:03:20 +02:00
$tmp2 -> DisplayNew ( 'MAHNPROTOKOLL' , " Protokoll " , " noAction " );
}
2023-06-13 18:30:48 +02:00
} */
2022-05-23 21:03:20 +02:00
if ( class_exists ( 'RechnungPDFCustom' ))
{
$Brief = new RechnungPDFCustom ( $this -> app , $auftragArr [ 0 ][ 'projekt' ]);
} else {
$Brief = new RechnungPDF ( $this -> app , $auftragArr [ 0 ][ 'projekt' ]);
}
$Dokumentenliste = $Brief -> getArchivedFiles ( $id , 'rechnung' );
if ( $Dokumentenliste )
{
$tmp3 = new EasyTable ( $this -> app );
$tmp3 -> headings = array ( 'Datum' , 'Belegnr' , 'Bearbeiter' , 'Menü' );
foreach ( $Dokumentenliste as $k => $v )
{
if ( ! $v [ 'erstesoriginal' ])
{
$tmpr [ 'datum' ] = date ( 'd.m.Y H:i:s' , strtotime ( $v [ 'zeitstempel' ]));
$tmpr [ 'belegnr' ] = str_replace ( '.pdf' , '' , $v [ 'file' ]);
$tmpr [ 'belegnr' ] = substr ( $tmpr [ 'belegnr' ], strrpos ( $tmpr [ 'belegnr' ], '_' ) + 1 );
if ( isset ( $v [ 'belegnummer' ]) && $v [ 'belegnummer' ]) $tmpr [ 'belegnr' ] = $v [ 'belegnummer' ];
$tmpr [ 'bearbeiter' ] = $v [ 'bearbeiter' ];
$tmpr [ 'menu' ] = '<a href="index.php?module=rechnung&action=pdffromarchive&id=' . $v [ 'id' ] . '"><img src="themes/' . $this -> app -> Conf -> WFconf [ 'defaulttheme' ] . '/images/pdf.svg" /></a>' ;
$tmp3 -> datasets [] = $tmpr ;
}
}
$tmp3 -> DisplayNew ( 'PDFARCHIV' , 'Menü' , " noAction " );
}
if ( $parsetarget == '' )
{
$this -> app -> Tpl -> Output ( 'rechnung_minidetail.tpl' );
$this -> app -> ExitXentral ();
}
$this -> app -> Tpl -> Parse ( $parsetarget , 'rechnung_minidetail.tpl' );
}
/**
* @ param int $id
*
* @ return string
*/
public function Rechnungsadresse ( $id )
{
$data = $this -> app -> DB -> SelectArr (
" SELECT r.*, a.abweichende_rechnungsadresse
FROM rechnung AS r
INNER JOIN adresse AS a ON r . adresse = a . id
WHERE r . id = '$id'
LIMIT 1 "
);
foreach ( $data [ 0 ] as $key => $value )
{
if ( $data [ 0 ][ $key ] != '' && $key !== 'abweichendelieferadresse' && $key !== 'land' && $key !== 'plz'
&& $key !== 'lieferland' && $key !== 'lieferplz' ) {
$data [ 0 ][ $key ] = $data [ 0 ][ $key ] . '<br>' ;
}
}
$rechnungsadresse = $data [ 0 ][ 'name' ] . " " . $data [ 0 ][ 'ansprechpartner' ] . " " . $data [ 0 ][ 'abteilung' ] . " " . $data [ 0 ][ 'unterabteilung' ] .
" " . $data [ 0 ][ 'strasse' ] . " " . $data [ 0 ][ 'adresszusatz' ] . " " . $data [ 0 ][ 'land' ] . " - " . $data [ 0 ][ 'plz' ] . " " . $data [ 0 ][ 'ort' ];
$isAbweichend = false ;
if ( $data [ 0 ][ 'abweichende_rechnungsadresse' ] == 1 ){
$isAbweichend = true ;
}
$abweichendString = ( $isAbweichend ? ' (abweichend)' : '' );
return " <table width= \" 100% \" >
< tr valign = \ " top \" ><td width= \" 50% \" ><b>Rechnungsadresse " . $abweichendString . " :</b><br><br> $rechnungsadresse </td></tr></table> " ;
}
function RechnungLastschrift ()
{
$this -> app -> Tpl -> Set ( 'UEBERSCHRIFT' , 'Lastschrift / Sammelüberweisung' );
$erzeugen = $this -> app -> Secure -> GetPOST ( 'erzeugen' );
$lastschrift = $this -> app -> Secure -> GetPOST ( 'lastschrift' );
$kontointern = $this -> app -> Secure -> GetPOST ( 'konto' );
$this -> app -> erp -> Headlines ( 'Lastschriften' );
$this -> app -> erp -> MenuEintrag ( 'index.php?module=rechnung&action=list' , 'Zur Rechnungsübersicht' );
if ( $erzeugen != '' )
{
//erzeugen
$rechnung = $this -> app -> Secure -> GetPOST ( 'rechnung' );
$crechnung = ! empty ( $rechnung ) ? count ( $rechnung ) : 0 ;
for ( $i = 0 ; $i < $crechnung ; $i ++ )
{
//rechnung auf bezahlt markieren + soll auf ist
$this -> app -> DB -> Update ( " UPDATE rechnung SET zahlungsstatus='abgebucht' WHERE id=' { $rechnung [ $i ] } ' AND firma=' " . $this -> app -> User -> GetFirma () . " ' LIMIT 1 " );
}
}
// offene Rechnungen
$this -> app -> Tpl -> Set ( 'SUB1TABTEXT' , " Offene Rechnungen " );
$table = new EasyTable ( $this -> app );
$table -> Query ( " SELECT CONCAT('<input type=checkbox name=rechnung[] value= \" ',r.id,' \" checked>') as auswahl, DATE_FORMAT(r.datum,'%d.%m.%Y') as vom, if(r.belegnr!='',r.belegnr,'ohne Nummer') as beleg, r.name, p.abkuerzung as projekt, r.soll as betrag, r.ist as ist, r.zahlungsweise, a.bank_inhaber, a.bank_institut, a.bank_blz, a.bank_konto, r.id
FROM rechnung r LEFT JOIN projekt p ON p . id = r . projekt LEFT JOIN zahlungsweisen z ON z . type = r . zahlungsweise LEFT JOIN auftrag a ON a . id = r . auftragid WHERE ( r . zahlungsstatus != 'bezahlt' AND r . zahlungsstatus != 'abgebucht' ) AND ( r . zahlungsweise = 'lastschrift' OR r . zahlungsweise = 'einzugsermaechtigung' OR z . verhalten = 'lastschrift' ) AND ( r . belegnr != '' ) order by r . datum DESC , r . id DESC " );
$table -> DisplayNew ( 'SUB1TAB' , "
<!--< a href = \ " index.php?module=rechnung&action=edit&id=%value% \" ><img border= \" 0 \" src= \" ./themes/new/images/edit.svg \" ></a>-->
< a href = \ " index.php?module=rechnung&action=pdf&id=%value% \" ><img border= \" 0 \" src= \" ./themes/new/images/pdf.svg \" ></a>
" );
$summe = $this -> app -> DB -> Select ( " SELECT SUM(r.soll)
FROM rechnung r LEFT JOIN projekt p ON p . id = r . projekt WHERE ( r . zahlungsstatus != 'bezahlt' AND r . zahlungsstatus != 'abgebucht' ) AND ( r . zahlungsweise = 'lastschrift' OR r . zahlungsweise = 'einzug' ) AND r . belegnr != '' " );
if ( $summe <= 0 ) {
$summe = '0,00' ;
}
$this -> app -> Tpl -> Set ( 'TAB1' , " <center>Gesamt offen: $summe EUR</center> " );
$this -> app -> YUI -> TableSearch ( 'TAB1' , " lastschriften " );
$this -> app -> Tpl -> Add ( 'TAB1' , " <br><center>
< input type = \ " submit \" name= \" submit \" value= \" Lastschriften an Zahlungstransfer übergeben \" ></center></form> " );
$this -> app -> YUI -> TableSearch ( 'TAB2' , 'lastschriftenarchiv' );
$this -> app -> Tpl -> Parse ( 'PAGE' , 'rechnung_lastschrift.tpl' );
}
public function RechnungGutschrift ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$status = $this -> app -> DB -> Select ( " SELECT status FROM rechnung WHERE id=' $id ' LIMIT 1 " );
if ( $status === 'angelegt' )
{
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" warning \" >Die Rechnung ist noch nicht freigegeben und kann daher nicht storniert werden!</div> " );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id &msg= $msg " );
}
$this -> app -> erp -> RechnungProtokoll ( $id , 'Rechnung als Gutschrift weitergeführt' );
$newid = $this -> app -> erp -> WeiterfuehrenRechnungZuGutschrift ( $id );
// pruefe obes schon eine gutschrift fuer diese rechnung gibt
$anzahlgutschriften = $this -> app -> DB -> Select ( " SELECT COUNT(id) FROM gutschrift WHERE rechnungid=' $id '
AND rechnungid != 0 AND rechnungid != '' " );
if ( $anzahlgutschriften > 1 ){
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" warning \" >Achtung es gibt bereits eine oder mehrer Gutschriften für diese Rechnung!</div> " );
}
$this -> app -> Location -> execute ( " index.php?module=gutschrift&action=edit&id= $newid &msg= $msg " );
}
function RechnungFreigabe ( $id = '' )
{
if ( $id == '' )
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$freigabe = $this -> app -> Secure -> GetGET ( 'freigabe' );
$this -> app -> Tpl -> Set ( 'TABTEXT' , 'Freigabe' );
$this -> app -> erp -> RechnungNeuberechnen ( $id );
} else {
$intern = true ;
$freigabe = $intern ;
}
2024-10-05 11:50:25 +02:00
2022-05-23 21:03:20 +02:00
$allowedFrm = true ;
$showDefault = true ;
$this -> app -> erp -> CheckVertrieb ( $id , 'rechnung' );
$this -> app -> erp -> CheckBearbeiter ( $id , 'rechnung' );
$doctype = 'rechnung' ;
if ( empty ( $intern )){
$this -> app -> erp -> RunHook ( 'beleg_freigabe' , 4 , $doctype , $id , $allowedFrm , $showDefault );
}
if ( $allowedFrm && $freigabe == $id )
{
$belegnr = $this -> app -> DB -> Select ( " SELECT belegnr FROM rechnung WHERE id=' $id ' LIMIT 1 " );
if ( $belegnr == '' )
{
$this -> app -> erp -> BelegFreigabe ( 'rechnung' , $id );
2024-10-05 11:50:25 +02:00
$this -> rechnung_zahlstatus_berechnen ( $id );
2022-05-23 21:03:20 +02:00
if ( $intern ) {
return 1 ;
}
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" info \" >Die Rechnung wurde freigegeben und kann jetzt versendet werden!</div> " );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id &msg= $msg " );
}
if ( $intern ) {
return 0 ;
}
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" error \" >Die Rechnung wurde bereits freigegeben!</div> " );
$this -> app -> Location -> execute ( " index.php?module=rechnung&action=edit&id= $id &msg= $msg " );
}
if ( $showDefault ){
$name = $this -> app -> DB -> Select ( " SELECT a.name FROM rechnung b LEFT JOIN adresse a ON a.id=b.adresse WHERE b.id=' $id ' LIMIT 1 " );
$summe = $this -> app -> DB -> Select ( " SELECT soll FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$waehrung = $this -> app -> DB -> Select ( " SELECT waehrung FROM rechnung_position
WHERE rechnung = '$id' LIMIT 1 " );
$this -> app -> Tpl -> Set ( 'TAB1' , " <div class= \" info \" >Soll die Rechnung an <b> $name </b> im Wert von <b> $summe $waehrung </b>
jetzt freigegeben werden ? < input type = \ " button \" class= \" btnImportantLarge \" value= \" Jetzt freigeben \" onclick= \" window.location.href='index.php?module=rechnung&action=freigabe&id= $id &freigabe= $id ' \" >
</ div > " );
}
2024-10-05 11:50:25 +02:00
2022-05-23 21:03:20 +02:00
$this -> RechnungMenu ();
$this -> app -> Tpl -> Parse ( 'PAGE' , 'tabview.tpl' );
}
function RechnungAbschicken ()
{
$this -> RechnungMenu ();
$this -> app -> erp -> DokumentAbschicken ();
}
public function RechnungDelete ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$invoiceArr = $this -> app -> DB -> SelectRow ( " SELECT belegnr, name FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$belegnr = $invoiceArr [ 'belegnr' ];
$name = $invoiceArr [ 'name' ];
$msg = '' ;
if ( $belegnr == '0' || $belegnr == '' ) {
$this -> app -> erp -> DeleteRechnung ( $id );
$belegnr = 'ENTWURF' ;
$msg = $this -> app -> erp -> base64_url_encode ( " <div class= \" warning \" >Die Rechnung \" $belegnr\ " von \ " $name\ " wurde gelöscht !</ div > " );
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=list&msg=' . $msg );
}
$this -> RechnungGutschrift ();
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=list&msg=' . $msg );
}
function RechnungProtokoll ()
{
$this -> RechnungMenu ();
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> app -> Tpl -> Set ( 'TABTEXT' , 'Protokoll' );
$tmp = new EasyTable ( $this -> app );
$tmp -> Query ( " SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung=' $id ' ORDER by zeit DESC " );
$tmp -> DisplayNew ( 'TAB1' , 'Protokoll' , 'noAction' );
$this -> app -> Tpl -> Parse ( 'PAGE' , 'tabview.tpl' );
}
function RechnungMahnPDF ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$invoiceArr = $this -> app -> DB -> SelectRow ( " SELECT belegnr, mahnwesen, projekt FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$belegnr = $invoiceArr [ 'belegnr' ];
$mahnwesen = $invoiceArr [ 'mahnwesen' ];
$projekt = $invoiceArr [ 'projekt' ];
if ( $belegnr != '' && $belegnr != '0' )
{
$Brief = new MahnungPDF ( $this -> app , $projekt );
$Brief -> GetRechnung ( $id , $mahnwesen );
$Brief -> displayDocument ();
}
$this -> app -> ExitXentral ();
}
function RechnungInlinePDF ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$invoiceArr = $this -> app -> DB -> SelectRow ( " SELECT schreibschutz, projekt FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$schreibschutz = $invoiceArr [ 'schreibschutz' ];
if ( $schreibschutz != '1' ){
$this -> app -> erp -> RechnungNeuberechnen ( $id );
}
$frame = $this -> app -> Secure -> GetGET ( 'frame' );
$projekt = $invoiceArr [ 'projekt' ];
if ( $frame == '' )
{
if ( class_exists ( 'RechnungPDFCustom' ))
{
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
} else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $id );
$Brief -> inlineDocument ( $schreibschutz );
} else {
$file = urlencode ( " ../../../../index.php?module=rechnung&action=inlinepdf&id= $id " );
echo " <iframe width= \" 100% \" height= \" 100% \" style= \" height:calc(100vh - 110px) \" src= \" ./js/production/generic/web/viewer.html?file= $file\ " ></ iframe > " ;
$this -> app -> ExitXentral ();
}
}
function RechnungPDF ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> app -> erp -> RechnungNeuberechnen ( $id );
$doppel = $this -> app -> Secure -> GetGET ( 'doppel' );
$invoiceArr = $this -> app -> DB -> SelectRow ( " SELECT schreibschutz, projekt, zuarchivieren FROM rechnung WHERE id=' $id ' LIMIT 1 " );
if ( ! empty ( $invoiceArr [ 'schreibschutz' ]) && ! empty ( $invoiceArr [ 'zuarchivieren' ])) {
$this -> app -> erp -> PDFArchivieren ( 'rechnung' , $id , true );
}
$projekt = $invoiceArr [ 'projekt' ];
$schreibschutz = $invoiceArr [ 'schreibschutz' ];
// if(is_numeric($belegnr) && $belegnr!=0)
// {
if ( class_exists ( 'RechnungPDFCustom' ))
{
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
} else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
if ( $doppel == '1' ){
$Brief -> GetRechnung ( $id , 'doppel' );
}
else {
$Brief -> GetRechnung ( $id );
}
$Brief -> displayDocument ( $schreibschutz );
$this -> RechnungList ();
}
2024-10-31 21:43:05 +01:00
// Print PHP array for SmartyXML
function RechnungJSON () {
$this -> RechnungSmarty ( true );
}
2024-11-30 13:51:29 +01:00
function remove_html_entities_from_array ( & $array ) {
foreach ( $array as $key => $item ) {
if ( is_array ( $item )) {
$this -> remove_html_entities_from_array ( $array [ $key ]);
} else {
$array [ $key ] = html_entity_decode ( $item );
}
}
}
function remove_CDATA_fragments_from_array ( & $array ) {
foreach ( $array as $key => $item ) {
if ( is_array ( $item )) {
$this -> remove_CDATA_fragments_from_array ( $array [ $key ]);
} else {
$item = str_replace ( '<![CDATA[' , '' , $item );
$item = str_replace ( ']]>' , '' , $item );
$array [ $key ] = $item ;
}
}
}
2024-10-31 21:43:05 +01:00
function RechnungSmarty ( $json = false ) {
$id = $this -> app -> Secure -> GetGET ( 'id' );
$result = Array ();
$result [ 'rechnungssteller' ][ 'name' ] = $this -> app -> erp -> Firmendaten ( 'name' );
$result [ 'rechnungssteller' ][ 'strasse' ] = $this -> app -> erp -> Firmendaten ( 'strasse' );
$result [ 'rechnungssteller' ][ 'ort' ] = $this -> app -> erp -> Firmendaten ( 'ort' );
$result [ 'rechnungssteller' ][ 'plz' ] = $this -> app -> erp -> Firmendaten ( 'plz' );
$result [ 'rechnungssteller' ][ 'land' ] = $this -> app -> erp -> Firmendaten ( 'land' );
$result [ 'rechnungssteller' ][ 'steuernummer' ] = $this -> app -> erp -> Firmendaten ( 'steuernummer' );
$rechnung = $this -> app -> DB -> SelectRow ( "
SELECT * FROM rechnung WHERE id = $id LIMIT 1
" );
$result [ 'kopf' ] = $rechnung ;
2024-11-21 15:27:36 +01:00
$result [ 'kopf' ][ 'internet_bestellnummer' ] = $this -> app -> DB -> Select ( " SELECT a.internet FROM rechnung r LEFT JOIN auftrag a ON a.id=r.auftragid WHERE r.id=' $id ' AND r.id > 0 LIMIT 1 " );
2024-10-31 21:43:05 +01:00
$adresse = $this -> app -> DB -> SelectArr ( "
SELECT * FROM adresse WHERE id = ( SELECT adresse FROM rechnung WHERE id = $id LIMIT 1 )
" );
$result [ 'adresse' ] = $adresse [ 0 ];
$positionen = $this -> app -> DB -> SelectArr ( "
SELECT * FROM rechnung_position WHERE rechnung = $id ORDER BY sort ASC
2024-12-01 19:46:25 +01:00
" );
if ( empty ( $positionen )) {
throw new exception ( " Rechnung enthält keine Positionen! " );
}
2024-10-31 21:43:05 +01:00
$steuern = Array ();
foreach ( $positionen as $key => $position ) {
$this -> app -> erp -> GetSteuerPosition ( 'rechnung' , $position [ 'id' ], $steuersatz , $steuertext , $erloes );
$positionen [ $key ][ 'steuersatz' ] = $steuersatz ;
$positionen [ $key ][ 'steuertext' ] = $steuertext ;
$positionen [ $key ][ 'erloese' ] = $erloes ;
$steuern [ $steuersatz ][ 'umsatz_netto' ] += $position [ 'umsatz_netto_gesamt' ];
$steuern [ $steuersatz ][ 'umsatz_brutto' ] += $position [ 'umsatz_brutto_gesamt' ];
$steuern [ $steuersatz ][ 'prozent' ] = $steuersatz ;
}
$result [ 'positionen' ] = $positionen ;
$result [ 'steuern' ] = $steuern ;
$filename = str_replace ( '-' , '' , $result [ 'kopf' ][ 'datum' ]) . '_RE' . $result [ 'kopf' ][ 'belegnr' ];
2024-11-30 13:51:29 +01:00
$this -> remove_html_entities_from_array ( $result );
$this -> remove_CDATA_fragments_from_array ( $result );
2024-10-31 21:43:05 +01:00
if ( $json ) {
header ( 'Content-type:text/plain' );
header ( 'Content-Disposition: attachment;filename=' . $filename . '.json' );
echo ( json_encode ( $result , JSON_PRETTY_PRINT ));
} else {
2024-11-01 12:28:40 +01:00
$template = $this -> app -> DB -> Select ( " SELECT template from smarty_templates WHERE id = ' " . $adresse [ 0 ][ 'rechnung_smarty_template' ] . " ' LIMIT 1 " );
if ( empty ( $template )) {
2024-11-30 13:51:29 +01:00
header ( 'Content-type:text/xml' );
2024-11-01 12:28:40 +01:00
header ( 'Content-Disposition: attachment;filename=' . $filename . '.xml' );
2024-11-30 13:51:29 +01:00
echo ( ' < ? xml version = " 1.0 " encoding = " utf-8 " ?>
< note >
< body > Kein Smarty Template an der Addresse hinterlegt !</ body >
</ note > ' );
2024-11-01 12:28:40 +01:00
} else {
$smarty = new Smarty ;
$directory = $this -> app -> erp -> GetTMP () . '/smarty/templates' ;
$smarty -> setCompileDir ( $directory );
2024-12-01 19:46:25 +01:00
$smarty -> assign ( 'rechnung' , $result );
2024-11-01 12:28:40 +01:00
$html = $smarty -> fetch ( 'string:' . $template );
header ( 'Content-type:application/xml' );
header ( 'Content-Disposition: attachment;filename=' . $filename . '.xml' );
echo ( $html );
}
}
2024-10-31 21:43:05 +01:00
$this -> app -> ExitXentral ();
2022-05-23 21:03:20 +02:00
}
function RechnungSuche ()
{
$this -> app -> Tpl -> Set ( 'UEBERSCHRIFT' , 'Rechnungen' );
$this -> app -> erp -> Headlines ( 'Rechnungen' );
$this -> app -> erp -> MenuEintrag ( 'index.php?module=rechnung&action=create' , 'Neue Rechnung anlegen' );
$this -> app -> Tpl -> Set ( 'TABTEXT' , 'Rechnungen' );
$name = $this -> app -> Secure -> GetPOST ( 'name' );
$plz = $this -> app -> Secure -> GetPOST ( 'plz' );
$auftrag = $this -> app -> Secure -> GetPOST ( 'auftrag' );
$kundennummer = $this -> app -> Secure -> GetPOST ( 'kundennummer' );
$proforma = '' ;
if ( $name != '' || $plz != '' || $proforma != '' || $kundennummer != '' || $auftrag != '' )
{
$table = new EasyTable ( $this -> app );
$this -> app -> Tpl -> Add ( 'ERGEBNISSE' , " <h2>Trefferliste:</h2><br> " );
if ( $name != " " )
$table -> Query ( " SELECT a.name, a.belegnr as rechnung, adr.kundennummer, a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a
LEFT JOIN adresse adr ON adr . id = a . adresse WHERE ( a . name LIKE '%$name%' ) " );
else if ( $plz != " " )
$table -> Query ( " SELECT a.name, a.belegnr as rechnung, adr.kundennummer, a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a
LEFT JOIN adresse adr ON adr . id = a . adresse WHERE ( a . plz LIKE '$plz%' ) " );
else if ( $kundennummer != " " )
$table -> Query ( " SELECT a.name, a.belegnr as rechnung, adr.kundennummer, a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a
LEFT JOIN adresse adr ON adr . id = a . adresse WHERE ( adr . kundennummer = '$kundennummer' ) " );
else if ( $auftrag != " " )
$table -> Query ( " SELECT a.name, a.belegnr as rechnung , adr.kundennummer,a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a
LEFT JOIN adresse adr ON adr . id = a . adresse WHERE ( a . belegnr = '$auftrag' ) " );
// $table->DisplayNew('ERGEBNISSE',"<a href=\"index.php?module=rechnung&action=edit&id=%value%\">Lesen</a>");
$table -> DisplayNew ( 'ERGEBNISSE' , " <a href= \" index.php?module=rechnung&action=edit&id=%value% \" ><img border= \" 0 \" src= \" ./themes/new/images/edit.svg \" ></a>
< a href = \ " index.php?module=rechnung&action=pdf&id=%value% \" ><img border= \" 0 \" src= \" ./themes/new/images/pdf.svg \" ></a>
< a onclick = \ " if(!confirm('Wirklich als Gutschrift/Stornorechnung weiterführen?')) return false; else window.location.href='index.php?module=rechnung&action=gutschrift&id=%value%'; \" >
< img src = \ " ./themes/new/images/lieferung.png \" border= \" 0 \" alt= \" weiterführen als Gutschrift/Stornorechnung \" ></a>
< a onclick = \ " if(!confirm('Wirklich kopieren?')) return false; else window.location.href='index.php?module=rechnung&action=copy&id=%value%'; \" >
< img src = \ " ./themes/new/images/copy.svg \" border= \" 0 \" ></a>
" );
} else {
$this -> app -> Tpl -> Add ( 'ERGEBNISSE' , " <div class= \" info \" >Rechnungssuche (bitte entsprechende Suchparameter eingeben)</div> " );
}
$this -> app -> Tpl -> Parse ( 'INHALT' , 'rechnungssuche.tpl' );
$this -> app -> Tpl -> Set ( 'AKTIV_TAB1' , 'selected' );
$this -> app -> Tpl -> Parse ( 'TAB1' , 'rahmen77.tpl' );
$this -> app -> Tpl -> Parse ( 'PAGE' , 'tabview.tpl' );
}
public function RechnungMenu ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$invoiceArr = $this -> app -> DB -> SelectRow ( " SELECT belegnr, name,status FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$belegnr = $invoiceArr [ 'belegnr' ];
$name = $invoiceArr [ 'name' ];
if ( $belegnr == '0' || $belegnr == '' ) {
$belegnr = '(Entwurf)' ;
}
$this -> app -> Tpl -> Set ( 'KURZUEBERSCHRIFT2' , " $name Rechnung $belegnr " );
$this -> app -> erp -> RechnungNeuberechnen ( $id );
$status = $invoiceArr [ 'status' ];
if ( $status === 'angelegt' ) {
$this -> app -> erp -> MenuEintrag ( " index.php?module=rechnung&action=freigabe&id= $id " , 'Freigabe' );
}
$this -> app -> erp -> MenuEintrag ( " index.php?module=rechnung&action=edit&id= $id " , 'Details' );
$anzahldateien = $this -> app -> erp -> AnzahlDateien ( 'Rechnung' , $id );
if ( $anzahldateien > 0 ) {
$anzahldateien = ' (' . $anzahldateien . ')' ;
} else {
$anzahldateien = '' ;
}
$this -> app -> erp -> MenuEintrag ( " index.php?module=rechnung&action=dateien&id= $id " , 'Dateien' . $anzahldateien );
$this -> app -> erp -> MenuEintrag ( 'index.php?module=rechnung&action=list' , 'Zurück zur Übersicht' );
$this -> app -> erp -> RunMenuHook ( 'rechnung' );
}
public function RechnungPositionen ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
$this -> app -> erp -> RechnungNeuberechnen ( $id );
$this -> app -> YUI -> AARLGPositionen ( false );
}
public function CopyRechnungPosition ()
{
$this -> app -> YUI -> SortListEvent ( 'copy' , 'rechnung_position' , 'rechnung' );
$this -> RechnungPositionen ();
}
public function DelRechnungPosition ()
{
$this -> app -> YUI -> SortListEvent ( 'del' , 'rechnung_position' , 'rechnung' );
$this -> RechnungPositionen ();
}
public function UpRechnungPosition ()
{
$this -> app -> YUI -> SortListEvent ( 'up' , 'rechnung_position' , 'rechnung' );
$this -> RechnungPositionen ();
}
public function DownRechnungPosition ()
{
$this -> app -> YUI -> SortListEvent ( 'down' , 'rechnung_position' , 'rechnung' );
$this -> RechnungPositionen ();
}
public function RechnungPositionenEditPopup ()
{
$cmd = $this -> app -> Secure -> GetGET ( 'cmd' );
if ( $cmd === 'getopenaccordions' )
{
$accordions = $this -> app -> Secure -> GetPOST ( 'accordions' );
$accordions = explode ( '*|*' , $accordions );
foreach ( $accordions as $k => $v )
{
if ( empty ( $v ))
{
unset ( $accordions [ $k ]);
} else {
$accordions [ $k ] = 'rechnung_accordion' . $v ;
}
}
$ret = [];
if ( ! empty ( $accordions ))
{
$accordions = $this -> app -> User -> GetParameter ( $accordions );
if ( ! empty ( $accordions ))
{
foreach ( $accordions as $v )
{
if ( ! empty ( $v [ 'value' ]))
{
$ret [ 'accordions' ][] = str_replace ( 'rechnung_accordion' , '' , $v [ 'name' ]);
}
}
}
}
echo json_encode ( $ret );
$this -> app -> ExitXentral ();
}
if ( $cmd === 'setaccordion' )
{
$name = $this -> app -> Secure -> GetPOST ( 'name' );
$active = $this -> app -> Secure -> GetPOST ( 'active' );
$this -> app -> User -> SetParameter ( 'rechnung_accordion' . $name , $active );
echo json_encode ( array ( 'success' => 1 ));
$this -> app -> ExitXentral ();
}
$id = $this -> app -> Secure -> GetGET ( 'id' );
$artikel = $this -> app -> DB -> Select ( " SELECT artikel FROM angebot_position WHERE id=' $id ' LIMIT 1 " );
// nach page inhalt des dialogs ausgeben
$filename = 'widgets/widget.rechnung_position_custom.php' ;
if ( is_file ( $filename )) {
include_once $filename ;
$widget = new WidgetRechnung_positionCustom ( $this -> app , 'PAGE' );
}
else {
$widget = new WidgetRechnung_position ( $this -> app , 'PAGE' );
}
$sid = $this -> app -> DB -> Select ( " SELECT rechnung FROM rechnung_position WHERE id=' $id ' LIMIT 1 " );
$widget -> form -> SpecialActionAfterExecute ( 'close_refresh' ,
" index.php?module=rechnung&action=positionen&id= $sid " );
$widget -> Edit ();
$this -> app -> BuildNavigation = false ;
}
// <li><a href="index.php?module=rechnung&action=inlinepdf&id=[ID]&frame=true#tabs-3">Vorschau</a></li>
/**
* @ param int $invoiceId
* @ param int $fileKeywordId
*
* @ return int
*/
public function moveFileUp ( $invoiceId , $fileKeywordId )
{
$check = $this -> app -> DB -> SelectRow (
sprintf (
' SELECT ds .*
FROM datei_stichwoerter ds
INNER JOIN datei d on ds . datei = d . id
WHERE ds . id = % d and d . geloescht <> 1
LIMIT 1 ' ,
$fileKeywordId
)
);
if ( empty ( $check )) {
return 0 ;
}
$sort = $check [ 'sort' ] - 1 ;
if ( $sort <= 0 ) {
return 0 ;
}
$check2 = $this -> app -> DB -> SelectArr (
" SELECT ds.* FROM datei_stichwoerter ds
INNER JOIN datei d on ds . datei = d . id
WHERE ds . objekt like 'rechnung' AND ds . sort = % d AND d . geloescht <> 1
AND ds . parameter = % d
LIMIT 1 " ,
$sort , $invoiceId
);
if ( empty ( $check2 )) {
return 0 ;
}
$this -> app -> DB -> Update (
sprintf (
'UPDATE datei_stichwoerter SET sort = sort - 1 WHERE id = %d LIMIT 1' ,
$fileKeywordId
)
);
$this -> app -> DB -> Update (
sprintf (
'UPDATE datei_stichwoerter SET sort = sort + 1 WHERE id = %d LIMIT 1' ,
$check2 [ 'id' ]
)
);
return $check2 [ 'id' ];
}
/**
* @ param int $invoiceId
* @ param int $fileKeywordId
*
* @ return int
*/
public function moveFileDown ( $invoiceId , $fileKeywordId )
{
$check = $this -> app -> DB -> SelectRow (
sprintf (
' SELECT ds .*
FROM datei_stichwoerter ds
INNER JOIN datei d on ds . datei = d . id
WHERE ds . id = % d and d . geloescht <> 1
LIMIT 1 ' ,
$fileKeywordId
)
);
if ( empty ( $check )) {
return 0 ;
}
$sort = $check [ 'sort' ] + 1 ;
if ( $sort <= 1 ) {
return 0 ;
}
$check2 = $this -> app -> DB -> SelectArr (
" SELECT ds.* FROM datei_stichwoerter ds
INNER JOIN datei d on ds . datei = d . id
WHERE ds . objekt like 'rechnung' AND ds . sort = % d AND d . geloescht <> 1
AND ds . parameter = % d
LIMIT 1 " ,
$sort , $invoiceId
);
if ( empty ( $check2 )) {
return 0 ;
}
$this -> app -> DB -> Update (
sprintf (
'UPDATE datei_stichwoerter SET sort = sort + 1 WHERE id = %d LIMIT 1' ,
$fileKeywordId
)
);
$this -> app -> DB -> Update (
sprintf (
'UPDATE datei_stichwoerter SET sort = sort - 1 WHERE id = %d LIMIT 1' ,
$check2 [ 'id' ]
)
);
return $check2 [ 'id' ];
}
public function RechnungEdit ()
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
// zum aendern vom Vertrieb
$sid = $this -> app -> Secure -> GetGET ( 'sid' );
$cmd = $this -> app -> Secure -> GetGET ( 'cmd' );
if ( $this -> app -> Secure -> GetPOST ( 'resetextsoll' )) {
$this -> app -> DB -> Update (
sprintf (
'UPDATE rechnung SET extsoll = 0 WHERE id = %d' ,
$id
)
);
$this -> app -> erp -> RechnungNeuberechnen ( $id );
}
2023-03-15 22:50:58 +01:00
// ALWAYS
$this -> app -> erp -> RechnungNeuberechnen ( $id );
2022-05-23 21:03:20 +02:00
if ( $cmd === 'dadown' )
{
$erg [ 'status' ] = 0 ;
$daid = $this -> app -> Secure -> GetPOST ( 'da_id' );
$from = $this -> moveFileDown ( $id , $daid );
if ( $from > 0 ) {
$erg [ 'status' ] = 1 ;
$erg [ 'from' ] = $from ;
}
echo json_encode ( $erg );
$this -> app -> ExitXentral ();
}
if ( $cmd === 'daup' )
{
$erg [ 'status' ] = 0 ;
$daid = $this -> app -> Secure -> GetPOST ( 'da_id' );
$from = $this -> moveFileUp ( $id , $daid );
if ( $from > 0 ) {
$erg [ 'status' ] = 1 ;
$erg [ 'from' ] = $from ;
}
echo json_encode ( $erg );
$this -> app -> ExitXentral ();
}
if ( $this -> app -> erp -> VertriebAendern ( 'rechnung' , $id , $cmd , $sid )){
return ;
}
if ( $this -> app -> erp -> InnendienstAendern ( 'rechnung' , $id , $cmd , $sid )){
return ;
}
if ( $this -> app -> erp -> DisableModul ( 'rechnung' , $id ))
{
//$this->app->erp->MenuEintrag("index.php?module=auftrag&action=list","Zurück zur Übersicht");
$this -> RechnungMenu ();
return ;
}
$adresse = $this -> app -> DB -> Select ( " SELECT adresse FROM rechnung WHERE id=' $id ' LIMIT 1 " );
if ( $adresse <= 0 ) {
$this -> app -> Tpl -> Add ( 'JAVASCRIPT' , '$(document).ready(function() { if(document.getElementById("adresse"))document.getElementById("adresse").focus(); });' );
$this -> app -> Tpl -> Set ( 'MESSAGE' , " <div class= \" error \" >Achtung! Dieses Dokument ist mit keiner Kunden-Nr. verlinkt. Bitte geben Sie die Kundennummer an und klicken Sie übernehmen oder Speichern!</div> " );
}
$this -> app -> YUI -> AARLGPositionen ();
$this -> app -> erp -> DisableVerband ();
$this -> app -> erp -> CheckBearbeiter ( $id , 'rechnung' );
$this -> app -> erp -> CheckBuchhaltung ( $id , 'rechnung' );
$invoiceArr = $this -> app -> DB -> SelectRow (
sprintf (
2024-10-03 13:43:45 +02:00
'SELECT zahlungsweise,zahlungszieltage,dta_datei,status,zahlungsstatus,schreibschutz FROM rechnung WHERE id= %d LIMIT 1' ,
2022-05-23 21:03:20 +02:00
( int ) $id
)
);
$zahlungsweise = $invoiceArr [ 'zahlungsweise' ];
$zahlungszieltage = $invoiceArr [ 'zahlungszieltage' ];
2024-10-03 13:43:45 +02:00
$zahlungsstatus = $invoiceArr [ 'zahlungsstatus' ];
2022-05-23 21:03:20 +02:00
if ( $zahlungsweise === 'rechnung' && $zahlungszieltage < 1 )
{
$this -> app -> Tpl -> Add ( 'MESSAGE' , " <div class= \" info \" >Hinweis: Fälligkeit auf \" sofort \" , da Zahlungsziel in Tagen auf 0 Tage gesetzt ist!</div> " );
}
$status = $invoiceArr [ 'status' ];
$schreibschutz = $invoiceArr [ 'schreibschutz' ];
if ( $status !== 'angelegt' && $status !== 'angelegta' && $status !== 'a' )
{
$Brief = new Briefpapier ( $this -> app );
if ( $Brief -> zuArchivieren ( $id , " rechnung " ))
{
$this -> app -> Tpl -> Add ( 'MESSAGE' , " <div class= \" warning \" >Die Rechnung ist noch nicht archiviert! Bitte versenden oder manuell archivieren. <input type= \" button \" onclick= \" if(!confirm('Soll das Dokument archiviert werden?')) return false;else window.location.href='index.php?module=rechnung&action=archivierepdf&id= $id '; \" value= \" Manuell archivieren \" /> <input type= \" button \" value= \" Dokument versenden \" onclick= \" DokumentAbschicken('rechnung', $id ) \" ></div> " );
} elseif ( ! $this -> app -> DB -> Select ( " SELECT versendet FROM rechnung WHERE id = ' $id ' LIMIT 1 " ))
{
$this -> app -> Tpl -> Add ( 'MESSAGE' , " <div class= \" warning \" >Die Rechnung wurde noch nicht versendet! <input type= \" button \" value= \" Dokument versenden \" onclick= \" DokumentAbschicken('rechnung', $id ) \" ></div> " );
}
}
$this -> app -> erp -> RechnungNeuberechnen ( $id ); //BENE
$this -> RechnungMiniDetail ( 'MINIDETAIL' , false ); //BENE
$this -> app -> Tpl -> Set ( 'ICONMENU' , $this -> RechnungIconMenu ( $id ));
$this -> app -> Tpl -> Set ( 'ICONMENU2' , $this -> RechnungIconMenu ( $id , 2 ));
if ( $id > 0 ){
$rechnungarr = $this -> app -> DB -> SelectRow ( " SELECT * FROM rechnung WHERE id=' $id ' LIMIT 1 " );
}
$nummer = '' ;
$kundennummer = '' ;
$adresse = 0 ;
$punkte = null ;
$bonuspunkte = null ;
$soll = 0 ;
$projekt = 0 ;
if ( ! empty ( $rechnungarr )){
$nummer = $rechnungarr [ 'belegnr' ]; //$this->app->DB->Select("SELECT belegnr FROM rechnung WHERE id='$id' LIMIT 1");
$kundennummer = $rechnungarr [ 'kundennummer' ]; //$this->app->DB->Select("SELECT kundennummer FROM rechnung WHERE id='$id' LIMIT 1");
$adresse = $rechnungarr [ 'adresse' ]; //$this->app->DB->Select("SELECT adresse FROM rechnung WHERE id='$id' LIMIT 1");
$punkte = $rechnungarr [ 'punkte' ]; //$this->app->DB->Select("SELECT punkte FROM rechnung WHERE id='$id' LIMIT 1");
$bonuspunkte = $rechnungarr [ 'bonuspunkte' ]; //$this->app->DB->Select("SELECT bonuspunkte FROM rechnung WHERE id='$id' LIMIT 1");
$soll = $rechnungarr [ 'soll' ]; //$this->app->DB->Select("SELECT soll FROM rechnung WHERE id='$id' LIMIT 1");
$projekt = $rechnungarr [ 'projekt' ];
2024-10-05 11:50:25 +02:00
$skontosoll = $this -> app -> DB -> Select ( " SELECT TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll FROM rechnung where id = ' " . $id . " ' LIMIT 1 " );
2022-05-23 21:03:20 +02:00
}
$this -> app -> Tpl -> Set ( 'PUNKTE' , " <input type= \" text \" name= \" punkte \" value= \" $punkte\ " size = \ " 10 \" readonly> " );
$this -> app -> Tpl -> Set ( 'BONUSPUNKTE' , " <input type= \" text \" name= \" punkte \" value= \" $bonuspunkte\ " size = \ " 10 \" readonly> " );
$this -> app -> Tpl -> Set ( 'SOLL' , " $soll " . " <input type= \" hidden \" id= \" soll_tmp \" value= \" $soll\ " > " );
2024-10-05 11:50:25 +02:00
$this -> app -> Tpl -> Set ( 'SKONTOSOLL' , $skontosoll );
2022-05-23 21:03:20 +02:00
if ( $schreibschutz != '1' ) // && $this->app->erp->RechteVorhanden("rechnung","schreibschutz"))
{
$this -> app -> erp -> AnsprechpartnerButton ( $adresse );
$this -> app -> erp -> LieferadresseButton ( $adresse );
}
if ( $nummer != '' ) {
2024-11-19 18:05:09 +01:00
$this -> app -> Tpl -> Set ( 'NUMMER' , $nummer );
if (( $schreibschutz != '1' ) && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'belegnredit' )){
$this -> app -> Tpl -> Set ( 'BELEGNRHIDDEN' , 'hidden' );
} else {
$this -> app -> Tpl -> Set ( 'BELEGNREDITHIDDEN' , 'hidden' );
}
2022-05-23 21:03:20 +02:00
if ( $this -> app -> erp -> RechteVorhanden ( 'adresse' , 'edit' )){
$this -> app -> Tpl -> Set ( 'KUNDE' , " Kd-Nr. <a href= \" index.php?module=adresse&action=edit&id= $adresse\ " target = \ " _blank \" > " . $kundennummer . " </a> " );
}
else {
$this -> app -> Tpl -> Set ( 'KUNDE' , " Kd-Nr. " . $kundennummer );
}
}
$lieferdatum = '' ;
$rechnungsdatum = '' ;
$lieferscheinid = 0 ;
if ( ! empty ( $rechnungarr )) {
$lieferdatum = $rechnungarr [ 'lieferdatum' ]; //$this->app->DB->Select("SELECT lieferdatum FROM rechnung WHERE id='$id' LIMIT 1");
$rechnungsdatum = $rechnungarr [ 'datum' ]; //$this->app->DB->Select("SELECT datum FROM rechnung WHERE id='$id' LIMIT 1");
$lieferscheinid = $rechnungarr [ 'lieferschein' ]; //$this->app->DB->Select("SELECT lieferschein FROM rechnung WHERE id='$id' LIMIT 1");
}
$lieferscheiniddatum = '' ;
if ( $lieferscheinid > 0 ){
$lieferscheiniddatum = $this -> app -> DB -> Select ( " SELECT datum FROM lieferschein WHERE id=' $lieferscheinid ' LIMIT 1 " );
}
if ( $lieferdatum == '0000-00-00' && $schreibschutz != '1' ) {
if ( $lieferscheiniddatum != '0000-00-00' ){
$this -> app -> DB -> Update ( " UPDATE rechnung SET lieferdatum=' $lieferscheiniddatum ' WHERE id=' $id ' LIMIT 1 " );
}
else {
$this -> app -> DB -> Update ( " UPDATE rechnung SET lieferdatum=' $rechnungsdatum ' WHERE id=' $id ' LIMIT 1 " );
}
}
if ( $schreibschutz != '1' ) {
$this -> app -> DB -> Update ( " UPDATE rechnung SET auftrag='' WHERE id=' $id ' AND auftragid<=0 LIMIT 1 " );
}
$zahlungsweise = $this -> app -> DB -> Select ( " SELECT zahlungsweise FROM rechnung WHERE id=' $id ' LIMIT 1 " );
if ( $this -> app -> Secure -> GetPOST ( 'zahlungsweise' ) != '' ) {
$zahlungsweise = $this -> app -> Secure -> GetPOST ( 'zahlungsweise' );
}
$zahlungsweise = strtolower ( $zahlungsweise );
$zahlungsweisenmodule = $this -> app -> DB -> SelectArr (
" SELECT id, modul, verhalten
FROM zahlungsweisen
WHERE type = '".$this->app->DB->real_escape_string($zahlungsweise)."' AND
( projekt = '$projekt' OR projekt = 0 )
ORDER BY projekt = '$projekt' DESC
LIMIT 1 "
);
$this -> app -> Tpl -> Set ( 'RECHNUNG' , 'none' );
$this -> app -> Tpl -> Set ( 'KREDITKARTE' , 'none' );
$this -> app -> Tpl -> Set ( 'VORKASSE' , 'none' );
$this -> app -> Tpl -> Set ( 'PAYPAL' , 'none' );
$this -> app -> Tpl -> Set ( 'EINZUGSERMAECHTIGUNG' , 'none' );
if ( $zahlungsweise === 'rechnung' || isset ( $zahlungsweisenmodule [ 0 ][ 'verhalten' ]) && $zahlungsweisenmodule [ 0 ][ 'verhalten' ] === 'rechnung' ) {
$this -> app -> Tpl -> Set ( 'RECHNUNG' , " " );
}
if ( $zahlungsweise === 'paypal' ) {
$this -> app -> Tpl -> Set ( 'PAYPAL' , '' );
}
if ( $zahlungsweise === 'kreditkarte' ) {
$this -> app -> Tpl -> Set ( 'KREDITKARTE' , '' );
}
if ( $zahlungsweise === 'einzugsermaechtigung' || $zahlungsweise === 'lastschrift' ) {
$this -> app -> Tpl -> Set ( 'EINZUGSERMAECHTIGUNG' , '' );
}
if ( $zahlungsweise === 'vorkasse' || $zahlungsweise === 'kreditkarte' || $zahlungsweise === 'paypal' || $zahlungsweise === 'bar' ) {
$this -> app -> Tpl -> Set ( 'VORKASSE' , '' );
}
2024-10-03 13:43:45 +02:00
2022-05-23 21:03:20 +02:00
if ( $schreibschutz == " 1 " && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'schreibschutz' ))
{
$this -> app -> Tpl -> Set ( 'MESSAGE' , " <div class= \" warning \" >Diese Rechnung ist schreibgeschützt und darf daher nicht mehr bearbeitet werden! <input type= \" button \" value= \" Schreibschutz entfernen \" onclick= \" if(!confirm('Soll der Schreibschutz für diese Rechnung wirklich entfernt werden? Die gespeicherte Rechnung wird überschrieben!')) return false;else window.location.href='index.php?module=rechnung&action=schreibschutz&id= $id '; \" ></div> " );
}
if ( $schreibschutz == '1' ){
$this -> app -> erp -> CommonReadonly ();
}
2024-10-03 13:43:45 +02:00
if ( $schreibschutz == '1' && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'manuellbezahltmarkiert' ) && $zahlungsstatus == " offen " )
{
$this -> app -> erp -> RemoveReadonly ( 'bezahlt_am' );
$this -> app -> erp -> RemoveReadonly ( 'zahlbetrag' );
$this -> app -> erp -> RemoveReadonly ( 'zahlungsstatus' );
}
2022-05-23 21:03:20 +02:00
if ( $schreibschutz == '1' && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'mahnwesen' ))
{
$this -> app -> erp -> RemoveReadonly ( 'mahnwesen_datum' );
$this -> app -> erp -> RemoveReadonly ( 'mahnwesen_gesperrt' );
$this -> app -> erp -> RemoveReadonly ( 'mahnwesen_internebemerkung' );
$this -> app -> erp -> RemoveReadonly ( 'mahnwesenfestsetzen' );
$this -> app -> erp -> RemoveReadonly ( 'mahnwesen' );
2023-03-15 22:50:58 +01:00
/*
'ist' should not be edited manually
2022-05-23 21:03:20 +02:00
$this -> app -> erp -> RemoveReadonly ( 'ist' );
if ( $this -> app -> erp -> Firmendaten ( 'mahnwesenmitkontoabgleich' ) != '1' || $this -> app -> DB -> Select ( " SELECT mahnwesenfestsetzen FROM rechnung WHERE id=' $id ' LIMIT 1 " ) == 1 )
2023-03-15 22:50:58 +01:00
$this -> app -> erp -> RemoveReadonly ( 'ist' ); */
2022-05-23 21:03:20 +02:00
//$auftrag= $this->app->DB->Select("SELECT auftrag FROM rechnung WHERE id='$id' LIMIT 1");
$this -> app -> erp -> RemoveReadonly ( 'skonto_gegeben' );
$this -> app -> erp -> RemoveReadonly ( 'internebemerkung' );
$alle_gutschriften = $this -> app -> DB -> SelectArr ( " SELECT id,belegnr FROM gutschrift WHERE rechnungid=' $id ' AND rechnungid>0 " );
$cgutschriften = ! empty ( $alle_gutschriften ) ? count ( $alle_gutschriften ) : 0 ;
if ( $cgutschriften > 1 )
{
$gutschriften = '' ;
for ( $agi = 0 ; $agi < $cgutschriften ; $agi ++ )
2023-03-15 22:50:58 +01:00
$gutschriften .= " <a href= \" index.php?module=gutschrift&action=edit&id= " . $alle_gutschriften [ $agi ][ 'id' ] . " \" target= \" _blank \" > " . $alle_gutschriften [ $agi ][ 'belegnr' ] . " </a> " ;
2022-05-23 21:03:20 +02:00
$this -> app -> Tpl -> Add ( 'MESSAGE' , " <div class= \" warning \" >Für die angebene Rechnung gibt es schon folgende Gutschriften: $gutschriften </div> " );
}
$this -> app -> erp -> CommonReadonly ();
}
$speichern = $this -> app -> Secure -> GetPOST ( 'speichern' );
2024-11-19 18:05:09 +01:00
if ( $speichern != '' && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'belegnredit' )) {
$nummer_neu = $this -> app -> Secure -> GetPOST ( 'belegnredit' );
$nummer_neu = $this -> app -> DB -> real_escape_string ( $nummer_neu );
if ( ! $this -> app -> DB -> select ( " SELECT id from rechnung WHERE belegnr =' " . $nummer_neu . " ' " )) {
$this -> app -> DB -> update ( " UPDATE rechnung SET belegnr =' " . $nummer_neu . " ' WHERE id = ' " . $id . " ' " );
}
}
2023-03-25 17:50:04 +01:00
2022-05-23 21:03:20 +02:00
if ( $speichern != '' && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'mahnwesen' ))
{
$mahnwesen_datum = $this -> app -> Secure -> GetPOST ( 'mahnwesen_datum' );
$bezahlt_am = $this -> app -> Secure -> GetPOST ( 'bezahlt_am' );
2024-10-03 13:43:45 +02:00
$zahlbetrag = $this -> app -> Secure -> GetPOST ( 'zahlbetrag' );
2022-05-23 21:03:20 +02:00
$mahnwesen_gesperrt = $this -> app -> Secure -> GetPOST ( 'mahnwesen_gesperrt' );
$mahnwesen_internebemerkung = $this -> app -> Secure -> GetPOST ( 'mahnwesen_internebemerkung' );
$zahlungsstatus = $this -> app -> Secure -> GetPOST ( 'zahlungsstatus' );
$mahnwesenfestsetzen = $this -> app -> Secure -> GetPOST ( 'mahnwesenfestsetzen' );
$mahnwesen = $this -> app -> Secure -> GetPOST ( 'mahnwesen' );
$internebemerkung = $this -> app -> Secure -> GetPOST ( 'internebemerkung' );
$ist = str_replace ( ',' , '.' , $this -> app -> Secure -> GetPOST ( 'ist' ));
$skonto_gegeben = str_replace ( ',' , '.' , $this -> app -> Secure -> GetPOST ( 'skonto_gegeben' ));
if ( $mahnwesen_gesperrt != '1' ) {
$mahnwesen_gesperrt = '0' ;
}
if ( $mahnwesenfestsetzen != '1' ) {
$mahnwesenfestsetzen = '0' ;
}
$mahnwesen_datum = $this -> app -> String -> Convert ( $mahnwesen_datum , '%1.%2.%3' , '%3-%2-%1' );
$bezahlt_am = $this -> app -> String -> Convert ( $bezahlt_am , '%1.%2.%3' , '%3-%2-%1' );
if ( $bezahlt_am == '--' ) $bezahlt_am = '0000-00-00' ;
$alte_mahnstufe = $this -> app -> DB -> Select ( " SELECT mahnwesen FROM rechnung WHERE id=' $id ' LIMIT 1 " );
2023-06-08 15:35:46 +02:00
if ( $alte_mahnstufe != $mahnwesen ) $versendet = 0 ;
2022-05-23 21:03:20 +02:00
2023-03-25 17:50:04 +01:00
/* if ( $mahnwesenfestsetzen == '1' )
{ */
2024-10-03 13:43:45 +02:00
$this -> app -> DB -> Update ( "
UPDATE rechnung SET
mahnwesen_internebemerkung = '$mahnwesen_internebemerkung' ,
zahlungsstatus = '$zahlungsstatus' ,
versendet_mahnwesen = '$versendet' ,
mahnwesen_gesperrt = '$mahnwesen_gesperrt' ,
mahnwesen_datum = '$mahnwesen_datum' ,
mahnwesenfestsetzen = '$mahnwesenfestsetzen' ,
internebemerkung = '$internebemerkung'
WHERE id = '$id' LIMIT 1 " );
2023-03-25 17:50:04 +01:00
/* } else {
2022-05-23 21:03:20 +02:00
$this -> app -> DB -> Update ( " UPDATE rechnung SET mahnwesen=' $mahnwesen ', mahnwesenfestsetzen=' $mahnwesenfestsetzen ', mahnwesen_internebemerkung=' $mahnwesen_internebemerkung ', mahnwesen_gesperrt=' $mahnwesen_gesperrt ',mahnwesen_datum=' $mahnwesen_datum ' WHERE id=' $id ' LIMIT 1 " );
2023-03-25 17:50:04 +01:00
} */
2022-05-23 21:03:20 +02:00
}
2024-10-03 13:43:45 +02:00
if ( $zahlungsstatus == 'bezahlt' ) {
$this -> app -> Tpl -> Set ( 'SCHNELLEINGABE_HIDDEN' , 'hidden' );
$this -> app -> Tpl -> Set ( 'SCHNELLEINGABE_TOOLTIP_HIDDEN' , 'hidden' );
}
$saldo = $this -> app -> erp -> GetSaldoDokument ( $id , 'rechnung' );
if ( empty ( $saldo )) {
$this -> app -> Tpl -> Set ( 'SCHNELLEINGABE_HIDDEN' , 'hidden' );
$this -> app -> Tpl -> Set ( 'SCHNELLEINGABE_TOOLTIP_HIDDEN' , 'hidden' );
} else {
$ist = $this -> app -> erp -> EUR ( $saldo [ 'betrag' ]);
$this -> app -> Tpl -> Set ( 'ISTDB' , $ist );
if ( $ist > $soll ) {
$this -> app -> Tpl -> addMessage ( 'error' , 'Rechnung ist überzahlt!' );
}
}
$rechnung_schnelleingabe_konto = $this -> app -> erp -> Firmendaten ( 'rechnung_schnelleingabe_konto' );
if ( ! empty ( $rechnung_schnelleingabe_konto )) {
$this -> app -> Tpl -> Set ( 'SCHNELLEINGABE_TOOLTIP_HIDDEN' , 'hidden' );
if ( $speichern != '' && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'manuellbezahltmarkiert' ) && ! empty ( $zahlbetrag )) {
if ( $bezahlt_am == '0000-00-00' ) {
$bezahlt_am = date ( 'Y-m-d' );
}
$sql = "
INSERT INTO kontoauszuege
(
konto ,
buchung ,
importdatum ,
buchungstext ,
soll ,
waehrung ,
bearbeiter
)
VALUES
(
$rechnung_schnelleingabe_konto ,
'$bezahlt_am' ,
'".date("Y-m-d")."' ,
'Rechnung ".$nummer." Schnelleingabe' ,
$zahlbetrag ,
'EUR' ,
'".$this->app->User->GetName()."'
)
" ;
$this -> app -> DB -> Insert ( $sql );
$kontoauszug = $this -> app -> DB -> GetInsertID ();
$this -> app -> erp -> fibu_buchungen_buchen ( " kontoauszuege " , $kontoauszug , " rechnung " , $id , - $zahlbetrag , 'EUR' , $bezahlt_am , " Rechnung " . $nummer . " Schnelleingabe " );
$this -> rechnung_zahlstatus_berechnen ( $id );
}
} else {
$this -> app -> Tpl -> Set ( 'SCHNELLEINGABE_HIDDEN' , 'hidden' );
}
2022-05-23 21:03:20 +02:00
if ( $status == '' )
$this -> app -> DB -> Update ( " UPDATE rechnung SET status='angelegt' WHERE id=' $id ' LIMIT 1 " );
if ( $schreibschutz != '1' ){
if ( $this -> app -> erp -> Firmendaten ( 'schnellanlegen' ) == '1' ){
$this -> app -> Tpl -> Set ( 'BUTTON_UEBERNEHMEN' , ' < input type = " button " value = " übernehmen " onclick = " document.getElementById( \ 'uebernehmen \ ').value=1; document.getElementById( \ 'eprooform \ ').submit(); " />< input type = " hidden " id = " uebernehmen " name = " uebernehmen " value = " 0 " >
' );
} else {
$this -> app -> Tpl -> Set ( 'BUTTON_UEBERNEHMEN' , '
< input type = " button " value = " übernehmen " onclick = " if(!confirm( \ 'Soll der neue Kunde wirklich übernommen werden? Es werden alle Felder überladen. \ ')) return false;else document.getElementById( \ 'uebernehmen \ ').value=1; document.getElementById( \ 'eprooform \ ').submit(); " />< input type = " hidden " id = " uebernehmen " name = " uebernehmen " value = " 0 " >
' );
}
}
// immer wenn sich der lieferant genändert hat standartwerte setzen
if ( $this -> app -> Secure -> GetPOST ( 'adresse' ) != '' )
{
$tmp = $this -> app -> Secure -> GetPOST ( 'adresse' );
$kundennummer = $this -> app -> erp -> FirstTillSpace ( $tmp );
//$name = substr($tmp,6);
$filter_projekt = $this -> app -> DB -> Select ( " SELECT projekt FROM rechnung WHERE id = ' $id ' LIMIT 1 " );
//if($filter_projekt)$filter_projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE id= '$filter_projekt' and eigenernummernkreis = 1 LIMIT 1");
$adresse = $this -> app -> DB -> Select ( " SELECT id FROM adresse WHERE kundennummer=' $kundennummer ' AND geloescht=0 " . $this -> app -> erp -> ProjektRechte ( " projekt " , true , 'vertrieb' ) . " ORDER by " . ( $filter_projekt ? " projekt = ' $filter_projekt ' DESC, " : " " ) . " projekt LIMIT 1 " );
$uebernehmen = $this -> app -> Secure -> GetPOST ( 'uebernehmen' );
if ( $uebernehmen == '1' && $schreibschutz != '1' ) // nur neuladen bei tastendruck auf uebernehmen // FRAGEN!!!!
{
$this -> LoadRechnungStandardwerte ( $id , $adresse );
$this -> app -> erp -> RechnungNeuberechnen ( $id );
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=edit&id=' . $id );
}
}
$rechnungarr = null ;
if ( $id > 0 ) {
$rechnungarr = $this -> app -> DB -> SelectRow ( " SELECT * FROM rechnung WHERE id=' $id ' LIMIT 1 " );
}
$land = '' ;
$ustid = '' ;
$ust_befreit = null ;
if ( ! empty ( $rechnungarr )) {
$land = $rechnungarr [ 'land' ]; //$this->app->DB->Select("SELECT land FROM rechnung WHERE id='$id' LIMIT 1");
$ustid = $rechnungarr [ 'ustid' ]; //$this->app->DB->Select("SELECT ustid FROM rechnung WHERE id='$id' LIMIT 1");
$ust_befreit = $rechnungarr [ 'ust_befreit' ]; //$this->app->DB->Select("SELECT ust_befreit FROM rechnung WHERE id='$id' LIMIT 1");
}
if ( $ust_befreit ) {
$this -> app -> Tpl -> Set ( 'USTBEFREIT' , " <div class= \" info \" >EU-Lieferung <br>(bereits geprüft!)</div> " );
}
else if ( $land !== 'DE' && $ustid != '' ) {
$this -> app -> Tpl -> Set ( 'USTBEFREIT' , " <div class= \" error \" >EU-Lieferung <br>(Fehler bei Prüfung!)</div> " );
}
// easy table mit arbeitspaketen YUI als template
$table = new EasyTable ( $this -> app );
$table -> Query ( " SELECT bezeichnung as artikel, nummer as Nummer, menge, vpe as VPE, FORMAT(preis,4) as preis
FROM rechnung_position
WHERE rechnung = '$id' " ,0, " " );
$table -> DisplayNew ( 'POSITIONEN' , " Preis " , " noAction " );
$summe = $this -> app -> DB -> Select ( " SELECT FORMAT(SUM(menge*preis),2) FROM rechnung_position
WHERE rechnung = '$id' " );
$waehrung = $this -> app -> DB -> Select ( " SELECT waehrung FROM rechnung_position
WHERE rechnung = '$id' LIMIT 1 " );
$summebrutto = $this -> app -> DB -> Select ( " SELECT soll FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$ust_befreit_check = $this -> app -> DB -> Select ( " SELECT ust_befreit FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$tmp = 'Kunde zahlt mit UST' ;
if ( $ust_befreit_check == 1 ) {
$tmp = 'Kunde ist UST befreit' ;
}
if ( $summe > 0 ){
$this -> app -> Tpl -> Add ( 'POSITIONEN' , " <br><center>Zu zahlen: <b> $summe (netto) $summebrutto (brutto) $waehrung </b> ( $tmp ) " );
}
$status = $this -> app -> DB -> Select ( " SELECT status FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$this -> app -> Tpl -> Set ( 'STATUS' , " <input type= \" text \" size= \" 30 \" value= \" " . $status . " \" readonly [COMMONREADONLYINPUT]> " );
$internet = $this -> app -> DB -> Select ( " SELECT a.internet FROM rechnung r LEFT JOIN auftrag a ON a.id=r.auftragid WHERE r.id=' $id ' AND r.id > 0 LIMIT 1 " );
if ( $internet != '' ) {
$this -> app -> Tpl -> Set ( 'INTERNET' , " <tr><td>Internet:</td><td><input type= \" text \" size= \" 30 \" value= \" " . $internet . " \" readonly [COMMONREADONLYINPUT]></td></tr> " );
}
$this -> app -> Tpl -> Set ( 'AKTIV_TAB1' , " selected " );
$sollExtSoll = $this -> app -> DB -> SelectRow (
sprintf (
" SELECT extsoll, soll
FROM rechnung
WHERE id = % d AND schreibschutz = 0 AND status = 'versendet' AND extsoll <> 0 " ,
$id
)
);
if ( ! empty ( $sollExtSoll [ 'extsoll' ]) && $sollExtSoll [ 'extsoll' ] == $sollExtSoll [ 'soll' ]) {
$sollExtSoll [ 'soll' ] = $this -> app -> DB -> Select (
sprintf (
'SELECT ROUND(SUM(`umsatz_brutto_gesamt`),2) FROM `rechnung_position` WHERE `rechnung` = %d ' ,
$id
)
);
}
if ( ! empty ( $sollExtSoll ) && $sollExtSoll [ 'soll' ] != $sollExtSoll [ 'extsoll' ]) {
$extsoll = $sollExtSoll [ 'extsoll' ];
$this -> app -> Tpl -> Add (
'MESSAGE' , ' < form method = " post " >< div class = " error " >
Der Sollbetrag stimmt nicht mehr mit urspr & uuml ; nglich festgelegten Betrag ' .
number_format ( $extsoll , 2 , ',' , '.' ) .
' überein <input type="submit" name="resetextsoll" value="Festgeschriebene Summe zurücksetzen" /></div></form>'
);
}
2023-06-13 18:30:48 +02:00
2022-05-23 21:03:20 +02:00
parent :: RechnungEdit ();
if ( $id > 0 && $this -> app -> DB -> Select (
sprintf (
'SELECT id FROM rechnung WHERE schreibschutz =1 AND zuarchivieren = 1 AND id = %d' ,
$id
)
)
) {
$this -> app -> erp -> PDFArchivieren ( 'rechnung' , $id , true );
}
$this -> app -> erp -> MessageHandlerStandardForm ();
if ( $this -> app -> Secure -> GetPOST ( 'weiter' ) != '' )
{
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=positionen&id=' . $id );
}
$this -> RechnungMenu ();
}
function RechnungCreate ()
{
$anlegen = $this -> app -> Secure -> GetGET ( 'anlegen' );
if ( $this -> app -> erp -> Firmendaten ( 'schnellanlegen' ) == '1' && $anlegen != '1' ) {
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=create&anlegen=1' );
}
if ( $anlegen != '' ) {
$id = $this -> CreateRechnung ();
$this -> app -> Location -> execute ( 'index.php?module=rechnung&action=edit&id=' . $id );
}
$this -> app -> Tpl -> Add ( 'KURZUEBERSCHRIFT' , 'Rechnung' );
$this -> app -> erp -> MenuEintrag ( 'index.php?module=rechnung&action=list' , 'Zurück zur Übersicht' );
$this -> app -> Tpl -> Set ( 'MESSAGE' , " <div class= \" warning \" >Möchten Sie eine Rechnung jetzt anlegen?
< input type = \ " button \" onclick= \" window.location.href='index.php?module=rechnung&action=create&anlegen=1' \" value= \" Ja - Rechnung jetzt anlegen \" ></div><br> " );
$this -> app -> Tpl -> Set ( 'TAB1' , "
< table width = \ " 100% \" style= \" background-color: #fff; border: solid 1px #000; \" align= \" center \" >
< tr >
< td align = \ " center \" >
< br >< b style = \ " font-size: 14pt \" >Rechnungen in Bearbeitung</b>
< br >
< br >
Offene Auftr & auml ; ge , die durch andere Mitarbeiter in Bearbeitung sind .
< br >
</ td >
</ tr >
</ table >
< br >
[ AUFTRAGE ] " );
$this -> app -> Tpl -> Set ( 'AKTIV_TAB1' , 'selected' );
$this -> app -> YUI -> TableSearch ( 'AUFTRAGE' , 'rechnungeninbearbeitung' );
$this -> app -> Tpl -> Set ( 'TABTEXT' , 'Rechnung anlegen' );
$this -> app -> Tpl -> Parse ( 'PAGE' , 'tabview.tpl' );
}
/**
* @ param int $invoiceId
*
* @ return bool
*/
public function markInvoiceAsClosed ( $invoiceId )
{
$reArr = $this -> app -> DB -> SelectRow (
sprintf (
" SELECT projekt,belegnr,status,usereditid,
DATE_SUB ( NOW (), INTERVAL 30 SECOND ) < useredittimestamp AS `open`
FROM rechnung WHERE id =% d LIMIT 1 " ,
$invoiceId
)
);
if ( $reArr [ 'belegnr' ] === '' ) {
return false ;
}
if ( $reArr [ 'status' ] === 'freigegeben' ) {
$this -> app -> erp -> RechnungNeuberechnen ( $invoiceId );
}
$projekt = $reArr [ 'projekt' ];
$this -> app -> erp -> RechnungProtokoll ( $invoiceId , 'Rechnung versendet' );
$this -> app -> erp -> closeInvoice ( $invoiceId );
$this -> app -> DB -> Update (
sprintf (
'UPDATE rechnung SET schreibschutz=1, versendet = 1 WHERE id = %d LIMIT 1' ,
$invoiceId
)
);
$this -> app -> DB -> Update (
sprintf (
" UPDATE rechnung
SET status = 'versendet'
WHERE id = % d AND status != 'storniert'
LIMIT 1 " ,
$invoiceId
)
);
$this -> app -> erp -> PDFArchivieren ( 'rechnung' , $invoiceId , true );
if ( class_exists ( 'RechnungPDFCustom' )) {
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
}
else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $invoiceId );
$tmpfile = $Brief -> displayTMP ();
$Brief -> ArchiviereDocument ();
@ unlink ( $tmpfile );
return true ;
}
public function RechnungList ()
{
2023-03-22 14:33:34 +01:00
2023-04-05 11:01:16 +02:00
$this -> app -> DB -> Update ( " UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus='' " );
2023-03-22 14:33:34 +01:00
2022-05-23 21:03:20 +02:00
if ( $this -> app -> Secure -> GetPOST ( 'ausfuehren' ) && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'edit' ))
{
$drucker = $this -> app -> Secure -> GetPOST ( 'seldrucker' );
$aktion = $this -> app -> Secure -> GetPOST ( 'sel_aktion' );
$auswahl = $this -> app -> Secure -> GetPOST ( 'auswahl' );
if ( $drucker > 0 ) {
$this -> app -> erp -> BriefpapierHintergrundDisable ( $drucker );
}
if ( is_array ( $auswahl )) {
foreach ( $auswahl as $auswahlKey => $auswahlValue ) {
if (( int ) $auswahlValue > 0 ) {
$auswahl [ $auswahlKey ] = ( int ) $auswahlValue ;
}
else {
unset ( $auswahl [ $auswahlKey ]);
}
}
switch ( $aktion )
{
case 'bezahlt' :
2023-04-01 20:42:37 +02:00
$this -> app -> DB -> Update ( " UPDATE rechnung SET zahlungsstatus='bezahlt', bezahlt_am = now(), mahnwesenfestsetzen='1',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,' \r \n ','Manuell als bezahlt markiert am " . date ( 'd.m.Y' ) . " ') WHERE id IN ( " . implode ( ', ' , $auswahl ) . ')' );
2022-05-23 21:03:20 +02:00
break ;
case 'offen' :
2023-04-01 20:42:37 +02:00
$this -> app -> DB -> Update ( " UPDATE rechnung SET zahlungsstatus='offen',bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,' \r \n ','Manuell als bezahlt entfernt am " . date ( 'd.m.Y' ) . " ') WHERE id IN ( " . implode ( ', ' , $auswahl ) . ')' );
2022-05-23 21:03:20 +02:00
break ;
case 'mail' :
$auswahl = $this -> app -> DB -> SelectFirstCols (
sprintf (
" SELECT id FROM rechnung WHERE belegnr <> '' AND id IN (%s) " ,
implode ( ', ' , $auswahl )
)
);
foreach ( $auswahl as $v ) {
if ( ! $v ) {
continue ;
}
$checkpapier = $this -> app -> DB -> Select (
" SELECT a.rechnung_papier FROM rechnung AS r
LEFT JOIN adresse AS a ON r . adresse = a . id
WHERE r . id = '$v'
LIMIT 1 "
);
if ( $checkpapier != 1 &&
$this -> app -> DB -> Select (
" SELECT r.id
FROM rechnung AS r
INNER JOIN adresse AS a ON r . adresse = a . id
WHERE r . id = '$v' AND r . email <> '' OR a . email <> ''
LIMIT 1 "
)
) {
$this -> app -> erp -> PDFArchivieren ( 'rechnung' , $v , true );
$this -> app -> erp -> Rechnungsmail ( $v );
}
else if ( $checkpapier && $drucker ) {
$this -> app -> erp -> PDFArchivieren ( 'rechnung' , $v , true );
$projekt = $this -> app -> DB -> Select (
" SELECT projekt FROM rechnung WHERE id=' $v ' LIMIT 1 "
);
if ( class_exists ( 'RechnungPDFCustom' )) {
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
}
else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $v );
$tmpfile = $Brief -> displayTMP ();
$Brief -> ArchiviereDocument ();
$this -> app -> printer -> Drucken ( $drucker , $tmpfile );
unlink ( $tmpfile );
}
}
break ;
case 'versendet' :
$auswahl = $this -> app -> DB -> SelectFirstCols (
sprintf (
" SELECT id FROM rechnung WHERE belegnr <> '' AND id IN (%s) " ,
implode ( ', ' , $auswahl )
)
);
foreach ( $auswahl as $v ) {
if ( $v ) {
$reArr = $this -> app -> DB -> SelectRow (
sprintf (
" SELECT projekt,belegnr,status,usereditid,
DATE_SUB ( NOW (), INTERVAL 30 SECOND ) < useredittimestamp AS `open`
FROM rechnung WHERE id =% d LIMIT 1 " ,
$v
)
);
if ( $reArr [ 'belegnr' ] === '' || ( $reArr [ 'open' ] && $reArr [ 'status' ] === 'freigegeben' )) {
continue ;
}
$this -> markInvoiceAsClosed ( $v );
}
}
break ;
case 'drucken' :
if ( $drucker ) {
$auswahl = $this -> app -> DB -> SelectFirstCols (
sprintf (
" SELECT id FROM rechnung WHERE belegnr <> '' AND id IN (%s) " ,
implode ( ', ' , $auswahl )
)
);
foreach ( $auswahl as $v ) {
$reArr = $this -> app -> DB -> SelectRow (
sprintf (
" SELECT projekt,belegnr,status,usereditid,adresse,
DATE_SUB ( NOW (), INTERVAL 30 SECOND ) < useredittimestamp AS `open`
FROM rechnung WHERE id =% d LIMIT 1 " ,
$v
)
);
if ( $reArr [ 'belegnr' ] === '' || ( $reArr [ 'open' ] && $reArr [ 'status' ] === 'freigegeben' )) {
continue ;
}
if ( $reArr [ 'status' ] === 'freigegeben' ) {
$this -> app -> erp -> RechnungNeuberechnen ( $v );
}
$projekt = $reArr [ 'projekt' ]; //$this->app->DB->Select("SELECT projekt FROM rechnung WHERE id='$v' LIMIT 1");
$this -> app -> erp -> RechnungProtokoll ( $v , 'Rechnung gedruckt' );
$this -> app -> DB -> Update ( " UPDATE rechnung SET schreibschutz=1, versendet = 1 WHERE id = ' $v ' LIMIT 1 " );
$this -> app -> DB -> Update ( " UPDATE rechnung SET status='versendet' WHERE id = ' $v ' AND status!='storniert' LIMIT 1 " );
$this -> app -> erp -> PDFArchivieren ( 'rechnung' , $v , true );
if ( class_exists ( 'RechnungPDFCustom' )) {
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
}
else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $v );
$tmpfile = $Brief -> displayTMP ();
$Brief -> ArchiviereDocument ();
$this -> app -> printer -> Drucken ( $drucker , $tmpfile );
$doctype = 'rechnung' ;
$this -> app -> erp -> RunHook ( 'dokumentsend_ende' , 5 , $doctype , $v , $projekt , $reArr [ 'adresse' ], $aktion );
@ unlink ( $tmpfile );
}
}
break ;
case 'pdf' :
$tmpfile = [];
foreach ( $auswahl as $v ) {
$projekt = $this -> app -> DB -> Select ( " SELECT projekt FROM rechnung WHERE id= $v LIMIT 1 " );
if ( class_exists ( 'RechnungPDFCustom' )) {
$Brief = new RechnungPDFCustom ( $this -> app , $projekt );
}
else {
$Brief = new RechnungPDF ( $this -> app , $projekt );
}
$Brief -> GetRechnung ( $v );
$tmpfile [] = $Brief -> displayTMP ();
}
2022-06-10 11:28:28 +02:00
if (( ! empty ( $tmpfile ) ? count ( $tmpfile ) : 0 ) > 0 ) {
2022-05-23 21:03:20 +02:00
try {
/** @var PdfMerger $pdfMerger */
$pdfMerger = $this -> app -> Container -> get ( 'PdfMerger' );
$mergeOutputPath = realpath ( $this -> app -> erp -> GetTMP ()) . '/' . uniqid ( 'sammelpdf_' , true ) . '.pdf' ;
$pdfMerger -> merge ( $tmpfile , $mergeOutputPath );
foreach ( $tmpfile as $key => $value ) {
unlink ( $value );
}
header ( 'Content-type:application/pdf' );
header ( 'Content-Disposition: attachment;filename=' . md5 ( microtime ( true )) . '.pdf' );
readfile ( $mergeOutputPath );
$this -> app -> ExitXentral ();
} catch ( PdfComponentExceptionInterface $exception ) {
echo 'Fehler beim Generieren der Sammelpdf: ' . htmlspecialchars ( $exception -> getMessage ());
$this -> app -> ExitXentral ();
}
}
break ;
}
}
2023-06-07 15:30:44 +02:00
} // ende ausfuehren
if ( $this -> app -> Secure -> GetPOST ( 'zahlungsstatus_berechnen' ) && $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'edit' )) {
2023-06-08 15:35:46 +02:00
$this -> rechnung_zahlstatus_berechnen ();
2022-05-23 21:03:20 +02:00
}
2023-04-05 11:01:16 +02:00
2022-05-23 21:03:20 +02:00
$this -> app -> Tpl -> Set ( 'UEBERSCHRIFT' , 'Rechnungen' );
$backurl = $this -> app -> Secure -> GetGET ( 'backurl' );
$backurl = $this -> app -> erp -> base64_url_decode ( $backurl );
$this -> app -> erp -> MenuEintrag ( 'index.php?module=rechnung&action=list' , 'Übersicht' );
$this -> app -> erp -> MenuEintrag ( 'index.php?module=rechnung&action=create' , 'Neue Rechnung anlegen' );
if ( strlen ( $backurl ) > 5 ){
$this -> app -> erp -> MenuEintrag ( " $backurl " , 'Zurück' );
}
//else
// $this->app->erp->MenuEintrag("index.php","Zurück zur Übersicht");
$zahlungsweisen = $this -> app -> DB -> SelectArr ( '
SELECT
zahlungsweise
FROM
rechnung
GROUP BY
zahlungsweise
' );
$zahlungsweiseStr = '' ;
if ( $zahlungsweisen ) {
foreach ( $zahlungsweisen as $zahlungsweise ) {
if ( empty ( $zahlungsweise [ 'zahlungsweise' ])) {
continue ;
}
$zahlungsweiseStr .= '<option name="' . $zahlungsweise [ 'zahlungsweise' ] . '">' . ucfirst ( $zahlungsweise [ 'zahlungsweise' ]) . '</option>' ;
}
}
$status = $this -> app -> DB -> SelectArr ( '
SELECT
status
FROM
rechnung
GROUP BY
status
' );
$statusStr = '' ;
if ( $status ) {
foreach ( $status as $statusE ) {
if ( empty ( $statusE [ 'status' ])) {
continue ;
}
$statusStr .= '<option name="' . $statusE [ 'status' ] . '">' . ucfirst ( $statusE [ 'status' ]) . '</option>' ;
}
}
$versandarten = $this -> app -> DB -> SelectArr ( '
SELECT
versandart
FROM
rechnung
GROUP BY
versandart
' );
$versandartenStr = '' ;
if ( $versandarten ) {
foreach ( $versandarten as $versandart ) {
if ( empty ( $versandart [ 'versandart' ])) {
continue ;
}
$versandartenStr .= '<option name="' . $versandart [ 'versandart' ] . '">' . ucfirst ( $versandart [ 'versandart' ]) . '</option>' ;
}
}
$laender = $this -> app -> erp -> GetSelectLaenderliste ();
$laenderStr = '' ;
foreach ( $laender as $landKey => $land ) {
$laenderStr .= '<option value="' . $landKey . '">' . $land . '</option>' ;
}
$this -> app -> Tpl -> Add ( 'ZAHLUNGSWEISEN' , $zahlungsweiseStr );
$this -> app -> Tpl -> Add ( 'STATUS' , $statusStr );
$this -> app -> Tpl -> Add ( 'VERSANDARTEN' , $versandartenStr );
$this -> app -> Tpl -> Add ( 'LAENDER' , $laenderStr );
$this -> app -> YUI -> DatePicker ( 'datumVon' );
$this -> app -> YUI -> DatePicker ( 'datumBis' );
$this -> app -> YUI -> AutoComplete ( " projekt " , " projektname " , 1 );
$this -> app -> YUI -> AutoComplete ( " kundennummer " , " kunde " , 1 );
$this -> app -> YUI -> AutoComplete ( " rechnungsnummer " , " rechnung " , 1 );
$this -> app -> YUI -> AutoComplete ( " artikel " , " artikelnummer " , 1 );
$this -> app -> Tpl -> Parse ( 'TAB1' , " rechnung_table_filter.tpl " );
$this -> app -> Tpl -> Set ( 'AKTIV_TAB1' , " selected " );
$this -> app -> Tpl -> Set ( 'INHALT' , '' );
$this -> app -> YUI -> TableSearch ( 'TAB2' , 'rechnungenoffene' );
$this -> app -> YUI -> TableSearch ( 'TAB1' , 'rechnungen' );
$this -> app -> YUI -> TableSearch ( 'TAB3' , 'rechnungeninbearbeitung' );
if ( $this -> app -> erp -> RechteVorhanden ( 'rechnung' , 'manuellbezahltmarkiert' )){
$this -> app -> Tpl -> Set ( 'ALSBEZAHLTMARKIEREN' , '<option value="bezahlt">{|als bezahlt markieren|}</option>' );
}
$this -> app -> Tpl -> Set ( 'SELDRUCKER' , $this -> app -> erp -> GetSelectDrucker ( $this -> app -> User -> GetParameter ( 'rechnung_list_drucker' )));
$this -> app -> Tpl -> Parse ( 'PAGE' , 'rechnunguebersicht.tpl' );
}
/**
* @ param string | int $adresse
*
* @ return int
*/
public function CreateRechnung ( $adresse = '' )
{
$projekt = $this -> app -> erp -> GetCreateProjekt ( $adresse );
$belegmax = '' ;
$ohnebriefpapier = $this -> app -> erp -> Firmendaten ( 'rechnung_ohnebriefpapier' );
2023-12-25 23:28:04 +01:00
$abweichendebezeichnung = $this -> app -> erp -> Firmendaten ( 'rechnungersatz_standard' );
2022-05-23 21:03:20 +02:00
$usereditid = 0 ;
if ( isset ( $this -> app -> User ) && $this -> app -> User && method_exists ( $this -> app -> User , 'GetID' )){
$usereditid = $this -> app -> User -> GetID ();
}
2024-12-01 19:46:25 +01:00
if ( ! empty ( $adresse )) {
// Check XML Smarty template
$erechnung = false ;
$sql = " SELECT rechnung_smarty_template FROM adresse WHERE id = ' " . $adresse . " ' " ;
$rechnung_smarty_template = $this -> app -> DB -> Select ( $sql );
if ( ! empty ( $rechnung_smarty_template )) {
$erechnung = true ;
} else {
$sql = " SELECT id FROM gruppen WHERE rechnung_smarty_template <> '' and aktiv " ;
$gruppen = $this -> app -> DB -> SelectArr ( $sql );
foreach ( $gruppen as $gruppe ) {
if ( $this -> app -> erp -> IsAdresseInGruppe ( $adresse , $gruppe [ 'id' ])) {
$erechnung = true ;
}
}
}
}
2022-05-23 21:03:20 +02:00
if ( $this -> app -> erp -> StandardZahlungsweise ( $projekt ) === 'rechnung' )
{
2024-12-01 19:46:25 +01:00
$zahlungszieltage = $this -> app -> erp -> ZahlungsZielTage ( $projekt );
$zahlungszieltageskonto = $this -> app -> erp -> ZahlungsZielTageSkonto ( $projekt );
$zahlungszielskonto = $this -> app -> erp -> ZahlungsZielSkonto ( $projekt );
2022-05-23 21:03:20 +02:00
} else {
2024-12-01 19:46:25 +01:00
$zahlungszieltage = 0 ;
$zahlungszieltageskonto = 0 ;
$zahlungszielskonto = 0 ;
}
$this -> app -> DB -> Insert ( " INSERT INTO rechnung (
id ,
datum ,
bearbeiter ,
firma ,
belegnr ,
zahlungsweise ,
zahlungszieltage ,
zahlungszieltageskonto ,
zahlungszielskonto ,
lieferdatum ,
status ,
projekt ,
adresse ,
auftragid ,
ohne_briefpapier ,
angelegtam ,
usereditid ,
abweichendebezeichnung ,
erechnung
)
VALUES (
'' ,
NOW (),
'' ,
'".$this->app->User->GetFirma()."' ,
'$belegmax' ,
'".$this->app->erp->StandardZahlungsweise($projekt)."' ,
'".$zahlungszieltage."' ,
'".$zahlungszieltageskonto."' ,
'".$zahlungszielskonto."' ,
NOW (),
'angelegt' ,
'$projekt' ,
'$adresse' ,
0 ,
'".$ohnebriefpapier."' ,
NOW (),
'$usereditid' ,
'$abweichendebezeichnung' ,
'$erechnung'
) "
);
2022-05-23 21:03:20 +02:00
$id = $this -> app -> DB -> GetInsertID ();
$this -> app -> erp -> CheckVertrieb ( $id , 'rechnung' );
$this -> app -> erp -> CheckBearbeiter ( $id , 'rechnung' );
$this -> app -> erp -> RechnungProtokoll ( $id , 'Rechnung angelegt' );
$type = 'rechnung' ;
$this -> app -> erp -> ObjektProtokoll ( $type , $id , $type . '_create' , ucfirst ( $type ) . ' angelegt' );
$deliverythresholdvatid = $this -> app -> erp -> getDeliverythresholdvatid ( $projekt );
if ( $id > 0 && ! empty ( $deliverythresholdvatid )){
$deliverythresholdvatid = $this -> app -> DB -> real_escape_string ( $deliverythresholdvatid );
$this -> app -> DB -> Update ( " UPDATE rechnung SET deliverythresholdvatid = ' $deliverythresholdvatid ' WHERE id = $id LIMIT 1 " );
}
$this -> app -> erp -> SchnellFreigabe ( 'rechnung' , $id );
$this -> app -> erp -> LoadSteuersaetzeWaehrung ( $id , 'rechnung' , $projekt );
$this -> app -> erp -> EventAPIAdd ( 'EventRechnungCreate' , $id , 'rechnung' , 'create' );
return $id ;
}
/**
* @ param int $id
*
* @ return int
*/
public function CopyRechnung ( $id )
{
$this -> app -> DB -> Insert ( " INSERT INTO rechnung (angelegtam) VALUES (NOW()) " );
$newid = $this -> app -> DB -> GetInsertID ();
$arr = $this -> app -> DB -> SelectRow ( " SELECT NOW() as datum,projekt,bodyzusatz,freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,bearbeiter,zahlungszieltage,zahlungszieltageskonto,zahlungsweise,ohne_artikeltext,ohne_briefpapier,'angelegt' as status,
zahlungszielskonto , ust_befreit , rabatt , rabatt1 , rabatt2 , rabatt3 , rabatt4 , rabatt5 , gruppe , vertriebid , bearbeiterid , provision , provision_summe , typ ,
firma , sprache , anzeigesteuer , waehrung , kurs , kostenstelle FROM rechnung WHERE id = '$id' LIMIT 1 " );
$arr [ 'kundennummer' ] = $this -> app -> DB -> Select ( " SELECT kundennummer FROM adresse WHERE id = ' " . $arr [ 'adresse' ] . " ' LIMIT 1 " );
$arr [ 'bundesstaat' ] = $this -> app -> DB -> Select ( " SELECT bundesstaat FROM rechnung WHERE id=' $id ' LIMIT 1 " );
$this -> app -> DB -> UpdateArr ( 'rechnung' , $newid , 'id' , $arr , true );
$pos = $this -> app -> DB -> SelectArr ( " SELECT * FROM rechnung_position WHERE rechnung=' $id ' " );
$cpos = ! empty ( $pos ) ? count ( $pos ) : 0 ;
for ( $i = 0 ; $i < $cpos ; $i ++ ){
$this -> app -> DB -> Insert ( " INSERT INTO rechnung_position (rechnung) VALUES( $newid ) " );
$newposid = $this -> app -> DB -> GetInsertID ();
$pos [ $i ][ 'rechnung' ] = $newid ;
$this -> app -> DB -> UpdateArr ( 'rechnung_position' , $newposid , 'id' , $pos [ $i ], true );
if ( $pos [ $i ][ 'steuersatz' ] === null ){
$this -> app -> DB -> Update ( " UPDATE rechnung_position SET steuersatz = null WHERE id = ' $newposid ' LIMIT 1 " );
}
}
$this -> app -> erp -> CheckFreifelder ( 'rechnung' , $newid );
$this -> app -> erp -> CopyBelegZwischenpositionen ( 'rechnung' , $id , 'rechnung' , $newid );
$this -> app -> erp -> LoadSteuersaetzeWaehrung ( $newid , 'rechnung' );
$this -> app -> erp -> SchnellFreigabe ( 'rechnung' , $newid );
return $newid ;
}
/**
* @ param int $id
* @ param int $adresse
*/
public function LoadRechnungStandardwerte ( $id , $adresse )
{
if ( $id == 0 || $id == '' || $adresse == '' || $adresse == '0' ){
return ;
}
$this -> app -> erp -> StartChangeLog ( 'rechnung' , $id );
// standard adresse von lieferant
$arr = $this -> app -> DB -> SelectArr ( " SELECT *,vertrieb as vertriebid,'' as bearbeiter,innendienst as bearbeiterid FROM adresse WHERE id=' $adresse ' AND geloescht=0 LIMIT 1 " );
if ( $arr [ 0 ][ 'bearbeiterid' ] <= 0 ){
$arr [ 0 ][ 'bearbeiterid' ] = $this -> app -> User -> GetAdresse ();
}
$arr [ 0 ][ 'gruppe' ] = $this -> app -> erp -> GetVerband ( $adresse );
$rolle_projekt = $this -> app -> DB -> Select ( " SELECT parameter FROM adresse_rolle WHERE adresse=' $adresse ' AND subjekt='Kunde' AND objekt='Projekt' AND (bis ='0000-00-00' OR bis <= NOW()) LIMIT 1 " );
if ( $arr [ 0 ][ 'abweichende_rechnungsadresse' ] == '1' )
{
$arr = $this -> app -> DB -> SelectArr ( " SELECT projekt, rechnung_name as name,
rechnung_abteilung as abteilung ,
rechnung_ansprechpartner as ansprechpartner ,
rechnung_unterabteilung as unterabteilung ,
rechnung_strasse as strasse ,
rechnung_adresszusatz as adresszusatz ,
rechnung_plz as plz ,
rechnung_ort as ort ,
rechnung_land as land ,
rechnung_telefon as telefon ,
rechnung_titel as titel ,
rechnung_email as email ,
rechnung_telefax as telefax ,
rechnung_vorname as vorname ,
rechnung_typ as typ ,
rechnung_bundesstaat as bundesstaat ,
rechnung_gln as gln ,
ustid ,
kundennummer ,
lieferbedingung ,
vertrieb as vertriebid ,
innendienst as bearbeiterid ,
'' as bearbeiter ,
rechnung_anschreiben as anschreiben
FROM adresse WHERE id = '$adresse' AND geloescht = 0 LIMIT 1 " );
$arr [ 0 ][ 'gruppe' ] = $this -> app -> erp -> GetVerband ( $adresse );
}
$field = array ( 'gln' , 'anschreiben' , 'name' , 'abteilung' , 'typ' , 'unterabteilung' , 'strasse' , 'adresszusatz' , 'plz' , 'ort' , 'land' , 'ustid' , 'email' , 'telefon' , 'telefax' , 'kundennummer' , 'projekt' , 'ust_befreit' , 'gruppe' , 'vertriebid' , 'bearbeiter' , 'ansprechpartner' , 'bearbeiterid' , 'titel' , 'lieferbedingung' , 'bundesstaat' );
if ( $rolle_projekt > 0 )
{
$arr [ 0 ][ 'projekt' ] = $rolle_projekt ;
}
foreach ( $field as $key => $value )
{
if ( $value == " projekt " && $this -> app -> Secure -> POST [ $value ] != " " && 0 )
{
$uparr [ $value ] = str_replace ( " ' " , ''' , $this -> app -> Secure -> POST [ $value ]);
} else {
$this -> app -> Secure -> POST [ $value ] = str_replace ( " ' " , ''' , $arr [ 0 ][ $value ]);
$uparr [ $value ] = str_replace ( " ' " , ''' , $arr [ 0 ][ $value ]);
}
}
$uparr [ 'adresse' ] = $adresse ;
$uparr [ 'ust_befreit' ] = $this -> app -> erp -> AdresseUSTCheck ( $adresse );
$uparr [ 'zahlungsstatusstatus' ] = 'offen' ;
if ( $this -> app -> erp -> Firmendaten ( 'rechnung_ohnebriefpapier' ) == '1' ){
$uparr [ 'ohne_briefpapier' ] = '1' ;
}
2023-12-25 23:28:04 +01:00
if ( $this -> app -> erp -> Firmendaten ( 'rechnungersatz_standard' ) == '1' ){
$uparr [ 'abweichendebezeichnung' ] = 1 ;
}
2022-05-23 21:03:20 +02:00
$this -> app -> DB -> UpdateArr ( 'rechnung' , $id , 'id' , $uparr , true );
$uparr = null ;
//liefernantenvorlage
$arr = $this -> app -> DB -> SelectArr ( " SELECT * FROM adresse WHERE id=' $adresse ' LIMIT 1 " );
if ( $arr [ 0 ][ 'abweichende_rechnungsadresse' ] == '1' )
{
$arr = $this -> app -> DB -> SelectArr ( " SELECT projekt, rechnung_name as name,
rechnung_abteilung as abteilung ,
rechnung_unterabteilung as unterabteilung ,
rechnung_strasse as strasse ,
rechnung_adresszusatz as adresszusatz ,
rechnung_plz as plz ,
rechnung_ort as ort ,
rechnung_land as land ,
rechnung_telefon as telefon ,
rechnung_telefax as telefax ,
rechnung_vorname as vorname ,
rechnung_typ as typ ,
zahlungsweise , zahlungszieltage , zahlungszieltageskonto , zahlungszielskonto , versandart ,
rechnung_anschreiben as anschreiben
FROM adresse WHERE id = '$adresse' AND geloescht = 0 LIMIT 1 " );
}
$field = array ( 'zahlungsweise' , 'zahlungszieltage' , 'zahlungszieltageskonto' , 'zahlungszielskonto' , 'versandart' );
$this -> app -> erp -> LoadZahlungsweise ( $adresse , $arr );
// falls von Benutzer projekt ueberladen werden soll
$projekt_bevorzugt = $this -> app -> DB -> Select ( " SELECT projekt_bevorzugen FROM user WHERE id=' " . $this -> app -> User -> GetID () . " ' LIMIT 1 " );
if ( $projekt_bevorzugt == " 1 " )
{
$uparr [ 'projekt' ] = $this -> app -> DB -> Select ( " SELECT projekt FROM user WHERE id=' " . $this -> app -> User -> GetID () . " ' LIMIT 1 " );
$arr [ 0 ][ 'projekt' ] = $uparr [ 'projekt' ];
$this -> app -> Secure -> POST [ 'projekt' ] = $this -> app -> DB -> Select ( " SELECT abkuerzung FROM projekt WHERE id=' " . $arr [ 0 ][ 'projekt' ] . " ' AND id > 0 LIMIT 1 " );
}
if ( isset ( $arr [ 0 ][ 'usereditid' ])){
unset ( $arr [ 0 ][ 'usereditid' ]);
}
$this -> app -> Secure -> POST [ 'zahlungsweise' ] = strtolower ( $arr [ 0 ][ 'zahlungsweise' ]);
$this -> app -> Secure -> POST [ 'zahlungszieltage' ] = strtolower ( $arr [ 0 ][ 'zahlungszieltage' ]);
$this -> app -> Secure -> POST [ 'zahlungszieltageskonto' ] = strtolower ( $arr [ 0 ][ 'zahlungszieltageskonto' ]);
$this -> app -> Secure -> POST [ 'zahlungszielskonto' ] = strtolower ( $arr [ 0 ][ 'zahlungszielskonto' ]);
$this -> app -> Secure -> POST [ 'versandart' ] = strtolower ( $arr [ 0 ][ 'versandart' ]);
/*
foreach ( $field as $key => $value )
{
$uparr [ $value ] = $arr [ 0 ][ $value ];
$this -> app -> Secure -> POST [ $value ] = $arr [ 0 ][ $value ];
}
*/
$this -> app -> DB -> UpdateArr ( 'rechnung' , $id , 'id' , $arr [ 0 ], true );
$this -> app -> erp -> WriteChangeLog ();
$this -> app -> erp -> LoadSteuersaetzeWaehrung ( $id , 'rechnung' );
$this -> app -> erp -> StartChangeLog ( 'rechnung' , $id );
$this -> app -> erp -> LoadAdresseStandard ( 'rechnung' , $id , $adresse );
$this -> app -> erp -> WriteChangeLog ();
}
/**
* @ param int $id
*/
public function DeleteRechnung ( $id )
{
if ( $id <= 0 ) {
return ;
}
$belegnr = $this -> app -> DB -> Select ( " SELECT belegnr FROM rechnung WHERE id=' $id ' LIMIT 1 " );
if ( $belegnr == '' || $belegnr == '0' ) {
$this -> app -> DB -> Delete ( " DELETE FROM rechnung_position WHERE rechnung=' $id ' " );
$this -> app -> DB -> Delete ( " DELETE FROM rechnung_protokoll WHERE rechnung=' $id ' " );
$this -> app -> DB -> Delete ( " DELETE FROM rechnung WHERE id=' $id ' LIMIT 1 " );
}
}
/**
* @ param int $rechnung
* @ param int $verkauf
* @ param float $menge
* @ param string $datum
*/
public function AddRechnungPosition ( $rechnung , $verkauf , $menge , $datum )
{
$artikel = 0 ;
$preis = 0 ;
$projekt = 0 ;
$waehrung = 0 ;
$vpe = '' ;
if ( $verkauf ){
$verkaufspreisearr = $this -> app -> SelectRow ( " SELECT * FROM verkaufspreise WHERE id=' $verkauf ' LIMIT 1 " );
}
if ( ! empty ( $verkaufspreisearr )) {
$artikel = $verkaufspreisearr [ 'artikel' ];
$preis = $verkaufspreisearr [ 'preis' ];
$projekt = $verkaufspreisearr [ 'projekt' ];
$waehrung = $verkaufspreisearr [ 'waehrung' ];
$vpe = $verkaufspreisearr [ 'vpe' ];
}
if ( $artikel > 0 ){
$artikelarr = $this -> app -> SelectRow ( " SELECT * FROM artikel WHERE id=' $artikel ' LIMIT 1 " );
}
$bezeichnunglieferant = '' ;
$umsatzsteuer = '' ;
$bestellnummer = '' ;
if ( ! empty ( $artikelarr )) {
$bezeichnunglieferant = $artikelarr [ 'name_de' ];
$umsatzsteuer = $artikelarr [ 'umsatzsteuer' ];
$bestellnummer = $artikelarr [ 'nummer' ];
}
$sort = ( int ) $this -> app -> DB -> Select ( " SELECT MAX(sort) FROM rechnung_position WHERE rechnung=' $rechnung ' LIMIT 1 " );
$sort ++ ;
$this -> app -> DB -> Insert ( " INSERT INTO rechnung_position (rechnung,artikel,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe)
VALUES ( '$rechnung' , '$artikel' , '$bezeichnunglieferant' , '$bestellnummer' , '$menge' , '$preis' , '$waehrung' , '$sort' , '$datum' , '$umsatzsteuer' , 'angelegt' , '$projekt' , '$vpe' ) " );
}
/**
* @ param int $rechnung
* @ param int $artikel
* @ param float $preis
* @ param float $menge
* @ param string $bezeichnung
* @ param string $beschreibung
* @ param string $waehrung
* @ param int $rabatt
*
* @ return int
*/
public function AddRechnungPositionManuell ( $rechnung , $artikel , $preis , $menge , $bezeichnung , $beschreibung = '' , $waehrung = 'EUR' , $rabatt = 0 )
{
$bezeichnung = $this -> app -> DB -> real_escape_string ( $bezeichnung );
$beschreibung = $this -> app -> DB -> real_escape_string ( $beschreibung );
$bezeichnunglieferant = $bezeichnung ;
$artArr = $this -> app -> DB -> SelectRow (
sprintf (
'SELECT nummer, projekt, umsatzsteuer FROM artikel WHERE id = %d' ,
$artikel
)
);
$bestellnummer = ! empty ( $artArr ) ? $artArr [ 'nummer' ] : $this -> app -> DB -> Select ( " SELECT nummer FROM artikel WHERE id=' $artikel ' LIMIT 1 " );
$projekt = ! empty ( $artArr ) ? $artArr [ 'projekt' ] : $this -> app -> DB -> Select ( " SELECT projekt FROM artikel WHERE id=' $artikel ' LIMIT 1 " );
$bestellnummer = $this -> app -> DB -> real_escape_string ( $bestellnummer );
if ( $waehrung != '' ) {
$this -> app -> DB -> Update ( " UPDATE rechnung SET waehrung=' $waehrung ' WHERE id=' $rechnung ' AND waehrung='' LIMIT 1 " );
}
$keinrabatterlaubt = 0 ;
if ( $rabatt <> 0 ) {
$keinrabatterlaubt = 1 ;
}
//$waehrung = $this->app->DB->Select("SELECT waehrung FROM verkaufspreise WHERE id='$verkauf' LIMIT 1");
$umsatzsteuer = ! empty ( $artArr ) ? $artArr [ 'umsatzsteuer' ] : $this -> app -> DB -> Select ( " SELECT umsatzsteuer FROM artikel WHERE id=' $artikel ' LIMIT 1 " );
$umsatzsteuer = $this -> app -> DB -> real_escape_string ( $umsatzsteuer );
$vpe = '' ;
//$vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1");
$sort = ( int ) $this -> app -> DB -> Select ( " SELECT MAX(sort) FROM rechnung_position WHERE rechnung=' $rechnung ' LIMIT 1 " );
$sort ++ ;
$this -> app -> DB -> Insert ( " INSERT INTO rechnung_position (rechnung,artikel,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,beschreibung,rabatt,keinrabatterlaubt)
VALUES ( '$rechnung' , '$artikel' , '$bezeichnunglieferant' , '$bestellnummer' , '$menge' , '$preis' , '$waehrung' , '$sort' , '$datum' , '$umsatzsteuer' , 'angelegt' , '$projekt' , '$vpe' , '$beschreibung' , '$rabatt' , '$keinrabatterlaubt' ) " );
return $this -> app -> DB -> GetInsertID ();
}
2022-11-22 12:39:07 +01:00
2023-03-15 22:50:58 +01:00
/**
* Build the html output for minidetail containing the payments
* @ param bool $return
*
* @ return string
*/
2022-11-22 12:39:07 +01:00
function RechnungZahlung ( $return = false )
{
$id = $this -> app -> Secure -> GetGET ( 'id' );
2023-03-25 17:50:04 +01:00
$zahlungen = $this -> app -> erp -> GetZahlungen ( $id , 'rechnung' );
if ( ! empty ( $zahlungen )) {
$et = new EasyTable ( $this -> app );
$et -> headings = array ( 'Datum' , 'Beleg' , 'Betrag' , 'Währung' );
foreach ( $zahlungen as $zahlung ) {
$row = array (
$zahlung [ 'datum' ],
" <a href= \" index.php?module= " . $zahlung [ 'doc_typ' ] . " &action=edit&id= " . $zahlung [ 'doc_id' ] . " \" >
" .ucfirst( $zahlung['doc_typ'] ). "
2023-04-06 10:43:36 +02:00
" . $zahlung['doc_info'] . "
2023-03-25 17:50:04 +01:00
</ a > " ,
$zahlung [ 'betrag' ],
$zahlung [ 'waehrung' ]
);
$et -> AddRow ( $row );
}
2022-11-22 12:39:07 +01:00
2023-03-25 17:50:04 +01:00
$salden = $this -> app -> erp -> GetSaldenDokument ( $id , 'rechnung' );
foreach ( $salden as $saldo ) {
$row = array (
'' ,
'<b>Saldo</b>' ,
" <b> " . $saldo [ 'betrag' ] . " </b> " ,
" <b> " . $saldo [ 'waehrung' ] . " </b> "
);
$et -> AddRow ( $row );
}
return ( $et -> DisplayNew ( 'return' , " " ));
}
}
2023-06-07 15:30:44 +02:00
2023-06-08 15:35:46 +02:00
/*
* Recalculate the payments status with skonto
*/
2024-10-03 13:43:45 +02:00
function rechnung_zahlstatus_berechnen ( $rechnung_id = null ) {
2023-06-08 15:35:46 +02:00
// START RECALCULATE
$this -> app -> erp -> fibu_rebuild_tables ();
2024-10-03 13:43:45 +02:00
if ( ! empty ( $rechnung_id )) {
$condition = " AND id = ' " . $rechnung_id . " ' " ;
}
2023-06-08 15:35:46 +02:00
$offene_rechnungen = $this -> app -> DB -> SelectArr ( " SELECT
id ,
soll ,
waehrung ,
datum ,
zahlungszieltage ,
DATE_ADD ( datum , INTERVAL zahlungszieltage DAY ) as zieldatum ,
CURRENT_DATE > DATE_ADD ( datum , INTERVAL zahlungszieltage DAY ) as faellig ,
zahlungszielskonto ,
TRUNCATE ( soll * ( 1 - ( zahlungszielskonto / 100 )), 2 ) as skontosoll ,
zahlungszieltageskonto ,
DATE_ADD ( datum , INTERVAL zahlungszieltageskonto DAY ) as zieldatumskonto
FROM
rechnung
WHERE
2023-06-16 12:29:50 +02:00
belegnr <> '' AND zahlungsstatus = 'offen'
2024-10-03 13:43:45 +02:00
" . $condition );
2023-06-08 15:35:46 +02:00
2024-10-03 13:43:45 +02:00
foreach ( $offene_rechnungen as $offene_rechnung ) {
2023-06-08 15:35:46 +02:00
$saldo = $this -> app -> erp -> GetSaldoDokument ( $offene_rechnung [ 'id' ], 'rechnung' );
if ( ! empty ( $saldo )) {
if ( $saldo [ 'waehrung' ] == $offene_rechnung [ 'waehrung' ]) {
$offene_rechnung [ 'ist' ] = $offene_rechnung [ 'soll' ] + $saldo [ 'betrag' ];
// Check for skonto
$skontorelevante_zahlungen = $this -> app -> erp -> GetSaldoDokument ( $offene_rechnung [ 'id' ], 'rechnung' , 'zubuchung' , $offene_rechnung [ 'zieldatumskonto' ])[ 'betrag' ];
$zielkonforme_zahlungen = $this -> app -> erp -> GetSaldoDokument ( $offene_rechnung [ 'id' ], 'rechnung' , 'zubuchung' , $offene_rechnung [ 'zieldatum' ])[ 'betrag' ];
// Check overall value
if ( $saldo [ 'betrag' ] == 0 ) {
// ok -> will be marked as paid
2024-10-03 13:43:45 +02:00
} else if ( abs ( $skontorelevante_zahlungen - $offene_rechnung [ 'skontosoll' ]) <= 0.01 ) {
2023-06-08 15:35:46 +02:00
// Skonto ok -> book difference
$sachkonto = $this -> app -> erp -> Firmendaten ( 'rechnung_skonto_kontorahmen' );
2024-10-03 13:43:45 +02:00
if ( ! empty ( $sachkonto )) {
$this -> app -> erp -> fibu_buchungen_buchen ( 'rechnung' , $offene_rechnung [ 'id' ], 'kontorahmen' , $sachkonto , $offene_rechnung [ 'soll' ] - $skontorelevante_zahlungen , $offene_rechnung [ 'waehrung' ], date ( 'Y-m-d' ), '' );
2023-06-08 15:35:46 +02:00
$offene_rechnung [ 'ist' ] = $offene_rechnung [ 'soll' ];
2024-10-03 13:43:45 +02:00
$saldo [ 'betrag' ] = 0 ;
2023-06-08 15:35:46 +02:00
} else {
}
} else if ( $offene_rechnung [ 'faellig' ]) {
// Overdue
} else {
// Not due
}
// Update rechnung
$sql = " UPDATE
rechnung
SET
ist = " . $saldo['betrag'] . " + soll ,
zahlungsstatus = IF ( " . $saldo['betrag'] . " = 0 , 'bezahlt' , 'offen' )
2024-10-03 13:43:45 +02:00
WHERE id = " . $offene_rechnung['id'] ;
2023-06-08 15:35:46 +02:00
$this -> app -> DB -> Update ( $sql );
}
}
else {
$this -> app -> DB -> Update ( " UPDATE rechnung SET ist = null WHERE id= " . $offene_rechnung [ 'id' ]);
}
}
$this -> app -> erp -> fibu_rebuild_tables ();
// END RECALCULATE
}
2023-06-07 15:30:44 +02:00
2022-05-23 21:03:20 +02:00
}