mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-29 08:00:28 +01:00
3084 lines
126 KiB
PHP
3084 lines
126 KiB
PHP
<?php
|
|
/*
|
|
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
*
|
|
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
|
|
*
|
|
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
|
|
*
|
|
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
|
|
* to obtain the text of the corresponding license version.
|
|
*
|
|
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
*/
|
|
?>
|
|
<?php
|
|
use Xentral\Components\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");
|
|
$this->app->ActionHandler("xml","RechnungSmarty");
|
|
$this->app->ActionHandler("json","RechnungJSON");
|
|
$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
|
|
$this->app->ActionHandler("belegnredit","belegnredit"); // nur fuer rechte
|
|
|
|
$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)
|
|
{
|
|
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 entfernt');
|
|
$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='$invoiceId'"
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
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');
|
|
|
|
$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'");
|
|
|
|
$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
|
|
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='$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(
|
|
"SELECT status,zahlungsstatus,erechnung,belegnr FROM rechnung WHERE id='$id' LIMIT 1"
|
|
);
|
|
}
|
|
$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);
|
|
|
|
/*
|
|
//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;";
|
|
*/
|
|
|
|
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>
|
|
|
|
|
|
Aktion: <select id=\"aktion$prefix\" onchange=\"onchangerechnung(this.value)\">
|
|
<option>bitte wä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>
|
|
";
|
|
|
|
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>
|
|
<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);
|
|
}
|
|
|
|
$this->app->Tpl->Set('ZAHLWEISE',ucfirst($auftragArr[0]['zahlungsweise']));
|
|
$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']='-';
|
|
}
|
|
|
|
$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);
|
|
|
|
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>
|
|
<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))
|
|
{
|
|
$cgutschrift = !empty((!empty($gutschrift)?count($gutschrift):0))?:0;
|
|
for($li=0;$li<$cgutschrift;$li++)
|
|
{
|
|
$this->app->Tpl->Add('GUTSCHRIFT',$gutschrift[$li]['gutschrift']);
|
|
if($li<(!empty($gutschrift)?count($gutschrift):0)){
|
|
$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!");
|
|
}
|
|
|
|
$this->app->Tpl->Set('ZAHLUNGEN',$this->RechnungZahlung(true));
|
|
|
|
$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");
|
|
|
|
/*
|
|
$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);
|
|
$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");
|
|
$tmp2->DisplayNew('MAHNPROTOKOLL',"Protokoll","noAction");
|
|
}
|
|
|
|
|
|
}*/
|
|
|
|
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;
|
|
}
|
|
|
|
$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);
|
|
$this->rechnung_zahlstatus_berechnen($id);
|
|
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>");
|
|
}
|
|
|
|
$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();
|
|
}
|
|
|
|
// Print PHP array for SmartyXML
|
|
function RechnungJSON() {
|
|
$this->RechnungSmarty(true);
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
$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");
|
|
|
|
$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
|
|
");
|
|
|
|
if (empty($positionen)) {
|
|
throw new exception("Rechnung enthält keine Positionen!");
|
|
}
|
|
|
|
$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'];
|
|
|
|
$this->remove_html_entities_from_array($result);
|
|
$this->remove_CDATA_fragments_from_array($result);
|
|
|
|
if ($json) {
|
|
header('Content-type:text/plain');
|
|
header('Content-Disposition: attachment;filename='.$filename.'.json');
|
|
echo(json_encode($result,JSON_PRETTY_PRINT));
|
|
} else {
|
|
|
|
$template = $this->app->DB->Select("SELECT template from smarty_templates WHERE id = '".$adresse[0]['rechnung_smarty_template']."' LIMIT 1");
|
|
|
|
if(empty($template)) {
|
|
header('Content-type:text/xml');
|
|
header('Content-Disposition: attachment;filename='.$filename.'.xml');
|
|
echo('<?xml version="1.0" encoding="utf-8"?>
|
|
<note>
|
|
<body>Kein Smarty Template an der Addresse hinterlegt!</body>
|
|
</note>');
|
|
} else {
|
|
$smarty = new Smarty;
|
|
$directory = $this->app->erp->GetTMP().'/smarty/templates';
|
|
$smarty->setCompileDir($directory);
|
|
$smarty->assign('rechnung', $result);
|
|
$html = $smarty->fetch('string:'.$template);
|
|
header('Content-type:application/xml');
|
|
header('Content-Disposition: attachment;filename='.$filename.'.xml');
|
|
echo($html);
|
|
}
|
|
}
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
// ALWAYS
|
|
$this->app->erp->RechnungNeuberechnen($id);
|
|
|
|
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(
|
|
'SELECT zahlungsweise,zahlungszieltage,dta_datei,status,zahlungsstatus,schreibschutz FROM rechnung WHERE id= %d LIMIT 1',
|
|
(int)$id
|
|
)
|
|
);
|
|
$zahlungsweise= $invoiceArr['zahlungsweise'];
|
|
$zahlungszieltage= $invoiceArr['zahlungszieltage'];
|
|
$zahlungsstatus= $invoiceArr['zahlungsstatus'];
|
|
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'];
|
|
|
|
$skontosoll = $this->app->DB->Select("SELECT TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll FROM rechnung where id = '".$id."' LIMIT 1");
|
|
}
|
|
|
|
$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\">");
|
|
$this->app->Tpl->Set('SKONTOSOLL',$skontosoll);
|
|
|
|
if($schreibschutz!='1')// && $this->app->erp->RechteVorhanden("rechnung","schreibschutz"))
|
|
{
|
|
$this->app->erp->AnsprechpartnerButton($adresse);
|
|
$this->app->erp->LieferadresseButton($adresse);
|
|
}
|
|
|
|
if($nummer!='') {
|
|
|
|
$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');
|
|
}
|
|
|
|
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','');
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
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');
|
|
}
|
|
|
|
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');
|
|
/*
|
|
'ist' should not be edited manually
|
|
|
|
$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)
|
|
$this->app->erp->RemoveReadonly('ist');*/
|
|
|
|
//$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++)
|
|
$gutschriften .= "<a href=\"index.php?module=gutschrift&action=edit&id=".$alle_gutschriften[$agi]['id']."\" target=\"_blank\">".$alle_gutschriften[$agi]['belegnr']."</a> ";
|
|
$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');
|
|
|
|
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."'");
|
|
}
|
|
}
|
|
|
|
if($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen'))
|
|
{
|
|
$mahnwesen_datum = $this->app->Secure->GetPOST('mahnwesen_datum');
|
|
$bezahlt_am = $this->app->Secure->GetPOST('bezahlt_am');
|
|
$zahlbetrag = $this->app->Secure->GetPOST('zahlbetrag');
|
|
$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");
|
|
if($alte_mahnstufe!=$mahnwesen) $versendet=0;
|
|
|
|
/* if($mahnwesenfestsetzen=='1')
|
|
{*/
|
|
$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");
|
|
/* } else {
|
|
$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");
|
|
}*/
|
|
}
|
|
|
|
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');
|
|
}
|
|
|
|
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ünglich festgelegten Betrag '.
|
|
number_format($extsoll,2,',','.').
|
|
' überein <input type="submit" name="resetextsoll" value="Festgeschriebene Summe zurücksetzen" /></div></form>'
|
|
);
|
|
}
|
|
|
|
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ä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()
|
|
{
|
|
|
|
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''");
|
|
|
|
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':
|
|
$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).')');
|
|
break;
|
|
case 'offen':
|
|
$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).')');
|
|
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();
|
|
}
|
|
|
|
if((!empty($tmpfile)?count($tmpfile):0) > 0) {
|
|
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;
|
|
}
|
|
}
|
|
} // ende ausfuehren
|
|
|
|
if($this->app->Secure->GetPOST('zahlungsstatus_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) {
|
|
$this->rechnung_zahlstatus_berechnen();
|
|
}
|
|
|
|
$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');
|
|
}
|
|
|
|
// Decide if XML Smarty invoice according to address
|
|
public function SetXMLRechnung($id) {
|
|
$adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id = '".$id."' LIMIT 1");
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
if ($erechnung) {
|
|
$this->app->DB->Update("UPDATE rechnung SET erechnung = 1 WHERE id = '".$id."' AND schreibschutz <> 1");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string|int $adresse
|
|
*
|
|
* @return int
|
|
*/
|
|
public function CreateRechnung($adresse='')
|
|
{
|
|
$projekt = $this->app->erp->GetCreateProjekt($adresse);
|
|
|
|
$belegmax = '';
|
|
$ohnebriefpapier = $this->app->erp->Firmendaten('rechnung_ohnebriefpapier');
|
|
$abweichendebezeichnung = $this->app->erp->Firmendaten('rechnungersatz_standard');
|
|
|
|
$usereditid = 0;
|
|
if(isset($this->app->User) && $this->app->User && method_exists($this->app->User,'GetID')){
|
|
$usereditid = $this->app->User->GetID();
|
|
}
|
|
|
|
if($this->app->erp->StandardZahlungsweise($projekt)==='rechnung')
|
|
{
|
|
$zahlungszieltage = $this->app->erp->ZahlungsZielTage($projekt);
|
|
$zahlungszieltageskonto = $this->app->erp->ZahlungsZielTageSkonto($projekt);
|
|
$zahlungszielskonto = $this->app->erp->ZahlungsZielSkonto($projekt);
|
|
} else {
|
|
$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'
|
|
)"
|
|
);
|
|
|
|
$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';
|
|
}
|
|
|
|
if($this->app->erp->Firmendaten('rechnungersatz_standard')=='1'){
|
|
$uparr['abweichendebezeichnung']=1;
|
|
}
|
|
|
|
$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();
|
|
}
|
|
|
|
|
|
/**
|
|
* Build the html output for minidetail containing the payments
|
|
* @param bool $return
|
|
*
|
|
* @return string
|
|
*/
|
|
function RechnungZahlung($return=false)
|
|
{
|
|
$id = $this->app->Secure->GetGET('id');
|
|
|
|
$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'])."
|
|
".$zahlung['doc_info']."
|
|
</a>",
|
|
$zahlung['betrag'],
|
|
$zahlung['waehrung']
|
|
);
|
|
$et->AddRow($row);
|
|
}
|
|
|
|
$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',""));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Recalculate the payments status with skonto
|
|
*/
|
|
|
|
function rechnung_zahlstatus_berechnen($rechnung_id = null) {
|
|
// START RECALCULATE
|
|
$this->app->erp->fibu_rebuild_tables();
|
|
|
|
if (!empty($rechnung_id)) {
|
|
$condition = " AND id = '".$rechnung_id."'";
|
|
}
|
|
|
|
$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
|
|
belegnr <> '' AND zahlungsstatus = 'offen'
|
|
".$condition);
|
|
|
|
foreach ($offene_rechnungen as $offene_rechnung) {
|
|
$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
|
|
} else if (abs($skontorelevante_zahlungen-$offene_rechnung['skontosoll']) <= 0.01) {
|
|
// Skonto ok -> book difference
|
|
$sachkonto = $this->app->erp->Firmendaten('rechnung_skonto_kontorahmen');
|
|
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'),'');
|
|
$offene_rechnung['ist'] = $offene_rechnung['soll'];
|
|
$saldo['betrag'] = 0;
|
|
} 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')
|
|
WHERE id=".$offene_rechnung['id'];
|
|
$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
|
|
}
|
|
|
|
}
|