Source of file OrderStatusLog.php
Size: 14,589 Bytes - Last Modified: 2021-12-23T10:39:35+00:00
/var/www/docs.ssmods.com/process/src/src/Model/Process/OrderStatusLog.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 | <?php namespace Sunnysideup\Ecommerce\Model\Process; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\HiddenField; use SilverStripe\Forms\NumericField; use SilverStripe\Forms\ReadonlyField; use SilverStripe\ORM\DataObject; use SilverStripe\Security\Member; use SilverStripe\Security\Permission; use SilverStripe\Security\Security; use Sunnysideup\CmsEditLinkField\Api\CMSEditLinkAPI; use Sunnysideup\CmsEditLinkField\Forms\Fields\CMSEditLinkField; use Sunnysideup\Ecommerce\Config\EcommerceConfig; use Sunnysideup\Ecommerce\Forms\Fields\EcommerceClassNameOrTypeDropdownField; use Sunnysideup\Ecommerce\Interfaces\EditableEcommerceObject; use Sunnysideup\Ecommerce\Model\Extensions\EcommerceRole; use Sunnysideup\Ecommerce\Model\Order; use Sunnysideup\Ecommerce\Model\Process\OrderStatusLogs\OrderStatusLogSubmitted; use Sunnysideup\Ecommerce\Tasks\EcommerceTaskDebugCart; use Sunnysideup\Ecommerce\Traits\OrderCached; /** * @description: see OrderStep.md * * @authors: Nicolaas [at] Sunny Side Up .co.nz * @package: ecommerce * @sub-package: model */ class OrderStatusLog extends DataObject implements EditableEcommerceObject { use OrderCached; /** * @var array */ private static $available_log_classes_array = []; /** * @var string */ private static $order_status_log_class_used_for_submitting_order = OrderStatusLogSubmitted::class; /** * standard SS variable. * * @var string */ private static $table_name = 'OrderStatusLog'; private static $db = [ 'Title' => 'Varchar(100)', 'Note' => 'HTMLText', 'InternalUseOnly' => 'Boolean', ]; /** * standard SS variable. * * @var array */ private static $has_one = [ 'Author' => Member::class, 'Order' => Order::class, ]; /** * standard SS variable. * * @var array */ private static $casting = [ 'CustomerNote' => 'HTMLText', 'Type' => 'Varchar', 'InternalUseOnlyNice' => 'Varchar', ]; /** * standard SS variable. * * @var array */ private static $summary_fields = [ 'Created' => 'Date', 'Order.Title' => 'Order', 'Type' => 'Type', 'Title' => 'Title', 'InternalUseOnlyNice' => 'Internal use only', ]; /** * standard SS variable. * * @var array */ private static $defaults = [ 'InternalUseOnly' => true, ]; /** * standard SS variable. * * @var array */ private static $searchable_fields = [ 'OrderID' => [ 'field' => NumericField::class, 'title' => 'Order Number', ], 'ClassName' => [ 'title' => 'Type', 'filter' => 'ExactMatchFilter', ], 'Title' => 'PartialMatchFilter', 'Note' => 'PartialMatchFilter', ]; /** * standard SS variable. * * @var string */ private static $singular_name = 'Order Log Entry'; /** * standard SS variable. * * @var string */ private static $plural_name = 'Order Log Entries'; /** * Standard SS variable. * * @var string */ private static $description = 'A record of anything that happened with an order.'; /** * standard SS variable. * * @var array */ private static $default_sort = [ 'ID' => 'DESC', ]; private static $indexes = [ 'Title' => true, 'InternalUseOnly' => true, ]; /** * casted method. * * @return string */ public function InternalUseOnlyNice() { return $this->getInternalUseOnlyNice(); } public function getInternalUseOnlyNice() { if ($this->InternalUseOnly) { return _t('OrderStatusLog.YES', 'Yes'); } return _t('OrderStatusLog.No', 'No'); } /** * Standard SS method. * * @param \SilverStripe\Security\Member $member * @param mixed $context * * @return bool */ public function canCreate($member = null, $context = []) { if (! $member) { $member = Security::getCurrentUser(); } $extended = $this->extendedCan(__FUNCTION__, $member); if (null !== $extended) { return $extended; } if (Permission::checkMember($member, Config::inst()->get(EcommerceRole::class, 'admin_permission_code'))) { return true; } //is the member is a shop assistant they can always view it if (EcommerceRole::current_member_is_shop_assistant($member)) { return true; } return parent::canEdit($member); } /** * Standard SS method. * * @param \SilverStripe\Security\Member $member * @param mixed $context * * @return bool */ public function canView($member = null, $context = []) { if (! $member) { $member = Security::getCurrentUser(); } $extended = $this->extendedCan(__FUNCTION__, $member); if (null !== $extended) { return $extended; } if (Permission::checkMember($member, Config::inst()->get(EcommerceRole::class, 'admin_permission_code'))) { return true; } //is the member is a shop assistant they can always view it if (EcommerceRole::current_member_is_shop_assistant($member)) { return true; } if ($this->InternalUseOnly) { //only Shop Administrators can see it ... return false; } $order = $this->getOrderCached(); if ($order && $order->canView($member)) { return true; } return parent::canView($member); } /** * Standard SS method. * * @param \SilverStripe\Security\Member $member * @param mixed $context * * @return bool */ public function canEdit($member = null, $context = []) { if (! $member) { $member = Security::getCurrentUser(); } $extended = $this->extendedCan(__FUNCTION__, $member); if (null !== $extended) { return $extended; } $order = $this->getOrderCached(); if ($order) { //Order Status Logs are so basic, anyone can edit them if (OrderStatusLog::class === $this->ClassName) { return $order->canView($member); } if (Permission::checkMember($member, Config::inst()->get(EcommerceRole::class, 'admin_permission_code'))) { return $order->canEdit($member); } } return false; } /** * Standard SS method * logs can never be deleted... * * @param \SilverStripe\Security\Member $member * * @return bool */ public function canDelete($member = null) { if (! $member) { $member = Security::getCurrentUser(); } $extended = $this->extendedCan(__FUNCTION__, $member); if (null !== $extended) { return $extended; } return false; } public function i18n_singular_name() { return _t('OrderStatusLog.ORDERLOGENTRY', 'Order Log Entry'); } public function i18n_plural_name() { return _t('OrderStatusLog.ORDERLOGENTRIES', 'Order Log Entries'); } /** * standard SS method. */ public function populateDefaults() { if (Security::database_is_ready()) { $this->AuthorID = Member::currentUserID(); } return parent::populateDefaults(); } /** * @return \SilverStripe\Forms\FieldList */ public function getCMSFields() { $fields = parent::getCMSFields(); $fields->dataFieldByName('Note')->setRows(3); $fields->dataFieldByName('Title')->setTitle('Subject'); $fields->addFieldToTab( 'Root.Main', DropdownField::create( 'AuthorID', _t('OrderStatusLog.AUTHOR', 'Author'), EcommerceRole::list_of_admins(true) ) ); if ($this->AuthorID) { if ($this->Author() && $this->Author()->exists()) { $fields->addFieldToTab( 'Root.Main', $fields->dataFieldByName('AuthorID')->performReadonlyTransformation() ); } } //OrderID Field if ($this->exists() && $this->OrderID) { $order = $this->getOrderCached(); if ($order && $order->exists()) { $fields->removeByName('OrderID'); $fields->addFieldToTab( 'Root.Main', CMSEditLinkField::create( 'OrderID', $order->singular_name(), $order ) ); } } //ClassName Field $availableLogs = EcommerceConfig::get(OrderStatusLog::class, 'available_log_classes_array'); $availableLogs = array_merge($availableLogs, [EcommerceConfig::get(OrderStatusLog::class, 'order_status_log_class_used_for_submitting_order')]); $availableLogsAssociative = []; foreach ($availableLogs as $className) { $availableLogsAssociative[$className] = Injector::inst()->get($className)->singular_name(); } $title = _t('OrderStatusLog.TYPE', 'Type'); if (($this->exists() || $this->limitedToOneClassName()) && $this->ClassName && isset($availableLogsAssociative[$this->ClassName]) ) { $fields->removeByName('ClassName'); $fields->addFieldsToTab( 'Root.Main', [ HiddenField::create('ClassName'), ReadonlyField::create( 'ClassNameTitle', $title, $availableLogsAssociative[$this->ClassName] ), ], 'Title' ); } else { $ecommerceClassNameOrTypeDropdownField = EcommerceClassNameOrTypeDropdownField::create( 'ClassName', _t('OrderStatusLog.TYPE', 'Type'), OrderStatusLog::class, $availableLogsAssociative ); $ecommerceClassNameOrTypeDropdownField->setIncludeBaseClass(true); $fields->addFieldToTab('Root.Main', $ecommerceClassNameOrTypeDropdownField, 'Title'); } $fields->replaceField( 'OrderID', CMSEditLinkField::create( 'OrderID', Injector::inst()->get(Order::class)->singular_name(), $this->getOrderCached() ) ); return $fields; } /** * link to edit the record. * * @param null|string $action - e.g. edit * * @return string */ public function CMSEditLink($action = null) { return CMSEditLinkAPI::find_edit_link_for_object($this, $action); } /** * @return string */ public function Type() { return $this->getType(); } public function getType() { return $this->i18n_singular_name(); } /** * Determine which properties on the DataObject are * searchable, and map them to their default {@link FormField} * representations. Used for scaffolding a searchform for {@link ModelAdmin}. * * Some additional logic is included for switching field labels, based on * how generic or specific the field type is. * * Used by {@link SearchContext}. * * @param array $_params * 'fieldClasses': Associative array of field names as keys and FormField classes as values * 'restrictFields': Numeric array of a field name whitelist * * @return \SilverStripe\Forms\FieldList */ public function scaffoldSearchFields($_params = null) { $fields = parent::scaffoldSearchFields($_params); $fields->replaceField('OrderID', NumericField::create('OrderID', 'Order Number')); $availableLogs = EcommerceConfig::get(OrderStatusLog::class, 'available_log_classes_array'); $availableLogs = array_merge($availableLogs, [EcommerceConfig::get(OrderStatusLog::class, 'order_status_log_class_used_for_submitting_order')]); $ecommerceClassNameOrTypeDropdownField = EcommerceClassNameOrTypeDropdownField::create('ClassName', 'Type', OrderStatusLog::class, $availableLogs); $ecommerceClassNameOrTypeDropdownField->setIncludeBaseClass(true); $fields->replaceField('ClassName', $ecommerceClassNameOrTypeDropdownField); return $fields; } /** * @return string */ public function CustomerNote() { return $this->getCustomerNote(); } public function getCustomerNote() { return $this->Note; } /** * Debug helper method. * Can be called from /shoppingcart/debug/. * * @return string */ public function debug() { return EcommerceTaskDebugCart::debug_object($this); } /** * standard SS method. */ protected function onBeforeWrite() { parent::onBeforeWrite(); //START HACK TO PREVENT LOSS OF ORDERID CAUSED BY COMPLEX TABLE FIELDS.... // THIS MEANS THAT A LOG CAN NEVER SWITCH FROM ONE ORDER TO ANOTHER... if ($this->exists()) { $orderID = $this->getField('OrderID'); if ($orderID) { $this->OrderID = $orderID; } } //END HACK TO PREVENT LOSS if (! $this->AuthorID) { $member = Security::getCurrentUser(); if ($member) { $this->AuthorID = $member->ID; } } if (! $this->Title) { $this->Title = _t('OrderStatusLog.ORDERUPDATE', 'Order Update'); } } /** * when being created, can the user choose the type of log? * * @return bool */ protected function limitedToOneClassName() { return OrderStatusLog::class !== $this->ClassName; } } |