mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 04:07:32 -05:00 
			
		
		
		
	
						commit
						d293c28a55
					
				@ -1 +1 @@
 | 
			
		||||
5.1.33
 | 
			
		||||
5.1.34
 | 
			
		||||
@ -600,6 +600,7 @@ class CompanySettings extends BaseSettings
 | 
			
		||||
                '$client.city_state_postal',
 | 
			
		||||
                '$client.country',
 | 
			
		||||
                '$contact.email',
 | 
			
		||||
                '$client.phone',
 | 
			
		||||
            ],
 | 
			
		||||
            'company_details' => [
 | 
			
		||||
                '$company.name',
 | 
			
		||||
 | 
			
		||||
@ -795,7 +795,7 @@ class InvoiceController extends BaseController
 | 
			
		||||
 | 
			
		||||
        $file_path = $invoice->service()->getInvoicePdf($contact);
 | 
			
		||||
 | 
			
		||||
nlog($file_path);
 | 
			
		||||
        nlog($file_path);
 | 
			
		||||
 | 
			
		||||
        return response()->download($file_path, basename($file_path));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -11,12 +11,12 @@
 | 
			
		||||
 | 
			
		||||
namespace App\Jobs\Mail;
 | 
			
		||||
 | 
			
		||||
use App\Jobs\Mail\NinjaMailer;
 | 
			
		||||
use App\Jobs\Mail\NinjaMailerJob;
 | 
			
		||||
use App\Jobs\Mail\NinjaMailerObject;
 | 
			
		||||
use App\Libraries\MultiDB;
 | 
			
		||||
use App\Mail\Admin\EntityNotificationMailer;
 | 
			
		||||
use App\Mail\Admin\PaymentFailureObject;
 | 
			
		||||
use App\Mail\NinjaMailer;
 | 
			
		||||
use App\Models\User;
 | 
			
		||||
use App\Utils\Traits\Notifications\UserNotifies;
 | 
			
		||||
use Illuminate\Bus\Queueable;
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,16 @@ class Subscription extends BaseModel
 | 
			
		||||
{
 | 
			
		||||
    use HasFactory, SoftDeletes;
 | 
			
		||||
 | 
			
		||||
    protected $hidden = [
 | 
			
		||||
        'id',
 | 
			
		||||
        'user_id',
 | 
			
		||||
        'assigned_user_id',
 | 
			
		||||
        'company_id',
 | 
			
		||||
        'product_ids',
 | 
			
		||||
        'recurring_product_ids',
 | 
			
		||||
        'group_id',
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    protected $fillable = [
 | 
			
		||||
        'assigned_user_id',
 | 
			
		||||
        'product_ids',
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,9 @@ use App\Models\Design;
 | 
			
		||||
use App\Models\Invoice;
 | 
			
		||||
use App\Services\PdfMaker\Design as PdfMakerDesign;
 | 
			
		||||
use App\Services\PdfMaker\PdfMaker as PdfMakerService;
 | 
			
		||||
use App\Utils\HostedPDF\NinjaPdf;
 | 
			
		||||
use App\Utils\HtmlEngine;
 | 
			
		||||
use App\Utils\PhantomJS\Phantom;
 | 
			
		||||
use App\Utils\Traits\MakesHash;
 | 
			
		||||
use App\Utils\Traits\Pdf\PdfMaker;
 | 
			
		||||
use Illuminate\Support\Facades\Storage;
 | 
			
		||||
@ -58,6 +60,10 @@ class GenerateDeliveryNote
 | 
			
		||||
 | 
			
		||||
        $file_path = sprintf('%s%s_delivery_note.pdf', $this->invoice->client->invoice_filepath(), $this->invoice->number);
 | 
			
		||||
 | 
			
		||||
        if (config('ninja.phantomjs_pdf_generation')) {
 | 
			
		||||
            return (new Phantom)->generate($this->invoice->invitations->first());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $design = Design::find($design_id);
 | 
			
		||||
        $html = new HtmlEngine($this->invoice->invitations->first());
 | 
			
		||||
 | 
			
		||||
@ -86,7 +92,12 @@ class GenerateDeliveryNote
 | 
			
		||||
 | 
			
		||||
        // Storage::makeDirectory($this->invoice->client->invoice_filepath(), 0775);
 | 
			
		||||
 | 
			
		||||
        $pdf = $this->makePdf(null, null, $maker->getCompiledHTML());
 | 
			
		||||
            if(config('ninja.invoiceninja_hosted_pdf_generation')){
 | 
			
		||||
                $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true));
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                $pdf = $this->makePdf(null, null, $maker->getCompiledHTML());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if (config('ninja.log_pdf_html')) {
 | 
			
		||||
            info($maker->getCompiledHTML());
 | 
			
		||||
 | 
			
		||||
@ -263,7 +263,7 @@ class InvoiceService
 | 
			
		||||
    {
 | 
			
		||||
        if ((int)$this->invoice->balance == 0) {
 | 
			
		||||
            
 | 
			
		||||
            InvoiceWorkflowSettings::dispatch($this->invoice);
 | 
			
		||||
            InvoiceWorkflowSettings::dispatchNow($this->invoice);
 | 
			
		||||
 | 
			
		||||
            $this->setStatus(Invoice::STATUS_PAID);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@
 | 
			
		||||
namespace App\Services\Payment;
 | 
			
		||||
 | 
			
		||||
use App\Events\Invoice\InvoiceWasUpdated;
 | 
			
		||||
use App\Jobs\Invoice\InvoiceWorkflowSettings;
 | 
			
		||||
use App\Models\Invoice;
 | 
			
		||||
use App\Models\Payment;
 | 
			
		||||
use App\Models\PaymentHash;
 | 
			
		||||
@ -83,6 +84,8 @@ class UpdateInvoicePayment
 | 
			
		||||
                ->updateStatus()
 | 
			
		||||
                ->save();
 | 
			
		||||
 | 
			
		||||
            InvoiceWorkflowSettings::dispatchNow($invoice);
 | 
			
		||||
 | 
			
		||||
            event(new InvoiceWasUpdated($invoice, $invoice->company, Ninja::eventVars()));
 | 
			
		||||
        });
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,9 @@ use App\DataMapper\InvoiceItem;
 | 
			
		||||
use App\Factory\InvoiceFactory;
 | 
			
		||||
use App\Factory\InvoiceToRecurringInvoiceFactory;
 | 
			
		||||
use App\Factory\RecurringInvoiceFactory;
 | 
			
		||||
use App\Jobs\Util\SubscriptionWebhookHandler;
 | 
			
		||||
use App\Jobs\Util\SystemLogger;
 | 
			
		||||
use App\Models\Client;
 | 
			
		||||
use App\Models\ClientContact;
 | 
			
		||||
use App\Models\ClientSubscription;
 | 
			
		||||
use App\Models\Invoice;
 | 
			
		||||
@ -27,6 +29,7 @@ use App\Models\SystemLog;
 | 
			
		||||
use App\Repositories\InvoiceRepository;
 | 
			
		||||
use App\Repositories\RecurringInvoiceRepository;
 | 
			
		||||
use App\Repositories\SubscriptionRepository;
 | 
			
		||||
use App\Utils\Ninja;
 | 
			
		||||
use App\Utils\Traits\CleanLineItems;
 | 
			
		||||
use App\Utils\Traits\MakesHash;
 | 
			
		||||
use GuzzleHttp\RequestOptions;
 | 
			
		||||
@ -70,7 +73,16 @@ class SubscriptionService
 | 
			
		||||
                              ->save();
 | 
			
		||||
 | 
			
		||||
            //execute any webhooks
 | 
			
		||||
            $this->triggerWebhook();
 | 
			
		||||
 | 
			
		||||
            $context = [
 | 
			
		||||
                'context' => 'recurring_purchase',
 | 
			
		||||
                'recurring_invoice' => $recurring_invoice->hashed_id,
 | 
			
		||||
                'invoice' => $this->encodePrimaryKey($payment_hash->fee_invoice_id),
 | 
			
		||||
                'client' => $recurring_invoice->client->hashed_id,
 | 
			
		||||
                'subscription' => $this->subscription->hashed_id,
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
            $this->triggerWebhook($context);
 | 
			
		||||
 | 
			
		||||
            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']);
 | 
			
		||||
@ -79,9 +91,17 @@ class SubscriptionService
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            $invoice = Invoice::find($payment_hash->fee_invoice_id);
 | 
			
		||||
 | 
			
		||||
            $context = [
 | 
			
		||||
                'context' => 'single_purchase',
 | 
			
		||||
                'invoice' => $this->encodePrimaryKey($payment_hash->fee_invoice_id),
 | 
			
		||||
                'client'  => $invoice->client->hashed_id,
 | 
			
		||||
                'subscription' => $this->subscription->hashed_id,
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
            //execute any webhooks
 | 
			
		||||
            $this->triggerWebhook();
 | 
			
		||||
            $this->triggerWebhook($context);
 | 
			
		||||
 | 
			
		||||
            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']);
 | 
			
		||||
@ -124,11 +144,19 @@ class SubscriptionService
 | 
			
		||||
                          ->start()
 | 
			
		||||
                          ->save();
 | 
			
		||||
 | 
			
		||||
        //execute any webhooks
 | 
			
		||||
        $this->triggerWebhook();
 | 
			
		||||
            $context = [
 | 
			
		||||
                'context' => 'trial',
 | 
			
		||||
                'recurring_invoice' => $recurring_invoice->hashed_id,
 | 
			
		||||
                'client' => $recurring_invoice->client->hashed_id,
 | 
			
		||||
                'subscription' => $this->subscription->hashed_id,
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
        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']);
 | 
			
		||||
        //execute any webhooks
 | 
			
		||||
        $this->triggerWebhook($context);
 | 
			
		||||
 | 
			
		||||
        if(array_key_exists('return_url', $this->subscription->webhook_configuration) && strlen($this->subscription->webhook_configuration['return_url']) >=1){
 | 
			
		||||
            return redirect($this->subscription->webhook_configuration['return_url']);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return redirect('/client/recurring_invoices/'.$recurring_invoice->hashed_id);
 | 
			
		||||
    }
 | 
			
		||||
@ -208,30 +236,45 @@ class SubscriptionService
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    //@todo - need refactor
 | 
			
		||||
    public function triggerWebhook()
 | 
			
		||||
    public function triggerWebhook($context)
 | 
			
		||||
    {
 | 
			
		||||
        //hit the webhook to after a successful onboarding
 | 
			
		||||
 | 
			
		||||
        // $body = [
 | 
			
		||||
        //     'subscription' => $this->subscription,
 | 
			
		||||
        //     'client_subscription' => $this->client_subscription,
 | 
			
		||||
        //     'client' => $this->client_subscription->client->toArray(),
 | 
			
		||||
        // ];
 | 
			
		||||
        $body = array_merge($context, [
 | 
			
		||||
            'company_key' => $this->subscription->company->company_key, 
 | 
			
		||||
            'account_key' => $this->subscription->company->account->key,
 | 
			
		||||
            'db' => $this->subscription->company->db,
 | 
			
		||||
        ]);        
 | 
			
		||||
 | 
			
		||||
        $headers = [
 | 
			
		||||
            'Content-Type' => 'application/json',
 | 
			
		||||
            'X-Requested-With' => 'XMLHttpRequest',
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // $client =  new \GuzzleHttp\Client(['headers' => $this->subscription->webhook_configuration->post_purchase_headers]);
 | 
			
		||||
        $client =  new \GuzzleHttp\Client(
 | 
			
		||||
        [
 | 
			
		||||
            'headers' => $headers,
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        // $response = $client->{$this->subscription->webhook_configuration->post_purchase_rest_method}($this->subscription->post_purchase_url,[
 | 
			
		||||
        //     RequestOptions::JSON => ['body' => $body]
 | 
			
		||||
        // ]);
 | 
			
		||||
        try {
 | 
			
		||||
            $response = $client->{$this->subscription->webhook_configuration['post_purchase_rest_method']}($this->subscription->webhook_configuration['post_purchase_url'],[
 | 
			
		||||
                RequestOptions::JSON => ['body' => $body], RequestOptions::ALLOW_REDIRECTS => false
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
        catch(\Exception $e)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        //     SystemLogger::dispatch(
 | 
			
		||||
        //         $body,
 | 
			
		||||
        //         SystemLog::CATEGORY_WEBHOOK,
 | 
			
		||||
        //         SystemLog::EVENT_WEBHOOK_RESPONSE,
 | 
			
		||||
        //         SystemLog::TYPE_WEBHOOK_RESPONSE,
 | 
			
		||||
        //         $this->client_subscription->client,
 | 
			
		||||
        //     );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $client = \App\Models\Client::find($this->decodePrimaryKey($body['client']));
 | 
			
		||||
 | 
			
		||||
            SystemLogger::dispatch(
 | 
			
		||||
                $body,
 | 
			
		||||
                SystemLog::CATEGORY_WEBHOOK,
 | 
			
		||||
                SystemLog::EVENT_WEBHOOK_RESPONSE,
 | 
			
		||||
                SystemLog::TYPE_WEBHOOK_RESPONSE,
 | 
			
		||||
                $client,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -65,6 +65,7 @@ class SubscriptionTransformer extends EntityTransformer
 | 
			
		||||
            'created_at' => (int)$subscription->created_at,
 | 
			
		||||
            'updated_at' => (int)$subscription->updated_at,
 | 
			
		||||
            'archived_at' => (int)$subscription->deleted_at,
 | 
			
		||||
            'plan_map' => '', //@deprecated 03/04/2021
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ return [
 | 
			
		||||
    'require_https' => env('REQUIRE_HTTPS', true),
 | 
			
		||||
    'app_url' => rtrim(env('APP_URL', ''), '/'),
 | 
			
		||||
    'app_domain' => env('APP_DOMAIN', ''),
 | 
			
		||||
    'app_version' => '5.1.33',
 | 
			
		||||
    'app_version' => '5.1.34',
 | 
			
		||||
    'minimum_client_version' => '5.0.16',
 | 
			
		||||
    'terms_version' => '1.0.1',
 | 
			
		||||
    'api_secret' => env('API_SECRET', false),
 | 
			
		||||
@ -142,7 +142,7 @@ return [
 | 
			
		||||
    'expanded_logging' => env('EXPANDED_LOGGING', false),
 | 
			
		||||
    'snappdf_chromium_path' => env('SNAPPDF_CHROMIUM_PATH', false),
 | 
			
		||||
    'v4_migration_version' => '4.5.35',
 | 
			
		||||
    'flutter_canvas_kit' => env('FLUTTER_CANVAS_KIT', 'selfhosted-html'),
 | 
			
		||||
    'flutter_renderer' => env('FLUTTER_RENDERER', 'selfhosted-html'),
 | 
			
		||||
    'webcron_secret' => env('WEBCRON_SECRET', false),
 | 
			
		||||
    'disable_auto_update' => env('DISABLE_AUTO_UPDATE', false),
 | 
			
		||||
    'invoiceninja_hosted_pdf_generation' => env('NINJA_HOSTED_PDF', false),
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,30 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Illuminate\Database\Migrations\Migration;
 | 
			
		||||
use Illuminate\Database\Schema\Blueprint;
 | 
			
		||||
use Illuminate\Support\Facades\Schema;
 | 
			
		||||
 | 
			
		||||
class AddTrialDurationToAccountsTable extends Migration
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Run the migrations.
 | 
			
		||||
     *
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function up()
 | 
			
		||||
    {
 | 
			
		||||
        Schema::table('accounts', function (Blueprint $table) {
 | 
			
		||||
            $table->unsignedInteger('trial_duration')->nullable();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Reverse the migrations.
 | 
			
		||||
     *
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function down()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -146,9 +146,9 @@
 | 
			
		||||
  
 | 
			
		||||
  </script>
 | 
			
		||||
 | 
			
		||||
  @if(config('ninja.flutter_canvas_kit') == 'hosted')
 | 
			
		||||
  @if(config('ninja.flutter_renderer') == 'hosted')
 | 
			
		||||
    <script defer src="main.dart.js?v={{ config('ninja.app_version') }}" type="application/javascript"></script>
 | 
			
		||||
  @elseif(config('ninja.flutter_canvas_kit') == 'selfhosted-canvaskit')
 | 
			
		||||
  @elseif(config('ninja.flutter_renderer') == 'selfhosted-canvaskit')
 | 
			
		||||
    <script defer src="main.wasm.dart.js?v={{ config('ninja.app_version') }}" type="application/javascript"></script>
 | 
			
		||||
  @else
 | 
			
		||||
    <script defer src="main.foss.dart.js?v={{ config('ninja.app_version') }}" type="application/javascript"></script>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user