feat(admin): IP pool allocation, billing exports, service attachments

- IP pool: sheet import (xlsx/csv) matched by address, bulk allocate/revoke
  with notification email (ip_allocated/ip_revoked), ip_pool_logs history.
- Orders/invoices: Excel export on branded template (BrandedReportWriter),
  shared billing filters, order item service info in list responses.
- Web design quote Excel export; activity log export.
- Service attachments with copy-to-invoice; deployment invoice attachments.
- Customer email attachments stored on disk and attached by path.
- Admin password change endpoint; user.fullname backfill migration;
  orders.user_id backfill from logs.
- Disable deploy workflow until CI/CD is set up.
- Ignore stored customer email and service attachment uploads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
baodev0
2026-10-15 19:58:36 +07:00
co-authored by Claude Opus 5.5
parent ea5697cb81
commit 46aa138eec
95 changed files with 4247 additions and 454 deletions
+45 -44
View File
@@ -1,44 +1,45 @@
name: Deploy Portal API
on:
push:
branches:
- production
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
uses: appleboy/ssh-action
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.PORT }}
script_stop: true
script: |
set -e
cd ~/httpdocs
echo "==> Pulling latest code..."
git fetch origin production
git reset --hard origin/production
echo "==> Installing dependencies..."
composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
echo "==> Running migrations..."
php artisan migrate --force
echo "==> Optimizing Laravel..."
php artisan optimize
echo "==> Restarting queue workers..."
php artisan queue:restart
echo "==> Deploy completed!"
# Tạm tắt: chưa triển khai CI/CD. Bỏ comment toàn bộ file để bật lại.
# name: Deploy Portal API
#
# on:
# push:
# branches:
# - production
# workflow_dispatch:
#
# jobs:
# deploy:
# runs-on: ubuntu-latest
#
# steps:
# - name: Deploy
# uses: appleboy/ssh-action
# with:
# host: ${{ secrets.HOST }}
# username: ${{ secrets.USERNAME }}
# key: ${{ secrets.SSH_PRIVATE_KEY }}
# port: ${{ secrets.PORT }}
# script_stop: true
#
# script: |
# set -e
#
# cd ~/httpdocs
#
# echo "==> Pulling latest code..."
# git fetch origin production
# git reset --hard origin/production
#
# echo "==> Installing dependencies..."
# composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
#
# echo "==> Running migrations..."
# php artisan migrate --force
#
# echo "==> Optimizing Laravel..."
# php artisan optimize
#
# echo "==> Restarting queue workers..."
# php artisan queue:restart
#
# echo "==> Deploy completed!"