accounting workflows
This commit is contained in:
@@ -16,85 +16,10 @@
|
||||
}
|
||||
$answer['output'] = $result;
|
||||
|
||||
// Check if an active invoice already exists for this order
|
||||
$sth = $pdo2->prepare(
|
||||
"SELECT COUNT(*) FROM td_invoice
|
||||
WHERE company_id = :company_id
|
||||
AND order_id = :order_id
|
||||
AND doc_type = 'invoice'
|
||||
AND status != 4"
|
||||
);
|
||||
$sth->execute([':company_id' => $company_id, ':order_id' => $id]);
|
||||
$answer['has_active_invoice'] = (int)$sth->fetchColumn() > 0;
|
||||
|
||||
// Calculate returnable items — order items minus already confirmed returns
|
||||
$order_items = $result['items'] ?? '[]';
|
||||
|
||||
// Aggregate returned qty per item_id from confirmed returns
|
||||
$sth = $pdo2->prepare(
|
||||
"SELECT items FROM td_return
|
||||
WHERE company_id = :company_id
|
||||
AND order_id = :order_id
|
||||
AND status = 1"
|
||||
);
|
||||
$sth->execute([':company_id' => $company_id, ':order_id' => $id]);
|
||||
$returned_qty = [];
|
||||
|
||||
foreach ($sth->fetchAll(PDO::FETCH_COLUMN) as $items_json) {
|
||||
$items = json_decode($items_json, true) ?: [];
|
||||
foreach ($items as $item) {
|
||||
$item_id = (int)($item['item_id'] ?? -1);
|
||||
if ($item_id < 0) continue;
|
||||
$returned_qty[$item_id] = ($returned_qty[$item_id] ?? 0) + (float)$item['quantity'];
|
||||
}
|
||||
}
|
||||
|
||||
$returnable = [];
|
||||
foreach ($order_items as $i => $item) {
|
||||
$already_returned = $returned_qty[$i] ?? 0;
|
||||
$remaining = (float)$item['quantity'] - $already_returned;
|
||||
if ($remaining > 0) {
|
||||
$stock_out_warehouse_id = (int)($item['warehouse_id'] ?? 0);
|
||||
$stock_out_id = (int)($item['stock_out_id'] ?? 0);
|
||||
|
||||
if ($stock_out_warehouse_id > 0 && $stock_out_id > 0) {
|
||||
$table = 'td_stock_' . $stock_out_warehouse_id;
|
||||
$sth = $pdo2->prepare(
|
||||
"SELECT id, status, zone, aisle, rack, lot_number, serial_number
|
||||
FROM `{$table}`
|
||||
WHERE company_id = :company_id
|
||||
AND id = :id
|
||||
AND type = 'out'
|
||||
LIMIT 1"
|
||||
);
|
||||
$sth->execute([
|
||||
':company_id' => $company_id,
|
||||
':id' => $stock_out_id,
|
||||
]);
|
||||
$stock_out = $sth->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($stock_out) {
|
||||
$item['zone'] = $stock_out['zone'] ?? ($item['zone'] ?? '');
|
||||
$item['aisle'] = $stock_out['aisle'] ?? ($item['aisle'] ?? '');
|
||||
$item['rack'] = $stock_out['rack'] ?? ($item['rack'] ?? '');
|
||||
$item['lot_number'] = $stock_out['lot_number'] ?? ($item['lot_number'] ?? '');
|
||||
$item['serial_number'] = $stock_out['serial_number'] ?? ($item['serial_number'] ?? '');
|
||||
$item['stock_out_status'] = (int)$stock_out['status'];
|
||||
}
|
||||
}
|
||||
|
||||
$returnable[] = array_merge($item, [
|
||||
'item_id' => $i,
|
||||
'original_qty' => (float)$item['quantity'],
|
||||
'returned_qty' => $already_returned,
|
||||
'returnable_qty' => $remaining,
|
||||
'stock_out_warehouse_id' => $stock_out_warehouse_id,
|
||||
'stock_out_status' => (int)($item['stock_out_status'] ?? 0),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$answer['returnable_items'] = $returnable;
|
||||
$active_invoice_id = $order->getActiveInvoiceId($id);
|
||||
$answer['has_active_invoice'] = $active_invoice_id > 0;
|
||||
$answer['active_invoice_id'] = $active_invoice_id;
|
||||
$answer['returnable_items'] = $order->getReturnableItems($result);
|
||||
} else {
|
||||
$answer['output'] = $order->getOrderList();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user