From 11b1357c520a055dbaed3fbebc2acc56e2ece677 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 25 Feb 2025 20:33:47 +0100 Subject: [PATCH] Added Preorderbilling permissions --- Layout/default/PreorderProduct/Index.php | 62 +- .../include/netoperator-prices-usage.php | 185 ++-- .../PreorderProduct/include/prices-setup.php | 133 ++- Layout/default/User/Form.php | 831 ++++++++++-------- Layout/default/menu.php | 55 +- .../PreorderProductController.php | 14 +- application/User/UserController.php | 4 + ...151428_add_preorderbilling_permissions.php | 37 + public/assets/css/thetool.css | 4 + 9 files changed, 768 insertions(+), 557 deletions(-) create mode 100644 db/migrations/20250225151428_add_preorderbilling_permissions.php diff --git a/Layout/default/PreorderProduct/Index.php b/Layout/default/PreorderProduct/Index.php index ffc68c5c8..06bbc571a 100644 --- a/Layout/default/PreorderProduct/Index.php +++ b/Layout/default/PreorderProduct/Index.php @@ -12,7 +12,7 @@ -

Preise

+

Kampagnenmanagement Preise

@@ -26,7 +26,7 @@
-

Preise

+

Kampagnenmanagement Preise

@@ -49,24 +49,36 @@
- - -

getCompanyOrName()?> (id?>)

-
-
-

Produkte

+ + +
+ +
" id="netop-id?>" role="tabpanel"> +
+
+ +

Produkte für Netzbetreiber getCompanyOrName()?>

setNetoperatorId($netoperator->id) ?> setTodayDate($today_date); ?> id, $product->prices)) ? $product->prices[$netoperator->id] : false; ?> -
+

- Preiseinstellungen für name?> + name?>

@@ -79,17 +91,13 @@
- - - - - - + +
- - + +
@@ -162,5 +170,23 @@ } + $(document).ready(() => { + + var hash = window.location.hash.substring(1); + var match = hash.match(/product-(\d+)(?:-(\d)+)?/); + console.log(match); + if(match && typeof match[1] !== 'undefined') { + var netop = match[1]; + + console.log('$("#netop-' + netop + '-tab").tab("show");'); + $("#netop-" + netop + "-tab").tab('show'); + if(typeof match[2] !== 'undefined') { + let prod_id = match[2]; + $("#price-detail-" + netop + "-" + prod_id).collapse('toggle'); + } + + } + }); + \ No newline at end of file diff --git a/Layout/default/PreorderProduct/include/netoperator-prices-usage.php b/Layout/default/PreorderProduct/include/netoperator-prices-usage.php index 84a501791..361fbaa32 100644 --- a/Layout/default/PreorderProduct/include/netoperator-prices-usage.php +++ b/Layout/default/PreorderProduct/include/netoperator-prices-usage.php @@ -8,7 +8,95 @@ */ ?> -
+
+ getCurrentPrice($today_date, true); + $current_regular_price = $product->getCurrentRegularPrice($today_date, true); + $first_price = $product->getFirstPrice($today_date); + ?> +
+
+
+

Aktuelle Preise für getTodayDate()?>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
INETINET+TVCATVPassive
Heute gültiger Preisprice_inet, 2, ",", ".")?>price_inet_tv, 2, ",", ".")?>price_catv, 2, ",", ".")?>price_passive, 2, ",", ".")?> + description?> + end_date): ?> + bis end_date))->format("d.m.Y")?> + +
Derzeit regulärer Preisprice_inet, 2, ",", ".")?>price_inet_tv, 2, ",", ".")?>price_catv, 2, ",", ".")?>price_passive, 2, ",", ".")?>description?>
Initialpreisprice_inet, 2, ",", ".")?>price_inet_tv, 2, ",", ".")?>price_catv, 2, ",", ".")?>price_passive, 2, ",", ".")?>
+ +
+
+ +
+
+

Preise Netzdurchdringung

+ +
Heute gültige Preise
+ Gültig von: start_date) ? (new DateTime($current_price->start_date))->format("d.m.Y") : ""?>
+ Gültig bis: end_date) ? (new DateTime($current_price->end_date))->format("d.m.Y") : ""?> + + + + + + + + + + + + + + + + marketsharediscounts as $bracket => $discount): ?> + + + + + + + + + +
GruppeINETINET+TVCATVPassive
0 - 15%price_inet?>price_inet_tv?>price_catv?>price_passive?>
% - %price_inet?>price_inet_tv?>price_catv?>price_passive?>
+
+
+ +
+
"> @@ -39,7 +127,7 @@ end_date) ? (new DateTime($line->end_date))->format("d.m.Y") : "-"?> campaigns) && count($line->campaigns)) ? count($line->campaigns) : ""?> description?> - creator->name?> + create)?>">creator->name?> @@ -213,97 +301,6 @@
-
- - - - - getCurrentPrice($today_date, true); - $current_regular_price = $product->getCurrentRegularPrice($today_date, true); - $first_price = $product->getFirstPrice($today_date); - ?> -
-
-
-

Aktuelle Preise für getTodayDate()?>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
INETINET+TVCATVPassive
Heute gültiger Preisprice_inet, 2, ",", ".")?>price_inet_tv, 2, ",", ".")?>price_catv, 2, ",", ".")?>price_passive, 2, ",", ".")?> - description?> - end_date): ?> - bis end_date))->format("d.m.Y")?> - -
Derzeit regulärer Preisprice_inet, 2, ",", ".")?>price_inet_tv, 2, ",", ".")?>price_catv, 2, ",", ".")?>price_passive, 2, ",", ".")?>description?>
Initialpreisprice_inet, 2, ",", ".")?>price_inet_tv, 2, ",", ".")?>price_catv, 2, ",", ".")?>price_passive, 2, ",", ".")?>
- -
-
- -
-
-

Preise Netzdurchdringung

- -
Heute gültige Preise
- Gültig von: start_date) ? (new DateTime($current_price->start_date))->format("d.m.Y") : ""?>
- Gültig bis: end_date) ? (new DateTime($current_price->end_date))->format("d.m.Y") : ""?> - - - - - - - - - - - - - - - - marketsharediscounts as $bracket => $discount): ?> - - - - - - - - - -
GruppeINETINET+TVCATVPassive
0 - 15%price_inet?>price_inet_tv?>price_catv?>price_passive?>
% - %price_inet?>price_inet_tv?>price_catv?>price_passive?>
-
-
- -
+
\ No newline at end of file diff --git a/Layout/default/PreorderProduct/include/prices-setup.php b/Layout/default/PreorderProduct/include/prices-setup.php index c808caee3..8ed2c69be 100644 --- a/Layout/default/PreorderProduct/include/prices-setup.php +++ b/Layout/default/PreorderProduct/include/prices-setup.php @@ -8,8 +8,69 @@ */ ?> -
-
+
+ getCurrentPrice($today_date, true); + $current_regular_price = $product->getCurrentRegularPrice($today_date, true); + $first_price = $product->getFirstPrice($today_date); + ?> +
+
+
+

Aktuelle Preise für getTodayDate()?>

+ + + + + + + + + + + + + + +
Heute gültiger Preisprice_setup, 2, ",", ".")?> + description?> + end_date): ?> + bis end_date))->format("d.m.Y")?> + +
Derzeit regulärer Preisprice_setup, 2, ",", ".")?>description?>
Initialpreis price_setup, 2, ",", ".")?>
+ +
+
+ +
+
+

Preis Pro Kampagne

+ + + + + + + + + + + getCampaignPrice($campaign->id, $today_date); ?> + + + + + + + + + +
KampagnePreisGültig vonGültig bisBeschreibung
name?>price_setup, 2, ",", ".")?>start_date) ? (new DateTime($cprice->start_date))->format("d.m.Y") : "-"?>end_date) ? (new DateTime($cprice->end_date))->format("d.m.Y") : "-"?>description?>getTodayDate()?>
+
+
+ +
+
">
@@ -33,7 +94,7 @@ end_date) ? (new DateTime($line->end_date))->format("d.m.Y") : "-"?> campaigns) && count($line->campaigns)) ? count($line->campaigns) : ""?> description?> - creator->name?> + create)?>">creator->name?> @@ -121,70 +182,4 @@
- - - - - getCurrentPrice($today_date, true); - $current_regular_price = $product->getCurrentRegularPrice($today_date, true); - $first_price = $product->getFirstPrice($today_date); - ?> -
-
-
-

Aktuelle Preise für getTodayDate()?>

- - - - - - - - - - - - - - -
Heute gültiger Preisprice_setup, 2, ",", ".")?> - description?> - end_date): ?> - bis end_date))->format("d.m.Y")?> - -
Derzeit regulärer Preisprice_setup, 2, ",", ".")?>description?>
Initialpreis price_setup, 2, ",", ".")?>
- -
-
- -
-
-

Preis Pro Kampagne

- - - - - - - - - - - getCampaignPrice($campaign->id, $today_date); ?> - - - - - - - - - -
KampagnePreisGültig vonGültig bisBeschreibung
name?>price_setup, 2, ",", ".")?>start_date) ? (new DateTime($cprice->start_date))->format("d.m.Y") : "-"?>end_date) ? (new DateTime($cprice->end_date))->format("d.m.Y") : "-"?>description?>getTodayDate()?>
-
-
- -
-
diff --git a/Layout/default/User/Form.php b/Layout/default/User/Form.php index 6626590de..4060ad1f2 100644 --- a/Layout/default/User/Form.php +++ b/Layout/default/User/Form.php @@ -1,377 +1,516 @@ - +
-
-
-
- -
-

Benutzer

+
+
+
+ +
+

Benutzer

+
-
- -
-
-
-
-

Benutzer bearbeiten

+
"> + +
+
+
+
+

Benutzer bearbeiten

+
+
- "> - -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
" id="employee-number-container"> - - value() : ""?>" /> -
-
" id="project-api-key-container"> - - value() : ""?>" /> -
-
- - -
-
- - -
- -
- - - z.B. Meridiam -
- -
- - -
- -
- - -
-
- - -
- -
- -
- - -
- -
- -

Beschränkungen

- -
- - id) { - $pns = json_decode((new WorkerFlag($user->id,"preorder_networks"))->value()); - if(!$pns) { - $pns = []; - } - } - - ?> - - Beschränkt Benutzer auf Netzgebiete. Überschreibt Netzgebiete der Firma. Wenn leer werden Netzgebiete der Firma angezeigt -
-
- - -
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
" + id="employee-number-container"> + + value() : ""?>"/> +
+
" + id="project-api-key-container"> + + value() : ""?>"/> +
-
- -

Modulberechtigungen

- -
-
-
- can("Building")) ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Pipework") ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Linework") ? "checked='checked'" : ""?> /> - -
-
-
-
-
-
- can("Patching") ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Filestore") ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Cpeprovisioning") ? "checked='checked'" : ""?> /> - -
-
-
-
-
-
- can("Cpeshipping") ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Voipnumbering") ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Preorder") ? "checked='checked'" : ""?> /> - -
-
-
-
-
-
- can("Order") ? "checked='checked'" : ""?> /> - -
-
-
-
- can("Billing") ? "checked='checked'" : ""?> /> - -
-
-
-

Lager

+
+ + +
+
+ + +
-
-
-
- can("WarehouseAdmin")) ? "checked='checked'" : ""?> /> - +
+ +
+ + +
+
-
-
-
- can("WarehouseUser")) ? "checked='checked'" : ""?> /> - +
+
+ +

Preorder

+ +
+ + +
+ +
+ + + z.B. Meridiam +
+ +
+ + +
+ +
+ + id) { + $pns = json_decode((new WorkerFlag($user->id, "preorder_networks"))->value()); + if(!$pns) { + $pns = []; + } + } + + ?> + + Beschränkt Benutzer auf Netzgebiete. Überschreibt Netzgebiete der Firma. Wenn + leer werden Netzgebiete der Firma angezeigt +
+ +
+ + +
+ +

Preorder Module

+
+
+
+ can("Preorderpricing")) ? "checked='checked'" : ""?> /> + +
+
+ can("PreorderpricingReadonly") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Preorderbilling")) ? "checked='checked'" : ""?> /> + +
+
+ can("PreorderbillingReadonly") ? "checked='checked'" : ""?> /> + +
+
+
+
-
+
+
+ +

Modulberechtigungen

+ +
+
+
+ can("Building")) ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Pipework") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Linework") ? "checked='checked'" : ""?> /> + +
+
+
+
+
+
+ can("Patching") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Filestore") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Cpeprovisioning") ? "checked='checked'" : ""?> /> + +
+
+
+
+
+
+ can("Cpeshipping") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Voipnumbering") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Preorder") ? "checked='checked'" : ""?> /> + +
+
+
+
+
+
+ can("Order") ? "checked='checked'" : ""?> /> + +
+
+
+
+ can("Billing") ? "checked='checked'" : ""?> /> + +
+
+
+ +

Lager

+ +
+
+
+ can("WarehouseAdmin")) ? "checked='checked'" : ""?> /> + +
+
+ +
+
+ can("WarehouseUser")) ? "checked='checked'" : ""?> /> + +
+
+ +
+
+ can("WarehouseEShop")) ? "checked='checked'" : ""?> /> + +
+
+
+ +

Zusatzberechtigungen

+ +
+
+
+ can("Fibu")) ? "checked='checked'" : ""?> /> + +
+
+ +
+
+ can("Statistics")) ? "checked='checked'" : ""?> /> + +
+
+
+ +
+ +
+ +
+ +
-
-
- can("WarehouseEShop")) ? "checked='checked'" : ""?> /> -
- -

Zusatzberechtigungen

- -
-
-
- can("Fibu")) ? "checked='checked'" : ""?> /> - -
-
- -
-
- can("Statistics")) ? "checked='checked'" : ""?> /> - -
-
- -
- -
- -
- -
-
-
-
- - id): ?> + + +id): ?>
-
-
-
-

API Key

-
-
-
- -
-
-
"> - - apikey): ?> - - - - -
-
+
+
+
+

API Key

+
+
+
+ +
+
+
"> + + apikey): ?> + + + + -
+
+
+ +
-
- - + + + \ No newline at end of file diff --git a/Layout/default/menu.php b/Layout/default/menu.php index 4ac0041c7..b2a321c0f 100644 --- a/Layout/default/menu.php +++ b/Layout/default/menu.php @@ -59,40 +59,40 @@ - is(["Admin"])): ?> + is(["Admin", "netowner", "salespartner"]) && ($me->is("employee") || $me->can(["Fibu", "Billing", "Preorderpricing", "Preorderbilling"]))): ?>
  • Backoffice
    @@ -102,11 +102,21 @@ can('Fibu')): ?>
  • "> Kalender Verwaltung
  • "> Contracts
  • is(["Admin"]) && $me->can("Billing")): ?>
  • "> Contract Queue
  • -
  • "> Erweiterte Suche
  • is(["Admin"]) && $me->can("Billing")): ?>
  • "> Verrechnung
  • is(["Admin"]) && $me->can("Billing")): ?>
  • "> Rechnungen
  • is(["Admin"]) && $me->can("Billing")): ?>
  • "> Historische Rechnungen
  • - is(["Admin"])): ?>
  • "> Emailaussendung
  • + + is(["Admin","netowner","salespartner"]) && $me->can("Preorderpricing")): ?> +
  • "> Vorbestellkampagnen Bepreisung
  • + + is(["Admin","netowner","salespartner"]) && $me->can("Preorderbilling")): ?> +
  • "> Vorbestellkampagnen Verrechnung
  • + + is(["Admin","netowner","salespartner"]) && in_array($me->address_id, [1,209,5908,2187])): ?> +
  • "> Zustimmungserklärungen
  • + + + is(["Admin"])): ?>
  • "> Emailaussendungen
  • @@ -196,14 +206,13 @@ diff --git a/application/PreorderProduct/PreorderProductController.php b/application/PreorderProduct/PreorderProductController.php index 970fdbbed..b91695625 100644 --- a/application/PreorderProduct/PreorderProductController.php +++ b/application/PreorderProduct/PreorderProductController.php @@ -67,7 +67,7 @@ class PreorderProductController extends mfBaseController { foreach($r->netoperators as $netoperator_id => $product_data) { $netoperator = new Address($netoperator_id); if(!$netoperator->id) { - $this->layout()->setFlash("Betzbetreiber nicht gefunden", "error"); + $this->layout()->setFlash("Netzbetreiber nicht gefunden", "error"); $this->layout()->redirect("PreorderProduct"); } foreach($product_data as $product_id => $price_data) { @@ -75,7 +75,7 @@ class PreorderProductController extends mfBaseController { $product = new PreorderProduct($product_id); if(!$product->id) { $this->layout()->setFlash("Produkt $product_id nicht gefunden", "error"); - $this->layout()->redirect("PreorderProduct"); + $this->layout()->redirect("PreorderProduct","",[], "product-".$netoperator_id); } // create new PreorderProductPrice @@ -97,7 +97,7 @@ class PreorderProductController extends mfBaseController { if(!$price_data["start_date"]) { $this->layout()->setFlash("Von-datum fehlt bei Produkt '".$product->name."' für '".$netoperator->getCompanyOrName()."'", "error"); - $this->redirect("PreorderProduct"); + $this->redirect("PreorderProduct","",[], "product-".$netoperator_id."-".$product_id); } else { try { $start_date = new DateTime("@" . $this->dateToTimestamp(trim($price_data["start_date"]))); @@ -105,7 +105,7 @@ class PreorderProductController extends mfBaseController { $price->start_date = $start_date->format("Y-m-d"); } catch(Exception $e) { $this->layout()->setFlash("Fehler im Von-datum bei Produkt '".$product->name."' für '".$netoperator->getCompanyOrName()."'", "error"); - $this->redirect("PreorderProduct"); + $this->redirect("PreorderProduct","",[], "product-".$netoperator_id."-".$product_id); } } if(trim($price_data["end_date"])) { @@ -115,7 +115,7 @@ class PreorderProductController extends mfBaseController { $price->end_date = $end_date->format("Y-m-d"); } catch(Exception $e) { $this->layout()->setFlash("Fehler im Bis-Datum bei Produkt '".$product->name."' für '".$netoperator->getCompanyOrName()."'", "error"); - $this->redirect("PreorderProduct"); + $this->redirect("PreorderProduct","",[], "product-".$netoperator_id."-".$product_id); } } @@ -147,7 +147,7 @@ class PreorderProductController extends mfBaseController { $campaign = new Preordercampaign($campaign_id); if(!$campaign->id) { $this->layout()->setFlash("Ungültige Kampagne bei Produkt '".$product->name."' für '".$netoperator->getCompanyOrName()."'", "error"); - $this->layout()->redirect("PreorderProduct"); + $this->layout()->redirect("PreorderProduct","",[], "product-".$netoperator_id."-".$product_id); } $price_campaign = PreorderProductPriceCampaign::create([ "preorderproductprice_id" => $price->id, @@ -160,7 +160,7 @@ class PreorderProductController extends mfBaseController { } $this->layout()->setFlash("Neue Preise erflgreich gespeichert", "success"); - $this->redirect("PreorderProduct"); + $this->redirect("PreorderProduct","",[], "product-".$netoperator_id."-".$product_id); } } \ No newline at end of file diff --git a/application/User/UserController.php b/application/User/UserController.php index 5d61ef44d..8b7a1a2fb 100644 --- a/application/User/UserController.php +++ b/application/User/UserController.php @@ -242,6 +242,10 @@ class UserController extends mfBaseController $user->permissions->canCpeshipping = "false"; $user->permissions->canVoipnumbering = "false"; $user->permissions->canPreorder = "false"; + $user->permissions->canPreorderpricing = "false"; + $user->permissions->canPreorderpricingReadonly = "false"; + $user->permissions->canPreorderbilling = "false"; + $user->permissions->canPreorderbillingReadonly = "false"; $user->permissions->canOrder = "false"; $user->permissions->canBilling = "false"; $user->permissions->canFibu = "false"; diff --git a/db/migrations/20250225151428_add_preorderbilling_permissions.php b/db/migrations/20250225151428_add_preorderbilling_permissions.php new file mode 100644 index 000000000..a0fcc041a --- /dev/null +++ b/db/migrations/20250225151428_add_preorderbilling_permissions.php @@ -0,0 +1,37 @@ +getEnvironment() == "thetool") { + $table = $this->table("WorkerPermission"); + $table->addColumn("canPreorderpricing", "enum", ["values" => 'false,true', "default" => "false", "after" => "canPreorder"]); + $table->addColumn("canPreorderpricingReadonly", "enum", ["values" => 'false,true', "default" => "false", "after" => "canPreorderpricing"]); + $table->addColumn("canPreorderbilling", "enum", ["values" => 'false,true', "default" => "false", "after" => "canPreorderpricingReadonly"]); + $table->addColumn("canPreorderbillingReadonly", "enum", ["values" => 'false,true', "default" => "false", "after" => "canPreorderbilling"]); + $table->update(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + $this->table("WorkerPermission")->removeColumn("canPreorderpricing")->update(); + $this->table("WorkerPermission")->removeColumn("canPreorderpricingReadonly")->update(); + $this->table("WorkerPermission")->removeColumn("canPreorderbilling")->update(); + $this->table("WorkerPermission")->removeColumn("canPreorderbillingReadonly")->update(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } +} diff --git a/public/assets/css/thetool.css b/public/assets/css/thetool.css index 49edbc532..d15ae87d5 100644 --- a/public/assets/css/thetool.css +++ b/public/assets/css/thetool.css @@ -203,6 +203,10 @@ h1, h2, h3, h4, h5, h6 { border-bottom: 1px solid #eee; } +.submenu .border-top { + border-top: 1px solid #eee !important; +} + .sub-submenu { padding-left: 12px !important; }