領収証発行サービス
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.4KB

  1. <?php
  2. namespace App\Repositories;
  3. use App\Codes\UserRole;
  4. use App\Models\Contract;
  5. use App\Models\User;
  6. use App\Repositories\BaseRepository;
  7. use Illuminate\Database\Query\JoinClause;
  8. use Illuminate\Support\Collection;
  9. use Illuminate\Support\Facades\DB;
  10. class LoginUserRepository extends BaseRepository
  11. {
  12. const CONDITION_ID = 'id';
  13. const CONDITION_NAME = 'name';
  14. const CONDITION_ROLE = 'role';
  15. const CONDITION_EMAIL = 'email';
  16. const CONDITION_CONTRACT_ID = 'contract_id';
  17. const TABLE_USER = "user";
  18. const TABLE_CONTRACT = 'contract';
  19. /**
  20. * コレクションを取得する
  21. *
  22. * @param array $condition
  23. * @return Collection<LoginUserRepositoryData>
  24. */
  25. public function get(array $condition): Collection
  26. {
  27. $table = User::getBuilder(static::TABLE_USER);
  28. $table->leftJoinSub(Contract::getBuilder(), static::TABLE_CONTRACT, function (JoinClause $join) {
  29. $join->on(
  30. $this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]),
  31. $this->makeColumnName([static::TABLE_CONTRACT, Contract::COL_NAME_ID])
  32. );
  33. });
  34. // -----検索条件
  35. // ID
  36. $this->where($table, $condition, static::CONDITION_ID, $this->makeColumnName([static::TABLE_USER, User::COL_NAME_ID]));
  37. // 名前
  38. $name = data_get($condition, static::CONDITION_NAME);
  39. if ($name) {
  40. $table->where($this->makeColumnName([static::TABLE_USER, User::COL_NAME_NAME]), 'like', "%{$name}%");
  41. }
  42. // EMAIL
  43. $email = data_get($condition, static::CONDITION_EMAIL);
  44. if ($email) {
  45. $table->where($this->makeColumnName([static::TABLE_USER, User::COL_NAME_EMAIL]), 'like', "%{$email}%");
  46. }
  47. // 契約ID
  48. $contractId = data_get($condition, static::CONDITION_CONTRACT_ID);
  49. if ($contractId) {
  50. $this->where($table, $condition, static::CONDITION_CONTRACT_ID, $this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]));
  51. } else {
  52. // スーパー管理者
  53. $table->where($this->makeColumnName([static::TABLE_USER, User::COL_NAME_ROLE]), UserRole::SUPER_ADMIN);
  54. $table->whereNull($this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]));
  55. }
  56. $table->select($this->columns());
  57. $main = DB::table($table, "main");
  58. // ソート
  59. $this->sort($main, $condition);
  60. $main->orderBy(static::CONDITION_ID);
  61. // リミット
  62. $this->limit($main, $condition);
  63. return LoginUserRepositoryData::makeList($main->get());
  64. }
  65. private function columns()
  66. {
  67. $user = static::TABLE_USER;
  68. $contract = static::TABLE_CONTRACT;
  69. $columns = [
  70. $this->makeColumnNameForSelect([$user, User::COL_NAME_ID]),
  71. $this->makeColumnNameForSelect([$user, User::COL_NAME_NAME]),
  72. $this->makeColumnNameForSelect([$user, User::COL_NAME_ROLE]),
  73. $this->makeColumnNameForSelect([$user, User::COL_NAME_EMAIL]),
  74. // 契約とログイン情報の大きい方
  75. DB::raw(
  76. sprintf(
  77. 'GREATEST("%s"."%s","%s"."%s") as updated_at',
  78. $user,
  79. User::COL_NAME_UPDATED_AT,
  80. $contract,
  81. Contract::COL_NAME_UPDATED_AT,
  82. )
  83. ),
  84. ];
  85. return $columns;
  86. }
  87. }