summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2010-06-07 02:39:35 +0000
committerivan <ivan>2010-06-07 02:39:35 +0000
commit31a9c95e5b7125ef666248699fff31f1f8211364 (patch)
tree3673d519ac208bbf6b4ecc174511d3cef99a1501
parentda99804133e55d5ce02402645b593a6de06d1947 (diff)
domain rules based on templates (rules from other domains), RT#7514
-rw-r--r--FS/FS/Conf.pm7
-rw-r--r--FS/FS/cgp_rule.pm63
-rw-r--r--httemplate/browse/cgp_rule.html32
-rw-r--r--httemplate/edit/process/cgp_rule.html6
-rw-r--r--httemplate/edit/process/elements/process.html11
-rw-r--r--httemplate/misc/clone-cgp_rule.html27
6 files changed, 130 insertions, 16 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 472320d..89a36af 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -2440,6 +2440,13 @@ worry that config_items is freeside-specific and icky.
},
{
+ 'key' => 'cgp_rule-domain_templates',
+ 'section' => '',
+ 'description' => 'Communigate Pro rule templates for domains, one per line, "svcnum Name"',
+ 'type' => 'textarea',
+ },
+
+ {
'key' => 'svc_forward-no_srcsvc',
'section' => '',
'description' => "Don't allow forwards from existing accounts, only arbitrary addresses. Useful when exporting to systems such as Communigate Pro which treat forwards in this fashion.",
diff --git a/FS/FS/cgp_rule.pm b/FS/FS/cgp_rule.pm
index ad5ab1e..e9c5090 100644
--- a/FS/FS/cgp_rule.pm
+++ b/FS/FS/cgp_rule.pm
@@ -100,11 +100,12 @@ sub insert {
return $error;
}
- $error = $self->svc_export;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
+ #conditions and actions not in yet
+ #$error = $self->svc_export;
+ #if ( $error ) {
+ # $dbh->rollback if $oldAutoCommit;
+ # return $error;
+ #}
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
@@ -188,11 +189,12 @@ sub replace {
return $error;
}
- $error = $new->svc_export;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
+ #conditions and actions not in yet
+ #$error = $new->svc_export;
+ #if ( $error ) {
+ # $dbh->rollback if $oldAutoCommit;
+ # return $error;
+ #}
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
@@ -246,6 +248,47 @@ sub check {
$self->SUPER::check;
}
+=item clone NEW_SVCNUM
+
+Clones this rule into an identical rule for the specified new service.
+
+If there is an error, returns the error, otherwise returns false.
+
+=cut
+
+#should return the newly inserted rule instead? used in misc/clone-cgp_rule.html
+
+#i should probably be transactionalized so i'm all-or-nothing
+sub clone {
+ my( $self, $svcnum ) = @_;
+
+ my $new = $self->new( { $self->hash } );
+ $new->rulenum('');
+ $new->svcnum( $svcnum );
+ my $error = $new->insert;
+ return $error if $error;
+
+ my @dup = $self->cgp_rule_condition;
+ push @dup, $self->cgp_rule_action;
+
+ foreach my $dup (@dup) {
+ my $new_dup = $dup->new( { $dup->hash } );
+ my $pk = $new_dup->primary_key;
+ $new_dup->$pk('');
+ $new_dup->rulenum( $new->rulenum );
+
+ $error = $new_dup->insert;
+ return $error if $error;
+
+ }
+
+ $error = $new->svc_export;
+ return $error if $error;
+
+ '';
+
+}
+
=item cust_svc
=cut
diff --git a/httemplate/browse/cgp_rule.html b/httemplate/browse/cgp_rule.html
index 5be6bb4..8a427b8 100644
--- a/httemplate/browse/cgp_rule.html
+++ b/httemplate/browse/cgp_rule.html
@@ -26,25 +26,45 @@ my $svcnum = $1;
#agent virt so you can't do cross-agent communigate rules
my $cust_svc = qsearchs('cust_svc', { 'svcnum' => $svcnum })
or die 'unknown svcnum';
+my $part_svc = $cust_svc->part_svc;
my $count_query = "SELECT COUNT(*) FROM cgp_rule WHERE svcnum = $svcnum";
my($svc_label, $svc_value, $svcdb) = $cust_svc->label;
-
my $view = FS::UI::Web::svc_url( 'm' => $m,
'action' => 'view',
- 'part_svc' => $cust_svc->part_svc,
+ 'part_svc' => $part_svc,
'svc' => $cust_svc,
);
my $html_init =
qq(<A HREF="$view">View this $svc_label</A><BR><BR>).
- qq!<A HREF="${p}edit/cgp_rule.html?svcnum=$svcnum">Add new rule</A><BR><BR>!.
+ qq!<A HREF="${p}edit/cgp_rule.html?svcnum=$svcnum">Add new rule</A><BR>!;
+
+if ( $part_svc->svcdb eq 'svc_domain' ) {
+
+ #areyousure for adding these?
+
+ foreach my $line ( FS::Conf->new->config('cgp_rule-domain_templates') ) {
+ $line =~ /^\s*(\d+)\s+(.+)\s*$/ or next;
+ my($t_svcnum, $t_name) = ( $1, $2 );
+ $html_init .=
+ qq!<A HREF="${p}misc/clone-cgp_rule.html?clone=$t_svcnum;svcnum=$svcnum">!
+ ."Add $t_name rule</A><BR>";
+ }
+
+}
+
+$html_init .=
+ '<BR>'.
qq!
<SCRIPT>
- function areyousure(href) {
- if (confirm("Are you sure you want to delete this rule?") == true)
+ function areyousure_delete(href) {
+ areyousure(href,"Are you sure you want to delete this rule?");
+ }
+ function areyousure(href,message) {
+ if (confirm(message) == true)
window.location.href = href;
}
</SCRIPT>
@@ -87,7 +107,7 @@ my $action_sub = sub {
my $edit_sub = [ $p.'edit/cgp_rule.html?', 'rulenum' ];
my $del_sub = sub {
my $rulenum = shift->rulenum;
- [ "javascript:areyousure('${p}misc/delete-cgp_rule.html?$rulenum')", '' ];
+ [ "javascript:areyousure_delete('${p}misc/delete-cgp_rule.html?$rulenum')", '' ];
};
</%init>
diff --git a/httemplate/edit/process/cgp_rule.html b/httemplate/edit/process/cgp_rule.html
index 9653413..5326587 100644
--- a/httemplate/edit/process/cgp_rule.html
+++ b/httemplate/edit/process/cgp_rule.html
@@ -11,6 +11,12 @@
'fields' => [qw( action params )],
},
],
+ 'noerror_callback' => sub {
+ my( $cgi, $object ) = @_;
+ my $error = $object->svc_export;
+ #shit, not a good place for error handling :/
+ die $error if $error;
+ },
)
%>
<%init>
diff --git a/httemplate/edit/process/elements/process.html b/httemplate/edit/process/elements/process.html
index 87cadb7..ebbc2f7 100644
--- a/httemplate/edit/process/elements/process.html
+++ b/httemplate/edit/process/elements/process.html
@@ -65,6 +65,9 @@ Example:
#return an error string or empty for no error
'precheck_callback' => sub { my( $cgi ) = @_; },
+ #after everything's inserted
+ 'noerror_callback' => sub { my( $cgi, $object ) = @_; },
+
#supplies arguments to insert() and replace()
# for use with tables that are FS::option_Common (among other things)
'args_callback' => sub { my( $cgi, $object ) = @_; },
@@ -298,12 +301,20 @@ if ( !$error && $opt{'process_o2m'} ) {
if ( $error ) {
+
$cgi->param('error', $error);
if ( $opt{'clear_on_error'} && scalar(@{$opt{'clear_on_error'}}) ) {
foreach my $field (@{$opt{'clear_on_error'}}) {
$cgi->param($field, '')
}
}
+
+} else {
+
+ if ( $opt{'noerror_callback'} ) {
+ &{ $opt{'noerror_callback'} }( $cgi, $new );
+ }
+
}
</%init>
diff --git a/httemplate/misc/clone-cgp_rule.html b/httemplate/misc/clone-cgp_rule.html
new file mode 100644
index 0000000..d821a2d
--- /dev/null
+++ b/httemplate/misc/clone-cgp_rule.html
@@ -0,0 +1,27 @@
+% if ( $error ) {
+% errorpage($error);
+% } else {
+<% $cgi->redirect($p. "browse/cgp_rule.html?svcnum=". $svcnum) %>
+% }
+<%init>
+
+# :/ needs agent-virt so you can't futz with arbitrary rules
+
+#die "access denied"
+# unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service');
+
+#untaint svcnum and clone
+$cgi->param('svcnum') =~ /^(\d+)$/ || die "Illegal svcnum";
+my $svcnum = $1;
+$cgi->param('clone') =~ /^(\d+)$/ || die "Illegal clone";
+my $clone = $1;
+
+my @cgp_rule = qsearch('cgp_rule', { 'svcnum' => $clone } );
+
+my $error = '';
+foreach my $cgp_rule ( @cgp_rule ) {
+ $error = $cgp_rule->clone( $svcnum );
+ last if $error;
+}
+
+</%init>