Merge branch 'develop' into pr/38560
This commit is contained in:
commit
72614fe9e1
@ -64,6 +64,7 @@
|
||||
"warehouse",
|
||||
"from_warehouse",
|
||||
"quality_inspection",
|
||||
"add_serial_batch_bundle",
|
||||
"serial_and_batch_bundle",
|
||||
"serial_no",
|
||||
"col_br_wh",
|
||||
@ -913,12 +914,18 @@
|
||||
"fieldtype": "Link",
|
||||
"label": "WIP Composite Asset",
|
||||
"options": "Asset"
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:parent.update_stock === 1",
|
||||
"fieldname": "add_serial_batch_bundle",
|
||||
"fieldtype": "Button",
|
||||
"label": "Add Serial / Batch No"
|
||||
}
|
||||
],
|
||||
"idx": 1,
|
||||
"istable": 1,
|
||||
"links": [],
|
||||
"modified": "2023-12-25 22:00:28.043555",
|
||||
"modified": "2024-01-21 19:46:25.537861",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Purchase Invoice Item",
|
||||
|
@ -10,10 +10,8 @@
|
||||
|
||||
<h2 class="text-center" style="margin-top:0">{%= __(report.report_name) %}</h2>
|
||||
<h4 class="text-center">
|
||||
{% if (filters.customer_name) { %}
|
||||
{%= filters.customer_name %}
|
||||
{% } else { %}
|
||||
{%= filters.customer || filters.supplier %}
|
||||
{% if (filters.party) { %}
|
||||
{%= __(filters.party) %}
|
||||
{% } %}
|
||||
</h4>
|
||||
<h6 class="text-center">
|
||||
@ -141,7 +139,7 @@
|
||||
<th style="width: 24%">{%= __("Reference") %}</th>
|
||||
{% } %}
|
||||
{% if(!filters.show_future_payments) { %}
|
||||
<th style="width: 20%">{%= (filters.customer || filters.supplier) ? __("Remarks"): __("Party") %}</th>
|
||||
<th style="width: 20%">{%= (filters.party) ? __("Remarks"): __("Party") %}</th>
|
||||
{% } %}
|
||||
<th style="width: 10%; text-align: right">{%= __("Invoiced Amount") %}</th>
|
||||
{% if(!filters.show_future_payments) { %}
|
||||
@ -158,7 +156,7 @@
|
||||
<th style="width: 10%">{%= __("Remaining Balance") %}</th>
|
||||
{% } %}
|
||||
{% } else { %}
|
||||
<th style="width: 40%">{%= (filters.customer || filters.supplier) ? __("Remarks"): __("Party") %}</th>
|
||||
<th style="width: 40%">{%= (filters.party) ? __("Remarks"): __("Party") %}</th>
|
||||
<th style="width: 15%">{%= __("Total Invoiced Amount") %}</th>
|
||||
<th style="width: 15%">{%= __("Total Paid Amount") %}</th>
|
||||
<th style="width: 15%">{%= report.report_name === "Accounts Receivable Summary" ? __('Credit Note Amount') : __('Debit Note Amount') %}</th>
|
||||
@ -187,7 +185,7 @@
|
||||
|
||||
{% if(!filters.show_future_payments) { %}
|
||||
<td>
|
||||
{% if(!(filters.customer || filters.supplier)) { %}
|
||||
{% if(!(filters.party)) { %}
|
||||
{%= data[i]["party"] %}
|
||||
{% if(data[i]["customer_name"] && data[i]["customer_name"] != data[i]["party"]) { %}
|
||||
<br> {%= data[i]["customer_name"] %}
|
||||
@ -260,7 +258,7 @@
|
||||
{% if(data[i]["party"]|| " ") { %}
|
||||
{% if(!data[i]["is_total_row"]) { %}
|
||||
<td>
|
||||
{% if(!(filters.customer || filters.supplier)) { %}
|
||||
{% if(!(filters.party)) { %}
|
||||
{%= data[i]["party"] %}
|
||||
{% if(data[i]["customer_name"] && data[i]["customer_name"] != data[i]["party"]) { %}
|
||||
<br> {%= data[i]["customer_name"] %}
|
||||
|
@ -998,12 +998,6 @@ class TestWorkOrder(FrappeTestCase):
|
||||
|
||||
make_job_card(wo_order.name, operations)
|
||||
job_card = frappe.db.get_value("Job Card", {"work_order": wo_order.name, "docstatus": 0}, "name")
|
||||
update_job_card(job_card, 10, 2)
|
||||
|
||||
stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
|
||||
for row in stock_entry.items:
|
||||
if row.is_scrap_item:
|
||||
self.assertEqual(row.qty, 2)
|
||||
|
||||
def test_close_work_order(self):
|
||||
items = [
|
||||
|
@ -140,38 +140,48 @@ frappe.ui.form.on("Company", {
|
||||
},
|
||||
|
||||
delete_company_transactions: function(frm) {
|
||||
frappe.verify_password(function() {
|
||||
var d = frappe.prompt({
|
||||
fieldtype:"Data",
|
||||
fieldname: "company_name",
|
||||
label: __("Please enter the company name to confirm"),
|
||||
reqd: 1,
|
||||
description: __("Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.")
|
||||
frappe.call({
|
||||
method: "erpnext.setup.doctype.company.company.is_deletion_job_running",
|
||||
args: {
|
||||
company: frm.doc.name
|
||||
},
|
||||
function(data) {
|
||||
if(data.company_name !== frm.doc.name) {
|
||||
frappe.msgprint(__("Company name not same"));
|
||||
return;
|
||||
freeze: true,
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
frappe.verify_password(function() {
|
||||
var d = frappe.prompt({
|
||||
fieldtype:"Data",
|
||||
fieldname: "company_name",
|
||||
label: __("Please enter the company name to confirm"),
|
||||
reqd: 1,
|
||||
description: __("Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.")
|
||||
},
|
||||
function(data) {
|
||||
if(data.company_name !== frm.doc.name) {
|
||||
frappe.msgprint(__("Company name not same"));
|
||||
return;
|
||||
}
|
||||
frappe.call({
|
||||
method: "erpnext.setup.doctype.company.company.create_transaction_deletion_request",
|
||||
args: {
|
||||
company: data.company_name
|
||||
},
|
||||
freeze: true,
|
||||
callback: function(r, rt) { },
|
||||
onerror: function() {
|
||||
frappe.msgprint(__("Wrong Password"));
|
||||
}
|
||||
});
|
||||
},
|
||||
__("Delete all the Transactions for this Company"), __("Delete")
|
||||
);
|
||||
d.get_primary_btn().addClass("btn-danger");
|
||||
});
|
||||
}
|
||||
frappe.call({
|
||||
method: "erpnext.setup.doctype.company.company.create_transaction_deletion_request",
|
||||
args: {
|
||||
company: data.company_name
|
||||
},
|
||||
freeze: true,
|
||||
callback: function(r, rt) {
|
||||
if(!r.exc)
|
||||
frappe.msgprint(__("Successfully deleted all transactions related to this company!"));
|
||||
},
|
||||
onerror: function() {
|
||||
frappe.msgprint(__("Wrong Password"));
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
__("Delete all the Transactions for this Company"), __("Delete")
|
||||
);
|
||||
d.get_primary_btn().addClass("btn-danger");
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -11,7 +11,8 @@ from frappe.cache_manager import clear_defaults_cache
|
||||
from frappe.contacts.address_and_contact import load_address_and_contact
|
||||
from frappe.custom.doctype.property_setter.property_setter import make_property_setter
|
||||
from frappe.desk.page.setup_wizard.setup_wizard import make_records
|
||||
from frappe.utils import cint, formatdate, get_timestamp, today
|
||||
from frappe.utils import cint, formatdate, get_link_to_form, get_timestamp, today
|
||||
from frappe.utils.background_jobs import get_job, is_job_enqueued
|
||||
from frappe.utils.nestedset import NestedSet, rebuild_tree
|
||||
|
||||
from erpnext.accounts.doctype.account.account import get_account_currency
|
||||
@ -900,8 +901,37 @@ def get_default_company_address(name, sort_key="is_primary_address", existing_ad
|
||||
return None
|
||||
|
||||
|
||||
def generate_id_for_deletion_job(company):
|
||||
return "delete_company_transactions_" + company
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def is_deletion_job_running(company):
|
||||
job_id = generate_id_for_deletion_job(company)
|
||||
job_name = get_job(job_id).get_id() # job name will have site prefix
|
||||
if is_job_enqueued(job_id):
|
||||
frappe.throw(
|
||||
_("A Transaction Deletion Job: {0} is already running for {1}").format(
|
||||
frappe.bold(get_link_to_form("RQ Job", job_name)), frappe.bold(company)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_transaction_deletion_request(company):
|
||||
is_deletion_job_running(company)
|
||||
job_id = generate_id_for_deletion_job(company)
|
||||
|
||||
tdr = frappe.get_doc({"doctype": "Transaction Deletion Record", "company": company})
|
||||
tdr.insert()
|
||||
tdr.submit()
|
||||
|
||||
frappe.enqueue(
|
||||
"frappe.utils.background_jobs.run_doc_method",
|
||||
doctype=tdr.doctype,
|
||||
name=tdr.name,
|
||||
doc_method="submit",
|
||||
job_id=job_id,
|
||||
queue="long",
|
||||
enqueue_after_commit=True,
|
||||
)
|
||||
frappe.msgprint(_("A Transaction Deletion Job is triggered for {0}").format(frappe.bold(company)))
|
||||
|
@ -439,7 +439,7 @@ def get_distinct_item_warehouse(args=None, doc=None, reposting_data=None):
|
||||
reposting_data = get_reposting_data(doc.reposting_data_file)
|
||||
|
||||
if reposting_data and reposting_data.distinct_item_and_warehouse:
|
||||
return reposting_data.distinct_item_and_warehouse
|
||||
return parse_distinct_items_and_warehouses(reposting_data.distinct_item_and_warehouse)
|
||||
|
||||
distinct_item_warehouses = {}
|
||||
|
||||
@ -457,6 +457,16 @@ def get_distinct_item_warehouse(args=None, doc=None, reposting_data=None):
|
||||
return distinct_item_warehouses
|
||||
|
||||
|
||||
def parse_distinct_items_and_warehouses(distinct_items_and_warehouses):
|
||||
new_dict = frappe._dict({})
|
||||
|
||||
# convert string keys to tuple
|
||||
for k, v in distinct_items_and_warehouses.items():
|
||||
new_dict[frappe.safe_eval(k)] = frappe._dict(v)
|
||||
|
||||
return new_dict
|
||||
|
||||
|
||||
def get_affected_transactions(doc, reposting_data=None) -> Set[Tuple[str, str]]:
|
||||
if not reposting_data and doc and doc.reposting_data_file:
|
||||
reposting_data = get_reposting_data(doc.reposting_data_file)
|
||||
|
Loading…
x
Reference in New Issue
Block a user