]> git.agnieray.net Git - galette.git/commitdiff
Identify donators in list
authorManuel <42542452+manuelh78@users.noreply.github.com>
Fri, 8 Mar 2024 11:52:59 +0000 (12:52 +0100)
committerJohan Cwiklinski <johan@x-tnd.be>
Thu, 4 Apr 2024 10:04:59 +0000 (12:04 +0200)
closes #1792

galette/lib/Galette/Entity/Adherent.php
galette/templates/default/pages/members_list.html.twig
tests/Galette/Entity/tests/units/Adherent.php

index 89432ce97daf4833ff858e7d0b05c3802172a535..074ed0340ed86643da654e6eb8d42b9a1ac438ae 100644 (file)
@@ -22,6 +22,7 @@
 namespace Galette\Entity;
 
 use ArrayObject;
+use DateInterval;
 use DateTime;
 use Galette\Core\I18n;
 use Galette\Events\GaletteEvent;
@@ -549,7 +550,7 @@ class Adherent
                 // To count the days remaining, the next begin date is required.
                 $due_date = new DateTime($this->due_date);
                 $next_begin_date = clone $due_date;
-                $next_begin_date->add(new \DateInterval('P1D'));
+                $next_begin_date->add(new DateInterval('P1D'));
                 $date_diff = $now->diff($next_begin_date);
                 $this->days_remaining = $date_diff->days;
                 // Active
@@ -796,7 +797,7 @@ class Adherent
         }
         $due_date = new DateTime($this->due_date);
         $next_begin_date = clone $due_date;
-        $next_begin_date->add(new \DateInterval('P1D'));
+        $next_begin_date->add(new DateInterval('P1D'));
         $date_diff = $now->diff($next_begin_date);
         if ($this->isDueFree()) {
             $ret = _T("Freed of dues");
@@ -857,9 +858,65 @@ class Adherent
                 $ret = _T("No longer member");
             }
         }
+
         return $ret;
     }
 
+    /**
+     * Is member a sponsor for current period?
+     *
+     * @return bool
+     */
+    public function isSponsor(): bool
+    {
+        global $preferences;
+
+        $date_now = new DateTime();
+
+        //calculate begin date of period
+        if ($preferences->pref_beg_membership != '') { //classical membership date + 1 year
+            list($j, $m) = explode('/', $preferences->pref_beg_membership);
+            $sdate = new DateTime($date_now->format('Y') . '-' . $m . '-' . $j);
+        } elseif ($preferences->pref_membership_ext != '') { //classical membership date + N months
+            $dext = new DateInterval('P' . $preferences->pref_membership_ext . 'M');
+            $sdate = $date_now->sub($dext);
+        } else {
+            throw new \RuntimeException(
+                'Unable to define sponsoring start date; none of pref_beg_membership nor pref_membership_ext are defined!'
+            );
+        }
+
+        //date_debut_cotis because member can ask for his donation ot be recorded for next year
+        $select = $this->zdb->select(Contribution::TABLE, 'c');
+        $select
+            ->columns(
+                array(
+                    'count' => new Expression('COUNT(*)')
+                )
+            )
+            ->join(
+                array(
+                    'ct' => PREFIX_DB . ContributionsTypes::TABLE),
+                'c.' . ContributionsTypes::PK . '=ct.' . ContributionsTypes::PK,
+                array()
+            )
+            ->where(
+                [
+                    'id_adh' => $this->id,
+                    'cotis_extension' => 0 //donations only
+                ]
+            )
+            ->where->greaterThanOrEqualTo(
+                'date_debut_cotis',
+                $sdate->format('Y-m-d')
+            );
+
+        $results = $this->zdb->execute($select);
+        $result = $results->current();
+
+        return (int)$result->count > 0;
+    }
+
     /**
      * Retrieve Full name and surname for the specified member id
      *
index ac440a8062e7c6fe9e6ebf03904b6382fafa7cc2..1dde438cfd936fc1b7297b5d14f8bed13845b89b 100644 (file)
                 {% set value = member.sdue_free %}
             {% elseif column.field_id == 'sexe_adh' %}
                 {% set value = member.sgender %}
+            {% elseif propname == 'contribstatus' %}
+                {%  if member.isSponsor() %}
+                    {% set value = '<i class="donate green icon tooltip" title="' ~ _T("Is a sponsor") ~ '"></i>' %}
+                {% else %}
+                    {% set value = '<i class="ui icon" aria-hidden="true"></i>' %}
+                {% endif %}
+                {% set value = value ~ member.contribstatus %}
+                {% set escaped = true %}
             {% endif %}
 
             {# If value has not been set, take the generic value #}
index 86482a9f9689107d1a122ad4d78ddf6f88ab23f8..816e23fac0265631ec9da97fa1f8aa8fd5ef8b68 100644 (file)
@@ -903,4 +903,62 @@ class Adherent extends GaletteTestCase
         $delete->where(['info_cotis' => 'FAKER' . $this->seed]);
         $this->zdb->execute($delete);
     }
+
+    /**
+     * Test isSponsor
+     *
+     * @return void
+     */
+    public function testIsSponsor(): void
+    {
+        $now = new \DateTime();
+        $member = new \Galette\Entity\Adherent($this->zdb);
+        $this->assertSame(\Galette\Entity\Contribution::STATUS_UNKNOWN, $member->getDueStatus());
+
+        $this->getMemberOne();
+
+        $this->assertTrue($this->adh->isActive());
+        $this->assertFalse($this->adh->isSponsor());
+        $this->assertSame(\Galette\Entity\Contribution::STATUS_NEVER, $this->adh->getDueStatus());
+
+        //create a close to be expired contribution
+        $due_date = clone $now;
+        $due_date->add(new \DateInterval('P30D'));
+        $begin_date = clone $due_date;
+        $begin_date->add(new \DateInterval('P1D'));
+        $begin_date->sub(new \DateInterval('P1Y'));
+
+        $this->cleanContributions();
+        $this->createContrib([
+            'id_adh'                => $this->adh->id,
+            'id_type_cotis'         => 3,
+            'montant_cotis'         => '111',
+            'type_paiement_cotis'   => '6',
+            'info_cotis'            => 'FAKER' . $this->seed,
+            'date_fin_cotis'        => $due_date->format('Y-m-d'),
+            'date_enreg'            => $begin_date->format('Y-m-d'),
+            'date_debut_cotis'      => $begin_date->format('Y-m-d')
+        ]);
+
+        //member is up-to-date, close to be expired - still not sponsor
+        $this->assertTrue($this->adh->load($this->adh->id));
+        $this->assertTrue($this->adh->isActive());
+        $this->assertTrue($this->adh->isUp2Date());
+        $this->assertSame(\Galette\Entity\Contribution::STATUS_IMPENDING, $this->adh->getDueStatus());
+        $this->assertFalse($this->adh->isSponsor());
+
+        //create a donation
+        $this->createContrib([
+            'id_adh'                => $this->adh->id,
+            'id_type_cotis'         => 5, //donation in money
+            'montant_cotis'         => '10',
+            'type_paiement_cotis'   => '6',
+            'info_cotis'            => 'FAKER' . $this->seed,
+            'date_enreg'            => $begin_date->format('Y-m-d'),
+            'date_debut_cotis'      => $begin_date->format('Y-m-d')
+        ]);
+
+        $this->assertTrue($this->adh->load($this->adh->id));
+        $this->assertTrue($this->adh->isSponsor());
+    }
 }