This commit is contained in:
parent
f96edea81f
commit
36b2a3fab6
2
.env
2
.env
@ -14,5 +14,5 @@ DBUSER="odoo"
|
||||
PASSWORD="odoo"
|
||||
ADDONS="--addons-path=/opt/odoo/addons/,/opt/odoo/customaddons/$CUSTOMADDONS_DIR"
|
||||
# ARGS=""
|
||||
ARGS="-d bross_hms_dev -u bross_hms,exely_integration,bross_bank_management"
|
||||
ARGS="-d bross_hms_dev -u bross_hms,exely_integration,bross_bank_management,restore_buttons"
|
||||
# DEBUG="-m debugpy --listen 0.0.0.0:5678 --wait-for-client"
|
||||
|
||||
@ -1 +1,2 @@
|
||||
from . import models
|
||||
from . import wizard
|
||||
|
||||
@ -12,15 +12,18 @@
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'data/bank_conf.xml',
|
||||
'data/bank_transactions_status_code.xml',
|
||||
'data/bank_transactions_subtype_code.xml',
|
||||
'cron/crons.xml',
|
||||
'views/main_menu.xml',
|
||||
'views/bank_views.xml',
|
||||
'views/bank_account_views.xml',
|
||||
'views/bank_settings_views.xml',
|
||||
'views/raw_movements.xml',
|
||||
'views/bank_deposits_views.xml',
|
||||
'views/bank_transactions_views.xml',
|
||||
'views/service_payments_views.xml',
|
||||
'views/bank_payments_views.xml',
|
||||
'wizard/add_payments_view.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
|
||||
17
bross_bank_management/data/bank_transactions_status_code.xml
Normal file
17
bross_bank_management/data/bank_transactions_status_code.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="transaction_code_1" model="brosse.bank.transactions.status.code">
|
||||
<field name="name">Waiting for authorization</field>
|
||||
<field name="code">1</field>
|
||||
</record>
|
||||
<record id="transaction_code_2" model="brosse.bank.transactions.status.code">
|
||||
<field name="name">Waiting for second authorization</field>
|
||||
<field name="code">2</field>
|
||||
</record>
|
||||
<record id="transaction_code_3" model="brosse.bank.transactions.status.code">
|
||||
<field name="name">Authorized</field>
|
||||
<field name="code">3</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="transaction_subtype_code_1" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Transfer between own accounts</field>
|
||||
<field name="code">1</field>
|
||||
</record>
|
||||
<record id="transaction_subtype_code_5" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Currency exchange</field>
|
||||
<field name="code">5</field>
|
||||
</record>
|
||||
<record id="transaction_subtype_code_20" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Income</field>
|
||||
<field name="code">20</field>
|
||||
</record>
|
||||
<record id="transaction_subtype_code_30" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Transfer out and cash withdrawal</field>
|
||||
<field name="code">30</field>
|
||||
</record>
|
||||
<record id="transaction_subtype_code_31" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Bill, Top UP Mobile, fine payments</field>
|
||||
<field name="code">31</field>
|
||||
</record>
|
||||
<record id="transaction_subtype_code_32" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Treasury transfers</field>
|
||||
<field name="code">32</field>
|
||||
</record>
|
||||
<record id="transaction_subtype_code_33" model="brosse.bank.transactions.subtype.code">
|
||||
<field name="name">Other expenses</field>
|
||||
<field name="code">33</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@ -2,6 +2,6 @@ from . import bank
|
||||
from . import bank_account
|
||||
from . import bank_settings
|
||||
from . import bank_models
|
||||
from . import bank_deposits
|
||||
from . import bank_transactions
|
||||
from . import bank_payments
|
||||
from . import service_payments
|
||||
|
||||
@ -1,19 +0,0 @@
|
||||
from odoo import models, fields, _
|
||||
|
||||
|
||||
class BrosseBankDeposits(models.Model):
|
||||
_name = 'brosse.bank.deposits'
|
||||
_description = 'Bank Deposits'
|
||||
|
||||
amount = fields.Monetary(string="Amount", currency_field='currency_id')
|
||||
currency_id = fields.Many2one('res.currency', string='Account Currency')
|
||||
description = fields.Char(string="Description")
|
||||
comment = fields.Text(string="Comment")
|
||||
partner_name = fields.Char(string="Partner Name")
|
||||
taxpayer_name = fields.Char(string="Taxpayer Name")
|
||||
|
||||
bank_account_id = fields.Many2one('brosse.bank.account', string="Bank Account")
|
||||
|
||||
def action_process_selected_records(self):
|
||||
print(self)
|
||||
print(self.env.context)
|
||||
@ -4,8 +4,8 @@ import hashlib
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
from datetime import datetime
|
||||
from odoo import models, fields, _
|
||||
from datetime import datetime, timedelta
|
||||
from odoo import models, fields, api, _
|
||||
from tbc_bank_integration_service_lib.client import TBCBankClient
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
@ -96,15 +96,32 @@ class BankMovements(models.Model):
|
||||
for rec in to_process_movements:
|
||||
movement = json.loads(rec.json_data)
|
||||
|
||||
account_number = movement['accountNumber']
|
||||
account_name = movement['accountName']
|
||||
movement_id = movement['movementId']
|
||||
external_payment_id = movement['externalPaymentId']
|
||||
debit_credit = movement['debitCredit']
|
||||
value_date = movement['valueDate']
|
||||
description = movement['description']
|
||||
amount = movement['amount']['amount']
|
||||
currency = movement['amount']['currency']
|
||||
iban_code = account_number[4:6]
|
||||
description = movement['description']
|
||||
account_number = movement['accountNumber']
|
||||
account_name = movement['accountName']
|
||||
comment = movement['additionalInformation']
|
||||
document_date = movement['documentDate']
|
||||
document_number = movement['documentNumber']
|
||||
partner_name = movement['partnerName']
|
||||
partner_tax_code = movement['partnerTaxCode']
|
||||
taxpayer_code = movement['taxpayerCode']
|
||||
taxpayer_name = movement['taxpayerName']
|
||||
operation_code = movement['operationCode']
|
||||
exchange_rate_text = movement['exchangeRate']
|
||||
partner_personal_number = movement['partnerPersonalNumber']
|
||||
partner_document_type = movement['partnerDocumentType']
|
||||
partner_document_number = movement['partnerDocumentNumber']
|
||||
parent_external_payment_id = movement['parentExternalPaymentId']
|
||||
status_code = movement['statusCode']
|
||||
transaction_type = movement['transactionType']
|
||||
|
||||
iban_code = account_number[4:6]
|
||||
|
||||
if movement['debitCredit'] == '0':
|
||||
amount = float(amount) * -1
|
||||
@ -136,14 +153,33 @@ class BankMovements(models.Model):
|
||||
'account_number': account_number,
|
||||
}).id
|
||||
|
||||
self.env['brosse.bank.deposits'].create({
|
||||
self.env['brosse.bank.transactions'].create({
|
||||
'bank_account_id': bank_account_id,
|
||||
'amount': amount,
|
||||
'currency_id': currency_id.id,
|
||||
'exchange_rate_text': exchange_rate_text,
|
||||
'description': description,
|
||||
'comment': comment,
|
||||
'partner_name': partner_name,
|
||||
'taxpayer_name': taxpayer_name
|
||||
'taxpayer_name': taxpayer_name,
|
||||
|
||||
'movement_id': movement_id,
|
||||
'external_payment_id': external_payment_id,
|
||||
'debit_credit': debit_credit,
|
||||
'value_date': datetime.strptime(value_date, "%Y-%m-%dT%H:%M:%S") - timedelta(hours=4),
|
||||
'document_date': datetime.strptime(document_date, "%Y-%m-%dT%H:%M:%S") - timedelta(hours=4),
|
||||
'document_number': document_number,
|
||||
'partner_tax_code': partner_tax_code,
|
||||
'taxpayer_code': taxpayer_code,
|
||||
'operation_code': operation_code,
|
||||
'partner_personal_number': partner_personal_number,
|
||||
'partner_document_type': partner_document_type,
|
||||
'partner_document_number': partner_document_number,
|
||||
'parent_external_payment_id': parent_external_payment_id,
|
||||
'status_code_id': self.env['brosse.bank.transactions.status.code'].search([('code', '=', status_code)]).id,
|
||||
'transaction_type_id': self.env['brosse.bank.transactions.subtype.code'].search([('code', '=', transaction_type)]).id,
|
||||
'account_number': account_number,
|
||||
'account_name': account_name
|
||||
})
|
||||
|
||||
# movement_id = '013762510743.2'
|
||||
|
||||
@ -1,22 +1,7 @@
|
||||
from odoo import models, fields, _
|
||||
|
||||
|
||||
class HmsBankPayments(models.Model):
|
||||
_name = 'hms.bank.payments'
|
||||
_description = 'Hms Bank Payments'
|
||||
_rec_name = 'booking_id'
|
||||
class HmsPayments(models.Model):
|
||||
_inherit = 'hms.payments'
|
||||
|
||||
bank_payment_id = fields.Many2one(comodel_name="brosse.bank.deposits", string="Bank Payment ID")
|
||||
booking_id = fields.Many2one(comodel_name="hms.bookings", string="Booking ID")
|
||||
|
||||
currency_id = fields.Many2one(comodel_name="res.currency", string="Currency")
|
||||
amount = fields.Monetary(string="Amount", currency_field='currency_id')
|
||||
amount_left = fields.Monetary(string="Left Amount", currency_field='currency_id')
|
||||
exchange_rate = fields.Float(string="Exchange Rate")
|
||||
notes = fields.Text(string="Notes")
|
||||
|
||||
|
||||
class HmsBookings(models.Model):
|
||||
_inherit = 'hms.bookings'
|
||||
|
||||
bank_payment_ids = fields.One2many(comodel_name="hms.bank.payments", inverse_name="booking_id", string="Booking Payments")
|
||||
bank_payment_id = fields.Many2one(comodel_name="brosse.bank.transactions", string="Bank Payment ID")
|
||||
|
||||
75
bross_bank_management/models/bank_transactions.py
Normal file
75
bross_bank_management/models/bank_transactions.py
Normal file
@ -0,0 +1,75 @@
|
||||
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'
|
||||
|
||||
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')
|
||||
|
||||
bank_account_id = fields.Many2one('brosse.bank.account', string="Bank Account")
|
||||
|
||||
@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({
|
||||
'bank_payment_id': rec.id,
|
||||
'booking_id': booking.id,
|
||||
'currency_id': rec.currency_id.id,
|
||||
'amount': rec.amount,
|
||||
'exchange_rate': rec.exchange_rate,
|
||||
})
|
||||
@ -3,7 +3,9 @@ access_brosse_bank_user,access_brosse_bank,model_brosse_bank,base.group_user,1,1
|
||||
access_brosse_bank_account_user,access_brosse_bank_account,model_brosse_bank_account,base.group_user,1,1,1,1
|
||||
access_bank_settings_admin,access_bank_settings,model_bank_settings,base.group_system,1,1,1,1
|
||||
bross_bank_management.access_bank_raw_movements,access_bank_raw_movements,bross_bank_management.model_bank_raw_movements,base.group_user,1,1,1,1
|
||||
bross_bank_management.access_brosse_bank_deposits,access_brosse_bank_deposits,bross_bank_management.model_brosse_bank_deposits,base.group_user,1,1,1,1
|
||||
bross_bank_management.access_brosse_bank_transactions,access_brosse_bank_transactions,bross_bank_management.model_brosse_bank_transactions,base.group_user,1,1,1,1
|
||||
bross_bank_management.access_brosse_service_payments,access_brosse_service_payments,bross_bank_management.model_brosse_service_payments,base.group_user,1,1,1,1
|
||||
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_hms_bank_payments,access_hms_bank_payments,bross_bank_management.model_hms_bank_payments,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
|
||||
|
@ -6,19 +6,8 @@
|
||||
<field name="inherit_id" ref="bross_hms.view_hms_bookings_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<data>
|
||||
<xpath expr="//notebook/page[@name='room_stays']" position="before">
|
||||
<page name="bank_deposits" string="Bank Payments">
|
||||
<separator string="Bank Payments"/>
|
||||
<field name="bank_payment_ids">
|
||||
<list>
|
||||
<field name="bank_payment_id" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
<field name="amount"/>
|
||||
<field name="amount_left" readonly="1" force_save="1"/>
|
||||
<field name="exchange_rate" readonly="1" force_save="1"/>
|
||||
<field name="notes"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
<xpath expr="//field[@name='amount']" position="before">
|
||||
<field name="bank_payment_id" optional="hide" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
</xpath>
|
||||
</data>
|
||||
</field>
|
||||
|
||||
@ -1,22 +1,23 @@
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="action_process_selected_brosse_bank_deposits" model="ir.actions.server">
|
||||
<record id="action_process_selected_brosse_bank_transactions" model="ir.actions.server">
|
||||
<field name="name">Brosse Bank</field>
|
||||
<field name="model_id" ref="model_brosse_bank_deposits"/>
|
||||
<field name="binding_model_id" ref="model_brosse_bank_deposits"/>
|
||||
<field name="model_id" ref="model_brosse_bank_transactions"/>
|
||||
<field name="binding_model_id" ref="model_brosse_bank_transactions"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
action = records.action_process_selected_records()
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_brosse_bank_deposits_list" model="ir.ui.view">
|
||||
<field name="name">Deposits</field>
|
||||
<field name="model">brosse.bank.deposits</field>
|
||||
<record id="view_brosse_bank_transactions_operation_list" model="ir.ui.view">
|
||||
<field name="name">Transactions</field>
|
||||
<field name="model">brosse.bank.transactions</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Bank Deposits" editable="bottom">
|
||||
<list string="Bank Transactions" editable="bottom">
|
||||
<header>
|
||||
<button name="%(action_process_selected_brosse_bank_deposits)d" type="action" string="Add bank deposits" class="btn-primary"/>
|
||||
<button name="%(action_process_selected_brosse_bank_transactions)d" type="action" string="Add bank transactions" class="btn-primary"/>
|
||||
</header>
|
||||
<field name="bank_account_id"/>
|
||||
<field name="amount"/>
|
||||
@ -30,32 +31,34 @@
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_brosse_bank_deposits_tree" model="ir.ui.view">
|
||||
<field name="name">Deposits</field>
|
||||
<field name="model">brosse.bank.deposits</field>
|
||||
<record id="view_brosse_bank_transactions_list" model="ir.ui.view">
|
||||
<field name="name">Transactions</field>
|
||||
<field name="model">brosse.bank.transactions</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Bank Deposits" editable="bottom">
|
||||
<list string="Bank Transactions" editable="bottom">
|
||||
<field name="bank_account_id"/>
|
||||
<field name="amount"/>
|
||||
<field name="exchange_rate"/>
|
||||
<field name="exchange_rate_text"/>
|
||||
<field name="currency_id" optional="hide"/>
|
||||
<field name="description" optional="show"/>
|
||||
<field name="comment" optional="show"/>
|
||||
<field name="partner_name" optional="show"/>
|
||||
<field name="taxpayer_name" optional="show"/>
|
||||
<field name="currency_id" column_invisible='1'/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_brosse_bank_deposits" model="ir.actions.act_window">
|
||||
<field name="name">Bank Deposits</field>
|
||||
<field name="res_model">brosse.bank.deposits</field>
|
||||
<record id="action_brosse_bank_transactions" model="ir.actions.act_window">
|
||||
<field name="name">Bank Transactions</field>
|
||||
<field name="res_model">brosse.bank.transactions</field>
|
||||
<field name="view_mode">list</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_brosse_bank_deposits_root"
|
||||
name="Bank Deposits"
|
||||
<menuitem id="menu_brosse_bank_transactions_root"
|
||||
name="Bank Transactions"
|
||||
parent="bross_hms.finance_root_menu"
|
||||
action="action_brosse_bank_deposits"
|
||||
action="action_brosse_bank_transactions"
|
||||
sequence="10"/>
|
||||
</data>
|
||||
</odoo>
|
||||
@ -4,7 +4,7 @@
|
||||
<field name="name">Service Payments</field>
|
||||
<field name="model">brosse.service.payments</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Bank Deposits" editable="bottom">
|
||||
<list string="Payments" editable="bottom">
|
||||
<field name="amount"/>
|
||||
<field name="currency_id" invisible='1'/>
|
||||
</list>
|
||||
|
||||
3
bross_bank_management/wizard/__init__.py
Normal file
3
bross_bank_management/wizard/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import add_payments
|
||||
96
bross_bank_management/wizard/add_payments.py
Normal file
96
bross_bank_management/wizard/add_payments.py
Normal file
@ -0,0 +1,96 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class AddPayments(models.TransientModel):
|
||||
_name = "add.payments.wizard"
|
||||
_description = "Add Payments Wizard"
|
||||
|
||||
payment_type = fields.Many2one(comodel_name="hms.payment.types", string="Payment Type")
|
||||
|
||||
@api.model
|
||||
def _transaction_domain(self):
|
||||
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")
|
||||
pending_transcation = fields.Boolean(string="Pending Transaction")
|
||||
|
||||
amount_gel = fields.Monetary(string="Amount GEL", currency_field='gel_currency_id')
|
||||
gel_currency_id = fields.Many2one('res.currency', string='Gel Currency', default=lambda self: self.env['res.currency'].search([('name', '=', 'GEL')]).id)
|
||||
show_amount_gel = fields.Boolean(string="Show Amount GEL")
|
||||
|
||||
amount = fields.Monetary(string="Amount", currency_field='currency_id')
|
||||
currency_id = fields.Many2one('res.currency', string='Currency', default=lambda self: self.env['res.currency'].search([('name', '=', 'GEL')]).id)
|
||||
|
||||
exchange_rate = fields.Float(string="Exchange Rate")
|
||||
hide_exchange_rate = fields.Boolean(string="Hide Exchange Rate")
|
||||
|
||||
booking_id = fields.Many2one(comodel_name="hms.bookings", string="Booking ID")
|
||||
|
||||
expected_payment = fields.Monetary(string="Expected Payment", currency_field='expected_payment_currency')
|
||||
expected_payment_currency = fields.Many2one('res.currency', string='Expected Payment Currency')
|
||||
|
||||
pos_terminal_code = fields.Char(string="POS Terminal Code")
|
||||
wire_transfer_code = fields.Char(string="Wire Transfer Code")
|
||||
|
||||
@api.onchange('payment_type')
|
||||
def onchange_payment_type(self):
|
||||
if self.payment_type == self.env.ref('bross_hms.payment_type_1'):
|
||||
self.pending_transcation = True
|
||||
if self.payment_type == self.env.ref('bross_hms.payment_type_0') or not self.payment_type:
|
||||
self.pending_transcation = False
|
||||
|
||||
@api.onchange('transaction_id')
|
||||
def onchange_transaction_id(self):
|
||||
if self.transaction_id:
|
||||
self.amount = self.transaction_id.amount
|
||||
self.currency_id = self.transaction_id.currency_id
|
||||
|
||||
@api.onchange('currency_id')
|
||||
def onchange_currency_id(self):
|
||||
if self.currency_id:
|
||||
gel_currency = self.env['res.currency'].search([('name', '=', 'GEL')])
|
||||
if self.currency_id.id == gel_currency.id:
|
||||
self.exchange_rate = 1.0
|
||||
self.amount_gel = self.amount
|
||||
self.hide_exchange_rate = True
|
||||
else:
|
||||
self.exchange_rate = self.currency_id.rate_ids.sorted('id', reverse=True)[0].rate
|
||||
self.amount_gel = self.amount * self.exchange_rate
|
||||
self.show_amount_gel = True
|
||||
self.hide_exchange_rate = False
|
||||
|
||||
@api.onchange('exchange_rate')
|
||||
def onchange_exchange_rate(self):
|
||||
if self.exchange_rate:
|
||||
self.amount_gel = self.amount * self.exchange_rate
|
||||
|
||||
def add_payments(self):
|
||||
for rec in self:
|
||||
if rec.payment_type == self.env.ref('bross_hms.payment_type_0'):
|
||||
pending_transcation = False
|
||||
transaction_id = False
|
||||
pos_terminal_code = False
|
||||
wire_transfer_code = False
|
||||
elif rec.payment_type == self.env.ref('bross_hms.payment_type_1'):
|
||||
pending_transcation = rec.pending_transcation
|
||||
transaction_id = False
|
||||
pos_terminal_code = rec.pos_terminal_code
|
||||
wire_transfer_code = False
|
||||
else:
|
||||
pending_transcation = rec.pending_transcation
|
||||
transaction_id = rec.transaction_id.id if rec.transaction_id else False
|
||||
pos_terminal_code = False
|
||||
wire_transfer_code = rec.wire_transfer_code
|
||||
|
||||
self.env['hms.payments'].create({
|
||||
'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,
|
||||
'pos_terminal_code': pos_terminal_code,
|
||||
'wire_transfer_code': wire_transfer_code,
|
||||
})
|
||||
49
bross_bank_management/wizard/add_payments_view.xml
Normal file
49
bross_bank_management/wizard/add_payments_view.xml
Normal file
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="add_payments_wizard_view_form" model="ir.ui.view">
|
||||
<field name="name">add.payments.wizard.form</field>
|
||||
<field name="model">add.payments.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Add Payments">
|
||||
<group>
|
||||
<group>
|
||||
<field name="payment_type" required="1" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
|
||||
<field name="pending_transcation" widget="boolean_toggle" invisible="payment_type == 1" readonly="payment_type == 2" force_save="1"/>
|
||||
<field name="transaction_id" required="payment_type == 3 and pending_transcation == False" invisible="payment_type in (1,2) or pending_transcation == True" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
|
||||
<field name="amount_gel" invisible="show_amount_gel != True" readonly="1" force_save="1"/>
|
||||
<field name="gel_currency_id" invisible="1" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
|
||||
<field name="show_amount_gel" invisible="1"/>
|
||||
|
||||
<field name="amount" required="payment_type == 1"/>
|
||||
<field name="currency_id" required="1" readonly="payment_type == 3 and pending_transcation == False" force_save="1" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
|
||||
<field name="exchange_rate" required="1" invisible="hide_exchange_rate == True" force_save="1"/>
|
||||
<field name="hide_exchange_rate" invisible="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="pos_terminal_code" invisible="payment_type != 2"/>
|
||||
<field name="wire_transfer_code" invisible="payment_type != 3"/>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<group>
|
||||
|
||||
</group>
|
||||
<group>
|
||||
<field name="expected_payment" readonly="1" force_save="1"/>
|
||||
<field name="expected_payment_currency" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<footer>
|
||||
<button string="Add Payment" name="add_payments" type="object" class="oe_highlight" data-hotkey="q"/>
|
||||
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="x"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@ -13,6 +13,7 @@
|
||||
'security/ir.model.access.csv',
|
||||
# 'cron/crons.xml',
|
||||
'data/payment_methods.xml',
|
||||
'data/payment_types.xml',
|
||||
'data/service_kinds.xml',
|
||||
'views/misc_menus.xml',
|
||||
'views/main_menus.xml',
|
||||
@ -32,11 +33,12 @@
|
||||
'views/booking_source.xml',
|
||||
'views/bookings.xml',
|
||||
'views/status.xml',
|
||||
'views/hms_payments.xml',
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'bross_hms/static/src/scss/required.scss',
|
||||
],
|
||||
# 'web.assets_backend': [
|
||||
# 'bross_hms/static/src/scss/required.scss',
|
||||
# ],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
14
bross_hms/data/payment_types.xml
Normal file
14
bross_hms/data/payment_types.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="0">
|
||||
<record id="payment_type_0" model="hms.payment.types">
|
||||
<field name="name">Cash</field>
|
||||
</record>
|
||||
<record id="payment_type_1" model="hms.payment.types">
|
||||
<field name="name">POS Terminal</field>
|
||||
</record>
|
||||
<record id="payment_type_2" model="hms.payment.types">
|
||||
<field name="name">Wire Transfer</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@ -1,3 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import hms_models
|
||||
from . import hms_payments
|
||||
from . import hms_services
|
||||
|
||||
@ -158,6 +158,8 @@ class HmsBookings(models.Model):
|
||||
currencyId = fields.Char(string="Currency ID")
|
||||
customer = fields.Many2one(comodel_name="hms.customer", string="Customer")
|
||||
|
||||
payment_ids = fields.One2many(comodel_name="hms.payments", inverse_name="booking_id", string="Booking Payments")
|
||||
|
||||
roomStays = fields.One2many(comodel_name="hms.roomstays", inverse_name="bookings_id", string="RoomStays")
|
||||
|
||||
reservation_ids = fields.One2many(comodel_name="hms.reservations", inverse_name="bookingNumber", string="Reservation Ids")
|
||||
@ -211,19 +213,58 @@ class HmsBookings(models.Model):
|
||||
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'
|
||||
|
||||
def add_bank_deposits(self):
|
||||
# def add_bank_transactions(self):
|
||||
# return {
|
||||
# 'name': _('Add bank transactions'),
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'view_mode': 'list',
|
||||
# 'res_model': 'brosse.bank.transactions',
|
||||
# 'view_id': self.env.ref('bross_bank_management.view_brosse_bank_transactions_operation_list').id,
|
||||
# 'target': 'new',
|
||||
# 'context': {
|
||||
# 'booking_id': self.id,
|
||||
# 'create': False,
|
||||
# 'edit': False
|
||||
# }
|
||||
# }
|
||||
|
||||
def add_bank_transactions(self):
|
||||
gel_currency_id = self.env['res.currency'].search([('name', '=', 'GEL')])
|
||||
wire_transfer_id = self.env.ref('bross_hms.payment_type_2').id
|
||||
|
||||
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
|
||||
|
||||
expected_payment = expected_payment - paid_amount
|
||||
return {
|
||||
'name': 'Add bank deposit',
|
||||
'name': _('Add Payments'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'list',
|
||||
'view_type': 'form',
|
||||
'res_model': 'brosse.bank.deposits',
|
||||
# 'res_id': self.id,
|
||||
'view_id': self.env.ref('bross_bank_management.view_brosse_bank_deposits_list').id,
|
||||
'view_mode': 'form',
|
||||
'res_model': 'add.payments.wizard',
|
||||
'view_id': self.env.ref('bross_bank_management.add_payments_wizard_view_form').id,
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'booking_id': self.id,
|
||||
'create': False,
|
||||
'default_payment_type': wire_transfer_id,
|
||||
'default_booking_id': self.id,
|
||||
'default_gel_currency_id': gel_currency_id.id,
|
||||
'default_expected_payment': expected_payment,
|
||||
'default_expected_payment_currency': self.currency.id,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
56
bross_hms/models/hms_payments.py
Normal file
56
bross_hms/models/hms_payments.py
Normal file
@ -0,0 +1,56 @@
|
||||
# -*- 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 HmsPaymentTypes(models.Model):
|
||||
_name = 'hms.payment.types'
|
||||
_description = 'Hms Payment Types'
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
|
||||
|
||||
class HmsPayments(models.Model):
|
||||
_name = 'hms.payments'
|
||||
_description = 'Hms Payments'
|
||||
_rec_name = 'booking_id'
|
||||
|
||||
booking_id = fields.Many2one(comodel_name="hms.bookings", string="Booking ID")
|
||||
|
||||
hms_service_id = fields.Many2one(comodel_name="hms.services", string="Service")
|
||||
|
||||
hms_payment_type_id = fields.Many2one(comodel_name="hms.payment.types", string="Payment Type")
|
||||
|
||||
pending_transcation = fields.Boolean(string="Pending Transaction")
|
||||
|
||||
currency_id = fields.Many2one(comodel_name="res.currency", string="Currency")
|
||||
amount = fields.Monetary(string="Amount", currency_field='currency_id')
|
||||
exchange_rate = fields.Float(string="Exchange Rate")
|
||||
notes = fields.Text(string="Notes")
|
||||
|
||||
pos_terminal_code = fields.Char(string="POS Terminal Code")
|
||||
wire_transfer_code = fields.Char(string="Wire Transfer Code")
|
||||
|
||||
def open_payment_record(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'name': _('Payment'),
|
||||
'view_mode': 'form',
|
||||
'res_model': 'hms.payments',
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_id': self.env.ref('bross_hms.view_hms_payments_form').id,
|
||||
'res_id': self.id,
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'create': False,
|
||||
'edit': False
|
||||
}
|
||||
}
|
||||
11
bross_hms/models/hms_services.py
Normal file
11
bross_hms/models/hms_services.py
Normal file
@ -0,0 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import requests
|
||||
import logging
|
||||
import json
|
||||
from odoo import models, fields, api, _
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
@ -22,3 +22,6 @@ bross_hms.access_hms_services,access_hms_services,bross_hms.model_hms_services,b
|
||||
bross_hms.access_hms_payment_methods,access_hms_payment_methods,bross_hms.model_hms_payment_methods,base.group_user,1,1,1,1
|
||||
bross_hms.access_hms_booking_source,access_hms_booking_source,bross_hms.model_hms_booking_source,base.group_user,1,1,1,1
|
||||
bross_hms.access_hms_reservations,access_hms_reservations,bross_hms.model_hms_reservations,base.group_user,1,1,1,1
|
||||
|
||||
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
|
||||
|
||||
|
@ -6,13 +6,13 @@
|
||||
<field name="model">hms.bookings</field>
|
||||
<field name="arch" type="xml">
|
||||
<list>
|
||||
<button name="add_bank_transactions" type="object" string="Add bank transactions" class="btn btn-primary"/>
|
||||
<field name="bid"/>
|
||||
<field name="number"/>
|
||||
<field name="customerLanguage"/>
|
||||
<field name="lastModified"/>
|
||||
<field name="currencyId"/>
|
||||
<field name="sourceChannelName"/>
|
||||
<button name="add_bank_deposits" type="object" string="Add bank deposits" class="btn btn-primary"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
@ -21,9 +21,10 @@
|
||||
<field name="name">Reception</field>
|
||||
<field name="model">hms.bookings</field>
|
||||
<field name="arch" type="xml">
|
||||
<form edit="0">
|
||||
<form edit="1">
|
||||
<header>
|
||||
<button name="add_bank_deposits" type="object" string="Add bank deposits" class="btn btn-primary"/>
|
||||
<button name="add_bank_transactions" type="object" string="Add bank transactions" class="btn btn-primary"/>
|
||||
<field name="payment_status" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
@ -52,6 +53,7 @@
|
||||
<field name="roomstays_count"/>
|
||||
<field name="total_amount"/>
|
||||
<field name="to_be_paid"/>
|
||||
<field name="currency" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
@ -59,6 +61,23 @@
|
||||
</group>
|
||||
<group>
|
||||
<notebook>
|
||||
<page name="payments" string="Payments">
|
||||
<separator string="Payments"/>
|
||||
<field name="payment_ids">
|
||||
<list editable="bottom" create="1" delete="1" edit="1">
|
||||
<button name="open_payment_record" type="object" string="Open Payment" class="btn btn-primary"/>
|
||||
<field name="hms_payment_type_id" options="{'no_open': True, 'no_create': True, 'no_create_edit': True, 'no_quick_create': True}"/>
|
||||
<field name="amount"/>
|
||||
<field name="currency_id" optional="hide" readonly="1" force_save="1"/>
|
||||
<field name="exchange_rate" optional="show" readonly="1" force_save="1"/>
|
||||
<field name="create_date" optional="show"/>
|
||||
<field name="create_uid" optional="show"/>
|
||||
<field name="write_date" optional="show"/>
|
||||
<field name="write_uid" optional="show"/>
|
||||
<field name="notes"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
<page name="room_stays" string="Room Stays">
|
||||
<separator string="Room Stays"/>
|
||||
<field name="roomStays">
|
||||
|
||||
36
bross_hms/views/hms_payments.xml
Normal file
36
bross_hms/views/hms_payments.xml
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="view_hms_payments_list" model="ir.ui.view">
|
||||
<field name="name">Payments</field>
|
||||
<field name="model">hms.payments</field>
|
||||
<field name="arch" type="xml">
|
||||
<list>
|
||||
<field name="hms_payment_type_id"/>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="amount"/>
|
||||
<field name="exchange_rate"/>
|
||||
<field name="notes"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_hms_payments_form" model="ir.ui.view">
|
||||
<field name="name">Payments</field>
|
||||
<field name="model">hms.payments</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="hms_payment_type_id"/>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="amount"/>
|
||||
<field name="exchange_rate"/>
|
||||
<field name="notes"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@ -1,6 +1,6 @@
|
||||
services:
|
||||
db:
|
||||
image: postgres:17.0-alpine3.20
|
||||
image: postgres:17.1-alpine3.20
|
||||
restart: unless-stopped
|
||||
command: >
|
||||
-c max_wal_size=4GB
|
||||
@ -30,7 +30,7 @@ services:
|
||||
- logging_jobname=containerlogs
|
||||
|
||||
nginx:
|
||||
image: nginx:1.27.0-alpine3.19-slim
|
||||
image: nginx:1.27.2-alpine3.20-slim
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
.env
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
services:
|
||||
db:
|
||||
image: postgres:17.0-alpine3.20
|
||||
image: postgres:17.1-alpine3.20
|
||||
restart: unless-stopped
|
||||
command: >
|
||||
-c max_wal_size=4GB
|
||||
@ -32,7 +32,7 @@ services:
|
||||
- logging_jobname=containerlogs
|
||||
|
||||
nginx:
|
||||
image: nginx:1.27.0-alpine3.19-slim
|
||||
image: nginx:1.27.2-alpine3.20-slim
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3080:80
|
||||
|
||||
27
restore_buttons/LICENSE
Normal file
27
restore_buttons/LICENSE
Normal file
@ -0,0 +1,27 @@
|
||||
Odoo Proprietary License v1.0
|
||||
|
||||
This software and associated files (the "Software") may only be used (executed,
|
||||
modified, executed after modifications) if you have purchased a valid license
|
||||
from the authors, typically via Odoo Apps, or if you have received a written
|
||||
agreement from the authors of the Software (see the COPYRIGHT file).
|
||||
|
||||
You may develop Odoo modules that use the Software as a library (typically
|
||||
by depending on it, importing it and using its resources), but without copying
|
||||
any source code or material from the Software. You may distribute those
|
||||
modules under the license of your choice, provided that this license is
|
||||
compatible with the terms of the Odoo Proprietary License (For example:
|
||||
LGPL, MIT, or proprietary licenses similar to this one).
|
||||
|
||||
It is forbidden to publish, distribute, sublicense, or sell copies of the Software
|
||||
or modified copies of the Software.
|
||||
|
||||
The above copyright notice and this permission notice must be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
0
restore_buttons/__init__.py
Normal file
0
restore_buttons/__init__.py
Normal file
29
restore_buttons/__manifest__.py
Normal file
29
restore_buttons/__manifest__.py
Normal file
@ -0,0 +1,29 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': "Restore Action, Save & Discard Buttons",
|
||||
'summary': """Restore old actions, save and discard buttons.""",
|
||||
'description': """Restore old actions, save and discard buttons.""",
|
||||
'author': "mgite",
|
||||
# 'website': "https://example.com",
|
||||
'price': '5.5',
|
||||
'currency': 'EUR',
|
||||
'support': 'matemana2608@gmail.com',
|
||||
'license': 'OPL-1',
|
||||
'category': 'Services',
|
||||
'version': '18.0.1.0.0',
|
||||
'images': ['static/description/wallpaper.png'],
|
||||
'depends': [
|
||||
'web',
|
||||
],
|
||||
'data': [],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'restore_buttons/static/src/scss/*.scss',
|
||||
'restore_buttons/static/src/xml/*.xml',
|
||||
],
|
||||
},
|
||||
'installable': True,
|
||||
'application': True,
|
||||
'auto_install': False,
|
||||
'bootstrap': True,
|
||||
}
|
||||
BIN
restore_buttons/static/description/gifs/action_save_discard.gif
Normal file
BIN
restore_buttons/static/description/gifs/action_save_discard.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 616 KiB |
BIN
restore_buttons/static/description/icon.png
Normal file
BIN
restore_buttons/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
26
restore_buttons/static/description/index.html
Normal file
26
restore_buttons/static/description/index.html
Normal file
@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<title>Restore Buttons</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
|
||||
</head>
|
||||
|
||||
<body style="background: #f3f3f3;">
|
||||
<section class="mb-5">
|
||||
<div class="container text-center">
|
||||
<h1 class="pb-4 d-flex justify-content-center" style="color: #a3498b;">
|
||||
<span class="ml-2">Demonstration</span>
|
||||
</h1>
|
||||
<p class="mb-5" style="font-size: 26px;font-weight: 500;letter-spacing: 0.02em;color: #535456;">
|
||||
Restore old actions, save and discard buttons
|
||||
</p>
|
||||
</div>
|
||||
<div class="container text-left mb-5">
|
||||
<img src="./gifs/action_save_discard.gif" class="img img-fluid"/>
|
||||
</div>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
BIN
restore_buttons/static/description/wallpaper.png
Normal file
BIN
restore_buttons/static/description/wallpaper.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
44
restore_buttons/static/src/scss/actions_dropdown.scss
Normal file
44
restore_buttons/static/src/scss/actions_dropdown.scss
Normal file
@ -0,0 +1,44 @@
|
||||
.o-dropdown {
|
||||
margin-left: 10px;
|
||||
|
||||
.dropdown-toggle {
|
||||
width: 100%;
|
||||
|
||||
&.dropdown-toggle.d-print-none {
|
||||
background-color: transparent;
|
||||
border-color: $primary;
|
||||
color: $primary;
|
||||
|
||||
&:hover {
|
||||
filter: brightness(0.9);
|
||||
background-color: $primary;
|
||||
border-color: $primary;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown_actions_button {
|
||||
width: 100%;
|
||||
font-weight: 500;
|
||||
color: white;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
user-select: none;
|
||||
background-color: transparent;
|
||||
border: 1px solid transparent;
|
||||
padding: 0.3125rem 0.625rem;
|
||||
font-size: 0.875rem;
|
||||
line-height: 1.5;
|
||||
border-radius: 1;
|
||||
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
||||
text-transform: uppercase;
|
||||
font-family: "Your Font Stack Here";
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.o_control_panel_breadcrumbs {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
8
restore_buttons/static/src/xml/actions_dropdown.xml
Normal file
8
restore_buttons/static/src/xml/actions_dropdown.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<templates>
|
||||
<t t-name="restore_buttons.CogMenu" t-inherit="web.CogMenu" t-inherit-mode="extension" owl="1">
|
||||
<xpath expr="//i[(hasclass('fa-cog'))]" position="replace">
|
||||
<span class="dropdown_actions_button info dropdown-toggle d-print-none btn">Actions</span>
|
||||
</xpath>
|
||||
</t>
|
||||
</templates>
|
||||
44
restore_buttons/static/src/xml/breadcrumbs.xml
Normal file
44
restore_buttons/static/src/xml/breadcrumbs.xml
Normal file
@ -0,0 +1,44 @@
|
||||
<templates>
|
||||
<t t-name="restore_buttons.Breadcrumbs" t-inherit="web.Breadcrumbs" t-inherit-mode="extension" owl="1">
|
||||
<xpath expr="//div[(hasclass('flex-md-column'))]" position="replace">
|
||||
<div t-if="collapsedBreadcrumbs.length || visiblePathBreadcrumbs.length" class="o_breadcrumb d-flex flex-row align-items-center align-self-stretch justify-content-between min-w-0">
|
||||
<t t-if="env.isSmall">
|
||||
<t t-set="previousBreadcrumb" t-value="visiblePathBreadcrumbs.at(-1)"/>
|
||||
<button class="o_back_button btn btn-link d-print-none px-1 py-0" t-on-click.prevent="previousBreadcrumb.onSelected">
|
||||
<i class="oi oi-fw oi-arrow-left"/>
|
||||
</button>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<ol class="breadcrumb flex-nowrap text-nowrap" style="font-size: 0.875rem; line-height: 1.5; padding-left: 4px; padding-right: 4px;">
|
||||
<li t-if="collapsedBreadcrumbs.length" class="breadcrumb-item d-inline-flex min-w-0">
|
||||
<Dropdown>
|
||||
<button class="btn btn-light btn-sm px-1 p-0">
|
||||
<i class="fa fa-ellipsis-h"/>
|
||||
</button>
|
||||
<t t-set-slot="content">
|
||||
<t t-foreach="collapsedBreadcrumbs" t-as="breadcrumb" t-key="breadcrumb.jsId">
|
||||
<DropdownItem onSelected="breadcrumb.onSelected"
|
||||
attrs="{ href: breadcrumb.url, 'data-tooltip': 'Back to "' + breadcrumb.name + '"' + (breadcrumb.isFormView ? ' form' : '')}">
|
||||
<t t-call="web.Breadcrumb.Name"/>
|
||||
</DropdownItem>
|
||||
</t>
|
||||
</t>
|
||||
</Dropdown>
|
||||
</li>
|
||||
<t t-foreach="visiblePathBreadcrumbs" t-as="breadcrumb" t-key="breadcrumb.jsId">
|
||||
<li class="breadcrumb-item d-inline-flex min-w-0" t-att-class="{ o_back_button: breadcrumb_last }" t-att-data-hotkey="breadcrumb_last and 'b'" t-on-click.prevent="breadcrumb.onSelected">
|
||||
<a t-att-href="breadcrumb.url" class="fw-bold text-truncate" t-att-data-tooltip="'Back to "' + breadcrumb.name + '"' + (breadcrumb.isFormView ? ' form' : '')"><t t-call="web.Breadcrumb.Name"/></a>
|
||||
</li>
|
||||
</t>
|
||||
</ol>
|
||||
</t>
|
||||
<div class="d-flex gap-1 text-truncate" style="font-size: 0.875rem; line-height: 1.5;">
|
||||
<div class="o_last_breadcrumb_item active d-flex gap-2 align-items-center min-w-0 lh-sm">
|
||||
<span class="min-w-0 text-truncate" t-call="web.Breadcrumb.Name"/>
|
||||
</div>
|
||||
<t t-call="web.Breadcrumb.Actions"/>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</t>
|
||||
</templates>
|
||||
10
restore_buttons/static/src/xml/save_discard.xml
Normal file
10
restore_buttons/static/src/xml/save_discard.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<templates>
|
||||
<t t-name="restore_buttons.actionsavediscard" t-inherit="web.FormStatusIndicator" t-inherit-mode="extension" owl="1">
|
||||
<xpath expr="//button/i[(hasclass('fa-times'))]" position="replace">
|
||||
<span class="discard_button btn btn-outline-primary">Discard</span>
|
||||
</xpath>
|
||||
<xpath expr="//button/i[(hasclass('fa-cloud-upload'))]" position="replace">
|
||||
<span class="save_button btn btn-primary">Save</span>
|
||||
</xpath>
|
||||
</t>
|
||||
</templates>
|
||||
Loading…
Reference in New Issue
Block a user