Version 5.0.0 beta 3
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user