Initial commit
This commit is contained in:
107
fusion_claims/wizard/xml_import_wizard.py
Normal file
107
fusion_claims/wizard/xml_import_wizard.py
Normal file
@@ -0,0 +1,107 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2024-2026 Nexa Systems Inc.
|
||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||
|
||||
import base64
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FusionXmlImportWizard(models.TransientModel):
|
||||
_name = 'fusion.xml.import.wizard'
|
||||
_description = 'Import ADP XML Files'
|
||||
|
||||
xml_files = fields.Many2many(
|
||||
'ir.attachment', string='XML Files',
|
||||
help='Select one or more ADP XML data files to import',
|
||||
)
|
||||
result_message = fields.Text(string='Import Results', readonly=True)
|
||||
state = fields.Selection([
|
||||
('draft', 'Upload'),
|
||||
('done', 'Done'),
|
||||
], default='draft')
|
||||
|
||||
def action_import(self):
|
||||
"""Process uploaded XML files and create client profiles."""
|
||||
self.ensure_one()
|
||||
if not self.xml_files:
|
||||
raise UserError('Please upload at least one XML file.')
|
||||
|
||||
parser = self.env['fusion.xml.parser']
|
||||
created = 0
|
||||
updated = 0
|
||||
errors = []
|
||||
|
||||
for attachment in self.xml_files:
|
||||
try:
|
||||
xml_content = base64.b64decode(attachment.datas).decode('utf-8')
|
||||
|
||||
# Check if profile already exists by parsing health card from XML
|
||||
import xml.etree.ElementTree as ET
|
||||
try:
|
||||
root = ET.fromstring(xml_content)
|
||||
except ET.ParseError:
|
||||
errors.append(f'{attachment.name}: Could not parse XML')
|
||||
continue
|
||||
form = root.find('Form')
|
||||
if form is None:
|
||||
errors.append(f'{attachment.name}: No Form element in XML')
|
||||
continue
|
||||
|
||||
s1 = form.find('section1')
|
||||
health_card = ''
|
||||
if s1 is not None:
|
||||
hc_el = s1.find('healthNo')
|
||||
if hc_el is not None and hc_el.text:
|
||||
health_card = hc_el.text.strip()
|
||||
|
||||
existing = False
|
||||
if health_card:
|
||||
existing = self.env['fusion.client.profile'].search([
|
||||
('health_card_number', '=', health_card),
|
||||
], limit=1)
|
||||
|
||||
profile, app_data = parser.parse_and_create(xml_content)
|
||||
if not profile:
|
||||
errors.append(f'{attachment.name}: Could not create profile')
|
||||
continue
|
||||
|
||||
if existing:
|
||||
updated += 1
|
||||
else:
|
||||
created += 1
|
||||
|
||||
_logger.info(
|
||||
'Imported XML %s -> Profile: %s (ID: %s)',
|
||||
attachment.name, profile.display_name, profile.id,
|
||||
)
|
||||
except Exception as e:
|
||||
errors.append(f'{attachment.name}: {str(e)}')
|
||||
_logger.exception('Error importing XML file %s', attachment.name)
|
||||
|
||||
# Build result message
|
||||
lines = [
|
||||
f'Import Complete!',
|
||||
f'- Profiles created: {created}',
|
||||
f'- Profiles updated: {updated}',
|
||||
f'- Total files processed: {created + updated}',
|
||||
]
|
||||
if errors:
|
||||
lines.append(f'\nErrors ({len(errors)}):')
|
||||
for err in errors:
|
||||
lines.append(f' - {err}')
|
||||
|
||||
self.result_message = '\n'.join(lines)
|
||||
self.state = 'done'
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'fusion.xml.import.wizard',
|
||||
'view_mode': 'form',
|
||||
'res_id': self.id,
|
||||
'target': 'new',
|
||||
}
|
||||
Reference in New Issue
Block a user