領収証発行サービス
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

184 Zeilen
6.6KB

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