mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-16 18:24:10 +00:00
[re-org] setup wizard in frappe
This commit is contained in:
committed by
Anand Doshi
parent
f71ecbba2c
commit
37b4d75e4a
@@ -1,3 +0,0 @@
|
||||
<p class="lead">We have just starting using ERPNext, the Open Source ERP built for the web and loving it.</p>
|
||||
|
||||
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
|
||||
@@ -1,40 +0,0 @@
|
||||
.page-header {
|
||||
color: white;
|
||||
background: #263248;
|
||||
text-align: center;
|
||||
padding: 80px 0px;
|
||||
}
|
||||
|
||||
.page-header .page-header-left {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.page-header h1 {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.slide h2 {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.slides {
|
||||
margin-top: -15px;
|
||||
}
|
||||
|
||||
.slide {
|
||||
padding: 30px 40px;
|
||||
max-width: 800px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 900px;
|
||||
}
|
||||
|
||||
.img-wrapper {
|
||||
text-align: center;
|
||||
padding: 30px;
|
||||
background-color: #eee;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<div class="slides">
|
||||
<div class="row slide">
|
||||
<h2 class="text-center">{{ _("Awesome Products") }}</h2>
|
||||
<div class="col-md-6 text-center">
|
||||
<div class="img-wrapper">
|
||||
<i class="icon-wrench text-muted" style="font-size: 100px;"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row slide alt">
|
||||
<h2 class="text-center">{{ _("Awesome Services") }}</h2>
|
||||
<div class="col-md-6 text-center">
|
||||
<div class="img-wrapper">
|
||||
<i class="icon-phone text-muted" style="font-size: 100px;"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-center" style="margin-bottom: 50px;">
|
||||
<a href="/products" class="btn btn-success">Explore <i class="icon-chevron-right"></i></a>
|
||||
</p>
|
||||
<!-- no-sidebar -->
|
||||
@@ -1,92 +0,0 @@
|
||||
# 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 import _
|
||||
from frappe.utils import nowdate
|
||||
|
||||
class website_maker(object):
|
||||
def __init__(self, company, tagline, user):
|
||||
self.company = company
|
||||
self.tagline = tagline
|
||||
self.user = user
|
||||
self.make_web_page()
|
||||
self.make_website_settings()
|
||||
self.make_blog()
|
||||
|
||||
def make_web_page(self):
|
||||
# home page
|
||||
self.webpage = frappe.get_doc({
|
||||
"doctype": "Web Page",
|
||||
"title": self.company,
|
||||
"published": 1,
|
||||
"header": "<div class='hero text-center'><h1>{0}</h1>".format(self.tagline or "Headline")+\
|
||||
'<p>'+_("This is an example website auto-generated from ERPNext")+"</p>"+\
|
||||
'<p><a class="btn btn-primary" href="/login">Login</a></p></div>',
|
||||
"description": self.company + ":" + (self.tagline or ""),
|
||||
"css": frappe.get_template("setup/page/setup_wizard/data/sample_home_page.css").render(),
|
||||
"main_section": frappe.get_template("setup/page/setup_wizard/data/sample_home_page.html").render({
|
||||
"company": self.company, "tagline": (self.tagline or "")
|
||||
})
|
||||
}).insert()
|
||||
|
||||
def make_website_settings(self):
|
||||
# update in home page in settings
|
||||
website_settings = frappe.get_doc("Website Settings", "Website Settings")
|
||||
website_settings.home_page = self.webpage.name
|
||||
website_settings.brand_html = self.company
|
||||
website_settings.copyright = self.company
|
||||
website_settings.top_bar_items = []
|
||||
website_settings.append("top_bar_items", {
|
||||
"doctype": "Top Bar Item",
|
||||
"label":"Contact",
|
||||
"url": "/contact"
|
||||
})
|
||||
website_settings.append("top_bar_items", {
|
||||
"doctype": "Top Bar Item",
|
||||
"label":"Blog",
|
||||
"url": "/blog"
|
||||
})
|
||||
website_settings.append("top_bar_items", {
|
||||
"doctype": "Top Bar Item",
|
||||
"label": _("Products"),
|
||||
"url": "/products"
|
||||
})
|
||||
website_settings.save()
|
||||
|
||||
def make_blog(self):
|
||||
blogger = frappe.new_doc("Blogger")
|
||||
user = frappe.get_doc("User", self.user)
|
||||
blogger.user = self.user
|
||||
blogger.full_name = user.first_name + (" " + user.last_name if user.last_name else "")
|
||||
blogger.short_name = user.first_name.lower()
|
||||
blogger.avatar = user.user_image
|
||||
blogger.insert()
|
||||
|
||||
blog_category = frappe.get_doc({
|
||||
"doctype": "Blog Category",
|
||||
"category_name": "general",
|
||||
"published": 1,
|
||||
"title": _("General")
|
||||
}).insert()
|
||||
|
||||
frappe.get_doc({
|
||||
"doctype": "Blog Post",
|
||||
"title": "Welcome",
|
||||
"published": 1,
|
||||
"published_on": nowdate(),
|
||||
"blogger": blogger.name,
|
||||
"blog_category": blog_category.name,
|
||||
"blog_intro": "My First Blog",
|
||||
"content": frappe.get_template("setup/page/setup_wizard/data/sample_blog_post.html").render(),
|
||||
}).insert()
|
||||
|
||||
def test():
|
||||
frappe.delete_doc("Web Page", "test-company")
|
||||
frappe.delete_doc("Blog Post", "welcome")
|
||||
frappe.delete_doc("Blogger", "administrator")
|
||||
frappe.delete_doc("Blog Category", "general")
|
||||
website_maker("Test Company", "Better Tools for Everyone", "Administrator")
|
||||
frappe.db.commit()
|
||||
@@ -1,56 +0,0 @@
|
||||
from frappe import _
|
||||
|
||||
def get_industry_types():
|
||||
return [
|
||||
_('Accounting'),
|
||||
_('Advertising'),
|
||||
_('Aerospace'),
|
||||
_('Agriculture'),
|
||||
_('Airline'),
|
||||
_('Apparel & Accessories'),
|
||||
_('Automotive'),
|
||||
_('Banking'),
|
||||
_('Biotechnology'),
|
||||
_('Broadcasting'),
|
||||
_('Brokerage'),
|
||||
_('Chemical'),
|
||||
_('Computer'),
|
||||
_('Consulting'),
|
||||
_('Consumer Products'),
|
||||
_('Cosmetics'),
|
||||
_('Defense'),
|
||||
_('Department Stores'),
|
||||
_('Education'),
|
||||
_('Electronics'),
|
||||
_('Energy'),
|
||||
_('Entertainment & Leisure'),
|
||||
_('Executive Search'),
|
||||
_('Financial Services'),
|
||||
_('Food, Beverage & Tobacco'),
|
||||
_('Grocery'),
|
||||
_('Health Care'),
|
||||
_('Internet Publishing'),
|
||||
_('Investment Banking'),
|
||||
_('Legal'),
|
||||
_('Manufacturing'),
|
||||
_('Motion Picture & Video'),
|
||||
_('Music'),
|
||||
_('Newspaper Publishers'),
|
||||
_('Online Auctions'),
|
||||
_('Pension Funds'),
|
||||
_('Pharmaceuticals'),
|
||||
_('Private Equity'),
|
||||
_('Publishing'),
|
||||
_('Real Estate'),
|
||||
_('Retail & Wholesale'),
|
||||
_('Securities & Commodity Exchanges'),
|
||||
_('Service'),
|
||||
_('Soap & Detergent'),
|
||||
_('Software'),
|
||||
_('Sports'),
|
||||
_('Technology'),
|
||||
_('Telecommunications'),
|
||||
_('Television'),
|
||||
_('Transportation'),
|
||||
_('Venture Capital')
|
||||
]
|
||||
@@ -1,167 +0,0 @@
|
||||
# source: http://en.wikipedia.org/wiki/List_of_manufacturing_processes"
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from frappe import _
|
||||
|
||||
def get_operations():
|
||||
return [
|
||||
_("Centrifugal casting"),
|
||||
_("Continuous casting"),
|
||||
_("Die casting"),
|
||||
_("Evaporative-pattern casting"),
|
||||
_("Full-mold casting"),
|
||||
_("Lost-foam casting"),
|
||||
_("Investment casting"),
|
||||
_("Countergravity casting"),
|
||||
_("Permanent mold casting"),
|
||||
_("Resin casting"),
|
||||
_("Sand casting"),
|
||||
_("Shell molding"),
|
||||
_("Spray forming"),
|
||||
_("Vacuum molding"),
|
||||
_("Molding"),
|
||||
_("Compaction plus sintering"),
|
||||
_("Hot isostatic pressing"),
|
||||
_("Metal injection molding"),
|
||||
_("Injection molding"),
|
||||
_("Compression molding"),
|
||||
_("Blow molding"),
|
||||
_("Dip molding"),
|
||||
_("Rotational molding"),
|
||||
_("Thermoforming"),
|
||||
_("Laminating"),
|
||||
_("Shrink fitting"),
|
||||
_("Shrink wrapping"),
|
||||
_("End tube forming"),
|
||||
_("Tube beading"),
|
||||
_("Forging"),
|
||||
_("Rolling"),
|
||||
_("Cold rolling"),
|
||||
_("Hot rolling"),
|
||||
_("Cryorolling"),
|
||||
_("Cross-rolling"),
|
||||
_("Pressing"),
|
||||
_("Embossing"),
|
||||
_("Stretch forming"),
|
||||
_("Blanking"),
|
||||
_("Drawing"),
|
||||
_("Bulging"),
|
||||
_("Necking"),
|
||||
_("Nosing"),
|
||||
_("Deep drawing"),
|
||||
_("Bending"),
|
||||
_("Hemming"),
|
||||
_("Shearing"),
|
||||
_("Piercing"),
|
||||
_("Trimming"),
|
||||
_("Shaving"),
|
||||
_("Notching"),
|
||||
_("Perforating"),
|
||||
_("Nibbling"),
|
||||
_("Lancing"),
|
||||
_("Cutting"),
|
||||
_("Stamping"),
|
||||
_("Coining"),
|
||||
_("Straight shearing"),
|
||||
_("Slitting"),
|
||||
_("Redrawing"),
|
||||
_("Ironing"),
|
||||
_("Flattening"),
|
||||
_("Swaging"),
|
||||
_("Spinning"),
|
||||
_("Peening"),
|
||||
_("Explosive forming"),
|
||||
_("Electroforming"),
|
||||
_("Staking"),
|
||||
_("Seaming"),
|
||||
_("Flanging"),
|
||||
_("Straightening"),
|
||||
_("Decambering"),
|
||||
_("Cold sizing"),
|
||||
_("Hubbing"),
|
||||
_("Hot metal gas forming"),
|
||||
_("Curling"),
|
||||
_("Hydroforming"),
|
||||
_("Machining"),
|
||||
_("Milling"),
|
||||
_("Hammering"),
|
||||
_("Smelting"),
|
||||
_("Refining"),
|
||||
_("Annealing"),
|
||||
_("Pickling"),
|
||||
_("Coating"),
|
||||
_("Turning"),
|
||||
_("Facing"),
|
||||
_("Boring"),
|
||||
_("Knurling"),
|
||||
_("Hard turning"),
|
||||
_("Drilling"),
|
||||
_("Reaming"),
|
||||
_("Countersinking"),
|
||||
_("Tapping"),
|
||||
_("Sawing"),
|
||||
_("Filing"),
|
||||
_("Broaching"),
|
||||
_("Shaping"),
|
||||
_("Planing"),
|
||||
_("Double housing"),
|
||||
_("Abrasive jet machining"),
|
||||
_("Water jet cutting"),
|
||||
_("Photochemical machining"),
|
||||
_("Honing"),
|
||||
_("Electro-chemical grinding"),
|
||||
_("Finishing & industrial finishing"),
|
||||
_("Abrasive blasting"),
|
||||
_("Buffing"),
|
||||
_("Burnishing"),
|
||||
_("Electroplating"),
|
||||
_("Electropolishing"),
|
||||
_("Magnetic field-assisted finishing"),
|
||||
_("Etching"),
|
||||
_("Linishing"),
|
||||
_("Mass finishing"),
|
||||
_("Tumbling"),
|
||||
_("Spindle finishing"),
|
||||
_("Vibratory finishing"),
|
||||
_("Plating"),
|
||||
_("Polishing"),
|
||||
_("Superfinishing"),
|
||||
_("Wire brushing"),
|
||||
_("Routing"),
|
||||
_("Hobbing"),
|
||||
_("Ultrasonic machining"),
|
||||
_("Electron beam machining"),
|
||||
_("Electrochemical machining"),
|
||||
_("Laser cutting"),
|
||||
_("Laser drilling"),
|
||||
_("Grinding"),
|
||||
_("Gashing"),
|
||||
_("Biomachining"),
|
||||
_("Joining"),
|
||||
_("Welding"),
|
||||
_("Brazing"),
|
||||
_("Sintering"),
|
||||
_("Adhesive bonding"),
|
||||
_("Nailing"),
|
||||
_("Screwing"),
|
||||
_("Riveting"),
|
||||
_("Clinching"),
|
||||
_("Pinning"),
|
||||
_("Stitching"),
|
||||
_("Stapling"),
|
||||
_("Press fitting"),
|
||||
_("3D printing"),
|
||||
_("Direct metal laser sintering"),
|
||||
_("Fused deposition modeling"),
|
||||
_("Laminated object manufacturing"),
|
||||
_("Laser engineered net shaping"),
|
||||
_("Selective laser sintering"),
|
||||
_("Mining"),
|
||||
_("Quarrying"),
|
||||
_("Blasting"),
|
||||
_("Woodworking"),
|
||||
_("Lapping"),
|
||||
_("Morticing"),
|
||||
_("Crushing"),
|
||||
_("Packaging and labeling")
|
||||
]
|
||||
@@ -1,203 +0,0 @@
|
||||
# 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 import _
|
||||
|
||||
def install(country=None):
|
||||
records = [
|
||||
|
||||
# address template
|
||||
{'doctype':"Address Template", "country": country},
|
||||
|
||||
# item group
|
||||
{'doctype': 'Item Group', 'item_group_name': _('All Item Groups'),
|
||||
'is_group': 'Yes', 'parent_item_group': ''},
|
||||
{'doctype': 'Item Group', 'item_group_name': _('Products'),
|
||||
'is_group': 'No', 'parent_item_group': _('All Item Groups'), "show_in_website": 1 },
|
||||
{'doctype': 'Item Group', 'item_group_name': _('Raw Material'),
|
||||
'is_group': 'No', 'parent_item_group': _('All Item Groups') },
|
||||
{'doctype': 'Item Group', 'item_group_name': _('Services'),
|
||||
'is_group': 'No', 'parent_item_group': _('All Item Groups') },
|
||||
{'doctype': 'Item Group', 'item_group_name': _('Sub Assemblies'),
|
||||
'is_group': 'No', 'parent_item_group': _('All Item Groups') },
|
||||
{'doctype': 'Item Group', 'item_group_name': _('Consumable'),
|
||||
'is_group': 'No', 'parent_item_group': _('All Item Groups') },
|
||||
|
||||
# deduction type
|
||||
{'doctype': 'Deduction Type', 'name': _('Income Tax'), 'description': _('Income Tax'), 'deduction_name': _('Income Tax')},
|
||||
|
||||
# earning type
|
||||
{'doctype': 'Earning Type', 'name': _('Basic'), 'description': _('Basic'), 'earning_name': _('Basic'), 'taxable': 'Yes'},
|
||||
|
||||
# expense claim type
|
||||
{'doctype': 'Expense Claim Type', 'name': _('Calls'), 'expense_type': _('Calls')},
|
||||
{'doctype': 'Expense Claim Type', 'name': _('Food'), 'expense_type': _('Food')},
|
||||
{'doctype': 'Expense Claim Type', 'name': _('Medical'), 'expense_type': _('Medical')},
|
||||
{'doctype': 'Expense Claim Type', 'name': _('Others'), 'expense_type': _('Others')},
|
||||
{'doctype': 'Expense Claim Type', 'name': _('Travel'), 'expense_type': _('Travel')},
|
||||
|
||||
# leave type
|
||||
{'doctype': 'Leave Type', 'leave_type_name': _('Casual Leave'), 'name': _('Casual Leave'),
|
||||
'is_encash': 1, 'is_carry_forward': 1, 'max_days_allowed': '3', 'include_holiday': 1},
|
||||
{'doctype': 'Leave Type', 'leave_type_name': _('Compensatory Off'), 'name': _('Compensatory Off'),
|
||||
'is_encash': 0, 'is_carry_forward': 0, 'include_holiday': 1},
|
||||
{'doctype': 'Leave Type', 'leave_type_name': _('Sick Leave'), 'name': _('Sick Leave'),
|
||||
'is_encash': 0, 'is_carry_forward': 0, 'include_holiday': 1},
|
||||
{'doctype': 'Leave Type', 'leave_type_name': _('Privilege Leave'), 'name': _('Privilege Leave'),
|
||||
'is_encash': 0, 'is_carry_forward': 0, 'include_holiday': 1},
|
||||
{'doctype': 'Leave Type', 'leave_type_name': _('Leave Without Pay'), 'name': _('Leave Without Pay'),
|
||||
'is_encash': 0, 'is_carry_forward': 0, 'is_lwp':1, 'include_holiday': 1},
|
||||
|
||||
# Employment Type
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Full-time')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Part-time')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Probation')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Contract')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Commission')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Piecework')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Intern')},
|
||||
{'doctype': 'Employment Type', 'employee_type_name': _('Apprentice')},
|
||||
|
||||
# Department
|
||||
{'doctype': 'Department', 'department_name': _('Accounts')},
|
||||
{'doctype': 'Department', 'department_name': _('Marketing')},
|
||||
{'doctype': 'Department', 'department_name': _('Sales')},
|
||||
{'doctype': 'Department', 'department_name': _('Purchase')},
|
||||
{'doctype': 'Department', 'department_name': _('Operations')},
|
||||
{'doctype': 'Department', 'department_name': _('Production')},
|
||||
{'doctype': 'Department', 'department_name': _('Dispatch')},
|
||||
{'doctype': 'Department', 'department_name': _('Customer Service')},
|
||||
{'doctype': 'Department', 'department_name': _('Human Resources')},
|
||||
{'doctype': 'Department', 'department_name': _('Management')},
|
||||
{'doctype': 'Department', 'department_name': _('Quality Management')},
|
||||
{'doctype': 'Department', 'department_name': _('Research & Development')},
|
||||
{'doctype': 'Department', 'department_name': _('Legal')},
|
||||
|
||||
# Designation
|
||||
{'doctype': 'Designation', 'designation_name': _('CEO')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Manager')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Analyst')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Engineer')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Accountant')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Secretary')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Associate')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Administrative Officer')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Business Development Manager')},
|
||||
{'doctype': 'Designation', 'designation_name': _('HR Manager')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Project Manager')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Head of Marketing and Sales')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Software Developer')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Designer')},
|
||||
{'doctype': 'Designation', 'designation_name': _('Researcher')},
|
||||
|
||||
# territory
|
||||
{'doctype': 'Territory', 'territory_name': _('All Territories'), 'is_group': 'Yes', 'name': _('All Territories'), 'parent_territory': ''},
|
||||
|
||||
# customer group
|
||||
{'doctype': 'Customer Group', 'customer_group_name': _('All Customer Groups'), 'is_group': 'Yes', 'name': _('All Customer Groups'), 'parent_customer_group': ''},
|
||||
{'doctype': 'Customer Group', 'customer_group_name': _('Individual'), 'is_group': 'No', 'parent_customer_group': _('All Customer Groups')},
|
||||
{'doctype': 'Customer Group', 'customer_group_name': _('Commercial'), 'is_group': 'No', 'parent_customer_group': _('All Customer Groups')},
|
||||
{'doctype': 'Customer Group', 'customer_group_name': _('Non Profit'), 'is_group': 'No', 'parent_customer_group': _('All Customer Groups')},
|
||||
{'doctype': 'Customer Group', 'customer_group_name': _('Government'), 'is_group': 'No', 'parent_customer_group': _('All Customer Groups')},
|
||||
|
||||
# supplier type
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Services')},
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Local')},
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Raw Material')},
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Electrical')},
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Hardware')},
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Pharmaceutical')},
|
||||
{'doctype': 'Supplier Type', 'supplier_type': _('Distributor')},
|
||||
|
||||
# Sales Person
|
||||
{'doctype': 'Sales Person', 'sales_person_name': _('Sales Team'), 'is_group': "Yes", "parent_sales_person": ""},
|
||||
|
||||
# UOM
|
||||
{'uom_name': _('Unit'), 'doctype': 'UOM', 'name': _('Unit'), "must_be_whole_number": 1},
|
||||
{'uom_name': _('Box'), 'doctype': 'UOM', 'name': _('Box'), "must_be_whole_number": 1},
|
||||
{'uom_name': _('Kg'), 'doctype': 'UOM', 'name': _('Kg')},
|
||||
{'uom_name': _('Nos'), 'doctype': 'UOM', 'name': _('Nos'), "must_be_whole_number": 1},
|
||||
{'uom_name': _('Pair'), 'doctype': 'UOM', 'name': _('Pair'), "must_be_whole_number": 1},
|
||||
{'uom_name': _('Set'), 'doctype': 'UOM', 'name': _('Set'), "must_be_whole_number": 1},
|
||||
{'uom_name': _('Hour'), 'doctype': 'UOM', 'name': _('Hour')},
|
||||
{'uom_name': _('Minute'), 'doctype': 'UOM', 'name': _('Minute')},
|
||||
|
||||
# Mode of Payment
|
||||
{'doctype': 'Mode of Payment', 'mode_of_payment': 'Check' if country=="United States" else _('Cheque')},
|
||||
{'doctype': 'Mode of Payment', 'mode_of_payment': _('Cash')},
|
||||
{'doctype': 'Mode of Payment', 'mode_of_payment': _('Credit Card')},
|
||||
{'doctype': 'Mode of Payment', 'mode_of_payment': _('Wire Transfer')},
|
||||
{'doctype': 'Mode of Payment', 'mode_of_payment': _('Bank Draft')},
|
||||
|
||||
# Activity Type
|
||||
{'doctype': 'Activity Type', 'activity_type': _('Planning')},
|
||||
{'doctype': 'Activity Type', 'activity_type': _('Research')},
|
||||
{'doctype': 'Activity Type', 'activity_type': _('Proposal Writing')},
|
||||
{'doctype': 'Activity Type', 'activity_type': _('Execution')},
|
||||
{'doctype': 'Activity Type', 'activity_type': _('Communication')},
|
||||
|
||||
{'doctype': "Item Attribute", "attribute_name": _("Size"), "item_attribute_values": [
|
||||
{"attribute_value": _("Extra Small"), "abbr": "XS"},
|
||||
{"attribute_value": _("Small"), "abbr": "S"},
|
||||
{"attribute_value": _("Medium"), "abbr": "M"},
|
||||
{"attribute_value": _("Large"), "abbr": "L"},
|
||||
{"attribute_value": _("Extra Large"), "abbr": "XL"}
|
||||
]},
|
||||
|
||||
{'doctype': "Item Attribute", "attribute_name": _("Colour"), "item_attribute_values": [
|
||||
{"attribute_value": _("Red"), "abbr": "RED"},
|
||||
{"attribute_value": _("Green"), "abbr": "GRE"},
|
||||
{"attribute_value": _("Blue"), "abbr": "BLU"},
|
||||
{"attribute_value": _("Black"), "abbr": "BLA"},
|
||||
{"attribute_value": _("White"), "abbr": "WHI"}
|
||||
]},
|
||||
|
||||
{'doctype': "Email Account", "email_id": "sales@example.com", "append_to": "Opportunity"},
|
||||
{'doctype': "Email Account", "email_id": "support@example.com", "append_to": "Issue"},
|
||||
{'doctype': "Email Account", "email_id": "jobs@example.com", "append_to": "Job Applicant"},
|
||||
|
||||
{"doctype": "Offer Term", "offer_term": _("Date of Joining")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Annual Salary")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Probationary Period")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Employee Benefits")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Working Hours")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Stock Options")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Department")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Job Description")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Responsibilities")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Leaves per Year")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Notice Period")},
|
||||
{"doctype": "Offer Term", "offer_term": _("Incentives")},
|
||||
|
||||
{'doctype': "Print Heading", 'print_heading': _("Credit Note")},
|
||||
{'doctype': "Print Heading", 'print_heading': _("Debit Note")}
|
||||
]
|
||||
|
||||
from erpnext.setup.page.setup_wizard.fixtures.industry_type import get_industry_types
|
||||
records += [{"doctype":"Industry Type", "industry": d} for d in get_industry_types()]
|
||||
# records += [{"doctype":"Operation", "operation": d} for d in get_operations()]
|
||||
|
||||
from frappe.modules import scrub
|
||||
for r in records:
|
||||
doc = frappe.new_doc(r.get("doctype"))
|
||||
doc.update(r)
|
||||
|
||||
# ignore mandatory for root
|
||||
parent_link_field = ("parent_" + scrub(doc.doctype))
|
||||
if doc.meta.get_field(parent_link_field) and not doc.get(parent_link_field):
|
||||
doc.flags.ignore_mandatory = True
|
||||
|
||||
try:
|
||||
doc.insert(ignore_permissions=True)
|
||||
except frappe.DuplicateEntryError, e:
|
||||
# pass DuplicateEntryError and continue
|
||||
if e.args and e.args[0]==doc.doctype and e.args[1]==doc.name:
|
||||
# make sure DuplicateEntryError is for the exact same doc and not a related doc
|
||||
pass
|
||||
else:
|
||||
raise
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
# 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 add_random_children
|
||||
import frappe.utils
|
||||
import random
|
||||
|
||||
def make_sample_data():
|
||||
"""Create a few opportunities, quotes, material requests, issues, todos, projects
|
||||
to help the user get started"""
|
||||
|
||||
selling_items = frappe.get_all("Item", filters = {"is_sales_item": 1})
|
||||
buying_items = frappe.get_all("Item", filters = {"is_purchase_item": 1})
|
||||
customers = frappe.get_all("Customer")
|
||||
|
||||
if selling_items and customers:
|
||||
for i in range(3):
|
||||
customer = random.choice(customers).name
|
||||
make_opportunity(selling_items, customer)
|
||||
make_quote(selling_items, customer)
|
||||
|
||||
make_projects()
|
||||
|
||||
if buying_items:
|
||||
make_material_request(buying_items)
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
def make_opportunity(selling_items, customer):
|
||||
b = frappe.get_doc({
|
||||
"doctype": "Opportunity",
|
||||
"enquiry_from": "Customer",
|
||||
"customer": customer,
|
||||
"enquiry_type": "Sales",
|
||||
"with_items": 1
|
||||
})
|
||||
|
||||
add_random_children(b, "items", rows=len(selling_items), randomize = {
|
||||
"qty": (1, 5),
|
||||
"item_code": ("Item", {"is_sales_item": 1})
|
||||
}, unique="item_code")
|
||||
|
||||
b.insert(ignore_permissions=True)
|
||||
|
||||
b.add_comment("This is a dummy record")
|
||||
|
||||
def make_quote(selling_items, customer):
|
||||
qtn = frappe.get_doc({
|
||||
"doctype": "Quotation",
|
||||
"quotation_to": "Customer",
|
||||
"customer": customer,
|
||||
"order_type": "Sales"
|
||||
})
|
||||
|
||||
add_random_children(qtn, "items", rows=len(selling_items), randomize = {
|
||||
"qty": (1, 5),
|
||||
"item_code": ("Item", {"is_sales_item": 1})
|
||||
}, unique="item_code")
|
||||
|
||||
qtn.insert(ignore_permissions=True)
|
||||
|
||||
qtn.add_comment("This is a dummy record")
|
||||
|
||||
def make_material_request(buying_items):
|
||||
for i in buying_items:
|
||||
mr = frappe.get_doc({
|
||||
"doctype": "Material Request",
|
||||
"material_request_type": "Purchase",
|
||||
"items": [{
|
||||
"schedule_date": frappe.utils.add_days(frappe.utils.nowdate(), 7),
|
||||
"item_code": i.name,
|
||||
"qty": 10
|
||||
}]
|
||||
})
|
||||
mr.insert()
|
||||
mr.submit()
|
||||
|
||||
mr.add_comment("This is a dummy record")
|
||||
|
||||
|
||||
def make_issue():
|
||||
pass
|
||||
|
||||
def make_projects():
|
||||
project = frappe.get_doc({
|
||||
"doctype": "Project",
|
||||
"project_name": "ERPNext Implementation",
|
||||
})
|
||||
current_date = frappe.utils.nowdate()
|
||||
project.set("tasks", [
|
||||
{
|
||||
"title": "Explore ERPNext",
|
||||
"start_date": frappe.utils.add_days(current_date, 1),
|
||||
"end_date": frappe.utils.add_days(current_date, 2)
|
||||
},
|
||||
{
|
||||
"title": "Run Sales Cycle",
|
||||
"start_date": frappe.utils.add_days(current_date, 2),
|
||||
"end_date": frappe.utils.add_days(current_date, 3)
|
||||
},
|
||||
{
|
||||
"title": "Run Billing Cycle",
|
||||
"start_date": frappe.utils.add_days(current_date, 3),
|
||||
"end_date": frappe.utils.add_days(current_date, 4)
|
||||
},
|
||||
{
|
||||
"title": "Run Purchase Cycle",
|
||||
"start_date": frappe.utils.add_days(current_date, 4),
|
||||
"end_date": frappe.utils.add_days(current_date, 5)
|
||||
},
|
||||
{
|
||||
"title": "Import Data",
|
||||
"start_date": frappe.utils.add_days(current_date, 5),
|
||||
"end_date": frappe.utils.add_days(current_date, 6)
|
||||
},
|
||||
{
|
||||
"title": "Go Live!",
|
||||
"start_date": frappe.utils.add_days(current_date, 6),
|
||||
"end_date": frappe.utils.add_days(current_date, 7)
|
||||
}])
|
||||
|
||||
project.insert(ignore_permissions=True)
|
||||
@@ -1,70 +0,0 @@
|
||||
.setup-wizard-slide {
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.setup-wizard-slide.single-column {
|
||||
max-width: 500px;
|
||||
}
|
||||
|
||||
.setup-wizard-slide.two-column {
|
||||
max-width: 768px;
|
||||
}
|
||||
}
|
||||
|
||||
.setup-wizard-slide .lead {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.setup-wizard-slide .form {
|
||||
margin-top: 20px;
|
||||
border: 1px solid #d1d8dd;
|
||||
box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.setup-wizard-slide .footer {
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.setup-wizard-progress {
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
padding-bottom: 15px;
|
||||
margin: -20px auto 20px;
|
||||
}
|
||||
|
||||
.setup-wizard-slide .icon-fixed-width {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.setup-wizard-slide .icon-circle-blank {
|
||||
font-size: 7px;
|
||||
}
|
||||
|
||||
.setup-wizard-slide .icon-circle {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.setup-wizard-slide .frappe-control[data-fieldtype="Attach Image"] {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.setup-wizard-slide .missing-image,
|
||||
.setup-wizard-slide .attach-image-display {
|
||||
display: block;
|
||||
position: relative;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0);
|
||||
-webkit-transform: translate(-50%, 0);
|
||||
}
|
||||
|
||||
.setup-wizard-slide .missing-image .octicon {
|
||||
position: relative;
|
||||
top: 50%;
|
||||
transform: translate(0px, -50%);
|
||||
-webkit-transform: translate(0px, -50%);
|
||||
}
|
||||
|
||||
.setup-wizard-message-image {
|
||||
margin: 15px auto;
|
||||
}
|
||||
@@ -1,710 +0,0 @@
|
||||
frappe.provide("erpnext.wiz");
|
||||
|
||||
frappe.pages['setup-wizard'].on_page_load = function(wrapper) {
|
||||
if(sys_defaults.company) {
|
||||
frappe.set_route("desk-home");
|
||||
return;
|
||||
}
|
||||
$(".navbar:first").toggle(false);
|
||||
$("body").css({"padding-top":"30px"});
|
||||
|
||||
frappe.require("/assets/frappe/css/animate.min.css");
|
||||
|
||||
var wizard_settings = {
|
||||
page_name: "setup-wizard",
|
||||
parent: wrapper,
|
||||
on_complete: function(wiz) {
|
||||
erpnext.wiz.setup_account(wiz);
|
||||
},
|
||||
title: __("Welcome"),
|
||||
working_html: erpnext.wiz.working_html,
|
||||
complete_html: erpnext.wiz.complete_html,
|
||||
slides: [
|
||||
erpnext.wiz.welcome.slide,
|
||||
erpnext.wiz.region.slide,
|
||||
erpnext.wiz.user.slide,
|
||||
erpnext.wiz.org.slide,
|
||||
erpnext.wiz.branding.slide,
|
||||
erpnext.wiz.users.slide,
|
||||
erpnext.wiz.taxes.slide,
|
||||
erpnext.wiz.customers.slide,
|
||||
erpnext.wiz.suppliers.slide,
|
||||
erpnext.wiz.items.slide
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
erpnext.wiz.wizard = new erpnext.wiz.Wizard(wizard_settings)
|
||||
}
|
||||
|
||||
frappe.pages['setup-wizard'].on_page_show = function(wrapper) {
|
||||
if(frappe.get_route()[1]) {
|
||||
erpnext.wiz.wizard.show(frappe.get_route()[1]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
erpnext.wiz.Wizard = Class.extend({
|
||||
init: function(opts) {
|
||||
$.extend(this, opts);
|
||||
this.make();
|
||||
this.slides = this.slides;
|
||||
this.slide_dict = {};
|
||||
this.welcomed = true;
|
||||
frappe.set_route("setup-wizard/0");
|
||||
},
|
||||
make: function() {
|
||||
this.parent = $('<div class="setup-wizard-wrapper">').appendTo(this.parent);
|
||||
},
|
||||
get_message: function(html) {
|
||||
return $(repl('<div data-state="setup-complete">\
|
||||
<div style="padding: 40px;" class="text-center">%(html)s</div>\
|
||||
</div>', {html:html}))
|
||||
},
|
||||
show_working: function() {
|
||||
this.hide_current_slide();
|
||||
frappe.set_route(this.page_name);
|
||||
this.current_slide = {"$wrapper": this.get_message(this.working_html()).appendTo(this.parent)};
|
||||
},
|
||||
show_complete: function() {
|
||||
this.hide_current_slide();
|
||||
this.current_slide = {"$wrapper": this.get_message(this.complete_html()).appendTo(this.parent)};
|
||||
},
|
||||
show: function(id) {
|
||||
if(!this.welcomed) {
|
||||
frappe.set_route(this.page_name);
|
||||
return;
|
||||
}
|
||||
id = cint(id);
|
||||
if(this.current_slide && this.current_slide.id===id)
|
||||
return;
|
||||
if(!this.slide_dict[id]) {
|
||||
this.slide_dict[id] = new erpnext.wiz.WizardSlide($.extend(this.slides[id], {wiz:this, id:id}));
|
||||
this.slide_dict[id].make();
|
||||
}
|
||||
|
||||
this.hide_current_slide();
|
||||
|
||||
this.current_slide = this.slide_dict[id];
|
||||
this.current_slide.$wrapper.removeClass("hidden");
|
||||
},
|
||||
hide_current_slide: function() {
|
||||
if(this.current_slide) {
|
||||
this.current_slide.$wrapper.addClass("hidden");
|
||||
this.current_slide = null;
|
||||
}
|
||||
},
|
||||
get_values: function() {
|
||||
var values = {};
|
||||
$.each(this.slide_dict, function(id, slide) {
|
||||
$.extend(values, slide.values)
|
||||
})
|
||||
return values;
|
||||
}
|
||||
});
|
||||
|
||||
erpnext.wiz.WizardSlide = Class.extend({
|
||||
init: function(opts) {
|
||||
$.extend(this, opts);
|
||||
this.$wrapper = $('<div class="slide-wrapper hidden"></div>')
|
||||
.appendTo(this.wiz.parent)
|
||||
.attr("data-slide-id", this.id);
|
||||
},
|
||||
make: function() {
|
||||
var me = this;
|
||||
if(this.$body) this.$body.remove();
|
||||
|
||||
if(this.before_load) {
|
||||
this.before_load(this);
|
||||
}
|
||||
|
||||
this.$body = $(frappe.render_template("setup_wizard_page", {
|
||||
help: __(this.help),
|
||||
title:__(this.title),
|
||||
main_title:__(this.wiz.title),
|
||||
step: this.id + 1,
|
||||
name: this.name,
|
||||
css_class: this.css_class || "",
|
||||
slides_count: this.wiz.slides.length
|
||||
})).appendTo(this.$wrapper);
|
||||
|
||||
this.body = this.$body.find(".form")[0];
|
||||
|
||||
if(this.fields) {
|
||||
this.form = new frappe.ui.FieldGroup({
|
||||
fields: this.fields,
|
||||
body: this.body,
|
||||
no_submit_on_enter: true
|
||||
});
|
||||
this.form.make();
|
||||
} else {
|
||||
$(this.body).html(this.html);
|
||||
}
|
||||
|
||||
if(this.id > 0) {
|
||||
this.$prev = this.$body.find('.prev-btn').removeClass("hide")
|
||||
.click(function() {
|
||||
frappe.set_route(me.wiz.page_name, me.id-1 + "");
|
||||
})
|
||||
.css({"margin-right": "10px"});
|
||||
}
|
||||
if(this.id+1 < this.wiz.slides.length) {
|
||||
this.$next = this.$body.find('.next-btn').removeClass("hide")
|
||||
.click(function() {
|
||||
me.values = me.form.get_values();
|
||||
if(me.values===null)
|
||||
return;
|
||||
if(me.validate && !me.validate())
|
||||
return;
|
||||
frappe.set_route(me.wiz.page_name, me.id+1 + "");
|
||||
})
|
||||
} else {
|
||||
this.$complete = this.$body.find('.complete-btn').removeClass("hide")
|
||||
.click(function() {
|
||||
me.values = me.form.get_values();
|
||||
if(me.values===null)
|
||||
return;
|
||||
if(me.validate && !me.validate())
|
||||
return;
|
||||
me.wiz.on_complete(me.wiz);
|
||||
})
|
||||
}
|
||||
|
||||
if(this.onload) {
|
||||
this.onload(this);
|
||||
}
|
||||
|
||||
},
|
||||
get_input: function(fn) {
|
||||
return this.form.get_input(fn);
|
||||
},
|
||||
get_field: function(fn) {
|
||||
return this.form.get_field(fn);
|
||||
}
|
||||
});
|
||||
|
||||
$.extend(erpnext.wiz, {
|
||||
welcome: {
|
||||
slide: {
|
||||
name: "welcome",
|
||||
title: __("Welcome to ERPNext"),
|
||||
icon: "icon-world",
|
||||
help: __("Let's prepare the system for first use."),
|
||||
|
||||
fields: [
|
||||
{ fieldname: "language", label: __("Select Your Language"), reqd:1,
|
||||
fieldtype: "Select" },
|
||||
],
|
||||
|
||||
onload: function(slide) {
|
||||
if (!erpnext.wiz.welcome.data) {
|
||||
erpnext.wiz.welcome.load_languages(slide);
|
||||
} else {
|
||||
erpnext.wiz.welcome.setup_fields(slide);
|
||||
}
|
||||
},
|
||||
|
||||
css_class: "single-column"
|
||||
},
|
||||
|
||||
load_languages: function(slide) {
|
||||
frappe.call({
|
||||
method: "erpnext.setup.page.setup_wizard.setup_wizard.load_languages",
|
||||
callback: function(r) {
|
||||
erpnext.wiz.welcome.data = r.message;
|
||||
erpnext.wiz.welcome.setup_fields(slide);
|
||||
|
||||
slide.get_field("language")
|
||||
.set_input(erpnext.wiz.welcome.data.default_language || "english");
|
||||
moment.locale("en");
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
setup_fields: function(slide) {
|
||||
var select = slide.get_field("language");
|
||||
select.df.options = erpnext.wiz.welcome.data.languages;
|
||||
select.refresh();
|
||||
erpnext.wiz.welcome.bind_events(slide);
|
||||
},
|
||||
|
||||
bind_events: function(slide) {
|
||||
slide.get_input("language").unbind("change").on("change", function() {
|
||||
var lang = $(this).val() || "english";
|
||||
frappe._messages = {};
|
||||
frappe.call({
|
||||
method: "erpnext.setup.page.setup_wizard.setup_wizard.load_messages",
|
||||
args: {
|
||||
language: lang
|
||||
},
|
||||
callback: function(r) {
|
||||
// TODO save values!
|
||||
|
||||
// re-render all slides
|
||||
$.each(slide.wiz.slide_dict, function(key, s) {
|
||||
s.make();
|
||||
});
|
||||
|
||||
// select is re-made after language change
|
||||
var select = slide.get_field("language");
|
||||
select.set_input(lang);
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
region: {
|
||||
slide: {
|
||||
title: __("Region"),
|
||||
icon: "icon-flag",
|
||||
help: __("Select your Country, Time Zone and Currency"),
|
||||
fields: [
|
||||
{ fieldname: "country", label: __("Country"), reqd:1,
|
||||
fieldtype: "Select" },
|
||||
{ fieldname: "timezone", label: __("Time Zone"), reqd:1,
|
||||
fieldtype: "Select" },
|
||||
{ fieldname: "currency", label: __("Currency"), reqd:1,
|
||||
fieldtype: "Select" },
|
||||
],
|
||||
|
||||
onload: function(slide) {
|
||||
frappe.call({
|
||||
method:"frappe.geo.country_info.get_country_timezone_info",
|
||||
callback: function(data) {
|
||||
erpnext.wiz.region.data = data.message;
|
||||
erpnext.wiz.region.setup_fields(slide);
|
||||
erpnext.wiz.region.bind_events(slide);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
css_class: "single-column"
|
||||
},
|
||||
|
||||
setup_fields: function(slide) {
|
||||
var data = erpnext.wiz.region.data;
|
||||
|
||||
slide.get_input("country").empty()
|
||||
.add_options([""].concat(keys(data.country_info).sort()));
|
||||
|
||||
slide.get_input("currency").empty()
|
||||
.add_options(frappe.utils.unique([""].concat($.map(data.country_info,
|
||||
function(opts, country) { return opts.currency; }))).sort());
|
||||
|
||||
slide.get_input("timezone").empty()
|
||||
.add_options([""].concat(data.all_timezones));
|
||||
|
||||
if (data.default_country) {
|
||||
slide.set_input("country", data.default_country);
|
||||
}
|
||||
},
|
||||
|
||||
bind_events: function(slide) {
|
||||
slide.get_input("country").on("change", function() {
|
||||
var country = slide.get_input("country").val();
|
||||
var $timezone = slide.get_input("timezone");
|
||||
var data = erpnext.wiz.region.data;
|
||||
|
||||
$timezone.empty();
|
||||
|
||||
// add country specific timezones first
|
||||
if(country) {
|
||||
var timezone_list = data.country_info[country].timezones || [];
|
||||
$timezone.add_options(timezone_list.sort());
|
||||
slide.get_field("currency").set_input(data.country_info[country].currency);
|
||||
slide.get_field("currency").$input.trigger("change");
|
||||
}
|
||||
|
||||
// add all timezones at the end, so that user has the option to change it to any timezone
|
||||
$timezone.add_options([""].concat(data.all_timezones));
|
||||
|
||||
slide.get_field("timezone").set_input($timezone.val());
|
||||
|
||||
// temporarily set date format
|
||||
frappe.boot.sysdefaults.date_format = (data.country_info[country].date_format
|
||||
|| "dd-mm-yyyy");
|
||||
});
|
||||
|
||||
slide.get_input("currency").on("change", function() {
|
||||
var currency = slide.get_input("currency").val();
|
||||
if (!currency) return;
|
||||
frappe.model.with_doc("Currency", currency, function() {
|
||||
frappe.provide("locals.:Currency." + currency);
|
||||
var currency_doc = frappe.model.get_doc("Currency", currency);
|
||||
var number_format = currency_doc.number_format;
|
||||
if (number_format==="#.###") {
|
||||
number_format = "#.###,##";
|
||||
} else if (number_format==="#,###") {
|
||||
number_format = "#,###.##"
|
||||
}
|
||||
|
||||
frappe.boot.sysdefaults.number_format = number_format;
|
||||
locals[":Currency"][currency] = $.extend({}, currency_doc);
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
user: {
|
||||
slide: {
|
||||
title: __("The First User: You"),
|
||||
icon: "icon-user",
|
||||
fields: [
|
||||
{"fieldname": "first_name", "label": __("First Name"), "fieldtype": "Data",
|
||||
reqd:1},
|
||||
{"fieldname": "last_name", "label": __("Last Name"), "fieldtype": "Data"},
|
||||
{"fieldname": "email", "label": __("Email Address"), "fieldtype": "Data",
|
||||
reqd:1, "description": __("You will use it to Login"), "options":"Email"},
|
||||
{"fieldname": "password", "label": __("Password"), "fieldtype": "Password",
|
||||
reqd:1},
|
||||
{fieldtype:"Attach Image", fieldname:"attach_user",
|
||||
label: __("Attach Your Picture")},
|
||||
],
|
||||
help: __('The first user will become the System Manager (you can change this later).'),
|
||||
onload: function(slide) {
|
||||
if(user!=="Administrator") {
|
||||
slide.form.fields_dict.password.$wrapper.toggle(false);
|
||||
slide.form.fields_dict.email.$wrapper.toggle(false);
|
||||
slide.form.fields_dict.first_name.set_input(frappe.boot.user.first_name);
|
||||
slide.form.fields_dict.last_name.set_input(frappe.boot.user.last_name);
|
||||
|
||||
var user_image = frappe.get_cookie("user_image");
|
||||
if(user_image) {
|
||||
var $attach_user = slide.form.fields_dict.attach_user.$wrapper;
|
||||
$attach_user.find(".missing-image").toggle(false);
|
||||
$attach_user.find("img").attr("src", decodeURIComponent(user_image)).toggle(true);
|
||||
}
|
||||
|
||||
delete slide.form.fields_dict.email;
|
||||
delete slide.form.fields_dict.password;
|
||||
}
|
||||
},
|
||||
css_class: "single-column"
|
||||
},
|
||||
},
|
||||
|
||||
org: {
|
||||
slide: {
|
||||
title: __("The Organization"),
|
||||
icon: "icon-building",
|
||||
fields: [
|
||||
{fieldname:'company_name', label: __('Company Name'), fieldtype:'Data', reqd:1,
|
||||
placeholder: __('e.g. "My Company LLC"')},
|
||||
{fieldname:'company_abbr', label: __('Company Abbreviation'), fieldtype:'Data',
|
||||
description: __('Max 5 characters'), placeholder: __('e.g. "MC"'), reqd:1},
|
||||
{fieldname:'company_tagline', label: __('What does it do?'), fieldtype:'Data',
|
||||
placeholder:__('e.g. "Build tools for builders"'), reqd:1},
|
||||
{fieldname:'bank_account', label: __('Bank Account'), fieldtype:'Data',
|
||||
placeholder: __('e.g. "XYZ National Bank"'), reqd:1 },
|
||||
{fieldname:'chart_of_accounts', label: __('Chart of Accounts'),
|
||||
options: "", fieldtype: 'Select'},
|
||||
|
||||
// TODO remove this
|
||||
{fieldtype: "Section Break"},
|
||||
{fieldname:'fy_start_date', label:__('Financial Year Start Date'), fieldtype:'Date',
|
||||
description: __('Your financial year begins on'), reqd:1},
|
||||
{fieldname:'fy_end_date', label:__('Financial Year End Date'), fieldtype:'Date',
|
||||
description: __('Your financial year ends on'), reqd:1},
|
||||
],
|
||||
help: __('The name of your company for which you are setting up this system.'),
|
||||
|
||||
onload: function(slide) {
|
||||
erpnext.wiz.org.load_chart_of_accounts(slide);
|
||||
erpnext.wiz.org.bind_events(slide);
|
||||
erpnext.wiz.org.set_fy_dates(slide);
|
||||
},
|
||||
|
||||
css_class: "single-column"
|
||||
},
|
||||
|
||||
set_fy_dates: function(slide) {
|
||||
var country = slide.wiz.get_values().country;
|
||||
|
||||
if(country) {
|
||||
var fy = erpnext.wiz.fiscal_years[country];
|
||||
var current_year = moment(new Date()).year();
|
||||
var next_year = current_year + 1;
|
||||
if(!fy) {
|
||||
fy = ["01-01", "12-31"];
|
||||
next_year = current_year;
|
||||
}
|
||||
|
||||
slide.get_field("fy_start_date").set_input(current_year + "-" + fy[0]);
|
||||
slide.get_field("fy_end_date").set_input(next_year + "-" + fy[1]);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
load_chart_of_accounts: function(slide) {
|
||||
var country = slide.wiz.get_values().country;
|
||||
|
||||
if(country) {
|
||||
frappe.call({
|
||||
method: "erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts.get_charts_for_country",
|
||||
args: {"country": country},
|
||||
callback: function(r) {
|
||||
if(r.message) {
|
||||
slide.get_input("chart_of_accounts").empty()
|
||||
.add_options(r.message);
|
||||
|
||||
if (r.message.length===1) {
|
||||
var field = slide.get_field("chart_of_accounts");
|
||||
field.set_value(r.message[0]);
|
||||
field.df.hidden = 1;
|
||||
field.refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
bind_events: function(slide) {
|
||||
slide.get_input("company_name").on("change", function() {
|
||||
var parts = slide.get_input("company_name").val().split(" ");
|
||||
var abbr = $.map(parts, function(p) { return p ? p.substr(0,1) : null }).join("");
|
||||
slide.get_field("company_abbr").set_input(abbr.slice(0, 5).toUpperCase());
|
||||
}).val(frappe.boot.sysdefaults.company_name || "").trigger("change");
|
||||
|
||||
slide.get_input("company_abbr").on("change", function() {
|
||||
if(slide.get_input("company_abbr").val().length > 5) {
|
||||
msgprint("Company Abbreviation cannot have more than 5 characters");
|
||||
slide.get_field("company_abbr").set_input("");
|
||||
}
|
||||
});
|
||||
|
||||
// TODO remove this
|
||||
slide.get_input("fy_start_date").on("change", function() {
|
||||
var year_end_date =
|
||||
frappe.datetime.add_days(frappe.datetime.add_months(
|
||||
frappe.datetime.user_to_obj(slide.get_input("fy_start_date").val()), 12), -1);
|
||||
slide.get_input("fy_end_date").val(frappe.datetime.obj_to_user(year_end_date));
|
||||
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
branding: {
|
||||
slide: {
|
||||
icon: "icon-bookmark",
|
||||
title: __("The Brand"),
|
||||
help: __('Upload your letter head and logo. (you can edit them later).'),
|
||||
fields: [
|
||||
{fieldtype:"Attach Image", fieldname:"attach_letterhead",
|
||||
label: __("Attach Letterhead"),
|
||||
description: __("Keep it web friendly 900px (w) by 100px (h)")
|
||||
},
|
||||
{fieldtype: "Column Break"},
|
||||
{fieldtype:"Attach Image", fieldname:"attach_logo",
|
||||
label:__("Attach Logo"),
|
||||
description: __("100px by 100px")},
|
||||
],
|
||||
|
||||
css_class: "two-column"
|
||||
},
|
||||
},
|
||||
|
||||
users: {
|
||||
slide: {
|
||||
icon: "icon-money",
|
||||
"title": __("Add Users"),
|
||||
"help": __("Add users to your organization, other than yourself"),
|
||||
"fields": [],
|
||||
before_load: function(slide) {
|
||||
slide.fields = [];
|
||||
for(var i=1; i<5; i++) {
|
||||
slide.fields = slide.fields.concat([
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"user_fullname_"+ i,
|
||||
label:__("Full Name")},
|
||||
{fieldtype:"Data", fieldname:"user_email_" + i,
|
||||
label:__("Email ID"), placeholder:__("user@example.com"),
|
||||
options: "Email"},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype: "Check", fieldname: "user_sales_" + i,
|
||||
label:__("Sales"), default: 1},
|
||||
{fieldtype: "Check", fieldname: "user_purchaser_" + i,
|
||||
label:__("Purchaser"), default: 1},
|
||||
{fieldtype: "Check", fieldname: "user_accountant_" + i,
|
||||
label:__("Accountant"), default: 1},
|
||||
]);
|
||||
}
|
||||
},
|
||||
css_class: "two-column"
|
||||
},
|
||||
},
|
||||
|
||||
taxes: {
|
||||
slide: {
|
||||
icon: "icon-money",
|
||||
"title": __("Add Taxes"),
|
||||
"help": __("List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later."),
|
||||
"fields": [],
|
||||
before_load: function(slide) {
|
||||
slide.fields = [];
|
||||
for(var i=1; i<4; i++) {
|
||||
slide.fields = slide.fields.concat([
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"tax_"+ i, label:__("Tax") + " " + i,
|
||||
placeholder:__("e.g. VAT") + " " + i},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype:"Float", fieldname:"tax_rate_" + i, label:__("Rate (%)"), placeholder:__("e.g. 5")},
|
||||
]);
|
||||
}
|
||||
},
|
||||
css_class: "two-column"
|
||||
},
|
||||
},
|
||||
|
||||
customers: {
|
||||
slide: {
|
||||
icon: "icon-group",
|
||||
"title": __("Your Customers"),
|
||||
"help": __("List a few of your customers. They could be organizations or individuals."),
|
||||
"fields": [],
|
||||
before_load: function(slide) {
|
||||
slide.fields = [];
|
||||
for(var i=1; i<6; i++) {
|
||||
slide.fields = slide.fields.concat([
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"customer_" + i, label:__("Customer") + " " + i,
|
||||
placeholder:__("Customer Name")},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype:"Data", fieldname:"customer_contact_" + i,
|
||||
label:__("Contact Name") + " " + i, placeholder:__("Contact Name")}
|
||||
])
|
||||
}
|
||||
slide.fields[1].reqd = 1;
|
||||
},
|
||||
css_class: "two-column"
|
||||
},
|
||||
},
|
||||
|
||||
suppliers: {
|
||||
slide: {
|
||||
icon: "icon-group",
|
||||
"title": __("Your Suppliers"),
|
||||
"help": __("List a few of your suppliers. They could be organizations or individuals."),
|
||||
"fields": [],
|
||||
before_load: function(slide) {
|
||||
slide.fields = [];
|
||||
for(var i=1; i<6; i++) {
|
||||
slide.fields = slide.fields.concat([
|
||||
{fieldtype:"Section Break"},
|
||||
{fieldtype:"Data", fieldname:"supplier_" + i, label:__("Supplier")+" " + i,
|
||||
placeholder:__("Supplier Name")},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype:"Data", fieldname:"supplier_contact_" + i,
|
||||
label:__("Contact Name") + " " + i, placeholder:__("Contact Name")},
|
||||
])
|
||||
}
|
||||
slide.fields[1].reqd = 1;
|
||||
},
|
||||
css_class: "two-column"
|
||||
},
|
||||
},
|
||||
|
||||
items: {
|
||||
slide: {
|
||||
icon: "icon-barcode",
|
||||
"title": __("Your Products or Services"),
|
||||
"help": __("List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start."),
|
||||
"fields": [],
|
||||
before_load: function(slide) {
|
||||
slide.fields = [];
|
||||
for(var i=1; i<6; i++) {
|
||||
slide.fields = slide.fields.concat([
|
||||
{fieldtype:"Section Break", show_section_border: true},
|
||||
{fieldtype:"Data", fieldname:"item_" + i, label:__("Item") + " " + i,
|
||||
placeholder:__("A Product or Service")},
|
||||
{fieldtype:"Select", label:__("Group"), fieldname:"item_group_" + i,
|
||||
options:[__("Products"), __("Services"),
|
||||
__("Raw Material"), __("Consumable"), __("Sub Assemblies")],
|
||||
"default": __("Products")},
|
||||
{fieldtype:"Select", fieldname:"item_uom_" + i, label:__("UOM"),
|
||||
options:[__("Unit"), __("Nos"), __("Box"), __("Pair"), __("Kg"), __("Set"),
|
||||
__("Hour"), __("Minute")],
|
||||
"default": __("Unit")},
|
||||
{fieldtype: "Check", fieldname: "is_sales_item_" + i, label:__("We sell this Item"), default: 1},
|
||||
{fieldtype: "Check", fieldname: "is_purchase_item_" + i, label:__("We buy this Item")},
|
||||
{fieldtype:"Column Break"},
|
||||
{fieldtype:"Currency", fieldname:"item_price_" + i, label:__("Rate")},
|
||||
{fieldtype:"Attach Image", fieldname:"item_img_" + i, label:__("Attach Image")},
|
||||
])
|
||||
}
|
||||
slide.fields[1].reqd = 1;
|
||||
|
||||
// dummy data
|
||||
slide.fields.push({fieldtype: "Section Break"});
|
||||
slide.fields.push({fieldtype: "Check", fieldname: "add_sample_data",
|
||||
label: __("Add a few sample records"), "default": 1});
|
||||
},
|
||||
css_class: "two-column"
|
||||
},
|
||||
},
|
||||
|
||||
working_html: function() {
|
||||
var msg = $(frappe.render_template("setup_wizard_message", {
|
||||
image: "/assets/frappe/images/ui/bubble-tea-smile.svg",
|
||||
title: __("Setting Up"),
|
||||
message: __('Sit tight while your system is being setup. This may take a few moments.')
|
||||
}));
|
||||
msg.find(".setup-wizard-message-image").addClass("animated infinite bounce");
|
||||
return msg.html();
|
||||
},
|
||||
|
||||
complete_html: function() {
|
||||
return frappe.render_template("setup_wizard_message", {
|
||||
image: "/assets/frappe/images/ui/bubble-tea-happy.svg",
|
||||
title: __('Setup Complete'),
|
||||
message: ""
|
||||
});
|
||||
},
|
||||
|
||||
setup_account: function(wiz) {
|
||||
var values = wiz.get_values();
|
||||
wiz.show_working();
|
||||
return frappe.call({
|
||||
method: "erpnext.setup.page.setup_wizard.setup_wizard.setup_account",
|
||||
args: values,
|
||||
callback: function(r) {
|
||||
wiz.show_complete();
|
||||
localStorage.setItem("session_last_route", "#welcome-to-erpnext");
|
||||
setTimeout(function() {
|
||||
window.location = "/desk";
|
||||
}, 2000);
|
||||
},
|
||||
error: function(r) {
|
||||
|
||||
var d = msgprint(__("There were errors."));
|
||||
d.custom_onhide = function() {
|
||||
frappe.set_route(erpnext.wiz.wizard.page_name, erpnext.wiz.wizard.slides.length - 1);
|
||||
};
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
// Source: https://en.wikipedia.org/wiki/Fiscal_year
|
||||
// default 1st Jan - 31st Dec
|
||||
|
||||
erpnext.wiz.fiscal_years = {
|
||||
"Afghanistan": ["12-20", "12-21"],
|
||||
"Australia": ["07-01", "06-30"],
|
||||
"Bangladesh": ["07-01", "06-30"],
|
||||
"Canada": ["04-01", "03-31"],
|
||||
"Costa Rica": ["10-01", "09-30"],
|
||||
"Egypt": ["07-01", "06-30"],
|
||||
"Hong Kong": ["04-01", "03-31"],
|
||||
"India": ["04-01", "03-31"],
|
||||
"Iran": ["06-23", "06-22"],
|
||||
"Italy": ["07-01", "06-30"],
|
||||
"Myanmar": ["04-01", "03-31"],
|
||||
"New Zealand": ["04-01", "03-31"],
|
||||
"Pakistan": ["07-01", "06-30"],
|
||||
"Singapore": ["04-01", "03-31"],
|
||||
"South Africa": ["03-01", "02-28"],
|
||||
"Thailand": ["10-01", "09-30"],
|
||||
"United Kingdom": ["04-01", "03-31"],
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"creation": "2013-10-04 13:49:33.000000",
|
||||
"docstatus": 0,
|
||||
"doctype": "Page",
|
||||
"idx": 1,
|
||||
"modified": "2013-10-04 13:49:33.000000",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Setup",
|
||||
"name": "setup-wizard",
|
||||
"owner": "Administrator",
|
||||
"page_name": "setup-wizard",
|
||||
"roles": [
|
||||
{
|
||||
"role": "System Manager"
|
||||
}
|
||||
],
|
||||
"standard": "Yes",
|
||||
"title": "Setup Wizard"
|
||||
}
|
||||
@@ -1,600 +0,0 @@
|
||||
# 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, json, copy
|
||||
|
||||
from frappe.utils import cstr, flt, getdate, strip
|
||||
from frappe import _
|
||||
from frappe.utils.file_manager import save_file
|
||||
from frappe.translate import (set_default_language, get_dict,
|
||||
get_lang_dict, send_translations, get_language_from_code)
|
||||
from frappe.geo.country_info import get_country_info
|
||||
from frappe.utils.nestedset import get_root_of
|
||||
from .default_website import website_maker
|
||||
import install_fixtures
|
||||
from .sample_data import make_sample_data
|
||||
from erpnext.accounts.utils import FiscalYearError
|
||||
from erpnext.accounts.doctype.account.account import RootNotEditable
|
||||
|
||||
@frappe.whitelist()
|
||||
def setup_account(args=None):
|
||||
try:
|
||||
if frappe.db.sql("select name from tabCompany"):
|
||||
frappe.throw(_("Setup Already Complete!!"))
|
||||
|
||||
args = process_args(args)
|
||||
|
||||
if args.language and args.language != "english":
|
||||
set_default_language(args.language)
|
||||
|
||||
frappe.clear_cache()
|
||||
|
||||
install_fixtures.install(args.get("country"))
|
||||
|
||||
update_user_name(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_fiscal_year_and_company(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_users(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
set_defaults(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_territories()
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_price_lists(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_feed_and_todo()
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_email_digest()
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_letter_head(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_taxes(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_items(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_customers(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
create_suppliers(args)
|
||||
frappe.local.message_log = []
|
||||
|
||||
frappe.db.set_default('desktop:home_page', 'desktop')
|
||||
|
||||
website_maker(args.company_name.strip(), args.company_tagline, args.name)
|
||||
create_logo(args)
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
login_as_first_user(args)
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
frappe.clear_cache()
|
||||
|
||||
if args.get("add_sample_data"):
|
||||
try:
|
||||
make_sample_data()
|
||||
frappe.clear_cache()
|
||||
except FiscalYearError:
|
||||
pass
|
||||
|
||||
except:
|
||||
if args:
|
||||
traceback = frappe.get_traceback()
|
||||
for hook in frappe.get_hooks("setup_wizard_exception"):
|
||||
frappe.get_attr(hook)(traceback, args)
|
||||
|
||||
raise
|
||||
|
||||
else:
|
||||
for hook in frappe.get_hooks("setup_wizard_success"):
|
||||
frappe.get_attr(hook)(args)
|
||||
|
||||
|
||||
def process_args(args):
|
||||
if not args:
|
||||
args = frappe.local.form_dict
|
||||
if isinstance(args, basestring):
|
||||
args = json.loads(args)
|
||||
|
||||
args = frappe._dict(args)
|
||||
|
||||
# strip the whitespace
|
||||
for key, value in args.items():
|
||||
if isinstance(value, basestring):
|
||||
args[key] = strip(value)
|
||||
|
||||
return args
|
||||
|
||||
def update_user_name(args):
|
||||
if args.get("email"):
|
||||
args['name'] = args.get("email")
|
||||
|
||||
_mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True
|
||||
doc = frappe.get_doc({
|
||||
"doctype":"User",
|
||||
"email": args.get("email"),
|
||||
"first_name": args.get("first_name"),
|
||||
"last_name": args.get("last_name")
|
||||
})
|
||||
doc.flags.no_welcome_mail = True
|
||||
doc.insert()
|
||||
frappe.flags.mute_emails = _mute_emails
|
||||
from frappe.auth import _update_password
|
||||
_update_password(args.get("email"), args.get("password"))
|
||||
|
||||
else:
|
||||
args['name'] = frappe.session.user
|
||||
|
||||
# Update User
|
||||
if not args.get('last_name') or args.get('last_name')=='None':
|
||||
args['last_name'] = None
|
||||
frappe.db.sql("""update `tabUser` SET first_name=%(first_name)s,
|
||||
last_name=%(last_name)s WHERE name=%(name)s""", args)
|
||||
|
||||
if args.get("attach_user"):
|
||||
attach_user = args.get("attach_user").split(",")
|
||||
if len(attach_user)==3:
|
||||
filename, filetype, content = attach_user
|
||||
fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_url
|
||||
frappe.db.set_value("User", args.get("name"), "user_image", fileurl)
|
||||
|
||||
add_all_roles_to(args.get("name"))
|
||||
|
||||
def create_fiscal_year_and_company(args):
|
||||
curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date'))
|
||||
frappe.get_doc({
|
||||
"doctype":"Fiscal Year",
|
||||
'year': curr_fiscal_year,
|
||||
'year_start_date': args.get('fy_start_date'),
|
||||
'year_end_date': args.get('fy_end_date'),
|
||||
}).insert()
|
||||
|
||||
# Company
|
||||
frappe.get_doc({
|
||||
"doctype":"Company",
|
||||
'domain': args.get("industry"),
|
||||
'company_name':args.get('company_name').strip(),
|
||||
'abbr':args.get('company_abbr'),
|
||||
'default_currency':args.get('currency'),
|
||||
'country': args.get('country'),
|
||||
'chart_of_accounts': args.get(('chart_of_accounts')),
|
||||
}).insert()
|
||||
|
||||
# Bank Account
|
||||
|
||||
args["curr_fiscal_year"] = curr_fiscal_year
|
||||
|
||||
def create_price_lists(args):
|
||||
for pl_type, pl_name in (("Selling", _("Standard Selling")), ("Buying", _("Standard Buying"))):
|
||||
frappe.get_doc({
|
||||
"doctype": "Price List",
|
||||
"price_list_name": pl_name,
|
||||
"enabled": 1,
|
||||
"buying": 1 if pl_type == "Buying" else 0,
|
||||
"selling": 1 if pl_type == "Selling" else 0,
|
||||
"currency": args["currency"]
|
||||
}).insert()
|
||||
|
||||
def set_defaults(args):
|
||||
# enable default currency
|
||||
frappe.db.set_value("Currency", args.get("currency"), "enabled", 1)
|
||||
|
||||
global_defaults = frappe.get_doc("Global Defaults", "Global Defaults")
|
||||
global_defaults.update({
|
||||
'current_fiscal_year': args.curr_fiscal_year,
|
||||
'default_currency': args.get('currency'),
|
||||
'default_company':args.get('company_name').strip(),
|
||||
"country": args.get("country"),
|
||||
})
|
||||
|
||||
global_defaults.save()
|
||||
|
||||
number_format = get_country_info(args.get("country")).get("number_format", "#,###.##")
|
||||
|
||||
# replace these as float number formats, as they have 0 precision
|
||||
# and are currency number formats and not for floats
|
||||
if number_format=="#.###":
|
||||
number_format = "#.###,##"
|
||||
elif number_format=="#,###":
|
||||
number_format = "#,###.##"
|
||||
|
||||
system_settings = frappe.get_doc("System Settings", "System Settings")
|
||||
system_settings.update({
|
||||
"language": args.get("language"),
|
||||
"time_zone": args.get("timezone"),
|
||||
"float_precision": 3,
|
||||
"email_footer_address": args.get("company"),
|
||||
'date_format': frappe.db.get_value("Country", args.get("country"), "date_format"),
|
||||
'number_format': number_format,
|
||||
'enable_scheduler': 1 if not frappe.flags.in_test else 0
|
||||
})
|
||||
system_settings.save()
|
||||
|
||||
accounts_settings = frappe.get_doc("Accounts Settings")
|
||||
accounts_settings.auto_accounting_for_stock = 1
|
||||
accounts_settings.save()
|
||||
|
||||
stock_settings = frappe.get_doc("Stock Settings")
|
||||
stock_settings.item_naming_by = "Item Code"
|
||||
stock_settings.valuation_method = "FIFO"
|
||||
stock_settings.stock_uom = _("Nos")
|
||||
stock_settings.auto_indent = 1
|
||||
stock_settings.auto_insert_price_list_rate_if_missing = 1
|
||||
stock_settings.automatically_set_serial_nos_based_on_fifo = 1
|
||||
stock_settings.save()
|
||||
|
||||
selling_settings = frappe.get_doc("Selling Settings")
|
||||
selling_settings.cust_master_name = "Customer Name"
|
||||
selling_settings.so_required = "No"
|
||||
selling_settings.dn_required = "No"
|
||||
selling_settings.save()
|
||||
|
||||
buying_settings = frappe.get_doc("Buying Settings")
|
||||
buying_settings.supp_master_name = "Supplier Name"
|
||||
buying_settings.po_required = "No"
|
||||
buying_settings.pr_required = "No"
|
||||
buying_settings.maintain_same_rate = 1
|
||||
buying_settings.save()
|
||||
|
||||
notification_control = frappe.get_doc("Notification Control")
|
||||
notification_control.quotation = 1
|
||||
notification_control.sales_invoice = 1
|
||||
notification_control.purchase_order = 1
|
||||
notification_control.save()
|
||||
|
||||
hr_settings = frappe.get_doc("HR Settings")
|
||||
hr_settings.emp_created_by = "Naming Series"
|
||||
hr_settings.save()
|
||||
|
||||
def create_feed_and_todo():
|
||||
"""update Activity feed and create todo for creation of item, customer, vendor"""
|
||||
frappe.get_doc({
|
||||
"doctype": "Feed",
|
||||
"feed_type": "Comment",
|
||||
"subject": "ERPNext Setup Complete!"
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
def create_email_digest():
|
||||
from frappe.utils.user import get_system_managers
|
||||
system_managers = get_system_managers(only_name=True)
|
||||
if not system_managers:
|
||||
return
|
||||
|
||||
companies = frappe.db.sql_list("select name FROM `tabCompany`")
|
||||
for company in companies:
|
||||
if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company):
|
||||
edigest = frappe.get_doc({
|
||||
"doctype": "Email Digest",
|
||||
"name": "Default Weekly Digest - " + company,
|
||||
"company": company,
|
||||
"frequency": "Weekly",
|
||||
"recipient_list": "\n".join(system_managers)
|
||||
})
|
||||
|
||||
for df in edigest.meta.get("fields", {"fieldtype": "Check"}):
|
||||
if df.fieldname != "scheduler_errors":
|
||||
edigest.set(df.fieldname, 1)
|
||||
|
||||
edigest.insert()
|
||||
|
||||
# scheduler errors digest
|
||||
if companies:
|
||||
edigest = frappe.new_doc("Email Digest")
|
||||
edigest.update({
|
||||
"name": "Scheduler Errors",
|
||||
"company": companies[0],
|
||||
"frequency": "Daily",
|
||||
"recipient_list": "\n".join(system_managers),
|
||||
"scheduler_errors": 1,
|
||||
"enabled": 1
|
||||
})
|
||||
edigest.insert()
|
||||
|
||||
def get_fy_details(fy_start_date, fy_end_date):
|
||||
start_year = getdate(fy_start_date).year
|
||||
if start_year == getdate(fy_end_date).year:
|
||||
fy = cstr(start_year)
|
||||
else:
|
||||
fy = cstr(start_year) + '-' + cstr(start_year + 1)
|
||||
return fy
|
||||
|
||||
def create_taxes(args):
|
||||
|
||||
for i in xrange(1,6):
|
||||
if args.get("tax_" + str(i)):
|
||||
# replace % in case someone also enters the % symbol
|
||||
tax_rate = (args.get("tax_rate_" + str(i)) or "").replace("%", "")
|
||||
|
||||
try:
|
||||
tax_group = frappe.db.get_value("Account", {"company": args.get("company_name"),
|
||||
"is_group": 1, "account_type": "Tax", "root_type": "Liability"})
|
||||
if tax_group:
|
||||
account = make_tax_head(args, i, tax_group, tax_rate)
|
||||
make_sales_and_purchase_tax_templates(account)
|
||||
|
||||
except frappe.NameError, e:
|
||||
if e.args[2][0]==1062:
|
||||
pass
|
||||
else:
|
||||
raise
|
||||
except RootNotEditable, e:
|
||||
pass
|
||||
|
||||
def make_tax_head(args, i, tax_group, tax_rate):
|
||||
return frappe.get_doc({
|
||||
"doctype":"Account",
|
||||
"company": args.get("company_name").strip(),
|
||||
"parent_account": tax_group,
|
||||
"account_name": args.get("tax_" + str(i)),
|
||||
"is_group": 0,
|
||||
"report_type": "Balance Sheet",
|
||||
"account_type": "Tax",
|
||||
"tax_rate": flt(tax_rate) if tax_rate else None
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
def make_sales_and_purchase_tax_templates(account):
|
||||
doc = {
|
||||
"doctype": "Sales Taxes and Charges Template",
|
||||
"title": account.name,
|
||||
"taxes": [{
|
||||
"category": "Valuation and Total",
|
||||
"charge_type": "On Net Total",
|
||||
"account_head": account.name,
|
||||
"description": "{0} @ {1}".format(account.account_name, account.tax_rate),
|
||||
"rate": account.tax_rate
|
||||
}]
|
||||
}
|
||||
|
||||
# Sales
|
||||
frappe.get_doc(copy.deepcopy(doc)).insert()
|
||||
|
||||
# Purchase
|
||||
doc["doctype"] = "Purchase Taxes and Charges Template"
|
||||
frappe.get_doc(copy.deepcopy(doc)).insert()
|
||||
|
||||
def create_items(args):
|
||||
for i in xrange(1,6):
|
||||
item = args.get("item_" + str(i))
|
||||
if item:
|
||||
item_group = args.get("item_group_" + str(i))
|
||||
is_sales_item = args.get("is_sales_item_" + str(i))
|
||||
is_purchase_item = args.get("is_purchase_item_" + str(i))
|
||||
is_stock_item = item_group!=_("Services")
|
||||
is_pro_applicable = item_group!=_("Services")
|
||||
default_warehouse = ""
|
||||
if is_stock_item:
|
||||
default_warehouse = frappe.db.get_value("Warehouse", filters={
|
||||
"warehouse_name": _("Finished Goods") if is_sales_item else _("Stores"),
|
||||
"company": args.get("company_name").strip()
|
||||
})
|
||||
|
||||
try:
|
||||
frappe.get_doc({
|
||||
"doctype":"Item",
|
||||
"item_code": item,
|
||||
"item_name": item,
|
||||
"description": item,
|
||||
"is_sales_item": 1 if is_sales_item else 0,
|
||||
"is_purchase_item": 1 if is_purchase_item else 0,
|
||||
"show_in_website": 1,
|
||||
"is_stock_item": is_stock_item and 1 or 0,
|
||||
"is_pro_applicable": is_pro_applicable and 1 or 0,
|
||||
"item_group": item_group,
|
||||
"stock_uom": args.get("item_uom_" + str(i)),
|
||||
"default_warehouse": default_warehouse
|
||||
}).insert()
|
||||
|
||||
if args.get("item_img_" + str(i)):
|
||||
item_image = args.get("item_img_" + str(i)).split(",")
|
||||
if len(item_image)==3:
|
||||
filename, filetype, content = item_image
|
||||
fileurl = save_file(filename, content, "Item", item, decode=True).file_url
|
||||
frappe.db.set_value("Item", item, "image", fileurl)
|
||||
|
||||
if args.get("item_price_" + str(i)):
|
||||
item_price = flt(args.get("item_price_" + str(i)))
|
||||
|
||||
if is_sales_item:
|
||||
price_list_name = frappe.db.get_value("Price List", {"selling": 1})
|
||||
make_item_price(item, price_list_name, item_price)
|
||||
|
||||
if is_purchase_item:
|
||||
price_list_name = frappe.db.get_value("Price List", {"buying": 1})
|
||||
make_item_price(item, price_list_name, item_price)
|
||||
|
||||
except frappe.NameError:
|
||||
pass
|
||||
|
||||
def make_item_price(item, price_list_name, item_price):
|
||||
frappe.get_doc({
|
||||
"doctype": "Item Price",
|
||||
"price_list": price_list_name,
|
||||
"item_code": item,
|
||||
"price_list_rate": item_price
|
||||
}).insert()
|
||||
|
||||
|
||||
def create_customers(args):
|
||||
for i in xrange(1,6):
|
||||
customer = args.get("customer_" + str(i))
|
||||
if customer:
|
||||
try:
|
||||
frappe.get_doc({
|
||||
"doctype":"Customer",
|
||||
"customer_name": customer,
|
||||
"customer_type": "Company",
|
||||
"customer_group": _("Commercial"),
|
||||
"territory": args.get("country"),
|
||||
"company": args.get("company_name").strip()
|
||||
}).insert()
|
||||
|
||||
if args.get("customer_contact_" + str(i)):
|
||||
create_contact(args.get("customer_contact_" + str(i)),
|
||||
"customer", customer)
|
||||
except frappe.NameError:
|
||||
pass
|
||||
|
||||
def create_suppliers(args):
|
||||
for i in xrange(1,6):
|
||||
supplier = args.get("supplier_" + str(i))
|
||||
if supplier:
|
||||
try:
|
||||
frappe.get_doc({
|
||||
"doctype":"Supplier",
|
||||
"supplier_name": supplier,
|
||||
"supplier_type": _("Local"),
|
||||
"company": args.get("company_name").strip()
|
||||
}).insert()
|
||||
|
||||
if args.get("supplier_contact_" + str(i)):
|
||||
create_contact(args.get("supplier_contact_" + str(i)),
|
||||
"supplier", supplier)
|
||||
except frappe.NameError:
|
||||
pass
|
||||
|
||||
def create_contact(contact, party_type, party):
|
||||
"""Create contact based on given contact name"""
|
||||
contact = contact.strip().split(" ")
|
||||
|
||||
frappe.get_doc({
|
||||
"doctype":"Contact",
|
||||
party_type: party,
|
||||
"first_name":contact[0],
|
||||
"last_name": len(contact) > 1 and contact[1] or ""
|
||||
}).insert()
|
||||
|
||||
def create_letter_head(args):
|
||||
if args.get("attach_letterhead"):
|
||||
frappe.get_doc({
|
||||
"doctype":"Letter Head",
|
||||
"letter_head_name": _("Standard"),
|
||||
"is_default": 1
|
||||
}).insert()
|
||||
|
||||
attach_letterhead = args.get("attach_letterhead").split(",")
|
||||
if len(attach_letterhead)==3:
|
||||
filename, filetype, content = attach_letterhead
|
||||
fileurl = save_file(filename, content, "Letter Head", _("Standard"), decode=True).file_url
|
||||
frappe.db.set_value("Letter Head", _("Standard"), "content", "<img src='%s' style='max-width: 100%%;'>" % fileurl)
|
||||
|
||||
def create_logo(args):
|
||||
if args.get("attach_logo"):
|
||||
attach_logo = args.get("attach_logo").split(",")
|
||||
if len(attach_logo)==3:
|
||||
filename, filetype, content = attach_logo
|
||||
fileurl = save_file(filename, content, "Website Settings", "Website Settings",
|
||||
decode=True).file_url
|
||||
frappe.db.set_value("Website Settings", "Website Settings", "brand_html",
|
||||
"<img src='{0}' style='max-width: 40px; max-height: 25px;'> {1}".format(fileurl, args.get("company_name").strip()))
|
||||
|
||||
def add_all_roles_to(name):
|
||||
user = frappe.get_doc("User", name)
|
||||
for role in frappe.db.sql("""select name from tabRole"""):
|
||||
if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner", "Employee"]:
|
||||
d = user.append("user_roles")
|
||||
d.role = role[0]
|
||||
user.save()
|
||||
|
||||
def create_territories():
|
||||
"""create two default territories, one for home country and one named Rest of the World"""
|
||||
from frappe.utils.nestedset import get_root_of
|
||||
country = frappe.db.get_default("country")
|
||||
root_territory = get_root_of("Territory")
|
||||
for name in (country, _("Rest Of The World")):
|
||||
if name and not frappe.db.exists("Territory", name):
|
||||
frappe.get_doc({
|
||||
"doctype": "Territory",
|
||||
"territory_name": name.replace("'", ""),
|
||||
"parent_territory": root_territory,
|
||||
"is_group": "No"
|
||||
}).insert()
|
||||
|
||||
def login_as_first_user(args):
|
||||
if args.get("email") and hasattr(frappe.local, "login_manager"):
|
||||
frappe.local.login_manager.login_as(args.get("email"))
|
||||
|
||||
def create_users(args):
|
||||
# create employee for self
|
||||
emp = frappe.get_doc({
|
||||
"doctype": "Employee",
|
||||
"full_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])),
|
||||
"user_id": frappe.session.user,
|
||||
"status": "Active",
|
||||
"company": args.get("company_name")
|
||||
})
|
||||
emp.flags.ignore_mandatory = True
|
||||
emp.insert(ignore_permissions = True)
|
||||
|
||||
for i in xrange(1,5):
|
||||
email = args.get("user_email_" + str(i))
|
||||
fullname = args.get("user_fullname_" + str(i))
|
||||
if email:
|
||||
if not fullname:
|
||||
fullname = email.split("@")[0]
|
||||
|
||||
parts = fullname.split(" ", 1)
|
||||
|
||||
user = frappe.get_doc({
|
||||
"doctype": "User",
|
||||
"email": email,
|
||||
"first_name": parts[0],
|
||||
"last_name": parts[1] if len(parts) > 1 else "",
|
||||
"enabled": 1,
|
||||
"user_type": "System User"
|
||||
})
|
||||
|
||||
# default roles
|
||||
user.append_roles("Projects User", "Stock User", "Support Team")
|
||||
|
||||
if args.get("user_sales_" + str(i)):
|
||||
user.append_roles("Sales User", "Sales Manager", "Accounts User")
|
||||
if args.get("user_purchaser_" + str(i)):
|
||||
user.append_roles("Purchase User", "Purchase Manager", "Accounts User")
|
||||
if args.get("user_accountant_" + str(i)):
|
||||
user.append_roles("Accounts Manager", "Accounts User")
|
||||
|
||||
user.flags.delay_emails = True
|
||||
|
||||
if not frappe.db.get_value("User", email):
|
||||
user.insert(ignore_permissions=True)
|
||||
|
||||
# create employee
|
||||
emp = frappe.get_doc({
|
||||
"doctype": "Employee",
|
||||
"full_name": fullname,
|
||||
"user_id": email,
|
||||
"status": "Active",
|
||||
"company": args.get("company_name")
|
||||
})
|
||||
emp.flags.ignore_mandatory = True
|
||||
emp.insert(ignore_permissions = True)
|
||||
|
||||
@frappe.whitelist()
|
||||
def load_messages(language):
|
||||
frappe.clear_cache()
|
||||
set_default_language(language)
|
||||
m = get_dict("page", "setup-wizard")
|
||||
m.update(get_dict("boot"))
|
||||
send_translations(m)
|
||||
return frappe.local.lang
|
||||
|
||||
@frappe.whitelist()
|
||||
def load_languages():
|
||||
return {
|
||||
"default_language": get_language_from_code(frappe.local.lang),
|
||||
"languages": sorted(get_lang_dict().keys())
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<div class="container setup-wizard-slide">
|
||||
<img class="img-responsive setup-wizard-message-image" src="{%= image %}">
|
||||
|
||||
<p class="text-center lead">{%= title %}</p>
|
||||
|
||||
<p class="text-center">{%= message %}</p>
|
||||
</div>
|
||||
@@ -1,21 +0,0 @@
|
||||
<div class="container setup-wizard-slide {%= css_class %}" data-slide-name="{%= name %}">
|
||||
<div class="text-center setup-wizard-progress text-extra-muted">
|
||||
{% for (var i=0; i < slides_count; i++) { %}
|
||||
<i class="icon-fixed-width {% if (i+1==step) { %} icon-circle {% } else { %} icon-circle-blank {% } %}"></i>
|
||||
{% } %}
|
||||
</div>
|
||||
<p class="text-center lead">{%= title %}</p>
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
{% if (help) { %} <p class="text-center">{%= help %}</p> {% } %}
|
||||
<div class="form"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer text-center">
|
||||
<div>
|
||||
<a class="prev-btn hide grey small">{%= __("Previous") %}</a>
|
||||
<a class="next-btn hide btn btn-primary btn-sm">{%= __("Next") %}</a>
|
||||
<a class="complete-btn hide btn btn-primary btn-sm"><b>{%= __("Complete Setup") %}</b></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
File diff suppressed because one or more lines are too long
@@ -1,15 +0,0 @@
|
||||
# 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 erpnext.setup.page.setup_wizard.test_setup_data import args
|
||||
from erpnext.setup.page.setup_wizard.setup_wizard import setup_account
|
||||
import frappe.utils.scheduler
|
||||
|
||||
if __name__=="__main__":
|
||||
frappe.connect()
|
||||
frappe.local.form_dict = frappe._dict(args)
|
||||
setup_account()
|
||||
frappe.utils.scheduler.disable_scheduler()
|
||||
Reference in New Issue
Block a user