Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[17.0][ADD] payment_payphone: new payment provider #52

Open
wants to merge 1 commit into
base: 17.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions payment_payphone/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
=========================
Payphone Payment Provider
=========================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:61dadd3e2996246649ce8044e6192e97e205e0f7a474685a1e61ef2e21eeeef3
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--ecuador-lightgray.png?logo=github
:target: https://github.com/OCA/l10n-ecuador/tree/17.0/payment_payphone
:alt: OCA/l10n-ecuador
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/l10n-ecuador-17-0/l10n-ecuador-17-0-payment_payphone
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-ecuador&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

Payment Payphone provider by redirection

**Table of contents**

.. contents::
:local:

Configuration
=============

See https://docs.payphone.app/doc/redireccion/

Usage
=====

To configure this module, you need to:

- Go to Payment providers Menu
- Configure your Access Token from your Payphone account
- Enable the payment method

|image|

.. |image| image:: https://raw.githubusercontent.com/OCA/l10n-ecuador/17.0/payment_payphone/static/description/configure.png

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/l10n-ecuador/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/l10n-ecuador/issues/new?body=module:%20payment_payphone%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Carlos Lopez

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/l10n-ecuador <https://github.com/OCA/l10n-ecuador/tree/17.0/payment_payphone>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
11 changes: 11 additions & 0 deletions payment_payphone/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from . import models
from . import controllers
from odoo.addons.payment import setup_provider, reset_payment_provider


def post_init_hook(env):
setup_provider(env, "payphone")


def uninstall_hook(env):
reset_payment_provider(env, "payphone")

Check warning on line 11 in payment_payphone/__init__.py

View check run for this annotation

Codecov / codecov/patch

payment_payphone/__init__.py#L11

Added line #L11 was not covered by tests
23 changes: 23 additions & 0 deletions payment_payphone/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "Payphone Payment Provider",
"category": "Accounting/Payment Acquirers",
"summary": "Payphone Payment Provider",
"version": "17.0.1.0.0",
"author": "Odoo Community Association (OCA), Carlos Lopez",
"website": "https://github.com/OCA/l10n-ecuador",
"license": "AGPL-3",
"depends": [
"payment",
],
"external_dependencies": {
"python": [],
},
"data": [
"views/payment_provider_templates.xml",
"data/payment_provider_data.xml",
"views/payment_provider_views.xml",
],
"installable": True,
"post_init_hook": "post_init_hook",
"uninstall_hook": "uninstall_hook",
}
1 change: 1 addition & 0 deletions payment_payphone/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import main
34 changes: 34 additions & 0 deletions payment_payphone/controllers/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import logging
import pprint

from odoo import http
from odoo.http import request

_logger = logging.getLogger(__name__)


class PayphoneController(http.Controller):
_return_url = "/payment/payphone/return"

@http.route(
_return_url,
type="http",
methods=["GET"],
auth="public",
csrf=False,
save_session=False,
)
def payphone_return_from_checkout(self, **data):
"""Process the notification data
sent by Payphone after redirection from checkout.

:param dict data: The notification data.
"""
# Handle the notification data.
_logger.debug(
"Handling redirection from Payphone with data:\n%s", pprint.pformat(data)
)
request.env["payment.transaction"].sudo()._handle_notification_data(
"payphone", data
)
return request.redirect("/payment/status")
32 changes: 32 additions & 0 deletions payment_payphone/data/payment_provider_data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="payment_method_payphone" model="payment.method">
<field name="name">Payphone</field>
<field name="code">payphone</field>
<field name="sequence">10</field>
<field
name="image"
type="base64"
file="payment_payphone/static/description/icon.jpeg"
/>
<field name="support_tokenization">False</field>
<field name="support_express_checkout">False</field>
<field name="supported_country_ids" eval="[Command.set([ref('base.ec'),])]" />
<field name="supported_currency_ids" eval="[Command.set([ref('base.USD'),])]" />
</record>
<record id="payment_provider_payphone" model="payment.provider">
<field name="name">Payphone</field>
<field
name="image_128"
type="base64"
file="payment_payphone/static/description/icon.jpeg"
/>
<field name="code">payphone</field>
<field name="redirect_form_view_id" ref="redirect_form" />
<field name="module_id" ref="base.module_payment_payphone" />
<field
name="payment_method_ids"
eval="[Command.set([ref('payment_method_payphone'),])]"
/>
</record>
</odoo>
2 changes: 2 additions & 0 deletions payment_payphone/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import payment_provider
from . import payment_transaction
70 changes: 70 additions & 0 deletions payment_payphone/models/payment_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import logging
import pprint

import requests
from werkzeug import urls

from odoo import _, fields, models
from odoo.exceptions import ValidationError

_logger = logging.getLogger(__name__)

PAYPHONE_URL = "https://pay.payphonetodoesposible.com/"


class PaymentProvider(models.Model):
_inherit = "payment.provider"

code = fields.Selection(
selection_add=[("payphone", "Payphone")], ondelete={"payphone": "set default"}
)
payphone_access_token = fields.Char(
required_if_provider="payphone",
groups="base.group_system",
)

def _payphone_make_request(self, endpoint, payload):
"""Make a request to Payphone API at the specified endpoint.

Note: self.ensure_one()

:param str endpoint: The endpoint to be reached by the request.
:param dict payload: The payload of the request.
:return The JSON-formatted content of the response.
:rtype: dict
:raise ValidationError: If an HTTP error occurs.
"""
self.ensure_one()
url = urls.url_join(PAYPHONE_URL, f"api/{endpoint}")
headers = {"Authorization": f"Bearer {self.payphone_access_token}"}
response_content = {}
try:
response = requests.post(url, json=payload, headers=headers, timeout=10)
response_content = response.json()
response.raise_for_status()
except Exception:
_logger.exception(
"Invalid API request at %s with data:\n%s",
url,
pprint.pformat(payload),
)
message_list = []
if response_content.get("message"):
message_list.append(
f"Error Code: {response_content.get('errorCode')}. "
f"Descripcion: {response_content.get('message')}"
)
for messaje in response_content.get("errors", []):
msj = messaje.get("message")
msj_description = "".join(messaje.get("errorDescriptions"))
message_list.append(

Check warning on line 60 in payment_payphone/models/payment_provider.py

View check run for this annotation

Codecov / codecov/patch

payment_payphone/models/payment_provider.py#L58-L60

Added lines #L58 - L60 were not covered by tests
f"Error Code: {msj}. Descripcion: {msj_description}"
)
raise ValidationError(
_(
"Payphone: The communication with the API failed. "
"Payphone gave us the following information: '%s'",
"\n".join(message_list),
)
) from None
return response_content
Loading
Loading