Fix item counts, PR/QT conversions, validation and department loss
This commit is contained in:
@@ -260,7 +260,10 @@ class OrderManager {
|
||||
{
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT o.*,
|
||||
COALESCE(c.contact_name, '') AS contact_name
|
||||
COALESCE(c.contact_name, '') AS contact_name,
|
||||
(SELECT COUNT(*) FROM td_order_item i
|
||||
WHERE i.company_id = o.company_id
|
||||
AND i.order_id = o.id) AS item_count
|
||||
FROM td_order o
|
||||
LEFT JOIN md_contact c
|
||||
ON c.company_id = o.company_id
|
||||
@@ -493,7 +496,7 @@ class OrderManager {
|
||||
|
||||
// Fetch existing row to check status and load log
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT status, `log` FROM td_order
|
||||
"SELECT status, department_id, `log` FROM td_order
|
||||
WHERE company_id = :company_id AND id = :id"
|
||||
);
|
||||
$sth->execute([':company_id' => $this->company_id, ':id' => $id]);
|
||||
@@ -502,6 +505,11 @@ class OrderManager {
|
||||
if (!$row) {
|
||||
throw new Exception("Order not found.");
|
||||
}
|
||||
|
||||
// Pages without a department field (Revenue SO) must not wipe the stored one
|
||||
$department_id = array_key_exists('department_id', $data)
|
||||
? (int)$data['department_id']
|
||||
: (int)$row['department_id'];
|
||||
$cur_status = (int)$row['status'];
|
||||
if ($cur_status !== 0 && $cur_status !== -2) {
|
||||
throw new Exception("Only draft or pending orders can be edited.");
|
||||
@@ -541,7 +549,7 @@ class OrderManager {
|
||||
WHERE id = :id AND company_id = :company_id"
|
||||
)->execute([
|
||||
':contact_id' => (int)($data['contact_id'] ?? 0),
|
||||
':department_id' => (int)($data['department_id'] ?? 0),
|
||||
':department_id' => $department_id,
|
||||
':order_date' => $data['order_date'] ?? date('Y-m-d'),
|
||||
':subtotal' => $subtotal,
|
||||
':discount' => $discount,
|
||||
|
||||
@@ -194,7 +194,10 @@ class PurchaseOrderManager {
|
||||
{
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT p.*,
|
||||
COALESCE(c.contact_name, '') AS contact_name
|
||||
COALESCE(c.contact_name, '') AS contact_name,
|
||||
(SELECT COUNT(*) FROM td_purchase_order_item i
|
||||
WHERE i.company_id = p.company_id
|
||||
AND i.order_id = p.id) AS item_count
|
||||
FROM td_purchase_order p
|
||||
LEFT JOIN md_contact c
|
||||
ON c.company_id = p.company_id
|
||||
|
||||
@@ -94,7 +94,10 @@ class PurchaseRequestManager
|
||||
WHERE p.company_id = r.company_id
|
||||
AND p.source = 'purchase_request'
|
||||
AND p.source_id = r.id
|
||||
AND p.status != -1) AS linked_po_count
|
||||
AND p.status != -1) AS linked_po_count,
|
||||
(SELECT COUNT(*) FROM td_purchase_request_item i
|
||||
WHERE i.company_id = r.company_id
|
||||
AND i.request_id = r.id) AS item_count
|
||||
FROM td_purchase_request r
|
||||
LEFT JOIN md_contact c
|
||||
ON c.company_id = r.company_id AND c.id = r.contact_id
|
||||
@@ -166,6 +169,12 @@ class PurchaseRequestManager
|
||||
|
||||
if (empty($items)) throw new Exception('At least one item is required.');
|
||||
|
||||
$request_date = (string)($data['request_date'] ?? '');
|
||||
$required_date = (string)($data['required_date'] ?? '');
|
||||
if ($request_date !== '' && $required_date !== '' && $required_date < $request_date) {
|
||||
throw new Exception('Required date cannot be earlier than the request date.');
|
||||
}
|
||||
|
||||
[$subtotal, $tax, $grand] = $this->computeTotals($items, $discount, $shipping_fee);
|
||||
|
||||
if ($id === 0) {
|
||||
|
||||
@@ -89,7 +89,10 @@ class QuotationManager
|
||||
public function getList(): array
|
||||
{
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT q.*, COALESCE(c.contact_name, '') AS contact_name
|
||||
"SELECT q.*, COALESCE(c.contact_name, '') AS contact_name,
|
||||
(SELECT COUNT(*) FROM td_quotation_item i
|
||||
WHERE i.company_id = q.company_id
|
||||
AND i.quotation_id = q.id) AS item_count
|
||||
FROM td_quotation q
|
||||
LEFT JOIN md_contact c
|
||||
ON c.id = q.contact_id AND c.company_id = q.company_id
|
||||
@@ -173,6 +176,24 @@ class QuotationManager
|
||||
$items = $data['items'] ?? [];
|
||||
$discount = (float)($data['discount'] ?? 0);
|
||||
|
||||
$quotation_date = (string)($data['quotation_date'] ?? '');
|
||||
$valid_until = (string)($data['valid_until'] ?? '');
|
||||
if ((int)($data['contact_id'] ?? 0) <= 0) {
|
||||
throw new Exception('Contact is required.');
|
||||
}
|
||||
if ($quotation_date === '') {
|
||||
throw new Exception('Quotation date is required.');
|
||||
}
|
||||
if ($valid_until !== '' && $valid_until < $quotation_date) {
|
||||
throw new Exception('Valid until cannot be earlier than the quotation date.');
|
||||
}
|
||||
if ((int)($data['department_id'] ?? 0) <= 0) {
|
||||
throw new Exception('Department is required.');
|
||||
}
|
||||
if (empty($items)) {
|
||||
throw new Exception('At least one line item is required.');
|
||||
}
|
||||
|
||||
[$subtotal, $tax, $grand] = $this->computeTotals($items, $discount);
|
||||
|
||||
if ($id === 0) {
|
||||
|
||||
@@ -169,7 +169,10 @@ class ReturnManager {
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT r.*,
|
||||
COALESCE(c.contact_name, '') AS contact_name,
|
||||
o.order_number
|
||||
o.order_number,
|
||||
(SELECT COUNT(*) FROM td_return_item i
|
||||
WHERE i.company_id = r.company_id
|
||||
AND i.return_id = r.id) AS item_count
|
||||
FROM td_return r
|
||||
LEFT JOIN md_contact c
|
||||
ON c.company_id = r.company_id
|
||||
|
||||
@@ -154,7 +154,10 @@ class SupplierReturnManager {
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT r.*,
|
||||
COALESCE(c.contact_name, '') AS contact_name,
|
||||
p.po_number
|
||||
p.po_number,
|
||||
(SELECT COUNT(*) FROM td_supplier_return_item i
|
||||
WHERE i.company_id = r.company_id
|
||||
AND i.return_id = r.id) AS item_count
|
||||
FROM td_supplier_return r
|
||||
LEFT JOIN md_contact c
|
||||
ON c.company_id = r.company_id
|
||||
|
||||
Reference in New Issue
Block a user