add svc_forward, depriciate svc_acct_sm
[freeside.git] / htdocs / edit / process / part_pkg.cgi
1 #!/usr/bin/perl -Tw
2 #
3 # $Id: part_pkg.cgi,v 1.9 2001-04-09 23:05:16 ivan Exp $
4 #
5 # process/part_pkg.cgi: Edit package definitions (process form)
6 #
7 # ivan@sisd.com 97-dec-10
8 #
9 # don't update non-changing records in part_svc (causing harmless but annoying
10 # "Records identical" errors). ivan@sisd.com 98-feb-19
11 #
12 # Changes to allow page to work at a relative position in server
13 #       bmccane@maxbaud.net     98-apr-3
14 #
15 # Added `|| 0 ' when getting quantity off web page ivan@sisd.com 98-jun-4
16 #
17 # lose background, FS::CGI ivan@sisd.com 98-sep-2
18 #
19 # $Log: part_pkg.cgi,v $
20 # Revision 1.9  2001-04-09 23:05:16  ivan
21 # Transactions Part I!!!
22 #
23 # Revision 1.8  1999/02/07 09:59:27  ivan
24 # more mod_perl fixes, and bugfixes Peter Wemm sent via email
25 #
26 # Revision 1.7  1999/01/19 05:13:55  ivan
27 # for mod_perl: no more top-level my() variables; use vars instead
28 # also the last s/create/new/;
29 #
30 # Revision 1.6  1999/01/18 22:47:56  ivan
31 # s/create/new/g; and use fields('table_name')
32 #
33 # Revision 1.5  1998/12/30 23:03:29  ivan
34 # bugfixes; fields isn't exported by derived classes
35 #
36 # Revision 1.4  1998/12/17 08:40:24  ivan
37 # s/CGI::Request/CGI.pm/; etc
38 #
39 # Revision 1.3  1998/11/21 07:17:58  ivan
40 # bugfix to work for regular aswell as custom pricing
41 #
42 # Revision 1.2  1998/11/15 13:16:15  ivan
43 # first pass as per-user custom pricing
44 #
45
46 use strict;
47 use vars qw( $cgi $pkgpart $old $new $part_svc $error $dbh );
48 use CGI;
49 use CGI::Carp qw(fatalsToBrowser);
50 use FS::UID qw(cgisuidsetup);
51 use FS::CGI qw(popurl);
52 use FS::Record qw(qsearch qsearchs fields);
53 use FS::part_pkg;
54 use FS::pkg_svc;
55 use FS::cust_pkg;
56
57 $cgi = new CGI;
58 $dbh = &cgisuidsetup($cgi);
59
60 $pkgpart = $cgi->param('pkgpart');
61
62 $old = qsearchs('part_pkg',{'pkgpart'=>$pkgpart}) if $pkgpart;
63
64 $new = new FS::part_pkg ( {
65   map {
66     $_, scalar($cgi->param($_));
67   } fields('part_pkg')
68 } );
69
70 #most of the stuff below should move to part_pkg.pm
71
72 foreach $part_svc ( qsearch('part_svc', {} ) ) {
73   my $quantity = $cgi->param('pkg_svc'. $part_svc->svcpart) || 0;
74   unless ( $quantity =~ /^(\d+)$/ ) {
75     $cgi->param('error', "Illegal quantity" );
76     print $cgi->redirect(popurl(2). "part_pkg.cgi?". $cgi->query_string );
77     exit;
78   }
79 }
80
81 local $SIG{HUP} = 'IGNORE';
82 local $SIG{INT} = 'IGNORE';
83 local $SIG{QUIT} = 'IGNORE';
84 local $SIG{TERM} = 'IGNORE';
85 local $SIG{TSTP} = 'IGNORE';
86 local $SIG{PIPE} = 'IGNORE';
87
88 local $FS::UID::AutoCommit = 0;
89
90 if ( $pkgpart ) {
91   $error = $new->replace($old);
92 } else {
93   $error = $new->insert;
94   $pkgpart=$new->pkgpart;
95 }
96 if ( $error ) {
97   $dbh->rollback;
98   $cgi->param('error', $error );
99   print $cgi->redirect(popurl(2). "part_pkg.cgi?". $cgi->query_string );
100   exit;
101 }
102
103 foreach $part_svc (qsearch('part_svc',{})) {
104   my $quantity = $cgi->param('pkg_svc'. $part_svc->svcpart) || 0;
105   my $old_pkg_svc = qsearchs('pkg_svc', {
106     'pkgpart' => $pkgpart,
107     'svcpart' => $part_svc->svcpart,
108   } );
109   my $old_quantity = $old_pkg_svc ? $old_pkg_svc->quantity : 0;
110   next unless $old_quantity != $quantity; #!here
111   my $new_pkg_svc = new FS::pkg_svc( {
112     'pkgpart'  => $pkgpart,
113     'svcpart'  => $part_svc->svcpart,
114     'quantity' => $quantity, 
115   } );
116   if ( $old_pkg_svc ) {
117     my $myerror = $new_pkg_svc->replace($old_pkg_svc);
118     if ( $myerror ) {
119       $dbh->rollback;
120       die $myerror;
121     }
122   } else {
123     my $myerror = $new_pkg_svc->insert;
124     if ( $myerror ) {
125       $dbh->rollback;
126       die $myerror;
127     }
128   }
129 }
130
131 unless ( $cgi->param('pkgnum') && $cgi->param('pkgnum') =~ /^(\d+)$/ ) {
132   $dbh->commit or die $dbh->errstr;
133   print $cgi->redirect(popurl(3). "browse/part_pkg.cgi");
134 } else {
135   my($old_cust_pkg) = qsearchs( 'cust_pkg', { 'pkgnum' => $1 } );
136   my %hash = $old_cust_pkg->hash;
137   $hash{'pkgpart'} = $pkgpart;
138   my($new_cust_pkg) = new FS::cust_pkg \%hash;
139   my $myerror = $new_cust_pkg->replace($old_cust_pkg);
140   if ( $myerror ) {
141     $dbh->rollback;
142     die "Error modifying cust_pkg record: $myerror\n";
143   }
144
145   $dbh->commit or die $dbh->errstr;
146   print $cgi->redirect(popurl(3). "view/cust_main.cgi?". $new_cust_pkg->custnum);
147 }
148