[REF] payment* : state based publishing
Replace website_published and environment by a generic state on payment.acquirer Payment acquirers aren't enabled by default. When setting their state to 'enabled' or 'test', it is verified the required fields for the provider are set.
This commit is contained in:
@@ -111,7 +111,7 @@ class WebsitePayment(http.Controller):
|
||||
@http.route(['/my/payment_method'], type='http', auth="user", website=True)
|
||||
def payment_method(self, **kwargs):
|
||||
acquirers = list(request.env['payment.acquirer'].search([
|
||||
('website_published', '=', True), ('registration_view_template_id', '!=', False),
|
||||
('state', '=', 'enabled'), ('registration_view_template_id', '!=', False),
|
||||
('payment_flow', '=', 's2s'), ('company_id', '=', request.env.company.id)
|
||||
]))
|
||||
partner = request.env.user.partner_id
|
||||
@@ -178,7 +178,7 @@ class WebsitePayment(http.Controller):
|
||||
if acquirer_id:
|
||||
acquirers = env['payment.acquirer'].browse(int(acquirer_id))
|
||||
if not acquirers:
|
||||
acquirers = env['payment.acquirer'].search([('website_published', '=', True), ('company_id', '=', user.company_id.id)])
|
||||
acquirers = env['payment.acquirer'].search([('state', '=', 'enabled'), ('company_id', '=', user.company_id.id)])
|
||||
|
||||
# Check partner
|
||||
partner_id = user.partner_id.id if not user._is_public() else False
|
||||
|
||||
@@ -59,12 +59,13 @@ class PaymentAcquirer(models.Model):
|
||||
"""
|
||||
_name = 'payment.acquirer'
|
||||
_description = 'Payment Acquirer'
|
||||
_order = 'website_published desc, sequence, name'
|
||||
_order = 'state desc, sequence, name'
|
||||
|
||||
def _get_default_view_template_id(self):
|
||||
return self.env.ref('payment.default_acquirer_button', raise_if_not_found=False)
|
||||
|
||||
name = fields.Char('Name', required=True, translate=True)
|
||||
color = fields.Integer('Color', compute='_compute_color', store=True)
|
||||
description = fields.Html('Description')
|
||||
sequence = fields.Integer('Sequence', default=10, help="Determine the display order")
|
||||
provider = fields.Selection(
|
||||
@@ -91,14 +92,14 @@ class PaymentAcquirer(models.Model):
|
||||
registration_view_template_id = fields.Many2one(
|
||||
'ir.ui.view', 'S2S Form Template', domain=[('type', '=', 'qweb')],
|
||||
help="Template for method registration")
|
||||
environment = fields.Selection([
|
||||
('test', 'Test'),
|
||||
('prod', 'Production')], string='Environment',
|
||||
default='test', required=True)
|
||||
website_published = fields.Boolean(
|
||||
'Visible in Portal / Website', copy=False,
|
||||
help="Make this payment acquirer available (Customer invoices, etc.)")
|
||||
# Formerly associated to `authorize` option from auto_confirm
|
||||
state = fields.Selection([
|
||||
('disabled', 'Disabled'),
|
||||
('enabled', 'Enabled'),
|
||||
('test', 'Test Mode')], required=True, default='disabled',
|
||||
help="""In test mode, a fake payment is processed through a test
|
||||
payment interface. This mode is advised when setting up the
|
||||
acquirer. Watch out, test and production modes require
|
||||
different credentials.""")
|
||||
capture_manually = fields.Boolean(string="Capture Amount Manually",
|
||||
help="Capture the amount from Odoo, when the delivery is completed.")
|
||||
journal_id = fields.Many2one(
|
||||
@@ -154,7 +155,7 @@ class PaymentAcquirer(models.Model):
|
||||
|
||||
# TDE FIXME: remove that brol
|
||||
module_id = fields.Many2one('ir.module.module', string='Corresponding Module')
|
||||
module_state = fields.Selection(selection=ir_module.STATES, string='Installation State', related='module_id.state', readonly=False)
|
||||
module_state = fields.Selection(selection=ir_module.STATES, string='Installation State', related='module_id.state', store=True)
|
||||
|
||||
image_128 = fields.Image("Image", max_width=128, max_height=128)
|
||||
|
||||
@@ -174,12 +175,18 @@ class PaymentAcquirer(models.Model):
|
||||
elif electronic in self.inbound_payment_method_ids:
|
||||
self.inbound_payment_method_ids = [(2, electronic.id)]
|
||||
|
||||
@api.onchange('state')
|
||||
def onchange_state(self):
|
||||
"""Disable dashboard display for test acquirer journal."""
|
||||
self.journal_id.update({'show_on_dashboard': self.state == 'enabled'})
|
||||
|
||||
def _search_is_tokenized(self, operator, value):
|
||||
tokenized = self._get_feature_support()['tokenize']
|
||||
if (operator, value) in [('=', True), ('!=', False)]:
|
||||
return [('provider', 'in', tokenized)]
|
||||
return [('provider', 'not in', tokenized)]
|
||||
|
||||
@api.depends('provider')
|
||||
def _compute_feature_support(self):
|
||||
feature_support = self._get_feature_support()
|
||||
for acquirer in self:
|
||||
@@ -187,15 +194,28 @@ class PaymentAcquirer(models.Model):
|
||||
acquirer.authorize_implemented = acquirer.provider in feature_support['authorize']
|
||||
acquirer.token_implemented = acquirer.provider in feature_support['tokenize']
|
||||
|
||||
@api.depends('state', 'module_state')
|
||||
def _compute_color(self):
|
||||
for acquirer in self:
|
||||
if acquirer.module_id and not acquirer.module_state == 'installed':
|
||||
acquirer.color = 4 # blue
|
||||
elif acquirer.state == 'disabled':
|
||||
acquirer.color = 3 # yellow
|
||||
elif acquirer.state == 'test':
|
||||
acquirer.color = 2 # orange
|
||||
elif acquirer.state == 'enabled':
|
||||
acquirer.color = 7 # green
|
||||
|
||||
def _check_required_if_provider(self):
|
||||
""" If the field has 'required_if_provider="<provider>"' attribute, then it
|
||||
required if record.provider is <provider>. """
|
||||
field_names = []
|
||||
enabled_acquirers = self.filtered(lambda acq: acq.state in ['enabled', 'test'])
|
||||
for k, f in self._fields.items():
|
||||
provider = getattr(f, 'required_if_provider', None)
|
||||
if provider and any(
|
||||
acquirer.provider == provider and not acquirer[k]
|
||||
for acquirer in self
|
||||
for acquirer in enabled_acquirers
|
||||
):
|
||||
ir_field = self.env['ir.model.fields']._get(self._name, k)
|
||||
field_names.append(ir_field.field_description)
|
||||
@@ -234,7 +254,7 @@ class PaymentAcquirer(models.Model):
|
||||
'default_debit_account_id': account.id,
|
||||
'default_credit_account_id': account.id,
|
||||
# Show the journal on dashboard if the acquirer is published on the website.
|
||||
'show_on_dashboard': self.website_published,
|
||||
'show_on_dashboard': self.state == 'enabled',
|
||||
# Don't show payment methods in the backend.
|
||||
'inbound_payment_method_ids': inbound_payment_method_ids,
|
||||
'outbound_payment_method_ids': [],
|
||||
@@ -277,16 +297,6 @@ class PaymentAcquirer(models.Model):
|
||||
self._check_required_if_provider()
|
||||
return result
|
||||
|
||||
def toggle_website_published(self):
|
||||
''' When clicking on the website publish toggle button, the website_published is reversed and
|
||||
the acquirer journal is set or not in favorite on the dashboard.
|
||||
'''
|
||||
self.ensure_one()
|
||||
self.website_published = not self.website_published
|
||||
if self.journal_id:
|
||||
self.journal_id.show_on_dashboard = self.website_published
|
||||
return True
|
||||
|
||||
def get_acquirer_extra_fees(self, amount, currency_id, country_id):
|
||||
extra_fees = {
|
||||
'currency_id': currency_id
|
||||
@@ -318,7 +328,7 @@ class PaymentAcquirer(models.Model):
|
||||
company = self.env.company
|
||||
if not partner:
|
||||
partner = self.env.user.partner_id
|
||||
active_acquirers = self.sudo().search([('website_published', '=', True), ('company_id', '=', company.id)])
|
||||
active_acquirers = self.sudo().search([('state', '=', 'enabled'), ('company_id', '=', company.id)])
|
||||
acquirers = active_acquirers.filtered(lambda acq: (acq.payment_flow == 'form' and acq.view_template_id) or
|
||||
(acq.payment_flow == 's2s' and acq.registration_view_template_id))
|
||||
return {
|
||||
@@ -481,11 +491,6 @@ class PaymentAcquirer(models.Model):
|
||||
return method(data)
|
||||
return True
|
||||
|
||||
def toggle_environment_value(self):
|
||||
prod = self.filtered(lambda acquirer: acquirer.environment == 'prod')
|
||||
prod.write({'environment': 'test'})
|
||||
(self-prod).write({'environment': 'prod'})
|
||||
|
||||
def button_immediate_install(self):
|
||||
# TDE FIXME: remove that brol
|
||||
if self.module_id and self.module_state != 'installed':
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<!-- TDE FIXME: was customize_show=True -->
|
||||
<template id="pay_meth_link" inherit_id="portal.portal_layout">
|
||||
<xpath expr="//div[hasclass('o_portal_my_details')]" position="inside">
|
||||
<t t-if="request.env['payment.acquirer'].search([('website_published', '=', True), ('registration_view_template_id', '!=', False), ('payment_flow', '=', 's2s'), ('company_id', '=', request.env.company.id)])">
|
||||
<t t-if="request.env['payment.acquirer'].search([('state', 'in', ['enabled', 'test']), ('registration_view_template_id', '!=', False), ('payment_flow', '=', 's2s'), ('company_id', '=', request.env.company.id)])">
|
||||
<div class='manage_payment_method mt16'><a href="/my/payment_method">Manage payment methods</a></div>
|
||||
</t>
|
||||
</xpath>
|
||||
|
||||
@@ -14,66 +14,29 @@
|
||||
<field name="model">payment.acquirer</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Payment Acquirer">
|
||||
<field name="environment" invisible='1'/>
|
||||
<field name="fees_implemented" invisible='1'/>
|
||||
<field name="token_implemented" invisible='1'/>
|
||||
<field name="authorize_implemented" invisible="1"/>
|
||||
<field name="website_published" invisible="1"/>
|
||||
<sheet>
|
||||
<field name="module_id" invisible="1"/>
|
||||
<field name="module_state" invisible="1"/>
|
||||
<field name="inbound_payment_method_ids" invisible="1"/>
|
||||
<div class="oe_button_box" name="button_box" attrs="{'invisible': ['&', ('module_id', '!=', False), ('module_state', '!=', 'installed')]}">
|
||||
<!-- transfer referenced here due to view inheritance issue in current master (post-saas-16) -->
|
||||
<button name="toggle_environment_value"
|
||||
attrs="{'invisible': ['|', ('environment', '=', 'test'), ('provider', '=', 'transfer')]}"
|
||||
class="oe_stat_button"
|
||||
type="object" icon="fa-play">
|
||||
<div class="o_stat_info o_field_widget">
|
||||
<span class="text-success">Production</span>
|
||||
<span class="o_stat_text">Environment</span>
|
||||
</div>
|
||||
</button>
|
||||
<!-- transfer referenced here due to view inheritance issue in current master (post-saas-16) -->
|
||||
<button name="toggle_environment_value"
|
||||
attrs="{'invisible': ['|', ('environment', '=', 'prod'), ('provider', '=', 'transfer')]}"
|
||||
class="oe_stat_button"
|
||||
type="object" icon="fa-stop">
|
||||
<div class="o_stat_info o_field_widget">
|
||||
<span class="o_warning_text">Test</span>
|
||||
<span class="o_stat_text">Environment</span>
|
||||
</div>
|
||||
</button>
|
||||
<button name="toggle_website_published"
|
||||
attrs="{'invisible': [('website_published', '=', True)]}"
|
||||
class="oe_stat_button"
|
||||
type="object" icon="fa-globe">
|
||||
<div class="o_stat_info o_field_widget">
|
||||
<span class="text-danger">Unpublished</span>
|
||||
</div>
|
||||
</button>
|
||||
<button name="toggle_website_published"
|
||||
attrs="{'invisible': [('website_published', '=', False)]}"
|
||||
class="oe_stat_button"
|
||||
type="object" icon="fa-globe">
|
||||
<div class="o_stat_info o_field_widget">
|
||||
<span class="text-success">Published</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
<field name="image_128" widget="image" class="oe_avatar"/>
|
||||
<div class="oe_title">
|
||||
<h1><field name="name" placeholder="Name"/></h1>
|
||||
<div attrs="{'invisible': ['|', ('module_state', '=', 'installed'), ('module_id', '=', False)]}">
|
||||
<button type="object" class="btn btn-primary" name="button_immediate_install" string="Install"/>
|
||||
</div>
|
||||
</div>
|
||||
<div attrs="{'invisible': ['|', ('module_state', '=', 'installed'), ('module_id', '=', False)]}">
|
||||
<button type="object" class="btn btn-primary" name="button_immediate_install" string="Install"/>
|
||||
<div class="o_payment_acquirer_desc">
|
||||
<field name="description"/>
|
||||
</div>
|
||||
</div>
|
||||
<group name="acquirer_base" col="2" attrs="{'invisible': ['&', ('module_id', '!=', False), ('module_state', '!=', 'installed')]}">
|
||||
<group name="acquirer_left">
|
||||
<group>
|
||||
<group name="payment_state">
|
||||
<field name="provider" groups="base.group_no_one" attrs="{'invisible': [('module_id', '!=', False), ('module_state', '!=', 'installed')]}"/>
|
||||
<field name="state" widget="radio"/>
|
||||
<field name="company_id" groups="base.group_multi_company" options='{"no_open":True}'/>
|
||||
</group>
|
||||
</group>
|
||||
@@ -111,7 +74,7 @@
|
||||
<field name="fees_int_var" attrs="{'invisible': [('fees_active', '=', False)]}"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Messages">
|
||||
<page string="Messages" attrs="{'invisible': [('module_id', '=', True), ('module_state', '!=', 'installed')]}">
|
||||
<group>
|
||||
<field name="pre_msg" invisible="1"/>
|
||||
<field name="post_msg"/>
|
||||
@@ -137,15 +100,14 @@
|
||||
<field name="id"/>
|
||||
<field name="name"/>
|
||||
<field name="description"/>
|
||||
<field name="environment"/>
|
||||
<field name="provider"/>
|
||||
<field name="module_id"/>
|
||||
<field name="module_state"/>
|
||||
<field name="website_published"/>
|
||||
<field name="color"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<t t-set="installed" t-value="!record.module_id.value || (record.module_id.value && record.module_state.raw_value === 'installed')"/>
|
||||
<div t-attf-class="oe_kanban_global_click #{installed and record.website_published.raw_value ? 'oe_kanban_color_5' : 'oe_kanban_color_white'}">
|
||||
<div t-attf-class="oe_kanban_global_click #{kanban_color(record.color.raw_value)}">
|
||||
<div class="o_kanban_image">
|
||||
<img type="open" t-att-src="kanban_image('payment.acquirer', 'image_128', record.id.raw_value)" alt="Acquirer"/>
|
||||
</div>
|
||||
@@ -155,11 +117,11 @@
|
||||
</div>
|
||||
<div class="o_payment_acquirer_bottom">
|
||||
<t t-if="installed">
|
||||
<field name="environment" widget="label_selection" options="{'classes': {'test': 'warning', 'production': 'success'}}"/>
|
||||
<field name="state" widget="label_selection" options="{'classes': {'enabled': 'success', 'test': 'warning', 'disabled' : 'danger'}}"/>
|
||||
</t>
|
||||
<button t-if="!installed and !selection_mode" type="object" class="btn btn-secondary float-right" name="button_immediate_install">Install</button>
|
||||
<button t-if="installed and !record.website_published.raw_value and !selection_mode" type="edit" class="btn btn-primary float-right">Activate</button>
|
||||
<button t-if="installed and record.website_published.raw_value and !selection_mode" type="edit" class="btn btn-primary float-right">Configure</button>
|
||||
<button t-if="installed and record.state.raw_value == 'disabled' and !selection_mode" type="edit" class="btn btn-primary float-right">Activate</button>
|
||||
<button t-if="installed and record.state.raw_value in ['enabled', 'test'] and !selection_mode" type="edit" class="btn btn-primary float-right">Configure</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
@@ -176,8 +138,7 @@
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="provider"/>
|
||||
<field name="website_published"/>
|
||||
<field name="environment"/>
|
||||
<field name="state"/>
|
||||
<field name="country_ids" widget="many2many_tags" optional="hide"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</tree>
|
||||
@@ -194,7 +155,7 @@
|
||||
<filter name="acquirer_installed" string="Installed" domain="[('provider', '!=', 'manual')]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<filter string="Provider" name="provider" domain="[]" context="{'group_by': 'provider'}"/>
|
||||
<filter string="Environment" name="environment" domain="[]" context="{'group_by': 'environment'}"/>
|
||||
<filter string="State" name="state" domain="[]" context="{'group_by': 'state'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
|
||||
@@ -115,15 +115,13 @@ class PaymentWizard(models.TransientModel):
|
||||
'paypal_email_account': self.paypal_email_account,
|
||||
'paypal_seller_account': self.paypal_seller_account,
|
||||
'paypal_pdt_token': self.paypal_pdt_token,
|
||||
'website_published': True,
|
||||
'environment': 'prod',
|
||||
'state': 'enabled',
|
||||
})
|
||||
if self.payment_method == 'stripe':
|
||||
new_env.ref('payment.payment_acquirer_stripe').write({
|
||||
'stripe_secret_key': self.stripe_secret_key,
|
||||
'stripe_publishable_key': self.stripe_publishable_key,
|
||||
'website_published': True,
|
||||
'environment': 'prod',
|
||||
'state': 'enabled',
|
||||
})
|
||||
if self.payment_method == 'manual':
|
||||
manual_acquirer = self._get_manual_payment_acquirer(new_env)
|
||||
@@ -134,8 +132,7 @@ class PaymentWizard(models.TransientModel):
|
||||
))
|
||||
manual_acquirer.name = self.manual_name
|
||||
manual_acquirer.post_msg = self.manual_post_msg
|
||||
manual_acquirer.website_published = True
|
||||
manual_acquirer.environment = 'prod'
|
||||
manual_acquirer.state = 'enabled'
|
||||
|
||||
journal = manual_acquirer.journal_id
|
||||
if journal:
|
||||
|
||||
@@ -8,12 +8,8 @@
|
||||
<field name="provider">adyen</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="adyen_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the Adyen website after clicking on the payment button.</p>]]></field>
|
||||
<field name="adyen_merchant_account">dummy</field>
|
||||
<field name="adyen_skin_code">dummy</field>
|
||||
<field name="adyen_skin_hmac_key">dummy</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -191,7 +191,9 @@ class AcquirerAdyen(models.Model):
|
||||
return values
|
||||
|
||||
def adyen_get_form_action_url(self):
|
||||
return self._get_adyen_urls(self.environment)['adyen_form_url']
|
||||
self.ensure_one()
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_adyen_urls(environment)['adyen_form_url']
|
||||
|
||||
|
||||
class TxAdyen(models.Model):
|
||||
|
||||
@@ -28,6 +28,13 @@ class AdyenCommon(PaymentAcquirerCommon):
|
||||
self.dsmastercard = (('521234567890 1234', '737', 'user', 'password'))
|
||||
self.dsvisa = (('4212345678901237', '737', 'user', 'password'))
|
||||
self.mistercash = (('6703444444444449', None, 'user', 'password'))
|
||||
self.adyen = self.env.ref('payment.payment_acquirer_adyen')
|
||||
self.adyen.write({
|
||||
'adyen_merchant_account': 'dummy',
|
||||
'adyen_skin_code': 'dummy',
|
||||
'adyen_skin_hmac_key': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
|
||||
@odoo.tests.tagged('post_install', '-at_install', 'external', '-standard')
|
||||
@@ -35,8 +42,8 @@ class AdyenForm(AdyenCommon):
|
||||
|
||||
def test_10_adyen_form_render(self):
|
||||
# be sure not to do stupid things
|
||||
adyen = self.env.ref('payment.payment_acquirer_adyen')
|
||||
self.assertEqual(adyen.environment, 'test', 'test without test environment')
|
||||
adyen = self.adyen
|
||||
self.assertEqual(adyen.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'adyen')]}">
|
||||
<field name="adyen_merchant_account"/>
|
||||
<field name="adyen_skin_code"/>
|
||||
<field name="adyen_skin_hmac_key"/>
|
||||
<field name="adyen_merchant_account" attrs="{'required':[('provider', '=', 'adyen'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="adyen_skin_code" attrs="{'required':[('provider', '=', 'adyen'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="adyen_skin_hmac_key" attrs="{'required':[('provider', '=', 'adyen'), ('state', '!=', 'disabled')]}"/>
|
||||
<a colspan="2" href="https://www.adyen.com/home/payment-services/online-payments" target="_blank">How to configure your Adyen account?</a>
|
||||
</group>
|
||||
</xpath>
|
||||
|
||||
@@ -40,7 +40,7 @@ class AlipayController(http.Controller):
|
||||
'partner': alipay.alipay_merchant_partner_id,
|
||||
'notify_id': post['notify_id']
|
||||
}
|
||||
response = requests.post(alipay._get_alipay_urls(alipay.environment), val)
|
||||
response = requests.post(alipay.alipay_get_form_action_url(), val)
|
||||
response.raise_for_status()
|
||||
_logger.info('Validate alipay Notification %s' % response.text)
|
||||
# After program is executed, the page must print “success” (without quote). If not, Alipay server would keep re-sending notification, until over 24 hour 22 minutes Generally, there are 8 notifications within 25 hours (Frequency: 2m,10m,15m,1h,2h,6h,15h)
|
||||
|
||||
@@ -5,14 +5,10 @@
|
||||
<field name="provider">alipay</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="alipay_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg" type="html">
|
||||
<p>
|
||||
You will be redirected to the Alipay website after clicking on the payment button.
|
||||
</p>
|
||||
</field>
|
||||
<field name="alipay_merchant_partner_id">dummy</field>
|
||||
<field name="alipay_md5_signature_key">dummy</field>
|
||||
<field name="alipay_seller_email">dummy</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
@@ -110,7 +110,9 @@ class PaymentAcquirer(models.Model):
|
||||
return values
|
||||
|
||||
def alipay_get_form_action_url(self):
|
||||
return self._get_alipay_urls(self.environment)
|
||||
self.ensure_one()
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_alipay_urls(environment)
|
||||
|
||||
|
||||
class PaymentTransaction(models.Model):
|
||||
|
||||
@@ -22,10 +22,16 @@ class AlipayTest(PaymentAcquirerCommon):
|
||||
('active', '=', True),
|
||||
('active', '=', False)], limit=1)
|
||||
self.alipay = self.env.ref('payment.payment_acquirer_alipay')
|
||||
self.alipay.write({
|
||||
'alipay_merchant_partner_id': 'dummy',
|
||||
'alipay_md5_signature_key': 'dummy',
|
||||
'alipay_seller_email': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
def test_10_alipay_form_render(self):
|
||||
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||
self.assertEqual(self.alipay.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.alipay.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering
|
||||
@@ -73,7 +79,7 @@ class AlipayTest(PaymentAcquirerCommon):
|
||||
self.assertEqual(form_input.get('value'), form_values[form_input.get('name')], 'alipay: wrong value for input %s: received %s instead of %s' % (form_input.get('name'), form_input.get('value'), form_values[form_input.get('name')]))
|
||||
|
||||
def test_11_alipay_form_with_fees(self):
|
||||
self.assertEqual(self.alipay.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.alipay.state, 'test', 'test without test environment')
|
||||
|
||||
# update acquirer: compute fees
|
||||
self.alipay.write({
|
||||
@@ -106,7 +112,7 @@ class AlipayTest(PaymentAcquirerCommon):
|
||||
self._test_20_alipay_form_management()
|
||||
|
||||
def _test_20_alipay_form_management(self):
|
||||
self.assertEqual(self.alipay.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.alipay.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by alipay after client has successfully paid
|
||||
alipay_post_data = {
|
||||
@@ -192,4 +198,4 @@ class AlipayTest(PaymentAcquirerCommon):
|
||||
'currency_id': self.currency_yuan.id,
|
||||
'reference': 'test_ref_2',
|
||||
'partner_country_id': self.country_france.id
|
||||
})
|
||||
})
|
||||
|
||||
@@ -9,12 +9,8 @@
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="authorize_form"/>
|
||||
<field name="registration_view_template_id" ref="authorize_s2s_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the Authorize website after clicking on the payment button.</p>]]></field>
|
||||
<field name='authorize_login'>dummy</field>
|
||||
<field name="authorize_transaction_key">dummy</field>
|
||||
<field name="authorize_signature_key">dummy</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -30,12 +30,12 @@ class AuthorizeAPI():
|
||||
|
||||
:param record acquirer: payment.acquirer account that will be contacted
|
||||
"""
|
||||
if acquirer.environment == 'test':
|
||||
if acquirer.state == 'test':
|
||||
self.url = 'https://apitest.authorize.net/xml/v1/request.api'
|
||||
else:
|
||||
self.url = 'https://api.authorize.net/xml/v1/request.api'
|
||||
|
||||
self.environment = acquirer.environment
|
||||
self.state = acquirer.state
|
||||
self.name = acquirer.authorize_login
|
||||
self.transaction_key = acquirer.authorize_transaction_key
|
||||
|
||||
@@ -99,7 +99,7 @@ class AuthorizeAPI():
|
||||
}
|
||||
}
|
||||
},
|
||||
'validationMode': 'liveMode' if self.environment == 'prod' else 'testMode'
|
||||
'validationMode': 'liveMode' if self.state == 'enabled' else 'testMode'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -125,7 +125,8 @@ class PaymentAcquirerAuthorize(models.Model):
|
||||
|
||||
def authorize_get_form_action_url(self):
|
||||
self.ensure_one()
|
||||
return self._get_authorize_urls(self.environment)['authorize_form_url']
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_authorize_urls(environment)['authorize_form_url']
|
||||
|
||||
@api.model
|
||||
def authorize_s2s_form_process(self, data):
|
||||
|
||||
@@ -37,7 +37,7 @@ PaymentForm.include({
|
||||
console.warn('payment_form: unset partner_id when adding new token; things could go wrong');
|
||||
}
|
||||
var AcceptJs = false;
|
||||
if (formData.acquirer_environment === 'prod') {
|
||||
if (formData.acquirer_state === 'enabled') {
|
||||
AcceptJs = 'https://js.authorize.net/v3/AcceptUI.js';
|
||||
} else {
|
||||
AcceptJs = 'https://jstest.authorize.net/v3/AcceptUI.js';
|
||||
|
||||
@@ -20,6 +20,12 @@ class AuthorizeCommon(PaymentAcquirerCommon):
|
||||
self.currency_usd = self.env['res.currency'].search([('name', '=', 'USD')], limit=1)[0]
|
||||
# get the authorize account
|
||||
self.authorize = self.env.ref('payment.payment_acquirer_authorize')
|
||||
self.authorize.write({
|
||||
'authorize_login': 'dummy',
|
||||
'authorize_transaction_key': 'dummy',
|
||||
'authorize_signature_key': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
# Be sure to be in 'capture' mode
|
||||
# self.authorize.auto_confirm = 'confirm_so'
|
||||
|
||||
@@ -28,7 +34,7 @@ class AuthorizeCommon(PaymentAcquirerCommon):
|
||||
class AuthorizeForm(AuthorizeCommon):
|
||||
|
||||
def test_10_Authorize_form_render(self):
|
||||
self.assertEqual(self.authorize.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.authorize.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering
|
||||
@@ -92,7 +98,7 @@ class AuthorizeForm(AuthorizeCommon):
|
||||
@mute_logger('odoo.addons.payment_authorize.models.payment', 'ValidationError')
|
||||
def test_20_authorize_form_management(self):
|
||||
# be sure not to do stupid thing
|
||||
self.assertEqual(self.authorize.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.authorize.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by authorize after client has successfully paid
|
||||
authorize_post_data = {
|
||||
@@ -183,7 +189,7 @@ class AuthorizeS2s(AuthorizeCommon):
|
||||
def test_30_authorize_s2s(self):
|
||||
# be sure not to do stupid thing
|
||||
authorize = self.authorize
|
||||
self.assertEqual(authorize.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(authorize.state, 'test', 'test without test environment')
|
||||
|
||||
# add credential
|
||||
# FIXME: put this test in master-nightly on odoo/odoo + create sandbox account
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<template id="authorize_s2s_form">
|
||||
<input type="hidden" name="data_set" value="/payment/authorize/s2s/create_json_3ds"/>
|
||||
<input type="hidden" name="acquirer_id" t-att-value="id"/>
|
||||
<input type="hidden" name="acquirer_environment" t-att-value="acq.environment"/>
|
||||
<input type="hidden" name="acquirer_state" t-att-value="acq.state"/>
|
||||
<input type="hidden" name="login_id" t-att-value="acq.sudo().authorize_login"/>
|
||||
<input type="hidden" name="client_key" t-att-value="acq.sudo().authorize_client_key"/>
|
||||
<input class="d-none" name="csrf_token" t-att-value="request.csrf_token()"/>
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'authorize')]}">
|
||||
<field name="authorize_login"/>
|
||||
<field name="authorize_transaction_key" password="True"/>
|
||||
<field name="authorize_signature_key" password="True"/>
|
||||
<field name="authorize_login" attrs="{'required':[ ('provider', '=', 'authorize'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="authorize_transaction_key" password="True" attrs="{'required':[ ('provider', '=', 'authorize'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="authorize_signature_key" password="True" attrs="{'required':[ ('provider', '=', 'authorize'), ('state', '!=', 'disabled')]}"/>
|
||||
<label for="authorize_client_key"/>
|
||||
<div>
|
||||
<field name="authorize_client_key" password="True"/>
|
||||
|
||||
@@ -8,11 +8,8 @@
|
||||
<field name="provider">buckaroo</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="buckaroo_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the Buckaroo website after clicking on the payment button.</p>]]></field>
|
||||
<field name="brq_websitekey">dummy</field>
|
||||
<field name="brq_secretkey">dummy</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -89,7 +89,7 @@ class AcquirerBuckaroo(models.Model):
|
||||
'Brq_amount': values['amount'],
|
||||
'Brq_currency': values['currency'] and values['currency'].name or '',
|
||||
'Brq_invoicenumber': values['reference'],
|
||||
'brq_test': False if self.environment == 'prod' else True,
|
||||
'brq_test': True if self.state == 'test' else False,
|
||||
'Brq_return': urls.url_join(base_url, BuckarooController._return_url),
|
||||
'Brq_returncancel': urls.url_join(base_url, BuckarooController._cancel_url),
|
||||
'Brq_returnerror': urls.url_join(base_url, BuckarooController._exception_url),
|
||||
@@ -101,7 +101,9 @@ class AcquirerBuckaroo(models.Model):
|
||||
return buckaroo_tx_values
|
||||
|
||||
def buckaroo_get_form_action_url(self):
|
||||
return self._get_buckaroo_urls(self.environment)['buckaroo_form_url']
|
||||
self.ensure_one()
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_buckaroo_urls(environment)['buckaroo_form_url']
|
||||
|
||||
|
||||
class TxBuckaroo(models.Model):
|
||||
|
||||
@@ -17,7 +17,11 @@ class BuckarooCommon(PaymentAcquirerCommon):
|
||||
super(BuckarooCommon, self).setUp()
|
||||
# get the buckaroo account
|
||||
self.buckaroo = self.env.ref('payment.payment_acquirer_buckaroo')
|
||||
|
||||
self.buckaroo.write({
|
||||
'brq_websitekey': 'dummy',
|
||||
'brq_secretkey': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
@odoo.tests.tagged('post_install', '-at_install', 'external', '-standard')
|
||||
class BuckarooForm(BuckarooCommon):
|
||||
@@ -25,7 +29,7 @@ class BuckarooForm(BuckarooCommon):
|
||||
def test_10_Buckaroo_form_render(self):
|
||||
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||
# be sure not to do stupid things
|
||||
self.assertEqual(self.buckaroo.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.buckaroo.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering
|
||||
@@ -101,7 +105,7 @@ class BuckarooForm(BuckarooCommon):
|
||||
@mute_logger('odoo.addons.payment_buckaroo.models.payment', 'ValidationError')
|
||||
def test_20_buckaroo_form_management(self):
|
||||
# be sure not to do stupid thing
|
||||
self.assertEqual(self.buckaroo.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.buckaroo.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by buckaroo after client has successfully paid
|
||||
buckaroo_post_data = {
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'buckaroo')]}">
|
||||
<field name="brq_websitekey"/>
|
||||
<field name="brq_secretkey"/>
|
||||
<field name="brq_websitekey" attrs="{'required':[ ('provider', '=', 'buckaroo'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="brq_secretkey" attrs="{'required':[ ('provider', '=', 'buckaroo'), ('state', '!=', 'disabled')]}"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
@@ -4,19 +4,13 @@
|
||||
|
||||
<record id="payment.payment_acquirer_ingenico" model="payment.acquirer">
|
||||
<field name="name">Ingenico</field>
|
||||
<field name="image_128" type="base64" file="payment_ogone/static/src/img/ogone_icon.png"/>
|
||||
<field name="image_128" type="base64" file="payment_ingenico/static/src/img/ingenico_icon.png"/>
|
||||
<field name="provider">ogone</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="ogone_form"/>
|
||||
<field name="registration_view_template_id" ref="ogone_s2s_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the Ingenico website after clicking on the payment button.</p>]]></field>
|
||||
<field name='ogone_pspid'>dummy</field>
|
||||
<field name='ogone_userid'>dummy</field>
|
||||
<field name='ogone_password'>dummy</field>
|
||||
<field name="ogone_shakey_in">dummy</field>
|
||||
<field name="ogone_shakey_out">dummy</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -184,7 +184,9 @@ class PaymentAcquirerOgone(models.Model):
|
||||
return ogone_tx_values
|
||||
|
||||
def ogone_get_form_action_url(self):
|
||||
return self._get_ogone_urls(self.environment)['ogone_standard_order_url']
|
||||
self.ensure_one()
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_ogone_urls(environment)['ogone_standard_order_url']
|
||||
|
||||
def ogone_s2s_form_validate(self, data):
|
||||
error = dict()
|
||||
@@ -380,7 +382,7 @@ class PaymentTxOgone(models.Model):
|
||||
|
||||
data['SHASIGN'] = self.acquirer_id._ogone_generate_shasign('in', data)
|
||||
|
||||
direct_order_url = 'https://secure.ogone.com/ncol/%s/orderdirect.asp' % (self.acquirer_id.environment)
|
||||
direct_order_url = 'https://secure.ogone.com/ncol/%s/orderdirect.asp' % ('prod' if self.acquirer_id.state == 'enabled' else 'test')
|
||||
|
||||
logged_data = data.copy()
|
||||
logged_data.pop('PSWD')
|
||||
@@ -414,7 +416,7 @@ class PaymentTxOgone(models.Model):
|
||||
}
|
||||
data['SHASIGN'] = self.acquirer_id._ogone_generate_shasign('in', data)
|
||||
|
||||
direct_order_url = 'https://secure.ogone.com/ncol/%s/maintenancedirect.asp' % (self.acquirer_id.environment)
|
||||
direct_order_url = 'https://secure.ogone.com/ncol/%s/maintenancedirect.asp' % ('prod' if self.acquirer_id.state == 'enabled' else 'test')
|
||||
|
||||
logged_data = data.copy()
|
||||
logged_data.pop('PSWD')
|
||||
@@ -506,7 +508,7 @@ class PaymentTxOgone(models.Model):
|
||||
'PSWD': account.ogone_password,
|
||||
}
|
||||
|
||||
query_direct_url = 'https://secure.ogone.com/ncol/%s/querydirect.asp' % (self.acquirer_id.environment)
|
||||
query_direct_url = 'https://secure.ogone.com/ncol/%s/querydirect.asp' % ('prod' if self.acquirer_id.state == 'enabled' else 'test')
|
||||
|
||||
logged_data = data.copy()
|
||||
logged_data.pop('PSWD')
|
||||
@@ -553,7 +555,7 @@ class PaymentToken(models.Model):
|
||||
'PROCESS_MODE': 'CHECKANDPROCESS',
|
||||
}
|
||||
|
||||
url = 'https://secure.ogone.com/ncol/%s/AFU_agree.asp' % (acquirer.environment,)
|
||||
url = 'https://secure.ogone.com/ncol/%s/AFU_agree.asp' % ('prod' if self.acquirer_id.state == 'enabled' else 'test')
|
||||
_logger.info("ogone_create: Creating new alias %s via url %s", alias, url)
|
||||
result = requests.post(url, data=data).content
|
||||
|
||||
|
||||
@@ -17,11 +17,19 @@ class OgonePayment(PaymentAcquirerCommon):
|
||||
super(OgonePayment, self).setUp()
|
||||
|
||||
self.ogone = self.env.ref('payment.payment_acquirer_ogone')
|
||||
self.ogone.write({
|
||||
'ogone_pspid': 'dummy',
|
||||
'ogone_userid': 'dummy',
|
||||
'ogone_password': 'dummy',
|
||||
'ogone_shakey_in': 'dummy',
|
||||
'ogone_shakey_out': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
def test_10_ogone_form_render(self):
|
||||
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||
# be sure not to do stupid thing
|
||||
self.assertEqual(self.ogone.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.ogone.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering + shasign
|
||||
@@ -92,13 +100,13 @@ class OgonePayment(PaymentAcquirerCommon):
|
||||
self.assertEqual(
|
||||
form_input.get('value'),
|
||||
form_values[form_input.get('name')],
|
||||
'ogone: wrong value for form input %s: received %s instead of %s' % (form_input.get('name'), form_input.get('value'), form_values[form_input.get('name')])
|
||||
'ingenico: wrong value for form input %s: received %s instead of %s' % (form_input.get('name'), form_input.get('value'), form_values[form_input.get('name')])
|
||||
)
|
||||
|
||||
@mute_logger('odoo.addons.payment_ingenico.models.payment', 'ValidationError')
|
||||
def test_20_ogone_form_management(self):
|
||||
# be sure not to do stupid thing
|
||||
self.assertEqual(self.ogone.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.ogone.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by ogone after client has successfully paid
|
||||
ogone_post_data = {
|
||||
@@ -161,7 +169,7 @@ class OgonePayment(PaymentAcquirerCommon):
|
||||
def test_30_ogone_s2s(self):
|
||||
test_ref = 'test_ref_%.15f' % time.time()
|
||||
# be sure not to do stupid thing
|
||||
self.assertEqual(self.ogone.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.ogone.state, 'test', 'test without test environment')
|
||||
|
||||
# create a new draft tx
|
||||
tx = self.env['payment.transaction'].create({
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'ogone')]}">
|
||||
<field name="ogone_pspid"/>
|
||||
<field name="ogone_userid"/>
|
||||
<field name="ogone_password"/>
|
||||
<field name="ogone_shakey_in"/>
|
||||
<field name="ogone_shakey_out"/>
|
||||
<field name="ogone_pspid" attrs="{'required':[ ('provider', '=', 'ogone'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="ogone_userid" attrs="{'required':[ ('provider', '=', 'ogone'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="ogone_password" attrs="{'required':[ ('provider', '=', 'ogone'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="ogone_shakey_in" attrs="{'required':[ ('provider', '=', 'ogone'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="ogone_shakey_out" attrs="{'required':[ ('provider', '=', 'ogone'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="ogone_alias_usage"/>
|
||||
</group>
|
||||
</xpath>
|
||||
|
||||
@@ -60,7 +60,7 @@ class PaypalController(http.Controller):
|
||||
tx = None
|
||||
if reference:
|
||||
tx = request.env['payment.transaction'].search([('reference', '=', reference)])
|
||||
paypal_urls = request.env['payment.acquirer']._get_paypal_urls(tx and tx.acquirer_id.environment or 'prod')
|
||||
paypal_urls = tx.acquirer_id.paypal_get_form_action_url()
|
||||
pdt_request = bool(post.get('amt')) # check for spefific pdt param
|
||||
if pdt_request:
|
||||
# this means we are in PDT instead of DPN like before
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
<field name="provider">paypal</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="paypal_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the Paypal website after clicking on the payment button.</p>]]></field>
|
||||
</record>
|
||||
|
||||
@@ -20,7 +20,7 @@ class AcquirerPaypal(models.Model):
|
||||
_inherit = 'payment.acquirer'
|
||||
|
||||
provider = fields.Selection(selection_add=[('paypal', 'Paypal')])
|
||||
paypal_email_account = fields.Char('Email', required_if_provider='paypal', groups='base.group_user', default=lambda self: self.env.user.email or 'dummy')
|
||||
paypal_email_account = fields.Char('Email', required_if_provider='paypal', groups='base.group_user', default=lambda self: self.env.user.email or '')
|
||||
paypal_seller_account = fields.Char(
|
||||
'Merchant Account ID', groups='base.group_user',
|
||||
help='The Merchant ID is used to ensure communications coming from Paypal are valid and secured.')
|
||||
@@ -110,7 +110,9 @@ class AcquirerPaypal(models.Model):
|
||||
return paypal_tx_values
|
||||
|
||||
def paypal_get_form_action_url(self):
|
||||
return self._get_paypal_urls(self.environment)['paypal_form_url']
|
||||
self.ensure_one()
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_paypal_urls(environment)['paypal_form_url']
|
||||
|
||||
|
||||
class TxPaypal(models.Model):
|
||||
|
||||
@@ -18,6 +18,10 @@ class PaypalCommon(PaymentAcquirerCommon):
|
||||
super(PaypalCommon, self).setUp()
|
||||
|
||||
self.paypal = self.env.ref('payment.payment_acquirer_paypal')
|
||||
self.paypal.write({
|
||||
'paypal_email_account': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
# some CC
|
||||
self.amex = (('378282246310005', '123'), ('371449635398431', '123'))
|
||||
@@ -39,7 +43,7 @@ class PaypalForm(PaypalCommon):
|
||||
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||
# be sure not to do stupid things
|
||||
self.paypal.write({'paypal_email_account': 'tde+paypal-facilitator@odoo.com', 'fees_active': False})
|
||||
self.assertEqual(self.paypal.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.paypal.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering
|
||||
@@ -88,7 +92,7 @@ class PaypalForm(PaypalCommon):
|
||||
|
||||
def test_11_paypal_form_with_fees(self):
|
||||
# be sure not to do stupid things
|
||||
self.assertEqual(self.paypal.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.paypal.state, 'test', 'test without test environment')
|
||||
|
||||
# update acquirer: compute fees
|
||||
self.paypal.write({
|
||||
@@ -120,7 +124,7 @@ class PaypalForm(PaypalCommon):
|
||||
@mute_logger('odoo.addons.payment_paypal.models.payment', 'ValidationError')
|
||||
def test_20_paypal_form_management(self):
|
||||
# be sure not to do stupid things
|
||||
self.assertEqual(self.paypal.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.paypal.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by paypal after client has successfully paid
|
||||
paypal_post_data = {
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'paypal')]}">
|
||||
<field name="paypal_email_account"/>
|
||||
<field name="paypal_seller_account"/>
|
||||
<field name="paypal_pdt_token"/>
|
||||
<field name="paypal_use_ipn"/>
|
||||
<field name="paypal_email_account" attrs="{'required':[ ('provider', '=', 'paypal'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="paypal_seller_account" attrs="{'required':[ ('provider', '=', 'paypal'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="paypal_pdt_token" attrs="{'required':[ ('provider', '=', 'paypal'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="paypal_use_ipn" attrs="{'required':[ ('provider', '=', 'paypal'), ('state', '!=', 'disabled')]}"/>
|
||||
<a colspan="2" href="https://www.odoo.com/documentation/user/online/ecommerce/shopper_experience/paypal.html" target="_blank">How to configure your paypal account?</a>
|
||||
</group>
|
||||
</xpath>
|
||||
|
||||
@@ -5,13 +5,9 @@
|
||||
<field name="provider">payulatam</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="payulatam_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg" type="html">
|
||||
<p>You will be redirected to the PayU Latam website after clicking on the payment button.</p>
|
||||
</field>
|
||||
<field name="payulatam_account_id">dummy</field>
|
||||
<field name="payulatam_merchant_id">dummy</field>
|
||||
<field name="payulatam_api_key">dummy</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -66,7 +66,8 @@ class PaymentAcquirerPayulatam(models.Model):
|
||||
|
||||
def payulatam_get_form_action_url(self):
|
||||
self.ensure_one()
|
||||
return self._get_payulatam_urls(self.environment)
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_payulatam_urls(environment)
|
||||
|
||||
|
||||
class PaymentTransactionPayulatam(models.Model):
|
||||
|
||||
@@ -12,6 +12,12 @@ class PayUlatamCommon(PaymentAcquirerCommon):
|
||||
def setUp(self):
|
||||
super(PayUlatamCommon, self).setUp()
|
||||
self.payulatam = self.env.ref('payment.payment_acquirer_payulatam')
|
||||
self.payulatam.write({
|
||||
'payulatam_account_id': 'dummy',
|
||||
'payulatam_merchant_id': 'dummy',
|
||||
'payulatam_api_key': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install', 'external', '-standard')
|
||||
@@ -19,7 +25,7 @@ class PayUlatamForm(PayUlatamCommon):
|
||||
|
||||
def test_10_payulatam_form_render(self):
|
||||
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||
self.assertEqual(self.payulatam.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.payulatam.state, 'test', 'test without test environment')
|
||||
self.payulatam.write({
|
||||
'payulatam_merchant_id': 'dummy',
|
||||
'payulatam_account_id': 'dummy',
|
||||
@@ -71,7 +77,7 @@ class PayUlatamForm(PayUlatamCommon):
|
||||
)
|
||||
|
||||
def test_20_payulatam_form_management(self):
|
||||
self.assertEqual(self.payulatam.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.payulatam.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by payulatam after client has successfully paid
|
||||
payulatam_post_data = {
|
||||
|
||||
@@ -7,12 +7,9 @@
|
||||
<field name="provider">payumoney</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="payumoney_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the PayUmoney website after clicking on the payment button.</p>]]>
|
||||
</field>
|
||||
<field name="payumoney_merchant_key">dummy</field>
|
||||
<field name="payumoney_merchant_salt">dummy</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -75,7 +75,8 @@ class PaymentAcquirerPayumoney(models.Model):
|
||||
|
||||
def payumoney_get_form_action_url(self):
|
||||
self.ensure_one()
|
||||
return self._get_payumoney_urls(self.environment)['payumoney_form_url']
|
||||
environment = 'prod' if self.state == 'enabled' else 'test'
|
||||
return self._get_payumoney_urls(environment)['payumoney_form_url']
|
||||
|
||||
|
||||
class PaymentTransactionPayumoney(models.Model):
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'payumoney')]}">
|
||||
<field name="payumoney_merchant_key"/>
|
||||
<field name="payumoney_merchant_salt" password="True"/>
|
||||
<field name="payumoney_merchant_key" attrs="{'required':[ ('provider', '=', 'payumoney'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="payumoney_merchant_salt" attrs="{'required':[ ('provider', '=', 'payumoney'), ('state', '!=', 'disabled')]}" password="True"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
@@ -8,11 +8,8 @@
|
||||
<field name="provider">sips</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="payment_sips.sips_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be redirected to the Sips website after clicking on payment button.</p>]]></field>
|
||||
<field name="sips_merchant_id">****</field>
|
||||
<field name="sips_secret">****</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -60,7 +60,7 @@ class AcquirerSips(models.Model):
|
||||
# Test key provided by Worldine
|
||||
key = u'002001000000001_KEY1'
|
||||
|
||||
if self.environment == 'prod':
|
||||
if self.state == 'enabled':
|
||||
key = getattr(self, 'sips_secret')
|
||||
|
||||
shasign = sha256((data + key).encode('utf-8'))
|
||||
@@ -74,7 +74,7 @@ class AcquirerSips(models.Model):
|
||||
if not currency_code:
|
||||
raise ValidationError(_('Currency not supported by Wordline'))
|
||||
amount = int(values['amount'] * 100)
|
||||
if self.environment == 'prod':
|
||||
if self.state == 'enabled':
|
||||
# For production environment, key version 2 is required
|
||||
merchant_id = getattr(self, 'sips_merchant_id')
|
||||
key_version = self.env['ir.config_parameter'].sudo().get_param('sips.key_version', '2')
|
||||
@@ -108,7 +108,7 @@ class AcquirerSips(models.Model):
|
||||
|
||||
def sips_get_form_action_url(self):
|
||||
self.ensure_one()
|
||||
return self.environment == 'prod' and self.sips_prod_url or self.sips_test_url
|
||||
return self.state == 'enabled' and self.sips_prod_url or self.sips_test_url
|
||||
|
||||
|
||||
class TxSips(models.Model):
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'sips')]}">
|
||||
<field name="sips_merchant_id"/>
|
||||
<field name="sips_secret"/>
|
||||
<field name="sips_test_url"/>
|
||||
<field name="sips_prod_url"/>
|
||||
<field name="sips_version"/>
|
||||
<field name="sips_merchant_id" attrs="{'required':[ ('provider', '=', 'sips'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="sips_secret" attrs="{'required':[ ('provider', '=', 'sips'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="sips_test_url" attrs="{'required':[ ('provider', '=', 'sips'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="sips_prod_url" attrs="{'required':[ ('provider', '=', 'sips'), ('state', '!=', 'disabled')]}"/>
|
||||
<field name="sips_version" attrs="{'required':[ ('provider', '=', 'sips'), ('state', '!=', 'disabled')]}"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
@@ -8,11 +8,8 @@
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="stripe_form"/>
|
||||
<field name="registration_view_template_id" ref="stripe_s2s_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>You will be prompted with Stripe Payment page for payment information.</p>]]></field>
|
||||
<field name="stripe_secret_key">dummy</field>
|
||||
<field name="stripe_publishable_key">dummy</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -10,13 +10,18 @@ class StripeCommon(PaymentAcquirerCommon):
|
||||
def setUp(self):
|
||||
super(StripeCommon, self).setUp()
|
||||
self.stripe = self.env.ref('payment.payment_acquirer_stripe')
|
||||
self.stripe.write({
|
||||
'stripe_secret_key': 'dummy',
|
||||
'stripe_publishable_key': 'dummy',
|
||||
'state': 'test',
|
||||
})
|
||||
|
||||
|
||||
@odoo.tests.tagged('post_install', '-at_install', '-standard', 'external')
|
||||
class StripeTest(StripeCommon):
|
||||
|
||||
def test_10_stripe_s2s(self):
|
||||
self.assertEqual(self.stripe.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.stripe.state, 'test', 'test without test environment')
|
||||
|
||||
# Add Stripe credentials
|
||||
self.stripe.write({
|
||||
@@ -51,7 +56,7 @@ class StripeTest(StripeCommon):
|
||||
self.assertEqual(tx.state, 'done', 'Stripe: Transcation has been discarded.')
|
||||
|
||||
def test_20_stripe_form_render(self):
|
||||
self.assertEqual(self.stripe.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.stripe.state, 'test', 'test without test environment')
|
||||
|
||||
# ----------------------------------------
|
||||
# Test: button direct rendering
|
||||
@@ -63,7 +68,7 @@ class StripeTest(StripeCommon):
|
||||
self.assertIn(self.buyer_values.get('partner_email'), res, 'Stripe: email input not found in rendered template')
|
||||
|
||||
def test_30_stripe_form_management(self):
|
||||
self.assertEqual(self.stripe.environment, 'test', 'test without test environment')
|
||||
self.assertEqual(self.stripe.state, 'test', 'test without test environment')
|
||||
|
||||
# typical data posted by Stripe after client has successfully paid
|
||||
stripe_post_data = {
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//group[@name="acquirer"]' position='inside'>
|
||||
<group attrs="{'invisible': [('provider', '!=', 'stripe')]}">
|
||||
<field name="stripe_secret_key" password="True"/>
|
||||
<field name="stripe_publishable_key" password="True"/>
|
||||
<field name="stripe_secret_key" attrs="{'required':[ ('provider', '=', 'stripe'), ('state', '!=', 'disabled')]}" password="True"/>
|
||||
<field name="stripe_publishable_key" attrs="{'required':[ ('provider', '=', 'stripe'), ('state', '!=', 'disabled')]}" password="True"/>
|
||||
</group>
|
||||
</xpath>
|
||||
<xpath expr='//group[@name="acquirer_config"]' position='after'>
|
||||
|
||||
@@ -6,10 +6,9 @@
|
||||
<field name="name">Wire Transfer</field>
|
||||
<field name="image_128" type="base64" file="payment_transfer/static/src/img/transfer_icon.png"/>
|
||||
<field name="provider">transfer</field>
|
||||
<field name="state">enabled</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="view_template_id" ref="transfer_form"/>
|
||||
<field name="environment">test</field>
|
||||
<field name="website_published" eval="True"/>
|
||||
<field name="pre_msg"><![CDATA[
|
||||
<p>Transfer information will be provided when clicking 'Pay Now'.</p>]]>
|
||||
</field>
|
||||
|
||||
@@ -175,7 +175,7 @@ class CustomerPortal(CustomerPortal):
|
||||
|
||||
if order_sudo.has_to_be_paid():
|
||||
domain = expression.AND([
|
||||
['&', ('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)],
|
||||
['&', ('state', 'in', ['enabled', 'test']), ('company_id', '=', order_sudo.company_id.id)],
|
||||
['|', ('country_ids', '=', False), ('country_ids', 'in', [order_sudo.partner_id.country_id.id])]
|
||||
])
|
||||
acquirers = request.env['payment.acquirer'].sudo().search(domain)
|
||||
|
||||
@@ -839,7 +839,7 @@ class WebsiteSale(http.Controller):
|
||||
)
|
||||
|
||||
domain = expression.AND([
|
||||
['&', ('website_published', '=', True), ('company_id', '=', order.company_id.id)],
|
||||
['&', ('state', 'in', ['enabled', 'test']), ('company_id', '=', order.company_id.id)],
|
||||
['|', ('website_id', '=', False), ('website_id', '=', request.website.id)],
|
||||
['|', ('country_ids', '=', False), ('country_ids', 'in', [order.partner_id.country_id.id])]
|
||||
])
|
||||
|
||||
Reference in New Issue
Block a user