lk.zachem.info/app/Modules/Bitrix/Models/BitrixId.php

111 lines
3.7 KiB
PHP

<?php
namespace Modules\Bitrix\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Hash;
use Modules\Main\Models\Deal\Deal;
use Modules\Main\Models\Deal\Client;
use Modules\Main\Models\Deal\DealClients;
use Modules\Main\Models\Agent\Agent;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Complex;
class BitrixId extends Model
{
use HasFactory;
protected $table = 'bx_ids';
protected $fillable = [
'bx_id'
];
public function bitrixable(): MorphTo
{
return $this->morphTo();
}
protected static function booted()
{
static::creating(function (BitrixId $bitrixId)
{
if ($bitrixId->bx_id)
{
return;
}
$object = false;
$sender = new BitrixSender();
switch ( $bitrixId->bitrixable_type )
{
case Deal::class:
$deal = Deal::findOrFail($bitrixId->bitrixable_id);
$sender = new SendDeal($deal);
$object = $deal;
break;
case Agent::class:
$agent = Agent::findOrFail($bitrixId->bitrixable_id);
$sender = new SendAgent($agent);
break;
case DealClients::class:
$dealClient = DealClients::findOrFail($bitrixId->bitrixable_id);
$client = $dealClient->client;
$sender = new SendClient($client);
$bitrixId->bitrixable_type = Client::class;
$bitrixId->bitrixable_id = $client->id;
$object = $client;
break;
case Company::class:
$company = Company::findOrFail($bitrixId->bitrixable_id);
$sender = new SendCompany($company);
$object = $company;
break;
}
if ($sender)
{
$bitrixId->token = Hash::make(json_encode([$object]));
$sender->setCallbackUrl(
route('api.company.confirm', [
'token' => $bitrixId->token
])
);
$result = $sender->send();
if ($result)
{
$id = $sender->resultData['id'];
$bitrixId->bx_id = $id;
return;
};
}
throw new \Exception('Error of bitrix identifier getter for ' . $bitrixId->bitrixable_type . ' with id ' . $bitrixId->bitrixable_id);
});
static::created(function (BitrixId $bitrixId)
{
if (!$bitrixId->bx_id)
{
return;
}
switch ( $bitrixId->bitrixable_type )
{
case Deal::class:
$deal = Deal::findOrFail($bitrixId->bitrixable_id);
$agentAppender = new SendDealAgent($deal);
$agentAppender->send();
break;
case Client::class:
$client = Client::findOrFail($bitrixId->bitrixable_id);
if ($dealClient = DealClients::where('client_id', $client->id)->orderByDesc('id')->first())
{
$clientAppender = new SendDealClient(Deal::find($dealClient->deal_id), $client);
$result = $clientAppender->send();
}
break;
}
});
}
}