my $pkgnum = $cgi->param('pkgnum') or die;
my $old = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
my %hash = $old->hash;
-$hash{'setup'} = $cgi->param('setup') ? str2time($cgi->param('setup')) : '';
-$hash{'bill'} = $cgi->param('bill') ? str2time($cgi->param('bill')) : '';
-$hash{'last_bill'} =
- $cgi->param('last_bill') ? str2time($cgi->param('last_bill')) : '';
-$hash{'adjourn'} = $cgi->param('adjourn') ? str2time($cgi->param('adjourn')) : '';
-$hash{'expire'} = $cgi->param('expire') ? str2time($cgi->param('expire')) : '';
+$hash{$_}= $cgi->param($_) ? parse_datetime($cgi->param($_)) : ''
+ foreach qw( start_date setup bill last_bill contract_end );
+ # adjourn, expire, resume not editable this way
+
+my @errors = ();
+
+push @errors, '_bill_areyousure'
+ if $hash{'bill'} != $old->bill # if the next bill date was changed
+ && $hash{'bill'} < time # to a date in the past
+ && ! $cgi->param('bill_areyousure'); # and it wasn't confirmed
+
+push @errors, '_setup_areyousure'
+ if ! $hash{'setup'} && $old->setup # if the setup date was removed
+ && ! $cgi->param('setup_areyousure'); # and it wasn't confirmed
+
+push @errors, '_setupadd_areyousure'
+ if $hash{'setup'} && ! $old->setup # if the setup date was added
+ && ! $cgi->param('setupadd_areyousure'); # and it wasn't confirmed
+
+push @errors, '_start'
+ if $hash{'start_date'} && !$old->start_date # if a start date was added
+ && $hash{'setup'}; # but there's a setup date
my $new;
my $error;
-if ( $hash{'bill'} != $old->bill # if the next bill date was changed
- && $hash{'bill'} < time # to a date in the past
- && ! $cgi->param('bill_areyousure') # and it wasn't confirmed
- )
-{
- $error = '_bill_areyousure';
+if ( @errors ) {
+ $error = join(',', @errors);
} else {
$new = new FS::cust_pkg \%hash;
$error = $new->replace($old);