From 5690f08892a9eaffbcc9f17ab3cb3c48f02afe9b Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Wed, 13 Nov 2024 13:51:49 +0000 Subject: [PATCH] Reworked Contract View to Vue.js --- Layout/default/Contract/LinkTable.php | 78 +++ Layout/default/Contract/View.php | 485 ----------------- application/Contract/Contract.php | 185 +++++++ application/Contract/ContractController.php | 489 +++++++++--------- lib/Helper/Helper.php | 38 +- public/bundler.php | 2 + public/js/pages/ContractView/ContractView.css | 73 +++ public/js/pages/ContractView/ContractView.js | 181 +++++++ .../vue/tt-components/css/tt-table.css | 2 +- public/plugins/vue/tt-components/tt-button.js | 40 ++ public/plugins/vue/tt-components/tt-card.js | 26 +- 11 files changed, 835 insertions(+), 764 deletions(-) create mode 100644 Layout/default/Contract/LinkTable.php delete mode 100644 Layout/default/Contract/View.php create mode 100644 public/js/pages/ContractView/ContractView.css create mode 100644 public/js/pages/ContractView/ContractView.js create mode 100644 public/plugins/vue/tt-components/tt-button.js diff --git a/Layout/default/Contract/LinkTable.php b/Layout/default/Contract/LinkTable.php new file mode 100644 index 000000000..04ec1823f --- /dev/null +++ b/Layout/default/Contract/LinkTable.php @@ -0,0 +1,78 @@ + + +

Verknüpfte Verträge + $contract->id]) ?>"> + NeuenContract anlegen + + +

+linkFrom) && count($contract->linkFrom)) || (is_array($contract->linkTo) && count($contract->linkTo))): ?> + + + + + + + + + + + + + + linkFrom, $contract->linkTo] as $links): + foreach ($links as $link): + if ($link->contract_id == $contract->id) { + $direction = $link->type == "credit" ? "zu" : "von"; + $linkcontract = $link->origin; + } else { + $linkcontract = $link->contract; + if ($link->type == "upgrade" || $link->type == "downgrade") { + $direction = "auf"; + } + if ($link->type == "relocation") { + $direction = "nach"; + } + if ($link->type == "credit") { + $direction = ""; + } + } + + ?> + + + + + + + + + + + + + + + +
TypKundeContract IDProduktPreisPreis SetupBestelldatumFertigstellungKündigung
">type, "contract") ?> type != "link") ? $direction : "" ?> + $linkcontract->owner_id]) ?>">owner->getCompanyOrName() ?> + isFinished()) ? "not-finished" : "" ?>"> + $linkcontract->id]) ?>">id ?> isFinished()) ? "not-finished" : "" ?>"> + $linkcontract->id]) ?>">product_name ?> + [matchcode ?>] isFinished()) ? "not-finished" : "" ?> price < 0) ? "text-danger" : "" ?>"> + € price, 4, ",", ".") ?> isFinished()) ? "not-finished" : "" ?> price_setup < 0) ? "text-danger" : "" ?>"> + € price_setup, 4, ",", ".") ?> isFinished()) ? "not-finished" : "" ?>">order_date) ? date('d.m.Y', $linkcontract->order_date) : "" ?> isFinished()) ? "not-finished" : "" ?>">finish_date) ? date('d.m.Y', $linkcontract->finish_date) : "" ?> isFinished()) ? "not-finished" : "" ?> cancel_date) ? "text-danger font-weight-bold" : "" ?>">cancel_date) ? date('d.m.Y', $linkcontract->cancel_date) : "" ?> + $link->id]) ?>" + onclick="if(!confirm('Verknüpfung wirklich entfernen?')) return false;" class="text-danger" title="Verknüpfung entfernen"> +
+ \ No newline at end of file diff --git a/Layout/default/Contract/View.php b/Layout/default/Contract/View.php deleted file mode 100644 index 062f7d5bb..000000000 --- a/Layout/default/Contract/View.php +++ /dev/null @@ -1,485 +0,0 @@ - - - -
-
-
-
- -
-

Aktives Produkt

-
-
-
- - -
-
- - - -
-
- isFinished()): ?> -

In Herstellung

- - isCancelled()): ?> -

GEKÜNDIGT

- - sla->name), "residential")): ?> -

Privatprodukt

- -

Businessprodukt

- -

">product_name?> [id?>]

- - - - - - - - upgradeFrom) && count($contract->upgradeFrom)): ?> - - - - - - upgradeTo) && count($contract->upgradeTo)): ?> - - - - - - - - downgradeFrom) && count($contract->downgradeFrom)): ?> - - - - - - downgradeTo) && count($contract->downgradeTo)): ?> - - - - - - - - productchangeFrom) && count($contract->productchangeFrom)): ?> - - - - - - productchangeTo) && count($contract->productchangeTo)): ?> - - - - - - - - relocationFrom) && count($contract->relocationFrom)): ?> - - - - - - relocationTo) && count($contract->relocationTo)): ?> - - - - - - - - - - billingaddress_id): ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Matchcode:matchcode?>
Upgrade von: - upgradeFrom as $link): ?> - $link->origin_contract_id])?>" class="contract-link origin->cancel_date && $link->origin->cancel_date <= date('U')) ? "canceled" : ""?>">origin->product_name?> [origin->matchcode?>] (origin_contract_id?>)
- -
Upgrade auf: - upgradeTo as $link): ?> - $link->contract_id])?>" class="contract-link contract->cancel_date && $link->contract->cancel_date <= date('U')) ? "canceled" : ""?> contract->isFinished()) ? "not-finished" : "" ?>">contract->product_name?> [contract->matchcode?>] (contract_id?>)
- -
Downgrade von: - downgradeFrom as $link): ?> - $link->origin_contract_id])?>" class="contract-link origin->cancel_date <= date('U')) ? "canceled" : ""?>">origin->product_name?> [origin->matchcode?>] (origin_contract_id?>)
- -
Downgrade auf: - downgradeTo as $link): ?> - $link->contract_id])?>" class="contract-link contract->cancel_date && $link->contract->cancel_date <= date('U')) ? "canceled" : ""?>">contract->product_name?> [contract->matchcode?>] (contract_id?>)
- -
Produktwechsel von: - productchangeFrom as $link): ?> - $link->origin_contract_id])?>" class="contract-link origin->cancel_date <= date('U')) ? "canceled" : ""?>">origin->product_name?> [origin->matchcode?>] (origin_contract_id?>)
- -
Produktwechsel auf: - productchangeTo as $link): ?> - $link->contract_id])?>" class="contract-link contract->cancel_date && $link->contract->cancel_date <= date('U')) ? "canceled" : ""?>">contract->product_name?> [contract->matchcode?>] (contract_id?>)
- -
Umzug von: - relocationFrom as $link): ?> - $link->origin_contract_id])?>" class="contract-link origin->cancel_date && $link->origin->cancel_date <= date('U')) ? "canceled" : ""?>">origin->product_name?> [origin->matchcode?>] (origin_contract_id?>)
- -
Umzug auf: - relocationTo as $link): ?> - $link->contract_id])?>" class="contract-link contract->cancel_date && $link->contract->cancel_date <= date('U')) ? "canceled" : ""?>">contract->product_name?> [contract->matchcode?>] (contract_id?>)
- -
Vertragsinhaber: $contract->owner_id])?>">owner->getCompanyOrName()?> [owner->customer_number?>]
Rechnungsempfänger: $contract->billingaddress_id])?>">billingaddress->getCompanyOrName()?> [billingaddress->customer_number?>]
Produkt:product_name?> [product_id?>]product_name != $contract->product->name) ? " (".$contract->product->name.")" : ""?>
Produkt Info:product_info?>
SLA:sla->name?>
Externes Produkt:product_external) ? "Ja" : "Nein"?>
Menge:amount, 3, ",", ".")?>
Preis Periodisch Netto:">€ amount != 1) ? $contract->price * $contract->amount : $contract->price, 4, ",", ".")?>
Preis Periodisch Brutto:">€ - price && $contract->vatrate): ?> - amount != 1): ?> - price + ($contract->price / 100) * $contract->vatrate, 4, ",", ".")?> - - price + ($contract->price / 100) * $contract->vatrate) * $contract->amount, 4, ",", ".")?> - - -
Verrechnungsperiode: - billing_period, "billing_period")?> -
Herstellungskosten:"> - price_setup > 0): ?> - Netto: € price_setup, 4, ",", ".")?>amount != 1) ? " (Gesamt: € ".number_format($contract->price_setup * $contract->amount, 4, ",", ".").")" : ""?>
- Brutto: € price_setup && $contract->vatrate) ? number_format($contract->price_setup + ($contract->price_setup / 100) * $contract->vatrate, 4, ",", ".") : ""?>price_setup && $contract->vatrate && $contract->amount != 1) ? " (Gesamt: € ".number_format(($contract->price_setup + ($contract->price_setup / 100) * $contract->vatrate) * $contract->amount, 4, ",", ".").")" : ""?>
Verrechnungsstart Verzögerung: - billing_delay): ?> - billing_delay?> Monate - -
Bestelldatum:order_date) ? date('d.m.Y',$contract->order_date) : ""?>
Fertigstellungsdatum: - finish_date) ? date('d.m.Y',$contract->finish_date) : ""?> - finish_date_by) ? "(".$contract->finisher->name.")" : ""?> -
Kündigungsdatum:"> - cancel_date) ? date('d.m.Y',$contract->cancel_date) : ""?> - cancel_date_by) ? "(".$contract->canceler->name.")" : ""?> -
Erstellt:create)?> (creator->name?>)
Zuletzt bearbeitet:edit)?> (editor->name?>)
- $contract->id])?>"> - $contract->id])?>"> - finish_date && $contract->finish_date < date('U')): ?> - - $contract->id])?>"> - $contract->id])?>"> - finish_date): ?> - $contract->id])?>" onclick="if(!confirm('Jetzt fertigstellen und in Verrechnung geben?')) return false"> - -
- -
-
- -
-
-
Journaleinträge
-
-
-
-
- - - journals) && count($contract->journals)): ?> - journals as $j): ?> - - - - type == "text" || $j->type == "phone"):?> - - text) > 120): ?> - - - - - - - type == "file"): ?> - - - - type == "created_from"): ?> - - - type == "contract_finished"): ?> - - - type == "credit_created"): ?> - - - type == "link"): ?> - value); ?> - - - type == "canceled"): ?> - - - - - - - - - - - - - -
create)?> (creator?>) - type == "text"): ?> - - - - - - text), 120)?> - - - text)?> - - text): ?> - text), 128)?>
- - $j->contractfile->file_id])?>">contractfile->name?> -
- value == "manual"): ?> - Vertrag manuell erstellt - value == "import"): ?> - Vertrag importiert: text))?> - value == "order"): ?> - Vertrag aus Bestellung $contract->orderproduct->order_id])?>">#orderproduct->order_id?> erstellt - value == "productchange"): ?> - Vertrag erstellt: text))?> - - Vertag fertiggestellt - - Gutschrift-Vertrag $j->value])?>">value?> erstellt - - Verknüpfung mit $link->id])?>">id?> - product_name?> [matchcode?>] erstelltVertag gekündigt - $j->id])?>" title="Journaleintrag bearbeiten"> -
-
- -
- -
-
-
-
- - - -
-
-

Verknüpfte Verträge $contract->id])?>">Neuen Contract anlegen

- linkFrom) && count($contract->linkFrom)) || (is_array($contract->linkTo) && count($contract->linkTo))): ?> - - - - - - - - - - - - - - linkFrom, $contract->linkTo] as $links): ?> - - contract_id == $contract->id) { - $direction = "von"; - $linkcontract = $link->origin; - if($link->type == "credit") { - $direction = "zu"; - //continue; - } - } else { - $linkcontract = $link->contract; - if($link->type == "upgrade" || $link->type == "downgrade") { - $direction = "auf"; - } - if($link->type == "relocation") { - $direction = "nach"; - } - if($link->type == "credit") { - $direction = ""; - //continue; - } - - } - - ?> - - - - - - - - - - - - - - - -
TypKundeContract IDProduktPreisPreis SetupBestelldatumFertigstellungKündigung
">type, "contract")?> type != "link") ? $direction : ""?> $linkcontract->owner_id])?>">owner->getCompanyOrName()?> isFinished()) ? "not-finished" : "" ?>"> $linkcontract->id])?>">id?> isFinished()) ? "not-finished" : "" ?>"> $linkcontract->id])?>">product_name?> [matchcode?>] isFinished()) ? "not-finished" : "" ?> price < 0) ? "text-danger" : ""?>">€ price,4,",",".")?> isFinished()) ? "not-finished" : "" ?> price_setup < 0) ? "text-danger" : ""?>">€ price_setup,4,",",".")?> isFinished()) ? "not-finished" : "" ?>">order_date) ? date('d.m.Y', $linkcontract->order_date) : ""?> isFinished()) ? "not-finished" : "" ?>">finish_date) ? date('d.m.Y', $linkcontract->finish_date) : ""?> isFinished()) ? "not-finished" : "" ?> cancel_date) ? "text-danger font-weight-bold" : ""?>">cancel_date) ? date('d.m.Y', $linkcontract->cancel_date) : ""?> - $link->id])?>" onclick="if(!confirm('Verknüpfung wirklich entfernen?')) return false;" class="text-danger" title="Verknüpfung entfernen"> -
- -
-
- - - - -
-
- - - \ No newline at end of file diff --git a/application/Contract/Contract.php b/application/Contract/Contract.php index f217fc7fa..ee417d63b 100644 --- a/application/Contract/Contract.php +++ b/application/Contract/Contract.php @@ -782,4 +782,189 @@ class Contract extends mfBaseModel { $this->log->debug("Cloned Contract $old_id"); } + // ---- CONTRACT VIEW UTILITY FUNCTIONS START ---- + public function getContractDetails($getUrl): array { + $contract = $this; + $contract->getProperty("billingaddress"); + $contract->getProperty("owner"); + $contract->getProperty("product"); + $contract->getProperty("sla"); + $contract->getProperty("finisher"); + $contract->getProperty("canceler"); + $contract->getProperty("creator"); + $contract->getProperty("editor"); + $contract->getProperty("vatrate"); + $contract->getProperty("configvalues"); + $contract->getProperty("orderproduct"); + + + $contract_details = []; + $contract_details['matchcode'] = ['label' => 'Matchcode', 'value' => $contract->matchcode]; + $contract_details['owner'] = ['label' => 'Kunde', + 'value' => $contract->owner->getCompanyOrName(), + 'url' => $getUrl('Address', 'View', ['id' => $contract->billingaddress->id])]; + if ($contract->billingaddress_id) { + $contract_details['billingaddress'] = ['label' => 'Rechnungsadresse', + 'value' => $contract->billingaddress->getCompanyOrName(), + 'url' => $getUrl('Address', 'View', ['id' => $contract->billingaddress->id])]; + } + + $productName = $contract->product->name; + $contractProductName = $contract->product_name; + $productId = $contract->product_id; + + $contract_details['product'] = ['label' => 'Produkt', + 'value' => "$contractProductName ($productName) [$productId]", + 'url' => $getUrl('Product', 'Edit', ['id' => $contract->product_id])]; + + if ($contract->prduct_info) { + $contract_details['product_info'] = ['label' => 'Produktinfo', 'value' => $contract->product_info]; + } + + $contract_details['sla'] = ['label' => 'SLA', 'value' => $contract->sla->name]; + $contract_details['external_product'] = ['label' => 'Externes Produkt', 'value' => $contract->product_external ? "Ja" : "Nein"]; + $contract_details['amount'] = ['label' => 'Menge', 'value' => Helper::formatNumber($contract->amount, 3)]; + $contract_details['price_net'] = ['label' => 'Preis Periodisch Netto', + 'value' => "€ " . Helper::formatNumber($contract->price * $contract->amount, 4), + 'class' => $contract->price < 0 ? 'text-danger' : null]; + if ($contract->vatrate) { + $contract_details['price_gross'] = ['label' => 'Preis Periodisch Brutto', + 'value' => "€ " . Helper::formatNumber($contract->price * $contract->amount * floatval("1." . intval($contract->vatrate)), 4), + 'class' => $contract->price < 0 ? 'text-danger' : null]; + } + + $contract_details['billing_period'] = ['label' => 'Abrechnungsperiode', 'value' => __($contract->billing_period, "billing_period")]; + + if ($contract->price_setup > 0) { + $vatRateMultiplier = $contract->vatrate ? ("1." . intval($contract->vatrate)) : 1; + $price_net = Helper::formatNumber($contract->price_setup, 4); + $sum_net = Helper::formatNumber($contract->price_setup * $contract->amount, 4); + $price_gross = Helper::formatNumber($contract->price_setup * $contract->amount * $vatRateMultiplier, 4); + $sum_gross = Helper::formatNumber($contract->price_setup * $contract->amount * $vatRateMultiplier, 4); + + $contract_details['price_setup'] = ['label' => 'Einrichtungsgebühr', + 'value' => "Netto: € {$price_net} (Gesamt: € {$sum_net})\nBrutto: € {$price_gross} (Gesamt: € {$sum_gross})"]; + } + + if ($contract->billing_delay) $contract_details['billing_delay'] = ['label' => 'Abrechnungsverzögerung', + 'value' => $contract->billing_delay . " Monate"]; + $contract_details['order_date'] = ['label' => 'Bestelldatum', 'value' => date('d.m.Y', $contract->order_date)]; + if ($contract->finish_date) $contract_details['finish_date'] = ['label' => 'Fertigstellung', + 'value' => date('d.m.Y', $contract->finish_date) . " (" . $contract->finisher->name . ")"]; + if ($contract->cancel_date) $contract_details['cancel_date'] = ['label' => 'Kündigungsdatum', + 'value' => date('d.m.Y', $contract->cancel_date) . " (" . $contract->canceler->name . ")"]; + $contract_details['create'] = ['label' => 'Erstellt', 'value' => date('d.m.Y', $contract->create) . " (" . $contract->creator->name . ")"]; + $contract_details['edit'] = ['label' => 'Geändert', 'value' => date('d.m.Y', $contract->edit) . " (" . $contract->editor->name . ")"]; + + return $contract_details; + } + + public function getContractActions($getUrl): array { + $contract = $this; + + $contract_actions = []; + $contract_actions['contractconfig'] = ['url' => $getUrl("Contractconfig", "edit", ["contract_id" => $contract->id]), + 'class' => 'btn-outline-info', + 'icon' => 'far fa-list-dropdown fa-fw', + 'text' => 'Konfiguration bearbeiten']; + $contract_actions['contractaccessletter'] = ['url' => $getUrl("Contractaccessletter", "view", ["contract_id" => $contract->id]), + 'class' => 'btn-outline-success', + 'icon' => 'far fa-list-numeric fa-fw', + 'text' => 'Zugangsdaten anzeigen']; + if ($contract->finish_date && $contract->finish_date < date('U')) { + $contract_actions['contractownerchange'] = ['class' => 'btn-outline-secondary', + 'icon' => 'far fa-people-arrows fa-fw', + 'text' => 'Inhaberwechsel']; + $contract_actions['productchange'] = ['url' => $getUrl("Contract", "productchange", ["contract_id" => $contract->id]), + 'class' => 'btn-outline-purple', + 'icon' => 'far fa-truck-container fa-fw', + 'text' => 'Produkt-/Standortwechsel']; + $contract_actions['cancel'] = ['url' => $getUrl("Contract", "cancel", ["contract_id" => $contract->id]), + 'class' => 'btn-outline-danger', + 'icon' => 'far fa-axe fa-fw', + 'text' => 'Kündigen']; + } else if (!$contract->finish_date) { + $contract_actions['contractconfig'] = ['url' => $getUrl("Contract", "finishContract", ['contract_id' => $contract->id]), + 'class' => 'btn-success', + 'icon' => 'far fa-face-confused fa-fw', + 'text' => 'Jetzt fertigstellen', + 'confirmText' => 'Jetzt fertigstellen und in Verrechnung geben?']; + } + + return $contract_actions; + } + + public function getContractJournal($getUrl): array { + $contract = $this; + $contract->getProperty("journals"); + $contract->getProperty("orderproduct"); + $contract->getProperty("product"); + + $contract_journal = []; + if (is_array($contract->journals) && count($contract->journals)) { + foreach ($contract->journals as $j) { + $entry = []; + + $entry['create'] = date('d.m.Y H:i:s', $j->create); + $entry['creator'] = $j->creator->name; + + if ($j->type === "text" || $j->type === "phone") { + $entry['icon'] = $j->type === "text" ? "fas fa-comment-dots text-warning " : "fas fa-phone text-warning "; + $entry['iconTitle'] = $j->type === "text" ? "Textnachricht" : "Telefonat"; + $entry['text'] = $j->text; + } else if ($j->type === "file") { + $entry['icon'] = "fas fa-download text-primary "; + $entry['iconTitle'] = "Datei"; + $entry['text'] = "[URL]"; + $entry['url'] = $getUrl("File", "download", ["id" => $j->contractfile->file_id]); + $entry['urlText'] = $j->contractfile->name; + } else if ($j->type === "created_from") { + $entry['icon'] = "fas fa-cogs text-secondary "; + $entry['iconTitle'] = "Vertrag erstellt"; + $entry['textClass'] = "font-italic"; + if ($j->value == "manual") { + $entry['text'] = "Contract manuell erstellt"; + } else if ($j->value == "import") { + $entry['text'] = "Contract importiert: " . $j->text; + } else if ($j->value == "order") { + $entry['text'] = "Vertrag aus Bestellung [URL] erstellt"; + $entry['url'] = $getUrl("Order", "", ["id" => $contract->orderproduct->order_id]); + $entry['urlText'] = "#" . $contract->orderproduct->order_id; + } else if ($j->value == "productchange") { + $entry['text'] = "Vertrag erstellt:" . $j->text; + } + } else if ($j->type === "contract_finished") { + $entry['icon'] = "fas fa-flag-checkered text-success "; + $entry['iconTitle'] = "Vertrag fertiggestellt"; + $entry['text'] = "Vertrag fertiggestelt"; + $entry['textClass'] = "font-italic"; + } else if ($j->type === "credit_created") { + $entry['icon'] = "fas fa-credit-card text-gray "; + $entry['iconTitle'] = "Gutschrift"; + $entry['text'] = "Gutschrift Vertrag [URL] erstellt"; + $entry['textClass'] = "font-italic"; + $entry['url'] = $getUrl("Contract", "View", ["contract_id" => $j->value]); + $entry['urlText'] = $j->value; + } else if ($j->type === "link") { + $link = new Contract($j->value); + $entry['icon'] = "fas fa-link text-secondary "; + $entry['iconTitle'] = "Verknüpfung"; + $entry['text'] = "Verknüpfung mit [URL] erstellt"; + $entry['textClass'] = "font-italic"; + $entry['url'] = $getUrl("Contract", "view", ['contract_id' => $link->id]); + $entry['urlText'] = $link->id . " - " . $link->product_name . " - [" . $link->matchcode . "]"; + } else if ($j->type === "canceled") { + $entry['icon'] = "fas fa-skull-crossbones bg-danger text-white "; + $entry['iconTitle'] = "Kündigung"; + $entry['textClass'] = "font-italic"; + $entry['text'] = "Vertrag gekündigt"; + } + $contract_journal[] = $entry; + } + } + + return $contract_journal; + } + // ---- CONTRACT VIEW UTILITY FUNCTIONS END ---- + } \ No newline at end of file diff --git a/application/Contract/ContractController.php b/application/Contract/ContractController.php index d8d409e08..9f7747f59 100644 --- a/application/Contract/ContractController.php +++ b/application/Contract/ContractController.php @@ -1,10 +1,8 @@ needlogin = true; $me = new User(); $me->loadMe(); @@ -17,9 +15,8 @@ class ContractController extends mfBaseController } - protected function indexAction() - { - if(!$this->me->is(["Admin"])) { + protected function indexAction() { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } @@ -59,8 +56,7 @@ class ContractController extends mfBaseController $this->layout()->set("pagination", $pagination); } - private function getPreparedFilter($filter) - { + private function getPreparedFilter($filter) { $new_filter = []; if (array_key_exists("show_canceled", $filter)) { @@ -71,8 +67,8 @@ class ContractController extends mfBaseController $new_filter['add-where'] = " AND (cancel_date IS NULL OR cancel_date > UNIX_TIMESTAMP())"; } - if(array_key_exists("cancel_date", $filter)) { - if($filter["cancel_date"]) { + if (array_key_exists("cancel_date", $filter)) { + if ($filter["cancel_date"]) { $new_filter["cancel_date"] = true; } } @@ -95,13 +91,49 @@ class ContractController extends mfBaseController return $new_filter; } - protected function viewAction() - { - if(!$this->me->is(["Admin"])) { + protected function viewAction() { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } - $this->layout()->setTemplate("Contract/View"); + $id = $this->request->contract_id; + if (!$id) { + $id = $this->request->id; + } + if (!is_numeric($id) || !$id) { + $this->layout()->setFlash("Vertrag nicht gefunden", "error"); + $this->redirect("Contract"); + } + + $contract = new Contract($id); + if (!$contract->id) { + $this->layout()->setFlash("Vertrag nicht gefunden", "error"); + $this->redirect("Contract"); + } + + $getUrlFunc = function($controller, $action, $params = []) { + return $this::getUrl($controller, $action, $params); + }; + + Helper::renderVue($this, "ContractView", "Contract", ["CONTRACT_DETAILS" => $contract->getContractDetails($getUrlFunc), + "CONTRACT_ID" => $contract->id, + "CONTRACT_ACTIONS" => $contract->getContractActions($getUrlFunc), + "CONTRACT_JOURNAL" => $contract->getContractJournal($getUrlFunc), + "CONTRACT_LINK_TABLE_URL" => self::getUrl("Contract", "contractLinkTableHTML", ["contract_id" => $contract->id]), + "CONTRACT_NEW_JOURNAL_URL" => self::getUrl("Contractjournal", "save"), + "BACK_URL" => isset($_SERVER['HTTP_REFERER']) && str_contains($_SERVER['HTTP_REFERER'], 'Address/View') ? $_SERVER['HTTP_REFERER'] : self::getUrl('Contract', 'Index'), + "EDIT_URL" => self::getUrl('Contract', 'Edit', ['contract_id' => $contract->id, 'f' => 'view']), + "HEADER" => str_contains(strtolower($contract->sla->name), "residential") ? "Privatprodukt" : "Businessprodukt", + "SUB_HEADER" => $contract->product_name . "[" . $contract->id . "]" + + + ]); + } + + protected function contractLinkTableHTMLAction() { + if (!$this->me->is(["Admin"])) { + $this->redirect("Dashboard"); + } $id = $this->request->contract_id; if (!$id) { @@ -119,18 +151,11 @@ class ContractController extends mfBaseController } $this->layout()->set("contract", $contract); - - if ($this->request->filter) { - $this->layout()->set("filter", $this->request->filter); - } - if ($this->request->s) { - $this->layout()->set("filter", $this->request->s); - } - + $this->layout()->setTemplate("Contract/LinkTable"); } protected function cancelAction() { - if(!$this->me->is(["Admin"])) { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } $this->layout()->setTemplate("Contract/CancelForm"); @@ -138,7 +163,7 @@ class ContractController extends mfBaseController $id = $this->request->contract_id; if (!$id) $id = $this->request->id; - if(!$id) { + if (!$id) { $id = $this->request->id; } if (!is_numeric($id) || !$id) { @@ -152,7 +177,7 @@ class ContractController extends mfBaseController $this->redirect("Contract"); } - if(!$contract->billing_period) { + if (!$contract->billing_period) { $this->layout()->setFlash("Kündigung nicht möglich, Produkt ist Einmalprodukt!", "error"); $this->redirect("Contract", "view", ["contract_id" => $contract->id]); } @@ -171,7 +196,7 @@ class ContractController extends mfBaseController } protected function saveCancel() { - if(!$this->me->is(["Admin"])) { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } $r = $this->request; @@ -190,23 +215,23 @@ class ContractController extends mfBaseController try { $cancel_date = DateTime::createFromFormat("d.m.Y", trim($r->cancel_date), new DateTimeZone("Europe/Vienna")); - $cancel_date->setTime(23,59,59); - } catch(Exception $e) { + $cancel_date->setTime(23, 59, 59); + } catch (Exception $e) { $this->layout()->setFlash("Ungültiges Datumsformat"); $this->redirect("Contract", "cancel", ["contract_id" => $contract->id]); } $contract->cancel_date = $cancel_date->getTimestamp(); $contract->edit_by = $this->me->id; - if(!$contract->save()) { + if (!$contract->save()) { $this->layout()->setFlash("Fehler beim Speichern", "error"); $this->redirect("Contract", "cancel", ["contract_id" => $contract->id]); } $linked_contracts = []; - if(is_array($r->links)) { - foreach($r->links as $link_id => $action) { - if($action == "cancel") { + if (is_array($r->links)) { + foreach ($r->links as $link_id => $action) { + if ($action == "cancel") { $link_contract = new Contract($link_id); if (!$link_contract->id) { @@ -216,11 +241,11 @@ class ContractController extends mfBaseController $link_contract->cancel_date = $cancel_date->getTimestamp(); $link_contract->edit_by = $this->me->id; - if(!$link_contract->save()) { + if (!$link_contract->save()) { $this->layout()->setFlash("Fehler beim Speichern von verlinktem Vertrag", "warning"); } - if($link_contract->owner_id != $contract->owner_id) continue; + if ($link_contract->owner_id != $contract->owner_id) continue; $linked_contracts[] = $link_contract; } } @@ -234,20 +259,20 @@ class ContractController extends mfBaseController } protected function sendCancelNotification() { - if(!$this->me->is(["Admin"])) { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } $contract_id = $this->request->contract_id; $contract = new Contract($contract_id); $linked_contracts = []; - foreach($contract->links as $link) { - if($link->origin_contract_id == $contract_id) { + foreach ($contract->links as $link) { + if ($link->origin_contract_id == $contract_id) { $link_contract = $link->contract; } else { $link_contract = $link->origin; } - if($link_contract->owner_id != $contract->owner_id) continue; + if ($link_contract->owner_id != $contract->owner_id) continue; $linked_contracts[] = $link_contract; } @@ -259,12 +284,11 @@ class ContractController extends mfBaseController } - protected function productchangeAction() - { + protected function productchangeAction() { $this->layout()->setTemplate("Contract/ProductchangeForm"); $f = $this->request->f; - if(!$f) { + if (!$f) { $f = "c"; // from Contract } $this->layout()->set("f", $f); @@ -275,7 +299,7 @@ class ContractController extends mfBaseController } if (!is_numeric($id) || !$id) { $this->layout()->setFlash("Vertrag nicht gefunden", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "addUpgrade"); } else { $this->redirect("Contract"); @@ -286,28 +310,28 @@ class ContractController extends mfBaseController $contract = new Contract($id); if (!$contract->id) { $this->layout()->setFlash("Vertrag nicht gefunden", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "addUpgrade"); } else { $this->redirect("Contract"); } } - if($this->me->isAdmin()) { + if ($this->me->isAdmin()) { $this->layout()->set("terminations", TerminationModel::getAll()); } else { - // check permissions - // check if correct network +// check permissions +// check if correct network $my_network_ids = []; - foreach($this->me->my_networks as $network) { + foreach ($this->me->my_networks as $network) { $my_network_ids[] = $network->id; } - if($contract->termination_id) { - if(!in_array($contract->termination->network_id, $my_network_ids)) { - if($f == "o") { - // from Order, redirect back to Order + if ($contract->termination_id) { + if (!in_array($contract->termination->network_id, $my_network_ids)) { + if ($f == "o") { +// from Order, redirect back to Order $this->layout()->setFlash("Keine Berechtigung", "error"); $this->redirect("Order", "addUpgrade", ["owner_id" => $contract->owner_id]); } @@ -331,24 +355,23 @@ class ContractController extends mfBaseController } } - protected function saveProductchangeAction() - { - if(!$this->me->is(["Admin", "salespartner", "netowner"])) { + protected function saveProductchangeAction() { + if (!$this->me->is(["Admin", "salespartner", "netowner"])) { $this->redirect("Dashboard"); } $r = $this->request; - //var_dump($r->links);exit; +//var_dump($r->links);exit; $f = $r->f; - if(!$f) { + if (!$f) { $f = "c"; // from Contract } $id = $r->contract_id; if (!is_numeric($id) || !$id) { $this->layout()->setFlash("Vertrag nicht gefunden", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "addUpgrade"); } else { $this->redirect("Contract"); @@ -358,7 +381,7 @@ class ContractController extends mfBaseController $contract = new Contract($id); if (!$contract->id) { $this->layout()->setFlash("Vertrag nicht gefunden", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "addUpgrade"); } else { $this->redirect("Contract"); @@ -382,12 +405,12 @@ class ContractController extends mfBaseController $contract_data['note'] = trim($r->note); /* - * termination check - */ + * termination check + */ $product = new Product($r->product_id); if (!$product->id) { $this->layout()->setFlash("Produkt nicht gefunden", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "productchange", ["contract_id" => $id]); } else { $this->redirect("Contract", "productchange", ["contract_id" => $id]); @@ -399,35 +422,35 @@ class ContractController extends mfBaseController $contract_data['product_external_id'] = $product->external_id; $contract_data['sla_id'] = $product->sla_id; - if($r->finish_date) { + if ($r->finish_date) { try { $finish_date = DateTime::createFromFormat("d.m.Y", $r->finish_date, new DateTimeZone("Europe/Vienna")); } catch (Exception $e) { $this->layout()->setFlash("Ungültiges Kündigungsdateum", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "productchange", ["contract_id" => $id]); } else { $this->redirect("Contract", "productchange", ["contract_id" => $id]); } } - $finish_date->setTime(0,0,0); + $finish_date->setTime(0, 0, 0); $contract_data["finish_date"] = $finish_date->getTimestamp(); $contract_cancel_date = clone($finish_date); $contract_cancel_date->modify("-1 day"); - $contract_cancel_date->setTime(23,59,59); + $contract_cancel_date->setTime(23, 59, 59); } $require_term = false; if (array_key_exists(TT_ATTRIB_TERMINATION_REQUIRED_NAME, $product->attributes) && $product->attributes[TT_ATTRIB_TERMINATION_REQUIRED_NAME]->value == 1) { - //var_dump($prod->attributes); +//var_dump($prod->attributes); $require_term = true; $termination = new Termination($contract_data['termination_id']); if (!$contract_data['termination_id'] || !$termination->id) { $this->layout()->setFlash("Produkt erfordert Anschluss.", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "productchange", ["contract_id" => $id]); } else { $this->redirect("Contract", "productchange", ["contract_id" => $id]); @@ -437,12 +460,12 @@ class ContractController extends mfBaseController $contract_data['termination_id'] = null; } - //var_dump($r->links); - // lookup credit contract and if it's missing in $r->links - if(!$this->me->is("Admin")) { +//var_dump($r->links); +// lookup credit contract and if it's missing in $r->links + if (!$this->me->is("Admin")) { $credit_link = ContractLinkModel::includesContractId($contract->id, ["type" => "credit"]); - if($credit_link) { - if(is_array($r->links) && !array_key_exists($credit_link->id, $r->links)) { + if ($credit_link) { + if (is_array($r->links) && !array_key_exists($credit_link->id, $r->links)) { $r->links[$credit_link->id] = []; } $r->links[$credit_link->id]["action"] = "keep"; @@ -450,7 +473,7 @@ class ContractController extends mfBaseController } } - //var_dump($r->links);exit; +//var_dump($r->links);exit; $new_contract->update($contract_data); @@ -458,42 +481,39 @@ class ContractController extends mfBaseController if (!$new_contract_id) { $this->layout()->setFlash("Neuer Contract konnte nicht gespeichert werden", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "productchange", ["contract_id" => $id]); } else { $this->redirect("Contract", "productchange", ["contract_id" => $id]); } } - // TODO: Contractconfig übernehmen +// TODO: Contractconfig übernehmen - if($contract_cancel_date) { + if ($contract_cancel_date) { $contract->cancel_date = $contract_cancel_date->getTimestamp(); $contract->edit_by = $this->me->id; $contract->save(); } - $journal = ContractjournalModel::create([ - 'contract_id' => $new_contract->id, - 'type' => "created_from", - 'value' => "productchange", - 'text' => "Produkt-/Standortwechsel von Contract ID ".$contract->id - ]); + $journal = ContractjournalModel::create(['contract_id' => $new_contract->id, + 'type' => "created_from", + 'value' => "productchange", + 'text' => "Produkt-/Standortwechsel von Contract ID " . $contract->id]); $journal->save(); - if (is_array($r->links) && count($r->links)) { foreach ($r->links as $link_id => $link_data) { $action = $link_data["action"]; $cancel_date = false; - if($link_data["cancel_date"]) { + if ($link_data["cancel_date"]) { try { $cancel_date = DateTime::createFromFormat("d.m.Y", $link_data["cancel_date"], new DateTimeZone("Europe/Vienna")); } catch (Exception $e) { $this->layout()->setFlash("Ungültiges Kündigungsdatum", "error"); - if($f == "o") { + if ($f == "o") { $this->redirect("Order", "productchange", ["contract_id" => $id]); } else { $this->redirect("Contract", "productchange", ["contract_id" => $id]); @@ -505,7 +525,7 @@ class ContractController extends mfBaseController $old_link = new ContractLink($link_id); if (!$old_link->id) continue; - // check if link contains this contract +// check if link contains this contract if ($old_link->contract_id == $contract->id) { $origin_id = $old_link->origin_contract_id; $link_contract_id = $old_link->contract_id; @@ -522,25 +542,23 @@ class ContractController extends mfBaseController continue; } - if($action != "cancel" && $old_link->type != "credit") { - $new_link = ContractLinkModel::create([ - 'contract_id' => $new_link_contract_id, - 'origin_contract_id' => $new_link_origin_id, - 'type' => $old_link->type, - ]); + if ($action != "cancel" && $old_link->type != "credit") { + $new_link = ContractLinkModel::create(['contract_id' => $new_link_contract_id, + 'origin_contract_id' => $new_link_origin_id, + 'type' => $old_link->type,]); if (!$new_link->save()) { $this->layout()->setFlash("Konnte neuen Link nicht speichern", "warn"); } } if ($action == "cancel") { - if($cancel_date && $contract_cancel_date) { - // insert cancel_date in old contract + if ($cancel_date && $contract_cancel_date) { +// insert cancel_date in old contract $lc = new Contract($origin_id); $lc->cancel_date = $cancel_date->getTimestamp(); $lc->save(); } else { - // leave cancellation for later (when finishing upgrade) +// leave cancellation for later (when finishing upgrade) $old_link->change_action = "cancel"; if (!$old_link->save()) { $this->layout()->setFlash("Konnte alten Link nicht speichern", "warn"); @@ -550,42 +568,36 @@ class ContractController extends mfBaseController } if ($old_link->type == "credit" && $action == "keep") { - // XXX - if we have finish date then recreate credit contract right now - if($contract_cancel_date) { +// XXX - if we have finish date then recreate credit contract right now + if ($contract_cancel_date) { $new_credit = ContractModel::createCreditForContract($new_contract); $new_credit->save(); - // create journal for credit - $journal = ContractjournalModel::create([ - 'contract_id' => $new_credit->id, - 'type' => "created_from", - 'value' => "productchange", - 'text' => "Produkt-/Standortwechsel von Contract ID ".$new_link_origin_id - ]); +// create journal for credit + $journal = ContractjournalModel::create(['contract_id' => $new_credit->id, + 'type' => "created_from", + 'value' => "productchange", + 'text' => "Produkt-/Standortwechsel von Contract ID " . $new_link_origin_id]); $journal->save(); $this->log->debug(print_r($new_credit, true)); - // set cancel date for old credit +// set cancel date for old credit $old_credit = new Contract($origin_id); $old_credit->cancel_date = $contract_cancel_date->getTimestamp(); $old_credit->save(); - // create link to new credit contract - $link = ContractLinkModel::create([ - "contract_id" => $new_credit->id, - "origin_contract_id" => $new_contract->id, - "type" => "credit" - ]); +// create link to new credit contract + $link = ContractLinkModel::create(["contract_id" => $new_credit->id, + "origin_contract_id" => $new_contract->id, + "type" => "credit"]); $link->save(); - // create upgrade link from old to new credit contract - $link = ContractLinkModel::create([ - "contract_id" => $new_credit->id, - "origin_contract_id" => $origin_id, - "type" => "upgrade" - ]); +// create upgrade link from old to new credit contract + $link = ContractLinkModel::create(["contract_id" => $new_credit->id, + "origin_contract_id" => $origin_id, + "type" => "upgrade"]); $link->save(); } else { @@ -595,27 +607,25 @@ class ContractController extends mfBaseController } - //var_dump($new_link);exit; +//var_dump($new_link);exit; } } /* - * Upgrade Link erstellen - */ + * Upgrade Link erstellen + */ $change_type = "upgrade"; /*if($contract->product_id != $new_contract->product_id) { - $change_type = "upgrade"; + $change_type = "upgrade"; } elseif($contract->matchcode != $new_contract->matchcode) { - $change_type = "relocation"; + $change_type = "relocation"; } else { - $change_type = "productchange"; + $change_type = "productchange"; }*/ - $link = ContractLinkModel::create([ - 'contract_id' => $new_contract_id, - 'origin_contract_id' => $id, - 'type' => $change_type - ]); + $link = ContractLinkModel::create(['contract_id' => $new_contract_id, + 'origin_contract_id' => $id, + 'type' => $change_type]); $link_id = $link->save(); if (!$link_id) { @@ -625,19 +635,17 @@ class ContractController extends mfBaseController $new_contract->sendProductchangeNotification($contract); $this->layout()->setFlash("Produktwechsel erfolgreich erstellt", "success"); - if($f == "o") { - $this->redirect("Order","Upgrades"); + if ($f == "o") { + $this->redirect("Order", "Upgrades"); } else { $this->redirect("Contract", "view", ["contract_id" => $new_contract_id]); } - } - protected function finishContractAction() - { - if(!$this->me->is(["Admin"])) { + protected function finishContractAction() { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } $r = $this->request; @@ -655,27 +663,25 @@ class ContractController extends mfBaseController } $now = new DateTime("now"); - $now->setTime(0,0,0); + $now->setTime(0, 0, 0); $contract->finish_date = $now->getTimestamp(); $contract->finish_date_by = $this->me->id; try { $saved = $contract->save(); - } catch(Exception $e) { + } catch (Exception $e) { $saved = false; } - if(!$saved) { + if (!$saved) { $this->layout()->setFlash("Contract konnte nicht gespeichert werden", "error"); $this->redirect("Contract", "view", ['contract_id' => $id]); } - // create Journal - $journal = ContractjournalModel::create([ - 'contract_id' => $contract->id, - 'type' => "contract_finished" - ]); +// create Journal + $journal = ContractjournalModel::create(['contract_id' => $contract->id, + 'type' => "contract_finished"]); $journal_id = $journal->save(); $this->layout()->setFlash("Contract erfolgreich fertiggestellt", "success"); @@ -683,32 +689,8 @@ class ContractController extends mfBaseController } - - protected function addAction() - { - if(!$this->me->is(["Admin"])) { - $this->redirect("Dashboard"); - } - $this->layout()->setTemplate("Contract/Form"); - $this->layout()->set("terminations", TerminationModel::getAll()); - - if ($this->request->origin_contract_id) { - $origin = new Contract($this->request->origin_contract_id); - if ($origin->id) { - $contract = new Contract(); - $contract->owner_id = $origin->owner_id; - $contract->billingaddress_id = $origin->billingaddress_id; - $contract->matchcode = $origin->matchcode; - //var_dump($contract);exit; - $this->layout()->set("contract", $contract); - $this->layout()->set("origin_contract_id", $origin->id); - } - } - } - - protected function editAction() - { - if(!$this->me->is(["Admin"])) { + protected function editAction() { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } $id = $this->request->contract_id; @@ -727,7 +709,7 @@ class ContractController extends mfBaseController } $this->layout()->set("contract", $contract); - //var_dump($contract->owner);exit; +//var_dump($contract->owner);exit; if ($this->request->f == "view") $this->layout()->set("f", "view"); if ($this->request->f != "view") $this->layout()->set("f", "index"); @@ -742,17 +724,37 @@ class ContractController extends mfBaseController return $this->addAction(); } - protected function saveAction() - { - if(!$this->me->is(["Admin"])) { + protected function addAction() { + if (!$this->me->is(["Admin"])) { + $this->redirect("Dashboard"); + } + $this->layout()->setTemplate("Contract/Form"); + $this->layout()->set("terminations", TerminationModel::getAll()); + + if ($this->request->origin_contract_id) { + $origin = new Contract($this->request->origin_contract_id); + if ($origin->id) { + $contract = new Contract(); + $contract->owner_id = $origin->owner_id; + $contract->billingaddress_id = $origin->billingaddress_id; + $contract->matchcode = $origin->matchcode; +//var_dump($contract);exit; + $this->layout()->set("contract", $contract); + $this->layout()->set("origin_contract_id", $origin->id); + } + } + } + + protected function saveAction() { + if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } $r = $this->request; - //var_dump($r); +//var_dump($r); /* - * add or edit - */ + * add or edit + */ $id = $r->id; if (is_numeric($id) && $id > 0) { $mode = "edit"; @@ -766,32 +768,32 @@ class ContractController extends mfBaseController $mode = "add"; } - //var_dump($r->get());exit; +//var_dump($r->get());exit; $contract_data = []; - $contract_data["owner_id"] = (int)$r->owner_id; - $contract_data["billingaddress_id"] = ($r->billingaddress_id) ? (int)$r->billingaddress_id : $r->owner_id; - $contract_data["product_id"] = (int)$r->product_id; + $contract_data["owner_id"] = (int) $r->owner_id; + $contract_data["billingaddress_id"] = ($r->billingaddress_id) ? (int) $r->billingaddress_id : $r->owner_id; + $contract_data["product_id"] = (int) $r->product_id; $contract_data["matchcode"] = $r->matchcode; $contract_data["product_name"] = $r->product_name; $contract_data["product_info"] = $r->product_info; - $contract_data['amount'] = ($r->amount) ? (float)$r->amount : 1; + $contract_data['amount'] = ($r->amount) ? (float) $r->amount : 1; $contract_data['vatgroup_id'] = $r->vatgroup_id; $contract_data['sla_id'] = $r->sla_id; - $contract_data['price'] = (float)Layout::commaToDot($r->price); - $contract_data['price_setup'] = (float)Layout::commaToDot($r->price_setup); - $contract_data['price_nne'] = (float)Layout::commaToDot($r->price_nne); - $contract_data['price_nbe'] = (float)Layout::commaToDot($r->price_nbe); - $contract_data['billing_period'] = (int)$r->billing_period; - $contract_data['billing_delay'] = (int)$r->billing_delay; + $contract_data['price'] = (float) Layout::commaToDot($r->price); + $contract_data['price_setup'] = (float) Layout::commaToDot($r->price_setup); + $contract_data['price_nne'] = (float) Layout::commaToDot($r->price_nne); + $contract_data['price_nbe'] = (float) Layout::commaToDot($r->price_nbe); + $contract_data['billing_period'] = (int) $r->billing_period; + $contract_data['billing_delay'] = (int) $r->billing_delay; $contract_data['note'] = $r->note; - if($r->termination_id) { + if ($r->termination_id) { $contract_data["termination_id"] = $r->termination_id; } - if($r->order_date) { + if ($r->order_date) { $order_date = new DateTime("@" . $this->dateToTimestamp($r->order_date)); $order_date->setTimezone(new DateTimeZone("Europe/Vienna")); $order_date->setTime(0, 0, 0); @@ -800,40 +802,40 @@ class ContractController extends mfBaseController $contract_data['order_date'] = null; } - if($r->finish_date) { + if ($r->finish_date) { $finish_date = new DateTime("@" . $this->dateToTimestamp($r->finish_date)); $finish_date->setTimezone(new DateTimeZone("Europe/Vienna")); $finish_date->setTime(0, 0, 0); $contract_data['finish_date'] = $finish_date->getTimestamp(); - if($mode == "add") { + if ($mode == "add") { $contract_data['finish_date_by'] = $this->me->id; } else { - if($contract->finish_date) { - $contract_finish_date = new DateTime("@".$contract->finish_date); + if ($contract->finish_date) { + $contract_finish_date = new DateTime("@" . $contract->finish_date); $contract_finish_date->setTimezone(new DateTimeZone("Europe/Vienna")); - if($contract_finish_date->format("Y-m-d") != $finish_date->format("Y-m-d")) { + if ($contract_finish_date->format("Y-m-d") != $finish_date->format("Y-m-d")) { $contract_data['finish_date_by'] = $this->me->id; } } else { $contract_data['finish_date_by'] = $this->me->id; } } - } else { + } else { $contract_data['finish_date'] = null; } - if($r->cancel_date) { + if ($r->cancel_date) { $cancel_date = new DateTime("@" . $this->dateToTimestamp($r->cancel_date)); $cancel_date->setTimezone(new DateTimeZone("Europe/Vienna")); $cancel_date->setTime(0, 0, 0); $contract_data['cancel_date'] = $cancel_date->getTimestamp(); - if($mode == "add") { + if ($mode == "add") { $contract_data['cancel_date_by'] = $this->me->id; } else { - if($contract->cancel_date) { - $contract_cancel_date = new DateTime("@".$contract->cancel_date); + if ($contract->cancel_date) { + $contract_cancel_date = new DateTime("@" . $contract->cancel_date); $contract_cancel_date->setTimezone(new DateTimeZone("Europe/Vienna")); - if($contract_cancel_date->format("Y-m-d") != $cancel_date->format("Y-m-d")) { + if ($contract_cancel_date->format("Y-m-d") != $cancel_date->format("Y-m-d")) { $contract_data['cancel_date_by'] = $this->me->id; } } else { @@ -845,8 +847,7 @@ class ContractController extends mfBaseController } - - //var_dump($contract_data);exit; +//var_dump($contract_data);exit; if ($mode == "add") { $contract = ContractModel::create($contract_data); @@ -865,7 +866,7 @@ class ContractController extends mfBaseController $this->layout()->setFlash("Bitte Produkt auswählen.", "error"); return $this->addAction(); } - if (!in_array($contract_data['billing_period'], [0,1,12])) { + if (!in_array($contract_data['billing_period'], [0, 1, 12])) { $this->layout()->setFlash("Bitte Rechnungsperiode auswählen.", "error"); return $this->addAction(); } @@ -879,7 +880,7 @@ class ContractController extends mfBaseController $contract->product_name = $product->name; } - //var_dump($contract);exit; +//var_dump($contract);exit; $contract_id = $contract->save(); @@ -889,43 +890,35 @@ class ContractController extends mfBaseController return $this->addAction(); } - // create journal +// create journal if ($mode == "add") { - $journal = ContractjournalModel::create([ - 'contract_id' => $contract_id, - 'type' => "created_from", - 'value' => "manual" - ]); + $journal = ContractjournalModel::create(['contract_id' => $contract_id, + 'type' => "created_from", + 'value' => "manual"]); $journal->save(); } $this->layout()->setFlash("Vertrag erfolgreich gespeichert.", "success"); /* - * Create link to origin contract if set - */ + * Create link to origin contract if set + */ if ($mode == "add" && $r->origin_contract_id) { $origin = new Contract($r->origin_contract_id); if ($origin->id) { - $link = ContractLinkModel::create([ - 'contract_id' => $contract_id, - 'origin_contract_id' => $origin->id, - 'type' => 'link' - ]); + $link = ContractLinkModel::create(['contract_id' => $contract_id, + 'origin_contract_id' => $origin->id, + 'type' => 'link']); $link_id = $link->save(); if ($link_id) { - $journal = ContractjournalModel::create([ - 'contract_id' => $contract_id, - 'type' => "link", - 'value' => $origin->id - ]); + $journal = ContractjournalModel::create(['contract_id' => $contract_id, + 'type' => "link", + 'value' => $origin->id]); $journal->save(); - $ojournal = ContractjournalModel::create([ - 'contract_id' => $origin->id, - 'type' => "link", - 'value' => $contract_id - ]); + $ojournal = ContractjournalModel::create(['contract_id' => $origin->id, + 'type' => "link", + 'value' => $contract_id]); $ojournal->save(); } } @@ -956,8 +949,7 @@ class ContractController extends mfBaseController } - protected function apiAction() - { + protected function apiAction() { if (!$this->me->is(["Admin", "salespartner", "netowner"])) { $this->redirect("Dashboard"); } @@ -990,8 +982,7 @@ class ContractController extends mfBaseController $this->returnJson($data); } - private function getContractApi() - { + private function getContractApi() { if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } @@ -1018,32 +1009,32 @@ class ContractController extends mfBaseController private function getContractsApi() { $owner_id = $this->request->owner_id; - if(!$owner_id) return false; + if (!$owner_id) return false; $return = []; $contracts = ContractModel::search(["owner_id" => $owner_id]); - if(!$contracts) { + if (!$contracts) { header("Content-type: application/json"); echo json_encode([]); exit; } $is_valid_owner = false; - if(!$this->me->is("Admin")) { - foreach($contracts as $contract) { - foreach(ContractLinkModel::includesContractId($contract->id) as $link) { - if($link->type != "credit") continue; + if (!$this->me->is("Admin")) { + foreach ($contracts as $contract) { + foreach (ContractLinkModel::includesContractId($contract->id) as $link) { + if ($link->type != "credit") continue; $link_contract = $link->contract; - if($link->contract_id == $contract->id) $link_contract = $link->origin; - if($link_contract->owner_id == $this->me->address_id) { + if ($link->contract_id == $contract->id) $link_contract = $link->origin; + if ($link_contract->owner_id == $this->me->address_id) { $is_valid_owner = true; break; } } } - - if(!$is_valid_owner) { + + if (!$is_valid_owner) { header("Content-type: application/json"); echo json_encode([]); exit; @@ -1051,8 +1042,7 @@ class ContractController extends mfBaseController } - - foreach($contracts as $contract) { + foreach ($contracts as $contract) { $c = get_object_vars($contract->data); $c["id"] = $contract->id; $return[] = $c; @@ -1063,8 +1053,7 @@ class ContractController extends mfBaseController exit; } - private function findContractApi() - { + private function findContractApi() { if (!$this->me->is(["Admin"])) { $this->redirect("Dashboard"); } @@ -1104,14 +1093,16 @@ class ContractController extends mfBaseController $results = []; - // return bootstrap-autocomplete format +// return bootstrap-autocomplete format foreach ($contracts as $contract) { - //$result = ['value' => $contract->id, 'text' => str_replace("'", "\\'", str_replace(["\n", "\r"], " ",$contract->name))]; - $result = ['value' => $contract->id, 'text' => $contract->id . ": " . $contract->product_name . " [" . $contract->matchcode . "] (" . $contract->owner->getCompanyOrName() . ", " . $contract->owner->street . ", " . $contract->owner->zip . " " . $contract->owner->city . ")"]; +//$result = ['value' => $contract->id, 'text' => str_replace("'", "\\'", str_replace(["\n", "\r"], " ",$contract->name))]; + $result = ['value' => $contract->id, + 'text' => $contract->id . ": " . $contract->product_name . " [" . $contract->matchcode . "] (" . $contract->owner->getCompanyOrName() . ", " . $contract->owner->street . ", " . $contract->owner->zip . " " . $contract->owner->city . ")"]; $results[] = $result; if (count($results) > 15) { - $results[] = ['value' => 0, 'text' => "  -->   Mehr Suchergebnisse vorhanden. Bitte Suchbegriff genauer definieren   <--"]; + $results[] = ['value' => 0, + 'text' => "  -->   Mehr Suchergebnisse vorhanden. Bitte Suchbegriff genauer definieren   <--"]; break; } } diff --git a/lib/Helper/Helper.php b/lib/Helper/Helper.php index de447bf20..857ad5268 100644 --- a/lib/Helper/Helper.php +++ b/lib/Helper/Helper.php @@ -44,7 +44,7 @@ class Helper { /** * Validates an array of data based on a set of predefined rules. * - * @param array $data The data to validate. Keys represent field names, and values are the corresponding data. + * @param array $data The data to validate. Keys represent field names, and values are the corresponding data. * @param array $checkArray An associative array defining validation rules for each field: * - key: The field name to validate. * - value: An associative array of validation rules for that field: @@ -70,11 +70,9 @@ class Helper { // Apply default values for missing rules - $rules = array_merge([ - 'required' => false, - 'required_length' => 1, - 'regex' => false, - ], $rules); + $rules = array_merge(['required' => false, + 'required_length' => 1, + 'regex' => false,], $rules); // Required Check if ($rules['required'] && (is_null($value) || $value === '')) { @@ -95,12 +93,8 @@ class Helper { if ($printErrors) { if (!empty($errors)) { header('Content-Type: application/json'); - die(json_encode( - [ - 'success' => false, - 'errors' => $errors - ] - )); + die(json_encode(['success' => false, + 'errors' => $errors])); } } @@ -122,11 +116,8 @@ class Helper { "MF_APP_NAME" => MFAPPNAME_SLUG, "BASE_PATH" => $controller::getUrl(""), "PAGE_TITLE" => $headerTitle, - "PATH" => [ - ["text" => MFAPPNAME_SLUG, "href" => $controller::getUrl("Dashboard")], - ["text" => $headerTitle, "href" => $controller::getUrl($pageName)] - ], - ]; + "PATH" => [["text" => MFAPPNAME_SLUG, "href" => $controller::getUrl("Dashboard")], + ["text" => $headerTitle, "href" => $controller::getUrl($pageName)]],]; $JSGlobals = array_merge($JSGlobals, $additionalGlobals); @@ -157,4 +148,17 @@ class Helper { return $csv; } + + /** + * Formats a number with the given number of decimals, decimal point, and thousands separator. + * @param $number + * @param int $decimals + * @param string $decPoint + * @param string $thousandsSep + * @return float + */ + public static function formatNumber($number, int $decimals = 2, string $decPoint = ",", string $thousandsSep = "."): string { + return number_format(intval($number), $decimals, $decPoint, $thousandsSep); + } + } \ No newline at end of file diff --git a/public/bundler.php b/public/bundler.php index 012849926..721fb6431 100644 --- a/public/bundler.php +++ b/public/bundler.php @@ -31,6 +31,7 @@ $jsFiles = [ "plugins/moment/moment.min.js", "plugins/daterangepicker/daterangepicker.js", "plugins/vue/" . (isset($_GET['VUE_DEBUG']) || $_SERVER['HTTP_HOST'] === "localhost" ? "vue.js" : "vue.min.js"), + "plugins/vue/tt-components/tt-button.js", "plugins/vue/tt-components/tt-card.js", "plugins/vue/tt-components/tt-table.js", "plugins/vue/tt-components/tt-table-crud.js", @@ -39,6 +40,7 @@ $jsFiles = [ "plugins/vue/tt-components/tt-select.js", "plugins/vue/tt-components/tt-datepicker.js", "plugins/vue/tt-components/tt-input.js", + "plugins/vue/tt-components/tt-button.js", "plugins/vue/tt-components/tt-modal.js", "plugins/vue/tt-components/tt-autocomplete.js", "plugins/vue/tt-components/tt-icon-select.js", diff --git a/public/js/pages/ContractView/ContractView.css b/public/js/pages/ContractView/ContractView.css new file mode 100644 index 000000000..e331ff64a --- /dev/null +++ b/public/js/pages/ContractView/ContractView.css @@ -0,0 +1,73 @@ +.contract-journal-grid { + display: grid; + grid-template-columns: auto 24px 10fr; + max-width: 1200px; + margin: auto +} + +.contract-journal-grid > * { + padding: 4px; +} + +.contract-journal-grid > hr { + padding: 0px 4px 0 4px ; +} + + +.contract-journal-striped-background { + background-color: rgba(0, 0, 0, .05) +} + +.view-table tr td:first-child { + font-weight: bold; + text-align: right; +} + +.contract-view { + display: grid; + grid-template-columns: 3fr 1fr; + grid-gap: 16px; +} + +.contract-view-header { + display: grid; + grid-template-columns: 1fr auto 1fr; +} + +.contract-view-header *:nth-child(3) { + justify-self: end; +} + +@media (max-width: 576px) { + .contract-view { + grid-template-columns: 1fr; + } + + .contract-view-header { + grid-template-columns: auto auto; + } + + .contract-view-header h2 { + grid-row: 2; + grid-column: 1 / span 2; + } + + .contract-view-header a { + grid-row: 1; + font-size: 16px !important; + } + + .contract-view-actions { + text-align: center; + } + +} + +/*if media is larger than 1200px then .contract-view-journal-grid should have column 1 span 2 aswell as .contract-view-links-grid*/ + +@media (min-width: 1200px) { + .contract-view-links-grid, .contract-view-journal-grid { + grid-column: 1 / span 2 !important; + } +} + diff --git a/public/js/pages/ContractView/ContractView.js b/public/js/pages/ContractView/ContractView.js new file mode 100644 index 000000000..ad31b9b59 --- /dev/null +++ b/public/js/pages/ContractView/ContractView.js @@ -0,0 +1,181 @@ +Vue.component('tt-detail-table', { + //language=Vue + template: ` + + + + + + + +
+ + +
`, props: ['detailItems'], +}) + +Vue.component('contract-journal', { + //language=Vue + template: ` +
+ + + +
+ + +
+ +
+
+
+ + + + + + + + + + + +
+
+ +
+ + + + + +
+
+ `, props: ['journalEntries', 'contractId'], data() { + return { + expandedTexts: [], showNewJournal: false, window: window + } + }, methods: { + parseTextAddUrls(entry, addIcon = null, replaceNewLines = false) { + let text = JSON.parse(JSON.stringify(entry)).text + if (replaceNewLines) { + text = text.replace(/(?:\r\n|\r|\n)/g, '
') + } + + // if addIcon is set, add it to the beginning of the text + if (addIcon) { + text = ` ${text}` + } + + if (entry.url && entry["urlText"]) { + return text.replace('[URL]', `${entry["urlText"]}`) + } + return text + } + } +}) + + +Vue.component('contract-view', { + //language=Vue + template: ` +
+ + + + +
+ +
Vertragsdaten
+ +
+ +
+ +
Aktionen
+ +
+
+ + + + +
Vertragslinks
+
+
+ +
+ + +
+ +
+ `, data() { + return { + window: window, + header: window.TT_CONFIG["HEADER"], + subHeader: window.TT_CONFIG["SUB_HEADER"], + contractDetails: window.TT_CONFIG["CONTRACT_DETAILS"], + contractLinkTableHTML: null, + } + }, computed: { + isPrivateProduct() { + return window.TT_CONFIG["HEADER"].includes('Privat') + } + }, + async mounted() { + const response = await axios.get(window.TT_CONFIG["CONTRACT_LINK_TABLE_URL"]) + this.contractLinkTableHTML = response.data + console.log(response.data) + } +}) \ No newline at end of file diff --git a/public/plugins/vue/tt-components/css/tt-table.css b/public/plugins/vue/tt-components/css/tt-table.css index 39a87672b..e3b6227c2 100644 --- a/public/plugins/vue/tt-components/css/tt-table.css +++ b/public/plugins/vue/tt-components/css/tt-table.css @@ -144,7 +144,7 @@ input[type=number]::-webkit-outer-spin-button { margin-bottom: 8px; } - .fa-circle-xmark, .fa-ban, .fa-trash, .fa-edit, .fa-square-check, .fa-arrows-up-down-left-right, .fa-chevron-right { + .fa-circle-xmark, .fa-ban, .fa-trash, .fa-arrow-left, .fa-edit, .fa-square-check, .fa-arrows-up-down-left-right, .fa-chevron-right { font-size: 20px !important } diff --git a/public/plugins/vue/tt-components/tt-button.js b/public/plugins/vue/tt-components/tt-button.js new file mode 100644 index 000000000..f5e28f50c --- /dev/null +++ b/public/plugins/vue/tt-components/tt-button.js @@ -0,0 +1,40 @@ +// noinspection JSCheckFunctionSignatures +Vue.component('tt-button', { + //language=Vue + template: ` +
+ + +
+ `, props: { + sm: {type: Boolean, default: false}, + icon: {type: String, required: false}, + text: {type: String, required: false}, + href: {type: String, required: false}, + additionalClass: {type: String, required: false}, + // TODO: maybe instead of browser confirmation add a custom beautiful confirmation dialog + confirmText: {type: String, required: false}, + }, computed: { + buttonClasses() { + const classes = { + 'btn-sm': this.sm, + } + + for (const className of this.additionalClass.split(' ')) { + classes[className] = true + } + + return classes + } + } +}) \ No newline at end of file diff --git a/public/plugins/vue/tt-components/tt-card.js b/public/plugins/vue/tt-components/tt-card.js index ac2132932..cb7b2b8bf 100644 --- a/public/plugins/vue/tt-components/tt-card.js +++ b/public/plugins/vue/tt-components/tt-card.js @@ -1,16 +1,18 @@ Vue.component('tt-card', { //language=Vue template: ` -
-
- -
-
- -
- -
- `, +
+
+ +
+
+ +
+ +
+ `, props: { + noBodyPaddingTop: {type: Boolean, default: false}, bodyOverflowXAuto: {type: Boolean, default: false}, + } }) \ No newline at end of file