def make_serial_no(serial_no, sle): sr = frappe.new_bean("Serial No") sr.doc.serial_no = serial_no sr.doc.item_code = sle.item_code sr.make_controller().via_stock_ledger = True sr.insert() sr.doc.warehouse = sle.warehouse sr.doc.status = "Available" sr.save() frappe.msgprint(_("Serial No created") + ": " + sr.doc.name) return sr.doc.name
def migrate_unit_to_website_group(unit): unit = frappe.bean("Unit", unit) if frappe.conn.get_value("Website Group", cleanup_page_name(unit.doc.name)): # already exists! return unit_name = cleanup_page_name(unit.doc.name) print unit_name # create website group group = frappe.new_bean("Website Group") group.doc.group_name = unit.doc.name group.doc.group_title = unit.doc.unit_title group.doc.group_type = unit.doc.unit_type group.doc.group_description = unit.doc.unit_description group.doc.public_read = unit.doc.public_read group.doc.public_write = unit.doc.public_write group.doc.upvotes = unit.doc.upvotes group.doc.replies = unit.doc.replies if unit.doc.parent_unit: parent_docname = cleanup_page_name(unit.doc.parent_unit) group.doc.parent_website_sitemap = frappe.conn.get_value("Website Sitemap", {"ref_doctype": "Website Group", "docname": parent_docname}) # just making sure if my logic is correct! if not group.doc.parent_website_sitemap: if parent_docname.endswith("discussion"): print "ignoring", unit_name return raise Exception("Website Sitemap Not Found: {}".format(unit.doc.parent_unit)) group.insert() # add website sitemap permissions for d in unit.doclist.get({"doctype": "Unit Profile"}): frappe.bean({ "doctype": "Website Sitemap Permission", "website_sitemap": group.doc.page_name, "profile": d.profile, "read": d.read, "write": d.write, "admin": d.admin }).insert() # move posts frappe.conn.sql("""update `tabPost` set website_group=%s where unit=%s""", (group.doc.name, unit.doc.name)) # WARNING - commit here to avoid too many writes error! frappe.conn.commit()
def add_to_sitemap(options): bean = frappe.new_bean("Website Route") for key in sitemap_fields: bean.doc.fields[key] = options.get(key) if not bean.doc.page_name: bean.doc.page_name = options.link_name bean.doc.website_template = options.link_name bean.insert(ignore_permissions=True) return bean.doc.idx
def test_cannot_create_direct(self): sr = frappe.new_bean("Serial No") sr.doc.item_code = "_Test Serialized Item" sr.doc.warehouse = "_Test Warehouse - _TC" sr.doc.serial_no = "_TCSER0001" sr.doc.purchase_rate = 10 self.assertRaises(SerialNoCannotCreateDirectError, sr.insert) sr.doc.warehouse = None sr.insert() self.assertTrue(sr.doc.name) sr.doc.warehouse = "_Test Warehouse - _TC" self.assertTrue(SerialNoCannotCannotChangeError, sr.doc.save)
def add_system_manager(email, first_name=None, last_name=None): # add profile profile = frappe.new_bean("Profile") profile.doc.fields.update({ "name": email, "email": email, "enabled": 1, "first_name": first_name or email, "last_name": last_name, "user_type": "System User" }) profile.insert() # add roles roles = frappe.db.sql_list("""select name from `tabRole` where name not in ("Administrator", "Guest", "All")""") profile.get_controller().add_roles(*roles)
def create_production_order(self, items): """Create production order. Called from Production Planning Tool""" from erpnext.manufacturing.doctype.production_order.production_order import OverProductionError pro_list = [] for key in items: pro = frappe.new_bean("Production Order") pro.doc.fields.update(items[key]) frappe.flags.mute_messages = True try: pro.insert() pro_list.append(pro.doc.name) except OverProductionError, e: pass frappe.flags.mute_messages = False
def run_purchase(current_date): # make material requests for purchase items that have negative projected qtys if can_make("Material Request"): report = "Items To Be Requested" for row in query_report.run(report)["result"][:how_many("Material Request")]: mr = frappe.new_bean("Material Request") mr.material_request_type = "Purchase" mr.transaction_date = current_date mr.fiscal_year = cstr(current_date.year) mr.append("indent_details", { "doctype": "Material Request Item", "schedule_date": frappe.utils.add_days(current_date, 7), "item_code": row[0], "qty": -row[-1] }) mr.insert() mr.submit() # make supplier quotations if can_make("Supplier Quotation"): from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation report = "Material Requests for which Supplier Quotations are not created" for row in query_report.run(report)["result"][:how_many("Supplier Quotation")]: if row[0] != "Total": sq = frappe.get_doc(make_supplier_quotation(row[0])) sq.transaction_date = current_date sq.fiscal_year = cstr(current_date.year) sq.insert() sq.submit() frappe.db.commit() # make purchase orders if can_make("Purchase Order"): from erpnext.stock.doctype.material_request.material_request import make_purchase_order report = "Requested Items To Be Ordered" for row in query_report.run(report)["result"][:how_many("Purchase Order")]: if row[0] != "Total": po = frappe.get_doc(make_purchase_order(row[0])) po.transaction_date = current_date po.fiscal_year = cstr(current_date.year) po.insert() po.submit() frappe.db.commit()
def get_party(user): customer = frappe.db.get_value("Contact", {"email_id": user}, "customer") if customer: return frappe.bean("Customer", customer) lead = frappe.db.get_value("Lead", {"email_id": user}) if lead: return frappe.bean("Lead", lead) # create a lead lead = frappe.new_bean("Lead") lead.doc.fields.update({ "email_id": user, "lead_name": get_fullname(user), "territory": guess_territory() }) lead.insert(ignore_permissions=True) return lead
def _make(doctype=None, name=None, content=None, subject=None, sent_or_received = "Sent", sender=None, recipients=None, communication_medium="Email", send_email=False, print_html=None, attachments='[]', send_me_a_copy=False, set_lead=True, date=None): # add to Communication sent_via = None # since we are using fullname and email, # if the fullname has any incompatible characters,formataddr can deal with it try: sender = json.loads(sender) except ValueError: pass if isinstance(sender, (tuple, list)) and len(sender)==2: sender = formataddr(sender) comm = frappe.new_bean('Communication') d = comm.doc d.subject = subject d.content = content d.sent_or_received = sent_or_received d.sender = sender or frappe.db.get_value("Profile", frappe.session.user, "email") d.recipients = recipients # add as child sent_via = frappe.get_obj(doctype, name) d.parent = name d.parenttype = doctype d.parentfield = "communications" if date: d.communication_date = date d.communication_medium = communication_medium comm.ignore_permissions = True comm.insert() if send_email: d = comm.doc send_comm_email(d, name, sent_via, print_html, attachments, send_me_a_copy)
def make_stock_entry(production_order_id, purpose): production_order = frappe.bean("Production Order", production_order_id) stock_entry = frappe.new_bean("Stock Entry") stock_entry.doc.purpose = purpose stock_entry.doc.production_order = production_order_id stock_entry.doc.company = production_order.doc.company stock_entry.doc.bom_no = production_order.doc.bom_no stock_entry.doc.use_multi_level_bom = production_order.doc.use_multi_level_bom stock_entry.doc.fg_completed_qty = flt(production_order.doc.qty) - flt( production_order.doc.produced_qty) if purpose == "Material Transfer": stock_entry.doc.to_warehouse = production_order.doc.wip_warehouse else: stock_entry.doc.from_warehouse = production_order.doc.wip_warehouse stock_entry.doc.to_warehouse = production_order.doc.fg_warehouse stock_entry.run_method("get_items") return [d.fields for d in stock_entry.doclist]
def make_demo_user(): from frappe.auth import _update_password roles = ["Accounts Manager", "Analytics", "Expense Approver", "Accounts User", "Leave Approver", "Blogger", "Customer", "Sales Manager", "Employee", "Support Manager", "HR Manager", "HR User", "Maintenance Manager", "Maintenance User", "Material Manager", "Material Master Manager", "Material User", "Manufacturing Manager", "Manufacturing User", "Projects User", "Purchase Manager", "Purchase Master Manager", "Purchase User", "Quality Manager", "Report Manager", "Sales Master Manager", "Sales User", "Supplier", "Support Team"] def add_roles(bean): for role in roles: p.append("user_roles", { "doctype": "UserRole", "role": role }) # make demo user if frappe.db.exists("User", "*****@*****.**"): frappe.delete_doc("User", "*****@*****.**") p = frappe.new_bean("User") p.email = "*****@*****.**" p.first_name = "Demo" p.last_name = "User" p.enabled = 1 p.user_type = "ERPNext Demo" p.insert() add_roles(p) p.save() _update_password("*****@*****.**", "demo") # only read for newsletter frappe.db.sql("""update `tabDocPerm` set `write`=0, `create`=0, `cancel`=0 where parent='Newsletter'""") frappe.db.sql("""update `tabDocPerm` set `write`=0, `create`=0, `cancel`=0 where parent='User' and role='All'""") frappe.db.commit()
def get_quotation(user=None): if not user: user = frappe.session.user if user == "Guest": raise frappe.PermissionError is_shopping_cart_enabled() party = get_party(user) values = { "order_type": "Shopping Cart", party.doc.doctype.lower(): party.doc.name, "docstatus": 0, } try: quotation = frappe.bean("Quotation", values) except frappe.DoesNotExistError: quotation = frappe.new_bean("Quotation") quotation.doc.fields.update(values) quotation.insert(ignore_permissions=True) return quotation
def create_email_digest(): from frappe.profile 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.bean({ "doctype": "Email Digest", "name": "Default Weekly Digest - " + company, "company": company, "frequency": "Weekly", "recipient_list": "\n".join(system_managers) }) for fieldname in edigest.meta.get_fieldnames( {"fieldtype": "Check"}): if fieldname != "scheduler_errors": edigest.doc.fields[fieldname] = 1 edigest.insert() # scheduler errors digest if companies: edigest = frappe.new_bean("Email Digest") edigest.doc.fields.update({ "name": "Scheduler Errors", "company": companies[0], "frequency": "Daily", "recipient_list": "\n".join(system_managers), "scheduler_errors": 1, "enabled": 1 }) edigest.insert()
def get_payment_entry(doc): bank_account = get_default_bank_cash_account(doc.company, "Bank Voucher") jv = frappe.new_bean('Journal Voucher') jv.doc.voucher_type = 'Bank Voucher' jv.doc.company = doc.company jv.doc.fiscal_year = doc.fiscal_year jv.doclist.append({ "doctype": "Journal Voucher Detail", "parentfield": "entries" }) jv.doclist.append({ "doctype": "Journal Voucher Detail", "parentfield": "entries" }) if bank_account: jv.doclist[2].account = bank_account["account"] jv.doclist[2].balance = bank_account["balance"] return jv