| @@ -6,4 +6,5 @@ enum QueueName: string | |||
| { | |||
| case EMAIL = 'email'; | |||
| case SMS = 'sms'; | |||
| case OTHER = 'other'; | |||
| } | |||
| @@ -9,6 +9,7 @@ use App\Logic\ReceiptIssuingOrder\Custom\HelloTechno\CreateManager; | |||
| use App\Models\ReceiptIssuingOrder as Order; | |||
| use App\Models\ReceiptIssuingHTParkingCustomOrder as HT; | |||
| use App\Util\Custom\HelloTechno\API; | |||
| use Exception; | |||
| use Illuminate\Http\JsonResponse; | |||
| use Illuminate\Http\Request; | |||
| use Illuminate\Support\Facades\Auth; | |||
| @@ -42,41 +43,51 @@ class CreateReceiptIssuingOrderController extends HelloTechnoController | |||
| { | |||
| $param = $this->param; | |||
| // 顧客情報取得 | |||
| $customer = collect(API::getCustomers($param->customerCode)) | |||
| ->where('customer_code', $param->customerCode) | |||
| ->firstOrFail(); | |||
| // 駐車場情報取得 | |||
| $parking = collect(API::getParkings($param->customerCode, $param->parkingManagementCode)) | |||
| ->where('parking_management_code', $param->parkingManagementCode) | |||
| ->firstOrFail(); | |||
| $orderData = [ | |||
| ...$param->toArray(), | |||
| HT::COL_NAME_CUSTOMER_NAME => $customer['name'], | |||
| HT::COL_NAME_PARKING_NAME => $parking['name'], | |||
| Order::COL_NAME_HANDLER_ID => Auth::id(), | |||
| Order::COL_NAME_SUMMARY_KEY1 => $param->customerCode, | |||
| Order::COL_NAME_SUMMARY_KEY2 => $param->parkingManagementCode, | |||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車領収証", | |||
| Order::COL_NAME_RECEIPT_INVOICE_NO => "##TODO インボイス登録番号##", | |||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金", | |||
| Order::COL_NAME_RECEIPT_ISSUER => $customer['name'], | |||
| Order::COL_NAME_RECEIPT_SHOP_NAME => $parking['name'], | |||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金", | |||
| Order::COL_NAME_MEMO => "駐車料金", | |||
| ]; | |||
| logger($orderData); | |||
| $messages = $this->manager->init() | |||
| ->fill($orderData) | |||
| ->create(); | |||
| if (count($messages) !== 0) { | |||
| return $this->failedResponse([], $messages); | |||
| } | |||
| try { | |||
| $this->transaction->beginTransaction(); | |||
| // 顧客情報取得 | |||
| $customer = collect(API::getCustomers($param->customerCode)) | |||
| ->where('customer_code', $param->customerCode) | |||
| ->firstOrFail(); | |||
| // 駐車場情報取得 | |||
| $parking = collect(API::getParkings($param->customerCode, $param->parkingManagementCode)) | |||
| ->where('parking_management_code', $param->parkingManagementCode) | |||
| ->firstOrFail(); | |||
| $orderData = [ | |||
| ...$param->toArray(), | |||
| HT::COL_NAME_CUSTOMER_NAME => $customer['name'], | |||
| HT::COL_NAME_PARKING_NAME => $parking['name'], | |||
| Order::COL_NAME_HANDLER_ID => Auth::id(), | |||
| Order::COL_NAME_SUMMARY_KEY1 => $param->customerCode, | |||
| Order::COL_NAME_SUMMARY_KEY2 => $param->parkingManagementCode, | |||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車領収証", | |||
| Order::COL_NAME_RECEIPT_INVOICE_NO => "##TODO インボイス登録番号##", | |||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金", | |||
| Order::COL_NAME_RECEIPT_ISSUER => $customer['name'], | |||
| Order::COL_NAME_RECEIPT_SHOP_NAME => $parking['name'], | |||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金", | |||
| Order::COL_NAME_MEMO => "駐車料金", | |||
| ]; | |||
| logger($orderData); | |||
| $messages = $this->manager->init() | |||
| ->fill($orderData) | |||
| ->create(); | |||
| if (count($messages) !== 0) { | |||
| return $this->failedResponse([], $messages); | |||
| } | |||
| $this->transaction->commit(); | |||
| } catch (Exception $e) { | |||
| $this->transaction->rollBack(); | |||
| throw $e; | |||
| } | |||
| return $this->successResponse(); | |||
| } | |||
| @@ -0,0 +1,53 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Codes\UserRole; | |||
| use App\Http\Controllers\Web\IParam; | |||
| use App\Repositories\Custom\HelloTechno\UseSummaryRepository as Repository; | |||
| use Illuminate\Http\JsonResponse; | |||
| use Illuminate\Http\Request; | |||
| use Illuminate\Support\Facades\Auth; | |||
| class UseSummariesController extends HelloTechnoController | |||
| { | |||
| public function name(): string | |||
| { | |||
| return "[HelloTechno専用]利用実績一覧取得"; | |||
| } | |||
| public function description(): string | |||
| { | |||
| return "[HelloTechno専用]利用実績の一覧を取得する"; | |||
| } | |||
| public function __construct( | |||
| protected UseSummariesParam $param, | |||
| private Repository $repository | |||
| ) { | |||
| parent::__construct(); | |||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||
| } | |||
| protected function getParam(): IParam | |||
| { | |||
| return $this->param; | |||
| } | |||
| protected function run(Request $request): JsonResponse | |||
| { | |||
| $param = $this->param; | |||
| $condition = [ | |||
| ...$param->toArray(), | |||
| Repository::CONDITION_CONTRACT_ID => Auth::user()->contract_id, | |||
| ]; | |||
| $list = $this->repository->get($condition); | |||
| return $this->successResponse([ | |||
| 'records' => $list | |||
| ]); | |||
| } | |||
| } | |||
| @@ -0,0 +1,26 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Http\Controllers\Web\BaseParam; | |||
| use App\Repositories\Custom\HelloTechno\UseSummaryRepository as Repository; | |||
| /** | |||
| * @property ?string $id | |||
| * @property ?string $summaryYyyymm | |||
| */ | |||
| class UseSummariesParam extends BaseParam | |||
| { | |||
| public function rules(): array | |||
| { | |||
| return | |||
| array_merge( | |||
| [ | |||
| Repository::CONDITION_ID => $this->str(true), | |||
| Repository::CONDITION_SUMMARY_YYYYMM => $this->str(), | |||
| ], | |||
| $this->sortableRules(), | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| <?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\Logic\ReceiptIssuingOrder\TokenCheckManager; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\UseSummary; | |||
| use Illuminate\Http\JsonResponse; | |||
| use Illuminate\Http\Request; | |||
| use Illuminate\Support\Arr; | |||
| class UseSummaryYYYYMMsController extends WebController | |||
| { | |||
| use LoginUser; | |||
| public function name(): string | |||
| { | |||
| return "利用実績年月一覧取得"; | |||
| } | |||
| public function description(): string | |||
| { | |||
| return "利用実績年月一覧を取得する"; | |||
| } | |||
| public function __construct( | |||
| protected UseSummaryYYYYMMsParam $param, | |||
| ) { | |||
| parent::__construct(); | |||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||
| } | |||
| protected function getParam(): IParam | |||
| { | |||
| return $this->param; | |||
| } | |||
| protected function run(Request $request): JsonResponse | |||
| { | |||
| $list = UseSummary::whereContractId($this->loginUser()->getCurrentContractId()) | |||
| ->orderByDesc(UseSummary::COL_NAME_SUMMARY_YYYYMM) | |||
| ->pluck(UseSummary::COL_NAME_SUMMARY_YYYYMM); | |||
| return $this->successResponse(['records' => $list]); | |||
| } | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\UseSummary; | |||
| use App\Http\Controllers\Web\BaseParam; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| /** | |||
| * | |||
| */ | |||
| class UseSummaryYYYYMMsParam extends BaseParam | |||
| { | |||
| public function rules(): array | |||
| { | |||
| return []; | |||
| } | |||
| } | |||
| @@ -0,0 +1,65 @@ | |||
| <?php | |||
| namespace App\Jobs\Other\Custom\HelloTechno; | |||
| use App\Codes\QueueName; | |||
| use App\Logic\SMS\SMSManager; | |||
| use App\Models\HtCustomParkingName; | |||
| use App\Models\SMSSendOrder; | |||
| use App\Util\Custom\HelloTechno\API; | |||
| use Illuminate\Bus\Queueable; | |||
| use Illuminate\Contracts\Queue\ShouldQueue; | |||
| use Illuminate\Foundation\Bus\Dispatchable; | |||
| use Illuminate\Queue\InteractsWithQueue; | |||
| use Illuminate\Queue\SerializesModels; | |||
| use Illuminate\Support\Arr; | |||
| class CacheParkingName implements ShouldQueue | |||
| { | |||
| use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; | |||
| /** | |||
| * Create a new job instance. | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct( | |||
| private string $customerCode, | |||
| private string $parkingManagementCode | |||
| ) { | |||
| $this->onQueue(QueueName::OTHER->value); | |||
| } | |||
| /** | |||
| * Execute the job. | |||
| * | |||
| * @return void | |||
| */ | |||
| public function handle(SMSManager $manager) | |||
| { | |||
| // 顧客情報取得 | |||
| $customer = collect(API::getCustomers($this->customerCode)) | |||
| ->where('customer_code', $this->customerCode) | |||
| ->firstOrFail(); | |||
| // 駐車場情報取得 | |||
| $parking = collect(API::getParkings($this->customerCode, $this->parkingManagementCode)) | |||
| ->where('parking_management_code', $this->parkingManagementCode) | |||
| ->firstOrFail(); | |||
| // モデル更新 | |||
| $model = HtCustomParkingName::whereCustomerCode($this->customerCode) | |||
| ->whereParkingManagementCode($this->parkingManagementCode) | |||
| ->firstOrNew([ | |||
| HtCustomParkingName::COL_NAME_CUSTOMER_CODE => $this->customerCode, | |||
| HtCustomParkingName::COL_NAME_PARKING_MANAGEMENT_CODE => $this->parkingManagementCode, | |||
| ]); | |||
| $model->customer_name = $customer['name']; | |||
| $model->parking_name = $parking['name']; | |||
| $model->save(); | |||
| } | |||
| } | |||
| @@ -2,6 +2,7 @@ | |||
| namespace App\Logic\ReceiptIssuingOrder\Custom\HelloTechno; | |||
| use App\Jobs\Other\Custom\HelloTechno\CacheParkingName; | |||
| use App\Logic\ReceiptIssuingOrder\CreateManager as BaseManager; | |||
| use App\Models\ReceiptIssuingHTParkingCustomOrder; | |||
| @@ -39,6 +40,11 @@ class CreateManager | |||
| $this->customOrder->setReceiptIssuingOrder($this->manager->id()); | |||
| $this->customOrder->save(); | |||
| // 駐車場名キャッシュ | |||
| CacheParkingName::dispatch($this->customOrder->customer_code, $this->customOrder->parking_management_code); | |||
| return []; | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| <?php | |||
| namespace App\Models; | |||
| class HtCustomParkingName extends AppModel | |||
| { | |||
| const COL_NAME_CUSTOMER_CODE = "customer_code"; | |||
| const COL_NAME_PARKING_MANAGEMENT_CODE = "parking_management_code"; | |||
| const COL_NAME_CUSTOMER_NAME = "customer_name"; | |||
| const COL_NAME_PARKING_NAME = "parking_name"; | |||
| public function getModelName(): string | |||
| { | |||
| return "HT_駐車場名キャッシュテーブル"; | |||
| } | |||
| public function getHistory(): ?HistoryModel | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| @@ -9,17 +9,11 @@ class UseSummary extends AppModel | |||
| use ContractFeature; | |||
| const COL_NAME_SUMMARY_YYYYMM = 'summary_yyyymm'; | |||
| const COL_NAME_SUMMARY_DATE_START = 'summary_date_start'; | |||
| const COL_NAME_SUMMARY_DATE_END = 'summary_date_end'; | |||
| const COL_NAME_RECEIPT_ORDER_COUNT = 'receipt_order_count'; | |||
| const COL_NAME_SMS_SEND_COUNT = 'sms_send_count'; | |||
| const COL_NAME_SMS_SEND_COST = 'sms_send_cost'; | |||
| const COL_NAME_IS_FIXED = 'is_fixed'; | |||
| protected $casts = [ | |||
| self::COL_NAME_SUMMARY_DATE_START => 'datetime', | |||
| self::COL_NAME_SUMMARY_DATE_END => 'datetime', | |||
| ]; | |||
| public function getModelName(): string | |||
| { | |||
| @@ -0,0 +1,89 @@ | |||
| <?php | |||
| namespace App\Repositories\Custom\HelloTechno; | |||
| use App\Models\HtCustomParkingName; | |||
| use App\Models\UseByKeySummary; | |||
| use App\Repositories\BaseRepository; | |||
| use Illuminate\Database\Query\JoinClause; | |||
| use Illuminate\Support\Collection; | |||
| use Illuminate\Support\Facades\DB; | |||
| class UseSummaryRepository extends BaseRepository | |||
| { | |||
| const CONDITION_ID = 'id'; | |||
| const CONDITION_SUMMARY_YYYYMM = 'summary_yyyymm'; | |||
| const CONDITION_CONTRACT_ID = 'contract_id'; | |||
| const TABLE_SUMMARY = "summary"; | |||
| const TABLE_NAME = "name"; | |||
| /** | |||
| * コレクションを取得する | |||
| * | |||
| * @param array $condition | |||
| * @return Collection<UseSummaryRepositoryData> | |||
| */ | |||
| public function get(array $condition): Collection | |||
| { | |||
| $order = UseByKeySummary::getBuilder(static::TABLE_SUMMARY); | |||
| $parkingName = HtCustomParkingName::getBuilder(); | |||
| $table = $order | |||
| ->leftJoinSub($parkingName, 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]) | |||
| )->on( | |||
| $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_KEY2]), | |||
| $this->makeColumnName([static::TABLE_NAME, HtCustomParkingName::COL_NAME_PARKING_MANAGEMENT_CODE]) | |||
| ); | |||
| }); | |||
| // -----検索条件 | |||
| // 契約ID | |||
| $this->where($table, $condition, static::CONDITION_CONTRACT_ID, $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_CONTRACT_ID])); | |||
| // 年月 | |||
| $this->where($table, $condition, static::CONDITION_SUMMARY_YYYYMM, $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_YYYYMM])); | |||
| $table->select($this->columns()); | |||
| $main = DB::table($table, "main"); | |||
| // ソート | |||
| $this->sort($main, $condition); | |||
| $main->orderBy(static::CONDITION_ID); | |||
| // リミット | |||
| $this->limit($main, $condition); | |||
| return ReceiptIssuingOrderRepositoryData::makeList($main->get()); | |||
| } | |||
| private function columns() | |||
| { | |||
| $summary = static::TABLE_SUMMARY; | |||
| $name = static::TABLE_NAME; | |||
| $columns = [ | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_ID]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_SUMMARY_YYYYMM]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_SUMMARY_KEY1]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_SUMMARY_KEY2]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_RECEIPT_ORDER_COUNT]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_SMS_SEND_COUNT]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_IS_FIXED]), | |||
| $this->makeColumnNameForSelect([$summary, UseByKeySummary::COL_NAME_UPDATED_AT]), | |||
| $this->makeColumnNameForSelect([$name, HtCustomParkingName::COL_NAME_CUSTOMER_NAME]), | |||
| $this->makeColumnNameForSelect([$name, HtCustomParkingName::COL_NAME_PARKING_NAME]), | |||
| ]; | |||
| return $columns; | |||
| } | |||
| } | |||
| @@ -0,0 +1,11 @@ | |||
| <?php | |||
| namespace App\Repositories\Custom\HelloTechno; | |||
| use App\Repositories\BaseRepositoryData; | |||
| /** | |||
| */ | |||
| class UseSummaryRepositoryData extends BaseRepositoryData | |||
| { | |||
| } | |||
| @@ -22,12 +22,12 @@ class API | |||
| private const CONFIG_KEY_API_HOST = "logic.custom.hellotechno.host"; | |||
| public static function getCustomers(?string $customerCde = null) | |||
| public static function getCustomers(?string $customerCode = null) | |||
| { | |||
| $query = []; | |||
| if ($customerCde) { | |||
| $query['customer_code'] = $customerCde; | |||
| if ($customerCode) { | |||
| $query['customer_code'] = $customerCode; | |||
| } | |||
| return static::get(static::getCustomersUrl(), $query); | |||
| } | |||
| @@ -41,6 +41,7 @@ return new class extends Migration | |||
| $table->string("parking_name")->comment("駐車場名")->nullable(); | |||
| $helper->index(1, [ColumnName::RECEIPT_ISSUING_ORDER_ID]); | |||
| $helper->index(2, ['customer_code', 'parking_management_code', 'adjust_seq_no']); | |||
| }; | |||
| } | |||
| }; | |||
| @@ -0,0 +1,42 @@ | |||
| <?php | |||
| use App\Models\ColumnName; | |||
| use App\Util\MigrationHelper; | |||
| use Illuminate\Database\Migrations\Migration; | |||
| use Illuminate\Database\Schema\Blueprint; | |||
| use Illuminate\Support\Facades\Schema; | |||
| return new class extends Migration | |||
| { | |||
| /** | |||
| * Run the migrations. | |||
| */ | |||
| public function up(): void | |||
| { | |||
| MigrationHelper::createTable('ht_custom_parking_names', $this->schema()); | |||
| } | |||
| /** | |||
| * Reverse the migrations. | |||
| */ | |||
| public function down(): void | |||
| { | |||
| Schema::dropIfExists('ht_custom_parking_names'); | |||
| } | |||
| private function schema(bool $forHistory = false) | |||
| { | |||
| return function (Blueprint $table, MigrationHelper $helper) use ($forHistory) { | |||
| $helper->baseColumn(); | |||
| $table->string("customer_code")->comment("顧客コード"); | |||
| $table->string("parking_management_code")->comment("駐車場管理コード"); | |||
| $table->string("customer_name")->comment("顧客名")->nullable(); | |||
| $table->string("parking_name")->comment("駐車場名")->nullable(); | |||
| $helper->index(1, ['customer_code', 'parking_management_code']); | |||
| }; | |||
| } | |||
| }; | |||
| @@ -22,6 +22,8 @@ RouteHelper::post('/receipt-issuing-order/confirm', App\Http\Controllers\Web\Rec | |||
| RouteHelper::post('/receipt-issuing-order/mail-order', App\Http\Controllers\Web\ReceiptIssuingOrder\MailOrderController::class); | |||
| RouteHelper::post('/receipt-issuing-order/mail-complete', App\Http\Controllers\Web\ReceiptIssuingOrder\MailPostCompleteController::class); | |||
| RouteHelper::get('/use-summary/yyyymm', App\Http\Controllers\Web\UseSummary\UseSummaryYYYYMMsController::class); | |||
| RouteHelper::get('/receipt/download', App\Http\Controllers\Web\ReceiptIssuingOrder\TokenCheckController::class); | |||
| @@ -41,3 +43,4 @@ RouteHelper::get('/custom/hello-techno/parkings', App\Http\Controllers\Web\Custo | |||
| // RouteHelper::get('/custom/hello-techno/adjust-data', App\Http\Controllers\Web\Custom\HelloTechno\CustomersController::class); | |||
| RouteHelper::get('/custom/hello-techno/receipt-issuing-orders', App\Http\Controllers\Web\Custom\HelloTechno\ReceiptIssuingOrdersController::class); | |||
| RouteHelper::post('/custom/hello-techno/receipt-issuing-order/create', App\Http\Controllers\Web\Custom\HelloTechno\CreateReceiptIssuingOrderController::class); | |||
| RouteHelper::get('/custom/hello-techno/use-summaries', App\Http\Controllers\Web\Custom\HelloTechno\UseSummariesController::class); | |||