領収証発行サービス
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.

155 lines
5.1KB

  1. <?php
  2. namespace App\Repositories;
  3. use App\Exceptions\AppCommonException;
  4. use App\Models\ReceiptIssuingOrder;
  5. use App\Models\SMSSendOrder;
  6. use App\Repositories\BaseRepository;
  7. use App\Util\SelectQueryUtil;
  8. use Illuminate\Database\Query\Builder;
  9. use Illuminate\Database\Query\JoinClause;
  10. use Illuminate\Support\Carbon;
  11. use Illuminate\Support\Collection;
  12. use Illuminate\Support\Facades\DB;
  13. class UseSummaryRepository extends BaseRepository
  14. {
  15. // 必須検索項目
  16. const CONDITION_CONTRACT_ID = 'contract_id';
  17. const CONDITION_ORDER_DATE_FROM = 'date_from';
  18. const CONDITION_ORDER_DATE_TO = 'date_to';
  19. protected const TABLE_TARGET = "target";
  20. protected const TABLE_SMS = "SMS";
  21. protected const TABLE_SUMMARY = "summary";
  22. protected Carbon $dateFrom;
  23. protected Carbon $dateTo;
  24. protected Carbon $dateToOrigin;
  25. /**
  26. * コレクションを取得する
  27. *
  28. * @param array $condition
  29. * @return Collection<UseSummaryRepositoryData>
  30. */
  31. public function get(array $condition): Collection
  32. {
  33. return UseSummaryRepositoryData::makeList($this->builder($condition)->get());
  34. }
  35. protected function builder(array $condition): Builder
  36. {
  37. $contractId = data_get($condition, self::CONDITION_CONTRACT_ID);
  38. $dateFrom = data_get($condition, self::CONDITION_ORDER_DATE_FROM);
  39. $dateTo = data_get($condition, self::CONDITION_ORDER_DATE_TO);
  40. if (!($dateFrom instanceof Carbon) || !($dateTo instanceof Carbon)) {
  41. throw new AppCommonException('検索日付不正');
  42. }
  43. $this->dateFrom = $dateFrom->clone();
  44. $this->dateToOrigin = $dateTo->clone();
  45. $this->dateTo = $dateTo->clone()->addDay();
  46. $target = ReceiptIssuingOrder::getBuilder(self::TABLE_TARGET);
  47. if ($contractId) {
  48. $target->where(
  49. $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_CONTRACT_ID]),
  50. $contractId
  51. );
  52. }
  53. $target->where(
  54. $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]),
  55. '>=',
  56. $dateFrom
  57. )
  58. ->where(
  59. $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]),
  60. '<',
  61. $dateTo->clone()->addDay()
  62. );
  63. $smsCount = $target->clone()
  64. ->joinSub(
  65. SMSSendOrder::getBuilder(),
  66. self::TABLE_SMS,
  67. function (JoinClause $join) {
  68. $join->on(
  69. $this->makeColumnName([static::TABLE_SMS, SMSSendOrder::COL_NAME_RECEIPT_ISSUING_ORDER_ID]),
  70. $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ID]),
  71. );
  72. }
  73. )
  74. ->whereNotNull(SMSSendOrder::COL_NAME_SEND_DATETIME)
  75. ->groupBy(
  76. $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()])
  77. )
  78. ->select([
  79. $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()]),
  80. DB::raw('count(*) as sms_send_count'),
  81. ]);
  82. $orderCount = $target->clone()
  83. ->groupBy(
  84. $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()])
  85. )
  86. ->select([
  87. $this->groupByColumn(),
  88. DB::raw(sprintf("count(*) as %s", 'receipt_order_count')),
  89. DB::raw(sprintf("count(%s) as %s", ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME, 'mail_order_count')),
  90. ]);
  91. $summary = DB::table($orderCount, self::TABLE_SUMMARY)
  92. ->joinSub(
  93. $smsCount,
  94. self::TABLE_SMS,
  95. function (JoinClause $join) {
  96. $join->on(
  97. $this->makeColumnName([static::TABLE_SMS, $this->groupByColumn()]),
  98. $this->makeColumnName([static::TABLE_SUMMARY, $this->groupByColumn()]),
  99. );
  100. }
  101. );
  102. $main = $summary;
  103. $main->select($this->columns());
  104. // ソート
  105. $this->sort($main, $condition);
  106. $main->orderBy(
  107. $this->makeColumnName([static::TABLE_SUMMARY, $this->groupByColumn()]),
  108. );
  109. // リミット
  110. $this->limit($main, $condition);
  111. return $main;
  112. }
  113. protected function columns()
  114. {
  115. $sms = self::TABLE_SMS;
  116. $summary = self::TABLE_SUMMARY;
  117. $columns = [
  118. SelectQueryUtil::value($this->dateFrom->format('Y/m/d'), 'date_from'),
  119. SelectQueryUtil::value($this->dateToOrigin->format('Y/m/d'), 'date_to'),
  120. SelectQueryUtil::select([$summary, 'receipt_order_count'])->build(),
  121. SelectQueryUtil::select([$summary, 'mail_order_count'])->build(),
  122. SelectQueryUtil::select([$sms, 'sms_send_count'])->nullValue(0)->build(),
  123. ];
  124. return $columns;
  125. }
  126. protected function groupByColumn(): string
  127. {
  128. return ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1;
  129. }
  130. }