From 2105897bde8cdd01c642be9acdf3ee24a720c048 Mon Sep 17 00:00:00 2001 From: Antoine B <56827368+4nt0ineB@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:17:41 +0200 Subject: [PATCH] fix: various fixes to data sync with CRM (#10494) * crm sync fix --- cgi/import_file_process.pl | 4 +-- cgi/product_multilingual.pl | 5 ++- lib/ProductOpener/CRM.pm | 15 +++++++- lib/ProductOpener/Import.pm | 11 +++--- lib/ProductOpener/Orgs.pm | 35 +++++++++++++++---- lib/ProductOpener/Test.pm | 2 +- .../org-after-subscription.json | 2 ++ .../create_pro_user/org-after-validation.json | 2 ++ 8 files changed, 56 insertions(+), 20 deletions(-) diff --git a/cgi/import_file_process.pl b/cgi/import_file_process.pl index 36af7860402be..8ff0797233b4b 100755 --- a/cgi/import_file_process.pl +++ b/cgi/import_file_process.pl @@ -36,7 +36,7 @@ use ProductOpener::Lang qw/$lc lang/; use ProductOpener::Mail qw/:all/; use ProductOpener::Producers qw/convert_file get_minion load_csv_or_excel_file normalize_column_name/; -use ProductOpener::CRM qw/update_company_last_import_type/; +use ProductOpener::Orgs qw/update_last_import_type/; use Apache2::RequestRec (); use Apache2::Const (); @@ -202,7 +202,7 @@ store("$BASE_DIRS{IMPORT_FILES}/${Owner_id}/import_files.sto", $import_files_ref); -update_company_last_import_type($Org_id, 'CSV'); +update_last_import_type($Org_id, 'CSV'); $template_data_ref->{process_file_id} = $file_id; $template_data_ref->{process_import_id} = $import_id; diff --git a/cgi/product_multilingual.pl b/cgi/product_multilingual.pl index 6316980bfcbce..769a5bb92f2dc 100755 --- a/cgi/product_multilingual.pl +++ b/cgi/product_multilingual.pl @@ -55,8 +55,7 @@ use ProductOpener::API qw/get_initialized_response/; use ProductOpener::APIProductWrite qw/skip_protected_field/; use ProductOpener::ProductsFeatures qw/feature_enabled/; -use ProductOpener::Orgs qw/update_import_date/; -use ProductOpener::CRM qw/update_company_last_import_type/; +use ProductOpener::Orgs qw/update_import_date update_last_import_type/; use Apache2::RequestRec (); use Apache2::Const (); @@ -277,7 +276,7 @@ ($product_ref) # sync crm if (defined $Org_id) { update_import_date($Org_id, $product_ref->{created_t}); - update_company_last_import_type($Org_id, 'Manual import'); + update_last_import_type($Org_id, 'Manual import'); } $type = 'add'; diff --git a/lib/ProductOpener/CRM.pm b/lib/ProductOpener/CRM.pm index 04c3eee7ecc8c..1ab755dcff7b3 100644 --- a/lib/ProductOpener/CRM.pm +++ b/lib/ProductOpener/CRM.pm @@ -47,6 +47,7 @@ package ProductOpener::CRM; use ProductOpener::PerlStandards; use Exporter qw< import >; +use experimental 'smartmatch'; BEGIN { use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS); @@ -88,7 +89,8 @@ my $crm_data; my @required_tag_labels = qw(onboarding); # Category (res.partner.category) must be defined in Odoo : # Contact > contact (individual or company) form > Tags field > "Search More" -my @required_category_labels = ('Producer', 'AGENA3000', 'EQUADIS', 'CSV', 'Manual import',); +my @data_source = ('AGENA3000', 'EQUADIS', 'CSV', 'Manual import',); +my @required_category_labels = ('Producer', @data_source); # special commands to manipulate Odoo relation One2Many and Many2Many # see https://www.odoo.com/documentation/15.0/developer/reference/backend/orm.html#odoo.fields.Command @@ -644,9 +646,20 @@ sub add_category_to_company($org_id, $label) { [[$org_ref->{crm_org_id}], {category_id => [[$commands{link}, $category_id]]}]); } +=head2 update_company_last_import_type ($org_id, $data_source) + +Update the last import type of a company in Odoo + +=head4 $data_source + +must match one of the values in CRM.pm @data_source + +=cut + sub update_company_last_import_type($org_id, $label) { my $org_ref = retrieve_org($org_id); return if not defined $org_ref->{crm_org_id}; + return if $label ~~ @data_source; my $category_id = $crm_data->{category}{$label}; add_category_to_company($org_id, $label); return make_odoo_request('res.partner', 'write', diff --git a/lib/ProductOpener/Import.pm b/lib/ProductOpener/Import.pm index 0de5262ec9702..8c930bdaeee2c 100644 --- a/lib/ProductOpener/Import.pm +++ b/lib/ProductOpener/Import.pm @@ -95,7 +95,8 @@ use ProductOpener::DataQuality qw/check_quality/; use ProductOpener::Data qw/get_products_collection/; use ProductOpener::ImportConvert qw/$empty_regexp $not_applicable_regexp $unknown_regexp clean_fields/; use ProductOpener::Users qw/$Org_id $Owner_id $User_id/; -use ProductOpener::Orgs qw/create_org retrieve_org set_org_gs1_gln store_org update_import_date/; +use ProductOpener::Orgs + qw/create_org retrieve_org set_org_gs1_gln store_org update_import_date update_last_import_type/; use ProductOpener::Data qw/:all/; use ProductOpener::Packaging qw/add_or_combine_packaging_component_data get_checked_and_taxonomized_packaging_component_data/; @@ -103,7 +104,6 @@ use ProductOpener::Ecoscore qw/:all/; use ProductOpener::ForestFootprint qw/:all/; use ProductOpener::PackagerCodes qw/normalize_packager_codes/; use ProductOpener::API qw/get_initialized_response/; -use ProductOpener::CRM qw/update_company_last_import_type/; use CGI qw/:cgi :form escapeHTML/; use URI::Escape::XS; @@ -2774,11 +2774,8 @@ sub import_csv_file ($args_ref) { # sync CRM foreach my $org_id (keys %{$stats_ref->{orgs_existing}}) { update_import_date($org_id, $time); - if ($args_ref->{source_id} eq 'agena3000') { - update_company_last_import_type($org_id, 'AGENA3000'); - } - elsif ($args_ref->{source_id} eq 'equadis') { - update_company_last_import_type($org_id, 'EQUADIS'); + if (exists $args_ref->{source_id}) { + update_last_import_type($org_id, uc($args_ref->{source_id})); } } diff --git a/lib/ProductOpener/Orgs.pm b/lib/ProductOpener/Orgs.pm index 319381d64abe8..fcf2bc7e15041 100644 --- a/lib/ProductOpener/Orgs.pm +++ b/lib/ProductOpener/Orgs.pm @@ -59,6 +59,7 @@ BEGIN { &update_import_date &update_export_date &update_last_logged_in_member + &update_last_import_type ); # symbols to export on request %EXPORT_TAGS = (all => [@EXPORT_OK]); @@ -199,17 +200,19 @@ sub store_org ($org_ref) { $org_ref->{crm_org_id} = $company_id; $org_ref->{crm_opportunity_id} = $opportunity_id; + + # also, add the other members to the CRM, in the company + foreach my $user_id (keys %{$org_ref->{members}}) { + if ($user_id ne $main_contact_user) { + add_user_to_company($user_id, $org_ref->{crm_org_id}); + } + } 1; } or do { $org_ref->{valid_org} = 'unreviewed'; $log->error("store_org", {error => $@}) if $log->is_error(); }; - # also, add the other members to the CRM, in the company - foreach my $user_id (keys %{$org_ref->{members}}) { - if ($user_id ne $org_ref->{creator}) { - add_user_to_company($user_id, $org_ref->{crm_org_id}); - } - } + } if ( defined $org_ref->{crm_org_id} @@ -533,11 +536,31 @@ sub update_last_logged_in_member($user_ref) { is_user_in_org_group($org_ref, $user_ref->{userid}, "members") or return; $org_ref->{last_logged_member} = $user_ref->{userid}; + $org_ref->{last_logged_member_t} = time(); if (defined $org_ref->{crm_org_id}) { update_company_last_logged_in_contact($org_ref, $user_ref); } + store_org($org_ref); + return; +} + +=head2 update_last_import_type($orgid, $data_source) + +Update the last import type for an organization. + +=head3 Arguments + +=head4 $orgid + +=cut + +sub update_last_import_type ($org_id, $data_source) { + my $org_ref = retrieve_org($org_id); + $org_ref->{last_import_type} = $data_source; + update_company_last_import_type($org_id, $data_source); + store_org($org_ref); return; } diff --git a/lib/ProductOpener/Test.pm b/lib/ProductOpener/Test.pm index b39af7a94fbc7..a7d2fea99018f 100644 --- a/lib/ProductOpener/Test.pm +++ b/lib/ProductOpener/Test.pm @@ -819,7 +819,7 @@ We remove time dependent fields, password (which encryption use salt) and sort s =cut sub normalize_org_for_test_comparison ($org_ref) { - my %specification = (fields_ignore_content => ["created_t"],); + my %specification = (fields_ignore_content => ["created_t", "last_logged_member_t"],); normalize_object_for_test_comparison($org_ref, \%specification); return; diff --git a/tests/integration/expected_test_results/create_pro_user/org-after-subscription.json b/tests/integration/expected_test_results/create_pro_user/org-after-subscription.json index 3cf53e1b9b073..e0502c51adf29 100644 --- a/tests/integration/expected_test_results/create_pro_user/org-after-subscription.json +++ b/tests/integration/expected_test_results/create_pro_user/org-after-subscription.json @@ -4,6 +4,8 @@ }, "created_t" : "--ignore--", "creator" : "tests", + "last_logged_member" : "tests", + "last_logged_member_t" : "--ignore--", "main_contact" : "tests", "members" : { "tests" : 1 diff --git a/tests/integration/expected_test_results/create_pro_user/org-after-validation.json b/tests/integration/expected_test_results/create_pro_user/org-after-validation.json index c3f787759851f..09cdaa57c868f 100644 --- a/tests/integration/expected_test_results/create_pro_user/org-after-validation.json +++ b/tests/integration/expected_test_results/create_pro_user/org-after-validation.json @@ -13,6 +13,8 @@ "import_source_codeonline" : "", "import_source_database-usda" : "", "import_source_equadis" : "", + "last_logged_member" : "tests", + "last_logged_member_t" : "--ignore--", "list_of_gs1_gln" : "", "main_contact" : "tests", "members" : {