mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-07 13:14:30 -04:00
Required fields
This commit is contained in:
parent
78f79a341e
commit
e70de19c9d
@ -12,27 +12,74 @@
|
|||||||
|
|
||||||
namespace App\Livewire;
|
namespace App\Livewire;
|
||||||
|
|
||||||
|
use App\Utils\Number;
|
||||||
|
use App\Models\Invoice;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use App\Utils\HtmlEngine;
|
use App\Utils\HtmlEngine;
|
||||||
use App\Libraries\MultiDB;
|
use App\Libraries\MultiDB;
|
||||||
use Livewire\Attributes\On;
|
use Livewire\Attributes\On;
|
||||||
use App\Livewire\Flow2\Terms;
|
use App\Livewire\Flow2\Terms;
|
||||||
|
use App\Models\CompanyGateway;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
use App\Utils\Traits\MakesDates;
|
||||||
use App\Livewire\Flow2\Signature;
|
use App\Livewire\Flow2\Signature;
|
||||||
use Livewire\Attributes\Computed;
|
use Livewire\Attributes\Computed;
|
||||||
use Livewire\Attributes\Reactive;
|
use Livewire\Attributes\Reactive;
|
||||||
use App\Livewire\Flow2\PaymentMethod;
|
use App\Livewire\Flow2\PaymentMethod;
|
||||||
use App\Livewire\Flow2\ProcessPayment;
|
use App\Livewire\Flow2\ProcessPayment;
|
||||||
|
use App\Livewire\Flow2\RequiredFields;
|
||||||
use App\Livewire\Flow2\UnderOverPayment;
|
use App\Livewire\Flow2\UnderOverPayment;
|
||||||
use App\Models\Invoice;
|
|
||||||
use App\Utils\Number;
|
|
||||||
use App\Utils\Traits\MakesDates;
|
|
||||||
use App\Utils\Traits\MakesHash;
|
|
||||||
|
|
||||||
class InvoicePay extends Component
|
class InvoicePay extends Component
|
||||||
{
|
{
|
||||||
use MakesDates;
|
use MakesDates;
|
||||||
use MakesHash;
|
use MakesHash;
|
||||||
|
|
||||||
|
private $mappings = [
|
||||||
|
'client_name' => 'name',
|
||||||
|
'client_website' => 'website',
|
||||||
|
'client_phone' => 'phone',
|
||||||
|
|
||||||
|
'client_address_line_1' => 'address1',
|
||||||
|
'client_address_line_2' => 'address2',
|
||||||
|
'client_city' => 'city',
|
||||||
|
'client_state' => 'state',
|
||||||
|
'client_postal_code' => 'postal_code',
|
||||||
|
'client_country_id' => 'country_id',
|
||||||
|
|
||||||
|
'client_shipping_address_line_1' => 'shipping_address1',
|
||||||
|
'client_shipping_address_line_2' => 'shipping_address2',
|
||||||
|
'client_shipping_city' => 'shipping_city',
|
||||||
|
'client_shipping_state' => 'shipping_state',
|
||||||
|
'client_shipping_postal_code' => 'shipping_postal_code',
|
||||||
|
'client_shipping_country_id' => 'shipping_country_id',
|
||||||
|
|
||||||
|
'client_custom_value1' => 'custom_value1',
|
||||||
|
'client_custom_value2' => 'custom_value2',
|
||||||
|
'client_custom_value3' => 'custom_value3',
|
||||||
|
'client_custom_value4' => 'custom_value4',
|
||||||
|
|
||||||
|
'contact_first_name' => 'first_name',
|
||||||
|
'contact_last_name' => 'last_name',
|
||||||
|
'contact_email' => 'email',
|
||||||
|
// 'contact_phone' => 'phone',
|
||||||
|
];
|
||||||
|
|
||||||
|
public $client_address_array = [
|
||||||
|
'address1',
|
||||||
|
'address2',
|
||||||
|
'city',
|
||||||
|
'state',
|
||||||
|
'postal_code',
|
||||||
|
'country_id',
|
||||||
|
'shipping_address1',
|
||||||
|
'shipping_address2',
|
||||||
|
'shipping_city',
|
||||||
|
'shipping_state',
|
||||||
|
'shipping_postal_code',
|
||||||
|
'shipping_country_id',
|
||||||
|
];
|
||||||
|
|
||||||
public $invitation_id;
|
public $invitation_id;
|
||||||
|
|
||||||
public $invoices;
|
public $invoices;
|
||||||
@ -97,19 +144,58 @@ class InvoicePay extends Component
|
|||||||
public function paymentMethodSelected($company_gateway_id, $gateway_type_id, $amount)
|
public function paymentMethodSelected($company_gateway_id, $gateway_type_id, $amount)
|
||||||
{
|
{
|
||||||
//@TODO only handles single invoice scenario
|
//@TODO only handles single invoice scenario
|
||||||
|
|
||||||
$this->payment_method_accepted = true;
|
|
||||||
|
|
||||||
$this->context['company_gateway_id'] = $company_gateway_id;
|
$this->context['company_gateway_id'] = $company_gateway_id;
|
||||||
$this->context['gateway_type_id'] = $gateway_type_id;
|
$this->context['gateway_type_id'] = $gateway_type_id;
|
||||||
$this->context['amount'] = $amount;
|
$this->context['amount'] = $amount;
|
||||||
$this->context['pre_payment'] = false;
|
$this->context['pre_payment'] = false;
|
||||||
$this->context['is_recurring'] = false;
|
$this->context['is_recurring'] = false;
|
||||||
|
|
||||||
// $this->context['payable_invoices'] = ['invoice_id' => $this->context['invoice']->hashed_id, 'amount' => $amount];
|
|
||||||
|
|
||||||
$this->context['invitation_id'] = $this->invitation_id;
|
$this->context['invitation_id'] = $this->invitation_id;
|
||||||
|
|
||||||
|
$this->payment_method_accepted = true;
|
||||||
|
|
||||||
|
$company_gateway = CompanyGateway::find($company_gateway_id);
|
||||||
|
|
||||||
|
$this->checkRequiredFields($company_gateway);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[On('required-fields')]
|
||||||
|
public function requiredFieldsFilled()
|
||||||
|
{
|
||||||
|
$this->required_fields = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function checkRequiredFields(CompanyGateway $company_gateway)
|
||||||
|
{
|
||||||
|
|
||||||
|
$fields = $company_gateway->driver()->getClientRequiredFields();
|
||||||
|
$this->context['fields'] = $fields;
|
||||||
|
|
||||||
|
if($company_gateway->always_show_required_fields){
|
||||||
|
return $this->required_fields = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$contact = $this->context['contact'];
|
||||||
|
|
||||||
|
foreach ($fields as $index => $field) {
|
||||||
|
$_field = $this->mappings[$field['name']];
|
||||||
|
|
||||||
|
if (\Illuminate\Support\Str::startsWith($field['name'], 'client_')) {
|
||||||
|
if (empty($contact->client->{$_field})
|
||||||
|
|| is_null($contact->client->{$_field})
|
||||||
|
) {
|
||||||
|
|
||||||
|
return $this->required_fields = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\Illuminate\Support\Str::startsWith($field['name'], 'contact_')) {
|
||||||
|
if (empty($contact->{$_field}) || is_null($contact->{$_field}) || str_contains($contact->{$_field}, '@example.com')) {
|
||||||
|
return $this->required_fields = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,10 +214,10 @@ class InvoicePay extends Component
|
|||||||
if(!$this->payment_method_accepted)
|
if(!$this->payment_method_accepted)
|
||||||
return PaymentMethod::class;
|
return PaymentMethod::class;
|
||||||
|
|
||||||
// if($this->ready)
|
if($this->required_fields)
|
||||||
|
return RequiredFields::class;
|
||||||
|
|
||||||
|
return ProcessPayment::class;
|
||||||
return ProcessPayment::class;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Computed()]
|
#[Computed()]
|
||||||
@ -149,6 +235,7 @@ class InvoicePay extends Component
|
|||||||
$invite = \App\Models\InvoiceInvitation::with('contact.client','company')->withTrashed()->find($this->invitation_id);
|
$invite = \App\Models\InvoiceInvitation::with('contact.client','company')->withTrashed()->find($this->invitation_id);
|
||||||
$client = $invite->contact->client;
|
$client = $invite->contact->client;
|
||||||
$settings = $client->getMergedSettings();
|
$settings = $client->getMergedSettings();
|
||||||
|
$this->context['contact'] = $invite->contact;
|
||||||
$this->context['settings'] = $settings;
|
$this->context['settings'] = $settings;
|
||||||
$this->context['db'] = $this->db;
|
$this->context['db'] = $this->db;
|
||||||
|
|
||||||
|
@ -1,3 +1,37 @@
|
|||||||
<div>
|
<div x-data="{ fields: @entangle('fields'), contact: @entangle('contact') }" class="px-4 py-5 bg-white sm:gap-4 sm:px-6">
|
||||||
|
@foreach($fields as $field)
|
||||||
|
|
||||||
|
@component('portal.ninja2020.components.general.card-element', ['title' => $field['label']])
|
||||||
|
@if($field['name'] == 'client_country_id' || $field['name'] == 'client_shipping_country_id')
|
||||||
|
<select id="client_country" class="input w-full form-select bg-white" name="{{ $field['name'] }}" wire:model="{{ $field['name'] }}">
|
||||||
|
<option value="none"></option>
|
||||||
|
|
||||||
|
@foreach($countries as $country)
|
||||||
|
<option value="{{ $country->id }}">
|
||||||
|
{{ $country->iso_3166_2 }} ({{ $country->name }})
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@else
|
||||||
|
<input class="input w-full" type="{{ $field['type'] ?? 'text' }}" name="{{ $field['name'] }}" wire:model="{{ $field['name'] }}">
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if(session()->has('validation_errors') && array_key_exists($field['name'], session('validation_errors')))
|
||||||
|
<p class="mt-2 text-gray-900 border-red-300 px-2 py-1 bg-gray-100">{{ session('validation_errors')[$field['name']][0] }}</p>
|
||||||
|
@endif
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
<div class="bg-white px-4 py-5 flex w-full justify-end">
|
||||||
|
<button
|
||||||
|
class="button button-primary bg-primary payment-method flex items-center justify-center relative py-4"
|
||||||
|
@click="$wire.dispatch('required-fields')">
|
||||||
|
<svg class="animate-spin h-5 w-5 text-white hidden" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
||||||
|
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
||||||
|
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
||||||
|
</svg>
|
||||||
|
<span>{{ ctrans('texts.next') }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
Loading…
x
Reference in New Issue
Block a user