hms_bak/hotel_online/models/payment.py
2024-10-08 01:17:38 +04:00

164 lines
8.4 KiB
Python

from datetime import datetime
from odoo import models, fields, api, _
from odoo.tools.float_utils import float_compare
import logging
from . import reservation as res
from odoo import api, fields, models, _, SUPERUSER_ID
_logger = logging.getLogger(__name__)
class PaymentTransaction(models.Model):
_inherit = 'payment.transaction'
# sale_order_id = fields.Many2one('hotel.reservation', 'Sale Order')
# sale_order_ids = fields.Many2many('hotel.reservation', 'hotel_reservation_transaction_rel','transaction_id','sale_order_id',
# string='Sales Orders', copy=False, readonly=True)
reservation_id = fields.Many2one('hotel.reservation', string='Reservation')
reservation_ids = fields.Many2many('hotel.reservation', 'hotel_reservation_transactions_rel','transaction_id','reservation_id',
string='Reservation Orders', copy=False, readonly=True)
# def _set_pending(self, state_message=None):
# """ Override of payment to send the quotations automatically. """
# # super(PaymentTransaction, self)._set_pending(state_message=state_message)
# for record in self:
# sales_orders = record.sale_order_ids.filtered(lambda so: so.state in ['draft'])
# # sales_orders.filtered(lambda so: so.state == 'draft').with_context(tracking_disable=True).write({'state': 'confirm'})
# def _set_authorized(self, state_message=None):
# """ Override of payment to confirm the quotations automatically. """
# super()._set_authorized(state_message=state_message)
# sales_orders = self.mapped('sale_order_ids').filtered(lambda so: so.state in ('draft', 'sent'))
# for tx in self:
# tx._check_amount_and_confirm_order()
# # send order confirmation mail
# # sales_orders._send_order_confirmation_mail()
# @api.model
# def _reconcile_after_done(self):
# """ Override of payment to automatically confirm quotations and generate invoices. """
# sales_orders = self.mapped('sale_order_ids').filtered(lambda so: so.state in ('draft', 'sent'))
# for tx in self:
# tx._check_amount_and_confirm_order()
# # send order confirmation mail
# # sales_orders._send_order_confirmation_mail()
# # invoice the sale orders if needed
# # res = super()._reconcile_after_done()
# if self.env['ir.config_parameter'].sudo().get_param('sale.automatic_invoice') and any(so.state in ('sale', 'done') for so in self.sale_order_ids):
# self._invoice_sale_orders()
# default_template = self.env['ir.config_parameter'].sudo().get_param('sale.default_invoice_email_template')
# if default_template:
# for trans in self.filtered(lambda t: t.sale_order_ids.filtered(lambda so: so.state in ('sale', 'done'))):
# trans = trans.with_company(trans.acquirer_id.company_id).with_context(
# mark_invoice_as_sent=True,
# company_id=trans.acquirer_id.company_id.id,
# )
# for invoice in trans.invoice_ids.with_user(SUPERUSER_ID):
# invoice.message_post_with_template(int(default_template), email_layout_xmlid="mail.mail_notification_paynow")
# return res
# def _check_or_create_sale_tx(self, order, acquirer, payment_token=None, tx_type='form', add_tx_values=None, reset_draft=True):
# tx = self
# if not tx:
# tx = self.search([('reference', '=', order.name)], limit=1)
# if tx.state in ['error', 'cancel']: # filter incorrect states
# tx = False
# if (tx and tx.acquirer_id != acquirer) or (tx and tx.sale_order_id != order): # filter unmatching
# tx = False
# if tx and payment_token and tx.payment_token_id and payment_token != tx.payment_token_id: # new or distinct token
# tx = False
# # still draft tx, no more info -> rewrite on tx or create a new one depending on parameter
# if tx and tx.state == 'draft':
# if reset_draft:
# tx.write(dict(
# # self.on_change_partner_id(order.partner_id.id).get('value', {}),
# amount=order.total_cost1 if isinstance(
# order, res.hotel_reservation) else order.amount_total,
# type=tx_type)
# )
# else:
# tx = False
# reference = "VALIDATION-%s-%s" % (self.id,
# datetime.now().strftime('%y%m%d_%H%M%S'))
# if not tx:
# tx_values = {
# 'acquirer_id': acquirer.id,
# 'type': tx_type,
# 'amount': order.total_cost1 if isinstance(order, res.hotel_reservation) else order.amount_total,
# 'currency_id': order.pricelist_id.currency_id.id,
# 'partner_id': order.partner_id.id,
# 'partner_country_id': order.partner_id.country_id.id,
# 'reference': reference,
# 'sale_order_id': order.id,
# }
# if add_tx_values:
# tx_values.update(add_tx_values)
# if payment_token and payment_token.sudo().partner_id == order.partner_id:
# tx_values['payment_token_id'] = payment_token.id
# tx = self.create(tx_values)
# # update quotation
# order.write({
# 'payment_tx_id': tx.id,
# })
# return tx
# def render_sale_button(self, invoice, return_url, submit_txt=None, render_values=None):
# values = {
# 'return_url': return_url,
# 'partner_id': invoice.partner_id.id,
# }
# if render_values:
# values.update(render_values)
# return self.acquirer_id.with_context(submit_class='btn btn-primary', submit_txt=submit_txt or _('Pay Now')).sudo().render(
# self.reference,
# invoice.total_cost1,
# invoice.currency_id.id,
# values=values,
# )
# def _confirm_so(self):
# """ Check tx state, confirm the potential SO """
# self.ensure_one()
# if self.sale_order_id.state not in ['draft', 'sent', 'sale']:
# _logger.warning('<%s> transaction STATE INCORRECT for order %s (ID %s, state %s)',
# self.acquirer_id.provider, self.sale_order_id.name, self.sale_order_id.id, self.sale_order_id.state)
# return 'pay_sale_invalid_doc_state'
# if not float_compare(self.amount, self.sale_order_id.total_cost1, 2) == 0:
# _logger.warning('<%s> transaction AMOUNT MISMATCH for order %s (ID %s)',
# self.acquirer_id.provider, self.sale_order_id.name, self.sale_order_id.id)
# return 'pay_sale_tx_amount'
# if self.state == 'authorized' and self.acquirer_id.capture_manually:
# _logger.info('<%s> transaction authorized, auto-confirming order %s (ID %s)',
# self.acquirer_id.provider, self.sale_order_id.name, self.sale_order_id.id)
# if self.sale_order_id.state in ('draft', 'sent'):
# self.sale_order_id.with_context(
# send_email=True).action_confirm()
# if self.state == 'done':
# _logger.info('<%s> transaction completed, auto-confirming order %s (ID %s) and generating invoice',
# self.acquirer_id.provider, self.sale_order_id.name, self.sale_order_id.id)
# if self.sale_order_id.state in ('draft', 'sent'):
# self.sale_order_id.with_context(
# send_email=True).action_confirm()
# self._generate_and_pay_invoice()
# elif self.state not in ['cancel', 'error'] and self.sale_order_id.state == 'draft':
# _logger.info('<%s> transaction pending/to confirm manually, sending quote email for order %s (ID %s)',
# self.acquirer_id.provider, self.sale_order_id.name, self.sale_order_id.id)
# # self.sale_order_id.force_quotation_send()
# else:
# _logger.warning('<%s> transaction MISMATCH for order %s (ID %s)',
# self.acquirer_id.provider, self.sale_order_id.name, self.sale_order_id.id)
# return 'pay_sale_tx_state'
# return True