diff --git a/payment_redsys_preauth/README.rst b/payment_redsys_preauth/README.rst
new file mode 100644
index 0000000..8adcc75
--- /dev/null
+++ b/payment_redsys_preauth/README.rst
@@ -0,0 +1,133 @@
+===========================================
+Pasarela de pago Redsys con preautorización
+===========================================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:1eb9535d052a619aa545a383869076ca1dc1fade22746cb3fe13afa726c3e3a3
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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-Criptomart%2Ffoodcoopbcn-lightgray.png?logo=github
+ :target: https://github.com/Criptomart/foodcoopbcn/tree/12.0/payment_redsys_preauth
+ :alt: Criptomart/foodcoopbcn
+
+|badge1| |badge2| |badge3|
+
+Este módulo añade la opción de pago a través de la pasarela de Redsys con preautorización con tarjeta bancaria.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Configuration
+=============
+
+Parámetros
+~~~~~~~~~~
+
+* **Nombre del comercio**: Indicaremos el nombre del comercio.
+
+* **Número de comercio (FUC)**: Indicaremos el número de comercio que
+ nuestra entidad nos ha comunicado.
+
+* **Clave secreta de encriptación**: Indicaremos la clave de encriptación
+ que tiene el comercio.
+
+* **Número de terminal**: Indicaremos el terminal del TPV.
+
+* **Tipo de firma**: Seleccionaremos el tipo de firma del comercio.
+
+* **Tipo de moneda**: Seleccionaremos la moneda de nuestro terminal TPV
+ (Normalmente EUR - Euros).
+
+* **Tipo de transacción**: Indicaremos el tipo de transacción, 1.
+
+* **Idioma TPV**: Indicaremos el idioma en el TPV.
+
+* **Método de pago**: Indicaremos que tipo de pago se debe aceptar, pago con
+ tarjeta, Bizum u otro de los disponibles.
+
+* **URL_OK/URL_KO**: Durante el proceso del pago, y una vez que
+ se muestra al cliente la pantalla con el resultado del mismo, es
+ posible redirigir su navegador a una URL para las transacciones
+ autorizadas y a otra si la transacción ha sido denegada. A éstas
+ se las denomina URL_OK y URL_KO, respectivamente. Se trata
+ de dos URLs que pueden ser proporcionadas por el comercio.
+
+* **Porcentaje de pago**: Indicar el porcentaje de pago que se permite, si
+ se deja a 0.0 se entiende 100%.
+
+Nota
+~~~~
+
+Se tiene que verificar la configuración del comercio en el
+módulo de administración de Redsys, donde la opción “Parámetros en las
+URLs” debe tener el valor “SI”.
+
+En caso de que exista más de una base de datos en la instalación, cuando la
+pasarela de pago envía el formulario a "/payment/redsys/return" odoo no sabe
+con que base de datos procesar esta información, por lo que hay que establecer
+los parametros **dbfilter** y **dbname** en el archivo de configuración.
+
+Para mostrar simultáneamente en el comercio electrónico varios de los métodos
+de pago que proporciona Redsys, como pago con tarjeta y Bizum por ejemplo,
+debemos duplicar el medio de pago y escoger en el campo método de pago el que
+corresponda en cada caso.
+
+En los pagos con preautorización, el titular del TPV deberá solicitar al banco su activación.
+
+
+Known issues / Roadmap
+======================
+
+De acuerdo a los requisitos de Redsys, el tamaño máximo del número de pedido
+resultante (``Ds_Order``) es de 12 caracteres. Este addon trunca dicho
+dato en el comienzo de la transacción, con el resultado de que, aunque Redsys
+la aceptará, no se finalizará el pedido pedido en Odoo al retornar y entregará
+un Error 500 a Redsys.
+Para evitar esto, es recomendable seleccionar secuencias de pedido que se
+ajusten a esta limitación, en particular de 10 o menos caracteres, al ser la
+referencia un número extendido a partir del pedido, que incluye un guion y un
+número secuencial para posibles repeticiones de pago.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub 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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Criptomart
+
+Contributors
+~~~~~~~~~~~~
+
+* `Criptomart `_:
+
+ * Santi Noreña
+
+Maintainers
+~~~~~~~~~~~
+
+This module is part of the `Criptomart/foodcoopbcn `_ project on GitHub.
+
+You are welcome to contribute.
diff --git a/payment_redsys_preauth/__init__.py b/payment_redsys_preauth/__init__.py
new file mode 100644
index 0000000..822e370
--- /dev/null
+++ b/payment_redsys_preauth/__init__.py
@@ -0,0 +1,4 @@
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+
+from . import models
+from . import controllers
diff --git a/payment_redsys_preauth/__manifest__.py b/payment_redsys_preauth/__manifest__.py
new file mode 100644
index 0000000..6b75ed6
--- /dev/null
+++ b/payment_redsys_preauth/__manifest__.py
@@ -0,0 +1,15 @@
+# Copyright 2024 - 2025 Criptomart
+{
+ "name": "Pasarela de pago Redsys con preautorización",
+ "category": "Payment Acquirer",
+ "summary": "Payment Acquirer: Redsys Implementation with Preauthorization",
+ "version": "16.0.0.0.1",
+ "author": "Criptomart",
+ "website": "https://git.criptomart.net/foodcoopbcn",
+ "depends": ["payment_redsys","sale_order_invoice_amount"],
+ "data": [
+ "data/payment_redsys.xml"
+ ],
+ "license": "AGPL-3",
+ "installable": True,
+}
diff --git a/payment_redsys_preauth/controllers/__init__.py b/payment_redsys_preauth/controllers/__init__.py
new file mode 100644
index 0000000..8b6d05e
--- /dev/null
+++ b/payment_redsys_preauth/controllers/__init__.py
@@ -0,0 +1,2 @@
+
+from . import main
diff --git a/payment_redsys_preauth/controllers/main.py b/payment_redsys_preauth/controllers/main.py
new file mode 100644
index 0000000..63b03ee
--- /dev/null
+++ b/payment_redsys_preauth/controllers/main.py
@@ -0,0 +1,29 @@
+# © 2024 - 2025 criptomart.net
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import logging
+import pprint
+
+from odoo import http
+from odoo.http import request
+from odoo.addons.payment_redsys.controllers.main import RedsysController
+
+_logger = logging.getLogger(__name__)
+
+
+
+class RedsysController(RedsysController):
+ _return_url = '/payment/redsys/return'
+ _cancel_url = '/payment/redsys/cancel'
+ _exception_url = '/payment/redsys/error'
+ _reject_url = '/payment/redsys/reject'
+
+
+ @http.route(['/payment/redsys/result/'], type='http', auth='public',methods=['GET'], website=True)
+ def redsys_result(self, page, **post):
+ _logger.info('________ Redsys return sync: %s -- %s',
+ pprint.pformat(post), page)
+ # double check
+ if post:
+ request.env['payment.transaction'].sudo()._handle_notification_data('redsys', post)
+ return request.redirect('/payment/status')
diff --git a/payment_redsys_preauth/data/payment_redsys.xml b/payment_redsys_preauth/data/payment_redsys.xml
new file mode 100644
index 0000000..e6b8db2
--- /dev/null
+++ b/payment_redsys_preauth/data/payment_redsys.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Redsys Preautorización
+
+ redsys
+
+ Bussines name
+ 8888888
+ Bussines description
+ xxxxxxxxxxxx -- SHA256
+ 001
+ 1
+
+ You will be redirected to the Redsys payment gateway after clicking on the payment button.
]]>
+
+
+
+ Bizum
+
+
+
+
diff --git a/payment_redsys_preauth/models/__init__.py b/payment_redsys_preauth/models/__init__.py
new file mode 100644
index 0000000..9afbccd
--- /dev/null
+++ b/payment_redsys_preauth/models/__init__.py
@@ -0,0 +1,2 @@
+from . import payment_provider
+from . import payment_transaction
diff --git a/payment_redsys_preauth/models/payment_provider.py b/payment_redsys_preauth/models/payment_provider.py
new file mode 100644
index 0000000..17ddf9f
--- /dev/null
+++ b/payment_redsys_preauth/models/payment_provider.py
@@ -0,0 +1,135 @@
+# © 2024 - 2025 criptomart
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import logging
+import json
+import pprint
+import requests
+import urllib
+
+from odoo import models, api, exceptions, fields
+from odoo.addons.payment.models.payment_provider import ValidationError
+from odoo.tools.float_utils import float_compare
+from odoo.tools.translate import _
+import odoo.exceptions
+
+_logger = logging.getLogger(__name__)
+
+
+class PaymentProvider(models.Model):
+ _inherit = 'payment.provider'
+
+ @api.depends('code')
+ def _compute_feature_support_fields(self):
+ super()._compute_feature_support_fields()
+ self.update({
+ 'support_manual_capture': 'partial',
+ })
+
+ def get_redsys_rest_urls(self, environment):
+ """ Redsys Rest URLs
+ """
+ if environment == 'prod':
+ return {
+ 'redsys_rest_url':
+ 'https://sis.redsys.es/sis/rest/trataPeticionREST',
+ }
+ else:
+ # redsys no acepta preautorizaciones en test, pero puede que cambie...
+ return {
+ 'redsys_rest_url':
+ 'https://sis-t.redsys.es:25443/sis/rest/trataPeticionREST',
+ }
+
+ def _prepare_merchant_parameters(self, tx_values):
+ base_url = self._get_website_url()
+ callback_url = "http://botiga.foodcoopbcn.cat"
+ values = {
+ "Ds_Sermepa_Url": self._redsys_get_api_url(),
+ "Ds_Merchant_Amount": str(int(round(tx_values["amount"] * 100))),
+ "Ds_Merchant_Currency": self.redsys_currency or "978",
+ "Ds_Merchant_Order": (
+ tx_values["reference"] and tx_values["reference"][-12:] or False
+ ),
+ "Ds_Merchant_MerchantCode": (
+ self.redsys_merchant_code and self.redsys_merchant_code[:9]
+ ),
+ "Ds_Merchant_Terminal": self.redsys_terminal or "1",
+ "Ds_Merchant_TransactionType": (self.redsys_transaction_type or "1"),
+ "Ds_Merchant_Titular": tx_values.get(
+ "billing_partner", self.env.user.partner_id
+ ).display_name[:60],
+ "Ds_Merchant_MerchantName": (
+ self.redsys_merchant_name and self.redsys_merchant_name[:25]
+ ),
+ "Ds_Merchant_MerchantUrl": (
+ "%s/payment/redsys/return" % (callback_url or base_url)
+ )[:250],
+ "Ds_Merchant_MerchantData": self.redsys_merchant_data or "",
+ "Ds_Merchant_ProductDescription": (
+ self.redsys_merchant_description
+ and self.redsys_merchant_description[:125]
+ ),
+ "Ds_Merchant_ConsumerLanguage": (self.redsys_merchant_lang or "001"),
+ "Ds_Merchant_UrlOk": "%s/payment/redsys/result/redsys_result_ok" % base_url,
+ "Ds_Merchant_UrlKo": "%s/payment/redsys/result/redsys_result_ko" % base_url,
+ "Ds_Merchant_Paymethods": self.redsys_pay_method or "T",
+ }
+ return self._url_encode64(json.dumps(values)).decode("utf-8")
+
+ def _prepare_s2s_merchant_parameters(self, tx_values):
+ values = {
+ 'Ds_Merchant_Amount': str(int(round(tx_values['amount'] * 100))),
+ 'Ds_Merchant_Currency': self.redsys_currency or '978',
+ 'Ds_Merchant_Order': (
+ tx_values['reference'] and tx_values['reference'][-12:] or
+ False),
+ 'Ds_Merchant_MerchantCode': (
+ self.redsys_merchant_code and
+ self.redsys_merchant_code[:9]),
+ 'Ds_Merchant_Terminal': self.redsys_terminal or '1',
+ }
+ if 'transaction_type' in tx_values:
+ values.update({'Ds_Merchant_TransactionType': tx_values['transaction_type']})
+ else:
+ values.update({'Ds_Merchant_TransactionType':
+ (self.redsys_transaction_type or '2')}),
+ return self._url_encode64(json.dumps(values))
+
+ def redsys_s2s_create_transaction(self, values):
+ self.ensure_one()
+ redsys_values = dict()
+ merchant_parameters = self._prepare_s2s_merchant_parameters(values)
+ redsys_values.update({
+ 'Ds_SignatureVersion': str(self.redsys_signature_version),
+ 'Ds_MerchantParameters': merchant_parameters,
+ 'Ds_Signature': self.sign_parameters(
+ self.redsys_secret_key, merchant_parameters),
+ })
+ return redsys_values
+
+ def redsys_send_s2s_msg(self, values):
+ toSend = self.redsys_s2s_create_transaction(values)
+ url = self.get_redsys_rest_urls('prod')['redsys_rest_url']
+ _logger.info('Redsys: sending rest values:\n%s', pprint.pformat(toSend))
+ try:
+ if toSend and url:
+ response = requests.post(url, data=toSend)
+ else:
+ raise exceptions.ValidationError('Error en los parámetros de la petición rest')
+ except requests.exceptions.RequestException as e:
+ _logger.error('Redsys: Error sending rest transaction %s:\n%s', values['reference'], str(e))
+ return False
+ if response and response.status_code != 200:
+ _logger.error('Redsys: Error sending rest transaction %s: %s', values['reference'], response.status_code)
+ return False
+ _logger.info('Redsys: rest response:\n%s', pprint.pformat(response.text))
+ try:
+ errorCheck = response.json()
+ if errorCheck.get('errorCode', ''):
+ _logger.error('Redsys: Error recibido tx %s: %s', values['reference'], errorCheck.get('errorCode'))
+ except json.JSONDecodeError:
+ _logger.error('Error al decodificar la respuesta JSON para la transacción %s', values['reference'])
+ return False
+ return errorCheck
+
diff --git a/payment_redsys_preauth/models/payment_transaction.py b/payment_redsys_preauth/models/payment_transaction.py
new file mode 100644
index 0000000..d99c675
--- /dev/null
+++ b/payment_redsys_preauth/models/payment_transaction.py
@@ -0,0 +1,150 @@
+# © 2024 - 2025 criptomart
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import logging
+import json
+import pprint
+import requests
+
+from odoo import models, api, exceptions, fields
+from odoo.addons.payment.models.payment_provider import ValidationError
+from odoo.tools.float_utils import float_compare
+from odoo.tools.translate import _
+
+
+_logger = logging.getLogger(__name__)
+
+
+class TxRedsysPreAuth(models.Model):
+ _inherit = 'payment.transaction'
+
+ def _get_specific_rendering_values(self, processing_values):
+ if self.provider_code != "redsys":
+ return super()._get_specific_rendering_values(processing_values)
+ redsys_values = dict(processing_values)
+ merchant_parameters = self.provider_id._prepare_merchant_parameters(
+ processing_values
+ )
+ redsys_values.update(
+ {
+ "api_url": self.provider_id._redsys_get_api_url(),
+ "Ds_SignatureVersion": str(self.provider_id.redsys_signature_version),
+ "Ds_MerchantParameters": merchant_parameters,
+ "Ds_Signature": self.provider_id.sign_parameters(
+ self.provider_id.redsys_secret_key, merchant_parameters
+ ),
+ }
+ )
+ return redsys_values
+
+ # chequea que el usuario cancele el pago 9915. cambia el stado de done a authorized
+ @api.model
+ def _get_redsys_state(self, status_code):
+ if 0 <= status_code <= 100:
+ return "authorized"
+ elif status_code <= 203:
+ return "pending"
+ elif status_code == 400:
+ return "cancel"
+ elif status_code == 900:
+ return "done"
+ elif 912 <= status_code <= 9915:
+ return "cancel"
+ else:
+ return "error"
+
+ def _process_notification_data(self, data):
+ if self.provider_code != "redsys":
+ return super()._process_notification_data(data)
+ params = self.merchant_params_json2dict(data)
+ status_code = int(params.get('Ds_Response', '29999'))
+ state = self._get_redsys_state(status_code)
+ vals = {
+ 'state': state,
+ 'redsys_txnid': params.get('Ds_AuthorisationCode'),
+ }
+ state_message = ""
+ feedback_error = False
+ if state == 'done':
+ vals['state_message'] = _('Ok: %s') % params.get('Ds_Response')
+ self._set_done()
+ self._finalize_post_processing()
+ if state == 'authorized':
+ vals['state_message'] = _('Auth Ok: %s') % params.get('Ds_Response')
+ self._set_authorized()
+ self._finalize_post_processing()
+ elif state == 'pending': # 'Payment error: code: %s.'
+ state_message = _("Redsys: feedback error: %s" %(status_code))
+ self._set_pending()
+ elif state == 'cancel': # 'Payment error: bank unavailable.'
+ state_message = _("Redsys: feedback error: %s" %(status_code))
+ self._set_canceled()
+ else:
+ state_message = _("Redsys: feedback error: %s" %(status_code))
+ self._set_error(state_message)
+ feedback_error = True
+ if state_message:
+ vals['state_message'] = state_message % {
+ "status_code": params.get("Ds_Response"),
+ "error_code": params.get("Ds_ErrorCode"),
+ }
+ if state == 'error':
+ _logger.warning(vals['state_message'])
+ self.write(vals)
+
+ def _send_capture_request(self, amount_to_capture=None):
+ self.ensure_one()
+ self._ensure_provider_is_not_disabled()
+ _logger.info('Redsys: Capturing transaction %s -- %s', self.reference, amount_to_capture)
+ try:
+ if amount_to_capture:
+ values = {'amount': amount_to_capture}
+ else:
+ values = {'amount': sum(order.invoiced_amount for order in self.sale_order_ids)}
+ values.update({'reference': self.reference})
+ values.update({'transaction_type': '2'})
+ response = self.provider_id.redsys_send_s2s_msg(values)
+ if not response:
+ raise exceptions.ValidationError('Error mandando mensaje rest');
+ if response.get('errorCode', ''):
+ raise exceptions.ValidationError('Ref %s: Error Code %s' %(self.reference, response.get('errorCode')))
+ params = self.merchant_params_json2dict(response)
+ _logger.info('Redsys: parameters received:\n%s', pprint.pformat(params))
+ if params['Ds_Response'] == '0900' and params['Ds_Order'] == self.reference:
+ self.provider_reference = params['Ds_AuthorisationCode']
+ self._set_done()
+ _logger.info('Confirmacion de preautorizacion realizada con exito para la transaccion %s', self.reference)
+ message = ('Preautorizacion confirmada')
+ self.sale_order_ids.message_post(body=message)
+ else:
+ raise exceptions.ValidationError('Error en confirmacion de preautorizacion tx: %s - %s', self.reference, params['Ds_Response'])
+ except Exception as e:
+ _logger.exception('Redsys: Error capturando preautorización transacción %s:\n%s', self.reference, str(e))
+ raise exceptions.UserError(_('Error capturing preauthorization for transaction %s:\n%s') % (self.reference, str(e)))
+
+ def _send_void_request(self, amount_to_void=None):
+ self.ensure_one()
+ self._ensure_provider_is_not_disabled()
+ _logger.info('Redsys: Preauthorization cancel for transaction %s', self.reference)
+ try:
+ if amount_to_void:
+ values = {'amount': amount_to_void}
+ else:
+ values = {'amount': self.amount}
+ values.update({'reference': self.reference})
+ values.update({'transaction_type': '9'})
+ response = self.provider_id.redsys_send_s2s_msg(values)
+ if not response:
+ raise exceptions.ValidationError(_('error redsys_s2s_msg'))
+ if response.get('errorCode', ''):
+ raise exceptions.ValidationError('Ref %s: Error Code %s' % (self.reference, response.get('errorCode')))
+ params = self.merchant_params_json2dict(response)
+ _logger.info('Redsys: parameters received):\n%s', pprint.pformat(params))
+ if params['Ds_Response'] == '0400' and params['Ds_Order'] == self.reference:
+ self._set_canceled()
+ _logger.info('Preautorización cancelada con éxito para la transacción %s', self.reference)
+ else:
+ raise exceptions.ValidationError('No se pudo cancelar la preautorización para la transacción %s - %s', self.reference, params['Ds_Response'])
+ except Exception as e:
+ _logger.exception('Redsys Error cancelando preautorización tx %s:\n%s', self.reference, str(e))
+ raise exceptions.UserError(_('Error cancelling preauthorization for transaction %s:\n%s') % (self.reference, str(e)))
diff --git a/payment_redsys_preauth/readme/CONFIGURE.rst b/payment_redsys_preauth/readme/CONFIGURE.rst
new file mode 100644
index 0000000..f23c184
--- /dev/null
+++ b/payment_redsys_preauth/readme/CONFIGURE.rst
@@ -0,0 +1,54 @@
+Parámetros
+~~~~~~~~~~
+
+* **Nombre del comercio**: Indicaremos el nombre del comercio.
+
+* **Número de comercio (FUC)**: Indicaremos el número de comercio que
+ nuestra entidad nos ha comunicado.
+
+* **Clave secreta de encriptación**: Indicaremos la clave de encriptación
+ que tiene el comercio.
+
+* **Número de terminal**: Indicaremos el terminal del TPV.
+
+* **Tipo de firma**: Seleccionaremos el tipo de firma del comercio.
+
+* **Tipo de moneda**: Seleccionaremos la moneda de nuestro terminal TPV
+ (Normalmente EUR - Euros).
+
+* **Tipo de transacción**: Indicaremos el tipo de transacción, 1.
+
+* **Idioma TPV**: Indicaremos el idioma en el TPV.
+
+* **Método de pago**: Indicaremos que tipo de pago se debe aceptar, pago con
+ tarjeta, Bizum u otro de los disponibles.
+
+* **URL_OK/URL_KO**: Durante el proceso del pago, y una vez que
+ se muestra al cliente la pantalla con el resultado del mismo, es
+ posible redirigir su navegador a una URL para las transacciones
+ autorizadas y a otra si la transacción ha sido denegada. A éstas
+ se las denomina URL_OK y URL_KO, respectivamente. Se trata
+ de dos URLs que pueden ser proporcionadas por el comercio.
+
+* **Porcentaje de pago**: Indicar el porcentaje de pago que se permite, si
+ se deja a 0.0 se entiende 100%.
+
+Nota
+~~~~
+
+Se tiene que verificar la configuración del comercio en el
+módulo de administración de Redsys, donde la opción “Parámetros en las
+URLs” debe tener el valor “SI”.
+
+En caso de que exista más de una base de datos en la instalación, cuando la
+pasarela de pago envía el formulario a "/payment/redsys/return" odoo no sabe
+con que base de datos procesar esta información, por lo que hay que establecer
+los parametros **dbfilter** y **dbname** en el archivo de configuración.
+
+Para mostrar simultáneamente en el comercio electrónico varios de los métodos
+de pago que proporciona Redsys, como pago con tarjeta y Bizum por ejemplo,
+debemos duplicar el medio de pago y escoger en el campo método de pago el que
+corresponda en cada caso.
+
+En los pagos con preautorización, el titular del TPV deberá solicitar al banco su activación.
+
diff --git a/payment_redsys_preauth/readme/CONTRIBUTORS.rst b/payment_redsys_preauth/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000..e466f95
--- /dev/null
+++ b/payment_redsys_preauth/readme/CONTRIBUTORS.rst
@@ -0,0 +1,3 @@
+* `Criptomart `_:
+
+ * Santi Noreña
diff --git a/payment_redsys_preauth/readme/DESCRIPTION.rst b/payment_redsys_preauth/readme/DESCRIPTION.rst
new file mode 100644
index 0000000..2604a50
--- /dev/null
+++ b/payment_redsys_preauth/readme/DESCRIPTION.rst
@@ -0,0 +1 @@
+Este módulo añade la opción de pago a través de la pasarela de Redsys con preautorización con tarjeta bancaria.
diff --git a/payment_redsys_preauth/readme/INSTALL.rst b/payment_redsys_preauth/readme/INSTALL.rst
new file mode 100644
index 0000000..e69de29
diff --git a/payment_redsys_preauth/readme/ROADMAP.rst b/payment_redsys_preauth/readme/ROADMAP.rst
new file mode 100644
index 0000000..78f45e5
--- /dev/null
+++ b/payment_redsys_preauth/readme/ROADMAP.rst
@@ -0,0 +1,9 @@
+De acuerdo a los requisitos de Redsys, el tamaño máximo del número de pedido
+resultante (``Ds_Order``) es de 12 caracteres. Este addon trunca dicho
+dato en el comienzo de la transacción, con el resultado de que, aunque Redsys
+la aceptará, no se finalizará el pedido pedido en Odoo al retornar y entregará
+un Error 500 a Redsys.
+Para evitar esto, es recomendable seleccionar secuencias de pedido que se
+ajusten a esta limitación, en particular de 10 o menos caracteres, al ser la
+referencia un número extendido a partir del pedido, que incluye un guion y un
+número secuencial para posibles repeticiones de pago.
diff --git a/payment_redsys_preauth/static/description/icon.png b/payment_redsys_preauth/static/description/icon.png
new file mode 100644
index 0000000..b25df9b
Binary files /dev/null and b/payment_redsys_preauth/static/description/icon.png differ
diff --git a/payment_redsys_preauth/static/description/index.html b/payment_redsys_preauth/static/description/index.html
new file mode 100644
index 0000000..f67caf6
--- /dev/null
+++ b/payment_redsys_preauth/static/description/index.html
@@ -0,0 +1,480 @@
+
+
+
+
+
+Pasarela de pago Redsys con preautorización
+
+
+
+
+
Pasarela de pago Redsys con preautorización
+
+
+

+
Este módulo añade la opción de pago a través de la pasarela de Redsys con preautorización con tarjeta bancaria.
+
Table of contents
+
+
+
+
+
+
+- Nombre del comercio: Indicaremos el nombre del comercio.
+- Número de comercio (FUC): Indicaremos el número de comercio que
+nuestra entidad nos ha comunicado.
+- Clave secreta de encriptación: Indicaremos la clave de encriptación
+que tiene el comercio.
+- Número de terminal: Indicaremos el terminal del TPV.
+- Tipo de firma: Seleccionaremos el tipo de firma del comercio.
+- Tipo de moneda: Seleccionaremos la moneda de nuestro terminal TPV
+(Normalmente EUR - Euros).
+- Tipo de transacción: Indicaremos el tipo de transacción, 1.
+- Idioma TPV: Indicaremos el idioma en el TPV.
+- Método de pago: Indicaremos que tipo de pago se debe aceptar, pago con
+tarjeta, Bizum u otro de los disponibles.
+- URL_OK/URL_KO: Durante el proceso del pago, y una vez que
+se muestra al cliente la pantalla con el resultado del mismo, es
+posible redirigir su navegador a una URL para las transacciones
+autorizadas y a otra si la transacción ha sido denegada. A éstas
+se las denomina URL_OK y URL_KO, respectivamente. Se trata
+de dos URLs que pueden ser proporcionadas por el comercio.
+- Porcentaje de pago: Indicar el porcentaje de pago que se permite, si
+se deja a 0.0 se entiende 100%.
+
+
+
+
+
Se tiene que verificar la configuración del comercio en el
+módulo de administración de Redsys, donde la opción “Parámetros en las
+URLs” debe tener el valor “SI”.
+
En caso de que exista más de una base de datos en la instalación, cuando la
+pasarela de pago envía el formulario a “/payment/redsys/return” odoo no sabe
+con que base de datos procesar esta información, por lo que hay que establecer
+los parametros dbfilter y dbname en el archivo de configuración.
+
Para mostrar simultáneamente en el comercio electrónico varios de los métodos
+de pago que proporciona Redsys, como pago con tarjeta y Bizum por ejemplo,
+debemos duplicar el medio de pago y escoger en el campo método de pago el que
+corresponda en cada caso.
+
En los pagos con preautorización, el titular del TPV deberá solicitar al banco su activación.
+
+
+
+
+
De acuerdo a los requisitos de Redsys, el tamaño máximo del número de pedido
+resultante (Ds_Order) es de 12 caracteres. Este addon trunca dicho
+dato en el comienzo de la transacción, con el resultado de que, aunque Redsys
+la aceptará, no se finalizará el pedido pedido en Odoo al retornar y entregará
+un Error 500 a Redsys.
+Para evitar esto, es recomendable seleccionar secuencias de pedido que se
+ajusten a esta limitación, en particular de 10 o menos caracteres, al ser la
+referencia un número extendido a partir del pedido, que incluye un guion y un
+número secuencial para posibles repeticiones de pago.
+
+
+
+
Bugs are tracked on GitHub 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.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is part of the Criptomart/foodcoopbcn project on GitHub.
+
You are welcome to contribute.
+
+
+
+
+
diff --git a/payment_redsys_preauth/static/img/bizum.png b/payment_redsys_preauth/static/img/bizum.png
new file mode 100644
index 0000000..8af46a7
Binary files /dev/null and b/payment_redsys_preauth/static/img/bizum.png differ
diff --git a/payment_redsys_preauth/static/src/img/redsys_icon.png b/payment_redsys_preauth/static/src/img/redsys_icon.png
new file mode 100644
index 0000000..e9ddbae
Binary files /dev/null and b/payment_redsys_preauth/static/src/img/redsys_icon.png differ