[freeside-commits] branch FREESIDE_3_BRANCH updated. 48c5c17b6ca02cd04f1dd5deb530738f2409c585

Ivan ivan at 420.am
Sun Aug 18 16:10:00 PDT 2013


The branch, FREESIDE_3_BRANCH has been updated
       via  48c5c17b6ca02cd04f1dd5deb530738f2409c585 (commit)
       via  82e249a5e6f02c2afa4e32b5a5fba3155b935a59 (commit)
      from  7be7baeebee74dab20d5a0a63f7066094c47519b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 48c5c17b6ca02cd04f1dd5deb530738f2409c585
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Sun Aug 18 16:09:57 2013 -0700

    continue sales person work: customer and package selection, commissions, reporting.  RT#23402

diff --git a/FS/FS.pm b/FS/FS.pm
index e33b576..1751307 100644
--- a/FS/FS.pm
+++ b/FS/FS.pm
@@ -3,7 +3,7 @@ package FS;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '3.1';
+$VERSION = '3.2git';
 
 #find missing entries in this file with:
 # for a in `ls *pm | cut -d. -f1`; do grep 'L<FS::'$a'>' ../FS.pm >/dev/null || echo "missing $a" ; done
@@ -272,6 +272,8 @@ L<FS::usage_class> - Usage class class
 
 L<FS::sales> - Sales person class
 
+L<FS::sales_pkg_class> - Sales person package class commission class
+
 L<FS::agent> - Agent (reseller) class
 
 L<FS::agent_pkg_class> - Agent (reseller) package class commission class
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm
index f9c5981..bc818e5 100644
--- a/FS/FS/Mason.pm
+++ b/FS/FS/Mason.pm
@@ -341,6 +341,7 @@ if ( -e $addl_handler_use_file ) {
   use FS::part_pkg_msgcat;
   use FS::svc_cable;
   use FS::cable_device;
+  use FS::sales_pkg_class;
   # Sammath Naur
 
   if ( $FS::Mason::addl_handler_use ) {
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 65e42e8..81fe23b 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -525,6 +525,19 @@ sub tables_hashref {
       'index' => [ ['salesnum'], ['disabled'] ],
     },
 
+    'sales_pkg_class' => {
+      'columns' => [
+        'salespkgclassnum',    'serial',     '',    '', '', '',
+        'salesnum',               'int',     '',    '', '', '',
+        'classnum',               'int', 'NULL',    '', '', '',
+        'commission_percent', 'decimal',     '', '7,4', '', '',
+        'commission_duration',    'int', 'NULL',    '', '', '',
+      ],
+      'primary_key' => 'salespkgclassnum',
+      'unique'      => [ [ 'salesnum', 'classnum' ], ],
+      'index'       => [],
+    },
+
     'cust_attachment' => {
       'columns' => [
         'attachnum', 'serial', '', '', '', '',
diff --git a/FS/FS/agent_pkg_class.pm b/FS/FS/agent_pkg_class.pm
index 1683c1a..5c5c3f7 100644
--- a/FS/FS/agent_pkg_class.pm
+++ b/FS/FS/agent_pkg_class.pm
@@ -1,8 +1,10 @@
 package FS::agent_pkg_class;
+use base qw( FS::Record );
 
 use strict;
-use base qw( FS::Record );
-use FS::Record qw( qsearch qsearchs );
+#use FS::Record qw( qsearch qsearchs );
+use FS::agent;
+use FS::pkg_class;
 
 =head1 NAME
 
@@ -25,7 +27,7 @@ FS::agent_pkg_class - Object methods for agent_pkg_class records
 
 =head1 DESCRIPTION
 
-An FS::agent_pkg_class object represents an commission for a specific agent
+An FS::agent_pkg_class object represents a commission for a specific agent
 and package class.  FS::agent_pkg_class inherits from FS::Record.  The
 following fields are currently supported:
 
@@ -109,7 +111,7 @@ sub check {
 
 =head1 SEE ALSO
 
-L<FS::Record>, schema.html from the base documentation.
+L<FS::agent>, L<FS::pkg_class>, L<FS::Record>.
 
 =cut
 
diff --git a/FS/FS/agent_pkg_class.pm b/FS/FS/sales_pkg_class.pm
similarity index 65%
copy from FS/FS/agent_pkg_class.pm
copy to FS/FS/sales_pkg_class.pm
index 1683c1a..0fb7e86 100644
--- a/FS/FS/agent_pkg_class.pm
+++ b/FS/FS/sales_pkg_class.pm
@@ -1,19 +1,21 @@
-package FS::agent_pkg_class;
+package FS::sales_pkg_class;
+use base qw( FS::Record );
 
 use strict;
-use base qw( FS::Record );
-use FS::Record qw( qsearch qsearchs );
+#use FS::Record qw( qsearch qsearchs );
+use FS::sales;
+use FS::pkg_class;
 
 =head1 NAME
 
-FS::agent_pkg_class - Object methods for agent_pkg_class records
+FS::sales_pkg_class - Object methods for sales_pkg_class records
 
 =head1 SYNOPSIS
 
-  use FS::agent_pkg_class;
+  use FS::sales_pkg_class;
 
-  $record = new FS::agent_pkg_class \%hash;
-  $record = new FS::agent_pkg_class { 'column' => 'value' };
+  $record = new FS::sales_pkg_class \%hash;
+  $record = new FS::sales_pkg_class { 'column' => 'value' };
 
   $error = $record->insert;
 
@@ -25,19 +27,19 @@ FS::agent_pkg_class - Object methods for agent_pkg_class records
 
 =head1 DESCRIPTION
 
-An FS::agent_pkg_class object represents an commission for a specific agent
-and package class.  FS::agent_pkg_class inherits from FS::Record.  The
+An FS::sales_pkg_class object represents a commission for a specific sales
+person and package class.  FS::sales_pkg_class inherits from FS::Record.  The
 following fields are currently supported:
 
 =over 4
 
-=item agentpkgclassnum
+=item salespkgclassnum
 
 primary key
 
-=item agentnum
+=item salesnum
 
-agentnum
+salesnum
 
 =item classnum
 
@@ -47,6 +49,10 @@ classnum
 
 commission_percent
 
+=item commission_duration
+
+commission_duration
+
 
 =back
 
@@ -63,7 +69,7 @@ points to.  You can ask the object for a copy with the I<hash> method.
 
 =cut
 
-sub table { 'agent_pkg_class'; }
+sub table { 'sales_pkg_class'; }
 
 =item insert
 
@@ -93,10 +99,11 @@ sub check {
   $self->commission_percent(0) unless length($self->commission_percent);
 
   my $error = 
-    $self->ut_numbern('agentpkgclassnum')
-    || $self->ut_foreign_key('agentnum', 'agent', 'agentnum')
+    $self->ut_numbern('salespkgclassnum')
+    || $self->ut_foreign_key('salesnum', 'sales', 'salesnum')
     || $self->ut_foreign_keyn('classnum', 'pkg_class', 'classnum')
     || $self->ut_float('commission_percent')
+    || $self->ut_numbern('commission_duration')
   ;
   return $error if $error;
 
@@ -109,7 +116,7 @@ sub check {
 
 =head1 SEE ALSO
 
-L<FS::Record>, schema.html from the base documentation.
+L<FS::sales>, L<FS::pkg_class, L<FS::Record>.
 
 =cut
 
diff --git a/FS/MANIFEST b/FS/MANIFEST
index 3d81dbb..deadb4b 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -696,3 +696,5 @@ FS/cable_device.pm
 t/cable_device.t
 FS/h_svc_cable.pm
 t/h_svc_cable.t
+FS/sales_pkg_class.pm
+t/sales_pkg_class.t
diff --git a/FS/t/sales_pkg_class.t b/FS/t/sales_pkg_class.t
new file mode 100644
index 0000000..a07cf09
--- /dev/null
+++ b/FS/t/sales_pkg_class.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::sales_pkg_class;
+$loaded=1;
+print "ok 1\n";
diff --git a/httemplate/browse/sales.html b/httemplate/browse/sales.html
index 1cdc490..6fac058 100644
--- a/httemplate/browse/sales.html
+++ b/httemplate/browse/sales.html
@@ -14,9 +14,10 @@
 <%init>
 
 my $curuser = $FS::CurrentUser::CurrentUser;
-
 die "access denied" unless $curuser->access_right('Edit sales people');
 
+#Sales people bring in business.<BR><BR>
+
 my @header = ( 'Sales person' );
 my @fields = ( 'salesperson' );
 my @links  = ( [$p.'edit/sales.html?', 'salesnum'] );
@@ -27,6 +28,45 @@ if ( $curuser->access_right('Configuration') ) {
   push @links,  [ $p.'edit/agent.cgi?', 'agentnum' ];
 }
 
-#Sales people bring in business.<BR><BR>
+push @header, 'Commissions';
+push @fields, sub {
+
+  my $sales = shift;
+
+  #started out as false laziness w/browse/agent.cgi
+  #  (which said surprising amount of false laziness w/ edit/process/agent.cgi)
+  # but this now returns an edit.html data structure that renders to a table
+  #  instead of HTML
+
+  my @pkg_class = qsearch('pkg_class', { 'disabled'=>'' });
+
+  [
+    map {
+          my %sales_pkg_class = ( 'salesnum' => $sales->salesnum,
+                                  'classnum' => $_ ? $_->classnum : ''
+                                );
+          my $sales_pkg_class =
+            qsearchs( 'sales_pkg_class', \%sales_pkg_class )
+            || new FS::sales_pkg_class   \%sales_pkg_class;
+          #my $param = 'classnum'. $sales_pkg_class{classnum};
+
+          [
+            { align => 'right',
+              data  => ($sales_pkg_class->commission_percent || 0). '%',
+            },
+            { align => 'left',
+              data  => ' '. encode_entities(
+                         $_ ? $_->classname : mt('(no package class)')
+                       ),
+            },
+          ];
+
+        }
+      ( '', @pkg_class )
+
+  ];
+
+};
+#push @links, '';
 
 </%init>
diff --git a/httemplate/edit/agent.cgi b/httemplate/edit/agent.cgi
index b043d1e..fe5b164 100755
--- a/httemplate/edit/agent.cgi
+++ b/httemplate/edit/agent.cgi
@@ -141,38 +141,13 @@
 </TABLE>
 <BR>
 
-<FONT CLASS="fsinnerbox-title"><% mt('Commissions') |h %></FONT>
-<TABLE CLASS="fsinnerbox">
-
-% #surprising amount of false laziness w/ edit/process/agent.cgi
-% my @pkg_class = qsearch('pkg_class', { 'disabled'=>'' });
-% foreach my $pkg_class ( '', @pkg_class ) {
-%   my %agent_pkg_class = ( 'agentnum' => $agent->agentnum,
-%                           'classnum' => $pkg_class ? $pkg_class->classnum : ''
-%                         );
-%   my $agent_pkg_class =
-%     qsearchs( 'agent_pkg_class', \%agent_pkg_class )
-%     || new FS::agent_pkg_class   \%agent_pkg_class;
-%   my $param = 'classnum'. $agent_pkg_class{classnum};
-
-    <TR>
-      <TD><INPUT TYPE      = "text"
-                 NAME      = "<% $param %>"
-                 VALUE     = "<% $cgi->param($param) || $agent_pkg_class->commission_percent |h %>"
-                 SIZE      = 6
-                 MAXLENGTH = 7
-          >%
-      </TD>
-      <TD><% $pkg_class ? $pkg_class->classname : mt('(no package class)') |h %>
-      </TD>
-    </TR>
-
-% }
-
-</TABLE>
-
-
+<& /elements/table-commissions.html,
+     'source_obj'   => $agent,
+     'link_table'   => 'agent_pkg_class',
+     #'target_table' => 'pkg_class',
+&>
 <BR>
+
 <INPUT TYPE="submit" VALUE="<% $agent->agentnum ? "Apply changes" : "Add agent" %>">
 
 </FORM>
diff --git a/httemplate/edit/process/sales.html b/httemplate/edit/process/sales.html
index b60276d..1bb1797 100644
--- a/httemplate/edit/process/sales.html
+++ b/httemplate/edit/process/sales.html
@@ -1,12 +1,41 @@
 <& elements/process.html,
-     'table'       => 'sales',
-     'viewall_dir' => 'browse',
-     'agent_virt'  => 1,
+     'table'            => 'sales',
+     'viewall_dir'      => 'browse',
+     'agent_virt'       => 1,
+     'noerror_callback' => $process_sales_pkg_class,
 &>
 <%init>
 
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Edit sales people');
 
+#false laziness w/process/agent.cgi
+my $process_sales_pkg_class = sub {
+  my( $cgi, $sales ) = @_;
+
+  #surprising amount of false laziness w/ edit/agent.cgi
+  my @pkg_class = qsearch('pkg_class', { 'disabled'=>'' });
+  foreach my $pkg_class ( '', @pkg_class ) {
+    my %sales_pkg_class = ( 'salesnum' => $sales->salesnum,
+                            'classnum' => $pkg_class ? $pkg_class->classnum : ''
+                          );
+    my $sales_pkg_class =
+      qsearchs( 'sales_pkg_class', \%sales_pkg_class )
+      || new FS::sales_pkg_class   \%sales_pkg_class;
+
+    my $param = 'classnum'. $sales_pkg_class{classnum};
+
+    $sales_pkg_class->commission_percent( $cgi->param($param) );
+
+    my $method = $sales_pkg_class->salespkgclassnum ? 'replace' : 'insert';
+
+    my $error = $sales_pkg_class->$method;
+    die $error if $error; #XXX push this down into sales.pm w/better/transactional error handling
+
+  }
+
+};
+
+
 </%init>
 
diff --git a/httemplate/edit/sales.html b/httemplate/edit/sales.html
index 65cddfc..763f861 100755
--- a/httemplate/edit/sales.html
+++ b/httemplate/edit/sales.html
@@ -12,6 +12,16 @@
                         },
      'viewall_dir'   => 'browse',
      'agent_virt'    => 1,
+     'html_bottom'   => sub {
+                              my $sales = shift;
+
+                              '<BR>'.
+                              include('/elements/table-commissions.html',
+                                        'source_obj'   => $sales,
+                                        'link_table'   => 'sales_pkg_class',
+                                        #'target_table' => 'pkg_class',
+                                     );
+                            },
 &>
 <%init>
 
diff --git a/httemplate/elements/table-commissions.html b/httemplate/elements/table-commissions.html
new file mode 100644
index 0000000..ce5808d
--- /dev/null
+++ b/httemplate/elements/table-commissions.html
@@ -0,0 +1,44 @@
+<FONT CLASS="fsinnerbox-title"><% mt('Commissions') |h %></FONT>
+<TABLE CLASS="fsinnerbox">
+
+% my $pkey = $object->primary_key;
+% my $pkey_value = $object->$pkey();
+% my $link_class = 'FS::'.$link_table;
+% 
+% #surprising amount of false laziness w/ edit/process/agent.cgi
+% # (somewhat less now that we're more generic)
+% my @pkg_class = qsearch($target_table, { 'disabled'=>'' });
+% foreach my $pkg_class ( '', @pkg_class ) {
+%   my %thing_pkg_class = ( $pkey    => $pkey_value,
+%                           classnum => $pkg_class ? $pkg_class->classnum : ''
+%                         );
+%   my $thing_pkg_class =
+%     qsearchs( $link_table, \%thing_pkg_class )
+%     || $link_class->new( \%thing_pkg_class );
+%   my $param = 'classnum'. $thing_pkg_class{classnum};
+
+    <TR>
+      <TD><INPUT TYPE      = "text"
+                 NAME      = "<% $param %>"
+                 VALUE     = "<% $cgi->param($param) || $thing_pkg_class->commission_percent |h %>"
+                 SIZE      = 6
+                 MAXLENGTH = 7
+          >%
+      </TD>
+      <TD><% $pkg_class ? $pkg_class->classname : mt('(no package class)') |h %>
+      </TD>
+    </TR>
+
+% }
+
+</TABLE>
+
+<%init>
+
+my %opt = @_;
+
+my $object = $opt{'source_obj'};
+my $link_table = $opt{'link_table'};
+my $target_table = $opt{'target_table'} || 'pkg_class';
+
+</%init>
diff --git a/httemplate/search/agent_commission.html b/httemplate/search/agent_commission.html
index b94ae9f..2818d2e 100644
--- a/httemplate/search/agent_commission.html
+++ b/httemplate/search/agent_commission.html
@@ -33,11 +33,10 @@ td.money:before { content: '<% $money_char %>'; }
 %   if ( $custnum ne $cust_pkg->custnum ) {
 %     # start of a new customer section
 %     my $cust_main = $cust_pkg->cust_main;
-%     my $label = $cust_main->custnum . ': '. $cust_main->name;
 %     $bgcolor = 0;
   <TR>
     <TD COLSPAN=4 CLASS="cust_head">
-      <A HREF="<%$p%>view/cust_main.cgi?<%$cust_main->custnum%>"><% $label %></A>
+      <A HREF="<%$p%>view/cust_main.cgi?<%$cust_main->custnum%>"><% $cust_main->display_custnum %>: <% $cust_main->name |h %></A>
     </TD>
   </TR>
 %   }

commit 82e249a5e6f02c2afa4e32b5a5fba3155b935a59
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Sun Aug 18 16:07:12 2013 -0700

    obsolete

diff --git a/FS/MANIFEST.SKIP b/FS/MANIFEST.SKIP
deleted file mode 100644
index ae335e7..0000000
--- a/FS/MANIFEST.SKIP
+++ /dev/null
@@ -1 +0,0 @@
-CVS/

-----------------------------------------------------------------------

Summary of changes:
 FS/FS.pm                                         |    4 +-
 FS/FS/Mason.pm                                   |    1 +
 FS/FS/Schema.pm                                  |   13 ++++++
 FS/FS/agent_pkg_class.pm                         |   10 +++--
 FS/FS/{agent_pkg_class.pm => sales_pkg_class.pm} |   39 +++++++++++--------
 FS/MANIFEST                                      |    2 +
 FS/MANIFEST.SKIP                                 |    1 -
 FS/t/{AccessRight.t => sales_pkg_class.t}        |    2 +-
 httemplate/browse/sales.html                     |   44 +++++++++++++++++++++-
 httemplate/edit/agent.cgi                        |   37 +++---------------
 httemplate/edit/process/sales.html               |   35 ++++++++++++++++-
 httemplate/edit/sales.html                       |   10 +++++
 httemplate/elements/table-commissions.html       |   44 ++++++++++++++++++++++
 httemplate/search/agent_commission.html          |    3 +-
 14 files changed, 184 insertions(+), 61 deletions(-)
 copy FS/FS/{agent_pkg_class.pm => sales_pkg_class.pm} (65%)
 delete mode 100644 FS/MANIFEST.SKIP
 copy FS/t/{AccessRight.t => sales_pkg_class.t} (80%)
 create mode 100644 httemplate/elements/table-commissions.html




More information about the freeside-commits mailing list