/
payment_transaction.py
75 lines (66 loc) · 2.55 KB
/
payment_transaction.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Copyright (C) 2019 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import requests
import xmltodict
import logging
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class PaymentTansaction(models.Model):
_inherit = "payment.transaction"
@api.multi
def _ippay_ach_s2s_do_payment(self, invoice):
sequence = self.acquirer_id.journal_id.sequence_id
check_number = sequence.next_by_id()
request = """
<ippay>
<TransactionType>CHECK</TransactionType>
<TerminalID>%s</TerminalID>
<CardName>%s</CardName>
<TotalAmount>%s</TotalAmount>
<ACH Type = 'SAVINGS' SEC = 'PPD'>
<Token>%s</Token>
<CheckNumber>%s</CheckNumber>
</ACH>
</ippay>""" % (
self.acquirer_id.ippay_ach_terminal_id,
invoice.partner_id.name,
str(self.amount).replace(".", ""),
self.payment_token_id.acquirer_ref,
check_number,
)
_logger.info("Request to get IPPay ACH Transaction ID: %s" % (request))
try:
r = requests.post(
self.acquirer_id.api_url,
data=request,
headers={"Content-Type": "text/xml"},
)
except Exception as e:
raise ValidationError(e)
_logger.info("Transaction Received: %s" % (r.content))
content = xmltodict.parse(r.content)
response = content.get("ippayResponse") or content.get("IPPayresponse")
self.date = fields.Datetime.now()
if response.get("ResponseText") == "CHECK ACCEPTED" and not response.get(
"AdditionalInfo"
):
self.acquirer_reference = response.get("TransactionID")
self.state = "done"
else:
self.state = "cancel"
invoice.message_post(
body=_("IPPay ACH eCheck Payment DECLINED: %s - %s%s")
% (
response.get("ActionCode", ""),
response.get("ErrMsg", ""),
response.get("ResponseText", ""),
)
)
@api.multi
def ippay_ach_s2s_do_transaction(self):
context = self.env.context
inv_rec = self.env["account.invoice"].browse(context.get("active_ids"))
for inv in inv_rec:
if inv.type == "out_invoice":
self._ippay_ach_s2s_do_payment(invoice=inv)