From a895c1f2826387e3d397cc66ea52288d14a9105b Mon Sep 17 00:00:00 2001 From: Makreig Date: Fri, 23 Nov 2018 13:45:06 +0000 Subject: [PATCH] major progress --- _config/config.yml | 10 ++++- src/Control/StockController.php | 6 ++- src/Extensions/CatalogueAdminExtension.php | 51 ++++++++++++++++++++++ src/Extensions/CheckoutExtension.php | 15 ------- src/Extensions/InvoiceExtension.php | 36 +++++++++++++++ src/Extensions/LineItemExtension.php | 38 ++++++++++++++++ src/Extensions/ProductExtension.php | 10 ++--- 7 files changed, 142 insertions(+), 24 deletions(-) create mode 100644 src/Extensions/CatalogueAdminExtension.php delete mode 100644 src/Extensions/CheckoutExtension.php create mode 100644 src/Extensions/InvoiceExtension.php create mode 100644 src/Extensions/LineItemExtension.php diff --git a/_config/config.yml b/_config/config.yml index d50ca7c..8295761 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -5,6 +5,12 @@ Name: stockconfig SilverCommerce\CatalogueAdmin\Model\CatalogueProduct: extensions: - SilverCommerce\Stock\Extensions\ProductExtension -SilverCommerce\Checkout\Control\Checkout: +SilverCommerce\OrdersAdmin\Model\LineItem: extensions: - - SilverCommerce\Stock\Extensions\CheckoutExtension + - SilverCommerce\Stock\Extensions\LineItemExtension +SilverCommerce\OrdersAdmin\Model\Invoice: + extensions: + - SilverCommerce\Stock\Extensions\InvoiceExtension +SilverCommerce\CatalogueAdmin\Admin\CatalogueAdmin: + extensions: + - SilverCommerce\Stock\Extensions\CatalogueAdminExtension diff --git a/src/Control/StockController.php b/src/Control/StockController.php index 5bb9069..98dbaa4 100644 --- a/src/Control/StockController.php +++ b/src/Control/StockController.php @@ -24,8 +24,7 @@ class StockController extends Controller public function reduceStock($item, $quantity) { $item->StockLevel -= $quantity; - if ($item->StockLevel < 0) { - $item->StockLevel = 0; + if ($item->StockLevel < 0 && $this->email_alerts) { $this->alertOversold($item); } $item->write(); @@ -35,13 +34,16 @@ public function reduceStock($item, $quantity) } } + /** ### TO DO ### **/ ################################################################# public function alertOversold($item) { // send email alerting stocklevel mismatch + return null; } public function alertLowStock($item) { // send email alerting low stock level + return null; } } \ No newline at end of file diff --git a/src/Extensions/CatalogueAdminExtension.php b/src/Extensions/CatalogueAdminExtension.php new file mode 100644 index 0000000..52982e8 --- /dev/null +++ b/src/Extensions/CatalogueAdminExtension.php @@ -0,0 +1,51 @@ +Fields(); + $grid = $fields + ->fieldByName($this->sanitiseClassName($this->owner->modelClass)); + if ($this->owner->modelClass == Product::class && $grid) { + $config = $grid->getConfig(); + $alerts = [ + 'isStockLow' => [ + 'comparator' => 'equal', + 'patterns' => [ + true => [ + 'status' => 'info', + 'message' => 'This product is low on stock' + ] + ] + ], + 'StockLevel' => [ + 'comparator' => 'lessorequal', + 'patterns' => [ + 0 => [ + 'status' => 'error', + 'message' => 'This product is out of stock' + ] + ] + ] + ]; + $config->addComponent(new GridFieldRecordHighlighter($alerts)); + } + } + /** + * Sanitise a model class' name for inclusion in a link + * + * @param string $class + * @return string + */ + protected function sanitiseClassName($class) + { + return str_replace('\\', '-', $class); + } +} \ No newline at end of file diff --git a/src/Extensions/CheckoutExtension.php b/src/Extensions/CheckoutExtension.php deleted file mode 100644 index 91d5348..0000000 --- a/src/Extensions/CheckoutExtension.php +++ /dev/null @@ -1,15 +0,0 @@ -owner->isChanged('Status')) { + $statuses = $this->owner->config()->get("paid_statuses"); + $changed = $this->owner->getChangedFields()['Status']; + $old = $changed['before']; + $new = $changed['after']; + if (!in_array($old, $statuses) && in_array($new, $statuses)) { + $items = $this->owner->Items(); + foreach ($items as $item) { + $match = $item->FindStockItem(); + if ($match && $match->Stocked) { + if ($item->checkStockLevel($item->Quantity) < 0) { + throw new ValidationException(_t( + "ShoppingCart.NotEnoughStock", + "There are not enough '{title}' in stock", + ['title' => $match->Title] + )); + } + $match->StockLevel -= $item->Quantity; + $match->write(); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/Extensions/LineItemExtension.php b/src/Extensions/LineItemExtension.php new file mode 100644 index 0000000..1ac5647 --- /dev/null +++ b/src/Extensions/LineItemExtension.php @@ -0,0 +1,38 @@ +owner->FindStockItem(); + $parent = $this->owner->Parent(); + if ($match && $match->Stocked && $parent instanceof Invoice && $parent->isPaid()) { + $qty = 0; + $old = 0; + if (!$this->owner->ID) { + $qty = $this->owner->Quantity; + } else if ($this->owner->isChanged('Quantity')) { + $changed = $this->owner->getChangedFields()['Quantity']; + $old = $changed['before']; + $new = $changed['after']; + $qty = $new - $old; + } + if ($qty > 0 && $this->owner->checkStockLevel($qty) < 0) { + $this->owner->Quantity = $old + $match->StockLevel; + throw new ValidationException(_t( + "ShoppingCart.NotEnoughStock", + "There are not enough '{title}' in stock", + ['title' => $match->Title] + )); + } + $match->StockLevel -= $qty; + $match->write(); + } + } +} \ No newline at end of file diff --git a/src/Extensions/ProductExtension.php b/src/Extensions/ProductExtension.php index cd1caf6..1caa0f7 100644 --- a/src/Extensions/ProductExtension.php +++ b/src/Extensions/ProductExtension.php @@ -41,10 +41,10 @@ public function updateCMSFields(FieldList $fields) */ public function isStockLow() { - if ($this->Stocked) { - return $stock = $this->StockLevel < $this->LowStock ? true : false; + if ($this->owner->Stocked) { + return $stock = $this->owner->StockLevel < $this->owner->LowStock ? true : false; } - return true; + return false; } /** @@ -55,8 +55,8 @@ public function isStockLow() */ public function checkStockLevel($qty = 0) { - if ($this->Stocked) { - return $this->StockLevel - $qty; + if ($this->owner->Stocked) { + return $this->owner->StockLevel - $qty; } return true; }