From b07882e3f41bc5138bbc5db210f21f45bc67aeea Mon Sep 17 00:00:00 2001 From: Thanakorn S Date: Sat, 23 May 2026 17:06:08 +0700 Subject: [PATCH] code audit fixes: require_once, issue flow, role guards - Upgraded all plain `require` to `require_once` across 172 api/engine and api/engine_report files to prevent class-redeclaration errors - Added issue button, issue_invoice() with GL toastr, and delete_invoice() to expense/manage_purchase_invoice.php, bringing it in line with po/manage_purchase_invoice.php - Added can_delete role guard (admin/owner only) to trash icons on revenue/invoice.php and expense/purchase_invoice.php, matching the existing pattern in finance/receipt.php and finance/payment.php Co-Authored-By: Claude Sonnet 4.6 --- app/ac_dashboard/api/engine/by_source.php | 6 +- app/ac_dashboard/api/engine/journals.php | 6 +- app/ac_dashboard/api/engine/pl.php | 6 +- .../api/engine/posting_window.php | 2 +- app/ac_dashboard/api/engine/recent.php | 6 +- app/ac_dashboard/api/engine/trend.php | 6 +- app/accounting/api/engine/account.php | 4 +- app/accounting/api/engine/account_formula.php | 4 +- app/accounting/api/engine/account_stats.php | 4 +- app/accounting/api/engine/acquire_op_lock.php | 4 +- app/accounting/api/engine/department.php | 4 +- .../api/engine/department_stats.php | 4 +- .../api/engine/get_balance_sheet.php | 6 +- .../api/engine/get_gl_by_source.php | 2 +- .../api/engine/get_gl_documents.php | 4 +- app/accounting/api/engine/get_gl_movement.php | 6 +- .../api/engine/get_journal_detail.php | 4 +- .../api/engine/get_journal_listing.php | 4 +- .../api/engine/get_pl_statement.php | 6 +- .../api/engine/get_trial_balance.php | 6 +- app/accounting/api/engine/get_vat_report.php | 6 +- .../api/engine/log_batch_action.php | 4 +- app/accounting/api/engine/manage_account.php | 4 +- .../api/engine/manage_department.php | 4 +- app/accounting/api/engine/post_gl_entry.php | 22 ++--- app/accounting/api/engine/posting_window.php | 2 +- .../api/engine/product_account_mapping.php | 6 +- app/accounting/api/engine/release_op_lock.php | 4 +- app/accounting/api/engine/remove_account.php | 4 +- .../api/engine/remove_department.php | 4 +- .../api/engine/retrieve_account.php | 4 +- .../api/engine/retrieve_department.php | 4 +- .../api/engine/save_manual_journal.php | 6 +- app/contact/api/engine/contact.php | 4 +- app/contact/api/engine/contact_stats.php | 4 +- app/contact/api/engine/contact_type.php | 4 +- app/contact/api/engine/manage_contact.php | 6 +- .../api/engine/manage_contact_type.php | 4 +- app/contact/api/engine/remove_contact.php | 4 +- .../api/engine/remove_contact_type.php | 4 +- app/contact/api/engine/retrieve_contact.php | 4 +- .../api/engine/retrieve_contact_type.php | 4 +- app/dashboard/api/engine_report/low_stock.php | 4 +- .../api/engine_report/reports_stats.php | 6 +- .../api/engine/convert_purchase_request.php | 6 +- .../api/engine/manage_purchase_request.php | 4 +- .../engine/manage_supplier_credit_note.php | 4 +- .../api/engine/retrieve_purchase_request.php | 4 +- .../engine/update_purchase_request_status.php | 4 +- app/expense/manage_purchase_invoice.php | 80 ++++++++++++++++++- app/expense/purchase_invoice.php | 9 +-- app/finance/api/engine/delete_payment.php | 4 +- .../api/engine/delete_payment_billing.php | 4 +- app/finance/api/engine/delete_receipt.php | 4 +- .../api/engine/delete_receipt_billing.php | 4 +- app/finance/api/engine/manage_payment.php | 6 +- .../api/engine/manage_payment_billing.php | 4 +- app/finance/api/engine/manage_receipt.php | 6 +- .../api/engine/manage_receipt_billing.php | 4 +- app/ics/api/engine/approve_stock.php | 6 +- app/ics/api/engine/barcode_lookup.php | 4 +- app/ics/api/engine/contact_search.php | 4 +- app/ics/api/engine/delete_stock_in.php | 4 +- app/ics/api/engine/delete_stock_out.php | 4 +- app/ics/api/engine/delete_stock_transfer.php | 4 +- app/ics/api/engine/location_barcode_label.php | 4 +- app/ics/api/engine/manage_stock_in.php | 8 +- app/ics/api/engine/manage_stock_out.php | 8 +- app/ics/api/engine/manage_stock_transfer.php | 8 +- app/ics/api/engine/product_search.php | 4 +- app/ics/api/engine/retrieve_active_lot.php | 4 +- app/ics/api/engine/retrieve_active_serial.php | 4 +- app/ics/api/engine/retrieve_aisle.php | 4 +- app/ics/api/engine/retrieve_lot.php | 4 +- app/ics/api/engine/retrieve_rack.php | 4 +- .../api/engine/retrieve_stock_by_source.php | 4 +- app/ics/api/engine/retrieve_stock_in.php | 4 +- app/ics/api/engine/retrieve_stock_out.php | 4 +- .../api/engine/retrieve_stock_transfer.php | 4 +- app/ics/api/engine/retrieve_warehouse.php | 4 +- app/ics/api/engine/retrieve_zone.php | 4 +- app/ics/api/engine/sku_barcode_label.php | 4 +- app/ics/api/engine/sku_label_lots.php | 4 +- app/ics/api/engine/sku_label_products.php | 4 +- app/ics/api/engine/stock_in.php | 4 +- app/ics/api/engine/stock_out.php | 4 +- app/ics/api/engine/stock_transfer.php | 4 +- app/ics/api/engine/validate_scan_location.php | 4 +- app/ics/api/engine_report/product_stats.php | 4 +- app/ics/api/engine_report/stock_activity.php | 4 +- app/ics/api/engine_report/stock_movement.php | 4 +- app/ics/api/engine_report/stock_trend.php | 4 +- .../api/engine_report/warehouse_balance.php | 4 +- .../api/engine_report/warehouse_overview.php | 4 +- app/ics/api/engine_report/warehouse_stats.php | 4 +- app/inventory/api/engine/manage_category.php | 4 +- app/inventory/api/engine/manage_product.php | 6 +- app/inventory/api/engine/manage_storage.php | 4 +- app/inventory/api/engine/manage_warehouse.php | 4 +- app/inventory/api/engine/manager.php | 4 +- app/inventory/api/engine/product.php | 4 +- app/inventory/api/engine/product_category.php | 4 +- app/inventory/api/engine/product_stats.php | 4 +- app/inventory/api/engine/remove_category.php | 4 +- app/inventory/api/engine/remove_product.php | 4 +- app/inventory/api/engine/remove_storage.php | 4 +- app/inventory/api/engine/remove_warehouse.php | 4 +- .../api/engine/retrieve_category.php | 4 +- app/inventory/api/engine/retrieve_product.php | 4 +- app/inventory/api/engine/retrieve_storage.php | 4 +- .../api/engine/retrieve_warehouse.php | 4 +- app/inventory/api/engine/storage.php | 4 +- app/inventory/api/engine/warehouse.php | 4 +- app/inventory/api/engine/warehouse_stats.php | 4 +- app/login/api/engine/back.php | 4 +- app/login/api/engine/invited_onboarding.php | 10 +-- app/login/api/engine/login_confirm.php | 8 +- app/login/api/engine/login_otp.php | 8 +- app/login/api/engine/onboarding.php | 8 +- app/login/api/engine/register.php | 10 +-- app/login/api/engine/request_new_otp.php | 8 +- app/login/api/engine/request_reset_otp.php | 4 +- app/login/api/engine/reset_password_otp.php | 4 +- app/order/api/engine/cancel_order.php | 6 +- app/order/api/engine/cancel_return.php | 6 +- app/order/api/engine/confirm_order.php | 10 +-- app/order/api/engine/confirm_return.php | 8 +- app/order/api/engine/delete_invoice.php | 4 +- app/order/api/engine/delete_order.php | 6 +- app/order/api/engine/delete_return.php | 6 +- app/order/api/engine/issue_invoice.php | 4 +- app/order/api/engine/manage_invoice.php | 6 +- app/order/api/engine/manage_order.php | 6 +- app/order/api/engine/manage_return.php | 4 +- .../api/engine/proceed_to_credit_note.php | 4 +- app/order/api/engine/proceed_to_invoice.php | 4 +- app/order/api/engine/retrieve_invoice.php | 4 +- app/order/api/engine/retrieve_order.php | 4 +- app/order/api/engine/retrieve_return.php | 4 +- .../api/engine/update_invoice_status.php | 4 +- app/order/api/engine/update_order_status.php | 4 +- app/order/api/engine/void_invoice.php | 4 +- app/po/api/engine/cancel_po.php | 4 +- app/po/api/engine/cancel_supplier_return.php | 6 +- app/po/api/engine/close_po.php | 4 +- app/po/api/engine/confirm_po.php | 4 +- app/po/api/engine/confirm_supplier_return.php | 8 +- app/po/api/engine/delete_po.php | 6 +- app/po/api/engine/delete_purchase_request.php | 4 +- app/po/api/engine/delete_supplier_return.php | 6 +- app/po/api/engine/manage_po.php | 6 +- app/po/api/engine/manage_supplier_return.php | 4 +- .../engine/proceed_to_purchase_invoice.php | 4 +- .../proceed_to_supplier_credit_note.php | 4 +- app/po/api/engine/receive_po.php | 8 +- app/po/api/engine/retrieve_po.php | 4 +- .../api/engine/retrieve_supplier_return.php | 4 +- app/po/api/engine/update_po_payment.php | 4 +- .../api/engine_report/expired_stock.php | 6 +- .../api/engine_report/lot_stock_log.php | 6 +- app/reports/api/engine_report/product_lot.php | 6 +- app/reports/api/engine_report/rack_log.php | 6 +- .../api/engine_report/rack_occupancy.php | 6 +- .../api/engine_report/stock_movement.php | 6 +- .../api/engine_report/stock_movement_sku.php | 6 +- app/revenue/api/engine/convert_quotation.php | 6 +- app/revenue/api/engine/delete_quotation.php | 4 +- app/revenue/api/engine/manage_credit_note.php | 4 +- app/revenue/api/engine/manage_order.php | 6 +- app/revenue/api/engine/manage_quotation.php | 6 +- app/revenue/api/engine/proceed_to_invoice.php | 6 +- app/revenue/api/engine/quotation_stats.php | 4 +- app/revenue/api/engine/retrieve_quotation.php | 4 +- .../api/engine/update_quotation_status.php | 4 +- app/revenue/invoice.php | 9 +-- app/setting/api/engine/change_password.php | 4 +- app/setting/api/engine/company_setting.php | 2 +- app/setting/api/engine/gl_maintenance.php | 2 +- app/setting/api/engine/manage_company.php | 4 +- app/setting/api/engine/manage_profile.php | 6 +- app/setting/api/engine/manage_smtp.php | 4 +- app/setting/api/engine/manage_users.php | 4 +- app/setting/api/engine/request_reset_otp.php | 4 +- app/setting/api/engine/reset_password_otp.php | 4 +- app/setting/api/engine/retrieve_company.php | 4 +- app/setting/api/engine/retrieve_profile.php | 4 +- app/setting/api/engine/retrieve_smtp.php | 4 +- app/setting/api/engine/retrieve_users.php | 4 +- app/setting/api/engine/search_users.php | 4 +- app/setting/api/engine/switch_branch.php | 4 +- app/setting/api/engine/test_smtp.php | 4 +- 191 files changed, 534 insertions(+), 464 deletions(-) diff --git a/app/ac_dashboard/api/engine/by_source.php b/app/ac_dashboard/api/engine/by_source.php index 0de7653..b721ba3 100644 --- a/app/ac_dashboard/api/engine/by_source.php +++ b/app/ac_dashboard/api/engine/by_source.php @@ -1,10 +1,10 @@ assertFeatureAccessible('dashboard'); - require '../../../assets/utils/classes_ac/FinancialReports.php'; + require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $reports = new FinancialReports($pdo2, $company_id); diff --git a/app/ac_dashboard/api/engine/journals.php b/app/ac_dashboard/api/engine/journals.php index 144a4d7..74d2b8b 100644 --- a/app/ac_dashboard/api/engine/journals.php +++ b/app/ac_dashboard/api/engine/journals.php @@ -1,10 +1,10 @@ assertFeatureAccessible('dashboard'); - require '../../../assets/utils/classes_ac/FinancialReports.php'; + require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $reports = new FinancialReports($pdo2, $company_id); diff --git a/app/ac_dashboard/api/engine/pl.php b/app/ac_dashboard/api/engine/pl.php index 7d631c7..eedfb66 100644 --- a/app/ac_dashboard/api/engine/pl.php +++ b/app/ac_dashboard/api/engine/pl.php @@ -1,10 +1,10 @@ assertFeatureAccessible('dashboard'); - require '../../../assets/utils/classes_ac/FinancialReports.php'; + require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $reports = new FinancialReports($pdo2, $company_id); diff --git a/app/ac_dashboard/api/engine/posting_window.php b/app/ac_dashboard/api/engine/posting_window.php index 664b768..4f1b05c 100644 --- a/app/ac_dashboard/api/engine/posting_window.php +++ b/app/ac_dashboard/api/engine/posting_window.php @@ -1,6 +1,6 @@ assertFeatureAccessible('dashboard'); - require '../../../assets/utils/classes_ac/FinancialReports.php'; + require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $limit = max(1, min(50, (int)($data['limit'] ?? 10))); $reports = new FinancialReports($pdo2, $company_id); diff --git a/app/ac_dashboard/api/engine/trend.php b/app/ac_dashboard/api/engine/trend.php index 8a063b8..cc08acb 100644 --- a/app/ac_dashboard/api/engine/trend.php +++ b/app/ac_dashboard/api/engine/trend.php @@ -1,10 +1,10 @@ assertFeatureAccessible('dashboard'); - require '../../../assets/utils/classes_ac/FinancialReports.php'; + require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $months = max(1, min(24, (int)($data['months'] ?? 6))); $reports = new FinancialReports($pdo2, $company_id); diff --git a/app/accounting/api/engine/account.php b/app/accounting/api/engine/account.php index 1a3bed4..dc93c73 100644 --- a/app/accounting/api/engine/account.php +++ b/app/accounting/api/engine/account.php @@ -1,7 +1,7 @@ getAll(); diff --git a/app/accounting/api/engine/account_formula.php b/app/accounting/api/engine/account_formula.php index bb25a9f..e593300 100644 --- a/app/accounting/api/engine/account_formula.php +++ b/app/accounting/api/engine/account_formula.php @@ -1,8 +1,8 @@ getStats(); diff --git a/app/accounting/api/engine/acquire_op_lock.php b/app/accounting/api/engine/acquire_op_lock.php index ee0a1f3..9d756ff 100644 --- a/app/accounting/api/engine/acquire_op_lock.php +++ b/app/accounting/api/engine/acquire_op_lock.php @@ -1,7 +1,7 @@ getAll(); diff --git a/app/accounting/api/engine/department_stats.php b/app/accounting/api/engine/department_stats.php index 69d0148..d2b421a 100644 --- a/app/accounting/api/engine/department_stats.php +++ b/app/accounting/api/engine/department_stats.php @@ -1,7 +1,7 @@ getStats(); diff --git a/app/accounting/api/engine/get_balance_sheet.php b/app/accounting/api/engine/get_balance_sheet.php index a2dfa83..20fea7c 100644 --- a/app/accounting/api/engine/get_balance_sheet.php +++ b/app/accounting/api/engine/get_balance_sheet.php @@ -1,10 +1,10 @@ assertFeatureAccessible('reports'); -require '../../../assets/utils/classes_ac/FinancialReports.php'; +require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $as_of_date = trim((string)($data['as_of_date'] ?? ($data['as_of_period'] ?? date('Y-m-d')))); $dept_id = (int)($data['department_id'] ?? 0); diff --git a/app/accounting/api/engine/get_gl_by_source.php b/app/accounting/api/engine/get_gl_by_source.php index b116304..6a07ee5 100644 --- a/app/accounting/api/engine/get_gl_by_source.php +++ b/app/accounting/api/engine/get_gl_by_source.php @@ -1,6 +1,6 @@ assertFeatureAccessible('reports'); -require '../../../assets/utils/classes_ac/FinancialReports.php'; +require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $account_code = trim((string)($data['account_code'] ?? '')); $from_date = trim((string)($data['from_date'] ?? ($data['from_period'] ?? date('Y-m-d')))); diff --git a/app/accounting/api/engine/get_journal_detail.php b/app/accounting/api/engine/get_journal_detail.php index 90fb3b6..e2e310c 100644 --- a/app/accounting/api/engine/get_journal_detail.php +++ b/app/accounting/api/engine/get_journal_detail.php @@ -1,7 +1,7 @@ assertFeatureAccessible('reports'); -require '../../../assets/utils/classes_ac/FinancialReports.php'; +require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $from_date = trim((string)($data['from_date'] ?? ($data['from_period'] ?? date('Y-m-d')))); $to_date = trim((string)($data['to_date'] ?? ($data['to_period'] ?? $from_date))); diff --git a/app/accounting/api/engine/get_trial_balance.php b/app/accounting/api/engine/get_trial_balance.php index 4a18c8d..e2e029f 100644 --- a/app/accounting/api/engine/get_trial_balance.php +++ b/app/accounting/api/engine/get_trial_balance.php @@ -1,10 +1,10 @@ assertFeatureAccessible('reports'); -require '../../../assets/utils/classes_ac/FinancialReports.php'; +require_once '../../../assets/utils/classes_ac/FinancialReports.php'; $from_date = trim((string)($data['from_date'] ?? ($data['from_period'] ?? date('Y-m-d')))); $to_date = trim((string)($data['to_date'] ?? ($data['to_period'] ?? $from_date))); diff --git a/app/accounting/api/engine/get_vat_report.php b/app/accounting/api/engine/get_vat_report.php index cc0250b..49c3612 100644 --- a/app/accounting/api/engine/get_vat_report.php +++ b/app/accounting/api/engine/get_vat_report.php @@ -1,10 +1,10 @@ assertFeatureAccessible('reports'); -require '../../../assets/utils/classes_ac/TaxReportManager.php'; +require_once '../../../assets/utils/classes_ac/TaxReportManager.php'; $from_date = trim((string)($data['from_date'] ?? ($data['from_period'] ?? date('Y-m-d')))); $to_date = trim((string)($data['to_date'] ?? ($data['to_period'] ?? $from_date))); diff --git a/app/accounting/api/engine/log_batch_action.php b/app/accounting/api/engine/log_batch_action.php index 5dcd4bb..da121ba 100644 --- a/app/accounting/api/engine/log_batch_action.php +++ b/app/accounting/api/engine/log_batch_action.php @@ -1,7 +1,7 @@ getContactList(); diff --git a/app/contact/api/engine/contact_stats.php b/app/contact/api/engine/contact_stats.php index 2149893..a08477e 100644 --- a/app/contact/api/engine/contact_stats.php +++ b/app/contact/api/engine/contact_stats.php @@ -1,8 +1,8 @@ getContactTypeList(); diff --git a/app/contact/api/engine/manage_contact.php b/app/contact/api/engine/manage_contact.php index bd5573f..dfd55a9 100644 --- a/app/contact/api/engine/manage_contact.php +++ b/app/contact/api/engine/manage_contact.php @@ -1,8 +1,8 @@ getContactTypeById((int)$data['id']); diff --git a/app/dashboard/api/engine_report/low_stock.php b/app/dashboard/api/engine_report/low_stock.php index 06df6b9..2026e19 100644 --- a/app/dashboard/api/engine_report/low_stock.php +++ b/app/dashboard/api/engine_report/low_stock.php @@ -1,8 +1,8 @@ assertFeatureAccessible('dashboard'); diff --git a/app/expense/api/engine/convert_purchase_request.php b/app/expense/api/engine/convert_purchase_request.php index 323aca0..8ba4d99 100644 --- a/app/expense/api/engine/convert_purchase_request.php +++ b/app/expense/api/engine/convert_purchase_request.php @@ -1,8 +1,8 @@ Save + + Create Supplier Credit Note @@ -136,6 +140,10 @@ Void + + @@ -147,6 +155,9 @@