Version 5.0.0 beta 3

This commit is contained in:
Neo committed 2025-12-19 16:47:22 -08:00
1 parent f61b0da85d
commit e86153356a
108 files changed
+2927 -1573

No files matched your search

@@ -746,9 +746,10 @@ class Package extends Model
return new Money( $priceOfThisPackage - $priceOfExistingPackage, $currency );
case 2:
if ( !$purchase->renewals )
/* If there are no renewals, we charge full price no matter what */
if ( !$purchase->renewals and !$purchase->expire )
{
return new Money( 0, $currency );
return new Money( $priceOfThisPackage, $currency );
}
if ( !$renewalOptionsOnNewPackage )
{
@@ -757,11 +758,11 @@ class Package extends Model
/* What is the closest renewal option on the new package? We'll use that one */
$renewalOptionsInDays = array();
$term = ( new RenewalTerm( new Money( $renewalOptionsOnNewPackage['cost'][ $currency ]['amount'], $currency ), new DateInterval( 'P' . $renewalOptionsOnNewPackage['term'] . mb_strtoupper( $renewalOptionsOnNewPackage['unit'] ) ), $purchase->renewals->tax ) );
$term = ( new RenewalTerm( new Money( $renewalOptionsOnNewPackage['cost'][ $currency ]['amount'], $currency ), new DateInterval( 'P' . $renewalOptionsOnNewPackage['term'] . mb_strtoupper( $renewalOptionsOnNewPackage['unit'] ) ), $purchase->renewals?->tax ) );
$renewalOptionsInDays[ $term->days() ] = $term;
$closestRenewalOption = null;
$numberOfDaysInCurrentRenewalTerm = $purchase->renewals->days();
$numberOfDaysInCurrentRenewalTerm = $purchase->renewals ? $purchase->renewals->days() : ( $purchase->expire ? $purchase->start->diff( $purchase->expire )->days : 0 );
foreach ( $renewalOptionsInDays as $days => $term )
{
if ( $closestRenewalOption === null or abs( $numberOfDaysInCurrentRenewalTerm - $closestRenewalOption ) > abs( $days - $numberOfDaysInCurrentRenewalTerm ) )
@@ -770,6 +771,7 @@ class Package extends Model
}
}
$renewalTermToUse = $renewalOptionsInDays[ $closestRenewalOption ];
$numberOfDaysInCurrentRenewalTerm = new Number( (string) round( $numberOfDaysInCurrentRenewalTerm ) );
/* If the purchase is not active, it is the full cost */
@@ -779,22 +781,49 @@ class Package extends Model
}
/* Current Period Start Date */
$startOfCurrentPeriod = $purchase->expire->sub( $purchase->renewals->interval );
if( $purchase->expire instanceof DateTime and $purchase->renewals )
{
$startOfCurrentPeriod = $purchase->expire->sub( $purchase->renewals->interval );
}
else
{
/* If the purchase does not expire, we have to do some fun logic here */
$timeSincePurchase = $purchase->start->diff( DateTime::create() );
$daysUsedSincePurchase = new Number( (string)DateTime::intervalToDays( $timeSincePurchase ) );
/* If we used less than a full renewal period, then set the start to the purchase date */
if( $daysUsedSincePurchase->compare( $numberOfDaysInCurrentRenewalTerm ) <= 0 )
{
$startOfCurrentPeriod = $purchase->start;
}
else
{
/* Otherwise loop through all the used intervals */
$start = clone $purchase->start;
while( $daysUsedSincePurchase->compare( $numberOfDaysInCurrentRenewalTerm ) > 0 )
{
$start = $start->add( $purchase->renewals->interval );
$timeSincePurchase = $start->diff( DateTime::create() );
$daysUsedSincePurchase = new Number( (string)DateTime::intervalToDays( $timeSincePurchase ) );
}
$startOfCurrentPeriod = $start;
}
}
/* DateInterval of time between subscription start and now */
$timeSinceStartOfCurrentPeriod = $startOfCurrentPeriod->diff( DateTime::create() );
$numberOfDaysInCurrentRenewalTerm = new Number( (string) round( $numberOfDaysInCurrentRenewalTerm ) );
/* Count Days in Period */
$daysUsedInPeriod = new Number( (string)DateTime::intervalToDays( $timeSinceStartOfCurrentPeriod ) );
$daysRemainingInPeriod = new Number( (string) $numberOfDaysInCurrentRenewalTerm->subtract( $daysUsedInPeriod ) );
/* Currency Worth of value used in current sub */
$valueUsedOfSubscription = $purchase->renewals->cost->amount->divide( $numberOfDaysInCurrentRenewalTerm )->multiply( $daysUsedInPeriod );
$valueUsedOfSubscription = $purchase->renewals ? $purchase->renewals->cost->amount->divide( $numberOfDaysInCurrentRenewalTerm )->multiply( $daysUsedInPeriod ) : new Money( new Number( '0' ), $currency );
/* If there are no days left, charge the full amount */
if ( !$daysRemainingInPeriod->isGreaterThanZero() )
{
return new Money( new Number('0'), $currency );
return new Money( $priceOfThisPackage, $currency );
}
elseif( $priceOfExistingPackage > $priceOfThisPackage )
{
@@ -804,7 +833,21 @@ class Package extends Model
}
else
{
return new Money( $renewalTermToUse->cost->amount->subtract( $valueUsedOfSubscription ), $currency );
/* If we have renewals, then we have a valid value to use */
if( $purchase->renewals )
{
return new Money( $renewalTermToUse->cost->amount->subtract( $valueUsedOfSubscription ), $currency );
}
else
{
/* Otherwise we have to calculate the cost based on how much time is left */
$cost = new Money( $renewalTermToUse->costPerDay()->amount->multiply( $daysRemainingInPeriod ), $currency );
if( $cost->amount->compare( new Number( $priceOfThisPackage ) ) == 1 )
{
$cost = new Money( $priceOfThisPackage, $currency );
}
return $cost;
}
}
}