From 49f49ea603fb7ae5a45810c98b9775281620ca01 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 7 Apr 2014 15:09:09 +0530 Subject: [PATCH] started party frappe/erpnext#1503 --- .../doctype/cost_center/cost_center.py | 4 +- .../journal_voucher/journal_voucher.js | 48 +-- erpnext/contacts/__init__.py | 0 erpnext/contacts/doctype/__init__.py | 0 .../contacts/doctype/party_type/__init__.py | 0 .../doctype/party_type/party_type.json | 302 ++++++++++++++++++ .../contacts/doctype/party_type/party_type.py | 9 + erpnext/modules.txt | 3 +- .../doctype/customer_group/customer_group.py | 4 +- .../setup/doctype/item_group/item_group.py | 6 +- .../doctype/sales_person/sales_person.py | 4 +- erpnext/setup/doctype/territory/territory.py | 4 +- .../setup/page/setup_wizard/setup_wizard.py | 58 ++-- 13 files changed, 377 insertions(+), 65 deletions(-) create mode 100644 erpnext/contacts/__init__.py create mode 100644 erpnext/contacts/doctype/__init__.py create mode 100644 erpnext/contacts/doctype/party_type/__init__.py create mode 100644 erpnext/contacts/doctype/party_type/party_type.json create mode 100644 erpnext/contacts/doctype/party_type/party_type.py diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py index 7013ffb30d..d79bbcc5cd 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.py +++ b/erpnext/accounts/doctype/cost_center/cost_center.py @@ -6,9 +6,9 @@ import frappe from frappe import msgprint, _ -from frappe.utils.nestedset import DocTypeNestedSet +from frappe.utils.nestedset import NestedSet -class CostCenter(DocTypeNestedSet): +class CostCenter(NestedSet): nsm_parent_field = 'parent_cost_center' def autoname(self): diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js index e8e513d0a2..b1aa70bcee 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js @@ -8,22 +8,22 @@ erpnext.accounts.JournalVoucher = frappe.ui.form.Controller.extend({ this.load_defaults(); this.setup_queries(); }, - + load_defaults: function() { if(this.frm.doc.__islocal && this.frm.doc.company) { frappe.model.set_default_values(this.frm.doc); - $.each(this.frm.doc.entries, function(i, jvd) { + $.each(this.frm.doc.entries || [], function(i, jvd) { frappe.model.set_default_values(jvd); } ); - + if(!this.frm.doc.amended_from) this.frm.doc.posting_date = get_today(); } }, - + setup_queries: function() { var me = this; - + $.each(["account", "cost_center"], function(i, fieldname) { me.frm.set_query(fieldname, "entries", function() { frappe.model.validate_missing(me.frm.doc, "company"); @@ -35,8 +35,8 @@ erpnext.accounts.JournalVoucher = frappe.ui.form.Controller.extend({ }; }); }); - - $.each([["against_voucher", "Purchase Invoice", "credit_to"], + + $.each([["against_voucher", "Purchase Invoice", "credit_to"], ["against_invoice", "Sales Invoice", "debit_to"]], function(i, opts) { me.frm.set_query(opts[0], "entries", function(doc, cdt, cdn) { var jvd = frappe.get_doc(cdt, cdn); @@ -50,49 +50,49 @@ erpnext.accounts.JournalVoucher = frappe.ui.form.Controller.extend({ }; }); }); - + this.frm.set_query("against_jv", "entries", function(doc, cdt, cdn) { var jvd = frappe.get_doc(cdt, cdn); frappe.model.validate_missing(jvd, "account"); - + return { query: "accounts.doctype.journal_voucher.journal_voucher.get_against_jv", filters: { account: jvd.account } }; }); }, - + against_voucher: function(doc, cdt, cdn) { var d = frappe.get_doc(cdt, cdn); if (d.against_voucher && !flt(d.debit)) { this.get_outstanding({ - 'doctype': 'Purchase Invoice', + 'doctype': 'Purchase Invoice', 'docname': d.against_voucher }, d) } }, - + against_invoice: function(doc, cdt, cdn) { var d = frappe.get_doc(cdt, cdn); if (d.against_invoice && !flt(d.credit)) { this.get_outstanding({ - 'doctype': 'Sales Invoice', + 'doctype': 'Sales Invoice', 'docname': d.against_invoice }, d) } }, - + against_jv: function(doc, cdt, cdn) { var d = frappe.get_doc(cdt, cdn); if (d.against_jv && !flt(d.credit) && !flt(d.debit)) { this.get_outstanding({ - 'doctype': 'Journal Voucher', + 'doctype': 'Journal Voucher', 'docname': d.against_jv, 'account': d.account }, d) } }, - + get_outstanding: function(args, child) { var me = this; return this.frm.call({ @@ -104,7 +104,7 @@ erpnext.accounts.JournalVoucher = frappe.ui.form.Controller.extend({ } }); } - + }); cur_frm.script_manager.make(erpnext.accounts.JournalVoucher); @@ -113,7 +113,7 @@ cur_frm.cscript.refresh = function(doc) { cur_frm.cscript.is_opening(doc) erpnext.hide_naming_series(); cur_frm.cscript.voucher_type(doc); - if(doc.docstatus==1) { + if(doc.docstatus==1) { cur_frm.appframe.add_button(frappe._('View Ledger'), function() { frappe.route_options = { "voucher_no": doc.name, @@ -154,7 +154,7 @@ cur_frm.cscript.debit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc) cur_frm.cscript.credit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); } cur_frm.cscript.get_balance = function(doc,dt,dn) { - cur_frm.cscript.update_totals(doc); + cur_frm.cscript.update_totals(doc); return $c_obj(cur_frm.doc, 'get_balance', '', function(r, rt){ cur_frm.refresh(); }); @@ -174,7 +174,7 @@ cur_frm.cscript.account = function(doc,dt,dn) { } }); } -} +} cur_frm.cscript.validate = function(doc,cdt,cdn) { cur_frm.cscript.update_totals(doc); @@ -195,7 +195,7 @@ cur_frm.cscript.voucher_type = function(doc, cdt, cdn) { if((doc.entries || []).length!==0 || !doc.company) // too early return; - + var update_jv_details = function(doc, r) { $.each(r.message, function(i, d) { var jvdetail = frappe.model.add_child(doc, "Journal Voucher Detail", "entries"); @@ -204,7 +204,7 @@ cur_frm.cscript.voucher_type = function(doc, cdt, cdn) { }); refresh_field("entries"); } - + if(in_list(["Bank Voucher", "Cash Voucher"], doc.voucher_type)) { return frappe.call({ type: "GET", @@ -227,7 +227,7 @@ cur_frm.cscript.voucher_type = function(doc, cdt, cdn) { "company": doc.company }, callback: function(r) { - frappe.model.clear_table("Journal Voucher Detail", "Journal Voucher", + frappe.model.clear_table("Journal Voucher Detail", "Journal Voucher", doc.name, "entries"); if(r.message) { update_jv_details(doc, r); @@ -236,4 +236,4 @@ cur_frm.cscript.voucher_type = function(doc, cdt, cdn) { } }) } -} \ No newline at end of file +} diff --git a/erpnext/contacts/__init__.py b/erpnext/contacts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/contacts/doctype/__init__.py b/erpnext/contacts/doctype/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/contacts/doctype/party_type/__init__.py b/erpnext/contacts/doctype/party_type/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/contacts/doctype/party_type/party_type.json b/erpnext/contacts/doctype/party_type/party_type.json new file mode 100644 index 0000000000..b667b6e053 --- /dev/null +++ b/erpnext/contacts/doctype/party_type/party_type.json @@ -0,0 +1,302 @@ +{ + "_last_update": null, + "_user_tags": null, + "allow_attach": null, + "allow_copy": null, + "allow_email": null, + "allow_import": null, + "allow_print": null, + "allow_rename": null, + "allow_trash": null, + "autoname": "field:party_type_name", + "change_log": null, + "client_script": null, + "client_script_core": null, + "client_string": null, + "colour": null, + "creation": "2014-04-07 12:32:18.010384", + "custom": null, + "default_print_format": null, + "description": null, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Master", + "dt_template": null, + "fields": [ + { + "allow_on_submit": null, + "default": null, + "depends_on": null, + "description": null, + "fieldname": "party_type_name", + "fieldtype": "Data", + "hidden": null, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": 1, + "label": "Party Type Name", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": null, + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": null, + "report_hide": null, + "reqd": 1, + "search_index": null, + "set_only_once": null, + "trigger": null, + "width": null + }, + { + "allow_on_submit": null, + "default": null, + "depends_on": null, + "description": null, + "fieldname": "parent_party_type", + "fieldtype": "Link", + "hidden": null, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": null, + "label": "Parent Party Type", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": "Party Type", + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": null, + "report_hide": null, + "reqd": null, + "search_index": null, + "set_only_once": null, + "trigger": null, + "width": null + }, + { + "allow_on_submit": null, + "default": "Yes", + "depends_on": null, + "description": null, + "fieldname": "allow_children", + "fieldtype": "Select", + "hidden": null, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": null, + "label": "Allow Children", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": "Yes\nNo", + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": null, + "report_hide": null, + "reqd": null, + "search_index": null, + "set_only_once": null, + "trigger": null, + "width": null + }, + { + "allow_on_submit": null, + "default": null, + "depends_on": null, + "description": null, + "fieldname": "default_price_list", + "fieldtype": "Link", + "hidden": null, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": null, + "label": "Default Price List", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": "Price List", + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": null, + "report_hide": null, + "reqd": null, + "search_index": null, + "set_only_once": null, + "trigger": null, + "width": null + }, + { + "allow_on_submit": null, + "default": null, + "depends_on": null, + "description": null, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": null, + "label": "LFT", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": null, + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": 1, + "report_hide": null, + "reqd": null, + "search_index": 1, + "set_only_once": null, + "trigger": null, + "width": null + }, + { + "allow_on_submit": null, + "default": null, + "depends_on": null, + "description": null, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": null, + "label": "RGT", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": null, + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": 1, + "report_hide": null, + "reqd": null, + "search_index": 1, + "set_only_once": null, + "trigger": null, + "width": null + }, + { + "allow_on_submit": null, + "default": null, + "depends_on": null, + "description": null, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "ignore_restrictions": null, + "in_filter": null, + "in_list_view": null, + "label": "Old Parent", + "no_column": null, + "no_copy": null, + "oldfieldname": null, + "oldfieldtype": null, + "options": null, + "permlevel": 0, + "print_hide": null, + "print_width": null, + "read_only": 1, + "report_hide": null, + "reqd": null, + "search_index": null, + "set_only_once": null, + "trigger": null, + "width": null + } + ], + "hide_heading": null, + "hide_toolbar": null, + "icon": null, + "idx": null, + "in_create": null, + "in_dialog": null, + "is_submittable": null, + "is_transaction_doc": null, + "issingle": null, + "istable": null, + "max_attachments": null, + "menu_index": null, + "modified": "2014-04-07 12:54:46.254776", + "modified_by": "Administrator", + "module": "Contacts", + "name": "Party Type", + "name_case": null, + "owner": "Administrator", + "parent": null, + "parent_node": null, + "parentfield": null, + "parenttype": null, + "permissions": [ + { + "amend": null, + "cancel": null, + "create": 1, + "delete": null, + "email": null, + "export": null, + "import": null, + "match": null, + "permlevel": 0, + "print": null, + "read": 1, + "report": null, + "restrict": null, + "restricted": null, + "role": "Sales User", + "submit": null, + "write": 1 + }, + { + "amend": null, + "cancel": null, + "create": 1, + "delete": null, + "email": null, + "export": null, + "import": null, + "match": null, + "permlevel": 0, + "print": null, + "read": 1, + "report": null, + "restrict": null, + "restricted": null, + "role": "Purchase User", + "submit": null, + "write": 1 + } + ], + "plugin": null, + "print_outline": null, + "read_only": null, + "read_only_onload": null, + "search_fields": null, + "section_style": null, + "server_code": null, + "server_code_compiled": null, + "server_code_core": null, + "server_code_error": null, + "show_in_menu": null, + "smallicon": null, + "subject": null, + "tag_fields": null, + "title_field": null, + "use_template": null, + "version": null +} \ No newline at end of file diff --git a/erpnext/contacts/doctype/party_type/party_type.py b/erpnext/contacts/doctype/party_type/party_type.py new file mode 100644 index 0000000000..3f752edc5b --- /dev/null +++ b/erpnext/contacts/doctype/party_type/party_type.py @@ -0,0 +1,9 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils.nestedset import NestedSet + +class PartyType(NestedSet): + nsm_parent_field = 'parent_party_type'; diff --git a/erpnext/modules.txt b/erpnext/modules.txt index f7857e4334..92614d87e5 100644 --- a/erpnext/modules.txt +++ b/erpnext/modules.txt @@ -8,4 +8,5 @@ selling setup stock support -utilities \ No newline at end of file +utilities +contacts diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py index 444356752d..11a15faae3 100644 --- a/erpnext/setup/doctype/customer_group/customer_group.py +++ b/erpnext/setup/doctype/customer_group/customer_group.py @@ -6,8 +6,8 @@ import frappe from frappe import msgprint -from frappe.utils.nestedset import DocTypeNestedSet -class CustomerGroup(DocTypeNestedSet): +from frappe.utils.nestedset import NestedSet +class CustomerGroup(NestedSet): nsm_parent_field = 'parent_customer_group'; def validate(self): diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index e1f79a570b..e744ae2418 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -4,9 +4,9 @@ from __future__ import unicode_literals import frappe -from frappe.utils.nestedset import DocTypeNestedSet +from frappe.utils.nestedset import NestedSet -class ItemGroup(DocTypeNestedSet): +class ItemGroup(NestedSet): nsm_parent_field = 'parent_item_group' def validate(self): @@ -15,7 +15,7 @@ class ItemGroup(DocTypeNestedSet): self.parent_item_group) def on_update(self): - DocTypeNestedSet.on_update(self) + NestedSet.on_update(self) self.validate_name_with_item() diff --git a/erpnext/setup/doctype/sales_person/sales_person.py b/erpnext/setup/doctype/sales_person/sales_person.py index 7f87210651..6389722349 100644 --- a/erpnext/setup/doctype/sales_person/sales_person.py +++ b/erpnext/setup/doctype/sales_person/sales_person.py @@ -5,9 +5,9 @@ from __future__ import unicode_literals import frappe from frappe.utils import flt -from frappe.utils.nestedset import DocTypeNestedSet +from frappe.utils.nestedset import NestedSet -class SalesPerson(DocTypeNestedSet): +class SalesPerson(NestedSet): nsm_parent_field = 'parent_sales_person'; def validate(self): diff --git a/erpnext/setup/doctype/territory/territory.py b/erpnext/setup/doctype/territory/territory.py index a015644e64..83eae91c37 100644 --- a/erpnext/setup/doctype/territory/territory.py +++ b/erpnext/setup/doctype/territory/territory.py @@ -7,9 +7,9 @@ import frappe from frappe.utils import flt -from frappe.utils.nestedset import DocTypeNestedSet +from frappe.utils.nestedset import NestedSet -class Territory(DocTypeNestedSet): +class Territory(NestedSet): nsm_parent_field = 'parent_territory' def validate(self): diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py index 3f52463610..2bd906f1c2 100644 --- a/erpnext/setup/page/setup_wizard/setup_wizard.py +++ b/erpnext/setup/page/setup_wizard/setup_wizard.py @@ -12,13 +12,13 @@ from frappe.utils.file_manager import save_file def setup_account(args=None): # if frappe.db.sql("select name from tabCompany"): # frappe.throw(_("Setup Already Complete!!")) - + if not args: args = frappe.local.form_dict if isinstance(args, basestring): args = json.loads(args) args = frappe._dict(args) - + update_user_name(args) create_fiscal_year_and_company(args) set_defaults(args) @@ -35,12 +35,12 @@ def setup_account(args=None): frappe.clear_cache() frappe.db.commit() - + # suppress msgprints frappe.local.message_log = [] return "okay" - + def update_user_name(args): if args.get("email"): args['name'] = args.get("email") @@ -59,18 +59,18 @@ def update_user_name(args): args['name'] = frappe.session.user # Update User - if not args.get('last_name') or args.get('last_name')=='None': + 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"): filename, filetype, content = args.get("attach_user").split(",") fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_name 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({ @@ -91,9 +91,9 @@ def create_fiscal_year_and_company(args): 'country': args.get('country'), 'chart_of_accounts': args.get(('chart_of_accounts')), }).insert() - + args["curr_fiscal_year"] = curr_fiscal_year - + def create_price_lists(args): for pl_type in ["Selling", "Buying"]: frappe.get_doc({ @@ -107,11 +107,11 @@ def create_price_lists(args): "territory": "All Territories" } }).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, @@ -123,7 +123,7 @@ def set_defaults(args): "time_zone": args.get("time_zone") }) global_defaults.save() - + accounts_settings = frappe.get_doc("Accounts Settings") accounts_settings.auto_accounting_for_stock = 1 accounts_settings.save() @@ -134,7 +134,7 @@ def set_defaults(args): stock_settings.stock_uom = "Nos" stock_settings.auto_indent = 1 stock_settings.save() - + selling_settings = frappe.get_doc("Selling Settings") selling_settings.cust_master_name = "Customer Name" selling_settings.so_required = "No" @@ -164,7 +164,7 @@ def set_defaults(args): # default frappe.db.set_default("company_name", args["company_name"]) - + def create_feed_and_todo(): """update activty feed and create todo for creation of item, customer, vendor""" from erpnext.home import make_feed @@ -174,9 +174,9 @@ def create_feed_and_todo(): def create_email_digest(): from frappe.utils.user import get_system_managers system_managers = get_system_managers(only_name=True) - if not system_managers: + 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): @@ -188,12 +188,12 @@ def create_email_digest(): "recipient_list": "\n".join(system_managers) }) - for fieldname in edigest.meta.get_fieldnames({"fieldtype": "Check"}): + for fieldname in edigest.meta.get("fields", {"fieldtype": "Check"}): if fieldname != "scheduler_errors": edigest.set(fieldname, 1) - + edigest.insert() - + # scheduler errors digest if companies: edigest = frappe.new_doc("Email Digest") @@ -206,7 +206,7 @@ def create_email_digest(): "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: @@ -245,12 +245,12 @@ def create_items(args): "stock_uom": args.get("item_uom_" + str(i)), "default_warehouse": item_group!="Service" and ("Finished Goods - " + args.get("company_abbr")) or "" }).insert() - + if args.get("item_img_" + str(i)): filename, filetype, content = args.get("item_img_" + str(i)).split(",") fileurl = save_file(filename, content, "Item", item, decode=True).file_name frappe.db.set_value("Item", item, "image", fileurl) - + for i in xrange(1,6): item = args.get("item_buy_" + str(i)) if item: @@ -266,7 +266,7 @@ def create_items(args): "stock_uom": args.get("item_buy_uom_" + str(i)), "default_warehouse": item_group!="Service" and ("Stores - " + args.get("company_abbr")) or "" }).insert() - + if args.get("item_img_" + str(i)): filename, filetype, content = args.get("item_img_" + str(i)).split(",") fileurl = save_file(filename, content, "Item", item, decode=True).file_name @@ -285,7 +285,7 @@ def create_customers(args): "territory": args.get("country"), "company": args.get("company_name") }).insert() - + if args.get("customer_contact_" + str(i)): contact = args.get("customer_contact_" + str(i)).split(" ") frappe.get_doc({ @@ -294,7 +294,7 @@ def create_customers(args): "first_name":contact[0], "last_name": len(contact) > 1 and contact[1] or "" }).insert() - + def create_suppliers(args): for i in xrange(1,6): supplier = args.get("supplier_" + str(i)) @@ -323,11 +323,11 @@ def create_letter_head(args): "letter_head_name": "Standard", "is_default": 1 }).insert() - + filename, filetype, content = args.get("attach_letterhead").split(",") fileurl = save_file(filename, content, "Letter Head", "Standard", decode=True).file_name frappe.db.set_value("Letter Head", "Standard", "content", "" % fileurl) - + def add_all_roles_to(name): user = frappe.get_doc("User", name) for role in frappe.db.sql("""select name from tabRole"""): @@ -348,4 +348,4 @@ def create_territories(): "territory_name": name.replace("'", ""), "parent_territory": root_territory, "is_group": "No" - }).insert() \ No newline at end of file + }).insert()