Jatin3128 c1717d8689 fix: keep source rate on re-fetch when maintain same rate is enabled (#57479)
* fix: keep source rate on re-fetch when maintain same rate is enabled

With "maintain same rate" on, re-fetching item details on a row mapped from a
source document (e.g. a Purchase Order) pulled the latest Item Price, giving a
rate the document can never be saved with. Skip the price list fetch for such
rows and keep the source rate.

Fixes frappe/erpnext#57436

* fix: keep source rate on bulk apply_price_list when maintain same rate is on

The single-row re-fetch guard skipped the bulk apply_price_list path, so
changing the price list, party, or conversion rate on a mapped transaction
re-fetched current Item Prices and overwrote the mapped rates, breaking the
maintain-same-rate check on save.

Guard apply_price_list_on_item with the same source-row lookup, and resolve the
parent doctype via ctx.parenttype since the bulk path carries the child doctype
in ctx.doctype.

* fix: preserve full source pricing on rate-locked rows

Restoring only price_list_rate on a mapped row dropped any manual discount or
margin, so re-running pricing produced a rate that differed from the source and
still failed the maintain-same-rate check on save.

Copy the source row's whole pricing block (rate, discount, margin) and skip
pricing rules for locked rows, in both get_item_details and the bulk
apply_price_list path.

* fix: pass child_docname in server bulk price apply so the rate lock is reachable

The server-side _apply_price_list builds its item ctx from as_dict(), which omits
the child_docname key the desk (JS) callers add, so the maintain-same-rate lock in
apply_price_list could not match rows in that path. Pass child_docname for
consistency with the desk callers.

* test: cover maintain-same-rate preservation on re-fetch of a discounted row

Reproduces the end-to-end symptom: a mapped Purchase Receipt row with a source
discount (rate != price_list_rate) keeps its rate after a re-fetch, so the
document saves under maintain-same-rate. Covers percentage and amount discounts
via process_item_selection, the server recompute the desk mirrors.

* fix: read the locked rate from the persisted source row

get_rate_locked_source_row returned the mutable target row, so an unsaved rate or
discount edit on a mapped row was preserved on re-fetch instead of the source
pricing, and the document still failed maintain-same-rate on save. Read the
pricing straight from the linked source row in the database, and cover the
edit-then-refresh case with a test.

* fix: permission-check the source row before returning its rate

The rate lock reads the linked source row with a direct db.get_value, which
bypasses permissions on a whitelisted endpoint. Only return the source pricing
when the caller can read the source document, so a crafted request cannot
disclose another document's rate. Covered by a test.

* fix: import make_purchase_receipt from its current mapper module

make_purchase_receipt moved from purchase_order.py to
purchase_order/mapper.py in a develop refactor pulled in by this
branch's merge commit. Two tests added afterwards still imported it
from the old path, failing CI with an ImportError.

* fix: Simplify source retrieval logic in get_item_details

Removed permission check for source parent in get_item_details.py.

* Revert "fix: Simplify source retrieval logic in get_item_details"

This reverts commit 58863805bd.
2026-08-04 13:28:57 +05:30
2024-08-28 21:00:09 +02:00
2024-03-10 19:45:18 +05:30
2022-03-30 12:36:09 +05:30
2026-05-09 23:14:58 +05:30
2022-04-18 16:45:01 +05:30
2018-07-19 17:47:04 +05:30
2017-07-01 21:35:10 +05:30
2024-03-10 19:45:40 +05:30
2026-05-09 23:14:58 +05:30
2026-03-03 10:36:54 +05:30
2021-03-17 20:06:35 +05:30

ERPNext Logo

ERPNext

Powerful, Intuitive and Open-Source ERP

Learn on Frappe School

CI docker pulls

ERPNext Hero Image

ERPNext

100% Open-Source ERP System to help you run your business.

Motivation

Running a business is a complex task - handling invoices, tracking stock, managing personnel, and other daily operations. In a market where software is sold separately to manage each of these tasks, ERPNext does all of the above and more, for free.

Key Features

  • Accounting: All the tools you need to manage cash flow in one place, right from recording transactions to summarizing and analyzing financial reports.
  • Order Management: Track inventory levels, replenish stock, and manage sales orders, customers, suppliers, shipments, deliverables, and order fulfillment.
  • Manufacturing: Simplifies the production cycle, helps track material consumption, exhibits capacity planning, handles subcontracting, and more!
  • Asset Management: From purchase to disposal, IT infrastructure to equipment. Covers every branch of your organization, all in one centralized system.
  • Projects: Deliver both internal and external projects on time, budget and profitability. Track tasks, timesheets, and issues by project.
More

Under the Hood

  • Frappe Framework: A full-stack web application framework written in Python and JavaScript. The framework provides a robust foundation for building web applications, including a database abstraction layer, user authentication, and a REST API.

  • Frappe UI: A Vue-based UI library, to provide a modern user interface. The Frappe UI library provides a variety of components that can be used to build single-page applications on top of the Frappe Framework.

Production Setup

Managed Hosting

You can try Frappe Cloud, a simple, user-friendly, and sophisticated open-source platform to host Frappe applications reliably and securely.

It handles installation, setup, upgrades, monitoring, maintenance, and support of your Frappe deployments. It is a fully featured developer platform with an ability to manage and control multiple Frappe deployments.

Self-Hosted

Docker

See Frappe Docker Documentation for full documentation & FAQ on Docker setup

Prerequisites

For Docker basics and best practices refer to Docker's documentation

Try on your environment

⚠️ Disposable demo only

This setup is intended for quick evaluation. Expect to throw the environment away. You will not be able to install custom apps to this setup. For production deployments, custom configurations, and detailed explanations, see the full documentation.

First clone the repo:

git clone https://github.com/frappe/frappe_docker
cd frappe_docker

Then run:

docker compose -f pwd.yml up -d

Wait for a couple of minutes for ERPNext site to be created or check the create-site container logs before opening browser on port 8080. (username: Administrator, password: admin)

See Frappe Docker for ARM based docker setup

Development Setup

Manual Install

The Easy Way: our install script for bench will install all dependencies (e.g. MariaDB). See https://github.com/frappe/bench for more details.

New passwords will be created for the ERPNext "Administrator" user, the MariaDB root user, and the Frappe user (the script displays the passwords and saves them to ~/frappe_passwords.txt).

Local

To setup the repository locally follow the steps mentioned below:

  1. Setup bench by following the Installation Steps and start the server

    bench start
    
  2. In a separate terminal window, run the following commands:

    # Create a new site
    bench new-site erpnext.localhost
    
  3. Get the ERPNext app and install it

    # Get the ERPNext app
    bench get-app https://github.com/frappe/erpnext
    
    # Install the app
    bench --site erpnext.localhost install-app erpnext
    
  4. Open the URL http://erpnext.localhost:8000/app in your browser, you should see the app running

Learning and Community

  1. Frappe School - Learn Frappe Framework and ERPNext from the various courses by the maintainers or from the community.
  2. Official documentation - Extensive documentation for ERPNext.
  3. Discussion Forum - Engage with the community of ERPNext users and service providers.
  4. Telegram Group - Get instant help from huge community of users.

Contributing

  1. Issue Guidelines
  2. Report Security Vulnerabilities
  3. Pull Request Requirements
  4. Translations

Logo and Trademark Policy

Please read our Logo and Trademark Policy.



Languages
Python 78.7%
JavaScript 14.2%
TypeScript 4.8%
HTML 1.8%
SCSS 0.3%
Other 0.2%