1 package FS::cust_main_county;
4 use vars qw( @ISA @EXPORT_OK $conf
5 @cust_main_county %cust_main_county $countyflag );
7 use FS::Record qw( qsearch );
9 @ISA = qw( FS::Record );
10 @EXPORT_OK = qw( regionselector );
12 @cust_main_county = ();
15 #ask FS::UID to run this stuff for us later
16 $FS::UID::callback{'FS::cust_main_county'} = sub {
22 FS::cust_main_county - Object methods for cust_main_county objects
26 use FS::cust_main_county;
28 $record = new FS::cust_main_county \%hash;
29 $record = new FS::cust_main_county { 'column' => 'value' };
31 $error = $record->insert;
33 $error = $new_record->replace($old_record);
35 $error = $record->delete;
37 $error = $record->check;
39 ($county_html, $state_html, $country_html) =
40 FS::cust_main_county::regionselector( $county, $state, $country );
44 An FS::cust_main_county object represents a tax rate, defined by locale.
45 FS::cust_main_county inherits from FS::Record. The following fields are
50 =item taxnum - primary key (assigned automatically for new tax rates)
58 =item tax - percentage
72 Creates a new tax rate. To add the tax rate to the database, see L<"insert">.
76 sub table { 'cust_main_county'; }
80 Adds this tax rate to the database. If there is an error, returns the error,
81 otherwise returns false.
85 Deletes this tax rate from the database. If there is an error, returns the
86 error, otherwise returns false.
88 =item replace OLD_RECORD
90 Replaces the OLD_RECORD with this one in the database. If there is an error,
91 returns the error, otherwise returns false.
95 Checks all fields to make sure this is a valid tax rate. If there is an error,
96 returns the error, otherwise returns false. Called by the insert and replace
104 $self->exempt_amount(0) unless $self->exempt_amount;
106 $self->ut_numbern('taxnum')
107 || $self->ut_textn('state')
108 || $self->ut_textn('county')
109 || $self->ut_text('country')
110 || $self->ut_float('tax')
111 || $self->ut_textn('taxclass') # ...
112 || $self->ut_money('exempt_amount')
123 =item regionselector [ COUNTY STATE COUNTRY [ PREFIX [ ONCHANGE ] ] ]
128 my ( $selected_county, $selected_state, $selected_country,
129 $prefix, $onchange ) = @_;
131 $prefix = '' unless defined $prefix;
135 # unless ( @cust_main_county ) { #cache
136 @cust_main_county = qsearch('cust_main_county', {} );
137 foreach my $c ( @cust_main_county ) {
138 $countyflag=1 if $c->county;
139 #push @{$cust_main_county{$c->country}{$c->state}}, $c->county;
140 $cust_main_county{$c->country}{$c->state}{$c->county} = 1;
143 $countyflag=1 if $selected_county;
145 my $script_html = <<END;
147 function opt(what,value,text) {
148 var optionName = new Option(text, value, false, false);
149 var length = what.length;
150 what.options[length] = optionName;
152 function ${prefix}country_changed(what) {
153 country = what.options[what.selectedIndex].text;
154 for ( var i = what.form.${prefix}state.length; i >= 0; i-- )
155 what.form.${prefix}state.options[i] = null;
157 #what.form.${prefix}state.options[0] = new Option('', '', false, true);
159 foreach my $country ( sort keys %cust_main_county ) {
160 $script_html .= "\nif ( country == \"$country\" ) {\n";
161 foreach my $state ( sort keys %{$cust_main_county{$country}} ) {
162 my $text = $state || '(n/a)';
163 $script_html .= qq!opt(what.form.${prefix}state, "$state", "$text");\n!;
165 $script_html .= "}\n";
168 $script_html .= <<END;
170 function ${prefix}state_changed(what) {
174 $script_html .= <<END;
175 state = what.options[what.selectedIndex].text;
176 country = what.form.${prefix}country.options[what.form.${prefix}country.selectedIndex].text;
177 for ( var i = what.form.${prefix}county.length; i >= 0; i-- )
178 what.form.${prefix}county.options[i] = null;
181 foreach my $country ( sort keys %cust_main_county ) {
182 $script_html .= "\nif ( country == \"$country\" ) {\n";
183 foreach my $state ( sort keys %{$cust_main_county{$country}} ) {
184 $script_html .= "\nif ( state == \"$state\" ) {\n";
185 #foreach my $county ( sort @{$cust_main_county{$country}{$state}} ) {
186 foreach my $county ( sort keys %{$cust_main_county{$country}{$state}} ) {
187 my $text = $county || '(n/a)';
189 qq!opt(what.form.${prefix}county, "$county", "$text");\n!;
191 $script_html .= "}\n";
193 $script_html .= "}\n";
197 $script_html .= <<END;
202 my $county_html = $script_html;
204 $county_html .= qq!<SELECT NAME="${prefix}county" onChange="$onchange">!;
205 $county_html .= '</SELECT>';
208 qq!<INPUT TYPE="hidden" NAME="${prefix}county" VALUE="$selected_county">!;
211 my $state_html = qq!<SELECT NAME="${prefix}state" !.
212 qq!onChange="${prefix}state_changed(this); $onchange">!;
213 foreach my $state ( sort keys %{ $cust_main_county{$selected_country} } ) {
214 my $text = $state || '(n/a)';
215 my $selected = $state eq $selected_state ? 'SELECTED' : '';
216 $state_html .= "\n<OPTION $selected VALUE=$state>$text</OPTION>"
218 $state_html .= '</SELECT>';
220 $state_html .= '</SELECT>';
222 my $country_html = qq!<SELECT NAME="${prefix}country" !.
223 qq!onChange="${prefix}country_changed(this); $onchange">!;
224 my $countrydefault = $conf->config('countrydefault') || 'US';
225 foreach my $country (
226 sort { ($b eq $countrydefault) <=> ($a eq $countrydefault) or $a cmp $b }
227 keys %cust_main_county
229 my $selected = $country eq $selected_country ? ' SELECTED' : '';
230 $country_html .= "\n<OPTION$selected>$country</OPTION>"
232 $country_html .= '</SELECT>';
234 ($county_html, $state_html, $country_html);
242 regionselector? putting web ui components in here? they should probably live
247 L<FS::Record>, L<FS::cust_main>, L<FS::cust_bill>, schema.html from the base