Merge pull request #7970 from rmehta/sample-tasks

Descriptions on sample tasks
This commit is contained in:
Nabin Hait 2017-03-10 14:58:52 +05:30 committed by GitHub
commit e7e82fe477
14 changed files with 190 additions and 38 deletions

View File

@ -50,7 +50,9 @@ class SalesOrder(SellingController):
# validate transaction date v/s delivery date # validate transaction date v/s delivery date
if self.delivery_date: if self.delivery_date:
if getdate(self.transaction_date) > getdate(self.delivery_date): if getdate(self.transaction_date) > getdate(self.delivery_date):
frappe.throw(_("Expected Delivery Date cannot be before Sales Order Date")) frappe.msgprint(_("Expected Delivery Date is be before Sales Order Date"),
indicator='orange',
title=_('Warning'))
def validate_po(self): def validate_po(self):
# validate p.o date v/s delivery date # validate p.o date v/s delivery date
@ -81,7 +83,8 @@ class SalesOrder(SellingController):
unique_chk_list = set(check_list) unique_chk_list = set(check_list)
if len(unique_chk_list) != len(check_list) and \ if len(unique_chk_list) != len(check_list) and \
not cint(frappe.db.get_single_value("Selling Settings", "allow_multiple_items")): not cint(frappe.db.get_single_value("Selling Settings", "allow_multiple_items")):
frappe.msgprint(_("Warning: Same item has been entered multiple times.")) frappe.msgprint(_("Same item has been entered multiple times"),
title=_("Warning"), indicator='orange')
def product_bundle_has_stock_item(self, product_bundle): def product_bundle_has_stock_item(self, product_bundle):
"""Returns true if product bundle has stock item""" """Returns true if product bundle has stock item"""

View File

@ -22,8 +22,8 @@ def get_domain(domain):
}, },
'Retail': { 'Retail': {
'desktop_icons': ['POS', 'Item', 'Customer', 'Sales Invoice', 'Purchase Order', 'Warranty Claim', 'desktop_icons': ['POS', 'Item', 'Customer', 'Sales Invoice', 'Purchase Order',
'Accounts', 'Buying', 'ToDo'], 'Warranty Claim', 'Accounts', 'Task', 'Buying', 'ToDo'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'], 'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'],
'properties': [ 'properties': [
{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1}, {'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
@ -36,7 +36,7 @@ def get_domain(domain):
}, },
'Distribution': { 'Distribution': {
'desktop_icons': ['Item', 'Customer', 'Supplier', 'Lead', 'Sales Order', 'desktop_icons': ['Item', 'Customer', 'Supplier', 'Lead', 'Sales Order', 'Task',
'Sales Invoice', 'CRM', 'Selling', 'Buying', 'Stock', 'Accounts', 'HR', 'ToDo'], 'Sales Invoice', 'CRM', 'Selling', 'Buying', 'Stock', 'Accounts', 'HR', 'ToDo'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'], 'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'],
'set_value': [ 'set_value': [
@ -46,8 +46,8 @@ def get_domain(domain):
}, },
'Services': { 'Services': {
'desktop_icons': ['Project', 'Timesheet', 'Customer', 'Sales Order', 'Sales Invoice', 'Lead', 'Opportunity', 'desktop_icons': ['Project', 'Timesheet', 'Customer', 'Sales Order', 'Sales Invoice',
'Expense Claim', 'Employee', 'HR', 'ToDo'], 'Lead', 'Opportunity', 'Task', 'Expense Claim', 'Employee', 'HR', 'ToDo'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'], 'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'],
'properties': [ 'properties': [
{'doctype': 'Item', 'fieldname': 'is_stock_item', 'property': 'default', 'value': 0}, {'doctype': 'Item', 'fieldname': 'is_stock_item', 'property': 'default', 'value': 0},
@ -59,10 +59,10 @@ def get_domain(domain):
}, },
'Education': { 'Education': {
'desktop_icons': ['Student', 'Program', 'Course', 'Student Group', 'Instructor', 'desktop_icons': ['Student', 'Program', 'Course', 'Student Group', 'Instructor',
'Fees', 'ToDo', 'Schools'], 'Fees', 'Task', 'ToDo', 'Schools'],
'allow_roles': ['Academics User', 'Accounts User', 'Accounts Manager', 'Item Manager', 'allow_roles': ['Academics User', 'Accounts User', 'Accounts Manager', 'Item Manager',
'Website Manager', 'HR User', 'HR Manager', 'Purchase User', 'Purchase Manager', 'Website Manager', 'HR User', 'HR Manager', 'Purchase User', 'Purchase Manager',
'Student'], 'Student', 'Projects User'],
'default_portal_role': 'Student' 'default_portal_role': 'Student'
}, },
} }

View File

@ -6,9 +6,11 @@ from __future__ import unicode_literals
import frappe import frappe
from frappe.utils.make_random import add_random_children from frappe.utils.make_random import add_random_children
import frappe.utils import frappe.utils
import random import random, os, json
from frappe import _
from markdown2 import markdown
def make_sample_data(): def make_sample_data(args):
"""Create a few opportunities, quotes, material requests, issues, todos, projects """Create a few opportunities, quotes, material requests, issues, todos, projects
to help the user get started""" to help the user get started"""
items = frappe.get_all("Item", {'is_sales_item': 1}) items = frappe.get_all("Item", {'is_sales_item': 1})
@ -22,7 +24,8 @@ def make_sample_data():
make_opportunity(items, customer) make_opportunity(items, customer)
make_quote(items, customer) make_quote(items, customer)
make_projects() make_projects(args.get('domain'))
import_email_alert()
if items and warehouses: if items and warehouses:
make_material_request(frappe.get_all("Item")) make_material_request(frappe.get_all("Item"))
@ -84,42 +87,91 @@ def make_material_request(items):
def make_issue(): def make_issue():
pass pass
def make_projects(): def make_projects(domain):
current_date = frappe.utils.nowdate()
project = frappe.get_doc({ project = frappe.get_doc({
"doctype": "Project", "doctype": "Project",
"project_name": "ERPNext Implementation", "project_name": "ERPNext Implementation",
}) })
current_date = frappe.utils.nowdate()
project.set("tasks", [ tasks = [
{
"title": "Explore ERPNext",
"start_date": current_date,
"end_date": current_date,
"file": "explore.md"
}]
if domain == 'Education':
tasks += [
{ {
"title": "Explore ERPNext", "title": _("Setup your School in ERPNext"),
"start_date": frappe.utils.add_days(current_date, 1), "start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 2) "end_date": frappe.utils.add_days(current_date, 1),
"file": "school_masters.md"
}, },
{ {
"title": "Run Sales Cycle", "title": "Setup Master Data",
"start_date": frappe.utils.add_days(current_date, 2), "start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 3) "end_date": frappe.utils.add_days(current_date, 1),
"file": "school_masters.md"
}]
else:
tasks += [
{
"title": "Setup Your Company",
"start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 1),
"file": "masters.md"
}, },
{ {
"title": "Run Billing Cycle", "title": "Start Tracking your Sales",
"start_date": frappe.utils.add_days(current_date, 3), "start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 4) "end_date": frappe.utils.add_days(current_date, 2),
"file": "sales.md"
}, },
{ {
"title": "Run Purchase Cycle", "title": "Start Managing Purchases",
"start_date": frappe.utils.add_days(current_date, 4), "start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 5) "end_date": frappe.utils.add_days(current_date, 3),
"file": "purchase.md"
}, },
{ {
"title": "Import Data", "title": "Import Data",
"start_date": frappe.utils.add_days(current_date, 5), "start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 6) "end_date": frappe.utils.add_days(current_date, 4),
"file": "import_data.md"
}, },
{ {
"title": "Go Live!", "title": "Go Live!",
"start_date": frappe.utils.add_days(current_date, 6), "start_date": current_date,
"end_date": frappe.utils.add_days(current_date, 7) "end_date": frappe.utils.add_days(current_date, 5),
}]) "file": "go_live.md"
}]
for t in tasks:
with open (os.path.join(os.path.dirname(__file__), "tasks", t['file'])) as f:
t['description'] = markdown(f.read())
del t['file']
project.append('tasks', t)
project.insert(ignore_permissions=True) project.insert(ignore_permissions=True)
def import_email_alert():
'''Import email alert for task start'''
with open (os.path.join(os.path.dirname(__file__), "tasks/task_alert.json")) as f:
email_alert = frappe.get_doc(json.loads(f.read())[0])
email_alert.insert()
# trigger the first message!
from frappe.email.doctype.email_alert.email_alert import trigger_daily_alerts
trigger_daily_alerts()
def test_sample():
frappe.db.sql('delete from `tabEmail Alert`')
frappe.db.sql('delete from tabProject')
frappe.db.sql('delete from tabTask')
make_projects('Education')
import_email_alert()

View File

@ -60,7 +60,7 @@ def setup_complete(args=None):
if args.get("add_sample_data"): if args.get("add_sample_data"):
try: try:
make_sample_data() make_sample_data(args)
frappe.clear_cache() frappe.clear_cache()
except: except:
# clear message # clear message

View File

@ -0,0 +1,7 @@
Thanks for checking this out! ❤️
If you are evaluating an ERP system for the first time, this is going to be quite a task! But don't worry, ERPNext is awesome.
First, get familiar with the surroundings. ERPNext covers a *lot of features*, go to the home page and click on the "Explore" icon.
All the best!

View File

@ -0,0 +1,18 @@
Ready to go live with ERPNext? 🏁🏁🏁
Here are the steps:
1. Sync up your **Chart of Accounts**
3. Add your opening stock using **Stock Reconciliation**
4. Add your open invoices (both sales and purchase)
3. Add your opening account balances by making a **Journal Entry**
If you need help for going live, sign up for an account at erpnext.com or find a partner to help you with this.
Or you can watch these videos 📺:
Setup your chart of accounts: https://www.youtube.com/watch?v=AcfMCT7wLLo
Add Open Stock: https://www.youtube.com/watch?v=nlHX0ZZ84Lw
Add Opening Balances: https://www.youtube.com/watch?v=nlHX0ZZ84Lw

View File

@ -0,0 +1,5 @@
Lets import some data! 💪💪
If you are already running a business, you most likely have your Items, Customers or Suppliers in some spreadsheet file somewhere, import it into ERPNext with the Data Import Tool.
Watch this video to get started: https://www.youtube.com/watch?v=Ta2Xx3QoK3E

View File

@ -0,0 +1,7 @@
Start building a model of your business in ERPNext by adding your Items and Customers.
These videos 📺 will help you get started:
Adding Customers and Suppliers: https://www.youtube.com/watch?v=zsrrVDk6VBs
Adding Items and Prices: https://www.youtube.com/watch?v=FcOsV-e8ymE

View File

@ -0,0 +1,10 @@
How to manage your purchasing in ERPNext 🛒🛒🛒:
1. Add a few **Suppliers**
2. Find out what you need by making **Material Requests**.
3. Now start placing orders via **Purchase Order**.
4. When your suppliers deliver, make **Purchase Receipts**
Now never run out of stock again! 😎
Watch this video 📺 to get an overview: https://www.youtube.com/watch?v=4TN9kPyfIqM

View File

@ -0,0 +1,8 @@
Start managing your sales with ERPNext 🔔🔔🔔:
1. Add potential business contacts as **Leads**
2. Udpate your deals in pipeline in **Opportunities**
3. Send proposals to your leads or customers with **Quotations**
4. Track confirmed orders with **Sales Orders**
Watch this video 📺 to get an overview: https://www.youtube.com/watch?v=o9XCSZHJfpA

View File

@ -0,0 +1,5 @@
Lets import some data! 💪💪
If you are already running a school, you most likely have your Students in some spreadsheet file somewhere. Import it into ERPNext with the Data Import Tool.
Watch this video to get started: https://www.youtube.com/watch?v=Ta2Xx3QoK3E

View File

@ -0,0 +1,9 @@
Lets start making things in ERPNext that are representative of your institution.
1. Make a list of **Programs** that you offer
1. Add a few **Courses** that your programs cover
1. Create **Academic Terms** and **Academic Years**
1. Start adding **Students**
1. Group your students into **Batches**
Watch this video to learn more about ERPNext Schools: https://www.youtube.com/watch?v=f6foQOyGzdA

View File

@ -0,0 +1,28 @@
[
{
"attach_print": 0,
"condition": "doc.status in ('Open', 'Overdue')",
"date_changed": "exp_end_date",
"days_in_advance": 0,
"docstatus": 0,
"doctype": "Email Alert",
"document_type": "Task",
"enabled": 1,
"event": "Days After",
"is_standard": 0,
"message": "<p>Task due today:</p>\n\n<div>\n{{ doc.description }}\n</div>\n\n<hr>\n<p style=\"font-size: 85%\">\nThis is a notification for a task that is due today, and a sample <b>Email Alert</b>. In ERPNext you can setup email alerts on anything, Invoices, Orders, Leads, Opportunities, so you never miss a thing.\n<br>To edit this, and setup other alerts, just type <b>Email Alert</b> in the search bar.</p>",
"method": null,
"modified": "2017-03-09 07:34:58.168370",
"module": null,
"name": "Task Due Alert",
"recipients": [
{
"cc": null,
"condition": null,
"email_by_document_field": "owner"
}
],
"subject": "{{ doc.subject }}",
"value_changed": null
}
]

View File

@ -8,7 +8,7 @@ def get_notification_config():
{ {
"Issue": {"status": "Open"}, "Issue": {"status": "Open"},
"Warranty Claim": {"status": "Open"}, "Warranty Claim": {"status": "Open"},
"Task": {"status": "Overdue"}, "Task": {"status": ("in", ("Open", "Overdue"))},
"Project": {"status": "Open"}, "Project": {"status": "Open"},
"Item": {"total_projected_qty": ("<", 0)}, "Item": {"total_projected_qty": ("<", 0)},
"Customer": {"status": "Open"}, "Customer": {"status": "Open"},