diff --git a/datas/riga.files.matching.csv b/datas/riga.files.matching.csv index 996dd6b97777fc1a09a4975a67b6ebd24b443e14..00fb59717fd9321b3d9ded72e132abd5f5869f90 100644 --- a/datas/riga.files.matching.csv +++ b/datas/riga.files.matching.csv @@ -1,4 +1,4 @@ -id,model_id:id,riga_filename,primary_key,header_key -odoo_scop_contribution,cgscop_partner.model_scop_contribution,"1800.csv","EVTID","PMID" -odoo_scop_questionnaire,cgscop_partner.model_scop_questionnaire,"5100.csv","EVTID","PMID" +id,model_id:id,riga_filename,primary_key,header_key +odoo_scop_contribution,cgscop_partner.model_scop_contribution,"1800.csv","EVTID","PMID" +odoo_scop_questionnaire,cgscop_partner.model_scop_questionnaire,"5100.csv","EVTID","PMID" odoo_scop_liasse_fiscale,cgscop_partner.model_scop_liasse_fiscale,"5900.csv","EVTID","PMID" \ No newline at end of file diff --git a/datas/riga.files.matching.header.csv b/datas/riga.files.matching.header.csv index 5415d8d3100dce6febfb5e55a6ef0413ba7cc4ff..440be8f3fc6a36fb3875500259008b81218ba9f5 100644 --- a/datas/riga.files.matching.header.csv +++ b/datas/riga.files.matching.header.csv @@ -1,27 +1,52 @@ -id,parent_id:id,name,riga_name -scop_contribution_header_1,odoo_scop_contribution,"id_riga","EVTID" -scop_contribution_header_2,odoo_scop_contribution,"type_id","EVT04" -scop_contribution_header_3,odoo_scop_contribution,"year","EVT08" -scop_contribution_header_4,odoo_scop_contribution,"calculation_date","EVT05" -scop_contribution_header_5,odoo_scop_contribution,"amount_calculated","EVT13" -scop_contribution_header_6,odoo_scop_contribution,"amount_called","EVT06" -scop_contribution_header_7,odoo_scop_contribution,"amount_paid","EVT20" -scop_contribution_header_8,odoo_scop_contribution,"amount_remaining_previous","EVT10" -scop_contribution_header_9,odoo_scop_contribution,"amount_paid_late","EVT11" -scop_contribution_header_10,odoo_scop_contribution,"spreading","EVT16" -scop_contribution_header_11,odoo_scop_contribution,"amount_remaining","EVT21" -scop_contribution_header_12,odoo_scop_contribution,"quarter_1","EVT27" -scop_contribution_header_13,odoo_scop_contribution,"quarter_2","EVT28" -scop_contribution_header_14,odoo_scop_contribution,"quarter_3","EVT29" -scop_contribution_header_15,odoo_scop_contribution,"quarter_4","EVT30" -scop_questionnaire_header_1,odoo_scop_questionnaire,"id_riga","EVTID" -scop_questionnaire_header_2,odoo_scop_questionnaire,"year_riga","EVT02" -scop_questionnaire_header_3,odoo_scop_questionnaire,"staff_count","EVT08" -scop_questionnaire_header_4,odoo_scop_questionnaire,"staff_shareolder_count","EVT09" -scop_questionnaire_header_5,odoo_scop_questionnaire,"staff_average","EVT10" -scop_liasse_fiscale_header_1,odoo_scop_liasse_fiscale,"id_riga","EVTID" -scop_liasse_fiscale_header_2,odoo_scop_liasse_fiscale,"year_riga","EVT02" -scop_liasse_fiscale_header_3,odoo_scop_liasse_fiscale,"date","EVT04" -scop_liasse_fiscale_header_4,odoo_scop_liasse_fiscale,"duration","EVT03" -scop_liasse_fiscale_header_5,odoo_scop_liasse_fiscale,"date","EVT04" -scop_liasse_fiscale_header_6,odoo_scop_liasse_fiscale,"source_id","EVT07" \ No newline at end of file +id,parent_id:id,name,riga_name +scop_contribution_header_1,odoo_scop_contribution,id_riga,EVTID +scop_contribution_header_2,odoo_scop_contribution,type_id,EVT04 +scop_contribution_header_3,odoo_scop_contribution,year,EVT08 +scop_contribution_header_4,odoo_scop_contribution,calculation_date,EVT05 +scop_contribution_header_5,odoo_scop_contribution,amount_calculated,EVT13 +scop_contribution_header_6,odoo_scop_contribution,amount_called,EVT06 +scop_contribution_header_7,odoo_scop_contribution,amount_paid,EVT20 +scop_contribution_header_8,odoo_scop_contribution,amount_remaining_previous,EVT10 +scop_contribution_header_9,odoo_scop_contribution,amount_paid_late,EVT11 +scop_contribution_header_10,odoo_scop_contribution,spreading,EVT16 +scop_contribution_header_11,odoo_scop_contribution,amount_remaining,EVT21 +scop_contribution_header_12,odoo_scop_contribution,quarter_1,EVT27 +scop_contribution_header_13,odoo_scop_contribution,quarter_2,EVT28 +scop_contribution_header_14,odoo_scop_contribution,quarter_3,EVT29 +scop_contribution_header_15,odoo_scop_contribution,quarter_4,EVT30 +scop_questionnaire_header_1,odoo_scop_questionnaire,id_riga,EVTID +scop_questionnaire_header_2,odoo_scop_questionnaire,year_riga,EVT02 +scop_questionnaire_header_3,odoo_scop_questionnaire,staff_count,EVT08 +scop_questionnaire_header_4,odoo_scop_questionnaire,staff_shareholder_count,EVT09 +scop_questionnaire_header_5,odoo_scop_questionnaire,staff_average,EVT10 +scop_liasse_fiscale_header_1,odoo_scop_liasse_fiscale,id_riga,EVTID +scop_liasse_fiscale_header_2,odoo_scop_liasse_fiscale,year_riga,EVT02 +scop_liasse_fiscale_header_3,odoo_scop_liasse_fiscale,effective_date,EVT04 +scop_liasse_fiscale_header_4,odoo_scop_liasse_fiscale,duration,EVT03 +scop_liasse_fiscale_header_5,odoo_scop_liasse_fiscale,closing_date,EVT04 +scop_liasse_fiscale_header_6,odoo_scop_liasse_fiscale,source_id,EVT07 +scop_liasse_fiscale_header_7,odoo_scop_liasse_fiscale,revenue_cg,EVT08 +scop_liasse_fiscale_header_8,odoo_scop_liasse_fiscale,margin_cg,EVT09 +scop_liasse_fiscale_header_9,odoo_scop_liasse_fiscale,av_cg,EVT10 +scop_liasse_fiscale_header_10,odoo_scop_liasse_fiscale,wage_cg,EVT11 +scop_liasse_fiscale_header_11,odoo_scop_liasse_fiscale,margin2ca,EVT14 +scop_liasse_fiscale_header_12,odoo_scop_liasse_fiscale,av_cgsubv,EVT19 +scop_liasse_fiscale_header_13,odoo_scop_liasse_fiscale,revenue_cgsubv,EVT29 +scop_liasse_fiscale_header_14,odoo_scop_liasse_fiscale,is_av_lf,EVT15 +scop_liasse_fiscale_header_15,odoo_scop_liasse_fiscale,av_lf,EVT16 +scop_liasse_fiscale_header_16,odoo_scop_liasse_fiscale,revenue_sub,EVT33 +scop_liasse_fiscale_header_17,odoo_scop_liasse_fiscale,sal,EVT34 +scop_liasse_fiscale_header_18,odoo_scop_liasse_fiscale,margin,EVT35 +scop_liasse_fiscale_header_19,odoo_scop_liasse_fiscale,distribution,EVT39 +scop_liasse_fiscale_header_20,odoo_scop_liasse_fiscale,capital_cae,EVT41 +scop_liasse_fiscale_header_21,odoo_scop_liasse_fiscale,flexible_keys,EVT37 +scop_liasse_fiscale_header_22,odoo_scop_liasse_fiscale,reserve,EVT42 +scop_liasse_fiscale_header_23,odoo_scop_liasse_fiscale,share_ass_perm,EVT51 +scop_liasse_fiscale_header_24,odoo_scop_liasse_fiscale,dvpt_fund,EVT45 +scop_liasse_fiscale_header_25,odoo_scop_liasse_fiscale,share_ass_work,EVT53 +scop_liasse_fiscale_header_26,odoo_scop_liasse_fiscale,share_capital,EVT43 +scop_liasse_fiscale_header_27,odoo_scop_liasse_fiscale,share_work,EVT46 +scop_liasse_fiscale_header_28,odoo_scop_liasse_fiscale,pension_fund,EVT44 +scop_liasse_fiscale_header_29,odoo_scop_liasse_fiscale,others,EVT47 +scop_liasse_fiscale_header_30,odoo_scop_liasse_fiscale,key_name,EVT64 +scop_liasse_fiscale_header_31,odoo_scop_liasse_fiscale,status_update,EVT48 \ No newline at end of file diff --git a/datas/riga.lookup.table.csv b/datas/riga.lookup.table.csv new file mode 100644 index 0000000000000000000000000000000000000000..ffd68bd79d9ed72bfaadfe676cdc5caddc6c9d86 --- /dev/null +++ b/datas/riga.lookup.table.csv @@ -0,0 +1,109 @@ +id,id_riga,name +id_riga_14869,"14869","1000" +id_riga_14870,"14870","1002" +id_riga_14871,"14871","1004" +id_riga_14935,"14935","1895" +id_riga_14911,"14911","1896" +id_riga_14950,"14950","1899" +id_riga_14934,"14934","1900" +id_riga_15009,"15009","1903" +id_riga_15010,"15010","1904" +id_riga_14936,"14936","1905" +id_riga_14912,"14912","1906" +id_riga_15011,"15011","1907" +id_riga_15012,"15012","1908" +id_riga_14997,"14997","1911" +id_riga_15013,"15013","1912" +id_riga_14938,"14938","1919" +id_riga_14915,"14915","1920" +id_riga_14913,"14913","1921" +id_riga_14941,"14941","1922" +id_riga_14920,"14920","1923" +id_riga_15014,"15014","1929" +id_riga_14999,"14999","1930" +id_riga_14998,"14998","1931" +id_riga_14937,"14937","1932" +id_riga_14914,"14914","1933" +id_riga_15001,"15001","1934" +id_riga_14948,"14948","1935" +id_riga_14930,"14930","1936" +id_riga_14916,"14916","1937" +id_riga_14926,"14926","1938" +id_riga_15008,"15008","1940" +id_riga_15015,"15015","1941" +id_riga_15004,"15004","1945" +id_riga_15002,"15002","1946" +id_riga_14939,"14939","1947" +id_riga_14917,"14917","1948" +id_riga_14940,"14940","1949" +id_riga_14918,"14918","1950" +id_riga_14919,"14919","1951" +id_riga_15006,"15006","1953" +id_riga_14949,"14949","1955" +id_riga_14602,"14602","1956" +id_riga_14931,"14931","1957" +id_riga_15003,"15003","1958" +id_riga_15007,"15007","1959" +id_riga_14947,"14947","1960" +id_riga_14928,"14928","1961" +id_riga_14921,"14921","1962" +id_riga_14929,"14929","1963" +id_riga_14942,"14942","1964" +id_riga_14922,"14922","1965" +id_riga_15000,"15000","1966" +id_riga_14943,"14943","1967" +id_riga_14923,"14923","1968" +id_riga_14932,"14932","1969" +id_riga_15005,"15005","1970" +id_riga_14944,"14944","1971" +id_riga_14924,"14924","1972" +id_riga_14933,"14933","1973" +id_riga_14945,"14945","1974" +id_riga_14925,"14925","1975" +id_riga_14946,"14946","1976" +id_riga_14927,"14927","1977" +id_riga_14603,"14603","1978" +id_riga_14604,"14604","1979" +id_riga_14605,"14605","1980" +id_riga_14606,"14606","1981" +id_riga_14607,"14607","1982" +id_riga_14608,"14608","1983" +id_riga_14609,"14609","1984" +id_riga_14610,"14610","1985" +id_riga_14611,"14611","1986" +id_riga_14612,"14612","1987" +id_riga_14613,"14613","1988" +id_riga_14598,"14598","1989" +id_riga_14580,"14580","1990" +id_riga_14581,"14581","1991" +id_riga_14576,"14576","1992" +id_riga_14577,"14577","1993" +id_riga_14579,"14579","1994" +id_riga_14582,"14582","1995" +id_riga_14583,"14583","1996" +id_riga_14584,"14584","1997" +id_riga_14585,"14585","1998" +id_riga_14586,"14586","1999" +id_riga_14530,"14530","2000" +id_riga_14529,"14529","2001" +id_riga_14528,"14528","2002" +id_riga_14527,"14527","2003" +id_riga_14526,"14526","2004" +id_riga_14525,"14525","2005" +id_riga_14524,"14524","2006" +id_riga_14523,"14523","2007" +id_riga_14522,"14522","2008" +id_riga_14521,"14521","2009" +id_riga_14520,"14520","2010" +id_riga_14519,"14519","2011" +id_riga_14406,"14406","2012" +id_riga_14443,"14443","Prévisionnelle" +id_riga_11748,"11748","2013" +id_riga_11749,"11749","2014" +id_riga_11750,"11750","2015" +id_riga_11751,"11751","2016" +id_riga_11752,"11752","2017" +id_riga_14531,"14531","2018" +id_riga_14532,"14532","2019" +id_riga_14533,"14533","2020" +id_riga_14862,"14862","Inscription" \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index 66a6c12a7c9dd580fe1340e202bb437d8e44af01..c65b9e8a09105a8e613f3cab4d4adf4e41fed573 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -4,3 +4,5 @@ from . import riga_files_matching from . import riga_lookup_table from . import riga_odoo_import +from . import scop_liasse_fiscale +from . import scop_questionnaire diff --git a/models/riga_lookup_table.py b/models/riga_lookup_table.py new file mode 100644 index 0000000000000000000000000000000000000000..d7ba85e0ab7beeea3f40bb120bdf8e03cec4ff39 --- /dev/null +++ b/models/riga_lookup_table.py @@ -0,0 +1,17 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields + + +class CgscopRigaLookupTable(models.Model): + _name = 'riga.lookup.table' + _description = 'Correspondance valeur et id RIGA' + _sql_constraints = [ + ('id_riga_uniq', + 'UNIQUE (id_riga)', + 'You can not have two fields with the same RIGA id !') + ] + + name = fields.Char('Valeur RIGA') + id_riga = fields.Char('ID RIGA') diff --git a/models/riga_odoo_import.py b/models/riga_odoo_import.py index 09d9f3f04dc0f94fddf8a015b9884f54b815d385..3d8197a2fa01be2e5324cd7aff14701b7ac0d068 100644 --- a/models/riga_odoo_import.py +++ b/models/riga_odoo_import.py @@ -58,6 +58,11 @@ class CgscopRigaOdooImport(models.Model): ftp.retrbinary( "RETR " + filename, csv_file.write) + _logger.info( + "Connecté à l'URL : %s - Path : %s", + param.get_param('riga_ftp.url'), + param.get_param('riga_ftp.path') + ) return csv_file except Exception as e: ftp.quit() @@ -76,69 +81,69 @@ class CgscopRigaOdooImport(models.Model): :param parent_id (string): header du fichier CSV pour lequel on va rechercher l'ID RIGA de l'organisme """ - try: - file.seek(0) - # Création du lecteur CSV. - reader = csv.DictReader( - io.TextIOWrapper(file, encoding="utf-8-sig", newline=None), - delimiter=';') - model_obj = self.env[model.model] - crea_nb = 0 - maj_nb = 0 - log = "" - # Lecture de chaque ligne - for row in reader: - # Création de l'objet - vals = {} - for field in table: + # try: + file.seek(0) + # Création du lecteur CSV. + reader = csv.DictReader( + io.TextIOWrapper(file, encoding="utf-8-sig", newline=None), + delimiter=';') + model_obj = self.env[model.model] + crea_nb = 0 + maj_nb = 0 + log = "" + # Lecture de chaque ligne + for row in reader: + # Création de l'objet + vals = {} + for field in table: + vals.update({ + field[0]: self._cast_type( + model=model, + field=field[0], + value=row[field[1]]) + }) + # Vérification de la ligne dans la base + line = model_obj.search([ + ['id_riga', '=', row[primary_key]]]) + # Si il y a un enregistrement, on met à jour + if line: + line.write(vals) + maj_nb += 1 + else: + # Check d'un organisme dans la base + partner = self.env['res.partner'].search([ + ['id_riga', '=', row[header_key]]]) + # Si l'organisme existe, on crée un enregistrement + if partner: vals.update({ - field[0]: self._cast_type( - model=model, - field=field[0], - value=row[field[1]]) + 'partner_id': partner.id }) - # Vérification de la ligne dans la base - line = model_obj.search([ - ['id_riga', '=', row[primary_key]]]) - # Si il y a un enregistrement, on met à jour - if line: - line.write(vals) - maj_nb += 1 + model_obj.create(vals) + crea_nb += 1 else: - # Check d'un organisme dans la base - partner = self.env['res.partner'].search([ - ['id_riga', '=', row[header_key]]]) - # Si l'organisme existe, on crée un enregistrement - if partner: - vals.update({ - 'partner_id': partner.id - }) - model_obj.create(vals) - crea_nb += 1 - else: - log += ("Pas d'enredistrement trouvé pour l'id " + - row[primary_key] + " avec l'id riga " + - row[header_key] + "\n") - - # Création du log - self.create({ - 'model_id': model.id, - 'is_sync': True, - 'log': ("Import du fichier réussi : \n" + - " - Création de " + str(crea_nb) + " lignes\n" + - " - Mise à jour de " + str(maj_nb) + " lignes\n\n" + log), - 'is_warning': True if log else False, - }) - - except Exception as e: - _logger.error(e.__str__()) - # Création du log - self.create({ - 'model_id': model.id, - 'is_sync': False, - 'is_error': True, - 'log': str(e) - }) + log += ("Pas d'enredistrement trouvé pour l'id " + + row[primary_key] + " avec l'id riga " + + row[header_key] + "\n") + + # Création du log + self.create({ + 'model_id': model.id, + 'is_sync': True, + 'log': ("Import du fichier réussi : \n" + + " - Création de " + str(crea_nb) + " lignes\n" + + " - Mise à jour de " + str(maj_nb) + " lignes\n\n" + log), + 'is_warning': True if log else False, + }) + + # except Exception as e: + # _logger.error(e.__str__()) + # # Création du log + # self.create({ + # 'model_id': model.id, + # 'is_sync': False, + # 'is_error': True, + # 'log': str(e) + # }) def _cast_type(self, model, field, value): """ Détermine en fonction du champ la valeur typée à renvoyer @@ -188,6 +193,11 @@ class CgscopRigaOdooImport(models.Model): ['is_active', '=', True]]) for model in model_sync: table = [] + _logger.info( + "Lecture Fichier %s pour le modèle %s", + model.riga_filename, + model.model_id.name + ) for header in model.matching_table_ids: table.append((header.name, header.riga_name)) self._read_file( diff --git a/models/scop_liasse_fiscale.py b/models/scop_liasse_fiscale.py new file mode 100644 index 0000000000000000000000000000000000000000..cc19d94c3e6af26f021c3ca483b44d3156d686f3 --- /dev/null +++ b/models/scop_liasse_fiscale.py @@ -0,0 +1,32 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields, api + + +class ScopQuestionnaireImport(models.Model): + _inherit = "scop.liasse.fiscale" + + year_riga = fields.Char("Année Riga") + type_id = fields.Many2one(compute="_compute_fields", store=True) + year = fields.Char(compute="_compute_fields", store=True) + + # ------------------------------------------------------ + # Fonctions compute + # ------------------------------------------------------ + @api.depends('year_riga') + @api.multi + def _compute_fields(self): + for liasse in self: + if liasse.year_riga != '14443': + year = liasse.env['riga.lookup.table'].search([ + ['id_riga', '=', liasse.year_riga]]) + liasse.year = year.name + liasse.type_id = liasse.env.ref( + 'cgscop_partner.liasse_type_2').id + else: + if liasse.partner_id.date_1st_sign: + liasse.year = liasse.partner_id.date_1st_sign.year + liasse.type_id = liasse.env.ref( + 'cgscop_partner.liasse_type_1').id + diff --git a/models/scop_questionnaire.py b/models/scop_questionnaire.py new file mode 100644 index 0000000000000000000000000000000000000000..8333a6ca4cfe8bcfe1cae1cd786ac3221b05b6c7 --- /dev/null +++ b/models/scop_questionnaire.py @@ -0,0 +1,37 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from dateutil.relativedelta import relativedelta + +from odoo import models, fields, api + + +class ScopQuestionnaireImport(models.Model): + _inherit = "scop.questionnaire" + + year_riga = fields.Char("Année Riga") + + type_id = fields.Many2one(compute="_compute_fields", store=True) + year = fields.Char(compute="_compute_fields", store=True) + effective_date = fields.Date(compute="_compute_fields", store=True) + + # ------------------------------------------------------ + # Fonctions compute + # ------------------------------------------------------ + @api.depends('year_riga') + @api.multi + def _compute_fields(self): + for questionnaire in self: + if questionnaire.year_riga != '14862': + year = questionnaire.env['riga.lookup.table'].search([ + ['id_riga', '=', questionnaire.year_riga]]) + questionnaire.year = year.name + questionnaire.type_id = questionnaire.env.ref( + 'cgscop_partner.questionnaire_type_2').id + questionnaire.effective_date = fields.Date.to_date(year.name + '-12-31') - relativedelta(years=1) + else: + if questionnaire.partner_id.date_1st_sign: + questionnaire.year = questionnaire.partner_id.date_1st_sign.year + questionnaire.effective_date = questionnaire.partner_id.date_1st_sign + questionnaire.type_id = self.env.ref( + 'cgscop_partner.questionnaire_type_1').id diff --git a/views/riga_lookup_table.xml b/views/riga_lookup_table.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc68623c135112b1ea7ef8a2cd5e5a7d5116ea90 --- /dev/null +++ b/views/riga_lookup_table.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<!-- Copyright 2019 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> + +<odoo> + <data> + + <!-- RIGA Job Queue --> + <record id="view_riga_lookup_table_tree" model="ir.ui.view"> + <field name="name">riga.lookup.table.tree</field> + <field name="model">riga.lookup.table</field> + <field name="arch" type="xml"> + <tree string="Synchronisation Odoo"> + <field name="id_riga"/> + <field name="name"/> + </tree> + </field> + </record> + + <record id="action_view_riga_lookup_table_tree" model="ir.actions.act_window"> + <field name="name">Table de correspondance RIGA</field> + <field name="res_model">riga.lookup.table</field> + <field name="view_mode">tree,form</field> + </record> + + <menuitem id="menu_riga_lookup_table" + parent="menu_cgscop_riga_import" + action="action_view_riga_lookup_table_tree" + name="Table de correspondance" + sequence="200"/> + </data> +</odoo>