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