From 8002d47ff667099065e07285d96aa6245d4d369d Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 13 Jul 2016 16:03:05 +0530 Subject: [PATCH] Demo records for timesheet --- erpnext/demo/data/bom.json | 2 +- erpnext/demo/demo.py | 5 +- erpnext/demo/setup_data.py | 16 +++- erpnext/demo/user/hr.py | 47 ++++++++- erpnext/demo/user/manufacturing.py | 11 +++ erpnext/demo/user/projects.py | 95 +++++++++++++++++++ .../production_order/test_production_order.py | 3 +- 7 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 erpnext/demo/user/projects.py diff --git a/erpnext/demo/data/bom.json b/erpnext/demo/data/bom.json index 1c3f7a91405..30854359b29 100644 --- a/erpnext/demo/data/bom.json +++ b/erpnext/demo/data/bom.json @@ -100,7 +100,7 @@ ] }, { - "item": "Wind Turbine", + "item": "Wind Turbine-S", "with_operations": 1, "operations": [ { diff --git a/erpnext/demo/demo.py b/erpnext/demo/demo.py index 6642e7b5ebd..4188432b88c 100644 --- a/erpnext/demo/demo.py +++ b/erpnext/demo/demo.py @@ -4,7 +4,7 @@ import frappe, sys import erpnext import frappe.utils from erpnext.demo.setup_data import setup_data -from erpnext.demo.user import hr, sales, purchase, manufacturing, stock, accounts +from erpnext.demo.user import hr, sales, purchase, manufacturing, stock, accounts, projects """ Make a demo @@ -69,6 +69,9 @@ def simulate(): manufacturing.work() stock.work() accounts.work() + projects.run_projects(current_date) + # run_stock() + # run_accounts() # run_projects() # run_messages() diff --git a/erpnext/demo/setup_data.py b/erpnext/demo/setup_data.py index 6f1fb0a7de9..52450637c34 100644 --- a/erpnext/demo/setup_data.py +++ b/erpnext/demo/setup_data.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import random, json from erpnext.demo.domains import data import frappe, erpnext -import frappe.utils +from frappe.utils import cint, flt def setup_data(): domain = frappe.flags.domain @@ -27,6 +27,7 @@ def setup_data(): setup_user() setup_employee() setup_salary_structure() + setup_salary_structure_for_timesheet() setup_user_roles() frappe.db.commit() frappe.clear_cache() @@ -286,6 +287,14 @@ def setup_salary_structure(): }) ss.insert() + +def setup_salary_structure_for_timesheet(): + for e in frappe.get_all('Salary Structure', fields=['name'], filters={'is_active': 'Yes'}, limit=2): + ss_doc = frappe.get_doc("Salary Structure", e.name) + ss_doc.salary_slip_based_on_timesheet = 1 + ss_doc.salary_component = 'Basic' + ss_doc.hour_rate = flt(random.random() * 10, 2) + ss_doc.save(ignore_permissions=True) def setup_account(): frappe.flags.in_import = True @@ -332,4 +341,9 @@ def setup_user_roles(): user = frappe.get_doc('User', 'LeonAbdulov@example.com') user.add_roles('Accounts User', 'Accounts Manager', 'Sales User', 'Purchase User') frappe.db.set_global('demo_accounts_user', user.name) + + if not frappe.db.get_global('demo_projects_user'): + user = frappe.get_doc('User', 'panca@example.com') + user.add_roles('HR User', 'Projects User') + frappe.db.set_global('demo_projects_user', user.name) diff --git a/erpnext/demo/user/hr.py b/erpnext/demo/user/hr.py index 8196701d75b..86fb52630bd 100644 --- a/erpnext/demo/user/hr.py +++ b/erpnext/demo/user/hr.py @@ -1,10 +1,13 @@ from __future__ import unicode_literals import frappe +import random from frappe.utils import random_string +from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet +from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice +from frappe.utils.make_random import how_many, get_random def work(): frappe.set_user(frappe.db.get_global('demo_hr_user')) - year, month = frappe.flags.current_date.strftime("%Y-%m").split("-") # process payroll @@ -24,3 +27,45 @@ def work(): journal_entry.posting_date = frappe.flags.current_date journal_entry.insert() journal_entry.submit() + + if frappe.db.get_global('demo_hr_user'): + make_timesheet_records() + +def get_timesheet_based_salary_slip_employee(): + return frappe.get_all('Salary Structure', fields = ["distinct employee as name"], + filters = {'salary_slip_based_on_timesheet': 1}) + +def make_timesheet_records(): + employees = get_timesheet_based_salary_slip_employee() + for employee in employees: + ts = make_timesheet(employee.name, simulate = True, billable = 1, activity_type=get_random("Activity Type")) + + rand = random.random() + if rand >= 0.3: + make_salary_slip_for_timesheet(ts.name) + + rand = random.random() + if rand >= 0.2: + make_sales_invoice_for_timesheet(ts.name) + +def make_salary_slip_for_timesheet(name): + salary_slip = make_salary_slip(name) + salary_slip.insert() + salary_slip.submit() + +def make_sales_invoice_for_timesheet(name): + sales_invoice = make_sales_invoice(name) + sales_invoice.customer = get_random("Customer") + sales_invoice.append('items', { + 'item_code': get_random_item(), + 'qty': 1, + 'rate': 1000 + }) + sales_invoice.set_missing_values() + sales_invoice.calculate_taxes_and_totals() + sales_invoice.insert() + sales_invoice.submit() + +def get_random_item(): + return frappe.db.sql_list(""" select name from `tabItem` where + has_variants = 0 order by rand() limit 1""")[0] diff --git a/erpnext/demo/user/manufacturing.py b/erpnext/demo/user/manufacturing.py index c91570c8982..80d140af74a 100644 --- a/erpnext/demo/user/manufacturing.py +++ b/erpnext/demo/user/manufacturing.py @@ -6,6 +6,8 @@ from __future__ import unicode_literals import frappe, random, erpnext from frappe.utils.make_random import how_many from frappe.desk import query_report +from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError +from erpnext.manufacturing.doctype.production_order.test_production_order import make_prod_order_test_record def work(): frappe.set_user(frappe.db.get_global('demo_manufacturing_user')) @@ -46,6 +48,13 @@ def work(): for pro in query_report.run("Production Orders in Progress")["result"][:how_many("Stock Entry for FG")]: make_stock_entry_from_pro(pro[0], "Manufacture") + for bom in frappe.get_all('BOM', fields=['item'], filters = {'with_operations': 1}): + pro_order = make_prod_order_test_record(item=bom.item, qty=2, + source_warehouse="Stores - WPL", wip_warehouse = "Work in Progress - WPL", + fg_warehouse = "Stores - WPL", company = erpnext.get_default_company(), + stock_uom = frappe.db.get_value('Item', bom.item, 'stock_uom'), + planned_start_date = frappe.flags.current_date) + # submit time logs for timesheet in frappe.get_all("Timesheet", ["name"], {"docstatus": 0, "production_order": ("!=", ""), "to_time": ("<", frappe.flags.current_date)}): @@ -55,6 +64,8 @@ def work(): frappe.db.commit() except OverlapError: pass + except WorkstationHolidayError: + pass def make_stock_entry_from_pro(pro_id, purpose): from erpnext.manufacturing.doctype.production_order.production_order import make_stock_entry diff --git a/erpnext/demo/user/projects.py b/erpnext/demo/user/projects.py new file mode 100644 index 00000000000..12fad296723 --- /dev/null +++ b/erpnext/demo/user/projects.py @@ -0,0 +1,95 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +import frappe +from frappe.utils.make_random import can_make +from frappe.utils.make_random import how_many, get_random +from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet + +def run_projects(current_date): + frappe.set_user(frappe.db.get_global('demo_projects_user')) + if frappe.db.get_global('demo_projects_user'): + make_project(current_date) + make_timesheet_for_projects(current_date) + close_tasks(current_date) + +def make_timesheet_for_projects(current_date ): + for data in frappe.get_all("Task", ["name", "project"], {"status": "Open", "exp_end_date": ("<", current_date)}): + employee = get_random("Employee") + if frappe.db.get_value('Salary Structure', {'employee': employee}, 'salary_slip_based_on_timesheet'): + make_timesheet(employee, simulate = True, billable = 1, + activity_type=get_random("Activity Type"), project=data.project, task =data.name) + +def close_tasks(current_date): + for task in frappe.get_all("Task", ["name"], {"status": "Open", "exp_end_date": ("<", current_date)}): + task = frappe.get_doc("Task", task.name) + task.status = "Closed" + task.save() + +def make_project(current_date): + if not frappe.db.exists('Project', + "New Product Development " + current_date.strftime("%Y-%m-%d")): + project = frappe.get_doc({ + "doctype": "Project", + "project_name": "New Product Development " + current_date.strftime("%Y-%m-%d"), + }) + project.set("tasks", [ + { + "title": "Review Requirements", + "start_date": frappe.utils.add_days(current_date, 10), + "end_date": frappe.utils.add_days(current_date, 11) + }, + { + "title": "Design Options", + "start_date": frappe.utils.add_days(current_date, 11), + "end_date": frappe.utils.add_days(current_date, 20) + }, + { + "title": "Make Prototypes", + "start_date": frappe.utils.add_days(current_date, 20), + "end_date": frappe.utils.add_days(current_date, 30) + }, + { + "title": "Customer Feedback on Prototypes", + "start_date": frappe.utils.add_days(current_date, 30), + "end_date": frappe.utils.add_days(current_date, 40) + }, + { + "title": "Freeze Feature Set", + "start_date": frappe.utils.add_days(current_date, 40), + "end_date": frappe.utils.add_days(current_date, 45) + }, + { + "title": "Testing", + "start_date": frappe.utils.add_days(current_date, 45), + "end_date": frappe.utils.add_days(current_date, 60) + }, + { + "title": "Product Engineering", + "start_date": frappe.utils.add_days(current_date, 45), + "end_date": frappe.utils.add_days(current_date, 55) + }, + { + "title": "Supplier Contracts", + "start_date": frappe.utils.add_days(current_date, 55), + "end_date": frappe.utils.add_days(current_date, 70) + }, + { + "title": "Design and Build Fixtures", + "start_date": frappe.utils.add_days(current_date, 45), + "end_date": frappe.utils.add_days(current_date, 65) + }, + { + "title": "Test Run", + "start_date": frappe.utils.add_days(current_date, 70), + "end_date": frappe.utils.add_days(current_date, 80) + }, + { + "title": "Launch", + "start_date": frappe.utils.add_days(current_date, 80), + "end_date": frappe.utils.add_days(current_date, 90) + }, + ]) + project.insert() diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.py b/erpnext/manufacturing/doctype/production_order/test_production_order.py index 9013c15aecb..d29544b75e5 100644 --- a/erpnext/manufacturing/doctype/production_order/test_production_order.py +++ b/erpnext/manufacturing/doctype/production_order/test_production_order.py @@ -220,7 +220,8 @@ def make_prod_order_test_record(**args): pro_order.wip_warehouse = args.wip_warehouse or "_Test Warehouse - _TC" pro_order.fg_warehouse = args.fg_warehouse or "_Test Warehouse 1 - _TC" pro_order.company = args.company or "_Test Company" - pro_order.stock_uom = "_Test UOM" + pro_order.stock_uom = args.stock_uom or "_Test UOM" + pro_order.set_production_order_operations() if args.source_warehouse: pro_order.source_warehouse = args.source_warehouse