X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fbrowse%2Fcust_main_county.cgi;h=722c699a2144b41886022a9a71c38a0a42358ca8;hp=736d7fdbe19ad67a220b8bfb967736cc86a01e3e;hb=006f36a6d2ee10664c3207b47ff046de447ea8bb;hpb=9e8206dc6a253409671e6d5c904b2d5189b18a86 diff --git a/httemplate/browse/cust_main_county.cgi b/httemplate/browse/cust_main_county.cgi index 736d7fdbe..722c699a2 100755 --- a/httemplate/browse/cust_main_county.cgi +++ b/httemplate/browse/cust_main_county.cgi @@ -10,7 +10,9 @@ 'table' => 'cust_main_county', 'hashref' => $hashref, 'order_by' => - 'ORDER BY country, state, county, taxclass', + 'ORDER BY country, state, county, city, '. + 'district, taxclass, '. + "COALESCE(taxname, '')", }, 'count_query' => $count_query, 'header' => \@header, @@ -23,10 +25,6 @@ 'link_onclicks' => \@link_onclicks, ) %> -% -% # collapse state -% # % } -% <%once> my $conf = new FS::Conf; @@ -49,22 +47,23 @@ my $exempt_sub = sub { [ map [ {'data'=>$_} ], @exempt ]; }; -my $oldrow; -my $cell_style; +my $cs_oldrow; +my $cell_style = ''; my $cell_style_sub = sub { my $row = shift; - if ( $oldrow ne $row ) { - if ( $oldrow ) { - if ( $oldrow->country ne $row->country ) { - $cell_style = 'border-top:1px solid #000000'; - } elsif ( $oldrow->state ne $row->state ) { - $cell_style = 'border-top:1px solid #cccccc'; #default? - } elsif ( $oldrow->state eq $row->state ) { - #$cell_style = 'border-top:dashed 1px dark gray'; - $cell_style = 'border-top:1px dashed #cccccc'; + if ( $cs_oldrow ne $row ) { + if ( $cs_oldrow ) { + if ( $cs_oldrow->country ne $row->country ) { + $cell_style = 'border-top:2px solid #000000'; + } elsif ( $cs_oldrow->state ne $row->state ) { + $cell_style = 'border-top:1px solid #888888'; + } elsif ( $cs_oldrow->county ne $row->county ) { + $cell_style = 'border-top:1px solid #cccccc'; + } else { + $cell_style = ''; } } - $oldrow = $row; + $cs_oldrow = $row; } return $cell_style; }; @@ -84,9 +83,16 @@ my $edit_onclick = sub { ); }; +my $ex_oldrow; sub expand_link { my %param = @_; + if ( $ex_oldrow eq $param{'row'} ) { + return ''; + } else { + $ex_oldrow = $param{'row'}; + } + my $taxnum = $param{'row'}->taxnum; my $url = "${p}edit/cust_main_county-expand.cgi?$taxnum"; @@ -102,6 +108,86 @@ sub expand_link { ''; } +sub add_link { + my %param = @_; + + #if ( $ex_oldrow eq $param{'row'} ) { + # return ''; + #} else { + # $ex_oldrow = $param{'row'}; + #} + + my %below = ( 'county' => 'city', + 'state' => 'county', + ); + my $what = $below{ $param{'col' } }; + + my $taxnum = $param{'row'}->taxnum; + my $url = "${p}edit/cust_main_county-add.cgi?taxnum=$taxnum;what=$what"; + + ''. + include( '/elements/popup_link.html', + 'label' => $param{'label'}, + 'action' => $url, + 'actionlabel' => $param{'desc'}, + 'height' => 420, + #default# 'width' => 540, + #default# 'color' => '#333399', + ). + ''; +} + +sub collapse_link { + my %param = @_; + + my $row = $param{'row'}; + my $col = $param{'col'}; +# return '' +# if $col eq 'state' and $row->city +# || qsearch({ +# 'table' => 'cust_main_county', +# 'hashref' => { +# 'country' => $row->country, +# 'state' => $row->state, +# 'city' => { op=>'!=', value=>'' }, +# }, +# 'order_by' => 'LIMIT 1', +# }); + + my %below = ( 'county' => 'city', + 'state' => 'county', + ); + + #XXX can still show the link when you have some counties broken down into + #cities and others not :/ + + my $taxnum = $param{'row'}->taxnum; + my $url = "${p}edit/process/cust_main_county-collapse.cgi?taxnum=$taxnum;". + 'country='. uri_escape($cgi->param('country')). ';'. + 'state='. uri_escape($cgi->param('state')). ';'. + 'county='. uri_escape($cgi->param('county')); + $url = "javascript:collapse_areyousure('$url', '$below{$col}', '$col')"; + + qq($param{'label'}); +} + +sub remove_link { + my %param = @_; + + my $row = $param{'row'}; + my $col = $param{'col'}; + + my $taxnum = $param{'row'}->taxnum; + my $url = "${p}edit/process/cust_main_county-remove.cgi?taxnum=$taxnum;". + 'country='. uri_escape($cgi->param('country')). ';'. + 'state='. uri_escape($cgi->param('state')). ';'. + 'county='. uri_escape($cgi->param('county')); + $url = "javascript:remove_areyousure('$url', '$col')"; + + qq($param{'label'}); + +} + sub separate_taxclasses_link { my( $row ) = @_; my $taxnum = $row->taxnum; @@ -110,6 +196,8 @@ sub separate_taxclasses_link { qq!!; } +#un-separate taxclasses too + <%init> @@ -122,9 +210,19 @@ my $enable_taxclasses = $conf->exists('enable_taxclasses'); my @menubar; -my $html_init = - "Click on add states to specify a country's tax rates by state or province. -
Click on add counties to specify a state's tax rates by county."; +my $html_init = < + function collapse_areyousure(href,col,above) { + if (confirm('Are you sure you want to remove all ' + col + ' tax rates for this ' + above + '?') == true) + window.location.href = href; + } + function remove_areyousure(href,col) { + if (confirm('Are you sure you want to remove this ' + col + '?') == true) + window.location.href = href; + } + +END + $html_init .= "
Click on separate taxclasses to specify taxes per taxclass." if $enable_taxclasses; $html_init .= '

'; @@ -162,6 +260,21 @@ if ( $country && $state && } $cgi->delete('county'); +my $city = ''; +if ( $country && $state && $county && + $cgi->param('city') =~ + /^([\w \!\@\#\$\%\&\(\)\-\+\;\:\'\"\,\.\?\/\=\[\]]+)$/ + ) +{ + $city = $1; + if ( $city eq '__NONE__' ) { + $title = "No city, $title"; + } else { + $title = "$city city, $title"; + } +} +$cgi->delete('city'); + $title = " for $title" if $title; my $taxclass = ''; @@ -181,12 +294,18 @@ my $filter_change = "window.location = '". $cgi->self_url. ";country=' + encodeURIComponent( document.getElementById('country').options[document.getElementById('country').selectedIndex].value ) + ". "';state=' + encodeURIComponent( document.getElementById('state').options[document.getElementById('state').selectedIndex].value ) +". - "';county=' + encodeURIComponent( document.getElementById('county').options[document.getElementById('county').selectedIndex].value );"; + "';county=' + encodeURIComponent( document.getElementById('county').options[document.getElementById('county').selectedIndex].value )"; + +$filter_change .= " +';city=' + encodeURIComponent( document.getElementById('city').options[document.getElementById('city').selectedIndex].value )" + if $conf->exists('enable_taxclasses'); + +$filter_change .= ";"; #restore this so pagination works $cgi->param('country', $country) if $country; $cgi->param('state', $state ) if $state; $cgi->param('county', $county ) if $county; +$cgi->param('city', $city ) if $city; $cgi->param('taxclass', $county ) if $taxclass; my $html_posttotal = @@ -231,7 +350,7 @@ if ( scalar(@counties) > 1 ) { 'empty_data_label' => '(none)', 'empty_data_value' => '__NONE__', 'disable_empty' => 0, - 'disable_countyupdate' => 1, + 'disable_cityupdate' => 1, ); } else { $html_posttotal .= @@ -240,11 +359,36 @@ if ( scalar(@counties) > 1 ) { ''; } +if ( $conf->exists('enable_taxclasses') ) { + my @cities = ( $country && $state && $county ) ? cities($county, $state, $country) : (); + if ( scalar(@cities) > 1 ) { + $html_posttotal .= + ' show city: '. + include('/elements/select-city.html', + 'country' => $country, + 'state' => $state, + 'county' => $county, + 'city' => $city, + 'onchange' => $filter_change, + 'empty_label' => '(all)', + 'empty_data_label' => '(none)', + 'empty_data_value' => '__NONE__', + 'disable_empty' => 0, + 'disable_cityupdate' => 1, + ); + } else { + $html_posttotal .= + ''; + } +} + $html_posttotal .= ' )'; my $bulk_popup_link = include( '/elements/popup_link_onclick.html', - 'action' => "${p}edit/bulk-cust_main_county.html?MAGIC_taxnum_MAGIC", + 'action' => "${p}edit/bulk-cust_main_county.html?taxnum=MAGIC_taxnum_MAGIC", 'actionlabel' => 'Bulk add new tax', 'nofalse' => 1, 'height' => 420, @@ -277,7 +421,7 @@ my $html_foot = <unselect all
| toggle all

-Add new tax to selected - +Add new tax to selected +| +Bulk edit selected +| +Bulk edit rate only selected +| +bulk edit with excel file END my $hashref = {}; @@ -332,6 +482,15 @@ if ( $county ) { $count_query .= ' AND county = '. dbh->quote($county); } } +if ( $city ) { + if ( $city eq '__NONE__' ) { + $hashref->{'city'} = ''; + $count_query .= " AND ( city = '' OR city IS NULL ) "; + } else { + $hashref->{'city'} = $city; + $count_query .= ' AND city = '. dbh->quote($city); + } +} if ( $taxclass ) { $hashref->{'taxclass'} = $taxclass; $count_query .= ( $count_query =~ /WHERE/i ? ' AND ' : ' WHERE ' ). @@ -341,46 +500,164 @@ if ( $taxclass ) { $cell_style = ''; -my @header = ( 'Country', 'State/Province', 'County',); -my @header2 = ( '', '', '', ); -my @links = ( '', '', '', ); -my @link_onclicks = ( '', '', '', ); -my $align = 'lll'; +my @header = ( 'Country', 'State/Province', 'County', 'City', '' ); +# last column is 'district', but usually unused +my @header2 = ( '', '', '', '', '' ); +my @links = ( '', '', '', '', '' ); +my @link_onclicks = ( '', '', '', '', '' ); +my $align = 'lllll'; + +my %seen_country = (); +my %seen_state = (); +my %seen_county = (); my @fields = ( sub { my $country = shift->country; - code2country($country). " ($country)"; + return '' if $seen_country{$country}++; + FS::geocode_Mixin->code2country($country). " ($country)"; }, - sub { state_label($_[0]->state, $_[0]->country). - ( $_[0]->state - ? '' - : ' '. expand_link( desc => 'Add States', - row => $_[0], - label => 'add states', - ) - ) + + #state + sub { my $label = $seen_state{$_[0]->country}->{$_[0]->state}++ + ? '' : state_label($_[0]->state, $_[0]->country); + + my $countylinks = ( $_[0]->county && $label ) + ? ' '. add_link( + desc => 'Add more counties', + col => 'state', + label=> 'add more counties', + row => $_[0], + cgi => $cgi, + ). + ' '. collapse_link( + col => 'state', + label=> 'remove all counties', + row => $_[0], + cgi => $cgi, + ) + : ''; + + my $addlink = + ( $_[0]->state + ? '' + : ' '. expand_link( desc => 'Add States', + row => $_[0], + label => 'add states', + cgi => $cgi, + ) + ); + + $label.$countylinks.$addlink; }, - sub { $_[0]->county || '(all) '. - expand_link( desc => 'Add Counties', - row => $_[0], - label => 'add counties', - ) + + #county + sub { my $label = + $seen_county{$_[0]->country}->{$_[0]->state}->{$_[0]->county}++ + ? '' : $_[0]->county; + + my $citylinks = ''; + if ( $label ) { + $citylinks = $_[0]->city + ? ' '. add_link( + desc => 'Add more cities', + col => 'county', + label=> 'add more cities', + row => $_[0], + cgi => $cgi, + ). + ' '. collapse_link( + col => 'county', + label=> 'remove all cities', + row => $_[0], + cgi => $cgi, + ) + : ' '. remove_link( col => 'county', + label=> 'remove county', + row => $_[0], + cgi => $cgi, + ); + } + + $_[0]->county + ? $label.$citylinks + : '(all) '. + expand_link( desc => 'Add Counties', + row => $_[0], + label => 'add counties', + cgi => $cgi, + ); }, + + #city + sub { + my $r = shift; + if ( $r->city ) { + + if ( $r->taxclass #but if it has a taxclass, can't remove + or $r->district ) { # or a district + $r->city; + } else { + $r->city. ' '. + remove_link( col => 'city', + label=> 'remove city', + row => $r, + cgi => $cgi, + ); + } + } else { + '(all) '. + expand_link( desc => 'Add Cities', + row => $r, + label => 'add cities', + cgi => $cgi, + ); + } + }, + + #district + sub { + my $r = shift; + if ( $r->district ) { + $r->district . ' '. + remove_link( col => 'district', + label=> 'remove district', + row => $r, + cgi => $cgi, + ); + } + # manually editing districts is not exactly intended + }, + ); my @color = ( '000000', sub { shift->state ? '000000' : '999999' }, sub { shift->county ? '000000' : '999999' }, + sub { shift->city ? '000000' : '999999' }, ); if ( $conf->exists('enable_taxclasses') ) { push @header, qq!Tax class (add new)!; push @header2, '(per-package classification)'; - push @fields, sub { $_[0]->taxclass || '(all) '. - separate_taxclasses_link($_[0], 'Separate Taxclasses'). - 'separate taxclasses
' - }; + push @fields, sub { + my $r = shift; + if ( $r->taxclass ) { + $r->taxclass; + } else { + my $sql = 'SELECT COUNT(*) FROM cust_main_county + WHERE country = ? AND state = ? AND county = ? + AND city = ? AND taxclass IS NOT NULL'; + if ( FS::Record->scalar_sql($sql, map $r->$_, + qw( country state county city) ) ) { + '(none)'; + } else { + '(all) '. + separate_taxclasses_link($r, 'Separate Taxclasses'). + 'separate taxclasses'; + } + } + }; push @color, sub { shift->taxclass ? '000000' : '999999' }; push @links, ''; push @link_onclicks, ''; @@ -407,9 +684,11 @@ my $cb_sub = sub { my $cust_main_county = shift; if ( $cb_oldrow ) { - if ( $cb_oldrow->country ne $cust_main_county->country - || $cb_oldrow->state ne $cust_main_county->state + if ( $cb_oldrow->district ne $cust_main_county->district + || $cb_oldrow->city ne $cust_main_county->city || $cb_oldrow->county ne $cust_main_county->county + || $cb_oldrow->state ne $cust_main_county->state + || $cb_oldrow->country ne $cust_main_county->country || $cb_oldrow->taxclass ne $cust_main_county->taxclass ) { $newregion = 1;