feat: hide authorizer for rental orders, auto-set sale type

Rental orders no longer show the "Authorizer Required?" question or
the Authorizer field. The sale type is automatically set to 'Rentals'
when creating or confirming a rental order. Validation logic also
skips authorizer checks for rental sale type.

Made-with: Cursor
This commit is contained in:
gsinghpal
2026-02-25 23:33:23 -05:00
parent 3c8f83b8e6
commit 14fe9ab716
51 changed files with 4192 additions and 822 deletions

View File

@@ -48,6 +48,9 @@ class PaymentTransaction(models.Model):
copy=False,
)
def _get_provider_sudo(self):
return self.provider_id.sudo()
# === BUSINESS METHODS - PAYMENT FLOW === #
def _get_specific_processing_values(self, processing_values):
@@ -64,7 +67,8 @@ class PaymentTransaction(models.Model):
poynt_data = self._poynt_create_order_and_authorize()
base_url = self.provider_id.get_base_url()
provider = self._get_provider_sudo()
base_url = provider.get_base_url()
return_url = url_join(
base_url,
f'{PoyntController._return_url}?{url_encode({"reference": self.reference})}',
@@ -74,8 +78,8 @@ class PaymentTransaction(models.Model):
'poynt_order_id': poynt_data.get('order_id', ''),
'poynt_transaction_id': poynt_data.get('transaction_id', ''),
'return_url': return_url,
'business_id': self.provider_id.poynt_business_id,
'is_test': self.provider_id.state == 'test',
'business_id': provider.poynt_business_id,
'is_test': provider.state == 'test',
}
def _send_payment_request(self):
@@ -104,26 +108,29 @@ class PaymentTransaction(models.Model):
:rtype: dict
"""
try:
provider = self._get_provider_sudo()
order_payload = poynt_utils.build_order_payload(
self.reference, self.amount, self.currency_id,
business_id=self.provider_id.poynt_business_id,
store_id=self.provider_id.poynt_store_id or '',
business_id=provider.poynt_business_id,
store_id=provider.poynt_store_id or '',
)
order_result = self.provider_id._poynt_make_request(
order_result = provider._poynt_make_request(
'POST', 'orders', payload=order_payload,
)
order_id = order_result.get('id', '')
self.poynt_order_id = order_id
action = 'AUTHORIZE' if self.provider_id.capture_manually else 'SALE'
action = 'AUTHORIZE' if provider.capture_manually else 'SALE'
txn_payload = poynt_utils.build_transaction_payload(
action=action,
amount=self.amount,
currency=self.currency_id,
order_id=order_id,
reference=self.reference,
business_id=provider.poynt_business_id,
store_id=provider.poynt_store_id or '',
)
txn_result = self.provider_id._poynt_make_request(
txn_result = provider._poynt_make_request(
'POST', 'transactions', payload=txn_payload,
)
@@ -144,46 +151,68 @@ class PaymentTransaction(models.Model):
def _poynt_process_token_payment(self):
"""Process a payment using a stored token (card on file).
For token-based payments we send a SALE or AUTHORIZE using the
stored card ID from the payment token.
Uses the JWT payment token via POST /cards/tokenize/charge when
available. Falls back to the legacy cardId flow for tokens that
were created before the JWT migration.
"""
try:
action = 'AUTHORIZE' if self.provider_id.capture_manually else 'SALE'
provider = self._get_provider_sudo()
action = 'AUTHORIZE' if provider.capture_manually else 'SALE'
payment_jwt = self.token_id.poynt_payment_token
funding_source = {
'type': 'CREDIT_DEBIT',
'card': {
'cardId': self.token_id.poynt_card_id,
},
}
order_payload = poynt_utils.build_order_payload(
self.reference, self.amount, self.currency_id,
business_id=self.provider_id.poynt_business_id,
store_id=self.provider_id.poynt_store_id or '',
)
order_result = self.provider_id._poynt_make_request(
'POST', 'orders', payload=order_payload,
)
order_id = order_result.get('id', '')
self.poynt_order_id = order_id
txn_payload = poynt_utils.build_transaction_payload(
action=action,
amount=self.amount,
currency=self.currency_id,
order_id=order_id,
reference=self.reference,
funding_source=funding_source,
)
txn_result = self.provider_id._poynt_make_request(
'POST', 'transactions', payload=txn_payload,
)
if payment_jwt:
txn_result = provider._poynt_charge_token(
payment_jwt=payment_jwt,
amount=self.amount,
currency=self.currency_id,
action=action,
reference=self.reference,
)
else:
funding_source = {
'type': 'CREDIT_DEBIT',
'card': {
'cardId': self.token_id.poynt_card_id,
},
'entryDetails': {
'customerPresenceStatus': 'MOTO',
'entryMode': 'KEYED',
},
}
order_payload = poynt_utils.build_order_payload(
self.reference, self.amount, self.currency_id,
business_id=provider.poynt_business_id,
store_id=provider.poynt_store_id or '',
)
order_result = provider._poynt_make_request(
'POST', 'orders', payload=order_payload,
)
order_id = order_result.get('id', '')
self.poynt_order_id = order_id
txn_payload = poynt_utils.build_transaction_payload(
action=action,
amount=self.amount,
currency=self.currency_id,
order_id=order_id,
reference=self.reference,
funding_source=funding_source,
business_id=provider.poynt_business_id,
store_id=provider.poynt_store_id or '',
)
txn_result = provider._poynt_make_request(
'POST', 'transactions', payload=txn_payload,
)
transaction_id = txn_result.get('id', '')
self.poynt_transaction_id = transaction_id
self.provider_reference = transaction_id
order_id = txn_result.get('orderIdFromTransaction', '') or \
txn_result.get('orderId', '') or \
getattr(self, 'poynt_order_id', '') or ''
if order_id:
self.poynt_order_id = order_id
payment_data = {
'reference': self.reference,
'poynt_order_id': order_id,
@@ -211,8 +240,9 @@ class PaymentTransaction(models.Model):
parent_txn_id = source_tx.poynt_transaction_id or source_tx.provider_reference
provider = self._get_provider_sudo()
try:
txn_data = self.provider_id._poynt_make_request(
txn_data = provider._poynt_make_request(
'GET', f'transactions/{parent_txn_id}',
)
for link in txn_data.get('links', []):
@@ -248,7 +278,7 @@ class PaymentTransaction(models.Model):
'notes': f'Refund for {source_tx.reference}',
}
result = self.provider_id._poynt_make_request(
result = provider._poynt_make_request(
'POST', 'transactions', payload=refund_payload,
)
@@ -287,7 +317,7 @@ class PaymentTransaction(models.Model):
},
}
result = self.provider_id._poynt_make_request(
result = self._get_provider_sudo()._poynt_make_request(
'POST', 'transactions', payload=capture_payload,
)
@@ -313,7 +343,7 @@ class PaymentTransaction(models.Model):
txn_id = source_tx.provider_reference or source_tx.poynt_transaction_id
try:
result = self.provider_id._poynt_make_request(
result = self._get_provider_sudo()._poynt_make_request(
'POST', f'transactions/{txn_id}/void',
)
@@ -580,17 +610,18 @@ class PaymentTransaction(models.Model):
return super()._create_payment(**extra_create_values)
self.ensure_one()
provider = self._get_provider_sudo()
reference = f'{self.reference} - {self.provider_reference or ""}'
payment_method_line = self.provider_id.journal_id.inbound_payment_method_line_ids\
.filtered(lambda l: l.payment_provider_id == self.provider_id)
payment_method_line = provider.journal_id.inbound_payment_method_line_ids\
.filtered(lambda l: l.payment_provider_id == provider)
payment_values = {
'amount': abs(self.amount),
'payment_type': 'inbound' if self.amount > 0 else 'outbound',
'currency_id': self.currency_id.id,
'partner_id': self.partner_id.commercial_partner_id.id,
'partner_type': 'customer',
'journal_id': self.provider_id.journal_id.id,
'company_id': self.provider_id.company_id.id,
'journal_id': provider.journal_id.id,
'company_id': provider.company_id.id,
'payment_method_line_id': payment_method_line.id,
'payment_token_id': self.token_id.id,
'payment_transaction_id': self.id,
@@ -608,7 +639,7 @@ class PaymentTransaction(models.Model):
payment = self.env['account.payment'].create(payment_values)
bank_account = self.provider_id.journal_id.default_account_id
bank_account = provider.journal_id.default_account_id
if bank_account and bank_account.account_type == 'asset_cash':
payment.outstanding_account_id = bank_account
@@ -675,7 +706,7 @@ class PaymentTransaction(models.Model):
fields in :attr:`poynt_receipt_data` as a JSON blob."""
txn_data = {}
try:
txn_data = self.provider_id._poynt_make_request(
txn_data = self._get_provider_sudo()._poynt_make_request(
'GET', f'transactions/{self.poynt_transaction_id}',
)
except (ValidationError, Exception):
@@ -757,7 +788,7 @@ class PaymentTransaction(models.Model):
if not invoice:
return
receipt_content = self.provider_id._poynt_fetch_receipt(
receipt_content = self._get_provider_sudo()._poynt_fetch_receipt(
self.poynt_transaction_id,
)
if not receipt_content: