PriceTaxCalculator: chart->taxkey lookup vorberechnen
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 13 Jun 2014 18:10:46 +0000 (20:10 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 16 Jun 2014 12:12:46 +0000 (14:12 +0200)
SL/DB/Chart.pm
SL/DB/Helper/PriceTaxCalculator.pm
SL/DB/Manager/Chart.pm

index 718d422..db8a3b9 100644 (file)
@@ -16,6 +16,12 @@ __PACKAGE__->meta->initialize;
 sub get_active_taxkey {
   my ($self, $date) = @_;
   $date ||= DateTime->today_local;
+
+  my $cache = $::request->{cache}{chart}{$date};
+  if ($cache->{$self->id}) {
+    return $cache->{$self->id};
+  }
+
   require SL::DB::TaxKey;
   return SL::DB::Manager::TaxKey->get_all(query   => [ and => [ chart_id  => $self->id,
                                                                 startdate => { le => $date } ] ],
index d95d143..673bb24 100644 (file)
@@ -37,6 +37,8 @@ sub calculate_prices_and_taxes {
   $self->netamount(  0);
   $self->marge_total(0);
 
+  SL::DB::Manager::Chart->cache_taxkeys(date => $self->transdate);
+
   my $idx = 0;
   foreach my $item ($self->items) {
     $idx++;
index a0167fd..81a65b5 100644 (file)
@@ -6,6 +6,8 @@ use SL::DB::Helper::Manager;
 use base qw(SL::DB::Helper::Manager);
 
 use SL::DB::Helper::Sorted;
+use DateTime;
+use SL::DBUtils;
 
 sub object_class { 'SL::DB::Chart' }
 
@@ -20,6 +22,27 @@ sub link_filter {
                   link => { like => "\%:${link}:\%" } ]);
 }
 
+sub cache_taxkeys {
+  my ($self, %params) = @_;
+
+  my $date  = $params{date} || DateTime->today;
+  my $cache = $::request->{cache}{chart}{$date} ||= {};
+
+  require SL::DB::TaxKey;
+  my $tks = SL::DB::Manager::TaxKey->get_all;
+  my %tks_by_id = map { $_->id => $_ } @$tks;
+
+  my $rows = selectall_hashref_query($::form, $::form->get_standard_dbh, <<"", $date);
+    SELECT DISTINCT ON (chart_id) chart_id, startdate, id
+    FROM taxkeys
+    WHERE startdate < ?
+    ORDER BY chart_id, startdate DESC;
+
+  for (@$rows) {
+    $cache->{$_->{chart_id}} = $tks_by_id{$_->{id}};
+  }
+}
+
 1;
 
 __END__