Skip to content
Snippets Groups Projects

[IMP] energy_selfconsumption: importation of selfconsumption inscriptions, supply points and distribution tables by CSV

Compare and Show latest version
1 file
+ 47
34
Compare changes
  • Side-by-side
  • Inline
@@ -25,24 +25,38 @@ class SelfconsumptionImportWizard(models.TransientModel):
raise ValidationError("Only csv format files are accepted.")
def import_file_button(self):
error_string_list = ''
file_data = base64.b64decode(self.import_file)
parsing_data = self.with_context(active_id=self.ids[0])._parse_file(file_data)
active_id = self.env.context.get('active_id')
project = self.env['energy_selfconsumption.selfconsumption'].browse(active_id)
parsing_errors = []
for index, single_statement_data in enumerate(parsing_data[1:]):
found = self.import_single_statement(single_statement_data, project)
if not found:
parsing_errors.append((index, single_statement_data))
if parsing_errors:
error_list = ''
for error in parsing_errors:
error_list = "".join(
[error_list, _('<li>Line: {index} DNI: {vat} </li>\n').format(index=error[0], vat=error[1][0])])
project.message_post(subject=_('Import Result'),
body=_('Partners not found for: <ul>{list}</ul>'.format(list=error_list)))
for index, line in enumerate(parsing_data[1:]):
import_dict = self.get_line_dict(line)
error = self.import_line(import_dict, project)
if error:
error_string_list = "".join(
[error_string_list, _('<li>Line {line}: {error}</li>\n').format(index, error)])
if error_string_list:
project.message_post(subject=_('Import Errors'),
body=_('Import errors found: <ul>{list}</ul>'.format(list=error_string_list)))
return True
def get_line_dict(self, line):
return {
'partner_vat': line[0] or False,
'effective_date': line[1] or False,
'code': line[2] or False,
'street1': line[3] or False,
'street2': line[4] or False,
'city': line[5] or False,
'state': line[6] or False,
'postal_code': line[7] or False,
'country': line[8] or False,
'owner_vat': line[9] or False,
'owner_firstname': line[10] or False,
'owner_lastname': line[11] or False,
}
def _parse_file(self, data_file):
self.ensure_one()
try:
@@ -65,33 +79,32 @@ class SelfconsumptionImportWizard(models.TransientModel):
logger.warning("Parser error", exc_info=True)
raise UserError(_("Error parsing the file"))
def import_single_statement(self, line, project):
def import_line(self, line, project):
partner = self.env['res.partner'].search([
'|', ('vat', '=', line[0]), ('vat', '=ilike', line[0])
'|', ('vat', '=', line['partner_vat']), ('vat', '=ilike', line['partner_vat'])
], limit=1)
if not partner:
if line[2]:
partner = self.env['res.partner'].create({
'vat': line[0],
'firstname': line[2],
'lastname': line[3],
'company_type': 'person'
return _('Partner with VAT:<b>{vat}</b> was not found.').format(vat=line['partner_vat'])
if not project.inscription_ids.filtered_domain([('partner_id', '=', partner.id)]):
try:
self.env['energy_project.inscription'].create({
'project_id': project.id,
'partner_id': partner.id,
'effective_date': fields.date.today()
})
else:
return False
if partner.id in project.inscription_ids.mapped('partner_id.id'):
return False
try:
self.env['energy_project.inscription'].create({
'project_id': project.id,
'partner_id': partner.id,
'effective_date': fields.date.today()
}
)
except:
return False
return True
except:
return _('Could not create inscription for {vat}.').format(vat=line['partner_vat'])
supply_point = self.env['energy_selfconsumption.supply_point'].search([('code', '=', line['code'])])
if supply_point and supply_point.partner_id != partner:
return _(
'The supply point partner {supply_partner} and the partner {vat} in the subscription are different.').format(
supply_partner=supply_point.partner_id.vat, vat=partner.vat)
return False
def create_supply_point(self, code, street, street2, city, state, zip, country, owner_vat):
owner = self.env['res.partner'].search([
Loading