From 2b224b55c095abe5531b9c129fcc04483fdbb4e8 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Wed, 24 Jan 2024 18:12:07 +0100 Subject: [PATCH] Prepared BMD export for cronjob use --- application/Address/Address.php | 233 +++++++++++++++++++++ application/Address/AddressController.php | 238 +--------------------- scripts/run-bmd-export.php | 41 ++++ 3 files changed, 284 insertions(+), 228 deletions(-) create mode 100755 scripts/run-bmd-export.php diff --git a/application/Address/Address.php b/application/Address/Address.php index 42c40e141..f4827ec1d 100644 --- a/application/Address/Address.php +++ b/application/Address/Address.php @@ -284,6 +284,239 @@ class Address extends mfBaseModel { } + public static function runBmdExport($request_type) { + $last_export = 0; + $log = mfLoghandler::singleton(); + + $export_ts = new mfConfig("bmd.export.ts"); + if($export_ts->value()) { + $last_export = $export_ts->value(); + } + + if(!file_exists(TT_ADDRESS_BMD_EXPORT_PATH)) { + return 10; + } + $filepath = TT_ADDRESS_BMD_EXPORT_PATH."/".TT_ADDRESS_BMD_EXPORT_FILENAME; + + $type = "inc"; + if($request_type == "full") { + $last_export = 0; + $type = "full"; + } + + // delete export file if export if full + if($last_export == 0 && file_exists($filepath)) { + unlink($filepath); + } + + $export_ts->value(date('U')); + + $search = ["edit>" => $last_export, "customer_or_fibu_numbers" => true]; + + if(!AddressModel::count($search)) { + return 11; + } + + $addresses = []; + + foreach(AddressModel::search($search) as $address) { + // if supplier -> add it as extra line + if($address->fibu_supplier_number) { + $addresses[$address->fibu_supplier_number] = $address; + if(!$address->fibu_account_number) continue; + } + + // if is primary -> use it + if($address->fibu_account_number && $address->fibu_primary_account) { + $addresses[$address->fibu_account_number] = $address; + continue; + } + + // if only address with fibu_account_num -> make primary + if($address->fibu_account_number && !$address->fibu_primary_account) { + // look up other addresses with same account num + $address_count = AddressModel::count(["fibu_account_number" => $address->fibu_account_number]); + if($address_count === 1) { + $address->fibu_primary_account = 1; + $address->save(); + $addresses[$address->fibu_account_number] = $address; + continue; + } + + // if more addresses with fibu_account_num -> find primary + if($address_count > 1) { + // find primary + $primary = AddressModel::getFirst(["fibu_account_number" => $address->fibu_account_number, "fibu_primary_account" => true]); + if($primary) { + // use single primary + $addresses[$primary->fibu_account_number] = $primary; + continue; + } else { + // if no primary -> make last one primary + $new_primary = false; + foreach(AddressModel::search(["fibu_account_number" => $address->fibu_account_number]) as $primary) { + $new_primary = $primary; + } + if(!$new_primary) { + var_dump($address);exit; + } + $new_primary->fibu_primary_account = 1; + $new_primary->save(); + $addresses[$new_primary->fibu_account_number] = $new_primary; + continue; + } + } + var_dump($address);exit; + } + + // if no fibu account number but customer number -> create fibu account number + if($address->customer_number && !$address->fibu_account_number) { + // Address::afterSave() generates new fibu account number + $address->save(); + if(!$address->fibu_account_number) { + var_dump($address);exit; + } + $addresses[$address->fibu_account_number] = $address; + continue; + } + + + + } + + $country_code_errors = []; + $export_addresses = []; + + foreach($addresses as $fibu_num => $address) { + $a = []; + $a["id"] = $address->id; + //$a["is_supplier"] = (array_key_exists("supplier", $address->types) && $address->types['supplier']) ? "1" : "0"; + //$a["is_customer"] = "1"; + //$a["customer_number"] = $address->customer_number; + $a["fibu_account_number"] = $fibu_num; + //$a["fibu_supplier_number"] = $address->fibu_supplier_number; + if($fibu_num >= 300000 && $fibu_num < 400000) { + $a["fibu_supplier_due"] = (is_numeric($address->fibu_supplier_due)) ? $address->fibu_supplier_due : TT_ADDRESS_DEFAULT_SUPPLIER_DUE; + $a["fibu_supplier_skonto"] = $address->fibu_supplier_skonto; + $a["fibu_supplier_skonto_rate"] = $address->fibu_supplier_skonto_rate; + $a["fibu_supplier_paymentblock"] = $address->fibu_supplier_paymentblock; + } else { + $a["fibu_supplier_due"] = ""; + $a["fibu_supplier_skonto"] = ""; + $a["fibu_supplier_skonto_rate"] = ""; + $a["fibu_supplier_paymentblock"] = ""; + } + $a["street"] = $address->street; + $a["zip"] = $address->zip; + $a["city"] = $address->city; + if(strlen($address->country) == 2) { + $a["countrycode"] = trim($address->country); + } else { + $a["countrycode"] = "AT"; + + if(trim($address->country)) { + $acountry = strtolower(trim($address->country)); + $cc = __($acountry, "cc"); + + $log->debug("is $cc == cc.$acountry"); + $log->debug("last translation failed: ".(__last_translation_failed() ? "true" : "false")); + + if(__last_translation_failed()) { + //if($cc == "cc.".$acountry) { + $a["countrycode"] = "AT"; + // email to buchhaltung + $country_code_errors[$fibu_num] = $address; + } else { + $a["countrycode"] = $cc; + } + } + } + $a["phone"] = ""; + if($address->mobile) $a["phone"] = $address->mobile; + if($address->phone) $a["phone"] = $address->phone; + $a["uid"] = $address->uid; + $a["billing_type"] = ($address->billing_type == "sepa") ? "1" : "0"; + //$a["billing_delivery"] = $address->billing_delivery; + + if($address->company) { + $a["firstname"] = ""; + $a["lastname"] = $address->company; + } else { + $a["firstname"] = $address->firstname; + $a["lastname"] = $address->lastname; + } + + if(array_key_exists("billing", $address->links) && $address->links["billing"][0] && $address->links["billing"][0]->address_id) { + //var_dump($address->links);exit; + $bill = $address->links["billing"][0]->address; + $a["bank"] = $bill->bank_account_bank; + $a["bank_owner"] = $bill->bank_account_owner; + $a["iban"] = $bill->bank_account_iban; + $a["bic"] = $bill->bank_account_bic; + $a["email"] = $bill->email; + } else { + $a["bank"] = $address->bank_account_bank; + $a["bank_owner"] = $address->bank_account_owner; + $a["iban"] = $address->bank_account_iban; + $a["bic"] = $address->bank_account_bic; + $a["email"] = $address->email; + } + + $a["customer_numbers"] = []; + $a["customer_numbers"][] = $address->customer_number; + + // add all customer numbers to customer_numbers + if($address->fibu_account_number) { + foreach(AddressModel::search(["fibu_account_number" => $address->fibu_account_number]) as $secondary) { + if($secondary->customer_number && !in_array($secondary->customer_number, $a["customer_numbers"])) { + $a["customer_numbers"][] = $secondary->customer_number; + } + } + } + + $export_addresses[] = $a; + } + + if(count($country_code_errors)) { + $msg = "Hallo,\r\n\r\ndas in thetool eingetragene Land von folgenden Kunden/Lieferanten konnte nicht in einen ISO-Code übersetzt werden:\r\n\r\n"; + foreach($country_code_errors as $fibu_num => $address) { + $msg .= "$fibu_num (".$address->getCompanyOrName()."): ".$address->country."\r\n"; + } + + $email = new Emailnotification(); + $email->setFrom(TT_OUTGOING_EMAIL, "thetool"); + $email->setTo(TT_FIBU_EMAIL_TO); + $email->setSubject("[BMD-Export] Fehlerhaftes Land"); + $email->setBody($msg); + $email->send(); + } + + $tpl = new Layout(); + $tpl->setTemplate("Address/bmd_export.csv"); + $tpl->set("addresses", $export_addresses); + $csv_content = $tpl->render(); + $return_values = $tpl->getReturnedValue(); + $csv_header = $return_values['header']; + + if(file_exists($filepath)) { + // if file exists, append new content + $result = file_put_contents($filepath, $csv_content, FILE_APPEND); + } else { + // else, add content with csv header + $result = file_put_contents($filepath, $csv_header.$csv_content); + } + + if($result === false) { + return 19; + } else { + $export_ts->save(); + return true; + } + + + } + + public function getProperty($name) { if($this->$name == null) { diff --git a/application/Address/AddressController.php b/application/Address/AddressController.php index 143bda20c..e9be9ebbd 100644 --- a/application/Address/AddressController.php +++ b/application/Address/AddressController.php @@ -178,252 +178,34 @@ class AddressController extends mfBaseController { } - protected function exportBmd() { - /*$last_export = new mfConfig("bmd.export.ts"); - $last_export->type("int"); - $last_export->value(date("U")); - $last_export->save(); - */ - + protected function exportBmdAction() { if(!$this->me->can("Fibu")) { $this->layout()->setFlash("Sicha ned!", "error"); $this->redirect("Address"); } - $last_export = 0; + $return = Address::runBmdExport($this->request->type); - $export_ts = new mfConfig("bmd.export.ts"); - if($export_ts->value()) { - $last_export = $export_ts->value(); - } - - if(!file_exists(TT_ADDRESS_BMD_EXPORT_PATH)) { + if($return === 10) { $this->layout()->setFlash("Export Pfad (".TT_ADDRESS_BMD_EXPORT_PATH.") nicht gefunden!", "error"); - } - $filepath = TT_ADDRESS_BMD_EXPORT_PATH."/".TT_ADDRESS_BMD_EXPORT_FILENAME; - - $type = "inc"; - if($this->request->type == "full") { - $last_export = 0; - $type = "full"; + $this->redirect("Address"); } - // delete export file if export if full - if($last_export == 0 && file_exists($filepath)) { - unlink($filepath); - } - - $export_ts->value(date('U')); - - $search = ["edit>" => $last_export, "customer_or_fibu_numbers" => true]; - - if(!AddressModel::count($search)) { + if($return === 11) { $this->layout()->setFlash("Keine geänderten Adressdatensätze gefunden. Export abgebrochen.", "warn"); $this->redirect("Address"); } - $addresses = []; - - foreach(AddressModel::search($search) as $address) { - // if supplier -> add it as extra line - if($address->fibu_supplier_number) { - $addresses[$address->fibu_supplier_number] = $address; - if(!$address->fibu_account_number) continue; - } - - // if is primary -> use it - if($address->fibu_account_number && $address->fibu_primary_account) { - $addresses[$address->fibu_account_number] = $address; - continue; - } - - // if only address with fibu_account_num -> make primary - if($address->fibu_account_number && !$address->fibu_primary_account) { - // look up other addresses with same account num - $address_count = AddressModel::count(["fibu_account_number" => $address->fibu_account_number]); - if($address_count === 1) { - $address->fibu_primary_account = 1; - $address->save(); - $addresses[$address->fibu_account_number] = $address; - continue; - } - - // if more addresses with fibu_account_num -> find primary - if($address_count > 1) { - // find primary - $primary = AddressModel::getFirst(["fibu_account_number" => $address->fibu_account_number, "fibu_primary_account" => true]); - if($primary) { - // use single primary - $addresses[$primary->fibu_account_number] = $primary; - continue; - } else { - // if no primary -> make last one primary - $new_primary = false; - foreach(AddressModel::search(["fibu_account_number" => $address->fibu_account_number]) as $primary) { - $new_primary = $primary; - } - if(!$new_primary) { - var_dump($address);exit; - } - $new_primary->fibu_primary_account = 1; - $new_primary->save(); - $addresses[$new_primary->fibu_account_number] = $new_primary; - continue; - } - } - var_dump($address);exit; - } - - // if no fibu account number but customer number -> create fibu account number - if($address->customer_number && !$address->fibu_account_number) { - // Address::afterSave() generates new fibu account number - $address->save(); - if(!$address->fibu_account_number) { - var_dump($address);exit; - } - $addresses[$address->fibu_account_number] = $address; - continue; - } - - - + if($return === 19) { + $this->layout()->setFlash("Datei ".TT_ADDRESS_BMD_EXPORT_PATH."/".TT_ADDRESS_BMD_EXPORT_FILENAME." konnte nicht gespeichert werden!", "error"); + $this->redirect("Address"); } - $country_code_errors = []; - $export_addresses = []; - - foreach($addresses as $fibu_num => $address) { - $a = []; - $a["id"] = $address->id; - //$a["is_supplier"] = (array_key_exists("supplier", $address->types) && $address->types['supplier']) ? "1" : "0"; - //$a["is_customer"] = "1"; - //$a["customer_number"] = $address->customer_number; - $a["fibu_account_number"] = $fibu_num; - //$a["fibu_supplier_number"] = $address->fibu_supplier_number; - if($fibu_num >= 300000 && $fibu_num < 400000) { - $a["fibu_supplier_due"] = (is_numeric($address->fibu_supplier_due)) ? $address->fibu_supplier_due : TT_ADDRESS_DEFAULT_SUPPLIER_DUE; - $a["fibu_supplier_skonto"] = $address->fibu_supplier_skonto; - $a["fibu_supplier_skonto_rate"] = $address->fibu_supplier_skonto_rate; - $a["fibu_supplier_paymentblock"] = $address->fibu_supplier_paymentblock; - } else { - $a["fibu_supplier_due"] = ""; - $a["fibu_supplier_skonto"] = ""; - $a["fibu_supplier_skonto_rate"] = ""; - $a["fibu_supplier_paymentblock"] = ""; - } - $a["street"] = $address->street; - $a["zip"] = $address->zip; - $a["city"] = $address->city; - if(strlen($address->country) == 2) { - $a["countrycode"] = trim($address->country); - } else { - $a["countrycode"] = "AT"; - - if(trim($address->country)) { - $acountry = strtolower(trim($address->country)); - $cc = __($acountry, "cc"); - - $this->log->debug("is $cc == cc.$acountry"); - $this->log->debug("last translation failed: ".(__last_translation_failed() ? "true" : "false")); - - if(__last_translation_failed()) { - //if($cc == "cc.".$acountry) { - $a["countrycode"] = "AT"; - // email to buchhaltung - $country_code_errors[$fibu_num] = $address; - } else { - $a["countrycode"] = $cc; - } - } - } - $a["phone"] = ""; - if($address->mobile) $a["phone"] = $address->mobile; - if($address->phone) $a["phone"] = $address->phone; - $a["uid"] = $address->uid; - $a["billing_type"] = ($address->billing_type == "sepa") ? "1" : "0"; - //$a["billing_delivery"] = $address->billing_delivery; - - if($address->company) { - $a["firstname"] = ""; - $a["lastname"] = $address->company; - } else { - $a["firstname"] = $address->firstname; - $a["lastname"] = $address->lastname; - } - - if(array_key_exists("billing", $address->links) && $address->links["billing"][0] && $address->links["billing"][0]->address_id) { - //var_dump($address->links);exit; - $bill = $address->links["billing"][0]->address; - $a["bank"] = $bill->bank_account_bank; - $a["bank_owner"] = $bill->bank_account_owner; - $a["iban"] = $bill->bank_account_iban; - $a["bic"] = $bill->bank_account_bic; - $a["email"] = $bill->email; - } else { - $a["bank"] = $address->bank_account_bank; - $a["bank_owner"] = $address->bank_account_owner; - $a["iban"] = $address->bank_account_iban; - $a["bic"] = $address->bank_account_bic; - $a["email"] = $address->email; - } - - $a["customer_numbers"] = []; - $a["customer_numbers"][] = $address->customer_number; - - // add all customer numbers to customer_numbers - if($address->fibu_account_number) { - foreach(AddressModel::search(["fibu_account_number" => $address->fibu_account_number]) as $secondary) { - if($secondary->customer_number && !in_array($secondary->customer_number, $a["customer_numbers"])) { - $a["customer_numbers"][] = $secondary->customer_number; - } - } - } - - $export_addresses[] = $a; - } - - if(count($country_code_errors)) { - $msg = "Hallo,\r\n\r\ndas in thetool eingetragene Land von folgenden Kunden/Lieferanten konnte nicht in einen ISO-Code übersetzt werden:\r\n\r\n"; - foreach($country_code_errors as $fibu_num => $address) { - $msg .= "$fibu_num (".$address->getCompanyOrName()."): ".$address->country."\r\n"; - } - - $email = new Emailnotification(); - $email->setFrom(TT_OUTGOING_EMAIL, "thetool"); - $email->setTo(TT_FIBU_EMAIL_TO); - $email->setSubject("[BMD-Export] Fehlerhaftes Land"); - $email->setBody($msg); - $email->send(); - } - - - - $tpl = new Layout(); - $tpl->setTemplate("Address/bmd_export.csv"); - $tpl->set("addresses", $export_addresses); - $csv_content = $tpl->render(); - $return_values = $tpl->getReturnedValue(); - $csv_header = $return_values['header']; - - - - if(file_exists($filepath)) { - // if file exists, append new content - $result = file_put_contents($filepath, $csv_content, FILE_APPEND); - } else { - // else, add content with csv header - $result = file_put_contents($filepath, $csv_header.$csv_content); - } - - if($result === false) { - $this->layout()->setFlash("Datei $filepath konnte nicht gespeichert werden!", "error"); - } else { - $export_ts->save(); + if($return === true) { $this->layout()->setFlash("Adressen erfolgreich exportiert", "success"); + $this->redirect("Address"); } - $this->redirect("Address"); - } diff --git a/scripts/run-bmd-export.php b/scripts/run-bmd-export.php new file mode 100755 index 000000000..d02a7b44f --- /dev/null +++ b/scripts/run-bmd-export.php @@ -0,0 +1,41 @@ +#!/usr/bin/php +id); +define("INTERNAL_USER_USERNAME", $me->username); + + +$return = Address::runBmdExport("inc"); + +/* +if($return === 10) { + $this->layout()->setFlash("Export Pfad (".TT_ADDRESS_BMD_EXPORT_PATH.") nicht gefunden!", "error"); + $this->redirect("Address"); +} + +if($return === 11) { + $this->layout()->setFlash("Keine geänderten Adressdatensätze gefunden. Export abgebrochen.", "warn"); + $this->redirect("Address"); +} + +if($return === 19) { + $this->layout()->setFlash("Datei ".TT_ADDRESS_BMD_EXPORT_PATH."/".TT_ADDRESS_BMD_EXPORT_FILENAME." konnte nicht gespeichert werden!", "error"); + $this->redirect("Address"); +} + +if($return === true) { + $this->layout()->setFlash("Adressen erfolgreich exportiert", "success"); + $this->redirect("Address"); +} + */ \ No newline at end of file