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)