Merge remote-tracking branch 'frappe/develop' into wip-4.1
This commit is contained in:
commit
861747ec26
10
.travis.yml
10
.travis.yml
@ -14,9 +14,13 @@ install:
|
||||
- sudo apt-get update
|
||||
- sudo apt-get purge -y mysql-common
|
||||
- sudo apt-get install mariadb-server mariadb-common libmariadbclient-dev
|
||||
- CFLAGS=-O0 pip install git+https://github.com/frappe/frappe.git@develop &&
|
||||
- CFLAGS=-O0 pip install git+https://github.com/frappe/frappe.git@$TRAVIS_BRANCH &&
|
||||
- pip install --editable .
|
||||
|
||||
before_script:
|
||||
- mysql -e 'create database test_frappe'
|
||||
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root
|
||||
|
||||
script:
|
||||
- cd ./test_sites/
|
||||
- frappe --use test_site
|
||||
@ -25,7 +29,3 @@ script:
|
||||
- frappe -b
|
||||
- frappe --serve_test &
|
||||
- frappe --verbose --run_tests --app erpnext
|
||||
|
||||
before_script:
|
||||
- mysql -e 'create database test_frappe'
|
||||
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root
|
||||
|
@ -91,7 +91,7 @@
|
||||
"label": "Account Type",
|
||||
"oldfieldname": "account_type",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment",
|
||||
"options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock",
|
||||
"permlevel": 0,
|
||||
"search_index": 0
|
||||
},
|
||||
@ -210,7 +210,7 @@
|
||||
"icon": "icon-money",
|
||||
"idx": 1,
|
||||
"in_create": 1,
|
||||
"modified": "2014-06-03 18:27:58.109303",
|
||||
"modified": "2014-06-19 18:27:58.109303",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Account",
|
||||
|
@ -113,7 +113,7 @@
|
||||
"label": "Voucher Type",
|
||||
"oldfieldname": "voucher_type",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "Journal Voucher\nSales Invoice\nPurchase Invoice",
|
||||
"options": "Journal Voucher\nSales Invoice\nPurchase Invoice\nPeriod Closing Voucher\nPurchase Receipt\nDelivery Note\nStock Entry\nStock Reconciliation",
|
||||
"permlevel": 0,
|
||||
"search_index": 0
|
||||
},
|
||||
@ -186,7 +186,7 @@
|
||||
"icon": "icon-list",
|
||||
"idx": 1,
|
||||
"in_create": 1,
|
||||
"modified": "2014-06-09 01:51:29.340077",
|
||||
"modified": "2014-06-19 01:51:29.340077",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "GL Entry",
|
||||
|
@ -186,9 +186,14 @@ class JournalVoucher(AccountsController):
|
||||
|
||||
def set_print_format_fields(self):
|
||||
for d in self.get('entries'):
|
||||
account_type, master_type = frappe.db.get_value("Account", d.account,
|
||||
result = frappe.db.get_value("Account", d.account,
|
||||
["account_type", "master_type"])
|
||||
|
||||
if not result:
|
||||
continue
|
||||
|
||||
account_type, master_type = result
|
||||
|
||||
if master_type in ['Supplier', 'Customer']:
|
||||
if not self.pay_to_recd_from:
|
||||
self.pay_to_recd_from = frappe.db.get_value(master_type,
|
||||
|
@ -42,7 +42,7 @@
|
||||
],
|
||||
"fiscal_year": "_Test Fiscal Year 2013",
|
||||
"grand_total_import": 0,
|
||||
"naming_series": "BILL",
|
||||
"naming_series": "_T-BILL",
|
||||
"other_charges": [
|
||||
{
|
||||
"account_head": "_Test Account Shipping Charges - _TC",
|
||||
|
@ -12,13 +12,14 @@ from erpnext.utilities.doctype.contact.contact import get_contact_details
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_party_details(party=None, account=None, party_type="Customer", company=None,
|
||||
posting_date=None, price_list=None, currency=None):
|
||||
posting_date=None, price_list=None, currency=None, doctype=None):
|
||||
|
||||
return _get_party_details(party, account, party_type, company, posting_date, price_list, currency)
|
||||
return _get_party_details(party, account, party_type,
|
||||
company, posting_date, price_list, currency, doctype)
|
||||
|
||||
def _get_party_details(party=None, account=None, party_type="Customer", company=None,
|
||||
posting_date=None, price_list=None, currency=None, ignore_permissions=False):
|
||||
out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date))
|
||||
posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False):
|
||||
out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, doctype))
|
||||
|
||||
party = out[party_type.lower()]
|
||||
|
||||
@ -106,8 +107,8 @@ def set_price_list(out, party, party_type, given_price_list):
|
||||
out["selling_price_list" if party.doctype=="Customer" else "buying_price_list"] = price_list
|
||||
|
||||
|
||||
def set_account_and_due_date(party, account, party_type, company, posting_date):
|
||||
if not posting_date:
|
||||
def set_account_and_due_date(party, account, party_type, company, posting_date, doctype):
|
||||
if doctype not in ["Sales Invoice", "Purchase Invoice"]:
|
||||
# not an invoice
|
||||
return {
|
||||
party_type.lower(): party
|
||||
|
@ -9,6 +9,7 @@
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Feed Type",
|
||||
"options": "\nComment\nLogin",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
@ -48,7 +49,7 @@
|
||||
],
|
||||
"icon": "icon-rss",
|
||||
"idx": 1,
|
||||
"modified": "2014-05-27 03:49:10.882587",
|
||||
"modified": "2014-06-18 03:49:10.882587",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Home",
|
||||
"name": "Feed",
|
||||
|
@ -24,17 +24,19 @@ def execute(filters=None):
|
||||
else:
|
||||
fiscal_years = frappe.db.sql_list("select name from `tabFiscal Year` order by name desc")
|
||||
|
||||
employee_names = [d.name for d in employees]
|
||||
|
||||
allocations = frappe.db.sql("""select employee, fiscal_year, leave_type, total_leaves_allocated
|
||||
from `tabLeave Allocation`
|
||||
where docstatus=1 and employee in (%s)""" %
|
||||
','.join(['%s']*len(employees)), employees, as_dict=True)
|
||||
','.join(['%s']*len(employee_names)), employee_names, as_dict=True)
|
||||
|
||||
applications = frappe.db.sql("""select employee, fiscal_year, leave_type,
|
||||
SUM(total_leave_days) as leaves
|
||||
from `tabLeave Application`
|
||||
where status="Approved" and docstatus = 1 and employee in (%s)
|
||||
group by employee, fiscal_year, leave_type""" %
|
||||
','.join(['%s']*len(employees)), employees, as_dict=True)
|
||||
','.join(['%s']*len(employee_names)), employee_names, as_dict=True)
|
||||
|
||||
columns = [
|
||||
"Fiscal Year", "Employee:Link/Employee:150", "Employee Name::200", "Department::150"
|
||||
|
@ -13,7 +13,7 @@
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"default": "PRO",
|
||||
"default": "PRO-",
|
||||
"fieldname": "naming_series",
|
||||
"fieldtype": "Select",
|
||||
"label": "Series",
|
||||
|
@ -25,6 +25,7 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
||||
|
||||
args.currency = frm.doc.currency;
|
||||
args.company = frm.doc.company;
|
||||
args.doctype = frm.doc.doctype;
|
||||
frappe.call({
|
||||
method: method,
|
||||
args: args,
|
||||
|
@ -16,7 +16,7 @@
|
||||
"doctype": "Lead",
|
||||
"email_id": "test_lead2@example.com",
|
||||
"lead_name": "_Test Lead 2",
|
||||
"status": "Contacted"
|
||||
"status": "Lead"
|
||||
},
|
||||
{
|
||||
"doctype": "Lead",
|
||||
|
@ -279,13 +279,9 @@ def make_delivery_note(source_name, target_doc=None):
|
||||
target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate)
|
||||
target.qty = flt(source.qty) - flt(source.delivered_qty)
|
||||
|
||||
doclist = get_mapped_doc("Sales Order", source_name, {
|
||||
target_doc = get_mapped_doc("Sales Order", source_name, {
|
||||
"Sales Order": {
|
||||
"doctype": "Delivery Note",
|
||||
"field_map": {
|
||||
"shipping_address": "address_display",
|
||||
"shipping_address_name": "customer_address",
|
||||
},
|
||||
"validation": {
|
||||
"docstatus": ["=", 1]
|
||||
}
|
||||
@ -310,7 +306,7 @@ def make_delivery_note(source_name, target_doc=None):
|
||||
}
|
||||
}, target_doc, set_missing_values)
|
||||
|
||||
return doclist
|
||||
return target_doc
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_sales_invoice(source_name, target_doc=None):
|
||||
|
@ -51,14 +51,14 @@
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Number Format",
|
||||
"options": "\n#,###.##\n#.###,##\n# ###.##\n#,###.###\n#,##,###.##\n#.###\n#,###",
|
||||
"options": "\n#,###.##\n#.###,##\n# ###.##\n# ###,##\n#'###.##\n#, ###.##\n#,##,###.##\n#,###.###\n#.###\n#,###",
|
||||
"permlevel": 0
|
||||
}
|
||||
],
|
||||
"icon": "icon-bitcoin",
|
||||
"idx": 1,
|
||||
"in_create": 0,
|
||||
"modified": "2014-05-27 03:49:09.038451",
|
||||
"modified": "2014-06-18 03:49:09.038451",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Setup",
|
||||
"name": "Currency",
|
||||
|
@ -17,8 +17,5 @@ def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, c
|
||||
company_currency = frappe.db.get_value("Company", company, "default_currency")
|
||||
|
||||
if not conversion_rate:
|
||||
throw(_('%(conversion_rate_label)s is mandatory. Maybe Currency Exchange record is not created for %(from_currency)s to %(to_currency)s') % {
|
||||
"conversion_rate_label": conversion_rate_label,
|
||||
"from_currency": currency,
|
||||
"to_currency": company_currency
|
||||
})
|
||||
throw(_("{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.").format(
|
||||
conversion_rate_label, currency, company_currency))
|
||||
|
@ -278,13 +278,16 @@ def get_serial_nos(serial_no):
|
||||
|
||||
def make_serial_no(serial_no, sle):
|
||||
sr = frappe.new_doc("Serial No")
|
||||
sr.warehouse = None
|
||||
sr.dont_update_if_missing.append("warehouse")
|
||||
sr.ignore_permissions = True
|
||||
|
||||
sr.serial_no = serial_no
|
||||
sr.item_code = sle.item_code
|
||||
sr.warehouse = None
|
||||
sr.company = sle.company
|
||||
sr.via_stock_ledger = True
|
||||
sr.insert()
|
||||
|
||||
sr.warehouse = sle.warehouse
|
||||
sr.status = "Available"
|
||||
sr.save()
|
||||
|
@ -241,14 +241,14 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
|
||||
customer: function() {
|
||||
return this.frm.call({
|
||||
method: "erpnext.accounts.party.get_party_details",
|
||||
args: { party: this.frm.doc.customer, party_type:"Customer" }
|
||||
args: { party: this.frm.doc.customer, party_type:"Customer", doctype: this.frm.doc.doctype }
|
||||
});
|
||||
},
|
||||
|
||||
supplier: function() {
|
||||
return this.frm.call({
|
||||
method: "erpnext.accounts.party.get_party_details",
|
||||
args: { party: this.frm.doc.supplier, party_type:"Supplier" }
|
||||
args: { party: this.frm.doc.supplier, party_type:"Supplier", doctype: this.frm.doc.doctype }
|
||||
});
|
||||
},
|
||||
|
||||
@ -359,16 +359,17 @@ cur_frm.cscript.item_code = function(doc, cdt, cdn) {
|
||||
|
||||
cur_frm.cscript.s_warehouse = function(doc, cdt, cdn) {
|
||||
var d = locals[cdt][cdn];
|
||||
args = {
|
||||
'item_code' : d.item_code,
|
||||
'warehouse' : cstr(d.s_warehouse) || cstr(d.t_warehouse),
|
||||
'transfer_qty' : d.transfer_qty,
|
||||
'serial_no' : d.serial_no,
|
||||
'bom_no' : d.bom_no,
|
||||
'qty' : d.s_warehouse ? -1* d.qty : d.qty
|
||||
if(!d.bom_no) {
|
||||
args = {
|
||||
'item_code' : d.item_code,
|
||||
'warehouse' : cstr(d.s_warehouse) || cstr(d.t_warehouse),
|
||||
'transfer_qty' : d.transfer_qty,
|
||||
'serial_no' : d.serial_no,
|
||||
'qty' : d.s_warehouse ? -1* d.qty : d.qty
|
||||
}
|
||||
return get_server_fields('get_warehouse_details', JSON.stringify(args),
|
||||
'mtn_details', doc, cdt, cdn, 1);
|
||||
}
|
||||
return get_server_fields('get_warehouse_details', JSON.stringify(args),
|
||||
'mtn_details', doc, cdt, cdn, 1);
|
||||
}
|
||||
|
||||
cur_frm.cscript.t_warehouse = cur_frm.cscript.s_warehouse;
|
||||
|
@ -228,7 +228,7 @@ class StockEntry(StockController):
|
||||
raw_material_cost += flt(d.amount)
|
||||
|
||||
# set incoming rate for fg item
|
||||
if self.production_order and self.purpose == "Manufacture/Repack":
|
||||
if self.purpose == "Manufacture/Repack":
|
||||
for d in self.get("mtn_details"):
|
||||
if d.bom_no:
|
||||
if not flt(d.incoming_rate):
|
||||
@ -239,29 +239,25 @@ class StockEntry(StockController):
|
||||
|
||||
def get_incoming_rate(self, args):
|
||||
incoming_rate = 0
|
||||
if self.purpose == "Sales Return" and \
|
||||
(self.delivery_note_no or self.sales_invoice_no):
|
||||
sle = frappe.db.sql("""select name, posting_date, posting_time,
|
||||
actual_qty, stock_value, warehouse from `tabStock Ledger Entry`
|
||||
where voucher_type = %s and voucher_no = %s and
|
||||
item_code = %s limit 1""",
|
||||
((self.delivery_note_no and "Delivery Note" or "Sales Invoice"),
|
||||
self.delivery_note_no or self.sales_invoice_no, args.item_code), as_dict=1)
|
||||
if sle:
|
||||
args.update({
|
||||
"posting_date": sle[0].posting_date,
|
||||
"posting_time": sle[0].posting_time,
|
||||
"sle": sle[0].name,
|
||||
"warehouse": sle[0].warehouse,
|
||||
})
|
||||
previous_sle = get_previous_sle(args)
|
||||
incoming_rate = (flt(sle[0].stock_value) - flt(previous_sle.get("stock_value"))) / \
|
||||
flt(sle[0].actual_qty)
|
||||
if self.purpose == "Sales Return":
|
||||
incoming_rate = self.get_incoming_rate_for_sales_return(args)
|
||||
else:
|
||||
incoming_rate = get_incoming_rate(args)
|
||||
|
||||
return incoming_rate
|
||||
|
||||
def get_incoming_rate_for_sales_return(self, args):
|
||||
incoming_rate = 0.0
|
||||
if (self.delivery_note_no or self.sales_invoice_no) and args.get("item_code"):
|
||||
incoming_rate = frappe.db.sql("""select abs(ifnull(stock_value_difference, 0) / actual_qty)
|
||||
from `tabStock Ledger Entry`
|
||||
where voucher_type = %s and voucher_no = %s and item_code = %s limit 1""",
|
||||
((self.delivery_note_no and "Delivery Note" or "Sales Invoice"),
|
||||
self.delivery_note_no or self.sales_invoice_no, args.item_code))
|
||||
incoming_rate = incoming_rate[0][0] if incoming_rate else 0.0
|
||||
|
||||
return incoming_rate
|
||||
|
||||
def validate_incoming_rate(self):
|
||||
for d in self.get('mtn_details'):
|
||||
if d.t_warehouse:
|
||||
|
@ -229,7 +229,7 @@ def get_pos_settings_item_details(company, args, pos_settings=None):
|
||||
|
||||
if pos_settings:
|
||||
for fieldname in ("income_account", "cost_center", "warehouse", "expense_account"):
|
||||
if not args.get(fieldname):
|
||||
if not args.get(fieldname) and pos_settings.get(fieldname):
|
||||
res[fieldname] = pos_settings.get(fieldname)
|
||||
|
||||
if res.get("warehouse"):
|
||||
|
@ -125,7 +125,7 @@ def create_lead(email_id):
|
||||
"doctype": "Lead",
|
||||
"email_id": email_id,
|
||||
"lead_name": real_name or email_id,
|
||||
"status": "Contacted",
|
||||
"status": "Lead",
|
||||
"naming_series": get_default_naming_series("Lead"),
|
||||
"company": frappe.db.get_default("company"),
|
||||
"source": "Email"
|
||||
|
Loading…
x
Reference in New Issue
Block a user