Preisgruppenpreise als Preisliste bei Kunden anzeigen
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Fri, 28 Feb 2014 11:53:23 +0000 (12:53 +0100)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Tue, 17 Sep 2019 13:43:47 +0000 (15:43 +0200)
Wenn dem Kunden eine Preisgruppe zugeordnet ist, werden die Preise in
den Kundenstammdaten als Preisliste (eigener Tab) angezeigt.

SL/Controller/CustomerVendor.pm
doc/changelog
js/kivi.CustomerVendor.js
locale/de/all
locale/en/all
templates/webpages/customer_vendor/form.html
templates/webpages/customer_vendor/tabs/price_list.html [new file with mode: 0644]

index c8fd5fd..63b822e 100644 (file)
@@ -22,6 +22,7 @@ use SL::DB::TaxZone;
 use SL::DB::Note;
 use SL::DB::PaymentTerm;
 use SL::DB::Pricegroup;
+use SL::DB::Price;
 use SL::DB::Contact;
 use SL::DB::FollowUp;
 use SL::DB::FollowUpLink;
@@ -69,6 +70,7 @@ __PACKAGE__->run_before(
     'update',
     'ajaj_get_shipto',
     'ajaj_get_contact',
+    'ajax_list_prices',
   ]
 );
 
@@ -660,6 +662,62 @@ sub action_test_page {
   $_[0]->render('customer_vendor/test_page');
 }
 
+sub action_ajax_list_prices {
+  my ($self, %params) = @_;
+
+  my $report   = SL::ReportGenerator->new(\%::myconfig, $::form);
+  my @columns  = qw(partnumber description price);
+  my @visible  = qw(partnumber description price);
+  my @sortable = qw(partnumber description price);
+
+  my %column_defs = (
+    partnumber  => { text => $::locale->text('Part Number'),      sub => sub { $_[0]->parts->partnumber  } },
+    description => { text => $::locale->text('Part Description'), sub => sub { $_[0]->parts->description } },
+    price       => { text => $::locale->text('Price'),            sub => sub { $::form->format_amount(\%::myconfig, $_[0]->price, 2) }, align => 'right' },
+  );
+
+  $::form->{sort_by}  ||= 'partnumber';
+  $::form->{sort_dir} //= 1;
+
+  for my $col (@sortable) {
+    $column_defs{$col}{link} = $self->url_for(
+      action   => 'ajax_list_prices',
+      callback => $::form->{callback},
+      db       => $::form->{db},
+      id       => $self->{cv}->id,
+      sort_by  => $col,
+      sort_dir => ($::form->{sort_by} eq $col ? 1 - $::form->{sort_dir} : $::form->{sort_dir})
+    );
+  }
+
+  map { $column_defs{$_}{visible} = 1 } @visible;
+
+  my $pricegroup;
+  $pricegroup = $self->{cv}->pricegroup->pricegroup if $self->{cv}->pricegroup;
+
+  $report->set_columns(%column_defs);
+  $report->set_column_order(@columns);
+  $report->set_options(allow_pdf_export => 0, allow_csv_export => 0);
+  $report->set_sort_indicator($::form->{sort_by}, $::form->{sort_dir});
+  $report->set_export_options(@{ $params{report_generator_export_options} || [] });
+  $report->set_options(
+    %{ $params{report_generator_options} || {} },
+    output_format        => 'HTML',
+    top_info_text        => $::locale->text('Pricegroup') . ': ' . $pricegroup,
+    title                => $::locale->text('Price List'),
+  );
+
+  my $sort_param = $::form->{sort_by} eq 'price'       ? 'price'             :
+                   $::form->{sort_by} eq 'description' ? 'parts.description' :
+                   'parts.partnumber';
+  $sort_param .= ' ' . ($::form->{sort_dir} ? 'ASC' : 'DESC');
+  my $prices = SL::DB::Manager::Price->get_all(where        => [ pricegroup_id => $self->{cv}->pricegroup_id ],
+                                               sort_by      => $sort_param,
+                                               with_objects => 'parts');
+
+  $self->report_generator_list_objects(report => $report, objects => $prices, layout => 0, header => 0);
+}
+
 sub is_vendor {
   return $::form->{db} eq 'vendor';
 }
index 6013a4f..f138d21 100644 (file)
@@ -29,6 +29,11 @@ Kleinere neue Features und Detailverbesserungen:
 
 - Mahnungen nach Abteilung filtern
 
+- Anzeige einer Kundenpreisliste in den Kundenstammdaten als Reiter.
+  Hier werden die Preisgruppenpreise angezeigt, falls einem Kunden eine
+  Preisgruppe zugeordnet ist.
+
+
 2019-08-07 - Release 3.5.4
 
 
index 2bef3a7..2c19287 100644 (file)
@@ -455,7 +455,39 @@ namespace('kivi.CustomerVendor', function(ns) {
     ns.reinit_widgets();
   }
 
+  ns.get_price_report = function(target, source, data) {
+    $.ajax({
+      url:        source,
+      success:    function (rsp) {
+        $(target).html(rsp);
+        $(target).find('a.report-generator-header-link').click(function(event){ ns.price_report_redirect_event(event, target) });
+      },
+    });
+  };
+
+  ns.price_report_redirect_event = function (event, target) {
+    event.preventDefault();
+    ns.get_price_report(target, event.target + '');
+  };
+
+  ns.price_list_init = function () {
+    $("#customer_vendor_tabs").on('tabsbeforeactivate', function(event, ui){
+      if (ui.newPanel.attr('id') == 'price_list') {
+        ns.get_price_report('#price_list', "controller.pl?action=CustomerVendor/ajax_list_prices&id=" + $('#cv_id').val() + "&db=" + $('#db').val() + "&callback=" + $('#callback').val());
+      }
+      return 1;
+    });
+
+    $("#customer_vendor_tabs").on('tabscreate', function(event, ui){
+      if (ui.panel.attr('id') == 'price_list') {
+        ns.get_price_report('#price_list', "controller.pl?action=CustomerVendor/ajax_list_prices&id=" + $('#cv_id').val() + "&db=" + $('#db').val() + "&callback=" + $('#callback').val());
+      }
+      return 1;
+    });
+  }
+
   $(function(){
     ns.init();
+    ns.price_list_init();
   });
 });
index 91d3e58..918a788 100755 (executable)
@@ -2387,6 +2387,7 @@ $self->{texts} = {
   'Price #1'                    => 'Preis #1',
   'Price Factor'                => 'Preisfaktor',
   'Price Factors'               => 'Preisfaktoren',
+  'Price List'                  => 'Preisliste',
   'Price Rule'                  => 'Preisregel',
   'Price Rules'                 => 'Preisregeln',
   'Price Source'                => 'Preisquelle',
index b94f20d..2a13753 100644 (file)
@@ -2387,6 +2387,7 @@ $self->{texts} = {
   'Price #1'                    => '',
   'Price Factor'                => '',
   'Price Factors'               => '',
+  'Price List'                  => '',
   'Price Rule'                  => '',
   'Price Rules'                 => '',
   'Price Source'                => '',
index a5c43fb..3b461e8 100644 (file)
         <li><a href="#price_rules">[% 'Price Rules' | $T8 %]</a></li>
       [% END %]
 
+      [% IF ( SELF.cv.id && SELF.cv.pricegroup_id && AUTH.assert('part_service_assembly_details', 1) ) %]
+        <li><a href="#price_list">[% 'Price List' | $T8 %]</a></li>
+      [% END %]
+
       [% IF SELF.cv.id %]
         [% IF ( FORM.db == 'customer' && AUTH.assert('show_extra_record_tab_customer',1) ) %]
           <li><a href="[% 'controller.pl?action=CustomerVendorTurnover/list_turnover&id=' _ SELF.cv.id _ '&db=' _ FORM.db %]">[% LxERP.t8('Records') %]
@@ -66,6 +70,9 @@
     [% IF SELF.cv.id %]
       [% PROCESS "customer_vendor/tabs/price_rules.html" %]
     [% END %]
+    [% IF ( SELF.cv.id && SELF.cv.pricegroup_id && AUTH.assert('part_service_assembly_details', 1) ) %]
+      [% PROCESS "customer_vendor/tabs/price_list.html" %]
+    [% END %]
   </div>
 </form>
 
diff --git a/templates/webpages/customer_vendor/tabs/price_list.html b/templates/webpages/customer_vendor/tabs/price_list.html
new file mode 100644 (file)
index 0000000..e8fabf5
--- /dev/null
@@ -0,0 +1,8 @@
+[%- USE T8 %]
+[%- USE LxERP %]
+[%- USE HTML %]
+[%- USE L %]
+
+<div id="price_list">
+  [%- LxERP.t8("Loading...") %]
+</div>