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 <noreply@anthropic.com>
This commit is contained in:
Thanakorn S
2026-05-23 17:06:08 +07:00
co-authored by Claude Sonnet 4.6
parent eddb10aa22
commit b07882e3f4
191 changed files with 534 additions and 464 deletions
+3 -3
View File
@@ -1,8 +1,8 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/OrderManager.php';
require '../../../assets/utils/classes/QuotationManager.php';
require_once '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/classes/OrderManager.php';
require_once '../../../assets/utils/classes/QuotationManager.php';
require_role($user_role, ['owner', 'admin', 'staff']);
+2 -2
View File
@@ -1,8 +1,8 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/db_auth.php';
require_role($user_role, ['owner', 'admin']);
require '../../../assets/utils/classes/QuotationManager.php';
require_once '../../../assets/utils/classes/QuotationManager.php';
$id = (int)($data['id'] ?? 0);
@@ -1,8 +1,8 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/db_auth.php';
require_role($user_role, ['owner', 'admin', 'staff']);
require '../../../assets/utils/classes/InvoiceManager.php';
require_once '../../../assets/utils/classes/InvoiceManager.php';
try {
$new_id = null;
+3 -3
View File
@@ -1,8 +1,8 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/UsageGuard.php';
require '../../../assets/utils/classes/OrderManager.php';
require_once '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/classes/UsageGuard.php';
require_once '../../../assets/utils/classes/OrderManager.php';
require_role($user_role, ['owner', 'admin', 'staff']);
+3 -3
View File
@@ -1,8 +1,8 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/UsageGuard.php';
require '../../../assets/utils/classes/QuotationManager.php';
require_once '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/classes/UsageGuard.php';
require_once '../../../assets/utils/classes/QuotationManager.php';
$action = $data['action'] ?? '';
$id = (int)($data['id'] ?? 0);
@@ -1,9 +1,9 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/db_auth.php';
require_role($user_role, ['owner', 'admin', 'staff']);
require '../../../assets/utils/classes/OrderManager.php';
require '../../../assets/utils/classes/InvoiceManager.php';
require_once '../../../assets/utils/classes/OrderManager.php';
require_once '../../../assets/utils/classes/InvoiceManager.php';
$order_id = (int)($data['order_id'] ?? 0);
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/QuotationManager.php';
require_once '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/classes/QuotationManager.php';
try {
$quotation = new QuotationManager($pdo2, $company_id);
@@ -1,7 +1,7 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/QuotationManager.php';
require_once '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/classes/QuotationManager.php';
$id = (int)($data['id'] ?? 0);
$qm = new QuotationManager($pdo2, $company_id);
@@ -1,7 +1,7 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/QuotationManager.php';
require_once '../../../assets/utils/db_auth.php';
require_once '../../../assets/utils/classes/QuotationManager.php';
require_role($user_role, ['owner', 'admin', 'staff']);
+3 -6
View File
@@ -194,6 +194,7 @@
var current_tab = <?php echo json_encode($_GET['tab'] ?? 'invoice'); ?>;
var all_invoices = [];
var formula_map = {};
const can_delete = ['admin', 'owner'].includes(user_role);
function is_invoice_overdue(status, due_date) {
if (String(status) !== '1' || !due_date) return false;
@@ -362,9 +363,7 @@
<a href="javascript:;" title="View GL Entry" class="me-2" onclick="show_gl_modal('invoice',${inv.id})">
<i class="ti ti-book fs-5 text-secondary"></i>
</a>
<a href="javascript:;" title="Delete" class="link-danger" onclick="delete_invoice(${inv.id},'${escape_html(inv.invoice_number)}')">
<i class="ti ti-trash fs-5"></i>
</a>
${can_delete ? `<a href="javascript:;" title="Delete" class="link-danger" onclick="delete_invoice(${inv.id},'${escape_html(inv.invoice_number)}')"><i class="ti ti-trash fs-5"></i></a>` : ''}
</td>
</tr>`;
});
@@ -410,9 +409,7 @@
<a href="javascript:;" title="View GL Entry" class="me-2" onclick="show_gl_modal('credit_note',${cn.id})">
<i class="ti ti-book fs-5 text-secondary"></i>
</a>
<a href="javascript:;" title="Delete" class="link-danger" onclick="delete_invoice(${cn.id},'${escape_html(cn.invoice_number)}')">
<i class="ti ti-trash fs-5"></i>
</a>
${can_delete ? `<a href="javascript:;" title="Delete" class="link-danger" onclick="delete_invoice(${cn.id},'${escape_html(cn.invoice_number)}')"><i class="ti ti-trash fs-5"></i></a>` : ''}
</td>
</tr>`;
});