| @@ -0,0 +1,56 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\UseSummary; | |||
| use App\Codes\UserRole; | |||
| use App\Features\LoginUser; | |||
| use App\Http\Controllers\Web\IParam; | |||
| use App\Http\Controllers\Web\WebController; | |||
| use App\Repositories\UseSummaryByContractRepository as Repository; | |||
| use Illuminate\Http\JsonResponse; | |||
| use Illuminate\Http\Request; | |||
| class UseSummariesByContractController extends WebController | |||
| { | |||
| use LoginUser; | |||
| public function name(): string | |||
| { | |||
| return "利用実績一覧取得"; | |||
| } | |||
| public function description(): string | |||
| { | |||
| return "利用実績の一覧を取得する"; | |||
| } | |||
| public function __construct( | |||
| protected UseSummariesByContractParam $param, | |||
| private Repository $repository | |||
| ) { | |||
| parent::__construct(); | |||
| $this->roleAllow(UserRole::SUPER_ADMIN); | |||
| } | |||
| protected function getParam(): IParam | |||
| { | |||
| return $this->param; | |||
| } | |||
| protected function run(Request $request): JsonResponse | |||
| { | |||
| $param = $this->param; | |||
| $condition = [ | |||
| ...$param->toArray(), | |||
| ]; | |||
| $list = $this->repository->get($condition); | |||
| return $this->successResponse([ | |||
| 'records' => $list | |||
| ]); | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\UseSummary; | |||
| use App\Http\Controllers\Web\BaseParam; | |||
| use App\Repositories\UseSummaryByContractRepository as Repository; | |||
| use Illuminate\Support\Carbon; | |||
| /** | |||
| * @property Carbon $dateFrom | |||
| * @property Carbon $dateTo | |||
| * @property ?string $contractName | |||
| */ | |||
| class UseSummariesByContractParam extends BaseParam | |||
| { | |||
| public function rules(): array | |||
| { | |||
| return | |||
| array_merge( | |||
| [ | |||
| Repository::CONDITION_ORDER_DATE_FROM => $this->date(), | |||
| Repository::CONDITION_ORDER_DATE_TO => $this->date(), | |||
| Repository::CONDITION_CONTRACT_NAME => $this->str(true), | |||
| ], | |||
| $this->sortableRules(), | |||
| ); | |||
| } | |||
| } | |||
| @@ -2,40 +2,22 @@ | |||
| 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\Repositories\UseSummaryRepository as BaseRepository; | |||
| use App\Util\SelectQueryUtil; | |||
| use Illuminate\Database\Query\Builder; | |||
| 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; | |||
| /** | |||
| * コレクションを取得する | |||
| * | |||
| @@ -44,87 +26,13 @@ class UseSummaryRepository extends BaseRepository | |||
| */ | |||
| 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')), | |||
| ]); | |||
| return UseSummaryRepositoryData::makeList($this->builder($condition)->get()); | |||
| } | |||
| $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]), | |||
| ); | |||
| } | |||
| ); | |||
| protected function builder(array $condition): Builder | |||
| { | |||
| $builder = parent::builder($condition); | |||
| // 顧客名解決 | |||
| $name = HtCustomParkingName::getBuilder()->select([ | |||
| @@ -133,7 +41,7 @@ class UseSummaryRepository extends BaseRepository | |||
| DB::raw('RANK() OVER(PARTITION BY customer_code ORDER BY updated_at DESC) as rank') | |||
| ]); | |||
| $main = $summary | |||
| $builder | |||
| ->leftJoinSub($name, static::TABLE_NAME, function (JoinClause $join) { | |||
| $join->on( | |||
| $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_KEY1]), | |||
| @@ -141,42 +49,16 @@ class UseSummaryRepository extends BaseRepository | |||
| )->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()); | |||
| return $builder; | |||
| } | |||
| private function columns() | |||
| protected 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'), | |||
| ...parent::columns(), | |||
| 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; | |||
| } | |||
| @@ -2,10 +2,10 @@ | |||
| namespace App\Repositories\Custom\HelloTechno; | |||
| use App\Repositories\BaseRepositoryData; | |||
| use App\Repositories\UseSummaryRepositoryData as BaseData; | |||
| /** | |||
| */ | |||
| class UseSummaryRepositoryData extends BaseRepositoryData | |||
| class UseSummaryRepositoryData extends BaseData | |||
| { | |||
| } | |||
| @@ -0,0 +1,72 @@ | |||
| <?php | |||
| namespace App\Repositories; | |||
| use App\Models\Contract; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\UseByKeySummary; | |||
| use App\Util\SelectQueryUtil; | |||
| use Illuminate\Database\Query\Builder; | |||
| use Illuminate\Database\Query\JoinClause; | |||
| use Illuminate\Support\Collection; | |||
| class UseSummaryByContractRepository extends UseSummaryRepository | |||
| { | |||
| const CONDITION_CONTRACT_NAME = 'contract_name'; | |||
| private const TABLE_CONTRACT = 'contract'; | |||
| /** | |||
| * コレクションを取得する | |||
| * | |||
| * @param array $condition | |||
| * @return Collection<UseSummaryByContractRepositoryData> | |||
| */ | |||
| public function get(array $condition): Collection | |||
| { | |||
| return UseSummaryByContractRepositoryData::makeList($this->builder($condition)->get()); | |||
| } | |||
| protected function builder(array $condition): Builder | |||
| { | |||
| $builder = parent::builder($condition); | |||
| // 契約名解決 | |||
| $builder | |||
| ->leftJoinSub(Contract::getBuilder(), static::TABLE_CONTRACT, function (JoinClause $join) { | |||
| $join->on( | |||
| $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_CONTRACT_ID]), | |||
| $this->makeColumnName([static::TABLE_CONTRACT, Contract::COL_NAME_ID]) | |||
| ); | |||
| }); | |||
| $contractName = data_get($condition, self::CONDITION_CONTRACT_NAME); | |||
| if ($contractName) { | |||
| $builder->where($this->makeColumnName([self::TABLE_CONTRACT, Contract::COL_NAME_NAME]), 'like', '%' . $contractName . '%'); | |||
| } | |||
| return $builder; | |||
| } | |||
| protected function columns() | |||
| { | |||
| $contract = self::TABLE_CONTRACT; | |||
| $columns = [ | |||
| ...parent::columns(), | |||
| SelectQueryUtil::select([$contract, Contract::COL_NAME_ID])->as("contract_id")->build(), | |||
| SelectQueryUtil::select([$contract, Contract::COL_NAME_NAME])->as("contract_name")->build(), | |||
| ]; | |||
| return $columns; | |||
| } | |||
| protected function groupByColumn(): string | |||
| { | |||
| return ReceiptIssuingOrder::COL_NAME_CONTRACT_ID; | |||
| } | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| <?php | |||
| namespace App\Repositories; | |||
| /** | |||
| */ | |||
| class UseSummaryByContractRepositoryData extends BaseRepositoryData | |||
| { | |||
| } | |||
| @@ -0,0 +1,152 @@ | |||
| <?php | |||
| namespace App\Repositories; | |||
| use App\Exceptions\AppCommonException; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\SMSSendOrder; | |||
| use App\Repositories\BaseRepository; | |||
| use App\Util\SelectQueryUtil; | |||
| use Illuminate\Database\Query\Builder; | |||
| use Illuminate\Database\Query\JoinClause; | |||
| use Illuminate\Support\Carbon; | |||
| use Illuminate\Support\Collection; | |||
| use Illuminate\Support\Facades\DB; | |||
| class UseSummaryRepository extends BaseRepository | |||
| { | |||
| // 必須検索項目 | |||
| const CONDITION_CONTRACT_ID = 'contract_id'; | |||
| const CONDITION_ORDER_DATE_FROM = 'date_from'; | |||
| const CONDITION_ORDER_DATE_TO = 'date_to'; | |||
| protected const TABLE_TARGET = "target"; | |||
| protected const TABLE_SMS = "SMS"; | |||
| protected const TABLE_SUMMARY = "summary"; | |||
| protected Carbon $dateFrom; | |||
| protected Carbon $dateTo; | |||
| /** | |||
| * コレクションを取得する | |||
| * | |||
| * @param array $condition | |||
| * @return Collection<UseSummaryRepositoryData> | |||
| */ | |||
| public function get(array $condition): Collection | |||
| { | |||
| return UseSummaryRepositoryData::makeList($this->builder($condition)->get()); | |||
| } | |||
| protected function builder(array $condition): Builder | |||
| { | |||
| $contractId = data_get($condition, self::CONDITION_CONTRACT_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); | |||
| if ($contractId) { | |||
| $target->where( | |||
| $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_CONTRACT_ID]), | |||
| $contractId | |||
| ); | |||
| } | |||
| $target->where( | |||
| $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]), | |||
| '>=', | |||
| $dateFrom | |||
| ) | |||
| ->where( | |||
| $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]), | |||
| '<', | |||
| $dateTo | |||
| ); | |||
| $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, $this->groupByColumn()]) | |||
| ) | |||
| ->select([ | |||
| $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()]), | |||
| DB::raw('count(*) as sms_send_count'), | |||
| ]); | |||
| $orderCount = $target->clone() | |||
| ->groupBy( | |||
| $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()]) | |||
| ) | |||
| ->select([ | |||
| $this->groupByColumn(), | |||
| 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, $this->groupByColumn()]), | |||
| $this->makeColumnName([static::TABLE_SUMMARY, $this->groupByColumn()]), | |||
| ); | |||
| } | |||
| ); | |||
| $main = $summary; | |||
| $main->select($this->columns()); | |||
| // ソート | |||
| $this->sort($main, $condition); | |||
| $main->orderBy( | |||
| $this->makeColumnName([static::TABLE_SUMMARY, $this->groupByColumn()]), | |||
| ); | |||
| // リミット | |||
| $this->limit($main, $condition); | |||
| return $main; | |||
| } | |||
| protected function columns() | |||
| { | |||
| $sms = self::TABLE_SMS; | |||
| $summary = self::TABLE_SUMMARY; | |||
| $columns = [ | |||
| SelectQueryUtil::value($this->dateFrom->format('Y/m/d'), 'date_from'), | |||
| SelectQueryUtil::value($this->dateTo->format('Y/m/d'), 'date_to'), | |||
| 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; | |||
| } | |||
| protected function groupByColumn(): string | |||
| { | |||
| return ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1; | |||
| } | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| <?php | |||
| namespace App\Repositories; | |||
| /** | |||
| */ | |||
| class UseSummaryRepositoryData extends BaseRepositoryData | |||
| { | |||
| } | |||
| @@ -27,6 +27,7 @@ RouteHelper::post('/receipt-issuing-order/change-handler', App\Http\Controllers\ | |||
| RouteHelper::get('/receipt-issuing-order/handlers', App\Http\Controllers\Web\ReceiptIssuingOrder\HandlersController::class); | |||
| RouteHelper::get('/use-summary/yyyymm', App\Http\Controllers\Web\UseSummary\UseSummaryYYYYMMsController::class); | |||
| RouteHelper::get('/use-summary/list/by-contract', App\Http\Controllers\Web\UseSummary\UseSummariesByContractController::class); | |||
| RouteHelper::get('/contracts', App\Http\Controllers\Web\Contract\ContractsController::class); | |||