feat: [demo] 데모 테넌트 관리 API 및 만료 알림 (Phase 3)

- DemoTenantController: 목록/상세/생성/리셋/연장/전환/통계 API
- DemoTenantStoreRequest: 고객 체험 테넌트 생성 검증
- DemoTenantService: API용 메서드 추가 (index/show/reset/extend/convert/stats)
- CheckDemoExpiredCommand: 만료 임박(7일) 알림 + 만료 테넌트 비활성 처리
- 라우트 등록 (api/v1/demo-tenants, 7개 엔드포인트)
- 스케줄러 등록 (04:20 demo:check-expired)
- i18n 메시지 추가 (message.demo_tenant.*, error.demo_tenant.*)
This commit is contained in:
김보곤
2026-03-13 22:27:39 +09:00
parent 1eb8d2cb01
commit e12fc461a7
8 changed files with 567 additions and 0 deletions

View File

@@ -14,6 +14,7 @@
use App\Http\Controllers\Api\V1\ClientController;
use App\Http\Controllers\Api\V1\ClientGroupController;
use App\Http\Controllers\Api\V1\CompanyController;
use App\Http\Controllers\Api\V1\DemoTenantController;
use App\Http\Controllers\Api\V1\EstimateController;
use App\Http\Controllers\Api\V1\OrderController;
use App\Http\Controllers\Api\V1\PricingController;
@@ -193,6 +194,17 @@
Route::post('/bulk-issue-statement', [SaleController::class, 'bulkIssueStatement'])->name('v1.sales.bulk-issue-statement');
});
// Demo Tenant API (데모 테넌트 관리)
Route::prefix('demo-tenants')->group(function () {
Route::get('', [DemoTenantController::class, 'index'])->name('v1.demo-tenants.index');
Route::get('/stats', [DemoTenantController::class, 'stats'])->name('v1.demo-tenants.stats');
Route::post('', [DemoTenantController::class, 'store'])->name('v1.demo-tenants.store');
Route::get('/{id}', [DemoTenantController::class, 'show'])->whereNumber('id')->name('v1.demo-tenants.show');
Route::post('/{id}/reset', [DemoTenantController::class, 'reset'])->whereNumber('id')->name('v1.demo-tenants.reset');
Route::post('/{id}/extend', [DemoTenantController::class, 'extend'])->whereNumber('id')->name('v1.demo-tenants.extend');
Route::post('/{id}/convert', [DemoTenantController::class, 'convert'])->whereNumber('id')->name('v1.demo-tenants.convert');
});
// Company API (회사 추가 관리)
Route::prefix('companies')->group(function () {
Route::post('/check', [CompanyController::class, 'check'])->name('v1.companies.check'); // 사업자등록번호 검증