<?php namespace App\Jobs; use Carbon\Carbon; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; use App\Models\{Tax,ProviderToken}; /** * Synchronise TAX ids with our taxes. * * This will only update our records, it wont create new records in the account system, nor in our DB */ class AccountingTaxSync implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private const LOGKEY = 'JTS'; private ProviderToken $to; /** * Create a new job instance. * * @param ProviderToken $to */ public function __construct(ProviderToken $to) { $this->to = $to; } /** * Execute the job. * * @return void * @throws \Exception */ public function handle() { $api = $this->to->API(); $ref = Tax::select(['id','description'])->get(); foreach ($api->getTaxCodes() as $acc) { $o = NULL; // See if we are already linked if (($x=$this->to->provider->taxes->where('pivot.ref',$acc->id))->count() === 1) { $o = $x->pop(); /* // If not, see if our reference matches } elseif (($x=$ref->filter(function($item) use ($acc) { return $item->sid == $acc->ref; }))->count() === 1) { $o = $x->pop(); */ // Look based on Name } elseif (($x=$ref->filter(function($item) use ($acc) { return $item->description === $acc->name; }))->count() === 1) { $o = $x->pop(); } else { // Log not found Log::alert(sprintf('%s:Tax not found [%s:%s]',self::LOGKEY,$acc->id,$acc->name)); continue; } $o->providers()->syncWithoutDetaching([ $this->to->provider->id => [ 'ref' => $acc->id, 'synctoken' => $acc->synctoken, 'created_at'=>Carbon::create($acc->created_at), 'updated_at'=>Carbon::create($acc->updated_at), 'site_id'=>$this->to->site_id, ], ]); Log::alert(sprintf('%s:Tax updated [%s:%s]',self::LOGKEY,$o->id,$acc->id)); } } }