feat(address): implement Address and TenantAddress models with relationships
feat(migration): create addresses and tenant_addresses tables feat(migration): add data migration for copying contact menu addresses test: add ContactAddressesTest for address and tenant address functionality
This commit is contained in:
29
app/Domains/Core/Address/Models/Address.php
Normal file
29
app/Domains/Core/Address/Models/Address.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Core\Address\Models;
|
||||
|
||||
use App\Domains\Core\Tenant\Models\Tenant;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
|
||||
class Address extends Model
|
||||
{
|
||||
protected $fillable = ['label', 'address_text', 'latitude', 'longitude'];
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'latitude' => 'decimal:7',
|
||||
'longitude' => 'decimal:7',
|
||||
];
|
||||
}
|
||||
|
||||
/** @return BelongsToMany<Tenant, $this> */
|
||||
public function tenants(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Tenant::class, 'tenant_addresses', 'address_id', 'tenant_codigo', 'id', 'codigo')
|
||||
->using(TenantAddress::class)
|
||||
->withPivot(['id', 'is_main'])
|
||||
->withTimestamps();
|
||||
}
|
||||
}
|
||||
33
app/Domains/Core/Address/Models/TenantAddress.php
Normal file
33
app/Domains/Core/Address/Models/TenantAddress.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Core\Address\Models;
|
||||
|
||||
use App\Domains\Core\Tenant\Models\Tenant;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\Pivot;
|
||||
|
||||
class TenantAddress extends Pivot
|
||||
{
|
||||
protected $table = 'tenant_addresses';
|
||||
|
||||
public $incrementing = true;
|
||||
|
||||
protected $fillable = ['tenant_codigo', 'address_id', 'is_main'];
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return ['is_main' => 'boolean'];
|
||||
}
|
||||
|
||||
/** @return BelongsTo<Tenant, $this> */
|
||||
public function tenant(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Tenant::class, 'tenant_codigo', 'codigo');
|
||||
}
|
||||
|
||||
/** @return BelongsTo<Address, $this> */
|
||||
public function address(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Address::class);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,8 @@ use App\Domains\Commerce\Catalog\Enums\GroupLayout;
|
||||
use App\Domains\Commerce\Catalog\Enums\ProductLayout;
|
||||
use App\Domains\Commerce\Catalog\Models\CatalogItem;
|
||||
use App\Domains\Commerce\Catalog\Models\Category;
|
||||
use App\Domains\Core\Address\Models\Address;
|
||||
use App\Domains\Core\Address\Models\TenantAddress;
|
||||
use App\Domains\Core\Client\Models\Client;
|
||||
use App\Domains\Core\Menu\Models\Menu;
|
||||
use App\Domains\Core\Menu\Models\TenantMenu;
|
||||
@@ -22,6 +24,7 @@ use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
#[Fillable([
|
||||
@@ -308,6 +311,22 @@ class Tenant extends Model
|
||||
return $this->hasMany(WebsiteExtra::class, 'website_code', 'codigo');
|
||||
}
|
||||
|
||||
/** @return BelongsToMany<Address, $this> */
|
||||
public function addresses(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Address::class, 'tenant_addresses', 'tenant_codigo', 'address_id', 'codigo', 'id')
|
||||
->using(TenantAddress::class)
|
||||
->withPivot(['id', 'is_main'])
|
||||
->withTimestamps();
|
||||
}
|
||||
|
||||
/** @return HasOneThrough<Address, TenantAddress, $this> */
|
||||
public function mainAddress(): HasOneThrough
|
||||
{
|
||||
return $this->hasOneThrough(Address::class, TenantAddress::class, 'tenant_codigo', 'id', 'codigo', 'address_id')
|
||||
->where('tenant_addresses.is_main', true);
|
||||
}
|
||||
|
||||
public function menues(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(
|
||||
|
||||
26
app/Domains/Core/Tenant/Services/TenantAddressService.php
Normal file
26
app/Domains/Core/Tenant/Services/TenantAddressService.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Core\Tenant\Services;
|
||||
|
||||
use App\Domains\Core\Address\Models\Address;
|
||||
use App\Domains\Core\Tenant\Models\Tenant;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class TenantAddressService
|
||||
{
|
||||
public function setMainAddress(Tenant $tenant, Address $address): void
|
||||
{
|
||||
DB::transaction(function () use ($tenant, $address): void {
|
||||
// Serialize changes for this tenant, including when it has no principal address yet.
|
||||
Tenant::query()->where('codigo', $tenant->codigo)->lockForUpdate()->firstOrFail();
|
||||
$tenant->addresses()->where('addresses.id', $address->id)->firstOrFail();
|
||||
|
||||
DB::table('tenant_addresses')->where('tenant_codigo', $tenant->codigo)
|
||||
->where('is_main', true)->update(['is_main' => false, 'updated_at' => now()]);
|
||||
$tenant->addresses()->updateExistingPivot($address->id, ['is_main' => true]);
|
||||
});
|
||||
|
||||
$tenant->unsetRelation('addresses');
|
||||
$tenant->unsetRelation('mainAddress');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user