mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-03 22:27:31 -05:00 
			
		
		
		
	Working on subscriptions
This commit is contained in:
		
							parent
							
								
									97aec846ff
								
							
						
					
					
						commit
						be648230de
					
				@ -55,9 +55,39 @@ class SubscriptionService
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // if we have a recurring product - then generate a recurring invoice
 | 
					        // if we have a recurring product - then generate a recurring invoice
 | 
				
			||||||
        // if trial is enabled, generate the recurring invoice to fire when the trial ends.
 | 
					        if(strlen($this->subscription->recurring_product_ids) >=1){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $recurring_invoice = $this->convertInvoiceToRecurring($payment_hash->payment->client_id);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					            $recurring_invoice->next_send_date = now();
 | 
				
			||||||
 | 
					            $recurring_invoice = $recurring_invoice_repo->save([], $recurring_invoice);
 | 
				
			||||||
 | 
					            $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Start the recurring service */
 | 
				
			||||||
 | 
					            $recurring_invoice->service()
 | 
				
			||||||
 | 
					                              ->start()
 | 
				
			||||||
 | 
					                              ->save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //execute any webhooks
 | 
				
			||||||
 | 
					            $this->triggerWebhook();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(array_key_exists('post_purchase_url', $this->subscription->webhook_configuration) && strlen($this->subscription->webhook_configuration['post_purchase_url']) >=1)
 | 
				
			||||||
 | 
					                return redirect($this->subscription->webhook_configuration['post_purchase_url']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return redirect('/client/recurring_invoices/'.$recurring_invoice->hashed_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //execute any webhooks
 | 
				
			||||||
 | 
					            $this->triggerWebhook();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(array_key_exists('post_purchase_url', $this->subscription->webhook_configuration) && strlen($this->subscription->webhook_configuration['post_purchase_url']) >=1)
 | 
				
			||||||
 | 
					                return redirect($this->subscription->webhook_configuration['post_purchase_url']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return redirect('/client/invoices/'.$this->encodePrimaryKey($payment_hash->fee_invoice_id));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -75,16 +105,9 @@ class SubscriptionService
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        //create recurring invoice with start date = trial_duration + 1 day
 | 
					        //create recurring invoice with start date = trial_duration + 1 day
 | 
				
			||||||
        $recurring_invoice_repo = new RecurringInvoiceRepository();
 | 
					        $recurring_invoice_repo = new RecurringInvoiceRepository();
 | 
				
			||||||
        $subscription_repo = new SubscriptionRepository();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $recurring_invoice = RecurringInvoiceFactory::create($this->subscription->company_id, $this->subscription->user_id);
 | 
					        $recurring_invoice = $this->convertInvoiceToRecurring($client_contact->client_id);
 | 
				
			||||||
        $recurring_invoice->client_id = $client_contact->client_id; 
 | 
					 | 
				
			||||||
        $recurring_invoice->line_items = $subscription_repo->generateLineItems($this->subscription, true);
 | 
					 | 
				
			||||||
        $recurring_invoice->subscription_id = $this->subscription->id;
 | 
					 | 
				
			||||||
        $recurring_invoice->frequency_id = $this->subscription->frequency_id ?: RecurringInvoice::FREQUENCY_MONTHLY;
 | 
					 | 
				
			||||||
        $recurring_invoice->date = now();
 | 
					 | 
				
			||||||
        $recurring_invoice->next_send_date = now()->addSeconds($this->subscription->trial_duration);
 | 
					        $recurring_invoice->next_send_date = now()->addSeconds($this->subscription->trial_duration);
 | 
				
			||||||
        $recurring_invoice->remaining_cycles = -1;
 | 
					 | 
				
			||||||
        $recurring_invoice->backup = 'is_trial';
 | 
					        $recurring_invoice->backup = 'is_trial';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(array_key_exists('coupon', $data) && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) 
 | 
					        if(array_key_exists('coupon', $data) && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) 
 | 
				
			||||||
@ -109,6 +132,7 @@ class SubscriptionService
 | 
				
			|||||||
        return redirect('/client/recurring_invoices/'.$recurring_invoice->hashed_id);
 | 
					        return redirect('/client/recurring_invoices/'.$recurring_invoice->hashed_id);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function createInvoice($data): ?\App\Models\Invoice
 | 
					    public function createInvoice($data): ?\App\Models\Invoice
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -130,16 +154,20 @@ class SubscriptionService
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function convertInvoiceToRecurring($payment_hash)
 | 
					    private function convertInvoiceToRecurring($client_id)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        //The first invoice is a plain invoice - the second is fired on the recurring schedule.
 | 
					 | 
				
			||||||
        $invoice = Invoice::find($payment_hash->billing_context->invoice_id); 
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(!$invoice)
 | 
					        $subscription_repo = new SubscriptionRepository();
 | 
				
			||||||
            throw new \Exception("Could not match an invoice for payment of billing subscription");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return InvoiceToRecurringInvoiceFactory::create($invoice);
 | 
					        $recurring_invoice = RecurringInvoiceFactory::create($this->subscription->company_id, $this->subscription->user_id);
 | 
				
			||||||
 | 
					        $recurring_invoice->client_id = $client_id; 
 | 
				
			||||||
 | 
					        $recurring_invoice->line_items = $subscription_repo->generateLineItems($this->subscription, true);
 | 
				
			||||||
 | 
					        $recurring_invoice->subscription_id = $this->subscription->id;
 | 
				
			||||||
 | 
					        $recurring_invoice->frequency_id = $this->subscription->frequency_id ?: RecurringInvoice::FREQUENCY_MONTHLY;
 | 
				
			||||||
 | 
					        $recurring_invoice->date = now();
 | 
				
			||||||
 | 
					        $recurring_invoice->remaining_cycles = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $recurring_invoice;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // @deprecated due to change in architecture
 | 
					    // @deprecated due to change in architecture
 | 
				
			||||||
 | 
				
			|||||||
@ -140,7 +140,7 @@ return [
 | 
				
			|||||||
    'log_pdf_html' => env('LOG_PDF_HTML', false),
 | 
					    'log_pdf_html' => env('LOG_PDF_HTML', false),
 | 
				
			||||||
    'expanded_logging' => env('EXPANDED_LOGGING', false),
 | 
					    'expanded_logging' => env('EXPANDED_LOGGING', false),
 | 
				
			||||||
    'snappdf_chromium_path' => env('SNAPPDF_CHROMIUM_PATH', false),
 | 
					    'snappdf_chromium_path' => env('SNAPPDF_CHROMIUM_PATH', false),
 | 
				
			||||||
    'v4_migration_version' => '4.5.31',
 | 
					    'v4_migration_version' => '4.5.35',
 | 
				
			||||||
    'flutter_canvas_kit' => env('FLUTTER_CANVAS_KIT', 'selfhosted-html'),
 | 
					    'flutter_canvas_kit' => env('FLUTTER_CANVAS_KIT', 'selfhosted-html'),
 | 
				
			||||||
    'webcron_secret' => env('WEBCRON_SECRET', false),
 | 
					    'webcron_secret' => env('WEBCRON_SECRET', false),
 | 
				
			||||||
    'disable_auto_update' => env('DISABLE_AUTO_UPDATE', false),
 | 
					    'disable_auto_update' => env('DISABLE_AUTO_UPDATE', false),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user