Hello. I've got a Purchase Order resource with a repeater field on it. The repeater field is for items, and each item can have a name, quantity, and received quantity.
When creating a purchase order, a user can add as many items as they like and set a quantity. The received quantity defaults to 0.
The user can then upload invoices associated with the purchase order. In so doing, here's what I want to happen:
- The user should be able to click an "Update Inventory" button on the invoice record to open a dialog with all of the existing items on that purchase order.
- The items will be shown with their name and quantity disabled and unable to be edited, but the received quantity will be editable.
- The user can edit the received quantity ONLY to a max of the quantity. The quantity is the upper limit.
- On submit, it should increment or decrement the item's quantity in the repeater field and save the updated record.
- On submit, it should also find each of the items in the Products table and increment or decrement their quantity accordingly.
I've been losing my mind over this for the past hour or so because I can't figure out how to do it.
I've got this so far:
DB::transaction(function () use ($record, $data) {
// Get the updated items from the modal
$updatedItems = $data['items'];
// Get the original items from the purchase order
$originalItems = $record->purchaseOrder->items;
// Initialize an array to hold the updated items for saving
$updatedItemsArray = [];
// Process the received quantities
foreach ($updatedItems as $updatedItem) {
// Find the matching original item in the purchase order
$matchingItem = collect($originalItems)->firstWhere('name', $updatedItem['name']);
if ($matchingItem) {
// Calculate the difference in received quantity
$previousReceivedQuantity = $matchingItem['received_quantity'];
$newReceivedQuantity = $updatedItem['received_quantity'];
$difference = $newReceivedQuantity - $previousReceivedQuantity;
// Update the received quantity in the original item
$matchingItem['received_quantity'] = $newReceivedQuantity;
// Increment or decrement inventory based on the difference
$product = Product::where('name', $updatedItem['name'])->first();
if ($product) {
if ($difference > 0) {
// If the received quantity increased, increment the inventory
$product->increment('inventory', $difference);
} elseif ($difference < 0) {
// If the received quantity decreased, decrement the inventory
$product->decrement('inventory', abs($difference));
}
}
// Add the updated item to the array
$updatedItemsArray[] = $matchingItem;
}
}
// Step 4: Save the updated items back to the purchase order
$record->purchaseOrder->items = $updatedItemsArray;
$record->purchaseOrder->save();
});
This works except I need to make the name and quantity fields disabled and dehydrated(false) because otherwise the user can edit them. However, when I do that, they're not in the $data array and I'm not able to match it.