Compare commits

..

No commits in common. "44ea1dea36d024d53d796338316f3a2d3aa8d419" and "228ab20a7589ea212ff52355cfb6892f1cd54f8c" have entirely different histories.

19 changed files with 44 additions and 345 deletions

2
.env
View File

@ -15,5 +15,5 @@ PASSWORD="odoo"
ADDONS="--addons-path=/opt/odoo/addons/,/opt/odoo/customaddons/$CUSTOMADDONS_DIR"
# ARGS=""
# 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"

View File

@ -44,8 +44,6 @@ jobs:
export SSHPASS=${{ secrets.SERVER_SSH_PASSWORD }}
export STACK_PATH="/home/sysop/odoo18/customaddons/bross_hms"
git config --global --add safe.directory $STACK_PATH
### Get modules list to update
modules_to_update=$(git diff --name-only ${{ gitea.event.before }}..${{ gitea.event.after }} | awk -F/ '{print $1}' | uniq | xargs -I {} sh -c 'find {} -type f -name "__manifest__.py" | grep -q "__manifest__.py" && echo {}' 2>/dev/null | sed -z 's/\n/,/g; s/,$/\n/')
echo $modules_to_update
@ -60,3 +58,7 @@ jobs:
${{ secrets.SERVER_SSH_USER }}@${{ secrets.SERVER_SSH_HOST }} \
"cd $STACK_PATH && git pull && docker compose -f docker-compose-dev.yml down && export ARGS='${args}' && docker compose -f docker-compose-dev.yml up -d"
fi

View File

@ -10,48 +10,38 @@ headers = {
'Content-Type': 'application/json',
}
#url = "https://connect.hopenapi.com/api/exelypms/v1/analytics/services"
#payload = {'startDate': '20240909', 'endDate': '20240910', 'dateKind': 0, 'language': 'en'}
#response = requests.get(url, data=payload, headers=headers)
# SERVICES TIME PERIODS
# 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/analytics/services/cancelled?startDate=20241008&endDate=20241008&dateKind=0", 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/analytics/services?startDate=20241008&endDate=20241008&dateKind=4", headers=headers)
# 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/bookings/20241217-503875-1220773707", 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)
# 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/20241106-503875-1217522037", headers=headers) # Cancelled booking
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20240727-503875-1216958604", headers=headers)
# INVOICES
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184/invoices?language=en", headers=headers)
# BOOKINGS ROOMS
# 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/guests/9007199255607320", 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/companies", headers=headers)
# GUESTS needs guest id
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/guests/9007199255607320", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/bookings/20241009-503875-1220777184/rooms", headers=headers)
# ROOM STAYS needs guest id
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/guests/9007199255607320/room-stays", headers=headers)
# ALL ROOMS
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/services", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/analytics/payments", headers=headers)
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?roomTypeId=5020078", headers=headers)
# response = requests.get("https://connect.hopenapi.com/api/exelypms/v1/rooms?roomTypeId=5019645", headers=headers)
if response.status_code == 200:
data = response.json()
print(data)

View File

@ -12,12 +12,10 @@
'data': [
'security/ir.model.access.csv',
'data/bank_conf.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',
],
'installable': True,
'application': True,

View File

@ -1,15 +0,0 @@
<?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,4 +1,3 @@
from . import bank
from . import bank_account
from . import bank_settings
from . import bank_models

View File

@ -1,57 +0,0 @@
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

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

View File

@ -2,4 +2,3 @@ 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_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
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
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

@ -1,60 +0,0 @@
<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

@ -8,11 +8,10 @@
'category': 'Uncategorized',
'version': '18.0.1.0.0',
'license': 'OPL-1',
'depends': ['base', 'auth_signup'],
'depends': ['base'],
'data': [
'security/ir.model.access.csv',
# 'cron/crons.xml',
'views/misc_menus.xml',
'views/main_menus.xml',
'views/emails.xml',
'views/phones.xml',

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem
name="Misc_menus"
id="bross_hms.bross_hms_misc_menus"
parent="base.menu_administration"
sequence="10"/>
<menuitem
name="Discuss"
id="mail.menu_root_discuss"
action="mail.action_discuss"
groups="base.group_user"
sequence="5"
parent="bross_hms.bross_hms_misc_menus"/>
<menuitem
id="base.menu_management"
name="Apps"
sequence="500"
groups="base.group_system"
parent="bross_hms.bross_hms_misc_menus"/>
</odoo>

View File

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

View File

@ -12,17 +12,6 @@
<field name="priority">100</field>
</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">
<field name="name">Process Exely Data</field>
<field name="model_id" ref="model_exely_modified_bookings"/>

View File

@ -88,18 +88,6 @@ class ExelyRawGuests(models.Model):
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):
_name = 'exely.modified.bookings'
_description = 'Exely Modified Bookings'
@ -110,13 +98,13 @@ class ExelyModifiedData(models.Model):
booking_number = fields.Char(string="Booking Number")
status = fields.Char(string="Status")
def generate_date_ranges(self, start_date, end_date, period, format):
def generate_date_ranges(self, start_date, end_date):
date_ranges = []
current_date = start_date
while current_date < end_date:
period_start = current_date.replace(hour=0, minute=0, second=0, microsecond=0)
period_end = min(current_date + timedelta(days=period), end_date)
period_end = min(current_date + timedelta(days=29), end_date)
if period_end.date() < end_date.date():
period_end = period_end.replace(hour=23, minute=59)
@ -124,8 +112,8 @@ class ExelyModifiedData(models.Model):
period_end = end_date
date_ranges.append((
period_start.strftime(format),
period_end.strftime(format)
period_start.strftime("%Y-%m-%dT%H:%M"),
period_end.strftime("%Y-%m-%dT%H:%M")
))
current_date = period_end + timedelta(days=1)
@ -167,30 +155,6 @@ class ExelyModifiedData(models.Model):
'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):
exely_api_conf = self.env['exely.api.conf'].search([], limit=1)
if exely_api_conf:
@ -215,7 +179,7 @@ class ExelyModifiedData(models.Model):
start_date = datetime(2024, 1, 1)
end_date = datetime.now()
date_ranges = self.generate_date_ranges(start_date, end_date, 29, "%Y-%m-%dT%H:%M")
date_ranges = self.generate_date_ranges(start_date, end_date)
to_create = []
for status in STATES:
@ -257,7 +221,7 @@ class ExelyModifiedData(models.Model):
guest = self.get_exely_data_api(f"https://connect.hopenapi.com/api/exelypms/v1/guests/{bid}", headers)
self.create_or_update_raw_data(guest, 'exely.raw.guests', bid)
## break
break
def process_exely_data(self):
found_booking_record = self.env['exely.bookings'].search([], order="write_date desc", limit=1)

View File

@ -8,4 +8,3 @@ 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_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_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

View File

@ -1,67 +0,0 @@
<?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>

View File

@ -1,18 +0,0 @@
# PUID="1000"
# PGID="984"
CUSTOMADDONS_DIR="bross_hms"
# API_URL=""
POSTGRES_USER="odoo"
POSTGRES_PASSWORD="T48#2hrTe@3Rt"
POSTGRES_DB="postgres"
DBHOST="db"
DBPORT="5432"
DBUSER="odoo"
PASSWORD="T48#2hrTe@3Rt"
ADDONS="--addons-path=/opt/odoo/addons/,/opt/odoo/customaddons/$CUSTOMADDONS_DIR"
#ARGS=""
#ARGS="-d bross_hms_prod"
# DEBUG="-m debugpy --listen 0.0.0.0:5678 --wait-for-client"