frappe/frappe#478, more changes, removed bean
This commit is contained in:
@@ -65,7 +65,7 @@
|
|||||||
<th>Basic Rate</th>
|
<th>Basic Rate</th>
|
||||||
<th>Amount</th>
|
<th>Amount</th>
|
||||||
</tr>
|
</tr>
|
||||||
{%- for row in doclist.get({"doctype":"Sales Invoice Item"}) %}
|
{%- for row in doc.get({"doctype":"Sales Invoice Item"}) %}
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width: 3%;">{{ row.idx }}</td>
|
<td style="width: 3%;">{{ row.idx }}</td>
|
||||||
<td style="width: 20%;">{{ row.item_name }}</td>
|
<td style="width: 20%;">{{ row.item_name }}</td>
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
utils.fmt_money(doc.net_total_export, currency=doc.currency)
|
utils.fmt_money(doc.net_total_export, currency=doc.currency)
|
||||||
}}</td>
|
}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{%- for charge in doclist.get({"doctype":"Sales Taxes and Charges"}) -%}
|
{%- for charge in doc.get({"doctype":"Sales Taxes and Charges"}) -%}
|
||||||
{%- if not charge.included_in_print_rate -%}
|
{%- if not charge.included_in_print_rate -%}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ charge.description }}</td>
|
<td>{{ charge.description }}</td>
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ class Account(Document):
|
|||||||
["name", "group_or_ledger", "report_type"], as_dict=1)
|
["name", "group_or_ledger", "report_type"], as_dict=1)
|
||||||
if not par:
|
if not par:
|
||||||
throw(_("Parent account does not exists"))
|
throw(_("Parent account does not exists"))
|
||||||
elif par[0]["name"] == self.name:
|
elif par["name"] == self.name:
|
||||||
throw(_("You can not assign itself as parent account"))
|
throw(_("You can not assign itself as parent account"))
|
||||||
elif par[0]["group_or_ledger"] != 'Group':
|
elif par["group_or_ledger"] != 'Group':
|
||||||
throw(_("Parent account can not be a ledger"))
|
throw(_("Parent account can not be a ledger"))
|
||||||
|
|
||||||
if par[0]["report_type"]:
|
if par["report_type"]:
|
||||||
self.report_type = par[0]["report_type"]
|
self.report_type = par["report_type"]
|
||||||
|
|
||||||
def validate_duplicate_account(self):
|
def validate_duplicate_account(self):
|
||||||
if self.get('__islocal') or not self.name:
|
if self.get('__islocal') or not self.name:
|
||||||
|
|||||||
@@ -25,5 +25,5 @@ class AccountsSettings(Document):
|
|||||||
frappe.throw(_("Company is missing in following warehouses") + ": \n" +
|
frappe.throw(_("Company is missing in following warehouses") + ": \n" +
|
||||||
"\n".join(warehouse_with_no_company))
|
"\n".join(warehouse_with_no_company))
|
||||||
for wh in warehouse_list:
|
for wh in warehouse_list:
|
||||||
wh_bean = frappe.get_doc("Warehouse", wh.name)
|
wh_doc = frappe.get_doc("Warehouse", wh.name)
|
||||||
wh_bean.save()
|
wh_doc.save()
|
||||||
@@ -1 +1,44 @@
|
|||||||
[]
|
[{
|
||||||
|
"doctype": "Budget Distribution",
|
||||||
|
"distribution_id": "_Test Distribution",
|
||||||
|
"fiscal_year": "_Test Fiscal Year 2013",
|
||||||
|
"budget_distribution_details": [
|
||||||
|
{
|
||||||
|
"month": "January",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "February",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "March",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "April",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "May",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "June",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "July",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "August",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "September",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "October",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"month": "November",
|
||||||
|
"percentage_allocation": "10"
|
||||||
|
}, {
|
||||||
|
"month": "December",
|
||||||
|
"percentage_allocation": "10"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ def import_charts():
|
|||||||
chart = json.loads(f.read())
|
chart = json.loads(f.read())
|
||||||
country = frappe.db.get_value("Country", {"code": fname.split("_", 1)[0]})
|
country = frappe.db.get_value("Country", {"code": fname.split("_", 1)[0]})
|
||||||
if country:
|
if country:
|
||||||
bean = frappe.get_doc({
|
doc = frappe.get_doc({
|
||||||
"doctype":"Chart of Accounts",
|
"doctype":"Chart of Accounts",
|
||||||
"chart_name": chart.get("name"),
|
"chart_name": chart.get("name"),
|
||||||
"source_file": fname,
|
"source_file": fname,
|
||||||
"country": country
|
"country": country
|
||||||
}).insert()
|
}).insert()
|
||||||
print bean.name.encode("utf-8")
|
print doc.name.encode("utf-8")
|
||||||
else:
|
else:
|
||||||
print "No chart for: " + chart.get("name").encode("utf-8")
|
print "No chart for: " + chart.get("name").encode("utf-8")
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class CostCenter(DocTypeNestedSet):
|
|||||||
|
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
self.name = self.cost_center_name.strip() + ' - ' + \
|
self.name = self.cost_center_name.strip() + ' - ' + \
|
||||||
frappe.get_value("Company", self.company, "abbr")
|
frappe.db.get_value("Company", self.company, "abbr")
|
||||||
|
|
||||||
def validate_mandatory(self):
|
def validate_mandatory(self):
|
||||||
if not self.group_or_ledger:
|
if not self.group_or_ledger:
|
||||||
|
|||||||
@@ -3,4 +3,6 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
|
||||||
test_records = frappe.get_test_records('Fiscal Year')
|
test_records = frappe.get_test_records('Fiscal Year')
|
||||||
@@ -349,8 +349,8 @@ def get_default_bank_cash_account(company, voucher_type):
|
|||||||
def get_payment_entry_from_sales_invoice(sales_invoice):
|
def get_payment_entry_from_sales_invoice(sales_invoice):
|
||||||
from erpnext.accounts.utils import get_balance_on
|
from erpnext.accounts.utils import get_balance_on
|
||||||
si = frappe.get_doc("Sales Invoice", sales_invoice)
|
si = frappe.get_doc("Sales Invoice", sales_invoice)
|
||||||
jv = get_payment_entry(si.doc)
|
jv = get_payment_entry(si)
|
||||||
jv.remark = 'Payment received against Sales Invoice %(name)s. %(remarks)s' % si.fields
|
jv.remark = 'Payment received against Sales Invoice {0}. {1}'.format(si.name, si.remarks)
|
||||||
|
|
||||||
# credit customer
|
# credit customer
|
||||||
jv.doclist[1].account = si.debit_to
|
jv.doclist[1].account = si.debit_to
|
||||||
@@ -367,8 +367,8 @@ def get_payment_entry_from_sales_invoice(sales_invoice):
|
|||||||
def get_payment_entry_from_purchase_invoice(purchase_invoice):
|
def get_payment_entry_from_purchase_invoice(purchase_invoice):
|
||||||
from erpnext.accounts.utils import get_balance_on
|
from erpnext.accounts.utils import get_balance_on
|
||||||
pi = frappe.get_doc("Purchase Invoice", purchase_invoice)
|
pi = frappe.get_doc("Purchase Invoice", purchase_invoice)
|
||||||
jv = get_payment_entry(pi.doc)
|
jv = get_payment_entry(pi)
|
||||||
jv.remark = 'Payment against Purchase Invoice %(name)s. %(remarks)s' % pi.fields
|
jv.remark = 'Payment against Purchase Invoice {0}. {1}'.format(pi.name, pi.remarks)
|
||||||
|
|
||||||
# credit supplier
|
# credit supplier
|
||||||
jv.doclist[1].account = pi.credit_to
|
jv.doclist[1].account = pi.credit_to
|
||||||
@@ -384,7 +384,7 @@ def get_payment_entry_from_purchase_invoice(purchase_invoice):
|
|||||||
def get_payment_entry(doc):
|
def get_payment_entry(doc):
|
||||||
bank_account = get_default_bank_cash_account(doc.company, "Bank Voucher")
|
bank_account = get_default_bank_cash_account(doc.company, "Bank Voucher")
|
||||||
|
|
||||||
jv = frappe.new_bean('Journal Voucher')
|
jv = frappe.new_doc('Journal Voucher')
|
||||||
jv.voucher_type = 'Bank Voucher'
|
jv.voucher_type = 'Bank Voucher'
|
||||||
|
|
||||||
jv.company = doc.company
|
jv.company = doc.company
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ import frappe
|
|||||||
|
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class PurchaseTaxesAndCharges(Document):
|
class PurchaseTaxesandCharges(Document):
|
||||||
pass
|
pass
|
||||||
@@ -5,5 +5,5 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class PurchaseTaxesAndChargesMaster(Document):
|
class PurchaseTaxesandChargesMaster(Document):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ class SalesInvoice(SellingController):
|
|||||||
for item in self.get("entries"):
|
for item in self.get("entries"):
|
||||||
if item.get('item_code'):
|
if item.get('item_code'):
|
||||||
for fname, val in get_pos_settings_item_details(pos,
|
for fname, val in get_pos_settings_item_details(pos,
|
||||||
frappe._dict(item.fields), pos).items():
|
frappe._dict(item.as_dict()), pos).items():
|
||||||
|
|
||||||
if (not for_validate) or (for_validate and not item.get(fname)):
|
if (not for_validate) or (for_validate and not item.get(fname)):
|
||||||
item.set(fname, val)
|
item.set(fname, val)
|
||||||
@@ -696,7 +696,7 @@ def manage_recurring_invoices(next_date=None, commit=True):
|
|||||||
raise Exception, exception_message
|
raise Exception, exception_message
|
||||||
|
|
||||||
def make_new_invoice(ref_wrapper, posting_date):
|
def make_new_invoice(ref_wrapper, posting_date):
|
||||||
from frappe.model.bean import clone
|
from frappe.model.doc import clone
|
||||||
from erpnext.accounts.utils import get_fiscal_year
|
from erpnext.accounts.utils import get_fiscal_year
|
||||||
new_invoice = clone(ref_wrapper)
|
new_invoice = clone(ref_wrapper)
|
||||||
|
|
||||||
@@ -736,7 +736,7 @@ def send_notification(new_rv):
|
|||||||
from frappe.core.doctype.print_format.print_format import get_html
|
from frappe.core.doctype.print_format.print_format import get_html
|
||||||
frappe.sendmail(new_rv.notification_email_address,
|
frappe.sendmail(new_rv.notification_email_address,
|
||||||
subject="New Invoice : " + new_rv.name,
|
subject="New Invoice : " + new_rv.name,
|
||||||
message = get_html(new_rv.doc, new_rv, "SalesInvoice"))
|
message = get_html(new_rv, new_rv, "SalesInvoice"))
|
||||||
|
|
||||||
def notify_errors(inv, customer, owner):
|
def notify_errors(inv, customer, owner):
|
||||||
from frappe.utils.user import get_system_managers
|
from frappe.utils.user import get_system_managers
|
||||||
@@ -797,8 +797,8 @@ def make_delivery_note(source_name, target_doc=None):
|
|||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.run_method("onload_post_render")
|
doc.run_method("onload_post_render")
|
||||||
|
|
||||||
def update_item(source_doc, target_doc, source_parent):
|
def update_item(source_doc, target_doc, source_parent):
|
||||||
target_doc.base_amount = (flt(source_doc.qty) - flt(source_doc.delivered_qty)) * \
|
target_doc.base_amount = (flt(source_doc.qty) - flt(source_doc.delivered_qty)) * \
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
import frappe
|
import frappe
|
||||||
import unittest, json
|
import unittest, json
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt
|
||||||
from frappe.model.bean import DocstatusTransitionError, TimestampMismatchError
|
from frappe.model.doc import DocstatusTransitionError, TimestampMismatchError
|
||||||
from erpnext.accounts.utils import get_stock_and_account_difference
|
from erpnext.accounts.utils import get_stock_and_account_difference
|
||||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||||
|
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ import frappe
|
|||||||
|
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class SalesTaxesAndCharges(Document):
|
class SalesTaxesandCharges(Document):
|
||||||
pass
|
pass
|
||||||
@@ -6,7 +6,7 @@ import frappe
|
|||||||
from frappe.utils import cint
|
from frappe.utils import cint
|
||||||
from frappe.model.controller import DocListController
|
from frappe.model.controller import DocListController
|
||||||
|
|
||||||
class SalesTaxesAndChargesMaster(DocListController):
|
class SalesTaxesandChargesMaster(DocListController):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if self.is_default == 1:
|
if self.is_default == 1:
|
||||||
frappe.db.sql("""update `tabSales Taxes and Charges Master` set is_default = 0
|
frappe.db.sql("""update `tabSales Taxes and Charges Master` set is_default = 0
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class ShippingRule(DocListController):
|
|||||||
for i in xrange(0, len(self.shipping_rule_conditions)):
|
for i in xrange(0, len(self.shipping_rule_conditions)):
|
||||||
for j in xrange(i+1, len(self.shipping_rule_conditions)):
|
for j in xrange(i+1, len(self.shipping_rule_conditions)):
|
||||||
d1, d2 = self.shipping_rule_conditions[i], self.shipping_rule_conditions[j]
|
d1, d2 = self.shipping_rule_conditions[i], self.shipping_rule_conditions[j]
|
||||||
if d1.fields != d2.fields:
|
if d1.as_dict() != d2.as_dict():
|
||||||
# in our case, to_value can be zero, hence pass the from_value if so
|
# in our case, to_value can be zero, hence pass the from_value if so
|
||||||
range_a = (d1.from_value, d1.to_value or d1.from_value)
|
range_a = (d1.from_value, d1.to_value or d1.from_value)
|
||||||
range_b = (d2.from_value, d2.to_value or d2.from_value)
|
range_b = (d2.from_value, d2.to_value or d2.from_value)
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ def _get_party_details(party=None, account=None, party_type="Customer", company=
|
|||||||
if not ignore_permissions and not frappe.has_permission(party_type, "read", party):
|
if not ignore_permissions and not frappe.has_permission(party_type, "read", party):
|
||||||
frappe.throw("Not Permitted", frappe.PermissionError)
|
frappe.throw("Not Permitted", frappe.PermissionError)
|
||||||
|
|
||||||
party_bean = frappe.get_doc(party_type, party)
|
party_doc = frappe.get_doc(party_type, party)
|
||||||
party = party_bean.doc
|
party = party_doc
|
||||||
|
|
||||||
set_address_details(out, party, party_type)
|
set_address_details(out, party, party_type)
|
||||||
set_contact_details(out, party, party_type)
|
set_contact_details(out, party, party_type)
|
||||||
@@ -41,7 +41,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company=
|
|||||||
out["sales_team"] = [{
|
out["sales_team"] = [{
|
||||||
"sales_person": d.sales_person,
|
"sales_person": d.sales_person,
|
||||||
"sales_designation": d.sales_designation
|
"sales_designation": d.sales_designation
|
||||||
} for d in party_bean.get("sales_team")]
|
} for d in party_doc.get("sales_team")]
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|||||||
@@ -184,8 +184,8 @@ def make_purchase_receipt(source_name, target_doc=None):
|
|||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.run_method("set_missing_values")
|
doc.run_method("set_missing_values")
|
||||||
|
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(obj, target, source_parent):
|
||||||
target.qty = flt(obj.qty) - flt(obj.received_qty)
|
target.qty = flt(obj.qty) - flt(obj.received_qty)
|
||||||
@@ -223,8 +223,8 @@ def make_purchase_invoice(source_name, target_doc=None):
|
|||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.run_method("set_missing_values")
|
doc.run_method("set_missing_values")
|
||||||
|
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(obj, target, source_parent):
|
||||||
target.amount = flt(obj.amount) - flt(obj.billed_amt)
|
target.amount = flt(obj.amount) - flt(obj.billed_amt)
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
self.assertEquals(len(pr), len(test_records[0]))
|
self.assertEquals(len(pr), len(test_records[0]))
|
||||||
|
|
||||||
pr[0]["naming_series"] = "_T-Purchase Receipt-"
|
pr[0]["naming_series"] = "_T-Purchase Receipt-"
|
||||||
pr_bean = frappe.get_doc(pr)
|
pr_doc = frappe.get_doc(pr)
|
||||||
pr_bean.insert()
|
pr_doc.insert()
|
||||||
|
|
||||||
def test_ordered_qty(self):
|
def test_ordered_qty(self):
|
||||||
frappe.db.sql("delete from tabBin")
|
frappe.db.sql("delete from tabBin")
|
||||||
@@ -54,9 +54,9 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
pr[0]["posting_date"] = "2013-05-12"
|
pr[0]["posting_date"] = "2013-05-12"
|
||||||
pr[0]["naming_series"] = "_T-Purchase Receipt-"
|
pr[0]["naming_series"] = "_T-Purchase Receipt-"
|
||||||
pr[1]["qty"] = 4.0
|
pr[1]["qty"] = 4.0
|
||||||
pr_bean = frappe.get_doc(pr)
|
pr_doc = frappe.get_doc(pr)
|
||||||
pr_bean.insert()
|
pr_doc.insert()
|
||||||
pr_bean.submit()
|
pr_doc.submit()
|
||||||
|
|
||||||
self.assertEquals(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item",
|
self.assertEquals(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item",
|
||||||
"warehouse": "_Test Warehouse - _TC"}, "ordered_qty")), 6.0)
|
"warehouse": "_Test Warehouse - _TC"}, "ordered_qty")), 6.0)
|
||||||
@@ -67,9 +67,9 @@ class TestPurchaseOrder(unittest.TestCase):
|
|||||||
pr1[0]["naming_series"] = "_T-Purchase Receipt-"
|
pr1[0]["naming_series"] = "_T-Purchase Receipt-"
|
||||||
pr1[0]["posting_date"] = "2013-05-12"
|
pr1[0]["posting_date"] = "2013-05-12"
|
||||||
pr1[1]["qty"] = 8
|
pr1[1]["qty"] = 8
|
||||||
pr1_bean = frappe.get_doc(pr1)
|
pr1_doc = frappe.get_doc(pr1)
|
||||||
pr1_bean.insert()
|
pr1_doc.insert()
|
||||||
pr1_bean.submit()
|
pr1_doc.submit()
|
||||||
|
|
||||||
self.assertEquals(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item",
|
self.assertEquals(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item",
|
||||||
"warehouse": "_Test Warehouse - _TC"}, "ordered_qty")), 0.0)
|
"warehouse": "_Test Warehouse - _TC"}, "ordered_qty")), 0.0)
|
||||||
|
|||||||
@@ -55,9 +55,9 @@ def make_purchase_order(source_name, target_doc=None):
|
|||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.run_method("set_missing_values")
|
doc.run_method("set_missing_values")
|
||||||
bean.run_method("get_schedule_dates")
|
doc.run_method("get_schedule_dates")
|
||||||
|
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(obj, target, source_parent):
|
||||||
target.conversion_factor = 1
|
target.conversion_factor = 1
|
||||||
|
|||||||
@@ -86,10 +86,11 @@ class AccountsController(TransactionBase):
|
|||||||
def set_missing_item_details(self):
|
def set_missing_item_details(self):
|
||||||
"""set missing item values"""
|
"""set missing item values"""
|
||||||
from erpnext.stock.get_item_details import get_item_details
|
from erpnext.stock.get_item_details import get_item_details
|
||||||
|
if hasattr(self, "fname"):
|
||||||
for item in self.get(self.fname):
|
for item in self.get(self.fname):
|
||||||
if item.get("item_code"):
|
if item.get("item_code"):
|
||||||
args = item.fields.copy()
|
args = item.as_dict()
|
||||||
args.update(self.fields)
|
args.update(self.as_dict())
|
||||||
ret = get_item_details(args)
|
ret = get_item_details(args)
|
||||||
for fieldname, value in ret.items():
|
for fieldname, value in ret.items():
|
||||||
if self.meta.get_field(fieldname, parentfield=self.fname) and \
|
if self.meta.get_field(fieldname, parentfield=self.fname) and \
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ class SellingController(StockController):
|
|||||||
self.set_taxes("other_charges", "taxes_and_charges")
|
self.set_taxes("other_charges", "taxes_and_charges")
|
||||||
|
|
||||||
def set_missing_lead_customer_details(self):
|
def set_missing_lead_customer_details(self):
|
||||||
if self.customer:
|
if getattr(self, "customer", None):
|
||||||
from erpnext.accounts.party import _get_party_details
|
from erpnext.accounts.party import _get_party_details
|
||||||
self.update_if_missing(_get_party_details(self.customer,
|
self.update_if_missing(_get_party_details(self.customer,
|
||||||
ignore_permissions=self.ignore_permissions))
|
ignore_permissions=self.ignore_permissions))
|
||||||
|
|
||||||
elif self.lead:
|
elif getattr(self, "lead", None):
|
||||||
from erpnext.selling.doctype.lead.lead import get_lead_details
|
from erpnext.selling.doctype.lead.lead import get_lead_details
|
||||||
self.update_if_missing(get_lead_details(self.lead))
|
self.update_if_missing(get_lead_details(self.lead))
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ def update_feed(doc, method=None):
|
|||||||
if method in ['on_update', 'on_submit']:
|
if method in ['on_update', 'on_submit']:
|
||||||
subject, color = feed_dict.get(doc.doctype, [None, None])
|
subject, color = feed_dict.get(doc.doctype, [None, None])
|
||||||
if subject:
|
if subject:
|
||||||
make_feed('', doc.doctype, doc.name, doc.owner, subject % doc.fields, color)
|
make_feed('', doc.doctype, doc.name, doc.owner, subject % doc.as_dict(), color)
|
||||||
|
|
||||||
def make_comment_feed(doc, method):
|
def make_comment_feed(doc, method):
|
||||||
"""add comment to feed"""
|
"""add comment to feed"""
|
||||||
|
|||||||
@@ -1 +1,4 @@
|
|||||||
[]
|
[
|
||||||
|
{"doctype":"Department", "department_name":"_Test Department"},
|
||||||
|
{"doctype":"Department", "department_name":"_Test Department 1"}
|
||||||
|
]
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
"icon": "icon-cog",
|
"icon": "icon-cog",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"modified": "2014-02-19 17:40:18.000000",
|
"modified": "2014-02-19 17:40:18.000001",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "HR Settings",
|
"name": "HR Settings",
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class JobsMailbox(POP3Mailbox):
|
|||||||
applicant.ignore_mandatory = True
|
applicant.ignore_mandatory = True
|
||||||
applicant.insert()
|
applicant.insert()
|
||||||
|
|
||||||
mail.save_attachments_in_doc(applicant.doc)
|
mail.save_attachments_in_doc(applicant)
|
||||||
|
|
||||||
_make(content=mail.content, sender=mail.from_email, subject=mail.subject or "No Subject",
|
_make(content=mail.content, sender=mail.from_email, subject=mail.subject or "No Subject",
|
||||||
doctype="Job Applicant", name=applicant.name, sent_or_received="Received")
|
doctype="Job Applicant", name=applicant.name, sent_or_received="Received")
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ class LeaveApplication(DocListController):
|
|||||||
and (from_date between %(from_date)s and %(to_date)s
|
and (from_date between %(from_date)s and %(to_date)s
|
||||||
or to_date between %(from_date)s and %(to_date)s
|
or to_date between %(from_date)s and %(to_date)s
|
||||||
or %(from_date)s between from_date and to_date)
|
or %(from_date)s between from_date and to_date)
|
||||||
and name != %(name)s""", self.fields, as_dict = 1):
|
and name != %(name)s""", self.as_dict(), as_dict = 1):
|
||||||
|
|
||||||
msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : <a href=\"#Form/Leave Application/%s\">%s</a>" % (self.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name'], d['name']), raise_exception = OverlapError)
|
msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : <a href=\"#Form/Leave Application/%s\">%s</a>" % (self.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name'], d['name']), raise_exception = OverlapError)
|
||||||
|
|
||||||
|
|||||||
@@ -129,11 +129,11 @@ class SalaryManager(Document):
|
|||||||
for ss in ss_list:
|
for ss in ss_list:
|
||||||
ss_obj = frappe.get_doc("Salary Slip",ss[0])
|
ss_obj = frappe.get_doc("Salary Slip",ss[0])
|
||||||
try:
|
try:
|
||||||
frappe.db.set(ss_obj.doc, 'email_check', cint(self.send_mail))
|
frappe.db.set(ss_obj, 'email_check', cint(self.send_mail))
|
||||||
if cint(self.send_email) == 1:
|
if cint(self.send_email) == 1:
|
||||||
ss_obj.send_mail_funct()
|
ss_obj.send_mail_funct()
|
||||||
|
|
||||||
frappe.db.set(ss_obj.doc, 'docstatus', 1)
|
frappe.db.set(ss_obj, 'docstatus', 1)
|
||||||
except Exception,e:
|
except Exception,e:
|
||||||
not_submitted_ss.append(ss[0])
|
not_submitted_ss.append(ss[0])
|
||||||
msgprint(e)
|
msgprint(e)
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ def get_item_details(item):
|
|||||||
def make_stock_entry(production_order_id, purpose):
|
def make_stock_entry(production_order_id, purpose):
|
||||||
production_order = frappe.get_doc("Production Order", production_order_id)
|
production_order = frappe.get_doc("Production Order", production_order_id)
|
||||||
|
|
||||||
stock_entry = frappe.new_bean("Stock Entry")
|
stock_entry = frappe.new_doc("Stock Entry")
|
||||||
stock_entry.purpose = purpose
|
stock_entry.purpose = purpose
|
||||||
stock_entry.production_order = production_order_id
|
stock_entry.production_order = production_order_id
|
||||||
stock_entry.company = production_order.company
|
stock_entry.company = production_order.company
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ class TestProductionOrder(unittest.TestCase):
|
|||||||
frappe.db.sql("""delete from `tabBin`""")
|
frappe.db.sql("""delete from `tabBin`""")
|
||||||
frappe.db.sql("""delete from `tabGL Entry`""")
|
frappe.db.sql("""delete from `tabGL Entry`""")
|
||||||
|
|
||||||
pro_bean = frappe.copy_doc(test_records[0])
|
pro_doc = frappe.copy_doc(test_records[0])
|
||||||
pro_bean.insert()
|
pro_doc.insert()
|
||||||
pro_bean.submit()
|
pro_doc.submit()
|
||||||
|
|
||||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import test_records as se_test_records
|
from erpnext.stock.doctype.stock_entry.test_stock_entry import test_records as se_test_records
|
||||||
mr1 = frappe.copy_doc(se_test_records[0])
|
mr1 = frappe.copy_doc(se_test_records[0])
|
||||||
@@ -31,7 +31,7 @@ class TestProductionOrder(unittest.TestCase):
|
|||||||
mr2.insert()
|
mr2.insert()
|
||||||
mr2.submit()
|
mr2.submit()
|
||||||
|
|
||||||
stock_entry = make_stock_entry(pro_bean.name, "Manufacture/Repack")
|
stock_entry = make_stock_entry(pro_doc.name, "Manufacture/Repack")
|
||||||
stock_entry = frappe.get_doc(stock_entry)
|
stock_entry = frappe.get_doc(stock_entry)
|
||||||
stock_entry.fiscal_year = "_Test Fiscal Year 2013"
|
stock_entry.fiscal_year = "_Test Fiscal Year 2013"
|
||||||
stock_entry.fg_completed_qty = 4
|
stock_entry.fg_completed_qty = 4
|
||||||
@@ -40,12 +40,12 @@ class TestProductionOrder(unittest.TestCase):
|
|||||||
stock_entry.run_method("get_items")
|
stock_entry.run_method("get_items")
|
||||||
stock_entry.submit()
|
stock_entry.submit()
|
||||||
|
|
||||||
self.assertEqual(frappe.db.get_value("Production Order", pro_bean.name,
|
self.assertEqual(frappe.db.get_value("Production Order", pro_doc.name,
|
||||||
"produced_qty"), 4)
|
"produced_qty"), 4)
|
||||||
self.assertEqual(frappe.db.get_value("Bin", {"item_code": "_Test FG Item",
|
self.assertEqual(frappe.db.get_value("Bin", {"item_code": "_Test FG Item",
|
||||||
"warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty"), 6)
|
"warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty"), 6)
|
||||||
|
|
||||||
return pro_bean.name
|
return pro_doc.name
|
||||||
|
|
||||||
def test_over_production(self):
|
def test_over_production(self):
|
||||||
from erpnext.stock.doctype.stock_entry.stock_entry import StockOverProductionError
|
from erpnext.stock.doctype.stock_entry.stock_entry import StockOverProductionError
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ class ProductionPlanningTool(Document):
|
|||||||
|
|
||||||
pro_list = []
|
pro_list = []
|
||||||
for key in items:
|
for key in items:
|
||||||
pro = frappe.new_bean("Production Order")
|
pro = frappe.new_doc("Production Order")
|
||||||
pro.update(items[key])
|
pro.update(items[key])
|
||||||
|
|
||||||
frappe.flags.mute_messages = True
|
frappe.flags.mute_messages = True
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ def add_sales_communication(subject, content, sender, real_name, mail=None,
|
|||||||
|
|
||||||
if mail:
|
if mail:
|
||||||
# save attachments to parent if from mail
|
# save attachments to parent if from mail
|
||||||
bean = frappe.get_doc(parent_doctype, parent_name)
|
doc = frappe.get_doc(parent_doctype, parent_name)
|
||||||
mail.save_attachments_in_doc(bean.doc)
|
mail.save_attachments_in_doc(doc)
|
||||||
|
|
||||||
class SalesMailbox(POP3Mailbox):
|
class SalesMailbox(POP3Mailbox):
|
||||||
def setup(self, args=None):
|
def setup(self, args=None):
|
||||||
|
|||||||
@@ -42,8 +42,7 @@ class Lead(SellingController):
|
|||||||
"owner": self.lead_owner,
|
"owner": self.lead_owner,
|
||||||
"subject": ('Contact ' + cstr(self.lead_name)),
|
"subject": ('Contact ' + cstr(self.lead_name)),
|
||||||
"description": ('Contact ' + cstr(self.lead_name)) + \
|
"description": ('Contact ' + cstr(self.lead_name)) + \
|
||||||
(self.contact_by and ('. By : ' + cstr(self.contact_by)) or '') + \
|
(self.contact_by and ('. By : ' + cstr(self.contact_by)) or '')
|
||||||
(self.remark and ('.To Discuss : ' + cstr(self.remark)) or '')
|
|
||||||
}, force)
|
}, force)
|
||||||
|
|
||||||
def check_email_id_is_unique(self):
|
def check_email_id_is_unique(self):
|
||||||
@@ -117,7 +116,7 @@ def make_opportunity(source_name, target_doc=None):
|
|||||||
}
|
}
|
||||||
}}, target_doc)
|
}}, target_doc)
|
||||||
|
|
||||||
return [d if isinstance(d, dict) else d.fields for d in doclist]
|
return doclist
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_lead_details(lead):
|
def get_lead_details(lead):
|
||||||
@@ -126,8 +125,8 @@ def get_lead_details(lead):
|
|||||||
from erpnext.accounts.party import set_address_details
|
from erpnext.accounts.party import set_address_details
|
||||||
out = frappe._dict()
|
out = frappe._dict()
|
||||||
|
|
||||||
lead_bean = frappe.get_doc("Lead", lead)
|
lead_doc = frappe.get_doc("Lead", lead)
|
||||||
lead = lead_bean.doc
|
lead = lead_doc
|
||||||
|
|
||||||
out.update({
|
out.update({
|
||||||
"territory": lead.territory,
|
"territory": lead.territory,
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
test_records = frappe.get_test_records('Lead')
|
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
test_records = frappe.get_test_records('Lead')
|
||||||
|
|
||||||
class TestLead(unittest.TestCase):
|
class TestLead(unittest.TestCase):
|
||||||
def test_make_customer(self):
|
def test_make_customer(self):
|
||||||
print "test_make_customer"
|
print "test_make_customer"
|
||||||
|
|||||||
@@ -253,8 +253,8 @@ class SalesOrder(SellingController):
|
|||||||
return "order" if self.docstatus==1 else None
|
return "order" if self.docstatus==1 else None
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.run_method("onload_post_render")
|
doc.run_method("onload_post_render")
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_material_request(source_name, target_doc=None):
|
def make_material_request(source_name, target_doc=None):
|
||||||
@@ -277,7 +277,7 @@ def make_material_request(source_name, target_doc=None):
|
|||||||
}
|
}
|
||||||
}, target_doc, postprocess)
|
}, target_doc, postprocess)
|
||||||
|
|
||||||
return [(d if isinstance(d, dict) else d.fields) for d in doclist]
|
return doclist
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_delivery_note(source_name, target_doc=None):
|
def make_delivery_note(source_name, target_doc=None):
|
||||||
@@ -322,9 +322,9 @@ def make_delivery_note(source_name, target_doc=None):
|
|||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_sales_invoice(source_name, target_doc=None):
|
def make_sales_invoice(source_name, target_doc=None):
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.is_pos = 0
|
doc.is_pos = 0
|
||||||
bean.run_method("onload_post_render")
|
doc.run_method("onload_post_render")
|
||||||
|
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(obj, target, source_parent):
|
||||||
target.amount = flt(obj.amount) - flt(obj.billed_amt)
|
target.amount = flt(obj.amount) - flt(obj.billed_amt)
|
||||||
|
|||||||
@@ -281,21 +281,20 @@ class TestSalesOrder(unittest.TestCase):
|
|||||||
|
|
||||||
def test_warehouse_user(self):
|
def test_warehouse_user(self):
|
||||||
frappe.defaults.add_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", "Restriction")
|
frappe.defaults.add_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", "Restriction")
|
||||||
frappe.get_doc("User", "test@example.com").get_controller()\
|
frappe.get_doc("User", "test@example.com")\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
|
|
||||||
frappe.get_doc("User", "test2@example.com").get_controller()\
|
frappe.get_doc("User", "test2@example.com")\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
|
|
||||||
frappe.set_user("test@example.com")
|
frappe.set_user("test@example.com")
|
||||||
|
|
||||||
from frappe.model.bean import BeanPermissionError
|
|
||||||
so = frappe.copy_doc(test_records[0])
|
so = frappe.copy_doc(test_records[0])
|
||||||
so.company = "_Test Company 1"
|
so.company = "_Test Company 1"
|
||||||
so.conversion_rate = 0.02
|
so.conversion_rate = 0.02
|
||||||
so.plc_conversion_rate = 0.02
|
so.plc_conversion_rate = 0.02
|
||||||
so.doclist[1].warehouse = "_Test Warehouse 2 - _TC1"
|
so.doclist[1].warehouse = "_Test Warehouse 2 - _TC1"
|
||||||
self.assertRaises(BeanPermissionError, so.insert)
|
self.assertRaises(frappe.PermissionError, so.insert)
|
||||||
|
|
||||||
frappe.set_user("test2@example.com")
|
frappe.set_user("test2@example.com")
|
||||||
so.insert()
|
so.insert()
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ class Company(Document):
|
|||||||
"title": self.name + " Home",
|
"title": self.name + " Home",
|
||||||
"published": 1,
|
"published": 1,
|
||||||
"description": "Standard Home Page for " + self.name,
|
"description": "Standard Home Page for " + self.name,
|
||||||
"main_section": webfile.read() % self.fields
|
"main_section": webfile.read() % self.as_dict()
|
||||||
}).insert()
|
}).insert()
|
||||||
|
|
||||||
# update in home page in settings
|
# update in home page in settings
|
||||||
@@ -163,12 +163,12 @@ class Company(Document):
|
|||||||
]
|
]
|
||||||
for cc in cc_list:
|
for cc in cc_list:
|
||||||
cc.update({"doctype": "Cost Center"})
|
cc.update({"doctype": "Cost Center"})
|
||||||
cc_bean = frappe.get_doc(cc)
|
cc_doc = frappe.get_doc(cc)
|
||||||
cc_bean.ignore_permissions = True
|
cc_doc.ignore_permissions = True
|
||||||
|
|
||||||
if cc.get("cost_center_name") == self.name:
|
if cc.get("cost_center_name") == self.name:
|
||||||
cc_bean.ignore_mandatory = True
|
cc_doc.ignore_mandatory = True
|
||||||
cc_bean.insert()
|
cc_doc.insert()
|
||||||
|
|
||||||
frappe.db.set(self, "cost_center", "Main - " + self.abbr)
|
frappe.db.set(self, "cost_center", "Main - " + self.abbr)
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class TestCompany(unittest.TestCase):
|
|||||||
print "Country: ", country
|
print "Country: ", country
|
||||||
print "Chart Name: ", chart_name
|
print "Chart Name: ", chart_name
|
||||||
|
|
||||||
company_bean = frappe.get_doc({
|
company_doc = frappe.get_doc({
|
||||||
"doctype": "Company",
|
"doctype": "Company",
|
||||||
"company_name": "_Test Company 2",
|
"company_name": "_Test Company 2",
|
||||||
"abbr": "_TC2",
|
"abbr": "_TC2",
|
||||||
@@ -22,7 +22,7 @@ class TestCompany(unittest.TestCase):
|
|||||||
"chart_of_accounts": chart_name
|
"chart_of_accounts": chart_name
|
||||||
})
|
})
|
||||||
|
|
||||||
company_bean.insert()
|
company_doc.insert()
|
||||||
self.assertTrue(frappe.db.sql("""select count(*) from tabAccount
|
self.assertTrue(frappe.db.sql("""select count(*) from tabAccount
|
||||||
where company='_Test Company 2'""")[0][0] > 10)
|
where company='_Test Company 2'""")[0][0] > 10)
|
||||||
|
|
||||||
|
|||||||
@@ -60,13 +60,13 @@ class GlobalDefaults(Document):
|
|||||||
raise_exception=1)
|
raise_exception=1)
|
||||||
|
|
||||||
def update_control_panel(self):
|
def update_control_panel(self):
|
||||||
cp_bean = frappe.get_doc("Control Panel")
|
cp_doc = frappe.get_doc("Control Panel")
|
||||||
if self.country:
|
if self.country:
|
||||||
cp_bean.country = self.country
|
cp_doc.country = self.country
|
||||||
if self.time_zone:
|
if self.time_zone:
|
||||||
cp_bean.time_zone = self.time_zone
|
cp_doc.time_zone = self.time_zone
|
||||||
cp_bean.ignore_permissions = True
|
cp_doc.ignore_permissions = True
|
||||||
cp_bean.save()
|
cp_doc.save()
|
||||||
|
|
||||||
def get_defaults(self):
|
def get_defaults(self):
|
||||||
return frappe.defaults.get_defaults()
|
return frappe.defaults.get_defaults()
|
||||||
|
|||||||
@@ -183,9 +183,9 @@ class TestItem(unittest.TestCase):
|
|||||||
for name in frappe.db.sql_list("""select name from `tabItem Group`
|
for name in frappe.db.sql_list("""select name from `tabItem Group`
|
||||||
where parent_item_group='_Test Item Group C'"""):
|
where parent_item_group='_Test Item Group C'"""):
|
||||||
|
|
||||||
bean = frappe.get_doc("Item Group", name)
|
doc = frappe.get_doc("Item Group", name)
|
||||||
bean.parent_item_group = "_Test Item Group B"
|
doc.parent_item_group = "_Test Item Group B"
|
||||||
bean.save()
|
doc.save()
|
||||||
|
|
||||||
self.test_basic_tree()
|
self.test_basic_tree()
|
||||||
|
|
||||||
|
|||||||
@@ -169,6 +169,6 @@ def set_by_naming_series(doctype, fieldname, naming_series, hide_name_field=True
|
|||||||
ifnull({fieldname}, '')=''""".format(doctype=doctype, fieldname=fieldname))
|
ifnull({fieldname}, '')=''""".format(doctype=doctype, fieldname=fieldname))
|
||||||
|
|
||||||
def get_default_naming_series(doctype):
|
def get_default_naming_series(doctype):
|
||||||
naming_series = frappe.model.get_meta(doctype).get_field("naming_series").options or ""
|
naming_series = frappe.get_meta(doctype).get_field("naming_series").options or ""
|
||||||
naming_series = naming_series.split("\n")
|
naming_series = naming_series.split("\n")
|
||||||
return naming_series[0] or naming_series[1]
|
return naming_series[0] or naming_series[1]
|
||||||
@@ -139,7 +139,7 @@ def feature_setup():
|
|||||||
def set_single_defaults():
|
def set_single_defaults():
|
||||||
for dt in frappe.db.sql_list("""select name from `tabDocType` where issingle=1"""):
|
for dt in frappe.db.sql_list("""select name from `tabDocType` where issingle=1"""):
|
||||||
default_values = frappe.db.sql("""select fieldname, `default` from `tabDocField`
|
default_values = frappe.db.sql("""select fieldname, `default` from `tabDocField`
|
||||||
where parent=%s""", dt, as_dict=True)
|
where parent=%s""", dt)
|
||||||
if default_values:
|
if default_values:
|
||||||
try:
|
try:
|
||||||
b = frappe.get_doc(dt, dt)
|
b = frappe.get_doc(dt, dt)
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ def create_email_digest():
|
|||||||
|
|
||||||
# scheduler errors digest
|
# scheduler errors digest
|
||||||
if companies:
|
if companies:
|
||||||
edigest = frappe.new_bean("Email Digest")
|
edigest = frappe.new_doc("Email Digest")
|
||||||
edigest.update({
|
edigest.update({
|
||||||
"name": "Scheduler Errors",
|
"name": "Scheduler Errors",
|
||||||
"company": companies[0],
|
"company": companies[0],
|
||||||
|
|||||||
@@ -222,9 +222,8 @@ class DeliveryNote(SellingController):
|
|||||||
AND docstatus = 1""", self.name)
|
AND docstatus = 1""", self.name)
|
||||||
|
|
||||||
if res:
|
if res:
|
||||||
from frappe.model.bean import Bean
|
|
||||||
for r in res:
|
for r in res:
|
||||||
ps = Bean(dt='Packing Slip', dn=r[0])
|
ps = frappe.get_doc('Packing Slip', r[0])
|
||||||
ps.cancel()
|
ps.cancel()
|
||||||
frappe.msgprint(_("Packing Slip(s) Cancelled"))
|
frappe.msgprint(_("Packing Slip(s) Cancelled"))
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import frappe
|
|||||||
class TestItem(unittest.TestCase):
|
class TestItem(unittest.TestCase):
|
||||||
def test_duplicate_item(self):
|
def test_duplicate_item(self):
|
||||||
from erpnext.stock.doctype.item_price.item_price import ItemPriceDuplicateItem
|
from erpnext.stock.doctype.item_price.item_price import ItemPriceDuplicateItem
|
||||||
bean = frappe.copy_doc(test_records[0])
|
doc = frappe.copy_doc(test_records[0])
|
||||||
self.assertRaises(ItemPriceDuplicateItem, bean.insert)
|
self.assertRaises(ItemPriceDuplicateItem, doc.insert)
|
||||||
|
|
||||||
test_records = frappe.get_test_records('Item Price')
|
test_records = frappe.get_test_records('Item Price')
|
||||||
@@ -34,13 +34,13 @@ class LandedCostWizard(Document):
|
|||||||
total_amt = self.get_total_pr_amt(purchase_receipts)
|
total_amt = self.get_total_pr_amt(purchase_receipts)
|
||||||
|
|
||||||
for pr in purchase_receipts:
|
for pr in purchase_receipts:
|
||||||
pr_bean = frappe.get_doc('Purchase Receipt', pr)
|
pr_doc = frappe.get_doc('Purchase Receipt', pr)
|
||||||
pr_items = pr_bean.get("purchase_tax_details")
|
pr_items = pr_doc.get("purchase_tax_details")
|
||||||
|
|
||||||
for lc in self.get("landed_cost_details"):
|
for lc in self.get("landed_cost_details"):
|
||||||
amt = flt(lc.amount) * flt(pr_bean.net_total)/ flt(total_amt)
|
amt = flt(lc.amount) * flt(pr_doc.net_total)/ flt(total_amt)
|
||||||
|
|
||||||
matched_row = pr_bean.get("other_charges", {
|
matched_row = pr_doc.get("other_charges", {
|
||||||
"category": "Valuation",
|
"category": "Valuation",
|
||||||
"add_deduct_tax": "Add",
|
"add_deduct_tax": "Add",
|
||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
@@ -48,7 +48,7 @@ class LandedCostWizard(Document):
|
|||||||
})
|
})
|
||||||
|
|
||||||
if not matched_row: # add if not exists
|
if not matched_row: # add if not exists
|
||||||
ch = pr_bean.append("other_charges")
|
ch = pr_doc.append("other_charges")
|
||||||
ch.category = 'Valuation'
|
ch.category = 'Valuation'
|
||||||
ch.add_deduct_tax = 'Add'
|
ch.add_deduct_tax = 'Add'
|
||||||
ch.charge_type = 'Actual'
|
ch.charge_type = 'Actual'
|
||||||
@@ -64,8 +64,8 @@ class LandedCostWizard(Document):
|
|||||||
matched_row[0].tax_amount = amt
|
matched_row[0].tax_amount = amt
|
||||||
matched_row[0].cost_center = lc.cost_center
|
matched_row[0].cost_center = lc.cost_center
|
||||||
|
|
||||||
pr_bean.run_method("validate")
|
pr_doc.run_method("validate")
|
||||||
for d in pr_bean.get_all_children():
|
for d in pr_doc.get_all_children():
|
||||||
d.db_update()
|
d.db_update()
|
||||||
|
|
||||||
def get_total_pr_amt(self, purchase_receipts):
|
def get_total_pr_amt(self, purchase_receipts):
|
||||||
@@ -75,9 +75,9 @@ class LandedCostWizard(Document):
|
|||||||
|
|
||||||
def cancel_pr(self, purchase_receipts):
|
def cancel_pr(self, purchase_receipts):
|
||||||
for pr in purchase_receipts:
|
for pr in purchase_receipts:
|
||||||
pr_bean = frappe.get_doc("Purchase Receipt", pr)
|
pr_doc = frappe.get_doc("Purchase Receipt", pr)
|
||||||
|
|
||||||
pr_bean.run_method("update_ordered_qty")
|
pr_doc.run_method("update_ordered_qty")
|
||||||
|
|
||||||
frappe.db.sql("""delete from `tabStock Ledger Entry`
|
frappe.db.sql("""delete from `tabStock Ledger Entry`
|
||||||
where voucher_type='Purchase Receipt' and voucher_no=%s""", pr)
|
where voucher_type='Purchase Receipt' and voucher_no=%s""", pr)
|
||||||
@@ -86,7 +86,7 @@ class LandedCostWizard(Document):
|
|||||||
|
|
||||||
def submit_pr(self, purchase_receipts):
|
def submit_pr(self, purchase_receipts):
|
||||||
for pr in purchase_receipts:
|
for pr in purchase_receipts:
|
||||||
pr_bean = frappe.get_doc("Purchase Receipt", pr)
|
pr_doc = frappe.get_doc("Purchase Receipt", pr)
|
||||||
pr_bean.run_method("update_ordered_qty")
|
pr_doc.run_method("update_ordered_qty")
|
||||||
pr_bean.run_method("update_stock")
|
pr_doc.run_method("update_stock")
|
||||||
pr_bean.run_method("make_gl_entries")
|
pr_doc.run_method("make_gl_entries")
|
||||||
@@ -165,11 +165,11 @@ class MaterialRequest(BuyingController):
|
|||||||
self.per_ordered = flt((per_ordered / flt(len(item_doclist))) * 100.0, 2)
|
self.per_ordered = flt((per_ordered / flt(len(item_doclist))) * 100.0, 2)
|
||||||
frappe.db.set_value(self.doctype, self.name, "per_ordered", self.per_ordered)
|
frappe.db.set_value(self.doctype, self.name, "per_ordered", self.per_ordered)
|
||||||
|
|
||||||
def update_completed_qty(bean, method):
|
def update_completed_qty(doc, method):
|
||||||
if bean.doctype == "Stock Entry":
|
if doc.doctype == "Stock Entry":
|
||||||
material_request_map = {}
|
material_request_map = {}
|
||||||
|
|
||||||
for d in bean.get("mtn_details"):
|
for d in doc.get("mtn_details"):
|
||||||
if d.material_request:
|
if d.material_request:
|
||||||
material_request_map.setdefault(d.material_request, []).append(d.material_request_item)
|
material_request_map.setdefault(d.material_request, []).append(d.material_request_item)
|
||||||
|
|
||||||
@@ -182,17 +182,17 @@ def update_completed_qty(bean, method):
|
|||||||
+ _(mr_doctype.get_label("status")) + " = %s. " % _(mr_obj.status)
|
+ _(mr_doctype.get_label("status")) + " = %s. " % _(mr_obj.status)
|
||||||
+ _("Cannot continue."), exc=frappe.InvalidStatusError)
|
+ _("Cannot continue."), exc=frappe.InvalidStatusError)
|
||||||
|
|
||||||
_update_requested_qty(bean, mr_obj, mr_items)
|
_update_requested_qty(doc, mr_obj, mr_items)
|
||||||
|
|
||||||
# update ordered percentage and qty
|
# update ordered percentage and qty
|
||||||
mr_obj.update_completed_qty(mr_items)
|
mr_obj.update_completed_qty(mr_items)
|
||||||
|
|
||||||
def _update_requested_qty(bean, mr_obj, mr_items):
|
def _update_requested_qty(doc, mr_obj, mr_items):
|
||||||
"""update requested qty (before ordered_qty is updated)"""
|
"""update requested qty (before ordered_qty is updated)"""
|
||||||
from erpnext.stock.utils import update_bin
|
from erpnext.stock.utils import update_bin
|
||||||
for mr_item_name in mr_items:
|
for mr_item_name in mr_items:
|
||||||
mr_item = mr_obj.get("indent_details", {"name": mr_item_name})
|
mr_item = mr_obj.get("indent_details", {"name": mr_item_name})
|
||||||
se_detail = bean.get("mtn_details", {"material_request": mr_obj.name,
|
se_detail = doc.get("mtn_details", {"material_request": mr_obj.name,
|
||||||
"material_request_item": mr_item_name})
|
"material_request_item": mr_item_name})
|
||||||
|
|
||||||
if mr_item and se_detail:
|
if mr_item and se_detail:
|
||||||
@@ -215,7 +215,7 @@ def _update_requested_qty(bean, mr_obj, mr_items):
|
|||||||
"item_code": se_detail.item_code,
|
"item_code": se_detail.item_code,
|
||||||
"warehouse": se_detail.t_warehouse,
|
"warehouse": se_detail.t_warehouse,
|
||||||
"indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty,
|
"indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty,
|
||||||
"posting_date": bean.posting_date,
|
"posting_date": doc.posting_date,
|
||||||
})
|
})
|
||||||
|
|
||||||
def set_missing_values(source, target_doc):
|
def set_missing_values(source, target_doc):
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class PackingSlip(Document):
|
|||||||
(from_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
|
(from_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
|
||||||
OR to_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
|
OR to_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
|
||||||
OR %(from_case_no)s BETWEEN from_case_no AND to_case_no)
|
OR %(from_case_no)s BETWEEN from_case_no AND to_case_no)
|
||||||
""", self.fields)
|
""", self.as_dict())
|
||||||
|
|
||||||
if res:
|
if res:
|
||||||
frappe.msgprint(_("""Case No(s) already in use. Please rectify and try again.
|
frappe.msgprint(_("""Case No(s) already in use. Please rectify and try again.
|
||||||
@@ -145,7 +145,7 @@ class PackingSlip(Document):
|
|||||||
note
|
note
|
||||||
"""
|
"""
|
||||||
recommended_case_no = frappe.db.sql("""SELECT MAX(to_case_no) FROM `tabPacking Slip`
|
recommended_case_no = frappe.db.sql("""SELECT MAX(to_case_no) FROM `tabPacking Slip`
|
||||||
WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.fields)
|
WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.as_dict())
|
||||||
|
|
||||||
return cint(recommended_case_no[0][0]) + 1
|
return cint(recommended_case_no[0][0]) + 1
|
||||||
|
|
||||||
|
|||||||
@@ -298,8 +298,8 @@ def make_purchase_invoice(source_name, target_doc=None):
|
|||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
bean = frappe.get_doc(target)
|
doc = frappe.get_doc(target)
|
||||||
bean.run_method("set_missing_values")
|
doc.run_method("set_missing_values")
|
||||||
|
|
||||||
doclist = get_mapped_doc("Purchase Receipt", source_name, {
|
doclist = get_mapped_doc("Purchase Receipt", source_name, {
|
||||||
"Purchase Receipt": {
|
"Purchase Receipt": {
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ def get_serial_nos(serial_no):
|
|||||||
if s.strip()]
|
if s.strip()]
|
||||||
|
|
||||||
def make_serial_no(serial_no, sle):
|
def make_serial_no(serial_no, sle):
|
||||||
sr = frappe.new_bean("Serial No")
|
sr = frappe.new_doc("Serial No")
|
||||||
sr.serial_no = serial_no
|
sr.serial_no = serial_no
|
||||||
sr.item_code = sle.item_code
|
sr.item_code = sle.item_code
|
||||||
sr.warehouse = None
|
sr.warehouse = None
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from erpnext.stock.doctype.serial_no.serial_no import *
|
|||||||
|
|
||||||
class TestSerialNo(unittest.TestCase):
|
class TestSerialNo(unittest.TestCase):
|
||||||
def test_cannot_create_direct(self):
|
def test_cannot_create_direct(self):
|
||||||
sr = frappe.new_bean("Serial No")
|
sr = frappe.new_doc("Serial No")
|
||||||
sr.item_code = "_Test Serialized Item"
|
sr.item_code = "_Test Serialized Item"
|
||||||
sr.warehouse = "_Test Warehouse - _TC"
|
sr.warehouse = "_Test Warehouse - _TC"
|
||||||
sr.serial_no = "_TCSER0001"
|
sr.serial_no = "_TCSER0001"
|
||||||
|
|||||||
@@ -325,41 +325,41 @@ class StockEntry(StockController):
|
|||||||
self.make_sl_entries(sl_entries, self.amended_from and 'Yes' or 'No')
|
self.make_sl_entries(sl_entries, self.amended_from and 'Yes' or 'No')
|
||||||
|
|
||||||
def update_production_order(self):
|
def update_production_order(self):
|
||||||
def _validate_production_order(pro_bean):
|
def _validate_production_order(pro_doc):
|
||||||
if flt(pro_bean.docstatus) != 1:
|
if flt(pro_doc.docstatus) != 1:
|
||||||
frappe.throw(_("Production Order must be submitted") + ": " +
|
frappe.throw(_("Production Order must be submitted") + ": " +
|
||||||
self.production_order)
|
self.production_order)
|
||||||
|
|
||||||
if pro_bean.status == 'Stopped':
|
if pro_doc.status == 'Stopped':
|
||||||
msgprint(_("Transaction not allowed against stopped Production Order") + ": " +
|
msgprint(_("Transaction not allowed against stopped Production Order") + ": " +
|
||||||
self.production_order)
|
self.production_order)
|
||||||
|
|
||||||
if self.production_order:
|
if self.production_order:
|
||||||
pro_bean = frappe.get_doc("Production Order", self.production_order)
|
pro_doc = frappe.get_doc("Production Order", self.production_order)
|
||||||
_validate_production_order(pro_bean)
|
_validate_production_order(pro_doc)
|
||||||
self.update_produced_qty(pro_bean)
|
self.update_produced_qty(pro_doc)
|
||||||
if self.purpose == "Manufacture/Repack":
|
if self.purpose == "Manufacture/Repack":
|
||||||
self.update_planned_qty(pro_bean)
|
self.update_planned_qty(pro_doc)
|
||||||
|
|
||||||
def update_produced_qty(self, pro_bean):
|
def update_produced_qty(self, pro_doc):
|
||||||
if self.purpose == "Manufacture/Repack":
|
if self.purpose == "Manufacture/Repack":
|
||||||
produced_qty = flt(pro_bean.produced_qty) + \
|
produced_qty = flt(pro_doc.produced_qty) + \
|
||||||
(self.docstatus==1 and 1 or -1 ) * flt(self.fg_completed_qty)
|
(self.docstatus==1 and 1 or -1 ) * flt(self.fg_completed_qty)
|
||||||
|
|
||||||
if produced_qty > flt(pro_bean.qty):
|
if produced_qty > flt(pro_doc.qty):
|
||||||
frappe.throw(_("Production Order") + ": " + self.production_order + "\n" +
|
frappe.throw(_("Production Order") + ": " + self.production_order + "\n" +
|
||||||
_("Total Manufactured Qty can not be greater than Planned qty to manufacture")
|
_("Total Manufactured Qty can not be greater than Planned qty to manufacture")
|
||||||
+ "(%s/%s)" % (produced_qty, flt(pro_bean.qty)), StockOverProductionError)
|
+ "(%s/%s)" % (produced_qty, flt(pro_doc.qty)), StockOverProductionError)
|
||||||
|
|
||||||
status = 'Completed' if flt(produced_qty) >= flt(pro_bean.qty) else 'In Process'
|
status = 'Completed' if flt(produced_qty) >= flt(pro_doc.qty) else 'In Process'
|
||||||
frappe.db.sql("""update `tabProduction Order` set status=%s, produced_qty=%s
|
frappe.db.sql("""update `tabProduction Order` set status=%s, produced_qty=%s
|
||||||
where name=%s""", (status, produced_qty, self.production_order))
|
where name=%s""", (status, produced_qty, self.production_order))
|
||||||
|
|
||||||
def update_planned_qty(self, pro_bean):
|
def update_planned_qty(self, pro_doc):
|
||||||
from erpnext.stock.utils import update_bin
|
from erpnext.stock.utils import update_bin
|
||||||
update_bin({
|
update_bin({
|
||||||
"item_code": pro_bean.production_item,
|
"item_code": pro_doc.production_item,
|
||||||
"warehouse": pro_bean.fg_warehouse,
|
"warehouse": pro_doc.fg_warehouse,
|
||||||
"posting_date": self.posting_date,
|
"posting_date": self.posting_date,
|
||||||
"planned_qty": (self.docstatus==1 and -1 or 1 ) * flt(self.fg_completed_qty)
|
"planned_qty": (self.docstatus==1 and -1 or 1 ) * flt(self.fg_completed_qty)
|
||||||
})
|
})
|
||||||
@@ -725,7 +725,7 @@ def get_return_doc_and_details(args):
|
|||||||
for fieldname, val in return_map[args["purpose"]].items():
|
for fieldname, val in return_map[args["purpose"]].items():
|
||||||
if args.get(fieldname):
|
if args.get(fieldname):
|
||||||
ref.fieldname = fieldname
|
ref.fieldname = fieldname
|
||||||
ref.doc = frappe.get_doc(val[0], args[fieldname])
|
ref.doc = frappe.get_doc(val[0], args.get(fieldname))
|
||||||
ref.parentfields = val[1]
|
ref.parentfields = val[1]
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -748,7 +748,7 @@ def make_return_jv(stock_entry):
|
|||||||
if not se.purpose in ["Sales Return", "Purchase Return"]:
|
if not se.purpose in ["Sales Return", "Purchase Return"]:
|
||||||
return
|
return
|
||||||
|
|
||||||
ref = get_return_doc_and_details(se.fields)
|
ref = get_return_doc_and_details(se)
|
||||||
|
|
||||||
if ref.doc.doctype == "Delivery Note":
|
if ref.doc.doctype == "Delivery Note":
|
||||||
result = make_return_jv_from_delivery_note(se, ref)
|
result = make_return_jv_from_delivery_note(se, ref)
|
||||||
|
|||||||
@@ -765,7 +765,7 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
def test_warehouse_company_validation(self):
|
def test_warehouse_company_validation(self):
|
||||||
set_perpetual_inventory(0)
|
set_perpetual_inventory(0)
|
||||||
self._clear_stock_account_balance()
|
self._clear_stock_account_balance()
|
||||||
frappe.get_doc("User", "test2@example.com").get_controller()\
|
frappe.get_doc("User", "test2@example.com")\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
frappe.set_user("test2@example.com")
|
frappe.set_user("test2@example.com")
|
||||||
|
|
||||||
@@ -778,21 +778,20 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
# permission tests
|
# permission tests
|
||||||
def test_warehouse_user(self):
|
def test_warehouse_user(self):
|
||||||
import frappe.defaults
|
import frappe.defaults
|
||||||
from frappe.model.bean import BeanPermissionError
|
|
||||||
set_perpetual_inventory(0)
|
set_perpetual_inventory(0)
|
||||||
|
|
||||||
frappe.defaults.add_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", "Restriction")
|
frappe.defaults.add_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", "Restriction")
|
||||||
frappe.defaults.add_default("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com", "Restriction")
|
frappe.defaults.add_default("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com", "Restriction")
|
||||||
frappe.get_doc("User", "test@example.com").get_controller()\
|
frappe.get_doc("User", "test@example.com")\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
frappe.get_doc("User", "test2@example.com").get_controller()\
|
frappe.get_doc("User", "test2@example.com")\
|
||||||
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
|
||||||
|
|
||||||
frappe.set_user("test@example.com")
|
frappe.set_user("test@example.com")
|
||||||
st1 = frappe.copy_doc(test_records[0])
|
st1 = frappe.copy_doc(test_records[0])
|
||||||
st1.company = "_Test Company 1"
|
st1.company = "_Test Company 1"
|
||||||
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
|
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
|
||||||
self.assertRaises(BeanPermissionError, st1.insert)
|
self.assertRaises(frappe.PermissionError, st1.insert)
|
||||||
|
|
||||||
frappe.set_user("test2@example.com")
|
frappe.set_user("test2@example.com")
|
||||||
st1 = frappe.copy_doc(test_records[0])
|
st1 = frappe.copy_doc(test_records[0])
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class StockLedgerEntry(DocListController):
|
|||||||
frappe.throw("""Not enough quantity (requested: %(actual_qty)s, \
|
frappe.throw("""Not enough quantity (requested: %(actual_qty)s, \
|
||||||
current: %(batch_bal)s in Batch <b>%(batch_no)s</b> for Item \
|
current: %(batch_bal)s in Batch <b>%(batch_no)s</b> for Item \
|
||||||
<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
|
<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
|
||||||
as on %(posting_date)s %(posting_time)s""" % self.fields)
|
as on %(posting_date)s %(posting_time)s""" % self.as_dict())
|
||||||
|
|
||||||
self.pop('batch_bal')
|
self.pop('batch_bal')
|
||||||
|
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ class StockUOMReplaceUtility(Document):
|
|||||||
raise Exception
|
raise Exception
|
||||||
|
|
||||||
def update_item_master(self):
|
def update_item_master(self):
|
||||||
item_bean = frappe.get_doc("Item", self.item_code)
|
item_doc = frappe.get_doc("Item", self.item_code)
|
||||||
item_bean.stock_uom = self.new_stock_uom
|
item_doc.stock_uom = self.new_stock_uom
|
||||||
item_bean.save()
|
item_doc.save()
|
||||||
|
|
||||||
msgprint(_("Default UOM updated in item ") + self.item_code)
|
msgprint(_("Default UOM updated in item ") + self.item_code)
|
||||||
|
|
||||||
|
|||||||
@@ -22,15 +22,15 @@ class Warehouse(Document):
|
|||||||
self.update_parent_account()
|
self.update_parent_account()
|
||||||
|
|
||||||
def update_parent_account(self):
|
def update_parent_account(self):
|
||||||
if not self.__islocal and (self.create_account_under !=
|
if not getattr(self, "__islocal", None) and (self.create_account_under !=
|
||||||
frappe.db.get_value("Warehouse", self.name, "create_account_under")):
|
frappe.db.get_value("Warehouse", self.name, "create_account_under")):
|
||||||
warehouse_account = frappe.db.get_value("Account",
|
warehouse_account = frappe.db.get_value("Account",
|
||||||
{"account_type": "Warehouse", "company": self.company,
|
{"account_type": "Warehouse", "company": self.company,
|
||||||
"master_name": self.name}, ["name", "parent_account"])
|
"master_name": self.name}, ["name", "parent_account"])
|
||||||
if warehouse_account and warehouse_account[1] != self.create_account_under:
|
if warehouse_account and warehouse_account[1] != self.create_account_under:
|
||||||
acc_bean = frappe.get_doc("Account", warehouse_account[0])
|
acc_doc = frappe.get_doc("Account", warehouse_account[0])
|
||||||
acc_bean.parent_account = self.create_account_under
|
acc_doc.parent_account = self.create_account_under
|
||||||
acc_bean.save()
|
acc_doc.save()
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
self.create_account_head()
|
self.create_account_head()
|
||||||
@@ -43,7 +43,7 @@ class Warehouse(Document):
|
|||||||
if self.get("__islocal") or not frappe.db.get_value(
|
if self.get("__islocal") or not frappe.db.get_value(
|
||||||
"Stock Ledger Entry", {"warehouse": self.name}):
|
"Stock Ledger Entry", {"warehouse": self.name}):
|
||||||
self.validate_parent_account()
|
self.validate_parent_account()
|
||||||
ac_bean = frappe.get_doc({
|
ac_doc = frappe.get_doc({
|
||||||
"doctype": "Account",
|
"doctype": "Account",
|
||||||
'account_name': self.warehouse_name,
|
'account_name': self.warehouse_name,
|
||||||
'parent_account': self.create_account_under,
|
'parent_account': self.create_account_under,
|
||||||
@@ -53,10 +53,10 @@ class Warehouse(Document):
|
|||||||
"master_name": self.name,
|
"master_name": self.name,
|
||||||
"freeze_account": "No"
|
"freeze_account": "No"
|
||||||
})
|
})
|
||||||
ac_bean.ignore_permissions = True
|
ac_doc.ignore_permissions = True
|
||||||
ac_bean.insert()
|
ac_doc.insert()
|
||||||
|
|
||||||
msgprint(_("Account Head") + ": " + ac_bean.name + _(" created"))
|
msgprint(_("Account Head") + ": " + ac_doc.name + _(" created"))
|
||||||
|
|
||||||
def validate_parent_account(self):
|
def validate_parent_account(self):
|
||||||
if not self.create_account_under:
|
if not self.create_account_under:
|
||||||
|
|||||||
@@ -46,20 +46,20 @@ def get_item_details(args):
|
|||||||
elif not args.item_code and args.serial_no:
|
elif not args.item_code and args.serial_no:
|
||||||
args.item_code = get_item_code(serial_no=args.serial_no)
|
args.item_code = get_item_code(serial_no=args.serial_no)
|
||||||
|
|
||||||
item_bean = frappe.get_doc("Item", args.item_code)
|
item_doc = frappe.get_doc("Item", args.item_code)
|
||||||
item = item_bean.doc
|
item = item_doc
|
||||||
|
|
||||||
validate_item_details(args, item)
|
validate_item_details(args, item)
|
||||||
|
|
||||||
out = get_basic_details(args, item_bean)
|
out = get_basic_details(args, item_doc)
|
||||||
|
|
||||||
get_party_item_code(args, item_bean, out)
|
get_party_item_code(args, item_doc, out)
|
||||||
|
|
||||||
if out.get("warehouse"):
|
if out.get("warehouse"):
|
||||||
out.update(get_available_qty(args.item_code, out.warehouse))
|
out.update(get_available_qty(args.item_code, out.warehouse))
|
||||||
out.update(get_projected_qty(item.name, out.warehouse))
|
out.update(get_projected_qty(item.name, out.warehouse))
|
||||||
|
|
||||||
get_price_list_rate(args, item_bean, out)
|
get_price_list_rate(args, item_doc, out)
|
||||||
|
|
||||||
if args.transaction_type == "selling" and cint(args.is_pos):
|
if args.transaction_type == "selling" and cint(args.is_pos):
|
||||||
out.update(get_pos_settings_item_details(args.company, args))
|
out.update(get_pos_settings_item_details(args.company, args))
|
||||||
@@ -67,8 +67,8 @@ def get_item_details(args):
|
|||||||
apply_pricing_rule(out, args)
|
apply_pricing_rule(out, args)
|
||||||
|
|
||||||
if args.get("doctype") in ("Sales Invoice", "Delivery Note"):
|
if args.get("doctype") in ("Sales Invoice", "Delivery Note"):
|
||||||
if item_bean.has_serial_no == "Yes" and not args.serial_no:
|
if item_doc.has_serial_no == "Yes" and not args.serial_no:
|
||||||
out.serial_no = get_serial_nos_by_fifo(args, item_bean)
|
out.serial_no = get_serial_nos_by_fifo(args, item_doc)
|
||||||
|
|
||||||
if args.transaction_date and item.lead_time_days:
|
if args.transaction_date and item.lead_time_days:
|
||||||
out.schedule_date = out.lead_time_date = add_days(args.transaction_date,
|
out.schedule_date = out.lead_time_date = add_days(args.transaction_date,
|
||||||
@@ -116,8 +116,8 @@ def validate_item_details(args, item):
|
|||||||
_("not a sub-contracted item.") +
|
_("not a sub-contracted item.") +
|
||||||
_("Please select a sub-contracted item or do not sub-contract the transaction."))
|
_("Please select a sub-contracted item or do not sub-contract the transaction."))
|
||||||
|
|
||||||
def get_basic_details(args, item_bean):
|
def get_basic_details(args, item_doc):
|
||||||
item = item_bean.doc
|
item = item_doc
|
||||||
|
|
||||||
from frappe.defaults import get_user_default_as_list
|
from frappe.defaults import get_user_default_as_list
|
||||||
user_default_warehouse_list = get_user_default_as_list('warehouse')
|
user_default_warehouse_list = get_user_default_as_list('warehouse')
|
||||||
@@ -137,7 +137,7 @@ def get_basic_details(args, item_bean):
|
|||||||
if args.transaction_type == "selling" else item.buying_cost_center,
|
if args.transaction_type == "selling" else item.buying_cost_center,
|
||||||
"batch_no": None,
|
"batch_no": None,
|
||||||
"item_tax_rate": json.dumps(dict(([d.tax_type, d.tax_rate] for d in
|
"item_tax_rate": json.dumps(dict(([d.tax_type, d.tax_rate] for d in
|
||||||
item_bean.get("item_tax")))),
|
item_doc.get("item_tax")))),
|
||||||
"uom": item.stock_uom,
|
"uom": item.stock_uom,
|
||||||
"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
|
"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
|
||||||
"conversion_factor": 1.0,
|
"conversion_factor": 1.0,
|
||||||
@@ -156,7 +156,7 @@ def get_basic_details(args, item_bean):
|
|||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def get_price_list_rate(args, item_bean, out):
|
def get_price_list_rate(args, item_doc, out):
|
||||||
meta = frappe.get_meta(args.doctype)
|
meta = frappe.get_meta(args.doctype)
|
||||||
|
|
||||||
if meta.get_field("currency"):
|
if meta.get_field("currency"):
|
||||||
@@ -173,7 +173,7 @@ def get_price_list_rate(args, item_bean, out):
|
|||||||
|
|
||||||
if not out.price_list_rate and args.transaction_type == "buying":
|
if not out.price_list_rate and args.transaction_type == "buying":
|
||||||
from erpnext.stock.doctype.item.item import get_last_purchase_details
|
from erpnext.stock.doctype.item.item import get_last_purchase_details
|
||||||
out.update(get_last_purchase_details(item_bean.name,
|
out.update(get_last_purchase_details(item_doc.name,
|
||||||
args.docname, args.conversion_rate))
|
args.docname, args.conversion_rate))
|
||||||
|
|
||||||
def validate_price_list(args):
|
def validate_price_list(args):
|
||||||
@@ -207,12 +207,12 @@ def validate_conversion_rate(args, meta):
|
|||||||
get_field_precision(meta.get_field("plc_conversion_rate"),
|
get_field_precision(meta.get_field("plc_conversion_rate"),
|
||||||
frappe._dict({"fields": args})))
|
frappe._dict({"fields": args})))
|
||||||
|
|
||||||
def get_party_item_code(args, item_bean, out):
|
def get_party_item_code(args, item_doc, out):
|
||||||
if args.transaction_type == "selling":
|
if args.transaction_type == "selling":
|
||||||
customer_item_code = item_bean.get("item_customer_details", {"customer_name": args.customer})
|
customer_item_code = item_doc.get("item_customer_details", {"customer_name": args.customer})
|
||||||
out.customer_item_code = customer_item_code[0].ref_code if customer_item_code else None
|
out.customer_item_code = customer_item_code[0].ref_code if customer_item_code else None
|
||||||
else:
|
else:
|
||||||
item_supplier = item_bean.get({"item_supplier_details", {"supplier": args.supplier})
|
item_supplier = item_doc.get("item_supplier_details", {"supplier": args.supplier})
|
||||||
out.supplier_part_no = item_supplier[0].supplier_part_no if item_supplier else None
|
out.supplier_part_no = item_supplier[0].supplier_part_no if item_supplier else None
|
||||||
|
|
||||||
|
|
||||||
@@ -351,7 +351,7 @@ def apply_internal_priority(pricing_rules, field_set, args_dict):
|
|||||||
|
|
||||||
return filtered_rules or pricing_rules
|
return filtered_rules or pricing_rules
|
||||||
|
|
||||||
def get_serial_nos_by_fifo(args, item_bean):
|
def get_serial_nos_by_fifo(args, item_doc):
|
||||||
return "\n".join(frappe.db.sql_list("""select name from `tabSerial No`
|
return "\n".join(frappe.db.sql_list("""select name from `tabSerial No`
|
||||||
where item_code=%(item_code)s and warehouse=%(warehouse)s and status='Available'
|
where item_code=%(item_code)s and warehouse=%(warehouse)s and status='Available'
|
||||||
order by timestamp(purchase_date, purchase_time) asc limit %(qty)s""", {
|
order by timestamp(purchase_date, purchase_time) asc limit %(qty)s""", {
|
||||||
|
|||||||
@@ -261,10 +261,10 @@ def create_material_request(material_requests):
|
|||||||
"brand": item.brand,
|
"brand": item.brand,
|
||||||
})
|
})
|
||||||
|
|
||||||
mr_bean = frappe.get_doc(mr)
|
mr_doc = frappe.get_doc(mr)
|
||||||
mr_bean.insert()
|
mr_doc.insert()
|
||||||
mr_bean.submit()
|
mr_doc.submit()
|
||||||
mr_list.append(mr_bean)
|
mr_list.append(mr_doc)
|
||||||
|
|
||||||
except:
|
except:
|
||||||
if frappe.local.message_log:
|
if frappe.local.message_log:
|
||||||
|
|||||||
@@ -203,9 +203,9 @@ class MaintenanceSchedule(TransactionBase):
|
|||||||
|
|
||||||
def update_amc_date(self, serial_nos, amc_expiry_date=None):
|
def update_amc_date(self, serial_nos, amc_expiry_date=None):
|
||||||
for serial_no in serial_nos:
|
for serial_no in serial_nos:
|
||||||
serial_no_bean = frappe.get_doc("Serial No", serial_no)
|
serial_no_doc = frappe.get_doc("Serial No", serial_no)
|
||||||
serial_no_bean.amc_expiry_date = amc_expiry_date
|
serial_no_doc.amc_expiry_date = amc_expiry_date
|
||||||
serial_no_bean.save()
|
serial_no_doc.save()
|
||||||
|
|
||||||
def validate_serial_no(self, serial_nos, amc_start_date):
|
def validate_serial_no(self, serial_nos, amc_start_date):
|
||||||
for serial_no in serial_nos:
|
for serial_no in serial_nos:
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class SupportMailbox(POP3Mailbox):
|
|||||||
|
|
||||||
if new_ticket and cint(self.email_settings.send_autoreply) and \
|
if new_ticket and cint(self.email_settings.send_autoreply) and \
|
||||||
"mailer-daemon" not in mail.from_email.lower():
|
"mailer-daemon" not in mail.from_email.lower():
|
||||||
self.send_auto_reply(ticket.doc)
|
self.send_auto_reply(ticket)
|
||||||
|
|
||||||
def send_auto_reply(self, d):
|
def send_auto_reply(self, d):
|
||||||
signature = self.email_settings.get('support_signature') or ''
|
signature = self.email_settings.get('support_signature') or ''
|
||||||
@@ -80,6 +80,6 @@ def add_support_communication(subject, content, sender, docname=None, mail=None)
|
|||||||
date=mail.date if mail else today(), sent_or_received="Received")
|
date=mail.date if mail else today(), sent_or_received="Received")
|
||||||
|
|
||||||
if mail:
|
if mail:
|
||||||
mail.save_attachments_in_doc(ticket.doc)
|
mail.save_attachments_in_doc(ticket)
|
||||||
|
|
||||||
return ticket
|
return ticket
|
||||||
Reference in New Issue
Block a user