diff --git a/bross_bank_management/__manifest__.py b/bross_bank_management/__manifest__.py index f8bf4fe..936aca0 100644 --- a/bross_bank_management/__manifest__.py +++ b/bross_bank_management/__manifest__.py @@ -14,6 +14,7 @@ 'data/bank_conf.xml', 'data/bank_transactions_status_code.xml', 'data/bank_transactions_subtype_code.xml', + 'data/regex_paterns.xml', 'cron/crons.xml', 'views/main_menu.xml', 'views/bank_views.xml', @@ -22,6 +23,7 @@ 'views/raw_movements.xml', 'views/bank_transactions_views.xml', 'views/service_payments_views.xml', + 'views/transactions_regex.xml', 'views/bank_payments_views.xml', 'wizard/add_payments_view.xml', ], diff --git a/bross_bank_management/data/regex_paterns.xml b/bross_bank_management/data/regex_paterns.xml new file mode 100644 index 0000000..4933323 --- /dev/null +++ b/bross_bank_management/data/regex_paterns.xml @@ -0,0 +1,25 @@ + + + + + Salary + ^ხელფასი + + + + Service Revenue + ^\d+(\.\d+)?$ + + + + Bank Fees + გადარიცხვის საკომისიო + + + + Bank Fees + საკასო მომსახურების საკომისიო + + + + diff --git a/bross_bank_management/models/__init__.py b/bross_bank_management/models/__init__.py index de372f2..4d0b774 100644 --- a/bross_bank_management/models/__init__.py +++ b/bross_bank_management/models/__init__.py @@ -3,5 +3,6 @@ from . import bank_account from . import bank_settings from . import bank_models from . import bank_transactions -from . import bank_payments +from . import hms_payments_inherit from . import service_payments +from . import transactions_regex \ No newline at end of file diff --git a/bross_bank_management/models/bank_payments.py b/bross_bank_management/models/bank_payments.py deleted file mode 100644 index 29eb9bb..0000000 --- a/bross_bank_management/models/bank_payments.py +++ /dev/null @@ -1,7 +0,0 @@ -from odoo import models, fields, _ - - -class HmsPayments(models.Model): - _inherit = 'hms.payments' - - bank_payment_id = fields.Many2one(comodel_name="brosse.bank.transactions", string="Bank Payment ID") diff --git a/bross_bank_management/models/bank_transactions.py b/bross_bank_management/models/bank_transactions.py index 549508b..6e210e4 100644 --- a/bross_bank_management/models/bank_transactions.py +++ b/bross_bank_management/models/bank_transactions.py @@ -49,8 +49,47 @@ class BrosseBankTransactions(models.Model): 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 + + print(f"################## {payments}") + 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}) + print(self.manually_assigned) + print('movida') + @api.depends('document_date', 'amount') def _compute_display_name(self): for rec in self: @@ -67,7 +106,7 @@ class BrosseBankTransactions(models.Model): to_pay = booking.total_amount self.env['hms.payments'].create({ - 'bank_payment_id': rec.id, + 'transaction_id': rec.id, 'booking_id': booking.id, 'currency_id': rec.currency_id.id, 'amount': rec.amount, diff --git a/bross_bank_management/models/hms_payments_inherit.py b/bross_bank_management/models/hms_payments_inherit.py new file mode 100644 index 0000000..b36574c --- /dev/null +++ b/bross_bank_management/models/hms_payments_inherit.py @@ -0,0 +1,7 @@ +from odoo import models, fields, _ + + +class HmsPayments(models.Model): + _inherit = 'hms.payments' + + transaction_id = fields.Many2one(comodel_name="brosse.bank.transactions", string="Bank Transaction") \ No newline at end of file diff --git a/bross_bank_management/models/transactions_regex.py b/bross_bank_management/models/transactions_regex.py new file mode 100644 index 0000000..75196ad --- /dev/null +++ b/bross_bank_management/models/transactions_regex.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +import re +from odoo import models, fields, api, _ + + +class PaymentCategoriesRegex(models.Model): + _name = 'hms.payment.categories.regex' + _description = 'Payment Categories Regex' + + name = fields.Char('Name', required=True) + regex = fields.Char('Regex', required=True) + category_id = fields.Many2one(comodel_name="hms.payment.categories", string="Category") + + def search_transactions_with_wallet_and_domestic(self, regex_patern): + pattern = re.compile(regex_patern, re.IGNORECASE) + transactions = self.env['brosse.bank.transactions'].search([('manually_assigned', '!=', True)]) + + matching_transactions = [] + for transaction in transactions: + amount = str(transaction.amount or 0) + description = transaction.description or '' + comment = transaction.comment or '' + + if pattern.search(amount) or pattern.search(description) or pattern.search(comment): + matching_transactions.append(transaction) + return matching_transactions + + def write(self, vals): + res = super(PaymentCategoriesRegex, self).write(vals) + matching_transactions = self.search_transactions_with_wallet_and_domestic(self.regex) + + for transaction in matching_transactions: + transaction.write({'category_id': self.category_id.id}) + return res \ No newline at end of file diff --git a/bross_bank_management/security/ir.model.access.csv b/bross_bank_management/security/ir.model.access.csv index d420549..1f20d12 100644 --- a/bross_bank_management/security/ir.model.access.csv +++ b/bross_bank_management/security/ir.model.access.csv @@ -8,4 +8,6 @@ bross_bank_management.access_brosse_service_payments,access_brosse_service_payme bross_bank_management.access_add_payments_wizard,access_add_payments_wizard,bross_bank_management.model_add_payments_wizard,base.group_user,1,1,1,1 bross_bank_management.access_brosse_bank_transactions_status_code,access_brosse_bank_transactions_status_code,bross_bank_management.model_brosse_bank_transactions_status_code,base.group_user,1,1,1,1 -bross_bank_management.access_brosse_bank_transactions_subtype_code,access_brosse_bank_transactions_subtype_code,bross_bank_management.model_brosse_bank_transactions_subtype_code,base.group_user,1,1,1,1 \ No newline at end of file +bross_bank_management.access_brosse_bank_transactions_subtype_code,access_brosse_bank_transactions_subtype_code,bross_bank_management.model_brosse_bank_transactions_subtype_code,base.group_user,1,1,1,1 + +bross_bank_management.access_hms_payment_categories_regex,access_hms_payment_categories_regex,bross_bank_management.model_hms_payment_categories_regex,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/bross_bank_management/views/bank_payments_views.xml b/bross_bank_management/views/bank_payments_views.xml index 68f4eee..b067b59 100644 --- a/bross_bank_management/views/bank_payments_views.xml +++ b/bross_bank_management/views/bank_payments_views.xml @@ -7,7 +7,7 @@ - + diff --git a/bross_bank_management/views/bank_transactions_views.xml b/bross_bank_management/views/bank_transactions_views.xml index 8a5fa55..7518c35 100644 --- a/bross_bank_management/views/bank_transactions_views.xml +++ b/bross_bank_management/views/bank_transactions_views.xml @@ -1,7 +1,7 @@ - Brosse Bank + Bank code @@ -17,20 +17,22 @@
-
+ + + - +
- Transactions brosse.bank.transactions @@ -38,13 +40,16 @@ + - + + + diff --git a/bross_bank_management/views/transactions_regex.xml b/bross_bank_management/views/transactions_regex.xml new file mode 100644 index 0000000..e182c2c --- /dev/null +++ b/bross_bank_management/views/transactions_regex.xml @@ -0,0 +1,29 @@ + + + + + Payment Categories Regex + hms.payment.categories.regex + + + + + + + + + + + Payment Categories Regex + hms.payment.categories.regex + list + +

+ Create your first payment category regex record. +

+
+
+ + +
+
diff --git a/bross_bank_management/wizard/add_payments.py b/bross_bank_management/wizard/add_payments.py index 5d15468..2e2fb55 100644 --- a/bross_bank_management/wizard/add_payments.py +++ b/bross_bank_management/wizard/add_payments.py @@ -11,6 +11,7 @@ class AddPayments(models.TransientModel): @api.model def _transaction_domain(self): + print(self.env.ref('bross_bank_management.transaction_code_3').id) return [('status_code_id', '=', self.env.ref('bross_bank_management.transaction_code_3').id)] transaction_id = fields.Many2one(comodel_name="brosse.bank.transactions", domain=_transaction_domain, string="Bank Transaction") @@ -83,14 +84,17 @@ class AddPayments(models.TransientModel): transaction_id = rec.transaction_id.id if rec.transaction_id else False pos_terminal_code = False wire_transfer_code = rec.wire_transfer_code + + print(transaction_id) self.env['hms.payments'].create({ + 'hms_payment_type_id': rec.payment_type.id, 'booking_id': rec.booking_id.id, 'currency_id': rec.currency_id.id, 'amount': rec.amount, 'exchange_rate': rec.exchange_rate, 'pending_transcation': rec.pending_transcation, - 'bank_payment_id': transaction_id, + 'transaction_id': transaction_id, 'pos_terminal_code': pos_terminal_code, 'wire_transfer_code': wire_transfer_code, }) diff --git a/bross_hms/__manifest__.py b/bross_hms/__manifest__.py index 2125d1f..b7a21ff 100644 --- a/bross_hms/__manifest__.py +++ b/bross_hms/__manifest__.py @@ -14,6 +14,7 @@ # 'cron/crons.xml', 'data/payment_methods.xml', 'data/payment_types.xml', + 'data/payment_categories.xml', 'data/service_kinds.xml', 'views/misc_menus.xml', 'views/main_menus.xml', @@ -32,6 +33,8 @@ 'views/source_channels.xml', 'views/booking_source.xml', 'views/bookings.xml', + 'views/room_revenue.xml', + 'views/service_categories.xml', 'views/status.xml', 'views/hms_payments.xml', ], diff --git a/bross_hms/data/payment_categories.xml b/bross_hms/data/payment_categories.xml new file mode 100644 index 0000000..88b9885 --- /dev/null +++ b/bross_hms/data/payment_categories.xml @@ -0,0 +1,23 @@ + + + + + Service Revenue + + + Tax + + + Salary + + + Bank Fees + + + Lease Expenses + + + Other Expenses + + + diff --git a/bross_hms/data/payment_types.xml b/bross_hms/data/payment_types.xml index 9c5de4a..943b1f3 100644 --- a/bross_hms/data/payment_types.xml +++ b/bross_hms/data/payment_types.xml @@ -1,6 +1,6 @@ - + Cash diff --git a/bross_hms/models/hms_models.py b/bross_hms/models/hms_models.py index 214b45a..4c77b3c 100644 --- a/bross_hms/models/hms_models.py +++ b/bross_hms/models/hms_models.py @@ -177,16 +177,39 @@ class HmsBookings(models.Model): paid = fields.Monetary(string="Paid Amount", compute="_compute_checkin_checkout_date", currency_field='currency', store=True) to_be_paid = fields.Monetary(string="To Pay Amount", compute="_compute_checkin_checkout_date", currency_field='currency', store=True) currency = fields.Many2one(comodel_name="res.currency", string="Currency") + expected_payment = fields.Monetary(string="Expected Payment", compute="_compute_checkin_checkout_date", currency_field='currency', store=True) paymentMethod = fields.Many2one(comodel_name="hms.payment.methods", string="Payment Method", compute="_compute_checkin_checkout_date", store=True) payment_status = fields.Selection( - [('completely_paid', 'Completely Paid'), ('partially_paid', 'Partially Paid'), ('not_paid', 'Not Paid')], string="Payment Status", compute="_compute_checkin_checkout_date", store=True - ) + [('completely_paid', 'Completely Paid'), ('partially_paid', 'Partially Paid'), ('not_paid', 'Not Paid')], string="Payment Status", compute="_compute_checkin_checkout_date", store=True) - @api.depends('roomStays') + booking_status = fields.Many2one(comodel_name="hms.booking.status", string="Booking Status", compute="_compute_checkin_checkout_date", store=True) + status = fields.Many2one(comodel_name="hms.status", string="Status", compute="_compute_checkin_checkout_date", store=True) + + @api.depends('roomStays', 'payment_ids') def _compute_checkin_checkout_date(self): for booking in self: + # Status fields + if booking.roomStays.filtered(lambda stay: stay.bookingStatus.name == 'Confirmed'): + booking.booking_status = self.env['hms.booking.status'].search([('name', '=', 'Confirmed')]).id + elif not booking.roomStays.filtered(lambda stay: stay.bookingStatus.name != 'Cancelled'): + booking.booking_status = self.env['hms.booking.status'].search([('name', '=', 'Cancelled')]).id + elif not booking.roomStays.filtered(lambda stay: stay.bookingStatus.name != 'Pending'): + booking.booking_status = self.env['hms.booking.status'].search([('name', '=', 'UpcoPendingming')]).id + + if not booking.roomStays.filtered(lambda stay: stay.status.name == 'CheckedIn') and not booking.roomStays.filtered(lambda stay: stay.status.name == 'CheckedOut') and booking.roomStays.filtered(lambda stay: stay.status.name == 'New'): + booking.status = self.env['hms.status'].search([('name', '=', 'Upcoming')]).id + elif booking.roomStays.filtered(lambda stay: stay.status.name == 'CheckedIn'): + booking.status = self.env['hms.status'].search([('name', '=', 'CheckedIn')]).id + elif booking.roomStays.filtered(lambda stay: stay.status.name == 'CheckedOut'): + booking.status = self.env['hms.status'].search([('name', '=', 'CheckedOut')]).id + elif not booking.roomStays.filtered(lambda stay: stay.status.name != 'Cancelled'): + booking.status = self.env['hms.status'].search([('name', '=', 'Cancelled')]).id + elif not booking.roomStays.filtered(lambda stay: stay.status.name != 'No Show'): + booking.status = self.env['hms.status'].search([('name', '=', 'No Show')]).id + + # Computed fields checkin_dates = booking.roomStays.mapped('checkInDateTime') checkout_dates = booking.roomStays.mapped('checkOutDateTime') @@ -211,8 +234,43 @@ class HmsBookings(models.Model): booking.to_be_paid = sum(stay.totalPrice.get('toPayAmount', 0) for stay in booking.roomStays if stay.totalPrice) booking.currency = booking.reservation_ids[0].currency if booking.reservation_ids else False booking.paymentMethod = booking.reservation_ids[0].paymentMethod if booking.reservation_ids else False - booking.payment_status = 'completely_paid' if booking.paid == booking.total_amount else 'partially_paid' if booking.paid > 0 else 'not_paid' + + paid_amount = booking.compute_paid_amount() + + if booking.total_amount != 0: + expected_payment = booking.total_amount - paid_amount + booking.expected_payment = expected_payment + if expected_payment <= 0: + booking.payment_status = 'completely_paid' + elif booking.total_amount > expected_payment: + booking.payment_status = 'partially_paid' + else: + booking.payment_status = 'not_paid' + else: + booking.payment_status = 'not_paid' + + def compute_paid_amount(self): + gel_currency_id = self.env['res.currency'].search([('name', '=', 'GEL')]) + + paid_amount = 0 + if self.payment_ids: + for payment in self.payment_ids: + if self.currency.id == gel_currency_id.id: + if payment.currency_id.id != gel_currency_id.id: + paid_amount += payment.amount * payment.exchange_rate + else: + paid_amount += payment.amount + else: + if payment.currency_id.id == gel_currency_id.id: + paid_amount += payment.amount / self.currency.rate_ids.sorted('id', reverse=True)[0].rate + else: + if self.currency.id == payment.currency_id.id: + paid_amount += payment.amount + else: + paid_amount += payment.amount * gel_currency_id.rate_ids.sorted('id', reverse=True)[0].rate / self.currency.rate_ids.sorted('id', reverse=True)[0].rate + return paid_amount + # def add_bank_transactions(self): # return { # 'name': _('Add bank transactions'), @@ -234,22 +292,7 @@ class HmsBookings(models.Model): expected_payment = self.total_amount - paid_amount = 0 - if self.payment_ids: - for payment in self.payment_ids: - if self.currency.id == gel_currency_id.id: - if payment.currency_id.id != gel_currency_id.id: - paid_amount += payment.amount * payment.exchange_rate - else: - paid_amount += payment.amount - else: - if payment.currency_id.id == gel_currency_id.id: - paid_amount += payment.amount / self.currency.rate_ids.sorted('id', reverse=True)[0].rate - else: - if self.currency.id == payment.currency_id.id: - paid_amount += payment.amount - else: - paid_amount += payment.amount * gel_currency_id.rate_ids.sorted('id', reverse=True)[0].rate / self.currency.rate_ids.sorted('id', reverse=True)[0].rate + paid_amount = self.compute_paid_amount() expected_payment = expected_payment - paid_amount return { diff --git a/bross_hms/models/hms_services.py b/bross_hms/models/hms_services.py index 1a4a258..6eefe2e 100644 --- a/bross_hms/models/hms_services.py +++ b/bross_hms/models/hms_services.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- -import requests -import logging -import json from odoo import models, fields, api, _ -from datetime import datetime, timedelta -_logger = logging.getLogger(__name__) +class PaymentCategories(models.Model): + _name = 'hms.payment.categories' + _description = 'Payment Categories' + name = fields.Char('Name', required=True) diff --git a/bross_hms/security/ir.model.access.csv b/bross_hms/security/ir.model.access.csv index 9b0dbf3..0a214da 100644 --- a/bross_hms/security/ir.model.access.csv +++ b/bross_hms/security/ir.model.access.csv @@ -25,3 +25,4 @@ bross_hms.access_hms_reservations,access_hms_reservations,bross_hms.model_hms_re bross_hms.access_hms_payments,access_hms_payments,bross_hms.model_hms_payments,base.group_user,1,1,1,1 bross_hms.access_hms_payment_types,access_hms_payment_types,bross_hms.model_hms_payment_types,base.group_user,1,1,1,1 +bross_hms.access_hms_payment_categories,access_hms_payment_categories,bross_hms.model_hms_payment_categories,base.group_user,1,1,1,0 diff --git a/bross_hms/views/bookings.xml b/bross_hms/views/bookings.xml index ea1342e..cbf60dc 100644 --- a/bross_hms/views/bookings.xml +++ b/bross_hms/views/bookings.xml @@ -6,13 +6,18 @@ hms.bookings -