You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

208 lines
5.8 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # License: GNU General Public License v3. See license.txt
  3. import frappe
  4. from frappe import _
  5. from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
  6. from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
  7. from frappe.utils import cint
  8. from erpnext.accounts.doctype.cash_flow_mapper.default_cash_flow_mapper import DEFAULT_MAPPERS
  9. from erpnext.setup.default_energy_point_rules import get_default_energy_point_rules
  10. from erpnext.setup.doctype.incoterm.incoterm import create_incoterms
  11. from .default_success_action import get_default_success_action
  12. default_mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>Sent via
  13. <a style="color: #888" href="http://erpnext.org">ERPNext</a></div>"""
  14. def after_install():
  15. frappe.get_doc({"doctype": "Role", "role_name": "Analytics"}).insert()
  16. set_single_defaults()
  17. create_print_setting_custom_fields()
  18. add_all_roles_to("Administrator")
  19. create_default_cash_flow_mapper_templates()
  20. create_default_success_action()
  21. create_default_energy_point_rules()
  22. create_incoterms()
  23. add_company_to_session_defaults()
  24. add_standard_navbar_items()
  25. add_app_name()
  26. setup_log_settings()
  27. frappe.db.commit()
  28. def check_setup_wizard_not_completed():
  29. if cint(frappe.db.get_single_value("System Settings", "setup_complete") or 0):
  30. message = """ERPNext can only be installed on a fresh site where the setup wizard is not completed.
  31. You can reinstall this site (after saving your data) using: bench --site [sitename] reinstall"""
  32. frappe.throw(message) # nosemgrep
  33. def set_single_defaults():
  34. for dt in (
  35. "Accounts Settings",
  36. "Print Settings",
  37. "Buying Settings",
  38. "Selling Settings",
  39. "Stock Settings",
  40. ):
  41. default_values = frappe.db.sql(
  42. """select fieldname, `default` from `tabDocField`
  43. where parent=%s""",
  44. dt,
  45. )
  46. if default_values:
  47. try:
  48. doc = frappe.get_doc(dt, dt)
  49. for fieldname, value in default_values:
  50. doc.set(fieldname, value)
  51. doc.flags.ignore_mandatory = True
  52. doc.save()
  53. except frappe.ValidationError:
  54. pass
  55. frappe.db.set_default("date_format", "dd-mm-yyyy")
  56. setup_currency_exchange()
  57. def setup_currency_exchange():
  58. ces = frappe.get_single("Currency Exchange Settings")
  59. try:
  60. ces.set("result_key", [])
  61. ces.set("req_params", [])
  62. ces.api_endpoint = "https://frankfurter.app/{transaction_date}"
  63. ces.append("result_key", {"key": "rates"})
  64. ces.append("result_key", {"key": "{to_currency}"})
  65. ces.append("req_params", {"key": "base", "value": "{from_currency}"})
  66. ces.append("req_params", {"key": "symbols", "value": "{to_currency}"})
  67. ces.save()
  68. except frappe.ValidationError:
  69. pass
  70. def create_print_setting_custom_fields():
  71. create_custom_fields(
  72. {
  73. "Print Settings": [
  74. {
  75. "label": _("Compact Item Print"),
  76. "fieldname": "compact_item_print",
  77. "fieldtype": "Check",
  78. "default": "1",
  79. "insert_after": "with_letterhead",
  80. },
  81. {
  82. "label": _("Print UOM after Quantity"),
  83. "fieldname": "print_uom_after_quantity",
  84. "fieldtype": "Check",
  85. "default": "0",
  86. "insert_after": "compact_item_print",
  87. },
  88. {
  89. "label": _("Print taxes with zero amount"),
  90. "fieldname": "print_taxes_with_zero_amount",
  91. "fieldtype": "Check",
  92. "default": "0",
  93. "insert_after": "allow_print_for_cancelled",
  94. },
  95. ]
  96. }
  97. )
  98. def create_default_cash_flow_mapper_templates():
  99. for mapper in DEFAULT_MAPPERS:
  100. if not frappe.db.exists("Cash Flow Mapper", mapper["section_name"]):
  101. doc = frappe.get_doc(mapper)
  102. doc.insert(ignore_permissions=True)
  103. def create_default_success_action():
  104. for success_action in get_default_success_action():
  105. if not frappe.db.exists("Success Action", success_action.get("ref_doctype")):
  106. doc = frappe.get_doc(success_action)
  107. doc.insert(ignore_permissions=True)
  108. def create_default_energy_point_rules():
  109. for rule in get_default_energy_point_rules():
  110. # check if any rule for ref. doctype exists
  111. rule_exists = frappe.db.exists(
  112. "Energy Point Rule", {"reference_doctype": rule.get("reference_doctype")}
  113. )
  114. if rule_exists:
  115. continue
  116. doc = frappe.get_doc(rule)
  117. doc.insert(ignore_permissions=True)
  118. def add_company_to_session_defaults():
  119. settings = frappe.get_single("Session Default Settings")
  120. settings.append("session_defaults", {"ref_doctype": "Company"})
  121. settings.save()
  122. def add_standard_navbar_items():
  123. navbar_settings = frappe.get_single("Navbar Settings")
  124. erpnext_navbar_items = [
  125. {
  126. "item_label": "Documentation",
  127. "item_type": "Route",
  128. "route": "https://docs.erpnext.com/docs/v14/user/manual/en/introduction",
  129. "is_standard": 1,
  130. },
  131. {
  132. "item_label": "User Forum",
  133. "item_type": "Route",
  134. "route": "https://discuss.frappe.io",
  135. "is_standard": 1,
  136. },
  137. {
  138. "item_label": "Report an Issue",
  139. "item_type": "Route",
  140. "route": "https://github.com/frappe/erpnext/issues",
  141. "is_standard": 1,
  142. },
  143. ]
  144. current_navbar_items = navbar_settings.help_dropdown
  145. navbar_settings.set("help_dropdown", [])
  146. for item in erpnext_navbar_items:
  147. current_labels = [item.get("item_label") for item in current_navbar_items]
  148. if not item.get("item_label") in current_labels:
  149. navbar_settings.append("help_dropdown", item)
  150. for item in current_navbar_items:
  151. navbar_settings.append(
  152. "help_dropdown",
  153. {
  154. "item_label": item.item_label,
  155. "item_type": item.item_type,
  156. "route": item.route,
  157. "action": item.action,
  158. "is_standard": item.is_standard,
  159. "hidden": item.hidden,
  160. },
  161. )
  162. navbar_settings.save()
  163. def add_app_name():
  164. frappe.db.set_value("System Settings", None, "app_name", "ERPNext")
  165. def setup_log_settings():
  166. log_settings = frappe.get_single("Log Settings")
  167. log_settings.append("logs_to_clear", {"ref_doctype": "Repost Item Valuation", "days": 60})
  168. log_settings.save(ignore_permissions=True)