mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 16:37:31 -04:00 
			
		
		
		
	Updates for multi invoice payment flow
This commit is contained in:
		
							parent
							
								
									c4f93e4d12
								
							
						
					
					
						commit
						2baebffc32
					
				| @ -516,9 +516,10 @@ class CompanySettings extends BaseSettings | ||||
|     public $quote_late_fee_amount1 = 0; | ||||
|     public $quote_late_fee_percent1 = 0; | ||||
|      | ||||
| 
 | ||||
|     public string $payment_flow = 'default'; //smooth
 | ||||
| 
 | ||||
|     public static $casts = [ | ||||
|         'payment_flow'                       => 'string', | ||||
|         'enable_quote_reminder1'             => 'bool', | ||||
|         'quote_num_days_reminder1'           => 'int', | ||||
|         'quote_schedule_reminder1'           => 'string', | ||||
|  | ||||
| @ -79,13 +79,16 @@ class InvoiceController extends Controller | ||||
|             'hash' => $hash, | ||||
|             'variables' => $variables, | ||||
|             'invoices' => [$invoice->hashed_id], | ||||
|             'db' => $invoice->company->db, | ||||
|         ]; | ||||
| 
 | ||||
|         if ($request->query('mode') === 'fullscreen') { | ||||
|             return render('invoices.show-fullscreen', $data); | ||||
|         } | ||||
| 
 | ||||
|         return $this->render('invoices.show_smooth', $data); | ||||
|         return auth()->guard('contact')->user()->client->getSetting('payment_flow') == 'default' ? $this->render('invoices.show', $data) : $this->render('invoices.show_smooth', $data); | ||||
| 
 | ||||
|         // return $this->render('invoices.show_smooth', $data);
 | ||||
|     } | ||||
| 
 | ||||
|     public function showBlob($hash) | ||||
| @ -237,9 +240,12 @@ class InvoiceController extends Controller | ||||
|             'hashed_ids' => $invoices->pluck('hashed_id'), | ||||
|             'total' =>  $total, | ||||
|             'variables' => $variables, | ||||
|             'invitation' => $invitation, | ||||
|             'db' => $invitation->company->db, | ||||
|         ]; | ||||
| 
 | ||||
|         return $this->render('invoices.payment', $data); | ||||
|         // return $this->render('invoices.payment', $data);
 | ||||
|         return auth()->guard('contact')->user()->client->getSetting('payment_flow') === 'default' ? $this->render('invoices.payment', $data) : $this->render('invoices.show_smooth_multi', $data); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -238,9 +238,12 @@ class InvoicePay extends Component | ||||
|         $this->setContext('settings', $settings); // $this->context['settings'] = $settings;
 | ||||
|         $this->setContext('db', $this->db); // $this->context['db'] = $this->db;
 | ||||
| 
 | ||||
|         $invoices = Invoice::find($this->transformKeys($this->invoices)); | ||||
|         nlog($this->invoices); | ||||
| 
 | ||||
|         if(is_array($this->invoices)) | ||||
|             $this->invoices = Invoice::find($this->transformKeys($this->invoices)); | ||||
|          | ||||
|         $invoices = $invoices->filter(function ($i) { | ||||
|         $invoices = $this->invoices->filter(function ($i) { | ||||
|             $i = $i->service() | ||||
|                 ->markSent() | ||||
|                 ->removeUnpaidGatewayFees() | ||||
|  | ||||
| @ -20,12 +20,12 @@ class InvoiceSummary extends Component | ||||
| { | ||||
|     use WithSecureContext; | ||||
| 
 | ||||
|     public $invoice; | ||||
|     public $invoices; | ||||
| 
 | ||||
|     public function mount() | ||||
|     { | ||||
|         //@TODO for a single invoice - show all details, for multi-invoices, only show the summaries
 | ||||
|         $this->invoice = $this->getContext()['invitation']->invoice; // $this->context['invitation']->invoice;
 | ||||
|         $this->invoices = $this->getContext()['invoices']; // $this->context['invitation']->invoice;
 | ||||
|     } | ||||
| 
 | ||||
|     #[On(self::CONTEXT_UPDATE)]
 | ||||
| @ -33,13 +33,15 @@ class InvoiceSummary extends Component | ||||
|     { | ||||
|         // refactor logic for updating the price for eg if it changes with under/over pay
 | ||||
| 
 | ||||
|         $this->invoice = $this->getContext()['invitation']->invoice; | ||||
|         $this->invoices = $this->getContext()['invoices']; | ||||
|     } | ||||
| 
 | ||||
|     public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View | ||||
|     { | ||||
|         return render('flow2.invoice-summary', [ | ||||
|             'invoice' => $this->invoice | ||||
|         return render('flow2.invoices-summary', [ | ||||
|             'invoice' => $this->invoices, | ||||
|             'client' => $this->invoices->first()->client, | ||||
|         ]); | ||||
|          | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -25,7 +25,7 @@ class Terms extends Component | ||||
| 
 | ||||
|     public function mount() | ||||
|     { | ||||
|         $this->invoice = $this->getContext()['invoice']; | ||||
|         $this->invoice = $this->getContext()['invoices']->first(); | ||||
|         $this->variables = $this->getContext()['variables']; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -89,6 +89,8 @@ class LivewireInstantPayment | ||||
| 
 | ||||
|     public function run() | ||||
|     { | ||||
|         nlog($this->data); | ||||
| 
 | ||||
|         $company_gateway = CompanyGateway::query()->find($this->data['company_gateway_id']); | ||||
| 
 | ||||
|         if ($this->data['company_gateway_id'] == CompanyGateway::GATEWAY_CREDIT) { | ||||
|  | ||||
| @ -1,67 +0,0 @@ | ||||
| <div class="w-full"> | ||||
|    <div class="rounded-lg border bg-card bg-white text-card-foreground shadow-sm overflow-hidden" x-chunk="An order details card with order details, shipping information, customer information and payment information."> | ||||
|       <div class="space-y-1.5 p-6 flex flex-row items-start bg-muted/50"> | ||||
|          <div class="grid gap-0.5"> | ||||
|             <h3 class="font-semibold tracking-tight group flex items-center gap-2 text-lg"> | ||||
|                {{ ctrans('texts.invoice') }} {{ $invoice->number }} | ||||
|                <button class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-6 w-6 opacity-0 transition-opacity group-hover:opacity-100"> | ||||
|                   <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy h-3 w-3"> | ||||
|                      <rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect> | ||||
|                      <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path> | ||||
|                   </svg> | ||||
|                   <span class="sr-only">{{ ctrans('texts.copy') }}</span> | ||||
|                </button> | ||||
|             </h3> | ||||
|             <p class="text-sm text-muted-foreground">{{ ctrans('texts.date') }}:  {{ $invoice->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()) }}</p> | ||||
|          </div> | ||||
| 
 | ||||
|       </div> | ||||
|       <div class="p-6 text-sm"> | ||||
|          <div class="grid gap-3"> | ||||
|             <div class="font-semibold">{{ ctrans('texts.invoice_details') }} </div> | ||||
|             <ul class="grid gap-3"> | ||||
|                 @foreach($invoice->line_items as $item) | ||||
|                <li class="flex items-center justify-between"><span class="text-muted-foreground">{{ $item->notes }}<span></span></span><span> {{ App\Utils\Number::formatMoney($item->line_total, $invoice->client) }}</span></li> | ||||
|                 @endforeach | ||||
|             </ul> | ||||
|             <div data-orientation="horizontal" role="none" class="shrink-0 bg-border h-[1px] w-full my-2"></div> | ||||
|             <ul class="grid gap-3"> | ||||
|                 @if($invoice->total_taxes > 0) | ||||
|                 <li class="flex items-center justify-between"><span class="text-muted-foreground">{{ ctrans('texts.tax')}}</span><span>{{App\Utils\Number::formatMoney($invoice->total_taxes, $invoice->client) }} </span></li> | ||||
|                 @endif | ||||
|                 <li class="flex items-center justify-between font-semibold"><span class="text-muted-foreground">{{ ctrans('texts.total') }}</span><span>{{ App\Utils\Number::formatMoney($invoice->amount, $invoice->client) }}</span></li> | ||||
|             </ul> | ||||
|          </div> | ||||
|          <div data-orientation="horizontal" role="none" class="shrink-0 bg-border h-[1px] w-full my-4"></div> | ||||
|          <div class="grid grid-cols-2 gap-4"> | ||||
|             <div class="grid auto-rows-max gap-3"> | ||||
|                <div class="font-semibold"></div> | ||||
|             </div> | ||||
|          </div> | ||||
|          <div data-orientation="horizontal" role="none" class="shrink-0 bg-border h-[1px] w-full my-4"></div> | ||||
|          <div class="grid gap-3"> | ||||
|             <div class="font-semibold">{{ ctrans('texts.client_information') }}</div> | ||||
|             <dl class="grid gap-3"> | ||||
|                <div class="flex items-center justify-between"> | ||||
|                   <dt class="text-muted-foreground">{{ ctrans('texts.client') }}</dt> | ||||
|                   <dd>{{ $invoice->client->present()->name() }}</dd> | ||||
|                </div> | ||||
|                <div class="flex items-center justify-between"> | ||||
|                   <dt class="text-muted-foreground">{{ ctrans('texts.email') }}</dt> | ||||
|                   <dd><a href="mailto:">{{ $invoice->client->present()->email() }}</a></dd> | ||||
|                </div> | ||||
|                <div class="flex items-center justify-between"> | ||||
|                   <dt class="text-muted-foreground">{{ ctrans('texts.phone') }}</dt> | ||||
|                   <dd><a href="tel:">{{ $invoice->client->present()->phone() }} </a></dd> | ||||
|                </div> | ||||
|             </dl> | ||||
|          </div> | ||||
|          <div data-orientation="horizontal" role="none" class="shrink-0 bg-border h-[1px] w-full my-4"></div> | ||||
|          <div class="grid gap-3"> | ||||
|             <div class="font-semibold"></div> | ||||
|             <dl class="grid gap-3"> | ||||
|             </dl> | ||||
|          </div> | ||||
|       </div> | ||||
|    </div> | ||||
| </div> | ||||
| @ -0,0 +1,71 @@ | ||||
| <div class="w-full"> | ||||
|     <div class="rounded-lg border bg-card bg-white text-card-foreground shadow-sm overflow-hidden" x-chunk="An order details card with order details, shipping information, customer information and payment information."> | ||||
|         <div class="pt-6 px-6 flex flex-row items-start bg-muted/50"> | ||||
|             <div class="grid gap-0.5"> | ||||
|             <h3 class="font-semibold tracking-tight group flex items-center gap-2 text-lg"> | ||||
|                 {{ ctrans('texts.invoices') }} | ||||
|                 <button class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-6 w-6 opacity-0 transition-opacity group-hover:opacity-100"> | ||||
|                     <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy h-3 w-3"> | ||||
|                         <rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect> | ||||
|                         <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path> | ||||
|                     </svg> | ||||
|                 </button> | ||||
|             </h3> | ||||
|             </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="p-6 text-sm"> | ||||
|             @foreach($invoices as $invoice) | ||||
|             <div class="mb-4 grid gap-3"> | ||||
|                 <div class="font-semibold">{{ ctrans('texts.invoice') }} {{ $invoice->number }}</div> | ||||
|                 <dl class="grid gap-3"> | ||||
|                 <div class="flex items-center justify-between"> | ||||
|                     <dt class="text-muted-foreground">{{ ctrans('texts.invoice_date') }}</dt> | ||||
|                     <dd>{{ $invoice->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()) }}</dd> | ||||
|                 </div> | ||||
|                 @if($invoice->due_date) | ||||
|                 <div class="flex items-center justify-between"> | ||||
|                     <dt class="text-muted-foreground">{{ ctrans('texts.due_date') }}</dt> | ||||
|                     <dd>{{ $invoice->translateDate($invoice->due_date, $invoice->client->date_format(), $invoice->client->locale()) }}</dd> | ||||
|                 </div> | ||||
|                 @endif | ||||
|                 <div class="flex items-center justify-between"> | ||||
|                     <dt class="text-muted-foreground">{{ ctrans('texts.amount_due') }}</dt> | ||||
|                     <dd> | ||||
|                         {{ $invoice->client->currency()->code }} ({{ $invoice->client->currency()->symbol }}) | ||||
|                         {{ $invoice->partial > 0 ? $invoice->partial : $invoice->balance }} | ||||
|                     </dd> | ||||
|                 </div> | ||||
|                 </dl> | ||||
|             </div> | ||||
|             @endforeach | ||||
| 
 | ||||
|             <div data-orientation="horizontal" role="none" class="shrink-0 bg-border h-[1px] w-full my-4"></div> | ||||
|             <div class="grid gap-3"> | ||||
|                 <div class="font-semibold">{{ ctrans('texts.client_information') }}</div> | ||||
|                 <dl class="grid gap-3"> | ||||
|                 <div class="flex items-center justify-between"> | ||||
|                     <dt class="text-muted-foreground">{{ ctrans('texts.client') }}</dt> | ||||
|                     <dd>{{ $client->present()->name() }}</dd> | ||||
|                 </div> | ||||
|                 <div class="flex items-center justify-between"> | ||||
|                     <dt class="text-muted-foreground">{{ ctrans('texts.email') }}</dt> | ||||
|                     <dd><a href="mailto:">{{ $client->present()->email() }}</a></dd> | ||||
|                 </div> | ||||
|                 @if($client->present()->phone()) | ||||
|                 <div class="flex items-center justify-between"> | ||||
|                     <dt class="text-muted-foreground">{{ ctrans('texts.phone') }}</dt> | ||||
|                     <dd><a href="tel:">{{ $client->present()->phone() }} </a></dd> | ||||
|                 </div> | ||||
|                 @endif | ||||
|                 </dl> | ||||
|             </div> | ||||
|             <div data-orientation="horizontal" role="none" class="shrink-0 bg-border h-[1px] w-full my-4"></div> | ||||
|             <div class="grid gap-3"> | ||||
|                 <div class="font-semibold"></div> | ||||
|                 <dl class="grid gap-3"> | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| @ -17,11 +17,9 @@ | ||||
|     @endif | ||||
| 
 | ||||
|     @if($invoice->isPayable()) | ||||
|         @livewire('flow2.invoice-pay', ['invoices' => $invoices, 'invitation_id' => $invitation->id, 'db' => $invoice->company->db, 'variables' => $variables]) | ||||
|         @livewire('flow2.invoice-pay', ['invoices' => $invoices, 'invitation_id' => $invitation->id, 'db' => $db, 'variables' => $variables]) | ||||
|     @endif | ||||
| 
 | ||||
|     @include('portal.ninja2020.components.entity-documents', ['entity' => $invoice]) | ||||
| 
 | ||||
| @endsection | ||||
| 
 | ||||
| @section('footer') | ||||
|  | ||||
| @ -0,0 +1,17 @@ | ||||
| @extends('portal.ninja2020.layout.app') | ||||
| @section('meta_title', ctrans('texts.view_invoice')) | ||||
| 
 | ||||
| @push('head') | ||||
| @endpush | ||||
| 
 | ||||
| @section('body') | ||||
| 
 | ||||
|     @livewire('flow2.invoice-pay', ['invoices' => $invoices, 'invitation_id' => $invitation->id, 'db' => $db, 'variables' => $variables]) | ||||
| 
 | ||||
| @endsection | ||||
| 
 | ||||
| @section('footer') | ||||
| @endsection | ||||
| 
 | ||||
| @push('head') | ||||
| @endpush | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user