領収証発行サービス
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

153 rindas
5.0KB

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