fix: merge conflict
This commit is contained in:
commit
11475487fb
@ -5,7 +5,7 @@ import frappe
|
||||
from erpnext.hooks import regional_overrides
|
||||
from frappe.utils import getdate
|
||||
|
||||
__version__ = '13.6.0'
|
||||
__version__ = '13.7.0'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
|
@ -16,7 +16,6 @@ class ChartofAccountsImporter(Document):
|
||||
def validate(self):
|
||||
validate_accounts(self.import_file)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def validate_company(company):
|
||||
parent_company, allow_account_creation_against_child_company = frappe.db.get_value('Company',
|
||||
@ -304,9 +303,8 @@ def validate_accounts(file_name):
|
||||
accounts_dict[account["parent_account"]]["is_group"] = 1
|
||||
|
||||
validate_root(accounts_dict)
|
||||
|
||||
|
||||
validate_account_types(accounts_dict)
|
||||
|
||||
|
||||
return [True, len(accounts)]
|
||||
|
||||
|
@ -139,8 +139,8 @@ def create_dunning_type_with_zero_interest_rate():
|
||||
dunning_type.append(
|
||||
"dunning_letter_text", {
|
||||
'language': 'en',
|
||||
'body_text': 'We have still not received payment for our invoice ',
|
||||
'body_text': 'We have still not received payment for our invoice ',
|
||||
'closing_text': 'We kindly request that you pay the outstanding amount immediately, and late fees.'
|
||||
}
|
||||
)
|
||||
dunning_type.save()
|
||||
dunning_type.save()
|
||||
|
@ -1,24 +1,6 @@
|
||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
cur_frm.add_fetch("customer", "customer_group", "customer_group" );
|
||||
cur_frm.add_fetch("supplier", "supplier_group_name", "supplier_group" );
|
||||
|
||||
frappe.ui.form.on("Tax Rule", "tax_type", function(frm) {
|
||||
frm.toggle_reqd("sales_tax_template", frm.doc.tax_type=="Sales");
|
||||
frm.toggle_reqd("purchase_tax_template", frm.doc.tax_type=="Purchase");
|
||||
})
|
||||
|
||||
frappe.ui.form.on("Tax Rule", "onload", function(frm) {
|
||||
if(frm.doc.__islocal) {
|
||||
frm.set_value("use_for_shopping_cart", 1);
|
||||
}
|
||||
})
|
||||
|
||||
frappe.ui.form.on("Tax Rule", "refresh", function(frm) {
|
||||
frappe.ui.form.trigger("Tax Rule", "tax_type");
|
||||
})
|
||||
|
||||
frappe.ui.form.on("Tax Rule", "customer", function(frm) {
|
||||
if(frm.doc.customer) {
|
||||
frappe.call({
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -50,7 +50,7 @@ class TestTaxRule(unittest.TestCase):
|
||||
tax_rule1 = make_tax_rule(customer_group= "All Customer Groups",
|
||||
sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1, from_date = "2015-01-01")
|
||||
tax_rule1.save()
|
||||
self.assertEqual(get_tax_template("2015-01-01", {"customer_group" : "Commercial", "use_for_shopping_cart":0}),
|
||||
self.assertEqual(get_tax_template("2015-01-01", {"customer_group" : "Commercial", "use_for_shopping_cart":1}),
|
||||
"_Test Sales Taxes and Charges Template - _TC")
|
||||
|
||||
def test_conflict_with_overlapping_dates(self):
|
||||
|
69
erpnext/change_log/v13/v13_7_0.md
Normal file
69
erpnext/change_log/v13/v13_7_0.md
Normal file
@ -0,0 +1,69 @@
|
||||
# Version 13.7.0 Release Notes
|
||||
|
||||
### Features & Enhancements
|
||||
- Optionally allow rejected quality inspection on submission ([#26133](https://github.com/frappe/erpnext/pull/26133))
|
||||
- Bootstrapped GST Setup for India ([#25415](https://github.com/frappe/erpnext/pull/25415))
|
||||
- Fetching details from supplier/customer groups ([#26454](https://github.com/frappe/erpnext/pull/26454))
|
||||
- Provision to make subcontracted purchase order from the production plan ([#26240](https://github.com/frappe/erpnext/pull/26240))
|
||||
- Optimized code for reposting item valuation ([#26432](https://github.com/frappe/erpnext/pull/26432))
|
||||
|
||||
### Fixes
|
||||
- Auto process deferred accounting for multi-company setup ([#26277](https://github.com/frappe/erpnext/pull/26277))
|
||||
- Error while fetching item taxes ([#26218](https://github.com/frappe/erpnext/pull/26218))
|
||||
- Validation check for batch for stock reconciliation type in stock entry(bp #26370 ) ([#26488](https://github.com/frappe/erpnext/pull/26488))
|
||||
- Error popup for COA errors ([#26358](https://github.com/frappe/erpnext/pull/26358))
|
||||
- Precision for expected values in payment entry test ([#26394](https://github.com/frappe/erpnext/pull/26394))
|
||||
- Bank statement import ([#26287](https://github.com/frappe/erpnext/pull/26287))
|
||||
- LMS progress issue ([#26253](https://github.com/frappe/erpnext/pull/26253))
|
||||
- Paging buttons not working on item group portal page ([#26497](https://github.com/frappe/erpnext/pull/26497))
|
||||
- Omit item discount amount for e-invoicing ([#26353](https://github.com/frappe/erpnext/pull/26353))
|
||||
- Validate LCV for Invoices without Update Stock ([#26333](https://github.com/frappe/erpnext/pull/26333))
|
||||
- Remove cancelled entries in consolidated financial statements ([#26331](https://github.com/frappe/erpnext/pull/26331))
|
||||
- Fetching employee in payroll entry ([#26271](https://github.com/frappe/erpnext/pull/26271))
|
||||
- To fetch the correct field in Tax Rule ([#25927](https://github.com/frappe/erpnext/pull/25927))
|
||||
- Order and time of operations in multilevel BOM work order ([#25886](https://github.com/frappe/erpnext/pull/25886))
|
||||
- Fixed Budget Variance Graph color from all black to default ([#26368](https://github.com/frappe/erpnext/pull/26368))
|
||||
- TDS computation summary shows cancelled invoices (#26456) ([#26486](https://github.com/frappe/erpnext/pull/26486))
|
||||
- Do not consider cancelled entries in party dashboard ([#26231](https://github.com/frappe/erpnext/pull/26231))
|
||||
- Add validation for 'for_qty' else throws errors ([#25829](https://github.com/frappe/erpnext/pull/25829))
|
||||
- Move the rename abbreviation job to long queue (#26434) ([#26462](https://github.com/frappe/erpnext/pull/26462))
|
||||
- Query for Training Event ([#26388](https://github.com/frappe/erpnext/pull/26388))
|
||||
- Item group portal issues (backport) ([#26493](https://github.com/frappe/erpnext/pull/26493))
|
||||
- When lead is created with mobile_no, mobile_no value gets lost ([#26298](https://github.com/frappe/erpnext/pull/26298))
|
||||
- WIP needs to be set before submit on skip_transfer (bp #26499) ([#26507](https://github.com/frappe/erpnext/pull/26507))
|
||||
- Incorrect valuation rate in stock reconciliation ([#26259](https://github.com/frappe/erpnext/pull/26259))
|
||||
- Precision rate for packed items in internal transfers ([#26046](https://github.com/frappe/erpnext/pull/26046))
|
||||
- Changed profitability analysis report width ([#26165](https://github.com/frappe/erpnext/pull/26165))
|
||||
- Unable to download GSTR-1 json ([#26468](https://github.com/frappe/erpnext/pull/26468))
|
||||
- Unallocated amount in Payment Entry after taxes ([#26472](https://github.com/frappe/erpnext/pull/26472))
|
||||
- Include Stock Reco logic in `update_qty_in_future_sle` ([#26158](https://github.com/frappe/erpnext/pull/26158))
|
||||
- Update cost not working in the draft BOM ([#26279](https://github.com/frappe/erpnext/pull/26279))
|
||||
- Cancellation of Loan Security Pledges ([#26252](https://github.com/frappe/erpnext/pull/26252))
|
||||
- fix(e-invoicing): allow export invoice even if no taxes applied (#26363) ([#26405](https://github.com/frappe/erpnext/pull/26405))
|
||||
- Delete accounts (an empty file) ([#25323](https://github.com/frappe/erpnext/pull/25323))
|
||||
- Errors on parallel requests creation of company for India ([#26470](https://github.com/frappe/erpnext/pull/26470))
|
||||
- Incorrect bom no added for non-variant items on variant boms ([#26320](https://github.com/frappe/erpnext/pull/26320))
|
||||
- Incorrect discount amount on amended document ([#26466](https://github.com/frappe/erpnext/pull/26466))
|
||||
- Added a message to enable appointment booking if disabled ([#26334](https://github.com/frappe/erpnext/pull/26334))
|
||||
- fix(pos): taxes amount in pos item cart ([#26411](https://github.com/frappe/erpnext/pull/26411))
|
||||
- Track changes on batch ([#26382](https://github.com/frappe/erpnext/pull/26382))
|
||||
- Stock entry with putaway rule not working ([#26350](https://github.com/frappe/erpnext/pull/26350))
|
||||
- Only "Tax" type accounts should be shown for selection in GST Settings ([#26300](https://github.com/frappe/erpnext/pull/26300))
|
||||
- Added permission for employee to book appointment ([#26255](https://github.com/frappe/erpnext/pull/26255))
|
||||
- Allow to make job card without employee ([#26312](https://github.com/frappe/erpnext/pull/26312))
|
||||
- Project Portal Enhancements ([#26290](https://github.com/frappe/erpnext/pull/26290))
|
||||
- BOM stock report not working ([#26332](https://github.com/frappe/erpnext/pull/26332))
|
||||
- Order Items by weightage in the web items query ([#26284](https://github.com/frappe/erpnext/pull/26284))
|
||||
- Removed values out of sync validation from stock transactions ([#26226](https://github.com/frappe/erpnext/pull/26226))
|
||||
- Payroll-entry minor fix ([#26349](https://github.com/frappe/erpnext/pull/26349))
|
||||
- Allow user to change the To Date in the blanket order even after submit of order ([#26241](https://github.com/frappe/erpnext/pull/26241))
|
||||
- Value fetching for custom field in POS ([#26367](https://github.com/frappe/erpnext/pull/26367))
|
||||
- Iteration through accounts only when accounts exist ([#26391](https://github.com/frappe/erpnext/pull/26391))
|
||||
- Employee Inactive status implications ([#26244](https://github.com/frappe/erpnext/pull/26244))
|
||||
- Multi-currency issue ([#26458](https://github.com/frappe/erpnext/pull/26458))
|
||||
- FG item not fetched in manufacture entry ([#26509](https://github.com/frappe/erpnext/pull/26509))
|
||||
- Set query for training events ([#26303](https://github.com/frappe/erpnext/pull/26303))
|
||||
- Fetch batch items in stock reconciliation ([#26213](https://github.com/frappe/erpnext/pull/26213))
|
||||
- Employee selection not working in payroll entry ([#26278](https://github.com/frappe/erpnext/pull/26278))
|
||||
- POS item cart dom updates (#26459) ([#26461](https://github.com/frappe/erpnext/pull/26461))
|
||||
- dunning calculation of grand total when rate of interest is 0% ([#26285](https://github.com/frappe/erpnext/pull/26285))
|
@ -102,7 +102,7 @@
|
||||
}
|
||||
],
|
||||
"links": [],
|
||||
"modified": "2021-06-30 12:09:14.228756",
|
||||
"modified": "2021-06-30 13:09:14.228756",
|
||||
"modified_by": "Administrator",
|
||||
"module": "CRM",
|
||||
"name": "Appointment",
|
||||
|
@ -35,7 +35,9 @@
|
||||
"no_copy": 1,
|
||||
"options": "Loan Security Pledge",
|
||||
"print_hide": 1,
|
||||
"read_only": 1
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fetch_from": "loan_application.applicant",
|
||||
@ -45,47 +47,63 @@
|
||||
"in_standard_filter": 1,
|
||||
"label": "Applicant",
|
||||
"options": "applicant_type",
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "loan_security_details_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Loan Security Details"
|
||||
"label": "Loan Security Details",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break"
|
||||
"fieldtype": "Column Break",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "loan",
|
||||
"fieldtype": "Link",
|
||||
"label": "Loan",
|
||||
"options": "Loan"
|
||||
"options": "Loan",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "loan_application",
|
||||
"fieldtype": "Link",
|
||||
"label": "Loan Application",
|
||||
"options": "Loan Application"
|
||||
"options": "Loan Application",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "total_security_value",
|
||||
"fieldtype": "Currency",
|
||||
"label": "Total Security Value",
|
||||
"options": "Company:company:default_currency",
|
||||
"read_only": 1
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "maximum_loan_value",
|
||||
"fieldtype": "Currency",
|
||||
"label": "Maximum Loan Value",
|
||||
"options": "Company:company:default_currency",
|
||||
"read_only": 1
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "loan_details_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Loan Details"
|
||||
"label": "Loan Details",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"default": "Requested",
|
||||
@ -94,37 +112,49 @@
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Status",
|
||||
"options": "Requested\nUnpledged\nPledged\nPartially Pledged",
|
||||
"read_only": 1
|
||||
"options": "Requested\nUnpledged\nPledged\nPartially Pledged\nCancelled",
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "pledge_time",
|
||||
"fieldtype": "Datetime",
|
||||
"label": "Pledge Time",
|
||||
"read_only": 1
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "securities",
|
||||
"fieldtype": "Table",
|
||||
"label": "Securities",
|
||||
"options": "Pledge",
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_11",
|
||||
"fieldtype": "Column Break"
|
||||
"fieldtype": "Column Break",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_10",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Totals"
|
||||
"label": "Totals",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "company",
|
||||
"fieldtype": "Link",
|
||||
"label": "Company",
|
||||
"options": "Company",
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fetch_from": "loan.applicant_type",
|
||||
@ -132,35 +162,45 @@
|
||||
"fieldtype": "Select",
|
||||
"label": "Applicant Type",
|
||||
"options": "Employee\nMember\nCustomer",
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"collapsible": 1,
|
||||
"fieldname": "more_information_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "More Information"
|
||||
"label": "More Information",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 1,
|
||||
"fieldname": "reference_no",
|
||||
"fieldtype": "Data",
|
||||
"label": "Reference No"
|
||||
"label": "Reference No",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_18",
|
||||
"fieldtype": "Column Break"
|
||||
"fieldtype": "Column Break",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 1,
|
||||
"fieldname": "description",
|
||||
"fieldtype": "Text",
|
||||
"label": "Description"
|
||||
"label": "Description",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"is_submittable": 1,
|
||||
"links": [],
|
||||
"modified": "2021-04-19 18:23:16.953305",
|
||||
"modified": "2021-06-29 17:15:16.082256",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Loan Management",
|
||||
"name": "Loan Security Pledge",
|
||||
|
@ -23,6 +23,12 @@ class LoanSecurityPledge(Document):
|
||||
update_shortfall_status(self.loan, self.total_security_value)
|
||||
update_loan(self.loan, self.maximum_loan_value)
|
||||
|
||||
def on_cancel(self):
|
||||
if self.loan:
|
||||
self.db_set("status", "Cancelled")
|
||||
self.db_set("pledge_time", None)
|
||||
update_loan(self.loan, self.maximum_loan_value, cancel=1)
|
||||
|
||||
def validate_duplicate_securities(self):
|
||||
security_list = []
|
||||
for security in self.securities:
|
||||
@ -36,7 +42,7 @@ class LoanSecurityPledge(Document):
|
||||
existing_pledge = ''
|
||||
|
||||
if self.loan:
|
||||
existing_pledge = frappe.db.get_value('Loan Security Pledge', {'loan': self.loan}, ['name'])
|
||||
existing_pledge = frappe.db.get_value('Loan Security Pledge', {'loan': self.loan, 'docstatus': 1}, ['name'])
|
||||
|
||||
if existing_pledge:
|
||||
loan_security_type = frappe.db.get_value('Pledge', {'parent': existing_pledge}, ['loan_security_type'])
|
||||
@ -77,8 +83,12 @@ class LoanSecurityPledge(Document):
|
||||
self.total_security_value = total_security_value
|
||||
self.maximum_loan_value = maximum_loan_value
|
||||
|
||||
def update_loan(loan, maximum_value_against_pledge):
|
||||
def update_loan(loan, maximum_value_against_pledge, cancel=0):
|
||||
maximum_loan_value = frappe.db.get_value('Loan', {'name': loan}, ['maximum_loan_amount'])
|
||||
|
||||
frappe.db.sql(""" UPDATE `tabLoan` SET maximum_loan_amount=%s, is_secured_loan=1
|
||||
WHERE name=%s""", (maximum_loan_value + maximum_value_against_pledge, loan))
|
||||
if cancel:
|
||||
frappe.db.sql(""" UPDATE `tabLoan` SET maximum_loan_amount=%s
|
||||
WHERE name=%s""", (maximum_loan_value - maximum_value_against_pledge, loan))
|
||||
else:
|
||||
frappe.db.sql(""" UPDATE `tabLoan` SET maximum_loan_amount=%s, is_secured_loan=1
|
||||
WHERE name=%s""", (maximum_loan_value + maximum_value_against_pledge, loan))
|
||||
|
@ -13,7 +13,7 @@ frappe.ui.form.on('Blanket Order', {
|
||||
|
||||
refresh: function(frm) {
|
||||
erpnext.hide_company();
|
||||
if (frm.doc.customer && frm.doc.docstatus === 1) {
|
||||
if (frm.doc.customer && frm.doc.docstatus === 1 && frm.doc.to_date > frappe.datetime.get_today()) {
|
||||
frm.add_custom_button(__("Sales Order"), function() {
|
||||
frappe.model.open_mapped_doc({
|
||||
method: "erpnext.manufacturing.doctype.blanket_order.blanket_order.make_order",
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "naming_series:",
|
||||
"creation": "2018-05-24 07:18:08.256060",
|
||||
"doctype": "DocType",
|
||||
@ -79,6 +80,7 @@
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 1,
|
||||
"fieldname": "to_date",
|
||||
"fieldtype": "Date",
|
||||
"label": "To Date",
|
||||
@ -129,8 +131,10 @@
|
||||
"label": "Terms and Conditions Details"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"is_submittable": 1,
|
||||
"modified": "2019-11-18 19:37:37.151686",
|
||||
"links": [],
|
||||
"modified": "2021-06-29 00:30:30.621636",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Manufacturing",
|
||||
"name": "Blanket Order",
|
||||
|
@ -713,7 +713,8 @@ def get_bom_item_rate(args, bom_doc):
|
||||
"conversion_rate": 1, # Passed conversion rate as 1 purposefully, as conversion rate is applied at the end of the function
|
||||
"conversion_factor": args.get("conversion_factor") or 1,
|
||||
"plc_conversion_rate": 1,
|
||||
"ignore_party": True
|
||||
"ignore_party": True,
|
||||
"ignore_conversion_rate": True
|
||||
})
|
||||
item_doc = frappe.get_cached_doc("Item", args.get("item_code"))
|
||||
out = frappe._dict()
|
||||
|
@ -192,15 +192,20 @@ class JobCard(Document):
|
||||
"completed_qty": args.get("completed_qty") or 0.0
|
||||
})
|
||||
elif args.get("start_time"):
|
||||
for name in employees:
|
||||
self.append("time_logs", {
|
||||
"from_time": get_datetime(args.get("start_time")),
|
||||
"employee": name.get('employee'),
|
||||
"operation": args.get("sub_operation"),
|
||||
"completed_qty": 0.0
|
||||
})
|
||||
new_args = {
|
||||
"from_time": get_datetime(args.get("start_time")),
|
||||
"operation": args.get("sub_operation"),
|
||||
"completed_qty": 0.0
|
||||
}
|
||||
|
||||
if not self.employee:
|
||||
if employees:
|
||||
for name in employees:
|
||||
new_args.employee = name.get('employee')
|
||||
self.add_start_time_log(new_args)
|
||||
else:
|
||||
self.add_start_time_log(new_args)
|
||||
|
||||
if not self.employee and employees:
|
||||
self.set_employees(employees)
|
||||
|
||||
if self.status == "On Hold":
|
||||
@ -208,6 +213,9 @@ class JobCard(Document):
|
||||
|
||||
self.save()
|
||||
|
||||
def add_start_time_log(self, args):
|
||||
self.append("time_logs", args)
|
||||
|
||||
def set_employees(self, employees):
|
||||
for name in employees:
|
||||
self.append('employee', {
|
||||
|
@ -70,12 +70,12 @@ def get_bom_stock(filters):
|
||||
ON bom_item.item_code = ledger.item_code
|
||||
{conditions}
|
||||
WHERE
|
||||
bom_item.parent = '{bom}' and bom_item.parenttype='BOM'
|
||||
bom_item.parent = {bom} and bom_item.parenttype='BOM'
|
||||
|
||||
GROUP BY bom_item.item_code""".format(
|
||||
qty_field=qty_field,
|
||||
table=table,
|
||||
conditions=conditions,
|
||||
bom=bom,
|
||||
bom=frappe.db.escape(bom),
|
||||
qty_to_produce=qty_to_produce or 1)
|
||||
)
|
||||
|
@ -12,7 +12,10 @@ from erpnext.accounts.utils import get_fiscal_year, FiscalYearError
|
||||
from frappe.utils import today
|
||||
|
||||
def setup(company=None, patch=True):
|
||||
setup_company_independent_fixtures(patch=patch)
|
||||
# Company independent fixtures should be called only once at the first company setup
|
||||
if frappe.db.count('Company', {'country': 'India'}) <=1:
|
||||
setup_company_independent_fixtures(patch=patch)
|
||||
|
||||
if not patch:
|
||||
make_fixtures(company)
|
||||
|
||||
@ -122,10 +125,12 @@ def add_print_formats():
|
||||
def make_property_setters(patch=False):
|
||||
# GST rules do not allow for an invoice no. bigger than 16 characters
|
||||
journal_entry_types = frappe.get_meta("Journal Entry").get_options("voucher_type").split("\n") + ['Reversal Of ITC']
|
||||
sales_invoice_series = ['SINV-.YY.-', 'SRET-.YY.-', ''] + frappe.get_meta("Sales Invoice").get_options("naming_series").split("\n")
|
||||
purchase_invoice_series = ['PINV-.YY.-', 'PRET-.YY.-', ''] + frappe.get_meta("Purchase Invoice").get_options("naming_series").split("\n")
|
||||
|
||||
if not patch:
|
||||
make_property_setter('Sales Invoice', 'naming_series', 'options', 'SINV-.YY.-\nSRET-.YY.-', '')
|
||||
make_property_setter('Purchase Invoice', 'naming_series', 'options', 'PINV-.YY.-\nPRET-.YY.-', '')
|
||||
make_property_setter('Sales Invoice', 'naming_series', 'options', '\n'.join(sales_invoice_series), '')
|
||||
make_property_setter('Purchase Invoice', 'naming_series', 'options', '\n'.join(purchase_invoice_series), '')
|
||||
make_property_setter('Journal Entry', 'voucher_type', 'options', '\n'.join(journal_entry_types), '')
|
||||
|
||||
def make_custom_fields(update=True):
|
||||
@ -786,7 +791,7 @@ def set_tax_withholding_category(company):
|
||||
doc.flags.ignore_mandatory = True
|
||||
doc.insert()
|
||||
else:
|
||||
doc = frappe.get_doc("Tax Withholding Category", d.get("name"))
|
||||
doc = frappe.get_doc("Tax Withholding Category", d.get("name"), for_update=True)
|
||||
|
||||
if accounts:
|
||||
doc.append("accounts", accounts[0])
|
||||
|
@ -291,7 +291,7 @@ class Company(NestedSet):
|
||||
cash = frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name')
|
||||
if cash and self.default_cash_account \
|
||||
and not frappe.db.get_value('Mode of Payment Account', {'company': self.name, 'parent': cash}):
|
||||
mode_of_payment = frappe.get_doc('Mode of Payment', cash)
|
||||
mode_of_payment = frappe.get_doc('Mode of Payment', cash, for_update=True)
|
||||
mode_of_payment.append('accounts', {
|
||||
'company': self.name,
|
||||
'default_account': self.default_cash_account
|
||||
|
@ -26,7 +26,7 @@ def setup_taxes_and_charges(company_name: str, country: str):
|
||||
if 'chart_of_accounts' not in country_wise_tax:
|
||||
country_wise_tax = simple_to_detailed(country_wise_tax)
|
||||
|
||||
from_detailed_data(company_name, country_wise_tax.get('chart_of_accounts'))
|
||||
from_detailed_data(company_name, country_wise_tax)
|
||||
update_regional_tax_settings(country, company_name)
|
||||
|
||||
|
||||
@ -78,11 +78,12 @@ def simple_to_detailed(templates):
|
||||
def from_detailed_data(company_name, data):
|
||||
"""Create Taxes and Charges Templates from detailed data."""
|
||||
coa_name = frappe.db.get_value('Company', company_name, 'chart_of_accounts')
|
||||
tax_templates = data.get(coa_name) or data.get('*')
|
||||
sales_tax_templates = tax_templates.get('sales_tax_templates') or tax_templates.get('*')
|
||||
purchase_tax_templates = tax_templates.get('purchase_tax_templates') or tax_templates.get('*')
|
||||
item_tax_templates = tax_templates.get('item_tax_templates') or tax_templates.get('*')
|
||||
tax_categories = tax_templates.get('tax_categories')
|
||||
coa_data = data.get('chart_of_accounts', {})
|
||||
tax_templates = coa_data.get(coa_name) or coa_data.get('*', {})
|
||||
tax_categories = data.get('tax_categories')
|
||||
sales_tax_templates = tax_templates.get('sales_tax_templates') or tax_templates.get('*', {})
|
||||
purchase_tax_templates = tax_templates.get('purchase_tax_templates') or tax_templates.get('*', {})
|
||||
item_tax_templates = tax_templates.get('item_tax_templates') or tax_templates.get('*', {})
|
||||
|
||||
if tax_categories:
|
||||
for tax_category in tax_categories:
|
||||
|
@ -193,7 +193,7 @@
|
||||
"image_field": "image",
|
||||
"links": [],
|
||||
"max_attachments": 5,
|
||||
"modified": "2021-01-07 11:10:09.149170",
|
||||
"modified": "2021-07-08 16:22:01.343105",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Stock",
|
||||
"name": "Batch",
|
||||
@ -217,5 +217,6 @@
|
||||
"quick_entry": 1,
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"title_field": "batch_id"
|
||||
"title_field": "batch_id",
|
||||
"track_changes": 1
|
||||
}
|
@ -405,17 +405,18 @@ class StockReconciliation(StockController):
|
||||
|
||||
key = (d.item_code, d.warehouse)
|
||||
if key not in merge_similar_entries:
|
||||
d.total_amount = (d.actual_qty * d.valuation_rate)
|
||||
merge_similar_entries[key] = d
|
||||
elif d.serial_no:
|
||||
data = merge_similar_entries[key]
|
||||
data.actual_qty += d.actual_qty
|
||||
data.qty_after_transaction += d.qty_after_transaction
|
||||
|
||||
data.valuation_rate = (data.valuation_rate + d.valuation_rate) / data.actual_qty
|
||||
data.total_amount += (d.actual_qty * d.valuation_rate)
|
||||
data.valuation_rate = (data.total_amount) / data.actual_qty
|
||||
data.serial_no += '\n' + d.serial_no
|
||||
|
||||
if data.incoming_rate:
|
||||
data.incoming_rate = (data.incoming_rate + d.incoming_rate) / data.actual_qty
|
||||
data.incoming_rate = (data.total_amount) / data.actual_qty
|
||||
|
||||
for key, value in merge_similar_entries.items():
|
||||
new_sl_entries.append(value)
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe, unittest
|
||||
from frappe.utils import flt, nowdate, nowtime, add_days
|
||||
from frappe.utils import flt, nowdate, nowtime, random_string, add_days
|
||||
from erpnext.accounts.utils import get_stock_and_account_balance
|
||||
from erpnext.stock.stock_ledger import get_previous_sle, update_entries_after
|
||||
from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import EmptyStockReconciliationItemsError, get_items
|
||||
@ -152,6 +152,42 @@ class TestStockReconciliation(unittest.TestCase):
|
||||
stock_doc = frappe.get_doc("Stock Reconciliation", d)
|
||||
stock_doc.cancel()
|
||||
|
||||
|
||||
def test_stock_reco_for_merge_serialized_item(self):
|
||||
to_delete_records = []
|
||||
|
||||
# Add new serial nos
|
||||
serial_item_code = "Stock-Reco-Serial-Item-2"
|
||||
serial_warehouse = "_Test Warehouse for Stock Reco1 - _TC"
|
||||
|
||||
sr = create_stock_reconciliation(item_code=serial_item_code, serial_no=random_string(6),
|
||||
warehouse = serial_warehouse, qty=1, rate=100, do_not_submit=True, purpose='Opening Stock')
|
||||
|
||||
for i in range(3):
|
||||
sr.append('items', {
|
||||
'item_code': serial_item_code,
|
||||
'warehouse': serial_warehouse,
|
||||
'qty': 1,
|
||||
'valuation_rate': 100,
|
||||
'serial_no': random_string(6)
|
||||
})
|
||||
|
||||
sr.save()
|
||||
sr.submit()
|
||||
|
||||
sle_entries = frappe.get_all('Stock Ledger Entry', filters= {'voucher_no': sr.name},
|
||||
fields = ['name', 'incoming_rate'])
|
||||
|
||||
self.assertEqual(len(sle_entries), 1)
|
||||
self.assertEqual(sle_entries[0].incoming_rate, 100)
|
||||
|
||||
to_delete_records.append(sr.name)
|
||||
to_delete_records.reverse()
|
||||
|
||||
for d in to_delete_records:
|
||||
stock_doc = frappe.get_doc("Stock Reconciliation", d)
|
||||
stock_doc.cancel()
|
||||
|
||||
def test_stock_reco_for_batch_item(self):
|
||||
to_delete_records = []
|
||||
to_delete_serial_nos = []
|
||||
@ -364,6 +400,12 @@ def create_batch_or_serial_no_items():
|
||||
serial_item_doc.serial_no_series = "SRSI.####"
|
||||
serial_item_doc.save(ignore_permissions=True)
|
||||
|
||||
serial_item_doc = create_item("Stock-Reco-Serial-Item-2", is_stock_item=1)
|
||||
if not serial_item_doc.has_serial_no:
|
||||
serial_item_doc.has_serial_no = 1
|
||||
serial_item_doc.serial_no_series = "SRSII.####"
|
||||
serial_item_doc.save(ignore_permissions=True)
|
||||
|
||||
batch_item_doc = create_item("Stock-Reco-batch-Item-1", is_stock_item=1)
|
||||
if not batch_item_doc.has_batch_no:
|
||||
batch_item_doc.has_batch_no = 1
|
||||
|
@ -441,7 +441,7 @@ def get_item_tax_info(company, tax_category, item_codes, item_rates=None, item_t
|
||||
|
||||
if item_tax_templates is None:
|
||||
item_tax_templates = {}
|
||||
|
||||
|
||||
if item_rates is None:
|
||||
item_rates = {}
|
||||
|
||||
@ -807,10 +807,14 @@ def check_packing_list(price_list_rate_name, desired_qty, item_code):
|
||||
def validate_conversion_rate(args, meta):
|
||||
from erpnext.controllers.accounts_controller import validate_conversion_rate
|
||||
|
||||
if (not args.conversion_rate
|
||||
and args.currency==frappe.get_cached_value('Company', args.company, "default_currency")):
|
||||
company_currency = frappe.get_cached_value('Company', args.company, "default_currency")
|
||||
if (not args.conversion_rate and args.currency==company_currency):
|
||||
args.conversion_rate = 1.0
|
||||
|
||||
if (not args.ignore_conversion_rate and args.conversion_rate == 1 and args.currency!=company_currency):
|
||||
args.conversion_rate = get_exchange_rate(args.currency,
|
||||
company_currency, args.transaction_date, "for_buying") or 1.0
|
||||
|
||||
# validate currency conversion rate
|
||||
validate_conversion_rate(args.currency, args.conversion_rate,
|
||||
meta.get_label("conversion_rate"), args.company)
|
||||
|
@ -12,7 +12,7 @@
|
||||
.get_value("User", timesheet.modified_by, [
|
||||
"full_name", "user_image"
|
||||
], as_dict = True)
|
||||
%}
|
||||
%}
|
||||
{% if user_details.user_image %}
|
||||
<span class="avatar avatar-small" style="width:32px; height:32px;" title="{{ user_details.full_name }}">
|
||||
<img src="{{ user_details.user_image }}">
|
||||
|
Loading…
Reference in New Issue
Block a user