namespace Galette\Entity;
use ArrayObject;
+use DateInterval;
use DateTime;
use Galette\Core\I18n;
use Galette\Events\GaletteEvent;
// 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
}
$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");
$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
*
{% 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 #}
$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());
+ }
}