Commit Graph

59486 Commits

Author SHA1 Message Date
Mihir Kandoi
4a572311bc fix(buying): insert default Supplier Scorecard records with ignore_if_duplicate (Postgres)
make_default_records inserted Scorecard Variable/Standing rows in a loop and swallowed DuplicateEntryError (frappe.NameError). On Postgres the failed insert poisons the txn so the next iteration's insert raises InFailedSqlTransaction. insert(ignore_if_duplicate=True) emits ON CONFLICT DO NOTHING, never poisoning the txn. No-op on MariaDB.
2026-06-29 22:38:01 +05:30
Mihir Kandoi
1dde2b5f1e fix(stock): savepoint repost loop in Stock Ledger Invariant Check (Postgres)
Same shape: the rows loop submits a Repost Item Valuation; a caught DuplicateEntryError poisons the Postgres txn so the next iteration's submit raises InFailedSqlTransaction. Savepoint + rollback(save_point=) before continue. No-op on MariaDB.
2026-06-29 22:38:00 +05:30
Mihir Kandoi
d7a81affc2 fix(stock): savepoint repost loop in Stock and Account Value Comparison (Postgres)
The item/warehouse loop submits a Repost Item Valuation; a DuplicateEntryError poisons the Postgres transaction, so the next iteration's .submit() raises InFailedSqlTransaction. MariaDB continues. Savepoint per iteration + rollback(save_point=) on the caught duplicate (mirrors repost_item_valuation:782). No-op on MariaDB.
2026-06-29 22:37:59 +05:30
Mihir Kandoi
91dae91769 fix(setup): deterministic tiebreaker in get_exchange_rate Currency Exchange lookup (Postgres)
get_exchange_rate orders Currency Exchange by 'date desc' LIMIT 1 with no unique tiebreaker. Currency Exchange autoname {date}-{from}-{to}-{purpose} allows multiple same-date rows (different purpose) for one currency pair; on the no-purpose-filter path all match, so MariaDB and Postgres can return a different exchange_rate for the same inputs. Add 'name desc' so both engines pick the same row. MariaDB row count unchanged.
2026-06-29 22:25:39 +05:30
Mihir Kandoi
8c03029f28 fix(controllers): guard return-rate division against a zero stock qty (Postgres)
get_rate_for_return builds Abs(stock_value_difference / actual_qty) for Sales/Delivery returns and passes it to get_value with no actual_qty filter. A matched Stock Ledger Entry with actual_qty=0 (a zero-qty repost / serial-batch row) makes Postgres raise 'division by zero' while MariaDB returns NULL. Wrap the divisor in NullIf(actual_qty, 0) so both engines return NULL. MariaDB output unchanged. Sibling of the already-fixed /actual_qty sites in stock_ledger.py and incorrect_serial_no_valuation.py.
2026-06-29 22:25:19 +05:30
Mihir Kandoi
c26ad9fc36 Merge pull request #56625 from mihir-kandoi/pg-isi-txn-fix
fix: survive a failed invoice during Import Supplier Invoice on Postgres
2026-06-29 22:20:06 +05:30
Mihir Kandoi
0431b20945 Merge pull request #56620 from mihir-kandoi/pg-orderby-limit1-tiebreakers
fix: deterministic tiebreakers for ORDER BY <date> DESC LIMIT 1 lookups (MariaDB↔Postgres parity)
2026-06-29 22:18:04 +05:30
Mihir Kandoi
4952ce0cac Merge pull request #56622 from mihir-kandoi/pg-savepoint-txn-abort
fix: savepoint catch-and-continue DB writes to survive Postgres txn-abort (InFailedSqlTransaction)
2026-06-29 22:11:47 +05:30
Mihir Kandoi
dc2d3c433d Merge pull request #56624 from mihir-kandoi/pg-ci-fanout-stop-guard
ci(postgres): fail setup if pg_ctl stop fails; drop redundant ALTER SYSTEM block
2026-06-29 22:10:52 +05:30
Mihir Kandoi
65539d44b8 fix(regional): survive a failed invoice during Import Supplier Invoice on Postgres
create_purchase_invoice caught its own failure and then ran frappe.db.set_value + log_error in the SAME transaction. On Postgres a failed insert/save aborts the whole transaction, so the error-marking died with InFailedSqlTransaction and the failure cascaded through prepare_data_for_import's per-file loop, killing the entire import; MariaDB recovers per-statement and continues.

Let create_purchase_invoice raise, and wrap each call in prepare_data_for_import in frappe.db.savepoint + rollback(save_point=...). On failure the savepoint rollback un-poisons the transaction, the error is logged, and the per-file status is set to Error and committed (self.db_set(commit=True), matching the existing process_file_data status commit) so an interrupted import durably reflects Error instead of staying at the already-committed Processing File Data; the loop then continues to the next file. The savepoint is taken after create_supplier/create_address so those are preserved exactly as before.

Behaviour change (MariaDB): a failed invoice's partially-created draft Purchase Invoice is now rolled back on BOTH engines instead of being left as an orphan draft on MariaDB. Deliberate and more correct - a failed import should not leave a partial invoice; release-note worthy.
2026-06-29 22:10:00 +05:30
Mihir Kandoi
9157c9a67b Merge pull request #56623 from frappe/patch-test-download-from-release
ci(patch): pull v14 baseline from GitHub release instead of frappe.io
2026-06-29 21:47:04 +05:30
Mihir Kandoi
f645e51338 ci(patch): fetch v14 baseline from public release URL without a token
Greptile flagged that `gh release download` with `github.token` could be
rejected for fork pull requests (token scoped to the fork, asset in
frappe/erpnext). The release is public and published, so the asset is
downloadable anonymously from objects.githubusercontent.com — drop the token
and curl the public URL directly. Removes the cross-repo token dependency and
keeps fork PRs working. Cloudflare is still bypassed since GitHub serves the
asset, not frappe.io.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:33:42 +05:30
Mihir Kandoi
b93a3bca16 ci(postgres): fail setup if pg_ctl stop fails before baking the datadir
The "Stop DB and stage datadir" step swallowed a failed `pg_ctl -m fast -w
stop` with `|| true`, then moved and tarred the PGDATA regardless. A stop
that times out or errors would bake a still-running, crash-inconsistent
cluster into the artifact every test shard consumes — and with
full_page_writes off, crash recovery can't repair torn pages. Drop the
`|| true` so a failed stop fails the job, mirroring the MariaDB sister's
"don't bake a dirty datadir" guard.

Also drop the redundant `ALTER SYSTEM SET fsync/synchronous_commit/
full_page_writes = off` block from install.sh. Its comment claimed the
postgres workflow "runs a service-container DB and never calls start-db.sh",
but it does call start-db.sh, which already applies those flags via `-o` on
every postgres start (setup job and each shard). The block was a no-op and
its justification was factually wrong.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:29:22 +05:30
Mihir Kandoi
6e955bdf3f ci(patch): download v14 baseline from GitHub release instead of frappe.io
The Patch Test job intermittently failed on the "Download erpnext v14 backup"
step with HTTP 403 Forbidden: frappe.io sits behind Cloudflare, and wget's
default User-Agent gets flagged by bot protection on cache misses. This caused
random failures across PRs that only a re-run would clear.

Pull the fixed baseline from the v14-baseline GitHub release using the built-in
token instead. Release assets are served from GitHub's CDN and authenticated
from the runner, so no rate-limit roulette.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:28:08 +05:30
Mihir Kandoi
0978d0304f test(manufacturing): savepoint duplicate Routing insert in create_routing (Postgres)
create_routing inserts a Routing and, on DuplicateEntryError, re-fetches and updates. On Postgres the failed insert aborts the transaction so the get_doc/save in the except raises InFailedSqlTransaction; MariaDB recovers. Savepoint + rollback before the fallback path.
2026-06-29 20:50:05 +05:30
Mihir Kandoi
2b966b69ce fix(stock): savepoint per-voucher accounting repost submit (Postgres)
make_reposting_for_accounting_ledgers submits a new Repost Item Valuation per voucher in a loop under except Exception. On Postgres a failed submit aborts the transaction so the next iteration's DB work dies with InFailedSqlTransaction; MariaDB continues. Savepoint per iteration, roll back on failure. No-op on MariaDB.
2026-06-29 20:50:05 +05:30
Mihir Kandoi
864fe50b24 fix(subcontracting): savepoint Purchase Receipt submit in make_purchase_receipt (Postgres)
Same submit()/add_comment-in-except shape as the PO->SCO mapper: on Postgres a failed submit aborts the transaction so the follow-on Comment insert raises InFailedSqlTransaction; MariaDB continues. Savepoint + rollback before add_comment. No-op on MariaDB.
2026-06-29 20:50:05 +05:30
Mihir Kandoi
b6165844ed fix(buying): savepoint Subcontracting Order submit in make_subcontracting_order (Postgres)
target_doc.submit() is wrapped in except Exception whose handler calls add_comment (a Comment insert). On Postgres a failed submit poisons the transaction so the add_comment insert raises InFailedSqlTransaction; MariaDB logs the comment. Savepoint + rollback before add_comment. No-op on MariaDB.
2026-06-29 20:50:05 +05:30
Jatin3128
6f97c7199c fix: carry item-level project to Purchase Receipt GL entries (#56568)
Purchase Receipt stock and asset GL lines used the item row's cost center
but always fell back to the document-level project, unlike Purchase Invoice
which uses the item-level project. add_gl_entry accepted a project argument
but never wrote it to the GL dict, so the inward, Stock Received But Not
Billed, landed cost, divisional loss, sub-contracting and exchange rate
lines dropped the row's project.

Write project into the GL dict and pass project=item.project on the entries
that were missing it, so project behaves like cost center and matches
Purchase Invoice.

Ticket: 72523
v14-baseline
2026-06-29 17:22:20 +05:30
Mihir Kandoi
70142d147e fix(selling): break last-sales-amount ties deterministically in Inactive Customers
get_last_sales_amt ordered by the sales date DESC only; same-date documents made the reported Last Order Amount engine-dependent. Add name DESC tiebreaker.
2026-06-29 16:29:46 +05:30
Mihir Kandoi
e52b9825e3 fix(accounts): break last-purchase-rate ties deterministically in Gross Profit
get_last_purchase_rate ordered by posting_date DESC only; same-date Purchase Invoices yielded an undefined last_purchase_rate that diverged between MariaDB and Postgres. Add purchase_invoice.name DESC tiebreaker.
2026-06-29 16:29:45 +05:30
Mihir Kandoi
93c186fea7 fix(assets): break latest asset-movement ties deterministically
get_latest_location_and_custodian ordered by transaction_date DESC only; equal-dated movements left the current location/custodian engine-dependent. Add asm.name DESC tiebreaker so both engines pick the same movement.
2026-06-29 16:29:44 +05:30
Mihir Kandoi
63ea907881 fix(accounts): break exchange-rate revaluation GLE ties deterministically
calculate_exchange_rate_using_last_gle ordered the latest-GLE lookups by posting_date DESC only. With multiple GL Entries on the latest posting_date the picked row was undefined, so MariaDB and Postgres could choose different vouchers and return a different last_exchange_rate (and revaluation gain/loss). Add gl.name DESC as a tiebreaker so both engines pick the same row; MariaDB row count unchanged.
2026-06-29 16:29:43 +05:30
Shllokkk
d4ee034637 Merge pull request #56199 from Shllokkk/create-payment-entries-from-payable-report
feat: create payment entries from accounts payable report
2026-06-29 15:21:49 +05:30
Mihir Kandoi
d0d32cb994 Merge pull request #56614 from mihir-kandoi/claude/wizardly-lamport-d0bc51
fix: delete Lead-linked Addresses on transaction deletion
2026-06-29 15:20:36 +05:30
Mihir Kandoi
56a7ee6346 fix: delete Lead-linked Addresses on transaction deletion
The lead/address cleanup pre-escaped each address name before passing the
list into a query-builder .isin() filter, which escapes again. The
double-escaping produced `name IN ('''Addr''')`, matching nothing, so
Lead-linked Addresses were never deleted on either MariaDB or Postgres.

Pass the raw list straight into .isin() so the builder escapes once.
2026-06-29 15:10:24 +05:30
Shllokkk
98b77f427b feat: create payment entries from accounts payable report 2026-06-29 14:53:46 +05:30
Ankush Menat
747374e767 fix: Use correct doctype name for PCV perm-check (#56606)
closes https://github.com/frappe/erpnext/issues/56593
2026-06-29 08:56:46 +00:00
rohitwaghchaure
5523c15ab8 fix: for purchases do voucher based reposting (#56601) 2026-06-29 14:17:13 +05:30
Sowmiya P K
6115af720b fix: adjust outstanding amount calculation in purchase and sales registers 2026-06-29 10:41:42 +05:30
MochaMind
1a66fe9907 fix: sync translations from crowdin (#56595)
* fix: French translations

* fix: Danish translations

* fix: Persian translations

* fix: Uzbek translations

* fix: Spanish translations

* fix: Arabic translations

* fix: Bulgarian translations

* fix: Czech translations

* fix: German translations

* fix: Hungarian translations

* fix: Italian translations

* fix: Korean translations

* fix: Dutch translations

* fix: Polish translations

* fix: Portuguese translations

* fix: Russian translations

* fix: Slovenian translations

* fix: Serbian (Cyrillic) translations

* fix: Swedish translations

* fix: Turkish translations

* fix: Chinese Simplified translations

* fix: Vietnamese translations

* fix: Portuguese, Brazilian translations

* fix: Indonesian translations

* fix: Thai translations

* fix: Croatian translations

* fix: Hindi translations

* fix: Burmese translations

* fix: Bosnian translations

* fix: Norwegian Bokmal translations

* fix: Serbian (Latin) translations

* fix: Esperanto translations
2026-06-29 00:36:35 +02:00
MochaMind
d8c267c253 fix: sync translations from crowdin (#56590) 2026-06-28 21:29:24 +02:00
MochaMind
56926ffe00 chore: update POT file (#56592) 2026-06-28 21:28:18 +02:00
rohitwaghchaure
6c38856f65 feat: Standard Valuation Rate (#56570)
* feat: standard rate valuation

* fix: greptile comments

* fix: PPV account should be mandatory for standard cost valuation
2026-06-28 20:35:01 +05:30
Mihir Kandoi
081fbe9e3f Merge pull request #56586 from mihir-kandoi/alias-no-copy
fix: party aliases should be no copy
2026-06-27 16:24:40 +05:30
Mihir Kandoi
057af21cd8 fix: party aliases should be no copy 2026-06-27 16:13:43 +05:30
rohitwaghchaure
c7ef42ef98 fix: sync Stock Reconciliation difference amount with GL after reposting (#56574)
* fix: sync Stock Reconciliation difference amount with GL after reposting

* fix: placement of recalculate differece amount function
2026-06-27 10:28:45 +00:00
Diptanil Saha
79ad11e21b chore(crm_settings): remove unused delete_custom_fields import (#56558) 2026-06-27 14:38:59 +05:30
Diptanil Saha
485e9041de chore: removing controllers from pre-commit eslint hooks exclude list (#56575)
* chore: removed `controllers` from exclude list on `.pre-commit-config.yaml`

* chore: fix `transactions.js` eslint issues

* chore: fix `taxes_and_totals.js` eslint issue

* chore: fix `accounts.js` eslint issue
2026-06-27 00:42:34 +05:30
rohitwaghchaure
5e60e4faa7 fix: do not allow closing the accounting period for future dates (#56551) 2026-06-26 17:28:20 +00:00
Nabin Hait
3f053e599c Merge pull request #56536 from frappe/chore/test-bom-search
test: BOM Search report coverage
2026-06-26 22:01:25 +05:30
Nabin Hait
b0232f41ea Merge pull request #56545 from frappe/chore/test-incorrect-stock-value-report
test: Incorrect Stock Value Report report coverage
2026-06-26 22:00:43 +05:30
Nabin Hait
1d517375d9 Merge pull request #56553 from frappe/chore/refactor-ar-ap-report-tests
test: reuse bootstrap master data in Accounts Receivable/Payable report tests
2026-06-26 22:00:15 +05:30
Nabin Hait
1d9d982719 Merge pull request #56554 from frappe/chore/refactor-cash-flow-report-tests
test: reuse bootstrap master data in Cash Flow report tests
2026-06-26 21:59:47 +05:30
Nabin Hait
66a711c849 Merge pull request #56555 from frappe/chore/refactor-general-ledger-report-tests
test: reuse bootstrap master data in General Ledger report tests
2026-06-26 21:58:39 +05:30
Nabin Hait
a2f201e1d7 Merge pull request #56556 from frappe/chore/refactor-stock-balance-report-tests
test: reuse bootstrap master data in Stock Balance report tests
2026-06-26 21:58:05 +05:30
Nabin Hait
b989bef967 Merge pull request #56557 from frappe/chore/refactor-stock-ledger-projected-report-tests
test: reuse bootstrap master data in Stock Ledger & Stock Projected Qty report tests
2026-06-26 21:57:30 +05:30
Nabin Hait
c1b91b0f5f Merge pull request #56541 from frappe/chore/test-item-where-used
test: Item Where Used report coverage
2026-06-26 21:56:33 +05:30
rohitwaghchaure
31f89b72b4 fix: ignored posting time 00:00:00 in RIV (#56571) 2026-06-26 13:49:16 +00:00
Diptanil Saha
1e2adc0706 ci: bump pre-commit actions to v3.0.1 (#56562) 2026-06-26 11:14:57 +00:00