Dateianhang umbenennen funktioniert nicht.
[kivitendo-erp.git] / SL / Presenter / Record.pm
index 20d4d5f..ae2164e 100644 (file)
@@ -5,35 +5,74 @@ use strict;
 use parent qw(Exporter);
 
 use Exporter qw(import);
-our @EXPORT = qw(grouped_record_list empty_record_list record_list);
+our @EXPORT = qw(grouped_record_list empty_record_list record_list record);
+
+use SL::Util;
 
 use Carp;
 use List::Util qw(first);
 
+sub _arrayify {
+  my ($array) = @_;
+  return []     if !defined $array;
+  return $array if ref $array;
+  return [ $array ];
+}
+
+sub record {
+  my ($self, $record, %params) = @_;
+
+  my %grouped = _group_records( [ $record ] ); # pass $record as arrayref
+  my $type    = (keys %grouped)[0];
+
+  return $self->sales_invoice(   $record, %params) if $type eq 'sales_invoices';
+  return $self->purchase_invoice($record, %params) if $type eq 'purchase_invoices';
+  return $self->ar_transaction(  $record, %params) if $type eq 'ar_transactions';
+  return $self->ap_transaction(  $record, %params) if $type eq 'ap_transactions';
+  return $self->gl_transaction(  $record, %params) if $type eq 'gl_transactions';
+
+  return '';
+}
+
 sub grouped_record_list {
   my ($self, $list, %params) = @_;
 
-  my %groups = _group_records($list);
+  %params    = map { exists $params{$_} ? ($_ => $params{$_}) : () } qw(edit_record_links with_columns object_id object_model);
+
+  my %groups = _sort_grouped_lists(_group_records($list));
   my $output = '';
 
-  $output .= _sales_quotation_list(        $self, $groups{sales_quotations})         if $groups{sales_quotations};
-  $output .= _sales_order_list(            $self, $groups{sales_orders})             if $groups{sales_orders};
-  $output .= _sales_delivery_order_list(   $self, $groups{sales_delivery_orders})    if $groups{sales_delivery_orders};
-  $output .= _sales_invoice_list(          $self, $groups{sales_invoices})           if $groups{sales_invoices};
-  $output .= _ar_transaction_list(         $self, $groups{ar_transactions})          if $groups{ar_transactions};
+  $output .= _requirement_spec_list(       $self, $groups{requirement_specs},        %params) if $groups{requirement_specs};
+  $output .= _shop_order_list(             $self, $groups{shop_orders},              %params) if $groups{shop_orders};
+  $output .= _sales_quotation_list(        $self, $groups{sales_quotations},         %params) if $groups{sales_quotations};
+  $output .= _sales_order_list(            $self, $groups{sales_orders},             %params) if $groups{sales_orders};
+  $output .= _sales_delivery_order_list(   $self, $groups{sales_delivery_orders},    %params) if $groups{sales_delivery_orders};
+  $output .= _sales_invoice_list(          $self, $groups{sales_invoices},           %params) if $groups{sales_invoices};
+  $output .= _ar_transaction_list(         $self, $groups{ar_transactions},          %params) if $groups{ar_transactions};
 
-  $output .= _request_quotation_list(      $self, $groups{purchase_quotations})      if $groups{purchase_quotations};
-  $output .= _purchase_order_list(         $self, $groups{purchase_orders})          if $groups{purchase_orders};
-  $output .= _purchase_delivery_order_list($self, $groups{purchase_delivery_orders}) if $groups{purchase_delivery_orders};
-  $output .= _purchase_invoice_list(       $self, $groups{purchase_invoices})        if $groups{purchase_invoices};
-  $output .= _ar_transaction_list(         $self, $groups{ar_transactions})          if $groups{ar_transactions};
+  $output .= _request_quotation_list(      $self, $groups{purchase_quotations},      %params) if $groups{purchase_quotations};
+  $output .= _purchase_order_list(         $self, $groups{purchase_orders},          %params) if $groups{purchase_orders};
+  $output .= _purchase_delivery_order_list($self, $groups{purchase_delivery_orders}, %params) if $groups{purchase_delivery_orders};
+  $output .= _purchase_invoice_list(       $self, $groups{purchase_invoices},        %params) if $groups{purchase_invoices};
+  $output .= _ap_transaction_list(         $self, $groups{ap_transactions},          %params) if $groups{ap_transactions};
 
-  return $output || $self->empty_record_list;
+  $output .= _gl_transaction_list(         $self, $groups{gl_transactions},          %params) if $groups{gl_transactions};
+
+  $output .= _bank_transactions(           $self, $groups{bank_transactions},        %params) if $groups{bank_transactions};
+
+  $output .= _sepa_collection_list(        $self, $groups{sepa_collections},         %params) if $groups{sepa_collections};
+  $output .= _sepa_transfer_list(          $self, $groups{sepa_transfers},           %params) if $groups{sepa_transfers};
+
+  $output .= _letter_list(                 $self, $groups{letters},                  %params) if $groups{letters};
+
+  $output  = $self->render('presenter/record/grouped_record_list', %params, output => $output);
+
+  return $output;
 }
 
 sub empty_record_list {
-  my ($self) = @_;
-  return $self->render('presenter/record/empty_record_list');
+  my ($self, %params) = @_;
+  return $self->grouped_record_list([], %params);
 }
 
 sub record_list {
@@ -54,6 +93,19 @@ sub record_list {
     croak "Wrong type for 'columns' argument: not an array reference";
   }
 
+  my %with_columns = map { ($_ => 1) } @{ _arrayify($params{with_columns}) };
+  if ($with_columns{record_link_direction}) {
+    push @columns, {
+      title => $::locale->text('Link direction'),
+      data  => sub {
+          $_[0]->{_record_link_depth} > 1
+        ? $::locale->text('Row was linked to another record')
+        : $_[0]->{_record_link_direction} eq 'from'
+        ? $::locale->text('Row was source for current record')
+        : $::locale->text('Row was created from current record') },
+    };
+  }
+
   my %column_meta   = map { $_->name => $_ } @{ $list->[0]->meta->columns       };
   my %relationships = map { $_->name => $_ } @{ $list->[0]->meta->relationships };
 
@@ -73,8 +125,9 @@ sub record_list {
       my $meta         =  $column_meta{ $spec->{data} };
       my $type         =  ref $meta;
       my $relationship =  $relationships{ $spec->{data} };
-      my $rel_type     =  !$relationship ? '' : lc $relationship->class;
-      $rel_type        =~ s/^sl::db:://;
+      my $rel_type     =  !$relationship ? '' : $relationship->class;
+      $rel_type        =~ s/^SL::DB:://;
+      $rel_type        =  SL::Util::snakify($rel_type);
 
       if (ref($spec->{data}) eq 'CODE') {
         $cell{value} = $spec->{data}->($obj);
@@ -93,12 +146,12 @@ sub record_list {
       push @row, \%cell;
     }
 
-    push @data, \@row;
+    push @data, { columns => \@row, record_link => $obj->{_record_link} };
   }
 
   my @header =
     map +{ value     => $columns[$_]->{title},
-           alignment => $data[0]->[$_]->{alignment},
+           alignment => $data[0]->{columns}->[$_]->{alignment},
          }, (0..scalar(@columns) - 1);
 
   return $self->render(
@@ -115,8 +168,9 @@ sub record_list {
 
 sub _group_records {
   my ($list) = @_;
-
   my %matchers = (
+    requirement_specs        => sub { (ref($_[0]) eq 'SL::DB::RequirementSpec')                                         },
+    shop_orders              => sub { (ref($_[0]) eq 'SL::DB::ShopOrder')       &&  $_[0]->id                           },
     sales_quotations         => sub { (ref($_[0]) eq 'SL::DB::Order')           &&  $_[0]->is_type('sales_quotation')   },
     sales_orders             => sub { (ref($_[0]) eq 'SL::DB::Order')           &&  $_[0]->is_type('sales_order')       },
     sales_delivery_orders    => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder')   &&  $_[0]->is_sales                     },
@@ -127,6 +181,11 @@ sub _group_records {
     purchase_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder')   && !$_[0]->is_sales                     },
     purchase_invoices        => sub { (ref($_[0]) eq 'SL::DB::PurchaseInvoice') &&  $_[0]->invoice                      },
     ap_transactions          => sub { (ref($_[0]) eq 'SL::DB::PurchaseInvoice') && !$_[0]->invoice                      },
+    sepa_collections         => sub { (ref($_[0]) eq 'SL::DB::SepaExportItem')  &&  $_[0]->ar_id                        },
+    sepa_transfers           => sub { (ref($_[0]) eq 'SL::DB::SepaExportItem')  &&  $_[0]->ap_id                        },
+    gl_transactions          => sub { (ref($_[0]) eq 'SL::DB::GLTransaction')                                           },
+    bank_transactions        => sub { (ref($_[0]) eq 'SL::DB::BankTransaction') &&  $_[0]->id                           },
+    letters                  => sub { (ref($_[0]) eq 'SL::DB::Letter')          &&  $_[0]->id                           },
   );
 
   my %groups;
@@ -140,12 +199,63 @@ sub _group_records {
   return %groups;
 }
 
+sub _sort_grouped_lists {
+  my (%groups) = @_;
+
+  foreach my $group (keys %groups) {
+    next unless @{ $groups{$group} };
+    if ($groups{$group}->[0]->can('compare_to')) {
+      $groups{$group} = [ sort { $a->compare_to($b)    } @{ $groups{$group} } ];
+    } else {
+      $groups{$group} = [ sort { $a->date <=> $b->date } @{ $groups{$group} } ];
+    }
+  }
+
+  return %groups;
+}
+
+sub _requirement_spec_list {
+  my ($self, $list, %params) = @_;
+
+  return $self->record_list(
+    $list,
+    title   => $::locale->text('Requirement specs'),
+    type    => 'requirement_spec',
+    columns => [
+      [ $::locale->text('Requirement spec number'), sub { $self->requirement_spec($_[0], display => 'table-cell') } ],
+      [ $::locale->text('Customer'),                'customer'                                                      ],
+      [ $::locale->text('Title'),                   'title'                                                         ],
+      [ $::locale->text('Project'),                 'project',                                                      ],
+      [ $::locale->text('Status'),                  sub { $_[0]->status->description }                              ],
+    ],
+    %params,
+  );
+}
+
+sub _shop_order_list {
+  my ($self, $list, %params) = @_;
+
+  return $self->record_list(
+    $list,
+    title   => $::locale->text('Shop Orders'),
+    type    => 'shop_order',
+    columns => [
+      [ $::locale->text('Shop Order Date'),         sub { $_[0]->order_date->to_kivitendo }                         ],
+      [ $::locale->text('Shop Order Number'),       sub { $self->shop_order($_[0], display => 'table-cell') }       ],
+      [ $::locale->text('Transfer Date'),           'transfer_date'                                                 ],
+      [ $::locale->text('Amount'),                  'amount'                                                        ],
+    ],
+    %params,
+  );
+}
+
 sub _sales_quotation_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Sales Quotations'),
+    type    => 'sales_quotation',
     columns => [
       [ $::locale->text('Quotation Date'),          'transdate'                                                                ],
       [ $::locale->text('Quotation Number'),        sub { $self->sales_quotation($_[0], display => 'table-cell') }   ],
@@ -155,33 +265,37 @@ sub _sales_quotation_list {
       [ $::locale->text('Project'),                 'globalproject', ],
       [ $::locale->text('Closed'),                  'closed'                                                                   ],
     ],
+    %params,
   );
 }
 
 sub _request_quotation_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Request Quotations'),
+    type    => 'request_quotation',
     columns => [
       [ $::locale->text('Quotation Date'),          'transdate'                                                                ],
-      [ $::locale->text('Quotation Number'),        sub { $self->sales_quotation($_[0], display => 'table-cell') }   ],
+      [ $::locale->text('Quotation Number'),        sub { $self->request_quotation($_[0], display => 'table-cell') }   ],
       [ $::locale->text('Vendor'),                  'vendor'                                                                   ],
       [ $::locale->text('Net amount'),              'netamount'                                                                ],
       [ $::locale->text('Transaction description'), 'transaction_description'                                                  ],
       [ $::locale->text('Project'),                 'globalproject', ],
       [ $::locale->text('Closed'),                  'closed'                                                                   ],
     ],
+    %params,
   );
 }
 
 sub _sales_order_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Sales Orders'),
+    type    => 'sales_order',
     columns => [
       [ $::locale->text('Order Date'),              'transdate'                                                                ],
       [ $::locale->text('Order Number'),            sub { $self->sales_order($_[0], display => 'table-cell') }   ],
@@ -192,18 +306,20 @@ sub _sales_order_list {
       [ $::locale->text('Project'),                 'globalproject', ],
       [ $::locale->text('Closed'),                  'closed'                                                                   ],
     ],
+    %params,
   );
 }
 
 sub _purchase_order_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Purchase Orders'),
+    type    => 'purchase_order',
     columns => [
       [ $::locale->text('Order Date'),              'transdate'                                                                ],
-      [ $::locale->text('Order Number'),            sub { $self->sales_order($_[0], display => 'table-cell') }   ],
+      [ $::locale->text('Order Number'),            sub { $self->purchase_order($_[0], display => 'table-cell') }   ],
       [ $::locale->text('Request for Quotation'),   'quonumber' ],
       [ $::locale->text('Vendor'),                  'vendor'                                                                 ],
       [ $::locale->text('Net amount'),              'netamount'                                                                ],
@@ -211,15 +327,17 @@ sub _purchase_order_list {
       [ $::locale->text('Project'),                 'globalproject', ],
       [ $::locale->text('Closed'),                  'closed'                                                                   ],
     ],
+    %params,
   );
 }
 
 sub _sales_delivery_order_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Sales Delivery Orders'),
+    type    => 'sales_delivery_order',
     columns => [
       [ $::locale->text('Delivery Order Date'),     'transdate'                                                                ],
       [ $::locale->text('Delivery Order Number'),   sub { $self->sales_delivery_order($_[0], display => 'table-cell') } ],
@@ -230,18 +348,20 @@ sub _sales_delivery_order_list {
       [ $::locale->text('Delivered'),               'delivered'                                                                ],
       [ $::locale->text('Closed'),                  'closed'                                                                   ],
     ],
+    %params,
   );
 }
 
 sub _purchase_delivery_order_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Purchase Delivery Orders'),
+    type    => 'purchase_delivery_order',
     columns => [
       [ $::locale->text('Delivery Order Date'),     'transdate'                                                                ],
-      [ $::locale->text('Delivery Order Number'),   sub { $self->sales_delivery_order($_[0], display => 'table-cell') } ],
+      [ $::locale->text('Delivery Order Number'),   sub { $self->purchase_delivery_order($_[0], display => 'table-cell') } ],
       [ $::locale->text('Order Number'),            'ordnumber' ],
       [ $::locale->text('Vendor'),                  'vendor'                                                                 ],
       [ $::locale->text('Transaction description'), 'transaction_description'                                                  ],
@@ -249,17 +369,20 @@ sub _purchase_delivery_order_list {
       [ $::locale->text('Delivered'),               'delivered'                                                                ],
       [ $::locale->text('Closed'),                  'closed'                                                                   ],
     ],
+    %params,
   );
 }
 
 sub _sales_invoice_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Sales Invoices'),
+    type    => 'sales_invoice',
     columns => [
       [ $::locale->text('Invoice Date'),            'transdate'               ],
+      [ $::locale->text('Type'),                    sub { $_[0]->displayable_type } ],
       [ $::locale->text('Invoice Number'),          sub { $self->sales_invoice($_[0], display => 'table-cell') } ],
       [ $::locale->text('Quotation Number'),        'quonumber' ],
       [ $::locale->text('Order Number'),            'ordnumber' ],
@@ -268,18 +391,20 @@ sub _sales_invoice_list {
       [ $::locale->text('Paid'),                    'paid'                    ],
       [ $::locale->text('Transaction description'), 'transaction_description' ],
     ],
+    %params,
   );
 }
 
 sub _purchase_invoice_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('Purchase Invoices'),
+    type    => 'purchase_invoice',
     columns => [
       [ $::locale->text('Invoice Date'),                 'transdate'               ],
-      [ $::locale->text('Invoice Number'),               sub { $self->sales_invoice($_[0], display => 'table-cell') } ],
+      [ $::locale->text('Invoice Number'),               sub { $self->purchase_invoice($_[0], display => 'table-cell') } ],
       [ $::locale->text('Request for Quotation Number'), 'quonumber' ],
       [ $::locale->text('Order Number'),                 'ordnumber' ],
       [ $::locale->text('Vendor'),                       'vendor'                 ],
@@ -287,40 +412,138 @@ sub _purchase_invoice_list {
       [ $::locale->text('Paid'),                         'paid'                    ],
       [ $::locale->text('Transaction description'),      'transaction_description' ],
     ],
+    %params,
   );
 }
 
 sub _ar_transaction_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('AR Transactions'),
+    type    => 'ar_transaction',
     columns => [
       [ $::locale->text('Invoice Date'),            'transdate'               ],
+      [ $::locale->text('Type'),                    sub { $_[0]->displayable_type } ],
       [ $::locale->text('Invoice Number'),          sub { $self->ar_transaction($_[0], display => 'table-cell') } ],
       [ $::locale->text('Customer'),                'customer'                ],
       [ $::locale->text('Net amount'),              'netamount'               ],
       [ $::locale->text('Paid'),                    'paid'                    ],
       [ $::locale->text('Transaction description'), 'transaction_description' ],
     ],
+    %params,
   );
 }
 
 sub _ap_transaction_list {
-  my ($self, $list) = @_;
+  my ($self, $list, %params) = @_;
 
   return $self->record_list(
     $list,
     title   => $::locale->text('AP Transactions'),
+    type    => 'ap_transaction',
     columns => [
       [ $::locale->text('Invoice Date'),            'transdate'                      ],
-      [ $::locale->text('Invoice Number'),          sub { $self->ar_transaction($_[0 ], display => 'table-cell') } ],
+      [ $::locale->text('Invoice Number'),          sub { $self->ap_transaction($_[0 ], display => 'table-cell') } ],
       [ $::locale->text('Vendor'),                  'vendor'                         ],
       [ $::locale->text('Net amount'),              'netamount'                      ],
       [ $::locale->text('Paid'),                    'paid'                           ],
       [ $::locale->text('Transaction description'), 'transaction_description'        ],
     ],
+    %params,
+  );
+}
+
+sub _gl_transaction_list {
+  my ($self, $list, %params) = @_;
+
+  return $self->record_list(
+    $list,
+    title   => $::locale->text('GL Transactions'),
+    type    => 'gl_transaction',
+    columns => [
+      [ $::locale->text('Transdate'),        'transdate'                                                    ],
+      [ $::locale->text('Reference'),   'reference'                                                    ],
+      [ $::locale->text('Description'), sub { $self->gl_transaction($_[0 ], display => 'table-cell') } ],
+    ],
+    %params,
+  );
+}
+
+sub _bank_transactions {
+  my ($self, $list, %params) = @_;
+
+  return $self->record_list(
+    $list,
+    title   => $::locale->text('Bank transactions'),
+    type    => 'bank_transactions',
+    columns => [
+      [ $::locale->text('Transdate'),            'transdate'                      ],
+      [ $::locale->text('Local Bank Code'),      sub { $self->bank_code($_[0]->local_bank_account) }  ],
+      [ $::locale->text('Local account number'), sub { $self->account_number($_[0]->local_bank_account) }  ],
+      [ $::locale->text('Remote Bank Code'),     'remote_bank_code' ],
+      [ $::locale->text('Remote account number'),'remote_account_number' ],
+      [ $::locale->text('Valutadate'),           'valutadate' ],
+      [ $::locale->text('Amount'),               'amount' ],
+      [ $::locale->text('Currency'),             sub { $_[0]->currency->name } ],
+      [ $::locale->text('Remote name'),          'remote_name' ],
+      [ $::locale->text('Purpose'),              'purpose' ],
+    ],
+    %params,
+  );
+}
+
+sub _sepa_export_list {
+  my ($self, $list, %params) = @_;
+
+  my ($source, $destination) = $params{type} eq 'sepa_transfer' ? qw(our vc)                                 : qw(vc our);
+  $params{title}             = $params{type} eq 'sepa_transfer' ? $::locale->text('Bank transfers via SEPA') : $::locale->text('Bank collections via SEPA');
+  $params{with_columns}      = [ grep { $_ ne 'record_link_direction' } @{ $params{with_columns} || [] } ];
+
+  delete $params{edit_record_links};
+
+  return $self->record_list(
+    $list,
+    columns => [
+      [ $::locale->text('Export Number'),    'sepa_export',                                  ],
+      [ $::locale->text('Execution date'),   'execution_date'                                ],
+      [ $::locale->text('Export date'),      sub { $_[0]->sepa_export->itime->to_kivitendo } ],
+      [ $::locale->text('Source BIC'),       "${source}_bic"                                 ],
+      [ $::locale->text('Source IBAN'),      "${source}_iban"                                ],
+      [ $::locale->text('Destination BIC'),  "${destination}_bic"                            ],
+      [ $::locale->text('Destination IBAN'), "${destination}_iban"                           ],
+      [ $::locale->text('Amount'),           'amount'                                        ],
+    ],
+    %params,
+  );
+}
+
+sub _sepa_transfer_list {
+  my ($self, $list, %params) = @_;
+  _sepa_export_list($self, $list, %params, type => 'sepa_transfer');
+}
+
+sub _sepa_collection_list {
+  my ($self, $list, %params) = @_;
+  _sepa_export_list($self, $list, %params, type => 'sepa_collection');
+}
+
+sub _letter_list {
+  my ($self, $list, %params) = @_;
+
+  return $self->record_list(
+    $list,
+    title   => $::locale->text('Letters'),
+    type    => 'letter',
+    columns => [
+      [ $::locale->text('Date'),         'date'                                                ],
+      [ $::locale->text('Letternumber'), sub { $self->letter($_[0], display => 'table-cell') } ],
+      [ $::locale->text('Customer'),     'customer'                                            ],
+      [ $::locale->text('Reference'),    'reference'                                           ],
+      [ $::locale->text('Subject'),      'subject'                                             ],
+    ],
+    %params,
   );
 }
 
@@ -354,6 +577,18 @@ TODO
 
 =over 4
 
+=item C<record>
+
+Returns a rendered version (actually an instance of
+L<SL::Presenter::EscapedText>) of a single ar, ap or gl object.
+
+Example:
+  # fetch the record from a random acc_trans object and print its link (could be ar, ap or gl)
+  my $record = SL::DB::Manager::AccTransaction->get_first()->record;
+  my $html   = SL::Presenter->get->record($record, display => 'inline');
+
+=item C<grouped_record_list $list, %params>
+
 =item C<empty_record_list>
 
 Returns a rendered version (actually an instance of
@@ -394,10 +629,19 @@ The order in which the records are grouped is:
 
 =item * AP transactions
 
+=item * GL transactions
+
+=item * SEPA collections
+
+=item * SEPA transfers
+
 =back
 
 Objects of unknown types are skipped.
 
+Parameters are passed to C<record_list> include C<with_objects> and
+C<edit_record_links>.
+
 =item C<record_list $list, %params>
 
 Returns a rendered version (actually an instance of
@@ -438,6 +682,26 @@ If the column spec is a hash reference then the same arguments are
 expected. The corresponding hash keys are C<title>, C<data> and
 C<link>.
 
+=item C<with_columns>
+
+Can be set by the caller to indicate additional columns to
+be listed. Currently supported:
+
+=over 2
+
+=item C<record_link_destination>
+
+The record link destination. Requires that the records to be listed have
+been retrieved via the L<SL::DB::Helper::LinkedRecords> helper.
+
+=back
+
+=item C<edit_record_links>
+
+If trueish additional controls will be rendered that allow the user to
+remove and add record links. Requires that the records to be listed have
+been retrieved via the L<SL::DB::Helper::LinkedRecords> helper.
+
 =back
 
 =back