summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2010-07-16 23:45:24 +0000
committerivan <ivan>2010-07-16 23:45:24 +0000
commit556b8e9650155e74416496238cfc0e4abe64c53a (patch)
tree26a6cac98ec8a944361a0d913392eab6abd53b6a
parent9414a814e49a86a832e4f56ec1a6bcc927f55e6b (diff)
customer tags, RT#9192
-rw-r--r--FS/FS/AccessRight.pm1
-rw-r--r--FS/FS/Record.pm11
-rw-r--r--FS/FS/cust_main.pm96
-rw-r--r--FS/FS/cust_tag.pm23
-rw-r--r--httemplate/edit/cust_main/top_misc.html7
-rw-r--r--httemplate/edit/part_tag.html8
-rwxr-xr-xhttemplate/edit/process/cust_main.cgi2
-rw-r--r--httemplate/elements/select-cust_tag.html20
-rw-r--r--httemplate/elements/tr-select-cust_tag.html46
-rw-r--r--httemplate/view/cust_main/misc.html16
10 files changed, 212 insertions, 18 deletions
diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm
index 9e79754d3..92c4d2299 100644
--- a/FS/FS/AccessRight.pm
+++ b/FS/FS/AccessRight.pm
@@ -108,6 +108,7 @@ tie my %rights, 'Tie::IxHash',
'View customer',
#'View Customer | View tickets',
'Edit customer',
+ 'Edit customer tags',
'Edit referring customer',
'View customer history',
'Cancel customer',
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index f3dead164..cd5e2d4ca 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -795,6 +795,17 @@ sub setfield {
$self->set(@_);
}
+=item exists COLUMN
+
+Returns true if the column/field/key COLUMN exists.
+
+=cut
+
+sub exists {
+ my($self,$field) = @_;
+ exists($self->{Hash}->{$field});
+}
+
=item AUTLOADED METHODS
$record->column is a synonym for $record->get('column');
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index d8f525e58..84bd6a0e5 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -57,6 +57,7 @@ use FS::cust_tax_location;
use FS::part_pkg_taxrate;
use FS::agent;
use FS::cust_main_invoice;
+use FS::cust_tag;
use FS::cust_credit_bill;
use FS::cust_bill_pay;
use FS::prepay_credit;
@@ -473,6 +474,30 @@ sub insert {
$self->invoicing_list( $invoicing_list );
}
+ warn " setting customer tags\n"
+ if $DEBUG > 1;
+
+ foreach my $tagnum ( @{ $self->tagnum || [] } ) {
+ my $cust_tag = new FS::cust_tag { 'tagnum' => $tagnum,
+ 'custnum' => $self->custnum };
+ my $error = $cust_tag->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ if ( $invoicing_list ) {
+ $error = $self->check_invoicing_list( $invoicing_list );
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ #return "checking invoicing_list (transaction rolled back): $error";
+ return $error;
+ }
+ $self->invoicing_list( $invoicing_list );
+ }
+
+
warn " setting cust_main_exemption\n"
if $DEBUG > 1;
@@ -1356,23 +1381,13 @@ sub delete {
}
}
- foreach my $cust_main_invoice ( #(email invoice destinations, not invoices)
- qsearch( 'cust_main_invoice', { 'custnum' => $self->custnum } )
- ) {
- my $error = $cust_main_invoice->delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
- }
-
- foreach my $cust_main_exemption (
- qsearch( 'cust_main_exemption', { 'custnum' => $self->custnum } )
- ) {
- my $error = $cust_main_exemption->delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
+ foreach my $table (qw( cust_main_invoice cust_main_exemption cust_tag )) {
+ foreach my $record ( qsearch( 'table', { 'custnum' => $self->custnum } ) ) {
+ my $error = $record->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
}
}
@@ -1478,6 +1493,28 @@ sub replace {
$self->invoicing_list( $invoicing_list );
}
+ if ( $self->exists('tagnum') ) { #so we don't delete these on edit by accident
+
+ #this could be more efficient than deleting and re-inserting, if it matters
+ foreach my $cust_tag (qsearch('cust_tag', {'custnum'=>$self->custnum} )) {
+ my $error = $cust_tag->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+ foreach my $tagnum ( @{ $self->tagnum || [] } ) {
+ my $cust_tag = new FS::cust_tag { 'tagnum' => $tagnum,
+ 'custnum' => $self->custnum };
+ my $error = $cust_tag->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ }
+
my %options = @param;
my $tax_exemption = delete $options{'tax_exemption'};
@@ -2475,6 +2512,31 @@ sub agent_name {
$self->agent->agent;
}
+=item cust_tag
+
+Returns any tags associated with this customer, as FS::cust_tag objects,
+or an empty list if there are no tags.
+
+=cut
+
+sub cust_tag {
+ my $self = shift;
+ qsearch('cust_tag', { 'custnum' => $self->custnum } );
+}
+
+=item part_tag
+
+Returns any tags associated with this customer, as FS::part_tag objects,
+or an empty list if there are no tags.
+
+=cut
+
+sub part_tag {
+ my $self = shift;
+ map $_->part_tag, $self->cust_tag;
+}
+
+
=item cust_class
Returns the customer class, as an FS::cust_class object, or the empty string
diff --git a/FS/FS/cust_tag.pm b/FS/FS/cust_tag.pm
index 1d174d127..5dfd156b4 100644
--- a/FS/FS/cust_tag.pm
+++ b/FS/FS/cust_tag.pm
@@ -2,7 +2,9 @@ package FS::cust_tag;
use strict;
use base qw( FS::Record );
-use FS::Record qw( qsearch qsearchs );
+use FS::Record qw( qsearchs );
+use FS::cust_main;
+use FS::part_tag;
=head1 NAME
@@ -112,6 +114,25 @@ sub check {
$self->SUPER::check;
}
+=item cust_main
+
+=cut
+
+sub cust_main {
+ my $self = shift;
+ qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
+}
+
+=item part_tag
+
+=cut
+
+sub part_tag {
+ my $self = shift;
+ qsearchs( 'part_tag', { 'tagnum' => $self->tagnum } );
+}
+
+
=back
=head1 BUGS
diff --git a/httemplate/edit/cust_main/top_misc.html b/httemplate/edit/cust_main/top_misc.html
index 36add3721..916bac001 100644
--- a/httemplate/edit/cust_main/top_misc.html
+++ b/httemplate/edit/cust_main/top_misc.html
@@ -1,5 +1,12 @@
<% &ntable("#cccccc") %>
+%# tags
+<% include('/elements/tr-select-cust_tag.html',
+ 'custnum' => $custnum,
+ 'cgi' => $cgi,
+ )
+%>
+
%# agent
<% include('/elements/tr-select-agent.html',
'curr_value' => $cust_main->agentnum,
diff --git a/httemplate/edit/part_tag.html b/httemplate/edit/part_tag.html
index 938e34256..56ba5672c 100644
--- a/httemplate/edit/part_tag.html
+++ b/httemplate/edit/part_tag.html
@@ -20,4 +20,12 @@
die "access denied"
unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
+#FF6666 red
+#FF9966 orange
+#FFFF66 yellow
+#66FF66 green
+#66FFFF cyan?
+#6666FF blue
+#FF66FF purple? looks more like pink. CC66FF?
+
</%init>
diff --git a/httemplate/edit/process/cust_main.cgi b/httemplate/edit/process/cust_main.cgi
index 1311ba4f3..3158d7bbf 100755
--- a/httemplate/edit/process/cust_main.cgi
+++ b/httemplate/edit/process/cust_main.cgi
@@ -73,6 +73,8 @@ if ( defined($cgi->param('same')) && $cgi->param('same') eq "Y" ) {
);
}
+$new->tagnum( [ $cgi->param('tagnum') ] );
+
my %usedatetime = ( 'birthdate' => 1 );
foreach my $dfield (qw( birthdate signupdate )) {
diff --git a/httemplate/elements/select-cust_tag.html b/httemplate/elements/select-cust_tag.html
new file mode 100644
index 000000000..61d4dca3b
--- /dev/null
+++ b/httemplate/elements/select-cust_tag.html
@@ -0,0 +1,20 @@
+<% include( '/elements/select-table.html',
+ 'table' => 'part_tag',
+ 'name_col' => 'tagname', #tagname - tagdesc??
+ 'multiple' => 1,
+ #'value' => $agentnum || '',
+ #'agent_virt' => 1,
+ 'hashref' => { 'disabled' => '' },
+ 'order_by' => ' ORDER BY tagname',
+ %opt,
+ )
+%>
+<%init>
+
+my %opt = @_;
+#my $agentnum = $opt{'curr_value'} || $opt{'value'};
+
+$opt{'records'} = delete $opt{'part_tag'}
+ if $opt{'part_tag'};
+
+</%init>
diff --git a/httemplate/elements/tr-select-cust_tag.html b/httemplate/elements/tr-select-cust_tag.html
new file mode 100644
index 000000000..d88f3a894
--- /dev/null
+++ b/httemplate/elements/tr-select-cust_tag.html
@@ -0,0 +1,46 @@
+% if ( $curuser->access_right('Edit customer tags') && @part_tag ) {
+
+ <TR>
+ <TD ALIGN="right"><% $opt{'label'} || 'Tags' %></TD>
+ <TD>
+ <% include( '/elements/select-cust_tag.html',
+ 'curr_value' => \@curr_tagnum,
+ 'part_tag' => \@part_tag,
+ %opt,
+ )
+ %>
+ </TD>
+ </TR>
+
+% } else {
+
+% foreach my $tagnum (@curr_tagnum) {
+ <INPUT TYPE="hidden" NAME="tagnum" VALUE="<% $tagnum %>">
+% }
+
+% }
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my %opt = @_;
+my $cgi = $opt{'cgi'};
+
+my @curr_tagnum = ();
+if ( $cgi->param('error') ) {
+ @curr_tagnum = $cgi->param('tagnum');
+} elsif ( $opt{'custnum'} ) {
+ @curr_tagnum = map $_->tagnum,
+ qsearch('cust_tag', { 'custnum' => $opt{'custnum'} } );
+}
+
+my $extra_sql = "WHERE disabled IS NULL OR disabled = '' ";
+$extra_sql .= ' OR tagnum IN ('. join(',', @curr_tagnum). ')' if @curr_tagnum;
+
+my @part_tag = qsearch({
+ 'table' => 'part_tag',
+ 'hashref' => {},
+ 'extra_sql' => $extra_sql,
+});
+
+</%init>
diff --git a/httemplate/view/cust_main/misc.html b/httemplate/view/cust_main/misc.html
index d383e4aa4..2243647a3 100644
--- a/httemplate/view/cust_main/misc.html
+++ b/httemplate/view/cust_main/misc.html
@@ -10,6 +10,22 @@
<TD BGCOLOR="#ffffff"><FONT COLOR="#<% $cust_main->statuscolor %>"><B><% ucfirst($cust_main->status) %></B></FONT></TD>
</TR>
+% my @part_tag = $cust_main->part_tag;
+% if ( @part_tag ) {
+<TR>
+ <TD ALIGN="right">Tags</TD>
+ <TD BGCOLOR="#ffffff">
+% foreach my $part_tag ( @part_tag ) {
+ <FONT <% length($part_tag->tagcolor)
+ ? 'STYLE="background-color:#'.$part_tag->tagcolor.'"'
+ : '' %>
+ ><% $part_tag->tagname.': '. $part_tag->tagdesc |h %></FONT>
+ <BR>
+% }
+ </TD>
+</TR>
+% }
+
%unless ( scalar(@agentnums) == 1
% && !$curuser->access_right('View customers of all agents') ) {
% my $agent = qsearchs('agent',{ 'agentnum' => $cust_main->agentnum } );