HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/ipsremont-demo/docs/Заметки по коду.md
Я немного стандартизировала код
Смотри для примера `BranchRepository`, `PartRepository` и их модели

#### Модели
Для всех моделей подключаются трейты **Displayed** и **My**

**scopeMy()** - теперь все выборки данных делаем через него, не важно в модели ,или в репозитории ,или еще где.
По-умолчанию просто возвращает `query`, но есть возможность переписать в модели добавив разграничение доступа

**scopeDisplayed()**
Для моделей, которые можно включать/выключать

Модели наследуют `BaseModel` - там есть методы для получения подписей к полям и колонок для грида.

#### Репозитории
Все репозитории наследуются от `BaseRepository`.
Все запросы к данным должны идти через **getAvailable** - возвращает доступные мне модели.

**getDisplayed** - возвращает доступные мне модели и которые включены `displayed` 1.
Например, для всех селектов, когда мы даем что-то выбрать.
Привязать склад к подразделению - то в селект попадают только включенные объекты.

**getById** - ищет по ид, среди доступных мне моделей.

#### Сервисы
Сервисы я тоже немного поменяла, добавила статические методы, так как не всегда удобно создавать объект.
Смотри `BranchService`.
_Вообще их тоже можно наследовать от одного, можешь создать `BaseService` когда будешь делать каталог._

В `gridTrait` добавила **makeQueryOrdered** - для работы по новым методам.

`WarehouseService` - там есть методы-образцы для получения айтемов для селектов и для ajax.

#### Права доступа

**Посмотри модель User** - там много scope которые нужно использовать, когда тебе нужно получить каких-то определенных юзеров.
Нужно использовать везде одни и те же методы, а не писать свои.
Можно добавлять свои методы в сервис/репозиторий юзер, но даже там делать выборки через scope модели если есть подходящий.

Права проверять константами из модели `app/Models/Permission.php`
Типы ролей константами из `app/Models/Role.php`

#### Логи
Теперь при изменении моделей создается запись в таблице logs. Собственно какие observer созданы, для тех моделей и пишутся логи.
Что нужно держать в голове:
После обновления relations - вызывать метод

```php
LogService::updatedRelations($модель, 'relation name', $new relation array);
```

Если модель хранит приватные данные типа паролей, переопределить observer event и скрыть данные из лога. Образец - пароль юзера.

Если обновление несущественное, можно сделать такое, чтобы избежать логов.

```php
$model= Service::withoutEvents(function () use ($model) {
   $model->save();
   
   return $model;
});
```

#### Деплой
Теперь добавление постоянных данных, прав и тд - в миграциях.
Сидеры только для демо данных. Все новые - добавлять в `Init2Seeder` и в ридми дописывать в список по отдельности

Если для запуска модуля нужно что-то кроме composer install/update и миграций - то пиши команды в блок ридми "Для запуска модуля"