mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-29 14:48:26 +00:00
Convert four raw frappe.db.sql statements to frappe.qb: - set_as_cancel (UPDATE -> frappe.qb.update) - the invalid-serial-no incoming_rate lookup - get_valuation_rate's last-valuation lookup - get_future_sle_with_negative_qty The serial-no comparisons (invalid-serial lookup and the get_stock_ledger_entries condition builder, which stays raw) are wrapped in lower()/Lower() so serial matching is case-insensitive on Postgres too -- MariaDB's collation already is, so this is a no-op there. Deterministic creation/name tiebreakers are added to the "ORDER BY posting_date DESC LIMIT 1" lookups so Postgres picks the same row MariaDB did. Surgical re-apply (not a whole-file port): develop's reposting valuation-recalc clause (`recalculate_valuation_rate`) in update_entries_after and the already-shipped Min()-wrapped get_items_to_be_repost GROUP BY are preserved. The dynamic-condition / row-locking raw queries (get_previous_sle, get_stock_ledger_entries builder, get_future_sle_with_negative_batch_qty, the qty_shift UPDATE) are intentionally left raw. Verified: full test_stock_ledger_entry suite 22/22 on MariaDB; added focused tests for set_as_cancel / get_valuation_rate / get_future_sle_with_negative_qty that pass on MariaDB and Postgres. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>