mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[WIP] signifyd v3
This commit is contained in:
@@ -11,12 +11,11 @@ class SignifydCase(models.Model):
|
||||
_name = 'signifyd.case'
|
||||
_description = 'Stores Signifyd case information on orders.'
|
||||
|
||||
# flow_type = fields.Selection([('pre', 'PreAuth'), ('post', 'PostAuth')], default='post', required=True)
|
||||
|
||||
connector_id = fields.Many2one('signifyd.connector', string='Signifyd Connector')
|
||||
order_id = fields.Many2one('sale.order', required=True)
|
||||
partner_id = fields.Many2one('res.partner')
|
||||
case_id = fields.Char(string='Case ID')
|
||||
uuid = fields.Char(string='Unique ID')
|
||||
ref = fields.Char(string='Reference', help="Signifyd Order ID, set to the sale order's name for new cases. Previously Unique ID.")
|
||||
status = fields.Selection([
|
||||
('OPEN', 'Open'),
|
||||
('DISMISSED', 'Dismissed'),
|
||||
@@ -54,12 +53,8 @@ class SignifydCase(models.Model):
|
||||
('HOLD', 'Hold'),
|
||||
('REJECT', 'Reject'),
|
||||
], string='Checkpoint Action')
|
||||
|
||||
coverage_ids = fields.Many2many('signifyd.coverage', string='Requested Coverage Types')
|
||||
# TODO add to view
|
||||
|
||||
def _get_connector(self):
|
||||
return self.order_id.website_id.signifyd_connector_id
|
||||
coverage_ids = fields.Many2many('signifyd.coverage', string='Coverage', help='Accepted Coverage Types')
|
||||
coverage_line_ids = fields.One2many('signifyd.case.coverage', 'case_id')
|
||||
|
||||
@api.model
|
||||
def _compute_signifyd_url(self):
|
||||
@@ -87,17 +82,62 @@ class SignifydCase(models.Model):
|
||||
# r = requests.post(url=url, headers=headers, json=values)
|
||||
# return r.json()
|
||||
|
||||
def get_case(self):
|
||||
# def get_case(self):
|
||||
# self.ensure_one()
|
||||
# if not self.case_id:
|
||||
# raise UserError(_('Case not represented in Signifyd.'))
|
||||
# connector = self._get_connector()
|
||||
# headers = connector.get_headers()
|
||||
# r = requests.get(
|
||||
# connector.API_URL + '/cases/' + str(self.case_id),
|
||||
# headers=headers
|
||||
# )
|
||||
# return r.json()
|
||||
def get_decision_vals(self):
|
||||
self.ensure_one()
|
||||
if not self.case_id:
|
||||
raise UserError(_('Case not represented in Signifyd.'))
|
||||
connector = self._get_connector()
|
||||
headers = connector.get_headers()
|
||||
r = requests.get(
|
||||
connector.API_URL + '/cases/' + str(self.case_id),
|
||||
headers=headers
|
||||
)
|
||||
return r.json()
|
||||
api = self.connector_id.get_connection()
|
||||
response = api.get_decision(self.ref)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
|
||||
decision = data['decision']
|
||||
case_vals = {
|
||||
'last_update': decision.get('createdAt'),
|
||||
'checkpoint_action': decision.get('checkpointAction'),
|
||||
'score': decision.get('score'),
|
||||
'coverage_line_ids': []
|
||||
}
|
||||
|
||||
coverage = data.get('coverage')
|
||||
if coverage:
|
||||
coverage_map = {
|
||||
'inrChargebacks': self.env.ref('website_sale_signifyd.signifyd_coverage_inr').id,
|
||||
'fraudChargebacks': self.env.ref('website_sale_signifyd.signifyd_coverage_fraud').id,
|
||||
'snadChargebacks': self.env.ref('website_sale_signifyd.signifyd_coverage_snad').id,
|
||||
'allChargebacks': self.env.ref('website_sale_signifyd.signifyd_coverage_all').id
|
||||
}
|
||||
# coverage_ids = []
|
||||
# if coverage.get('inrChargebacks'):
|
||||
# coverage_ids += self.env.ref('website_sale_signifyd.signifyd_coverage_inr').ids
|
||||
# if coverage.get('fraudChargebacks'):
|
||||
# coverage_ids += self.env.ref('website_sale_signifyd.signifyd_coverage_fraud').ids
|
||||
# if coverage.get('snadChargebacks'):
|
||||
# coverage_ids += self.env.ref('website_sale_signifyd.signifyd_coverage_snad').ids
|
||||
# if coverage.get('allChargebacks'):
|
||||
# coverage_ids = self.env.ref('website_sale_signifyd.signifyd_coverage_all').ids
|
||||
# vals['coverage_ids'] = coverage_ids
|
||||
for name, vals in coverage.items():
|
||||
if not vals:
|
||||
continue
|
||||
case_vals['coverage_line_ids'] += [(0, 0, {
|
||||
# 'case_id': self.id,
|
||||
'coverage_type_id': coverage_map[name],
|
||||
'amount': vals.get('amount'),
|
||||
'currency_id': self.env['res.currency'].search(
|
||||
[('name', '=ilike', vals.get('currency'))], limit=1).id,
|
||||
})]
|
||||
|
||||
return {k: v for k, v in case_vals.items() if v}
|
||||
|
||||
def action_force_update_case(self):
|
||||
for record in self:
|
||||
@@ -108,42 +148,42 @@ class SignifydCase(models.Model):
|
||||
if not self.case_id:
|
||||
raise UserError(_('Case not represented in Signifyd.'))
|
||||
if not vals:
|
||||
case = self.get_case()
|
||||
case_id = case.get('caseId')
|
||||
if not case_id:
|
||||
raise ValueError(_('Signifyd Case has no ID?'))
|
||||
team_id = case.get('teamId', self.team_id)
|
||||
team_name = case.get('teamName', self.team_name)
|
||||
uuid = case.get('uuid', self.uuid)
|
||||
status = case.get('status', self.status)
|
||||
review_disposition = case.get('reviewDisposition', self.review_disposition)
|
||||
order_outcome = case.get('orderOutcome', self.order_outcome)
|
||||
guarantee_disposition = case.get('guaranteeDisposition', self.guarantee_disposition)
|
||||
adjusted_score = case.get('adjustedScore', self.adjusted_score)
|
||||
score = case.get('score', self.score)
|
||||
checkpoint_action = case.get('checkpointAction', self.checkpoint_action)
|
||||
if not checkpoint_action and guarantee_disposition:
|
||||
if guarantee_disposition == 'APPROVED':
|
||||
checkpoint_action = 'ACCEPT'
|
||||
elif guarantee_disposition == 'DECLINED':
|
||||
checkpoint_action = 'REJECT'
|
||||
else:
|
||||
checkpoint_action = 'HOLD'
|
||||
vals = self.get_decision_vals()
|
||||
# case_id = case.get('caseId')
|
||||
# if not case_id:
|
||||
# raise ValueError(_('Signifyd Case has no ID?'))
|
||||
# team_id = case.get('teamId', self.team_id)
|
||||
# team_name = case.get('teamName', self.team_name)
|
||||
# ref = case.get('ref', self.ref)
|
||||
# status = case.get('status', self.status)
|
||||
# review_disposition = case.get('reviewDisposition', self.review_disposition)
|
||||
# order_outcome = case.get('orderOutcome', self.order_outcome)
|
||||
# guarantee_disposition = case.get('guaranteeDisposition', self.guarantee_disposition)
|
||||
# adjusted_score = case.get('adjustedScore', self.adjusted_score)
|
||||
# score = case.get('score', self.score)
|
||||
# checkpoint_action = case.get('checkpointAction', self.checkpoint_action)
|
||||
# if not checkpoint_action and guarantee_disposition:
|
||||
# if guarantee_disposition == 'APPROVED':
|
||||
# checkpoint_action = 'ACCEPT'
|
||||
# elif guarantee_disposition == 'DECLINED':
|
||||
# checkpoint_action = 'REJECT'
|
||||
# else:
|
||||
# checkpoint_action = 'HOLD'
|
||||
|
||||
vals = {
|
||||
'case_id': case_id,
|
||||
'team_id': team_id,
|
||||
'team_name': team_name,
|
||||
'uuid': uuid,
|
||||
'status': status,
|
||||
'review_disposition': review_disposition,
|
||||
'order_outcome': order_outcome,
|
||||
'adjusted_score': adjusted_score,
|
||||
'guarantee_disposition': guarantee_disposition,
|
||||
'score': score,
|
||||
'last_update': dt.now(), # why not just use
|
||||
'checkpoint_action': checkpoint_action,
|
||||
}
|
||||
# vals = {
|
||||
# 'case_id': case_id,
|
||||
# 'team_id': team_id,
|
||||
# 'team_name': team_name,
|
||||
# 'ref': ref,
|
||||
# 'status': status,
|
||||
# 'review_disposition': review_disposition,
|
||||
# 'order_outcome': order_outcome,
|
||||
# 'adjusted_score': adjusted_score,
|
||||
# 'guarantee_disposition': guarantee_disposition,
|
||||
# 'score': score,
|
||||
# 'last_update': dt.now(), # why not just use
|
||||
# 'checkpoint_action': checkpoint_action,
|
||||
# }
|
||||
|
||||
outcome = vals.get('guarantee_disposition')
|
||||
checkpoint_action = vals.get('checkpoint_action')
|
||||
@@ -152,7 +192,7 @@ class SignifydCase(models.Model):
|
||||
for user in connector.notify_user_ids:
|
||||
self.create_notification(user, outcome or checkpoint_action)
|
||||
|
||||
self.write(vals)
|
||||
self.sudo().write(vals)
|
||||
|
||||
def create_notification(self, user, outcome):
|
||||
self.ensure_one()
|
||||
|
||||
Reference in New Issue
Block a user