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("archivierexml","RechnungArchiviereXML");
$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 RechnungArchiviereXML($id = null) {
if ($id === null) {
$id = (int)$this->app->Secure->GetGET('id');
$redirect = true;
}
$result = $this->RechnungSmarty(id: $id, json: false, returnvalue: true);
if ($result['success']) {
// Check for old files
$existing = false;
$existing_ids = $this->app->erp->GetDateiSubjektObjekt('rechnung','rechnung',$id);
foreach ($existing_ids as $existing_id) {
if($this->app->erp->GetDateiEndung($existing_id) == 'xml') {
$existing = true;
break;
}
}
if ($existing) {
$this->app->erp->AddDateiVersion(
id: $existing_id,
ersteller: $this->app->User->GetName(),
dateiname: $result['filename'].'.xml',
bemerkung: '',
datei: $result['xml'],
path: ""
);
} else {
$this->app->erp->CreateDateiWithStichwort(
name: $result['filename'].'.xml',
titel: $result['title'],
beschreibung: '',
nummer: '',
datei: $result['xml'],
ersteller: $this->app->User->GetName(),
subjekt: 'rechnung',
objekt: 'rechnung',
parameter: $id
);
}
} else {
throw new exception("XML Rechnung fehlgeschlagen!");
}
$this->app->DB->Update("UPDATE rechnung SET schreibschutz='1', zuarchivieren = '0' WHERE id='$id'");
if ($redirect) {
$this->app->Location->execute('index.php?module=rechnung&action=edit&id='.$id);
}
}
function RechnungArchivierePDF()
{
$id = (int)$this->app->Secure->GetGET('id');
$this->app->erp->PDFArchivieren('rechnung', $id, true);
$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("
Die Verbandsinformation wurde neu geladen!
");
$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("
Die Rechnung kann nochmal eingezogen werden!
");
$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("
Die Rabatte wurden entfernt!
");
$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,xmlrechnung,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 = "";
$storno = "";
} else {
$weiterfuehren = "";
}
$casehook = '';
$optionhook = '';
$this->app->erp->RunHook('rechnungiconmenu_option', 5, $id, $casehook, $optionhook, $status, $prefix);
if($this->app->erp->RechteVorhanden("rechnung","undostorno") && !$checkifgsexists)
$undostorno = "";
if($this->app->erp->RechteVorhanden("rechnung","manuellbezahltmarkiert") && $zahlungsstatus=="offen")
$bezahlt = "";
if($this->app->erp->RechteVorhanden("rechnung","manuellbezahltentfernen") && $zahlungsstatus=="bezahlt")
$bezahlt = "";
$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 = "";
$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 = '';
$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 = "";
}
if($checkifgsexists>0) $extendtext = "HINWEIS: Es existiert bereits eine Gutschrift zu dieser Rechnung! "; else $extendtext="";
$menu ="
Aktion:
";
if (!empty($rechnungarr['belegnr'])) {
if ($rechnungarr['xmlrechnung']) {
$downloadicon = "";
} else {
$downloadicon = "";
}
} else {
$downloadicon = '';
}
$menu .= $downloadicon;
$menu .=
"";
//$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',"".$kundennummer." ".$kundenname);
if($this->app->erp->RechteVorhanden('projekt','dashboard')){
$this->app->Tpl->Set('PROJEKT', "$projekt");
}
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',"".$auftragArr[0]['auftrag']." ");
}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',' ');
if($v['id'] > 0)
{
if(empty($v['belegnr'])) {
$v['belegnr'] = 'ENTWURF';
}
$this->app->Tpl->Add('AUFTRAG',"".$v['belegnr']." ");
}
$first = false;
}
}
$gutschrift = $this->app->DB->SelectArr("SELECT
CONCAT('',if(g.belegnr='0' OR g.belegnr='','ENTWURF',g.belegnr),' ') 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', " ");
}
}
}
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[] = ''
.($isReturnOrderCanceled?'':'').$returnOrderNumber.($isReturnOrderCanceled?'':'')
.'';
}
$this->app->Tpl->Set('RETOURE', implode(' ', $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('',if(l.status!='angelegt',l.belegnr,'ENTWURF'),'') 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',' ');
$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('', ap.nummer,'') 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','
'.$artikel.'
');
if($auftragArr[0]['belegnr'] =="0" || $auftragArr[0]['belegnr']=="") $auftragArr[0]['belegnr'] = "ENTWURF";
$this->app->Tpl->Set('BELEGNR',"".$auftragArr[0]['belegnr']."");
$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('app->Conf->WFconf['defaulttheme']}/images/pdf.svg\" border=\"0\">') 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'] = '';
$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].' ';
}
}
$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 "
Rechnungsadresse".$abweichendString.":
$rechnungsadresse
";
}
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('') 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',"
");
$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',"
");
$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("
Die Rechnung ist noch nicht freigegeben und kann daher nicht storniert werden!
");
$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("
Achtung es gibt bereits eine oder mehrer Gutschriften für diese Rechnung!
");
$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', "
Soll die Rechnung an $name im Wert von $summe $waehrung
jetzt freigegeben werden?
");
}
$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("
Die Rechnung \"$belegnr\" von \"$name\" wurde gelöscht!
");
$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 "";
$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->RechnungArchivieren($id);
}
$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(json: 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('','',$item);
$array[$key] = $item;
}
}
}
function RechnungSmarty($id = null, $json = false, $returnvalue = false) {
if ($id === null) {
$id = $this->app->Secure->GetGET('id');
}
$result = Array();
$success = true;
$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) {
$headers[] = 'Content-type:text/plain';
$headers[] = 'Content-Disposition: attachment;filename='.$filename.'.json';
$output = json_encode($result,JSON_PRETTY_PRINT);
} else {
$headers[] = 'Content-type:text/xml';
$headers[] = 'Content-Disposition: attachment;filename='.$filename.'.xml';
$template_id = $this->GetXMLSmartyTemplate($id);
if(empty($template_id)) {
$output = '
Kein Smarty Template an der Addresse hinterlegt!
';
$success = false;
} else {
$template = $this->app->DB->Select("SELECT template from smarty_templates WHERE id = '$template_id' LIMIT 1");
$smarty = new Smarty;
$directory = $this->app->erp->GetTMP().'/smarty/templates';
$smarty->setCompileDir($directory);
$smarty->assign('rechnung', $output);
$output = $smarty->fetch('string:'.$template);
}
}
if ($returnvalue) {
return(Array(
'success' => $success,
'title' => 'Rechnung '.$result['kopf']['belegnr'],
'filename' => $filename,
'xml' => $output
));
} else {
foreach ($headers as $header) {
header($header);
}
echo($output);
$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',"
Trefferliste:
");
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',"Lesen");
$table->DisplayNew('ERGEBNISSE',"
");
} else {
$this->app->Tpl->Add('ERGEBNISSE',"
");
}
// 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', "
Zu zahlen: $summe (netto) $summebrutto (brutto) $waehrung ($tmp) ");
}
$status= $this->app->DB->Select("SELECT status FROM rechnung WHERE id='$id' LIMIT 1");
$this->app->Tpl->Set('STATUS',"");
$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',"
Internet:
");
}
$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',''
);
}
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->RechnungArchivieren($id);
}
$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',"
Möchten Sie eine Rechnung jetzt anlegen?
");
$this->app->Tpl->Set('TAB1',"
Rechnungen in Bearbeitung
Offene Aufträge, die durch andere Mitarbeiter in Bearbeitung sind.
[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->RechnungArchivieren($invoiceId);
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;
}
$xmlrechnung = $this->app->DB->Select("SELECT xmlrechnung FROM rechnung WHERE id=$v LIMIT 1");
$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) || $erechnung) &&
$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->RechnungArchivieren($v);
$this->app->erp->Rechnungsmail($v);
}
else if($checkpapier && $drucker && !$erechnung) {
$this->app->erp->RechnungArchivieren($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();
$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`,
xmlrechnung
FROM rechnung WHERE id=%d LIMIT 1",
$v
)
);
if($reArr['belegnr'] === '' || $reArr['xmlrechnung'] || ($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->RechnungArchivieren($v);
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) {
$xmlrechnung = $this->app->DB->Select("SELECT xmlrechnung FROM rechnung WHERE id=$v LIMIT 1");
if ($xmlrechnung) {
continue;
}
$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 .= '';
}
}
$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 .= '';
}
}
$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 .= '';
}
}
$laender = $this->app->erp->GetSelectLaenderliste();
$laenderStr = '';
foreach ($laender as $landKey => $land) {
$laenderStr .= '';
}
$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', '');
}
$this->app->Tpl->Set('SELDRUCKER', $this->app->erp->GetSelectDrucker($this->app->User->GetParameter('rechnung_list_drucker')));
$this->app->Tpl->Parse('PAGE','rechnunguebersicht.tpl');
}
public function GetXMLSmartyTemplate($id) {
$adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id = '".$id."'");
$rechnung_smarty_template = $this->app->DB->Select("SELECT rechnung_smarty_template FROM adresse WHERE id = '".$adresse."'");
if (!empty($rechnung_smarty_template)) {
return($rechnung_smarty_template);
} else {
$sql = "SELECT id, rechnung_smarty_template 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'])) {
return($gruppe['rechnung_smarty_template']);
}
}
}
return(null);
}
// Decide if XML Smarty invoice according to address and group
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
if (!empty($this->GetXMLSmartyTemplate($id))) {
$this->app->DB->Update("UPDATE rechnung SET xmlrechnung = 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
)
VALUES (
'',
NOW(),
'',
'".$this->app->User->GetFirma()."',
'$belegmax',
'".$this->app->erp->StandardZahlungsweise($projekt)."',
'".$zahlungszieltage."',
'".$zahlungszieltageskonto."',
'".$zahlungszielskonto."',
NOW(),
'angelegt',
'$projekt',
'$adresse',
0,
'".$ohnebriefpapier."',
NOW(),
'$usereditid',
'$abweichendebezeichnung'
)"
);
$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->SetXMLRechnung($id);
$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'],
"
".ucfirst($zahlung['doc_typ'])."
".$zahlung['doc_info']."
",
$zahlung['betrag'],
$zahlung['waehrung']
);
$et->AddRow($row);
}
$salden = $this->app->erp->GetSaldenDokument($id,'rechnung');
foreach ($salden as $saldo) {
$row = array(
'',
'Saldo',
"".$saldo['betrag']."",
"".$saldo['waehrung'].""
);
$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
}
}