121 lines
5.5 KiB
Python
121 lines
5.5 KiB
Python
from odoo import models, fields, api, _
|
|
from odoo.exceptions import UserError, ValidationError
|
|
|
|
|
|
class BrosseBankTransactionsStatusCode(models.Model):
|
|
_name = 'brosse.bank.transactions.status.code'
|
|
_description = 'Bank Transactions Status Code'
|
|
|
|
name = fields.Char(string='Name')
|
|
code = fields.Integer(string='Code')
|
|
|
|
|
|
class BrosseBankTransactionsSubtypeCode(models.Model):
|
|
_name = 'brosse.bank.transactions.subtype.code'
|
|
_description = 'Bank Transactions Subtype Code'
|
|
|
|
name = fields.Char(string='Name')
|
|
code = fields.Integer(string='Code')
|
|
|
|
|
|
class BrosseBankTransactions(models.Model):
|
|
_name = 'brosse.bank.transactions'
|
|
_description = 'Bank Transactions'
|
|
_rec_name = 'document_number'
|
|
_order = 'create_date desc'
|
|
|
|
movement_id = fields.Char(string='Movement ID')
|
|
external_payment_id = fields.Char(string='External Payment ID')
|
|
debit_credit = fields.Boolean(string='Debit/Credit', help="False = Debit, True = Credit")
|
|
value_date = fields.Date(string='Value Date')
|
|
description = fields.Char(string="Description")
|
|
amount = fields.Monetary(string="Amount", currency_field='currency_id')
|
|
currency_id = fields.Many2one('res.currency', string='Currency')
|
|
account_number = fields.Char(string='Account Number')
|
|
account_name = fields.Char(string='Account Name')
|
|
comment = fields.Text(string="Comment")
|
|
document_date = fields.Date(string='Document Date')
|
|
document_number = fields.Char(string='Document Number')
|
|
partner_name = fields.Char(string="Partner Name")
|
|
partner_tax_code = fields.Char(string='Partner Tax Code')
|
|
taxpayer_code = fields.Char(string='Taxpayer Code')
|
|
taxpayer_name = fields.Char(string="Taxpayer Name")
|
|
operation_code = fields.Char(string='Operation Code')
|
|
exchange_rate = fields.Float(string="Exchange Rate")
|
|
exchange_rate_text = fields.Char(string='Exchange Rate (Text)')
|
|
partner_personal_number = fields.Char(string='Partner Personal Number')
|
|
partner_document_type = fields.Char(string='Partner Document Type')
|
|
partner_document_number = fields.Char(string='Partner Document Number')
|
|
parent_external_payment_id = fields.Char(string='Parent External Payment ID')
|
|
status_code_id = fields.Many2one('brosse.bank.transactions.status.code', string='Status Code')
|
|
transaction_type_id = fields.Many2one('brosse.bank.transactions.subtype.code', string='Transaction Type')
|
|
|
|
payments_ids = fields.One2many(comodel_name="hms.payments", inverse_name="transaction_id", string="HMS Payments")
|
|
|
|
unassigned_amount = fields.Monetary(string="Unassigned Amount", currency_field='currency_id', compute="_compute_unassigned_amount")
|
|
|
|
bank_account_id = fields.Many2one('brosse.bank.account', string="Bank Account")
|
|
|
|
category_id = fields.Many2one('hms.payment.categories', string='Category')
|
|
manually_assigned = fields.Boolean(string="Manually Assigned", default=False)
|
|
|
|
@api.depends('payments_ids')
|
|
def _compute_unassigned_amount(self):
|
|
for rec in self:
|
|
if rec.payments_ids:
|
|
gel_currency_id = self.env['res.currency'].search([('name', '=', 'GEL')])
|
|
payments = 0
|
|
unassigned_amount = 0
|
|
for payment in rec.payments_ids:
|
|
if rec.currency_id.id == gel_currency_id.id:
|
|
if payment.currency_id.id == rec.currency_id.id:
|
|
payments += payment.amount
|
|
else:
|
|
payments += payment.amount * payment.currency_id.rate_ids.sorted('id', reverse=True)[0].rate
|
|
else:
|
|
if payment.currency_id.id == rec.currency_id.id:
|
|
payments += payment.amount
|
|
else:
|
|
payments += payment.amount * payment.currency_id.rate_ids.sorted('id', reverse=True)[0].rate / rec.currency_id.rate_ids.sorted('id', reverse=True)[0].rate
|
|
|
|
unassigned_amount = rec.amount - payments
|
|
else:
|
|
unassigned_amount = rec.amount
|
|
rec.unassigned_amount = unassigned_amount
|
|
|
|
@api.onchange('category_id')
|
|
def onchange_category_id(self):
|
|
if self.category_id:
|
|
self.write({'manually_assigned': True})
|
|
|
|
@api.depends('document_date', 'amount')
|
|
def _compute_display_name(self):
|
|
for rec in self:
|
|
rec.display_name = f"{rec.document_date} / {rec.amount} {rec.currency_id.symbol}" if rec.document_date and rec.amount else ""
|
|
|
|
def action_process_selected_records(self):
|
|
booking_id = self.env.context.get('booking_id')
|
|
booking = self.env['hms.bookings'].browse(booking_id)
|
|
|
|
for rec in self:
|
|
if booking.payment_ids:
|
|
to_pay = booking.total_amount - sum(booking.payment_ids.mapped('amount'))
|
|
else:
|
|
to_pay = booking.total_amount
|
|
|
|
self.env['hms.payments'].create({
|
|
'transaction_id': rec.id,
|
|
'booking_id': booking.id,
|
|
'currency_id': rec.currency_id.id,
|
|
'amount': rec.amount,
|
|
'exchange_rate': rec.exchange_rate,
|
|
})
|
|
|
|
def create(self, vals):
|
|
res = super(BrosseBankTransactions, self).create(vals)
|
|
all_patterns = self.env['hms.payment.categories.regex'].search([])
|
|
for pattern in all_patterns:
|
|
matching_transaction = pattern.search_transactions_with_wallet_and_domestic(pattern.regex, res)
|
|
if matching_transaction:
|
|
res.write({'category_id': pattern.category_id.id})
|
|
return res |