needlogin = true; $me = new User(); $me->loadMe(); $this->me = $me; $this->layout()->set("me", $me); if (!$me->is(["Admin"])) { $this->redirect("Dashboard"); } } protected function indexAction() { $this->layout()->setTemplate("Invoice/Index"); if ($this->request->resetFilter) { unset($_SESSION[MFAPPNAME . '-Invoice-filter']); } $filter = []; if (is_array($this->request->filter)) { $filter = $this->request->filter; $_SESSION[MFAPPNAME . '-Invoice-filter'] = $filter; } else { if (array_key_exists(MFAPPNAME . '-Invoice-filter', $_SESSION) && count($_SESSION[MFAPPNAME . '-Invoice-filter'])) { $filter = $_SESSION[MFAPPNAME . '-Invoice-filter']; } } $this->layout->set("filter", $filter); $filter = $this->getPreparedFilter($filter); // pagination defaults $pagination = []; $pagination['start'] = 0; $pagination['count'] = 50; $pagination['maxItems'] = 0; if (is_numeric($this->request->s)) { $pagination['start'] = intval($this->request->s); } //var_dump($filter);exit; $pagination['maxItems'] = InvoiceModel::count($filter); $billings = InvoiceModel::search($filter, $pagination); $this->layout()->set("invoices", $billings); $this->layout()->set("pagination", $pagination); } private function getPreparedFilter($filter) { $new_filter = []; if (array_key_exists("customer", $filter)) { if (array_key_exists("customer", $filter) && $filter["customer"]) { $kunde = $this->db()->escape($filter['customer']); if (!array_key_exists("add-where", $new_filter)) $new_filter["add-where"] = ""; $new_filter['add-where'] .= " AND (company like '%$kunde%' OR firstname like '%$kunde%' OR lastname like '%$kunde%' OR concat(firstname, ' ', lastname) like '%$kunde%' OR concat(lastname, ' ', firstname) like '%$kunde%')"; } } if(array_key_exists("address", $filter)) { if($filter["address"]) { $search = $this->db()->escape($filter['address']); if (!array_key_exists("add-where", $new_filter)) $new_filter["add-where"] = ""; $new_filter['add-where'] .= " AND (street like '%$search%' OR zip like '%$search%' OR city like '%$search%' OR country like '%$search%')"; } } if (is_array($filter) && count($filter)) { foreach ($filter as $name => $value) { $new_filter[$name] = $value; } } return $new_filter; } protected function downloadInvoice() { $id = $this->request->id; if (!is_numeric($id) || !$id) { $this->layout()->setFlash("Rechnung nicht gefunden", "error"); $this->redirect("Invoice"); } $invoice = new Invoice($id); if (!$invoice->id) { $this->layout()->setFlash("Rechnung nicht gefunden", "error"); $this->redirect("Invoice"); } $pdf = $invoice->pdf; //var_dump($pdf, !$pdf);exit; //var_dump($pdf->name);exit; if(!$pdf || !$pdf->name) { $ifile = InvoiceFileModel::createFromInvoice($invoice); if(!$ifile) { $this->layout()->setFlash("Fehler beim PDF erstellen"); } $pdf = $ifile->file; } $filename = $pdf->getFullPath(); if(!file_exists($filename)) { $this->layout()->setFlash("PDF-Datei nicht gefunden"); } header('Content-Type: application/octet-stream'); header('Content-disposition: attachment; filename="'.$filename.'"'); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Type: ' . mime_content_type($filename)); header("Content-Length: " . filesize($filename)); readfile($filename); exit; /*$vat = []; foreach ($invoice->positions as $p) { if (!array_key_exists($p->vatrate, $vat)) { $vat[$p->vatrate] = 0; } $vat[$p->vatrate] += $p->price_gross - ($p->price * $p->amount); } $pdf_vars = [ "invoice" => $invoice, "vat" => $vat, "bank_iban" => TT_INVOICE_BANK_IBAN, "bank_bic" => TT_INVOICE_BANK_BIC, "bank_bank"=> TT_INVOICE_BANK_BANK, "bank_owner" => TT_INVOICE_BANK_OWNER ]; // Replace placeholders in header $headerHtml = file_get_contents(BASEDIR . "/Layout/default/Invoice/PDF_HEADER.html"); $headerHtml = str_replace("{{ basedir }}", BASEDIR, $headerHtml); $headerHtml = str_replace("{{ addressLine_1 }}", $invoice->company ? $invoice->company : "", $headerHtml); $headerHtml = str_replace("{{ addressLine_2 }}", $invoice->firstname . " " . $invoice->lastname, $headerHtml); $headerHtml = str_replace("{{ addressLine_3 }}", nl2br($invoice->street), $headerHtml); $headerHtml = str_replace("{{ addressLine_4 }}", $invoice->zip . " " . $invoice->city, $headerHtml); $headerHtml = str_replace("{{ addressLine_5 }}", $invoice->country != "Österreich" ? $invoice->country : "", $headerHtml); $headerHtml = str_replace("{{ customerNumber }}", $invoice->customer_number, $headerHtml); $headerHtml = str_replace("{{ billingAccount }}", $invoice->fibu_account_number, $headerHtml); $headerHtml = str_replace("{{ invoiceNumber }}", $invoice->invoice_number, $headerHtml); $headerHtml = str_replace("{{ invoiceDate }}", date("d.m.Y", $invoice->invoice_date), $headerHtml); $headerHtml = str_replace("{{ vatHtml }}", $invoice->uid ? "Ihre UID:" . $invoice->uid . "" : "", $headerHtml); $headerHtml = str_replace("{{ qrCodeSrc }}", $this->getBankQRCode($invoice->invoice_number, round($invoice->total_gross, 2)), $headerHtml); $headerFile = BASEDIR . "/var/temp/invoice_header-" . date("U") . "-" . rand(1000, 9999) . ".html"; file_put_contents($headerFile, $headerHtml); // Replace placeholders in header $footerHtml = file_get_contents(BASEDIR . "/Layout/default/Invoice/PDF_FOOTER.html"); $footerHtml = str_replace("{{ bank_iban }}", TT_INVOICE_BANK_IBAN_FORMATTED, $footerHtml); $footerHtml = str_replace("{{ bank_bic }}", TT_INVOICE_BANK_BIC, $footerHtml); $footerHtml = str_replace("{{ bank_bank }}", TT_INVOICE_BANK_BANK, $footerHtml); $footerHtml = str_replace("{{ bank_owner }}", TT_INVOICE_BANK_OWNER, $footerHtml); $footerFile = BASEDIR . "/var/temp/invoice_footer-" . date("U") . "-" . rand(1000, 9999) . ".html"; file_put_contents($footerFile, $footerHtml); $pdf = new PdfForm("Invoice/PDF_MAIN", $pdf_vars); $wkhtmltopdfArgs = "--header-html $headerFile --footer-html $footerFile"; $pdf->download($invoice->invoice_number . ".pdf", $wkhtmltopdfArgs);*/ } protected function runInvoicingAction() { $i = 0; $p = 0; // get pairs of owner_id and billingaddress_id, so each will be its own invoice foreach (BillingModel::getInvoiceBaseData(['invoice_id' => null]) as $base) { //var_dump($base); continue; $owner_id = $base["owner_id"]; $billingaddress_id = $base["billingaddress_id"]; $billing_type = $base["billing_type"]; $billing_delivery = $base["billing_delivery"]; $bill_positions = []; $credit_positions = []; $invoice_voicenumbers = []; $billing_rows = BillingModel::search(["owner_id" => $owner_id, "billingaddress_id" => $billingaddress_id, "billing_type" => $billing_type, "billing_delivery" => $billing_delivery, "invoice_id" => null]); if (!count($billing_rows)) { die("Keine nicht verrechneten Billing records für billingaddress_id"); } //var_dump($owner_id, $billingaddress_id, $bills);exit; $invoice_data = []; $invoice_vatrate = 20; $price_total_sum = 0; foreach($billing_rows as $bill) { $vatarea = $bill->vatarea; $invoice_vatrate = $bill->vatgroup->rates[$vatarea]->rate; $vatrate = $invoice_vatrate; $price = $bill->price; $price_total = $bill->price * $bill->amount; $price_gross = ($vatrate) ? $price_total + ($price_total / 100) * $vatrate : $price_total; $price_setup = $bill->price_setup; $price_setup_total = $bill->price_setup * $bill->amount; $price_setup_gross = ($vatrate) ? $price_setup_total + ($price_setup_total / 100) * $vatrate : $price_setup_total; $add_setup_position = ($price > 0 && $price_setup > 0); $is_setup_only = ($price < 0.00001 && $price_setup > 0); $price_total_sum += $price_gross + $price_setup_gross; $position_data = []; $position_data["billing_id"] = $bill->id; $position_data["contract_id"] = $bill->contract_id; $position_data["start_date"] = $bill->start_date; $position_data["end_date"] = $bill->end_date; $position_data["matchcode"] = $bill->matchcode; $position_data["product_id"] = $bill->product_id; $position_data["product_name"] = $bill->product_name; $position_data["product_info"] = $bill->product_info; $position_data["amount"] = $bill->amount; $position_data["billing_period"] = $bill->billing_period; $position_data["fibu_cost_account"] = $bill->vatgroup->rates[$vatarea]->account; $position_data["fibu_cost_account_legacy"] = $bill->vatgroup->rates[$vatarea]->legacy_account; $position_data["fibu_taxcode"] = $bill->vatgroup->rates[$vatarea]->taxcode; if ($is_setup_only) { $this->log->debug("Contract ID " . $bill->contract_id . " is setup only"); $position_data["price"] = $price_setup; $position_data["price_total"] = $price_setup_total; $position_data["price_gross"] = $price_setup_gross; $position_data["vatrate"] = $vatrate; $position_data["end_date"] = $position_data["start_date"]; } else { $position_data["price"] = $price; $position_data["price_total"] = $price_total; $position_data["price_gross"] = $price_gross; $position_data["vatrate"] = $vatrate; } $new_position = InvoicepositionModel::create($position_data); $bill_positions[] = $new_position; if ($add_setup_position) { $this->log->debug("Adding Setup Invoiceposition for Contract ID " . $bill->contract_id); $setup_data = $position_data; $setup_data["product_name"] = "Herstellungskosten " . $bill->product_name; $setup_data["product_info"] = ""; $setup_data["price"] = $price_setup; $setup_data["price_total"] = $price_setup * $bill->amount; $setup_data["price_gross"] = $price_setup_gross; $setup_data["vatrate"] = $vatrate; $setup_data["end_date"] = $setup_data["start_date"]; $setup_position = InvoicepositionModel::create($setup_data); $bill_positions[] = $setup_position; } /* * *************************************** * Get Voicenumber Billing to Billing row * *************************************** */ $voicebills = BillingVoicenumberModel::search(["billing_id" => $bill->id]); //var_dump($voicebills);exit; if(count($voicebills)) { $voice_start_date = reset($voicebills)->start_date; $voice_end_date = reset($voicebills)->end_date; $voiceplan = reset($voicebills)->voiceplan; $inc = reset($voicebills)->increment; $inc_first = reset($voicebills)->increment_first; $voice_rows = []; foreach($voicebills as $voicebill) { $number = $voicebill->voicenumber; $zone = $voicebill->zone; $call_count = $voicebill->call_count; $duration = $voicebill->duration; $price = $voicebill->price; $price_total = $voicebill->price_total; if(!array_key_exists($number, $voice_rows)) { $voice_rows[$number] = []; } if(!array_key_exists($zone, $voice_rows[$number])) { $voice_rows[$number][$zone] = []; } if(!array_key_exists($price, $voice_rows[$number][$zone])) { $voice_rows[$number][$zone][$price] = []; $voice_rows[$number][$zone][$price]["call_count"] = 0; $voice_rows[$number][$zone][$price]["duration"] = 0; $voice_rows[$number][$zone][$price]["price_total"] = 0; } $voice_rows[$number][$zone][$price]["call_count"] += $call_count; $voice_rows[$number][$zone][$price]["duration"] = $duration; $voice_rows[$number][$zone][$price]["price_total"] = $price_total; } //var_dump($voice_rows);exit; $total_voice_price = 0; foreach($voice_rows as $number => $zones) { $voicenumber_data = []; $voicenumber_data["voicenumber"] = $number; $voicenumber_data["start_date"] = $voice_start_date; $voicenumber_data["end_date"] = $voice_end_date; $voicenumber_data["voiceplan"] = $voiceplan; $voicenumber_data["increment"] = $inc; $voicenumber_data["increment_first"] = $inc_first; $invoice_voicenumber = InvoiceVoicenumberModel::create($voicenumber_data); $invoice_voicenumber->voicenumberzones = []; foreach($zones as $zone => $prices) { foreach($prices as $price => $row_values) { $zone_data = []; $zone_data["zone"] = $zone; $zone_data["call_count"] = $row_values["call_count"]; $zone_data["duration"] = $row_values["duration"]; $zone_data["price"] = $price; $zone_data["price_total"] = $row_values["price_total"]; $zone_data["price_total_gross"] = $row_values["price_total"]; if($invoice_vatrate) { $zone_data["price_total_gross"] = $row_values["price_total"] + (($row_values["price_total"] / 100) * $invoice_vatrate); } $zone_data["vatrate"] = $invoice_vatrate; $total_voice_price += $row_values["price_total"]; $voicenumber_zone = InvoiceVoicenumberZoneModel::create($zone_data); //var_dump($voicenumber_zone); $invoice_voicenumber->data->voicenumberzones[] = $voicenumber_zone; } } //var_dump($invoice_voicenumber);exit; $invoice_voicenumbers[] = $invoice_voicenumber; } $price_total_sum += $total_voice_price; //var_dump($invoice_voicenumbers);exit; $this->log->debug("Adding Voice Invoiceposition for Contract ID " . $bill->contract_id); $voice_data = $position_data; $voice_data["product_name"] = "Gesprächsgebühren zu " . $bill->product_name; $voice_data["product_info"] = null; $voice_data["matchcode"] = null; $voice_data["price"] = $total_voice_price; $voice_data["price_total"] = $total_voice_price; $voice_data["price_gross"] = $total_voice_price + (($total_voice_price / 100) * 20); $voice_data["start_date"] = $voice_start_date; $voice_data["end_date"] = $voice_end_date; $voice_position = InvoicepositionModel::create($voice_data); $voice_position->setOption("timerange_month_only", true); $bill_positions[] = $voice_position; } /*if($bill->price >= 0 || $bill->price_setup >= 0) { $bill_positions[] = InvoicepositionModel::create($position_data); } else { $credit_positions[] = InvoicepositionModel::create($position_data);; }*/ $invoice_data["owner_id"] = $owner_id; $invoice_data["billingaddress_id"] = $billingaddress_id; $invoice_data["customer_number"] = $bill->customer_number; $invoice_data["fibu_account_number"] = $bill->fibu_account_number; $invoice_data["sepa_date"] = $bill->sepa_date; $invoice_data["sepa_id"] = $bill->sepa_id; $invoice_data["sepa_last_date"] = $bill->sepa_last_date; $invoice_data["company"] = $bill->company; $invoice_data["firstname"] = $bill->firstname; $invoice_data["lastname"] = $bill->lastname; $invoice_data["street"] = $bill->street; $invoice_data["zip"] = $bill->zip; $invoice_data["city"] = $bill->city; $invoice_data["country"] = $bill->country; $invoice_data["email"] = $bill->email; $invoice_data["uid"] = $bill->uid; $invoice_data["billing_type"] = $billing_type; $invoice_data["billing_delivery"] = $billing_delivery; $invoice_data["bank_account_bank"] = $bill->bank_account_bank; $invoice_data["bank_account_owner"] = $bill->bank_account_owner; $invoice_data["bank_account_iban"] = $bill->bank_account_iban; $invoice_data["bank_account_bic"] = $bill->bank_account_bic; $invoice_data["total"] = 0; $invoice_data["total_gross"] = 0; //$invoice_data["total_vat"] = 0; $invoice_data["fibu_cost_area"] = $vatarea; $invoice_data["fibu_cost_account"] = $bill->vatgroup->rates[$vatarea]->account; $invoice_data["fibu_cost_account_legacy"] = $bill->vatgroup->rates[$vatarea]->legacy_account; $invoice_data["fibu_taxcode"] = $bill->vatgroup->rates[$vatarea]->taxcode; $invoice_data["tax_text"] = $bill->vatgroup->rates[$vatarea]->invoice_text; } /* // to not generate zero total invoices if($price_total_sum == 0.0000) { continue; }*/ /* * ******************************* * Save invoice and add positions * ******************************* */ // create Invoice $invoice = InvoiceModel::create($invoice_data); $invoice->startTransaction(); try { if (!$invoice->save()) { $invoice->rollbackTransaction(); die("Error saving Invoice"); } $total_net = 0; $total_gross = 0; //$total_vat = 0; foreach ($bill_positions as $position) { // on error: rollback transaction // add Invoice::id to Invoiceposition $position->invoice_id = $invoice->id; if(!$invoice_vatrate || !$position->vatrate) { $total_net += $position->price_total; $total_gross += $position->price_total; } else { //$total_vat += ($position->price_total / 100) * $position->vatrate; $total_net += $position->price_total; $total_gross += $position->price_gross; } // save Invoiceposition if (!$position->save()) { $invoice->rollbackTransaction(); die("Error saving Invoiceposition"); } // ad Invoice::id to Bill $bill = new Billing($position->billing_id); if (!$bill->id) { $invoice->rollbackTransaction(); die("Bill for Invoiceposition not found"); } $bill->invoice_id = $invoice->id; if (!$bill->save()) { $invoice->rollbackTransaction(); die("error saving invoice_id to bill"); } $p++; } $invoice->total = $total_net; $invoice->total_gross = $total_gross; //$invoice->total_vat = $total_vat; if (!$invoice->save()) { $invoice->rollbackTransaction(); die("Error saving totals in Invoice"); } if(count($invoice_voicenumbers)) { foreach($invoice_voicenumbers as $inv_vn) { $invnz_s = $inv_vn->voicenumberzones; unset($inv_vn->voicenumberzones); $inv_vn->invoice_id = $invoice->id; if(!$inv_vn->save()) { $invoice->rollbackTransaction(); die("Error saving InvoiceVoicenumber"); } foreach($invnz_s as $invnz) { $invnz->invoicevoicenumber_id = $inv_vn->id; if(!$invnz->save()) { $invoice->rollbackTransaction(); die("Error saving InvoiceVoicenumberZone"); } } } } // generate Invoice number $new_num = InvoiceModel::getNextInvoiceNUmber(); $invoice->invoice_number = $new_num; $invoice->invoice_date = date("U"); // voicenumbers //var_dump($invoice_voicenumbers);exit; if (!$invoice->save()) { $invoice->rollbackTransaction(); die("Error saving Invoice number and date"); } /* $address = new Address($invoice->billingaddress_id); if($address) { $address->last_invoice_date = date("U"); $address->save(); }*/ } catch (Exception $e) { if ($invoice) { $invoice->rollbackTransaction(); } die("Error saving Invoice!\n"); } // commit transaction $invoice->commitTransaction(); $i++; // Create Invoice PDF // if billing_delivery == paper -> add to pdf collection // else -> send by email //var_dump($invoice); //exit; } $this->layout()->setFlash("$i Rechnungen mit $p Rechnungspositionen erstellt"); $this->redirect("Invoice"); } protected function exportBmdAction() { /* * satzart;konto;gkonto;belegnr;belegdatum;buchsymbol;buchcode;prozent;steuercode;betrag;steuer;text;kost;bank-iban-nr;bank-swiftcode;bank-mandatsid;bank-mandatsdatum;bank-mandatskz;bank-letztereinzug;zvsperre;bankeinzug * 0;234941;40010;TEST-1;23.01.2024;AR;1;20;1;1,2;-0,2;RNTEST-01;;AT293828200003027919;RZSTAT2G282;KJ2813;13.01.2023;0;;0;1 * 0;234325;40010;TEST-2;23.01.2024;GU;1;20;1;-1,2;0,2;GSTEST-01;;;;;;;;10;0 */ $csv_header = "satzart;konto;gkonto;belegnr;belegdatum;buchsymbol;buchcode;prozent;steuercode;betrag;steuer;text;kost;bank-iban-nr;bank-swiftcode;bank-mandatsid;bank-mandatsdatum;bank-mandatskz;bank-letztereinzug;zvsperre;bankeinzug"; $csv_out = ""; if(!InvoiceModel::search(["bmd_export_date" => null])) { $this->layout()->setFlash("Keine neuen Rechnungen seit letztem BMD-Export vorhanden."); $this->redirect("Invoice"); } foreach(InvoiceModel::search(["bmd_export_date" => null]) as $invoice) { if($invoice->bmd_export_date) { die("wtf"); } $vatrate = (($invoice->total == $invoice->total_gross) ? "0" : "20"); if($invoice->total_gross){ $vatrate = 20; } $vat = $invoice->total_gross - $invoice->total; $vat *= -1; if($invoice->total < 0) { $buchsymbol = "GU"; } else { $buchsymbol = "AR"; } $buchungstext = "[".$invoice->customer_number."]"; if($invoice->company) { $buchungstext .= " ".$invoice->company; } elseif($invoice->firstname || $invoice->lastname) { $buchungstext .= " ".$invoice->firstname." ".$invoice->lastname; } $buchungstext = str_replace(["\n","\r", ";"], "", $buchungstext); $is_sepa = ($invoice->billing_type == "sepa"); $iban = ""; $bic = ""; $sepa_id = ""; $sepa_date = false; $last_invoice_date = false; $mandatskz = ""; if($is_sepa) { $iban = $invoice->bank_account_iban; $bic = $invoice->bank_account_bic; $sepa_id = $invoice->sepa_id; if($invoice->sepa_date) { $sepa_date = new DateTime($invoice->sepa_date); if($invoice->sepa_last_date) { $last_invoice_date = new DateTime($invoice->sepa_last_date); if($last_invoice_date->format("Y-m-d") < $sepa_date->format("Y-m-d")) { $last_invoice_date = false; } } } $mandatskz = ($last_invoice_date ? "1" : "0"); } $csv_out .= "0;"; $csv_out .= $invoice->fibu_account_number.";"; $csv_out .= $invoice->fibu_cost_account.";"; $csv_out .= $invoice->invoice_number.";"; $csv_out .= date("d.m.Y", $invoice->invoice_date).";"; $csv_out .= $buchsymbol.";"; $csv_out .= "1;"; $csv_out .= $vatrate.";"; $csv_out .= $invoice->fibu_taxcode.";"; $csv_out .= number_format($invoice->total_gross, 2, ",", "").";"; $csv_out .= number_format($vat, 2, ",", "").";"; $csv_out .= $buchungstext.";"; $csv_out .= ";"; // kostenstelle $csv_out .= $iban.";"; $csv_out .= $bic.";"; $csv_out .= $sepa_id.";"; $csv_out .= ($sepa_date ? $sepa_date->format("d.m.Y") : "").";"; $csv_out .= $mandatskz.";"; $csv_out .= ($last_invoice_date ? $last_invoice_date->format("d.m.Y") : "").";"; $csv_out .= ($is_sepa ? 0 : 10).";"; $csv_out .= ($is_sepa ? 1 : 0); $csv_out .= "\n"; } /*$this->layout()->setFlash("Export erfolgreich abgeschlossen", "success"); $this->redirect("Invoice");*/ header("Content-type: text/csv"); header('Content-disposition: attachment; filename="tt-rech-export-bmd-'.date('Y-m-d_H-i-s').'.csv"'); echo $csv_header."\n".$csv_out; exit; } public function createPDFs() { $invoice_path_base = MFUPLOAD_FILE_SAVE_PATH."/".TT_INVOICE_SAVE_SUBFOLDER; foreach(InvoiceModel::getAll() as $invoice) { if(InvoiceFileModel::getFirst(["invoice_id" => $invoice->id])) { continue; } $pdf = $invoice->pdf; if(!$pdf || !$pdf->id || !$pdf->file_id) { $ifile = InvoiceFileModel::createFromInvoice($invoice); } if(!file_exists($ifile->file->getFullPath())) { $ifile = $invoice->createPdf(); } if(!$ifile) { echo "Could not create PDF for ".$invoice->invoice_number."\n"; } echo "."; } echo "\n"; return true; } protected function sendInvoicesAction() { $r = $this->request; $type = $r->type; /*if($type == "email") { return $this->sendEmailInvoices(); }*/ if($type == "paper") { return $this->printInvoices(); } $this->redirect("Invoice"); } /* * Gutschriften auch an Xinon */ public function _sendEmailInvoices() { foreach(InvoiceModel::search(["billing_delivery" => "email", "date_delivered" => false]) as $invoice) { $pdf = $invoice->pdf; if(!$pdf || !$pdf->name) { echo "PDF für ".$invoice->invoice_number." noch nicht generiert\n"; continue; } $pdf_file = $pdf->getFullPath(); if(!file_exists($pdf_file)) { echo "Datei ".$pdf->filename." nicht gefunden\n"; continue; } if(!$invoice->sendByEmail()) { echo "Error sending ".$invoice->invoice_number." to ".$invoice->email."\n"; continue; } $invoice->date_delivered = date("U"); $invoice->save(); if($invoice->total < 0) { // Gutschriften auch an Xinon $invoice->sendByEmail("billing@xinon.at"); } } return true; } public function printInvoices() { return false; $start = $this->request->delivery_start_date; $end = $this->request->delivery_end_date; try { $start_date = DateTime::createFromFormat("d.m.Y", $start, new DateTimeZone("Europe/Vienna")); $start_date->setTime(0,0,0); $end_date = DateTime::createFromFormat("d.m.Y", $end, new DateTimeZone("Europe/Vienna")); $end_date->setTime(23,59,59); } catch(Exception $e) { $this->layout()->setFlash("Von- oder Bisdatum ungültig", "error"); $this->redirect("Invoice"); } if(!InvoiceModel::count(["billing_delivery" => "paper", "invoice_date>=" => $start_date->getTimestamp(), "invoice_date<=" => $end_date->getTimestamp()])) { $this->layout()->setFlash("Keine Rechnungen im angegebenen Zeitraum gefunden", "error"); $this->redirect("Invoice"); } $pdf_files = []; foreach(InvoiceModel::search(["billing_delivery" => "paper", "invoice_date>=" => $start_date->getTimestamp(), "invoice_date<=" => $end_date->getTimestamp()]) as $invoice) { $filename = $invoice->createPdf(); if(!$filename) { $this->layout()->setFlash("Fehler beim PDF erstellen (".$invoice->invoice_number.")", "error"); $this->redirect("Invoice"); } $pdf_files[] = $filename; } if(!count($pdf_files)) { $this->layout()->setFlash("Fehler beim PDF erstellen: Keine PDFs zum zusammenführen", "error"); $this->redirect("Invoice"); } $output_path = MFUPLOAD_FILE_SAVE_PATH."/".TT_INVOICE_SAVE_SUBFOLDER; $output_filename = "invoices-print-".date("Y-m-d-H-i-s").".pdf"; $output_filepath = "$output_path/$output_filename"; foreach($pdf_files as $file) { $pdf_unite_cmd = PDFUNITE_BIN_PATH." '$file' '$output_filepath'"; shell_exec($pdf_unite_cmd); } if(!file_exists($output_filepath)) { $this->layout()->setFlash("Fehler beim PDFs zusammenführen: Ausgabedatei nicht gefunden", "error"); $this->redirect("Invoice"); } header('Content-Type: application/octet-stream'); header('Content-disposition: attachment; filename="'.$output_filename.'"'); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Type: ' . mime_content_type($output_filepath)); header("Content-Length: " . filesize($output_filepath)); readfile($output_filepath); exit; } }