feat(billing): renewals, coupons, VAT numbering, billing cycles and invoice payment tracking

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
baodev0
2026-10-19 16:37:56 +07:00
co-authored by Claude Sonnet 5.5
parent ea9a53f742
commit 25f23d541e
134 changed files with 4926 additions and 185 deletions
+18
View File
@@ -6,6 +6,7 @@ use App\Http\Controllers\Api\Client\Domain\DomainOrderController as ClientDomain
use App\Http\Controllers\Api\Client\Domain\DomainPricingController;
use App\Http\Controllers\Api\Client\Service\DomainController as ClientDomainController;
use App\Http\Controllers\Api\Client\Service\ServiceController as ClientServiceController;
use App\Http\Controllers\Api\Service\CouponPreviewController;
use App\Http\Controllers\Api\Service\OrderControllerRefactor;
use App\Http\Controllers\Api\Service\ProductCategoryController;
use App\Http\Controllers\Api\Service\ServiceController;
@@ -14,6 +15,8 @@ use App\Http\Controllers\Api\Service\VmController;
use App\Http\Controllers\Api\Service\VmRebuildController;
use App\Http\Controllers\Api\Admin\Domain\InetDomainController;
use App\Http\Controllers\Api\Client\AdministrativeDivisionController;
use App\Http\Controllers\Api\Client\BillingProfileController;
use App\Http\Controllers\Api\Client\InvoiceLookupController;
use App\Http\Controllers\Api\Client\BankController as ClientBankController;
use App\Http\Controllers\Api\Client\Docs\PostCategoryController as ClientPostCategoryController;
use App\Http\Controllers\Api\Client\Docs\PostController as ClientPostController;
@@ -50,6 +53,8 @@ Route::prefix('v1')
Route::put('update', 'update')->name('update');
Route::get('login-history', 'loginHistory')->name('login-history');
Route::put('preferences', 'updatePreferences')->name('preferences.update');
Route::get('billing-profile', [BillingProfileController::class, 'show'])->name('billing-profile.show');
Route::put('billing-profile', [BillingProfileController::class, 'update'])->name('billing-profile.update');
Route::post('update-cccd', 'updateCccd')->name('update-cccd');
Route::put('change-password', 'changePassword')->name('change-password');
Route::get('two-factor', 'twoFactorStatus')->name('two-factor.status');
@@ -80,6 +85,9 @@ Route::prefix('v1')
Route::get('invoices/order/{orderNum}/pdf', 'downloadInvoicePdfByOrderNum')->name(
'invoices.pdfByOrderNum',
);
Route::get('orders/{orderNum}/contracts/{attachmentId}', 'downloadOrderContract')->name(
'orders.contract',
);
Route::get('invoices/{id}', 'getClientInvoiceDetail')->name('invoices.detail');
Route::get('dich-vu', 'getClientServices')->name('services.list');
Route::patch('dich-vu/{id}/auto-renew', 'updateClientServiceAutoRenew')->name(
@@ -192,6 +200,7 @@ Route::prefix('v1')
Route::get('/', 'getList')->name('list');
Route::get('check-server-name', 'checkServerName')->name('check-server-name');
Route::post('/', 'storeOrder')->name('store');
Route::post('coupon-preview', CouponPreviewController::class)->middleware('throttle:20,1')->name('coupon-preview');
Route::post('{orderNum}/pay', 'payOrder')->name('pay');
});
});
@@ -290,6 +299,15 @@ Route::prefix('v1')
});
});
Route::prefix('v1/invoice-lookup')
->middleware(['client.access-token', 'throttle:invoice-lookup', 'turnstile'])
->controller(InvoiceLookupController::class)
->as('api.invoice-lookup.')
->group(function () {
Route::post('/', 'show')->name('show');
Route::post('pdf', 'pdf')->name('pdf');
});
Route::get('v1/payment/vnpay/return', [TransactionController::class, 'returnCallback']);
Route::prefix('v1/system')