From f6e5cf957ec4bc524aae0e2fe34cd59a6c21b317 Mon Sep 17 00:00:00 2001 From: s j <sj@1729.be> Date: Fri, 26 Mar 2021 09:51:24 +0100 Subject: [PATCH] i5935 use share entity to compute share total value --- shareholder_register.install | 15 +++++++++++++ shareholder_register.module | 7 ++++++ src/Entity/ShareTransaction.php | 19 ++++++++++++++++ .../FieldType/ShareTotalValueItemList.php | 22 ++++++++++++++++--- ...ShareholderRegisterViewShareTotalValue.php | 4 +++- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/shareholder_register.install b/shareholder_register.install index 3d5b633f..c0f36751 100644 --- a/shareholder_register.install +++ b/shareholder_register.install @@ -188,3 +188,18 @@ function shareholder_register_update_8011(&$sandbox) { $role->save(TRUE); } } + +/** + * Add total value field to share_transaction. + */ +function shareholder_register_update_8012(&$sandbox) { + $fieldManager = \Drupal::service('entity_field.manager'); + + $field = $fieldManager->getBaseFieldDefinitions('share_transaction')['share_total_value']; + \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition( + $field->getName(), + $field->getTargetEntityTypeId(), + $field->getProvider(), + $field->getFieldStorageDefinition() + ); +} diff --git a/shareholder_register.module b/shareholder_register.module index a8c9139e..efd19ef5 100644 --- a/shareholder_register.module +++ b/shareholder_register.module @@ -213,6 +213,13 @@ function shareholder_register_views_data_alter(array &$data) { 'id' => 'shareholder_register_view_number_string', ], ]; + + $data['share_transaction']['shares_total_value'] = [ + 'title' => t('Share Total Value'), + 'field' => [ + 'id' => 'shareholder_register_view_share_total_value', + ], + ]; } } /** diff --git a/src/Entity/ShareTransaction.php b/src/Entity/ShareTransaction.php index 0b91d1e3..53e8faca 100644 --- a/src/Entity/ShareTransaction.php +++ b/src/Entity/ShareTransaction.php @@ -16,6 +16,8 @@ use Drupal\shareholder_register\Exception\ShareTransactionNegativeShareCountExce use Drupal\shareholder_register\Exception\ShareTransactionNegativeShareCountAtDateException; use Drupal\shareholder_register\Event\ShareTransactionEvent; +use Drupal\shareholder_register\Plugin\Field\FieldType\ShareTotalValueItemList; + /** * Defines the Share transaction entity. * @@ -297,6 +299,13 @@ class ShareTransaction extends ContentEntityBase implements ShareTransactionInte return $this->get('shares')->referencedEntities(); } + /** + * {@inheritdoc} + */ + public function getShareTotalValue() { + return $this->get('share_total_value')->value; + } + /** * {@inheritdoc} */ @@ -644,6 +653,16 @@ class ShareTransaction extends ContentEntityBase implements ShareTransactionInte ->setDisplayConfigurable('form', TRUE) ->setDisplayConfigurable('view', TRUE); + $fields['share_total_value'] = BaseFieldDefinition::create('decimal') + ->setLabel(t('Share Total Value')) + ->setComputed(TRUE) + ->setClass(ShareTotalValueItemList::class) + ->setDisplayConfigurable('view', TRUE) + ->setDisplayOptions('view', [ + 'label' => 'above', + 'weight' => 10, + ]); + $fields['notes'] = BaseFieldDefinition::create('text_long') ->setLabel(t('Notes')) ->setDescription(t('Notes for this transaction')) diff --git a/src/Plugin/Field/FieldType/ShareTotalValueItemList.php b/src/Plugin/Field/FieldType/ShareTotalValueItemList.php index f0992fe2..0d1cb6e1 100644 --- a/src/Plugin/Field/FieldType/ShareTotalValueItemList.php +++ b/src/Plugin/Field/FieldType/ShareTotalValueItemList.php @@ -6,6 +6,7 @@ use Drupal\Core\Field\FieldItemList; use Drupal\Core\TypedData\ComputedItemListTrait; use Drupal\shareholder_register\Entity\ShareholderInterface; +use Drupal\shareholder_register\Entity\ShareTransactionInterface; use Drupal\shareholder_register\Entity\ShareTypeInterface; /** @@ -24,23 +25,38 @@ class ShareTotalValueItemList extends FieldItemList { if (!$entity->isNew()) { $value = 0; if ($entity instanceof ShareholderInterface) { + $share_ids = $entity->getShareIdsAtDate(); + if (!count($share_ids)) { + $computed_values[0] = 0; + return; + } + $connection = \Drupal::database(); $r = $connection->query( - "SELECT SUM(quantity * share_value) AS value FROM {share_transaction} WHERE state = 'valid' AND shareholder_id = :shareholder", + "SELECT SUM(share_value + issue_premium) AS value FROM {share} WHERE state = 'issued' AND id in (:share_ids[])", [ - ':shareholder' => $entity->id(), + ':share_ids[]' => $share_ids, ]); $computed_values[0] = $r->fetchAssoc()['value']; } elseif ($entity instanceof ShareTypeInterface) { $connection = \Drupal::database(); $r = $connection->query( - "SELECT SUM(quantity * share_value) AS value FROM {share_transaction} WHERE state = 'valid' AND share_type_id = :share_type", + "SELECT SUM(share_value + issue_premium) AS value FROM {share} WHERE state = 'issued' AND share_type_id = :share_type", [ ':share_type' => $entity->id(), ]); $computed_values[0] = $r->fetchAssoc()['value']; } + elseif ($entity instanceof ShareTransactionInterface) { + $connection = \Drupal::database(); + $r = $connection->query( + "SELECT SUM(share_value + issue_premium) AS value FROM {share__share_transaction_ids} INNER JOIN {share} ON (entity_id = {share}.id) WHERE share_transaction_ids_target_id = :share_transaction_id", + [ + ':share_transaction_id' => $entity->id(), + ]); + $computed_values[0] = $r->fetchAssoc()['value']; + } } foreach ($computed_values as $delta => $value) { diff --git a/src/Plugin/views/field/ShareholderRegisterViewShareTotalValue.php b/src/Plugin/views/field/ShareholderRegisterViewShareTotalValue.php index b5e38429..25c664ee 100644 --- a/src/Plugin/views/field/ShareholderRegisterViewShareTotalValue.php +++ b/src/Plugin/views/field/ShareholderRegisterViewShareTotalValue.php @@ -18,7 +18,9 @@ class ShareholderRegisterViewShareTotalValue extends FieldPluginBase { * {@inheritdoc} */ public function render(ResultRow $values) { - if (get_class($values->_entity) == 'Drupal\shareholder_register\Entity\Shareholder' || get_class($values->_entity) == 'Drupal\shareholder_register\Entity\ShareType') { + if (get_class($values->_entity) == 'Drupal\shareholder_register\Entity\Shareholder' || + get_class($values->_entity) == 'Drupal\shareholder_register\Entity\ShareTransaction' || + get_class($values->_entity) == 'Drupal\shareholder_register\Entity\ShareType') { return $values->_entity->getShareTotalValue(); } return ''; -- GitLab