mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-04 12:49:10 +00:00
Merge branch 'version-13-beta' of https://github.com/frappe/erpnext into enconnex_erpnext
This commit is contained in:
@@ -94,7 +94,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
if(this.frm.doc.status !== 'Closed' && flt(this.frm.doc.per_received) < 100 && flt(this.frm.doc.per_billed) < 100) {
|
if(this.frm.doc.status !== 'Closed' && flt(this.frm.doc.per_received) < 100 && flt(this.frm.doc.per_billed) < 100) {
|
||||||
this.frm.add_custom_button(__('Update Items'), () => {
|
this.frm.add_custom_button(__('Update Items'), () => {
|
||||||
erpnext.utils.update_child_items({
|
erpnext.utils.update_child_items({
|
||||||
frm: frm,
|
frm: this.frm,
|
||||||
child_docname: "items",
|
child_docname: "items",
|
||||||
child_doctype: "Purchase Order Detail",
|
child_doctype: "Purchase Order Detail",
|
||||||
cannot_add_row: false,
|
cannot_add_row: false,
|
||||||
|
|||||||
@@ -673,6 +673,9 @@ def update_grand_total_for_rcm(doc, method):
|
|||||||
if country != 'India':
|
if country != 'India':
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if not doc.total_taxes_and_charges:
|
||||||
|
return
|
||||||
|
|
||||||
if doc.reverse_charge == 'Y':
|
if doc.reverse_charge == 'Y':
|
||||||
gst_accounts = get_gst_accounts(doc.company)
|
gst_accounts = get_gst_accounts(doc.company)
|
||||||
gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
|
gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
|
||||||
@@ -713,7 +716,10 @@ def make_regional_gl_entries(gl_entries, doc):
|
|||||||
country = frappe.get_cached_value('Company', doc.company, 'country')
|
country = frappe.get_cached_value('Company', doc.company, 'country')
|
||||||
|
|
||||||
if country != 'India':
|
if country != 'India':
|
||||||
return
|
return gl_entries
|
||||||
|
|
||||||
|
if not doc.total_taxes_and_charges:
|
||||||
|
return gl_entries
|
||||||
|
|
||||||
if doc.reverse_charge == 'Y':
|
if doc.reverse_charge == 'Y':
|
||||||
gst_accounts = get_gst_accounts(doc.company)
|
gst_accounts = get_gst_accounts(doc.company)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import frappe
|
|||||||
from erpnext.accounts.doctype.cash_flow_mapper.default_cash_flow_mapper import DEFAULT_MAPPERS
|
from erpnext.accounts.doctype.cash_flow_mapper.default_cash_flow_mapper import DEFAULT_MAPPERS
|
||||||
from .default_success_action import get_default_success_action
|
from .default_success_action import get_default_success_action
|
||||||
from frappe import _
|
from frappe import _
|
||||||
|
from frappe.utils import cint
|
||||||
from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
|
from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
|
||||||
from frappe.custom.doctype.custom_field.custom_field import create_custom_field
|
from frappe.custom.doctype.custom_field.custom_field import create_custom_field
|
||||||
from erpnext.setup.default_energy_point_rules import get_default_energy_point_rules
|
from erpnext.setup.default_energy_point_rules import get_default_energy_point_rules
|
||||||
@@ -29,8 +30,8 @@ def after_install():
|
|||||||
|
|
||||||
|
|
||||||
def check_setup_wizard_not_completed():
|
def check_setup_wizard_not_completed():
|
||||||
if frappe.db.get_default('desktop:home_page') != 'setup-wizard':
|
if cint(frappe.db.get_single_value('System Settings', 'setup_complete') or 0):
|
||||||
message = """ERPNext can only be installed on a fresh site where the setup wizard is not completed.
|
message = """ERPNext can only be installed on a fresh site where the setup wizard is not completed.
|
||||||
You can reinstall this site (after saving your data) using: bench --site [sitename] reinstall"""
|
You can reinstall this site (after saving your data) using: bench --site [sitename] reinstall"""
|
||||||
frappe.throw(message)
|
frappe.throw(message)
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,28 @@ class TestPurchaseReceipt(unittest.TestCase):
|
|||||||
set_perpetual_inventory(0)
|
set_perpetual_inventory(0)
|
||||||
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
|
||||||
|
|
||||||
|
def test_reverse_purchase_receipt_sle(self):
|
||||||
|
|
||||||
|
frappe.db.set_value('UOM', '_Test UOM', 'must_be_whole_number', 0)
|
||||||
|
|
||||||
|
pr = make_purchase_receipt(qty=0.5)
|
||||||
|
|
||||||
|
sl_entry = frappe.db.get_all("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
|
||||||
|
"voucher_no": pr.name}, ['actual_qty'])
|
||||||
|
|
||||||
|
self.assertEqual(len(sl_entry), 1)
|
||||||
|
self.assertEqual(sl_entry[0].actual_qty, 0.5)
|
||||||
|
|
||||||
|
pr.cancel()
|
||||||
|
|
||||||
|
sl_entry_cancelled = frappe.db.get_all("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
|
||||||
|
"voucher_no": pr.name}, ['actual_qty'], order_by='creation')
|
||||||
|
|
||||||
|
self.assertEqual(len(sl_entry_cancelled), 2)
|
||||||
|
self.assertEqual(sl_entry_cancelled[1].actual_qty, -0.5)
|
||||||
|
|
||||||
|
frappe.db.set_value('UOM', '_Test UOM', 'must_be_whole_number', 1)
|
||||||
|
|
||||||
def test_make_purchase_invoice(self):
|
def test_make_purchase_invoice(self):
|
||||||
pr = make_purchase_receipt(do_not_save=True)
|
pr = make_purchase_receipt(do_not_save=True)
|
||||||
self.assertRaises(frappe.ValidationError, make_purchase_invoice, pr.name)
|
self.assertRaises(frappe.ValidationError, make_purchase_invoice, pr.name)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ def make_sl_entries(sl_entries, allow_negative_stock=False, via_landed_cost_vouc
|
|||||||
sle['posting_time'] = now_datetime().strftime('%H:%M:%S.%f')
|
sle['posting_time'] = now_datetime().strftime('%H:%M:%S.%f')
|
||||||
|
|
||||||
if cancel:
|
if cancel:
|
||||||
sle['actual_qty'] = -flt(sle.get('actual_qty'), 0)
|
sle['actual_qty'] = -flt(sle.get('actual_qty'))
|
||||||
|
|
||||||
if sle['actual_qty'] < 0 and not sle.get('outgoing_rate'):
|
if sle['actual_qty'] < 0 and not sle.get('outgoing_rate'):
|
||||||
sle['outgoing_rate'] = get_incoming_outgoing_rate_for_cancel(sle.item_code,
|
sle['outgoing_rate'] = get_incoming_outgoing_rate_for_cancel(sle.item_code,
|
||||||
|
|||||||
@@ -11,8 +11,39 @@ def get_level():
|
|||||||
activation_level = 0
|
activation_level = 0
|
||||||
sales_data = []
|
sales_data = []
|
||||||
min_count = 0
|
min_count = 0
|
||||||
doctypes = {"Item": 5, "Customer": 5, "Sales Order": 2, "Sales Invoice": 2, "Purchase Order": 2, "Employee": 3, "Lead": 3, "Quotation": 3,
|
doctypes = {
|
||||||
"Payment Entry": 2, "User": 5, "Student": 5, "Instructor": 5, "BOM": 3, "Journal Entry": 3, "Stock Entry": 3}
|
"Asset": 5,
|
||||||
|
"BOM": 3,
|
||||||
|
"Customer": 5,
|
||||||
|
"Delivery Note": 5,
|
||||||
|
"Employee": 3,
|
||||||
|
"Instructor": 5,
|
||||||
|
"Instructor": 5,
|
||||||
|
"Issue": 5,
|
||||||
|
"Item": 5,
|
||||||
|
"Journal Entry": 3,
|
||||||
|
"Lead": 3,
|
||||||
|
"Leave Application": 5,
|
||||||
|
"Material Request": 5,
|
||||||
|
"Opportunity": 5,
|
||||||
|
"Payment Entry": 2,
|
||||||
|
"Project": 5,
|
||||||
|
"Purchase Order": 2,
|
||||||
|
"Purchase Invoice": 5,
|
||||||
|
"Purchase Receipt": 5,
|
||||||
|
"Quotation": 3,
|
||||||
|
"Salary Slip": 5,
|
||||||
|
"Salary Structure": 5,
|
||||||
|
"Sales Order": 2,
|
||||||
|
"Sales Invoice": 2,
|
||||||
|
"Stock Entry": 3,
|
||||||
|
"Student": 5,
|
||||||
|
"Supplier": 5,
|
||||||
|
"Task": 5,
|
||||||
|
"User": 5,
|
||||||
|
"Work Order": 5
|
||||||
|
}
|
||||||
|
|
||||||
for doctype, min_count in iteritems(doctypes):
|
for doctype, min_count in iteritems(doctypes):
|
||||||
count = frappe.db.count(doctype)
|
count = frappe.db.count(doctype)
|
||||||
if count > min_count:
|
if count > min_count:
|
||||||
|
|||||||
Reference in New Issue
Block a user