108 lines
3.5 KiB
Python
108 lines
3.5 KiB
Python
# -*- 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',
|
|
}
|