+%
+%
+%my $regionnum = $cgi->param('regionnum');
+%
+%my $old = qsearchs('rate_region', { 'regionnum' => $regionnum } ) if $regionnum;
+%
+%my $new = new FS::rate_region ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } ( fields('rate_region') )
+%} );
+%
+%my $countrycode = $cgi->param('countrycode');
+%my @npa = split(/\s*,\s*/, $cgi->param('npa'));
+%$npa[0] = '' unless @npa;
+%my @rate_prefix = map {
+% new FS::rate_prefix {
+% 'countrycode' => $countrycode,
+% 'npa' => $_,
+% }
+% } @npa;
+%
+%my @dest_detail = map {
+% my $ratenum = $_->ratenum;
+% new FS::rate_detail {
+% 'ratenum' => $ratenum,
+% map { $_ => $cgi->param("$_$ratenum") }
+% qw( min_included min_charge sec_granularity )
+% };
+%} qsearch('rate', {} );
+%
+%
+%my $error;
+%if ( $regionnum ) {
+% $error = $new->replace($old, 'rate_prefix' => \@rate_prefix,
+% 'dest_detail' => \@dest_detail, );
+%} else {
+% $error = $new->insert( 'rate_prefix' => \@rate_prefix,
+% 'dest_detail' => \@dest_detail, );
+% $regionnum = $new->getfield('regionnum');
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "rate_region.cgi?". $cgi->query_string );
+%} else {
+% #print $cgi->redirect(popurl(3). "browse/rate_region.cgi");
+% print $cgi->redirect(popurl(3). "browse/rate.cgi");
+%}
+%
+%