summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Conf.pm7
-rw-r--r--FS/FS/Record.pm21
-rw-r--r--FS/FS/Schema.pm1
-rw-r--r--FS/FS/cust_main.pm3
-rwxr-xr-xhttemplate/edit/cust_main.cgi17
-rw-r--r--httemplate/elements/tr-input-date-field.html32
-rw-r--r--httemplate/view/cust_main/misc.html6
7 files changed, 87 insertions, 0 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 384ff5215..7f77e000f 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -413,6 +413,13 @@ httemplate/docs/config.html
},
{
+ 'key' => 'date_format',
+ 'section' => 'UI',
+ 'description' => 'format code for displaying dates with Date::Format::time2str',
+ 'type' => 'text',
+ },
+
+ {
'key' => 'cyrus',
'section' => 'deprecated',
'description' => '<b>DEPRECATED</b>, add a <i>cyrus</i> <a href="../browse/part_export.cgi">export</a> instead. This option used to integrate with <a href="http://asg.web.cmu.edu/cyrus/imapd/">Cyrus IMAP Server</a>, three lines: IMAP server, admin username, and admin password. Cyrus::IMAP::Admin should be installed locally and the connection to the server secured.',
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 114b1d6ab..bd5dd27df 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -83,6 +83,8 @@ FS::Record - Database record objects
$error = $record->ut_float('column');
$error = $record->ut_number('column');
$error = $record->ut_numbern('column');
+ $error = $record->ut_snumber('column');
+ $error = $record->ut_snumbern('column');
$error = $record->ut_money('column');
$error = $record->ut_text('column');
$error = $record->ut_textn('column');
@@ -1288,6 +1290,25 @@ sub ut_snumber {
'';
}
+=item ut_snumbern COLUMN
+
+Check/untaint signed numeric data (whole numbers). If there is an error,
+returns the error, otherwise returns false.
+
+=cut
+
+sub ut_snumbern {
+ my($self, $field) = @_;
+ $self->getfield($field) =~ /^(-?)\s*(\d*)$/
+ or return "Illegal (numeric) $field: ". $self->getfield($field);
+ if ($1) {
+ return "Illegal (numeric) $field: ". $self->getfield($field)
+ unless $2;
+ }
+ $self->setfield($field, "$1$2");
+ '';
+}
+
=item ut_number COLUMN
Check/untaint simple numeric data (whole numbers). May not be null. If there
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 3d4fcc5b4..ea02dfebf 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -407,6 +407,7 @@ sub tables_hashref {
# 'middle', 'varchar', 'NULL', $char_d, '', '',
'first', 'varchar', '', $char_d, '', '',
'ss', 'varchar', 'NULL', 11, '', '',
+ 'birthdate',@date_type, '', '',
'company', 'varchar', 'NULL', $char_d, '', '',
'address1', 'varchar', '', $char_d, '', '',
'address2', 'varchar', 'NULL', $char_d, '', '',
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index 484138781..cb44ba6e1 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -1209,6 +1209,7 @@ sub check {
|| $self->ut_number('refnum')
|| $self->ut_name('last')
|| $self->ut_name('first')
+ || $self->ut_snumbern('birthdate')
|| $self->ut_textn('company')
|| $self->ut_text('address1')
|| $self->ut_textn('address2')
@@ -4619,6 +4620,8 @@ No multiple currency support (probably a larger project than just this module).
payinfo_masked false laziness with cust_pay.pm and cust_refund.pm
+Birthdates rely on negative epoch values.
+
=head1 SEE ALSO
L<FS::Record>, L<FS::cust_pkg>, L<FS::cust_bill>, L<FS::cust_credit>
diff --git a/httemplate/edit/cust_main.cgi b/httemplate/edit/cust_main.cgi
index 99f849fc8..e0dd3c8ea 100755
--- a/httemplate/edit/cust_main.cgi
+++ b/httemplate/edit/cust_main.cgi
@@ -162,6 +162,19 @@
</TABLE>
+<!-- birthdate -->
+
+<BR>
+<% ntable("#cccccc", 2) %>
+<% include ('/elements/tr-input-date-field.html',
+ 'birthdate',
+ $cust_main->birthdate,
+ 'Date of Birth',
+ $conf->config('date_format') || "%m/%d/%Y")
+%>
+
+</TABLE>
+
<!-- contact info -->
<BR><BR>
@@ -247,6 +260,8 @@ Service address
function bottomfixup(what) {
var topvars = new Array(
+ 'birthdate',
+
'custnum', 'agentnum', 'refnum', 'referral_custnum',
'last', 'first', 'ss', 'company',
@@ -329,6 +344,8 @@ function copyelement(from, to) {
<FORM ACTION="<% popurl(1) %>process/cust_main.cgi" METHOD=POST NAME="bottomform" onSubmit="document.bottomform.submit.disabled=true; bottomfixup(this.form);" STYLE="margin-top: 0; margin-bottom: 0">
% foreach my $hidden (
+% 'birthdate',
+%
% 'custnum', 'agentnum', 'refnum', 'referral_custnum',
% 'last', 'first', 'ss', 'company',
% 'address1', 'address2', 'city',
diff --git a/httemplate/elements/tr-input-date-field.html b/httemplate/elements/tr-input-date-field.html
new file mode 100644
index 000000000..eb8eee450
--- /dev/null
+++ b/httemplate/elements/tr-input-date-field.html
@@ -0,0 +1,32 @@
+
+<LINK REL="stylesheet" TYPE="text/css" HREF="../elements/calendar-win2k-2.css" TITLE="win2k-2">
+<SCRIPT TYPE="text/javascript" SRC="../elements/calendar_stripped.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript" SRC="../elements/calendar-en.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript" SRC="../elements/calendar-setup.js"></SCRIPT>
+
+<TR>
+ <TD ALIGN="right"><% $label %></TD>
+ <TD>
+ <INPUT TYPE="text" NAME="<% $name %>" ID="<% $name %>_text" VALUE="<% time2str($format, $value) %>">
+ <IMG SRC="../images/calendar.png" ID="<% $name %>_button" STYLE="cursor: pointer" TITLE="Select date">
+ </TD>
+</TR>
+
+<SCRIPT TYPE="text/javascript">
+ Calendar.setup({
+ inputField: "<% $name %>_text",
+ ifFormat: "<% $format %>",
+ button: "<% $name %>_button",
+ align: "BR"
+ });
+</SCRIPT>
+
+
+<%init>
+my($name, $value, $label, $format) = @_;
+
+$format = "%m/%d/%Y" unless $format;
+$label = $name unless $label;
+
+</%init>
+
diff --git a/httemplate/view/cust_main/misc.html b/httemplate/view/cust_main/misc.html
index fc033b970..b0fab0300 100644
--- a/httemplate/view/cust_main/misc.html
+++ b/httemplate/view/cust_main/misc.html
@@ -1,6 +1,7 @@
%
% my( $cust_main ) = @_;
% my $conf = new FS::Conf;
+% my $date_format = ($conf->config('date_format') || "%m/%d/%Y");
%
@@ -90,5 +91,10 @@
<TD BGCOLOR="#ffffff"><% $cust_main->otaker %></TD>
</TR>
+<TR>
+ <TD ALIGN="right">Date of Birth</TD>
+ <TD BGCOLOR="#ffffff"><% $cust_main->birthdate ? time2str($date_format, $cust_main->birthdate) : '' %></TD>
+</TR>
+
</TABLE></TD></TR></TABLE>