瀏覽代碼

mustikas11: lisa emal_liige lehele liikmemaksu saldo + viimane tasumise kpv

D7-s olid need views_aggregator blokid (emal_liikmete_nimekiri_liikmemaksu_saldod,
kande_tyyp=6). D11-s arvutatakse need nüüd mustikas_export moodulis
hook_entity_view_alter-iga:
- Liikmemaksu saldo = SUM(deebet) - SUM(kreedit)
- Viimane tasumise kpv. = MAX(field_date) kus deebet != 0
ardo 1 天之前
父節點
當前提交
41c3f83e49
共有 1 個文件被更改,包括 111 次插入1 次删除
  1. 111 1
      third/drupal/mustikas11/custom_modules/mustikas_export/mustikas_export.module

+ 111 - 1
third/drupal/mustikas11/custom_modules/mustikas_export/mustikas_export.module

@@ -2,12 +2,15 @@
 
 /**
  * @file
- * Parandab views_data_export rea renderdamise Drupal 11 jaoks.
+ * Parandab views_data_export rea renderdamise + views_aggregator expression
+ * funktsiooni Drupal 11 jaoks.
  */
 
 use Drupal\views\Plugin\views\row\Fields;
 use Drupal\views\ResultRow;
 use Drupal\views\ViewExecutable;
+use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\Core\Entity\EntityInterface;
 
 /**
  * Implements hook_views_data_export_row_alter().
@@ -40,3 +43,110 @@ function mustikas_export_views_data_export_row_alter(&$row, ResultRow $result, V
   // DataExport style ootab, et iga rida oleks assoc massiiv väljadest.
   $row = $rendered;
 }
+
+/**
+ * Implements hook_views_aggregation_functions_info().
+ *
+ * Lisab "expression" agregeerimisfunktsiooni: arvutab [a] - [b] summa
+ * (D7 views_aggregator/views_calc analogg, nt liikmemaksu saldo).
+ */
+function mustikas_export_views_aggregation_functions_info() {
+  return [
+    'mustikas_expression_diff' => [
+      'title' => t('Expression (diff)'),
+      'handler' => '_mustikas_expression_diff',
+    ],
+  ];
+}
+
+/**
+ * Arvutab kahe välja vahe summa (agr_par = "field_a|field_b").
+ *
+ * @param array $rows
+ *   Vaate tulemuste read.
+ * @param string $aggr_par
+ *   Parameeter kujul "field_deebet|field_kreedit".
+ *
+ * @return mixed
+ *   Summeeritud vahe väärtus.
+ */
+function _mustikas_expression_diff(array $rows, string $aggr_par = '') {
+  $parts = explode('|', $aggr_par);
+  $a = $parts[0] ?? '';
+  $b = $parts[1] ?? '';
+
+  $total = 0.0;
+  foreach ($rows as $row) {
+    $av = isset($row->{$a}) ? (float) $row->{$a} : 0.0;
+    $bv = isset($row->{$b}) ? (float) $row->{$b} : 0.0;
+    $total += ($av - $bv);
+  }
+  return $total;
+}
+
+/**
+ * Implements hook_entity_view_alter().
+ *
+ * Lisa emal_liige node lehele arvutatud liikmemaksu saldo ja viimane
+ * tasumise kuupäev (D7 views_aggregator blokkide analogg).
+ */
+function mustikas_export_entity_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
+  if ($entity->getEntityTypeId() !== 'node' || $entity->bundle() !== 'emal_liige') {
+    return;
+  }
+
+  $nid = (int) $entity->id();
+  $conn = \Drupal::database();
+
+  // Saldo = SUM(deebet) - SUM(kreedit) kande_tyyp=6 (liikmemaks) kannetel.
+  $saldo = $conn->query(
+    "SELECT
+       COALESCE(SUM(CASE WHEN d.field_deebet_value IS NOT NULL THEN d.field_deebet_value ELSE 0 END), 0) -
+       COALESCE(SUM(CASE WHEN k.field_kreedit_value IS NOT NULL THEN k.field_kreedit_value ELSE 0 END), 0) AS saldo
+     FROM {node__field_kasutaja} kas
+     LEFT JOIN {node__field_deebet} d ON d.entity_id = kas.entity_id AND d.langcode = kas.langcode
+     LEFT JOIN {node__field_kreedit} k ON k.entity_id = kas.entity_id AND k.langcode = kas.langcode
+     WHERE kas.field_kasutaja_target_id = :nid
+       AND EXISTS (SELECT 1 FROM {node__field_kande_tyyp} kt
+                   WHERE kt.entity_id = kas.entity_id AND kt.field_kande_tyyp_target_id = 6)",
+    [':nid' => $nid]
+  )->fetchField();
+
+  // Viimane tasumise kpv = MAX(field_date) kande_tyyp=6 ja deebet != 0.
+  $kpv = $conn->query(
+    "SELECT MAX(fd.field_date_value)
+     FROM {node__field_kasutaja} kas
+     JOIN {node__field_date} fd ON fd.entity_id = kas.entity_id
+     JOIN {node__field_deebet} d ON d.entity_id = kas.entity_id
+     WHERE kas.field_kasutaja_target_id = :nid
+       AND d.field_deebet_value IS NOT NULL AND d.field_deebet_value <> 0
+       AND EXISTS (SELECT 1 FROM {node__field_kande_tyyp} kt
+                   WHERE kt.entity_id = kas.entity_id AND kt.field_kande_tyyp_target_id = 6)",
+    [':nid' => $nid]
+  )->fetchField();
+
+  $items = [];
+  if ($saldo !== NULL && $saldo !== '') {
+    $items[] = [
+      '#type' => 'item',
+      '#title' => t('Liikmemaksu saldo'),
+      '#markup' => number_format((float) $saldo, 2, '.', ''),
+    ];
+  }
+  if ($kpv !== NULL && $kpv !== '') {
+    $items[] = [
+      '#type' => 'item',
+      '#title' => t('Viimane tasumise kpv.'),
+      '#markup' => \Drupal::service('date.formatter')->format(strtotime($kpv), 'custom', 'd.m.Y'),
+    ];
+  }
+
+  if (!empty($items)) {
+    $build['liikmemaks'] = [
+      '#type' => 'container',
+      '#weight' => 50,
+      '#attributes' => ['class' => ['liikmemaks-saldo']],
+      'items' => $items,
+    ];
+  }
+}