[interchange-cvs] interchange - heins modified lib/Vend/Order.pm

interchange-core@icdevgroup.org interchange-core@icdevgroup.org
Thu Apr 10 20:01:00 2003


User:      heins
Date:      2003-04-11 00:00:52 GMT
Modified:  lib/Vend Order.pm
Log:
* Fix thread-safe/prefork-safe problem with setting state and
  province templates from Variable values. In the process....

* Add new "multistate" check that allows setting of country state
  templates, checks for state based on country (or b_country).

  If country is US, does a "state" check. For CA, does "province"
  check. If any other country, accepts any string longer than
  1 character.

  If you want to add to the states accepted, you can add something
  in another OrderCheck. For instance, you might do for the
  UK:

	$Vend::Order::state_template{UK} = <<EOF;
	| AVON BEDS BERKS BUCKS CAMBS CHESH CLEVE CORN CUMB DERBY DEVON |
    | DORSET DURHAM ESSEX GLONDON GLOUS GMANCH HANTS HERTS HERWOR   |
    | HUMBER IOM IOW KENT LANCS LEICS LINCS MERSEY NHANTS NORF      |
    | NOTTS NTHUMB OXON SHROPS SOM STAFFS SUFF SURREY SUSS WARKS    |
    | WILTS WMID YORK                                               |

    EOF
	$Vend::Order::state_error{UK} = "'%s' not a valid UK state abbreviation.";

  Can set "country" to something else with MV_COUNTRY_FIELD.

Revision  Changes    Path
2.51      +58 -18    interchange/lib/Vend/Order.pm


rev 2.51, prev_rev 2.50
Index: Order.pm
===================================================================
RCS file: /var/cvs/interchange/lib/Vend/Order.pm,v
retrieving revision 2.50
retrieving revision 2.51
diff -u -r2.50 -r2.51
--- Order.pm	6 Apr 2003 01:09:33 -0000	2.50
+++ Order.pm	11 Apr 2003 00:00:52 -0000	2.51
@@ -1,6 +1,6 @@
 # Vend::Order - Interchange order routing routines
 #
-# $Id: Order.pm,v 2.50 2003/04/06 01:09:33 ramoore Exp $
+# $Id: Order.pm,v 2.51 2003/04/11 00:00:52 mheins Exp $
 #
 # Copyright (C) 1996-2001 Red Hat, Inc. <interchange@redhat.com>
 #
@@ -28,7 +28,7 @@
 package Vend::Order;
 require Exporter;
 
-$VERSION = substr(q$Revision: 2.50 $, 10);
+$VERSION = substr(q$Revision: 2.51 $, 10);
 
 @ISA = qw(Exporter);
 
@@ -1167,59 +1167,99 @@
 	return $status;
 }
 
-my $state = <<EOF;
+use vars qw/ %state_template %state_error /;
+$state_error{US} = "'%s' not a two-letter state code";
+$state_error{CA} = "'%s' not a two-letter province code";
+$state_template{US} = <<EOF;
 | AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS MO |
 | MT NE NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI WY |
 | PR DC AA AE GU VI AS MP FM MH PW AP FP FPO APO |
 EOF
 
-my $province = <<EOF;
+$state_template{CA} = <<EOF;
 | AB BC MB NB NF NS NT ON PE QC SK YT YK |
 EOF
 
 sub _state_province {
 	my($ref,$var,$val) = @_;
-	$province = " $::Variable->{MV_VALID_PROVINCE} "
-		if defined $::Variable->{MV_VALID_PROVINCE};
-	$state = " $::Variable->{MV_VALID_STATE} "
-		if defined $::Variable->{MV_VALID_STATE};
-	if( $val =~ /\S/ and ($state =~ /\s$val\s/i or $province =~ /\s$val\s/i) ) {
-		return (1, $var, '');
+	my $error;
+	if(length($val) != 2) {
+		$error = 1;
 	}
 	else {
+		my $pval	= $::Variable->{MV_VALID_PROVINCE}
+					? " $::Variable->{MV_VALID_PROVINCE} "
+					: $state_template{CA};
+		my $sval	= $::Variable->{MV_VALID_STATE}
+					? " $::Variable->{MV_VALID_STATE} "
+					: $state_template{US};
+		$error = 1
+			unless  $sval =~ /\s$val\s/i or $pval =~ /\s$val\s/i ;
+	}
+	if($error) {
 		return (undef, $var,
 			errmsg( "'%s' not a two-letter state or province code", $val )
 		);
 	}
+	return (1, $var, '');
 }
 
 sub _state {
 	my($ref,$var,$val) = @_;
-	$state = " $::Variable->{MV_VALID_STATE} "
-		if defined $::Variable->{MV_VALID_STATE};
+	my $sval	= $::Variable->{MV_VALID_STATE}
+				? " $::Variable->{MV_VALID_STATE} "
+				: $state_template{US};
 
-	if( $val =~ /\S/ and $state =~ /\s$val\s/i ) {
+	if( $val =~ /\S/ and $sval =~ /\s$val\s/i ) {
 		return (1, $var, '');
 	}
 	else {
 		return (undef, $var,
-			errmsg( "'%s' not a two-letter state code", $val )
+			errmsg( $state_error{US}, $val )
 		);
 	}
 }
 
 sub _province {
 	my($ref,$var,$val) = @_;
-	$province = " $::Variable->{MV_VALID_PROVINCE} "
-		if defined $::Variable->{MV_VALID_PROVINCE};
-	if( $val =~ /\S/ and $province =~ /\s$val\s/i) {
+	my $pval	= $::Variable->{MV_VALID_PROVINCE}
+				? " $::Variable->{MV_VALID_PROVINCE} "
+				: $state_template{CA};
+	if( $val =~ /\S/ and $pval =~ /\s$val\s/i) {
 		return (1, $var, '');
 	}
 	else {
 		return (undef, $var,
-			errmsg( "'%s' not a two-letter province code", $val )
+			errmsg( $state_error{CA}, $val )
 		);
 	}
+}
+
+sub _multistate {
+	my($ref,$var,$val) = @_;
+
+	my $error;
+
+	my $cfield = $::Variable->{MV_COUNTRY_FIELD} || 'country';
+	my $cval = $ref->{$cfield} || $::Values->{$cfield};
+
+	if($var =~ /^b_/ and $ref->{"b_$cfield"} || $::Values->{"b_$cfield"}) {
+		$cval = $ref->{"b_$cfield"} || $::Values->{"b_$cfield"};
+	}
+
+	if (length($val) < 2) {
+		$error = 1;
+	}
+	elsif(my $sval = $state_template{$cval}) {
+		$error = 1 unless $sval =~ /\s$val\s/;
+	}
+
+	if($error) {
+		my $tpl = $state_error{$cval} || "'%s' not a valid state for country '%s'";
+		my $msg = errmsg( $tpl, $val, $cval );
+		return (undef, $var, $msg );
+	}
+	return (1, $var, '');
 }
 
 sub _array {