Add crons and models
Some checks failed
Update odoo 18 / update (push) Failing after 15m16s

This commit is contained in:
mgite 2024-10-31 15:48:37 +04:00
parent ca6a342f0e
commit f2f7eb0756
14 changed files with 291 additions and 30 deletions

2
.env
View File

@ -15,5 +15,5 @@ PASSWORD="odoo"
ADDONS="--addons-path=/opt/odoo/addons/,/opt/odoo/customaddons/$CUSTOMADDONS_DIR" ADDONS="--addons-path=/opt/odoo/addons/,/opt/odoo/customaddons/$CUSTOMADDONS_DIR"
# ARGS="" # ARGS=""
# ARGS="-d bross" # ARGS="-d bross"
#ARGS="-d cybro_hms -u bross_hms,exely_integration,bross_bank_management" ARGS="-d cybro_hms -u bross_hms,exely_integration,bross_bank_management"
# DEBUG="-m debugpy --listen 0.0.0.0:5678 --wait-for-client" # DEBUG="-m debugpy --listen 0.0.0.0:5678 --wait-for-client"

View File

@ -10,38 +10,46 @@ headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
} }
#url = "https://connect.hopenapi.com/api/exelypms/v1/analytics/services" #url = "https://connect.hopenapi.com/api/exelypms/v1/analytics/services"
#payload = {'startDate': '20240909', 'endDate': '20240910', 'dateKind': 0, 'language': 'en'} #payload = {'startDate': '20240909', 'endDate': '20240910', 'dateKind': 0, 'language': 'en'}
#response = requests.get(url, data=payload, headers=headers) #response = requests.get(url, data=payload, headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/services?startDate=20241008&endDate=20241008&dateKind=4", headers=headers) # SERVICES TIME PERIODS
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20240301-503875-1211582391", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/services?startDate=20241008&endDate=20241008&dateKind=0", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241217-503875-1220773707", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/services/cancelled?startDate=20241008&endDate=20241008&dateKind=0", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20240122-503875-1210423183", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20240909-503875-1219004943", headers=headers) # PAYMENTS TIME PERIOD
response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/payments?startDateTime=202408010000&endDateTime=202408072359&includeServices=true", headers=headers)
# BOOKINGS TIME PERIOD
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings?modifiedFrom=2024-01-01T00:00&modifiedTo=2024-01-30T23:59&state=Active", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings?modifiedFrom=2024-01-01T00:00&modifiedTo=2024-01-30T23:59&state=Cancelled", headers=headers)
# BOOKING
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184", headers=headers) # Room move # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184", headers=headers) # Room move
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/guests/9007199255607320", headers=headers) # INVOICES
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184/invoices?language=en", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/companies", headers=headers)
# BOOKINGS ROOMS
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184/rooms", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184/rooms", headers=headers)
# ALL COMPANIES
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/companies", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/services", headers=headers) # GUESTS needs guest id
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/guests/9007199255607320", headers=headers)
# ROOM STAYS needs guest id
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/guests/9007199255607320/room-stays", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/payments", headers=headers) # ALL ROOMS
response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/payments?startDateTime=202408010000&endDateTime=202408012359&includeServices=true", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings?modifiedFrom=2024-01-01T00:00&modifiedTo=2024-01-30T23:59&state=Active", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings?modifiedFrom=2024-01-31T23:59&modifiedTo=2024-02-290T23:59&state=Active", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings?modifiedFrom=2024-10-08T20:00&modifiedTo=2024-10-08T22:00&state=Cancelled", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms?roomTypeId=5020078", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms?roomTypeId=5020078", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms?roomTypeId=5019645", headers=headers) # response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms?roomTypeId=5019645", headers=headers)
if response.status_code == 200: if response.status_code == 200:
data = response.json() data = response.json()
print(data) print(data)

View File

@ -12,10 +12,12 @@
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'data/bank_conf.xml', 'data/bank_conf.xml',
'cron/crons.xml',
'views/main_menu.xml', 'views/main_menu.xml',
'views/bank_views.xml', 'views/bank_views.xml',
'views/bank_account_views.xml', 'views/bank_account_views.xml',
'views/bank_settings_views.xml', 'views/bank_settings_views.xml',
'views/raw_movements.xml',
], ],
'installable': True, 'installable': True,
'application': True, 'application': True,

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1">
<record id="ir_cron_get_movements_data" model="ir.cron">
<field name="name">Get Movements Data</field>
<field name="model_id" ref="model_bank_raw_movements"/>
<field name="state">code</field>
<field name="code">model.get_movements()</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="active" eval="False"/>
<field name="priority">100</field>
</record>
</data>
</odoo>

View File

@ -1,3 +1,4 @@
from . import bank from . import bank
from . import bank_account from . import bank_account
from . import bank_settings from . import bank_settings
from . import bank_models

View File

@ -0,0 +1,57 @@
import base64
import tempfile
import hashlib
import json
import os
from odoo import models, fields, _
from tbc_bank_integration_service_lib.client import TBCBankClient
from odoo.exceptions import UserError
class BankMovements(models.Model):
_name = 'bank.raw.movements'
_description = 'Bank Movements'
json_data = fields.Json(string="Json Data")
json_hash_code = fields.Char(string="Hash Code")
bid = fields.Char(string="Movement Id")
parent_id = fields.Many2one('bank.raw.movements', string="Parent Record")
history_ids = fields.One2many(comodel_name="bank.raw.movements", inverse_name='parent_id', string="History")
def create_or_update_raw_data(self, data, model, bid):
json_data = json.dumps(data, sort_keys=True, indent=4, ensure_ascii=False)
hash_object = hashlib.sha256(json_data.encode())
hash_hex = hash_object.hexdigest()
found_raw_record = self.env[model].search([
('bid', '=', bid),
])
if found_raw_record:
if found_raw_record.json_hash_code != hash_hex:
# found_raw_record.write({
# 'json_data': json_data,
# 'json_hash_code': hash_hex
# })
new_created_record = self.env[model].create({
'json_data': json_data,
'json_hash_code': hash_hex,
'bid': bid,
})
found_raw_record.parent_id = new_created_record.id
else:
found_raw_record = self.env[model].create({
'json_data': json_data,
'json_hash_code': hash_hex,
'bid': bid
})
def get_movements(self):
client = self.env['bank.settings'].get_request_object()
try:
movement_id = '013762510743.2'
movements_by_id = client.get_account_movements_by_id('111111', movement_id)
self.create_or_update_raw_data(movements_by_id, 'bank.raw.movements', movements_by_id['data'].get('movementId'))
except Exception as e:
_logger.error(e)

View File

@ -19,18 +19,19 @@ class BankSettings(models.Model):
nonce = fields.Char(string='Nonce', required=True) nonce = fields.Char(string='Nonce', required=True)
def get_request_object(self): def get_request_object(self):
cert_data = base64.b64decode(self.cert_file_path) config = self.env.ref('bross_bank_management.bank_api_configuration')
cert_data = base64.b64decode(config.cert_file_path)
with tempfile.NamedTemporaryFile(delete=False, suffix='.pfx') as temp_cert_file: with tempfile.NamedTemporaryFile(delete=False, suffix='.pfx') as temp_cert_file:
temp_cert_file.write(cert_data) temp_cert_file.write(cert_data)
temp_cert_file_path = temp_cert_file.name temp_cert_file_path = temp_cert_file.name
client = TBCBankClient( client = TBCBankClient(
self.wsdl_url, config.wsdl_url,
temp_cert_file_path, temp_cert_file_path,
self.cert_password, config.cert_password,
self.username, config.username,
self.current_password config.current_password
) )
return client return client

View File

@ -2,3 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_brosse_bank_user,access_brosse_bank,model_brosse_bank,base.group_user,1,1,1,1 access_brosse_bank_user,access_brosse_bank,model_brosse_bank,base.group_user,1,1,1,1
access_brosse_bank_account_user,access_brosse_bank_account,model_brosse_bank_account,base.group_user,1,1,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 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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_brosse_bank_user access_brosse_bank model_brosse_bank base.group_user 1 1 1 1
3 access_brosse_bank_account_user access_brosse_bank_account model_brosse_bank_account base.group_user 1 1 1 1
4 access_bank_settings_admin access_bank_settings model_bank_settings base.group_system 1 1 1 1
5 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

View File

@ -0,0 +1,60 @@
<odoo>
<data>
<record id="view_bank_raw_movements_list" model="ir.ui.view">
<field name="name">bank.raw.movements.list</field>
<field name="model">bank.raw.movements</field>
<field name="arch" type="xml">
<list>
<field name="json_data"/>
<field name="json_hash_code"/>
<field name="create_date"/>
<field name="write_date"/>
</list>
</field>
</record>
<record id="view_bank_raw_movements_form" model="ir.ui.view">
<field name="name">bank.raw.movements.form</field>
<field name="model">bank.raw.movements</field>
<field name="arch" type="xml">
<form edit="0">
<header>
</header>
<sheet>
<group class="oe_title">
<h1><field name="bid"/></h1>
</group>
<group>
<field name="json_hash_code"/>
<field name="json_data"/>
</group>
<group>
<field name="create_date"/>
<field name="write_date"/>
</group>
<group>
<field name="history_ids">
<list editable="bottom">
<field name="bid"/>
<field name="json_data"/>
<field name="json_hash_code"/>
<field name="create_date"/>
<field name="write_date"/>
</list>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="bank_raw_movements_action" model="ir.actions.act_window">
<field name="name">Bank Raw Movements</field>
<field name="res_model">bank.raw.movements</field>
<field name="view_mode">list,form</field>
</record>
<menuitem id="menu_bank_raw_movements_submenu" name="Bank Raw Movements" parent="bank_management_submenu" sequence="40" action="bank_raw_movements_action" groups="base.group_system"/>
</data>
</odoo>

View File

@ -22,6 +22,7 @@
'views/raw_customers.xml', 'views/raw_customers.xml',
'views/raw_roomstays.xml', 'views/raw_roomstays.xml',
'views/raw_guests.xml', 'views/raw_guests.xml',
'views/raw_payments.xml',
], ],
# only loaded in demonstration mode # only loaded in demonstration mode
'demo': [ 'demo': [

View File

@ -12,6 +12,17 @@
<field name="priority">100</field> <field name="priority">100</field>
</record> </record>
<record id="ir_cron_get_exely_payments" model="ir.cron">
<field name="name">Get Exely Payments</field>
<field name="model_id" ref="model_exely_modified_bookings"/>
<field name="state">code</field>
<field name="code">model.get_exely_payments()</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="active" eval="False"/>
<field name="priority">100</field>
</record>
<record id="ir_cron_process_exely_data" model="ir.cron"> <record id="ir_cron_process_exely_data" model="ir.cron">
<field name="name">Process Exely Data</field> <field name="name">Process Exely Data</field>
<field name="model_id" ref="model_exely_modified_bookings"/> <field name="model_id" ref="model_exely_modified_bookings"/>

View File

@ -88,6 +88,18 @@ class ExelyRawGuests(models.Model):
history_ids = fields.One2many(comodel_name="exely.raw.guests", inverse_name='parent_id', string="History") history_ids = fields.One2many(comodel_name="exely.raw.guests", inverse_name='parent_id', string="History")
class ExelyRawPayments(models.Model):
_name = 'exely.raw.payments'
_description = 'Exely Raw Payments'
json_data = fields.Json(string="Json Data")
json_hash_code = fields.Char(string="Hash Code")
bid = fields.Char(string="Guest Id")
parent_id = fields.Many2one('exely.raw.payments', string="Parent Record")
history_ids = fields.One2many(comodel_name="exely.raw.payments", inverse_name='parent_id', string="History")
class ExelyModifiedData(models.Model): class ExelyModifiedData(models.Model):
_name = 'exely.modified.bookings' _name = 'exely.modified.bookings'
_description = 'Exely Modified Bookings' _description = 'Exely Modified Bookings'
@ -98,13 +110,13 @@ class ExelyModifiedData(models.Model):
booking_number = fields.Char(string="Booking Number") booking_number = fields.Char(string="Booking Number")
status = fields.Char(string="Status") status = fields.Char(string="Status")
def generate_date_ranges(self, start_date, end_date): def generate_date_ranges(self, start_date, end_date, period, format):
date_ranges = [] date_ranges = []
current_date = start_date current_date = start_date
while current_date < end_date: while current_date < end_date:
period_start = current_date.replace(hour=0, minute=0, second=0, microsecond=0) period_start = current_date.replace(hour=0, minute=0, second=0, microsecond=0)
period_end = min(current_date + timedelta(days=29), end_date) period_end = min(current_date + timedelta(days=period), end_date)
if period_end.date() < end_date.date(): if period_end.date() < end_date.date():
period_end = period_end.replace(hour=23, minute=59) period_end = period_end.replace(hour=23, minute=59)
@ -112,8 +124,8 @@ class ExelyModifiedData(models.Model):
period_end = end_date period_end = end_date
date_ranges.append(( date_ranges.append((
period_start.strftime("%Y-%m-%dT%H:%M"), period_start.strftime(format),
period_end.strftime("%Y-%m-%dT%H:%M") period_end.strftime(format)
)) ))
current_date = period_end + timedelta(days=1) current_date = period_end + timedelta(days=1)
@ -155,6 +167,30 @@ class ExelyModifiedData(models.Model):
'bid': bid 'bid': bid
}) })
def get_exely_payments(self):
exely_api_conf = self.env['exely.api.conf'].search([], limit=1)
if exely_api_conf:
headers = {
'X-API-KEY': exely_api_conf.api_key,
'Content-Type': 'application/json',
}
else:
raise UserError(_("Please configure Exely API Key"))
start_date = datetime(2024, 1, 1)
end_date = datetime.now()
date_ranges = self.generate_date_ranges(start_date, end_date, 7, "%Y%m%d%H%M")
to_create = []
for start, end in date_ranges:
print(f"{start} to {end}")
payments = self.get_exely_data_api(f"https://connect.hopenapi.com/api/exelypms/v1/analytics/payments?startDateTime={start}&endDateTime={end}&includeServices=true", headers)
if payments:
self.create_or_update_raw_data(payments, 'exely.raw.payments', f"{start}{end}")
def get_exely_data(self): def get_exely_data(self):
exely_api_conf = self.env['exely.api.conf'].search([], limit=1) exely_api_conf = self.env['exely.api.conf'].search([], limit=1)
if exely_api_conf: if exely_api_conf:
@ -179,7 +215,7 @@ class ExelyModifiedData(models.Model):
start_date = datetime(2024, 1, 1) start_date = datetime(2024, 1, 1)
end_date = datetime.now() end_date = datetime.now()
date_ranges = self.generate_date_ranges(start_date, end_date) date_ranges = self.generate_date_ranges(start_date, end_date, 29, "%Y-%m-%dT%H:%M")
to_create = [] to_create = []
for status in STATES: for status in STATES:

View File

@ -8,3 +8,4 @@ exely_integration.access_exely_raw_rooms,access_exely_raw_rooms,exely_integratio
exely_integration.access_exely_raw_customers,access_exely_raw_customers,exely_integration.model_exely_raw_customers,base.group_user,1,1,1,1 exely_integration.access_exely_raw_customers,access_exely_raw_customers,exely_integration.model_exely_raw_customers,base.group_user,1,1,1,1
exely_integration.access_exely_raw_roomstays,access_exely_raw_roomstays,exely_integration.model_exely_raw_roomstays,base.group_user,1,1,1,1 exely_integration.access_exely_raw_roomstays,access_exely_raw_roomstays,exely_integration.model_exely_raw_roomstays,base.group_user,1,1,1,1
exely_integration.access_exely_raw_guests,access_exely_raw_guests,exely_integration.model_exely_raw_guests,base.group_user,1,1,1,1 exely_integration.access_exely_raw_guests,access_exely_raw_guests,exely_integration.model_exely_raw_guests,base.group_user,1,1,1,1
exely_integration.access_exely_raw_payments,access_exely_raw_payments,exely_integration.model_exely_raw_payments,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
8 exely_integration.access_exely_raw_roomstays access_exely_raw_roomstays exely_integration.model_exely_raw_roomstays base.group_user 1 1 1 1
9 exely_integration.access_exely_raw_guests access_exely_raw_guests exely_integration.model_exely_raw_guests base.group_user 1 1 1 1
10 exely_integration.access_exely_raw_payments access_exely_raw_payments exely_integration.model_exely_raw_payments base.group_user 1 1 1 1
11

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<record model="ir.ui.view" id="exely_raw_payments_view_list">
<field name="name">exely.raw.payments.list</field>
<field name="model">exely.raw.payments</field>
<field name="arch" type="xml">
<list>
<field name="bid"/>
<field name="json_data"/>
<field name="json_hash_code"/>
<field name="create_date"/>
<field name="write_date"/>
</list>
</field>
</record>
<record model="ir.ui.view" id="exely_raw_payments_view_form">
<field name="name">exely.raw.payments.form</field>
<field name="model">exely.raw.payments</field>
<field name="arch" type="xml">
<form edit="0">
<header>
</header>
<sheet>
<group class="oe_title">
<h1><field name="bid"/></h1>
</group>
<group>
<field name="json_hash_code"/>
<field name="json_data"/>
</group>
<group>
<field name="create_date"/>
<field name="write_date"/>
</group>
<group>
<field name="history_ids">
<list editable="bottom">
<field name="bid"/>
<field name="json_data"/>
<field name="json_hash_code"/>
<field name="create_date"/>
<field name="write_date"/>
</list>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="exely_raw_payments_action">
<field name="name">exely.raw.payments</field>
<field name="res_model">exely.raw.payments</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create your first raw payments record.
</p>
</field>
</record>
<menuitem name="Raw Payments" id="exely_raw_payments_submenu" parent="exely_integration_submenu" action="exely_raw_payments_action" sequence="80"/>
</data>
</odoo>