fix: create payment request via pos
diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
index f3df1f0..2743191 100644
--- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
+++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
@@ -1,4 +1,5 @@
 {
+ "actions": [],
  "allow_import": 1,
  "allow_rename": 1,
  "autoname": "field:mode_of_payment",
@@ -28,7 +29,7 @@
    "fieldtype": "Select",
    "in_standard_filter": 1,
    "label": "Type",
-   "options": "Cash\nBank\nGeneral"
+   "options": "Cash\nBank\nGeneral\nPhone"
   },
   {
    "fieldname": "accounts",
@@ -45,8 +46,10 @@
  ],
  "icon": "fa fa-credit-card",
  "idx": 1,
- "modified": "2019-08-14 14:58:42.079115",
- "modified_by": "sammish.thundiyil@gmail.com",
+ "index_web_pages_for_search": 1,
+ "links": [],
+ "modified": "2020-09-18 17:57:23.835236",
+ "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Mode of Payment",
  "owner": "harshada@webnotestech.com",
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json
index 8eadfd0..2ee356a 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.json
+++ b/erpnext/accounts/doctype/payment_request/payment_request.json
@@ -48,6 +48,7 @@
   "section_break_7",
   "payment_gateway",
   "payment_account",
+  "payment_channel",
   "payment_order",
   "amended_from"
  ],
@@ -230,6 +231,7 @@
    "label": "Recipient Message And Payment Details"
   },
   {
+   "depends_on": "eval: doc.payment_channel != \"Phone\"",
    "fieldname": "print_format",
    "fieldtype": "Select",
    "label": "Print Format"
@@ -241,6 +243,7 @@
    "label": "To"
   },
   {
+   "depends_on": "eval: doc.payment_channel != \"Phone\"",
    "fieldname": "subject",
    "fieldtype": "Data",
    "in_global_search": 1,
@@ -277,16 +280,18 @@
    "read_only": 1
   },
   {
-   "depends_on": "eval: doc.payment_request_type == 'Inward'",
+   "depends_on": "eval: doc.payment_request_type == 'Inward' || doc.payment_channel != \"Phone\"",
    "fieldname": "section_break_10",
    "fieldtype": "Section Break"
   },
   {
+   "depends_on": "eval: doc.payment_channel != \"Phone\"",
    "fieldname": "message",
    "fieldtype": "Text",
    "label": "Message"
   },
   {
+   "depends_on": "eval: doc.payment_channel != \"Phone\"",
    "fieldname": "message_examples",
    "fieldtype": "HTML",
    "label": "Message Examples",
@@ -347,12 +352,21 @@
    "options": "Payment Request",
    "print_hide": 1,
    "read_only": 1
+  },
+  {
+   "fetch_from": "payment_gateway_account.payment_channel",
+   "fieldname": "payment_channel",
+   "fieldtype": "Select",
+   "label": "Payment Channel",
+   "options": "\nEmail\nPhone",
+   "read_only": 1
   }
  ],
  "in_create": 1,
+ "index_web_pages_for_search": 1,
  "is_submittable": 1,
  "links": [],
- "modified": "2020-07-17 14:06:42.185763",
+ "modified": "2020-09-18 12:24:14.178853",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Payment Request",
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py
index e93ec95..dcf302d 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/payment_request.py
@@ -36,7 +36,7 @@
 			ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
 			if (hasattr(ref_doc, "order_type") \
 					and getattr(ref_doc, "order_type") != "Shopping Cart"):
-				ref_amount = get_amount(ref_doc)
+				ref_amount = get_amount(ref_doc, self.payment_account)
 
 				if existing_payment_request_amount + flt(self.grand_total)> ref_amount:
 					frappe.throw(_("Total Payment Request amount cannot be greater than {0} amount")
@@ -76,11 +76,16 @@
 			or self.flags.mute_email:
 			send_mail = False
 
-		if send_mail:
+		if send_mail and self.payment_channel != "Phone":
 			self.set_payment_request_url()
 			self.send_email()
 			self.make_communication_entry()
 
+		elif self.payment_channel == "Phone":
+			controller = get_payment_gateway_controller(self.payment_gateway)
+			print(vars(self))
+			controller.request_for_payment(**vars(self))
+
 	def on_cancel(self):
 		self.check_if_payment_entry_exists()
 		self.set_as_cancelled()
@@ -105,13 +110,14 @@
 			return False
 
 	def set_payment_request_url(self):
-		if self.payment_account:
+		if self.payment_account and self.payment_channel != "Phone":
 			self.payment_url = self.get_payment_url()
 
 		if self.payment_url:
 			self.db_set('payment_url', self.payment_url)
 
-		if self.payment_url or not self.payment_gateway_account:
+		if self.payment_url or not self.payment_gateway_account \
+			or (self.payment_gateway_account and self.payment_channel == "Phone"):
 			self.db_set('status', 'Initiated')
 
 	def get_payment_url(self):
@@ -280,7 +286,9 @@
 	args = frappe._dict(args)
 
 	ref_doc = frappe.get_doc(args.dt, args.dn)
-	grand_total = get_amount(ref_doc)
+	gateway_account = get_gateway_details(args) or frappe._dict()
+
+	grand_total = get_amount(ref_doc, gateway_account.get("payment_account"))
 	if args.loyalty_points and args.dt == "Sales Order":
 		from erpnext.accounts.doctype.loyalty_program.loyalty_program import validate_loyalty_points
 		loyalty_amount = validate_loyalty_points(ref_doc, int(args.loyalty_points))
@@ -288,8 +296,6 @@
 		frappe.db.set_value("Sales Order", args.dn, "loyalty_amount", loyalty_amount, update_modified=False)
 		grand_total = grand_total - loyalty_amount
 
-	gateway_account = get_gateway_details(args) or frappe._dict()
-
 	bank_account = (get_party_bank_account(args.get('party_type'), args.get('party'))
 		if args.get('party_type') else '')
 
@@ -314,6 +320,7 @@
 			"payment_gateway_account": gateway_account.get("name"),
 			"payment_gateway": gateway_account.get("payment_gateway"),
 			"payment_account": gateway_account.get("payment_account"),
+			"payment_channel": gateway_account.get("payment_channel"),
 			"payment_request_type": args.get("payment_request_type"),
 			"currency": ref_doc.currency,
 			"grand_total": grand_total,
@@ -344,9 +351,10 @@
 
 	return pr.as_dict()
 
-def get_amount(ref_doc):
+def get_amount(ref_doc, payment_account=None):
 	"""get amount based on doctype"""
 	dt = ref_doc.doctype
+	print(dt)
 	if dt in ["Sales Order", "Purchase Order"]:
 		grand_total = flt(ref_doc.grand_total) - flt(ref_doc.advance_paid)
 
@@ -356,6 +364,12 @@
 		else:
 			grand_total = flt(ref_doc.outstanding_amount) / ref_doc.conversion_rate
 
+	elif dt == "POS Invoice":
+		for pay in ref_doc.payments:
+			if pay.type == "Phone" and pay.account == payment_account:
+				grand_total = pay.amount
+				break
+
 	elif dt == "Fees":
 		grand_total = ref_doc.outstanding_amount
 
diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
index ba68df7..155b95e 100644
--- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
+++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
@@ -15,6 +15,7 @@
 
 from erpnext.accounts.doctype.sales_invoice.sales_invoice import SalesInvoice, get_bank_cash_account, update_multi_mode_option
 from erpnext.stock.doctype.serial_no.serial_no import get_pos_reserved_serial_nos
+from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
 
 from six import iteritems
 
@@ -313,6 +314,26 @@
 			if not pay.account:
 				pay.account = get_bank_cash_account(pay.mode_of_payment, self.company).get("account")
 
+	def create_payment_request(self):
+		for pay in self.payments:
+
+			if pay.type == "Phone":
+				payment_gateway = frappe.db.get_value("Payment Gateway Account", {
+					"payment_account": pay.account,
+				})
+				record = {
+					"payment_gateway": payment_gateway,
+					"dt": "POS Invoice",
+					"dn": self.name,
+					"payment_request_type": "Inward",
+					"party_type": "Customer",
+					"party": self.customer,
+					"recipient_id": self.contact_mobile,
+					"submit_doc": True
+				}
+
+				return make_payment_request(**record)
+
 @frappe.whitelist()
 def get_stock_availability(item_code, warehouse):
 	latest_sle = frappe.db.sql("""select qty_after_transaction
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py
index f3410e1..0d3912e 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py
@@ -25,14 +25,18 @@
 			"label": "Mobile No",
 			"fieldtype": "Data",
 			"options": "Phone",
-			"parent": "POS Settings"
+			"parenttype": "POS Settings",
+			"parent": "POS Settings",
+			"parentfield": "invoice_fields"
 		},
 		{
 			"doctype": "POS Field",
 			"fieldname": "request_for_payment",
 			"label": "Request for Payment",
 			"fieldtype": "Button",
-			"parent": "POS Settings"
+			"parenttype": "POS Settings",
+			"parent": "POS Settings",
+			"parentfield": "invoice_fields"
 		}
 	]
 	create_pos_settings(record_dict)