From: ivan Date: Sun, 8 Feb 2009 02:05:48 +0000 (+0000) Subject: further work on agents editing own packages: allow them to see (but not edit) global... X-Git-Tag: root_of_webpay_support~75 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=24533a22a23e211888fcc36a5177c0def5c77de3 further work on agents editing own packages: allow them to see (but not edit) global packages for their type, RT#1331 --- diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm index b8ed96a57..5569dfbde 100644 --- a/FS/FS/ClientAPI/Signup.pm +++ b/FS/FS/ClientAPI/Signup.pm @@ -48,15 +48,20 @@ sub signup_info { my $agentnum2part_pkg = { map { - my $href = $_->pkgpart_hashref; - $_->agentnum => + my $agent = $_; + my $href = $agent->pkgpart_hashref; + $agent->agentnum => [ map { { 'payby' => [ $_->payby ], 'freq_pretty' => $_->freq_pretty, 'options' => { $_->options }, %{$_->hashref} } } - grep { $_->svcpart($svc_x) && $href->{ $_->pkgpart } } + grep { $_->svcpart($svc_x) + && ( $href->{ $_->pkgpart } + || $_->agentnum == $agent->agentnum + ) + } qsearch( 'part_pkg', { 'disabled' => '' } ) ]; } qsearch('agent', { 'disabled' => '' }) @@ -73,12 +78,16 @@ sub signup_info { }; warn "label: ". Dumper($label). "\n" if $DEBUG > 2; + my @agent_fields = qw( agentnum agent ); + $signup_info_cache = { 'cust_main_county' => [ map $_->hashref, qsearch('cust_main_county', {} ) ], - 'agent' => [ map $_->hashref, + 'agent' => [ map { my $agent = $_; + map { $_ => $agent->get($_) } @agent_fields; + } qsearch('agent', { 'disabled' => '' } ) ], @@ -123,6 +132,22 @@ sub signup_info { 'signup_service' => $svc_x, 'default_svcpart' => scalar($conf->config('signup_server-default_svcpart')), + 'head' => join("\n", $conf->config('selfservice-head') ), + 'body_header' => join("\n", $conf->config('selfservice-body_header') ), + 'body_footer' => join("\n", $conf->config('selfservice-body_footer') ), + 'body_bgcolor' => scalar( $conf->config('selfservice-body_bgcolor') ), + 'box_bgcolor' => scalar( $conf->config('selfservice-box_bgcolor') ), + + 'company_name' => scalar($conf->config('company_name')), + + #per-agent? + 'agent_ship_address' => scalar($conf->exists('agent-ship_address')), + + 'no_company' => scalar($conf->exists('signup-no_company')), + 'require_phone' => scalar($conf->exists('cust_main-require_phone')), + 'recommend_daytime' => scalar($conf->exists('signup-recommend_daytime')), + 'recommend_email' => scalar($conf->exists('signup-recommend_email')), + }; $cache->set('signup_info_cache', $signup_info_cache); @@ -270,6 +295,19 @@ sub signup_info { ]; warn "$me done setting agent-specific adv. source list\n" if $DEBUG > 1; + my $agent = qsearchs('agent', { 'agentnum' => $agentnum } ); + + $signup_info->{'agent_name'} = $agent->agent; + + $signup_info->{'company_name'} = $conf->config('company_name', $agentnum); + + if ( $signup_info->{'agent_ship_address'} && $agent->agent_custnum ) { + my $cust_main = $agent->agent_cust_main; + my $prefix = length($cust_main->ship_last) ? 'ship_' : ''; + $signup_info->{"ship_$_"} = $cust_main->get("$prefix$_") + foreach qw( address1 city county state zip country ); + } + } # else { # delete $signup_info->{'part_pkg'}; @@ -381,6 +419,19 @@ sub new_customer { } ); + my $agent = qsearchs('agent', { 'agentnum' => $agentnum } ); + if ( $conf->exists('agent_ship_address') && $agent->agent_custnum ) { + my $agent_cust_main = $agent->agent_cust_main; + my $prefix = length($agent_cust_main->ship_last) ? 'ship_' : ''; + $cust_main->set("ship_$_", $agent_cust_main->get("$prefix$_") ) + foreach qw( address1 city county state zip country ); + + $cust_main->set("ship_$_", $cust_main->get($_)) + foreach qw( last first ); + + } + + return { 'error' => "Illegal payment type" } unless grep { $_ eq $packet->{'payby'} } $conf->config('signup_server-payby'); diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi index 780f40b9f..cdaa2c92a 100755 --- a/httemplate/browse/part_pkg.cgi +++ b/httemplate/browse/part_pkg.cgi @@ -46,6 +46,7 @@ if ( $cgi->param('active') ) { my $extra_sql = ''; +#false laziness w/elements/select-part_pkg.html my $agentnums = join(',', $curuser->agentnums); unless ( $acl_edit_global ) { @@ -62,6 +63,7 @@ unless ( $acl_edit_global ) { ) "; } +#eofalse my $count_cust_pkg = " SELECT COUNT(*) FROM cust_pkg LEFT JOIN cust_main USING ( custnum ) diff --git a/httemplate/edit/elements/edit.html b/httemplate/edit/elements/edit.html index f4e4195de..76fcd384b 100644 --- a/httemplate/edit/elements/edit.html +++ b/httemplate/edit/elements/edit.html @@ -254,7 +254,7 @@ Example: % 'layer_values' => $layer_values, % 'html_between' => $f->{'html_between'}, % -% #umm. +% #umm. for select-agent_types at least % 'disabled' => $f->{'disabled'}, % ); % @@ -641,7 +641,8 @@ if ( $cgi->param('error') ) { $value = $query; } $value =~ /^(\d+)$/ or die "unparsable $pkey"; - $object = qsearchs({ %qsearch, 'hashref' => { $pkey => $1 } }); + $object = qsearchs({ %qsearch, 'hashref' => { $pkey => $1 } }) + or die "$pkey $1 not found in $table"; warn "$table $pkey => $1" if $opt{'debug'}; diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index 4b519f5fa..3efc26cc3 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -1,12 +1,16 @@ <% include( 'elements/edit.html', - 'post_url' => popurl(1).'process/part_pkg.cgi', - 'name' => "Package definition", - 'table' => 'part_pkg', - #'viewall_dir' => 'browse', - 'viewall_url' => $p.'browse/part_pkg.cgi', - 'html_init' => include('/elements/init_overlib.html'). - $freq_changed, - 'html_bottom' => $html_bottom, + 'post_url' => popurl(1).'process/part_pkg.cgi', + 'name' => "Package definition", + 'table' => 'part_pkg', + + 'agent_virt' => 1, + 'agent_null_right' => $edit_global, + + #'viewall_dir' => 'browse', + 'viewall_url' => $p.'browse/part_pkg.cgi', + 'html_init' => include('/elements/init_overlib.html'). + $freq_changed, + 'html_bottom' => $html_bottom, 'begin_callback' => $begin_callback, 'end_callback' => $end_callback, @@ -32,7 +36,7 @@ 'disabled' => 'Disable new orders', 'pay_weight' => 'Payment weight', 'credit_weight' => 'Credit weight', - 'agentnum' => '', + 'agentnum' => 'Agent', 'setup_fee' => 'Setup fee', 'recur_fee' => 'Recurring fee', 'bill_dst_pkgpart' => 'Include line item(s) from package', @@ -57,6 +61,11 @@ maxlength => 50, }, {field=>'comment', type=>'text', size=>40 }, #32 + { field => 'agentnum', + type => 'select-agent', + disable_empty => ! $acl_edit_global, + empty_label => '(global)', + }, {field=>'classnum', type=>'select-pkg_class' }, {field=>'disabled', type=>$disabled_type, value=>'Y'}, @@ -125,8 +134,9 @@ { type => 'columnnext' }, - { field=>'agent_type', - type => 'select-agent_types', + { field => 'agent_type', + type => 'select-agent_types', + disabled => ! $acl_edit_global, curr_value_callback => sub { my($cgi, $object, $field) = @_; #in the other callbacks..? hmm. @@ -175,19 +185,22 @@ my $curuser = $FS::CurrentUser::CurrentUser; -my $edit_right = $curuser->access_right('Edit package definitions') - || $curuser->access_right('Edit global package definitions'); +my $edit_global = 'Edit global package definitions'; +my $acl_edit = $curuser->access_right('Edit package definitions'); +my $acl_edit_global = $curuser->access_right($edit_global); + +my $acl_edit_either = $acl_edit || $acl_edit_global; my $begin_callback = sub { my( $cgi, $fields, $opt ) = @_; die "access denied" - unless $edit_right + unless $acl_edit_either || ( $cgi->param('pkgnum') && $curuser->access_right('Customize customer package') ); }; -my $disabled_type = $edit_right ? 'checkbox' : 'hidden'; +my $disabled_type = $acl_edit_either ? 'checkbox' : 'hidden'; my $conf = new FS::Conf; my $taxproducts = $conf->exists('enable_taxproducts'); diff --git a/httemplate/edit/process/part_pkg.cgi b/httemplate/edit/process/part_pkg.cgi index 669b75946..96c5b36b7 100755 --- a/httemplate/edit/process/part_pkg.cgi +++ b/httemplate/edit/process/part_pkg.cgi @@ -1,11 +1,12 @@ <% include( 'elements/process.html', #'debug' => 1, 'table' => 'part_pkg', + 'agent_virt' => 1, + 'agent_null_right' => \@agent_null_right, 'redirect' => $redirect_callback, 'viewall_dir' => 'browse', 'viewall_ext' => 'cgi', 'edit_ext' => 'cgi', - #XXX usable with cloning? #'agent_null_right' => 'Edit global package definitions', 'precheck_callback' => $precheck_callback, 'args_callback' => $args_callback, 'process_m2m' => \@process_m2m, @@ -13,12 +14,21 @@ %> <%init> +my $customizing = ( ! $cgi->param('pkgpart') && $cgi->param('pkgnum') ); + my $curuser = $FS::CurrentUser::CurrentUser; +my $edit_global = 'Edit global package definitions'; +my $customize = 'Customize customer package'; + die "access denied" unless $curuser->access_right('Edit package definitions') - || $curuser->access_right('Edit global package definitions') - || ( ! $cgi->param('pkgpart') && $cgi->param('pkgnum') && $curuser->access_right('Customize customer package') ); + || $curuser->access_right($edit_global) + || ( $customizing && $curuser->access_right($customize) ); + +my @agent_null_right = ( $edit_global ); +push @agent_null_right, $customize if $customizing; + my $precheck_callback = sub { my( $cgi ) = @_; @@ -41,7 +51,8 @@ my $precheck_callback = sub { unless scalar(@agents) || ( $cgi->param('clone') && $cgi->param('clone') =~ /^\d+$/ ) || ( !$cgi->param('pkgpart') && $conf->exists('agent-defaultpkg') ) - || $cgi->param('disabled'); + || $cgi->param('disabled') + || $cgi->param('agentnum'); return ''; diff --git a/httemplate/elements/select-agent_types.html b/httemplate/elements/select-agent_types.html index e56fee43c..400b453b3 100644 --- a/httemplate/elements/select-agent_types.html +++ b/httemplate/elements/select-agent_types.html @@ -1,5 +1,5 @@ %# if ( $cgi->param('clone') ) { #XXX -% if ( $opt{'disable'} ) { +% if ( $opt{'disabled'} ) { diff --git a/httemplate/elements/select-cust-part_pkg.html b/httemplate/elements/select-cust-part_pkg.html index 57da5cd84..292662921 100644 --- a/httemplate/elements/select-cust-part_pkg.html +++ b/httemplate/elements/select-cust-part_pkg.html @@ -32,8 +32,10 @@ my $cust_main = $opt{'cust_main'} or die "cust_main not specified"; $opt{'extra_sql'} .= - ' AND 0 < ( SELECT COUNT(*) FROM type_pkgs '. - ' WHERE typenum = '. $cust_main->agent->typenum. - ' AND type_pkgs.pkgpart = part_pkg.pkgpart )'; + ' AND ( agentnum IS NOT NULL '. + ' OR 0 < ( SELECT COUNT(*) FROM type_pkgs '. + ' WHERE typenum = '. $cust_main->agent->typenum. + ' AND type_pkgs.pkgpart = part_pkg.pkgpart )'. + ' )'; diff --git a/httemplate/elements/select-part_pkg.html b/httemplate/elements/select-part_pkg.html index a1d5f40f2..cd6d24c28 100644 --- a/httemplate/elements/select-part_pkg.html +++ b/httemplate/elements/select-part_pkg.html @@ -17,6 +17,8 @@ Example: <% include( '/elements/select-table.html', 'table' => 'part_pkg', + 'agent_virt' => 1, + 'agent_null' => 1, 'name_col' => 'pkg', 'empty_label' => 'Select package', #should this be the default? 'label_callback' => sub { shift->pkg_comment }, @@ -31,4 +33,20 @@ my( %opt ) = @_; $opt{'records'} = delete $opt{'part_pkg'} if $opt{'part_pkg'}; +#false laziness w/browse/part_pkg.cgi +my $agentnums = join(',', $FS::CurrentUser::CurrentUser->agentnums); + +$opt{'extra_sql'} .= + " AND ( agentnum IS NOT NULL + OR 0 < ( SELECT COUNT(*) + FROM type_pkgs + LEFT JOIN agent_type USING ( typenum ) + LEFT JOIN agent AS typeagent USING ( typenum ) + WHERE type_pkgs.pkgpart = part_pkg.pkgpart + AND typeagent.agentnum IN ($agentnums) + ) + ) + "; +#eofalse + diff --git a/httemplate/elements/select-table.html b/httemplate/elements/select-table.html index 32a61e989..4efbcbaf3 100644 --- a/httemplate/elements/select-table.html +++ b/httemplate/elements/select-table.html @@ -24,6 +24,7 @@ Example: 'extra_sql' => '', 'agent_virt' => 0, #set true and make sure the result is JOINed to #something with agentnum (usually cust_main) + 'agent_null' => 0, #set true to always show un-agented entries 'agent_null_right' => '', #right to see un-agented entries #or 'records' => \@records, #instead of search params @@ -120,7 +121,8 @@ if ( $opt{'agent_virt'} ) { $extra_sql .= ( $extra_sql =~ /WHERE/i || scalar(keys %$hashref ) ? ' AND ' : ' WHERE ' ). $FS::CurrentUser::CurrentUser->agentnums_sql( - 'null_right' => $opt{'agent_null_right'} + 'null' => $opt{'agent_null'}, + 'null_right' => $opt{'agent_null_right'}, ); } diff --git a/httemplate/elements/tr-select-agent_types.html b/httemplate/elements/tr-select-agent_types.html index 29ac7f1b4..efbf386a7 100644 --- a/httemplate/elements/tr-select-agent_types.html +++ b/httemplate/elements/tr-select-agent_types.html @@ -1,4 +1,4 @@ -% unless ( $opt{'disable'} || scalar(@all_agent_types) == 1 ) { +% unless ( $opt{'disabled'} || scalar(@all_agent_types) == 1 ) { <% include('/elements/tr-justtitle.html', value=>'Agent (reseller) types') %> diff --git a/httemplate/search/elements/search.html b/httemplate/search/elements/search.html index dd0555c6d..23fe8f470 100644 --- a/httemplate/search/elements/search.html +++ b/httemplate/search/elements/search.html @@ -92,8 +92,8 @@ Example: 'footer' => [], #disabling things - 'disable_download' => '', # set true to hide the CSV/Excel download links - 'disable_total' => '', # set true to hide the total" + 'disable_download' => '', # set true to hide the CSV/Excel download links + 'disable_total' => '', # set true to hide the total" 'disable_maxselect' => '', # set true to disable record/page selection 'disable_nonefound' => '', # set true to disable the "No matching Xs found" # message @@ -110,12 +110,17 @@ Example: # header & fields need to be defined) #handling agent virtualization - 'agent_virt' => 1, # set true if this search should be agent-virtualized - 'agent_null_right' => 'Access Right', #opt. right to view global records - 'agent_pos' => 3, #optional position (starting from 0) to insert - #an Agent column - #(query needs to be a qsearch hashref and - # header & fields need to be defined) + 'agent_virt' => 1, # set true if this search should be + # agent-virtualized + 'agent_null_right' => 'Access Right', # optional right to view global + # records + 'agent_null_right_link' => 'Access Right' # optional right to link to + # global records; defaults to + # same as agent_null_right + 'agent_pos' => 3, # optional position (starting from 0) to + # insert an Agent column (query needs to be a + # qsearch hashref and header & fields need to + # be defined) # link & display properties for fields @@ -581,23 +586,33 @@ Example: % my $a = ''; % if ( $links ) { % my $link = shift @$links; -% $link = &{$link}($row) -% if ref($link) eq 'CODE'; -% % my $onclick = shift @$onclicks; -% $onclick = &{$onclick}($row) -% if ref($onclick) eq 'CODE'; -% $onclick = qq( onClick="$onclick") if $onclick; -% -% if ( $link ) { -% my( $url, $method ) = @{$link}; -% if ( ref($method) eq 'CODE' ) { -% $a = $url. &{$method}($row); -% } else { -% $a = $url. $row->$method(); +% +% if ( ! $opt{'agent_virt'} +% || ( $null_link && ! $row->agentnum ) +% || grep { $row->agentnum == $_ } +% @link_agentnums +% ) { +% +% $link = &{$link}($row) +% if ref($link) eq 'CODE'; +% +% $onclick = &{$onclick}($row) +% if ref($onclick) eq 'CODE'; +% $onclick = qq( onClick="$onclick") if $onclick; +% +% if ( $link ) { +% my( $url, $method ) = @{$link}; +% if ( ref($method) eq 'CODE' ) { +% $a = $url. &{$method}($row); +% } else { +% $a = $url. $row->$method(); +% } +% $a = qq(); % } -% $a = qq(); +% % } +% % } % % my $font = ''; @@ -702,18 +717,25 @@ $opt{align} = [ map $align{$_}, split(//, $opt{align}) ], $opt{disable_download} = 0 if $opt{disable_download} && $curuser->access_right('Configuration download'); +my @link_agentnums = (); +my $null_link = ''; if ( $opt{'agent_virt'} ) { + @link_agentnums = $curuser->agentnums; + $null_link = $curuser->access_right( $opt{'agent_null_right_link'} + || $opt{'agent_null_right'} ); + my $agentnums_sql = $curuser->agentnums_sql( 'null_right' => $opt{'agent_null_right'} ); $opt{'query'}{'extra_sql'} .= - ( $opt{'query'} =~ /WHERE/i ? ' AND ' : ' WHERE ' ). - $agentnums_sql; + ( $opt{'query'}{'extra_sql'} =~ /WHERE/i || keys %{$opt{'query'}{'hashref'}} + ? ' AND ' + : ' WHERE ' ). $agentnums_sql; + $opt{'count_query'} .= - ( $opt{'count_query'} =~ /WHERE/i ? ' AND ' : ' WHERE ' ). - $agentnums_sql; + ( $opt{'count_query'} =~ /WHERE/i ? ' AND ' : ' WHERE ' ). $agentnums_sql; if ( $opt{'agent_pos'} || $opt{'agent_pos'} eq '0' and scalar($curuser->agentnums) > 1 ) {