예제 #1
0
def place_order():
	quotation = _get_cart_quotation()
	quotation.company = frappe.db.get_value("Shopping Cart Settings", None, "company")
	for fieldname in ["customer_address", "shipping_address_name"]:
		if not quotation.get(fieldname):
			throw(_("{0} is required").format(quotation.meta.get_label(fieldname)))

	quotation.ignore_permissions = True
	quotation.submit()

	if quotation.lead:
		# company used to create customer accounts
		frappe.defaults.set_user_default("company", quotation.company)

	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
	for item in sales_order.get("sales_order_details"):
		item.reserved_warehouse = frappe.db.get_value("Item", item.item_code, "website_warehouse") or None

	sales_order.ignore_permissions = True
	sales_order.insert()
	sales_order.submit()
	frappe.local.cookie_manager.delete_cookie("cart_count")

	return sales_order.name
예제 #2
0
파일: cart.py 프로젝트: Aptronics/erpnext
def place_order():
	quotation = _get_cart_quotation()
	quotation.company = frappe.db.get_value("Shopping Cart Settings", None, "company")
	if not quotation.get("customer_address"):
		throw(_("{0} is required").format(_(quotation.meta.get_label("customer_address"))))

	quotation.flags.ignore_permissions = True
	quotation.submit()

	if quotation.lead:
		# company used to create customer accounts
		frappe.defaults.set_user_default("company", quotation.company)

	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
	for item in sales_order.get("items"):
		item.reserved_warehouse, is_stock_item = frappe.db.get_value("Item",
			item.item_code, ["website_warehouse", "is_stock_item"])

		if is_stock_item:
			item_stock = get_qty_in_stock(item.item_code, "website_warehouse")
			if item.qty > item_stock.stock_qty[0][0]:
				throw(_("Only {0} in stock for item {1}").format(item_stock.stock_qty[0][0], item.item_code))

	sales_order.flags.ignore_permissions = True
	sales_order.insert()
	sales_order.submit()

	if hasattr(frappe.local, "cookie_manager"):
		frappe.local.cookie_manager.delete_cookie("cart_count")

	return sales_order.name
예제 #3
0
def place_order():
	quotation = _get_cart_quotation()
	quotation.company = frappe.db.get_value("Shopping Cart Settings", None, "company")
	for fieldname in ["customer_address", "shipping_address_name"]:
		if not quotation.get(fieldname):
			throw(_("{0} is required").format(quotation.meta.get_label(fieldname)))

	quotation.flags.ignore_permissions = True
	quotation.submit()

	if quotation.lead:
		# company used to create customer accounts
		frappe.defaults.set_user_default("company", quotation.company)

	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
	for item in sales_order.get("items"):
		item.reserved_warehouse = frappe.db.get_value("Item", item.item_code, "website_warehouse") or None

	sales_order.flags.ignore_permissions = True
	sales_order.insert()
	sales_order.submit()

	if hasattr(frappe.local, "cookie_manager"):
		frappe.local.cookie_manager.delete_cookie("cart_count")

	return sales_order.name
예제 #4
0
def place_order():
	quotation = _get_cart_quotation()
	quotation.company = frappe.db.get_value("Shopping Cart Settings", None, "company")
	if not quotation.get("customer_address"):
		throw(_("{0} is required").format(_(quotation.meta.get_label("customer_address"))))

	quotation.flags.ignore_permissions = True
	quotation.submit()

	if quotation.lead:
		# company used to create customer accounts
		frappe.defaults.set_user_default("company", quotation.company)

	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
	for item in sales_order.get("items"):
		item.reserved_warehouse, is_stock_item = frappe.db.get_value("Item",
			item.item_code, ["website_warehouse", "is_stock_item"]) or None, None

		if is_stock_item:
			item_stock = get_qty_in_stock(item.item_code, "website_warehouse")
			if item.qty > item_stock.stock_qty[0][0]:
				throw(_("Only {0} in stock for item {1}").format(item_stock.stock_qty[0][0], item.item_code))

	sales_order.flags.ignore_permissions = True
	sales_order.insert()
	sales_order.submit()

	if hasattr(frappe.local, "cookie_manager"):
		frappe.local.cookie_manager.delete_cookie("cart_count")

	return sales_order.name
예제 #5
0
def make_sales_order(source_name, target_doc=None):
    so = frappe.db.sql(
        """select name from `tabSales Order Item` where prevdoc_docname=%s and docstatus=1""",
        source_name)
    if not so:
        from erpnext.selling.doctype.quotation.quotation import _make_sales_order
        return _make_sales_order(source_name, target_doc)
예제 #6
0
파일: cart.py 프로젝트: MorezMartin/erpnext
def place_order():
    quotation = _get_cart_quotation()
    cart_settings = frappe.db.get_value(
        "E Commerce Settings",
        None, [
            "company", "allow_items_not_in_stock", "choose_delivery_date",
            "terms_and_conditions"
        ],
        as_dict=1)
    quotation.company = cart_settings.company
    quotation.tc_name = cart_settings.terms_and_conditions
    quotation.terms = get_terms_and_conditions(quotation.tc_name)
    choose_delivery_date = cart_settings.choose_delivery_date

    quotation.flags.ignore_permissions = True

    if quotation.quotation_to == 'Lead' and quotation.party_name:
        # company used to create customer accounts
        frappe.defaults.set_user_default("company", quotation.company)

    if not (quotation.shipping_address_name or quotation.customer_address):
        frappe.throw(_("Set Shipping Address or Billing Address"))

    if choose_delivery_date:
        update_delivery_date(delivery_date=quotation.delivery_date)

    quotation.submit()

    from erpnext.selling.doctype.quotation.quotation import _make_sales_order
    sales_order = frappe.get_doc(
        _make_sales_order(quotation.name, ignore_permissions=True))
    sales_order.payment_schedule = []

    if not cint(cart_settings.allow_items_not_in_stock):
        for item in sales_order.get("items"):
            item.warehouse = frappe.db.get_value("Website Item",
                                                 {"item_code": item.item_code},
                                                 "website_warehouse")
            is_stock_item = frappe.db.get_value("Item", item.item_code,
                                                "is_stock_item")

            if is_stock_item:
                item_stock = get_web_item_qty_in_stock(item.item_code,
                                                       "website_warehouse")
                if not cint(item_stock.in_stock):
                    throw(_("{0} Not in Stock").format(item.item_code))
                if item.qty > item_stock.stock_qty[0][0]:
                    throw(
                        _("Only {0} in Stock for item {1}").format(
                            item_stock.stock_qty[0][0], item.item_code))

    sales_order.flags.ignore_permissions = True
    sales_order.insert()
    sales_order.submit()

    if hasattr(frappe.local, "cookie_manager"):
        frappe.local.cookie_manager.delete_cookie("cart_count")

    return sales_order.name
예제 #7
0
def place_order(billing_address=None, shipping_address=None):
    if frappe.session.user != 'Guest':
        return place_order_original()

    if isinstance(billing_address, str):
        billing_address = json.loads(billing_address)
    if isinstance(shipping_address, str):
        shipping_address = json.loads(shipping_address)

    quotation = _get_cart_quotation()

    _update_lead_name(quotation.party_name)
    _add_addresses(shipping_address, billing_address, quotation.party_name,
                   quotation)

    cart_settings = frappe.db.get_value(
        "Shopping Cart Settings",
        None, ["company", "allow_items_not_in_stock"],
        as_dict=1)
    quotation.company = cart_settings.company
    if not quotation.get("customer_address"):
        throw(
            _("{0} is required").format(
                _(quotation.meta.get_label("customer_address"))))

    quotation.flags.ignore_permissions = True
    quotation.submit()

    if quotation.quotation_to == 'Lead' and quotation.party_name:
        # company used to create customer accounts
        frappe.defaults.set_user_default("company", quotation.company)

    from erpnext.selling.doctype.quotation.quotation import _make_sales_order
    sales_order = frappe.get_doc(
        _make_sales_order(quotation.name, ignore_permissions=True))
    sales_order.payment_schedule = []

    if not cart_settings.allow_items_not_in_stock:
        for item in sales_order.get("items"):
            item.reserved_warehouse, is_stock_item = frappe.db.get_value(
                "Item", item.item_code, ["website_warehouse", "is_stock_item"])

            if is_stock_item:
                item_stock = get_qty_in_stock(item.item_code,
                                              "website_warehouse")
                if item.qty > item_stock.stock_qty[0][0]:
                    throw(
                        _("Only {0} in stock for item {1}").format(
                            item_stock.stock_qty[0][0], item.item_code))

    sales_order.flags.ignore_permissions = True
    sales_order.insert()
    sales_order.submit()

    if hasattr(frappe.local, "cookie_manager"):
        frappe.local.cookie_manager.delete_cookie("cart_count")

    return sales_order.name
예제 #8
0
def place_order():
	quotation = _get_cart_quotation()
	for fieldname in ["customer_address", "shipping_address_name"]:
		if not quotation.get(fieldname):
			throw(_("{0} is required").format(quotation.meta.get_label(fieldname)))

	quotation.ignore_permissions = True
	quotation.submit()

	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
	sales_order.ignore_permissions = True
	sales_order.insert()
	sales_order.submit()
	frappe.local.cookie_manager.delete_cookie("cart_count")

	return sales_order.name
예제 #9
0
def authorize_payment(affirm_data, reference_doctype, reference_docname,
                      integration_request):
    """
		once callback return checkout token it will authroized payment status as failed or sucessful
	"""
    payment_request = frappe.get_doc(reference_doctype, reference_docname)
    redirect_url = "/integrations/payment-failed"

    #if the payment request generated from a quotation, we convert quotation to sale order
    if payment_request.reference_doctype == "Quotation" and not affirm_data.get(
            "type") == "invalid_request":

        #we get the quotation document and submit it
        quotation = frappe.get_doc(payment_request.reference_doctype,
                                   payment_request.reference_name)
        quotation.save(ignore_permissions=True)
        quotation.submit()

        #convert the quotation to a sales order
        from erpnext.selling.doctype.quotation.quotation import _make_sales_order
        sales_order = frappe.get_doc(
            _make_sales_order(quotation.name, ignore_permissions=True))
        sales_order.payment_schedule = []
        sales_order.flags.ignore_permissions = True
        sales_order.insert()
        #payment entry is made for affirm when it is captured in the sales order document in frappe desk

    # check if callback already happened
    if affirm_data.get("status_code") == 400 and affirm_data.get(
            "code") == "checkout-token-used":
        integration_request.update_status(affirm_data, "Completed")
        redirect_url = '/integrations/payment-success'
    elif affirm_data.get("status_code") == 400 and affirm_data.get(
            "type") == "invalid_request":
        integration_request.update_status(affirm_data, "Failed")
        frappe.msgprint(affirm_data.get("message"))
        redirect_url = "/cart"
    else:
        payment_successful(affirm_data, sales_order)
        integration_request.update_status(affirm_data, "Completed")
        redirect_url = '/integrations/payment-success'

    frappe.local.response["type"] = "redirect"
    frappe.local.response["location"] = get_url(redirect_url)
    return ""
예제 #10
0
def place_order():
	quotation = _get_cart_quotation()
	controller = quotation.make_controller()
	for fieldname in ["customer_address", "shipping_address_name"]:
		if not quotation.doc.fields.get(fieldname):
			throw(_("Please select a") + " " + _(controller.meta.get_label(fieldname)))
	
	quotation.ignore_permissions = True
	quotation.submit()
	
	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
	sales_order = frappe.bean(_make_sales_order(quotation.doc.name, ignore_permissions=True))
	sales_order.ignore_permissions = True
	sales_order.insert()
	sales_order.submit()
	frappe._response.set_cookie("cart_count", "")
	
	return sales_order.doc.name
예제 #11
0
def place_order():
    quotation = _get_cart_quotation()
    cart_settings = frappe.db.get_value(
        "Shopping Cart Settings",
        None, ["company", "allow_items_not_in_stock"],
        as_dict=1)
    quotation.company = cart_settings.company

    quotation.flags.ignore_permissions = True
    quotation.submit()

    if quotation.quotation_to == 'Lead' and quotation.party_name:
        # company used to create customer accounts
        frappe.defaults.set_user_default("company", quotation.company)

    if not (quotation.shipping_address_name or quotation.customer_address):
        frappe.throw(_("Set Shipping Address or Billing Address"))

    from erpnext.selling.doctype.quotation.quotation import _make_sales_order
    sales_order = frappe.get_doc(
        _make_sales_order(quotation.name, ignore_permissions=True))
    sales_order.payment_schedule = []

    if not cint(cart_settings.allow_items_not_in_stock):
        for item in sales_order.get("items"):
            item.reserved_warehouse, is_stock_item = frappe.db.get_value(
                "Item", item.item_code, ["website_warehouse", "is_stock_item"])

            if is_stock_item:
                item_stock = get_qty_in_stock(item.item_code,
                                              "website_warehouse")
                if item.qty > item_stock.stock_qty[0][0]:
                    throw(
                        _("Only {0} in stock for item {1}").format(
                            item_stock.stock_qty[0][0], item.item_code))

    sales_order.flags.ignore_permissions = True
    sales_order.insert()
    sales_order.submit()

    if hasattr(frappe.local, "cookie_manager"):
        frappe.local.cookie_manager.delete_cookie("cart_count")

    return sales_order.name
예제 #12
0
파일: cart.py 프로젝트: Bloomstack/erpnext
def place_order(delivery_date=None):
    """
	Place an order for items in the shopping cart.

	Args:
		delivery_date (date, optional): The delivery date requested by the sales user/customer. Defaults to None.

	Returns:
		string: the name of the quotation or the sales order
	"""
    #get the quotation in the cart and the cart settings
    quotation = _get_cart_quotation()
    cart_settings = frappe.db.get_value(
        "Shopping Cart Settings",
        None, [
            "company", "allow_items_not_in_stock",
            'sales_team_order_without_payment'
        ],
        as_dict=1)
    quotation.company = cart_settings.company
    quotation.flags.ignore_permissions = True

    if quotation.quotation_to == 'Lead' and quotation.party_name:
        # company used to create customer accounts
        frappe.defaults.set_user_default("company", quotation.company)

    if not (quotation.shipping_address_name or quotation.customer_address):
        frappe.throw(_("Set Shipping Address or Billing Address"))

    # Checking if items in quotation are in stock, if not throw an error
    if not cint(cart_settings.allow_items_not_in_stock):
        for item in quotation.get("items"):
            item.reserved_warehouse, is_stock_item = frappe.db.get_value(
                "Item", item.item_code, ["website_warehouse", "is_stock_item"])

            if is_stock_item:
                item_stock = get_qty_in_stock(item.item_code,
                                              "website_warehouse")
                if not cint(item_stock.in_stock):
                    throw(_("{1} Not in Stock").format(item.item_code))
                if item.qty > item_stock.stock_qty[0][0]:
                    throw(
                        _("Only {0} in Stock for item {1}: {2}").format(
                            item_stock.stock_qty[0][0], item.item_code,
                            item.item_name))

    #if checkout without payment has been enabled, submit the quotation, and convert to sales order
    if cart_settings.sales_team_order_without_payment:

        #add the requested delivery date to the quotation and submit the document
        quotation.requested_delivery_date = getdate(delivery_date)
        for item in quotation.items:
            item.requested_delivery_date = getdate(delivery_date)

        quotation.save(ignore_permissions=True)
        quotation.submit()
        frappe.db.commit()

        #convert the quotation to a sales order
        from erpnext.selling.doctype.quotation.quotation import _make_sales_order
        sales_order = frappe.get_doc(
            _make_sales_order(quotation.name, ignore_permissions=True))
        sales_order.payment_schedule = []
        sales_order.transaction_date = nowdate()
        #expected delivery date to the sales order is mapped from the quotation

        sales_order.flags.ignore_mandatory = True
        sales_order.flags.ignore_links = True
        sales_order.insert(ignore_permissions=True)
        sales_order.submit()

        return sales_order.name

    return quotation.name
예제 #13
0
def make_sales_order(source_name, target_doc=None):
	so=frappe.db.sql("""select name from `tabSales Order Item` where prevdoc_docname=%s and docstatus=1""",source_name)
	if not so:
		from erpnext.selling.doctype.quotation.quotation import _make_sales_order
		return _make_sales_order(source_name, target_doc)
예제 #14
0
    def create_payment_entry(self, submit=True):
        """Generate a payment entry against a quotation or sales order"""

        frappe.flags.ignore_account_permission = True
        ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)

        #select debit_to or credit_to account depending on sales order or purchase order
        if self.reference_doctype == "Sales Invoice":
            party_account = ref_doc.debit_to
        elif self.reference_doctype == "Purchase Invoice":
            party_account = ref_doc.credit_to
        else:
            party_account = get_party_account("Customer",
                                              ref_doc.get("customer"),
                                              ref_doc.company)

        party_account_currency = ref_doc.get(
            "party_account_currency") or get_account_currency(party_account)

        #get payment amount from the payment request document
        bank_amount = self.grand_total

        #If the currency of the customer matches with the currency of the quotation but not of the payment request
        if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency:
            party_amount = ref_doc.base_grand_total
        else:
            party_amount = self.grand_total

        #create a sales order if the payment request has been made against a quotation from a shopping cart
        if self.reference_doctype == "Quotation" and (
                hasattr(ref_doc, "order_type")
                and getattr(ref_doc, "order_type") == "Shopping Cart"):

            #we save with ignore_permissions and submit the quotation
            ref_doc.save(ignore_permissions=True)
            ref_doc.submit()
            frappe.db.commit()

            #convert the quotation to a sales order
            from erpnext.selling.doctype.quotation.quotation import _make_sales_order
            sales_order = frappe.get_doc(
                _make_sales_order(self.reference_name,
                                  ignore_permissions=True))
            sales_order.payment_schedule = []
            sales_order.flags.ignore_permissions = True
            sales_order.insert()
            sales_order.submit()

            #emptying out the cart
            if hasattr(frappe.local, "cookie_manager"):
                frappe.local.cookie_manager.delete_cookie("cart_count")

            #make a payment entry against the newly created sales order
            payment_entry = get_payment_entry(
                "Sales Order",
                sales_order.name,
                party_amount=party_amount,
                bank_account=self.payment_account,
                bank_amount=bank_amount)

        else:
            #reference document is the sales order in the payment request that was passed
            payment_entry = get_payment_entry(
                self.reference_doctype,
                self.reference_name,
                party_amount=party_amount,
                bank_account=self.payment_account,
                bank_amount=bank_amount)

        #updating details about the payment request in the payment entry
        payment_entry.update({
            "reference_no":
            self.name,
            "reference_date":
            nowdate(),
            "remarks":
            "Payment Entry against {0} {1} via Payment Request {2}".format(
                self.reference_doctype, self.reference_name, self.name)
        })

        if payment_entry.difference_amount:
            company_details = get_company_defaults(ref_doc.company)

            payment_entry.append(
                "deductions", {
                    "account": company_details.exchange_gain_loss_account,
                    "cost_center": company_details.cost_center,
                    "amount": payment_entry.difference_amount
                })

        #submit the payment entry and return the document
        if submit:
            payment_entry.insert(ignore_permissions=True)
            payment_entry.submit()

        #creating a sales invoice once the payment entry is submitted
        if submit and self.reference_doctype == "Quotation":
            from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice
            si = make_sales_invoice(sales_order.name, ignore_permissions=True)
            si.allocate_advances_automatically = True
            si = si.insert(ignore_permissions=True)
            si.submit()

        return payment_entry