diff options
Diffstat (limited to 'htdocs/view/cust_main.cgi')
-rwxr-xr-x | htdocs/view/cust_main.cgi | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/htdocs/view/cust_main.cgi b/htdocs/view/cust_main.cgi new file mode 100755 index 000000000..ca5fcd94f --- /dev/null +++ b/htdocs/view/cust_main.cgi @@ -0,0 +1,336 @@ +#!/usr/bin/perl -Tw +# +# cust_main.cgi: View a customer +# +# Usage: cust_main.cgi custnum +# http://server.name/path/cust_main.cgi?custnum +# +# Note: Should be run setuid freeside as user nobody. +# +# the payment history section could use some work, see below +# +# ivan@voicenet.com 96-nov-29 -> 96-dec-11 +# +# added navigation bar (go to main menu ;) +# ivan@voicenet.com 97-jan-30 +# +# changes to the way credits/payments are applied (the links are here). +# ivan@voicenet.com 97-apr-21 +# +# added debugging code to diagnose CPU sucking problem. +# ivan@voicenet.com 97-may-19 +# +# CPU sucking problem was in comment code? fixed? +# ivan@voicenet.com 97-may-22 +# +# rewrote for new API +# ivan@voicenet.com 97-jul-22 +# +# Changes to allow page to work at a relative position in server +# Changed 'day' to 'daytime' because Pg6.3 reserves the day word +# bmccane@maxbaud.net 98-apr-3 +# +# lose background, FS::CGI ivan@sisd.com 98-sep-2 + +use strict; +use CGI::Base qw(:DEFAULT :CGI); # CGI module +use CGI::Carp qw(fatalsToBrowser); +use Date::Format; +use FS::UID qw(cgisuidsetup); +use FS::Record qw(qsearchs qsearch); +use FS::CGI qw(header menubar); + +my($cgi) = new CGI::Base; +$cgi->get; +&cgisuidsetup($cgi); + +SendHeaders(); # one guess. +print header("Customer View", menubar( + 'Main Menu' => '../', +)),<<END; + <BASEFONT SIZE=3> +END + +#untaint custnum & get customer record +$QUERY_STRING =~ /^(\d+)$/; +my($custnum)=$1; +my($cust_main)=qsearchs('cust_main',{'custnum'=>$custnum}); +die "Customer not found!" unless $cust_main; +my($hashref)=$cust_main->hashref; + +#custnum +print "<FONT SIZE=+1><CENTER>Customer #<B>$custnum</B></CENTER></FONT>", + qq!<CENTER><A HREF="#cust_main">Customer Information</A> | !, + qq!<A HREF="#cust_comments">Comments</A> | !, + qq!<A HREF="#cust_pkg">Packages</A> | !, + qq!<A HREF="#history">Payment History</A> </CENTER>!; + +#bill now linke +print qq!<HR><CENTER><A HREF="../misc/bill.cgi?$custnum">!, + qq!Bill this customer now</A></CENTER>!; + +#formatting +print qq!<HR><A NAME="cust_main"><CENTER><FONT SIZE=+1>Customer Information!, + qq!</FONT>!, + qq!<BR><A HREF="../edit/cust_main.cgi?$custnum!, + qq!">Edit this information</A></CENTER><FONT SIZE=-1>!; + +#agentnum +my($agent)=qsearchs('agent',{ + 'agentnum' => $cust_main->getfield('agentnum') +} ); +die "Agent not found!" unless $agent; +print "<BR>Agent #<B>" , $agent->getfield('agentnum') , ": " , + $agent->getfield('agent') , "</B>"; + +#refnum +my($referral)=qsearchs('part_referral',{'refnum' => $cust_main->refnum}); +die "Referral not found!" unless $referral; +print "<BR>Referral #<B>", $referral->refnum, ": ", + $referral->referral, "<\B>"; + +#last, first +print "<P><B>", $hashref->{'last'}, ", ", $hashref->{first}, "</B>"; + +#ss +print " (SS# <B>", $hashref->{ss}, "</B>)" if $hashref->{ss}; + +#company +print "<BR><B>", $hashref->{company}, "</B>" if $hashref->{company}; + +#address1 +print "<BR><B>", $hashref->{address1}, "</B>"; + +#address2 +print "<BR><B>", $hashref->{address2}, "</B>" if $hashref->{address2}; + +#city +print "<BR><B>", $hashref->{city}, "</B>"; + +#county +print " (<B>", $hashref->{county}, "</B> county)" if $hashref->{county}; + +#state +print ",<B>", $hashref->{state}, "</B>"; + +#zip +print " <B>", $hashref->{zip}, "</B>"; + +#country +print "<BR><B>", $hashref->{country}, "</B>" + unless $hashref->{country} eq "US"; + +#daytime +print "<P><B>", $hashref->{daytime}, "</B>" if $hashref->{daytime}; +print " (Day)" if $hashref->{daytime} && $hashref->{night}; + +#night +print "<BR><B>", $hashref->{night}, "</B>" if $hashref->{night}; +print " (Night)" if $hashref->{daytime} && $hashref->{night}; + +#fax +print "<BR><B>", $hashref->{fax}, "</B> (Fax)" if $hashref->{fax}; + +#payby/payinfo/paydate/payname +if ($hashref->{payby} eq "CARD") { + print "<P>Card #<B>", $hashref->{payinfo}, "</B> Exp. <B>", + $hashref->{paydate}, "</B>"; + print " (<B>", $hashref->{payname}, "</B>)" if $hashref->{payname}; +} elsif ($hashref->{payby} eq "BILL") { + print "<P>Bill"; + print " on P.O. #<B>", $hashref->{payinfo}, "</B>" + if $hashref->{payinfo}; + print " until <B>", $hashref->{paydate}, "</B>" + if $hashref->{paydate}; + print " to <B>", $hashref->{payname}, "</B> at above address" + if $hashref->{payname}; +} elsif ($hashref->{payby} eq "COMP") { + print "<P>Access complimentary"; + print " courtesy of <B>", $hashref->{payinfo}, "</B>" + if $hashref->{payinfo}; + print " until <B>", $hashref->{paydate}, "</B>" + if $hashref->{paydate}; +} else { + print "Unknown payment type ", $hashref->{payby}, "!"; +} + +#tax +print "<BR>(Tax exempt)" if $hashref->{tax}; + +#otaker +print "<P>Order taken by <B>", $hashref->{otaker}, "</B>"; + +#formatting +print qq!<HR><FONT SIZE=+1><A NAME="cust_pkg"><CENTER>Packages</A></FONT>!, + qq!<BR>Click on package number to view/edit package.!, + qq!<BR><A HREF="../edit/cust_pkg.cgi?$custnum">Add/Edit packages</A>!, + qq!</CENTER><BR>!; + +#display packages + +#formatting +print qq!<CENTER><TABLE BORDER=4>\n!, + qq!<TR><TH ROWSPAN=2>#</TH><TH ROWSPAN=2>Package</TH><TH COLSPAN=5>!, + qq!Dates</TH></TR>\n!, + qq!<TR><TH><FONT SIZE=-1>Setup</FONT></TH><TH>!, + qq!<FONT SIZE=-1>Next bill</FONT>!, + qq!</TH><TH><FONT SIZE=-1>Susp.</FONT></TH><TH><FONT SIZE=-1>Expire!, + qq!</FONT></TH>!, + qq!<TH><FONT SIZE=-1>Cancel</FONT></TH>!, + qq!</TR>\n!; + +#get package info +my(@packages)=qsearch('cust_pkg',{'custnum'=>$custnum}); +my($package); +foreach $package (@packages) { + my($pref)=$package->hashref; + my($part_pkg)=qsearchs('part_pkg',{ + 'pkgpart' => $pref->{pkgpart} + } ); + print qq!<TR><TD><FONT SIZE=-1><A HREF="../view/cust_pkg.cgi?!, + $pref->{pkgnum}, qq!">!, + $pref->{pkgnum}, qq!</A></FONT></TD>!, + "<TD><FONT SIZE=-1>", $part_pkg->getfield('pkg'), " - ", + $part_pkg->getfield('comment'), "</FONT></TD>", + "<TD><FONT SIZE=-1>", + $pref->{setup} ? time2str("%D",$pref->{setup} ) : "" , + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + $pref->{bill} ? time2str("%D",$pref->{bill} ) : "" , + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + $pref->{susp} ? time2str("%D",$pref->{susp} ) : "" , + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + $pref->{expire} ? time2str("%D",$pref->{expire} ) : "" , + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + $pref->{cancel} ? time2str("%D",$pref->{cancel} ) : "" , + "</FONT></TD>", + "</TR>"; +} + +#formatting +print "</TABLE></CENTER>"; + +#formatting +print qq!<CENTER><HR><A NAME="history"><FONT SIZE=+1>Payment History!, + qq!</FONT></A><BR>!, + qq!Click on invoice to view invoice/enter payment.<BR>!, + qq!<A HREF="../edit/cust_credit.cgi?$custnum">!, + qq!Post Credit / Refund</A></CENTER><BR>!; + +#get payment history +# +# major problem: this whole thing is way too sloppy. +# minor problem: the description lines need better formatting. + +my(@history); + +my(@bills)=qsearch('cust_bill',{'custnum'=>$custnum}); +my($bill); +foreach $bill (@bills) { + my($bref)=$bill->hashref; + push @history, + $bref->{_date} . qq!\t<A HREF="../view/cust_bill.cgi?! . + $bref->{invnum} . qq!">Invoice #! . $bref->{invnum} . + qq! (Balance \$! . $bref->{owed} . qq!)</A>\t! . + $bref->{charged} . qq!\t\t\t!; + + my(@payments)=qsearch('cust_pay',{'invnum'=> $bref->{invnum} } ); + my($payment); + foreach $payment (@payments) { +# my($pref)=$payment->hashref; + my($date,$invnum,$payby,$payinfo,$paid)=($payment->getfield('_date'), + $payment->getfield('invnum'), + $payment->getfield('payby'), + $payment->getfield('payinfo'), + $payment->getfield('paid'), + ); + push @history, + "$date\tPayment, Invoice #$invnum ($payby $payinfo)\t\t$paid\t\t"; + } +} + +my(@credits)=qsearch('cust_credit',{'custnum'=>$custnum}); +my($credit); +foreach $credit (@credits) { + my($cref)=$credit->hashref; + push @history, + $cref->{_date} . "\tCredit #" . $cref->{crednum} . ", (Balance \$" . + $cref->{credited} . ") by " . $cref->{otaker} . " - " . + $cref->{reason} . "\t\t\t" . $cref->{amount} . "\t"; + + my(@refunds)=qsearch('cust_refund',{'crednum'=> $cref->{crednum} } ); + my($refund); + foreach $refund (@refunds) { + my($rref)=$refund->hashref; + push @history, + $rref->{_date} . "\tRefund, Credit #" . $rref->{crednum} . " (" . + $rref->{payby} . " " . $rref->{payinfo} . ") by " . + $rref->{otaker} . " - ". $rref->{reason} . "\t\t\t\t" . + $rref->{refund}; + } +} + + #formatting + print <<END; +<CENTER><TABLE BORDER=4> +<TR> + <TH>Date</TH> + <TH>Description</TH> + <TH><FONT SIZE=-1>Charge</FONT></TH> + <TH><FONT SIZE=-1>Payment</FONT></TH> + <TH><FONT SIZE=-1>In-house<BR>Credit</FONT></TH> + <TH><FONT SIZE=-1>Refund</FONT></TH> + <TH><FONT SIZE=-1>Balance</FONT></TH> +</TR> +END + +#display payment history + +my($balance)=0; +my($item); +foreach $item (sort keyfield_numerically @history) { + my($date,$desc,$charge,$payment,$credit,$refund)=split(/\t/,$item); + $charge ||= 0; + $payment ||= 0; + $credit ||= 0; + $refund ||= 0; + $balance += $charge - $payment; + $balance -= $credit - $refund; + + print "<TR><TD><FONT SIZE=-1>",time2str("%D",$date),"</FONT></TD>", + "<TD><FONT SIZE=-1>$desc</FONT></TD>", + "<TD><FONT SIZE=-1>", + ( $charge ? "\$".sprintf("%.2f",$charge) : '' ), + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + ( $payment ? "- \$".sprintf("%.2f",$payment) : '' ), + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + ( $credit ? "- \$".sprintf("%.2f",$credit) : '' ), + "</FONT></TD>", + "<TD><FONT SIZE=-1>", + ( $refund ? "\$".sprintf("%.2f",$refund) : '' ), + "</FONT></TD>", + "<TD><FONT SIZE=-1>\$" . sprintf("%.2f",$balance), + "</FONT></TD>", + "\n"; +} + +#formatting +print "</TABLE></CENTER>"; + +#end + +#formatting +print <<END; + + </BODY> +</HTML> +END + +#subroutiens +sub keyfield_numerically { (split(/\t/,$a))[0] <=> (split(/\t/,$b))[0] ; } + |