From a5c2c20d2e9cccf01c5266e9f7f1fa8db35a3df8 Mon Sep 17 00:00:00 2001 From: Rene Krenn Date: Tue, 26 Nov 2019 18:43:00 +0100 Subject: [PATCH] TT#71363 contract_preferences, ccs prov tool "*" allowed cli Change-Id: Ie5b16da0361408cabccf7ec41c85bbe1884a9d1a (cherry picked from commit 7ff23369578d2d653a908129ee3481afbb65ef24) --- .../provisioning/voip_contract_preferences.pm | 255 ++++++++++++++++++ .../Projects/Migration/UPCAT/Preferences.pm | 25 ++ .../Projects/Migration/UPCAT/Provisioning.pm | 103 ++++--- 3 files changed, 327 insertions(+), 56 deletions(-) create mode 100644 lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_contract_preferences.pm diff --git a/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_contract_preferences.pm b/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_contract_preferences.pm new file mode 100644 index 0000000..3d19579 --- /dev/null +++ b/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_contract_preferences.pm @@ -0,0 +1,255 @@ +package NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_contract_preferences; +use strict; + +## no critic + +use NGCP::BulkProcessor::Logging qw( + getlogger + rowinserted + rowsdeleted +); + +use NGCP::BulkProcessor::ConnectorPool qw( + get_provisioning_db +); + +use NGCP::BulkProcessor::SqlProcessor qw( + checktableinfo + insert_record + update_record + delete_record + copy_row +); +use NGCP::BulkProcessor::SqlRecord qw(); + +require Exporter; +our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord); +our @EXPORT_OK = qw( + gettablename + check_table + insert_row + update_row + delete_row + + delete_preferences + + findby_contractid_attributeid + countby_contractid_attributeid_value + + $TRUE + $FALSE +); + +my $tablename = 'voip_contract_preferences'; +my $get_db = \&get_provisioning_db; + +my $expected_fieldnames = [ + 'id', + 'contract_id', + 'attribute_id', + 'value', + 'modify_timestamp', + 'location_id', +]; + +my $indexes = {}; + +my $insert_unique_fields = []; + +our $TRUE = 1; +our $FALSE = undef; + +sub new { + + my $class = shift; + my $self = NGCP::BulkProcessor::SqlRecord->new($class,$get_db, + $tablename,$expected_fieldnames,$indexes); + + copy_row($self,shift,$expected_fieldnames); + + return $self; + +} + +sub findby_contractid_attributeid { + + my ($xa_db,$contract_id,$attribute_id,$load_recursive) = @_; + + check_table(); + my $db = &$get_db(); + $xa_db //= $db; + my $table = $db->tableidentifier($tablename); + + my $stmt = 'SELECT * FROM ' . $table . ' WHERE ' . + $db->columnidentifier('contract_id') . ' = ?'; + my @params = ($contract_id); + if (defined $attribute_id) { + $stmt .= ' AND ' . $db->columnidentifier('contract_id') . ' = ?'; + push(@params,$attribute_id); + } + my $rows = $xa_db->db_get_all_arrayref($stmt,@params); + + return buildrecords_fromrows($rows,$load_recursive); + +} + +sub countby_contractid_attributeid_value { + + my ($contract_id,$attribute_id,$value) = @_; + + check_table(); + my $db = &$get_db(); + my $table = $db->tableidentifier($tablename); + + my $stmt = 'SELECT COUNT(*) FROM ' . $table; + my @params = (); + my @terms = (); + if ($contract_id) { + push(@terms,$db->columnidentifier('contract_id') . ' = ?'); + push(@params,$contract_id); + } + if ($attribute_id) { + push(@terms,$db->columnidentifier('attribute_id') . ' = ?'); + push(@params,$attribute_id); + } + if ($value) { + push(@terms,$db->columnidentifier('value') . ' = ?'); + push(@params,$value); + } + if ((scalar @terms) > 0) { + $stmt .= ' WHERE ' . join(' AND ',@terms); + } + + return $db->db_get_value($stmt,@params); + +} + +sub update_row { + + my ($xa_db,$data) = @_; + + check_table(); + return update_record($get_db,$xa_db,__PACKAGE__,$data); + +} + +sub delete_row { + + my ($xa_db,$data) = @_; + + check_table(); + return delete_record($get_db,$xa_db,__PACKAGE__,$data); + +} + +sub delete_preferences { + + my ($xa_db,$contract_id,$attribute_id,$vals) = @_; + + check_table(); + my $db = &$get_db(); + $xa_db //= $db; + my $table = $db->tableidentifier($tablename); + + my $stmt = 'DELETE FROM ' . $table . ' WHERE ' . + $db->columnidentifier('contract_id') . ' = ?'; + my @params = ($contract_id); + if (defined $attribute_id) { + $stmt .= ' AND ' . $db->columnidentifier('attribute_id') . ' = ?'; + push(@params,$attribute_id); + } + if (defined $vals and 'HASH' eq ref $vals) { + foreach my $in (keys %$vals) { + my @values = (defined $vals->{$in} and 'ARRAY' eq ref $vals->{$in} ? @{$vals->{$in}} : ($vals->{$in})); + $stmt .= ' AND ' . $db->columnidentifier('value') . ' ' . $in . ' (' . substr(',?' x scalar @values,1) . ')'; + push(@params,@values); + } + } + + my $count; + if ($count = $xa_db->db_do($stmt,@params)) { + rowsdeleted($db,$tablename,$count,$count,getlogger(__PACKAGE__)); + return 1; + } else { + rowsdeleted($db,$tablename,0,0,getlogger(__PACKAGE__)); + return 0; + } + +} + +sub insert_row { + + my $db = &$get_db(); + my $xa_db = shift // $db; + if ('HASH' eq ref $_[0]) { + my ($data,$insert_ignore) = @_; + check_table(); + if (insert_record($db,$xa_db,__PACKAGE__,$data,$insert_ignore,$insert_unique_fields)) { + return $xa_db->db_last_insert_id(); + } + } else { + my %params = @_; + my ($attribute_id, + $contract_id, + $value) = @params{qw/ + attribute_id + contract_id + value + /}; + + if ($xa_db->db_do('INSERT INTO ' . $db->tableidentifier($tablename) . ' (' . + $db->columnidentifier('attribute_id') . ', ' . + $db->columnidentifier('contract_id') . ', ' . + $db->columnidentifier('value') . ') VALUES (' . + '?, ' . + '?, ' . + '?)', + $attribute_id, + $contract_id, + $value, + )) { + rowinserted($db,$tablename,getlogger(__PACKAGE__)); + return $xa_db->db_last_insert_id(); + } + } + return undef; + +} + +sub buildrecords_fromrows { + + my ($rows,$load_recursive) = @_; + + my @records = (); + my $record; + + if (defined $rows and ref $rows eq 'ARRAY') { + foreach my $row (@$rows) { + $record = __PACKAGE__->new($row); + + # transformations go here ... + + push @records,$record; + } + } + + return \@records; + +} + +sub gettablename { + + return $tablename; + +} + +sub check_table { + + return checktableinfo($get_db, + __PACKAGE__,$tablename, + $expected_fieldnames, + $indexes); + +} + +1; diff --git a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Preferences.pm b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Preferences.pm index fa0644f..ca2dc5c 100644 --- a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Preferences.pm +++ b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Preferences.pm @@ -34,6 +34,7 @@ use NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers qw(); use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers qw(); use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences qw(); use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences qw(); +use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_contract_preferences qw(); use NGCP::BulkProcessor::ConnectorPool qw( get_xa_db @@ -54,13 +55,20 @@ our @EXPORT_OK = qw( set_subscriber_preference get_subscriber_preference + clear_contract_preferences + delete_contract_preference + set_contract_preference + get_contract_preference + ); my %get_preference_sub_names = ( voip_usr_preferences => 'findby_subscriberid_attributeid', + voip_contract_preferences => 'findby_contractid_attributeid', ); my %preference_id_cols = ( voip_usr_preferences => 'subscriber_id', + voip_contract_preferences => 'contract_id', ); sub clear_subscriber_preferences { @@ -80,6 +88,23 @@ sub get_subscriber_preference { return _get_preference($context,'voip_usr_preferences',$subscriber_id,$attribute); } +sub clear_contract_preferences { + my ($context,$contract_id,$attribute,$except_value) = @_; + return _clear_preferences($context,'voip_contract_preferences',$contract_id,$attribute,$except_value); +} +sub delete_contract_preference { + my ($context,$contract_id,$attribute,$value) = @_; + return _delete_preference($context,'voip_contract_preferences',$contract_id,$attribute,$value); +} +sub set_contract_preference { + my ($context,$contract_id,$attribute,$value) = @_; + return _set_preference($context,'voip_contract_preferences',$contract_id,$attribute,$value); +} +sub get_contract_preference { + my ($context,$contract_id,$attribute) = @_; + return _get_preference($context,'voip_contract_preferences',$contract_id,$attribute); +} + sub _clear_preferences { my ($context,$pref_type,$id,$attribute,$except_value) = @_; diff --git a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm index 3e2996b..16e2a97 100644 --- a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm +++ b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm @@ -92,6 +92,11 @@ use NGCP::BulkProcessor::Projects::Migration::UPCAT::Preferences qw( get_subscriber_preference clear_subscriber_preferences delete_subscriber_preference + + set_contract_preference + get_contract_preference + clear_contract_preferences + delete_contract_preference ); #set_allowed_ips_preferences #cleanup_aig_sequence_ids @@ -608,7 +613,7 @@ sub _update_subscriber { ); } - $context->{preferences}->{cli} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{cli} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{cli}, $number->{number}), value => $number->{number} }; @@ -632,7 +637,7 @@ sub _update_subscriber { $context->{prov_subscriber}->{id}, $context->{attributes}->{allowed_clis}, $number->{number}), value => $number->{number}}); - $context->{preferences}->{allowed_clis} = \@allowed_clis; + $context->{usr_preferences}->{allowed_clis} = \@allowed_clis; NGCP::BulkProcessor::Dao::Trunk::billing::voip_numbers::release_subscriber_numbers($context->{db}, $context->{bill_subscriber}->{id},{ 'NOT IN' => $context->{voip_numbers}->{primary}->{id} }); @@ -651,19 +656,19 @@ sub _update_subscriber { $context->{voicemail_user}, ); - $context->{preferences}->{account_id} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{account_id} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{account_id}, $context->{contract}->{id}), value => $context->{contract}->{id} }; if (length($number->{ac}) > 0) { - $context->{preferences}->{ac} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{ac} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{ac}, $number->{ac}), value => $number->{ac} }; } if (length($number->{cc}) > 0) { - $context->{preferences}->{cc} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{cc} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{cc}, $number->{cc}), value => $number->{cc} }; @@ -682,18 +687,18 @@ sub _update_mta_preferences { my $result = 1; if (defined $context->{ncos_level}) { - $context->{preferences}->{ncos_id} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{ncos_id} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{ncos_id}, $context->{ncos_level}->{id}), value => $context->{ncos_level}->{id} }; _info($context,"ncos_id preference set to $context->{ncos_level}->{id} - $context->{ncos_level}->{level}",1); } - if (defined $context->{preferences}->{gpp}) { + if (defined $context->{usr_preferences}->{gpp}) { my $gpp_idx = 0; - foreach my $gpp_val (@{$context->{preferences}->{gpp}}) { + foreach my $gpp_val (@{$context->{usr_preferences}->{gpp}}) { my $gpp_attr = 'gpp' . $gpp_idx; - $context->{preferences}->{$gpp_attr} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{$gpp_attr} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{$gpp_attr}, $gpp_attr), value => $gpp_attr }; @@ -770,7 +775,7 @@ sub _create_aliases { $context->{prov_subscriber}->{id}, $context->{attributes}->{allowed_clis}, $number->{number}); - push(@{$context->{preferences}->{allowed_clis}},{ id => set_subscriber_preference($context, + push(@{$context->{usr_preferences}->{allowed_clis}},{ id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{allowed_clis}, $number->{number}), value => $number->{number}}); @@ -1009,9 +1014,9 @@ sub _provision_mta_susbcriber_init_context { $context->{voicemail_user}->{mailbox} = $context->{numbers}->{primary}->{number}; $context->{voicemail_user}->{password} = sprintf("%04d", int(rand 10000)); - $context->{preferences} = {}; + $context->{usr_preferences} = {}; - $context->{preferences}->{gpp} = [ + $context->{usr_preferences}->{gpp} = [ $first->{"_len"}, $first->{"_cpe_mta_mac_address"}, $first->{"_cpe_model"}, @@ -1603,15 +1608,17 @@ sub _provision_ccs_susbcriber_init_context { } $context->{callforwards} = \%cfsimple; - #$context->{preferences} = {}; + #$context->{usr_preferences} = {}; - #$context->{preferences}->{gpp} = [ + #$context->{usr_preferences}->{gpp} = [ # $first->{"_len"}, # $first->{"_cpe_mta_mac_address"}, # $first->{"_cpe_model"}, # $first->{"_cpe_vendor"}, #]; + $context->{contract_preferences} = {}; + return $result; } @@ -1667,26 +1674,26 @@ sub _update_ccs_preferences { my $result = 1; - $context->{preferences}->{extended_dialing_mode} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{extended_dialing_mode} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{extended_dialing_mode}, 'extended_send_dialed'), value => 'extended_send_dialed' }; - $context->{preferences}->{e164_to_ruri} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{e164_to_ruri} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{e164_to_ruri}, '1'), value => '1' }; - $context->{preferences}->{serial_forking_by_q_value} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{serial_forking_by_q_value} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{serial_forking_by_q_value}, '1'), value => '1' }; - #if (defined $context->{preferences}->{gpp}) { + #if (defined $context->{usr_preferences}->{gpp}) { # my $gpp_idx = 0; - # foreach my $gpp_val (@{$context->{preferences}->{gpp}}) { + # foreach my $gpp_val (@{$context->{usr_preferences}->{gpp}}) { # my $gpp_attr = 'gpp' . $gpp_idx; - # $context->{preferences}->{$gpp_attr} = { id => set_subscriber_preference($context, + # $context->{usr_preferences}->{$gpp_attr} = { id => set_subscriber_preference($context, # $context->{prov_subscriber}->{id}, # $context->{attributes}->{$gpp_attr}, # $gpp_attr), value => $gpp_attr }; @@ -1695,33 +1702,46 @@ sub _update_ccs_preferences { # } #} - $context->{preferences}->{cloud_pbx} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{cloud_pbx} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{cloud_pbx}, '1'), value => '1' }; - $context->{preferences}->{cloud_pbx_base_cli} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{cloud_pbx_base_cli} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{cloud_pbx_base_cli}, $context->{numbers}->{primary}->{number}), value => $context->{numbers}->{primary}->{number} }; - $context->{preferences}->{cloud_pbx_hunt_policy} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{cloud_pbx_hunt_policy} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{cloud_pbx_hunt_policy}, 'serial'), value => 'serial' }; #contract_sound_set = 25 - $context->{preferences}->{music_on_hold} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{music_on_hold} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{music_on_hold}, '1'), value => '1' }; - $context->{preferences}->{shared_buddylist_visibility} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{shared_buddylist_visibility} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{shared_buddylist_visibility}, '1'), value => '1' }; + clear_contract_preferences($context, + $context->{prov_subscriber}->{account_id}, + $context->{attributes}->{allowed_clis}, + undef, + ); + + my @allowed_clis = (); + push(@allowed_clis,{ id => set_contract_preference($context, + $context->{prov_subscriber}->{account_id}, + $context->{attributes}->{allowed_clis}, + "*"), value => "*"}); + $context->{contract_preferences}->{allowed_clis} = \@allowed_clis; + return $result; } @@ -1781,13 +1801,13 @@ sub _set_callforwards { #time_set_id }); - $context->{preferences}->{$type} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{$type} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{$type}, $cf_mapping_id), value => $cf_mapping_id }; if (defined $context->{ringtimeout}) { - $context->{preferences}->{ringtimeout} = { id => set_subscriber_preference($context, + $context->{usr_preferences}->{ringtimeout} = { id => set_subscriber_preference($context, $context->{prov_subscriber}->{id}, $context->{attributes}->{ringtimeout}, $context->{ringtimeout}), value => $context->{ringtimeout} }; @@ -1807,35 +1827,6 @@ sub _set_callforwards { } -#sub _terminate_contract { -# my ($context,$contract_id) = @_; -# -# my $result = 0; -# my $contract_path = NGCP::BulkProcessor::RestRequests::Trunk::Customers::get_item_path($contract_id); -# eval { -# my $customer; -# if ($dry) { -# $customer = NGCP::BulkProcessor::RestRequests::Trunk::Customers::get_item($contract_id); -# } else { -# $customer = NGCP::BulkProcessor::RestRequests::Trunk::Customers::update_item($contract_id,{ -# status => $NGCP::BulkProcessor::RestRequests::Trunk::Customers::TERMINATED_STATE, -# }); -# } -# $result = (defined $customer ? 1 : 0); -# }; -# if ($@ or not $result) { -# if ($skip_errors) { -# _warn($context,"($context->{rownum}) " . 'subscriber ' . $context->{cli} . ': could not ' . ($dry ? 'fetch' : 'terminate') . ' old contract ' . $contract_path); -# } else { -# _error($context,"($context->{rownum}) " . 'subscriber ' . $context->{cli} . ': could not ' . ($dry ? 'fetch' : 'terminate') . ' old contract ' . $contract_path); -# } -# } else { -# _info($context,"($context->{rownum}) " . 'subscriber ' . $context->{cli} . ': old contract ' . $contract_path . ($dry ? ' fetched' : ' terminated')); -# } -# return $result; -# -#} - sub _error { my ($context,$message) = @_;