diff --git a/app/Jobs/Client/CheckVat.php b/app/Jobs/Client/CheckVat.php new file mode 100644 index 000000000000..49d5f17d2a37 --- /dev/null +++ b/app/Jobs/Client/CheckVat.php @@ -0,0 +1,65 @@ +company->db); + + $tax_service = new TaxService($this->client); + $tax_service->validateVat(); + + } + + public function middleware() + { + return [new WithoutOverlapping($this->client->id)]; + } + +} diff --git a/app/Observers/ClientObserver.php b/app/Observers/ClientObserver.php index 814ee7f0c421..4ab5d076e4a4 100644 --- a/app/Observers/ClientObserver.php +++ b/app/Observers/ClientObserver.php @@ -11,8 +11,10 @@ namespace App\Observers; +use App\Utils\Ninja; use App\Models\Client; use App\Models\Webhook; +use App\Jobs\Client\CheckVat; use App\Jobs\Util\WebhookHandler; use App\Jobs\Client\UpdateTaxData; @@ -20,6 +22,36 @@ class ClientObserver { public $afterCommit = true; + private $eu_country_codes = [ + 'AT' => '40', + 'BE' => '56', + 'BG' => '100', + 'CY' => '196', + 'CZ' => '203', + 'DE' => '276', + 'DK' => '208', + 'EE' => '233', + 'ES' => '724', + 'FI' => '246', + 'FR' => '250', + 'GR' => '300', + 'HR' => '191', + 'HU' => '348', + 'IE' => '372', + 'IT' => '380', + 'LT' => '440', + 'LU' => '442', + 'LV' => '428', + 'MT' => '470', + 'NL' => '528', + 'PL' => '616', + 'PT' => '620', + 'RO' => '642', + 'SE' => '752', + 'SI' => '705', + 'SK' => '703', + ]; + /** * Handle the client "created" event. * @@ -33,6 +65,10 @@ class ClientObserver UpdateTaxData::dispatch($client, $client->company); } + if(in_array($client->country_id, $this->eu_country_codes) && $client->company->calculate_taxes) { + CheckVat::dispatch($client, $client->company); + } + $subscriptions = Webhook::where('company_id', $client->company_id) ->where('event_id', Webhook::EVENT_CREATE_CLIENT) ->exists(); @@ -50,11 +86,17 @@ class ClientObserver */ public function updated(Client $client) { - if($client->getOriginal('postal_code') != $client->postal_code && $client->country_id == 840 && $client->company->calculate_taxes) - { + + /** Monitor postal code changes for US based clients for tax calculations */ + if(Ninja::isHosted() && $client->getOriginal('postal_code') != $client->postal_code && $client->country_id == 840 && $client->company->calculate_taxes) { UpdateTaxData::dispatch($client, $client->company); } + /** Monitor vat numbers for EU based clients for tax calculations */ + if($client->getOriginal('vat_number') != $client->vat_number && in_array($client->country_id, $this->eu_country_codes) && $client->company->calculate_taxes) { + CheckVat::dispatch($client, $client->company); + } + $event = Webhook::EVENT_UPDATE_CLIENT; if ($client->getOriginal('deleted_at') && !$client->deleted_at) { diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php index 851dd83e7d06..ec324ef6934d 100644 --- a/app/Repositories/ClientRepository.php +++ b/app/Repositories/ClientRepository.php @@ -117,9 +117,12 @@ class ClientRepository extends BaseRepository */ public function create($client): ?Client { + /** @var \App\Models\User $user */ + $user = auth()->user(); + return $this->save( $client, - ClientFactory::create(auth()->user()->company()->id, auth()->user()->id) + ClientFactory::create($user->company()->id, $user->id) ); } diff --git a/app/Services/Tax/TaxService.php b/app/Services/Tax/TaxService.php index 89dd1ba7c31c..02d1f2162352 100644 --- a/app/Services/Tax/TaxService.php +++ b/app/Services/Tax/TaxService.php @@ -26,10 +26,13 @@ class TaxService $vat_check = (new VatNumberCheck($this->client->vat_number, $client_country_code))->run(); - $this->client->has_valid_vat_number = $vat_check->isValid(); - $this->client->saveQuietly(); + if($vat_check->isValid()) { + $this->client->has_valid_vat_number = true; + $this->client->saveQuietly(); + } return $this; + } public function initTaxProvider()