mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-08 15:42:52 +00:00
Merge branch 'develop' into multi_company
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"actions": [],
|
||||||
"allow_events_in_timeline": 1,
|
"allow_events_in_timeline": 1,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"autoname": "naming_series:",
|
"autoname": "naming_series:",
|
||||||
@@ -447,7 +448,7 @@
|
|||||||
"idx": 5,
|
"idx": 5,
|
||||||
"image_field": "image",
|
"image_field": "image",
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-04-08 22:26:11.687110",
|
"modified": "2020-05-11 20:27:45.868960",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "CRM",
|
"module": "CRM",
|
||||||
"name": "Lead",
|
"name": "Lead",
|
||||||
@@ -504,15 +505,6 @@
|
|||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "Sales User"
|
"role": "Sales User"
|
||||||
},
|
|
||||||
{
|
|
||||||
"email": 1,
|
|
||||||
"export": 1,
|
|
||||||
"print": 1,
|
|
||||||
"read": 1,
|
|
||||||
"report": 1,
|
|
||||||
"role": "Guest",
|
|
||||||
"share": 1
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"search_fields": "lead_name,lead_owner,status",
|
"search_fields": "lead_name,lead_owner,status",
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class Attendance(Document):
|
|||||||
date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining")
|
date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining")
|
||||||
|
|
||||||
# leaves can be marked for future dates
|
# leaves can be marked for future dates
|
||||||
if self.status not in ('On Leave', 'Half Day') and getdate(self.attendance_date) > getdate(nowdate()):
|
if self.status != 'On Leave' and not self.leave_application and getdate(self.attendance_date) > getdate(nowdate()):
|
||||||
frappe.throw(_("Attendance can not be marked for future dates"))
|
frappe.throw(_("Attendance can not be marked for future dates"))
|
||||||
elif date_of_joining and getdate(self.attendance_date) < getdate(date_of_joining):
|
elif date_of_joining and getdate(self.attendance_date) < getdate(date_of_joining):
|
||||||
frappe.throw(_("Attendance date can not be less than employee's joining date"))
|
frappe.throw(_("Attendance date can not be less than employee's joining date"))
|
||||||
|
|||||||
@@ -363,6 +363,9 @@ class StockEntry(StockController):
|
|||||||
+ self.work_order + ":" + ", ".join(other_ste), DuplicateEntryForWorkOrderError)
|
+ self.work_order + ":" + ", ".join(other_ste), DuplicateEntryForWorkOrderError)
|
||||||
|
|
||||||
def set_incoming_rate(self):
|
def set_incoming_rate(self):
|
||||||
|
if self.purpose == "Repack":
|
||||||
|
self.set_basic_rate_for_finished_goods()
|
||||||
|
|
||||||
for d in self.items:
|
for d in self.items:
|
||||||
if d.s_warehouse:
|
if d.s_warehouse:
|
||||||
args = self.get_args_for_incoming_rate(d)
|
args = self.get_args_for_incoming_rate(d)
|
||||||
@@ -475,20 +478,31 @@ class StockEntry(StockController):
|
|||||||
"allow_zero_valuation": item.allow_zero_valuation_rate,
|
"allow_zero_valuation": item.allow_zero_valuation_rate,
|
||||||
})
|
})
|
||||||
|
|
||||||
def set_basic_rate_for_finished_goods(self, raw_material_cost, scrap_material_cost):
|
def set_basic_rate_for_finished_goods(self, raw_material_cost=0, scrap_material_cost=0):
|
||||||
|
total_fg_qty = 0
|
||||||
|
if not raw_material_cost and self.get("items"):
|
||||||
|
raw_material_cost = sum([flt(row.basic_amount) for row in self.items
|
||||||
|
if row.s_warehouse and not row.t_warehouse])
|
||||||
|
|
||||||
|
total_fg_qty = sum([flt(row.qty) for row in self.items
|
||||||
|
if row.t_warehouse and not row.s_warehouse])
|
||||||
|
|
||||||
if self.purpose in ["Manufacture", "Repack"]:
|
if self.purpose in ["Manufacture", "Repack"]:
|
||||||
for d in self.get("items"):
|
for d in self.get("items"):
|
||||||
if (d.transfer_qty and (d.bom_no or d.t_warehouse)
|
if (d.transfer_qty and (d.bom_no or d.t_warehouse)
|
||||||
and (getattr(self, "pro_doc", frappe._dict()).scrap_warehouse != d.t_warehouse)):
|
and (getattr(self, "pro_doc", frappe._dict()).scrap_warehouse != d.t_warehouse)):
|
||||||
|
|
||||||
if self.work_order \
|
if (self.work_order and self.purpose == "Manufacture"
|
||||||
and frappe.db.get_single_value("Manufacturing Settings", "material_consumption"):
|
and frappe.db.get_single_value("Manufacturing Settings", "material_consumption")):
|
||||||
bom_items = self.get_bom_raw_materials(d.transfer_qty)
|
bom_items = self.get_bom_raw_materials(d.transfer_qty)
|
||||||
raw_material_cost = sum([flt(row.qty)*flt(row.rate) for row in bom_items.values()])
|
raw_material_cost = sum([flt(row.qty)*flt(row.rate) for row in bom_items.values()])
|
||||||
|
|
||||||
if raw_material_cost:
|
if raw_material_cost and self.purpose == "Manufacture":
|
||||||
d.basic_rate = flt((raw_material_cost - scrap_material_cost) / flt(d.transfer_qty), d.precision("basic_rate"))
|
d.basic_rate = flt((raw_material_cost - scrap_material_cost) / flt(d.transfer_qty), d.precision("basic_rate"))
|
||||||
d.basic_amount = flt((raw_material_cost - scrap_material_cost), d.precision("basic_amount"))
|
d.basic_amount = flt((raw_material_cost - scrap_material_cost), d.precision("basic_amount"))
|
||||||
|
elif self.purpose == "Repack" and total_fg_qty:
|
||||||
|
d.basic_rate = flt(raw_material_cost) / flt(total_fg_qty)
|
||||||
|
d.basic_amount = d.basic_rate * d.qty
|
||||||
|
|
||||||
def distribute_additional_costs(self):
|
def distribute_additional_costs(self):
|
||||||
if self.purpose == "Material Issue":
|
if self.purpose == "Material Issue":
|
||||||
|
|||||||
Reference in New Issue
Block a user