|
- <?php
-
- namespace App\Repositories\Custom\HelloTechno;
-
- use App\Exceptions\AppCommonException;
- use App\Models\HtCustomParkingName;
- use App\Models\ReceiptIssuingHTParkingCustomOrder;
- use App\Models\ReceiptIssuingOrder;
- use App\Models\SMSSendOrder;
- use App\Models\UseByKeySummary;
- use App\Repositories\BaseRepository;
- use App\Util\SelectQueryUtil;
- use Illuminate\Database\Query\JoinClause;
- use Illuminate\Support\Carbon;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Storage;
- use LogicException;
-
- class UseSummaryRepository extends BaseRepository
- {
- // 必須検索項目
- const CONDITION_CONTRACT_ID = 'contract_id';
- const CONDITION_ORDER_DATE_FROM = 'date_from';
- const CONDITION_ORDER_DATE_TO = 'date_to';
-
- const CONDITION_CUSTOMER_CODE = 'customer_code';
-
- private const TABLE_TARGET = "target";
- private const TABLE_SMS = "SMS";
- private const TABLE_SUMMARY = "summary";
- private const TABLE_NAME = "name";
-
-
- private Carbon $dateFrom;
- private Carbon $dateTo;
-
-
- /**
- * コレクションを取得する
- *
- * @param array $condition
- * @return Collection<UseSummaryRepositoryData>
- */
- public function get(array $condition): Collection
- {
- $contractId = data_get($condition, self::CONDITION_CONTRACT_ID);
-
- if (!$contractId) {
- throw new AppCommonException('契約ID不正');
- }
-
- $dateFrom = data_get($condition, self::CONDITION_ORDER_DATE_FROM);
- $dateTo = data_get($condition, self::CONDITION_ORDER_DATE_TO);
-
- if (!($dateFrom instanceof Carbon) || !($dateTo instanceof Carbon)) {
- throw new AppCommonException('検索日付不正');
- }
- $this->dateFrom = $dateFrom;
- $this->dateTo = $dateTo->addDay();
-
- $target = ReceiptIssuingOrder::getBuilder(self::TABLE_TARGET)
- ->where(
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_CONTRACT_ID]),
- $contractId
- )
- ->where(
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]),
- '>=',
- $dateFrom
- )
- ->where(
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]),
- '<',
- $dateTo
- );
-
- $customerCode = data_get($condition, self::CONDITION_CUSTOMER_CODE);
- if ($customerCode) {
- $target->where(
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]),
- $customerCode
- );
- }
-
- $smsCount = $target->clone()
- ->joinSub(
- SMSSendOrder::getBuilder(),
- self::TABLE_SMS,
- function (JoinClause $join) {
- $join->on(
- $this->makeColumnName([static::TABLE_SMS, SMSSendOrder::COL_NAME_RECEIPT_ISSUING_ORDER_ID]),
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ID]),
- );
- }
- )
- ->whereNotNull(SMSSendOrder::COL_NAME_SEND_DATETIME)
- ->groupBy(
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1])
- )
- ->select([
- $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]),
- DB::raw('count(*) as sms_send_count'),
- ]);
-
- $orderCount = $target->clone()
- ->groupBy([
- $this->makeColumnName([static::TABLE_TARGET, UseByKeySummary::COL_NAME_SUMMARY_KEY1])
- ])
- ->select([
- ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1,
- DB::raw(sprintf("count(*) as %s", 'receipt_order_count')),
- DB::raw(sprintf("count(%s) as %s", ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME, 'mail_order_count')),
- ]);
-
- $summary = DB::table($orderCount, self::TABLE_SUMMARY)
- ->joinSub(
- $smsCount,
- self::TABLE_SMS,
- function (JoinClause $join) {
- $join->on(
- $this->makeColumnName([static::TABLE_SMS, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]),
- $this->makeColumnName([static::TABLE_SUMMARY, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]),
- );
- }
- );
-
-
- // 顧客名解決
- $name = HtCustomParkingName::getBuilder()->select([
- HtCustomParkingName::COL_NAME_CUSTOMER_CODE,
- HtCustomParkingName::COL_NAME_CUSTOMER_NAME,
- DB::raw('RANK() OVER(PARTITION BY customer_code ORDER BY updated_at DESC) as rank')
- ]);
-
- $main = $summary
- ->leftJoinSub($name, static::TABLE_NAME, function (JoinClause $join) {
- $join->on(
- $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_KEY1]),
- $this->makeColumnName([static::TABLE_NAME, HtCustomParkingName::COL_NAME_CUSTOMER_CODE])
- )->where($this->makeColumnName([static::TABLE_NAME, 'rank']), 1);
- });
-
-
-
-
- // $main = DB::table($table, "main");
-
- $main->select($this->columns());
- // ソート
- $this->sort($main, $condition);
- $main->orderBy(
- $this->makeColumnName([static::TABLE_SUMMARY, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]),
- );
-
- // リミット
- $this->limit($main, $condition);
-
- $sql = $main->toSql();
-
- Storage::put('summary.sql', $sql);
-
- return UseSummaryRepositoryData::makeList($main->get());
- }
-
- private function columns()
- {
-
- $sms = self::TABLE_SMS;
- $summary = self::TABLE_SUMMARY;
- $name = self::TABLE_NAME;
- $columns = [
- SelectQueryUtil::value($this->dateFrom->format('Y/m/d'), 'date_from'),
- SelectQueryUtil::value($this->dateTo->format('Y/m/d'), 'date_to'),
- SelectQueryUtil::select([$name, HtCustomParkingName::COL_NAME_CUSTOMER_CODE])->build(),
- SelectQueryUtil::select([$name, HtCustomParkingName::COL_NAME_CUSTOMER_NAME])->build(),
- SelectQueryUtil::select([$summary, 'receipt_order_count'])->build(),
- SelectQueryUtil::select([$summary, 'mail_order_count'])->build(),
- SelectQueryUtil::select([$sms, 'sms_send_count'])->nullValue(0)->build(),
- ];
- return $columns;
- }
- }
|