diff options
| author | ivan <ivan> | 2009-01-18 23:43:40 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2009-01-18 23:43:40 +0000 | 
| commit | 6397a30ca9f53c90a503da8786925ec75535a699 (patch) | |
| tree | 0056fe6e195f5a621d46616e75fd57ad55e8c579 /httemplate | |
| parent | a5b4bfc7728cf3014106806b729d2390045c71a6 (diff) | |
finish package location tax reporing, RT#4499
Diffstat (limited to 'httemplate')
| -rw-r--r-- | httemplate/search/cust_bill_pkg.cgi | 138 | ||||
| -rwxr-xr-x | httemplate/search/report_tax.cgi | 353 | ||||
| -rw-r--r-- | httemplate/view/cust_main/packages/location.html | 5 | 
3 files changed, 270 insertions, 226 deletions
| diff --git a/httemplate/search/cust_bill_pkg.cgi b/httemplate/search/cust_bill_pkg.cgi index 1a95d010d..57a1951d6 100644 --- a/httemplate/search/cust_bill_pkg.cgi +++ b/httemplate/search/cust_bill_pkg.cgi @@ -64,6 +64,8 @@  die "access denied"    unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); +my $conf = new FS::Conf; +  #here is the agent virtualization  my $agentnums_sql =    $FS::CurrentUser::CurrentUser->agentnums_sql( 'table' => 'cust_main' ); @@ -89,41 +91,66 @@ if ( $cgi->param('classnum') =~ /^(\d+)$/ ) {    }  } +sub _where { +  my $table = shift; +  my $prefix = @_ ? shift : ''; +  " +       (    cust_main_county.county  = $table.${prefix}.county +       OR ( cust_main_county.county IS NULL AND $table.${prefix}.county  =  '' ) +       OR ( cust_main_county.county  =  ''  AND $table.${prefix}.county IS NULL) +       OR ( cust_main_county.county IS NULL AND $table.${prefix}.county IS NULL) +       ) +   AND (    cust_main_county.state   = $table.${prefix}.state +       OR ( cust_main_county.state  IS NULL AND $table.${prefix}.state  =  ''  ) +       OR ( cust_main_county.state   =  ''  AND $table.${prefix}.state IS NULL ) +       OR ( cust_main_county.state  IS NULL AND $table.${prefix}.state IS NULL ) +       ) +   AND cust_main_county.country = $table.${prefix}.country +  "; + +} +  if ( $cgi->param('out') ) { +  my ( $loc_sql, @param ) = FS::cust_pkg->location_sql( 'ornull' => 1 ); +  while ( $loc_sql =~ /\?/ ) { #easier to do our own substitution +    $loc_sql =~ s/\?/'cust_main_county.'.shift(@param)/e; +  } + +  $loc_sql =~ s/cust_pkg\.locationnum/cust_bill_pkg_tax_location.locationnum/g +    if $cgi->param('istax'); +    push @where, "      0 = ( -      SELECT COUNT(*) FROM cust_main_county -      WHERE (    cust_main_county.county  = cust_main.county -              OR ( cust_main_county.county IS NULL AND cust_main.county  =  '' ) -              OR ( cust_main_county.county  =  ''  AND cust_main.county IS NULL) -              OR ( cust_main_county.county IS NULL AND cust_main.county IS NULL) -            ) -        AND (    cust_main_county.state   = cust_main.state -              OR ( cust_main_county.state  IS NULL AND cust_main.state  =  ''  ) -              OR ( cust_main_county.state   =  ''  AND cust_main.state IS NULL ) -              OR ( cust_main_county.state  IS NULL AND cust_main.state IS NULL ) -            ) -        AND cust_main_county.country = cust_main.country -        AND cust_main_county.tax > 0 -    ) +          SELECT COUNT(*) FROM cust_main_county +           WHERE cust_main_county.tax > 0 +             AND $loc_sql +        )    ";  } elsif ( $cgi->param('country' ) ) { -  my $county  = dbh->quote( $cgi->param('county')  ); -  my $state   = dbh->quote( $cgi->param('state')   ); -  my $country = dbh->quote( $cgi->param('country') ); -  push @where,  -    " ( county  = $county OR $county = '' ) ", -    " ( state   = $state  OR $state  = '' ) ", -    "   country = $country " -  ; -  if ( $cgi->param('taxname') ) { -    push @where, 'itemdesc = '. dbh->quote( $cgi->param('taxname') ); -  #} elsif ( $cgi->param('taxnameNULL') { +  my %ph = map { $_ => dbh->quote( $cgi->param($_) ) } +               qw( county state country ); + +  my ( $loc_sql, @param ) = FS::cust_pkg->location_sql; +  while ( $loc_sql =~ /\?/ ) { #easier to do our own substitution +    $loc_sql =~ s/\?/$ph{shift(@param)}/e; +  } + +  push @where, $loc_sql; +    +  if ( $cgi->param('istax') ) { +    if ( $cgi->param('taxname') ) { +      push @where, 'itemdesc = '. dbh->quote( $cgi->param('taxname') ); +    #} elsif ( $cgi->param('taxnameNULL') { +    } else { +      push @where, "( itemdesc IS NULL OR itemdesc = '' OR itemdesc = 'Tax' )"; +    } +  } elsif ( $cgi->param('nottax') ) { +    #what can we usefully do with "taxname" ????  look up a class???    } else { -    push @where, "( itemdesc IS NULL OR itemdesc = '' OR itemdesc = 'Tax' )"; +    #warn "neither nottax nor istax parameters specified";    }    push @where, ' taxclass = '. dbh->quote( $cgi->param('taxclass') ) @@ -152,8 +179,8 @@ if ($cgi->param('itemdesc')) {      push @where, 'itemdesc='. dbh->quote($cgi->param('itemdesc'));    }  } -push @where, 'pkgnum != 0' if $cgi->param('nottax'); -push @where, 'pkgnum  = 0' if $cgi->param('istax'); +push @where, 'cust_bill_pkg.pkgnum != 0' if $cgi->param('nottax'); +push @where, 'cust_bill_pkg.pkgnum  = 0' if $cgi->param('istax');  push @where, " tax = 'Y' " if $cgi->param('cust_tax'); @@ -189,29 +216,54 @@ if ( $cgi->param('pkg_tax') ) {  my $where = ' WHERE '. join(' AND ', @where); -my $join_cust = " -    JOIN cust_bill USING ( invnum )  -    LEFT JOIN cust_main USING ( custnum ) -"; +my $join_cust =  '      JOIN cust_bill USING ( invnum )  +                   LEFT JOIN cust_main USING ( custnum ) '; + + +my $join_pkg; +if ( $cgi->param('nottax') ) { + +  $join_pkg =  ' LEFT JOIN cust_pkg USING ( pkgnum ) +                 LEFT JOIN part_pkg USING ( pkgpart ) '; +  $join_pkg .= ' LEFT JOIN cust_location USING ( locationnum ) ' +    if $conf->exists('tax-pkg_address'); + +} elsif ( $cgi->param('istax') ) { + +  #false laziness w/report_tax.cgi $taxfromwhere +  if ( $conf->exists('tax-pkg_address') ) { +    $join_pkg .= ' LEFT JOIN cust_bill_pkg_tax_location USING ( billpkgnum ) +                   LEFT JOIN cust_location              USING ( locationnum ) '; -my $join_pkg = " -    LEFT JOIN cust_pkg USING ( pkgnum ) -    LEFT JOIN part_pkg USING ( pkgpart ) -"; +    #quelle kludge, false laziness w/report_tax.cgi +    $where =~ s/cust_pkg\.locationnum/cust_bill_pkg_tax_location.locationnum/g;  +  } + +} else {  + +  #die? +  warn "neiether nottax nor istax parameters specified"; +  #same as before? +  $join_pkg =  ' LEFT JOIN cust_pkg USING ( pkgnum ) +                 LEFT JOIN part_pkg USING ( pkgpart ) '; + +}  $count_query .= " FROM cust_bill_pkg $join_cust $join_pkg $where"; +my @select = ( +               'cust_bill_pkg.*', +               'cust_bill._date', +             ); +push @select, 'part_pkg.pkg' unless $cgi->param('istax'); +push @select, 'cust_main.custnum', +              FS::UI::Web::cust_sql_fields(); +  my $query = {    'table'     => 'cust_bill_pkg',    'addl_from' => "$join_cust $join_pkg",    'hashref'   => {}, -  'select'    => join(', ', -                   'cust_bill_pkg.*', -                   'cust_bill._date', -                   'part_pkg.pkg', -                   'cust_main.custnum', -                   FS::UI::Web::cust_sql_fields(), -                 ), +  'select'    => join(', ', @select ),    'extra_sql' => $where,    'order_by'  => 'ORDER BY _date, billpkgnum',  }; diff --git a/httemplate/search/report_tax.cgi b/httemplate/search/report_tax.cgi index 0bec85d70..7eb07cf3c 100755 --- a/httemplate/search/report_tax.cgi +++ b/httemplate/search/report_tax.cgi @@ -21,11 +21,10 @@      <TH CLASS="grid" BGCOLOR="#cccccc" ROWSPAN=2></TH>      <TH CLASS="grid" BGCOLOR="#cccccc" ROWSPAN=2>Tax owed</TH>  % unless ( $cgi->param('show_taxclasses') ) {  -        <TH CLASS="grid" BGCOLOR="#cccccc" ROWSPAN=2>Tax invoiced</TH>  % }  -    </TR> +    <TR>      <TH CLASS="grid" BGCOLOR="#cccccc">Total</TH>      <TH CLASS="grid" BGCOLOR="#cccccc"></TH> @@ -37,188 +36,163 @@      <TH CLASS="grid" BGCOLOR="#cccccc"></TH>      <TH CLASS="grid" BGCOLOR="#cccccc">Taxable</TH>    </TR> +  % my $bgcolor1 = '#eeeeee'; -%   my $bgcolor2 = '#ffffff'; -%   my $bgcolor; +% my $bgcolor2 = '#ffffff'; +% my $bgcolor;  %  % foreach my $region ( @regions ) {  % -%       if ( $bgcolor eq $bgcolor1 ) { -%         $bgcolor = $bgcolor2; -%       } else { -%         $bgcolor = $bgcolor1; -%       } -% -%       my $link = ''; -%       if ( $region->{'label'} ne 'Total' ) { -%         if ( $region->{'label'} eq $out ) { -%           $link = ';out=1'; -%         } else { -%           $link = ';'. $region->{'url_param'}; -%         } -%       } -% -% +%   my $link = ''; +%   if ( $region->{'label'} ne 'Total' ) { +%     if ( $region->{'label'} eq $out ) { +%       $link = ';out=1'; +%     } else { +%       $link = ';'. $region->{'url_param'}; +%     } +%   }  % +%   if ( $bgcolor eq $bgcolor1 ) { +%     $bgcolor = $bgcolor2; +%   } else { +%     $bgcolor = $bgcolor1; +%   }  % -%   - +%   my $td = qq(TD CLASS="grid" BGCOLOR="$bgcolor"); +%   my $bigmath = '<FONT FACE="sans-serif" SIZE="+1"><B>'; +%   my $bme = '</B></FONT>';      <TR> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $region->{'label'} %></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <A HREF="<% $baselink. $link %>;nottax=1"><% $money_char %><% sprintf('%.2f', $region->{'total'} ) %></A> +      <<%$td%>><% $region->{'label'} %></TD> +      <<%$td%> ALIGN="right"> +        <A HREF="<% $baselink. $link %>;nottax=1" +        ><% &$money_sprintf( $region->{'total'} ) %></A>        </TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><FONT SIZE="+1"><B> - </B></FONT></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <A HREF="<% $baselink. $link %>;nottax=1;cust_tax=Y"><% $money_char %><% sprintf('%.2f', $region->{'exempt_cust'} ) %></A> +      <<%$td%>><FONT SIZE="+1"><B> - </B></FONT></TD> +      <<%$td%> ALIGN="right"> +        <A HREF="<% $baselink. $link %>;nottax=1;cust_tax=Y" +        ><% &$money_sprintf( $region->{'exempt_cust'} ) %></A>        </TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><FONT SIZE="+1"><B> - </B></FONT></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <A HREF="<% $baselink. $link %>;nottax=1;pkg_tax=Y"><% $money_char %><% sprintf('%.2f', $region->{'exempt_pkg'} ) %></A> +      <<%$td%>><FONT SIZE="+1"><B> - </B></FONT></TD> +      <<%$td%> ALIGN="right"> +        <A HREF="<% $baselink. $link %>;nottax=1;pkg_tax=Y" +        ><% &$money_sprintf( $region->{'exempt_pkg'} ) %></A>        </TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><FONT SIZE="+1"><B> - </B></FONT></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <A HREF="<% $exemptlink. $link %>"><% $money_char %><% sprintf('%.2f', $region->{'exempt_monthly'} ) %></A> +      <<%$td%>><FONT SIZE="+1"><B> - </B></FONT></TD> +      <<%$td%> ALIGN="right"> +        <A HREF="<% $exemptlink. $link %>" +        ><% &$money_sprintf( $region->{'exempt_monthly'} ) %></A>          </TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><FONT SIZE="+1"><B> = </B></FONT></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <% $money_char %><% sprintf('%.2f', $region->{'taxable'} ) %></A> +      <<%$td%>><FONT SIZE="+1"><B> = </B></FONT></TD> +      <<%$td%> ALIGN="right"> +        <% &$money_sprintf( $region->{'taxable'} ) %></A>        </TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $region->{'label'} eq 'Total' ? '' : '<FONT FACE="sans-serif" SIZE="+1"><B> X </B></FONT>' %></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"><% $region->{'rate'} %></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $region->{'label'} eq 'Total' ? '' : '<FONT FACE="sans-serif" SIZE="+1"><B> = </B></FONT>' %></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <% $money_char %><% sprintf('%.2f', $region->{'owed'} ) %> +      <<%$td%>><% $region->{'label'} eq 'Total' ? '' : "$bigmath X $bme" %></TD> +      <<%$td%> ALIGN="right"><% $region->{'rate'} %></TD> +      <<%$td%>><% $region->{'label'} eq 'Total' ? '' : "$bigmath = $bme" %></TD> +      <<%$td%> ALIGN="right"> +        <% &$money_sprintf( $region->{'owed'} ) %>        </TD> -% unless ( $cgi->param('show_taxclasses') ) {  -        <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -          <A HREF="<% $baselink. $link %>;istax=1"><% $money_char %><% sprintf('%.2f', $region->{'tax'} ) %></A> +% unless ( $cgi->param('show_taxclasses') ) {  +        <<%$td%> ALIGN="right"> +          <A HREF="<% $baselink. $link %>;istax=1" +          ><% &$money_sprintf( $region->{'tax'} ) %></A>          </TD>  % }       </TR>  % }  -  </TABLE> -% if ( $cgi->param('show_taxclasses') ) {  +% if ( $cgi->param('show_taxclasses') ) { -  <BR> -  <% include('/elements/table-grid.html') %> -  <TR> -    <TH CLASS="grid" BGCOLOR="#cccccc"></TH> -    <TH CLASS="grid" BGCOLOR="#cccccc">Tax invoiced</TH> -  </TR> -% #some false laziness w/above -%     $bgcolor1 = '#eeeeee'; -%     $bgcolor2 = '#ffffff'; -%     foreach my $region ( @base_regions ) { +    <BR> +    <% include('/elements/table-grid.html') %> +    <TR> +      <TH CLASS="grid" BGCOLOR="#cccccc"></TH> +      <TH CLASS="grid" BGCOLOR="#cccccc">Tax invoiced</TH> +    </TR> + +%   #some false laziness w/above +%   $bgcolor1 = '#eeeeee'; +%   $bgcolor2 = '#ffffff';  % -%       if ( $bgcolor eq $bgcolor1 ) { -%         $bgcolor = $bgcolor2; +%   foreach my $region ( @base_regions ) { +% +%     my $link = ''; +%     #if ( $region->{'label'} ne 'Total' ) { +%       if ( $region->{'label'} eq $out ) { +%         $link = ';out=1';  %       } else { -%         $bgcolor = $bgcolor1; +%         $link = ';'. $region->{'url_param'};  %       } -% -%       my $link = ''; -%       #if ( $region->{'label'} ne 'Total' ) { -%         if ( $region->{'label'} eq $out ) { -%           $link = ';out=1'; -%         } else { -%           $link = ';'. $region->{'url_param'}; -%         } -%       #} -%   - - -    <TR> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $region->{'label'} %></TD> -      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -        <A HREF="<% $baselink. $link %>;istax=1"><% $money_char %><% sprintf('%.2f', $region->{'tax'} ) %></A> -      </TD> -    </TR> -% }  +%     #}  %  %     if ( $bgcolor eq $bgcolor1 ) {  %       $bgcolor = $bgcolor2;  %     } else {  %       $bgcolor = $bgcolor1;  %     } -%   +%     my $td = qq(TD CLASS="grid" BGCOLOR="$bgcolor"); +      <TR> +        <<%$td%>><% $region->{'label'} %></TD> +        <<%$td%> ALIGN="right"> +          <A HREF="<% $baselink. $link %>;istax=1" +          ><% &$money_sprintf( $region->{'tax'} ) %></A> +        </TD> +      </TR> + +% }  + +% if ( $bgcolor eq $bgcolor1 ) { +%   $bgcolor = $bgcolor2; +% } else { +%   $bgcolor = $bgcolor1; +% } +% my $td = qq(TD CLASS="grid" BGCOLOR="$bgcolor");    <TR> -   <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">Total</TD> -    <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ALIGN="right"> -      <A HREF="<% $baselink %>;istax=1"><% $money_char %><% sprintf('%.2f', $tax ) %></A> -    </TD> +   <<%$td%>>Total</TD> +   <<%$td%> ALIGN="right"> +     <A HREF="<% $baselink %>;istax=1" +     ><% &$money_sprintf( $tax ) %></A> +   </TD>    </TR>    </TABLE> +  % }  +<% include('/elements/footer.html') %> -</BODY> -</HTML>  <%init>  die "access denied"    unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');  my $conf = new FS::Conf; -my $money_char = $conf->config('money_char') || '$';  my $user = getotaker;  my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); -my $join_cust = " -    JOIN cust_bill USING ( invnum )  -    LEFT JOIN cust_main USING ( custnum ) -"; -my $from_join_cust = " -    FROM cust_bill_pkg -    $join_cust -";  -my $join_pkg = " -    LEFT JOIN cust_pkg USING ( pkgnum ) -    LEFT JOIN part_pkg USING ( pkgpart ) -"; +my $join_cust =     '     JOIN cust_bill      USING ( invnum  )  +                      LEFT JOIN cust_main     USING ( custnum ) '; +my $join_cust_pkg = $join_cust. +                    ' LEFT JOIN cust_pkg      USING ( pkgnum  ) +                      LEFT JOIN part_pkg      USING ( pkgpart ) '; +$join_cust_pkg .=   ' LEFT JOIN cust_location USING ( locationnum )' +  if $conf->exists('tax-pkg_address'); -my $where = "WHERE _date >= $beginning AND _date <= $ending "; -my @base_param = qw( county county state state country ); -if ( $conf->exists('tax-ship_address') ) { - -  $where .= " -      AND (    (     ( ship_last IS NULL     OR  ship_last  = '' ) -                 AND ( county       = ? OR ? = '' ) -                 AND ( state        = ? OR ? = '' ) -                 AND   country      = ? -               ) -            OR (       ship_last IS NOT NULL AND ship_last != '' -                 AND ( ship_county  = ? OR ? = '' ) -                 AND ( ship_state   = ? OR ? = '' ) -                 AND   ship_country = ? -               ) -          ) -  "; -  #    AND payby != 'COMP' - -  push @base_param, @base_param; - -} else { +my $from_join_cust_pkg = " FROM cust_bill_pkg $join_cust_pkg ";  -  $where .= " -      AND ( county  = ? OR ? = '' ) -      AND ( state   = ? OR ? = '' ) -      AND   country = ? -  "; -  #    AND payby != 'COMP' +my $where = "WHERE _date >= $beginning AND _date <= $ending "; -} +my( $location_sql, @base_param ) = FS::cust_pkg->location_sql; +$where .= " AND $location_sql ";  my $agentname = '';  if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) { @@ -228,70 +202,68 @@ if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {    $where .= ' AND cust_main.agentnum = '. $agent->agentnum;  } -my $gotcust = " -  WHERE 0 < ( SELECT COUNT(*) FROM cust_main -"; -if ( $conf->exists('tax-ship_address') ) { - -  $gotcust .= " -                WHERE +sub gotcust { +  my $table = shift; +  my $prefix = @_ ? shift : ''; +  " +        ( $table.${prefix}county  = cust_main_county.county +          OR cust_main_county.county = '' +          OR cust_main_county.county IS NULL ) +    AND ( $table.${prefix}state   = cust_main_county.state +          OR cust_main_county.state = '' +          OR cust_main_county.state IS NULL ) +    AND ( $table.${prefix}country = cust_main_county.country ) +  "; +} -                (    cust_main_county.country = cust_main.country -                  OR cust_main_county.country = cust_main.ship_country -                ) +my $gotcust; +if ( $conf->exists('tax-ship_address') ) { -                AND +  $gotcust = " +               (    cust_main_county.country = cust_main.country +                 OR cust_main_county.country = cust_main.ship_country +               ) -                (  +               AND -                  (     ( ship_last IS NULL     OR  ship_last = '' ) -                    AND (    cust_main_county.country = cust_main.country ) -                    AND (    cust_main_county.state = cust_main.state -                          OR cust_main_county.state = '' -                          OR cust_main_county.state IS NULL ) -                    AND (    cust_main_county.county = cust_main.county -                          OR cust_main_county.county = '' -                          OR cust_main_county.county IS NULL ) -                  ) -   -                  OR -   -                  (       ship_last IS NOT NULL AND ship_last != '' -                    AND (    cust_main_county.country = cust_main.ship_country ) -                    AND (    cust_main_county.state = cust_main.ship_state -                          OR cust_main_county.state = '' -                          OR cust_main_county.state IS NULL ) -                    AND (    cust_main_county.county = cust_main.ship_county -                          OR cust_main_county.county = '' -                          OR cust_main_county.county IS NULL ) -                  ) - -                ) - -                LIMIT 1 -            ) +               (  +                 (     ( ship_last IS NULL     OR  ship_last = '' ) +                   AND ". gotcust('cust_main'). " +                 ) +                 OR +                 (       ship_last IS NOT NULL AND ship_last != '' +                   AND ". gotcust('cust_main', 'ship_'). " +                 ) +               )    ";  } else { -  $gotcust .= " -                WHERE ( cust_main.county  = cust_main_county.county -                        OR cust_main_county.county = '' -                        OR cust_main_county.county IS NULL ) -                  AND ( cust_main.state   = cust_main_county.state -                        OR cust_main_county.state = '' -                        OR cust_main_county.state IS NULL ) -                  AND ( cust_main.country = cust_main_county.country ) -                LIMIT 1 -            ) -  "; +  $gotcust = gotcust('cust_main');  } +if ( $conf->exists('tax-pkg_address') ) { +  $gotcust = " +       ( cust_pkg.locationnum IS     NULL AND $gotcust) +    OR ( cust_pkg.locationnum IS NOT NULL AND ". gotcust('cust_location'). " )"; +  $gotcust = +    "WHERE 0 < ( SELECT COUNT(*) FROM cust_pkg +                                 LEFT JOIN cust_main USING ( custnum ) +                                 LEFT JOIN cust_location USING ( locationnum ) +                   WHERE $gotcust +                   LIMIT 1 +               ) +    "; +} else { +  $gotcust = +    "WHERE 0 < ( SELECT COUNT(*) FROM cust_main WHERE $gotcust LIMIT 1 )"; +}  my($total, $tot_taxable, $owed, $tax) = ( 0, 0, 0, 0 );  my( $exempt_cust, $exempt_pkg, $exempt_monthly ) = ( 0, 0, 0 );  my $out = 'Out of taxable region(s)';  my %regions = (); +  foreach my $r ( qsearch({ 'table'     => 'cust_main_county',                            'extra_sql' => $gotcust,                         }) @@ -326,7 +298,7 @@ foreach my $r ( qsearch({ 'table'     => 'cust_main_county',    } -  my $fromwhere = $from_join_cust. $join_pkg. $mywhere. " AND payby != 'COMP' "; +  my $fromwhere = "$from_join_cust_pkg $mywhere AND payby != 'COMP' ";  #  my $label = getlabel($r);  #  $regions{$label}->{'label'} = $label; @@ -402,7 +374,7 @@ foreach my $r ( qsearch({ 'table'     => 'cust_main_county',      "SELECT SUM(amount)         FROM cust_tax_exempt_pkg         JOIN cust_bill_pkg USING ( billpkgnum ) -       $join_cust $join_pkg +       $join_cust_pkg       $mywhere"    );  #  if ( $x_monthly ) { @@ -441,6 +413,7 @@ my $taxclass_distinct =        : " '' "    )." AS taxclass"; +  my %qsearch = (    'select'    => "DISTINCT $distinct, $taxclass_distinct",    'table'     => 'cust_main_county', @@ -448,11 +421,22 @@ my %qsearch = (    'extra_sql' => $gotcust,  ); -my $taxwhere = "$from_join_cust $where AND payby != 'COMP' "; +my $taxfromwhere = " FROM cust_bill_pkg $join_cust "; +my $taxwhere = $where; +if ( $conf->exists('tax-pkg_address') ) { + +  $taxfromwhere .= 'LEFT JOIN cust_bill_pkg_tax_location USING ( billpkgnum ) +                    LEFT JOIN cust_location USING ( locationnum ) '; + +  #quelle kludge +  $taxwhere =~ s/cust_pkg\.locationnum/cust_bill_pkg_tax_location.locationnum/g; + +} +$taxfromwhere .= " $taxwhere AND payby != 'COMP' ";  my @taxparam = @base_param;  #should i be a cust_main_county method or something -#need to pass in $taxwhere & @taxparam??? +#need to pass in $taxfromwhere & @taxparam???  my $_taxamount_sub = sub {    my $r = shift; @@ -463,7 +447,7 @@ my $_taxamount_sub = sub {        : "AND ( itemdesc IS NULL OR itemdesc = '' OR itemdesc = 'Tax' )";    my $sql = "SELECT SUM(cust_bill_pkg.setup+cust_bill_pkg.recur) ". -            " $taxwhere AND pkgnum = 0 $named_tax"; +            " $taxfromwhere AND cust_bill_pkg.pkgnum = 0 $named_tax";    scalar_sql($r, \@taxparam, $sql );  }; @@ -534,6 +518,11 @@ push @regions, {  #--  +my $money_char = $conf->config('money_char') || '$'; +my $money_sprintf = sub { +  $money_char. sprintf('%.2f', shift ); +}; +  sub getlabel {    my $r = shift;    my %opt = @_; diff --git a/httemplate/view/cust_main/packages/location.html b/httemplate/view/cust_main/packages/location.html index 3c641304a..6664629ab 100644 --- a/httemplate/view/cust_main/packages/location.html +++ b/httemplate/view/cust_main/packages/location.html @@ -19,7 +19,10 @@    </I> -% if ($FS::CurrentUser::CurrentUser->access_right('Change customer package')) { +% if ( ! $cust_pkg->get('cancel') +%      && $FS::CurrentUser::CurrentUser->access_right('Change customer package') +%    ) +% {    <FONT SIZE=-1>      ( <%pkg_change_location_link($cust_pkg)%> )    </FONT> | 
