mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-31 05:14:36 -04:00
refund subscriptions in cancellation window
This commit is contained in:
parent
7c8bf53951
commit
0b1569d6d9
@ -671,6 +671,8 @@ class PaymentController extends BaseController
|
|||||||
{
|
{
|
||||||
$payment = $request->payment();
|
$payment = $request->payment();
|
||||||
|
|
||||||
|
// nlog($request->all());
|
||||||
|
|
||||||
$payment = $payment->refund($request->all());
|
$payment = $payment->refund($request->all());
|
||||||
|
|
||||||
return $this->itemResponse($payment);
|
return $this->itemResponse($payment);
|
||||||
|
@ -25,7 +25,7 @@ class RecurringInvoiceCancellation extends Component
|
|||||||
public function processCancellation()
|
public function processCancellation()
|
||||||
{
|
{
|
||||||
if ($this->invoice->subscription) {
|
if ($this->invoice->subscription) {
|
||||||
return $this->invoice->subscription->service()->handleCancellation();
|
return $this->invoice->subscription->service()->handleCancellation($this->invoice);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('client.recurring_invoices.request_cancellation', ['recurring_invoice' => $this->invoice->hashed_id]);
|
return redirect()->route('client.recurring_invoices.request_cancellation', ['recurring_invoice' => $this->invoice->hashed_id]);
|
||||||
|
@ -347,29 +347,13 @@ class SubscriptionService
|
|||||||
|
|
||||||
$credit = $this->createCredit($pro_rata_refund_amount, $last_invoice, $target_subscription, $old_subscription);
|
$credit = $this->createCredit($pro_rata_refund_amount, $last_invoice, $target_subscription, $old_subscription);
|
||||||
|
|
||||||
///////////////////////////
|
$new_recurring_invoice = $this->createNewRecurringInvoice($recurring_invoice);
|
||||||
$old_subscription_recurring_invoice = $recurring_invoice;
|
|
||||||
$old_subscription_recurring_invoice->service()->stop()->save();
|
|
||||||
|
|
||||||
$recurring_invoice_repo = new RecurringInvoiceRepository();
|
|
||||||
$recurring_invoice_repo->archive($old_subscription_recurring_invoice);
|
|
||||||
|
|
||||||
$recurring_invoice = $this->convertInvoiceToRecurring($recurring_invoice->client_id);
|
|
||||||
$recurring_invoice = $recurring_invoice_repo->save([], $recurring_invoice);
|
|
||||||
$recurring_invoice->next_send_date = now();
|
|
||||||
$recurring_invoice->next_send_date = $recurring_invoice->nextSendDate();
|
|
||||||
|
|
||||||
/* Start the recurring service */
|
|
||||||
$recurring_invoice->service()
|
|
||||||
->start()
|
|
||||||
->save();
|
|
||||||
////////////////////////////
|
|
||||||
|
|
||||||
$context = [
|
$context = [
|
||||||
'context' => 'change_plan',
|
'context' => 'change_plan',
|
||||||
'recurring_invoice' => $recurring_invoice->hashed_id,
|
'recurring_invoice' => $new_recurring_invoice->hashed_id,
|
||||||
'credit' => $credit->hashed_id,
|
'credit' => $credit->hashed_id,
|
||||||
'client' => $recurring_invoice->client->hashed_id,
|
'client' => $new_recurring_invoice->client->hashed_id,
|
||||||
'subscription' => $target_subscription->hashed_id,
|
'subscription' => $target_subscription->hashed_id,
|
||||||
'contact' => auth('contact')->user()->hashed_id,
|
'contact' => auth('contact')->user()->hashed_id,
|
||||||
];
|
];
|
||||||
@ -424,26 +408,10 @@ class SubscriptionService
|
|||||||
*/
|
*/
|
||||||
private function handlePlanChange($payment_hash)
|
private function handlePlanChange($payment_hash)
|
||||||
{
|
{
|
||||||
|
|
||||||
//payment has been made.
|
|
||||||
//
|
|
||||||
//new subscription starts today - delete old recurring invoice.
|
|
||||||
|
|
||||||
$old_subscription_recurring_invoice = RecurringInvoice::find($payment_hash->data->billing_context->recurring_invoice);
|
$old_recurring_invoice = RecurringInvoice::find($payment_hash->data->billing_context->recurring_invoice);
|
||||||
$old_subscription_recurring_invoice->service()->stop()->save();
|
|
||||||
|
|
||||||
$recurring_invoice_repo = new RecurringInvoiceRepository();
|
$recurring_invoice = $this->createNewRecurringInvoice($old_recurring_invoice);
|
||||||
$recurring_invoice_repo->archive($old_subscription_recurring_invoice);
|
|
||||||
|
|
||||||
$recurring_invoice = $this->convertInvoiceToRecurring($payment_hash->payment->client_id);
|
|
||||||
$recurring_invoice = $recurring_invoice_repo->save([], $recurring_invoice);
|
|
||||||
$recurring_invoice->next_send_date = now();
|
|
||||||
$recurring_invoice->next_send_date = $recurring_invoice->nextSendDate();
|
|
||||||
|
|
||||||
/* Start the recurring service */
|
|
||||||
$recurring_invoice->service()
|
|
||||||
->start()
|
|
||||||
->save();
|
|
||||||
|
|
||||||
$context = [
|
$context = [
|
||||||
'context' => 'change_plan',
|
'context' => 'change_plan',
|
||||||
@ -462,6 +430,28 @@ class SubscriptionService
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function createNewRecurringInvoice($old_recurring_invoice) :RecurringInvoice
|
||||||
|
{
|
||||||
|
|
||||||
|
$old_recurring_invoice->service()->stop()->save();
|
||||||
|
|
||||||
|
$recurring_invoice_repo = new RecurringInvoiceRepository();
|
||||||
|
$recurring_invoice_repo->archive($$old_recurring_invoice);
|
||||||
|
|
||||||
|
$recurring_invoice = $this->convertInvoiceToRecurring($old_recurring_invoice->client_id);
|
||||||
|
$recurring_invoice = $recurring_invoice_repo->save([], $recurring_invoice);
|
||||||
|
$recurring_invoice->next_send_date = now();
|
||||||
|
$recurring_invoice->next_send_date = $recurring_invoice->nextSendDate();
|
||||||
|
|
||||||
|
/* Start the recurring service */
|
||||||
|
$recurring_invoice->service()
|
||||||
|
->start()
|
||||||
|
->save();
|
||||||
|
|
||||||
|
return $recurring_invoice;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function handlePlanChangeNoPayment($data)
|
public function handlePlanChangeNoPayment($data)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -471,21 +461,7 @@ class SubscriptionService
|
|||||||
'hash' => $this->hash,
|
'hash' => $this->hash,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$old_subscription_recurring_invoice = $data['recurring_invoice'];
|
$recurring_invoice = $this->createNewRecurringInvoice($data['recurring_invoice']);
|
||||||
$old_subscription_recurring_invoice->service()->stop()->save();
|
|
||||||
|
|
||||||
$recurring_invoice_repo = new RecurringInvoiceRepository();
|
|
||||||
$recurring_invoice_repo->archive($old_subscription_recurring_invoice);
|
|
||||||
|
|
||||||
$recurring_invoice = $this->convertInvoiceToRecurring($old_subscription_recurring_invoice->client_id);
|
|
||||||
$recurring_invoice = $recurring_invoice_repo->save([], $recurring_invoice);
|
|
||||||
$recurring_invoice->next_send_date = now();
|
|
||||||
$recurring_invoice->next_send_date = $recurring_invoice->nextSendDate();
|
|
||||||
|
|
||||||
/* Start the recurring service */
|
|
||||||
$recurring_invoice->service()
|
|
||||||
->start()
|
|
||||||
->save();
|
|
||||||
|
|
||||||
$context = [
|
$context = [
|
||||||
'context' => 'change_plan',
|
'context' => 'change_plan',
|
||||||
@ -682,11 +658,62 @@ class SubscriptionService
|
|||||||
->get();
|
->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function handleCancellation()
|
public function handleCancellation(RecurringInvoice $recurring_invoice)
|
||||||
{
|
{
|
||||||
dd('Cancelling using SubscriptionService');
|
//only allow cancellation of services that are paid up to date.
|
||||||
|
|
||||||
|
// $last_invoice =
|
||||||
|
|
||||||
|
//only refund if they are in the refund window.
|
||||||
|
$outstanding_invoice = Invoice::where('subscription_id', $this->subscription->id)
|
||||||
|
->where('client_id', $recurring_invoice->client_id)
|
||||||
|
->where('is_deleted', 0)
|
||||||
|
->orderBy('id', 'desc')
|
||||||
|
->first();
|
||||||
|
|
||||||
|
$invoice_start_date = Carbon::parse($outstanding_invoice->date);
|
||||||
|
$refund_end_date = $invoice_start_date->addSeconds($this->subscription->refund_period);
|
||||||
|
|
||||||
|
/* Stop the recurring invoice and archive */
|
||||||
|
$recurring_invoice->service()->stop()->save();
|
||||||
|
$recurring_invoice_repo = new RecurringInvoiceRepository();
|
||||||
|
$recurring_invoice_repo->archive($$old_recurring_invoice);
|
||||||
|
|
||||||
|
if($refund_end_date->greaterThan(now()) && (int)$outstanding_invoice->balance == 0)
|
||||||
|
{
|
||||||
|
//we are in the refund window.
|
||||||
|
//
|
||||||
|
//$outstanding_invoice
|
||||||
|
if($outstanding_invoice->payments()->exists())
|
||||||
|
{
|
||||||
|
$payment = $outstanding_invoice->payments()->first();
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'id' => $payment->id,
|
||||||
|
'gateway_refund' => true,
|
||||||
|
'send_email' => true,
|
||||||
|
'invoices' => [
|
||||||
|
['invoice_id' => $outstanding_invoice->id, 'amount' => $outstanding_invoice->amount],
|
||||||
|
],
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
$payment->refundPayment($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$context = [
|
||||||
|
'context' => 'cancellation',
|
||||||
|
'subscription' => $this->subscription->hashed_id,
|
||||||
|
'recurring_invoice' => $recurring_invoice->hashed_id,
|
||||||
|
'client' => $recurring_invoice->client->hashed_id,
|
||||||
|
'contact' => auth('contact')->user()->hashed_id,
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->triggerWebhook($context);
|
||||||
|
|
||||||
|
return $this->handleRedirect('client/subscriptions');
|
||||||
|
|
||||||
// ..
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDaysInFrequency()
|
private function getDaysInFrequency()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user