| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | <?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
trait HandlesResourceRecordCreation
{
    protected function handleRecordCreationWithUniqueField(array $data, Model $model, string|null $uniqueField = null): Model
    {
        return DB::transaction(function () use ($data, $uniqueField, $model) {
            $currentCompanyId = Auth::user()->currentCompany->id;
            $uniqueFieldValue = $data[$uniqueField] ?? null;
            $enabled = (bool)($data['enabled'] ?? false);
            if ($enabled === true) {
                $this->disableExistingRecord($currentCompanyId, $model, $uniqueField, $uniqueFieldValue);
            } else {
                $this->ensureAtLeastOneEnabled($currentCompanyId, $model, $enabled, $uniqueField, $uniqueFieldValue);
            }
            $data['enabled'] = $enabled;
            return $model::create($data);
        });
    }
    protected function disableExistingRecord(int $companyId, Model $model, string|null $uniqueField = null, string|null $uniqueFieldValue = null): void
    {
        $query = $model::where('company_id', $companyId)
            ->where('enabled', true);
        if($uniqueField && $uniqueFieldValue){
            $query->where($uniqueField, $uniqueFieldValue);
        }
        $existingEnabledRecord = $query->first();
        if ($existingEnabledRecord !== null) {
            $existingEnabledRecord->enabled = false;
            $existingEnabledRecord->save();
        }
    }
    protected function ensureAtLeastOneEnabled(int $companyId, Model $model, bool &$enabled, string|null $uniqueField = null, string|null $uniqueFieldValue = null): void
    {
        $query = $model::where('company_id', $companyId)
            ->where('enabled', true);
        if($uniqueField && $uniqueFieldValue){
            $query->where($uniqueField, $uniqueFieldValue);
        }
        $otherEnabledRecords = $query->count();
        if ($otherEnabledRecords === 0) {
            $enabled = true;
        }
    }
}
 |