<h4>Shopping Cart Fixes</h4><ul><li><strong>Fixed:</strong> Order Summary showing $0.00 — Grand Total and Subtotal display lines were commented out in calculateNewGrandTotal() and calculateNewSubtotal() in custom_js.php. Uncommented both .cart-grand-total updates so totals render correctly on page load.</li><li><strong>Fixed:</strong> deleteCartItem crash — controller read $r["id"] but JS sends cart_items_id. Added fallback to check both keys.</li><li><strong>Fixed:</strong> deleteCartItemSaved — same $r["id"] mismatch. Added fallback.</li><li><strong>Fixed:</strong> getOrderDetails — undefined keys "id" and "trans_id" when called without params. Added null coalescing.</li><li><strong>Fixed:</strong> view_order_details — null $cartOrder crash when order not found. Added null guard with early return.</li><li><strong>Fixed:</strong> saveForLater crash (11 undefined key warnings) — model expected ALL cart item fields in POST params but JS only sends cart_items_id via form serialize. Changed model to fetch item data from DB by cart_items_id and use those values as fallback.</li><li><strong>Fixed:</strong> moveSaveForLaterToCart — expected cart_items_saved_id but JS sends cart_items_id. Added fallback.</li><li><strong>Fixed:</strong> deleteCartItem model — null crash on $get["item_type"] when item already deleted. Added null guard.</li><li><strong>Fixed:</strong> subscribe() — no parameter guard, crashes without sub_id. Added early return with error message.</li><li><strong>Fixed:</strong> stripeRefundPayment() — no parameter guard for missing id. Added early return.</li><li><strong>Fixed:</strong> Undefined OPENAI_APIKEY in $_ENV on ShoppingCart2.php line 1919 — added null coalescing.</li></ul>