further work on agents editing own packages: allow them to see (but not edit) global...
authorivan <ivan>
Sun, 8 Feb 2009 02:05:48 +0000 (02:05 +0000)
committerivan <ivan>
Sun, 8 Feb 2009 02:05:48 +0000 (02:05 +0000)
FS/FS/ClientAPI/Signup.pm
httemplate/browse/part_pkg.cgi
httemplate/edit/elements/edit.html
httemplate/edit/part_pkg.cgi
httemplate/edit/process/part_pkg.cgi
httemplate/elements/select-agent_types.html
httemplate/elements/select-cust-part_pkg.html
httemplate/elements/select-part_pkg.html
httemplate/elements/select-table.html
httemplate/elements/tr-select-agent_types.html
httemplate/search/elements/search.html

index b8ed96a..5569dfb 100644 (file)
@@ -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');
index 780f40b..cdaa2c9 100755 (executable)
@@ -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 )
index f4e4195..76fcd38 100644 (file)
@@ -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'};
index 4b519f5..3efc26c 100755 (executable)
@@ -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',
                                 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'},
 
 
                             { 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.
 
 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');
index 669b759..96c5b36 100755 (executable)
@@ -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,
 %>
 <%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 '';
 
index e56fee4..400b453 100644 (file)
@@ -1,5 +1,5 @@
 %# if ( $cgi->param('clone') ) { #XXX
-% if ( $opt{'disable'} ) { 
+% if ( $opt{'disabled'} ) { 
 
     <INPUT TYPE="hidden" NAME="agent_type" VALUE="">
 
index 57da5cd..2926629 100644 (file)
@@ -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 )'.
+  '     )';
 
 </%init>
index a1d5f40..cd6d24c 100644 (file)
@@ -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
+
 </%init>
index 32a61e9..4efbcba 100644 (file)
@@ -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'},
                                    );
 }
 
index 29ac7f1..efbf386 100644 (file)
@@ -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') %>
 
index dd0555c..23fe8f4 100644 (file)
@@ -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 HREF="$a"$onclick>);
 %                           }
-%                           $a = qq(<A HREF="$a"$onclick>);
+%
 %                         }
+%
 %                       }
 %
 %                       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           ) {