Add customer-specific filtering and refactor order invoice logic
Introduced customer attribute-based filtering for individual invoicing and enhanced collected order invoice processing with proper associations to customers and orders. Added new endpoints, fields, and utility methods to streamline data retrieval, ensure consistency, and support new use cases like 'Ready to Invoice'. Includes minor fixes, validations, and optimizations throughout the affected modules.
This commit is contained in:
@@ -35,22 +35,36 @@ class orderInvoicesRoute
|
||||
$collected_order_invoices->requireSelected();
|
||||
$response->success($collected_order_invoices->asArray());
|
||||
}
|
||||
// Define the users
|
||||
$users = new users_o();
|
||||
// Define the collected order invoices
|
||||
$tmp_collected_order_invoices = new collected_order_invoices_o();
|
||||
// Return the list of collected order invoices
|
||||
$response->success($collected_order_invoices->listObjectsWithPaginationIfSet(
|
||||
function ($collected_order_invoice) {
|
||||
function ($collected_order_invoice) use ($tmp_collected_order_invoices, $users) {
|
||||
// Select the orders for each collected order invoice
|
||||
$tmp_collected_order_invoices->select((int)$collected_order_invoice['id']);
|
||||
return [
|
||||
'id' => (int)$collected_order_invoice['id'],
|
||||
'name' => (string)$collected_order_invoice['name'],
|
||||
'notes' => (string)$collected_order_invoice['notes'],
|
||||
'customer_number' => (int)$collected_order_invoice['customer_number'],
|
||||
'customer_name' => (string)$users->getCustomerName((int)$collected_order_invoice['customer_number']),
|
||||
'processor' => $collected_order_invoice['processor'] ? (int)$collected_order_invoice['processor'] : null,
|
||||
'external_id' => (string)$collected_order_invoice['external_id'],
|
||||
'closed_at' => $collected_order_invoice['closed_at'] ? (string)$collected_order_invoice['closed_at'] : null,
|
||||
'updated_at' => (string)$collected_order_invoice['updated_at'],
|
||||
'created_at' => (string)$collected_order_invoice['created_at'],
|
||||
'orders' => ((new collected_order_invoices_o())->select((int)$collected_order_invoice['id']))->getOrders(true),
|
||||
'orders' => $tmp_collected_order_invoices->getOrders(true),
|
||||
'total_net_amount' => (float)$tmp_collected_order_invoices->getTotalAmount()
|
||||
//'debug' => $collected_order_invoice,
|
||||
];
|
||||
}
|
||||
},
|
||||
null,
|
||||
[
|
||||
// This adds the customer table to the query
|
||||
//'users' => 'users.customer_number = collected_order_invoices.customer_number',
|
||||
]
|
||||
));
|
||||
} else {
|
||||
(new logs_o())->add('orderInvoices', 'global', 0, 0, 'LIST_COLLECTED_INVOICES', 'User tried to access the list of collected order invoices without a valid session');
|
||||
@@ -62,6 +76,55 @@ class orderInvoicesRoute
|
||||
]
|
||||
);
|
||||
|
||||
/** Collected order invoices > Ready to invoice > GET */
|
||||
$this->get('/collected-invoices/ready-to-invoice', function () {
|
||||
global $response;
|
||||
self::requirePermission('list_collected_invoices');
|
||||
$user = (new authentication())->get_user();
|
||||
if ($user) {
|
||||
(new logs_o())->add('orderInvoices', 'global', 1, $user->id, 'LIST_COLLECTED_INVOICES_READY_TO_INVOICE', 'User accessed the list of collected order invoices ready to invoice');
|
||||
$collected_order_invoices = new collected_order_invoices_o();
|
||||
// Define the users
|
||||
$users = new users_o();
|
||||
// Define the collected order invoices
|
||||
$tmp_collected_order_invoices = new collected_order_invoices_o();
|
||||
// Return the list of collected order invoices
|
||||
$response->success($collected_order_invoices->listObjectsWithPaginationIfSet(
|
||||
function ($collected_order_invoice) use ($tmp_collected_order_invoices, $users) {
|
||||
// Select the orders for each collected order invoice
|
||||
$tmp_collected_order_invoices->select((int)$collected_order_invoice['id']);
|
||||
return [
|
||||
'id' => (int)$collected_order_invoice['id'],
|
||||
'name' => (string)$collected_order_invoice['name'],
|
||||
'notes' => (string)$collected_order_invoice['notes'],
|
||||
'customer_number' => (int)$collected_order_invoice['customer_number'],
|
||||
'customer_name' => (string)$users->getCustomerName((int)$collected_order_invoice['customer_number']),
|
||||
'processor' => $collected_order_invoice['processor'] ? (int)$collected_order_invoice['processor'] : null,
|
||||
'external_id' => (string)$collected_order_invoice['external_id'],
|
||||
'closed_at' => $collected_order_invoice['closed_at'] ? (string)$collected_order_invoice['closed_at'] : null,
|
||||
'updated_at' => (string)$collected_order_invoice['updated_at'],
|
||||
'created_at' => (string)$collected_order_invoice['created_at'],
|
||||
'orders' => $tmp_collected_order_invoices->getOrders(true),
|
||||
'total_net_amount' => (float)$tmp_collected_order_invoices->getTotalAmount(),
|
||||
];
|
||||
},
|
||||
$collected_order_invoices->forceRestrictFilters(
|
||||
[
|
||||
// This makes sure that the user can only see orders from the departments they explicitly have access to
|
||||
'customer_number' => $collected_order_invoices->listCustomersWithIndividualOrderInvoicing(),
|
||||
]
|
||||
)
|
||||
));
|
||||
} else {
|
||||
(new logs_o())->add('orderInvoices', 'global', 0, 0, 'LIST_COLLECTED_INVOICES_READY_TO_INVOICE', 'User tried to access the list of collected order invoices ready to invoice without a valid session');
|
||||
$response->error('Invalid session', 400);
|
||||
}
|
||||
},
|
||||
[
|
||||
'list_collected_invoices' => 'List ALL collected order invoices. This is a superuser-only route.'
|
||||
]
|
||||
);
|
||||
|
||||
/** Collected order invoices > POST */
|
||||
$this->post('/collected-invoices', function () {
|
||||
global $response;
|
||||
|
||||
Reference in New Issue
Block a user