[cleanup] PayPal payment UX and moved related methods to hooks of respective apps
diff --git a/erpnext/accounts/doctype/payment_gateway/fixtures/__init__.py b/erpnext/accounts/doctype/payment_gateway/fixtures/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_gateway/fixtures/__init__.py
diff --git a/erpnext/accounts/doctype/payment_gateway/fixtures/paypal.py b/erpnext/accounts/doctype/payment_gateway/fixtures/paypal.py
new file mode 100644
index 0000000..d69dc0e
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_gateway/fixtures/paypal.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+from erpnext.setup.setup_wizard.setup_wizard import create_bank_account
+
+def create_payment_gateway_and_account(doc, method):
+	"""Called via hook on saving Paypal Settings of Paypal Integration app"""
+	create_payment_gateway()
+	create_payment_gateway_account()
+
+def create_payment_gateway():
+	# NOTE: we don't translate Payment Gateway name because it is an internal doctype
+	if not frappe.db.exists("Payment Gateway", "PayPal"):
+		payment_gateway = frappe.get_doc({
+			"doctype": "Payment Gateway",
+			"gateway": "PayPal"
+		})
+		payment_gateway.insert(ignore_permissions=True)
+
+def create_payment_gateway_account():
+	company = frappe.db.get_value("Global Defaults", None, "default_company")
+	if not company:
+		return
+
+	# NOTE: we translate Payment Gateway account name because that is going to be used by the end user
+	bank_account = frappe.db.get_value("Account", {"account_name": _("PayPal"), "company": company},
+		["name", 'account_currency'], as_dict=1)
+
+	if not bank_account:
+		# check for untranslated one
+		bank_account = frappe.db.get_value("Account", {"account_name": "PayPal", "company": company},
+			["name", 'account_currency'], as_dict=1)
+
+	if not bank_account:
+		# try creating one
+		bank_account = create_bank_account({"company_name": company, "bank_account": _("PayPal")})
+
+	if not bank_account:
+		frappe.msgprint(_("Payment Gateway Account not created, please create one manually."))
+		return
+
+	# if payment gateway account exists, return
+	if frappe.db.exists("Payment Gateway Account",
+		{"payment_gateway": "PayPal", "currency": bank_account.account_currency}):
+		return
+
+	try:
+		frappe.get_doc({
+			"doctype": "Payment Gateway Account",
+			"is_default": 1,
+			"payment_gateway": "PayPal",
+			"payment_account": bank_account.name,
+			"currency": bank_account.account_currency
+		}).insert(ignore_permissions=True)
+
+	except frappe.DuplicateEntryError:
+		# already exists, due to a reinstall?
+		pass
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index e58625b..e213676 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -117,6 +117,15 @@
 	},
 	"Address": {
 		"validate": "erpnext.shopping_cart.cart.set_customer_in_address"
+	},
+
+	# From Paypal Integration app
+	"PayPal Settings": {
+		"on_update": "erpnext.accounts.doctype.payment_gateway.fixtures.paypal.create_payment_gateway_and_account"
+	},
+
+	"Paypal Express Payment": {
+		"on_update": "erpnext.shopping_cart.cart.set_redirect"
 	}
 }
 
diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py
index 27271af..f84c5d3 100644
--- a/erpnext/shopping_cart/cart.py
+++ b/erpnext/shopping_cart/cart.py
@@ -5,7 +5,7 @@
 import frappe
 from frappe import throw, _
 import frappe.defaults
-from frappe.utils import cint, flt, get_fullname, cstr
+from frappe.utils import cint, flt, get_fullname, cstr, get_url
 from erpnext.utilities.doctype.address.address import get_address_display
 from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import get_shopping_cart_settings
 from frappe.utils.nestedset import get_root_of
@@ -282,12 +282,12 @@
 
 	customer = frappe.db.get_value("Contact", {"email_id": user}, "customer")
 	cart_settings = frappe.get_doc("Shopping Cart Settings")
-	
+
 	debtors_account = ''
-	
+
 	if cart_settings.enable_checkout:
 		debtors_account = get_debtors_account(cart_settings)
-	
+
 	if customer:
 		return frappe.get_doc("Customer", customer)
 
@@ -300,7 +300,7 @@
 			"customer_group": get_shopping_cart_settings().default_customer_group,
 			"territory": get_root_of("Territory")
 		})
-		
+
 		if debtors_account:
 			customer.update({
 				"accounts": [{
@@ -308,7 +308,7 @@
 					"account": debtors_account
 				}]
 			})
-		
+
 		customer.flags.ignore_mandatory = True
 		customer.insert(ignore_permissions=True)
 
@@ -326,12 +326,12 @@
 def get_debtors_account(cart_settings):
 	payment_gateway_account_currency = \
 		frappe.get_doc("Payment Gateway Account", cart_settings.payment_gateway_account).currency
-	
+
 	account_name = _("Debtors ({0})".format(payment_gateway_account_currency))
-	
+
 	debtors_account_name = get_account_name("Receivable", "Asset", is_group=0,\
 		account_currency=payment_gateway_account_currency, company=cart_settings.company)
-	
+
 	if not debtors_account_name:
 		debtors_account = frappe.get_doc({
 			"doctype": "Account",
@@ -340,14 +340,14 @@
 			"is_group": 0,
 			"parent_account": get_account_name(root_type="Asset", is_group=1, company=cart_settings.company),
 			"account_name": account_name,
-			"currency": payment_gateway_account_currency	
+			"currency": payment_gateway_account_currency
 		}).insert(ignore_permissions=True)
-		
+
 		return debtors_account.name
-		
+
 	else:
 		return debtors_account_name
-		
+
 
 def get_address_docs(doctype=None, txt=None, filters=None, limit_start=0, limit_page_length=20, party=None):
 	if not party:
@@ -437,3 +437,38 @@
 				break
 
 	return territory
+
+def set_redirect(paypal_express_payment, method):
+	"""Set Paypal Express Payment.flags.redirect_to on status change. Called via hooks."""
+	if not paypal_express_payment.flags.status_changed_to:
+		return
+
+	reference_doctype = paypal_express_payment.reference_doctype
+	reference_docname = paypal_express_payment.reference_docname
+
+	if not (reference_doctype and reference_docname):
+		return
+
+	reference_doc = frappe.get_doc(reference_doctype,  reference_docname)
+	shopping_cart_settings = frappe.get_doc("Shopping Cart Settings")
+
+	if paypal_express_payment.flags.status_changed_to == "Completed":
+		reference_doc.run_method("set_as_paid")
+
+		# if shopping cart enabled and in session
+		if (shopping_cart_settings.enabled
+			and hasattr(frappe.local, "session")
+			and frappe.local.session.user != "Guest"):
+
+			success_url = shopping_cart_settings.payment_success_url
+			if success_url:
+				paypal_express_payment.flags.redirect_to = ({
+					"Orders": "orders",
+					"Invoices": "invoices",
+					"My Account": "me"
+				}).get(success_url, "me")
+			else:
+				paypal_express_payment.flags.redirect_to = get_url("/orders/{0}".format(reference_doc.reference_name))
+
+	elif paypal_express_payment.flags.status_changed_to == "Cancelled":
+		reference_doc.run_method("set_as_cancelled")
diff --git a/erpnext/templates/pages/order.html b/erpnext/templates/pages/order.html
index 03e625d..3252eb9 100644
--- a/erpnext/templates/pages/order.html
+++ b/erpnext/templates/pages/order.html
@@ -1,4 +1,4 @@
-t{% extends "templates/web.html" %}
+{% extends "templates/web.html" %}
 
 {% block header %}
 <h1>{{ doc.name }}</h1>