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
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
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
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
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)
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
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
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
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 ""
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
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
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
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)
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