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 ) = @_;
133 # unless ( @cust_main_county ) { #cache
134 @cust_main_county = qsearch('cust_main_county', {} );
135 foreach my $c ( @cust_main_county ) {
136 $countyflag=1 if $c->county;
137 push @{$cust_main_county{$c->country}{$c->state}}, $c->county;
140 $countyflag=1 if $selected_county;
142 my $script_html = <<END;
144 function opt(what,value,text) {
145 var optionName = new Option(text, value, false, false);
146 var length = what.length;
147 what.options[length] = optionName;
149 function ${prefix}country_changed(what) {
150 country = what.options[what.selectedIndex].text;
151 for ( var i = what.form.${prefix}state.length; i >= 0; i-- )
152 what.form.${prefix}state.options[i] = null;
154 #what.form.${prefix}state.options[0] = new Option('', '', false, true);
156 foreach my $country ( sort keys %cust_main_county ) {
157 $script_html .= "\nif ( country == \"$country\" ) {\n";
158 foreach my $state ( sort keys %{$cust_main_county{$country}} ) {
159 my $text = $state || '(n/a)';
160 $script_html .= qq!opt(what.form.${prefix}state, "$state", "$text");\n!;
162 $script_html .= "}\n";
165 $script_html .= <<END;
167 function ${prefix}state_changed(what) {
171 $script_html .= <<END;
172 state = what.options[what.selectedIndex].text;
173 country = what.form.${prefix}country.options[what.form.${prefix}country.selectedIndex].text;
174 for ( var i = what.form.${prefix}county.length; i >= 0; i-- )
175 what.form.${prefix}county.options[i] = null;
178 foreach my $country ( sort keys %cust_main_county ) {
179 $script_html .= "\nif ( country == \"$country\" ) {\n";
180 foreach my $state ( sort keys %{$cust_main_county{$country}} ) {
181 $script_html .= "\nif ( state == \"$state\" ) {\n";
182 foreach my $county ( sort @{$cust_main_county{$country}{$state}} ) {
183 my $text = $county || '(n/a)';
185 qq!opt(what.form.${prefix}county, "$county", "$text");\n!;
187 $script_html .= "}\n";
189 $script_html .= "}\n";
193 $script_html .= <<END;
198 my $county_html = $script_html;
200 $county_html .= qq!<SELECT NAME="${prefix}county" onChange="$onchange">!;
201 $county_html .= '</SELECT>';
204 qq!<INPUT TYPE="hidden" NAME="${prefix}county" VALUE="$selected_county">!;
207 my $state_html = qq!<SELECT NAME="${prefix}state" !.
208 qq!onChange="${prefix}state_changed(this); $onchange">!;
209 foreach my $state ( sort keys %{ $cust_main_county{$selected_country} } ) {
210 my $text = $state || '(n/a)';
211 my $selected = $state eq $selected_state ? 'SELECTED' : '';
212 $state_html .= "\n<OPTION $selected VALUE=$state>$text</OPTION>"
214 $state_html .= '</SELECT>';
216 $state_html .= '</SELECT>';
218 my $country_html = qq!<SELECT NAME="${prefix}country" !.
219 qq!onChange="${prefix}country_changed(this); $onchange">!;
220 my $countrydefault = $conf->config('countrydefault') || 'US';
221 foreach my $country (
222 sort { ($b eq $countrydefault) <=> ($a eq $countrydefault) or $a cmp $b }
223 keys %cust_main_county
225 my $selected = $country eq $selected_country ? ' SELECTED' : '';
226 $country_html .= "\n<OPTION$selected>$country</OPTION>"
228 $country_html .= '</SELECT>';
230 ($county_html, $state_html, $country_html);
238 regionselector? putting web ui components in here? they should probably live
243 L<FS::Record>, L<FS::cust_main>, L<FS::cust_bill>, schema.html from the base