Merge branch 'develop' into serial-no-rename

This commit is contained in:
Marica
2020-06-26 20:34:09 +05:30
committed by GitHub
10 changed files with 47 additions and 117 deletions

View File

@@ -33,7 +33,7 @@ def validate_filters(filters):
frappe.throw(_("{0} is mandatory").format(f)) frappe.throw(_("{0} is mandatory").format(f))
if not frappe.db.exists("Fiscal Year", filters.get("fiscal_year")): if not frappe.db.exists("Fiscal Year", filters.get("fiscal_year")):
frappe.throw(_("Fiscal Year: {0} does not exists").format(filters.get("fiscal_year"))) frappe.throw(_("Fiscal Year {0} Does Not Exist").format(filters.get("fiscal_year")))
if filters.get("based_on") == filters.get("group_by"): if filters.get("based_on") == filters.get("group_by"):
frappe.throw(_("'Based On' and 'Group By' can not be same")) frappe.throw(_("'Based On' and 'Group By' can not be same"))

View File

@@ -98,11 +98,17 @@ class ProductionPlan(Document):
elif self.get_items_from == "Material Request": elif self.get_items_from == "Material Request":
self.get_mr_items() self.get_mr_items()
def get_so_mr_list(self, field, table):
"""Returns a list of Sales Orders or Material Requests from the respective tables"""
so_mr_list = [d.get(field) for d in self.get(table) if d.get(field)]
return so_mr_list
def get_so_items(self): def get_so_items(self):
so_list = [d.sales_order for d in self.sales_orders if d.sales_order] # Check for empty table or empty rows
if not so_list: if not self.get("sales_orders") or not self.get_so_mr_list("sales_order", "sales_orders"):
msgprint(_("Please enter Sales Orders in the above table")) frappe.throw(_("Please fill the Sales Orders table"), title=_("Sales Orders Required"))
return []
so_list = self.get_so_mr_list("sales_order", "sales_orders")
item_condition = "" item_condition = ""
if self.item_code: if self.item_code:
@@ -134,10 +140,11 @@ class ProductionPlan(Document):
self.calculate_total_planned_qty() self.calculate_total_planned_qty()
def get_mr_items(self): def get_mr_items(self):
mr_list = [d.material_request for d in self.material_requests if d.material_request] # Check for empty table or empty rows
if not mr_list: if not self.get("material_requests") or not self.get_so_mr_list("material_request", "material_requests"):
msgprint(_("Please enter Material Requests in the above table")) frappe.throw(_("Please fill the Material Requests table"), title=_("Material Requests Required"))
return []
mr_list = self.get_so_mr_list("material_request", "material_requests")
item_condition = "" item_condition = ""
if self.item_code: if self.item_code:
@@ -628,16 +635,19 @@ def get_items_for_material_requests(doc, warehouses=None):
if warehouse_list: if warehouse_list:
warehouses = list(set(warehouse_list)) warehouses = list(set(warehouse_list))
if doc.get("for_warehouse") and doc.get("for_warehouse") in warehouses: if doc.get("for_warehouse") and doc.get("for_warehouse") in warehouses:
warehouses.remove(doc.get("for_warehouse")) warehouses.remove(doc.get("for_warehouse"))
warehouse_list = None warehouse_list = None
doc['mr_items'] = [] doc['mr_items'] = []
po_items = doc.get('po_items') if doc.get('po_items') else doc.get('items') po_items = doc.get('po_items') if doc.get('po_items') else doc.get('items')
if not po_items: # Check for empty table or empty rows
frappe.throw(_("Items are required to pull the raw materials which is associated with it.")) if not po_items or not [row.get('item_code') for row in po_items if row.get('item_code')]:
frappe.throw(_("Items to Manufacture are required to pull the Raw Materials associated with it."),
title=_("Items Required"))
company = doc.get('company') company = doc.get('company')
ignore_existing_ordered_qty = doc.get('ignore_existing_ordered_qty') ignore_existing_ordered_qty = doc.get('ignore_existing_ordered_qty')

View File

@@ -381,7 +381,6 @@
{ {
"fieldname": "earning", "fieldname": "earning",
"fieldtype": "Column Break", "fieldtype": "Column Break",
"label": "Earning",
"oldfieldtype": "Column Break", "oldfieldtype": "Column Break",
"show_days": 1, "show_days": 1,
"show_seconds": 1, "show_seconds": 1,
@@ -400,7 +399,6 @@
{ {
"fieldname": "deduction", "fieldname": "deduction",
"fieldtype": "Column Break", "fieldtype": "Column Break",
"label": "Deduction",
"oldfieldtype": "Column Break", "oldfieldtype": "Column Break",
"show_days": 1, "show_days": 1,
"show_seconds": 1, "show_seconds": 1,
@@ -616,7 +614,7 @@
"idx": 9, "idx": 9,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2020-06-22 14:42:43.921828", "modified": "2020-06-25 14:42:43.921828",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Payroll", "module": "Payroll",
"name": "Salary Slip", "name": "Salary Slip",

View File

@@ -140,52 +140,6 @@ class TestTimesheet(unittest.TestCase):
settings.ignore_employee_time_overlap = initial_setting settings.ignore_employee_time_overlap = initial_setting
settings.save() settings.save()
def test_timesheet_std_working_hours(self):
emp = make_employee("test_employee_6@salary.com")
company = frappe.get_doc('Company', "_Test Company")
company.standard_working_hours = 8
company.save()
timesheet = frappe.new_doc("Timesheet")
timesheet.employee = emp
timesheet.company = '_Test Company'
timesheet.append(
'time_logs',
{
"activity_type": "_Test Activity Type",
"from_time": now_datetime(),
"to_time": now_datetime() + datetime.timedelta(days= 4)
}
)
timesheet.save()
ts = frappe.get_doc('Timesheet', timesheet.name)
self.assertEqual(ts.total_hours, 32)
ts.submit()
ts.cancel()
company = frappe.get_doc('Company', "_Test Company")
company.standard_working_hours = 0
company.save()
timesheet = frappe.new_doc("Timesheet")
timesheet.employee = emp
timesheet.company = '_Test Company'
timesheet.append(
'time_logs',
{
"activity_type": "_Test Activity Type",
"from_time": now_datetime(),
"to_time": now_datetime() + datetime.timedelta(days= 4)
}
)
timesheet.save()
ts = frappe.get_doc('Timesheet', timesheet.name)
self.assertEqual(ts.total_hours, 96)
ts.submit()
ts.cancel()
def make_salary_structure_for_timesheet(employee): def make_salary_structure_for_timesheet(employee):
salary_structure_name = "Timesheet Salary Structure Test" salary_structure_name = "Timesheet Salary Structure Test"

View File

@@ -162,19 +162,11 @@ frappe.ui.form.on("Timesheet Detail", {
to_time: function(frm, cdt, cdn) { to_time: function(frm, cdt, cdn) {
var child = locals[cdt][cdn]; var child = locals[cdt][cdn];
var time_diff = (moment(child.to_time).diff(moment(child.from_time),"seconds")) / ( 60 * 60 * 24);
var std_working_hours = 0;
if(frm._setting_hours) return; if(frm._setting_hours) return;
var hours = moment(child.to_time).diff(moment(child.from_time), "seconds") / 3600; var hours = moment(child.to_time).diff(moment(child.from_time), "seconds") / 3600;
std_working_hours = time_diff * frappe.working_hours; frappe.model.set_value(cdt, cdn, "hours", hours);
if (std_working_hours < hours && std_working_hours > 0) {
frappe.model.set_value(cdt, cdn, "hours", std_working_hours);
} else {
frappe.model.set_value(cdt, cdn, "hours", hours);
}
}, },
time_logs_add: function(frm) { time_logs_add: function(frm) {
@@ -236,23 +228,12 @@ var calculate_end_time = function(frm, cdt, cdn) {
let d = moment(child.from_time); let d = moment(child.from_time);
if(child.hours) { if(child.hours) {
var time_diff = (moment(child.to_time).diff(moment(child.from_time),"seconds")) / (60 * 60 * 24); d.add(child.hours, "hours");
var std_working_hours = 0; frm._setting_hours = true;
var hours = moment(child.to_time).diff(moment(child.from_time), "seconds") / 3600; frappe.model.set_value(cdt, cdn, "to_time",
d.format(frappe.defaultDatetimeFormat)).then(() => {
std_working_hours = time_diff * frappe.working_hours; frm._setting_hours = false;
});
if (std_working_hours < hours && std_working_hours > 0) {
frappe.model.set_value(cdt, cdn, "hours", std_working_hours);
frappe.model.set_value(cdt, cdn, "to_time", d.add(hours, "hours").format(frappe.defaultDatetimeFormat));
} else {
d.add(child.hours, "hours");
frm._setting_hours = true;
frappe.model.set_value(cdt, cdn, "to_time",
d.format(frappe.defaultDatetimeFormat)).then(() => {
frm._setting_hours = false;
});
}
} }
}; };

View File

@@ -24,7 +24,6 @@ class Timesheet(Document):
self.set_status() self.set_status()
self.validate_dates() self.validate_dates()
self.validate_time_logs() self.validate_time_logs()
self.calculate_std_hours()
self.update_cost() self.update_cost()
self.calculate_total_amounts() self.calculate_total_amounts()
self.calculate_percentage_billed() self.calculate_percentage_billed()
@@ -91,17 +90,6 @@ class Timesheet(Document):
self.start_date = getdate(start_date) self.start_date = getdate(start_date)
self.end_date = getdate(end_date) self.end_date = getdate(end_date)
def calculate_std_hours(self):
std_working_hours = frappe.get_value("Company", self.company, 'standard_working_hours')
for time in self.time_logs:
if time.from_time and time.to_time:
if flt(std_working_hours) and date_diff(time.to_time, time.from_time):
time.hours = flt(std_working_hours) * date_diff(time.to_time, time.from_time)
else:
if not time.hours:
time.hours = time_diff_in_hours(time.to_time, time.from_time)
def before_cancel(self): def before_cancel(self):
self.set_status() self.set_status()

View File

@@ -388,8 +388,7 @@ def check_credit_limit(customer, company, ignore_outstanding_sales_order=False,
credit_controller_users = get_users_with_role(credit_controller_role or "Sales Master Manager") credit_controller_users = get_users_with_role(credit_controller_role or "Sales Master Manager")
# form a list of emails and names to show to the user # form a list of emails and names to show to the user
credit_controller_users_list = [user for user in credit_controller_users if frappe.db.exists("Employee", {"prefered_email": user})] credit_controller_users = [get_formatted_email(user).replace("<", "(").replace(">", ")") for user in credit_controller_users]
credit_controller_users = [get_formatted_email(user).replace("<", "(").replace(">", ")") for user in credit_controller_users_list]
if not credit_controller_users: if not credit_controller_users:
frappe.throw(_("Please contact your administrator to extend the credit limits for {0}.".format(customer))) frappe.throw(_("Please contact your administrator to extend the credit limits for {0}.".format(customer)))
@@ -409,7 +408,7 @@ def check_credit_limit(customer, company, ignore_outstanding_sales_order=False,
'customer': customer, 'customer': customer,
'customer_outstanding': customer_outstanding, 'customer_outstanding': customer_outstanding,
'credit_limit': credit_limit, 'credit_limit': credit_limit,
'credit_controller_users_list': credit_controller_users_list 'credit_controller_users_list': credit_controller_users
} }
} }
) )

View File

@@ -22,7 +22,6 @@
"default_letter_head", "default_letter_head",
"default_holiday_list", "default_holiday_list",
"default_finance_book", "default_finance_book",
"standard_working_hours",
"default_selling_terms", "default_selling_terms",
"default_buying_terms", "default_buying_terms",
"default_warehouse_for_sales_return", "default_warehouse_for_sales_return",
@@ -240,11 +239,6 @@
"label": "Default Holiday List", "label": "Default Holiday List",
"options": "Holiday List" "options": "Holiday List"
}, },
{
"fieldname": "standard_working_hours",
"fieldtype": "Float",
"label": "Standard Working Hours"
},
{ {
"fieldname": "default_warehouse_for_sales_return", "fieldname": "default_warehouse_for_sales_return",
"fieldtype": "Link", "fieldtype": "Link",
@@ -746,7 +740,7 @@
"image_field": "company_logo", "image_field": "company_logo",
"is_tree": 1, "is_tree": 1,
"links": [], "links": [],
"modified": "2020-06-20 11:38:43.178970", "modified": "2020-06-24 12:45:31.462195",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Setup", "module": "Setup",
"name": "Company", "name": "Company",

View File

@@ -405,8 +405,8 @@ class EmailDigest(Document):
value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0), value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0),
count(*) from `tabSales Order` count(*) from `tabSales Order`
where (transaction_date <= %(to_date)s) and billing_status != "Fully Billed" where (transaction_date <= %(to_date)s) and billing_status != "Fully Billed" and company = %(company)s
and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date})[0] and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
label = get_link_to_report('Sales Order', label=self.meta.get_label("sales_orders_to_bill"), label = get_link_to_report('Sales Order', label=self.meta.get_label("sales_orders_to_bill"),
report_type="Report Builder", report_type="Report Builder",
@@ -430,8 +430,8 @@ class EmailDigest(Document):
value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_delivered/100)),0), value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_delivered/100)),0),
count(*) from `tabSales Order` count(*) from `tabSales Order`
where (transaction_date <= %(to_date)s) and delivery_status != "Fully Delivered" where (transaction_date <= %(to_date)s) and delivery_status != "Fully Delivered" and company = %(company)s
and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date})[0] and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
label = get_link_to_report('Sales Order', label=self.meta.get_label("sales_orders_to_deliver"), label = get_link_to_report('Sales Order', label=self.meta.get_label("sales_orders_to_deliver"),
report_type="Report Builder", report_type="Report Builder",
@@ -455,8 +455,8 @@ class EmailDigest(Document):
value, count = frappe.db.sql("""select ifnull((sum(grand_total))-(sum(grand_total*per_received/100)),0), value, count = frappe.db.sql("""select ifnull((sum(grand_total))-(sum(grand_total*per_received/100)),0),
count(*) from `tabPurchase Order` count(*) from `tabPurchase Order`
where (transaction_date <= %(to_date)s) and per_received < 100 where (transaction_date <= %(to_date)s) and per_received < 100 and company = %(company)s
and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date})[0] and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
label = get_link_to_report('Purchase Order', label=self.meta.get_label("purchase_orders_to_receive"), label = get_link_to_report('Purchase Order', label=self.meta.get_label("purchase_orders_to_receive"),
report_type="Report Builder", report_type="Report Builder",
@@ -480,8 +480,8 @@ class EmailDigest(Document):
value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0), value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0),
count(*) from `tabPurchase Order` count(*) from `tabPurchase Order`
where (transaction_date <= %(to_date)s) and per_billed < 100 where (transaction_date <= %(to_date)s) and per_billed < 100 and company = %(company)s
and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date})[0] and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
label = get_link_to_report('Purchase Order', label=self.meta.get_label("purchase_orders_to_bill"), label = get_link_to_report('Purchase Order', label=self.meta.get_label("purchase_orders_to_bill"),
report_type="Report Builder", report_type="Report Builder",

View File

@@ -13,6 +13,12 @@ $.extend(cur_frm.cscript, {
}, },
enable_checkout: function(){ enable_checkout: function(){
toggle_mandatory(cur_frm) toggle_mandatory(cur_frm)
},
enabled: function() {
if (cur_frm.doc.enabled === 1) {
cur_frm.doc.show_configure_button = 1;
cur_frm.refresh_field('show_configure_button');
}
} }
}); });