probooking
    • ProBookingCenter
    • Data Dictionary
    • Database Diagram
    • Code Issues
    • Page
    • Plan
    • Online vs Source Code

    Code Issues

    Code Audit Report - Tour Booking Management System#

    ตรวจสอบเมื่อ: 2026-03-25
    Stack: Laravel 8.83.29 + Vue.js 2 + PHP 8.4.1
    สถานะ: ยังไม่พร้อม Production

    สรุปภาพรวม#

    ระดับจำนวนสถานะ
    🔴 Critical5ต้องแก้ก่อน deploy
    🟠 High~45 จุดRoute/Controller/Model หัก
    🟡 Medium6 ประเภทคุณภาพ code & performance
    🔵 Low7 ประเภทCleanup & housekeeping

    🔴 CRITICAL - ต้องแก้ทันที#

    C1. PHP 8.4 + Laravel 8 ไม่เข้ากัน#

    ปัญหา: Laravel 8 EOL ตั้งแต่ Jan 2023, ไม่รองรับ PHP 8.4 - เกิด deprecation warnings หลายร้อยจุด
    ผลกระทบ: จะกลายเป็น fatal errors ใน PHP 9
    ไฟล์: ทั้งโปรเจค
    แก้ไข: อัพเกรด Laravel → 10/11 หรือ ดาวน์เกรด PHP → 8.1

    C2. SQL Injection#

    ปัญหา: Request parameters ถูกใส่ตรงๆ ใน raw SQL โดยไม่ใช้ parameter binding
    ไฟล์: app/Http/Controllers/Admin/Api/AdmindashboardController.php (lines 116, 122, 128)
    Code ที่มีปัญหา:
    แก้ไข: ใช้ parameterized queries: ->where('series.country_id', $request->country_id)

    C3. Security Middleware ว่างเปล่า#

    ปัญหา: Middleware สำหรับ API authentication ไม่มี code ตรวจสอบเลย - pass through ทุก request
    ไฟล์:
    app/Http/Middleware/RestApi.php - body ว่าง, มีแค่ TODO comment
    app/Http/Middleware/AdminApi.php - bearer token validation ถูก comment out
    ผลกระทบ: API routes ที่ใช้ middleware เหล่านี้ไม่มีการ authenticate
    แก้ไข: Implement token validation logic

    C4. SSL Verification ปิดอยู่#

    ปัญหา: HTTP helper ปิด SSL verify ทำให้เสี่ยง Man-in-the-Middle attack
    ไฟล์: app/Helpers/Utility.php (lines 69-70)
    Code ที่มีปัญหา:
    แก้ไข: เปิด SSL verification กลับ หรือใช้ CA bundle ที่ถูกต้อง

    C5. ereg() Functions ถูกลบใน PHP 7+#

    ปัญหา: ใช้ ereg() / eregi() ที่ถูกลบออกตั้งแต่ PHP 7.0 - validation ไม่ทำงานเลย (ใช้ @ suppress error)
    ไฟล์: app/Library/Form/Val.php (lines 102, 112, 117, 122, 127)
    ผลกระทบ: Form validation ทุกจุดที่ใช้ class นี้จะ pass ทุก input
    แก้ไข: เปลี่ยนเป็น preg_match()

    🟠 HIGH - Route/Controller/Model ที่หัก#

    H1. Controller Methods ที่ไม่มีอยู่จริง (~30 methods)#

    Routes อ้างอิงถึง methods ที่ไม่มีใน controller - จะ error 500 เมื่อเข้าหน้านั้น

    routes/payment.php → PaymentController#

    Missing Methodมีอยู่จริง
    search()ไม่มี
    create()ไม่มี
    edit()ไม่มี
    update()ไม่มี
    updateStatus()ไม่มี
    delete()ไม่มี
    Controller มีแค่: index, fillterPayment, approve, approveV2, reject, auto_booking_status

    routes/agency.php → AgencyController & CompanyController#

    Missing MethodController
    delete()AgencyController
    export()AgencyController
    save()CompanyController
    update()CompanyController
    suspend()CompanyController
    delete()CompanyController
    getApiToken()CompanyController
    updatestatus()CompanyController (มี updateStatus() - case mismatch)

    routes/booking.php → BookingController#

    Missing Methodมีอยู่จริง
    overview()ไม่มี
    passport()ไม่มี

    routes/invoice.php → InvoiceController#

    Missing Method
    dev()
    showDev()
    updateDev()

    routes/web.php → TourPeriodController#

    Missing Method
    addEstimate()
    incomeEstimate()

    routes/web.php → BookingController (Reports)#

    Missing Method
    search()

    routes/setting.php → PromotionController#

    Missing Methodมีอยู่จริง
    updateStatus()มี toggleStatus() แทน

    routes/document.php → SeriesDocumentController#

    Missing Method
    printMultiple()

    routes/incentive.php#

    Missing MethodController
    paymentDestroy()IncentivePaymentController
    pdfPrograme()IncentiveController

    routes/web-api.php (Internal API)#

    Missing MethodController
    exportZipStatus()CostSeatController
    exportZipDownload()CostSeatController
    getBookingSummarize()AllBookingController
    saveBooking()AllBookingController
    updateBooking()AllBookingController
    deleteBooking()AllBookingController
    onInit()CostingController
    getIncomeSummarize()IncomeController
    getPeriodSummarize()PeriodController
    create()PeriodController
    saveSeries()SeriesController
    updateSeries()SeriesController

    H2. Models ที่ไม่มีอยู่จริง (~15 models)#

    Namespace App\Models\Quotation\* - ไม่มี directory นี้เลย#

    Modelอ้างอิงใน
    QuotationInvoiceIncentiveProgramController, QuotationInvoiceController
    QuotationInvoicePriceIncentiveProgramController, QuotationInvoiceController
    QuotationInvoiceProgramIncentiveProgramController, QuotationInvoiceController
    QuotationInvoiceDetailsQuotationInvoiceController
    QuotationInvoicePaymentDueQuotationInvoiceController
    QuotationFlightQuotationInvoiceController
    QuotationInvoicePaymentQuotationInvoicePaymentController

    Namespace App\Models\Reports\*#

    Modelอ้างอิงใน
    ReceiptDepInvioceReportController, InvoiceController
    ReceiptDevInvioceReportController
    CostingSeriesPriceCostionSeriesController
    CostingSeriesSummaryCostionSeriesController
    CostingSeriesSummaryDetailCostionSeriesController

    อื่นๆ#

    Modelอ้างอิงใน
    App\Models\Promotions\PromotionsAdmin\Api\PromotionController
    App\Models\Incentive\IncentiveCancelReasonTypeIncentivePaymentController
    App\Models\Incentive\IncentiveReasonTypeIncentivePaymentController

    Missing Resources#

    Resourceอ้างอิงใน
    App\Http\Resources\CountryResourceManageTourController
    App\Http\Resources\Reports\ReportCommittionSummarizeCollectionReportCommittionController

    Missing Request Class#

    Requestอ้างอิงใน
    App\Http\Requests\Ticket\RefundRequestRefundController

    H3. Blade Views ที่ไม่มี#

    ViewExpected Pathอ้างอิงใน
    series.period.indexresources/views/series/period/index.blade.phpSeriesPerioController
    auth.token_loginresources/views/auth/token_login.blade.phpTokenLoginController
    admin.pages.reports.invoice.dev.createresources/views/admin/pages/reports/invoice/dev/create.blade.phpInvioceReportController
    admin.pages.reports.invoice.pdfReceiptDev_dep(same dir)InvioceReportController
    admin.pages.reports.invoice.pdfReceiptDev_client(same dir)InvioceReportController
    admin.pages.invoice.devresources/views/admin/pages/invoice/dev.blade.phpInvoiceController

    H4. Broken Import Statements#

    routes/reports.php line 6: use App\Http\Controllers\Admin\Reports\BookingReportController - controller ไม่มี → route file จะ fatal error ตอน load
    Controllers หลายตัว import App\Http\Controllers\Ticket\RefundController แต่ path จริงคือ Admin\Ticket\RefundController

    H5. Deleted Migrations แต่ Models ยังอยู่#

    Migrations ถูกลบ (git status: deleted) แต่ Models ยังอ้างอิง tables เหล่านี้:
    2026_03_21_000012_create_costing_series_reports_table.php → Model: CostingSeriesReport
    2026_03_21_000013_create_costing_series_type_lists_table.php → Model: CostingSeriesTypeList
    2026_03_21_000014_create_costing_series_type_list_details_table.php → Model: CostingSeriesTypeListDetails

    H6. Parameter Deprecation ใน Controllers#

    Optional parameter ก่อน required parameter (deprecated ใน PHP 8.4):
    app/Http/Controllers/Admin/Ticket/TicketPaymentController.php (line 21) - tab_($tab, $id)
    app/Http/Controllers/Admin/Ticket/PaymentTicketController.php (line 20) - tab_($tab, $id)
    app/Http/Controllers/Admin/Ticket/InvoiceTicketController.php (line 14) - tab_($tab, $id)

    H7. Missing .env Variables#

    Database connections website และ sync_api ถูกกำหนดใน config/database.php แต่ไม่มี ENV variables:
    WEBSITE_DB_HOST, WEBSITE_DB_DATABASE, WEBSITE_DB_USERNAME, WEBSITE_DB_PASSWORD
    SYNC_API_DB_HOST, SYNC_API_DB_DATABASE, SYNC_API_DB_USERNAME, SYNC_API_DB_PASSWORD

    🟡 MEDIUM - คุณภาพ Code & Performance#

    M1. dd() ค้างใน Production Code (20+ จุด)#

    dd() (dump and die) จะหยุดการทำงานทั้งหมดถ้าโดนเรียก:
    app/Http/Controllers/Reports/ReportReceiptController.php (line 140) - block ทั้ง method
    app/Http/Controllers/Operation/Booking/OperationBookingController.php
    app/Http/Controllers/Booking/BookingController.php
    และอีก 17+ controllers

    M2. XSS Risk - Unescaped Blade Output#

    ใช้ {!! !!} โดยไม่ sanitize:
    resources/views/forms/booking/formlock/body.blade.php (lines 102, 141): {!!$btn_status!!}, {!!$url!!}
    resources/views/admin/pages/settings/land_operations/index.blade.php (line 115): {!! $item->description !!}
    resources/views/admin/pages/reports/rush_to_sell.blade.php (line 308): {!! $item['rush_badge'] !!}
    resources/views/components/datatable.blade.php (line 91): {!!$actions_right!!}

    M3. env() เรียกนอก Config Files (30+ จุด)#

    env() จะ return null หลัง php artisan config:cache - ทำให้ production พัง:
    app/Services/ - หลายไฟล์
    app/Console/Commands/
    app/Helpers/Utility.php
    app/Http/Middleware/EnsureTwoFactorIsConfirmed.php
    แก้ไข: ใช้ config('key') แทน env('KEY') ในทุกที่นอก config/ directory

    M4. Mass Assignment - 82 Models ไม่มี $fillable/$guarded#

    Models เหล่านี้ไม่มี $fillable หรือ $guarded ซึ่งเสี่ยงต่อ mass assignment ถ้าใช้ forceFill() หรือ unguard():
    app/Models/Agency/Agency.php
    app/Models/Booking/BookingDetail.php
    app/Models/Booking/BookingRefund.php
    app/Models/Booking/BookingDeduct.php
    app/Models/Receipt.php
    app/Models/Invoice/Invoices.php
    และอีก 76 models

    M5. 2FA Middleware เขียน DB ทุก Request#

    EnsureTwoFactorIsConfirmed middleware ทำ $user->save() ทุก request:
    ไฟล์: app/Http/Middleware/EnsureTwoFactorIsConfirmed.php (lines 44-46)
    ผลกระทบ: DB write ทุก authenticated request → performance issue
    แก้ไข: เขียนเฉพาะเมื่อค่าเปลี่ยน

    M6. Raw SQL Usage มากเกินไป (90+ จุด)#

    DB::raw(), whereRaw(), selectRaw(), orderByRaw(), havingRaw() ใช้มากกว่า 90 จุด - เพิ่มความเสี่ยง SQL injection และยากต่อการ maintain

    🔵 LOW - Cleanup & Housekeeping#

    L1. ไฟล์สำรอง/ซ้ำซ้อนค้าง#

    ไฟล์ปัญหา
    app/Http/Controllers/Period/PeriodBookingController copy.phpไฟล์สำเนา (มี space ในชื่อ)
    app/Helpers/TourBookingDetailHelper_Fixed.phpสำเนา "fixed"
    app/Helpers/_bak.phpBackup file 792 บรรทัด (comment out ทั้งหมด)

    L2. Typo ในชื่อ Class/File#

    ชื่อผิดชื่อที่ถูกต้องไฟล์
    IncentivePaymentCencelIncentivePaymentCancelapp/Models/Incentive/
    TourEsttimateHelperTourEstimateHelperapp/Helpers/
    TourCerditHelperTourCreditHelperapp/Helpers/
    DataTabelDataTableapp/Helpers/
    PRICE_ADILTPRICE_ADULTapp/Helpers/TourBookingDetailHelper.php:228
    Serise/ directorySeries/app/Http/Controllers/ (มีทั้ง 2 directories)
    InvioceReportControllerInvoiceReportControllerapp/Http/Controllers/Admin/Reports/
    CostionSeriesControllerCostingSeriesControllerapp/Http/Controllers/Admin/Reports/

    L3. node_modules/ ไม่มี#

    package.json มี dependencies (Vue 2, jQuery, etc.) แต่ไม่ได้ install
    Compiled assets (public/css/, public/js/) มีอยู่แล้ว → ไม่กระทบ runtime
    แก้ไข: npm install ถ้าต้องการ build frontend ใหม่

    L4. public/storage Symlink ไม่มี#

    storage/app/public/ มีอยู่ แต่ public/storage symlink ไม่มี
    ผลกระทบ: Upload files ที่เก็บผ่าน storage disk จะ 404
    แก้ไข: php artisan storage:link

    L5. Mail Configuration#

    .env ตั้ง MAIL_FROM_ADDRESS=null
    ผลกระทบ: ส่ง email ไม่ได้ หรือถูก reject
    แก้ไข: ตั้งค่า email address ที่ถูกต้อง

    L6. Deprecated Package#

    composer.json มีทั้ง phpoffice/phpexcel (abandoned 2017) และ phpoffice/phpspreadsheet (replacement)
    แก้ไข: Migrate code จาก PHPExcel → PHPSpreadsheet แล้วลบ phpexcel ออก

    L7. TODO/FIXME ที่ยังไม่ implement (14 จุด)#

    ไฟล์บรรทัดเนื้อหา
    app/Http/Middleware/RestApi.php12TODO: Implement the middleware
    app/Helpers/TourBookingHelper.php1036TODO: recalculate price
    app/Console/Commands/SyncDataToApi.php190TODO make env
    และอีก 11 จุด

    Security Concerns เพิ่มเติม#

    S1. Authentication Token ใน URL#

    app/Helpers/Utility.php (lines 6-12): officeURL() ส่ง rememberToken เป็น query parameter
    Token จะถูก log ใน browser history, server logs, referer headers

    S2. Database Password#

    .env ใช้ root user กับ password เดียวกันสำหรับ 6 databases
    DB_HOST ตั้งเป็น Docker container name (mysql-mariadb-1) - ใช้นอก Docker ไม่ได้

    S3. Duplicate Route Names#

    payment.export ถูกกำหนด 2 ครั้งใน web-api.php
    income.init ถูกกำหนด 2 ครั้งใน web-api.php

    ลำดับความสำคัญในการแก้ไข#

    Phase 1 - Security (แก้ก่อน deploy)#

    1.
    แก้ SQL Injection ใน AdmindashboardController
    2.
    Implement RestApi/AdminApi middleware
    3.
    เปิด SSL verification กลับ
    4.
    แก้ ereg() → preg_match()
    5.
    ย้าย auth token ออกจาก URL

    Phase 2 - Stability (แก้ให้ระบบทำงานได้)#

    1.
    แก้ broken route → controller mappings (~30 จุด)
    2.
    สร้าง missing models หรือลบ import ที่ไม่ใช้
    3.
    สร้าง missing blade views
    4.
    ลบ dd() ออกจาก controllers
    5.
    แก้ broken import ใน routes/reports.php

    Phase 3 - Quality (ปรับปรุงคุณภาพ)#

    1.
    เปลี่ยน env() → config() นอก config files
    2.
    เพิ่ม $fillable/$guarded ใน models
    3.
    แก้ 2FA middleware performance
    4.
    แก้ XSS risks ใน blade views
    5.
    ลดการใช้ raw SQL

    Phase 4 - Cleanup#

    1.
    ลบ backup/copy files
    2.
    แก้ typo ในชื่อ class
    3.
    ลบ deprecated packages
    4.
    php artisan storage:link
    5.
    ตั้งค่า mail config
    6.
    Implement TODO items

    Phase 5 - Infrastructure#

    1.
    อัพเกรด Laravel 8 → 10/11
    2.
    อัพเกรด PHP compatibility
    3.
    จัดการ database connections ให้ครบ
    Modified at 2026-03-25 09:05:40
    Previous
    Database Diagram
    Next
    Page
    Built with