fix: Multiple fixes for travis (#20924)
* fix: Multiple fixes for travis * fix: Multiple fixes for travis * fix: Run dashboard patch if table already exists * fix: Multiple fixes for travis * fix: deletion of auto-created batch
This commit is contained in:
parent
06dc6a527e
commit
ddc3bb2251
@ -233,35 +233,14 @@ def update_outstanding_amt(account, party_type, party, against_voucher_type, aga
|
|||||||
frappe.throw(_("Outstanding for {0} cannot be less than zero ({1})").format(against_voucher, fmt_money(bal)))
|
frappe.throw(_("Outstanding for {0} cannot be less than zero ({1})").format(against_voucher, fmt_money(bal)))
|
||||||
|
|
||||||
if against_voucher_type in ["Sales Invoice", "Purchase Invoice", "Fees"]:
|
if against_voucher_type in ["Sales Invoice", "Purchase Invoice", "Fees"]:
|
||||||
update_outstanding_amt_in_ref(against_voucher, against_voucher_type, bal)
|
|
||||||
|
|
||||||
def update_outstanding_amt_in_ref(against_voucher, against_voucher_type, bal):
|
|
||||||
data = []
|
|
||||||
# Update outstanding amt on against voucher
|
|
||||||
if against_voucher_type == "Fees":
|
|
||||||
ref_doc = frappe.get_doc(against_voucher_type, against_voucher)
|
ref_doc = frappe.get_doc(against_voucher_type, against_voucher)
|
||||||
ref_doc.db_set('outstanding_amount', bal)
|
|
||||||
ref_doc.set_status(update=True)
|
|
||||||
return
|
|
||||||
elif against_voucher_type == "Purchase Invoice":
|
|
||||||
from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import get_status
|
|
||||||
data = frappe.db.get_value(against_voucher_type, against_voucher,
|
|
||||||
["name as purchase_invoice", "outstanding_amount",
|
|
||||||
"is_return", "due_date", "docstatus"])
|
|
||||||
elif against_voucher_type == "Sales Invoice":
|
|
||||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import get_status
|
|
||||||
data = frappe.db.get_value(against_voucher_type, against_voucher,
|
|
||||||
["name as sales_invoice", "outstanding_amount", "is_discounted",
|
|
||||||
"is_return", "due_date", "docstatus"])
|
|
||||||
|
|
||||||
precision = frappe.get_precision(against_voucher_type, "outstanding_amount")
|
# Didn't use db_set for optimisation purpose
|
||||||
data = list(data)
|
ref_doc.outstanding_amount = bal
|
||||||
data.append(precision)
|
frappe.db.set_value(against_voucher_type, against_voucher, 'outstanding_amount', bal)
|
||||||
status = get_status(data)
|
|
||||||
frappe.db.set_value(against_voucher_type, against_voucher, {
|
ref_doc.set_status(update=True)
|
||||||
'outstanding_amount': bal,
|
|
||||||
'status': status
|
|
||||||
})
|
|
||||||
|
|
||||||
def validate_frozen_account(account, adv_adj=None):
|
def validate_frozen_account(account, adv_adj=None):
|
||||||
frozen_account = frappe.db.get_value("Account", account, "freeze_account")
|
frozen_account = frappe.db.get_value("Account", account, "freeze_account")
|
||||||
|
@ -38,6 +38,7 @@ class TestGLEntry(unittest.TestCase):
|
|||||||
filters={"voucher_type": "Journal Entry", "voucher_no": je.name},
|
filters={"voucher_type": "Journal Entry", "voucher_no": je.name},
|
||||||
order_by="creation"
|
order_by="creation"
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertTrue(all(entry.to_rename == 1 for entry in gl_entries))
|
self.assertTrue(all(entry.to_rename == 1 for entry in gl_entries))
|
||||||
old_naming_series_current_value = frappe.db.sql("SELECT current from tabSeries where name = %s", naming_series)[0][0]
|
old_naming_series_current_value = frappe.db.sql("SELECT current from tabSeries where name = %s", naming_series)[0][0]
|
||||||
|
|
||||||
|
@ -161,15 +161,15 @@ class TestPaymentEntry(unittest.TestCase):
|
|||||||
pe.insert()
|
pe.insert()
|
||||||
pe.submit()
|
pe.submit()
|
||||||
|
|
||||||
outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
|
outstanding_amount, status = frappe.db.get_value("Sales Invoice", si.name, ["outstanding_amount", "status"])
|
||||||
self.assertEqual(outstanding_amount, 0)
|
self.assertEqual(flt(outstanding_amount), 0)
|
||||||
self.assertEqual(si.status, 'Paid')
|
self.assertEqual(status, 'Paid')
|
||||||
|
|
||||||
pe.cancel()
|
pe.cancel()
|
||||||
|
|
||||||
outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
|
outstanding_amount, status = frappe.db.get_value("Sales Invoice", si.name, ["outstanding_amount", "status"])
|
||||||
self.assertEqual(outstanding_amount, 100)
|
self.assertEqual(flt(outstanding_amount), 100)
|
||||||
self.assertEqual(si.status, 'Unpaid')
|
self.assertEqual(status, 'Unpaid')
|
||||||
|
|
||||||
def test_payment_against_purchase_invoice_to_check_status(self):
|
def test_payment_against_purchase_invoice_to_check_status(self):
|
||||||
pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC",
|
pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC",
|
||||||
@ -182,15 +182,15 @@ class TestPaymentEntry(unittest.TestCase):
|
|||||||
pe.insert()
|
pe.insert()
|
||||||
pe.submit()
|
pe.submit()
|
||||||
|
|
||||||
outstanding_amount = flt(frappe.db.get_value("Purchase Invoice", pi.name, "outstanding_amount"))
|
outstanding_amount, status = frappe.db.get_value("Purchase Invoice", pi.name, ["outstanding_amount", "status"])
|
||||||
self.assertEqual(outstanding_amount, 0)
|
self.assertEqual(flt(outstanding_amount), 0)
|
||||||
self.assertEqual(pi.status, 'Paid')
|
self.assertEqual(status, 'Paid')
|
||||||
|
|
||||||
pe.cancel()
|
pe.cancel()
|
||||||
|
|
||||||
outstanding_amount = flt(frappe.db.get_value("Purchase Invoice", pi.name, "outstanding_amount"))
|
outstanding_amount, status = frappe.db.get_value("Purchase Invoice", pi.name, ["outstanding_amount", "status"])
|
||||||
self.assertEqual(outstanding_amount, 100)
|
self.assertEqual(flt(outstanding_amount), 250)
|
||||||
self.assertEqual(pi.status, 'Unpaid')
|
self.assertEqual(status, 'Unpaid')
|
||||||
|
|
||||||
def test_payment_entry_against_ec(self):
|
def test_payment_entry_against_ec(self):
|
||||||
|
|
||||||
|
@ -125,27 +125,6 @@ class PurchaseInvoice(BuyingController):
|
|||||||
else:
|
else:
|
||||||
self.remarks = _("No Remarks")
|
self.remarks = _("No Remarks")
|
||||||
|
|
||||||
def set_status(self, update=False, status=None, update_modified=True):
|
|
||||||
if self.is_new():
|
|
||||||
if self.get('amended_from'):
|
|
||||||
self.status = 'Draft'
|
|
||||||
return
|
|
||||||
|
|
||||||
if not status:
|
|
||||||
precision = self.precision("outstanding_amount")
|
|
||||||
args = [
|
|
||||||
self.name,
|
|
||||||
self.outstanding_amount,
|
|
||||||
self.is_return,
|
|
||||||
self.due_date,
|
|
||||||
self.docstatus,
|
|
||||||
precision
|
|
||||||
]
|
|
||||||
self.status = get_status(args)
|
|
||||||
|
|
||||||
if update:
|
|
||||||
self.db_set('status', self.status, update_modified = update_modified)
|
|
||||||
|
|
||||||
def set_missing_values(self, for_validate=False):
|
def set_missing_values(self, for_validate=False):
|
||||||
if not self.credit_to:
|
if not self.credit_to:
|
||||||
self.credit_to = get_party_account("Supplier", self.supplier, self.company)
|
self.credit_to = get_party_account("Supplier", self.supplier, self.company)
|
||||||
@ -1028,34 +1007,6 @@ class PurchaseInvoice(BuyingController):
|
|||||||
# calculate totals again after applying TDS
|
# calculate totals again after applying TDS
|
||||||
self.calculate_taxes_and_totals()
|
self.calculate_taxes_and_totals()
|
||||||
|
|
||||||
def get_status(*args):
|
|
||||||
purchase_invoice, outstanding_amount, is_return, due_date, docstatus, precision = args[0]
|
|
||||||
|
|
||||||
outstanding_amount = flt(outstanding_amount, precision)
|
|
||||||
due_date = getdate(due_date)
|
|
||||||
now_date = getdate()
|
|
||||||
|
|
||||||
if docstatus == 2:
|
|
||||||
status = "Cancelled"
|
|
||||||
elif docstatus == 1:
|
|
||||||
if outstanding_amount > 0 and due_date < now_date:
|
|
||||||
status = "Overdue"
|
|
||||||
elif outstanding_amount > 0 and due_date >= now_date:
|
|
||||||
status = "Unpaid"
|
|
||||||
#Check if outstanding amount is 0 due to debit note issued against invoice
|
|
||||||
elif outstanding_amount <= 0 and is_return == 0 and frappe.db.get_value('Purchase Invoice', {'is_return': 1, 'return_against': purchase_invoice, 'docstatus': 1}):
|
|
||||||
status = "Debit Note Issued"
|
|
||||||
elif is_return == 1:
|
|
||||||
status = "Return"
|
|
||||||
elif outstanding_amount <=0:
|
|
||||||
status = "Paid"
|
|
||||||
else:
|
|
||||||
status = "Submitted"
|
|
||||||
else:
|
|
||||||
status = "Draft"
|
|
||||||
|
|
||||||
return status
|
|
||||||
|
|
||||||
def get_list_context(context=None):
|
def get_list_context(context=None):
|
||||||
from erpnext.controllers.website_list_for_contact import get_list_context
|
from erpnext.controllers.website_list_for_contact import get_list_context
|
||||||
list_context = get_list_context(context)
|
list_context = get_list_context(context)
|
||||||
@ -1116,3 +1067,6 @@ def block_invoice(name, release_date, hold_comment=None):
|
|||||||
def make_inter_company_sales_invoice(source_name, target_doc=None):
|
def make_inter_company_sales_invoice(source_name, target_doc=None):
|
||||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
|
||||||
return make_inter_company_transaction("Purchase Invoice", source_name, target_doc)
|
return make_inter_company_transaction("Purchase Invoice", source_name, target_doc)
|
||||||
|
|
||||||
|
def on_doctype_update():
|
||||||
|
frappe.db.add_index("Purchase Invoice", ["supplier", "is_return", "return_against"])
|
||||||
|
@ -777,7 +777,7 @@
|
|||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-03-05 14:20:17.297284",
|
"modified": "2020-03-11 14:20:17.297284",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Purchase Invoice Item",
|
"name": "Purchase Invoice Item",
|
||||||
|
@ -423,7 +423,10 @@ def make_invoice(pos_profile, doc_list={}, email_queue_list={}, customers_list={
|
|||||||
name_list.append(name)
|
name_list.append(name)
|
||||||
|
|
||||||
email_queue = make_email_queue(email_queue_list)
|
email_queue = make_email_queue(email_queue_list)
|
||||||
pos_profile = json.loads(pos_profile)
|
|
||||||
|
if isinstance(pos_profile, string_types):
|
||||||
|
pos_profile = json.loads(pos_profile)
|
||||||
|
|
||||||
customers = get_customers_list(pos_profile)
|
customers = get_customers_list(pos_profile)
|
||||||
return {
|
return {
|
||||||
'invoice': name_list,
|
'invoice': name_list,
|
||||||
|
@ -1223,18 +1223,38 @@ class SalesInvoice(SellingController):
|
|||||||
self.status = 'Draft'
|
self.status = 'Draft'
|
||||||
return
|
return
|
||||||
|
|
||||||
|
precision = self.precision("outstanding_amount")
|
||||||
|
outstanding_amount = flt(self.outstanding_amount, precision)
|
||||||
|
due_date = getdate(self.due_date)
|
||||||
|
nowdate = getdate()
|
||||||
|
|
||||||
|
discounting_status = None
|
||||||
|
if self.is_discounted:
|
||||||
|
discountng_status = get_discounting_status(self.name)
|
||||||
|
|
||||||
if not status:
|
if not status:
|
||||||
precision = self.precision("outstanding_amount")
|
if self.docstatus == 2:
|
||||||
args = [
|
status = "Cancelled"
|
||||||
self.name,
|
elif self.docstatus == 1:
|
||||||
self.outstanding_amount,
|
if outstanding_amount > 0 and due_date < nowdate and self.is_discounted and discountng_status=='Disbursed':
|
||||||
self.is_discounted,
|
self.status = "Overdue and Discounted"
|
||||||
self.is_return,
|
elif outstanding_amount > 0 and due_date < nowdate:
|
||||||
self.due_date,
|
self.status = "Overdue"
|
||||||
self.docstatus,
|
elif outstanding_amount > 0 and due_date >= nowdate and self.is_discounted and discountng_status=='Disbursed':
|
||||||
precision,
|
self.status = "Unpaid and Discounted"
|
||||||
]
|
elif outstanding_amount > 0 and due_date >= nowdate:
|
||||||
self.status = get_status(args)
|
self.status = "Unpaid"
|
||||||
|
#Check if outstanding amount is 0 due to credit note issued against invoice
|
||||||
|
elif outstanding_amount <= 0 and self.is_return == 0 and frappe.db.get_value('Sales Invoice', {'is_return': 1, 'return_against': self.name, 'docstatus': 1}):
|
||||||
|
self.status = "Credit Note Issued"
|
||||||
|
elif self.is_return == 1:
|
||||||
|
self.status = "Return"
|
||||||
|
elif outstanding_amount<=0:
|
||||||
|
self.status = "Paid"
|
||||||
|
else:
|
||||||
|
self.status = "Submitted"
|
||||||
|
else:
|
||||||
|
self.status = "Draft"
|
||||||
|
|
||||||
if update:
|
if update:
|
||||||
self.db_set('status', self.status, update_modified = update_modified)
|
self.db_set('status', self.status, update_modified = update_modified)
|
||||||
@ -1259,42 +1279,6 @@ def get_discounting_status(sales_invoice):
|
|||||||
|
|
||||||
return status
|
return status
|
||||||
|
|
||||||
def get_status(*args):
|
|
||||||
sales_invoice, outstanding_amount, is_discounted, is_return, due_date, docstatus, precision = args[0]
|
|
||||||
|
|
||||||
discounting_status = None
|
|
||||||
if is_discounted:
|
|
||||||
discounting_status = get_discounting_status(sales_invoice)
|
|
||||||
|
|
||||||
outstanding_amount = flt(outstanding_amount, precision)
|
|
||||||
due_date = getdate(due_date)
|
|
||||||
now_date = getdate()
|
|
||||||
|
|
||||||
if docstatus == 2:
|
|
||||||
status = "Cancelled"
|
|
||||||
elif docstatus == 1:
|
|
||||||
if outstanding_amount > 0 and due_date < now_date and is_discounted and discounting_status=='Disbursed':
|
|
||||||
status = "Overdue and Discounted"
|
|
||||||
elif outstanding_amount > 0 and due_date < now_date:
|
|
||||||
status = "Overdue"
|
|
||||||
elif outstanding_amount > 0 and due_date >= now_date and is_discounted and discounting_status=='Disbursed':
|
|
||||||
status = "Unpaid and Discounted"
|
|
||||||
elif outstanding_amount > 0 and due_date >= now_date:
|
|
||||||
status = "Unpaid"
|
|
||||||
#Check if outstanding amount is 0 due to credit note issued against invoice
|
|
||||||
elif outstanding_amount <= 0 and is_return == 0 and frappe.db.get_value('Sales Invoice', {'is_return': 1, 'return_against': sales_invoice, 'docstatus': 1}):
|
|
||||||
status = "Credit Note Issued"
|
|
||||||
elif is_return == 1:
|
|
||||||
status = "Return"
|
|
||||||
elif outstanding_amount <=0:
|
|
||||||
status = "Paid"
|
|
||||||
else:
|
|
||||||
status = "Submitted"
|
|
||||||
else:
|
|
||||||
status = "Draft"
|
|
||||||
|
|
||||||
return status
|
|
||||||
|
|
||||||
def validate_inter_company_party(doctype, party, company, inter_company_reference):
|
def validate_inter_company_party(doctype, party, company, inter_company_reference):
|
||||||
if not party:
|
if not party:
|
||||||
return
|
return
|
||||||
|
@ -786,7 +786,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
def test_make_pos_invoice(self):
|
def test_make_pos_invoice(self):
|
||||||
from erpnext.accounts.doctype.sales_invoice.pos import make_invoice
|
from erpnext.accounts.doctype.sales_invoice.pos import make_invoice
|
||||||
|
|
||||||
make_pos_profile()
|
pos_profile = make_pos_profile()
|
||||||
pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1")
|
pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1")
|
||||||
pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True)
|
pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True)
|
||||||
|
|
||||||
@ -802,7 +802,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
pos.append("taxes", tax)
|
pos.append("taxes", tax)
|
||||||
|
|
||||||
invoice_data = [{'09052016142': pos}]
|
invoice_data = [{'09052016142': pos}]
|
||||||
si = make_invoice(invoice_data).get('invoice')
|
si = make_invoice(pos_profile, invoice_data).get('invoice')
|
||||||
self.assertEqual(si[0], '09052016142')
|
self.assertEqual(si[0], '09052016142')
|
||||||
|
|
||||||
sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': '09052016142', 'docstatus': 1})
|
sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': '09052016142', 'docstatus': 1})
|
||||||
@ -820,7 +820,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
if allow_negative_stock:
|
if allow_negative_stock:
|
||||||
frappe.db.set_value('Stock Settings', None, 'allow_negative_stock', 0)
|
frappe.db.set_value('Stock Settings', None, 'allow_negative_stock', 0)
|
||||||
|
|
||||||
make_pos_profile()
|
pos_profile = make_pos_profile()
|
||||||
timestamp = cint(time.time())
|
timestamp = cint(time.time())
|
||||||
|
|
||||||
item = make_item("_Test POS Item")
|
item = make_item("_Test POS Item")
|
||||||
@ -834,7 +834,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 330}]
|
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 330}]
|
||||||
|
|
||||||
invoice_data = [{timestamp: pos}]
|
invoice_data = [{timestamp: pos}]
|
||||||
si = make_invoice(invoice_data).get('invoice')
|
si = make_invoice(pos_profile, invoice_data).get('invoice')
|
||||||
self.assertEqual(si[0], timestamp)
|
self.assertEqual(si[0], timestamp)
|
||||||
|
|
||||||
sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': timestamp})
|
sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': timestamp})
|
||||||
@ -843,7 +843,7 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
timestamp = cint(time.time())
|
timestamp = cint(time.time())
|
||||||
pos["offline_pos_name"] = timestamp
|
pos["offline_pos_name"] = timestamp
|
||||||
invoice_data = [{timestamp: pos}]
|
invoice_data = [{timestamp: pos}]
|
||||||
si1 = make_invoice(invoice_data).get('invoice')
|
si1 = make_invoice(pos_profile, invoice_data).get('invoice')
|
||||||
self.assertEqual(si1[0], timestamp)
|
self.assertEqual(si1[0], timestamp)
|
||||||
|
|
||||||
sales_invoice1 = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': timestamp})
|
sales_invoice1 = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': timestamp})
|
||||||
|
@ -136,12 +136,11 @@ def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False):
|
|||||||
|
|
||||||
|
|
||||||
def make_entry(args, adv_adj, update_outstanding, from_repost=False):
|
def make_entry(args, adv_adj, update_outstanding, from_repost=False):
|
||||||
args.update({"doctype": "GL Entry"})
|
gle = frappe.new_doc("GL Entry")
|
||||||
gle = frappe.get_doc(args)
|
gle.update(args)
|
||||||
gle.flags.ignore_permissions = 1
|
gle.flags.ignore_permissions = 1
|
||||||
gle.flags.from_repost = from_repost
|
gle.flags.from_repost = from_repost
|
||||||
gle.validate()
|
gle.validate()
|
||||||
gle.flags.ignore_permissions = True
|
|
||||||
gle.db_insert()
|
gle.db_insert()
|
||||||
gle.run_method("on_update_with_args", adv_adj, update_outstanding, from_repost)
|
gle.run_method("on_update_with_args", adv_adj, update_outstanding, from_repost)
|
||||||
gle.flags.ignore_validate = True
|
gle.flags.ignore_validate = True
|
||||||
|
@ -69,6 +69,17 @@ status_map = {
|
|||||||
["Cancelled", "eval:self.docstatus==2"],
|
["Cancelled", "eval:self.docstatus==2"],
|
||||||
["Closed", "eval:self.status=='Closed'"],
|
["Closed", "eval:self.status=='Closed'"],
|
||||||
],
|
],
|
||||||
|
"Purchase Invoice": [
|
||||||
|
["Draft", None],
|
||||||
|
["Submitted", "eval:self.docstatus==1"],
|
||||||
|
["Paid", "eval:self.outstanding_amount==0 and self.docstatus==1"],
|
||||||
|
["Return", "eval:self.is_return==1 and self.docstatus==1"],
|
||||||
|
["Debit Note Issued",
|
||||||
|
"eval:self.outstanding_amount <= 0 and self.docstatus==1 and self.is_return==0 and get_value('Purchase Invoice', {'is_return': 1, 'return_against': self.name, 'docstatus': 1})"],
|
||||||
|
["Unpaid", "eval:self.outstanding_amount > 0 and getdate(self.due_date) >= getdate(nowdate()) and self.docstatus==1"],
|
||||||
|
["Overdue", "eval:self.outstanding_amount > 0 and getdate(self.due_date) < getdate(nowdate()) and self.docstatus==1"],
|
||||||
|
["Cancelled", "eval:self.docstatus==2"],
|
||||||
|
],
|
||||||
"Material Request": [
|
"Material Request": [
|
||||||
["Draft", None],
|
["Draft", None],
|
||||||
["Stopped", "eval:self.status == 'Stopped'"],
|
["Stopped", "eval:self.status == 'Stopped'"],
|
||||||
|
@ -238,7 +238,7 @@ class StockController(AccountsController):
|
|||||||
for d in self.items:
|
for d in self.items:
|
||||||
if not d.batch_no: continue
|
if not d.batch_no: continue
|
||||||
|
|
||||||
serial_nos = [d.name for d in frappe.get_all("Serial No", {'batch_no': d.batch_no})]
|
serial_nos = [sr.name for sr in frappe.get_all("Serial No", {'batch_no': d.batch_no})]
|
||||||
if serial_nos:
|
if serial_nos:
|
||||||
frappe.db.set_value("Serial No", { 'name': ['in', serial_nos] }, "batch_no", None)
|
frappe.db.set_value("Serial No", { 'name': ['in', serial_nos] }, "batch_no", None)
|
||||||
|
|
||||||
|
@ -294,18 +294,21 @@ class TestLoan(unittest.TestCase):
|
|||||||
|
|
||||||
make_loan_disbursement_entry(loan.name, loan.loan_amount)
|
make_loan_disbursement_entry(loan.name, loan.loan_amount)
|
||||||
|
|
||||||
frappe.db.sql(""" UPDATE `tabLoan Security Price` SET loan_security_price = %s
|
frappe.db.sql(""" UPDATE `tabLoan Security Price` SET loan_security_price = 100
|
||||||
where loan_security=%s""", (100, 'Test Security 2'))
|
where loan_security='Test Security 2'""")
|
||||||
|
|
||||||
check_for_ltv_shortfall()
|
check_for_ltv_shortfall()
|
||||||
loan_security_shortfall = frappe.get_doc("Loan Security Shortfall", {"loan": loan.name})
|
loan_security_shortfall = frappe.get_doc("Loan Security Shortfall", {"loan": loan.name})
|
||||||
|
|
||||||
self.assertTrue(loan_security_shortfall)
|
self.assertTrue(loan_security_shortfall)
|
||||||
|
|
||||||
self.assertEquals(loan_security_shortfall.loan_amount, 1000000.00)
|
self.assertEquals(loan_security_shortfall.loan_amount, 1000000.00)
|
||||||
self.assertEquals(loan_security_shortfall.security_value, 400000.00)
|
self.assertEquals(loan_security_shortfall.security_value, 400000.00)
|
||||||
self.assertEquals(loan_security_shortfall.shortfall_amount, 600000.00)
|
self.assertEquals(loan_security_shortfall.shortfall_amount, 600000.00)
|
||||||
|
|
||||||
|
frappe.db.sql(""" UPDATE `tabLoan Security Price` SET loan_security_price = 250
|
||||||
|
where loan_security='Test Security 2'""")
|
||||||
|
|
||||||
|
|
||||||
def create_loan_accounts():
|
def create_loan_accounts():
|
||||||
if not frappe.db.exists("Account", "Loans and Advances (Assets) - _TC"):
|
if not frappe.db.exists("Account", "Loans and Advances (Assets) - _TC"):
|
||||||
frappe.get_doc({
|
frappe.get_doc({
|
||||||
@ -399,7 +402,8 @@ def create_loan_security_type():
|
|||||||
"doctype": "Loan Security Type",
|
"doctype": "Loan Security Type",
|
||||||
"loan_security_type": "Stock",
|
"loan_security_type": "Stock",
|
||||||
"unit_of_measure": "Nos",
|
"unit_of_measure": "Nos",
|
||||||
"haircut": 50.00
|
"haircut": 50.00,
|
||||||
|
"loan_to_value_ratio": 50
|
||||||
}).insert(ignore_permissions=True)
|
}).insert(ignore_permissions=True)
|
||||||
|
|
||||||
def create_loan_security():
|
def create_loan_security():
|
||||||
|
@ -130,9 +130,10 @@ def make_accrual_interest_entry_for_term_loans(posting_date=None):
|
|||||||
loan.loan_account, loan.principal_amount + loan.balance_loan_amount, loan.interest_amount,
|
loan.loan_account, loan.principal_amount + loan.balance_loan_amount, loan.interest_amount,
|
||||||
payable_principal = loan.principal_amount , posting_date=posting_date)
|
payable_principal = loan.principal_amount , posting_date=posting_date)
|
||||||
|
|
||||||
frappe.db.sql("""UPDATE `tabRepayment Schedule`
|
if accrued_entries:
|
||||||
SET is_accrued = 1 where name in (%s)""" #nosec
|
frappe.db.sql("""UPDATE `tabRepayment Schedule`
|
||||||
% ", ".join(['%s']*len(accrued_entries)), tuple(accrued_entries))
|
SET is_accrued = 1 where name in (%s)""" #nosec
|
||||||
|
% ", ".join(['%s']*len(accrued_entries)), tuple(accrued_entries))
|
||||||
|
|
||||||
def make_loan_interest_accrual_entry(loan, applicant_type, applicant, interest_income_account, loan_account,
|
def make_loan_interest_accrual_entry(loan, applicant_type, applicant, interest_income_account, loan_account,
|
||||||
pending_principal_amount, interest_amount, payable_principal=None, process_loan_interest=None, posting_date=None):
|
pending_principal_amount, interest_amount, payable_principal=None, process_loan_interest=None, posting_date=None):
|
||||||
|
@ -279,7 +279,7 @@ class WorkOrder(Document):
|
|||||||
if enable_capacity_planning and job_card_doc:
|
if enable_capacity_planning and job_card_doc:
|
||||||
row.planned_start_time = job_card_doc.time_logs[-1].from_time
|
row.planned_start_time = job_card_doc.time_logs[-1].from_time
|
||||||
row.planned_end_time = job_card_doc.time_logs[-1].to_time
|
row.planned_end_time = job_card_doc.time_logs[-1].to_time
|
||||||
|
print(row.planned_start_time, original_start_time, plan_days)
|
||||||
if date_diff(row.planned_start_time, original_start_time) > plan_days:
|
if date_diff(row.planned_start_time, original_start_time) > plan_days:
|
||||||
frappe.message_log.pop()
|
frappe.message_log.pop()
|
||||||
frappe.throw(_("Unable to find the time slot in the next {0} days for the operation {1}.")
|
frappe.throw(_("Unable to find the time slot in the next {0} days for the operation {1}.")
|
||||||
|
@ -9,7 +9,7 @@ from frappe import _
|
|||||||
from frappe.utils import random_string
|
from frappe.utils import random_string
|
||||||
from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import get_charts_for_country
|
from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import get_charts_for_country
|
||||||
|
|
||||||
test_ignore = ["Account", "Cost Center", "Payment Terms Template", "Salary Component"]
|
test_ignore = ["Account", "Cost Center", "Payment Terms Template", "Salary Component", "Warehouse"]
|
||||||
test_dependencies = ["Fiscal Year"]
|
test_dependencies = ["Fiscal Year"]
|
||||||
test_records = frappe.get_test_records('Company')
|
test_records = frappe.get_test_records('Company')
|
||||||
|
|
||||||
|
@ -183,12 +183,17 @@ class Item(WebsiteGenerator):
|
|||||||
# default warehouse, or Stores
|
# default warehouse, or Stores
|
||||||
for default in self.item_defaults or [frappe._dict({'company': frappe.defaults.get_defaults().company})]:
|
for default in self.item_defaults or [frappe._dict({'company': frappe.defaults.get_defaults().company})]:
|
||||||
default_warehouse = (default.default_warehouse
|
default_warehouse = (default.default_warehouse
|
||||||
or frappe.db.get_single_value('Stock Settings', 'default_warehouse')
|
or frappe.db.get_single_value('Stock Settings', 'default_warehouse'))
|
||||||
or frappe.db.get_value('Warehouse', {'warehouse_name': _('Stores')}))
|
if default_warehouse:
|
||||||
|
warehouse_company = frappe.db.get_value("Warehouse", default_warehouse, "company")
|
||||||
|
|
||||||
|
if not default_warehouse or warehouse_company != default.company:
|
||||||
|
default_warehouse = frappe.db.get_value('Warehouse',
|
||||||
|
{'warehouse_name': _('Stores'), 'company': default.company})
|
||||||
|
|
||||||
if default_warehouse:
|
if default_warehouse:
|
||||||
stock_entry = make_stock_entry(item_code=self.name, target=default_warehouse, qty=self.opening_stock,
|
stock_entry = make_stock_entry(item_code=self.name, target=default_warehouse, qty=self.opening_stock,
|
||||||
rate=self.valuation_rate, company=default.company)
|
rate=self.valuation_rate, company=default.company)
|
||||||
|
|
||||||
stock_entry.add_comment("Comment", _("Opening Stock"))
|
stock_entry.add_comment("Comment", _("Opening Stock"))
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ class TestPurchaseReceipt(unittest.TestCase):
|
|||||||
self.assertFalse(get_gl_entries("Purchase Receipt", pr.name))
|
self.assertFalse(get_gl_entries("Purchase Receipt", pr.name))
|
||||||
|
|
||||||
def test_batched_serial_no_purchase(self):
|
def test_batched_serial_no_purchase(self):
|
||||||
item = frappe.get_doc("Item", { 'item_name': 'Batched Serialized Item' })
|
item = frappe.db.exists("Item", {'item_name': 'Batched Serialized Item'})
|
||||||
if not item:
|
if not item:
|
||||||
item = create_item("Batched Serialized Item")
|
item = create_item("Batched Serialized Item")
|
||||||
item.has_batch_no = 1
|
item.has_batch_no = 1
|
||||||
@ -62,6 +62,8 @@ class TestPurchaseReceipt(unittest.TestCase):
|
|||||||
item.batch_number_series = "BS-BATCH-.##"
|
item.batch_number_series = "BS-BATCH-.##"
|
||||||
item.serial_no_series = "BS-.####"
|
item.serial_no_series = "BS-.####"
|
||||||
item.save()
|
item.save()
|
||||||
|
else:
|
||||||
|
item = frappe.get_doc("Item", {'item_name': 'Batched Serialized Item'})
|
||||||
|
|
||||||
pr = make_purchase_receipt(item_code=item.name, qty=5, rate=500)
|
pr = make_purchase_receipt(item_code=item.name, qty=5, rate=500)
|
||||||
|
|
||||||
@ -302,6 +304,8 @@ class TestPurchaseReceipt(unittest.TestCase):
|
|||||||
self.assertEqual(serial_no, frappe.db.get_value("Serial No",
|
self.assertEqual(serial_no, frappe.db.get_value("Serial No",
|
||||||
{"purchase_document_type": "Purchase Receipt", "purchase_document_no": pr_doc.name}, "name"))
|
{"purchase_document_type": "Purchase Receipt", "purchase_document_no": pr_doc.name}, "name"))
|
||||||
|
|
||||||
|
pr_doc.cancel()
|
||||||
|
|
||||||
#check for the auto created serial nos
|
#check for the auto created serial nos
|
||||||
item_code = "Test Auto Created Serial No"
|
item_code = "Test Auto Created Serial No"
|
||||||
if not frappe.db.exists("Item", item_code):
|
if not frappe.db.exists("Item", item_code):
|
||||||
@ -317,9 +321,9 @@ class TestPurchaseReceipt(unittest.TestCase):
|
|||||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
|
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
|
||||||
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
||||||
|
|
||||||
item_code = frappe.db.get_value('Item', {'has_serial_no': 1, 'is_fixed_asset': 0})
|
item_code = frappe.db.get_value('Item', {'has_serial_no': 1, 'is_fixed_asset': 0, "has_batch_no": 0})
|
||||||
if not item_code:
|
if not item_code:
|
||||||
item = make_item("Test Serial Item 1", dict(has_serial_no=1))
|
item = make_item("Test Serial Item 1", dict(has_serial_no=1, has_batch_no=0))
|
||||||
item_code = item.name
|
item_code = item.name
|
||||||
|
|
||||||
serial_no = random_string(5)
|
serial_no = random_string(5)
|
||||||
|
@ -832,7 +832,7 @@
|
|||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-03-05 14:19:48.799370",
|
"modified": "2020-03-11 14:19:48.799370",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Purchase Receipt Item",
|
"name": "Purchase Receipt Item",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user