Esempio n. 1
0
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()
Esempio n. 3
0
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
Esempio n. 4
0
    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)
Esempio n. 5
0
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)
Esempio n. 6
0
    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
Esempio n. 7
0
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()
Esempio n. 8
0
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
Esempio n. 9
0
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)
Esempio n. 10
0
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]
Esempio n. 11
0
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()
Esempio n. 12
0
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
Esempio n. 13
0
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()
Esempio n. 14
0
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