Merge branch 'develop' of https://github.com/frappe/erpnext into develop
This commit is contained in:
commit
036bf6de6e
@ -64,4 +64,10 @@ jobs:
|
|||||||
- bench execute erpnext.setup.utils.enable_all_roles_and_domains
|
- bench execute erpnext.setup.utils.enable_all_roles_and_domains
|
||||||
- bench run-ui-tests --app erpnext
|
- bench run-ui-tests --app erpnext
|
||||||
env: Client Side Test
|
env: Client Side Test
|
||||||
|
- # stage
|
||||||
|
script:
|
||||||
|
- wget http://build.erpnext.com/20171108_190013_955977f8_database.sql.gz
|
||||||
|
- bench --force restore ~/frappe-bench/20171108_190013_955977f8_database.sql.gz --mariadb-root-password travis
|
||||||
|
- bench migrate
|
||||||
|
env: Patch Testing
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
'target_field': 'ordered_qty',
|
'target_field': 'ordered_qty',
|
||||||
'target_parent_dt': 'Material Request',
|
'target_parent_dt': 'Material Request',
|
||||||
'target_parent_field': 'per_ordered',
|
'target_parent_field': 'per_ordered',
|
||||||
'target_ref_field': 'qty',
|
'target_ref_field': 'stock_qty',
|
||||||
'source_field': 'stock_qty',
|
'source_field': 'stock_qty',
|
||||||
'percent_join_field': 'material_request',
|
'percent_join_field': 'material_request',
|
||||||
'overflow_type': 'order'
|
'overflow_type': 'order'
|
||||||
|
@ -334,6 +334,7 @@ execute:frappe.reload_doctype('Employee') #2016-10-18
|
|||||||
execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ")
|
execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ")
|
||||||
execute:frappe.reload_doctype("Salary Slip")
|
execute:frappe.reload_doctype("Salary Slip")
|
||||||
execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation")
|
execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation")
|
||||||
|
execute:frappe.reload_doc("stock", "doctype", "stock_settings")
|
||||||
erpnext.patches.v8_0.create_domain_docs #16-05-2017
|
erpnext.patches.v8_0.create_domain_docs #16-05-2017
|
||||||
erpnext.patches.v7_1.update_portal_roles
|
erpnext.patches.v7_1.update_portal_roles
|
||||||
erpnext.patches.v7_1.set_total_amount_currency_in_je
|
erpnext.patches.v7_1.set_total_amount_currency_in_je
|
||||||
@ -467,3 +468,4 @@ erpnext.patches.v9_2.delete_healthcare_domain_default_items
|
|||||||
erpnext.patches.v9_1.create_issue_opportunity_type
|
erpnext.patches.v9_1.create_issue_opportunity_type
|
||||||
erpnext.patches.v9_2.rename_translated_domains_in_en
|
erpnext.patches.v9_2.rename_translated_domains_in_en
|
||||||
erpnext.patches.v9_0.set_shipping_type_for_existing_shipping_rules
|
erpnext.patches.v9_0.set_shipping_type_for_existing_shipping_rules
|
||||||
|
erpnext.patches.v9_0.update_multi_uom_fields_in_material_request
|
@ -7,7 +7,9 @@ import frappe
|
|||||||
def execute():
|
def execute():
|
||||||
doctype = 'POS Profile'
|
doctype = 'POS Profile'
|
||||||
frappe.reload_doc('accounts', 'doctype', doctype)
|
frappe.reload_doc('accounts', 'doctype', doctype)
|
||||||
frappe.reload_doc('accounts', 'doctype', 'POS Profile User')
|
frappe.reload_doc('accounts', 'doctype', 'pos_profile_user')
|
||||||
|
frappe.reload_doc('accounts', 'doctype', 'pos_item_group')
|
||||||
|
frappe.reload_doc('accounts', 'doctype', 'pos_customer_group')
|
||||||
|
|
||||||
for doc in frappe.get_all(doctype):
|
for doc in frappe.get_all(doctype):
|
||||||
_doc = frappe.get_doc(doctype, doc.name)
|
_doc = frappe.get_doc(doctype, doc.name)
|
||||||
@ -19,4 +21,7 @@ def execute():
|
|||||||
'user': user
|
'user': user
|
||||||
})
|
})
|
||||||
_doc.pos_profile_name = user + ' - ' + _doc.company
|
_doc.pos_profile_name = user + ' - ' + _doc.company
|
||||||
|
_doc.flags.ignore_validate = True
|
||||||
|
_doc.flags.ignore_mandatory = True
|
||||||
_doc.save()
|
_doc.save()
|
||||||
|
|
||||||
|
@ -5,8 +5,8 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
frappe.reload_doc('schools', 'doctype', 'Student Admission Program')
|
frappe.reload_doc('schools', 'doctype', 'student_admission_program')
|
||||||
frappe.reload_doctype('Student Admission')
|
frappe.reload_doc('schools', 'doctype', 'student_admission')
|
||||||
|
|
||||||
if "program" not in frappe.db.get_table_columns("Student Admission"):
|
if "program" not in frappe.db.get_table_columns("Student Admission"):
|
||||||
return
|
return
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
# Copyright (c) 2017, Frappe and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doctype('Material Request')
|
||||||
|
frappe.reload_doctype('Material Request Item')
|
||||||
|
|
||||||
|
frappe.db.sql(""" update `tabMaterial Request Item`
|
||||||
|
set stock_uom = uom, stock_qty = qty, conversion_factor = 1.0""")
|
@ -233,7 +233,7 @@ def add_node():
|
|||||||
})
|
})
|
||||||
args = make_tree_args(**args)
|
args = make_tree_args(**args)
|
||||||
|
|
||||||
if args.parent_task == 'task':
|
if args.parent_task == 'All Tasks':
|
||||||
args.parent_task = None
|
args.parent_task = None
|
||||||
|
|
||||||
frappe.get_doc(args).insert()
|
frappe.get_doc(args).insert()
|
||||||
|
@ -654,7 +654,10 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
|||||||
item.stock_qty = flt(item.qty * item.conversion_factor, precision("stock_qty", item));
|
item.stock_qty = flt(item.qty * item.conversion_factor, precision("stock_qty", item));
|
||||||
refresh_field("stock_qty", item.name, item.parentfield);
|
refresh_field("stock_qty", item.name, item.parentfield);
|
||||||
this.toggle_conversion_factor(item);
|
this.toggle_conversion_factor(item);
|
||||||
if(!dont_fetch_price_list_rate) this.apply_price_list(item, true);
|
if (!dont_fetch_price_list_rate &&
|
||||||
|
frappe.meta.has_field(doc.doctype, "price_list_currency")) {
|
||||||
|
this.apply_price_list(item, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,20 +1,39 @@
|
|||||||
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
cur_frm.add_fetch("student_group", "program", "program");
|
|
||||||
cur_frm.add_fetch("student_group", "course", "course");
|
|
||||||
cur_frm.add_fetch("student_group", "academic_year", "academic_year");
|
|
||||||
cur_frm.add_fetch("student_group", "academic_term", "academic_term");
|
|
||||||
|
|
||||||
frappe.ui.form.on("Course Scheduling Tool", {
|
frappe.ui.form.on('Course Scheduling Tool', {
|
||||||
|
setup(frm) {
|
||||||
refresh: function(frm) {
|
frm.add_fetch('student_group', 'program', 'program');
|
||||||
|
frm.add_fetch('student_group', 'course', 'course');
|
||||||
|
frm.add_fetch('student_group', 'academic_year', 'academic_year');
|
||||||
|
frm.add_fetch('student_group', 'academic_term', 'academic_term');
|
||||||
|
},
|
||||||
|
refresh(frm) {
|
||||||
frm.disable_save();
|
frm.disable_save();
|
||||||
frm.page.set_primary_action(__("Schedule Course"), function() {
|
frm.page.set_primary_action(__('Schedule Course'), () => {
|
||||||
frappe.call({
|
frm.call('schedule_course')
|
||||||
method: "schedule_course",
|
.then(r => {
|
||||||
doc: frm.doc
|
if (!r.message) {
|
||||||
})
|
frappe.throw(__('There were errors creating Course Schedule'));
|
||||||
|
}
|
||||||
|
const { course_schedules } = r.message;
|
||||||
|
if (course_schedules) {
|
||||||
|
const html = `
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<caption>${__('Following course schedules were created')}</caption>
|
||||||
|
<thead><tr><th>${__("Course")}</th><th>${__("Date")}</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
${course_schedules.map(
|
||||||
|
c => `<tr><td><a href="#Form/Course Schedule/${c.name}">${c.name}</a></td>
|
||||||
|
<td>${c.schedule_date}</td></tr>`
|
||||||
|
).join('')}
|
||||||
|
</tbody>
|
||||||
|
</table>`
|
||||||
|
|
||||||
|
frappe.msgprint(html);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
@ -476,7 +476,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "rechedule",
|
"fieldname": "reschedule",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
@ -485,7 +485,7 @@
|
|||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Rechedule",
|
"label": "Reschedule",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@ -602,7 +602,7 @@
|
|||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": 0,
|
"menu_index": 0,
|
||||||
"modified": "2017-06-30 08:21:47.696063",
|
"modified": "2017-11-21 16:47:58.091740",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Schools",
|
"module": "Schools",
|
||||||
"name": "Course Scheduling Tool",
|
"name": "Course Scheduling Tool",
|
||||||
|
@ -10,71 +10,85 @@ from frappe.model.document import Document
|
|||||||
from frappe.utils import add_days, getdate
|
from frappe.utils import add_days, getdate
|
||||||
from erpnext.schools.utils import OverlapError
|
from erpnext.schools.utils import OverlapError
|
||||||
|
|
||||||
|
|
||||||
class CourseSchedulingTool(Document):
|
class CourseSchedulingTool(Document):
|
||||||
|
|
||||||
def schedule_course(self):
|
def schedule_course(self):
|
||||||
"""Creates course schedules as per specified parametes"""
|
"""Creates course schedules as per specified parameters"""
|
||||||
|
|
||||||
course_schedules= []
|
course_schedules = []
|
||||||
course_schedules_errors= []
|
course_schedules_errors = []
|
||||||
rescheduled= []
|
rescheduled = []
|
||||||
reschedule_errors= []
|
reschedule_errors = []
|
||||||
|
|
||||||
self.validate_mandatory()
|
self.validate_mandatory()
|
||||||
self.validate_date()
|
self.validate_date()
|
||||||
self.instructor_name= frappe.db.get_value("Instructor", self.instructor, "instructor_name")
|
self.instructor_name = frappe.db.get_value(
|
||||||
|
"Instructor", self.instructor, "instructor_name")
|
||||||
|
|
||||||
|
group_based_on, course = frappe.db.get_value(
|
||||||
|
"Student Group", self.student_group, ["group_based_on", "course"])
|
||||||
|
|
||||||
group_based_on, course = frappe.db.get_value("Student Group", self.student_group, ["group_based_on", "course"])
|
|
||||||
if group_based_on == "Course":
|
if group_based_on == "Course":
|
||||||
self.course = course
|
self.course = course
|
||||||
|
|
||||||
|
if self.reschedule:
|
||||||
|
rescheduled, reschedule_errors = self.delete_course_schedule(
|
||||||
|
rescheduled, reschedule_errors)
|
||||||
|
|
||||||
if self.rechedule:
|
|
||||||
rescheduled, reschedule_errors = self.delete_course_schedule(rescheduled, reschedule_errors)
|
|
||||||
|
|
||||||
date = self.course_start_date
|
date = self.course_start_date
|
||||||
while(date < self.course_end_date):
|
while date < self.course_end_date:
|
||||||
if self.day == calendar.day_name[getdate(date).weekday()]:
|
if self.day == calendar.day_name[getdate(date).weekday()]:
|
||||||
course_schedule = self.make_course_schedule(date)
|
course_schedule = self.make_course_schedule(date)
|
||||||
try:
|
try:
|
||||||
|
print('pass')
|
||||||
course_schedule.save()
|
course_schedule.save()
|
||||||
except OverlapError:
|
except OverlapError:
|
||||||
|
print('fail')
|
||||||
course_schedules_errors.append(date)
|
course_schedules_errors.append(date)
|
||||||
else:
|
else:
|
||||||
course_schedules.append(course_schedule.name + " on " + date)
|
course_schedules.append(course_schedule)
|
||||||
|
|
||||||
date = add_days(date, 7)
|
date = add_days(date, 7)
|
||||||
else:
|
else:
|
||||||
date = add_days(date, 1)
|
date = add_days(date, 1)
|
||||||
|
|
||||||
frappe.local.message_log = []
|
return dict(
|
||||||
if course_schedules:
|
course_schedules=course_schedules,
|
||||||
frappe.msgprint(_("Course Schedules created:") + "\n" + "\n".join(course_schedules))
|
course_schedules_errors=course_schedules_errors,
|
||||||
if course_schedules_errors:
|
rescheduled=rescheduled,
|
||||||
frappe.msgprint(_("There were errors while scheduling course on :") + "\n" + "\n".join(course_schedules_errors))
|
reschedule_errors=reschedule_errors
|
||||||
if rescheduled:
|
)
|
||||||
frappe.msgprint(_("Course Schedules deleted:") + "\n" + "\n".join(rescheduled))
|
|
||||||
if reschedule_errors:
|
|
||||||
frappe.msgprint(_("There were errors while deleting following schedules:") + "\n" + "\n".join(reschedule_errors))
|
|
||||||
|
|
||||||
def validate_mandatory(self):
|
def validate_mandatory(self):
|
||||||
"""Validates all mandatory fields"""
|
"""Validates all mandatory fields"""
|
||||||
|
|
||||||
fields = ['course', 'room', 'instructor', 'from_time', 'to_time', 'course_start_date', 'course_end_date', 'day']
|
fields = ['course', 'room', 'instructor', 'from_time',
|
||||||
for d in fields:
|
'to_time', 'course_start_date', 'course_end_date', 'day']
|
||||||
|
for d in fields:
|
||||||
if not self.get(d):
|
if not self.get(d):
|
||||||
frappe.throw(_("{0} is mandatory").format(self.meta.get_label(d)))
|
frappe.throw(_("{0} is mandatory").format(
|
||||||
|
self.meta.get_label(d)))
|
||||||
|
|
||||||
def validate_date(self):
|
def validate_date(self):
|
||||||
"""Validates if Course Start Date is greater than Course End Date"""
|
"""Validates if Course Start Date is greater than Course End Date"""
|
||||||
if self.course_start_date > self.course_end_date:
|
if self.course_start_date > self.course_end_date:
|
||||||
frappe.throw("Course Start Date cannot be greater than Course End Date.")
|
frappe.throw(
|
||||||
|
"Course Start Date cannot be greater than Course End Date.")
|
||||||
|
|
||||||
def delete_course_schedule(self, rescheduled, reschedule_errors):
|
def delete_course_schedule(self, rescheduled, reschedule_errors):
|
||||||
"""Delete all course schedule within the Date range and specified filters"""
|
"""Delete all course schedule within the Date range and specified filters"""
|
||||||
schedules = frappe.get_list("Course Schedule", fields=["name", "schedule_date"], filters =
|
|
||||||
[["student_group", "=", self.student_group],
|
schedules = frappe.get_list("Course Schedule",
|
||||||
["course", "=", self.course],
|
fields=["name", "schedule_date"],
|
||||||
["schedule_date", ">=", self.course_start_date],
|
filters=[
|
||||||
["schedule_date", "<=", self.course_end_date]])
|
["student_group", "=", self.student_group],
|
||||||
|
["course", "=", self.course],
|
||||||
|
["schedule_date", ">=", self.course_start_date],
|
||||||
|
["schedule_date", "<=", self.course_end_date]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
for d in schedules:
|
for d in schedules:
|
||||||
try:
|
try:
|
||||||
if self.day == calendar.day_name[getdate(d.schedule_date).weekday()]:
|
if self.day == calendar.day_name[getdate(d.schedule_date).weekday()]:
|
||||||
@ -83,19 +97,18 @@ class CourseSchedulingTool(Document):
|
|||||||
except:
|
except:
|
||||||
reschedule_errors.append(d.name)
|
reschedule_errors.append(d.name)
|
||||||
return rescheduled, reschedule_errors
|
return rescheduled, reschedule_errors
|
||||||
|
|
||||||
def make_course_schedule(self, date):
|
def make_course_schedule(self, date):
|
||||||
"""Makes a new Course Schedule.
|
"""Makes a new Course Schedule.
|
||||||
:param date: Date on which Course Schedule will be created."""
|
:param date: Date on which Course Schedule will be created."""
|
||||||
|
|
||||||
course_schedule = frappe.new_doc("Course Schedule")
|
course_schedule = frappe.new_doc("Course Schedule")
|
||||||
course_schedule.student_group = self.student_group
|
course_schedule.student_group = self.student_group
|
||||||
course_schedule.course = self.course
|
course_schedule.course = self.course
|
||||||
course_schedule.instructor = self.instructor
|
course_schedule.instructor = self.instructor
|
||||||
course_schedule.instructor_name = self.instructor_name
|
course_schedule.instructor_name = self.instructor_name
|
||||||
course_schedule.room = self.room
|
course_schedule.room = self.room
|
||||||
course_schedule.schedule_date= date
|
course_schedule.schedule_date = date
|
||||||
course_schedule.from_time= self.from_time
|
course_schedule.from_time = self.from_time
|
||||||
course_schedule.to_time= self.to_time
|
course_schedule.to_time = self.to_time
|
||||||
return course_schedule
|
return course_schedule
|
||||||
|
|
@ -254,7 +254,9 @@ def make_tax_account_and_template(company, account_name, tax_rate, template_name
|
|||||||
|
|
||||||
accounts = []
|
accounts = []
|
||||||
for i, name in enumerate(account_name):
|
for i, name in enumerate(account_name):
|
||||||
accounts.append(make_tax_account(company, account_name[i], tax_rate[i]))
|
tax_account = make_tax_account(company, account_name[i], tax_rate[i])
|
||||||
|
if tax_account:
|
||||||
|
accounts.append(tax_account)
|
||||||
|
|
||||||
if accounts:
|
if accounts:
|
||||||
make_sales_and_purchase_tax_templates(accounts, template_name)
|
make_sales_and_purchase_tax_templates(accounts, template_name)
|
||||||
|
@ -158,7 +158,7 @@ class MaterialRequest(BuyingController):
|
|||||||
and material_request_item = %s and docstatus = 1""",
|
and material_request_item = %s and docstatus = 1""",
|
||||||
(self.name, d.name))[0][0])
|
(self.name, d.name))[0][0])
|
||||||
|
|
||||||
if d.ordered_qty and d.ordered_qty > d.qty:
|
if d.ordered_qty and d.ordered_qty > d.stock_qty:
|
||||||
frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1} \
|
frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1} \
|
||||||
cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
|
cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
|
||||||
|
|
||||||
@ -170,11 +170,12 @@ class MaterialRequest(BuyingController):
|
|||||||
|
|
||||||
frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
|
frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
|
||||||
|
|
||||||
|
target_ref_field = 'qty' if self.material_request_type == "Manufacture" else 'stock_qty'
|
||||||
self._update_percent_field({
|
self._update_percent_field({
|
||||||
"target_dt": "Material Request Item",
|
"target_dt": "Material Request Item",
|
||||||
"target_parent_dt": self.doctype,
|
"target_parent_dt": self.doctype,
|
||||||
"target_parent_field": "per_ordered",
|
"target_parent_field": "per_ordered",
|
||||||
"target_ref_field": "qty",
|
"target_ref_field": target_ref_field,
|
||||||
"target_field": "ordered_qty",
|
"target_field": "ordered_qty",
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
}, update_modified)
|
}, update_modified)
|
||||||
@ -216,9 +217,9 @@ def set_missing_values(source, target_doc):
|
|||||||
target_doc.run_method("calculate_taxes_and_totals")
|
target_doc.run_method("calculate_taxes_and_totals")
|
||||||
|
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(obj, target, source_parent):
|
||||||
target.conversion_factor = 1
|
target.conversion_factor = obj.conversion_factor
|
||||||
target.qty = flt(obj.qty) - flt(obj.ordered_qty)
|
target.qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty))/ target.conversion_factor
|
||||||
target.stock_qty = target.qty
|
target.stock_qty = (target.qty * target.conversion_factor)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_purchase_order(source_name, target_doc=None):
|
def make_purchase_order(source_name, target_doc=None):
|
||||||
@ -242,7 +243,7 @@ def make_purchase_order(source_name, target_doc=None):
|
|||||||
["uom", "uom"]
|
["uom", "uom"]
|
||||||
],
|
],
|
||||||
"postprocess": update_item,
|
"postprocess": update_item,
|
||||||
"condition": lambda doc: doc.ordered_qty < doc.qty
|
"condition": lambda doc: doc.ordered_qty < doc.stock_qty
|
||||||
}
|
}
|
||||||
}, target_doc, postprocess)
|
}, target_doc, postprocess)
|
||||||
|
|
||||||
@ -353,11 +354,11 @@ def make_supplier_quotation(source_name, target_doc=None):
|
|||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_stock_entry(source_name, target_doc=None):
|
def make_stock_entry(source_name, target_doc=None):
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(obj, target, source_parent):
|
||||||
qty = flt(obj.qty) - flt(obj.ordered_qty) \
|
qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty))/ target.conversion_factor \
|
||||||
if flt(obj.qty) > flt(obj.ordered_qty) else 0
|
if flt(obj.stock_qty) > flt(obj.ordered_qty) else 0
|
||||||
target.qty = qty
|
target.qty = qty
|
||||||
target.transfer_qty = qty
|
target.transfer_qty = qty * obj.conversion_factor
|
||||||
target.conversion_factor = 1
|
target.conversion_factor = obj.conversion_factor
|
||||||
|
|
||||||
if source_parent.material_request_type == "Material Transfer":
|
if source_parent.material_request_type == "Material Transfer":
|
||||||
target.t_warehouse = obj.warehouse
|
target.t_warehouse = obj.warehouse
|
||||||
@ -384,7 +385,7 @@ def make_stock_entry(source_name, target_doc=None):
|
|||||||
"uom": "stock_uom",
|
"uom": "stock_uom",
|
||||||
},
|
},
|
||||||
"postprocess": update_item,
|
"postprocess": update_item,
|
||||||
"condition": lambda doc: doc.ordered_qty < doc.qty
|
"condition": lambda doc: doc.ordered_qty < doc.stock_qty
|
||||||
}
|
}
|
||||||
}, target_doc, set_missing_values)
|
}, target_doc, set_missing_values)
|
||||||
|
|
||||||
@ -405,7 +406,7 @@ def raise_production_orders(material_request):
|
|||||||
prod_order.fg_warehouse = d.warehouse
|
prod_order.fg_warehouse = d.warehouse
|
||||||
prod_order.wip_warehouse = default_wip_warehouse
|
prod_order.wip_warehouse = default_wip_warehouse
|
||||||
prod_order.description = d.description
|
prod_order.description = d.description
|
||||||
prod_order.stock_uom = d.uom
|
prod_order.stock_uom = d.stock_uom
|
||||||
prod_order.expected_delivery_date = d.schedule_date
|
prod_order.expected_delivery_date = d.schedule_date
|
||||||
prod_order.sales_order = d.sales_order
|
prod_order.sales_order = d.sales_order
|
||||||
prod_order.bom_no = get_item_details(d.item_code).bom_no
|
prod_order.bom_no = get_item_details(d.item_code).bom_no
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, unittest, erpnext
|
import frappe, unittest, erpnext
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt, today
|
||||||
from erpnext.stock.doctype.material_request.material_request import raise_production_orders
|
from erpnext.stock.doctype.material_request.material_request import raise_production_orders
|
||||||
|
|
||||||
class TestMaterialRequest(unittest.TestCase):
|
class TestMaterialRequest(unittest.TestCase):
|
||||||
@ -558,5 +558,48 @@ class TestMaterialRequest(unittest.TestCase):
|
|||||||
item_code= %s and warehouse= %s """, (mr.items[0].item_code, mr.items[0].warehouse))[0][0]
|
item_code= %s and warehouse= %s """, (mr.items[0].item_code, mr.items[0].warehouse))[0][0]
|
||||||
self.assertEquals(requested_qty, new_requested_qty)
|
self.assertEquals(requested_qty, new_requested_qty)
|
||||||
|
|
||||||
|
def test_multi_uom_for_purchase(self):
|
||||||
|
from erpnext.stock.doctype.material_request.material_request import make_purchase_order
|
||||||
|
|
||||||
|
mr = frappe.copy_doc(test_records[0])
|
||||||
|
mr.material_request_type = 'Purchase'
|
||||||
|
item = mr.items[0]
|
||||||
|
mr.schedule_date = today()
|
||||||
|
|
||||||
|
if not frappe.db.get_value('UOM Conversion Detail',
|
||||||
|
{'parent': item.item_code, 'uom': 'Kg'}):
|
||||||
|
item_doc = frappe.get_doc('Item', item.item_code)
|
||||||
|
item_doc.append('uoms', {
|
||||||
|
'uom': 'Kg',
|
||||||
|
'conversion_factor': 5
|
||||||
|
})
|
||||||
|
item_doc.save(ignore_permissions=True)
|
||||||
|
|
||||||
|
item.uom = 'Kg'
|
||||||
|
for item in mr.items:
|
||||||
|
item.schedule_date = mr.schedule_date
|
||||||
|
|
||||||
|
mr.insert()
|
||||||
|
self.assertRaises(frappe.ValidationError, make_purchase_order,
|
||||||
|
mr.name)
|
||||||
|
|
||||||
|
mr = frappe.get_doc("Material Request", mr.name)
|
||||||
|
mr.submit()
|
||||||
|
item = mr.items[0]
|
||||||
|
|
||||||
|
self.assertEquals(item.uom, "Kg")
|
||||||
|
self.assertEquals(item.conversion_factor, 5.0)
|
||||||
|
self.assertEquals(item.stock_qty, flt(item.qty * 5))
|
||||||
|
|
||||||
|
po = make_purchase_order(mr.name)
|
||||||
|
self.assertEquals(po.doctype, "Purchase Order")
|
||||||
|
self.assertEquals(len(po.get("items")), len(mr.get("items")))
|
||||||
|
|
||||||
|
po.supplier = '_Test Supplier'
|
||||||
|
po.insert()
|
||||||
|
po.submit()
|
||||||
|
mr = frappe.get_doc("Material Request", mr.name)
|
||||||
|
self.assertEquals(mr.per_ordered, 100)
|
||||||
|
|
||||||
test_dependencies = ["Currency Exchange", "BOM"]
|
test_dependencies = ["Currency Exchange", "BOM"]
|
||||||
test_records = frappe.get_test_records('Material Request')
|
test_records = frappe.get_test_records('Material Request')
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
"autoname": "hash",
|
"autoname": "hash",
|
||||||
@ -13,6 +14,7 @@
|
|||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -46,6 +48,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -73,6 +76,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -105,6 +109,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
@ -134,6 +139,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -166,6 +172,7 @@
|
|||||||
"width": "250px"
|
"width": "250px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -194,6 +201,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -223,6 +231,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -251,6 +260,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -283,11 +293,12 @@
|
|||||||
"width": "80px"
|
"width": "80px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "uom",
|
"fieldname": "stock_uom",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
@ -299,23 +310,21 @@
|
|||||||
"label": "Stock UOM",
|
"label": "Stock UOM",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"oldfieldname": "uom",
|
|
||||||
"oldfieldtype": "Link",
|
|
||||||
"options": "UOM",
|
"options": "UOM",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"precision": "",
|
||||||
|
"print_hide": 1,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"print_width": "70px",
|
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0,
|
"unique": 0
|
||||||
"width": "70px"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -349,6 +358,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -376,6 +386,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -409,6 +420,101 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "uom",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "UOM",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"oldfieldname": "uom",
|
||||||
|
"oldfieldtype": "Link",
|
||||||
|
"options": "UOM",
|
||||||
|
"permlevel": 0,
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"print_width": "70px",
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0,
|
||||||
|
"width": "70px"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "conversion_factor",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "UOM Conversion Factor",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "stock_qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Stock Qty",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 1,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -437,6 +543,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -469,6 +576,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -502,6 +610,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -532,6 +641,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -561,6 +671,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -591,6 +702,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -618,6 +730,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -650,6 +763,7 @@
|
|||||||
"width": "70px"
|
"width": "70px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -682,6 +796,7 @@
|
|||||||
"width": "70px"
|
"width": "70px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -711,6 +826,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -741,6 +857,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -771,17 +888,17 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"image_view": 0,
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
|
||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-20 13:31:50.143583",
|
"modified": "2017-10-25 17:18:59.974778",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Material Request Item",
|
"name": "Material Request Item",
|
||||||
|
@ -164,11 +164,17 @@ def get_basic_details(args, item):
|
|||||||
|
|
||||||
warehouse = user_default_warehouse or item.default_warehouse or args.warehouse
|
warehouse = user_default_warehouse or item.default_warehouse or args.warehouse
|
||||||
|
|
||||||
|
material_request_type = ''
|
||||||
|
if args.get('doctype') == "Material Request":
|
||||||
|
material_request_type = frappe.db.get_value('Material Request',
|
||||||
|
args.get('name'), 'material_request_type')
|
||||||
|
|
||||||
#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
|
#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
|
||||||
if not args.uom:
|
if not args.uom:
|
||||||
if args.get('doctype') in ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']:
|
if args.get('doctype') in ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']:
|
||||||
args.uom = item.sales_uom if item.sales_uom else item.stock_uom
|
args.uom = item.sales_uom if item.sales_uom else item.stock_uom
|
||||||
elif args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']:
|
elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \
|
||||||
|
(args.get('doctype') == 'Material Request' and material_request_type == 'Purchase'):
|
||||||
args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
|
args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
|
||||||
else:
|
else:
|
||||||
args.uom = item.stock_uom
|
args.uom = item.stock_uom
|
||||||
|
@ -129,16 +129,26 @@ def create_material_request(material_requests):
|
|||||||
for d in items:
|
for d in items:
|
||||||
d = frappe._dict(d)
|
d = frappe._dict(d)
|
||||||
item = frappe.get_doc("Item", d.item_code)
|
item = frappe.get_doc("Item", d.item_code)
|
||||||
|
uom = item.stock_uom
|
||||||
|
conversion_factor = 1.0
|
||||||
|
|
||||||
|
if request_type == 'Purchase':
|
||||||
|
uom = item.purchase_uom or item.stock_uom
|
||||||
|
if uom != item.stock_uom:
|
||||||
|
conversion_factor = frappe.db.get_value("UOM Conversion Detail",
|
||||||
|
{'parent': item.name, 'uom': uom}, 'conversion_factor') or 1.0
|
||||||
|
|
||||||
mr.append("items", {
|
mr.append("items", {
|
||||||
"doctype": "Material Request Item",
|
"doctype": "Material Request Item",
|
||||||
"item_code": d.item_code,
|
"item_code": d.item_code,
|
||||||
"schedule_date": add_days(nowdate(),cint(item.lead_time_days)),
|
"schedule_date": add_days(nowdate(),cint(item.lead_time_days)),
|
||||||
"uom": item.stock_uom,
|
"qty": d.reorder_qty / conversion_factor,
|
||||||
|
"uom": uom,
|
||||||
|
"stock_uom": item.stock_uom,
|
||||||
"warehouse": d.warehouse,
|
"warehouse": d.warehouse,
|
||||||
"item_name": item.item_name,
|
"item_name": item.item_name,
|
||||||
"description": item.description,
|
"description": item.description,
|
||||||
"item_group": item.item_group,
|
"item_group": item.item_group,
|
||||||
"qty": d.reorder_qty,
|
|
||||||
"brand": item.brand,
|
"brand": item.brand,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
erpnext/tests/ui/make_fixtures.js #long
|
erpnext/tests/ui/make_fixtures.js #long
|
||||||
erpnext/setup/doctype/company/tests/test_company.js
|
erpnext/setup/doctype/company/tests/test_company.js
|
||||||
erpnext/accounts/doctype/account/test_account.js
|
erpnext/accounts/doctype/account/tests/test_account.js
|
||||||
erpnext/accounts/doctype/account/test_make_tax_account.js
|
erpnext/accounts/doctype/account/tests/test_make_tax_account.js
|
||||||
|
erpnext/accounts/doctype/account/tests/test_account_with_number.js
|
||||||
erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js
|
erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js
|
||||||
erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js
|
erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js
|
||||||
erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js
|
erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js
|
||||||
|
Loading…
Reference in New Issue
Block a user